diff options
-rw-r--r-- | src/backend/optimizer/plan/analyzejoins.c | 9 | ||||
-rw-r--r-- | src/backend/optimizer/plan/setrefs.c | 4 |
2 files changed, 10 insertions, 3 deletions
diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c index 15e82351639..2a3dea88a94 100644 --- a/src/backend/optimizer/plan/analyzejoins.c +++ b/src/backend/optimizer/plan/analyzejoins.c @@ -631,6 +631,7 @@ remove_leftjoinrel_from_query(PlannerInfo *root, int relid, * remove_join_clause_from_rels will touch it.) */ root->simple_rel_array[relid] = NULL; + root->simple_rte_array[relid] = NULL; /* And nuke the RelOptInfo, just in case there's another access path */ pfree(rel); @@ -1978,10 +1979,12 @@ remove_self_join_rel(PlannerInfo *root, PlanRowMark *kmark, PlanRowMark *rmark, * remove_join_clause_from_rels will touch it.) */ root->simple_rel_array[toRemove->relid] = NULL; + root->simple_rte_array[toRemove->relid] = NULL; /* And nuke the RelOptInfo, just in case there's another access path. */ pfree(toRemove); + /* * Now repeat construction of attr_needed bits coming from all other * sources. @@ -2193,12 +2196,12 @@ remove_self_joins_one_group(PlannerInfo *root, Relids relids) { PlanRowMark *rowMark = (PlanRowMark *) lfirst(lc); - if (rowMark->rti == k) + if (rowMark->rti == r) { Assert(rmark == NULL); rmark = rowMark; } - else if (rowMark->rti == r) + else if (rowMark->rti == k) { Assert(kmark == NULL); kmark = rowMark; @@ -2253,7 +2256,7 @@ remove_self_joins_one_group(PlannerInfo *root, Relids relids) selfjoinquals = list_concat(selfjoinquals, krel->baserestrictinfo); /* - * Determine if the rrel can duplicate outer rows. We must bypass + * Determine if the rrel can duplicate outer rows. We must bypass * the unique rel cache here since we're possibly using a subset * of join quals. We can use 'force_cache' == true when all join * quals are self-join quals. Otherwise, we could end up putting diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 846e44186c3..d706546f332 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -307,6 +307,10 @@ set_plan_references(PlannerInfo *root, Plan *plan) PlanRowMark *rc = lfirst_node(PlanRowMark, lc); PlanRowMark *newrc; + /* sanity check on existing row marks */ + Assert(root->simple_rel_array[rc->rti] != NULL && + root->simple_rte_array[rc->rti] != NULL); + /* flat copy is enough since all fields are scalars */ newrc = (PlanRowMark *) palloc(sizeof(PlanRowMark)); memcpy(newrc, rc, sizeof(PlanRowMark)); |