diff --git a/src/backend/utils/adt/datum.c b/src/backend/utils/adt/datum.c index 73703efe05..b20d0640ea 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);