summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/optimizer/plan/analyzejoins.c9
-rw-r--r--src/backend/optimizer/plan/setrefs.c4
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));