partial-sort-4-resetdiff.patch

text/x-patch

Filename: partial-sort-4-resetdiff.patch
Type: text/x-patch
Part: 1
Message: Re: PoC: Partial sort

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,