aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2006-03-04 19:05:06 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2006-03-04 19:05:06 +0000
commit80cadb303ce035a291a1b7441adb59073a9529c0 (patch)
treef3709e3337c31f2fddd2e411124852cc513ca90a /src
parentb3d0442ab3d6ebcf9d97c6e01cae0ba387209f0d (diff)
downloadpostgresql-80cadb303ce035a291a1b7441adb59073a9529c0.tar.gz
postgresql-80cadb303ce035a291a1b7441adb59073a9529c0.zip
Prevent sorting from requesting a SortTuple array that exceeds MaxAllocSize;
we'll go over to disk-based sort if we reach that limit. This fixes Stefan Kaltenbrunner's observation that sorting can suffer an 'invalid memory alloc request size' failure when sort_mem is set large enough. It's unfortunately not so easy to fix in 8.1 ...
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/sort/tuplesort.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c
index 0f680d0e2c6..aa8660ff184 100644
--- a/src/backend/utils/sort/tuplesort.c
+++ b/src/backend/utils/sort/tuplesort.c
@@ -91,7 +91,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/sort/tuplesort.c,v 1.60 2006/02/26 22:58:12 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/sort/tuplesort.c,v 1.61 2006/03/04 19:05:06 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -741,6 +741,13 @@ grow_memtuples(Tuplesortstate *state)
*/
if (state->availMem <= (long) (state->memtupsize * sizeof(SortTuple)))
return false;
+ /*
+ * On a 64-bit machine, allowedMem could be high enough to get us into
+ * trouble with MaxAllocSize, too.
+ */
+ if ((Size) (state->memtupsize * 2) >= MaxAllocSize / sizeof(SortTuple))
+ return false;
+
FREEMEM(state, GetMemoryChunkSpace(state->memtuples));
state->memtupsize *= 2;
state->memtuples = (SortTuple *)