aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2013-03-31 18:32:54 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2013-03-31 18:34:15 -0400
commitd931ac0ec4c25b61f480562a13f1974f913afd59 (patch)
tree8d31f2eb629f9172ef697ee89230340feec9ac6d
parent64f890905f3a5186bc4df980c8becfda5c39c2ea (diff)
downloadpostgresql-d931ac0ec4c25b61f480562a13f1974f913afd59.tar.gz
postgresql-d931ac0ec4c25b61f480562a13f1974f913afd59.zip
Ignore extra subquery outputs in set_subquery_size_estimates().
In commit 0f61d4dd1b4f95832dcd81c9688dac56fd6b5687, I added code to copy up column width estimates for each column of a subquery. That code supposed that the subquery couldn't have any output columns that didn't correspond to known columns of the current query level --- which is true when a query is parsed from scratch, but the assumption fails when planning a view that depends on another view that's been redefined (adding output columns) since the upper view was made. This results in an assertion failure or even a crash, as per bug #8025 from lindebg. Remove the Assert and instead skip the column if its resno is out of the expected range.
-rw-r--r--src/backend/optimizer/path/costsize.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c
index 5654c13d4f3..8d2490208d4 100644
--- a/src/backend/optimizer/path/costsize.c
+++ b/src/backend/optimizer/path/costsize.c
@@ -3742,6 +3742,15 @@ set_subquery_size_estimates(PlannerInfo *root, RelOptInfo *rel)
continue;
/*
+ * The subquery could be an expansion of a view that's had columns
+ * added to it since the current query was parsed, so that there are
+ * non-junk tlist columns in it that don't correspond to any column
+ * visible at our query level. Ignore such columns.
+ */
+ if (te->resno < rel->min_attr || te->resno > rel->max_attr)
+ continue;
+
+ /*
* XXX This currently doesn't work for subqueries containing set
* operations, because the Vars in their tlists are bogus references
* to the first leaf subquery, which wouldn't give the right answer
@@ -3762,7 +3771,6 @@ set_subquery_size_estimates(PlannerInfo *root, RelOptInfo *rel)
item_width = subrel->attr_widths[var->varattno - subrel->min_attr];
}
- Assert(te->resno >= rel->min_attr && te->resno <= rel->max_attr);
rel->attr_widths[te->resno - rel->min_attr] = item_width;
}