Andrew Dunstan wrote:


KaiGai Kohei wrote:
*** 80,88 ****
           HeapTupleHeaderGetNatts(oldheader)) &&
((newheader->t_infomask & ~HEAP_XACT_MASK) == (oldheader->t_infomask & ~HEAP_XACT_MASK)) && ! memcmp(((char *)newheader) + offsetof(HeapTupleHeaderData, t_bits), ! ((char *)oldheader) + offsetof(HeapTupleHeaderData, t_bits), ! newtuple->t_len - offsetof(HeapTupleHeaderData, t_bits)) == 0)
      {
          /* ... then suppress the update */
          rettuple = NULL;
--- 86,94 ----
           HeapTupleHeaderGetNatts(oldheader)) &&
((newheader->t_infomask & ~HEAP_XACT_MASK) == (oldheader->t_infomask & ~HEAP_XACT_MASK)) &&
!         memcmp(((char *)newheader) + newheader->t_hoff,
!                ((char *)oldheader) + oldheader->t_hoff,
!                newtuple->t_len - newheader->t_hoff) == 0)
      {
          /* ... then suppress the update */
          rettuple = NULL;

Wouldn't this omit comparing the null bitmap?

Oops, I added the comparison of null bitmap here.

Thanks,
--
OSS Platform Development Division, NEC
KaiGai Kohei <[EMAIL PROTECTED]>
*** base/src/backend/utils/adt/trigfuncs.c.orig	2008-11-06 10:24:39.000000000 +0900
--- base/src/backend/utils/adt/trigfuncs.c	2008-11-06 11:26:27.000000000 +0900
***************
*** 62,92 ****
  	newheader = newtuple->t_data;
  	oldheader = oldtuple->t_data;
  
- 	/*
- 	 * We are called before the OID, if any, has been transcribed from the
- 	 * old tuple to the new (in heap_update).  To avoid a bogus compare
- 	 * failure, copy the OID now.  But check that someone didn't already put
- 	 * another OID value into newtuple.  (That's not actually possible at
- 	 * present, but maybe someday.)
- 	 */
-  	if (trigdata->tg_relation->rd_rel->relhasoids && 
- 		!OidIsValid(HeapTupleHeaderGetOid(newheader)))
- 		HeapTupleHeaderSetOid(newheader, HeapTupleHeaderGetOid(oldheader));
- 
  	/* if the tuple payload is the same ... */
      if (newtuple->t_len == oldtuple->t_len &&
  		newheader->t_hoff == oldheader->t_hoff &&
  		(HeapTupleHeaderGetNatts(newheader) == 
  		 HeapTupleHeaderGetNatts(oldheader)) &&
  		((newheader->t_infomask & ~HEAP_XACT_MASK) == 
! 		 (oldheader->t_infomask & ~HEAP_XACT_MASK)) &&
! 		memcmp(((char *)newheader) + offsetof(HeapTupleHeaderData, t_bits),
! 			   ((char *)oldheader) + offsetof(HeapTupleHeaderData, t_bits),
! 			   newtuple->t_len - offsetof(HeapTupleHeaderData, t_bits)) == 0)
  	{
  		/* ... then suppress the update */
  		rettuple = NULL;
  	}
  
  	return PointerGetDatum(rettuple);
  }
--- 62,104 ----
  	newheader = newtuple->t_data;
  	oldheader = oldtuple->t_data;
  
  	/* if the tuple payload is the same ... */
      if (newtuple->t_len == oldtuple->t_len &&
  		newheader->t_hoff == oldheader->t_hoff &&
  		(HeapTupleHeaderGetNatts(newheader) == 
  		 HeapTupleHeaderGetNatts(oldheader)) &&
  		((newheader->t_infomask & ~HEAP_XACT_MASK) == 
! 		 (oldheader->t_infomask & ~HEAP_XACT_MASK)))
  	{
+ 		if (HeapTupleHasNulls(newtuple) &&
+ 			memcmp(newheader->t_bits, oldheader->t_bits,
+ 				   BITMAPLEN(HeapTupleHeaderGetNatts(newheader))) != 0)
+ 			goto skip;
+ 
+ 		/*
+ 		 * We are called before the OID, if any, has been transcribed from
+ 		 * the old tuple to the new (in heap_update). To avoid a bogus compare
+ 		 * failure, compare the OID new. But check that someone didn't already
+ 		 * put another OID value into newtuple.  (That's not actually possible
+ 		 * at present, but maybe someday.)
+ 		 */
+ 		if (OidIsValid(HeapTupleGetOid(newtuple))
+ 			&& HeapTupleGetOid(newtuple) != HeapTupleGetOid(oldtuple))
+ 			goto skip;
+ #if 0
+ 		if (OidIsValid(HeapTupleGetSecurity(newtuple))
+ 			&& HeapTupleGetSecurity(newtuple) != HeapTupleGetSecurity(oldtuple))
+ 			goto skip;
+ #endif
+ 		if (memcmp(((char *)newheader) + newheader->t_hoff,
+ 				   ((char *)oldheader) + oldheader->t_hoff,
+ 				   newtuple->t_len - newheader->t_hoff) != 0)
+ 			goto skip;
+ 
  		/* ... then suppress the update */
  		rettuple = NULL;
  	}
+ skip:
  
  	return PointerGetDatum(rettuple);
  }
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to