wasCSharpSQLite – Blame information for rev 7
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
1 | office | 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 |