aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2012-03-20 21:00:11 -0400
committerRobert Haas <rhaas@postgresql.org>2012-03-20 21:26:39 -0400
commitaefa6d163e21391626c20a508af33373d6ba387e (patch)
tree53e0cb56a7c5dcbe721cd30eae64903d6908aed4
parent64c604898e812aa93c124c666e8709fff1b8dd26 (diff)
downloadpostgresql-aefa6d163e21391626c20a508af33373d6ba387e.tar.gz
postgresql-aefa6d163e21391626c20a508af33373d6ba387e.zip
Add some CHECK_FOR_INTERRUPTS() calls to the heap-sort call path.
I broke this in commit 337b6f5ecf05b21b5e997986884d097d60e4e3d0, which among other things arranged for quicksorts to CHECK_FOR_INTERRUPTS() slightly less frequently. Sadly, it also arranged for heapsorts to CHECK_FOR_INTERRUPTS() much less frequently. Repair.
-rw-r--r--src/backend/utils/sort/tuplesort.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c
index 10b19c0b21f..d8e5d68d6ed 100644
--- a/src/backend/utils/sort/tuplesort.c
+++ b/src/backend/utils/sort/tuplesort.c
@@ -1168,6 +1168,7 @@ puttuple_common(Tuplesortstate *state, SortTuple *tuple)
{
/* new tuple <= top of the heap, so we can discard it */
free_sort_tuple(state, tuple);
+ CHECK_FOR_INTERRUPTS();
}
else
{
@@ -2431,6 +2432,7 @@ make_bounded_heap(Tuplesortstate *state)
{
/* New tuple would just get thrown out, so skip it */
free_sort_tuple(state, &state->memtuples[i]);
+ CHECK_FOR_INTERRUPTS();
}
else
{
@@ -2518,6 +2520,8 @@ tuplesort_heap_insert(Tuplesortstate *state, SortTuple *tuple,
memtuples = state->memtuples;
Assert(state->memtupcount < state->memtupsize);
+ CHECK_FOR_INTERRUPTS();
+
/*
* Sift-up the new entry, per Knuth 5.2.3 exercise 16. Note that Knuth is
* using 1-based array indexes, not 0-based.
@@ -2549,6 +2553,9 @@ tuplesort_heap_siftup(Tuplesortstate *state, bool checkIndex)
if (--state->memtupcount <= 0)
return;
+
+ CHECK_FOR_INTERRUPTS();
+
n = state->memtupcount;
tuple = &memtuples[n]; /* tuple that must be reinserted */
i = 0; /* i is where the "hole" is */