From 8c951687f58ad604be13e6addfd56446afb36e13 Mon Sep 17 00:00:00 2001 From: Peter Geoghegan Date: Tue, 12 Nov 2019 11:25:34 -0800 Subject: [PATCH] Teach datum_image_eq() about cstring datums. Bring datum_image_eq() in line with datumIsEqual() by adding support for comparing cstring datums. An upcoming patch that adds deduplication to the nbtree AM will use datum_image_eq(). datum_image_eq() will need to work with all datatypes that can be used as the storage type of a B-Tree index column, including cstring. (cstring is used as the storage type for columns of type "name" as a space-saving optimization.) Discussion: https://postgr.es/m/CAH2-Wzn3Ee49Gmxb7V1VJ3-AC8fWn-Fr8pfWQebHe8rYRxt5OQ@mail.gmail.com --- src/backend/utils/adt/datum.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/backend/utils/adt/datum.c b/src/backend/utils/adt/datum.c index 73703efe05a..b20d0640ea2 100644 --- a/src/backend/utils/adt/datum.c +++ b/src/backend/utils/adt/datum.c @@ -263,6 +263,8 @@ datumIsEqual(Datum value1, Datum value2, bool typByVal, int typLen) bool datum_image_eq(Datum value1, Datum value2, bool typByVal, int typLen) { + Size len1, + len2; bool result = true; if (typByVal) @@ -277,9 +279,6 @@ datum_image_eq(Datum value1, Datum value2, bool typByVal, int typLen) } else if (typLen == -1) { - Size len1, - len2; - len1 = toast_raw_datum_size(value1); len2 = toast_raw_datum_size(value2); /* No need to de-toast if lengths don't match. */ @@ -304,6 +303,20 @@ datum_image_eq(Datum value1, Datum value2, bool typByVal, int typLen) pfree(arg2val); } } + else if (typLen == -2) + { + char *s1, + *s2; + + /* Compare cstring datums */ + s1 = DatumGetCString(value1); + s2 = DatumGetCString(value2); + len1 = strlen(s1) + 1; + len2 = strlen(s2) + 1; + if (len1 != len2) + return false; + result = (memcmp(s1, s2, len1) == 0); + } else elog(ERROR, "unexpected typLen: %d", typLen);