mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-16 11:26:59 +08:00
Improve planner's handling of SetOp plans.
Remove the code for inserting flag columns in the inputs of a SetOp. That was the only reason why there would be resjunk columns in a set-operations plan tree, so we can get rid of some code that supported that, too. Get rid of choose_hashed_setop() in favor of building Paths for the hashed and sorted alternatives, and letting them fight it out within add_path(). Remove set_operation_ordered_results_useful(), which was giving wrong answers due to examining the wrong ancestor node: we need to examine the immediate SetOperationStmt parent not the topmost node. Instead make each caller of recurse_set_operations() pass down the relevant parent node. (This thinko seems to have led only to wasted planning cycles and possibly-inferior plans, not wrong query answers. Perhaps we should back-patch it, but I'm not doing so right now.) Teach generate_nonunion_paths() to consider pre-sorted inputs for sorted SetOps, rather than always generating a Sort node. Patch by me; thanks to Richard Guo and David Rowley for review. Discussion: https://postgr.es/m/1850138.1731549611@sss.pgh.pa.us
This commit is contained in:
@ -638,8 +638,11 @@ select sum(ss.tst::int) from
|
||||
where o.ten = 0;
|
||||
|
||||
--
|
||||
-- Test rescan of a SetOp node
|
||||
-- Test rescan of a hashed SetOp node
|
||||
--
|
||||
begin;
|
||||
set local enable_sort = off;
|
||||
|
||||
explain (costs off)
|
||||
select count(*) from
|
||||
onek o cross join lateral (
|
||||
@ -657,6 +660,33 @@ select count(*) from
|
||||
) ss
|
||||
where o.ten = 1;
|
||||
|
||||
rollback;
|
||||
|
||||
--
|
||||
-- Test rescan of a sorted SetOp node
|
||||
--
|
||||
begin;
|
||||
set local enable_hashagg = off;
|
||||
|
||||
explain (costs off)
|
||||
select count(*) from
|
||||
onek o cross join lateral (
|
||||
select * from onek i1 where i1.unique1 = o.unique1
|
||||
except
|
||||
select * from onek i2 where i2.unique1 = o.unique2
|
||||
) ss
|
||||
where o.ten = 1;
|
||||
|
||||
select count(*) from
|
||||
onek o cross join lateral (
|
||||
select * from onek i1 where i1.unique1 = o.unique1
|
||||
except
|
||||
select * from onek i2 where i2.unique1 = o.unique2
|
||||
) ss
|
||||
where o.ten = 1;
|
||||
|
||||
rollback;
|
||||
|
||||
--
|
||||
-- Test rescan of a RecursiveUnion node
|
||||
--
|
||||
|
||||
Reference in New Issue
Block a user