xref: /sqlite-3.40.0/test/pushdown.test (revision 885f4104)
16f654a40Sdan# 2017 April 29
26f654a40Sdan#
36f654a40Sdan# The author disclaims copyright to this source code.  In place of
46f654a40Sdan# a legal notice, here is a blessing:
56f654a40Sdan#
66f654a40Sdan#    May you do good and not evil.
76f654a40Sdan#    May you find forgiveness for yourself and forgive others.
86f654a40Sdan#    May you share freely, never taking more than you give.
96f654a40Sdan#
106f654a40Sdan#***********************************************************************
116f654a40Sdan
126f654a40Sdanset testdir [file dirname $argv0]
136f654a40Sdansource $testdir/tester.tcl
146f654a40Sdanset testprefix pushdown
156f654a40Sdan
166f654a40Sdando_execsql_test 1.0 {
176f654a40Sdan  CREATE TABLE t1(a, b, c);
186f654a40Sdan  INSERT INTO t1 VALUES(1, 'b1', 'c1');
196f654a40Sdan  INSERT INTO t1 VALUES(2, 'b2', 'c2');
206f654a40Sdan  INSERT INTO t1 VALUES(3, 'b3', 'c3');
216f654a40Sdan  INSERT INTO t1 VALUES(4, 'b4', 'c4');
226f654a40Sdan  CREATE INDEX i1 ON t1(a, c);
236f654a40Sdan}
246f654a40Sdan
256f654a40Sdanproc f {val} {
266f654a40Sdan  lappend ::L $val
276f654a40Sdan  return 0
286f654a40Sdan}
296f654a40Sdandb func f f
306f654a40Sdan
316f654a40Sdando_test 1.1 {
326f654a40Sdan  set L [list]
336f654a40Sdan  execsql { SELECT * FROM t1 WHERE a=2 AND f(b) AND f(c) }
346f654a40Sdan  set L
356f654a40Sdan} {c2}
366f654a40Sdan
376f654a40Sdando_test 1.2 {
386f654a40Sdan  set L [list]
396f654a40Sdan  execsql { SELECT * FROM t1 WHERE a=3 AND f(c) AND f(b) }
406f654a40Sdan  set L
416f654a40Sdan} {c3}
426f654a40Sdan
436f654a40Sdando_execsql_test 1.3 {
446f654a40Sdan  DROP INDEX i1;
456f654a40Sdan  CREATE INDEX i1 ON t1(a, b);
466f654a40Sdan}
476f654a40Sdando_test 1.4 {
486f654a40Sdan  set L [list]
496f654a40Sdan  execsql { SELECT * FROM t1 WHERE a=2 AND f(b) AND f(c) }
506f654a40Sdan  set L
516f654a40Sdan} {b2}
526f654a40Sdan
536f654a40Sdando_test 1.5 {
546f654a40Sdan  set L [list]
556f654a40Sdan  execsql { SELECT * FROM t1 WHERE a=3 AND f(c) AND f(b) }
566f654a40Sdan  set L
576f654a40Sdan} {b3}
58*d3930b12Sdan
59*d3930b12Sdan#-----------------------------------------------
60*d3930b12Sdan
61*d3930b12Sdando_execsql_test 2.0 {
62*d3930b12Sdan  CREATE TABLE u1(a, b, c);
63*d3930b12Sdan  CREATE TABLE u2(x, y, z);
64*d3930b12Sdan
65*d3930b12Sdan  INSERT INTO u1 VALUES('a1', 'b1', 'c1');
66*d3930b12Sdan  INSERT INTO u2 VALUES('a1', 'b1', 'c1');
67*d3930b12Sdan}
68*d3930b12Sdan
69*d3930b12Sdando_test 2.1 {
70*d3930b12Sdan  set L [list]
71*d3930b12Sdan  execsql {
72*d3930b12Sdan    SELECT * FROM u1 WHERE f('one')=123 AND 123=(
73*d3930b12Sdan      SELECT x FROM u2 WHERE x=a AND f('two')
74*d3930b12Sdan    )
75*d3930b12Sdan  }
76*d3930b12Sdan  set L
77*d3930b12Sdan} {one}
78*d3930b12Sdan
79*d3930b12Sdando_test 2.2 {
80*d3930b12Sdan  set L [list]
81*d3930b12Sdan  execsql {
82*d3930b12Sdan    SELECT * FROM u1 WHERE 123=(
83*d3930b12Sdan      SELECT x FROM u2 WHERE x=a AND f('two')
84*d3930b12Sdan    ) AND f('three')=123
85*d3930b12Sdan  }
86*d3930b12Sdan  set L
87*d3930b12Sdan} {three}
88*d3930b12Sdan
89*d3930b12Sdan
906f654a40Sdan
916f654a40Sdanfinish_test
92