@@ -750,6 +750,116 @@ SELECT t1.a, t1.c, t2.b, t2.c, t3.a + t3.b, t3.c FROM (prt1 t1 LEFT JOIN prt2 t2
750
750
550 | 0550 | | | 1100 | 0
751
751
(12 rows)
752
752
753
+ --
754
+ -- 3-way full join
755
+ --
756
+ EXPLAIN (COSTS OFF)
757
+ SELECT COUNT(*) FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) FULL JOIN prt2 p3(b,a,c) USING (a, b)
758
+ WHERE a BETWEEN 490 AND 510;
759
+ QUERY PLAN
760
+ -----------------------------------------------------------------------------------------------------------------------------------------
761
+ Aggregate
762
+ -> Append
763
+ -> Hash Full Join
764
+ Hash Cond: ((COALESCE(prt1_1.a, p2_1.a) = p3_1.a) AND (COALESCE(prt1_1.b, p2_1.b) = p3_1.b))
765
+ Filter: ((COALESCE(COALESCE(prt1_1.a, p2_1.a), p3_1.a) >= 490) AND (COALESCE(COALESCE(prt1_1.a, p2_1.a), p3_1.a) <= 510))
766
+ -> Hash Full Join
767
+ Hash Cond: ((prt1_1.a = p2_1.a) AND (prt1_1.b = p2_1.b))
768
+ -> Seq Scan on prt1_p1 prt1_1
769
+ -> Hash
770
+ -> Seq Scan on prt2_p1 p2_1
771
+ -> Hash
772
+ -> Seq Scan on prt2_p1 p3_1
773
+ -> Hash Full Join
774
+ Hash Cond: ((COALESCE(prt1_2.a, p2_2.a) = p3_2.a) AND (COALESCE(prt1_2.b, p2_2.b) = p3_2.b))
775
+ Filter: ((COALESCE(COALESCE(prt1_2.a, p2_2.a), p3_2.a) >= 490) AND (COALESCE(COALESCE(prt1_2.a, p2_2.a), p3_2.a) <= 510))
776
+ -> Hash Full Join
777
+ Hash Cond: ((prt1_2.a = p2_2.a) AND (prt1_2.b = p2_2.b))
778
+ -> Seq Scan on prt1_p2 prt1_2
779
+ -> Hash
780
+ -> Seq Scan on prt2_p2 p2_2
781
+ -> Hash
782
+ -> Seq Scan on prt2_p2 p3_2
783
+ -> Hash Full Join
784
+ Hash Cond: ((COALESCE(prt1_3.a, p2_3.a) = p3_3.a) AND (COALESCE(prt1_3.b, p2_3.b) = p3_3.b))
785
+ Filter: ((COALESCE(COALESCE(prt1_3.a, p2_3.a), p3_3.a) >= 490) AND (COALESCE(COALESCE(prt1_3.a, p2_3.a), p3_3.a) <= 510))
786
+ -> Hash Full Join
787
+ Hash Cond: ((prt1_3.a = p2_3.a) AND (prt1_3.b = p2_3.b))
788
+ -> Seq Scan on prt1_p3 prt1_3
789
+ -> Hash
790
+ -> Seq Scan on prt2_p3 p2_3
791
+ -> Hash
792
+ -> Seq Scan on prt2_p3 p3_3
793
+ (32 rows)
794
+
795
+ SELECT COUNT(*) FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) FULL JOIN prt2 p3(b,a,c) USING (a, b)
796
+ WHERE a BETWEEN 490 AND 510;
797
+ count
798
+ -------
799
+ 14
800
+ (1 row)
801
+
802
+ --
803
+ -- 4-way full join
804
+ --
805
+ EXPLAIN (COSTS OFF)
806
+ SELECT COUNT(*) FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) FULL JOIN prt2 p3(b,a,c) USING (a, b) FULL JOIN prt1 p4 (a,b,c) USING (a, b)
807
+ WHERE a BETWEEN 490 AND 510;
808
+ QUERY PLAN
809
+ -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
810
+ Aggregate
811
+ -> Append
812
+ -> Hash Full Join
813
+ Hash Cond: ((COALESCE(COALESCE(prt1_1.a, p2_1.a), p3_1.a) = p4_1.a) AND (COALESCE(COALESCE(prt1_1.b, p2_1.b), p3_1.b) = p4_1.b))
814
+ Filter: ((COALESCE(COALESCE(COALESCE(prt1_1.a, p2_1.a), p3_1.a), p4_1.a) >= 490) AND (COALESCE(COALESCE(COALESCE(prt1_1.a, p2_1.a), p3_1.a), p4_1.a) <= 510))
815
+ -> Hash Full Join
816
+ Hash Cond: ((COALESCE(prt1_1.a, p2_1.a) = p3_1.a) AND (COALESCE(prt1_1.b, p2_1.b) = p3_1.b))
817
+ -> Hash Full Join
818
+ Hash Cond: ((prt1_1.a = p2_1.a) AND (prt1_1.b = p2_1.b))
819
+ -> Seq Scan on prt1_p1 prt1_1
820
+ -> Hash
821
+ -> Seq Scan on prt2_p1 p2_1
822
+ -> Hash
823
+ -> Seq Scan on prt2_p1 p3_1
824
+ -> Hash
825
+ -> Seq Scan on prt1_p1 p4_1
826
+ -> Hash Full Join
827
+ Hash Cond: ((COALESCE(COALESCE(prt1_2.a, p2_2.a), p3_2.a) = p4_2.a) AND (COALESCE(COALESCE(prt1_2.b, p2_2.b), p3_2.b) = p4_2.b))
828
+ Filter: ((COALESCE(COALESCE(COALESCE(prt1_2.a, p2_2.a), p3_2.a), p4_2.a) >= 490) AND (COALESCE(COALESCE(COALESCE(prt1_2.a, p2_2.a), p3_2.a), p4_2.a) <= 510))
829
+ -> Hash Full Join
830
+ Hash Cond: ((COALESCE(prt1_2.a, p2_2.a) = p3_2.a) AND (COALESCE(prt1_2.b, p2_2.b) = p3_2.b))
831
+ -> Hash Full Join
832
+ Hash Cond: ((prt1_2.a = p2_2.a) AND (prt1_2.b = p2_2.b))
833
+ -> Seq Scan on prt1_p2 prt1_2
834
+ -> Hash
835
+ -> Seq Scan on prt2_p2 p2_2
836
+ -> Hash
837
+ -> Seq Scan on prt2_p2 p3_2
838
+ -> Hash
839
+ -> Seq Scan on prt1_p2 p4_2
840
+ -> Hash Full Join
841
+ Hash Cond: ((COALESCE(COALESCE(prt1_3.a, p2_3.a), p3_3.a) = p4_3.a) AND (COALESCE(COALESCE(prt1_3.b, p2_3.b), p3_3.b) = p4_3.b))
842
+ Filter: ((COALESCE(COALESCE(COALESCE(prt1_3.a, p2_3.a), p3_3.a), p4_3.a) >= 490) AND (COALESCE(COALESCE(COALESCE(prt1_3.a, p2_3.a), p3_3.a), p4_3.a) <= 510))
843
+ -> Hash Full Join
844
+ Hash Cond: ((COALESCE(prt1_3.a, p2_3.a) = p3_3.a) AND (COALESCE(prt1_3.b, p2_3.b) = p3_3.b))
845
+ -> Hash Full Join
846
+ Hash Cond: ((prt1_3.a = p2_3.a) AND (prt1_3.b = p2_3.b))
847
+ -> Seq Scan on prt1_p3 prt1_3
848
+ -> Hash
849
+ -> Seq Scan on prt2_p3 p2_3
850
+ -> Hash
851
+ -> Seq Scan on prt2_p3 p3_3
852
+ -> Hash
853
+ -> Seq Scan on prt1_p3 p4_3
854
+ (44 rows)
855
+
856
+ SELECT COUNT(*) FROM prt1 FULL JOIN prt2 p2(b,a,c) USING(a,b) FULL JOIN prt2 p3(b,a,c) USING (a, b) FULL JOIN prt1 p4 (a,b,c) USING (a, b)
857
+ WHERE a BETWEEN 490 AND 510;
858
+ count
859
+ -------
860
+ 14
861
+ (1 row)
862
+
753
863
-- Cases with non-nullable expressions in subquery results;
754
864
-- make sure these go to null as expected
755
865
EXPLAIN (COSTS OFF)
0 commit comments