0001-fix-tuplestore-corruption-15.patch

text/x-diff

Filename: 0001-fix-tuplestore-corruption-15.patch
Type: text/x-diff
Part: 0
Message: Re: BUG #19438: segfault with temp_file_limit inside cursor

Patch

Format: unified
Series: patch 0001
File+
src/backend/utils/sort/tuplestore.c 11 0
diff --git a/src/backend/utils/sort/tuplestore.c b/src/backend/utils/sort/tuplestore.c
index f605ece721e..f12e8d23a9c 100644
--- a/src/backend/utils/sort/tuplestore.c
+++ b/src/backend/utils/sort/tuplestore.c
@@ -1221,6 +1221,17 @@ dumptuples(Tuplestorestate *state)
 		if (i >= state->memtupcount)
 			break;
 		WRITETUP(state, state->memtuples[i]);
+
+		/*
+		 * Increase memtupdeleted to track the fact that we just deleted that
+		 * tuple.  Think not to remove this on the grounds that we'll reset
+		 * memtupdeleted to zero below.  We might not get there, if some later
+		 * WRITETUP fails (e.g. due to overrunning temp_file_limit).  If so,
+		 * we'd error out leaving an effectively-corrupt tuplestore, which
+		 * would be quite bad if it's a persistent data structure such as a
+		 * Portal's holdStore.
+		 */
+		state->memtupdeleted++;
 	}
 	state->memtupdeleted = 0;
 	state->memtupcount = 0;