Repair brain fade in commit b181a91981203f6ec9403115a2917bd3f9473707.
authorRobert Haas <rhaas@postgresql.org>
Thu, 22 Jan 2015 17:47:46 +0000 (12:47 -0500)
committerRobert Haas <rhaas@postgresql.org>
Thu, 22 Jan 2015 17:51:20 +0000 (12:51 -0500)
The split between which things need to happen in the C-locale case and
which needed to happen in the locale-aware case was a few bricks short
of a load.  Try to fix that.

src/backend/utils/adt/varlena.c

index f26a77cf2936c413e87398614c3939b195d5313e..c79b6413916ce1630250db6658f0d03c90c7ea20 100644 (file)
@@ -1998,12 +1998,12 @@ bttext_abbrev_convert(Datum original, SortSupport ssup)
 {
        TextSortSupport    *tss = (TextSortSupport *) ssup->ssup_extra;
        text                       *authoritative = DatumGetTextPP(original);
+       char                       *authoritative_data = VARDATA_ANY(authoritative);
 
        /* working state */
        Datum                           res;
        char                       *pres;
        int                                     len;
-       Size                            bsize;
        uint32                          hash;
 
        /*
@@ -2017,14 +2017,16 @@ bttext_abbrev_convert(Datum original, SortSupport ssup)
 
        /*
         * If we're using the C collation, use memcmp(), rather than strxfrm(),
-        * to abbreviated keys.  The full comparator for the C locale is always
+        * to abbreviate keys.  The full comparator for the C locale is always
         * memcmp(), and we can't risk having this give a different answer.
         * Besides, this should be faster, too.
         */
        if (tss->collate_c)
-               memcpy(pres, VARDATA_ANY(authoritative), Min(len, sizeof(Datum)));
+               memcpy(pres, authoritative_data, Min(len, sizeof(Datum)));
        else
        {
+               Size                    bsize;
+
                /*
                 * We're not using the C collation, so fall back on strxfrm.
                 */
@@ -2067,6 +2069,14 @@ bttext_abbrev_convert(Datum original, SortSupport ssup)
                                                           Min(tss->buflen2 * 2, MaxAllocSize));
                        tss->buf2 = palloc(tss->buflen2);
                }
+
+               /*
+                * Every Datum byte is always compared.  This is safe because the
+                * strxfrm() blob is itself NUL terminated, leaving no danger of
+                * misinterpreting any NUL bytes not intended to be interpreted as
+                * logically representing termination.
+                */
+               memcpy(pres, tss->buf2, Min(sizeof(Datum), bsize));
        }
 
        /*
@@ -2080,15 +2090,14 @@ bttext_abbrev_convert(Datum original, SortSupport ssup)
         * in order to compensate for cases where differences are past
         * CACHE_LINE_SIZE bytes, so as to limit the overhead of hashing.
         */
-       hash = hash_any((unsigned char *) tss->buf1, Min(len, PG_CACHE_LINE_SIZE));
+       hash = hash_any((unsigned char *) authoritative_data,
+                                       Min(len, PG_CACHE_LINE_SIZE));
 
        if (len > PG_CACHE_LINE_SIZE)
                hash ^= DatumGetUInt32(hash_uint32((uint32) len));
 
        addHyperLogLog(&tss->full_card, hash);
 
-       memcpy(pres, tss->buf2, Min(sizeof(Datum), bsize));
-
        /* Hash abbreviated key */
 #if SIZEOF_DATUM == 8
        {
@@ -2105,12 +2114,6 @@ bttext_abbrev_convert(Datum original, SortSupport ssup)
 
        addHyperLogLog(&tss->abbr_card, hash);
 
-       /*
-        * Every Datum byte is always compared.  This is safe because the strxfrm()
-        * blob is itself NUL terminated, leaving no danger of misinterpreting any
-        * NUL bytes not intended to be interpreted as logically representing
-        * termination.
-        */
        return res;
 }