Skip to content

Commit 2720e96

Browse files
committed
Fix handling of sortKeys field in Tuplesortstate.
Commit 5cefbf5 introduced an assumption that this field would always be non-NULL when doing a merge pass, but that's not true. Without this fix, you can crash the server by building a hash index that is sufficiently large relative to maintenance_work_mem, or by triggering a large datum sort. Commit 5ea86e6 changed the comments for that field to say that it would be set in all cases except for the hash index case, but that wasn't (and still isn't) true. The datum-sort failure was spotted by Tomas Vondra; initial analysis of that failure was by Peter Geoghegan. The remaining issues were spotted by me during review of the surrounding code, and the patch is all my fault.
1 parent f1fd515 commit 2720e96

File tree

1 file changed

+5
-5
lines changed

1 file changed

+5
-5
lines changed

src/backend/utils/sort/tuplesort.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -336,9 +336,9 @@ struct Tuplesortstate
336336
bool markpos_eof; /* saved "eof_reached" */
337337

338338
/*
339-
* The sortKeys variable is used by every case other than the hash index
340-
* case; it is set by tuplesort_begin_xxx. tupDesc is only used by the
341-
* MinimalTuple and CLUSTER routines, though.
339+
* The sortKeys variable is used by every case other than the datum and
340+
* hash index cases; it is set by tuplesort_begin_xxx. tupDesc is only
341+
* used by the MinimalTuple and CLUSTER routines, though.
342342
*/
343343
TupleDesc tupDesc;
344344
SortSupport sortKeys; /* array of length nKeys */
@@ -1246,7 +1246,7 @@ tuplesort_putindextuplevalues(Tuplesortstate *state, Relation rel,
12461246
RelationGetDescr(state->indexRel),
12471247
&stup.isnull1);
12481248

1249-
if (!state->sortKeys->abbrev_converter || stup.isnull1)
1249+
if (!state->sortKeys || !state->sortKeys->abbrev_converter || stup.isnull1)
12501250
{
12511251
/*
12521252
* Store ordinary Datum representation, or NULL value. If there is a
@@ -2172,7 +2172,7 @@ mergeruns(Tuplesortstate *state)
21722172
return;
21732173
}
21742174

2175-
if (state->sortKeys->abbrev_converter)
2175+
if (state->sortKeys != NULL && state->sortKeys->abbrev_converter != NULL)
21762176
{
21772177
/*
21782178
* If there are multiple runs to be merged, when we go to read back

0 commit comments

Comments
 (0)