Hi, Here is the comments for foreign_join_ok in postgres_fdw.c:
/* * Assess whether the join between inner and outer relations can be pushed down * to the foreign server. As a side effect, save information we obtain in this * function to PgFdwRelationInfo passed in. * * Joins that satisfy conditions below are safe to push down. * * 1) Join type is INNER or OUTER (one of LEFT/RIGHT/FULL) * 2) Both outer and inner portions are safe to push-down * 3) All foreign tables in the join belong to the same foreign server and use * the same user mapping. * 4) All join conditions are safe to push down * 5) No relation has local filter (this can be relaxed for INNER JOIN, if we * can move unpushable clauses upwards in the join tree). */ The condition 3 is now checked by the core, so I'd like to remove that condition from the above comments. In addition, I'd like to update some related comments in src/include/nodes/relation.h and src/backend/optimizer/path/joinpath.c. Attached is a patch for that. Best regards, Etsuro Fujita
*** a/contrib/postgres_fdw/postgres_fdw.c --- b/contrib/postgres_fdw/postgres_fdw.c *************** *** 3345,3354 **** postgresImportForeignSchema(ImportForeignSchemaStmt *stmt, Oid serverOid) * * 1) Join type is INNER or OUTER (one of LEFT/RIGHT/FULL) * 2) Both outer and inner portions are safe to push-down ! * 3) All foreign tables in the join belong to the same foreign server and use ! * the same user mapping. ! * 4) All join conditions are safe to push down ! * 5) No relation has local filter (this can be relaxed for INNER JOIN, if we * can move unpushable clauses upwards in the join tree). */ static bool --- 3345,3352 ---- * * 1) Join type is INNER or OUTER (one of LEFT/RIGHT/FULL) * 2) Both outer and inner portions are safe to push-down ! * 3) All join conditions are safe to push down ! * 4) No relation has local filter (this can be relaxed for INNER JOIN, if we * can move unpushable clauses upwards in the join tree). */ static bool *** a/src/backend/optimizer/path/joinpath.c --- b/src/backend/optimizer/path/joinpath.c *************** *** 213,219 **** add_paths_to_joinrel(PlannerInfo *root, /* * 5. If inner and outer relations are foreign tables (or joins) belonging ! * to the same server, give the FDW a chance to push down joins. */ if (joinrel->fdwroutine && joinrel->fdwroutine->GetForeignJoinPaths) --- 213,220 ---- /* * 5. If inner and outer relations are foreign tables (or joins) belonging ! * to the same server and using the same user mapping, give the FDW a ! * chance to push down joins. */ if (joinrel->fdwroutine && joinrel->fdwroutine->GetForeignJoinPaths) *** a/src/include/nodes/relation.h --- b/src/include/nodes/relation.h *************** *** 416,421 **** typedef struct PlannerInfo --- 416,422 ---- * all belong to the same foreign server, these fields will be set: * * serverid - OID of foreign server, if foreign table (else InvalidOid) + * umid - OID of user mapping, if foreign table (else InvalidOid) * fdwroutine - function hooks for FDW, if foreign table (else NULL) * fdw_private - private state for FDW, if foreign table (else NULL) *
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers