Add a test for the fixes on this branch.
[sqlite.git] / test / in7.test
blob099f75c5f70ae3c81e602c816a7cdd4097e5bdbc
1 # 2024-05-01
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
14 set testdir [file dirname $argv0]
15 source $testdir/tester.tcl
16 set testprefix in7
18 do_execsql_test 1.0 {
19   CREATE TABLE t1(a, b, c PRIMARY KEY);
20   CREATE TABLE t2(x, y, z);
23 foreach {tn nNext idx sql} {
24   1 1 {
25     CREATE INDEX i1 ON t1(a, b);
26   } {
27     SELECT * FROM t1 WHERE (a, b) IN (SELECT x, y FROM t2)
28   } 
30   2 0 {
31     CREATE UNIQUE INDEX i1 ON t1(a, b);
32   } {
33     SELECT * FROM t1 WHERE (a, b) IN (SELECT x, y FROM t2)
34   } 
36   3 0 {
37     CREATE UNIQUE INDEX i1 ON t1(a, b);
38   } {
39     SELECT * FROM t1 WHERE a = ? AND b = ?
40   } 
42   3 1 {
43     CREATE UNIQUE INDEX i1 ON t1(a, b);
44   } {
45     SELECT * FROM t1 WHERE a = ? AND b IS ?
46   } 
48   4 0 {
49     CREATE UNIQUE INDEX i1 ON t1(a, b);
50   } {
51     SELECT * FROM t1 WHERE a = ? AND b IN (?, ?, ?);
52   } 
54   5 1 {
55     CREATE UNIQUE INDEX i1 ON t1(a, b, c);
56   } {
57     SELECT * FROM t1 WHERE a = ? AND b = ?
58   } 
60   6 0 {
61   } {
62     SELECT * FROM t1 WHERE c IN (SELECT z FROM t2)
63   } 
65   7 0 {
66   } {
67     SELECT * FROM t1 WHERE (a, c) IN (SELECT z, x FROM t2)
68   } 
70   8 1 {
71   } {
72     SELECT * FROM t1 WHERE a IN (SELECT z FROM t2)
73   } 
75   9 1 {
76     CREATE UNIQUE INDEX i1 ON t1(a, b);
77   } {
78     SELECT * FROM t1 WHERE a IN (SELECT z FROM t2) AND b IS ?
79   } 
80   10 0 {
81     CREATE UNIQUE INDEX i1 ON t1(a, b);
82   } {
83     SELECT * FROM t1 WHERE a IN (SELECT z FROM t2) AND b = ?
84   } 
85   11 1 {
86     CREATE UNIQUE INDEX i1 ON t1(a, b);
87   } {
88     SELECT * FROM t1 WHERE a IS NULL AND b IN (SELECT z FROM t2)
89   } 
90   12 0 {
91     CREATE UNIQUE INDEX i1 ON t1(a, b);
92   } {
93     SELECT * FROM t1 WHERE a = ? AND b IN (SELECT z FROM t2)
94   } 
95 } {
96   do_test 1.1.$tn {
97     execsql BEGIN
98     execsql $idx
100     catch { array unset root_to_tbl }
101     catch { array unset csr_to_root }
103     db eval {SELECT rootpage, tbl_name FROM sqlite_schema} {
104       set root_to_tbl($rootpage) $tbl_name
105     }
107     set nSeen 0
108     db eval "explain $sql" {
109       if {$opcode=="OpenRead"} {
110         set csr_to_root($p1) $p2
111       }
112       if {$opcode=="Next"} {
113         catch {
114           set root $csr_to_root($p1)
115           set tbl $root_to_tbl($root)
116           if {$tbl=="t1"} {incr nSeen}
117         }
118       }
119     }
121     execsql ROLLBACK
123     set nSeen
124   } $nNext
127 #-------------------------------------------------------------------------
128 reset_db
129 do_execsql_test 2.0 {
130   CREATE TABLE t1(a TEXT PRIMARY KEY, b TEXT) WITHOUT ROWID;
131   INSERT INTO t1 VALUES('1', 'one');
132   INSERT INTO t1 VALUES('2', NULL);
133   INSERT INTO t1 VALUES('3', 'three');
136 do_execsql_test 2.1 {
137   SELECT b FROM t1 WHERE a IN (1,2,3) ORDER BY b ASC NULLS LAST;
138 } {one three {}}
141 finish_test