xref: /sqlite-3.40.0/test/whereD.test (revision e8c4f032)
1bfca6a40Sdan# 2012 August 24
2bfca6a40Sdan#
3bfca6a40Sdan# The author disclaims copyright to this source code.  In place of
4bfca6a40Sdan# a legal notice, here is a blessing:
5bfca6a40Sdan#
6bfca6a40Sdan#    May you do good and not evil.
7bfca6a40Sdan#    May you find forgiveness for yourself and forgive others.
8bfca6a40Sdan#    May you share freely, never taking more than you give.
9bfca6a40Sdan#
10bfca6a40Sdan#***********************************************************************
11bfca6a40Sdan# This file implements regression tests for SQLite library.  The
12bfca6a40Sdan# focus of this file is testing that an index may be used as a covering
13bfca6a40Sdan# index when there are OR expressions in the WHERE clause.
14bfca6a40Sdan#
15bfca6a40Sdan
16bfca6a40Sdan
17bfca6a40Sdanset testdir [file dirname $argv0]
18bfca6a40Sdansource $testdir/tester.tcl
19bfca6a40Sdanset ::testprefix whereD
20bfca6a40Sdan
21bfca6a40Sdando_execsql_test 1.1 {
222797c216Sdrh  CREATE TABLE t(i,j,k,m,n);
232797c216Sdrh  CREATE INDEX ijk ON t(i,j,k);
242797c216Sdrh  CREATE INDEX jmn ON t(j,m,n);
25bfca6a40Sdan
268fea5f3bSdrh  INSERT INTO t VALUES(3, 3, 'three', 3, 'tres');
278fea5f3bSdrh  INSERT INTO t VALUES(2, 2, 'two', 2, 'dos');
288fea5f3bSdrh  INSERT INTO t VALUES(1, 1, 'one', 1, 'uno');
298fea5f3bSdrh  INSERT INTO t VALUES(4, 4, 'four', 4, 'cuatro');
30bfca6a40Sdan}
31bfca6a40Sdan
32bfca6a40Sdando_execsql_test 1.2 {
33bfca6a40Sdan  SELECT k FROM t WHERE (i=1 AND j=1) OR (i=2 AND j=2);
34bfca6a40Sdan} {one two}
352797c216Sdrhdo_execsql_test 1.3 {
368fea5f3bSdrh  SELECT k FROM t WHERE (i=1 AND j=1) OR (+i=2 AND j=2);
378fea5f3bSdrh} {one two}
388fea5f3bSdrhdo_execsql_test 1.4 {
398fea5f3bSdrh  SELECT n FROM t WHERE (i=1 AND j=1) OR (i=2 AND j=2);
408fea5f3bSdrh} {uno dos}
418fea5f3bSdrhdo_execsql_test 1.5 {
428fea5f3bSdrh  SELECT k, n FROM t WHERE (i=1 AND j=1) OR (i=2 AND j=2);
438fea5f3bSdrh} {one uno two dos}
448fea5f3bSdrhdo_execsql_test 1.6 {
452797c216Sdrh  SELECT k FROM t WHERE (i=1 AND j=1) OR (i=2 AND j=2) OR (i=3 AND j=3);
462797c216Sdrh} {one two three}
478fea5f3bSdrhdo_execsql_test 1.7 {
488fea5f3bSdrh  SELECT n FROM t WHERE (i=1 AND j=1) OR (i=2 AND j=2) OR (i=3 AND j=3);
498fea5f3bSdrh} {uno dos tres}
508fea5f3bSdrhdo_execsql_test 1.8 {
512797c216Sdrh  SELECT k FROM t WHERE (i=1 AND j=1) OR (j=2 AND m=2);
522797c216Sdrh} {one two}
538fea5f3bSdrhdo_execsql_test 1.9 {
542797c216Sdrh  SELECT k FROM t WHERE (i=1 AND j=1) OR (i=2 AND j=2) OR (j=3 AND m=3);
552797c216Sdrh} {one two three}
568fea5f3bSdrhdo_execsql_test 1.10 {
578fea5f3bSdrh  SELECT n FROM t WHERE (i=1 AND j=1) OR (i=2 AND j=2) OR (j=3 AND m=3);
588fea5f3bSdrh} {uno dos tres}
598fea5f3bSdrhdo_execsql_test 1.11 {
602797c216Sdrh  SELECT k FROM t WHERE (i=1 AND j=1) OR (j=2 AND m=2) OR (i=3 AND j=3);
612797c216Sdrh} {one two three}
628fea5f3bSdrhdo_execsql_test 1.12 {
638fea5f3bSdrh  SELECT n FROM t WHERE (i=1 AND j=1) OR (j=2 AND m=2) OR (i=3 AND j=3);
648fea5f3bSdrh} {uno dos tres}
658fea5f3bSdrhdo_execsql_test 1.13 {
662797c216Sdrh  SELECT k FROM t WHERE (j=1 AND m=1) OR (i=2 AND j=2) OR (i=3 AND j=3);
672797c216Sdrh} {one two three}
688fea5f3bSdrhdo_execsql_test 1.14 {
692797c216Sdrh  SELECT k FROM t WHERE (i=1 AND j=1) OR (j=2 AND i=2) OR (i=3 AND j=3);
702797c216Sdrh} {one two three}
718fea5f3bSdrhdo_execsql_test 1.15 {
728fea5f3bSdrh  SELECT k FROM t WHERE (i=1 AND j=2) OR (i=2 AND j=1) OR (i=3 AND j=4);
738fea5f3bSdrh} {}
748fea5f3bSdrhdo_execsql_test 1.16 {
758fea5f3bSdrh  SELECT k FROM t WHERE (i=1 AND (j=1 or j=2)) OR (i=3 AND j=3);
768fea5f3bSdrh} {one three}
772797c216Sdrh
782797c216Sdrhdo_execsql_test 2.0 {
792797c216Sdrh  CREATE TABLE t1(a,b,c,d);
802797c216Sdrh  CREATE INDEX t1b ON t1(b);
812797c216Sdrh  CREATE INDEX t1c ON t1(c);
822797c216Sdrh  CREATE INDEX t1d ON t1(d);
832797c216Sdrh  CREATE TABLE t2(x,y);
842797c216Sdrh  CREATE INDEX t2y ON t2(y);
852797c216Sdrh
862797c216Sdrh  INSERT INTO t1 VALUES(1,2,3,4);
872797c216Sdrh  INSERT INTO t1 VALUES(5,6,7,8);
882797c216Sdrh  INSERT INTO t2 VALUES(1,2);
892797c216Sdrh  INSERT INTO t2 VALUES(2,7);
902797c216Sdrh  INSERT INTO t2 VALUES(3,4);
912797c216Sdrh} {}
922797c216Sdrhdo_execsql_test 2.1 {
932797c216Sdrh  SELECT a, x FROM t1 JOIN t2 ON +y=d OR x=7 ORDER BY a, x;
942797c216Sdrh} {1 3}
952797c216Sdrhdo_execsql_test 2.2 {
962797c216Sdrh  SELECT a, x FROM t1 JOIN t2 ON y=d OR x=7 ORDER BY a, x;
972797c216Sdrh} {1 3}
98bfca6a40Sdan
9989933915Sdan
10089933915Sdan# Similar to [do_execsql_test], except that two elements are appended
10189933915Sdan# to the result - the string "search" and the number of times test variable
10289933915Sdan# sqlite3_search_count is incremented by running the supplied SQL. e.g.
10389933915Sdan#
10489933915Sdan#   do_searchcount_test 1.0 { SELECT * FROM t1 } {x y search 2}
10589933915Sdan#
10689933915Sdanproc do_searchcount_test {tn sql res} {
10789933915Sdan  uplevel [subst -nocommands {
10889933915Sdan    do_test $tn {
10989933915Sdan      set ::sqlite_search_count 0
11089933915Sdan      concat [db eval {$sql}] search [set ::sqlite_search_count]
11189933915Sdan    } [list $res]
11289933915Sdan  }]
11389933915Sdan}
11489933915Sdan
11589933915Sdando_execsql_test 3.0 {
11689933915Sdan  CREATE TABLE t3(a, b, c);
11789933915Sdan  CREATE UNIQUE INDEX i3 ON t3(a, b);
11889933915Sdan  INSERT INTO t3 VALUES(1, 'one', 'i');
11989933915Sdan  INSERT INTO t3 VALUES(3, 'three', 'iii');
12089933915Sdan  INSERT INTO t3 VALUES(6, 'six', 'vi');
12189933915Sdan  INSERT INTO t3 VALUES(2, 'two', 'ii');
12289933915Sdan  INSERT INTO t3 VALUES(4, 'four', 'iv');
12389933915Sdan  INSERT INTO t3 VALUES(5, 'five', 'v');
12489933915Sdan
12589933915Sdan  CREATE TABLE t4(x PRIMARY KEY, y);
12689933915Sdan  INSERT INTO t4 VALUES('a', 'one');
12789933915Sdan  INSERT INTO t4 VALUES('b', 'two');
12889933915Sdan}
12989933915Sdan
13089933915Sdando_searchcount_test 3.1 {
13189933915Sdan  SELECT a, b FROM t3 WHERE (a=1 AND b='one') OR (a=2 AND b='two')
1328aad8c48Sdan} {1 one 2 two search 4}
13389933915Sdan
13489933915Sdando_searchcount_test 3.2 {
13589933915Sdan  SELECT a, c FROM t3 WHERE (a=1 AND b='one') OR (a=2 AND b='two')
1368aad8c48Sdan} {1 i 2 ii search 6}
13789933915Sdan
13889933915Sdando_searchcount_test 3.4.1 {
13989933915Sdan  SELECT y FROM t4 WHERE x='a'
14089933915Sdan} {one search 2}
14189933915Sdando_searchcount_test 3.4.2 {
14289933915Sdan  SELECT a, b FROM t3 WHERE
14389933915Sdan        (a=1 AND b=(SELECT y FROM t4 WHERE x='a'))
14489933915Sdan     OR (a=2 AND b='two')
1458aad8c48Sdan} {1 one 2 two search 6}
14689933915Sdando_searchcount_test 3.4.3 {
14789933915Sdan  SELECT a, b FROM t3 WHERE
14889933915Sdan        (a=2 AND b='two')
14989933915Sdan     OR (a=1 AND b=(SELECT y FROM t4 WHERE x='a'))
1508aad8c48Sdan} {2 two 1 one search 6}
15189933915Sdando_searchcount_test 3.4.4 {
15289933915Sdan  SELECT a, b FROM t3 WHERE
15389933915Sdan        (a=2 AND b=(SELECT y FROM t4 WHERE x='b'))
15489933915Sdan     OR (a=1 AND b=(SELECT y FROM t4 WHERE x='a'))
1558aad8c48Sdan} {2 two 1 one search 8}
15689933915Sdan
157606bb3a5Sdando_searchcount_test 3.5.1 {
158606bb3a5Sdan  SELECT a, b FROM t3 WHERE (a=1 AND b='one') OR rowid=4
159de892d96Sdan} {1 one 2 two search 2}
160606bb3a5Sdando_searchcount_test 3.5.2 {
161606bb3a5Sdan  SELECT a, c FROM t3 WHERE (a=1 AND b='one') OR rowid=4
1628aad8c48Sdan} {1 i 2 ii search 3}
16389933915Sdan
16490abfd08Sdrh# Ticket [d02e1406a58ea02d] (2012-10-04)
16590abfd08Sdrh# LEFT JOIN with an OR in the ON clause causes segfault
16690abfd08Sdrh#
16790abfd08Sdrhdo_test 4.1 {
16890abfd08Sdrh  db eval {
16990abfd08Sdrh    CREATE TABLE t41(a,b,c);
17090abfd08Sdrh    INSERT INTO t41 VALUES(1,2,3), (4,5,6);
17190abfd08Sdrh    CREATE TABLE t42(d,e,f);
17290abfd08Sdrh    INSERT INTO t42 VALUES(3,6,9), (4,8,12);
17390abfd08Sdrh    SELECT * FROM t41 AS x LEFT JOIN t42 AS y ON (y.d=x.c) OR (y.e=x.b);
17490abfd08Sdrh  }
17590abfd08Sdrh} {1 2 3 3 6 9 4 5 6 {} {} {}}
17690abfd08Sdrhdo_test 4.2 {
17790abfd08Sdrh  db eval {
17890abfd08Sdrh    CREATE INDEX t42d ON t42(d);
17990abfd08Sdrh    CREATE INDEX t42e ON t42(e);
18090abfd08Sdrh    SELECT * FROM t41 AS x LEFT JOIN t42 AS y ON (y.d=x.c) OR (y.e=x.b);
18190abfd08Sdrh  }
18290abfd08Sdrh} {1 2 3 3 6 9 4 5 6 {} {} {}}
1836292c016Smistachkindo_test 4.3 {
18490abfd08Sdrh  db eval {
18590abfd08Sdrh    SELECT * FROM t41 AS x LEFT JOIN t42 AS y ON (y.d=x.c) OR (y.d=x.b);
18690abfd08Sdrh  }
18790abfd08Sdrh} {1 2 3 3 6 9 4 5 6 {} {} {}}
18890abfd08Sdrh
1896186b309Sdrh# Ticket [bc1aea7b725f276177]
1906186b309Sdrh# Incorrect result on LEFT JOIN with OR constraints and an ORDER BY clause.
1916186b309Sdrh#
1926186b309Sdrhdo_execsql_test 4.4 {
1936186b309Sdrh  CREATE TABLE t44(a INTEGER, b INTEGER);
1946186b309Sdrh  INSERT INTO t44 VALUES(1,2);
1956186b309Sdrh  INSERT INTO t44 VALUES(3,4);
1966186b309Sdrh  SELECT *
1976186b309Sdrh    FROM t44 AS x
1986186b309Sdrh       LEFT JOIN (SELECT a AS c, b AS d FROM t44) AS y ON a=c
1996186b309Sdrh   WHERE d=4 OR d IS NULL;
2006186b309Sdrh} {3 4 3 4}
2016186b309Sdrhdo_execsql_test 4.5 {
2026186b309Sdrh  SELECT *
2036186b309Sdrh    FROM t44 AS x
2046186b309Sdrh       LEFT JOIN (SELECT a AS c, b AS d FROM t44) AS y ON a=c
2056186b309Sdrh   WHERE d=4 OR d IS NULL
2066186b309Sdrh   ORDER BY a;
2076186b309Sdrh} {3 4 3 4}
2086186b309Sdrhdo_execsql_test 4.6 {
2096186b309Sdrh  CREATE TABLE t46(c INTEGER, d INTEGER);
2106186b309Sdrh  INSERT INTO t46 SELECT a, b FROM t44;
2116186b309Sdrh  SELECT * FROM t44 LEFT JOIN t46 ON a=c
2126186b309Sdrh   WHERE d=4 OR d IS NULL;
2136186b309Sdrh} {3 4 3 4}
2146186b309Sdrhdo_execsql_test 4.7 {
2156186b309Sdrh  SELECT * FROM t44 LEFT JOIN t46 ON a=c
2166186b309Sdrh   WHERE d=4 OR d IS NULL
2176186b309Sdrh   ORDER BY a;
2186186b309Sdrh} {3 4 3 4}
2196186b309Sdrh
220d83cad23Sdrh# Verify fix of a bug reported on the mailing list by Peter Reid
221d83cad23Sdrh#
222d83cad23Sdrhdo_execsql_test 5.1 {
223d83cad23Sdrh  DROP TABLE IF EXISTS t;
224d83cad23Sdrh  CREATE TABLE t(c0,c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17);
225d83cad23Sdrh  CREATE INDEX tc0 ON t(c0);
226d83cad23Sdrh  CREATE INDEX tc1 ON t(c1);
227d83cad23Sdrh  CREATE INDEX tc2 ON t(c2);
228d83cad23Sdrh  CREATE INDEX tc3 ON t(c3);
229d83cad23Sdrh  CREATE INDEX tc4 ON t(c4);
230d83cad23Sdrh  CREATE INDEX tc5 ON t(c5);
231d83cad23Sdrh  CREATE INDEX tc6 ON t(c6);
232d83cad23Sdrh  CREATE INDEX tc7 ON t(c7);
233d83cad23Sdrh  CREATE INDEX tc8 ON t(c8);
234d83cad23Sdrh  CREATE INDEX tc9 ON t(c9);
235d83cad23Sdrh  CREATE INDEX tc10 ON t(c10);
236d83cad23Sdrh  CREATE INDEX tc11 ON t(c11);
237d83cad23Sdrh  CREATE INDEX tc12 ON t(c12);
238d83cad23Sdrh  CREATE INDEX tc13 ON t(c13);
239d83cad23Sdrh  CREATE INDEX tc14 ON t(c14);
240d83cad23Sdrh  CREATE INDEX tc15 ON t(c15);
241d83cad23Sdrh  CREATE INDEX tc16 ON t(c16);
242d83cad23Sdrh  CREATE INDEX tc17 ON t(c17);
243d83cad23Sdrh
244d83cad23Sdrh  INSERT INTO t(c0, c16) VALUES (1,1);
245d83cad23Sdrh
246d83cad23Sdrh  SELECT * FROM t WHERE
247d83cad23Sdrh    c0=1 or  c1=1 or  c2=1 or  c3=1 or
248d83cad23Sdrh    c4=1 or  c5=1 or  c6=1 or  c7=1 or
249d83cad23Sdrh    c8=1 or  c9=1 or c10=1 or c11=1 or
250d83cad23Sdrh    c12=1 or c13=1 or c14=1 or c15=1 or
251d83cad23Sdrh    c16=1 or c17=1;
252d83cad23Sdrh} {1 {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} 1 {}}
253d83cad23Sdrhdo_execsql_test 5.2 {
254d83cad23Sdrh  DELETE FROM t;
255d83cad23Sdrh  INSERT INTO t(c0,c17) VALUES(1,1);
256d83cad23Sdrh  SELECT * FROM t WHERE
257d83cad23Sdrh    c0=1 or  c1=1 or  c2=1 or  c3=1 or
258d83cad23Sdrh    c4=1 or  c5=1 or  c6=1 or  c7=1 or
259d83cad23Sdrh    c8=1 or  c9=1 or c10=1 or c11=1 or
260d83cad23Sdrh    c12=1 or c13=1 or c14=1 or c15=1 or
261d83cad23Sdrh    c16=1 or c17=1;
262d83cad23Sdrh} {1 {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} 1}
263d83cad23Sdrhdo_execsql_test 5.3 {
264d83cad23Sdrh  DELETE FROM t;
265d83cad23Sdrh  INSERT INTO t(c0,c15) VALUES(1,1);
266d83cad23Sdrh  SELECT * FROM t WHERE
267d83cad23Sdrh    c0=1 or  c1=1 or  c2=1 or  c3=1 or
268d83cad23Sdrh    c4=1 or  c5=1 or  c6=1 or  c7=1 or
269d83cad23Sdrh    c8=1 or  c9=1 or c10=1 or c11=1 or
270d83cad23Sdrh    c12=1 or c13=1 or c14=1 or c15=1 or
271d83cad23Sdrh    c16=1 or c17=1;
272d83cad23Sdrh} {1 {} {} {} {} {} {} {} {} {} {} {} {} {} {} 1 {} {}}
2736186b309Sdrh
274de892d96Sdan#-------------------------------------------------------------------------
275de892d96Sdando_execsql_test 6.1 {
276de892d96Sdan  CREATE TABLE x1(a, b, c, d, e);
277de892d96Sdan  CREATE INDEX x1a  ON x1(a);
278de892d96Sdan  CREATE INDEX x1bc ON x1(b, c);
279de892d96Sdan  CREATE INDEX x1cd ON x1(c, d);
280de892d96Sdan
281de892d96Sdan  INSERT INTO x1 VALUES(1, 2, 3, 4, 'A');
282de892d96Sdan  INSERT INTO x1 VALUES(5, 6, 7, 8, 'B');
283de892d96Sdan  INSERT INTO x1 VALUES(9, 10, 11, 12, 'C');
284de892d96Sdan  INSERT INTO x1 VALUES(13, 14, 15, 16, 'D');
285de892d96Sdan}
286de892d96Sdan
287de892d96Sdando_searchcount_test 6.2.1 {
288de892d96Sdan  SELECT e FROM x1 WHERE b=2 OR c=7;
289de892d96Sdan} {A B search 6}
290de892d96Sdando_searchcount_test 6.2.2 {
291de892d96Sdan  SELECT c FROM x1 WHERE b=2 OR c=7;
292de892d96Sdan} {3 7 search 4}
293de892d96Sdan
294de892d96Sdando_searchcount_test 6.3.1 {
295de892d96Sdan  SELECT e FROM x1 WHERE a=1 OR b=10;
296de892d96Sdan} {A C search 6}
297de892d96Sdando_searchcount_test 6.3.2 {
298de892d96Sdan  SELECT c FROM x1 WHERE a=1 OR b=10;
299de892d96Sdan} {3 11 search 5}
300de892d96Sdando_searchcount_test 6.3.3 {
301de892d96Sdan  SELECT rowid FROM x1 WHERE a=1 OR b=10;
302de892d96Sdan} {1 3 search 4}
3036186b309Sdrh
304eaa6cd87Sdando_searchcount_test 6.4.1 {
305eaa6cd87Sdan  SELECT a FROM x1 WHERE b BETWEEN 1 AND 4 OR c BETWEEN 8 AND 12
306eaa6cd87Sdan} {1 9 search 6}
307eaa6cd87Sdando_searchcount_test 6.4.2 {
308eaa6cd87Sdan  SELECT b, c FROM x1 WHERE b BETWEEN 1 AND 4 OR c BETWEEN 8 AND 12
309eaa6cd87Sdan} {2 3 10 11 search 5}
310eaa6cd87Sdando_searchcount_test 6.4.3 {
311eaa6cd87Sdan  SELECT rowid, c FROM x1 WHERE b BETWEEN 1 AND 4 OR c BETWEEN 8 AND 12
312eaa6cd87Sdan} {1 3 3 11 search 4}
313eaa6cd87Sdan
314eaa6cd87Sdando_searchcount_test 6.5.1 {
315eaa6cd87Sdan  SELECT a FROM x1 WHERE rowid = 2 OR c=11
316eaa6cd87Sdan} {5 9 search 3}
317eaa6cd87Sdando_searchcount_test 6.5.2 {
318eaa6cd87Sdan  SELECT d FROM x1 WHERE rowid = 2 OR c=11
319eaa6cd87Sdan} {8 12 search 2}
320eaa6cd87Sdando_searchcount_test 6.5.3 {
321eaa6cd87Sdan  SELECT d FROM x1 WHERE c=11 OR rowid = 2
322eaa6cd87Sdan} {12 8 search 2}
323eaa6cd87Sdando_searchcount_test 6.5.4 {
324eaa6cd87Sdan  SELECT a FROM x1 WHERE c=11 OR rowid = 2
325eaa6cd87Sdan} {9 5 search 3}
326eaa6cd87Sdan
327eaa6cd87Sdando_searchcount_test 6.6.1 {
328eaa6cd87Sdan  SELECT rowid FROM x1 WHERE a=1 OR b=6 OR c=11
329eaa6cd87Sdan} {1 2 3 search 6}
330eaa6cd87Sdando_searchcount_test 6.6.2 {
331eaa6cd87Sdan  SELECT c FROM x1 WHERE a=1 OR b=6 OR c=11
332eaa6cd87Sdan} {3 7 11 search 7}
333eaa6cd87Sdando_searchcount_test 6.6.3 {
334eaa6cd87Sdan  SELECT c FROM x1 WHERE c=11 OR a=1 OR b=6
335eaa6cd87Sdan} {11 3 7 search 7}
336eaa6cd87Sdando_searchcount_test 6.6.4 {
337eaa6cd87Sdan  SELECT c FROM x1 WHERE b=6 OR c=11 OR a=1
338eaa6cd87Sdan} {7 11 3 search 7}
339eaa6cd87Sdan
340*e8c4f032Sdrh# 2020-02-22 ticket aa4378693018aa99
341*e8c4f032Sdrh# In the OP_Column opcode, if a cursor is marked with OP_NullRow
342*e8c4f032Sdrh# (because it is the right table of a LEFT JOIN that does not match)
343*e8c4f032Sdrh# then do not substitute index cursors, as the index cursors do not
344*e8c4f032Sdrh# have the VdbeCursor.nullRow flag set.
345*e8c4f032Sdrh#
346*e8c4f032Sdrhdo_execsql_test 6.7 {
347*e8c4f032Sdrh  DROP TABLE IF EXISTS t1;
348*e8c4f032Sdrh  DROP TABLE IF EXISTS t2;
349*e8c4f032Sdrh  CREATE TABLE t1(a UNIQUE, b UNIQUE);
350*e8c4f032Sdrh  INSERT INTO t1(a,b) VALUES(null,2);
351*e8c4f032Sdrh  CREATE VIEW t2 AS SELECT * FROM t1 WHERE b<10 OR a<7 ORDER BY b;
352*e8c4f032Sdrh  SELECT t1.* FROM t1 LEFT JOIN t2 ON abs(t1.a)=abs(t2.b);
353*e8c4f032Sdrh} {{} 2}
354*e8c4f032Sdrh
355*e8c4f032Sdrh
356b40897abSdan#-------------------------------------------------------------------------
357b40897abSdan#
358b40897abSdando_execsql_test 7.0 {
359b40897abSdan  CREATE TABLE y1(a, b);
360b40897abSdan  CREATE TABLE y2(x, y);
361b40897abSdan  CREATE INDEX y2xy ON y2(x, y);
362b40897abSdan  INSERT INTO y1 VALUES(1, 1);
363b40897abSdan  INSERT INTO y2 VALUES(3, 3);
364b40897abSdan}
365b40897abSdan
366b40897abSdando_execsql_test 7.1 {
367b40897abSdan  SELECT * FROM y1 LEFT JOIN y2 ON ((x=1 AND y=b) OR (x=2 AND y=b))
368b40897abSdan} {1 1 {} {}}
369b40897abSdan
370b40897abSdando_execsql_test 7.3 {
371b40897abSdan  CREATE TABLE foo (Id INTEGER PRIMARY KEY, fa INTEGER, fb INTEGER);
372b40897abSdan  CREATE TABLE bar (Id INTEGER PRIMARY KEY, ba INTEGER, bb INTEGER);
373b40897abSdan
374b40897abSdan  INSERT INTO foo VALUES(1, 1, 1);
375b40897abSdan  INSERT INTO foo VALUES(2, 1, 2);
376b40897abSdan  INSERT INTO foo VALUES(3, 1, 3);
377b40897abSdan  INSERT INTO foo VALUES(4, 1, 4);
378b40897abSdan  INSERT INTO foo VALUES(5, 1, 5);
379b40897abSdan  INSERT INTO foo VALUES(6, 1, 6);
380b40897abSdan  INSERT INTO foo VALUES(7, 1, 7);
381b40897abSdan  INSERT INTO foo VALUES(8, 1, 8);
382b40897abSdan  INSERT INTO foo VALUES(9, 1, 9);
383b40897abSdan
384b40897abSdan  INSERT INTO bar VALUES(NULL, 1, 1);
385b40897abSdan  INSERT INTO bar VALUES(NULL, 2, 2);
386b40897abSdan  INSERT INTO bar VALUES(NULL, 3, 3);
387b40897abSdan  INSERT INTO bar VALUES(NULL, 1, 4);
388b40897abSdan  INSERT INTO bar VALUES(NULL, 2, 5);
389b40897abSdan  INSERT INTO bar VALUES(NULL, 3, 6);
390b40897abSdan  INSERT INTO bar VALUES(NULL, 1, 7);
391b40897abSdan  INSERT INTO bar VALUES(NULL, 2, 8);
392b40897abSdan  INSERT INTO bar VALUES(NULL, 3, 9);
393b40897abSdan}
394b40897abSdan
395b40897abSdando_execsql_test 7.4 {
396b40897abSdan  SELECT
397b40897abSdan    bar.Id, bar.ba, bar.bb, foo.fb
398b40897abSdan    FROM foo LEFT JOIN bar
399b40897abSdan           ON (bar.ba = 1 AND bar.bb = foo.fb)
400b40897abSdan           OR (bar.ba = 5 AND bar.bb = foo.fb);
401b40897abSdan} {
402b40897abSdan  1 1 1 1
403b40897abSdan  {} {} {} 2
404b40897abSdan  {} {} {} 3
405b40897abSdan  4 1 4 4
406b40897abSdan  {} {} {} 5
407b40897abSdan  {} {} {} 6
408b40897abSdan  7 1 7 7
409b40897abSdan  {} {} {} 8
410b40897abSdan  {} {} {} 9
411b40897abSdan}
412b40897abSdan
413b40897abSdando_execsql_test 7.5 {
414b40897abSdan  CREATE INDEX idx_bar ON bar(ba, bb);
415b40897abSdan  SELECT
416b40897abSdan    bar.Id, bar.ba, bar.bb, foo.fb
417b40897abSdan    FROM foo LEFT JOIN bar
418b40897abSdan           ON (bar.ba = 1 AND bar.bb = foo.fb)
419b40897abSdan           OR (bar.ba = 5 AND bar.bb = foo.fb);
420b40897abSdan} {
421b40897abSdan  1 1 1 1
422b40897abSdan  {} {} {} 2
423b40897abSdan  {} {} {} 3
424b40897abSdan  4 1 4 4
425b40897abSdan  {} {} {} 5
426b40897abSdan  {} {} {} 6
427b40897abSdan  7 1 7 7
428b40897abSdan  {} {} {} 8
429b40897abSdan  {} {} {} 9
430b40897abSdan}
431b40897abSdan
432b40897abSdan
433bfca6a40Sdanfinish_test
434