gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/join9.test (about) 1 # 2022-04-16 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. 12 # 13 # This file implements tests for RIGHT and FULL OUTER JOINs. 14 15 set testdir [file dirname $argv0] 16 source $testdir/tester.tcl 17 18 foreach {id schema} { 19 1 { 20 CREATE TABLE t3(id INTEGER PRIMARY KEY, w TEXT); 21 CREATE TABLE t4(id INTEGER PRIMARY KEY, x TEXT); 22 CREATE TABLE t5(id INTEGER PRIMARY KEY, y TEXT); 23 CREATE TABLE t6(id INTEGER PRIMARY KEY, z INT); 24 CREATE VIEW dual(dummy) AS VALUES('x'); 25 INSERT INTO t3(id,w) VALUES(2,'two'),(3,'three'),(6,'six'),(7,'seven'); 26 INSERT INTO t4(id,x) VALUES(2,'alice'),(4,'bob'),(6,'cindy'),(8,'dave'); 27 INSERT INTO t5(id,y) VALUES(1,'red'),(2,'orange'),(3,'yellow'),(4,'green'), 28 (5,'blue'); 29 INSERT INTO t6(id,z) VALUES(3,333),(4,444),(5,555),(0,1000),(9,999); 30 } 31 2 { 32 CREATE TABLE t3(id INT PRIMARY KEY, w TEXT) WITHOUT ROWID; 33 CREATE TABLE t4(id INT PRIMARY KEY, x TEXT) WITHOUT ROWID; 34 CREATE TABLE t5(id INT PRIMARY KEY, y TEXT) WITHOUT ROWID; 35 CREATE TABLE t6(id INT PRIMARY KEY, z INT) WITHOUT ROWID; 36 CREATE TABLE dual(dummy TEXT); 37 INSERT INTO dual(dummy) VALUES('x'); 38 INSERT INTO t3(id,w) VALUES(2,'two'),(3,'three'),(6,'six'),(7,'seven'); 39 INSERT INTO t4(id,x) VALUES(2,'alice'),(4,'bob'),(6,'cindy'),(8,'dave'); 40 INSERT INTO t5(id,y) VALUES(1,'red'),(2,'orange'),(3,'yellow'),(4,'green'), 41 (5,'blue'); 42 INSERT INTO t6(id,z) VALUES(3,333),(4,444),(5,555),(0,1000),(9,999); 43 } 44 3 { 45 CREATE TABLE t3x(id INTEGER PRIMARY KEY, w TEXT); 46 CREATE TABLE t4x(id INTEGER PRIMARY KEY, x TEXT); 47 CREATE TABLE t5x(id INTEGER PRIMARY KEY, y TEXT); 48 CREATE TABLE t6x(id INTEGER PRIMARY KEY, z INT); 49 CREATE VIEW dual(dummy) AS VALUES('x'); 50 INSERT INTO t3x(id,w) VALUES(2,'two'),(3,'three'),(6,'six'),(7,'seven'); 51 INSERT INTO t4x(id,x) VALUES(2,'alice'),(4,'bob'),(6,'cindy'),(8,'dave'); 52 INSERT INTO t5x(id,y) VALUES(1,'red'),(2,'orange'),(3,'yellow'),(4,'green'), 53 (5,'blue'); 54 INSERT INTO t6x(id,z) VALUES(3,333),(4,444),(5,555),(0,1000),(9,999); 55 CREATE VIEW t3 AS SELECT * FROM t3x LIMIT 1000; 56 CREATE VIEW t4 AS SELECT * FROM t4x LIMIT 1000; 57 CREATE VIEW t5 AS SELECT * FROM t5x LIMIT 1000; 58 CREATE VIEW t6 AS SELECT * FROM t6x LIMIT 1000; 59 } 60 4 { 61 CREATE TABLE t3a(id INTEGER PRIMARY KEY, w TEXT); 62 CREATE TABLE t3b(id INTEGER PRIMARY KEY, w TEXT); 63 CREATE TABLE t4a(id INTEGER PRIMARY KEY, x TEXT); 64 CREATE TABLE t4b(id INTEGER PRIMARY KEY, x TEXT); 65 CREATE TABLE t5a(id INTEGER PRIMARY KEY, y TEXT); 66 CREATE TABLE t5b(id INTEGER PRIMARY KEY, y TEXT); 67 CREATE TABLE t6a(id INTEGER PRIMARY KEY, z INT); 68 CREATE TABLE t6b(id INTEGER PRIMARY KEY, z INT); 69 CREATE VIEW dual(dummy) AS VALUES('x'); 70 INSERT INTO t3a(id,w) VALUES(2,'two'),(3,'three'); 71 INSERT INTO t3b(id,w) VALUES(6,'six'),(7,'seven'); 72 INSERT INTO t4a(id,x) VALUES(2,'alice'),(4,'bob'); 73 INSERT INTO t4b(id,x) VALUES(6,'cindy'),(8,'dave'); 74 INSERT INTO t5a(id,y) VALUES(1,'red'),(2,'orange'),(3,'yellow'); 75 INSERT INTO t5b(id,y) VALUES(4,'green'),(5,'blue'); 76 INSERT INTO t6a(id,z) VALUES(3,333),(4,444); 77 INSERT INTO t6b(id,z) VALUES(5,555),(0,1000),(9,999); 78 CREATE VIEW t3 AS SELECT * FROM t3a UNION ALL SELECT * FROM t3b; 79 CREATE VIEW t4 AS SELECT * FROM t4a UNION ALL SELECT * FROM t4b; 80 CREATE VIEW t5 AS SELECT * FROM t5a UNION ALL SELECT * FROM t5b; 81 CREATE VIEW t6 AS SELECT * FROM t6a UNION ALL SELECT * FROM t6b; 82 } 83 5 { 84 CREATE TABLE t3a(id INTEGER PRIMARY KEY, w TEXT) WITHOUT ROWID; 85 CREATE TABLE t3b(id INTEGER PRIMARY KEY, w TEXT); 86 CREATE TABLE t4a(id INTEGER PRIMARY KEY, x TEXT) WITHOUT ROWID; 87 CREATE TABLE t4b(id INTEGER PRIMARY KEY, x TEXT) WITHOUT ROWID; 88 CREATE TABLE t5a(id INTEGER PRIMARY KEY, y TEXT); 89 CREATE TABLE t5b(id INTEGER PRIMARY KEY, y TEXT) WITHOUT ROWID; 90 CREATE TABLE t6a(id INTEGER PRIMARY KEY, z INT); 91 CREATE TABLE t6b(id INTEGER PRIMARY KEY, z INT); 92 CREATE VIEW dual(dummy) AS VALUES('x'); 93 INSERT INTO t3a(id,w) VALUES(2,'two'),(3,'three'); 94 INSERT INTO t3b(id,w) VALUES(6,'six'),(7,'seven'); 95 INSERT INTO t4a(id,x) VALUES(2,'alice'),(4,'bob'); 96 INSERT INTO t4b(id,x) VALUES(6,'cindy'),(8,'dave'); 97 INSERT INTO t5a(id,y) VALUES(1,'red'),(2,'orange'),(3,'yellow'); 98 INSERT INTO t5b(id,y) VALUES(4,'green'),(5,'blue'); 99 INSERT INTO t6a(id,z) VALUES(3,333),(4,444); 100 INSERT INTO t6b(id,z) VALUES(5,555),(0,1000),(9,999); 101 CREATE VIEW t3 AS SELECT * FROM t3a UNION ALL SELECT * FROM t3b; 102 CREATE VIEW t4 AS SELECT * FROM t4a UNION ALL SELECT * FROM t4b LIMIT 50; 103 CREATE VIEW t5 AS SELECT * FROM t5a UNION ALL SELECT * FROM t5b LIMIT 100; 104 CREATE VIEW t6 AS SELECT * FROM t6a UNION ALL SELECT * FROM t6b; 105 } 106 } { 107 reset_db 108 db nullvalue - 109 do_execsql_test join9-$id.setup $schema {} 110 111 # Verifid by PG-14 for case 1 112 do_execsql_test join9-$id.100 { 113 SELECT *, t4.id, t5.id, t6.id 114 FROM t4 NATURAL LEFT JOIN t5 NATURAL LEFT JOIN t6 115 ORDER BY 1; 116 } { 117 2 alice orange - 2 2 - 118 4 bob green 444 4 4 4 119 6 cindy - - 6 - - 120 8 dave - - 8 - - 121 } 122 123 do_execsql_test join9-$id.101 { 124 SELECT *, t4.id, t5.id, t6.id 125 FROM t4 NATURAL LEFT JOIN t5 NATURAL LEFT JOIN t6 126 ORDER BY id; 127 } { 128 2 alice orange - 2 2 - 129 4 bob green 444 4 4 4 130 6 cindy - - 6 - - 131 8 dave - - 8 - - 132 } 133 do_execsql_test join9-$id.102 { 134 SELECT *, t4.id, t5.id, t6.id 135 FROM t4 LEFT JOIN t5 USING(id) LEFT JOIN t6 USING(id) 136 ORDER BY id; 137 } { 138 2 alice orange - 2 2 - 139 4 bob green 444 4 4 4 140 6 cindy - - 6 - - 141 8 dave - - 8 - - 142 } 143 144 # Verifid by PG-14 using case 1 145 do_execsql_test join9-$id.200 { 146 SELECT id, x, y, z, t4.id, t5.id, t6.id 147 FROM t5 NATURAL RIGHT JOIN t4 NATURAL LEFT JOIN t6 148 ORDER BY 1; 149 } { 150 2 alice orange - 2 2 - 151 4 bob green 444 4 4 4 152 6 cindy - - 6 - - 153 8 dave - - 8 - - 154 } 155 156 do_execsql_test join9-$id.201 { 157 SELECT id, x, y, z, t4.id, t5.id, t6.id 158 FROM t5 NATURAL RIGHT JOIN t4 NATURAL LEFT JOIN t6 159 ORDER BY id; 160 } { 161 2 alice orange - 2 2 - 162 4 bob green 444 4 4 4 163 6 cindy - - 6 - - 164 8 dave - - 8 - - 165 } 166 167 # Verified by PG-14 using case 1 168 do_execsql_test join9-$id.300 { 169 SELECT *, t4.id, t5.id, t6.id 170 FROM t4 NATURAL RIGHT JOIN t5 NATURAL RIGHT JOIN t6 171 ORDER BY 1; 172 } { 173 0 - - 1000 - - 0 174 3 - yellow 333 - 3 3 175 4 bob green 444 4 4 4 176 5 - blue 555 - 5 5 177 9 - - 999 - - 9 178 } 179 180 do_execsql_test join9-$id.301 { 181 SELECT *, t4.id, t5.id, t6.id 182 FROM t4 NATURAL RIGHT JOIN t5 NATURAL RIGHT JOIN t6 183 ORDER BY id; 184 } { 185 0 - - 1000 - - 0 186 3 - yellow 333 - 3 3 187 4 bob green 444 4 4 4 188 5 - blue 555 - 5 5 189 9 - - 999 - - 9 190 } 191 192 # Verified by PG-14 for case 1 193 do_execsql_test join9-$id.400 { 194 SELECT *, t4.id, t5.id, t6.id 195 FROM t4 NATURAL FULL JOIN t5 NATURAL FULL JOIN t6 196 ORDER BY 1; 197 } { 198 0 - - 1000 - - 0 199 1 - red - - 1 - 200 2 alice orange - 2 2 - 201 3 - yellow 333 - 3 3 202 4 bob green 444 4 4 4 203 5 - blue 555 - 5 5 204 6 cindy - - 6 - - 205 8 dave - - 8 - - 206 9 - - 999 - - 9 207 } 208 209 do_execsql_test join9-$id.401 { 210 SELECT *, t4.id, t5.id, t6.id 211 FROM t4 NATURAL FULL JOIN t5 NATURAL FULL JOIN t6 212 ORDER BY id; 213 } { 214 0 - - 1000 - - 0 215 1 - red - - 1 - 216 2 alice orange - 2 2 - 217 3 - yellow 333 - 3 3 218 4 bob green 444 4 4 4 219 5 - blue 555 - 5 5 220 6 cindy - - 6 - - 221 8 dave - - 8 - - 222 9 - - 999 - - 9 223 } 224 do_execsql_test join9-$id.402 { 225 SELECT id, x, y, z, t4.id, t5.id, t6.id 226 FROM t4 NATURAL FULL JOIN t6 NATURAL FULL JOIN t5 227 ORDER BY id; 228 } { 229 0 - - 1000 - - 0 230 1 - red - - 1 - 231 2 alice orange - 2 2 - 232 3 - yellow 333 - 3 3 233 4 bob green 444 4 4 4 234 5 - blue 555 - 5 5 235 6 cindy - - 6 - - 236 8 dave - - 8 - - 237 9 - - 999 - - 9 238 } 239 do_execsql_test join9-$id.403 { 240 SELECT id, x, y, z, t4.id, t5.id, t6.id 241 FROM t5 NATURAL FULL JOIN t4 NATURAL FULL JOIN t6 242 ORDER BY id; 243 } { 244 0 - - 1000 - - 0 245 1 - red - - 1 - 246 2 alice orange - 2 2 - 247 3 - yellow 333 - 3 3 248 4 bob green 444 4 4 4 249 5 - blue 555 - 5 5 250 6 cindy - - 6 - - 251 8 dave - - 8 - - 252 9 - - 999 - - 9 253 } 254 do_execsql_test join9-$id.404 { 255 SELECT id, x, y, z, t4.id, t5.id, t6.id 256 FROM t5 NATURAL FULL JOIN t6 NATURAL FULL JOIN t4 257 ORDER BY id; 258 } { 259 0 - - 1000 - - 0 260 1 - red - - 1 - 261 2 alice orange - 2 2 - 262 3 - yellow 333 - 3 3 263 4 bob green 444 4 4 4 264 5 - blue 555 - 5 5 265 6 cindy - - 6 - - 266 8 dave - - 8 - - 267 9 - - 999 - - 9 268 } 269 do_execsql_test join9-$id.405 { 270 SELECT id, x, y, z, t4.id, t5.id, t6.id 271 FROM t6 NATURAL FULL JOIN t4 NATURAL FULL JOIN t5 272 ORDER BY id; 273 } { 274 0 - - 1000 - - 0 275 1 - red - - 1 - 276 2 alice orange - 2 2 - 277 3 - yellow 333 - 3 3 278 4 bob green 444 4 4 4 279 5 - blue 555 - 5 5 280 6 cindy - - 6 - - 281 8 dave - - 8 - - 282 9 - - 999 - - 9 283 } 284 do_execsql_test join9-$id.406 { 285 SELECT id, x, y, z, t4.id, t5.id, t6.id 286 FROM t6 NATURAL FULL JOIN t5 NATURAL FULL JOIN t4 287 ORDER BY id; 288 } { 289 0 - - 1000 - - 0 290 1 - red - - 1 - 291 2 alice orange - 2 2 - 292 3 - yellow 333 - 3 3 293 4 bob green 444 4 4 4 294 5 - blue 555 - 5 5 295 6 cindy - - 6 - - 296 8 dave - - 8 - - 297 9 - - 999 - - 9 298 } 299 300 # Verified by PG-14 using case 1 301 do_execsql_test join9-$id.500 { 302 SELECT id, w, x, y, z 303 FROM t3 FULL JOIN t4 USING(id) 304 NATURAL FULL JOIN t5 305 FULL JOIN t6 USING(id) 306 ORDER BY 1; 307 } { 308 0 - - - 1000 309 1 - - red - 310 2 two alice orange - 311 3 three - yellow 333 312 4 - bob green 444 313 5 - - blue 555 314 6 six cindy - - 315 7 seven - - - 316 8 - dave - - 317 9 - - - 999 318 } 319 320 # Verified by PG-14 using case 1 321 do_execsql_test join9-$id.600 { 322 SELECT id, w, x, y, z 323 FROM t3 JOIN dual AS d1 ON true 324 FULL JOIN t4 USING(id) 325 JOIN dual AS d2 ON true 326 NATURAL FULL JOIN t5 327 JOIN dual AS d3 ON true 328 FULL JOIN t6 USING(id) 329 CROSS JOIN dual AS d4 330 ORDER BY 1; 331 } { 332 0 - - - 1000 333 1 - - red - 334 2 two alice orange - 335 3 three - yellow 333 336 4 - bob green 444 337 5 - - blue 555 338 6 six cindy - - 339 7 seven - - - 340 8 - dave - - 341 9 - - - 999 342 } 343 344 # Verified by PG-14 using case 1 345 do_execsql_test join9-$id.700 { 346 SELECT id, w, x, y, z 347 FROM t3 JOIN dual AS d1 ON true 348 FULL JOIN t4 USING(id) 349 JOIN dual AS d2 ON true 350 NATURAL FULL JOIN t5 351 JOIN dual AS d3 ON true 352 FULL JOIN t6 USING(id) 353 CROSS JOIN dual AS d4 354 WHERE x<>'bob' OR x IS NULL 355 ORDER BY 1; 356 } { 357 0 - - - 1000 358 1 - - red - 359 2 two alice orange - 360 3 three - yellow 333 361 5 - - blue 555 362 6 six cindy - - 363 7 seven - - - 364 8 - dave - - 365 9 - - - 999 366 } 367 368 # Verified by PG-14 using case 1 369 do_execsql_test join9-$id.800 { 370 WITH t7(id,a) AS MATERIALIZED (SELECT * FROM t4 WHERE false) 371 SELECT * 372 FROM t7 373 JOIN t7 AS t7b USING(id) 374 FULL JOIN t3 USING(id); 375 } { 376 2 - - two 377 3 - - three 378 6 - - six 379 7 - - seven 380 } 381 382 # Verified by PG-14 383 do_execsql_test join9-$id.900 { 384 SELECT * 385 FROM (t3 NATURAL FULL JOIN t4) 386 NATURAL FULL JOIN 387 (t5 NATURAL FULL JOIN t6) 388 ORDER BY 1; 389 } { 390 0 - - - 1000 391 1 - - red - 392 2 two alice orange - 393 3 three - yellow 333 394 4 - bob green 444 395 5 - - blue 555 396 6 six cindy - - 397 7 seven - - - 398 8 - dave - - 399 9 - - - 999 400 } 401 do_execsql_test join9-$id.910 { 402 SELECT * 403 FROM t3 NATURAL FULL JOIN 404 (t4 NATURAL FULL JOIN 405 (t5 NATURAL FULL JOIN t6)) 406 ORDER BY 1; 407 } { 408 0 - - - 1000 409 1 - - red - 410 2 two alice orange - 411 3 three - yellow 333 412 4 - bob green 444 413 5 - - blue 555 414 6 six cindy - - 415 7 seven - - - 416 8 - dave - - 417 9 - - - 999 418 } 419 do_execsql_test join9-$id.920 { 420 SELECT * 421 FROM t3 FULL JOIN ( 422 t4 FULL JOIN ( 423 t5 FULL JOIN t6 USING (id) 424 ) USING(id) 425 ) USING(id) 426 ORDER BY 1; 427 } { 428 0 - - - 1000 429 1 - - red - 430 2 two alice orange - 431 3 three - yellow 333 432 4 - bob green 444 433 5 - - blue 555 434 6 six cindy - - 435 7 seven - - - 436 8 - dave - - 437 9 - - - 999 438 } 439 do_execsql_test join9-$id.920 { 440 SELECT * 441 FROM t3 FULL JOIN ( 442 t4 FULL JOIN ( 443 t5 FULL JOIN t6 USING (id) 444 ) USING(id) 445 ) USING(id) 446 ORDER BY 1; 447 } { 448 0 - - - 1000 449 1 - - red - 450 2 two alice orange - 451 3 three - yellow 333 452 4 - bob green 444 453 5 - - blue 555 454 6 six cindy - - 455 7 seven - - - 456 8 - dave - - 457 9 - - - 999 458 } 459 460 # Verified by PG-14 461 do_execsql_test join9-$id.930 { 462 SELECT * 463 FROM t3 FULL JOIN ( 464 t4 FULL JOIN ( 465 t5 FULL JOIN t6 USING(id) 466 ) USING(id) 467 ) AS j1 ON j1.id=t3.id 468 ORDER BY coalesce(t3.id,j1.id); 469 } { 470 - - 0 - - 1000 471 - - 1 - red - 472 2 two 2 alice orange - 473 3 three 3 - yellow 333 474 - - 4 bob green 444 475 - - 5 - blue 555 476 6 six 6 cindy - - 477 7 seven - - - - 478 - - 8 dave - - 479 - - 9 - - 999 480 } 481 482 # Verified by PG-14 483 do_execsql_test join9-$id.940 { 484 SELECT * 485 FROM t3 FULL JOIN ( 486 t4 RIGHT JOIN ( 487 t5 FULL JOIN t6 USING(id) 488 ) USING(id) 489 ) AS j1 ON j1.id=t3.id 490 ORDER BY coalesce(t3.id,j1.id); 491 } { 492 - - 0 - - 1000 493 - - 1 - red - 494 2 two 2 alice orange - 495 3 three 3 - yellow 333 496 - - 4 bob green 444 497 - - 5 - blue 555 498 6 six - - - - 499 7 seven - - - - 500 - - 9 - - 999 501 } 502 503 # Verified by PG-14 504 do_execsql_test join9-$id.950 { 505 SELECT * 506 FROM t3 FULL JOIN ( 507 t4 LEFT JOIN ( 508 t5 FULL JOIN t6 USING(id) 509 ) USING(id) 510 ) AS j1 ON j1.id=t3.id 511 ORDER BY coalesce(t3.id,j1.id); 512 } { 513 2 two 2 alice orange - 514 3 three - - - - 515 - - 4 bob green 444 516 6 six 6 cindy - - 517 7 seven - - - - 518 - - 8 dave - - 519 } 520 521 # Restriction (27) in the query flattener 522 # Verified by PG-14 523 do_execsql_test join9-$id.1000 { 524 WITH t56(id,y,z) AS (SELECT * FROM t5 FULL JOIN t6 USING(id) LIMIT 50) 525 SELECT id,x,y,z FROM t4 JOIN t56 USING(id) 526 ORDER BY 1; 527 } { 528 2 alice orange - 529 4 bob green 444 530 } 531 532 # Verified by PG-14 533 do_execsql_test join9-$id.1010 { 534 SELECT id,x,y,z 535 FROM t4 INNER JOIN (t5 FULL JOIN t6 USING(id)) USING(id) 536 ORDER BY 1; 537 } { 538 2 alice orange - 539 4 bob green 444 540 } 541 542 # Verified by PG-14 543 do_execsql_test join9-$id.1020 { 544 SELECT id,x,y,z 545 FROM t4 FULL JOIN t5 USING(id) INNER JOIN t6 USING(id) 546 ORDER BY 1; 547 } { 548 3 - yellow 333 549 4 bob green 444 550 5 - blue 555 551 } 552 553 # Verified by PG-14 554 do_execsql_test join9-$id.1030 { 555 WITH t45(id,x,y) AS (SELECT * FROM t4 FULL JOIN t5 USING(id) LIMIT 50) 556 SELECT id,x,y,z FROM t45 JOIN t6 USING(id) 557 ORDER BY 1; 558 } { 559 3 - yellow 333 560 4 bob green 444 561 5 - blue 555 562 } 563 564 } 565 finish_test