1fbbe005aSdanielk1977# 2002 May 24 2fbbe005aSdanielk1977# 3fbbe005aSdanielk1977# The author disclaims copyright to this source code. In place of 4fbbe005aSdanielk1977# a legal notice, here is a blessing: 5fbbe005aSdanielk1977# 6fbbe005aSdanielk1977# May you do good and not evil. 7fbbe005aSdanielk1977# May you find forgiveness for yourself and forgive others. 8fbbe005aSdanielk1977# May you share freely, never taking more than you give. 9fbbe005aSdanielk1977# 10fbbe005aSdanielk1977#*********************************************************************** 11fbbe005aSdanielk1977# This file implements regression tests for SQLite library. 12fbbe005aSdanielk1977# 13fbbe005aSdanielk1977# This file implements tests for joins, including outer joins involving 14fbbe005aSdanielk1977# virtual tables. The test cases in this file are copied from the file 15fbbe005aSdanielk1977# join.test, and some of the comments still reflect that. 16fbbe005aSdanielk1977# 17bd1a0a4fSdanielk1977# $Id: vtab6.test,v 1.5 2009/07/01 16:12:08 danielk1977 Exp $ 18fbbe005aSdanielk1977 19fbbe005aSdanielk1977set testdir [file dirname $argv0] 20fbbe005aSdanielk1977source $testdir/tester.tcl 21fbbe005aSdanielk1977 223765df48Sdrhifcapable !vtab { 233765df48Sdrh finish_test 243765df48Sdrh return 253765df48Sdrh} 263765df48Sdrh 27fbbe005aSdanielk1977register_echo_module [sqlite3_connection_pointer db] 28fbbe005aSdanielk1977 29fbbe005aSdanielk1977execsql { 30fbbe005aSdanielk1977 CREATE TABLE real_t1(a,b,c); 31fbbe005aSdanielk1977 CREATE TABLE real_t2(b,c,d); 32fbbe005aSdanielk1977 CREATE TABLE real_t3(c,d,e); 33fbbe005aSdanielk1977 CREATE TABLE real_t4(d,e,f); 34fbbe005aSdanielk1977 CREATE TABLE real_t5(a INTEGER PRIMARY KEY); 35fbbe005aSdanielk1977 CREATE TABLE real_t6(a INTEGER); 36fbbe005aSdanielk1977 CREATE TABLE real_t7 (x, y); 37fbbe005aSdanielk1977 CREATE TABLE real_t8 (a integer primary key, b); 38fbbe005aSdanielk1977 CREATE TABLE real_t9(a INTEGER PRIMARY KEY, b); 39fbbe005aSdanielk1977 CREATE TABLE real_t10(x INTEGER PRIMARY KEY, y); 40fbbe005aSdanielk1977 CREATE TABLE real_t11(p INTEGER PRIMARY KEY, q); 41fbbe005aSdanielk1977 CREATE TABLE real_t12(a,b); 42fbbe005aSdanielk1977 CREATE TABLE real_t13(b,c); 43fbbe005aSdanielk1977 CREATE TABLE real_t21(a,b,c); 44fbbe005aSdanielk1977 CREATE TABLE real_t22(p,q); 45fbbe005aSdanielk1977} 46fbbe005aSdanielk1977foreach t [list t1 t2 t3 t4 t5 t6 t7 t8 t9 t10 t11 t12 t13 t21 t22] { 47fbbe005aSdanielk1977 execsql "CREATE VIRTUAL TABLE $t USING echo(real_$t)" 48fbbe005aSdanielk1977} 49fbbe005aSdanielk1977 50fbbe005aSdanielk1977do_test vtab6-1.1 { 51fbbe005aSdanielk1977 execsql { 52fbbe005aSdanielk1977 INSERT INTO t1 VALUES(1,2,3); 53fbbe005aSdanielk1977 INSERT INTO t1 VALUES(2,3,4); 54fbbe005aSdanielk1977 INSERT INTO t1 VALUES(3,4,5); 55fbbe005aSdanielk1977 SELECT * FROM t1; 56fbbe005aSdanielk1977 } 57fbbe005aSdanielk1977} {1 2 3 2 3 4 3 4 5} 58fbbe005aSdanielk1977do_test vtab6-1.2 { 59fbbe005aSdanielk1977 execsql { 60fbbe005aSdanielk1977 INSERT INTO t2 VALUES(1,2,3); 61fbbe005aSdanielk1977 INSERT INTO t2 VALUES(2,3,4); 62fbbe005aSdanielk1977 INSERT INTO t2 VALUES(3,4,5); 63fbbe005aSdanielk1977 SELECT * FROM t2; 64fbbe005aSdanielk1977 } 65fbbe005aSdanielk1977} {1 2 3 2 3 4 3 4 5} 66fbbe005aSdanielk1977 67fbbe005aSdanielk1977do_test vtab6-1.3 { 68fbbe005aSdanielk1977 execsql2 { 69fbbe005aSdanielk1977 SELECT * FROM t1 NATURAL JOIN t2; 70fbbe005aSdanielk1977 } 71fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5} 72fbbe005aSdanielk1977do_test vtab6-1.3.1 { 73fbbe005aSdanielk1977 execsql2 { 74fbbe005aSdanielk1977 SELECT * FROM t2 NATURAL JOIN t1; 75fbbe005aSdanielk1977 } 76fbbe005aSdanielk1977} {b 2 c 3 d 4 a 1 b 3 c 4 d 5 a 2} 77fbbe005aSdanielk1977do_test vtab6-1.3.2 { 78fbbe005aSdanielk1977 execsql2 { 79fbbe005aSdanielk1977 SELECT * FROM t2 AS x NATURAL JOIN t1; 80fbbe005aSdanielk1977 } 81fbbe005aSdanielk1977} {b 2 c 3 d 4 a 1 b 3 c 4 d 5 a 2} 82fbbe005aSdanielk1977do_test vtab6-1.3.3 { 83fbbe005aSdanielk1977 execsql2 { 84fbbe005aSdanielk1977 SELECT * FROM t2 NATURAL JOIN t1 AS y; 85fbbe005aSdanielk1977 } 86fbbe005aSdanielk1977} {b 2 c 3 d 4 a 1 b 3 c 4 d 5 a 2} 87fbbe005aSdanielk1977do_test vtab6-1.3.4 { 88fbbe005aSdanielk1977 execsql { 89fbbe005aSdanielk1977 SELECT b FROM t1 NATURAL JOIN t2; 90fbbe005aSdanielk1977 } 91fbbe005aSdanielk1977} {2 3} 92fbbe005aSdanielk1977do_test vtab6-1.4.1 { 93fbbe005aSdanielk1977 execsql2 { 94fbbe005aSdanielk1977 SELECT * FROM t1 INNER JOIN t2 USING(b,c); 95fbbe005aSdanielk1977 } 96fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5} 97fbbe005aSdanielk1977do_test vtab6-1.4.2 { 98fbbe005aSdanielk1977 execsql2 { 99fbbe005aSdanielk1977 SELECT * FROM t1 AS x INNER JOIN t2 USING(b,c); 100fbbe005aSdanielk1977 } 101fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5} 102fbbe005aSdanielk1977do_test vtab6-1.4.3 { 103fbbe005aSdanielk1977 execsql2 { 104fbbe005aSdanielk1977 SELECT * FROM t1 INNER JOIN t2 AS y USING(b,c); 105fbbe005aSdanielk1977 } 106fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5} 107fbbe005aSdanielk1977do_test vtab6-1.4.4 { 108fbbe005aSdanielk1977 execsql2 { 109fbbe005aSdanielk1977 SELECT * FROM t1 AS x INNER JOIN t2 AS y USING(b,c); 110fbbe005aSdanielk1977 } 111fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5} 112fbbe005aSdanielk1977do_test vtab6-1.4.5 { 113fbbe005aSdanielk1977 execsql { 114fbbe005aSdanielk1977 SELECT b FROM t1 JOIN t2 USING(b); 115fbbe005aSdanielk1977 } 116fbbe005aSdanielk1977} {2 3} 117fbbe005aSdanielk1977do_test vtab6-1.5 { 118fbbe005aSdanielk1977 execsql2 { 119fbbe005aSdanielk1977 SELECT * FROM t1 INNER JOIN t2 USING(b); 120fbbe005aSdanielk1977 } 121fbbe005aSdanielk1977} {a 1 b 2 c 3 c 3 d 4 a 2 b 3 c 4 c 4 d 5} 122fbbe005aSdanielk1977do_test vtab6-1.6 { 123fbbe005aSdanielk1977 execsql2 { 124fbbe005aSdanielk1977 SELECT * FROM t1 INNER JOIN t2 USING(c); 125fbbe005aSdanielk1977 } 126fbbe005aSdanielk1977} {a 1 b 2 c 3 b 2 d 4 a 2 b 3 c 4 b 3 d 5} 127fbbe005aSdanielk1977do_test vtab6-1.7 { 128fbbe005aSdanielk1977 execsql2 { 129fbbe005aSdanielk1977 SELECT * FROM t1 INNER JOIN t2 USING(c,b); 130fbbe005aSdanielk1977 } 131fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 a 2 b 3 c 4 d 5} 132fbbe005aSdanielk1977 133fbbe005aSdanielk1977do_test vtab6-1.8 { 134fbbe005aSdanielk1977 execsql { 135fbbe005aSdanielk1977 SELECT * FROM t1 NATURAL CROSS JOIN t2; 136fbbe005aSdanielk1977 } 137fbbe005aSdanielk1977} {1 2 3 4 2 3 4 5} 138fbbe005aSdanielk1977do_test vtab6-1.9 { 139fbbe005aSdanielk1977 execsql { 140fbbe005aSdanielk1977 SELECT * FROM t1 CROSS JOIN t2 USING(b,c); 141fbbe005aSdanielk1977 } 142fbbe005aSdanielk1977} {1 2 3 4 2 3 4 5} 143fbbe005aSdanielk1977do_test vtab6-1.10 { 144fbbe005aSdanielk1977 execsql { 145fbbe005aSdanielk1977 SELECT * FROM t1 NATURAL INNER JOIN t2; 146fbbe005aSdanielk1977 } 147fbbe005aSdanielk1977} {1 2 3 4 2 3 4 5} 148fbbe005aSdanielk1977do_test vtab6-1.11 { 149fbbe005aSdanielk1977 execsql { 150fbbe005aSdanielk1977 SELECT * FROM t1 INNER JOIN t2 USING(b,c); 151fbbe005aSdanielk1977 } 152fbbe005aSdanielk1977} {1 2 3 4 2 3 4 5} 153fbbe005aSdanielk1977do_test vtab6-1.12 { 154fbbe005aSdanielk1977 execsql { 155fbbe005aSdanielk1977 SELECT * FROM t1 natural inner join t2; 156fbbe005aSdanielk1977 } 157fbbe005aSdanielk1977} {1 2 3 4 2 3 4 5} 158fbbe005aSdanielk1977 159fbbe005aSdanielk1977ifcapable subquery { 160fbbe005aSdanielk1977 do_test vtab6-1.13 { 161fbbe005aSdanielk1977 execsql2 { 162fbbe005aSdanielk1977 SELECT * FROM t1 NATURAL JOIN 163fbbe005aSdanielk1977 (SELECT b as 'c', c as 'd', d as 'e' FROM t2) as t3 164fbbe005aSdanielk1977 } 165fbbe005aSdanielk1977 } {a 1 b 2 c 3 d 4 e 5} 166fbbe005aSdanielk1977 do_test vtab6-1.14 { 167fbbe005aSdanielk1977 execsql2 { 168fbbe005aSdanielk1977 SELECT * FROM (SELECT b as 'c', c as 'd', d as 'e' FROM t2) as 'tx' 169fbbe005aSdanielk1977 NATURAL JOIN t1 170fbbe005aSdanielk1977 } 171fbbe005aSdanielk1977 } {c 3 d 4 e 5 a 1 b 2} 172fbbe005aSdanielk1977} 173fbbe005aSdanielk1977 174fbbe005aSdanielk1977do_test vtab6-1.15 { 175fbbe005aSdanielk1977 execsql { 176fbbe005aSdanielk1977 INSERT INTO t3 VALUES(2,3,4); 177fbbe005aSdanielk1977 INSERT INTO t3 VALUES(3,4,5); 178fbbe005aSdanielk1977 INSERT INTO t3 VALUES(4,5,6); 179fbbe005aSdanielk1977 SELECT * FROM t3; 180fbbe005aSdanielk1977 } 181fbbe005aSdanielk1977} {2 3 4 3 4 5 4 5 6} 182fbbe005aSdanielk1977do_test vtab6-1.16 { 183fbbe005aSdanielk1977 execsql { 184fbbe005aSdanielk1977 SELECT * FROM t1 natural join t2 natural join t3; 185fbbe005aSdanielk1977 } 186fbbe005aSdanielk1977} {1 2 3 4 5 2 3 4 5 6} 187fbbe005aSdanielk1977do_test vtab6-1.17 { 188fbbe005aSdanielk1977 execsql2 { 189fbbe005aSdanielk1977 SELECT * FROM t1 natural join t2 natural join t3; 190fbbe005aSdanielk1977 } 191fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 e 5 a 2 b 3 c 4 d 5 e 6} 192fbbe005aSdanielk1977do_test vtab6-1.18 { 193fbbe005aSdanielk1977 execsql { 194fbbe005aSdanielk1977 INSERT INTO t4 VALUES(2,3,4); 195fbbe005aSdanielk1977 INSERT INTO t4 VALUES(3,4,5); 196fbbe005aSdanielk1977 INSERT INTO t4 VALUES(4,5,6); 197fbbe005aSdanielk1977 SELECT * FROM t4; 198fbbe005aSdanielk1977 } 199fbbe005aSdanielk1977} {2 3 4 3 4 5 4 5 6} 200fbbe005aSdanielk1977do_test vtab6-1.19.1 { 201fbbe005aSdanielk1977 execsql { 202fbbe005aSdanielk1977 SELECT * FROM t1 natural join t2 natural join t4; 203fbbe005aSdanielk1977 } 204fbbe005aSdanielk1977} {1 2 3 4 5 6} 205fbbe005aSdanielk1977do_test vtab6-1.19.2 { 206fbbe005aSdanielk1977 execsql2 { 207fbbe005aSdanielk1977 SELECT * FROM t1 natural join t2 natural join t4; 208fbbe005aSdanielk1977 } 209fbbe005aSdanielk1977} {a 1 b 2 c 3 d 4 e 5 f 6} 210fbbe005aSdanielk1977do_test vtab6-1.20 { 211fbbe005aSdanielk1977 execsql { 212fbbe005aSdanielk1977 SELECT * FROM t1 natural join t2 natural join t3 WHERE t1.a=1 213fbbe005aSdanielk1977 } 214fbbe005aSdanielk1977} {1 2 3 4 5} 215fbbe005aSdanielk1977 216fbbe005aSdanielk1977do_test vtab6-2.1 { 217fbbe005aSdanielk1977 execsql { 218fbbe005aSdanielk1977 SELECT * FROM t1 NATURAL LEFT JOIN t2; 219fbbe005aSdanielk1977 } 220fbbe005aSdanielk1977} {1 2 3 4 2 3 4 5 3 4 5 {}} 221fbbe005aSdanielk1977do_test vtab6-2.2 { 222fbbe005aSdanielk1977 execsql { 223fbbe005aSdanielk1977 SELECT * FROM t2 NATURAL LEFT OUTER JOIN t1; 224fbbe005aSdanielk1977 } 225fbbe005aSdanielk1977} {1 2 3 {} 2 3 4 1 3 4 5 2} 226a76ac88aSdrh#do_test vtab6-2.3 { 227a76ac88aSdrh# catchsql { 228a76ac88aSdrh# SELECT * FROM t1 NATURAL RIGHT OUTER JOIN t2; 229a76ac88aSdrh# } 230a76ac88aSdrh#} {1 {RIGHT and FULL OUTER JOINs are not currently supported}} 231fbbe005aSdanielk1977do_test vtab6-2.4 { 232fbbe005aSdanielk1977 execsql { 233fbbe005aSdanielk1977 SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.d 234fbbe005aSdanielk1977 } 235fbbe005aSdanielk1977} {1 2 3 {} {} {} 2 3 4 {} {} {} 3 4 5 1 2 3} 2365d8806e0Sdrhdo_test vtab6-2.4.1 { 2375d8806e0Sdrh execsql { 2385d8806e0Sdrh SELECT * FROM t1 LEFT JOIN t2 ON t1.a IS t2.d 2395d8806e0Sdrh } 2405d8806e0Sdrh} {1 2 3 {} {} {} 2 3 4 {} {} {} 3 4 5 1 2 3} 241fbbe005aSdanielk1977do_test vtab6-2.5 { 242fbbe005aSdanielk1977 execsql { 243fbbe005aSdanielk1977 SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.d WHERE t1.a>1 244fbbe005aSdanielk1977 } 245fbbe005aSdanielk1977} {2 3 4 {} {} {} 3 4 5 1 2 3} 246fbbe005aSdanielk1977do_test vtab6-2.6 { 247fbbe005aSdanielk1977 execsql { 248fbbe005aSdanielk1977 SELECT * FROM t1 LEFT JOIN t2 ON t1.a=t2.d WHERE t2.b IS NULL OR t2.b>1 249fbbe005aSdanielk1977 } 250fbbe005aSdanielk1977} {1 2 3 {} {} {} 2 3 4 {} {} {}} 251fbbe005aSdanielk1977 252fbbe005aSdanielk1977do_test vtab6-3.1 { 253fbbe005aSdanielk1977 catchsql { 254fbbe005aSdanielk1977 SELECT * FROM t1 NATURAL JOIN t2 ON t1.a=t2.b; 255fbbe005aSdanielk1977 } 256fbbe005aSdanielk1977} {1 {a NATURAL join may not have an ON or USING clause}} 257fbbe005aSdanielk1977do_test vtab6-3.2 { 258fbbe005aSdanielk1977 catchsql { 259fbbe005aSdanielk1977 SELECT * FROM t1 NATURAL JOIN t2 USING(b); 260fbbe005aSdanielk1977 } 261fbbe005aSdanielk1977} {1 {a NATURAL join may not have an ON or USING clause}} 262fbbe005aSdanielk1977do_test vtab6-3.3 { 263fbbe005aSdanielk1977 catchsql { 264fbbe005aSdanielk1977 SELECT * FROM t1 JOIN t2 ON t1.a=t2.b USING(b); 265fbbe005aSdanielk1977 } 266d44f8b23Sdrh} {1 {near "USING": syntax error}} 267fbbe005aSdanielk1977do_test vtab6-3.4 { 268fbbe005aSdanielk1977 catchsql { 269fbbe005aSdanielk1977 SELECT * FROM t1 JOIN t2 USING(a); 270fbbe005aSdanielk1977 } 271fbbe005aSdanielk1977} {1 {cannot join using column a - column not present in both tables}} 272fbbe005aSdanielk1977do_test vtab6-3.5 { 273bd1a0a4fSdanielk1977 catchsql { SELECT * FROM t1 USING(a) } 274bd1a0a4fSdanielk1977} {1 {a JOIN clause is required before USING}} 275fbbe005aSdanielk1977do_test vtab6-3.6 { 276fbbe005aSdanielk1977 catchsql { 277fbbe005aSdanielk1977 SELECT * FROM t1 JOIN t2 ON t3.a=t2.b; 278fbbe005aSdanielk1977 } 279fbbe005aSdanielk1977} {1 {no such column: t3.a}} 280*825ecf9cSdrh 281*825ecf9cSdrh# EVIDENCE-OF: R-47973-48020 you cannot say "INNER OUTER JOIN", because 282*825ecf9cSdrh# that would be contradictory. 283fbbe005aSdanielk1977do_test vtab6-3.7 { 284fbbe005aSdanielk1977 catchsql { 285fbbe005aSdanielk1977 SELECT * FROM t1 INNER OUTER JOIN t2; 286fbbe005aSdanielk1977 } 2870879d5f9Sdrh} {1 {unknown join type: INNER OUTER}} 288*825ecf9cSdrh 289fbbe005aSdanielk1977do_test vtab6-3.7 { 290fbbe005aSdanielk1977 catchsql { 291fbbe005aSdanielk1977 SELECT * FROM t1 LEFT BOGUS JOIN t2; 292fbbe005aSdanielk1977 } 2930879d5f9Sdrh} {1 {unknown join type: LEFT BOGUS}} 294fbbe005aSdanielk1977 295fbbe005aSdanielk1977do_test vtab6-4.1 { 296fbbe005aSdanielk1977 execsql { 297fbbe005aSdanielk1977 BEGIN; 298fbbe005aSdanielk1977 INSERT INTO t6 VALUES(NULL); 299fbbe005aSdanielk1977 INSERT INTO t6 VALUES(NULL); 300fbbe005aSdanielk1977 INSERT INTO t6 SELECT * FROM t6; 301fbbe005aSdanielk1977 INSERT INTO t6 SELECT * FROM t6; 302fbbe005aSdanielk1977 INSERT INTO t6 SELECT * FROM t6; 303fbbe005aSdanielk1977 INSERT INTO t6 SELECT * FROM t6; 304fbbe005aSdanielk1977 INSERT INTO t6 SELECT * FROM t6; 305fbbe005aSdanielk1977 INSERT INTO t6 SELECT * FROM t6; 306fbbe005aSdanielk1977 COMMIT; 307fbbe005aSdanielk1977 } 308fbbe005aSdanielk1977 execsql { 309fbbe005aSdanielk1977 SELECT * FROM t6 NATURAL JOIN t5; 310fbbe005aSdanielk1977 } 311fbbe005aSdanielk1977} {} 312fbbe005aSdanielk1977do_test vtab6-4.2 { 313fbbe005aSdanielk1977 execsql { 314fbbe005aSdanielk1977 SELECT * FROM t6, t5 WHERE t6.a<t5.a; 315fbbe005aSdanielk1977 } 316fbbe005aSdanielk1977} {} 317fbbe005aSdanielk1977do_test vtab6-4.3 { 318fbbe005aSdanielk1977 execsql { 319fbbe005aSdanielk1977 SELECT * FROM t6, t5 WHERE t6.a>t5.a; 320fbbe005aSdanielk1977 } 321fbbe005aSdanielk1977} {} 322fbbe005aSdanielk1977do_test vtab6-4.4 { 323fbbe005aSdanielk1977 execsql { 324fbbe005aSdanielk1977 UPDATE t6 SET a='xyz'; 325fbbe005aSdanielk1977 SELECT * FROM t6 NATURAL JOIN t5; 326fbbe005aSdanielk1977 } 327fbbe005aSdanielk1977} {} 328fbbe005aSdanielk1977do_test vtab6-4.6 { 329fbbe005aSdanielk1977 execsql { 330fbbe005aSdanielk1977 SELECT * FROM t6, t5 WHERE t6.a<t5.a; 331fbbe005aSdanielk1977 } 332fbbe005aSdanielk1977} {} 333fbbe005aSdanielk1977do_test vtab6-4.7 { 334fbbe005aSdanielk1977 execsql { 335fbbe005aSdanielk1977 SELECT * FROM t6, t5 WHERE t6.a>t5.a; 336fbbe005aSdanielk1977 } 337fbbe005aSdanielk1977} {} 338fbbe005aSdanielk1977do_test vtab6-4.8 { 339fbbe005aSdanielk1977 execsql { 340fbbe005aSdanielk1977 UPDATE t6 SET a=1; 341fbbe005aSdanielk1977 SELECT * FROM t6 NATURAL JOIN t5; 342fbbe005aSdanielk1977 } 343fbbe005aSdanielk1977} {} 344fbbe005aSdanielk1977do_test vtab6-4.9 { 345fbbe005aSdanielk1977 execsql { 346fbbe005aSdanielk1977 SELECT * FROM t6, t5 WHERE t6.a<t5.a; 347fbbe005aSdanielk1977 } 348fbbe005aSdanielk1977} {} 349fbbe005aSdanielk1977do_test vtab6-4.10 { 350fbbe005aSdanielk1977 execsql { 351fbbe005aSdanielk1977 SELECT * FROM t6, t5 WHERE t6.a>t5.a; 352fbbe005aSdanielk1977 } 353fbbe005aSdanielk1977} {} 354fbbe005aSdanielk1977 355fbbe005aSdanielk1977# A test for ticket #247. 356fbbe005aSdanielk1977# 357fbbe005aSdanielk1977do_test vtab6-7.1 { 3587d44b22dSdrh sqlite3_db_config db SQLITE_DBCONFIG_DQS_DML 1 359fbbe005aSdanielk1977 execsql { 360fbbe005aSdanielk1977 INSERT INTO t7 VALUES ("pa1", 1); 361fbbe005aSdanielk1977 INSERT INTO t7 VALUES ("pa2", NULL); 362fbbe005aSdanielk1977 INSERT INTO t7 VALUES ("pa3", NULL); 363fbbe005aSdanielk1977 INSERT INTO t7 VALUES ("pa4", 2); 364fbbe005aSdanielk1977 INSERT INTO t7 VALUES ("pa30", 131); 365fbbe005aSdanielk1977 INSERT INTO t7 VALUES ("pa31", 130); 366fbbe005aSdanielk1977 INSERT INTO t7 VALUES ("pa28", NULL); 367fbbe005aSdanielk1977 368fbbe005aSdanielk1977 INSERT INTO t8 VALUES (1, "pa1"); 369fbbe005aSdanielk1977 INSERT INTO t8 VALUES (2, "pa4"); 370fbbe005aSdanielk1977 INSERT INTO t8 VALUES (3, NULL); 371fbbe005aSdanielk1977 INSERT INTO t8 VALUES (4, NULL); 372fbbe005aSdanielk1977 INSERT INTO t8 VALUES (130, "pa31"); 373fbbe005aSdanielk1977 INSERT INTO t8 VALUES (131, "pa30"); 374fbbe005aSdanielk1977 375fbbe005aSdanielk1977 SELECT coalesce(t8.a,999) from t7 LEFT JOIN t8 on y=a; 376fbbe005aSdanielk1977 } 377fbbe005aSdanielk1977} {1 999 999 2 131 130 999} 378fbbe005aSdanielk1977 379fbbe005aSdanielk1977# Make sure a left join where the right table is really a view that 380fbbe005aSdanielk1977# is itself a join works right. Ticket #306. 381fbbe005aSdanielk1977# 382fbbe005aSdanielk1977ifcapable view { 383fbbe005aSdanielk1977do_test vtab6-8.1 { 384fbbe005aSdanielk1977 execsql { 385fbbe005aSdanielk1977 BEGIN; 386fbbe005aSdanielk1977 INSERT INTO t9 VALUES(1,11); 387fbbe005aSdanielk1977 INSERT INTO t9 VALUES(2,22); 388fbbe005aSdanielk1977 INSERT INTO t10 VALUES(1,2); 389fbbe005aSdanielk1977 INSERT INTO t10 VALUES(3,3); 390fbbe005aSdanielk1977 INSERT INTO t11 VALUES(2,111); 391fbbe005aSdanielk1977 INSERT INTO t11 VALUES(3,333); 392fbbe005aSdanielk1977 CREATE VIEW v10_11 AS SELECT x, q FROM t10, t11 WHERE t10.y=t11.p; 393fbbe005aSdanielk1977 COMMIT; 394fbbe005aSdanielk1977 SELECT * FROM t9 LEFT JOIN v10_11 ON( a=x ); 395fbbe005aSdanielk1977 } 396fbbe005aSdanielk1977} {1 11 1 111 2 22 {} {}} 397fbbe005aSdanielk1977ifcapable subquery { 398fbbe005aSdanielk1977 do_test vtab6-8.2 { 399fbbe005aSdanielk1977 execsql { 400fbbe005aSdanielk1977 SELECT * FROM t9 LEFT JOIN (SELECT x, q FROM t10, t11 WHERE t10.y=t11.p) 401fbbe005aSdanielk1977 ON( a=x); 402fbbe005aSdanielk1977 } 403fbbe005aSdanielk1977 } {1 11 1 111 2 22 {} {}} 404fbbe005aSdanielk1977} 405fbbe005aSdanielk1977do_test vtab6-8.3 { 406fbbe005aSdanielk1977 execsql { 407fbbe005aSdanielk1977 SELECT * FROM v10_11 LEFT JOIN t9 ON( a=x ); 408fbbe005aSdanielk1977 } 409fbbe005aSdanielk1977} {1 111 1 11 3 333 {} {}} 410fbbe005aSdanielk1977} ;# ifcapable view 411fbbe005aSdanielk1977 412fbbe005aSdanielk1977# Ticket #350 describes a scenario where LEFT OUTER JOIN does not 413fbbe005aSdanielk1977# function correctly if the right table in the join is really 414fbbe005aSdanielk1977# subquery. 415fbbe005aSdanielk1977# 416fbbe005aSdanielk1977# To test the problem, we generate the same LEFT OUTER JOIN in two 417fbbe005aSdanielk1977# separate selects but with on using a subquery and the other calling 418fbbe005aSdanielk1977# the table directly. Then connect the two SELECTs using an EXCEPT. 419fbbe005aSdanielk1977# Both queries should generate the same results so the answer should 420fbbe005aSdanielk1977# be an empty set. 421fbbe005aSdanielk1977# 422fbbe005aSdanielk1977ifcapable compound { 423fbbe005aSdanielk1977do_test vtab6-9.1 { 424fbbe005aSdanielk1977 execsql { 425fbbe005aSdanielk1977 BEGIN; 426fbbe005aSdanielk1977 INSERT INTO t12 VALUES(1,11); 427fbbe005aSdanielk1977 INSERT INTO t12 VALUES(2,22); 428fbbe005aSdanielk1977 INSERT INTO t13 VALUES(22,222); 429fbbe005aSdanielk1977 COMMIT; 430fbbe005aSdanielk1977 } 431fbbe005aSdanielk1977} {} 432fbbe005aSdanielk1977 433fbbe005aSdanielk1977ifcapable subquery { 434fbbe005aSdanielk1977 do_test vtab6-9.1.1 { 435fbbe005aSdanielk1977 execsql { 436fbbe005aSdanielk1977 SELECT * FROM t12 NATURAL LEFT JOIN t13 437fbbe005aSdanielk1977 EXCEPT 438fbbe005aSdanielk1977 SELECT * FROM t12 NATURAL LEFT JOIN (SELECT * FROM t13 WHERE b>0); 439fbbe005aSdanielk1977 } 440fbbe005aSdanielk1977 } {} 441fbbe005aSdanielk1977} 442fbbe005aSdanielk1977ifcapable view { 443fbbe005aSdanielk1977 do_test vtab6-9.2 { 444fbbe005aSdanielk1977 execsql { 445fbbe005aSdanielk1977 CREATE VIEW v13 AS SELECT * FROM t13 WHERE b>0; 446fbbe005aSdanielk1977 SELECT * FROM t12 NATURAL LEFT JOIN t13 447fbbe005aSdanielk1977 EXCEPT 448fbbe005aSdanielk1977 SELECT * FROM t12 NATURAL LEFT JOIN v13; 449fbbe005aSdanielk1977 } 450fbbe005aSdanielk1977 } {} 451fbbe005aSdanielk1977} ;# ifcapable view 452fbbe005aSdanielk1977} ;# ifcapable compound 453fbbe005aSdanielk1977 454fbbe005aSdanielk1977ifcapable subquery { 455fbbe005aSdanielk1977do_test vtab6-10.1 { 456fbbe005aSdanielk1977 execsql { 457fbbe005aSdanielk1977 CREATE INDEX i22 ON real_t22(q); 458fbbe005aSdanielk1977 SELECT a FROM t21 LEFT JOIN t22 ON b=p WHERE q= 459fbbe005aSdanielk1977 (SELECT max(m.q) FROM t22 m JOIN t21 n ON n.b=m.p WHERE n.c=1); 460fbbe005aSdanielk1977 } 461fbbe005aSdanielk1977} {} 462fbbe005aSdanielk1977} ;# ifcapable subquery 463fbbe005aSdanielk1977 46439359dc0Sdanielk1977do_test vtab6-11.1.0 { 46539359dc0Sdanielk1977 execsql { 46639359dc0Sdanielk1977 CREATE TABLE ab_r(a, b); 46739359dc0Sdanielk1977 CREATE TABLE bc_r(b, c); 46839359dc0Sdanielk1977 46939359dc0Sdanielk1977 CREATE VIRTUAL TABLE ab USING echo(ab_r); 47039359dc0Sdanielk1977 CREATE VIRTUAL TABLE bc USING echo(bc_r); 47139359dc0Sdanielk1977 47239359dc0Sdanielk1977 INSERT INTO ab VALUES(1, 2); 47339359dc0Sdanielk1977 INSERT INTO bc VALUES(2, 3); 47439359dc0Sdanielk1977 } 47539359dc0Sdanielk1977} {} 47639359dc0Sdanielk1977 47739359dc0Sdanielk1977do_test vtab6-11.1.1 { 47839359dc0Sdanielk1977 execsql { 47939359dc0Sdanielk1977 SELECT a, b, c FROM ab NATURAL JOIN bc; 48039359dc0Sdanielk1977 } 48139359dc0Sdanielk1977} {1 2 3} 48239359dc0Sdanielk1977do_test vtab6-11.1.2 { 48339359dc0Sdanielk1977 execsql { 48439359dc0Sdanielk1977 SELECT a, b, c FROM bc NATURAL JOIN ab; 48539359dc0Sdanielk1977 } 48639359dc0Sdanielk1977} {1 2 3} 48739359dc0Sdanielk1977 48839359dc0Sdanielk1977set ::echo_module_cost 1.0 48939359dc0Sdanielk1977 49039359dc0Sdanielk1977do_test vtab6-11.1.3 { 49139359dc0Sdanielk1977 execsql { 49239359dc0Sdanielk1977 SELECT a, b, c FROM ab NATURAL JOIN bc; 49339359dc0Sdanielk1977 } 49439359dc0Sdanielk1977} {1 2 3} 49539359dc0Sdanielk1977do_test vtab6-11.1.4 { 49639359dc0Sdanielk1977 execsql { 49739359dc0Sdanielk1977 SELECT a, b, c FROM bc NATURAL JOIN ab; 49839359dc0Sdanielk1977 } 49939359dc0Sdanielk1977} {1 2 3} 50039359dc0Sdanielk1977 50139359dc0Sdanielk1977 50239359dc0Sdanielk1977do_test vtab6-11.2.0 { 50339359dc0Sdanielk1977 execsql { 50439359dc0Sdanielk1977 CREATE INDEX ab_i ON ab_r(b); 5055236ac1dSdan CREATE INDEX bc_i ON bc_r(b); 50639359dc0Sdanielk1977 } 50739359dc0Sdanielk1977} {} 50839359dc0Sdanielk1977 50939359dc0Sdanielk1977unset ::echo_module_cost 51039359dc0Sdanielk1977 51139359dc0Sdanielk1977do_test vtab6-11.2.1 { 51239359dc0Sdanielk1977 execsql { 51339359dc0Sdanielk1977 SELECT a, b, c FROM ab NATURAL JOIN bc; 51439359dc0Sdanielk1977 } 51539359dc0Sdanielk1977} {1 2 3} 51639359dc0Sdanielk1977do_test vtab6-11.2.2 { 51739359dc0Sdanielk1977 execsql { 51839359dc0Sdanielk1977 SELECT a, b, c FROM bc NATURAL JOIN ab; 51939359dc0Sdanielk1977 } 52039359dc0Sdanielk1977} {1 2 3} 52139359dc0Sdanielk1977 52239359dc0Sdanielk1977set ::echo_module_cost 1.0 52339359dc0Sdanielk1977 52439359dc0Sdanielk1977do_test vtab6-11.2.3 { 52539359dc0Sdanielk1977 execsql { 52639359dc0Sdanielk1977 SELECT a, b, c FROM ab NATURAL JOIN bc; 52739359dc0Sdanielk1977 } 52839359dc0Sdanielk1977} {1 2 3} 52939359dc0Sdanielk1977do_test vtab6-11.2.4 { 53039359dc0Sdanielk1977 execsql { 53139359dc0Sdanielk1977 SELECT a, b, c FROM bc NATURAL JOIN ab; 53239359dc0Sdanielk1977 } 53339359dc0Sdanielk1977} {1 2 3} 53439359dc0Sdanielk1977 53539359dc0Sdanielk1977unset ::echo_module_cost 53639359dc0Sdanielk1977db close 53739359dc0Sdanielk1977sqlite3 db test.db 53839359dc0Sdanielk1977register_echo_module [sqlite3_connection_pointer db] 53939359dc0Sdanielk1977 54039359dc0Sdanielk1977do_test vtab6-11.3.1 { 54139359dc0Sdanielk1977 execsql { 54239359dc0Sdanielk1977 SELECT a, b, c FROM ab NATURAL JOIN bc; 54339359dc0Sdanielk1977 } 54439359dc0Sdanielk1977} {1 2 3} 54539359dc0Sdanielk1977 54639359dc0Sdanielk1977do_test vtab6-11.3.2 { 54739359dc0Sdanielk1977 execsql { 54839359dc0Sdanielk1977 SELECT a, b, c FROM bc NATURAL JOIN ab; 54939359dc0Sdanielk1977 } 55039359dc0Sdanielk1977} {1 2 3} 55139359dc0Sdanielk1977 55239359dc0Sdanielk1977set ::echo_module_cost 1.0 55339359dc0Sdanielk1977 55439359dc0Sdanielk1977do_test vtab6-11.3.3 { 55539359dc0Sdanielk1977 execsql { 55639359dc0Sdanielk1977 SELECT a, b, c FROM ab NATURAL JOIN bc; 55739359dc0Sdanielk1977 } 55839359dc0Sdanielk1977} {1 2 3} 55939359dc0Sdanielk1977do_test vtab6-11.3.4 { 56039359dc0Sdanielk1977 execsql { 56139359dc0Sdanielk1977 SELECT a, b, c FROM bc NATURAL JOIN ab; 56239359dc0Sdanielk1977 } 56339359dc0Sdanielk1977} {1 2 3} 56439359dc0Sdanielk1977 56539359dc0Sdanielk1977unset ::echo_module_cost 56639359dc0Sdanielk1977 56739359dc0Sdanielk1977set ::echo_module_ignore_usable 1 56839359dc0Sdanielk1977db cache flush 56939359dc0Sdanielk1977 57039359dc0Sdanielk1977do_test vtab6-11.4.1 { 57139359dc0Sdanielk1977 catchsql { 57239359dc0Sdanielk1977 SELECT a, b, c FROM ab NATURAL JOIN bc; 57339359dc0Sdanielk1977 } 5746de32e7cSdrh} {1 {ab.xBestIndex malfunction}} 57539359dc0Sdanielk1977do_test vtab6-11.4.2 { 57639359dc0Sdanielk1977 catchsql { 57739359dc0Sdanielk1977 SELECT a, b, c FROM bc NATURAL JOIN ab; 57839359dc0Sdanielk1977 } 5796de32e7cSdrh} {1 {bc.xBestIndex malfunction}} 58039359dc0Sdanielk1977 58139359dc0Sdanielk1977unset ::echo_module_ignore_usable 58239359dc0Sdanielk1977 583fbbe005aSdanielk1977finish_test 584