Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4cbb646

Browse files
committed
Fix several possibly non-portable gaffs in record_image_ops.
Sparc machines in the buildfarm were made happy by the previousfix, but PowerPC machines still are still failing. Hopefully thiswill cure that.
1 parentada0101 commit4cbb646

File tree

1 file changed

+75
-9
lines changed

1 file changed

+75
-9
lines changed

‎src/backend/utils/adt/rowtypes.c

Lines changed: 75 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -898,8 +898,6 @@ record_cmp(FunctionCallInfo fcinfo)
898898
{
899899
TypeCacheEntry*typentry;
900900
Oidcollation;
901-
FunctionCallInfoDatalocfcinfo;
902-
int32cmpresult;
903901

904902
/*
905903
* Skip dropped columns
@@ -959,6 +957,9 @@ record_cmp(FunctionCallInfo fcinfo)
959957
*/
960958
if (!nulls1[i1]|| !nulls2[i2])
961959
{
960+
FunctionCallInfoDatalocfcinfo;
961+
int32cmpresult;
962+
962963
if (nulls1[i1])
963964
{
964965
/* arg1 is greater than arg2 */
@@ -1295,12 +1296,12 @@ btrecordcmp(PG_FUNCTION_ARGS)
12951296
* identical. As an example, for the citext type 'A' and 'a' are equal, but
12961297
* they are not identical.
12971298
*/
1298-
staticbool
1299-
record_image_cmp(PG_FUNCTION_ARGS)
1299+
staticint
1300+
record_image_cmp(FunctionCallInfofcinfo)
13001301
{
13011302
HeapTupleHeaderrecord1=PG_GETARG_HEAPTUPLEHEADER(0);
13021303
HeapTupleHeaderrecord2=PG_GETARG_HEAPTUPLEHEADER(1);
1303-
int32result=0;
1304+
intresult=0;
13041305
OidtupType1;
13051306
OidtupType2;
13061307
int32tupTypmod1;
@@ -1418,6 +1419,12 @@ record_image_cmp(PG_FUNCTION_ARGS)
14181419
format_type_be(tupdesc2->attrs[i2]->atttypid),
14191420
j+1)));
14201421

1422+
/*
1423+
* The same type should have the same length (or both should be variable).
1424+
*/
1425+
Assert(tupdesc1->attrs[i1]->attlen==
1426+
tupdesc2->attrs[i2]->attlen);
1427+
14211428
/*
14221429
* We consider two NULLs equal; NULL > not-NULL.
14231430
*/
@@ -1453,7 +1460,7 @@ record_image_cmp(PG_FUNCTION_ARGS)
14531460

14541461
cmpresult=memcmp(VARDATA_ANY(arg1val),
14551462
VARDATA_ANY(arg2val),
1456-
len1-VARHDRSZ);
1463+
Min(len1,len2)-VARHDRSZ);
14571464
if ((cmpresult==0)&& (len1!=len2))
14581465
cmpresult= (len1<len2) ?-1 :1;
14591466

@@ -1464,8 +1471,45 @@ record_image_cmp(PG_FUNCTION_ARGS)
14641471
}
14651472
elseif (tupdesc1->attrs[i1]->attbyval)
14661473
{
1467-
if (values1[i1]!=values2[i2])
1468-
cmpresult= (values1[i1]<values2[i2]) ?-1 :1;
1474+
switch (tupdesc1->attrs[i1]->attlen)
1475+
{
1476+
case1:
1477+
if (GET_1_BYTE(values1[i1])!=
1478+
GET_1_BYTE(values2[i2]))
1479+
{
1480+
cmpresult= (GET_1_BYTE(values1[i1])<
1481+
GET_1_BYTE(values2[i2])) ?-1 :1;
1482+
}
1483+
break;
1484+
case2:
1485+
if (GET_2_BYTES(values1[i1])!=
1486+
GET_2_BYTES(values2[i2]))
1487+
{
1488+
cmpresult= (GET_2_BYTES(values1[i1])<
1489+
GET_2_BYTES(values2[i2])) ?-1 :1;
1490+
}
1491+
break;
1492+
case4:
1493+
if (GET_4_BYTES(values1[i1])!=
1494+
GET_4_BYTES(values2[i2]))
1495+
{
1496+
cmpresult= (GET_4_BYTES(values1[i1])<
1497+
GET_4_BYTES(values2[i2])) ?-1 :1;
1498+
}
1499+
break;
1500+
#ifSIZEOF_DATUM==8
1501+
case8:
1502+
if (GET_8_BYTES(values1[i1])!=
1503+
GET_8_BYTES(values2[i2]))
1504+
{
1505+
cmpresult= (GET_8_BYTES(values1[i1])<
1506+
GET_8_BYTES(values2[i2])) ?-1 :1;
1507+
}
1508+
break;
1509+
#endif
1510+
default:
1511+
Assert(false);/* cannot happen */
1512+
}
14691513
}
14701514
else
14711515
{
@@ -1694,7 +1738,29 @@ record_image_eq(PG_FUNCTION_ARGS)
16941738
}
16951739
elseif (tupdesc1->attrs[i1]->attbyval)
16961740
{
1697-
result= (values1[i1]==values2[i2]);
1741+
switch (tupdesc1->attrs[i1]->attlen)
1742+
{
1743+
case1:
1744+
result= (GET_1_BYTE(values1[i1])==
1745+
GET_1_BYTE(values2[i2]));
1746+
break;
1747+
case2:
1748+
result= (GET_2_BYTES(values1[i1])==
1749+
GET_2_BYTES(values2[i2]));
1750+
break;
1751+
case4:
1752+
result= (GET_4_BYTES(values1[i1])==
1753+
GET_4_BYTES(values2[i2]));
1754+
break;
1755+
#ifSIZEOF_DATUM==8
1756+
case8:
1757+
result= (GET_8_BYTES(values1[i1])==
1758+
GET_8_BYTES(values2[i2]));
1759+
break;
1760+
#endif
1761+
default:
1762+
Assert(false);/* cannot happen */
1763+
}
16981764
}
16991765
else
17001766
{

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp