MFVSketch: Use datumIsEqual for comparing datums
mfvsketch used memcmp() for comparing two Datums to check for
equality. There is a note in the postgres/gpdb source saying
this is unsafe, so we converted it over to calling the postgres
function datumIsEqual() which can handle either little-endian
or big-endian byte order, making it more portable.
Co-authored-by: Domino Valdano <dvaldano@pivotal.io>
diff --git a/methods/sketch/src/pg_gp/mfvsketch.c b/methods/sketch/src/pg_gp/mfvsketch.c
index 0b954cc..f1853e7 100644
--- a/methods/sketch/src/pg_gp/mfvsketch.c
+++ b/methods/sketch/src/pg_gp/mfvsketch.c
@@ -35,6 +35,7 @@
#include <utils/lsyscache.h>
#include <utils/numeric.h>
#include <utils/typcache.h>
+#include <utils/datum.h>
#include <nodes/execnodes.h>
#include <fmgr.h>
#include <catalog/pg_type.h>
@@ -179,10 +180,8 @@
{
mfvtransval *transval = (mfvtransval *)VARDATA(blob);
unsigned i;
- uint32 len;
- void * datp;
+ void *datp;
Datum iDat;
- void *valp = DatumExtractPointer(val, transval->typByVal);
/* look for existing entry for this value */
for (i = 0; i < transval->next_mfv; i++) {
@@ -190,11 +189,9 @@
datp = mfv_transval_getval(blob,i);
iDat = PointerExtractDatum(datp, transval->typByVal);
- if ((len = ExtractDatumLen(iDat, transval->typLen, transval->typByVal, -1))
- == ExtractDatumLen(val, transval->typLen, transval->typByVal, -1)) {
- if (!memcmp(datp, valp, len))
- /* arg is an mfv */
- return(i);
+ if (datumIsEqual(iDat, val, transval->typByVal, transval->typLen)) {
+ /* arg is an mfv */
+ return(i);
}
}
return(-1);