*** a/contrib/postgres_fdw/expected/postgres_fdw.out
--- b/contrib/postgres_fdw/expected/postgres_fdw.out
***************
*** 455,461 **** EXPLAIN (VERBOSE, COSTS OFF)
     ->  Merge Right Join
           Output: t1."C 1"
           Merge Cond: (t3.c1 = t1."C 1")
!          ->  Foreign Scan
                 Output: t3.c1
                 Relations: (public.ft1 t2) INNER JOIN (public.ft2 t3)
                 Remote SQL: SELECT r3."C 1" FROM ("S 1"."T 1" r2 INNER JOIN "S 1"."T 1" r3 ON (((r2."C 1" = r3."C 1")))) ORDER BY r2."C 1" ASC NULLS LAST
--- 455,461 ----
     ->  Merge Right Join
           Output: t1."C 1"
           Merge Cond: (t3.c1 = t1."C 1")
!          ->  Foreign Join on public.ft1 t2, public.ft2 t3
                 Output: t3.c1
                 Relations: (public.ft1 t2) INNER JOIN (public.ft2 t3)
                 Remote SQL: SELECT r3."C 1" FROM ("S 1"."T 1" r2 INNER JOIN "S 1"."T 1" r3 ON (((r2."C 1" = r3."C 1")))) ORDER BY r2."C 1" ASC NULLS LAST
***************
*** 490,496 **** EXPLAIN (VERBOSE, COSTS OFF)
     ->  Merge Right Join
           Output: t1."C 1", t2.c1, t3.c1
           Merge Cond: (t3.c1 = t1."C 1")
!          ->  Foreign Scan
                 Output: t3.c1, t2.c1
                 Relations: (public.ft2 t3) LEFT JOIN (public.ft1 t2)
                 Remote SQL: SELECT r3."C 1", r2."C 1" FROM ("S 1"."T 1" r3 LEFT JOIN "S 1"."T 1" r2 ON (((r2."C 1" = r3."C 1")))) ORDER BY r3."C 1" ASC NULLS LAST
--- 490,496 ----
     ->  Merge Right Join
           Output: t1."C 1", t2.c1, t3.c1
           Merge Cond: (t3.c1 = t1."C 1")
!          ->  Foreign Join on public.ft1 t2, public.ft2 t3
                 Output: t3.c1, t2.c1
                 Relations: (public.ft2 t3) LEFT JOIN (public.ft1 t2)
                 Remote SQL: SELECT r3."C 1", r2."C 1" FROM ("S 1"."T 1" r3 LEFT JOIN "S 1"."T 1" r2 ON (((r2."C 1" = r3."C 1")))) ORDER BY r3."C 1" ASC NULLS LAST
***************
*** 523,529 **** EXPLAIN (VERBOSE, COSTS OFF)
     ->  Merge Full Join
           Output: t1."C 1", t2.c1, t3.c1
           Merge Cond: (t3.c1 = t1."C 1")
!          ->  Foreign Scan
                 Output: t2.c1, t3.c1
                 Relations: (public.ft1 t2) FULL JOIN (public.ft2 t3)
                 Remote SQL: SELECT r2."C 1", r3."C 1" FROM ("S 1"."T 1" r2 FULL JOIN "S 1"."T 1" r3 ON (((r2."C 1" = r3."C 1")))) ORDER BY r3."C 1" ASC NULLS LAST
--- 523,529 ----
     ->  Merge Full Join
           Output: t1."C 1", t2.c1, t3.c1
           Merge Cond: (t3.c1 = t1."C 1")
!          ->  Foreign Join on public.ft1 t2, public.ft2 t3
                 Output: t2.c1, t3.c1
                 Relations: (public.ft1 t2) FULL JOIN (public.ft2 t3)
                 Remote SQL: SELECT r2."C 1", r3."C 1" FROM ("S 1"."T 1" r2 FULL JOIN "S 1"."T 1" r3 ON (((r2."C 1" = r3."C 1")))) ORDER BY r3."C 1" ASC NULLS LAST
***************
*** 975,981 **** SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c1, t1.c3
!    ->  Foreign Scan
           Output: t1.c1, t2.c1, t1.c3
           Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
           Remote SQL: SELECT r1."C 1", r1.c3, r2."C 1" FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) ORDER BY r1.c3 ASC NULLS LAST, r1."C 1" ASC NULLS LAST
--- 975,981 ----
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c1, t1.c3
!    ->  Foreign Join on public.ft1 t1, public.ft2 t2
           Output: t1.c1, t2.c1, t1.c3
           Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
           Remote SQL: SELECT r1."C 1", r1.c3, r2."C 1" FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) ORDER BY r1.c3 ASC NULLS LAST, r1."C 1" ASC NULLS LAST
***************
*** 1006,1012 **** SELECT t1.c1, t2.c2, t3.c3 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) JOIN ft4 t
     ->  Sort
           Output: t1.c1, t2.c2, t3.c3, t1.c3
           Sort Key: t1.c3, t1.c1
!          ->  Foreign Scan
                 Output: t1.c1, t2.c2, t3.c3, t1.c3
                 Relations: ((public.ft1 t1) INNER JOIN (public.ft2 t2)) INNER JOIN (public.ft4 t3)
                 Remote SQL: SELECT r1."C 1", r1.c3, r2.c2, r4.c3 FROM (("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) INNER JOIN "S 1"."T 3" r4 ON (((r1."C 1" = r4.c1))))
--- 1006,1012 ----
     ->  Sort
           Output: t1.c1, t2.c2, t3.c3, t1.c3
           Sort Key: t1.c3, t1.c1
!          ->  Foreign Join on public.ft1 t1, public.ft2 t2, public.ft4 t3
                 Output: t1.c1, t2.c2, t3.c3, t1.c3
                 Relations: ((public.ft1 t1) INNER JOIN (public.ft2 t2)) INNER JOIN (public.ft4 t3)
                 Remote SQL: SELECT r1."C 1", r1.c3, r2.c2, r4.c3 FROM (("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) INNER JOIN "S 1"."T 3" r4 ON (((r1."C 1" = r4.c1))))
***************
*** 1034,1040 **** SELECT t1.c1, t2.c1 FROM ft4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.
  -------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c1
!    ->  Foreign Scan
           Output: t1.c1, t2.c1
           Relations: (public.ft4 t1) LEFT JOIN (public.ft5 t2)
           Remote SQL: SELECT r1.c1, r2.c1 FROM ("S 1"."T 3" r1 LEFT JOIN "S 1"."T 4" r2 ON (((r1.c1 = r2.c1)))) ORDER BY r1.c1 ASC NULLS LAST, r2.c1 ASC NULLS LAST
--- 1034,1040 ----
  -------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c1
!    ->  Foreign Join on public.ft4 t1, public.ft5 t2
           Output: t1.c1, t2.c1
           Relations: (public.ft4 t1) LEFT JOIN (public.ft5 t2)
           Remote SQL: SELECT r1.c1, r2.c1 FROM ("S 1"."T 3" r1 LEFT JOIN "S 1"."T 4" r2 ON (((r1.c1 = r2.c1)))) ORDER BY r1.c1 ASC NULLS LAST, r2.c1 ASC NULLS LAST
***************
*** 1062,1068 **** SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Scan
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft2 t1) LEFT JOIN (public.ft2 t2)) LEFT JOIN (public.ft4 t3)
           Remote SQL: SELECT r1."C 1", r2.c2, r4.c3 FROM (("S 1"."T 1" r1 LEFT JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) LEFT JOIN "S 1"."T 3" r4 ON (((r2."C 1" = r4.c1))))
--- 1062,1068 ----
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Join on public.ft2 t1, public.ft2 t2, public.ft4 t3
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft2 t1) LEFT JOIN (public.ft2 t2)) LEFT JOIN (public.ft4 t3)
           Remote SQL: SELECT r1."C 1", r2.c2, r4.c3 FROM (("S 1"."T 1" r1 LEFT JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) LEFT JOIN "S 1"."T 3" r4 ON (((r2."C 1" = r4.c1))))
***************
*** 1090,1096 **** EXPLAIN (VERBOSE, COSTS OFF)
  SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1) WHERE t1.c1 < 10;
                                                                            QUERY PLAN                                                                           
  ---------------------------------------------------------------------------------------------------------------------------------------------------------------
!  Foreign Scan
     Output: t1.c1, t1.c2, ft5.c1, ft5.c2
     Relations: (public.ft4 t1) LEFT JOIN (public.ft5)
     Remote SQL: SELECT r1.c1, r1.c2, r4.c1, r4.c2 FROM ("S 1"."T 3" r1 LEFT JOIN "S 1"."T 4" r4 ON (((r1.c1 = r4.c1)) AND ((r4.c1 < 10)))) WHERE ((r1.c1 < 10))
--- 1090,1096 ----
  SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE c1 < 10) t2 ON (t1.c1 = t2.c1) WHERE t1.c1 < 10;
                                                                            QUERY PLAN                                                                           
  ---------------------------------------------------------------------------------------------------------------------------------------------------------------
!  Foreign Join on public.ft4 t1, public.ft5
     Output: t1.c1, t1.c2, ft5.c1, ft5.c2
     Relations: (public.ft4 t1) LEFT JOIN (public.ft5)
     Remote SQL: SELECT r1.c1, r1.c2, r4.c1, r4.c2 FROM ("S 1"."T 3" r1 LEFT JOIN "S 1"."T 4" r4 ON (((r1.c1 = r4.c1)) AND ((r4.c1 < 10)))) WHERE ((r1.c1 < 10))
***************
*** 1112,1118 **** SELECT t1.c1, t1.c2, t2.c1, t2.c2 FROM ft4 t1 LEFT JOIN (SELECT * FROM ft5 WHERE
  			WHERE (t2.c1 < 10 OR t2.c1 IS NULL) AND t1.c1 < 10;
                                                                                                QUERY PLAN                                                                                               
  -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
!  Foreign Scan
     Output: t1.c1, t1.c2, ft5.c1, ft5.c2
     Relations: (public.ft4 t1) LEFT JOIN (public.ft5)
     Remote SQL: SELECT r1.c1, r1.c2, r4.c1, r4.c2 FROM ("S 1"."T 3" r1 LEFT JOIN "S 1"."T 4" r4 ON (((r1.c1 = r4.c1)) AND ((r4.c1 < 10)))) WHERE (((r4.c1 < 10) OR (r4.c1 IS NULL))) AND ((r1.c1 < 10))
--- 1112,1118 ----
  			WHERE (t2.c1 < 10 OR t2.c1 IS NULL) AND t1.c1 < 10;
                                                                                                QUERY PLAN                                                                                               
  -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
!  Foreign Join on public.ft4 t1, public.ft5
     Output: t1.c1, t1.c2, ft5.c1, ft5.c2
     Relations: (public.ft4 t1) LEFT JOIN (public.ft5)
     Remote SQL: SELECT r1.c1, r1.c2, r4.c1, r4.c2 FROM ("S 1"."T 3" r1 LEFT JOIN "S 1"."T 4" r4 ON (((r1.c1 = r4.c1)) AND ((r4.c1 < 10)))) WHERE (((r4.c1 < 10) OR (r4.c1 IS NULL))) AND ((r1.c1 < 10))
***************
*** 1135,1141 **** SELECT t1.c1, t2.c1 FROM ft5 t1 RIGHT JOIN ft4 t2 ON (t1.c1 = t2.c1) ORDER BY t2
  -------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c1
!    ->  Foreign Scan
           Output: t1.c1, t2.c1
           Relations: (public.ft4 t2) LEFT JOIN (public.ft5 t1)
           Remote SQL: SELECT r2.c1, r1.c1 FROM ("S 1"."T 3" r2 LEFT JOIN "S 1"."T 4" r1 ON (((r1.c1 = r2.c1)))) ORDER BY r2.c1 ASC NULLS LAST, r1.c1 ASC NULLS LAST
--- 1135,1141 ----
  -------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c1
!    ->  Foreign Join on public.ft5 t1, public.ft4 t2
           Output: t1.c1, t2.c1
           Relations: (public.ft4 t2) LEFT JOIN (public.ft5 t1)
           Remote SQL: SELECT r2.c1, r1.c1 FROM ("S 1"."T 3" r2 LEFT JOIN "S 1"."T 4" r1 ON (((r1.c1 = r2.c1)))) ORDER BY r2.c1 ASC NULLS LAST, r1.c1 ASC NULLS LAST
***************
*** 1163,1169 **** SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGH
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Scan
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft4 t3) LEFT JOIN (public.ft2 t2)) LEFT JOIN (public.ft2 t1)
           Remote SQL: SELECT r4.c3, r2.c2, r1."C 1" FROM (("S 1"."T 3" r4 LEFT JOIN "S 1"."T 1" r2 ON (((r2."C 1" = r4.c1)))) LEFT JOIN "S 1"."T 1" r1 ON (((r1."C 1" = r2."C 1"))))
--- 1163,1169 ----
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Join on public.ft2 t1, public.ft2 t2, public.ft4 t3
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft4 t3) LEFT JOIN (public.ft2 t2)) LEFT JOIN (public.ft2 t1)
           Remote SQL: SELECT r4.c3, r2.c2, r1."C 1" FROM (("S 1"."T 3" r4 LEFT JOIN "S 1"."T 1" r2 ON (((r2."C 1" = r4.c1)))) LEFT JOIN "S 1"."T 1" r1 ON (((r1."C 1" = r2."C 1"))))
***************
*** 1191,1197 **** SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.
  -------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c1
!    ->  Foreign Scan
           Output: t1.c1, t2.c1
           Relations: (public.ft4 t1) FULL JOIN (public.ft5 t2)
           Remote SQL: SELECT r1.c1, r2.c1 FROM ("S 1"."T 3" r1 FULL JOIN "S 1"."T 4" r2 ON (((r1.c1 = r2.c1)))) ORDER BY r1.c1 ASC NULLS LAST, r2.c1 ASC NULLS LAST
--- 1191,1197 ----
  -------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c1
!    ->  Foreign Join on public.ft4 t1, public.ft5 t2
           Output: t1.c1, t2.c1
           Relations: (public.ft4 t1) FULL JOIN (public.ft5 t2)
           Remote SQL: SELECT r1.c1, r2.c1 FROM ("S 1"."T 3" r1 FULL JOIN "S 1"."T 4" r2 ON (((r1.c1 = r2.c1)))) ORDER BY r1.c1 ASC NULLS LAST, r2.c1 ASC NULLS LAST
***************
*** 1253,1259 **** SELECT t1.c1, t2.c1, t3.c1 FROM ft4 t1 INNER JOIN ft5 t2 ON (t1.c1 = t2.c1 + 1 a
  -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c1, t3.c1
!    ->  Foreign Scan
           Output: t1.c1, t2.c1, t3.c1
           Relations: ((public.ft4 t1) INNER JOIN (public.ft5 t2)) FULL JOIN (public.ft4 t3)
           Remote SQL: SELECT r1.c1, r2.c1, r4.c1 FROM (("S 1"."T 3" r1 INNER JOIN "S 1"."T 4" r2 ON (((r1.c1 = (r2.c1 + 1))) AND ((r1.c1 >= 50)) AND ((r1.c1 <= 60)))) FULL JOIN "S 1"."T 3" r4 ON (((r2.c1 = r4.c1)))) ORDER BY r1.c1 ASC NULLS LAST, r2.c1 ASC NULLS LAST, r4.c1 ASC NULLS LAST
--- 1253,1259 ----
  -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c1, t3.c1
!    ->  Foreign Join on public.ft4 t1, public.ft5 t2, public.ft4 t3
           Output: t1.c1, t2.c1, t3.c1
           Relations: ((public.ft4 t1) INNER JOIN (public.ft5 t2)) FULL JOIN (public.ft4 t3)
           Remote SQL: SELECT r1.c1, r2.c1, r4.c1 FROM (("S 1"."T 3" r1 INNER JOIN "S 1"."T 4" r2 ON (((r1.c1 = (r2.c1 + 1))) AND ((r1.c1 >= 50)) AND ((r1.c1 <= 60)))) FULL JOIN "S 1"."T 3" r4 ON (((r2.c1 = r4.c1)))) ORDER BY r1.c1 ASC NULLS LAST, r2.c1 ASC NULLS LAST, r4.c1 ASC NULLS LAST
***************
*** 1281,1287 **** SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Scan
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft2 t1) FULL JOIN (public.ft2 t2)) FULL JOIN (public.ft4 t3)
           Remote SQL: SELECT r1."C 1", r2.c2, r4.c3 FROM (("S 1"."T 1" r1 FULL JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) FULL JOIN "S 1"."T 3" r4 ON (((r2."C 1" = r4.c1))))
--- 1281,1287 ----
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Join on public.ft2 t1, public.ft2 t2, public.ft4 t3
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft2 t1) FULL JOIN (public.ft2 t2)) FULL JOIN (public.ft4 t3)
           Remote SQL: SELECT r1."C 1", r2.c2, r4.c3 FROM (("S 1"."T 1" r1 FULL JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) FULL JOIN "S 1"."T 3" r4 ON (((r2."C 1" = r4.c1))))
***************
*** 1309,1315 **** SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Scan
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft4 t3) LEFT JOIN (public.ft2 t2)) LEFT JOIN (public.ft2 t1)
           Remote SQL: SELECT r4.c3, r2.c2, r1."C 1" FROM (("S 1"."T 3" r4 LEFT JOIN "S 1"."T 1" r2 ON (((r2."C 1" = r4.c1)))) LEFT JOIN "S 1"."T 1" r1 ON (((r1."C 1" = r2."C 1"))))
--- 1309,1315 ----
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Join on public.ft2 t1, public.ft2 t2, public.ft4 t3
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft4 t3) LEFT JOIN (public.ft2 t2)) LEFT JOIN (public.ft2 t1)
           Remote SQL: SELECT r4.c3, r2.c2, r1."C 1" FROM (("S 1"."T 3" r4 LEFT JOIN "S 1"."T 1" r2 ON (((r2."C 1" = r4.c1)))) LEFT JOIN "S 1"."T 1" r1 ON (((r1."C 1" = r2."C 1"))))
***************
*** 1337,1343 **** SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Scan
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft2 t2) LEFT JOIN (public.ft2 t1)) FULL JOIN (public.ft4 t3)
           Remote SQL: SELECT r2.c2, r1."C 1", r4.c3 FROM (("S 1"."T 1" r2 LEFT JOIN "S 1"."T 1" r1 ON (((r1."C 1" = r2."C 1")))) FULL JOIN "S 1"."T 3" r4 ON (((r2."C 1" = r4.c1))))
--- 1337,1343 ----
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Join on public.ft2 t1, public.ft2 t2, public.ft4 t3
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft2 t2) LEFT JOIN (public.ft2 t1)) FULL JOIN (public.ft4 t3)
           Remote SQL: SELECT r2.c2, r1."C 1", r4.c3 FROM (("S 1"."T 1" r2 LEFT JOIN "S 1"."T 1" r1 ON (((r1."C 1" = r2."C 1")))) FULL JOIN "S 1"."T 3" r4 ON (((r2."C 1" = r4.c1))))
***************
*** 1365,1371 **** SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 FULL JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Scan
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft2 t1) FULL JOIN (public.ft2 t2)) LEFT JOIN (public.ft4 t3)
           Remote SQL: SELECT r1."C 1", r2.c2, r4.c3 FROM (("S 1"."T 1" r1 FULL JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) LEFT JOIN "S 1"."T 3" r4 ON (((r2."C 1" = r4.c1))))
--- 1365,1371 ----
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Join on public.ft2 t1, public.ft2 t2, public.ft4 t3
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft2 t1) FULL JOIN (public.ft2 t2)) LEFT JOIN (public.ft4 t3)
           Remote SQL: SELECT r1."C 1", r2.c2, r4.c3 FROM (("S 1"."T 1" r1 FULL JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) LEFT JOIN "S 1"."T 3" r4 ON (((r2."C 1" = r4.c1))))
***************
*** 1393,1399 **** SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) FULL
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Scan
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft2 t1) LEFT JOIN (public.ft2 t2)) FULL JOIN (public.ft4 t3)
           Remote SQL: SELECT r1."C 1", r2.c2, r4.c3 FROM (("S 1"."T 1" r1 LEFT JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) FULL JOIN "S 1"."T 3" r4 ON (((r2."C 1" = r4.c1))))
--- 1393,1399 ----
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Join on public.ft2 t1, public.ft2 t2, public.ft4 t3
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft2 t1) LEFT JOIN (public.ft2 t2)) FULL JOIN (public.ft4 t3)
           Remote SQL: SELECT r1."C 1", r2.c2, r4.c3 FROM (("S 1"."T 1" r1 LEFT JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) FULL JOIN "S 1"."T 3" r4 ON (((r2."C 1" = r4.c1))))
***************
*** 1421,1427 **** SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 RIGHT JOIN ft2 t2 ON (t1.c1 = t2.c1) LEFT
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Scan
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft2 t2) LEFT JOIN (public.ft2 t1)) LEFT JOIN (public.ft4 t3)
           Remote SQL: SELECT r2.c2, r1."C 1", r4.c3 FROM (("S 1"."T 1" r2 LEFT JOIN "S 1"."T 1" r1 ON (((r1."C 1" = r2."C 1")))) LEFT JOIN "S 1"."T 3" r4 ON (((r2."C 1" = r4.c1))))
--- 1421,1427 ----
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Join on public.ft2 t1, public.ft2 t2, public.ft4 t3
           Output: t1.c1, t2.c2, t3.c3
           Relations: ((public.ft2 t2) LEFT JOIN (public.ft2 t1)) LEFT JOIN (public.ft4 t3)
           Remote SQL: SELECT r2.c2, r1."C 1", r4.c3 FROM (("S 1"."T 1" r2 LEFT JOIN "S 1"."T 1" r1 ON (((r1."C 1" = r2."C 1")))) LEFT JOIN "S 1"."T 3" r4 ON (((r2."C 1" = r4.c1))))
***************
*** 1449,1455 **** SELECT t1.c1, t2.c2, t3.c3 FROM ft2 t1 LEFT JOIN ft2 t2 ON (t1.c1 = t2.c1) RIGHT
  -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Scan
           Output: t1.c1, t2.c2, t3.c3
           Relations: (public.ft4 t3) LEFT JOIN ((public.ft2 t1) INNER JOIN (public.ft2 t2))
           Remote SQL: SELECT r4.c3, r1."C 1", r2.c2 FROM ("S 1"."T 3" r4 LEFT JOIN ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) ON (((r2."C 1" = r4.c1))))
--- 1449,1455 ----
  -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.c1, t2.c2, t3.c3
!    ->  Foreign Join on public.ft2 t1, public.ft2 t2, public.ft4 t3
           Output: t1.c1, t2.c2, t3.c3
           Relations: (public.ft4 t3) LEFT JOIN ((public.ft2 t1) INNER JOIN (public.ft2 t2))
           Remote SQL: SELECT r4.c3, r1."C 1", r2.c2 FROM ("S 1"."T 3" r4 LEFT JOIN ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) ON (((r2."C 1" = r4.c1))))
***************
*** 1480,1486 **** SELECT t1.c1, t2.c1 FROM ft4 t1 FULL JOIN ft5 t2 ON (t1.c1 = t2.c1) WHERE (t1.c1
     ->  Sort
           Output: t1.c1, t2.c1
           Sort Key: t1.c1, t2.c1
!          ->  Foreign Scan
                 Output: t1.c1, t2.c1
                 Relations: (public.ft4 t1) FULL JOIN (public.ft5 t2)
                 Remote SQL: SELECT r1.c1, r2.c1 FROM ("S 1"."T 3" r1 FULL JOIN "S 1"."T 4" r2 ON (((r1.c1 = r2.c1)))) WHERE (((r1.c1 = r2.c1) OR (r1.c1 IS NULL)))
--- 1480,1486 ----
     ->  Sort
           Output: t1.c1, t2.c1
           Sort Key: t1.c1, t2.c1
!          ->  Foreign Join on public.ft4 t1, public.ft5 t2
                 Output: t1.c1, t2.c1
                 Relations: (public.ft4 t1) FULL JOIN (public.ft5 t2)
                 Remote SQL: SELECT r1.c1, r2.c1 FROM ("S 1"."T 3" r1 FULL JOIN "S 1"."T 4" r2 ON (((r1.c1 = r2.c1)))) WHERE (((r1.c1 = r2.c1) OR (r1.c1 IS NULL)))
***************
*** 1511,1517 **** SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t
     Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
     ->  LockRows
           Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
!          ->  Foreign Scan
                 Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
                 Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
                 Remote SQL: SELECT r1."C 1", r1.c3, CASE WHEN (r1.*)::text IS NOT NULL THEN ROW(r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8) END, r2."C 1", CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) ORDER BY r1.c3 ASC NULLS LAST, r1."C 1" ASC NULLS LAST FOR UPDATE OF r1
--- 1511,1517 ----
     Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
     ->  LockRows
           Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
!          ->  Foreign Join on public.ft1 t1, public.ft2 t2
                 Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
                 Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
                 Remote SQL: SELECT r1."C 1", r1.c3, CASE WHEN (r1.*)::text IS NOT NULL THEN ROW(r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8) END, r2."C 1", CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) ORDER BY r1.c3 ASC NULLS LAST, r1."C 1" ASC NULLS LAST FOR UPDATE OF r1
***************
*** 1555,1561 **** SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t
     Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
     ->  LockRows
           Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
!          ->  Foreign Scan
                 Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
                 Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
                 Remote SQL: SELECT r1."C 1", r1.c3, CASE WHEN (r1.*)::text IS NOT NULL THEN ROW(r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8) END, r2."C 1", CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) ORDER BY r1.c3 ASC NULLS LAST, r1."C 1" ASC NULLS LAST FOR UPDATE OF r1 FOR UPDATE OF r2
--- 1555,1561 ----
     Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
     ->  LockRows
           Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
!          ->  Foreign Join on public.ft1 t1, public.ft2 t2
                 Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
                 Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
                 Remote SQL: SELECT r1."C 1", r1.c3, CASE WHEN (r1.*)::text IS NOT NULL THEN ROW(r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8) END, r2."C 1", CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) ORDER BY r1.c3 ASC NULLS LAST, r1."C 1" ASC NULLS LAST FOR UPDATE OF r1 FOR UPDATE OF r2
***************
*** 1600,1606 **** SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t
     Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
     ->  LockRows
           Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
!          ->  Foreign Scan
                 Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
                 Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
                 Remote SQL: SELECT r1."C 1", r1.c3, CASE WHEN (r1.*)::text IS NOT NULL THEN ROW(r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8) END, r2."C 1", CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) ORDER BY r1.c3 ASC NULLS LAST, r1."C 1" ASC NULLS LAST FOR SHARE OF r1
--- 1600,1606 ----
     Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
     ->  LockRows
           Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
!          ->  Foreign Join on public.ft1 t1, public.ft2 t2
                 Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
                 Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
                 Remote SQL: SELECT r1."C 1", r1.c3, CASE WHEN (r1.*)::text IS NOT NULL THEN ROW(r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8) END, r2."C 1", CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) ORDER BY r1.c3 ASC NULLS LAST, r1."C 1" ASC NULLS LAST FOR SHARE OF r1
***************
*** 1644,1650 **** SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c3, t
     Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
     ->  LockRows
           Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
!          ->  Foreign Scan
                 Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
                 Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
                 Remote SQL: SELECT r1."C 1", r1.c3, CASE WHEN (r1.*)::text IS NOT NULL THEN ROW(r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8) END, r2."C 1", CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) ORDER BY r1.c3 ASC NULLS LAST, r1."C 1" ASC NULLS LAST FOR SHARE OF r1 FOR SHARE OF r2
--- 1644,1650 ----
     Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
     ->  LockRows
           Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
!          ->  Foreign Join on public.ft1 t1, public.ft2 t2
                 Output: t1.c1, t2.c1, t1.c3, t1.*, t2.*
                 Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
                 Remote SQL: SELECT r1."C 1", r1.c3, CASE WHEN (r1.*)::text IS NOT NULL THEN ROW(r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8) END, r2."C 1", CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) ORDER BY r1.c3 ASC NULLS LAST, r1."C 1" ASC NULLS LAST FOR SHARE OF r1 FOR SHARE OF r2
***************
*** 1688,1694 **** WITH t (c1_1, c1_3, c2_1) AS (SELECT t1.c1, t1.c3, t2.c1 FROM ft1 t1 JOIN ft2 t2
   Limit
     Output: t.c1_1, t.c2_1, t.c1_3
     CTE t
!      ->  Foreign Scan
             Output: t1.c1, t1.c3, t2.c1
             Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
             Remote SQL: SELECT r1."C 1", r1.c3, r2."C 1" FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1"))))
--- 1688,1694 ----
   Limit
     Output: t.c1_1, t.c2_1, t.c1_3
     CTE t
!      ->  Foreign Join on public.ft1 t1, public.ft2 t2
             Output: t1.c1, t1.c3, t2.c1
             Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
             Remote SQL: SELECT r1."C 1", r1.c3, r2."C 1" FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1"))))
***************
*** 1721,1727 **** SELECT t1.ctid, t1, t2, t1.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) ORDER B
  -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.ctid, t1.*, t2.*, t1.c1, t1.c3
!    ->  Foreign Scan
           Output: t1.ctid, t1.*, t2.*, t1.c1, t1.c3
           Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
           Remote SQL: SELECT r1.ctid, CASE WHEN (r1.*)::text IS NOT NULL THEN ROW(r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8) END, r1."C 1", r1.c3, CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) ORDER BY r1.c3 ASC NULLS LAST, r1."C 1" ASC NULLS LAST
--- 1721,1727 ----
  -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: t1.ctid, t1.*, t2.*, t1.c1, t1.c3
!    ->  Foreign Join on public.ft1 t1, public.ft2 t2
           Output: t1.ctid, t1.*, t2.*, t1.c1, t1.c3
           Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
           Remote SQL: SELECT r1.ctid, CASE WHEN (r1.*)::text IS NOT NULL THEN ROW(r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8) END, r1."C 1", r1.c3, CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")))) ORDER BY r1.c3 ASC NULLS LAST, r1."C 1" ASC NULLS LAST
***************
*** 1954,1960 **** SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2 ON (t1.c1 = t2.c1) WHERE t1.c8 = t2.
     ->  Sort
           Output: t1.c1, t2.c1, t1.c3
           Sort Key: t1.c3, t1.c1
!          ->  Foreign Scan
                 Output: t1.c1, t2.c1, t1.c3
                 Filter: (t1.c8 = t2.c8)
                 Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
--- 1954,1960 ----
     ->  Sort
           Output: t1.c1, t2.c1, t1.c3
           Sort Key: t1.c3, t1.c1
!          ->  Foreign Join on public.ft1 t1, public.ft2 t2
                 Output: t1.c1, t2.c1, t1.c3
                 Filter: (t1.c8 = t2.c8)
                 Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
***************
*** 1993,2003 **** SELECT t1c1, avg(t1c1 + t2c1) FROM (SELECT t1.c1, t2.c1 FROM ft1 t1 JOIN ft2 t2
                       Output: t1.c1, t2.c1
                       Group Key: t1.c1, t2.c1
                       ->  Append
!                            ->  Foreign Scan
                                   Output: t1.c1, t2.c1
                                   Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
                                   Remote SQL: SELECT r1."C 1", r2."C 1" FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1"))))
!                            ->  Foreign Scan
                                   Output: t1_1.c1, t2_1.c1
                                   Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
                                   Remote SQL: SELECT r1."C 1", r2."C 1" FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1"))))
--- 1993,2003 ----
                       Output: t1.c1, t2.c1
                       Group Key: t1.c1, t2.c1
                       ->  Append
!                            ->  Foreign Join on public.ft1 t1, public.ft2 t2
                                   Output: t1.c1, t2.c1
                                   Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
                                   Remote SQL: SELECT r1."C 1", r2."C 1" FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1"))))
!                            ->  Foreign Join on public.ft1 t1_1, public.ft2 t2_1
                                   Output: t1_1.c1, t2_1.c1
                                   Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
                                   Remote SQL: SELECT r1."C 1", r2."C 1" FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1"))))
***************
*** 2032,2038 **** SELECT t1."C 1" FROM "S 1"."T 1" t1, LATERAL (SELECT DISTINCT t2.c1, t3.c1 FROM
           ->  HashAggregate
                 Output: t2.c1, t3.c1
                 Group Key: t2.c1, t3.c1
!                ->  Foreign Scan
                       Output: t2.c1, t3.c1
                       Relations: (public.ft1 t2) INNER JOIN (public.ft2 t3)
                       Remote SQL: SELECT r1."C 1", r2."C 1" FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")) AND ((r1.c2 = $1::integer))))
--- 2032,2038 ----
           ->  HashAggregate
                 Output: t2.c1, t3.c1
                 Group Key: t2.c1, t3.c1
!                ->  Foreign Join on public.ft1 t2, public.ft2 t3
                       Output: t2.c1, t3.c1
                       Relations: (public.ft1 t2) INNER JOIN (public.ft2 t3)
                       Remote SQL: SELECT r1."C 1", r2."C 1" FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1."C 1" = r2."C 1")) AND ((r1.c2 = $1::integer))))
***************
*** 2097,2103 **** SELECT ft4.c1, q.* FROM ft4 LEFT JOIN (SELECT 13, ft1.c1, ft2.c1 FROM ft1 RIGHT
           Remote SQL: SELECT c1 FROM "S 1"."T 3" WHERE ((c1 >= 10)) AND ((c1 <= 15))
     ->  Materialize
           Output: ft1.c1, ft2.c1, (13)
!          ->  Foreign Scan
                 Output: ft1.c1, ft2.c1, 13
                 Relations: (public.ft1) INNER JOIN (public.ft2)
                 Remote SQL: SELECT r4."C 1", r5."C 1" FROM ("S 1"."T 1" r4 INNER JOIN "S 1"."T 1" r5 ON (((r5."C 1" = 12)) AND ((r4."C 1" = 12)))) ORDER BY r4."C 1" ASC NULLS LAST
--- 2097,2103 ----
           Remote SQL: SELECT c1 FROM "S 1"."T 3" WHERE ((c1 >= 10)) AND ((c1 <= 15))
     ->  Materialize
           Output: ft1.c1, ft2.c1, (13)
!          ->  Foreign Join on public.ft1, public.ft2
                 Output: ft1.c1, ft2.c1, 13
                 Relations: (public.ft1) INNER JOIN (public.ft2)
                 Remote SQL: SELECT r4."C 1", r5."C 1" FROM ("S 1"."T 1" r4 INNER JOIN "S 1"."T 1" r5 ON (((r5."C 1" = 12)) AND ((r4."C 1" = 12)))) ORDER BY r4."C 1" ASC NULLS LAST
***************
*** 2117,2123 **** EXPLAIN (VERBOSE, COSTS OFF)
  SELECT ft5, ft5.c1, ft5.c2, ft5.c3, ft4.c1, ft4.c2 FROM ft5 left join ft4 on ft5.c1 = ft4.c1 WHERE ft4.c1 BETWEEN 10 and 30 ORDER BY ft5.c1, ft4.c1;
                                                                                                                                  QUERY PLAN                                                                                                                                 
  ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
!  Foreign Scan
     Output: ft5.*, ft5.c1, ft5.c2, ft5.c3, ft4.c1, ft4.c2
     Relations: (public.ft5) INNER JOIN (public.ft4)
     Remote SQL: SELECT CASE WHEN (r1.*)::text IS NOT NULL THEN ROW(r1.c1, r1.c2, r1.c3) END, r1.c1, r1.c2, r1.c3, r2.c1, r2.c2 FROM ("S 1"."T 4" r1 INNER JOIN "S 1"."T 3" r2 ON (((r1.c1 = r2.c1)) AND ((r2.c1 >= 10)) AND ((r2.c1 <= 30)))) ORDER BY r1.c1 ASC NULLS LAST
--- 2117,2123 ----
  SELECT ft5, ft5.c1, ft5.c2, ft5.c3, ft4.c1, ft4.c2 FROM ft5 left join ft4 on ft5.c1 = ft4.c1 WHERE ft4.c1 BETWEEN 10 and 30 ORDER BY ft5.c1, ft4.c1;
                                                                                                                                  QUERY PLAN                                                                                                                                 
  ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
!  Foreign Join on public.ft5, public.ft4
     Output: ft5.*, ft5.c1, ft5.c2, ft5.c3, ft4.c1, ft4.c2
     Relations: (public.ft5) INNER JOIN (public.ft4)
     Remote SQL: SELECT CASE WHEN (r1.*)::text IS NOT NULL THEN ROW(r1.c1, r1.c2, r1.c3) END, r1.c1, r1.c2, r1.c3, r2.c1, r2.c2 FROM ("S 1"."T 4" r1 INNER JOIN "S 1"."T 3" r2 ON (((r1.c1 = r2.c1)) AND ((r2.c1 >= 10)) AND ((r2.c1 <= 30)))) ORDER BY r1.c1 ASC NULLS LAST
***************
*** 2184,2190 **** SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN v5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c1
  --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: ft4.c1, ft5.c2, ft5.c1
!    ->  Foreign Scan
           Output: ft4.c1, ft5.c2, ft5.c1
           Relations: (public.ft4) LEFT JOIN (public.ft5)
           Remote SQL: SELECT r6.c1, r9.c2, r9.c1 FROM ("S 1"."T 3" r6 LEFT JOIN "S 1"."T 4" r9 ON (((r6.c1 = r9.c1)))) ORDER BY r6.c1 ASC NULLS LAST, r9.c1 ASC NULLS LAST
--- 2184,2190 ----
  --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: ft4.c1, ft5.c2, ft5.c1
!    ->  Foreign Join on public.ft4, public.ft5
           Output: ft4.c1, ft5.c2, ft5.c1
           Relations: (public.ft4) LEFT JOIN (public.ft5)
           Remote SQL: SELECT r6.c1, r9.c2, r9.c1 FROM ("S 1"."T 3" r6 LEFT JOIN "S 1"."T 4" r9 ON (((r6.c1 = r9.c1)))) ORDER BY r6.c1 ASC NULLS LAST, r9.c1 ASC NULLS LAST
***************
*** 2249,2255 **** SELECT t1.c1, t2.c2 FROM v4 t1 LEFT JOIN ft5 t2 ON (t1.c1 = t2.c1) ORDER BY t1.c
  --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: ft4.c1, t2.c2, t2.c1
!    ->  Foreign Scan
           Output: ft4.c1, t2.c2, t2.c1
           Relations: (public.ft4) LEFT JOIN (public.ft5 t2)
           Remote SQL: SELECT r6.c1, r2.c2, r2.c1 FROM ("S 1"."T 3" r6 LEFT JOIN "S 1"."T 4" r2 ON (((r6.c1 = r2.c1)))) ORDER BY r6.c1 ASC NULLS LAST, r2.c1 ASC NULLS LAST
--- 2249,2255 ----
  --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Limit
     Output: ft4.c1, t2.c2, t2.c1
!    ->  Foreign Join on public.ft5 t2, public.ft4
           Output: ft4.c1, t2.c2, t2.c1
           Relations: (public.ft4) LEFT JOIN (public.ft5 t2)
           Remote SQL: SELECT r6.c1, r2.c2, r2.c1 FROM ("S 1"."T 3" r6 LEFT JOIN "S 1"."T 4" r2 ON (((r6.c1 = r2.c1)))) ORDER BY r6.c1 ASC NULLS LAST, r2.c1 ASC NULLS LAST
***************
*** 2282,2288 **** PREPARE st1(int, int) AS SELECT t1.c3, t2.c3 FROM ft1 t1, ft2 t2 WHERE t1.c1 = $
  EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st1(1, 2);
                                                            QUERY PLAN                                                          
  ------------------------------------------------------------------------------------------------------------------------------
!  Foreign Scan
     Output: t1.c3, t2.c3
     Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
     Remote SQL: SELECT r1.c3, r2.c3 FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r2."C 1" = 2)) AND ((r1."C 1" = 1))))
--- 2282,2288 ----
  EXPLAIN (VERBOSE, COSTS OFF) EXECUTE st1(1, 2);
                                                            QUERY PLAN                                                          
  ------------------------------------------------------------------------------------------------------------------------------
!  Foreign Join on public.ft1 t1, public.ft2 t2
     Output: t1.c3, t2.c3
     Relations: (public.ft1 t1) INNER JOIN (public.ft2 t2)
     Remote SQL: SELECT r1.c3, r2.c3 FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r2."C 1" = 2)) AND ((r1."C 1" = 1))))
***************
*** 2898,2904 **** UPDATE ft2 SET c2 = ft2.c2 + 500, c3 = ft2.c3 || '_update9', c7 = DEFAULT
  ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Update on public.ft2
     Remote SQL: UPDATE "S 1"."T 1" SET c2 = $2, c3 = $3, c7 = $4 WHERE ctid = $1
!    ->  Foreign Scan
           Output: ft2.c1, (ft2.c2 + 500), NULL::integer, (ft2.c3 || '_update9'::text), ft2.c4, ft2.c5, ft2.c6, 'ft2       '::character(10), ft2.c8, ft2.ctid, ft1.*
           Relations: (public.ft2) INNER JOIN (public.ft1)
           Remote SQL: SELECT r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c8, r1.ctid, CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1.c2 = r2."C 1")) AND (((r2."C 1" % 10) = 9)))) FOR UPDATE OF r1
--- 2898,2904 ----
  ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Update on public.ft2
     Remote SQL: UPDATE "S 1"."T 1" SET c2 = $2, c3 = $3, c7 = $4 WHERE ctid = $1
!    ->  Foreign Join on public.ft2, public.ft1
           Output: ft2.c1, (ft2.c2 + 500), NULL::integer, (ft2.c3 || '_update9'::text), ft2.c4, ft2.c5, ft2.c6, 'ft2       '::character(10), ft2.c8, ft2.ctid, ft1.*
           Relations: (public.ft2) INNER JOIN (public.ft1)
           Remote SQL: SELECT r1."C 1", r1.c2, r1.c3, r1.c4, r1.c5, r1.c6, r1.c8, r1.ctid, CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1.c2 = r2."C 1")) AND (((r2."C 1" % 10) = 9)))) FOR UPDATE OF r1
***************
*** 3041,3047 **** DELETE FROM ft2 USING ft1 WHERE ft1.c1 = ft2.c2 AND ft1.c1 % 10 = 2;
  -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Delete on public.ft2
     Remote SQL: DELETE FROM "S 1"."T 1" WHERE ctid = $1
!    ->  Foreign Scan
           Output: ft2.ctid, ft1.*
           Relations: (public.ft2) INNER JOIN (public.ft1)
           Remote SQL: SELECT r1.ctid, CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1.c2 = r2."C 1")) AND (((r2."C 1" % 10) = 2)))) FOR UPDATE OF r1
--- 3041,3047 ----
  -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   Delete on public.ft2
     Remote SQL: DELETE FROM "S 1"."T 1" WHERE ctid = $1
!    ->  Foreign Join on public.ft2, public.ft1
           Output: ft2.ctid, ft1.*
           Relations: (public.ft2) INNER JOIN (public.ft1)
           Remote SQL: SELECT r1.ctid, CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2."C 1", r2.c2, r2.c3, r2.c4, r2.c5, r2.c6, r2.c7, r2.c8) END FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 1" r2 ON (((r1.c2 = r2."C 1")) AND (((r2."C 1" % 10) = 2)))) FOR UPDATE OF r1
*** a/src/backend/commands/explain.c
--- b/src/backend/commands/explain.c
***************
*** 111,116 **** static void ExplainIndexScanDetails(Oid indexid, ScanDirection indexorderdir,
--- 111,117 ----
  static void ExplainScanTarget(Scan *plan, ExplainState *es);
  static void ExplainModifyTarget(ModifyTable *plan, ExplainState *es);
  static void ExplainTargetRel(Plan *plan, Index rti, ExplainState *es);
+ static void ExplainTargetRels(Plan *plan, ExplainState *es);
  static void show_modifytable_info(ModifyTableState *mtstate, List *ancestors,
  					  ExplainState *es);
  static void ExplainMemberNodes(List *plans, PlanState **planstates,
***************
*** 812,817 **** ExplainNode(PlanState *planstate, List *ancestors,
--- 813,820 ----
  	const char *strategy = NULL;
  	const char *partialmode = NULL;
  	const char *operation = NULL;
+ 	const char *foperation = NULL;
+ 	const char *coperation = NULL;
  	const char *custom_name = NULL;
  	int			save_indent = es->indent;
  	bool		haschildren;
***************
*** 909,928 **** ExplainNode(PlanState *planstate, List *ancestors,
  			switch (((ForeignScan *) plan)->operation)
  			{
  				case CMD_SELECT:
! 					pname = "Foreign Scan";
! 					operation = "Select";
  					break;
  				case CMD_INSERT:
! 					pname = "Foreign Insert";
! 					operation = "Insert";
  					break;
  				case CMD_UPDATE:
! 					pname = "Foreign Update";
! 					operation = "Update";
  					break;
  				case CMD_DELETE:
! 					pname = "Foreign Delete";
! 					operation = "Delete";
  					break;
  				default:
  					pname = "???";
--- 912,930 ----
  			switch (((ForeignScan *) plan)->operation)
  			{
  				case CMD_SELECT:
! 					if (((Scan *) plan)->scanrelid > 0)
! 						pname = foperation = "Foreign Scan";
! 					else
! 						pname = foperation = "Foreign Join";
  					break;
  				case CMD_INSERT:
! 					pname = foperation = "Foreign Insert";
  					break;
  				case CMD_UPDATE:
! 					pname = foperation = "Foreign Update";
  					break;
  				case CMD_DELETE:
! 					pname = foperation = "Foreign Delete";
  					break;
  				default:
  					pname = "???";
***************
*** 931,941 **** ExplainNode(PlanState *planstate, List *ancestors,
  			break;
  		case T_CustomScan:
  			sname = "Custom Scan";
  			custom_name = ((CustomScan *) plan)->methods->CustomName;
  			if (custom_name)
! 				pname = psprintf("Custom Scan (%s)", custom_name);
! 			else
! 				pname = sname;
  			break;
  		case T_Material:
  			pname = sname = "Materialize";
--- 933,945 ----
  			break;
  		case T_CustomScan:
  			sname = "Custom Scan";
+ 			if (((Scan *) plan)->scanrelid > 0)
+ 				pname = coperation = "Custom Scan";
+ 			else
+ 				pname = coperation = "Custom Join";
  			custom_name = ((CustomScan *) plan)->methods->CustomName;
  			if (custom_name)
! 				pname = psprintf("%s (%s)", pname, custom_name);
  			break;
  		case T_Material:
  			pname = sname = "Materialize";
***************
*** 1055,1066 **** ExplainNode(PlanState *planstate, List *ancestors,
  			ExplainPropertyText("Partial Mode", partialmode, es);
  		if (operation)
  			ExplainPropertyText("Operation", operation, es);
  		if (relationship)
  			ExplainPropertyText("Parent Relationship", relationship, es);
  		if (plan_name)
  			ExplainPropertyText("Subplan Name", plan_name, es);
- 		if (custom_name)
- 			ExplainPropertyText("Custom Plan Provider", custom_name, es);
  		ExplainPropertyBool("Parallel Aware", plan->parallel_aware, es);
  	}
  
--- 1059,1074 ----
  			ExplainPropertyText("Partial Mode", partialmode, es);
  		if (operation)
  			ExplainPropertyText("Operation", operation, es);
+ 		if (foperation)
+ 			ExplainPropertyText("Foreign Operation", foperation, es);
+ 		if (coperation)
+ 			ExplainPropertyText("Custom Operation", coperation, es);
+ 		if (custom_name)
+ 			ExplainPropertyText("Custom Plan Provider", custom_name, es);
  		if (relationship)
  			ExplainPropertyText("Parent Relationship", relationship, es);
  		if (plan_name)
  			ExplainPropertyText("Subplan Name", plan_name, es);
  		ExplainPropertyBool("Parallel Aware", plan->parallel_aware, es);
  	}
  
***************
*** 1075,1086 **** ExplainNode(PlanState *planstate, List *ancestors,
  		case T_ValuesScan:
  		case T_CteScan:
  		case T_WorkTableScan:
- 			ExplainScanTarget((Scan *) plan, es);
- 			break;
  		case T_ForeignScan:
  		case T_CustomScan:
! 			if (((Scan *) plan)->scanrelid > 0)
! 				ExplainScanTarget((Scan *) plan, es);
  			break;
  		case T_IndexScan:
  			{
--- 1083,1091 ----
  		case T_ValuesScan:
  		case T_CteScan:
  		case T_WorkTableScan:
  		case T_ForeignScan:
  		case T_CustomScan:
! 			ExplainScanTarget((Scan *) plan, es);
  			break;
  		case T_IndexScan:
  			{
***************
*** 2479,2485 **** ExplainIndexScanDetails(Oid indexid, ScanDirection indexorderdir,
  static void
  ExplainScanTarget(Scan *plan, ExplainState *es)
  {
! 	ExplainTargetRel((Plan *) plan, plan->scanrelid, es);
  }
  
  /*
--- 2484,2493 ----
  static void
  ExplainScanTarget(Scan *plan, ExplainState *es)
  {
! 	if (plan->scanrelid > 0)
! 		ExplainTargetRel((Plan *) plan, plan->scanrelid, es);
! 	else
! 		ExplainTargetRels((Plan *) plan, es);
  }
  
  /*
***************
*** 2604,2609 **** ExplainTargetRel(Plan *plan, Index rti, ExplainState *es)
--- 2612,2691 ----
  }
  
  /*
+  * Show the target relations involved in a foreign join or custom join
+  */
+ static void
+ ExplainTargetRels(Plan *plan, ExplainState *es)
+ {
+ 	Bitmapset  *relids;
+ 	int			rti = -1;
+ 	bool		first = true;
+ 
+ 	if (IsA(plan, ForeignScan))
+ 		relids = ((ForeignScan *) plan)->fs_relids;
+ 	else if (IsA(plan, CustomScan))
+ 		relids = ((CustomScan *) plan)->custom_relids;
+ 	else
+ 		elog(ERROR, "unexpected scan node: %d", (int) nodeTag(plan));
+ 
+ 	ExplainOpenGroup("Target Tables", "Target Tables", false, es);
+ 
+ 	while ((rti = bms_next_member(relids, rti)) >= 0)
+ 	{
+ 		RangeTblEntry *rte;
+ 		char	   *objectname;
+ 		char	   *namespace = NULL;
+ 		char	   *refname;
+ 
+ 		Assert(rti > 0);
+ 		rte = rt_fetch(rti, es->rtable);
+ 		/* Assert it's on a real relation */
+ 		Assert(rte->rtekind == RTE_RELATION);
+ 		objectname = get_rel_name(rte->relid);
+ 		Assert(objectname != NULL);
+ 		if (es->verbose)
+ 			namespace = get_namespace_name(get_rel_namespace(rte->relid));
+ 		refname = (char *) list_nth(es->rtable_names, rti - 1);
+ 		if (refname == NULL)
+ 			refname = rte->eref->aliasname;
+ 
+ 		/* Open a group for this target */
+ 		ExplainOpenGroup("Target Table", NULL, true, es);
+ 
+ 		if (es->format == EXPLAIN_FORMAT_TEXT)
+ 		{
+ 			if (first)
+ 				appendStringInfoString(es->str, " on");
+ 			else
+ 				appendStringInfoString(es->str, ",");
+ 			first = false;
+ 
+ 			if (namespace != NULL)
+ 				appendStringInfo(es->str, " %s.%s",
+ 								 quote_identifier(namespace),
+ 								 quote_identifier(objectname));
+ 			else
+ 				appendStringInfo(es->str, " %s",
+ 								 quote_identifier(objectname));
+ 			if (strcmp(refname, objectname) != 0)
+ 				appendStringInfo(es->str, " %s", quote_identifier(refname));
+ 		}
+ 		else
+ 		{
+ 			ExplainPropertyText("Relation Name", objectname, es);
+ 			if (namespace != NULL)
+ 				ExplainPropertyText("Schema", namespace, es);
+ 			ExplainPropertyText("Alias", refname, es);
+ 		}
+ 
+ 		/* Close the group */
+ 		ExplainCloseGroup("Target Table", NULL, true, es);
+ 	}
+ 
+ 	ExplainCloseGroup("Target Tables", "Target Tables", false, es);
+ }
+ 
+ /*
   * Show extra information for a ModifyTable node
   *
   * We have three objectives here.  First, if there's more than one target
