xref: /sqlite-3.40.0/test/rowvalue.test (revision b3623e0a)
171c57db0Sdan# 2016 June 17
271c57db0Sdan#
371c57db0Sdan# The author disclaims copyright to this source code.  In place of
471c57db0Sdan# a legal notice, here is a blessing:
571c57db0Sdan#
671c57db0Sdan#    May you do good and not evil.
771c57db0Sdan#    May you find forgiveness for yourself and forgive others.
871c57db0Sdan#    May you share freely, never taking more than you give.
971c57db0Sdan#
1071c57db0Sdan#***********************************************************************
1171c57db0Sdan# This file implements regression tests for SQLite library.  The
1271c57db0Sdan# focus of this file is testing the SELECT statement.
1371c57db0Sdan#
1471c57db0Sdan
1571c57db0Sdan
1671c57db0Sdanset testdir [file dirname $argv0]
1771c57db0Sdansource $testdir/tester.tcl
1871c57db0Sdanset ::testprefix rowvalue
1971c57db0Sdan
2071c57db0Sdando_execsql_test 0.0 {
2171c57db0Sdan  CREATE TABLE one(o);
2271c57db0Sdan  INSERT INTO one VALUES(1);
2371c57db0Sdan}
2471c57db0Sdan
2571c57db0Sdanforeach {tn v1 v2 eq ne is isnot} {
2671c57db0Sdan  1 "1, 2, 3"    "1, 2, 3"                   1  0     1 0
2771c57db0Sdan  2 "1, 0, 3"    "1, 2, 3"                   0  1     0 1
2871c57db0Sdan  3 "1, 2, NULL" "1, 2, 3"                   {} {}    0 1
2971c57db0Sdan  4 "1, 2, NULL" "1, 2, NULL"                {} {}    1 0
3071c57db0Sdan  5 "NULL, NULL, NULL" "NULL, NULL, NULL"    {} {}    1 0
315c288b92Sdan
325c288b92Sdan  6 "1, NULL, 1" "1, 1, 1"                   {} {}    0 1
335c288b92Sdan  7 "1, NULL, 1" "1, 1, 2"                   0  1     0 1
3471c57db0Sdan} {
3571c57db0Sdan  do_execsql_test 1.$tn.eq "SELECT ($v1) == ($v2)" [list $eq]
3671c57db0Sdan  do_execsql_test 1.$tn.ne "SELECT ($v1) != ($v2)" [list $ne]
3771c57db0Sdan
3871c57db0Sdan  do_execsql_test 1.$tn.is    "SELECT ($v1) IS ($v2)"     [list $is]
3971c57db0Sdan  do_execsql_test 1.$tn.isnot "SELECT ($v1) IS NOT ($v2)" [list $isnot]
4071c57db0Sdan
4171c57db0Sdan  do_execsql_test 1.$tn.2.eq "SELECT (SELECT $v1) == (SELECT $v2)" [list $eq]
4271c57db0Sdan  do_execsql_test 1.$tn.2.ne "SELECT (SELECT $v1) != (SELECT $v2)" [list $ne]
4371c57db0Sdan}
4471c57db0Sdan
4571c57db0Sdanforeach {tn v1 v2 lt gt le ge} {
4671c57db0Sdan  1 "(1, 1, 3)"    "(1, 2, 3)"                   1 0      1 0
4771c57db0Sdan  2 "(1, 2, 3)"    "(1, 2, 3)"                   0 0      1 1
4871c57db0Sdan  3 "(1, 3, 3)"    "(1, 2, 3)"                   0 1      0 1
4971c57db0Sdan
5071c57db0Sdan  4 "(1, NULL, 3)"    "(1, 2, 3)"                {} {}      {} {}
5171c57db0Sdan  5 "(1, 3, 3)"    "(1, NULL, 3)"                {} {}      {} {}
5271c57db0Sdan  6 "(1, NULL, 3)"    "(1, NULL, 3)"             {} {}      {} {}
5371c57db0Sdan} {
5471c57db0Sdan  foreach {tn2 expr res} [list \
5571c57db0Sdan    2.$tn.lt "$v1 < $v2" $lt   \
5671c57db0Sdan    2.$tn.gt "$v1 > $v2" $gt   \
5771c57db0Sdan    2.$tn.le "$v1 <= $v2" $le   \
5871c57db0Sdan    2.$tn.ge "$v1 >= $v2" $ge   \
5971c57db0Sdan  ] {
6071c57db0Sdan    do_execsql_test $tn2 "SELECT $expr" [list $res]
6171c57db0Sdan
6271c57db0Sdan    set map(0) [list]
6371c57db0Sdan    set map() [list]
6471c57db0Sdan    set map(1) [list 1]
6571c57db0Sdan    do_execsql_test $tn2.where1 "SELECT * FROM one WHERE $expr" $map($res)
6671c57db0Sdan
6771c57db0Sdan    set map(0) [list 1]
6871c57db0Sdan    set map() [list]
6971c57db0Sdan    set map(1) [list]
7071c57db0Sdan    do_execsql_test $tn2.where2 "SELECT * FROM one WHERE NOT $expr" $map($res)
7171c57db0Sdan  }
7271c57db0Sdan}
7371c57db0Sdan
7471c57db0Sdando_execsql_test 3.0 {
7571c57db0Sdan  CREATE TABLE t1(x, y);
7671c57db0Sdan  INSERT INTO t1 VALUES(1, 1);
7771c57db0Sdan  INSERT INTO t1 VALUES(1, 2);
7871c57db0Sdan  INSERT INTO t1 VALUES(2, 3);
7971c57db0Sdan  INSERT INTO t1 VALUES(2, 4);
8071c57db0Sdan  INSERT INTO t1 VALUES(3, 5);
8171c57db0Sdan  INSERT INTO t1 VALUES(3, 6);
8271c57db0Sdan}
8371c57db0Sdan
8471c57db0Sdanforeach {tn r order} {
8571c57db0Sdan  1 "(1, 1)"           "ORDER BY y"
8671c57db0Sdan  2 "(1, 1)"           "ORDER BY x, y"
8771c57db0Sdan  3 "(1, 2)"           "ORDER BY x, y DESC"
8871c57db0Sdan  4 "(3, 6)"           "ORDER BY x DESC, y DESC"
8971c57db0Sdan  5 "((3, 5))"         "ORDER BY x DESC, y"
9071c57db0Sdan  6 "(SELECT 3, 5)"    "ORDER BY x DESC, y"
9171c57db0Sdan} {
9271c57db0Sdan  do_execsql_test 3.$tn.1 "SELECT $r == (SELECT x,y FROM t1 $order)" 1
9371c57db0Sdan  do_execsql_test 3.$tn.2 "SELECT $r == (SELECT * FROM t1 $order)" 1
9471c57db0Sdan
9571c57db0Sdan  do_execsql_test 3.$tn.3 "
9671c57db0Sdan    SELECT (SELECT * FROM t1 $order) == (SELECT * FROM t1 $order)
9771c57db0Sdan  " 1
9871c57db0Sdan  do_execsql_test 3.$tn.4 "
9971c57db0Sdan    SELECT (SELECT 0, 0) == (SELECT * FROM t1 $order)
10071c57db0Sdan  " 0
10171c57db0Sdan}
10271c57db0Sdan
10371c57db0Sdanforeach {tn expr res} {
10471c57db0Sdan  1 {(2, 2) BETWEEN (2, 2) AND (3, 3)} 1
10571c57db0Sdan  2 {(2, 2) BETWEEN (2, NULL) AND (3, 3)} {}
10671c57db0Sdan  3 {(2, 2) BETWEEN (3, NULL) AND (3, 3)} 0
10771c57db0Sdan} {
10871c57db0Sdan  do_execsql_test 4.$tn "SELECT $expr" [list $res]
10971c57db0Sdan}
11071c57db0Sdan
11171c57db0Sdanforeach {tn expr res} {
11271c57db0Sdan  1 {(2, 4) IN (SELECT * FROM t1)} 1
11371c57db0Sdan  2 {(3, 4) IN (SELECT * FROM t1)} 0
11471c57db0Sdan
11571c57db0Sdan  3 {(NULL, 4) IN (SELECT * FROM t1)} {}
11671c57db0Sdan  4 {(NULL, 0) IN (SELECT * FROM t1)} 0
11771c57db0Sdan
11871c57db0Sdan  5 {(NULL, 4) NOT IN (SELECT * FROM t1)} {}
11971c57db0Sdan  6 {(NULL, 0) NOT IN (SELECT * FROM t1)} 1
12071c57db0Sdan} {
12171c57db0Sdan  do_execsql_test 5.$tn "SELECT $expr" [list $res]
12271c57db0Sdan}
12371c57db0Sdan
12419ff12ddSdando_execsql_test 6.0 {
12519ff12ddSdan  CREATE TABLE hh(a, b, c);
12619ff12ddSdan  INSERT INTO hh VALUES('abc', 1, 'i');
12719ff12ddSdan  INSERT INTO hh VALUES('ABC', 1, 'ii');
12819ff12ddSdan  INSERT INTO hh VALUES('def', 2, 'iii');
12919ff12ddSdan  INSERT INTO hh VALUES('DEF', 2, 'iv');
13019ff12ddSdan  INSERT INTO hh VALUES('GHI', 3, 'v');
13119ff12ddSdan  INSERT INTO hh VALUES('ghi', 3, 'vi');
13271c57db0Sdan
13319ff12ddSdan  CREATE INDEX hh_ab ON hh(a, b);
13419ff12ddSdan}
13519ff12ddSdan
13619ff12ddSdando_execsql_test 6.1 {
13719ff12ddSdan  SELECT c FROM hh WHERE (a, b) = (SELECT 'abc', 1);
13819ff12ddSdan} {i}
13919ff12ddSdando_execsql_test 6.2 {
14019ff12ddSdan  SELECT c FROM hh WHERE (a, b) = (SELECT 'abc' COLLATE nocase, 1);
14119ff12ddSdan} {i}
14219ff12ddSdando_execsql_test 6.3 {
14319ff12ddSdan  SELECT c FROM hh WHERE a = (SELECT 'abc' COLLATE nocase) AND b = (SELECT 1);
14419ff12ddSdan} {i}
14519ff12ddSdando_execsql_test 6.4 {
14619ff12ddSdan  SELECT c FROM hh WHERE +a = (SELECT 'abc' COLLATE nocase) AND b = (SELECT 1);
14719ff12ddSdan} {i}
14819ff12ddSdando_execsql_test 6.5 {
14919ff12ddSdan  SELECT c FROM hh WHERE a = (SELECT 'abc') COLLATE nocase AND b = (SELECT 1);
15019ff12ddSdan} {i ii}
15119ff12ddSdando_catchsql_test 6.6 {
15219ff12ddSdan  SELECT c FROM hh WHERE (a, b) = (SELECT 'abc', 1) COLLATE nocase;
153e835bc12Sdrh} {1 {row value misused}}
15419ff12ddSdando_catchsql_test 6.7 {
15519ff12ddSdan  SELECT c FROM hh WHERE (a, b) = 1;
156e835bc12Sdrh} {1 {row value misused}}
15719ff12ddSdando_execsql_test 6.8 {
15819ff12ddSdan  SELECT c FROM hh WHERE (a COLLATE nocase, b) = (SELECT 'def', 2);
15919ff12ddSdan} {iii iv}
16019ff12ddSdando_execsql_test 6.9 {
16119ff12ddSdan  SELECT c FROM hh WHERE (a COLLATE nocase, b) IS NOT (SELECT 'def', 2);
16219ff12ddSdan} {i ii v vi}
16319ff12ddSdando_execsql_test 6.10 {
16419ff12ddSdan  SELECT c FROM hh WHERE (b, a) = (SELECT 2, 'def');
16519ff12ddSdan} {iii}
16619ff12ddSdan
16719ff12ddSdando_execsql_test 7.0 {
16819ff12ddSdan  CREATE TABLE xy(i INTEGER PRIMARY KEY, j, k);
16919ff12ddSdan  INSERT INTO xy VALUES(1, 1, 1);
17019ff12ddSdan  INSERT INTO xy VALUES(2, 2, 2);
17119ff12ddSdan  INSERT INTO xy VALUES(3, 3, 3);
17219ff12ddSdan  INSERT INTO xy VALUES(4, 4, 4);
17319ff12ddSdan}
17419ff12ddSdan
17519ff12ddSdan
17619ff12ddSdanforeach {tn sql res eqp} {
17719ff12ddSdan  1 "SELECT * FROM xy WHERE (i, j) IS (2, 2)" {2 2 2}
1788210233cSdrh    "SEARCH xy USING INTEGER PRIMARY KEY (rowid=?)"
17919ff12ddSdan
18019ff12ddSdan  2 "SELECT * FROM xy WHERE (k, j) < (2, 3)" {1 1 1 2 2 2}
1818210233cSdrh    "SCAN xy"
18219ff12ddSdan
18319ff12ddSdan  3 "SELECT * FROM xy WHERE (i, j) < (2, 3)" {1 1 1 2 2 2}
1848210233cSdrh    "SEARCH xy USING INTEGER PRIMARY KEY (rowid<?)"
18519ff12ddSdan
18619ff12ddSdan  4 "SELECT * FROM xy WHERE (i, j) > (2, 1)" {2 2 2 3 3 3 4 4 4}
1878210233cSdrh    "SEARCH xy USING INTEGER PRIMARY KEY (rowid>?)"
18819ff12ddSdan
18919ff12ddSdan  5 "SELECT * FROM xy WHERE (i, j) > ('2', 1)" {2 2 2 3 3 3 4 4 4}
1908210233cSdrh    "SEARCH xy USING INTEGER PRIMARY KEY (rowid>?)"
19119ff12ddSdan
19219ff12ddSdan} {
19319ff12ddSdan  do_eqp_test 7.$tn.1 $sql $eqp
19419ff12ddSdan  do_execsql_test 7.$tn.2 $sql $res
19519ff12ddSdan}
19619ff12ddSdan
197870a0705Sdando_execsql_test 8.0 {
198870a0705Sdan  CREATE TABLE j1(a);
199870a0705Sdan}
200870a0705Sdando_execsql_test 8.1 {
201870a0705Sdan  SELECT * FROM j1 WHERE (select min(a) FROM j1) IN (?, ?, ?)
202870a0705Sdan}
20319ff12ddSdan
204553168c7Sdando_execsql_test 9.0 {
205553168c7Sdan  CREATE TABLE t2(a INTEGER PRIMARY KEY, b, c);
206553168c7Sdan  INSERT INTO t2 VALUES(1, 1, 1);
207553168c7Sdan  INSERT INTO t2 VALUES(2, 2, 2);
208553168c7Sdan  INSERT INTO t2 VALUES(3, 3, 3);
209553168c7Sdan  INSERT INTO t2 VALUES(4, 4, 4);
210553168c7Sdan  INSERT INTO t2 VALUES(5, 5, 5);
211553168c7Sdan}
212553168c7Sdan
213553168c7Sdanforeach {tn q res} {
214553168c7Sdan  1 "(a, b) > (2, 1)" {2 3 4 5}
215553168c7Sdan  2 "(a, b) > (2, 2)" {3 4 5}
216553168c7Sdan  3 "(a, b) < (4, 5)" {1 2 3 4}
217553168c7Sdan  4 "(a, b) < (4, 3)" {1 2 3}
218553168c7Sdan} {
219553168c7Sdan  do_execsql_test 9.$tn "SELECT c FROM t2 WHERE $q" $res
220553168c7Sdan}
221553168c7Sdan
2227887d7f2Sdando_execsql_test 10.0 {
2237887d7f2Sdan  CREATE TABLE dual(dummy); INSERT INTO dual(dummy) VALUES('X');
2247887d7f2Sdan  CREATE TABLE t3(a TEXT,b TEXT,c TEXT,d TEXT,e TEXT,f TEXT);
2257887d7f2Sdan  CREATE INDEX t3x ON t3(b,c,d,e,f);
2267887d7f2Sdan
2277887d7f2Sdan  SELECT a FROM t3
2287887d7f2Sdan    WHERE (c,d) IN (SELECT 'c','d' FROM dual)
2297887d7f2Sdan    AND (a,b,e) IN (SELECT 'a','b','d' FROM dual);
2307887d7f2Sdan}
23119ff12ddSdan
232b29e60c4Sdrhdo_catchsql_test 11.1 {
233b29e60c4Sdrh  CREATE TABLE t11(a);
234b29e60c4Sdrh  SELECT * FROM t11 WHERE (a,a)<=1;
235b29e60c4Sdrh} {1 {row value misused}}
236b29e60c4Sdrhdo_catchsql_test 11.2 {
237b29e60c4Sdrh  SELECT * FROM t11 WHERE (a,a)<1;
238b29e60c4Sdrh} {1 {row value misused}}
239b29e60c4Sdrhdo_catchsql_test 11.3 {
240b29e60c4Sdrh  SELECT * FROM t11 WHERE (a,a)>=1;
241b29e60c4Sdrh} {1 {row value misused}}
242b29e60c4Sdrhdo_catchsql_test 11.4 {
243b29e60c4Sdrh  SELECT * FROM t11 WHERE (a,a)>1;
244b29e60c4Sdrh} {1 {row value misused}}
245b29e60c4Sdrhdo_catchsql_test 11.5 {
246b29e60c4Sdrh  SELECT * FROM t11 WHERE (a,a)==1;
247b29e60c4Sdrh} {1 {row value misused}}
248b29e60c4Sdrhdo_catchsql_test 11.6 {
249b29e60c4Sdrh  SELECT * FROM t11 WHERE (a,a)<>1;
250b29e60c4Sdrh} {1 {row value misused}}
251b29e60c4Sdrhdo_catchsql_test 11.7 {
252b29e60c4Sdrh  SELECT * FROM t11 WHERE (a,a) IS 1;
253b29e60c4Sdrh} {1 {row value misused}}
254b29e60c4Sdrhdo_catchsql_test 11.8 {
255b29e60c4Sdrh  SELECT * FROM t11 WHERE (a,a) IS NOT 1;
256b29e60c4Sdrh} {1 {row value misused}}
257b29e60c4Sdrh
258c52496f5Sdrh# 2016-10-27: https://www.sqlite.org/src/tktview/fef4bb4bd9185ec8f
259c52496f5Sdrh# Incorrect result from a LEFT JOIN with a row-value constraint
260c52496f5Sdrh#
261c52496f5Sdrhdo_execsql_test 12.1 {
262c52496f5Sdrh  DROP TABLE IF EXISTS t1;
26348619160Sdrh  CREATE TABLE t1(a INT,b INT); INSERT INTO t1 VALUES(1,2);
264c52496f5Sdrh  DROP TABLE IF EXISTS t2;
26548619160Sdrh  CREATE TABLE t2(x INT,y INT); INSERT INTO t2 VALUES(3,4);
266c52496f5Sdrh  SELECT *,'x' FROM t1 LEFT JOIN t2 ON (a,b)=(x,y);
267c52496f5Sdrh} {1 2 {} {} x}
26848619160Sdrhdb null -
26948619160Sdrhdo_execsql_test 12.2 {
27048619160Sdrh  SELECT t1.*, t2.* FROM t2 RIGHT JOIN t1 ON (a,b)=(x,y);
27148619160Sdrh} {1 2 - -}
27248619160Sdrhdo_execsql_test 12.3 {
27348619160Sdrh  SELECT t1.*, t2.* FROM t1 FULL JOIN t2 ON (a,b)=(x,y)
27448619160Sdrh   ORDER BY coalesce(a,x);
27548619160Sdrh} {
27648619160Sdrh  1 2 - -
27748619160Sdrh  - - 3 4
27848619160Sdrh}
27948619160Sdrhdb null {}
280b29e60c4Sdrh
2813bafdedeSdan
2823bafdedeSdanforeach {tn sql} {
2833bafdedeSdan  0 "SELECT (1,2) AS x WHERE x=3"
2843bafdedeSdan  1 "SELECT (1,2) BETWEEN 1 AND 2"
2853bafdedeSdan  2 "SELECT 1 BETWEEN (1,2) AND 2"
2863bafdedeSdan  3 "SELECT 2 BETWEEN 1 AND (1,2)"
2873bafdedeSdan  4 "SELECT (1,2) FROM (SELECT 1) ORDER BY 1"
2883bafdedeSdan  5 "SELECT (1,2) FROM (SELECT 1) GROUP BY 1"
2893bafdedeSdan} {
2903bafdedeSdan  do_catchsql_test 13.$tn $sql {1 {row value misused}}
2913bafdedeSdan}
2923bafdedeSdan
2934b725240Sdando_execsql_test 14.0 {
2944b725240Sdan  CREATE TABLE t12(x);
2954b725240Sdan  INSERT INTO t12 VALUES(2), (4);
2964b725240Sdan}
2974b725240Sdando_execsql_test 14.1 "SELECT 1 WHERE (2,2) BETWEEN (1,1) AND (3,3)" 1
2984b725240Sdando_execsql_test 14.2 "SELECT CASE (2,2) WHEN (1, 1) THEN 2 ELSE 1 END" 1
2994b725240Sdando_execsql_test 14.3 "SELECT CASE (SELECT 2,2) WHEN (1, 1) THEN 2 ELSE 1 END" 1
3004b725240Sdando_execsql_test 14.4 "SELECT 1 WHERE (SELECT 2,2) BETWEEN (1,1) AND (3,3)" 1
3014b725240Sdando_execsql_test 14.5 "SELECT 1 FROM t12 WHERE (x,1) BETWEEN (1,1) AND (3,3)" 1
3024b725240Sdando_execsql_test 14.6 {
3034b725240Sdan  SELECT 1 FROM t12 WHERE (1,x) BETWEEN (1,1) AND (3,3)
3044b725240Sdan} {1 1}
3053bafdedeSdan
30644c5604cSdan#-------------------------------------------------------------------------
30744c5604cSdan# Test that errors are not concealed by the SELECT flattening or
30844c5604cSdan# WHERE-clause push-down optimizations.
30944c5604cSdando_execsql_test 14.1 {
31044c5604cSdan  CREATE TABLE x1(a PRIMARY KEY, b);
31144c5604cSdan  CREATE TABLE x2(a INTEGER PRIMARY KEY, b);
31244c5604cSdan}
31344c5604cSdan
31444c5604cSdanforeach {tn n sql} {
31544c5604cSdan  1 0 "SELECT * FROM (SELECT (1, 1) AS c FROM x1) WHERE c=1"
31644c5604cSdan  2 2 "SELECT * FROM (SELECT 1 AS x, (SELECT 8,9) AS y) WHERE y<1"
31744c5604cSdan  3 3 "SELECT * FROM (SELECT 1 AS x, (SELECT 8,9,10) AS y) WHERE y<1"
31844c5604cSdan  4 0 "SELECT * FROM (SELECT (a, b) AS c FROM x1), x2 WHERE c=a"
31944c5604cSdan  5 0 "SELECT * FROM (SELECT a AS c, (1, 2, 3) FROM x1), x2 WHERE c=a"
32044c5604cSdan  6 0 "SELECT * FROM (SELECT 1 AS c, (1, 2, 3) FROM x1) WHERE c=1"
32144c5604cSdan} {
32244c5604cSdan  if {$n==0} {
32344c5604cSdan    set err "row value misused"
32444c5604cSdan  } else {
32544c5604cSdan    set err "sub-select returns $n columns - expected 1"
32644c5604cSdan  }
32744c5604cSdan  do_catchsql_test 14.2.$tn $sql [list 1 $err]
32844c5604cSdan}
32944c5604cSdan
330245ce62eSdrh#--------------------------------------------------------------------------
331245ce62eSdrh# Test for vector size mismatches concealed by unexpanded subqueries.
332245ce62eSdrh#
333245ce62eSdrhdo_catchsql_test 15.1 {
334245ce62eSdrh  DETACH (SELECT * FROM (SELECT 1,2))<3;
335245ce62eSdrh} {1 {row value misused}}
336245ce62eSdrhdo_catchsql_test 15.2 {
337245ce62eSdrh  UPDATE x1 SET a=(SELECT * FROM (SELECT b,2))<3;
338245ce62eSdrh} {1 {row value misused}}
339245ce62eSdrhdo_catchsql_test 15.3 {
340245ce62eSdrh  UPDATE x1 SET a=NULL WHERE  a<(SELECT * FROM (SELECT b,2));
341245ce62eSdrh} {1 {sub-select returns 2 columns - expected 1}}
342245ce62eSdrhdo_catchsql_test 15.4 {
343245ce62eSdrh  DELETE FROM x1 WHERE  a<(SELECT * FROM (SELECT b,2));
344245ce62eSdrh} {1 {sub-select returns 2 columns - expected 1}}
345245ce62eSdrhdo_catchsql_test 15.5 {
346245ce62eSdrh  INSERT INTO x1(a,b) VALUES(1,(SELECT * FROM (SELECT 1,2))<3);
347245ce62eSdrh} {1 {row value misused}}
34844c5604cSdan
34990a7eae8Sdrh#-------------------------------------------------------------------------
35090a7eae8Sdrh# Row-values used in UPDATE statements within TRIGGERs
35190a7eae8Sdrh#
35290a7eae8Sdrh# Ticket https://www.sqlite.org/src/info/8c9458e703666e1a
35390a7eae8Sdrh#
35490a7eae8Sdrhdo_execsql_test 16.1 {
35590a7eae8Sdrh  CREATE TABLE t16a(a,b,c);
35690a7eae8Sdrh  INSERT INTO t16a VALUES(1,2,3);
35790a7eae8Sdrh  CREATE TABLE t16b(x);
35890a7eae8Sdrh  INSERT INTO t16b(x) VALUES(1);
35990a7eae8Sdrh  CREATE TRIGGER t16r AFTER UPDATE ON t16b BEGIN
36090a7eae8Sdrh     UPDATE t16a SET (a,b,c)=(SELECT new.x,new.x+1,new.x+2);
36190a7eae8Sdrh  END;
36290a7eae8Sdrh  UPDATE t16b SET x=7;
36390a7eae8Sdrh  SELECT * FROM t16a;
36490a7eae8Sdrh} {7 8 9}
36590a7eae8Sdrhdo_execsql_test 16.2 {
36690a7eae8Sdrh  UPDATE t16b SET x=97;
36790a7eae8Sdrh  SELECT * FROM t16a;
36890a7eae8Sdrh} {97 98 99}
36990a7eae8Sdrh
370f299edb0Sdando_execsql_test 16.3 {
371f299edb0Sdan  CREATE TABLE t16c(a, b, c, d, e);
372f299edb0Sdan  INSERT INTO t16c VALUES(1, 'a', 'b', 'c', 'd');
373f299edb0Sdan  CREATE TRIGGER t16c1 AFTER INSERT ON t16c BEGIN
374f299edb0Sdan    UPDATE t16c SET (c, d) = (SELECT 'A', 'B'), (e, b) = (SELECT 'C', 'D')
375f299edb0Sdan      WHERE a = new.a-1;
376f299edb0Sdan  END;
377f299edb0Sdan
378f299edb0Sdan  SELECT * FROM t16c;
379f299edb0Sdan} {1 a b c d}
380f299edb0Sdan
381f299edb0Sdando_execsql_test 16.4 {
382f299edb0Sdan  INSERT INTO t16c VALUES(2, 'w', 'x', 'y', 'z');
383f299edb0Sdan  SELECT * FROM t16c;
384f299edb0Sdan} {
385f299edb0Sdan  1 D A B C
386f299edb0Sdan  2 w x y z
387f299edb0Sdan}
388f299edb0Sdan
389f299edb0Sdando_execsql_test 16.5 {
390f299edb0Sdan  DROP TRIGGER t16c1;
391f299edb0Sdan  PRAGMA recursive_triggers = 1;
392f299edb0Sdan  INSERT INTO t16c VALUES(3, 'i', 'ii', 'iii', 'iv');
393f299edb0Sdan  CREATE TRIGGER t16c1 AFTER UPDATE ON t16c WHEN new.a>1 BEGIN
394f299edb0Sdan    UPDATE t16c SET (e, d) = (
395f299edb0Sdan      SELECT b, c FROM t16c WHERE a = new.a-1
396f299edb0Sdan    ), (c, b) = (
397f299edb0Sdan      SELECT d, e FROM t16c WHERE a = new.a-1
398f299edb0Sdan    ) WHERE a = new.a-1;
399f299edb0Sdan  END;
400f299edb0Sdan
401f299edb0Sdan  UPDATE t16c SET a=a WHERE a=3;
402f299edb0Sdan  SELECT * FROM t16c;
403f299edb0Sdan} {
404f299edb0Sdan  1 C B A D
405f299edb0Sdan  2 z y x w
406f299edb0Sdan  3 i ii iii iv
407f299edb0Sdan}
408f299edb0Sdan
409a916b570Sdando_execsql_test 17.0 {
410a916b570Sdan  CREATE TABLE b1(a, b);
411a916b570Sdan  CREATE TABLE b2(x);
412a916b570Sdan}
413a916b570Sdan
414a916b570Sdando_execsql_test 17.1 {
415a916b570Sdan  SELECT * FROM b2 CROSS JOIN b1
416a916b570Sdan  WHERE b2.x=b1.a AND (b1.a, 2)
417a916b570Sdan  IN (VALUES(1, 2));
418a916b570Sdan} {}
419a916b570Sdan
420a916b570Sdando_execsql_test 18.0 {
421a916b570Sdan  CREATE TABLE b3 ( a, b, PRIMARY KEY (a, b) );
422a916b570Sdan  CREATE TABLE b4 ( a );
423a916b570Sdan  CREATE TABLE b5 ( a, b );
424a916b570Sdan  INSERT INTO b3 VALUES (1, 1), (1, 2);
425a916b570Sdan  INSERT INTO b4 VALUES (1);
426a916b570Sdan  INSERT INTO b5 VALUES (1, 1), (1, 2);
427a916b570Sdan}
428a916b570Sdan
429a916b570Sdando_execsql_test 18.1 {
430a916b570Sdan  SELECT * FROM b3 WHERE (SELECT b3.a, b3.b) IN ( SELECT a, b FROM b5 )
431a916b570Sdan} {1 1 1 2}
432a916b570Sdando_execsql_test 18.2 {
433a916b570Sdan  SELECT * FROM b3 WHERE (VALUES(b3.a, b3.b)) IN ( SELECT a, b FROM b5 );
434a916b570Sdan} {1 1 1 2}
435a916b570Sdando_execsql_test 18.3 {
436a916b570Sdan  SELECT * FROM b3 WHERE (b3.a, b3.b) IN ( SELECT a, b FROM b5 );
437a916b570Sdan} {1 1 1 2}
438a916b570Sdando_execsql_test 18.4 {
439a916b570Sdan  SELECT * FROM b3 JOIN b4 ON b4.a = b3.a
440a916b570Sdan  WHERE (SELECT b3.a, b3.b) IN ( SELECT a, b FROM b5 );
441a916b570Sdan} {1 1 1 1 2 1}
442a916b570Sdando_execsql_test 18.5 {
443a916b570Sdan  SELECT * FROM b3 JOIN b4 ON b4.a = b3.a
444a916b570Sdan  WHERE (VALUES(b3.a, b3.b)) IN ( SELECT a, b FROM b5 );
445a916b570Sdan} {1 1 1 1 2 1}
446a916b570Sdando_execsql_test 18.6 {
447a916b570Sdan  SELECT * FROM b3 JOIN b4 ON b4.a = b3.a
448a916b570Sdan  WHERE (b3.a, b3.b) IN ( SELECT a, b FROM b5 );
449a916b570Sdan} {1 1 1 1 2 1}
450a916b570Sdan
451a916b570Sdan
4524d1c6845Sdrh# 2018-02-13 Ticket https://www.sqlite.org/src/tktview/f484b65f3d6230593c3
4534d1c6845Sdrh# Incorrect result from a row-value comparison in the WHERE clause.
4544d1c6845Sdrh#
4554d1c6845Sdrhdo_execsql_test 19.1 {
4564d1c6845Sdrh  DROP TABLE IF EXISTS t1;
4574d1c6845Sdrh  CREATE TABLE t1(a INTEGER PRIMARY KEY,b);
4584d1c6845Sdrh  INSERT INTO t1(a,b) VALUES(1,11),(2,22),(3,33),(4,44);
459a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)>(0,0) ORDER BY a;
4604d1c6845Sdrh} {1 11 2 22 3 33 4 44}
4614d1c6845Sdrhdo_execsql_test 19.2 {
462a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)>=(0,0) ORDER BY a;
4634d1c6845Sdrh} {1 11 2 22 3 33 4 44}
4644d1c6845Sdrhdo_execsql_test 19.3 {
465a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)<(5,0) ORDER BY a DESC;
466a9abfb1eSdrh} {4 44 3 33 2 22 1 11}
4674d1c6845Sdrhdo_execsql_test 19.4 {
468a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)<=(5,0) ORDER BY a DESC;
469a9abfb1eSdrh} {4 44 3 33 2 22 1 11}
4704d1c6845Sdrhdo_execsql_test 19.5 {
471a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)>(3,0) ORDER BY a;
4724d1c6845Sdrh} {3 33 4 44}
4734d1c6845Sdrhdo_execsql_test 19.6 {
474a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)>=(3,0) ORDER BY a;
4754d1c6845Sdrh} {3 33 4 44}
4764d1c6845Sdrhdo_execsql_test 19.7 {
477a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)<(3,0) ORDER BY a DESC;
478a9abfb1eSdrh} {2 22 1 11}
4794d1c6845Sdrhdo_execsql_test 19.8 {
480a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)<=(3,0) ORDER BY a DESC;
481a9abfb1eSdrh} {2 22 1 11}
4824d1c6845Sdrhdo_execsql_test 19.9 {
483a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)>(3,32) ORDER BY a;
4844d1c6845Sdrh} {3 33 4 44}
4854d1c6845Sdrhdo_execsql_test 19.10 {
486a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)>(3,33) ORDER BY a;
4874d1c6845Sdrh} {4 44}
4884d1c6845Sdrhdo_execsql_test 19.11 {
489a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)>=(3,33) ORDER BY a;
4904d1c6845Sdrh} {3 33 4 44}
4914d1c6845Sdrhdo_execsql_test 19.12 {
492a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)>=(3,34) ORDER BY a;
4934d1c6845Sdrh} {4 44}
4944d1c6845Sdrhdo_execsql_test 19.13 {
495a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)<(3,34) ORDER BY a DESC;
496a9abfb1eSdrh} {3 33 2 22 1 11}
4974d1c6845Sdrhdo_execsql_test 19.14 {
498a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)<(3,33) ORDER BY a DESC;
499a9abfb1eSdrh} {2 22 1 11}
5004d1c6845Sdrhdo_execsql_test 19.15 {
501a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)<=(3,33) ORDER BY a DESC;
502a9abfb1eSdrh} {3 33 2 22 1 11}
5034d1c6845Sdrhdo_execsql_test 19.16 {
504a9abfb1eSdrh  SELECT * FROM t1 WHERE (a,b)<=(3,32) ORDER BY a DESC;
505a9abfb1eSdrh} {2 22 1 11}
5064d1c6845Sdrhdo_execsql_test 19.21 {
507a9abfb1eSdrh  SELECT * FROM t1 WHERE (0,0)<(a,b) ORDER BY a;
5084d1c6845Sdrh} {1 11 2 22 3 33 4 44}
5094d1c6845Sdrhdo_execsql_test 19.22 {
510a9abfb1eSdrh  SELECT * FROM t1 WHERE (0,0)<=(a,b) ORDER BY a;
5114d1c6845Sdrh} {1 11 2 22 3 33 4 44}
5124d1c6845Sdrhdo_execsql_test 19.23 {
513a9abfb1eSdrh  SELECT * FROM t1 WHERE (5,0)>(a,b) ORDER BY a DESC;
514a9abfb1eSdrh} {4 44 3 33 2 22 1 11}
5154d1c6845Sdrhdo_execsql_test 19.24 {
516a9abfb1eSdrh  SELECT * FROM t1 WHERE (5,0)>=(a,b) ORDER BY a DESC;
517a9abfb1eSdrh} {4 44 3 33 2 22 1 11}
5184d1c6845Sdrhdo_execsql_test 19.25 {
519a9abfb1eSdrh  SELECT * FROM t1 WHERE (3,0)<(a,b) ORDER BY a;
5204d1c6845Sdrh} {3 33 4 44}
5214d1c6845Sdrhdo_execsql_test 19.26 {
522a9abfb1eSdrh  SELECT * FROM t1 WHERE (3,0)<=(a,b) ORDER BY a;
5234d1c6845Sdrh} {3 33 4 44}
5244d1c6845Sdrhdo_execsql_test 19.27 {
525a9abfb1eSdrh  SELECT * FROM t1 WHERE (3,0)>(a,b) ORDER BY a DESC;
526a9abfb1eSdrh} {2 22 1 11}
5274d1c6845Sdrhdo_execsql_test 19.28 {
528a9abfb1eSdrh  SELECT * FROM t1 WHERE (3,0)>=(a,b) ORDER BY a DESC;
529a9abfb1eSdrh} {2 22 1 11}
5304d1c6845Sdrhdo_execsql_test 19.29 {
531a9abfb1eSdrh  SELECT * FROM t1 WHERE (3,32)<(a,b) ORDER BY a;
5324d1c6845Sdrh} {3 33 4 44}
5334d1c6845Sdrhdo_execsql_test 19.30 {
534a9abfb1eSdrh  SELECT * FROM t1 WHERE (3,33)<(a,b) ORDER BY a;
5354d1c6845Sdrh} {4 44}
5364d1c6845Sdrhdo_execsql_test 19.31 {
537a9abfb1eSdrh  SELECT * FROM t1 WHERE (3,33)<=(a,b) ORDER BY a;
5384d1c6845Sdrh} {3 33 4 44}
5394d1c6845Sdrhdo_execsql_test 19.32 {
540a9abfb1eSdrh  SELECT * FROM t1 WHERE (3,34)<=(a,b) ORDER BY a;
5414d1c6845Sdrh} {4 44}
5424d1c6845Sdrhdo_execsql_test 19.33 {
543a9abfb1eSdrh  SELECT * FROM t1 WHERE (3,34)>(a,b) ORDER BY a DESC;
544a9abfb1eSdrh} {3 33 2 22 1 11}
5454d1c6845Sdrhdo_execsql_test 19.34 {
546a9abfb1eSdrh  SELECT * FROM t1 WHERE (3,33)>(a,b) ORDER BY a DESC;
547a9abfb1eSdrh} {2 22 1 11}
5484d1c6845Sdrhdo_execsql_test 19.35 {
549a9abfb1eSdrh  SELECT * FROM t1 WHERE (3,33)>=(a,b) ORDER BY a DESC;
550a9abfb1eSdrh} {3 33 2 22 1 11}
5514d1c6845Sdrhdo_execsql_test 19.36 {
552a9abfb1eSdrh  SELECT * FROM t1 WHERE (3,32)>=(a,b) ORDER BY a DESC;
553a9abfb1eSdrh} {2 22 1 11}
554a916b570Sdan
5551324b283Sdrh# 2018-02-18: Memory leak nested row-value.  Detected by OSSFuzz.
556e28eb64dSdrh#
557e28eb64dSdrhdo_catchsql_test 20.1 {
558e28eb64dSdrh  SELECT 1 WHERE (2,(2,0)) IS (2,(2,0));
559e28eb64dSdrh} {0 1}
560e28eb64dSdrh
561c6e519f3Sdrh# 2018-11-03: Ticket https://www.sqlite.org/src/info/1a84668dcfdebaf1
562c6e519f3Sdrh# Assertion fault when doing row-value operations on a primary key
563c6e519f3Sdrh# containing duplicate columns.
564c6e519f3Sdrh#
565c6e519f3Sdrhdo_execsql_test 21.0 {
566c6e519f3Sdrh  DROP TABLE IF EXISTS t1;
567c6e519f3Sdrh  CREATE TABLE t1(a,b,PRIMARY KEY(b,b));
568c6e519f3Sdrh  INSERT INTO t1 VALUES(1,2),(3,4),(5,6);
569c6e519f3Sdrh  SELECT * FROM t1 WHERE (a,b) IN (VALUES(1,2));
570c6e519f3Sdrh} {1 2}
571c6e519f3Sdrh
572cb99c57aSdrh# 2019-08-09: Multi-column subquery on the RHS of an IN operator.
573cb99c57aSdrh#
574cb99c57aSdrhdo_execsql_test 22.100 {
575cb99c57aSdrh  SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1) IN (SELECT 3,4);
576cb99c57aSdrh  SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1) IN (SELECT 5,6);
577cb99c57aSdrh  SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1) IN (SELECT 3,4);
578cb99c57aSdrh  SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1) IN (SELECT 5,6);
579cb99c57aSdrh  SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1 DESC) IN (SELECT 3,4);
580cb99c57aSdrh  SELECT (SELECT 3,4 UNION SELECT 5,6 ORDER BY 1 DESC) IN (SELECT 5,6);
581cb99c57aSdrh  SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1 DESC) IN (SELECT 3,4);
582cb99c57aSdrh  SELECT (SELECT 5,6 UNION SELECT 3,4 ORDER BY 1 DESC) IN (SELECT 5,6);
583cb99c57aSdrh} {1 0 1 0 0 1 0 1}
584cb99c57aSdrh
58598c94e60Sdrh# 2019-10-21 Ticket b47e3627ecaadbde
58698c94e60Sdrh#
58798c94e60Sdrhdo_execsql_test 23.100 {
58898c94e60Sdrh  DROP TABLE IF EXISTS t0;
58998c94e60Sdrh  CREATE TABLE t0(aa COLLATE NOCASE, bb);
59098c94e60Sdrh  INSERT INTO t0 VALUES('a', 'A');
59198c94e60Sdrh  SELECT (+bb,1) >= (aa, 1), (aa,1)<=(+bb,1) FROM t0;
59298c94e60Sdrh  SELECT 2 FROM t0 WHERE (+bb,1) >= (aa,1);
59398c94e60Sdrh  SELECT 3 FROM t0 WHERE (aa,1) <= (+bb,1);
59498c94e60Sdrh} {0 1 3}
59598c94e60Sdrhdo_execsql_test 23.110 {
59698c94e60Sdrh  SELECT (SELECT +bb,1) >= (aa, 1), (aa,1)<=(SELECT +bb,1) FROM t0;
59798c94e60Sdrh  SELECT 2 FROM t0 WHERE (SELECT +bb,1) >= (aa,1);
59898c94e60Sdrh  SELECT 3 FROM t0 WHERE (aa,1) <= (SELECT +bb,1);
59998c94e60Sdrh} {0 1 3}
60098c94e60Sdrh
601db36e255Sdrh# 2019-10-22 Ticket 6ef984af8972c2eb
602db36e255Sdrhdo_execsql_test 24.100 {
603db36e255Sdrh  DROP TABLE t0;
604db36e255Sdrh  CREATE TABLE t0(c0 TEXT PRIMARY KEY);
605db36e255Sdrh  INSERT INTO t0(c0) VALUES ('');
606db36e255Sdrh  SELECT (t0.c0, TRUE) > (CAST(0 AS REAL), FALSE) FROM t0;
607db36e255Sdrh  SELECT 2 FROM t0 WHERE (t0.c0, TRUE) > (CAST('' AS REAL), FALSE);
608db36e255Sdrh} {1 2}
609db36e255Sdrh
610269d322dSdrh# 2019-10-23 Ticket 135c9da7513e5a97
611269d322dSdrhdo_execsql_test 25.10 {
612269d322dSdrh  DROP TABLE t0;
613269d322dSdrh  CREATE TABLE t0(c0 UNIQUE);
614269d322dSdrh  INSERT INTO t0(c0) VALUES('a');
615269d322dSdrh  SELECT (t0.c0, 0) < ('B' COLLATE NOCASE, 0) FROM t0;
616269d322dSdrh  SELECT 2 FROM t0 WHERE (t0.c0, 0) < ('B' COLLATE NOCASE, 0);
617269d322dSdrh} {1 2}
618269d322dSdrhdo_execsql_test 25.20 {
619269d322dSdrh  SELECT ('B' COLLATE NOCASE, 0)> (t0.c0, 0) FROM t0;
620269d322dSdrh  SELECT 2 FROM t0 WHERE ('B' COLLATE NOCASE, 0)> (t0.c0, 0);
621269d322dSdrh} {1 2}
622269d322dSdrhdo_execsql_test 25.30 {
623269d322dSdrh  SELECT ('B', 0)> (t0.c0 COLLATE nocase, 0) FROM t0;
624269d322dSdrh  SELECT 2 FROM t0 WHERE ('B', 0)> (t0.c0 COLLATE nocase, 0);
625269d322dSdrh} {1 2}
626269d322dSdrhdo_execsql_test 25.40 {
627269d322dSdrh  SELECT (t0.c0 COLLATE nocase, 0) < ('B', 0) FROM t0;
628269d322dSdrh  SELECT 2 FROM t0 WHERE (t0.c0 COLLATE nocase, 0) < ('B', 0);
629269d322dSdrh} {1 2}
630269d322dSdrh
6316c68d759Sdrh# 2019-11-04 Ticket 02aa2bd02f97d0f2
6326c68d759Sdrh# The TK_VECTOR operator messes up sqlite3ExprImpliesNonNull() which
6336c68d759Sdrh# causes incorrect LEFT JOIN strength reduction.  TK_VECTOR should be
6346c68d759Sdrh# treated the same as TK_OR.
6356c68d759Sdrh#
6366c68d759Sdrhdb close
6376c68d759Sdrhsqlite3 db :memory:
6386c68d759Sdrhdo_execsql_test 26.10 {
6396c68d759Sdrh  CREATE TABLE t0(c0);
6406c68d759Sdrh  CREATE TABLE t1(c1);
6416c68d759Sdrh  INSERT INTO t1(c1) VALUES (0);
6426c68d759Sdrh  SELECT (c0, x'') != (NULL, 0) FROM t1 LEFT JOIN t0;
6436c68d759Sdrh} {1}
6446c68d759Sdrhdo_execsql_test 26.20 {
6456c68d759Sdrh  SELECT 2 FROM t1 LEFT JOIN t0 ON (c0, x'') != (NULL, 0);
6466c68d759Sdrh} {2}
64748619160Sdrhdo_execsql_test 26.21 {
64848619160Sdrh  SELECT 21 FROM t0 RIGHT JOIN t1 ON (c0, x'') != (NULL, 0);
64948619160Sdrh} {21}
6506c68d759Sdrhdo_execsql_test 26.30 {
6516c68d759Sdrh  SELECT 3 FROM t1 LEFT JOIN t0 WHERE (c0, x'') != (NULL, 0);
6526c68d759Sdrh} {3}
65348619160Sdrhdo_execsql_test 26.31 {
65448619160Sdrh  SELECT 31 FROM t0 RIGHT JOIN t1 WHERE (c0, x'') != (NULL, 0);
65548619160Sdrh} {31}
6566c68d759Sdrh
65770d6b832Sdrh# 2019-12-30 ticket 892575cdba4e1e36
65870d6b832Sdrh#
65970d6b832Sdrhreset_db
66070d6b832Sdrhdo_catchsql_test 27.10 {
66170d6b832Sdrh  CREATE TABLE t0(c0 CHECK(((0, 0) > (0, c0))));
66270d6b832Sdrh  INSERT INTO t0(c0) VALUES(0) ON CONFLICT(c0) DO UPDATE SET c0 = 3;
66370d6b832Sdrh} {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}}
664269d322dSdrh
66578197e0fSdrh# 2021-02-03
66678197e0fSdrh# https://bugs.chromium.org/p/chromium/issues/detail?id=1173511
66778197e0fSdrh# Faulty assert() statement.
66878197e0fSdrh#
66978197e0fSdrhreset_db
67078197e0fSdrhdo_catchsql_test 28.10 {
67178197e0fSdrh  CREATE TABLE t0(c0 PRIMARY KEY, c1);
67278197e0fSdrh  CREATE TRIGGER trigger0 BEFORE DELETE ON t0 BEGIN
67378197e0fSdrh   SELECT (SELECT c0,c1  FROM t0)  FROM t0;
67478197e0fSdrh  END ;
67578197e0fSdrh  DELETE FROM t0;
67678197e0fSdrh} {1 {sub-select returns 2 columns - expected 1}}
67778197e0fSdrh
678340fd0bcSdrh# 2021-03-19
679340fd0bcSdrh# dbsqlfuzz find of a NEVER().
680340fd0bcSdrhdo_catchsql_test 29.1 {
681340fd0bcSdrh  SELECT (SELECT 1 WHERE ((SELECT 1 WHERE (2,(2,0)) IS (2,(20))),(2,0)) IS (2,(20))) WHERE (2,(2,0)) IS (2 IN(SELECT 1 WHERE (2,(2,2,0)) IS (2,(20))),(20));
682340fd0bcSdrh} {1 {row value misused}}
683340fd0bcSdrh
68419e4eefbSdan#-------------------------------------------------------------------------
68519e4eefbSdanreset_db
68619e4eefbSdando_execsql_test 30.0 {
68719e4eefbSdan  CREATE TABLE t1(x, y, z);
68819e4eefbSdan  CREATE TABLE t2(a, b);
68919e4eefbSdan
69019e4eefbSdan  INSERT INTO t1 VALUES(1000, 2000, 3000);
69119e4eefbSdan  INSERT INTO t2 VALUES(NULL, NULL);
69219e4eefbSdan}
69319e4eefbSdan
69419e4eefbSdando_execsql_test 30.1 {
69519e4eefbSdan  UPDATE t2 SET (a,b)=(
69619e4eefbSdan    SELECT max( t1.x ) OVER( PARTITION BY sum( (SELECT t1.y) ) ), 2
69719e4eefbSdan  )
69819e4eefbSdan  FROM t1;
69919e4eefbSdan} {}
70019e4eefbSdan
70119e4eefbSdando_execsql_test 30.2 {
70219e4eefbSdan  SELECT * FROM t2
70319e4eefbSdan} {1000 2}
70419e4eefbSdan
70519e4eefbSdanreset_db
70619e4eefbSdando_execsql_test 30.3 {
70719e4eefbSdan  CREATE TABLE t1(x INT PRIMARY KEY, y, z);
70819e4eefbSdan  CREATE TABLE t2(a,b,c,d,e,PRIMARY KEY(a,b))WITHOUT ROWID;
70919e4eefbSdan
71019e4eefbSdan  UPDATE t2 SET (d,d,a)=(SELECT EXISTS(SELECT 1 IN(SELECT max( 1 IN(SELECT x ORDER BY 1)) OVER(PARTITION BY sum((SELECT y FROM t1 UNION SELECT x ORDER BY 1)))INTERSECT SELECT EXISTS(SELECT 1 FROM t1 UNION SELECT x ORDER BY 1) ORDER BY 1) ORDERa)|9 AS blob, 2, 3) FROM t1 WHERE x<a;
71119e4eefbSdan}
71219e4eefbSdan
713e482fde6Sdrh# 2022-01-21 https://sqlite.org/forum/forumpost/ab95010d410a0a55
714e482fde6Sdrhreset_db
715e482fde6Sdrhdo_execsql_test 31.1 {
716e482fde6Sdrh  CREATE TABLE a(a1 PRIMARY KEY,a2);
717e482fde6Sdrh  INSERT INTO a VALUES(1,5);
718e482fde6Sdrh  CREATE TABLE b(b1 UNIQUE,b2);
719e482fde6Sdrh  SELECT * FROM a LEFT JOIN b ON b2=NULL AND b2=5 WHERE (b1,substr(b.b1,1,1))==(SELECT 1024,'b');
720e482fde6Sdrh} {}
72148619160Sdrhdo_execsql_test 31.1b {
72248619160Sdrh  SELECT * FROM b RIGHT JOIN a ON b2=NULL AND b2=5 WHERE (b1,substr(b.b1,1,1))==(SELECT 1024,'b');
72348619160Sdrh} {}
724e482fde6Sdrhdo_execsql_test 31.2 {
725e482fde6Sdrh  CREATE TABLE t1(a);
726e482fde6Sdrh  INSERT INTO t1 VALUES(0);
727e482fde6Sdrh  CREATE TABLE t2(b,c,d);
728e482fde6Sdrh  INSERT INTO t2 VALUES(NULL,123,456);
729e482fde6Sdrh  SELECT * FROM t1 LEFT JOIN t2 ON b=NULL WHERE (c,d)==(SELECT 123, 456+a);
730e482fde6Sdrh} {}
73148619160Sdrhdo_execsql_test 31.2b {
73248619160Sdrh  SELECT * FROM t2 RIGHT JOIN t1 ON b=NULL WHERE (c,d)==(SELECT 123, 456+a);
73348619160Sdrh} {}
73419e4eefbSdan
73502e3e041Sdrh# 2022-02-03 dbsqlfuzz 80a9fade844b4fb43564efc972bcb2c68270f5d1
73602e3e041Sdrhreset_db
73702e3e041Sdrhdo_execsql_test 32.1 {
73802e3e041Sdrh  CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT, c INT);
73902e3e041Sdrh  CREATE TABLE t2(d INTEGER PRIMARY KEY);
74002e3e041Sdrh  INSERT INTO t1(a,b,c) VALUES(500,654,456);
74102e3e041Sdrh  INSERT INTO t1(a,b,c) VALUES(501,655,456);
74202e3e041Sdrh  INSERT INTO t1(a,b,c) VALUES(502,654,122);
74302e3e041Sdrh  INSERT INTO t1(a,b,c) VALUES(503,654,221);
74402e3e041Sdrh  INSERT INTO t1(a,b,c) VALUES(601,654,122);
74502e3e041Sdrh  INSERT INTO t2(d) VALUES(456);
74602e3e041Sdrh  INSERT INTO t2(d) VALUES(122);
74702e3e041Sdrh  SELECT a FROM (
74802e3e041Sdrh    SELECT t1.a FROM t2, t1
74902e3e041Sdrh    WHERE (987, t1.b) = ( SELECT 987, 654 ) AND t2.d=t1.c
75002e3e041Sdrh  ) AS t3
75102e3e041Sdrh  WHERE a=1234 OR a<=567;
75202e3e041Sdrh} {500 502}
75319e4eefbSdan
754*b3623e0aSdrh# 2022-07-15
755*b3623e0aSdrh# https://sqlite.org/forum/forumpost/3607259d3c
756*b3623e0aSdrh#
757*b3623e0aSdrhreset_db
758*b3623e0aSdrhdo_execsql_test 33.1 {
759*b3623e0aSdrh  CREATE TABLE t1(a INT, b INT PRIMARY KEY) WITHOUT ROWID;
760*b3623e0aSdrh  INSERT INTO t1(a, b) VALUES (0, 1),(15,-7),(3,100);
761*b3623e0aSdrh  ANALYZE;
762*b3623e0aSdrh} {}
763*b3623e0aSdrhdo_execsql_test 33.2 {
764*b3623e0aSdrh  SELECT * FROM t1 WHERE (b,a) BETWEEN (0,5) AND (99,-2);
765*b3623e0aSdrh} {0 1}
766*b3623e0aSdrhdo_execsql_test 33.3 {
767*b3623e0aSdrh  SELECT * FROM t1 WHERE (b,a) BETWEEN (-8,5) AND (0,-2);
768*b3623e0aSdrh} {15 -7}
769*b3623e0aSdrhdo_execsql_test 33.3 {
770*b3623e0aSdrh  SELECT * FROM t1 WHERE (b,a) BETWEEN (3,5) AND (100,4);
771*b3623e0aSdrh} {3 100}
772*b3623e0aSdrhdo_execsql_test 33.3 {
773*b3623e0aSdrh  SELECT * FROM t1 WHERE (b,a) BETWEEN (3,5) AND (100,2);
774*b3623e0aSdrh} {}
775*b3623e0aSdrhdo_execsql_test 33.3 {
776*b3623e0aSdrh  SELECT * FROM t1 WHERE (a,b) BETWEEN (-2,99) AND (1,0);
777*b3623e0aSdrh} {0 1}
778*b3623e0aSdrhdo_execsql_test 33.3 {
779*b3623e0aSdrh  SELECT * FROM t1 WHERE (a,b) BETWEEN (14,99) AND (16,0);
780*b3623e0aSdrh} {15 -7}
781*b3623e0aSdrhdo_execsql_test 33.3 {
782*b3623e0aSdrh  SELECT * FROM t1 WHERE (a,b) BETWEEN (2,99) AND (4,0);
783*b3623e0aSdrh} {3 100}
784*b3623e0aSdrh
78519ff12ddSdanfinish_test
786