@@ -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
750750 550 | 0550 | | | 1100 | 0
751751(12 rows)
752752
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+
753863-- Cases with non-nullable expressions in subquery results;
754864-- make sure these go to null as expected
755865EXPLAIN (COSTS OFF)
0 commit comments