03d40e4b5 allowed dummy UNION [ALL] children to be removed from the plan
by checking for is_dummy_rel(). That commit neglected to still account
for the relids from the dummy rel so that the correct UPPERREL_SETOP
RelOptInfo could be found and used for adding the Paths to.
Not doing this could result in processing of subsequent UNIONs using the
same RelOptInfo as a previously processed UNION, which could result in
add_path() freeing old Paths that are needed by the previous UNION.
The same fix was independently submitted (2 mins later) by Richard Guo.
Reported-by: Alexander Lakhin <[email protected]>
Author: David Rowley <
[email protected]>
Discussion: https://postgr.es/m/
bee34aec-659c-46f1-9ab7-
7bbae0b7616c@gmail.com
RelOptInfo *rel = lfirst(lc);
Path *ordered_path;
+ /*
+ * Record the relids so that we can identify the correct
+ * UPPERREL_SETOP RelOptInfo below.
+ */
+ relids = bms_add_members(relids, rel->relids);
+
/* Skip any UNION children that are proven not to yield any rows */
if (is_dummy_rel(rel))
continue;
partial_pathlist = lappend(partial_pathlist,
linitial(rel->partial_pathlist));
}
-
- relids = bms_add_members(relids, rel->relids);
}
/* Build result relation. */
UNION
SELECT ten FROM tenk1 WHERE 1=2
ORDER BY 1;
- QUERY PLAN
---------------------------------------
+ QUERY PLAN
+-----------------------------------------------------------------------------------------
Sort
Output: unnamed_subquery.two
Sort Key: unnamed_subquery.two
-> Result
Output: unnamed_subquery.two
- Replaces: Aggregate
+ Replaces: Aggregate on unnamed_subquery, unnamed_subquery_1, unnamed_subquery_2
One-Time Filter: false
(7 rows)