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
19 CREATE TABLE t1(a, b, c PRIMARY KEY);
20 CREATE TABLE t2(x, y, z);
23 foreach {tn nNext idx sql} {
25 CREATE INDEX i1 ON t1(a, b);
27 SELECT * FROM t1 WHERE (a, b) IN (SELECT x, y FROM t2)
31 CREATE UNIQUE INDEX i1 ON t1(a, b);
33 SELECT * FROM t1 WHERE (a, b) IN (SELECT x, y FROM t2)
37 CREATE UNIQUE INDEX i1 ON t1(a, b);
39 SELECT * FROM t1 WHERE a = ? AND b = ?
43 CREATE UNIQUE INDEX i1 ON t1(a, b);
45 SELECT * FROM t1 WHERE a = ? AND b IS ?
49 CREATE UNIQUE INDEX i1 ON t1(a, b);
51 SELECT * FROM t1 WHERE a = ? AND b IN (?, ?, ?);
55 CREATE UNIQUE INDEX i1 ON t1(a, b, c);
57 SELECT * FROM t1 WHERE a = ? AND b = ?
62 SELECT * FROM t1 WHERE c IN (SELECT z FROM t2)
67 SELECT * FROM t1 WHERE (a, c) IN (SELECT z, x FROM t2)
72 SELECT * FROM t1 WHERE a IN (SELECT z FROM t2)
76 CREATE UNIQUE INDEX i1 ON t1(a, b);
78 SELECT * FROM t1 WHERE a IN (SELECT z FROM t2) AND b IS ?
81 CREATE UNIQUE INDEX i1 ON t1(a, b);
83 SELECT * FROM t1 WHERE a IN (SELECT z FROM t2) AND b = ?
86 CREATE UNIQUE INDEX i1 ON t1(a, b);
88 SELECT * FROM t1 WHERE a IS NULL AND b IN (SELECT z FROM t2)
91 CREATE UNIQUE INDEX i1 ON t1(a, b);
93 SELECT * FROM t1 WHERE a = ? AND b IN (SELECT z FROM t2)
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
108 db eval "explain $sql" {
109 if {$opcode=="OpenRead"} {
110 set csr_to_root($p1) $p2
112 if {$opcode=="Next"} {
114 set root $csr_to_root($p1)
115 set tbl $root_to_tbl($root)
116 if {$tbl=="t1"} {incr nSeen}
127 #-------------------------------------------------------------------------
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;