Revise variable declaration moved in the previous check-in so sqlite3VdbeReset()...
[sqlite.git] / test / pushdown.test
blobaf5162495bab654e35fdc4d84819c3806f0026f2
1 # 2017 April 29
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 #***********************************************************************
12 set testdir [file dirname $argv0]
13 source $testdir/tester.tcl
14 set testprefix pushdown
16 do_execsql_test 1.0 {
17   CREATE TABLE t1(a, b, c);
18   INSERT INTO t1 VALUES(1, 'b1', 'c1');
19   INSERT INTO t1 VALUES(2, 'b2', 'c2');
20   INSERT INTO t1 VALUES(3, 'b3', 'c3');
21   INSERT INTO t1 VALUES(4, 'b4', 'c4');
22   CREATE INDEX i1 ON t1(a, c);
25 proc f {val} {
26   lappend ::L $val
27   return 0
29 db func f f 
31 do_test 1.1 {
32   set L [list]
33   execsql { SELECT * FROM t1 WHERE a=2 AND f(b) AND f(c) }
34   set L
35 } {c2}
37 do_test 1.2 {
38   set L [list]
39   execsql { SELECT * FROM t1 WHERE a=3 AND f(c) AND f(b) }
40   set L
41 } {c3}
43 do_execsql_test 1.3 {
44   DROP INDEX i1;
45   CREATE INDEX i1 ON t1(a, b);
47 do_test 1.4 {
48   set L [list]
49   execsql { SELECT * FROM t1 WHERE a=2 AND f(b) AND f(c) }
50   set L
51 } {b2}
53 do_test 1.5 {
54   set L [list]
55   execsql { SELECT * FROM t1 WHERE a=3 AND f(c) AND f(b) }
56   set L
57 } {b3}
59 #-----------------------------------------------
61 do_execsql_test 2.0 {
62   CREATE TABLE u1(a, b, c);
63   CREATE TABLE u2(x, y, z);
65   INSERT INTO u1 VALUES('a1', 'b1', 'c1');
66   INSERT INTO u2 VALUES('a1', 'b1', 'c1');
69 do_test 2.1 {
70   set L [list]
71   execsql {
72     SELECT * FROM u1 WHERE f('one')=123 AND 123=(
73       SELECT x FROM u2 WHERE x=a AND f('two')
74     )
75   }
76   set L
77 } {one}
79 do_test 2.2 {
80   set L [list]
81   execsql {
82     SELECT * FROM u1 WHERE 123=(
83       SELECT x FROM u2 WHERE x=a AND f('two')
84     ) AND f('three')=123
85   }
86   set L
87 } {three}
90   
91 finish_test