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.3 2008/07/12 14:52:20 drh 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 68