diff options
author | Robert Haas <rhaas@postgresql.org> | 2015-01-22 12:47:46 -0500 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2015-01-22 12:51:20 -0500 |
commit | d060e07fa919e0eb681e2fa2cfbe63d6c40eb2cf (patch) | |
tree | 64110a99120afbb5a8c294551e5979337b49c5bf /src/backend/utils/adt/varlena.c | |
parent | 59367fdf97cc1875b053ebf87cd1e071dc7f3640 (diff) | |
download | postgresql-d060e07fa919e0eb681e2fa2cfbe63d6c40eb2cf.tar.gz postgresql-d060e07fa919e0eb681e2fa2cfbe63d6c40eb2cf.zip |
Repair brain fade in commit b181a91981203f6ec9403115a2917bd3f9473707.
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.
Diffstat (limited to 'src/backend/utils/adt/varlena.c')
-rw-r--r-- | src/backend/utils/adt/varlena.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index f26a77cf293..c79b6413916 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -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; } |