forked from MaterializeInc/materialize
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathjoin.slt
1130 lines (971 loc) · 25.7 KB
/
join.slt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# Copyright 2015 - 2019 The Cockroach Authors. All rights reserved.
# Copyright Materialize, Inc. and contributors. All rights reserved.
#
# Use of this software is governed by the Business Source License
# included in the LICENSE file at the root of this repository.
#
# As of the Change Date specified in that file, in accordance with
# the Business Source License, use of this software will be governed
# by the Apache License, Version 2.0.
#
# This file is derived from the logic test suite in CockroachDB. The
# original file was retrieved on June 10, 2019 from:
#
# https://github.com/cockroachdb/cockroach/blob/d2f7fbf5dd1fc1a099bbad790a2e1f7c60a66cc3/pkg/sql/logictest/testdata/logic_test/join
#
# The original source code is subject to the terms of the Apache
# 2.0 license, a copy of which can be found in the LICENSE file at the
# root of this repository.
mode cockroach
# The join condition logic is tricky to get right with NULL
# values. Simple implementations can deal well with NULLs on the first
# or last row but fail to handle them in the middle. So the test table
# must contain at least 3 rows with a null in the middle. This test
# table also contains the pair 44/42 so that a test with a non-trivial
# ON condition can be written.
statement ok
CREATE TABLE onecolumn (x INT)
statement ok
INSERT INTO onecolumn(x) VALUES (44), (NULL), (42)
query II colnames,rowsort
SELECT * FROM onecolumn AS a(x) CROSS JOIN onecolumn AS b(y)
----
x y
44 44
44 NULL
44 42
NULL 44
NULL NULL
NULL 42
42 44
42 NULL
42 42
# Check that name resolution chokes on ambiguity when it needs to.
query error Column reference x is ambiguous
SELECT x FROM onecolumn AS a, onecolumn AS b
query II colnames,rowsort
SELECT * FROM onecolumn AS a(x) JOIN onecolumn AS b(y) ON a.x = b.y
----
x y
44 44
42 42
query I colnames
SELECT * FROM onecolumn AS a JOIN onecolumn as b USING (x) ORDER BY x
----
x
42
44
query I colnames,rowsort
SELECT * FROM onecolumn AS a NATURAL JOIN onecolumn as b
----
x
44
42
query II colnames,rowsort
SELECT * FROM onecolumn AS a(x) LEFT OUTER JOIN onecolumn AS b(y) ON a.x = b.y
----
x y
44 44
NULL NULL
42 42
query I colnames
SELECT * FROM onecolumn AS a LEFT OUTER JOIN onecolumn AS b USING (x) ORDER BY x
----
x
NULL
42
44
# Check that ORDER BY chokes on ambiguity if no table less columns
# were introduced by USING. (#12239)
query error Column reference x is ambiguous
SELECT * FROM onecolumn AS a, onecolumn AS b ORDER BY x
query I colnames,rowsort
SELECT * FROM onecolumn AS a NATURAL LEFT OUTER JOIN onecolumn AS b
----
x
44
NULL
42
query II colnames,rowsort
SELECT * FROM onecolumn AS a(x) RIGHT OUTER JOIN onecolumn AS b(y) ON a.x = b.y
----
x y
44 44
42 42
NULL NULL
query I colnames
SELECT * FROM onecolumn AS a RIGHT OUTER JOIN onecolumn AS b USING (x) ORDER BY x
----
x
NULL
42
44
query I colnames,rowsort
SELECT * FROM onecolumn AS a NATURAL RIGHT OUTER JOIN onecolumn AS b
----
x
44
42
NULL
statement ok
CREATE TABLE onecolumn_w(w INT)
statement ok
INSERT INTO onecolumn_w(w) VALUES (42),(43)
query II colnames,rowsort
SELECT * FROM onecolumn AS a NATURAL JOIN onecolumn_w as b
----
x w
44 42
44 43
NULL 42
NULL 43
42 42
42 43
statement ok
CREATE TABLE othercolumn (x INT)
statement ok
INSERT INTO othercolumn(x) VALUES (43),(42),(16)
query II colnames
SELECT * FROM onecolumn AS a FULL OUTER JOIN othercolumn AS b ON a.x = b.x ORDER BY a.x,b.x
----
x x
NULL NULL
NULL 16
NULL 43
42 42
44 NULL
query I colnames
SELECT * FROM onecolumn AS a FULL OUTER JOIN othercolumn AS b USING (x) ORDER BY x
----
x
NULL
16
42
43
44
# Check that the source columns can be selected separately from the
# USING column (#12033).
query III colnames
SELECT x AS s, a.x, b.x FROM onecolumn AS a FULL OUTER JOIN othercolumn AS b USING (x) ORDER BY s
----
s x x
NULL NULL NULL
16 NULL 16
42 42 42
43 NULL 43
44 44 NULL
query I colnames
SELECT * FROM onecolumn AS a NATURAL FULL OUTER JOIN othercolumn AS b ORDER BY x
----
x
NULL
16
42
43
44
# Check that a limit on the JOIN's result do not cause rows from the
# JOIN operands to become invisible to the JOIN.
query I colnames
SELECT * FROM (SELECT x FROM onecolumn ORDER BY x DESC) NATURAL JOIN (VALUES (42)) AS v(x) LIMIT 1
----
x
42
statement ok
CREATE TABLE empty (x INT)
query II
SELECT * FROM onecolumn AS a(x) CROSS JOIN empty AS b(y)
----
query II
SELECT * FROM empty AS a CROSS JOIN onecolumn AS b
----
query II
SELECT * FROM onecolumn AS a(x) JOIN empty AS b(y) ON a.x = b.y
----
query I
SELECT * FROM onecolumn AS a JOIN empty AS b USING (x)
----
query II
SELECT * FROM empty AS a(x) JOIN onecolumn AS b(y) ON a.x = b.y
----
query I
SELECT * FROM empty AS a JOIN onecolumn AS b USING (x)
----
query II colnames
SELECT * FROM onecolumn AS a(x) LEFT OUTER JOIN empty AS b(y) ON a.x = b.y ORDER BY a.x
----
x y
NULL NULL
42 NULL
44 NULL
query I colnames
SELECT * FROM onecolumn AS a LEFT OUTER JOIN empty AS b USING (x) ORDER BY x
----
x
NULL
42
44
query II
SELECT * FROM empty AS a(x) LEFT OUTER JOIN onecolumn AS b(y) ON a.x = b.y
----
query I
SELECT * FROM empty AS a LEFT OUTER JOIN onecolumn AS b USING (x)
----
query II
SELECT * FROM onecolumn AS a(x) RIGHT OUTER JOIN empty AS b(y) ON a.x = b.y
----
query I
SELECT * FROM onecolumn AS a RIGHT OUTER JOIN empty AS b USING (x)
----
query II colnames
SELECT * FROM empty AS a(x) FULL OUTER JOIN onecolumn AS b(y) ON a.x = b.y ORDER BY b.y
----
x y
NULL NULL
NULL 42
NULL 44
query I colnames
SELECT * FROM empty AS a FULL OUTER JOIN onecolumn AS b USING (x) ORDER BY x
----
x
NULL
42
44
query II colnames
SELECT * FROM onecolumn AS a(x) FULL OUTER JOIN empty AS b(y) ON a.x = b.y ORDER BY a.x
----
x y
NULL NULL
42 NULL
44 NULL
query I colnames
SELECT * FROM onecolumn AS a FULL OUTER JOIN empty AS b USING (x) ORDER BY x
----
x
NULL
42
44
query II colnames
SELECT * FROM empty AS a(x) FULL OUTER JOIN onecolumn AS b(y) ON a.x = b.y ORDER BY b.y
----
x y
NULL NULL
NULL 42
NULL 44
query I colnames
SELECT * FROM empty AS a FULL OUTER JOIN onecolumn AS b USING (x) ORDER BY x
----
x
NULL
42
44
statement ok
CREATE TABLE twocolumn (x INT, y INT)
statement ok
INSERT INTO twocolumn(x, y) VALUES (44,51), (NULL,52), (42,53), (45,45)
# Natural joins with partial match
query II colnames,rowsort
SELECT * FROM onecolumn NATURAL JOIN twocolumn
----
x y
44 51
42 53
query IIII rowsort
SELECT * FROM twocolumn AS a JOIN twocolumn AS b ON a.x = a.y
----
45 45 44 51
45 45 NULL 52
45 45 42 53
45 45 45 45
# Inner join with filter predicate
query II
SELECT o.x, t.y FROM onecolumn o INNER JOIN twocolumn t ON (o.x=t.x AND t.y=53)
----
42 53
# Outer joins with filter predicate
query II rowsort
SELECT o.x, t.y FROM onecolumn o LEFT OUTER JOIN twocolumn t ON (o.x=t.x AND t.y=53)
----
44 NULL
NULL NULL
42 53
query II rowsort
SELECT o.x, t.y FROM onecolumn o LEFT OUTER JOIN twocolumn t ON (o.x=t.x AND o.x=44)
----
44 51
NULL NULL
42 NULL
query II rowsort
SELECT o.x, t.y FROM onecolumn o LEFT OUTER JOIN twocolumn t ON (o.x=t.x AND t.x=44)
----
44 51
NULL NULL
42 NULL
# Computed columns with NATURAL FULL JOIN.
query III rowsort
SELECT * FROM (SELECT x, 2 two FROM onecolumn) NATURAL FULL JOIN (SELECT x, y+1 plus1 FROM twocolumn)
----
NULL NULL 53
NULL 2 NULL
45 NULL 46
44 2 52
42 2 54
## Simple test cases for inner, left, right, and outer joins
statement ok
CREATE TABLE a (i int)
statement ok
INSERT INTO a VALUES (1), (2), (3)
statement ok
CREATE TABLE b (i int, b bool)
statement ok
INSERT INTO b VALUES (2, true), (3, true), (4, false)
query IIB rowsort
SELECT * FROM a INNER JOIN b ON a.i = b.i
----
2 2 true
3 3 true
query IIB rowsort
SELECT * FROM a LEFT OUTER JOIN b ON a.i = b.i
----
1 NULL NULL
2 2 true
3 3 true
query IIB rowsort
SELECT * FROM a RIGHT OUTER JOIN b ON a.i = b.i
----
2 2 true
3 3 true
NULL 4 false
query IIB rowsort
SELECT * FROM a FULL OUTER JOIN b ON a.i = b.i
----
1 NULL NULL
2 2 true
3 3 true
NULL 4 false
# Full outer join with filter predicate
query IIB
SELECT * FROM a FULL OUTER JOIN b ON (a.i = b.i and a.i>2) ORDER BY a.i, b.i
----
NULL 2 true
NULL 4 false
1 NULL NULL
2 NULL NULL
3 3 true
# Duplicate right matches for a single left row
statement ok
INSERT INTO b VALUES (3, false)
query IIB
SELECT * FROM a RIGHT OUTER JOIN b ON a.i=b.i ORDER BY b.i, b.b
----
2 2 true
3 3 false
3 3 true
NULL 4 false
query IIB
SELECT * FROM a FULL OUTER JOIN b ON a.i=b.i ORDER BY b.i, b.b
----
1 NULL NULL
2 2 true
3 3 false
3 3 true
NULL 4 false
# Check column orders and names.
query IIIIII colnames
SELECT * FROM (onecolumn CROSS JOIN twocolumn JOIN onecolumn AS a(b) ON a.b=twocolumn.x JOIN twocolumn AS c(d,e) ON a.b=c.d AND c.d=onecolumn.x) ORDER BY 1 LIMIT 1
----
x x y b d e
42 42 53 42 42 53
# Check sub-queries in ON conditions.
query III colnames
SELECT * FROM onecolumn JOIN twocolumn ON twocolumn.x = onecolumn.x AND onecolumn.x IN (SELECT x FROM twocolumn WHERE y >= 52)
----
x x y
42 42 53
# Check sub-queries as data sources.
query I colnames
SELECT * FROM onecolumn JOIN (VALUES (41),(42),(43)) AS a(x) USING (x)
----
x
42
query I colnames
SELECT * FROM onecolumn JOIN (SELECT x + 2 AS x FROM onecolumn) USING (x)
----
x
44
# Check that a single column can have multiple table aliases.
query IIII colnames
SELECT * FROM (twocolumn AS a JOIN twocolumn AS b USING (x) JOIN twocolumn AS c USING (x)) ORDER BY x LIMIT 1
----
x y y y
42 53 53 53
query IIIIII colnames
SELECT a.x AS s, b.x, c.x, a.y, b.y, c.y FROM (twocolumn AS a JOIN twocolumn AS b USING (x) JOIN twocolumn AS c USING (x)) ORDER BY s
----
s x x y y y
42 42 42 53 53 53
44 44 44 51 51 51
45 45 45 45 45 45
query error pgcode 42703 column "y" does not exist
SELECT * FROM (onecolumn AS a JOIN onecolumn AS b USING (y))
query error pgcode 42701 column "x" appears more than once in USING clause
SELECT * FROM (onecolumn AS a JOIN onecolumn AS b USING (x, x))
statement ok
CREATE TABLE othertype (x TEXT)
query error pgcode 42804 Int32 and String are not comparable \(in NATURAL/USING join on x\)
SELECT * FROM (onecolumn AS a JOIN othertype AS b USING (x))
query error pgcode 42712 source name "onecolumn" specified more than once \(missing AS clause\)
SELECT * FROM (onecolumn JOIN onecolumn USING (x))
query error pgcode 42712 source name "onecolumn" specified more than once \(missing AS clause\)
SELECT * FROM (onecolumn JOIN twocolumn USING (x) JOIN onecolumn USING (x))
# Check that star expansion works across anonymous sources.
query II rowsort
SELECT * FROM (SELECT * FROM onecolumn), (SELECT * FROM onecolumn)
----
42 42
42 44
42 NULL
44 42
44 44
44 NULL
NULL 42
NULL 44
NULL NULL
# Check that anonymous sources are properly looked up without ambiguity.
query I
SELECT x FROM (onecolumn JOIN othercolumn USING (x)) JOIN (onecolumn AS a JOIN othercolumn AS b USING (x)) USING (x)
----
42
# Check that multiple anonymous sources cause proper ambiguity errors.
query error Column reference x is ambiguous
SELECT x FROM (SELECT * FROM onecolumn), (SELECT * FROM onecolumn)
query error Column reference x is ambiguous
SELECT * FROM (onecolumn AS a JOIN onecolumn AS b ON x > 32)
query error column "a.y" does not exist
SELECT * FROM (onecolumn AS a JOIN onecolumn AS b ON a.y > y)
statement ok
CREATE TABLE s(x INT)
statement ok
INSERT INTO s(x) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)
# Ensure that large cross-joins are optimized somehow (#10633)
statement ok
CREATE TABLE customers(id INT PRIMARY KEY NOT NULL)
statement ok
CREATE TABLE orders(id INT, cust INT REFERENCES customers(id))
# TODO(benesch): fix parse error in this query.
#
# query TTTTTTTTIIITTI
# SELECT NULL::text AS pktable_cat,
# pkn.nspname AS pktable_schem,
# pkc.relname AS pktable_name,
# pka.attname AS pkcolumn_name,
# NULL::text AS fktable_cat,
# fkn.nspname AS fktable_schem,
# fkc.relname AS fktable_name,
# fka.attname AS fkcolumn_name,
# pos.n AS key_seq,
# CASE con.confupdtype
# WHEN 'c' THEN 0
# WHEN 'n' THEN 2
# WHEN 'd' THEN 4
# WHEN 'r' THEN 1
# WHEN 'a' THEN 3
# ELSE NULL
# END AS update_rule,
# CASE con.confdeltype
# WHEN 'c' THEN 0
# WHEN 'n' THEN 2
# WHEN 'd' THEN 4
# WHEN 'r' THEN 1
# WHEN 'a' THEN 3
# ELSE NULL
# END AS delete_rule,
# con.conname AS fk_name,
# pkic.relname AS pk_name,
# CASE
# WHEN con.condeferrable
# AND con.condeferred THEN 5
# WHEN con.condeferrable THEN 6
# ELSE 7
# END AS deferrability
# FROM pg_catalog.pg_namespace pkn,
# pg_catalog.pg_class pkc,
# pg_catalog.pg_attribute pka,
# pg_catalog.pg_namespace fkn,
# pg_catalog.pg_class fkc,
# pg_catalog.pg_attribute fka,
# pg_catalog.pg_constraint con,
# pg_catalog.generate_series(1, 32) pos(n),
# pg_catalog.pg_depend dep,
# pg_catalog.pg_class pkic
# WHERE pkn.oid = pkc.relnamespace
# AND pkc.oid = pka.attrelid
# AND pka.attnum = con.confkey[pos.n]
# AND con.confrelid = pkc.oid
# AND fkn.oid = fkc.relnamespace
# AND fkc.oid = fka.attrelid
# AND fka.attnum = con.conkey[pos.n]
# AND con.conrelid = fkc.oid
# AND con.contype = 'f'
# AND con.oid = dep.objid
# AND pkic.oid = dep.refobjid
# AND pkic.relkind = 'i'
# AND dep.classid = 'pg_constraint'::regclass::oid
# AND dep.refclassid = 'pg_class'::regclass::oid
# AND fkn.nspname = 'public'
# AND fkc.relname = 'orders'
# ORDER BY pkn.nspname,
# pkc.relname,
# con.conname,
# pos.n
# ----
# NULL public customers id NULL public orders cust 1 3 3 fk_cust_ref_customers primary 7
#
# Tests for filter propagation through joins.
statement ok
CREATE TABLE square (n INT PRIMARY KEY, sq INT)
statement ok
INSERT INTO square VALUES (1,1), (2,4), (3,9), (4,16), (5,25), (6,36)
statement ok
CREATE TABLE pairs (a INT, b INT)
statement ok
INSERT INTO pairs VALUES (1,1), (1,2), (1,3), (1,4), (1,5), (1,6), (2,3), (2,4), (2,5), (2,6), (3,4), (3,5), (3,6), (4,5), (4,6)
query IIII rowsort
SELECT * FROM pairs, square WHERE pairs.b = square.n
----
1 1 1 1
1 2 2 4
1 3 3 9
1 4 4 16
1 5 5 25
1 6 6 36
2 3 3 9
2 4 4 16
2 5 5 25
2 6 6 36
3 4 4 16
3 5 5 25
3 6 6 36
4 5 5 25
4 6 6 36
query IIII rowsort
SELECT * FROM pairs, square WHERE pairs.a + pairs.b = square.sq
----
1 3 2 4
3 6 3 9
4 5 3 9
query IIII rowsort
SELECT a, b, n, sq FROM (SELECT a, b, a * b / 2 AS div, n, sq FROM pairs, square) WHERE div = sq
----
2 4 2 4
3 6 3 9
1 2 1 1
query IIII rowsort
SELECT * FROM pairs FULL OUTER JOIN square ON pairs.a + pairs.b = square.sq
----
1 1 NULL NULL
1 2 NULL NULL
1 3 2 4
1 4 NULL NULL
1 5 NULL NULL
1 6 NULL NULL
2 3 NULL NULL
2 4 NULL NULL
2 5 NULL NULL
2 6 NULL NULL
3 4 NULL NULL
3 5 NULL NULL
3 6 3 9
4 5 3 9
4 6 NULL NULL
NULL NULL 1 1
NULL NULL 4 16
NULL NULL 5 25
NULL NULL 6 36
query IIII rowsort
SELECT * FROM pairs FULL OUTER JOIN square ON pairs.a + pairs.b = square.sq WHERE pairs.b%2 <> square.sq%2
----
1 3 2 4
3 6 3 9
# Filter propagation through outer joins.
query IIII rowsort
SELECT *
FROM (SELECT * FROM pairs LEFT JOIN square ON b = sq AND a > 1 AND n < 6)
WHERE b > 1 AND (n IS NULL OR n > 1) AND (n IS NULL OR a < sq)
----
1 2 NULL NULL
1 3 NULL NULL
1 4 NULL NULL
1 5 NULL NULL
1 6 NULL NULL
2 3 NULL NULL
2 4 2 4
2 5 NULL NULL
2 6 NULL NULL
3 4 2 4
3 5 NULL NULL
3 6 NULL NULL
4 5 NULL NULL
4 6 NULL NULL
query IIII rowsort
SELECT *
FROM (SELECT * FROM pairs RIGHT JOIN square ON b = sq AND a > 1 AND n < 6)
WHERE (a IS NULL OR a > 2) AND n > 1 AND (a IS NULL OR a < sq)
----
3 4 2 4
NULL NULL 3 9
NULL NULL 4 16
NULL NULL 5 25
NULL NULL 6 36
statement ok
CREATE TABLE t1 (col1 INT, x INT, col2 INT, y INT)
statement ok
CREATE TABLE t2 (col3 INT, y INT, x INT, col4 INT)
statement ok
INSERT INTO t1 VALUES (10, 1, 11, 1), (20, 2, 21, 1), (30, 3, 31, 1)
statement ok
INSERT INTO t2 VALUES (100, 1, 1, 101), (200, 1, 201, 2), (400, 1, 401, 4)
query IIIIIII
SELECT * FROM t1 JOIN t2 USING (x)
----
1 10 11 1 100 1 101
query IIIIII
SELECT * FROM t1 NATURAL JOIN t2
----
1 1 10 11 100 101
query IIIIIIII
SELECT * FROM t1 JOIN t2 ON t2.x=t1.x
----
10 1 11 1 100 1 1 101
query IIIIIII rowsort
SELECT * FROM t1 FULL OUTER JOIN t2 USING (x)
----
1 10 11 1 100 1 101
2 20 21 1 NULL NULL NULL
3 30 31 1 NULL NULL NULL
201 NULL NULL NULL 200 1 2
401 NULL NULL NULL 400 1 4
query IIIIII rowsort
SELECT * FROM t1 NATURAL FULL OUTER JOIN t2
----
1 1 10 11 100 101
2 1 20 21 NULL NULL
3 1 30 31 NULL NULL
201 1 NULL NULL 200 2
401 1 NULL NULL 400 4
query IIIIIIII rowsort
SELECT * FROM t1 FULL OUTER JOIN t2 ON t1.x=t2.x
----
10 1 11 1 100 1 1 101
20 2 21 1 NULL NULL NULL NULL
30 3 31 1 NULL NULL NULL NULL
NULL NULL NULL NULL 200 1 201 2
NULL NULL NULL NULL 400 1 401 4
# not in spec
# query III
# SELECT t2.x, t1.x, x FROM t1 JOIN t2 USING (x)
# ----
# 1 1 1
# not in spec
# query III rowsort
# SELECT t2.x, t1.x, x FROM t1 FULL OUTER JOIN t2 USING (x)
# ----
# 1 1 1
# NULL 2 2
# NULL 3 3
# 201 NULL 201
# 401 NULL 401
# Test for #19536.
query I
SELECT x FROM t1 NATURAL JOIN (SELECT * FROM t2)
----
1
# Tests for merge join ordering information.
statement ok
CREATE TABLE pkBA (a INT, b INT, c INT, d INT, PRIMARY KEY(b,a))
statement ok
CREATE TABLE pkBC (a INT, b INT, c INT, d INT, PRIMARY KEY(b,c))
statement ok
CREATE TABLE pkBAC (a INT, b INT, c INT, d INT, PRIMARY KEY(b,a,c))
statement ok
CREATE TABLE pkBAD (a INT, b INT, c INT, d INT, PRIMARY KEY(b,a,d))
# not supported yet
# # Tests with joins with merged columns of collated string type.
# statement ok
# CREATE TABLE str1 (a INT PRIMARY KEY, s STRING COLLATE en_u_ks_level1)
#
# statement ok
# INSERT INTO str1 VALUES (1, 'a' COLLATE en_u_ks_level1), (2, 'A' COLLATE en_u_ks_level1), (3, 'c' COLLATE en_u_ks_level1), (4, 'D' COLLATE en_u_ks_level1)
#
# statement ok
# CREATE TABLE str2 (a INT PRIMARY KEY, s STRING COLLATE en_u_ks_level1)
#
# statement ok
# INSERT INTO str2 VALUES (1, 'A' COLLATE en_u_ks_level1), (2, 'B' COLLATE en_u_ks_level1), (3, 'C' COLLATE en_u_ks_level1), (4, 'E' COLLATE en_u_ks_level1)
#
# query TTT rowsort
# SELECT s, str1.s, str2.s FROM str1 INNER JOIN str2 USING (s)
# ----
# a a A
# A A A
# c c C
#
# query TTT rowsort
# SELECT s, str1.s, str2.s FROM str1 LEFT OUTER JOIN str2 USING (s)
# ----
# a a A
# A A A
# c c C
# D D NULL
#
# query TTT rowsort
# SELECT s, str1.s, str2.s FROM str1 RIGHT OUTER JOIN str2 USING (s)
# ----
# a a A
# A A A
# c c C
# B NULL B
# E NULL E
#
# query TTT rowsort
# SELECT s, str1.s, str2.s FROM str1 FULL OUTER JOIN str2 USING (s)
# ----
# a a A
# A A A
# c c C
# D D NULL
# E NULL E
# B NULL B
statement ok
CREATE TABLE xyu (x INT, y INT, u INT, PRIMARY KEY(x,y,u))
statement ok
INSERT INTO xyu VALUES (0, 0, 0), (1, 1, 1), (3, 1, 31), (3, 2, 32), (4, 4, 44)
statement ok
CREATE TABLE xyv (x INT, y INT, v INT, PRIMARY KEY(x,y,v))
statement ok
INSERT INTO xyv VALUES (1, 1, 1), (2, 2, 2), (3, 1, 31), (3, 3, 33), (5, 5, 55)
query IIII
SELECT * FROM xyu INNER JOIN xyv USING (x, y) WHERE x > 2
----
3 1 31 31
query IIII rowsort
SELECT * FROM xyu LEFT OUTER JOIN xyv USING (x, y) WHERE x > 2
----
3 1 31 31
3 2 32 NULL
4 4 44 NULL
query IIII rowsort
SELECT * FROM xyu RIGHT OUTER JOIN xyv USING (x, y) WHERE x > 2
----
3 1 31 31
3 3 NULL 33
5 5 NULL 55
query IIII rowsort
SELECT * FROM xyu FULL OUTER JOIN xyv USING (x, y) WHERE x > 2
----
3 1 31 31
3 2 32 NULL
4 4 44 NULL
3 3 NULL 33
5 5 NULL 55
query IIIIII
SELECT * FROM xyu INNER JOIN xyv ON xyu.x = xyv.x AND xyu.y = xyv.y WHERE xyu.x = 1 AND xyu.y < 10
----
1 1 1 1 1 1
query IIIIII
SELECT * FROM xyu INNER JOIN xyv ON xyu.x = xyv.x AND xyu.y = xyv.y AND xyu.x = 1 AND xyu.y < 10
----
1 1 1 1 1 1
query IIIIII rowsort
SELECT * FROM xyu LEFT OUTER JOIN xyv ON xyu.x = xyv.x AND xyu.y = xyv.y AND xyu.x = 1 AND xyu.y < 10
----
0 0 0 NULL NULL NULL
1 1 1 1 1 1
3 1 31 NULL NULL NULL
3 2 32 NULL NULL NULL
4 4 44 NULL NULL NULL
query IIIIII rowsort
SELECT * FROM xyu RIGHT OUTER JOIN xyv ON xyu.x = xyv.x AND xyu.y = xyv.y AND xyu.x = 1 AND xyu.y < 10
----
1 1 1 1 1 1
NULL NULL NULL 3 1 31
NULL NULL NULL 3 3 33
NULL NULL NULL 5 5 55
NULL NULL NULL 2 2 2
# Test OUTER joins that are run in the distSQL merge joiner
query IIII rowsort
SELECT * FROM (SELECT * FROM xyu ORDER BY x, y) AS xyu LEFT OUTER JOIN (SELECT * FROM xyv ORDER BY x, y) AS xyv USING (x, y) WHERE x > 2
----
3 1 31 31
3 2 32 NULL
4 4 44 NULL
query IIII rowsort
SELECT * FROM (SELECT * FROM xyu ORDER BY x, y) AS xyu RIGHT OUTER JOIN (SELECT * FROM xyv ORDER BY x, y) AS xyv USING (x, y) WHERE x > 2
----
3 1 31 31
3 3 NULL 33
5 5 NULL 55
query IIII rowsort
SELECT * FROM (SELECT * FROM xyu ORDER BY x, y) AS xyu FULL OUTER JOIN (SELECT * FROM xyv ORDER BY x, y) AS xyv USING (x, y) WHERE x > 2
----
3 1 31 31
3 2 32 NULL
4 4 44 NULL
3 3 NULL 33
5 5 NULL 55
query IIIIII rowsort
SELECT * FROM (SELECT * FROM xyu ORDER BY x, y) AS xyu LEFT OUTER JOIN (SELECT * FROM xyv ORDER BY x, y) AS xyv ON xyu.x = xyv.x AND xyu.y = xyv.y AND xyu.x = 1 AND xyu.y < 10
----
0 0 0 NULL NULL NULL
1 1 1 1 1 1
3 1 31 NULL NULL NULL
3 2 32 NULL NULL NULL
4 4 44 NULL NULL NULL
query IIIIII rowsort
SELECT * FROM xyu RIGHT OUTER JOIN (SELECT * FROM xyv ORDER BY x, y) AS xyv ON xyu.x = xyv.x AND xyu.y = xyv.y AND xyu.x = 1 AND xyu.y < 10
----
1 1 1 1 1 1
NULL NULL NULL 3 1 31
NULL NULL NULL 3 3 33
NULL NULL NULL 5 5 55
NULL NULL NULL 2 2 2
# Regression test for #20858.
statement ok
CREATE TABLE l (a INT PRIMARY KEY)
statement ok
CREATE TABLE r (a INT PRIMARY KEY)
statement ok
INSERT INTO l VALUES (1), (2), (3)
statement ok
INSERT INTO r VALUES (2), (3), (4)
query I
SELECT * FROM l LEFT OUTER JOIN r USING (a) WHERE a = 1
----
1
query I
SELECT * FROM l LEFT OUTER JOIN r USING (a) WHERE a = 2
----
2
query I
SELECT * FROM l RIGHT OUTER JOIN r USING (a) WHERE a = 3
----