]> granicus.if.org Git - postgresql/commitdiff
Fix inadequately-tested code path in tuplesort_skiptuples().
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 24 Dec 2013 22:13:02 +0000 (17:13 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 24 Dec 2013 22:13:02 +0000 (17:13 -0500)
Per report from Jeff Davis.

src/backend/utils/sort/tuplesort.c

index 6221f6db7ed7bdfd1740185043983941317627c4..52f05e6d9ad8b4de676525bb5e67b0e4f9a41a81 100644 (file)
@@ -1725,6 +1725,8 @@ tuplesort_getdatum(Tuplesortstate *state, bool forward,
 bool
 tuplesort_skiptuples(Tuplesortstate *state, int64 ntuples, bool forward)
 {
+       MemoryContext oldcontext;
+
        /*
         * We don't actually support backwards skip yet, because no callers need
         * it.  The API is designed to allow for that later, though.
@@ -1760,6 +1762,7 @@ tuplesort_skiptuples(Tuplesortstate *state, int64 ntuples, bool forward)
                         * We could probably optimize these cases better, but for now it's
                         * not worth the trouble.
                         */
+                       oldcontext = MemoryContextSwitchTo(state->sortcontext);
                        while (ntuples-- > 0)
                        {
                                SortTuple       stup;
@@ -1767,11 +1770,15 @@ tuplesort_skiptuples(Tuplesortstate *state, int64 ntuples, bool forward)
 
                                if (!tuplesort_gettuple_common(state, forward,
                                                                                           &stup, &should_free))
+                               {
+                                       MemoryContextSwitchTo(oldcontext);
                                        return false;
-                               if (should_free)
+                               }
+                               if (should_free && stup.tuple)
                                        pfree(stup.tuple);
                                CHECK_FOR_INTERRUPTS();
                        }
+                       MemoryContextSwitchTo(oldcontext);
                        return true;
 
                default: