Fix broken comparetup_datum code.
authorTom Lane
Fri, 6 Apr 2012 20:58:17 +0000 (16:58 -0400)
committerTom Lane
Fri, 6 Apr 2012 20:58:50 +0000 (16:58 -0400)
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.

src/backend/utils/sort/tuplesort.c

index d8e5d68d6edb53b4076eaa7fcbd4f224d7b31309..95489ac3f3085f67b04a0d6ee45d860e5d7c4fcc 100644 (file)
@@ -344,6 +344,12 @@ struct Tuplesortstate
    TupleDesc   tupDesc;
    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
@@ -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