xref: /sqlite-3.40.0/test/in.test (revision 5348fbe3)
1b19a2bc6Sdrh# 2001 September 15
24794b980Sdrh#
3b19a2bc6Sdrh# The author disclaims copyright to this source code.  In place of
4b19a2bc6Sdrh# a legal notice, here is a blessing:
54794b980Sdrh#
6b19a2bc6Sdrh#    May you do good and not evil.
7b19a2bc6Sdrh#    May you find forgiveness for yourself and forgive others.
8b19a2bc6Sdrh#    May you share freely, never taking more than you give.
94794b980Sdrh#
104794b980Sdrh#***********************************************************************
114794b980Sdrh# This file implements regression tests for SQLite library.  The
124794b980Sdrh# focus of this file is testing the IN and BETWEEN operator.
134794b980Sdrh#
14de3e41e3Sdanielk1977# $Id: in.test,v 1.22 2008/08/04 03:51:24 danielk1977 Exp $
154794b980Sdrh
164794b980Sdrhset testdir [file dirname $argv0]
174794b980Sdrhsource $testdir/tester.tcl
184794b980Sdrh
194794b980Sdrh# Generate the test data we will need for the first squences of tests.
204794b980Sdrh#
214794b980Sdrhdo_test in-1.0 {
224794b980Sdrh  execsql {
235f3b4ab5Sdrh    BEGIN;
244794b980Sdrh    CREATE TABLE t1(a int, b int);
254794b980Sdrh  }
265f3b4ab5Sdrh  for {set i 1} {$i<=10} {incr i} {
2724acd8f9Sdanielk1977    execsql "INSERT INTO t1 VALUES($i,[expr {1<<$i}])"
285f3b4ab5Sdrh  }
295f3b4ab5Sdrh  execsql {
305f3b4ab5Sdrh    COMMIT;
315f3b4ab5Sdrh    SELECT count(*) FROM t1;
325f3b4ab5Sdrh  }
334794b980Sdrh} {10}
344794b980Sdrh
354794b980Sdrh# Do basic testing of BETWEEN.
364794b980Sdrh#
374794b980Sdrhdo_test in-1.1 {
384794b980Sdrh  execsql {SELECT a FROM t1 WHERE b BETWEEN 10 AND 50 ORDER BY a}
394794b980Sdrh} {4 5}
404794b980Sdrhdo_test in-1.2 {
414794b980Sdrh  execsql {SELECT a FROM t1 WHERE b NOT BETWEEN 10 AND 50 ORDER BY a}
424794b980Sdrh} {1 2 3 6 7 8 9 10}
434794b980Sdrhdo_test in-1.3 {
444794b980Sdrh  execsql {SELECT a FROM t1 WHERE b BETWEEN a AND a*5 ORDER BY a}
454794b980Sdrh} {1 2 3 4}
464794b980Sdrhdo_test in-1.4 {
474794b980Sdrh  execsql {SELECT a FROM t1 WHERE b NOT BETWEEN a AND a*5 ORDER BY a}
484794b980Sdrh} {5 6 7 8 9 10}
494794b980Sdrhdo_test in-1.6 {
504794b980Sdrh  execsql {SELECT a FROM t1 WHERE b BETWEEN a AND a*5 OR b=512 ORDER BY a}
514794b980Sdrh} {1 2 3 4 9}
524794b980Sdrhdo_test in-1.7 {
534794b980Sdrh  execsql {SELECT a+ 100*(a BETWEEN 1 and 3) FROM t1 ORDER BY b}
544794b980Sdrh} {101 102 103 4 5 6 7 8 9 10}
554794b980Sdrh
563e8c37e7Sdanielk1977# The rest of this file concentrates on testing the IN operator.
573e8c37e7Sdanielk1977# Skip this if the library is compiled with SQLITE_OMIT_SUBQUERY
583e8c37e7Sdanielk1977# (because the IN operator is unavailable).
593e8c37e7Sdanielk1977#
603e8c37e7Sdanielk1977ifcapable !subquery {
613e8c37e7Sdanielk1977  finish_test
623e8c37e7Sdanielk1977  return
633e8c37e7Sdanielk1977}
644794b980Sdrh
654794b980Sdrh# Testing of the IN operator using static lists on the right-hand side.
664794b980Sdrh#
674794b980Sdrhdo_test in-2.1 {
684794b980Sdrh  execsql {SELECT a FROM t1 WHERE b IN (8,12,16,24,32) ORDER BY a}
694794b980Sdrh} {3 4 5}
704794b980Sdrhdo_test in-2.2 {
714794b980Sdrh  execsql {SELECT a FROM t1 WHERE b NOT IN (8,12,16,24,32) ORDER BY a}
724794b980Sdrh} {1 2 6 7 8 9 10}
734794b980Sdrhdo_test in-2.3 {
744794b980Sdrh  execsql {SELECT a FROM t1 WHERE b IN (8,12,16,24,32) OR b=512 ORDER BY a}
754794b980Sdrh} {3 4 5 9}
764794b980Sdrhdo_test in-2.4 {
774794b980Sdrh  execsql {SELECT a FROM t1 WHERE b NOT IN (8,12,16,24,32) OR b=512 ORDER BY a}
784794b980Sdrh} {1 2 6 7 8 9 10}
794794b980Sdrhdo_test in-2.5 {
804794b980Sdrh  execsql {SELECT a+100*(b IN (8,16,24)) FROM t1 ORDER BY b}
814794b980Sdrh} {1 2 103 104 5 6 7 8 9 10}
824794b980Sdrh
834794b980Sdrhdo_test in-2.6 {
8457dbd7b3Sdrh  execsql {SELECT a FROM t1 WHERE b IN (b+8,64)}
8557dbd7b3Sdrh} {6}
864794b980Sdrhdo_test in-2.7 {
8757dbd7b3Sdrh  execsql {SELECT a FROM t1 WHERE b IN (max(5,10,b),20)}
8857dbd7b3Sdrh} {4 5 6 7 8 9 10}
894794b980Sdrhdo_test in-2.8 {
904794b980Sdrh  execsql {SELECT a FROM t1 WHERE b IN (8*2,64/2) ORDER BY b}
914794b980Sdrh} {4 5}
924794b980Sdrhdo_test in-2.9 {
9357dbd7b3Sdrh  execsql {SELECT a FROM t1 WHERE b IN (max(5,10),20)}
9457dbd7b3Sdrh} {}
954794b980Sdrhdo_test in-2.10 {
9657dbd7b3Sdrh  execsql {SELECT a FROM t1 WHERE min(0,b IN (a,30))}
9757dbd7b3Sdrh} {}
984794b980Sdrhdo_test in-2.11 {
994794b980Sdrh  set v [catch {execsql {SELECT a FROM t1 WHERE c IN (10,20)}} msg]
1004794b980Sdrh  lappend v $msg
101967e8b73Sdrh} {1 {no such column: c}}
1024794b980Sdrh
1034794b980Sdrh# Testing the IN operator where the right-hand side is a SELECT
1044794b980Sdrh#
1054794b980Sdrhdo_test in-3.1 {
1064794b980Sdrh  execsql {
1074794b980Sdrh    SELECT a FROM t1
1084794b980Sdrh    WHERE b IN (SELECT b FROM t1 WHERE a<5)
1094794b980Sdrh    ORDER BY a
1104794b980Sdrh  }
1114794b980Sdrh} {1 2 3 4}
1124794b980Sdrhdo_test in-3.2 {
1134794b980Sdrh  execsql {
1144794b980Sdrh    SELECT a FROM t1
1154794b980Sdrh    WHERE b IN (SELECT b FROM t1 WHERE a<5) OR b==512
1164794b980Sdrh    ORDER BY a
1174794b980Sdrh  }
1184794b980Sdrh} {1 2 3 4 9}
1194794b980Sdrhdo_test in-3.3 {
1204794b980Sdrh  execsql {
1214794b980Sdrh    SELECT a + 100*(b IN (SELECT b FROM t1 WHERE a<5)) FROM t1 ORDER BY b
1224794b980Sdrh  }
1234794b980Sdrh} {101 102 103 104 5 6 7 8 9 10}
1244794b980Sdrh
1254794b980Sdrh# Make sure the UPDATE and DELETE commands work with IN-SELECT
1264794b980Sdrh#
1274794b980Sdrhdo_test in-4.1 {
1284794b980Sdrh  execsql {
1294794b980Sdrh    UPDATE t1 SET b=b*2
1304794b980Sdrh    WHERE b IN (SELECT b FROM t1 WHERE a>8)
1314794b980Sdrh  }
1324794b980Sdrh  execsql {SELECT b FROM t1 ORDER BY b}
1334794b980Sdrh} {2 4 8 16 32 64 128 256 1024 2048}
1344794b980Sdrhdo_test in-4.2 {
1354794b980Sdrh  execsql {
1364794b980Sdrh    DELETE FROM t1 WHERE b IN (SELECT b FROM t1 WHERE a>8)
1374794b980Sdrh  }
1384794b980Sdrh  execsql {SELECT a FROM t1 ORDER BY a}
1394794b980Sdrh} {1 2 3 4 5 6 7 8}
140c4a3c779Sdrhdo_test in-4.3 {
141c4a3c779Sdrh  execsql {
142c4a3c779Sdrh    DELETE FROM t1 WHERE b NOT IN (SELECT b FROM t1 WHERE a>4)
143c4a3c779Sdrh  }
144c4a3c779Sdrh  execsql {SELECT a FROM t1 ORDER BY a}
145c4a3c779Sdrh} {5 6 7 8}
1464794b980Sdrh
147d8bc7086Sdrh# Do an IN with a constant RHS but where the RHS has many, many
148d8bc7086Sdrh# elements.  We need to test that collisions in the hash table
149d8bc7086Sdrh# are resolved properly.
150d8bc7086Sdrh#
151d8bc7086Sdrhdo_test in-5.1 {
152d8bc7086Sdrh  execsql {
153d8bc7086Sdrh    INSERT INTO t1 VALUES('hello', 'world');
154d8bc7086Sdrh    SELECT * FROM t1
155d8bc7086Sdrh    WHERE a IN (
156d8bc7086Sdrh       'Do','an','IN','with','a','constant','RHS','but','where','the',
157d8bc7086Sdrh       'has','many','elements','We','need','to','test','that',
158d8bc7086Sdrh       'collisions','hash','table','are','resolved','properly',
159d8bc7086Sdrh       'This','in-set','contains','thirty','one','entries','hello');
160d8bc7086Sdrh  }
161d8bc7086Sdrh} {hello world}
1624794b980Sdrh
1636b12545fSdrh# Make sure the IN operator works with INTEGER PRIMARY KEY fields.
1646b12545fSdrh#
1656b12545fSdrhdo_test in-6.1 {
1666b12545fSdrh  execsql {
1676b12545fSdrh    CREATE TABLE ta(a INTEGER PRIMARY KEY, b);
1686b12545fSdrh    INSERT INTO ta VALUES(1,1);
1696b12545fSdrh    INSERT INTO ta VALUES(2,2);
1706b12545fSdrh    INSERT INTO ta VALUES(3,3);
1716b12545fSdrh    INSERT INTO ta VALUES(4,4);
1726b12545fSdrh    INSERT INTO ta VALUES(6,6);
1736b12545fSdrh    INSERT INTO ta VALUES(8,8);
1746cbe1f1bSdrh    INSERT INTO ta VALUES(10,
1756cbe1f1bSdrh       'This is a key that is long enough to require a malloc in the VDBE');
1766cbe1f1bSdrh    SELECT * FROM ta WHERE a<10;
1776b12545fSdrh  }
1786b12545fSdrh} {1 1 2 2 3 3 4 4 6 6 8 8}
1796b12545fSdrhdo_test in-6.2 {
1806b12545fSdrh  execsql {
1816b12545fSdrh    CREATE TABLE tb(a INTEGER PRIMARY KEY, b);
1826b12545fSdrh    INSERT INTO tb VALUES(1,1);
1836b12545fSdrh    INSERT INTO tb VALUES(2,2);
1846b12545fSdrh    INSERT INTO tb VALUES(3,3);
1856b12545fSdrh    INSERT INTO tb VALUES(5,5);
1866b12545fSdrh    INSERT INTO tb VALUES(7,7);
1876b12545fSdrh    INSERT INTO tb VALUES(9,9);
1886cbe1f1bSdrh    INSERT INTO tb VALUES(11,
1896cbe1f1bSdrh       'This is a key that is long enough to require a malloc in the VDBE');
1906cbe1f1bSdrh    SELECT * FROM tb WHERE a<10;
1916b12545fSdrh  }
1926b12545fSdrh} {1 1 2 2 3 3 5 5 7 7 9 9}
1936b12545fSdrhdo_test in-6.3 {
1946b12545fSdrh  execsql {
1956b12545fSdrh    SELECT a FROM ta WHERE b IN (SELECT a FROM tb);
1966b12545fSdrh  }
1976b12545fSdrh} {1 2 3}
1986b12545fSdrhdo_test in-6.4 {
1996b12545fSdrh  execsql {
2006b12545fSdrh    SELECT a FROM ta WHERE b NOT IN (SELECT a FROM tb);
2016b12545fSdrh  }
2026cbe1f1bSdrh} {4 6 8 10}
2036b12545fSdrhdo_test in-6.5 {
2046b12545fSdrh  execsql {
2056b12545fSdrh    SELECT a FROM ta WHERE b IN (SELECT b FROM tb);
2066b12545fSdrh  }
2076cbe1f1bSdrh} {1 2 3 10}
2086b12545fSdrhdo_test in-6.6 {
2096b12545fSdrh  execsql {
2106b12545fSdrh    SELECT a FROM ta WHERE b NOT IN (SELECT b FROM tb);
2116b12545fSdrh  }
2126b12545fSdrh} {4 6 8}
2136b12545fSdrhdo_test in-6.7 {
2146b12545fSdrh  execsql {
2156b12545fSdrh    SELECT a FROM ta WHERE a IN (SELECT a FROM tb);
2166b12545fSdrh  }
2176b12545fSdrh} {1 2 3}
2186b12545fSdrhdo_test in-6.8 {
2196b12545fSdrh  execsql {
2206b12545fSdrh    SELECT a FROM ta WHERE a NOT IN (SELECT a FROM tb);
2216b12545fSdrh  }
2226cbe1f1bSdrh} {4 6 8 10}
2236b12545fSdrhdo_test in-6.9 {
2246b12545fSdrh  execsql {
2256b12545fSdrh    SELECT a FROM ta WHERE a IN (SELECT b FROM tb);
2266b12545fSdrh  }
2276b12545fSdrh} {1 2 3}
2286b12545fSdrhdo_test in-6.10 {
2296b12545fSdrh  execsql {
2306b12545fSdrh    SELECT a FROM ta WHERE a NOT IN (SELECT b FROM tb);
2316b12545fSdrh  }
2326cbe1f1bSdrh} {4 6 8 10}
2336b12545fSdrh
23438dd0b4fSdrh# Tests of IN operator against empty sets.  (Ticket #185)
23538dd0b4fSdrh#
23638dd0b4fSdrhdo_test in-7.1 {
23738dd0b4fSdrh  execsql {
23838dd0b4fSdrh    SELECT a FROM t1 WHERE a IN ();
23938dd0b4fSdrh  }
24038dd0b4fSdrh} {}
24138dd0b4fSdrhdo_test in-7.2 {
24238dd0b4fSdrh  execsql {
24338dd0b4fSdrh    SELECT a FROM t1 WHERE a IN (5);
24438dd0b4fSdrh  }
24538dd0b4fSdrh} {5}
24638dd0b4fSdrhdo_test in-7.3 {
24738dd0b4fSdrh  execsql {
24838dd0b4fSdrh    SELECT a FROM t1 WHERE a NOT IN () ORDER BY a;
24938dd0b4fSdrh  }
25038dd0b4fSdrh} {5 6 7 8 hello}
25138dd0b4fSdrhdo_test in-7.4 {
25238dd0b4fSdrh  execsql {
25338dd0b4fSdrh    SELECT a FROM t1 WHERE a IN (5) AND b IN ();
25438dd0b4fSdrh  }
25538dd0b4fSdrh} {}
25638dd0b4fSdrhdo_test in-7.5 {
25738dd0b4fSdrh  execsql {
25838dd0b4fSdrh    SELECT a FROM t1 WHERE a IN (5) AND b NOT IN ();
25938dd0b4fSdrh  }
26038dd0b4fSdrh} {5}
2615fb52caaSdrhdo_test in-7.6.1 {
26238dd0b4fSdrh  execsql {
26338dd0b4fSdrh    SELECT a FROM ta WHERE a IN ();
26438dd0b4fSdrh  }
26538dd0b4fSdrh} {}
2665fb52caaSdrhdo_test in-7.6.2 {
2675fb52caaSdrh  db status step
2685fb52caaSdrh} {0}
26938dd0b4fSdrhdo_test in-7.7 {
27038dd0b4fSdrh  execsql {
27138dd0b4fSdrh    SELECT a FROM ta WHERE a NOT IN ();
27238dd0b4fSdrh  }
27338dd0b4fSdrh} {1 2 3 4 6 8 10}
27438dd0b4fSdrh
2755fb52caaSdrhdo_test in-7.8.1 {
2765fb52caaSdrh  execsql {
2775fb52caaSdrh    SELECT * FROM ta LEFT JOIN tb ON (ta.b=tb.b) WHERE ta.a IN ();
2785fb52caaSdrh  }
2795fb52caaSdrh} {}
2805fb52caaSdrhdo_test in-7.8.2 {
2815fb52caaSdrh  db status step
2825fb52caaSdrh} {0}
2835fb52caaSdrh
2847d44b22dSdrhdo_test in-8.3 {
28588eee38aSdrh  execsql {
28688eee38aSdrh    SELECT b FROM t1 WHERE a IN ('hello','there')
28788eee38aSdrh  }
28888eee38aSdrh} {world}
2897d44b22dSdrhdo_test in-8.4 {
2907d44b22dSdrh  sqlite3_db_config db SQLITE_DBCONFIG_DQS_DML 1
29188eee38aSdrh  execsql {
29288eee38aSdrh    SELECT b FROM t1 WHERE a IN ("hello",'there')
29388eee38aSdrh  }
29488eee38aSdrh} {world}
29588eee38aSdrh
29623b2db23Sdrh# Test constructs of the form:  expr IN tablename
29723b2db23Sdrh#
29823b2db23Sdrhdo_test in-9.1 {
29923b2db23Sdrh  execsql {
30023b2db23Sdrh    CREATE TABLE t4 AS SELECT a FROM tb;
30123b2db23Sdrh    SELECT * FROM t4;
30223b2db23Sdrh  }
30323b2db23Sdrh} {1 2 3 5 7 9 11}
30423b2db23Sdrhdo_test in-9.2 {
30523b2db23Sdrh  execsql {
30623b2db23Sdrh    SELECT b FROM t1 WHERE a IN t4;
30723b2db23Sdrh  }
30823b2db23Sdrh} {32 128}
30923b2db23Sdrhdo_test in-9.3 {
31023b2db23Sdrh  execsql {
31123b2db23Sdrh    SELECT b FROM t1 WHERE a NOT IN t4;
31223b2db23Sdrh  }
31323b2db23Sdrh} {64 256 world}
31423b2db23Sdrhdo_test in-9.4 {
31523b2db23Sdrh  catchsql {
31623b2db23Sdrh    SELECT b FROM t1 WHERE a NOT IN tb;
31723b2db23Sdrh  }
3188da209b1Sdan} {1 {sub-select returns 2 columns - expected 1}}
31938dd0b4fSdrh
320afa5f680Sdrh# IN clauses in CHECK constraints.  Ticket #1645
321afa5f680Sdrh#
322afa5f680Sdrhdo_test in-10.1 {
323afa5f680Sdrh  execsql {
324afa5f680Sdrh    CREATE TABLE t5(
325afa5f680Sdrh      a INTEGER,
326afa5f680Sdrh      CHECK( a IN (111,222,333) )
327afa5f680Sdrh    );
328afa5f680Sdrh    INSERT INTO t5 VALUES(111);
329afa5f680Sdrh    SELECT * FROM t5;
330afa5f680Sdrh  }
331afa5f680Sdrh} {111}
332afa5f680Sdrhdo_test in-10.2 {
333afa5f680Sdrh  catchsql {
334afa5f680Sdrh    INSERT INTO t5 VALUES(4);
335afa5f680Sdrh  }
33692e21ef0Sdrh} {1 {CHECK constraint failed: a IN (111,222,333)}}
337afa5f680Sdrh
3388159a35fSdrh# Ticket #1821
3398159a35fSdrh#
3408159a35fSdrh# Type affinity applied to the right-hand side of an IN operator.
3418159a35fSdrh#
3428159a35fSdrhdo_test in-11.1 {
3438159a35fSdrh  execsql {
3448159a35fSdrh    CREATE TABLE t6(a,b NUMERIC);
3458159a35fSdrh    INSERT INTO t6 VALUES(1,2);
3468159a35fSdrh    INSERT INTO t6 VALUES(2,3);
3478159a35fSdrh    SELECT * FROM t6 WHERE b IN (2);
3488159a35fSdrh  }
3498159a35fSdrh} {1 2}
3508159a35fSdrhdo_test in-11.2 {
3518159a35fSdrh  # The '2' should be coerced into 2 because t6.b is NUMERIC
3528159a35fSdrh  execsql {
3538159a35fSdrh    SELECT * FROM t6 WHERE b IN ('2');
3548159a35fSdrh  }
3558159a35fSdrh} {1 2}
3568159a35fSdrhdo_test in-11.3 {
3578159a35fSdrh  # No coercion should occur here because of the unary + before b.
3588159a35fSdrh  execsql {
3598159a35fSdrh    SELECT * FROM t6 WHERE +b IN ('2');
3608159a35fSdrh  }
3618159a35fSdrh} {}
3629c0cb0e8Sdrhdo_test in-11.4 {
3639c0cb0e8Sdrh  # No coercion because column a as affinity NONE
3649c0cb0e8Sdrh  execsql {
3659c0cb0e8Sdrh    SELECT * FROM t6 WHERE a IN ('2');
3669c0cb0e8Sdrh  }
3679c0cb0e8Sdrh} {}
3689c0cb0e8Sdrhdo_test in-11.5 {
3699c0cb0e8Sdrh  execsql {
3709c0cb0e8Sdrh    SELECT * FROM t6 WHERE a IN (2);
3719c0cb0e8Sdrh  }
3729c0cb0e8Sdrh} {2 3}
3739c0cb0e8Sdrhdo_test in-11.6 {
3749c0cb0e8Sdrh  # No coercion because column a as affinity NONE
3759c0cb0e8Sdrh  execsql {
3769c0cb0e8Sdrh    SELECT * FROM t6 WHERE +a IN ('2');
3779c0cb0e8Sdrh  }
3789c0cb0e8Sdrh} {}
379afa5f680Sdrh
380b9fdb2c2Sdanielk1977# Test error conditions with expressions of the form IN(<compound select>).
381b9fdb2c2Sdanielk1977#
382de3e41e3Sdanielk1977ifcapable compound {
383b9fdb2c2Sdanielk1977do_test in-12.1 {
384b9fdb2c2Sdanielk1977  execsql {
385b9fdb2c2Sdanielk1977    CREATE TABLE t2(a, b, c);
386b9fdb2c2Sdanielk1977    CREATE TABLE t3(a, b, c);
387b9fdb2c2Sdanielk1977  }
388b9fdb2c2Sdanielk1977} {}
389b9fdb2c2Sdanielk1977do_test in-12.2 {
390b9fdb2c2Sdanielk1977  catchsql {
391b9fdb2c2Sdanielk1977    SELECT * FROM t2 WHERE a IN (
392b9fdb2c2Sdanielk1977      SELECT a, b FROM t3 UNION ALL SELECT a, b FROM t2
393b9fdb2c2Sdanielk1977    );
394b9fdb2c2Sdanielk1977  }
3958da209b1Sdan} {1 {sub-select returns 2 columns - expected 1}}
396b9fdb2c2Sdanielk1977do_test in-12.3 {
397b9fdb2c2Sdanielk1977  catchsql {
398b9fdb2c2Sdanielk1977    SELECT * FROM t2 WHERE a IN (
399b9fdb2c2Sdanielk1977      SELECT a, b FROM t3 UNION SELECT a, b FROM t2
400b9fdb2c2Sdanielk1977    );
401b9fdb2c2Sdanielk1977  }
4028da209b1Sdan} {1 {sub-select returns 2 columns - expected 1}}
403b9fdb2c2Sdanielk1977do_test in-12.4 {
404b9fdb2c2Sdanielk1977  catchsql {
405b9fdb2c2Sdanielk1977    SELECT * FROM t2 WHERE a IN (
406b9fdb2c2Sdanielk1977      SELECT a, b FROM t3 EXCEPT SELECT a, b FROM t2
407b9fdb2c2Sdanielk1977    );
408b9fdb2c2Sdanielk1977  }
4098da209b1Sdan} {1 {sub-select returns 2 columns - expected 1}}
410b9fdb2c2Sdanielk1977do_test in-12.5 {
411b9fdb2c2Sdanielk1977  catchsql {
412b9fdb2c2Sdanielk1977    SELECT * FROM t2 WHERE a IN (
413b9fdb2c2Sdanielk1977      SELECT a, b FROM t3 INTERSECT SELECT a, b FROM t2
414b9fdb2c2Sdanielk1977    );
415b9fdb2c2Sdanielk1977  }
4168da209b1Sdan} {1 {sub-select returns 2 columns - expected 1}}
417b9fdb2c2Sdanielk1977do_test in-12.6 {
418b9fdb2c2Sdanielk1977  catchsql {
419b9fdb2c2Sdanielk1977    SELECT * FROM t2 WHERE a IN (
42074b617b2Sdan      SELECT a, b FROM t3 UNION ALL SELECT a FROM t2
421b9fdb2c2Sdanielk1977    );
422b9fdb2c2Sdanielk1977  }
423f6e369a1Sdrh} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
424b9fdb2c2Sdanielk1977do_test in-12.7 {
425b9fdb2c2Sdanielk1977  catchsql {
426b9fdb2c2Sdanielk1977    SELECT * FROM t2 WHERE a IN (
42774b617b2Sdan      SELECT a, b FROM t3 UNION SELECT a FROM t2
428b9fdb2c2Sdanielk1977    );
429b9fdb2c2Sdanielk1977  }
430b9fdb2c2Sdanielk1977} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
431b9fdb2c2Sdanielk1977do_test in-12.8 {
432b9fdb2c2Sdanielk1977  catchsql {
433b9fdb2c2Sdanielk1977    SELECT * FROM t2 WHERE a IN (
43474b617b2Sdan      SELECT a, b FROM t3 EXCEPT SELECT a FROM t2
435b9fdb2c2Sdanielk1977    );
436b9fdb2c2Sdanielk1977  }
437b9fdb2c2Sdanielk1977} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
438b9fdb2c2Sdanielk1977do_test in-12.9 {
439b9fdb2c2Sdanielk1977  catchsql {
440b9fdb2c2Sdanielk1977    SELECT * FROM t2 WHERE a IN (
44174b617b2Sdan      SELECT a, b FROM t3 INTERSECT SELECT a FROM t2
442b9fdb2c2Sdanielk1977    );
443b9fdb2c2Sdanielk1977  }
444b9fdb2c2Sdanielk1977} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
445de3e41e3Sdanielk1977}
446b9fdb2c2Sdanielk1977
4472f56da3fSdanifcapable compound {
44874b617b2Sdando_test in-12.10 {
44974b617b2Sdan  catchsql {
45074b617b2Sdan    SELECT * FROM t2 WHERE a IN (
45174b617b2Sdan      SELECT a FROM t3 UNION ALL SELECT a, b FROM t2
45274b617b2Sdan    );
45374b617b2Sdan  }
454923cadb1Sdan} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
45574b617b2Sdando_test in-12.11 {
45674b617b2Sdan  catchsql {
45774b617b2Sdan    SELECT * FROM t2 WHERE a IN (
45874b617b2Sdan      SELECT a FROM t3 UNION SELECT a, b FROM t2
45974b617b2Sdan    );
46074b617b2Sdan  }
461923cadb1Sdan} {1 {SELECTs to the left and right of UNION do not have the same number of result columns}}
46274b617b2Sdando_test in-12.12 {
46374b617b2Sdan  catchsql {
46474b617b2Sdan    SELECT * FROM t2 WHERE a IN (
46574b617b2Sdan      SELECT a FROM t3 EXCEPT SELECT a, b FROM t2
46674b617b2Sdan    );
46774b617b2Sdan  }
468923cadb1Sdan} {1 {SELECTs to the left and right of EXCEPT do not have the same number of result columns}}
46974b617b2Sdando_test in-12.13 {
47074b617b2Sdan  catchsql {
47174b617b2Sdan    SELECT * FROM t2 WHERE a IN (
47274b617b2Sdan      SELECT a FROM t3 INTERSECT SELECT a, b FROM t2
47374b617b2Sdan    );
47474b617b2Sdan  }
475923cadb1Sdan} {1 {SELECTs to the left and right of INTERSECT do not have the same number of result columns}}
476923cadb1Sdando_test in-12.14 {
477923cadb1Sdan  catchsql {
478923cadb1Sdan    SELECT * FROM t2 WHERE a IN (
479923cadb1Sdan      SELECT a, b FROM t3 UNION ALL SELECT a, b FROM t2
480923cadb1Sdan    );
481923cadb1Sdan  }
4828da209b1Sdan} {1 {sub-select returns 2 columns - expected 1}}
483923cadb1Sdando_test in-12.15 {
484923cadb1Sdan  catchsql {
485923cadb1Sdan    SELECT * FROM t2 WHERE a IN (
486923cadb1Sdan      SELECT a, b FROM t3 UNION ALL SELECT a FROM t2
487923cadb1Sdan    );
488923cadb1Sdan  }
489923cadb1Sdan} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}}
4902f56da3fSdan}; #ifcapable compound
49174b617b2Sdan
4920cdc022eSdanielk1977
4930cdc022eSdanielk1977#------------------------------------------------------------------------
4940cdc022eSdanielk1977# The following tests check that NULL is handled correctly when it
4950cdc022eSdanielk1977# appears as part of a set of values on the right-hand side of an
4960cdc022eSdanielk1977# IN or NOT IN operator.
4970cdc022eSdanielk1977#
4980cdc022eSdanielk1977# When it appears in such a set, NULL is handled as an "unknown value".
4990cdc022eSdanielk1977# If, because of the unknown value in the set, the result of the expression
5000cdc022eSdanielk1977# cannot be determined, then it itself evaluates to NULL.
5010cdc022eSdanielk1977#
5020cdc022eSdanielk1977
5030cdc022eSdanielk1977# Warm body test to demonstrate the principles being tested:
5040cdc022eSdanielk1977#
5050cdc022eSdanielk1977do_test in-13.1 {
5060cdc022eSdanielk1977  db nullvalue "null"
5070cdc022eSdanielk1977  execsql { SELECT
5080cdc022eSdanielk1977    1 IN (NULL, 1, 2),     -- The value 1 is a member of the set, return true.
5090cdc022eSdanielk1977    3 IN (NULL, 1, 2),     -- Ambiguous, return NULL.
5100cdc022eSdanielk1977    1 NOT IN (NULL, 1, 2), -- The value 1 is a member of the set, return false.
5110cdc022eSdanielk1977    3 NOT IN (NULL, 1, 2)  -- Ambiguous, return NULL.
5120cdc022eSdanielk1977  }
5130cdc022eSdanielk1977} {1 null 0 null}
5140cdc022eSdanielk1977
5150cdc022eSdanielk1977do_test in-13.2 {
5160cdc022eSdanielk1977  execsql {
5170cdc022eSdanielk1977    CREATE TABLE t7(a, b, c NOT NULL);
5180cdc022eSdanielk1977    INSERT INTO t7 VALUES(1,    1, 1);
5190cdc022eSdanielk1977    INSERT INTO t7 VALUES(2,    2, 2);
5200cdc022eSdanielk1977    INSERT INTO t7 VALUES(3,    3, 3);
5210cdc022eSdanielk1977    INSERT INTO t7 VALUES(NULL, 4, 4);
5220cdc022eSdanielk1977    INSERT INTO t7 VALUES(NULL, 5, 5);
5230cdc022eSdanielk1977  }
5240cdc022eSdanielk1977} {}
5250cdc022eSdanielk1977
5260cdc022eSdanielk1977do_test in-13.3 {
5270cdc022eSdanielk1977  execsql { SELECT 2 IN (SELECT a FROM t7) }
5280cdc022eSdanielk1977} {1}
5290cdc022eSdanielk1977do_test in-13.4 {
5300cdc022eSdanielk1977  execsql { SELECT 6 IN (SELECT a FROM t7) }
5310cdc022eSdanielk1977} {null}
5320cdc022eSdanielk1977
5330cdc022eSdanielk1977do_test in-13.5 {
5340cdc022eSdanielk1977  execsql { SELECT 2 IN (SELECT b FROM t7) }
5350cdc022eSdanielk1977} {1}
5360cdc022eSdanielk1977do_test in-13.6 {
5370cdc022eSdanielk1977  execsql { SELECT 6 IN (SELECT b FROM t7) }
5380cdc022eSdanielk1977} {0}
5390cdc022eSdanielk1977
5400cdc022eSdanielk1977do_test in-13.7 {
5410cdc022eSdanielk1977  execsql { SELECT 2 IN (SELECT c FROM t7) }
5420cdc022eSdanielk1977} {1}
5430cdc022eSdanielk1977do_test in-13.8 {
5440cdc022eSdanielk1977  execsql { SELECT 6 IN (SELECT c FROM t7) }
5450cdc022eSdanielk1977} {0}
5460cdc022eSdanielk1977
5470cdc022eSdanielk1977do_test in-13.9 {
5480cdc022eSdanielk1977  execsql {
5490cdc022eSdanielk1977    SELECT
5500cdc022eSdanielk1977      2 NOT IN (SELECT a FROM t7),
5510cdc022eSdanielk1977      6 NOT IN (SELECT a FROM t7),
5520cdc022eSdanielk1977      2 NOT IN (SELECT b FROM t7),
5530cdc022eSdanielk1977      6 NOT IN (SELECT b FROM t7),
5540cdc022eSdanielk1977      2 NOT IN (SELECT c FROM t7),
5550cdc022eSdanielk1977      6 NOT IN (SELECT c FROM t7)
5560cdc022eSdanielk1977  }
5570cdc022eSdanielk1977} {0 null 0 1 0 1}
5580cdc022eSdanielk1977
5590cdc022eSdanielk1977do_test in-13.10 {
5600cdc022eSdanielk1977  execsql {
5610cdc022eSdanielk1977    SELECT b IN (
5620cdc022eSdanielk1977      SELECT inside.a
5630cdc022eSdanielk1977      FROM t7 AS inside
5640cdc022eSdanielk1977      WHERE inside.b BETWEEN outside.b+1 AND outside.b+2
5650cdc022eSdanielk1977    )
5660cdc022eSdanielk1977    FROM t7 AS outside ORDER BY b;
5670cdc022eSdanielk1977  }
5680cdc022eSdanielk1977} {0 null null null 0}
5690cdc022eSdanielk1977
5700cdc022eSdanielk1977do_test in-13.11 {
5710cdc022eSdanielk1977  execsql {
5720cdc022eSdanielk1977    SELECT b NOT IN (
5730cdc022eSdanielk1977      SELECT inside.a
5740cdc022eSdanielk1977      FROM t7 AS inside
5750cdc022eSdanielk1977      WHERE inside.b BETWEEN outside.b+1 AND outside.b+2
5760cdc022eSdanielk1977    )
5770cdc022eSdanielk1977    FROM t7 AS outside ORDER BY b;
5780cdc022eSdanielk1977  }
5790cdc022eSdanielk1977} {1 null null null 1}
5800cdc022eSdanielk1977
5810cdc022eSdanielk1977do_test in-13.12 {
5820cdc022eSdanielk1977  execsql {
5830cdc022eSdanielk1977    CREATE INDEX i1 ON t7(a);
5840cdc022eSdanielk1977    CREATE INDEX i2 ON t7(b);
5850cdc022eSdanielk1977    CREATE INDEX i3 ON t7(c);
5860cdc022eSdanielk1977  }
5870cdc022eSdanielk1977  execsql {
5880cdc022eSdanielk1977    SELECT
5890cdc022eSdanielk1977      2 IN (SELECT a FROM t7),
5900cdc022eSdanielk1977      6 IN (SELECT a FROM t7),
5910cdc022eSdanielk1977      2 IN (SELECT b FROM t7),
5920cdc022eSdanielk1977      6 IN (SELECT b FROM t7),
5930cdc022eSdanielk1977      2 IN (SELECT c FROM t7),
5940cdc022eSdanielk1977      6 IN (SELECT c FROM t7)
5950cdc022eSdanielk1977  }
5960cdc022eSdanielk1977} {1 null 1 0 1 0}
5970cdc022eSdanielk1977
5980cdc022eSdanielk1977do_test in-13.13 {
5990cdc022eSdanielk1977  execsql {
6000cdc022eSdanielk1977    SELECT
6010cdc022eSdanielk1977      2 NOT IN (SELECT a FROM t7),
6020cdc022eSdanielk1977      6 NOT IN (SELECT a FROM t7),
6030cdc022eSdanielk1977      2 NOT IN (SELECT b FROM t7),
6040cdc022eSdanielk1977      6 NOT IN (SELECT b FROM t7),
6050cdc022eSdanielk1977      2 NOT IN (SELECT c FROM t7),
6060cdc022eSdanielk1977      6 NOT IN (SELECT c FROM t7)
6070cdc022eSdanielk1977  }
6080cdc022eSdanielk1977} {0 null 0 1 0 1}
6090cdc022eSdanielk1977
6100cdc022eSdanielk1977do_test in-13.14 {
6110cdc022eSdanielk1977  execsql {
6120cdc022eSdanielk1977    BEGIN TRANSACTION;
6130cdc022eSdanielk1977    CREATE TABLE a(id INTEGER);
6140cdc022eSdanielk1977    INSERT INTO a VALUES(1);
6150cdc022eSdanielk1977    INSERT INTO a VALUES(2);
6160cdc022eSdanielk1977    INSERT INTO a VALUES(3);
6170cdc022eSdanielk1977    CREATE TABLE b(id INTEGER);
6180cdc022eSdanielk1977    INSERT INTO b VALUES(NULL);
6190cdc022eSdanielk1977    INSERT INTO b VALUES(3);
6200cdc022eSdanielk1977    INSERT INTO b VALUES(4);
6210cdc022eSdanielk1977    INSERT INTO b VALUES(5);
6220cdc022eSdanielk1977    COMMIT;
6230cdc022eSdanielk1977    SELECT * FROM a WHERE id NOT IN (SELECT id FROM b);
6240cdc022eSdanielk1977  }
6250cdc022eSdanielk1977} {}
6260cdc022eSdanielk1977do_test in-13.14 {
6270cdc022eSdanielk1977  execsql {
6280cdc022eSdanielk1977    CREATE INDEX i5 ON b(id);
6290cdc022eSdanielk1977    SELECT * FROM a WHERE id NOT IN (SELECT id FROM b);
6300cdc022eSdanielk1977  }
6310cdc022eSdanielk1977} {}
6320cdc022eSdanielk1977
633311efc70Sdrhdo_test in-13.15 {
634311efc70Sdrh  catchsql {
635311efc70Sdrh    SELECT 0 WHERE (SELECT 0,0) OR (0 IN (1,2));
636311efc70Sdrh  }
6378da209b1Sdan} {1 {sub-select returns 2 columns - expected 1}}
638311efc70Sdrh
6390cdc022eSdanielk1977
6400cdc022eSdanielk1977do_test in-13.X {
6410cdc022eSdanielk1977  db nullvalue ""
6420cdc022eSdanielk1977} {}
6430cdc022eSdanielk1977
644d93ba627Sdan# At one point the following was causing valgrind to report a "jump
645d93ba627Sdan# depends on unitialized location" problem.
646d93ba627Sdan#
647d93ba627Sdando_execsql_test in-14.0 {
648d93ba627Sdan  CREATE TABLE c1(a);
649d93ba627Sdan  INSERT INTO c1 VALUES(1), (2), (4), (3);
650d93ba627Sdan}
651d93ba627Sdando_execsql_test in-14.1 {
652d93ba627Sdan  SELECT * FROM c1 WHERE a IN (SELECT a FROM c1) ORDER BY 1
653d93ba627Sdan} {1 2 3 4}
654d93ba627Sdan
655042666e4Sdrh# 2019-02-20 Ticket https://www.sqlite.org/src/tktview/df46dfb631f75694fbb97033b69
656042666e4Sdrh#
657042666e4Sdrhdo_execsql_test in-15.0 {
658042666e4Sdrh  DROP TABLE IF EXISTS t1;
659042666e4Sdrh  CREATE TABLE IF NOT EXISTS t1(id INTEGER PRIMARY KEY);
660042666e4Sdrh  INSERT INTO t1 VALUES(1);
661042666e4Sdrh  SELECT a.id FROM t1 AS a JOIN t1 AS b ON a.id=b.id WHERE a.id IN (1,2,3);
662042666e4Sdrh} {1}
663042666e4Sdrhdo_execsql_test in-15.1 {
664042666e4Sdrh  DROP TABLE IF EXISTS t2;
665042666e4Sdrh  CREATE TABLE t2(a INTEGER PRIMARY KEY,b);
666042666e4Sdrh  INSERT INTO t2 VALUES(1,11);
667042666e4Sdrh  INSERT INTO t2 VALUES(2,22);
668042666e4Sdrh  INSERT INTO t2 VALUES(3,33);
669042666e4Sdrh  SELECT b, a IN (3,4,5) FROM t2 ORDER BY b;
670042666e4Sdrh} {11 0 22 0 33 1}
671042666e4Sdrhdo_execsql_test in-15.2 {
672042666e4Sdrh  DROP TABLE IF EXISTS t3;
673042666e4Sdrh  CREATE TABLE t3(x INTEGER PRIMARY KEY);
674042666e4Sdrh  INSERT INTO t3 VALUES(8);
675042666e4Sdrh  SELECT CASE WHEN x NOT IN (5,6,7) THEN 'yes' ELSE 'no' END FROM t3;
676042666e4Sdrh  SELECT CASE WHEN x NOT IN (NULL,6,7) THEN 'yes' ELSE 'no' END FROM t3;
677042666e4Sdrh} {yes no}
678042666e4Sdrhdo_execsql_test in-15.3 {
679042666e4Sdrh  SELECT CASE WHEN x NOT IN (5,6,7) OR x=0 THEN 'yes' ELSE 'no' END FROM t3;
680042666e4Sdrh  SELECT CASE WHEN x NOT IN (NULL,6,7) OR x=0 THEN 'yes' ELSE 'no' END FROM t3;
681042666e4Sdrh} {yes no}
682042666e4Sdrhdo_execsql_test in-15.4 {
683042666e4Sdrh  DROP TABLE IF EXISTS t4;
684042666e4Sdrh  CREATE TABLE t4(a INTEGER PRIMARY KEY, b INT);
685042666e4Sdrh  WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20)
686042666e4Sdrh    INSERT INTO t4(a,b) SELECT x, x+100 FROM c;
687042666e4Sdrh  SELECT b FROM t4 WHERE a IN (3,null,8) ORDER BY +b;
688042666e4Sdrh} {103 108}
689042666e4Sdrhdo_execsql_test in-15.5 {
690042666e4Sdrh  SELECT b FROM t4 WHERE a NOT IN (3,null,8);
691042666e4Sdrh} {}
692042666e4Sdrhdo_execsql_test in-15.6 {
693042666e4Sdrh  DROP TABLE IF EXISTS t5;
694042666e4Sdrh  DROP TABLE IF EXISTS t6;
695042666e4Sdrh  CREATE TABLE t5(id INTEGER PRIMARY KEY, name TEXT);
696042666e4Sdrh  CREATE TABLE t6(id INTEGER PRIMARY KEY, name TEXT, t5_id INT);
697042666e4Sdrh  INSERT INTO t5 VALUES(1,'Alice'),(2,'Emma');
698042666e4Sdrh  INSERT INTO t6 VALUES(1,'Bob',1),(2,'Cindy',1),(3,'Dave',2);
699042666e4Sdrh  SELECT a.*
700042666e4Sdrh    FROM t5 AS 'a' JOIN t5 AS 'b' ON b.id=a.id
701042666e4Sdrh   WHERE b.id IN (
702042666e4Sdrh          SELECT t6.t5_id
703042666e4Sdrh            FROM t6
704042666e4Sdrh           WHERE name='Bob'
705042666e4Sdrh             AND t6.t5_id IS NOT NULL
706042666e4Sdrh             AND t6.id IN (
707042666e4Sdrh                  SELECT id
708042666e4Sdrh                    FROM (SELECT t6.id, count(*) AS x
709042666e4Sdrh                            FROM t6
710042666e4Sdrh                           WHERE name='Bob'
711042666e4Sdrh                         ) AS 't'
712042666e4Sdrh                   WHERE x=1
713042666e4Sdrh                 )
714042666e4Sdrh             AND t6.id IN (1,id)
715042666e4Sdrh         );
716042666e4Sdrh} {1 Alice}
717042666e4Sdrh
718d1f9932eSdan#-------------------------------------------------------------------------
719d1f9932eSdanreset_db
720d1f9932eSdando_execsql_test in-16.0 {
721d1f9932eSdan  CREATE TABLE x1(a, b);
722d1f9932eSdan  INSERT INTO x1(a) VALUES(1), (2), (3), (4), (5), (6);
723d1f9932eSdan  CREATE INDEX x1i ON x1(a, b);
724d1f9932eSdan}
725d1f9932eSdan
726d1f9932eSdando_execsql_test in-16.1 {
727d1f9932eSdan  SELECT * FROM x1
728d1f9932eSdan  WHERE a IN (SELECT a FROM x1 WHERE (a%2)==0)
729d1f9932eSdan  ORDER BY a DESC, b;
730d1f9932eSdan} {6 {} 4 {} 2 {}}
731d1f9932eSdan
732d1f9932eSdando_execsql_test in-16.2 {
733d1f9932eSdan  SELECT * FROM x1
734d1f9932eSdan  WHERE a IN (SELECT a FROM x1 WHERE (a%7)==0)
735d1f9932eSdan  ORDER BY a DESC, b;
736d1f9932eSdan} {}
737d1f9932eSdan
73842be2ad3Sdrh# 2019-06-11
73942be2ad3Sdrh# https://www.sqlite.org/src/info/57353f8243c637c0
74042be2ad3Sdrh#
74142be2ad3Sdrhdo_execsql_test in-17.1 {
74242be2ad3Sdrh  SELECT 1 IN ('1');
74342be2ad3Sdrh} 0
74442be2ad3Sdrhdo_execsql_test in-17.2 {
74542be2ad3Sdrh  SELECT 1 IN ('1' COLLATE nocase);
74642be2ad3Sdrh} 0
74742be2ad3Sdrhdo_execsql_test in-17.3 {
74842be2ad3Sdrh  SELECT 1 IN (CAST('1' AS text));
74942be2ad3Sdrh} 0
75042be2ad3Sdrhdo_execsql_test in-17.4 {
75142be2ad3Sdrh  SELECT 1 IN (CAST('1' AS text) COLLATE nocase);
75242be2ad3Sdrh} 0
753042666e4Sdrh
7547ec796d0Sdrh# 2019-08-27 ticket https://sqlite.org/src/info/dbaf8a6820be1ece
7557ec796d0Sdrh#
7567ec796d0Sdrhdo_execsql_test in-18.1 {
7577ec796d0Sdrh  DROP TABLE IF EXISTS t0;
7587ec796d0Sdrh  CREATE TABLE t0(c0 INT UNIQUE);
7597ec796d0Sdrh  INSERT INTO t0(c0) VALUES (1);
7607ec796d0Sdrh  SELECT * FROM t0 WHERE '1' IN (t0.c0);
7617ec796d0Sdrh} {}
7627ec796d0Sdrh
763dd668c26Sdrh# 2019-09-02 ticket https://www.sqlite.org/src/info/2841e99d104c6436
764dd668c26Sdrh# For the IN_INDEX_NOOP optimization, apply REAL affinity to the LHS
765dd668c26Sdrh# values prior to comparison if the RHS has REAL affinity.
766dd668c26Sdrh#
7674fc83654Sdrh# Also ticket https://sqlite.org/src/info/29f635e0af71234b
7684fc83654Sdrh#
769fbfd1133Sdrhdo_execsql_test in-19.10 {
770dd668c26Sdrh  DROP TABLE IF EXISTS t0;
771dd668c26Sdrh  CREATE TABLE t0(c0 REAL UNIQUE);
772fbfd1133Sdrh  INSERT INTO t0(c0) VALUES(2.0625E00);
773fbfd1133Sdrh  SELECT 1 FROM t0 WHERE c0 IN ('2.0625');
774dd668c26Sdrh} {1}
775fbfd1133Sdrhdo_execsql_test in-19.20 {
776fbfd1133Sdrh  SELECT c0 IN ('2.0625') FROM t0;
777dd668c26Sdrh} {1}
778fbfd1133Sdrhdo_execsql_test in-19.21 {
779fbfd1133Sdrh  SELECT c0 = ('2.0625') FROM t0;
780dd668c26Sdrh} {1}
781fbfd1133Sdrhdo_execsql_test in-19.22 {
782fbfd1133Sdrh  SELECT c0 = ('0.20625e+01') FROM t0;
783fbfd1133Sdrh} {1}
784fbfd1133Sdrhdo_execsql_test in-19.30 {
785fbfd1133Sdrh  SELECT c0 IN ('2.0625',2,3) FROM t0;
786fbfd1133Sdrh} {1}
787fbfd1133Sdrhdo_execsql_test in-19.40 {
7884fc83654Sdrh  DROP TABLE t0;
7894fc83654Sdrh  CREATE TABLE t0(c0 TEXT, c1 REAL, c2, PRIMARY KEY(c2, c0, c1));
7904fc83654Sdrh  CREATE INDEX i0 ON t0(c1 IN (c0));
7914fc83654Sdrh  INSERT INTO t0(c0, c2) VALUES (0, NULL) ON CONFLICT(c2, c1, c0) DO NOTHING;
7924fc83654Sdrh  PRAGMA integrity_check;
7934fc83654Sdrh} {ok}
7947ec796d0Sdrh
795599456f0Sdan# Ticket f3ff1472887
796599456f0Sdan#
797599456f0Sdando_execsql_test in-20.1 {
798599456f0Sdan  SELECT (1 IN (2 IS TRUE));
799599456f0Sdan} {1}
800599456f0Sdan
801*5348fbe3Sdan# Forum post: https://sqlite.org/forum/forumpost/5782619992.
802*5348fbe3Sdan#
803*5348fbe3Sdanreset_db
804*5348fbe3Sdando_execsql_test in-21.1 {
805*5348fbe3Sdan  CREATE TABLE t0(c0);
806*5348fbe3Sdan  SELECT COUNT(*) FROM t0 ORDER BY (t0.c0 IN ());
807*5348fbe3Sdan} {0}
808*5348fbe3Sdan
809*5348fbe3Sdan
8104794b980Sdrhfinish_test
811