mirror of
https://github.com/postgres/postgres.git
synced 2025-07-15 19:21:59 +03:00
Set scan direction appropriately for SubPlans (bug #15336)
When executing a SubPlan in an expression, the EState's direction
field was left alone, resulting in an attempt to execute the subplan
backwards if it was encountered during a backwards scan of a cursor.
Also, though much less likely, it was possible to reach the execution
of an InitPlan while in backwards-scan state.
Repair by saving/restoring estate->es_direction and forcing forward
scan mode in the relevant places.
Backpatch all the way, since this has been broken since 8.3 (prior to
commit c7ff7663e
, SubPlans had their own EStates rather than sharing
the parent plan's, so there was no confusion over scan direction).
Per bug #15336 reported by Vladimir Baranoff; analysis and patch by
me, review by Tom Lane.
Discussion: https://postgr.es/m/153449812167.1304.1741624125628126322@wrigleys.postgresql.org
This commit is contained in:
@ -1137,3 +1137,20 @@ select * from (select pk,c2 from sq_limit order by c1,pk) as x limit 3;
|
||||
|
||||
drop function explain_sq_limit();
|
||||
drop table sq_limit;
|
||||
--
|
||||
-- Ensure that backward scan direction isn't propagated into
|
||||
-- expression subqueries (bug #15336)
|
||||
--
|
||||
begin;
|
||||
declare c1 scroll cursor for
|
||||
select * from generate_series(1,4) i
|
||||
where i <> all (values (2),(3));
|
||||
move forward all in c1;
|
||||
fetch backward all in c1;
|
||||
i
|
||||
---
|
||||
4
|
||||
1
|
||||
(2 rows)
|
||||
|
||||
commit;
|
||||
|
@ -609,3 +609,19 @@ select * from (select pk,c2 from sq_limit order by c1,pk) as x limit 3;
|
||||
drop function explain_sq_limit();
|
||||
|
||||
drop table sq_limit;
|
||||
|
||||
--
|
||||
-- Ensure that backward scan direction isn't propagated into
|
||||
-- expression subqueries (bug #15336)
|
||||
--
|
||||
|
||||
begin;
|
||||
|
||||
declare c1 scroll cursor for
|
||||
select * from generate_series(1,4) i
|
||||
where i <> all (values (2),(3));
|
||||
|
||||
move forward all in c1;
|
||||
fetch backward all in c1;
|
||||
|
||||
commit;
|
||||
|
Reference in New Issue
Block a user