While digging into the incremental sort patch, I noticed in
tuplesort.c at the beginning of the function in $SUBJECT we have this
comment and assertion:
tuplesort_set_bound(Tuplesortstate *state, int64 bound)
{
/* Assert we're called before loading any tuples */
Assert(state->status == TSS_INITIAL);
But AFAICT from reading the code in puttuple_common the state remains
TSS_INITIAL while tuples are inserted (unless we reach a point where
we decide to transition it to TSS_BOUNDED or TSS_BUILDRUNS).
Therefore it's not true that the assertion guards against having
loaded any tuples; rather it guarantees that we remain in standard
memory quicksort mode.
Assuming my understanding is correct, I've attached a small patch to
update the comment to "Assert we're still in memory quicksort mode and
haven't transitioned to heap or tape mode".
Note: this also means the function header comment "Must be called
before inserting any tuples" is a condition that isn't actually
validated, but I think that's fine given it's not a new problem and
even more so since the same comment goes on to say that that's
probably not a strict requirement.
James Coleman
commit bd185bbac4275299a587eae67eae58f856052a93
Author: jcoleman <[email protected]>
Date: Sun Jun 23 19:13:09 2019 +0000
Correct assertion comment in tuplesort_set_bound
The implementation of puttuple_common keeps the state TSS_INITIAL
while tuples are inserted unless we reach a point where we decide
to transition to a different mode and set the state to TSS_BOUNDED
or TSS_BUILDRUNS.
Therefore it's not true that the assertion guards against having loaded
any tuples; rather it guarantees that we remain in standard memory
quicksort mode.
diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c
index 7b8e67899e..c108bd4513 100644
--- a/src/backend/utils/sort/tuplesort.c
+++ b/src/backend/utils/sort/tuplesort.c
@@ -1185,7 +1185,9 @@ tuplesort_begin_datum(Oid datumType, Oid sortOperator, Oid sortCollation,
void
tuplesort_set_bound(Tuplesortstate *state, int64 bound)
{
- /* Assert we're called before loading any tuples */
+ /*
+ * Assert we're still in memory quicksort mode and haven't transitioned to
+ * heap or tape mode. */
Assert(state->status == TSS_INITIAL);
Assert(state->memtupcount == 0);
Assert(!state->bounded);