@@ -1426,30 +1426,7 @@ record_image_cmp(FunctionCallInfo fcinfo)
1426
1426
}
1427
1427
1428
1428
/* Compare the pair of elements */
1429
- if (tupdesc1 -> attrs [i1 ]-> attlen == -1 )
1430
- {
1431
- Size len1 ,
1432
- len2 ;
1433
- struct varlena * arg1val ;
1434
- struct varlena * arg2val ;
1435
-
1436
- len1 = toast_raw_datum_size (values1 [i1 ]);
1437
- len2 = toast_raw_datum_size (values2 [i2 ]);
1438
- arg1val = PG_DETOAST_DATUM_PACKED (values1 [i1 ]);
1439
- arg2val = PG_DETOAST_DATUM_PACKED (values2 [i2 ]);
1440
-
1441
- cmpresult = memcmp (VARDATA_ANY (arg1val ),
1442
- VARDATA_ANY (arg2val ),
1443
- Min (len1 ,len2 )- VARHDRSZ );
1444
- if ((cmpresult == 0 )&& (len1 != len2 ))
1445
- cmpresult = (len1 < len2 ) ?-1 :1 ;
1446
-
1447
- if ((Pointer )arg1val != (Pointer )values1 [i1 ])
1448
- pfree (arg1val );
1449
- if ((Pointer )arg2val != (Pointer )values2 [i2 ])
1450
- pfree (arg2val );
1451
- }
1452
- else if (tupdesc1 -> attrs [i1 ]-> attbyval )
1429
+ if (tupdesc1 -> attrs [i1 ]-> attbyval )
1453
1430
{
1454
1431
switch (tupdesc1 -> attrs [i1 ]-> attlen )
1455
1432
{
@@ -1491,12 +1468,37 @@ record_image_cmp(FunctionCallInfo fcinfo)
1491
1468
Assert (false);/* cannot happen */
1492
1469
}
1493
1470
}
1494
- else
1471
+ else if ( tupdesc1 -> attrs [ i1 ] -> attlen > 0 )
1495
1472
{
1496
1473
cmpresult = memcmp (DatumGetPointer (values1 [i1 ]),
1497
1474
DatumGetPointer (values2 [i2 ]),
1498
1475
tupdesc1 -> attrs [i1 ]-> attlen );
1499
1476
}
1477
+ else if (tupdesc1 -> attrs [i1 ]-> attlen == -1 )
1478
+ {
1479
+ Size len1 ,
1480
+ len2 ;
1481
+ struct varlena * arg1val ;
1482
+ struct varlena * arg2val ;
1483
+
1484
+ len1 = toast_raw_datum_size (values1 [i1 ]);
1485
+ len2 = toast_raw_datum_size (values2 [i2 ]);
1486
+ arg1val = PG_DETOAST_DATUM_PACKED (values1 [i1 ]);
1487
+ arg2val = PG_DETOAST_DATUM_PACKED (values2 [i2 ]);
1488
+
1489
+ cmpresult = memcmp (VARDATA_ANY (arg1val ),
1490
+ VARDATA_ANY (arg2val ),
1491
+ Min (len1 ,len2 )- VARHDRSZ );
1492
+ if ((cmpresult == 0 )&& (len1 != len2 ))
1493
+ cmpresult = (len1 < len2 ) ?-1 :1 ;
1494
+
1495
+ if ((Pointer )arg1val != (Pointer )values1 [i1 ])
1496
+ pfree (arg1val );
1497
+ if ((Pointer )arg2val != (Pointer )values2 [i2 ])
1498
+ pfree (arg2val );
1499
+ }
1500
+ else
1501
+ elog (ERROR ,"unexpected attlen: %d" ,tupdesc1 -> attrs [i1 ]-> attlen );
1500
1502
1501
1503
if (cmpresult < 0 )
1502
1504
{
@@ -1687,36 +1689,7 @@ record_image_eq(PG_FUNCTION_ARGS)
1687
1689
}
1688
1690
1689
1691
/* Compare the pair of elements */
1690
- if (tupdesc1 -> attrs [i1 ]-> attlen == -1 )
1691
- {
1692
- Size len1 ,
1693
- len2 ;
1694
-
1695
- len1 = toast_raw_datum_size (values1 [i1 ]);
1696
- len2 = toast_raw_datum_size (values2 [i2 ]);
1697
- /* No need to de-toast if lengths don't match. */
1698
- if (len1 != len2 )
1699
- result = false;
1700
- else
1701
- {
1702
- struct varlena * arg1val ;
1703
- struct varlena * arg2val ;
1704
-
1705
- arg1val = PG_DETOAST_DATUM_PACKED (values1 [i1 ]);
1706
- arg2val = PG_DETOAST_DATUM_PACKED (values2 [i2 ]);
1707
-
1708
- result = (memcmp (VARDATA_ANY (arg1val ),
1709
- VARDATA_ANY (arg2val ),
1710
- len1 - VARHDRSZ )== 0 );
1711
-
1712
- /* Only free memory if it's a copy made here. */
1713
- if ((Pointer )arg1val != (Pointer )values1 [i1 ])
1714
- pfree (arg1val );
1715
- if ((Pointer )arg2val != (Pointer )values2 [i2 ])
1716
- pfree (arg2val );
1717
- }
1718
- }
1719
- else if (tupdesc1 -> attrs [i1 ]-> attbyval )
1692
+ if (tupdesc1 -> attrs [i1 ]-> attbyval )
1720
1693
{
1721
1694
switch (tupdesc1 -> attrs [i1 ]-> attlen )
1722
1695
{
@@ -1742,12 +1715,44 @@ record_image_eq(PG_FUNCTION_ARGS)
1742
1715
Assert (false);/* cannot happen */
1743
1716
}
1744
1717
}
1745
- else
1718
+ else if ( tupdesc1 -> attrs [ i1 ] -> attlen > 0 )
1746
1719
{
1747
1720
result = (memcmp (DatumGetPointer (values1 [i1 ]),
1748
1721
DatumGetPointer (values2 [i2 ]),
1749
1722
tupdesc1 -> attrs [i1 ]-> attlen )== 0 );
1750
1723
}
1724
+ else if (tupdesc1 -> attrs [i1 ]-> attlen == -1 )
1725
+ {
1726
+ Size len1 ,
1727
+ len2 ;
1728
+
1729
+ len1 = toast_raw_datum_size (values1 [i1 ]);
1730
+ len2 = toast_raw_datum_size (values2 [i2 ]);
1731
+ /* No need to de-toast if lengths don't match. */
1732
+ if (len1 != len2 )
1733
+ result = false;
1734
+ else
1735
+ {
1736
+ struct varlena * arg1val ;
1737
+ struct varlena * arg2val ;
1738
+
1739
+ arg1val = PG_DETOAST_DATUM_PACKED (values1 [i1 ]);
1740
+ arg2val = PG_DETOAST_DATUM_PACKED (values2 [i2 ]);
1741
+
1742
+ result = (memcmp (VARDATA_ANY (arg1val ),
1743
+ VARDATA_ANY (arg2val ),
1744
+ len1 - VARHDRSZ )== 0 );
1745
+
1746
+ /* Only free memory if it's a copy made here. */
1747
+ if ((Pointer )arg1val != (Pointer )values1 [i1 ])
1748
+ pfree (arg1val );
1749
+ if ((Pointer )arg2val != (Pointer )values2 [i2 ])
1750
+ pfree (arg2val );
1751
+ }
1752
+ }
1753
+ else
1754
+ elog (ERROR ,"unexpected attlen: %d" ,tupdesc1 -> attrs [i1 ]-> attlen );
1755
+
1751
1756
if (!result )
1752
1757
break ;
1753
1758
}