Fix YA incremental sort bug.
switchToPresortedPrefixMode() did the wrong thing if it detected a batch boundary just at the last tuple of a fullsort group. The initially-reported symptom was a "retrieved too many tuples in a bounded sort" error, but the test case added here just silently gives the wrong answer without this patch. I (tgl) am not really happy about committing this patch without review from the incremental-sort authors, but they seem AWOL and we are hard against a release deadline. This does demonstrably make some cases better, anyway. Per bug #16846 from Yoran Heling. Back-patch to v13 where incremental sort was introduced. Neil Chen Discussion: https://postgr.es/m/16846-ae49f51ac379a4cb@postgresql.org
This commit is contained in:
parent
57868d957e
commit
10fcb83da6
@ -394,6 +394,13 @@ switchToPresortedPrefixMode(PlanState *pstate)
|
||||
* current prefix key group.
|
||||
*/
|
||||
ExecClearTuple(node->group_pivot);
|
||||
|
||||
/*
|
||||
* Also make sure we take the didn't-consume-all-the-tuples
|
||||
* path below, even if this happened to be the last tuple of
|
||||
* the batch.
|
||||
*/
|
||||
lastTuple = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -675,6 +675,17 @@ select * from (select * from t order by a) s order by a, b limit 70;
|
||||
9 | 70
|
||||
(70 rows)
|
||||
|
||||
-- Checks case where we hit a group boundary at the last tuple of a batch.
|
||||
select * from (select * from t order by a) s order by a, b limit 5;
|
||||
a | b
|
||||
---+---
|
||||
1 | 1
|
||||
2 | 2
|
||||
3 | 3
|
||||
4 | 4
|
||||
9 | 5
|
||||
(5 rows)
|
||||
|
||||
-- Test rescan.
|
||||
begin;
|
||||
-- We force the planner to choose a plan with incremental sort on the right side
|
||||
|
@ -149,6 +149,9 @@ insert into t(a, b) select (case when i < 5 then i else 9 end), i from generate_
|
||||
analyze t;
|
||||
explain (costs off) select * from (select * from t order by a) s order by a, b limit 70;
|
||||
select * from (select * from t order by a) s order by a, b limit 70;
|
||||
-- Checks case where we hit a group boundary at the last tuple of a batch.
|
||||
select * from (select * from t order by a) s order by a, b limit 5;
|
||||
|
||||
-- Test rescan.
|
||||
begin;
|
||||
-- We force the planner to choose a plan with incremental sort on the right side
|
||||
|
Loading…
x
Reference in New Issue
Block a user