diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2013-03-31 18:33:01 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2013-03-31 18:34:31 -0400 |
commit | 0044f456d909b12f6bea2fff4d48fc0848b1b54b (patch) | |
tree | 3c6f6300ee7d58f46ad576ce2f37502c2466746e | |
parent | 4d001c3540f8dfe45f294d7990f167e8038d0cd0 (diff) |
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.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c index 875c611ab50..f5d76b29e69 100644 --- a/src/backend/optimizer/path/costsize.c +++ b/src/backend/optimizer/path/costsize.c @@ -3701,6 +3701,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 @@ -3721,7 +3730,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; } |