Add some CHECK_FOR_INTERRUPTS() calls to the heap-sort call path.
authorRobert Haas
Wed, 21 Mar 2012 01:00:11 +0000 (21:00 -0400)
committerRobert Haas
Wed, 21 Mar 2012 01:26:39 +0000 (21:26 -0400)
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.

src/backend/utils/sort/tuplesort.c

index 10b19c0b21f526effe6d2cad73b25f90046f9cc2..d8e5d68d6edb53b4076eaa7fcbd4f224d7b31309 100644 (file)
@@ -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 */