From bdcf020d6b0708901949476d5ce59622979d566c Mon Sep 17 00:00:00 2001 From: Ashutosh Bapat Date: Wed, 8 Feb 2017 14:42:15 +0530 Subject: [PATCH 11/14] Use IS_JOIN_REL() instead of RELOPT_JOINREL FDW code uses RELOPT_JOINREL to check whether a given relation is a join or not. Partition-wise joins create child-join relations, which are marked as RELOPT_OTHER_JOINREL. Macro IS_JOIN_REL() returns true for both of those kinds, replace RELOPT_JOINREL tests with IS_JOIN_REL() test. Similarly replace RELOPT_OTHER_MEMBER_REL test with IS_OTHER_REL() where we want to test for child relations of all kinds. --- contrib/postgres_fdw/deparse.c | 10 +++++----- contrib/postgres_fdw/postgres_fdw.c | 10 ++++++---- src/backend/foreign/foreign.c | 6 +++--- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/contrib/postgres_fdw/deparse.c b/contrib/postgres_fdw/deparse.c index d2b94aa..a2171d7 100644 --- a/contrib/postgres_fdw/deparse.c +++ b/contrib/postgres_fdw/deparse.c @@ -911,7 +911,7 @@ deparseSelectStmtForRel(StringInfo buf, PlannerInfo *root, RelOptInfo *rel, * We handle relations for foreign tables, joins between those and upper * relations. */ - Assert(rel->reloptkind == RELOPT_JOINREL || + Assert(IS_JOIN_REL(rel) || rel->reloptkind == RELOPT_BASEREL || rel->reloptkind == RELOPT_OTHER_MEMBER_REL || rel->reloptkind == RELOPT_UPPER_REL); @@ -990,7 +990,7 @@ deparseSelectSql(List *tlist, List **retrieved_attrs, deparse_expr_cxt *context) */ appendStringInfoString(buf, "SELECT "); - if (foreignrel->reloptkind == RELOPT_JOINREL || + if (IS_JOIN_REL(foreignrel) || foreignrel->reloptkind == RELOPT_UPPER_REL) { /* For a join relation use the input tlist */ @@ -1030,7 +1030,7 @@ deparseFromExpr(List *quals, deparse_expr_cxt *context) /* For upper relations, scanrel must be either a joinrel or a baserel */ Assert(context->foreignrel->reloptkind != RELOPT_UPPER_REL || - scanrel->reloptkind == RELOPT_JOINREL || + IS_JOIN_REL(scanrel) || scanrel->reloptkind == RELOPT_BASEREL); /* Construct FROM clause */ @@ -1178,7 +1178,7 @@ deparseLockingClause(deparse_expr_cxt *context) appendStringInfoString(buf, " FOR UPDATE"); /* Add the relation alias if we are here for a join relation */ - if (rel->reloptkind == RELOPT_JOINREL) + if (IS_JOIN_REL(rel)) appendStringInfo(buf, " OF %s%d", REL_ALIAS_PREFIX, relid); } else @@ -1342,7 +1342,7 @@ deparseFromExprForRel(StringInfo buf, PlannerInfo *root, RelOptInfo *foreignrel, { PgFdwRelationInfo *fpinfo = (PgFdwRelationInfo *) foreignrel->fdw_private; - if (foreignrel->reloptkind == RELOPT_JOINREL) + if (IS_JOIN_REL(foreignrel)) { RelOptInfo *rel_o = fpinfo->outerrel; RelOptInfo *rel_i = fpinfo->innerrel; diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c index 5d270b9..2487f26 100644 --- a/contrib/postgres_fdw/postgres_fdw.c +++ b/contrib/postgres_fdw/postgres_fdw.c @@ -723,6 +723,8 @@ get_useful_ecs_for_relation(PlannerInfo *root, RelOptInfo *rel) /* If this is a child rel, we must use the topmost parent rel to search. */ if (rel->reloptkind == RELOPT_OTHER_MEMBER_REL) relids = find_childrel_top_parent(root, rel)->relids; + else if (rel->reloptkind == RELOPT_OTHER_JOINREL) + relids = rel->top_parent_relids; else relids = rel->relids; @@ -1181,7 +1183,7 @@ postgresGetForeignPlan(PlannerInfo *root, local_exprs = lappend(local_exprs, rinfo->clause); } - if (foreignrel->reloptkind == RELOPT_JOINREL || + if (IS_JOIN_REL(foreignrel) || foreignrel->reloptkind == RELOPT_UPPER_REL) { /* For a join relation, get the conditions from fdw_private structure */ @@ -1247,7 +1249,7 @@ postgresGetForeignPlan(PlannerInfo *root, remote_conds, retrieved_attrs, makeInteger(fpinfo->fetch_size)); - if (foreignrel->reloptkind == RELOPT_JOINREL || + if (IS_JOIN_REL(foreignrel) || foreignrel->reloptkind == RELOPT_UPPER_REL) fdw_private = lappend(fdw_private, makeString(fpinfo->relation_name->data)); @@ -2527,7 +2529,7 @@ estimate_path_cost_size(PlannerInfo *root, &remote_param_join_conds, &local_param_join_conds); /* Build the list of columns to be fetched from the foreign server. */ - if (foreignrel->reloptkind == RELOPT_JOINREL || + if (IS_JOIN_REL(foreignrel) || foreignrel->reloptkind == RELOPT_UPPER_REL) fdw_scan_tlist = build_tlist_to_deparse(foreignrel); else @@ -2609,7 +2611,7 @@ estimate_path_cost_size(PlannerInfo *root, startup_cost = fpinfo->rel_startup_cost; run_cost = fpinfo->rel_total_cost - fpinfo->rel_startup_cost; } - else if (foreignrel->reloptkind == RELOPT_JOINREL) + else if (IS_JOIN_REL(foreignrel)) { PgFdwRelationInfo *fpinfo_i; PgFdwRelationInfo *fpinfo_o; diff --git a/src/backend/foreign/foreign.c b/src/backend/foreign/foreign.c index fdb4f71..e8ca7df 100644 --- a/src/backend/foreign/foreign.c +++ b/src/backend/foreign/foreign.c @@ -717,7 +717,7 @@ GetExistingLocalJoinPath(RelOptInfo *joinrel) { ListCell *lc; - Assert(joinrel->reloptkind == RELOPT_JOINREL); + Assert(IS_JOIN_REL(joinrel)); foreach(lc, joinrel->pathlist) { @@ -782,7 +782,7 @@ GetExistingLocalJoinPath(RelOptInfo *joinrel) ForeignPath *foreign_path; foreign_path = (ForeignPath *) joinpath->outerjoinpath; - if (foreign_path->path.parent->reloptkind == RELOPT_JOINREL) + if (IS_JOIN_REL(foreign_path->path.parent)) joinpath->outerjoinpath = foreign_path->fdw_outerpath; } @@ -791,7 +791,7 @@ GetExistingLocalJoinPath(RelOptInfo *joinrel) ForeignPath *foreign_path; foreign_path = (ForeignPath *) joinpath->innerjoinpath; - if (foreign_path->path.parent->reloptkind == RELOPT_JOINREL) + if (IS_JOIN_REL(foreign_path->path.parent)) joinpath->innerjoinpath = foreign_path->fdw_outerpath; } -- 1.7.9.5