aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2012-04-06 16:58:17 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2012-04-06 16:58:50 -0400
commit17b985b1a068e120feb05bb61be6328f4fef8090 (patch)
treed38993f94f21295761e59dfcba02c5a24860ef55 /src
parent6c41948c39288139cd9a592466cd373b6868bb55 (diff)
downloadpostgresql-17b985b1a068e120feb05bb61be6328f4fef8090.tar.gz
postgresql-17b985b1a068e120feb05bb61be6328f4fef8090.zip
Fix broken comparetup_datum code.
Commit 337b6f5ecf05b21b5e997986884d097d60e4e3d0 contained the entirely fanciful assumption that it had made comparetup_datum unreachable. Reported and patched by Takashi Yamamoto. Fix up some not terribly accurate/useful comments from that commit, too.
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/sort/tuplesort.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/backend/utils/sort/tuplesort.c b/src/backend/utils/sort/tuplesort.c
index d8e5d68d6ed..95489ac3f30 100644
--- a/src/backend/utils/sort/tuplesort.c
+++ b/src/backend/utils/sort/tuplesort.c
@@ -345,6 +345,12 @@ struct Tuplesortstate
SortSupport sortKeys; /* array of length nKeys */
/*
+ * This variable is shared by the single-key MinimalTuple case and the
+ * Datum case. Otherwise it's NULL.
+ */
+ SortSupport onlyKey;
+
+ /*
* These variables are specific to the CLUSTER case; they are set by
* tuplesort_begin_cluster. Note CLUSTER also uses tupDesc and
* indexScanKey.
@@ -365,9 +371,6 @@ struct Tuplesortstate
/* These are specific to the index_hash subcase: */
uint32 hash_mask; /* mask for sortable part of hash code */
- /* This is initialized when, and only when, there's just one key. */
- SortSupport onlyKey;
-
/*
* These variables are specific to the Datum case; they are set by
* tuplesort_begin_datum and used only by the DatumTuple routines.
@@ -497,7 +500,8 @@ static void reversedirection_datum(Tuplesortstate *state);
static void free_sort_tuple(Tuplesortstate *state, SortTuple *stup);
/*
- * Special version of qsort, just for SortTuple objects.
+ * Special versions of qsort just for SortTuple objects. We have one for the
+ * single-key case (qsort_ssup) and one for multi-key cases (qsort_tuple).
*/
#include "qsort_tuple.c"
@@ -1236,6 +1240,7 @@ tuplesort_performsort(Tuplesortstate *state)
*/
if (state->memtupcount > 1)
{
+ /* Can we use the single-key sort function? */
if (state->onlyKey != NULL)
qsort_ssup(state->memtuples, state->memtupcount,
state->onlyKey);
@@ -3061,7 +3066,6 @@ comparetup_index_btree(const SortTuple *a, const SortTuple *b,
* they *must* get compared at some stage of the sort --- otherwise the
* sort algorithm wouldn't have checked whether one must appear before the
* other.
- *
*/
if (state->enforceUnique && !equal_hasnull)
{
@@ -3243,9 +3247,9 @@ reversedirection_index_hash(Tuplesortstate *state)
static int
comparetup_datum(const SortTuple *a, const SortTuple *b, Tuplesortstate *state)
{
- /* Not currently needed */
- elog(ERROR, "comparetup_datum() should not be called");
- return 0;
+ return ApplySortComparator(a->datum1, a->isnull1,
+ b->datum1, b->isnull1,
+ state->onlyKey);
}
static void