partial-sort-4-resetdiff.patch
text/x-patch
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/executor/nodeSort.c | 0 | 0 |
| src/backend/utils/sort/tuplesort.c | 0 | 0 |
| src/include/utils/tuplesort.h | 0 | 0 |
diff --git a/src/backend/executor/nodeSort.c b/src/backend/executor/nodeSort.c
new file mode 100644
index 02dcd7a..c25ed7d
*** a/src/backend/executor/nodeSort.c
--- b/src/backend/executor/nodeSort.c
*************** ExecSort(SortState *node)
*** 120,137 ****
tupDesc = ExecGetResultType(outerNode);
if (node->tuplesortstate != NULL)
! tuplesort_end((Tuplesortstate *) node->tuplesortstate);
! tuplesortstate = tuplesort_begin_heap(tupDesc,
! plannode->numCols,
! plannode->sortColIdx,
! plannode->sortOperators,
! plannode->collations,
! plannode->nullsFirst,
! work_mem,
! node->randomAccess);
! if (node->bounded)
! tuplesort_set_bound(tuplesortstate, node->bound);
! node->tuplesortstate = (void *) tuplesortstate;
/*
* Put next group of tuples where skipCols" sort values are equal to
--- 120,140 ----
tupDesc = ExecGetResultType(outerNode);
if (node->tuplesortstate != NULL)
! tuplesort_reset((Tuplesortstate *) node->tuplesortstate);
! else
! {
! tuplesortstate = tuplesort_begin_heap(tupDesc,
! plannode->numCols,
! plannode->sortColIdx,
! plannode->sortOperators,
! plannode->collations,
! plannode->nullsFirst,
! work_mem,
! node->randomAccess);
! if (node->bounded)
! tuplesort_set_bound(tuplesortstate, node->bound);
! node->tuplesortstate = (void *) tuplesortstate;
! }
/*
* Put next group of tuples where skipCols" sort values are equal to
diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c
new file mode 100644
index 6a09138..8983251
*** a/src/backend/utils/sort/tuplesort.c
--- b/src/backend/utils/sort/tuplesort.c
*************** tuplesort_end(Tuplesortstate *state)
*** 960,965 ****
--- 960,984 ----
MemoryContextDelete(state->sortcontext);
}
+ void
+ tuplesort_reset(Tuplesortstate *state)
+ {
+ int i;
+
+ if (state->tapeset)
+ LogicalTapeSetClose(state->tapeset);
+
+ for (i = 0; i < state->memtupcount; i++)
+ free_sort_tuple(state, state->memtuples + i);
+
+ state->status = TSS_INITIAL;
+ state->memtupcount = 0;
+ state->boundUsed = false;
+ state->tapeset = NULL;
+ state->currentRun = 0;
+ state->result_tape = -1;
+ }
+
/*
* Grow the memtuples[] array, if possible within our memory constraint. We
* must not exceed INT_MAX tuples in memory or the caller-provided memory
diff --git a/src/include/utils/tuplesort.h b/src/include/utils/tuplesort.h
new file mode 100644
index 5a65cd2..d5bc45e
*** a/src/include/utils/tuplesort.h
--- b/src/include/utils/tuplesort.h
*************** extern bool tuplesort_skiptuples(Tupleso
*** 105,110 ****
--- 105,112 ----
extern void tuplesort_end(Tuplesortstate *state);
+ extern void tuplesort_reset(Tuplesortstate *state);
+
extern void tuplesort_get_stats(Tuplesortstate *state,
const char **sortMethod,
const char **spaceType,