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
* 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;
}
}
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
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