Commit 8557a6f1 authored by Peter Eisentraut's avatar Peter Eisentraut

Catch invalid typlens in a couple of places

Rearrange the logic in record_image_cmp() and datum_image_eq() to
error out on unexpected typlens (either not supported there or
completely invalid due to corruption).  Barring corruption, this is
not possible today but it seems more future-proof and robust to fix
this.
Reported-by: default avatarPeter Geoghegan <pg@bowt.ie>
parent db27b60f
...@@ -265,7 +265,17 @@ datum_image_eq(Datum value1, Datum value2, bool typByVal, int typLen) ...@@ -265,7 +265,17 @@ datum_image_eq(Datum value1, Datum value2, bool typByVal, int typLen)
{ {
bool result = true; bool result = true;
if (typLen == -1) if (typByVal)
{
result = (value1 == value2);
}
else if (typLen > 0)
{
result = (memcmp(DatumGetPointer(value1),
DatumGetPointer(value2),
typLen) == 0);
}
else if (typLen == -1)
{ {
Size len1, Size len1,
len2; len2;
...@@ -294,16 +304,8 @@ datum_image_eq(Datum value1, Datum value2, bool typByVal, int typLen) ...@@ -294,16 +304,8 @@ datum_image_eq(Datum value1, Datum value2, bool typByVal, int typLen)
pfree(arg2val); pfree(arg2val);
} }
} }
else if (typByVal)
{
result = (value1 == value2);
}
else else
{ elog(ERROR, "unexpected typLen: %d", typLen);
result = (memcmp(DatumGetPointer(value1),
DatumGetPointer(value2),
typLen) == 0);
}
return result; return result;
} }
......
...@@ -1443,7 +1443,18 @@ record_image_cmp(FunctionCallInfo fcinfo) ...@@ -1443,7 +1443,18 @@ record_image_cmp(FunctionCallInfo fcinfo)
} }
/* Compare the pair of elements */ /* Compare the pair of elements */
if (att1->attlen == -1) if (att1->attbyval)
{
if (values1[i1] != values2[i2])
cmpresult = (values1[i1] < values2[i2]) ? -1 : 1;
}
else if (att1->attlen > 0)
{
cmpresult = memcmp(DatumGetPointer(values1[i1]),
DatumGetPointer(values2[i2]),
att1->attlen);
}
else if (att1->attlen == -1)
{ {
Size len1, Size len1,
len2; len2;
...@@ -1466,17 +1477,8 @@ record_image_cmp(FunctionCallInfo fcinfo) ...@@ -1466,17 +1477,8 @@ record_image_cmp(FunctionCallInfo fcinfo)
if ((Pointer) arg2val != (Pointer) values2[i2]) if ((Pointer) arg2val != (Pointer) values2[i2])
pfree(arg2val); pfree(arg2val);
} }
else if (att1->attbyval)
{
if (values1[i1] != values2[i2])
cmpresult = (values1[i1] < values2[i2]) ? -1 : 1;
}
else else
{ elog(ERROR, "unexpected attlen: %d", att1->attlen);
cmpresult = memcmp(DatumGetPointer(values1[i1]),
DatumGetPointer(values2[i2]),
att1->attlen);
}
if (cmpresult < 0) if (cmpresult < 0)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment