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 16set testdir [file dirname $argv0] 17source $testdir/tester.tcl 18 19do_test in2-1 { 20 execsql { 21 CREATE TABLE a(i INTEGER PRIMARY KEY, a); 22 } 23} {} 24 25set ::N 2000 26 27do_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# 59for {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 67finish_test 68