File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sqlite3 / test / in2.test
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:04:16 2012 UTC (12 years, 10 months ago) by misho
Branches: sqlite3, MAIN
CVS tags: v3_7_10, HEAD
sqlite3

    1: # 2007 May 12
    2: #
    3: # The author disclaims copyright to this source code.  In place of
    4: # a legal notice, here is a blessing:
    5: #
    6: #    May you do good and not evil.
    7: #    May you find forgiveness for yourself and forgive others.
    8: #    May you share freely, never taking more than you give.
    9: #
   10: #***********************************************************************
   11: # This file tests a special case in the b-tree code that can be
   12: # hit by the "IN" operator (or EXISTS, NOT IN, etc.).
   13: #
   14: # $Id: in2.test,v 1.1.1.1 2012/02/21 17:04:16 misho Exp $
   15: 
   16: set testdir [file dirname $argv0]
   17: source $testdir/tester.tcl
   18: 
   19: do_test in2-1 {
   20:   execsql {
   21:     CREATE TABLE a(i INTEGER PRIMARY KEY, a);
   22:   }
   23: } {}
   24: 
   25: set ::N 2000
   26: 
   27: do_test in2-2 {
   28:   db transaction {
   29:     for {set ::ii 0} {$::ii < $::N} {incr ::ii} {
   30:       execsql {INSERT INTO a VALUES($::ii, $::ii)}
   31:     }
   32:     execsql {INSERT INTO a VALUES(4000, '')}
   33: 
   34:     for {set ::ii 0} {$::ii < $::N} {incr ::ii} {
   35:       set ::t [format "x%04d" $ii]
   36:       execsql {INSERT INTO a VALUES(NULL, $::t)}
   37:     }
   38:   }
   39: } {}
   40: 
   41: # Each iteration of this loop builds a slightly different b-tree to
   42: # evaluate the "IN (...)" operator in the SQL statement. The contents
   43: # of the b-tree are (in sorted order):
   44: #
   45: #     $::ii integers.
   46: #     a string of zero length.
   47: #     $::N short strings.
   48: #
   49: # Records are inserted in sorted order.
   50: #
   51: # The string of zero-length is stored in a b-tree cell with 3 bytes
   52: # of payload. Moving this cell from a leaf node to a internal node 
   53: # during b-tree balancing was causing an assertion failure. 
   54: #
   55: # This bug only applied to b-trees generated to evaluate IN (..) 
   56: # clauses, as it is impossible for persistent b-trees (SQL tables + 
   57: # indices) to contain cells smaller than 4 bytes.
   58: #
   59: for {set ::ii 3} {$::ii < $::N} {incr ::ii} {
   60:   do_test in2-$::ii {
   61:     execsql {
   62:       SELECT 1 IN (SELECT a FROM a WHERE (i < $::ii) OR (i >= $::N))
   63:     }
   64:   } {1}
   65: }
   66: 
   67: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>