1# 2016 June 17 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# This file implements regression tests for SQLite library. The 12# focus of this file is testing "(...) IN (SELECT ...)" expressions 13# where the SELECT statement returns more than one column. 14# 15 16set testdir [file dirname $argv0] 17source $testdir/tester.tcl 18set ::testprefix rowvalue3 19 20 21do_execsql_test 1.0 { 22 CREATE TABLE t1(a, b, c); 23 CREATE INDEX i1 ON t1(a, b); 24 INSERT INTO t1 VALUES(1, 2, 3); 25 INSERT INTO t1 VALUES(4, 5, 6); 26 INSERT INTO t1 VALUES(7, 8, 9); 27} 28 29foreach {tn sql res} { 30 1 "SELECT 1 WHERE (4, 5) IN (SELECT a, b FROM t1)" 1 31 2 "SELECT 1 WHERE (5, 5) IN (SELECT a, b FROM t1)" {} 32 3 "SELECT 1 WHERE (5, 4) IN (SELECT a, b FROM t1)" {} 33 4 "SELECT 1 WHERE (5, 4) IN (SELECT b, a FROM t1)" 1 34 5 "SELECT 1 WHERE (SELECT a, b FROM t1 WHERE c=6) IN (SELECT a, b FROM t1)" 1 35 6 "SELECT (5, 4) IN (SELECT a, b FROM t1)" 0 36 7 "SELECT 1 WHERE (5, 4) IN (SELECT +b, +a FROM t1)" 1 37 8 "SELECT (5, 4) IN (SELECT +b, +a FROM t1)" 1 38 9 "SELECT (1, 2) IN (SELECT rowid, b FROM t1)" 1 39 10 "SELECT 1 WHERE (1, 2) IN (SELECT rowid, b FROM t1)" 1 40 11 "SELECT 1 WHERE (1, NULL) IN (SELECT rowid, b FROM t1)" {} 41} { 42 do_execsql_test 1.$tn $sql $res 43} 44 45#------------------------------------------------------------------------- 46 47do_execsql_test 2.0 { 48 CREATE TABLE z1(x, y, z); 49 CREATE TABLE kk(a, b); 50 51 INSERT INTO z1 VALUES('a', 'b', 'c'); 52 INSERT INTO z1 VALUES('d', 'e', 'f'); 53 INSERT INTO z1 VALUES('g', 'h', 'i'); 54 55 -- INSERT INTO kk VALUES('y', 'y'); 56 INSERT INTO kk VALUES('d', 'e'); 57 -- INSERT INTO kk VALUES('x', 'x'); 58 59} 60 61foreach {tn idx} { 62 1 { } 63 2 { CREATE INDEX z1idx ON z1(x, y) } 64 3 { CREATE UNIQUE INDEX z1idx ON z1(x, y) } 65} { 66 execsql "DROP INDEX IF EXISTS z1idx" 67 execsql $idx 68 69 do_execsql_test 2.$tn.1 { 70 SELECT * FROM z1 WHERE x IN (SELECT a FROM kk) 71 } {d e f} 72 73 do_execsql_test 2.$tn.2 { 74 SELECT * FROM z1 WHERE (x,y) IN (SELECT a, b FROM kk) 75 } {d e f} 76 77 do_execsql_test 2.$tn.3 { 78 SELECT * FROM z1 WHERE (x, +y) IN (SELECT a, b FROM kk) 79 } {d e f} 80 81 do_execsql_test 2.$tn.4 { 82 SELECT * FROM z1 WHERE (x, +y) IN (SELECT a, b||'x' FROM kk) 83 } {} 84 85 do_execsql_test 2.$tn.5 { 86 SELECT * FROM z1 WHERE (+x, y) IN (SELECT a, b FROM kk) 87 } {d e f} 88} 89 90explain_i { 91 SELECT * FROM z1 WHERE (x, y) IN (SELECT a, b FROM kk) 92} 93 94finish_test 95 96 97 98