@@ -625,15 +625,16 @@ DecodeInsert(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
625625
626626 if (xlrec -> flags & XLOG_HEAP_CONTAINS_NEW_TUPLE )
627627 {
628- Size tuplelen = r -> xl_len - SizeOfHeapInsert ;
628+ Size datalen = r -> xl_len - SizeOfHeapInsert ;
629+ Size tuplelen = datalen - SizeOfHeapHeader ;
629630
630631 Assert (r -> xl_len > (SizeOfHeapInsert + SizeOfHeapHeader ));
631632
632633 change -> data .tp .newtuple =
633634 ReorderBufferGetTupleBuf (ctx -> reorder , tuplelen );
634635
635636 DecodeXLogTuple ((char * ) xlrec + SizeOfHeapInsert ,
636- tuplelen , change -> data .tp .newtuple );
637+ datalen , change -> data .tp .newtuple );
637638 }
638639
639640 change -> data .tp .clear_toast_afterwards = true;
@@ -670,6 +671,7 @@ DecodeUpdate(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
670671
671672 if (xlrec -> flags & XLOG_HEAP_CONTAINS_NEW_TUPLE )
672673 {
674+ Size datalen ;
673675 Size tuplelen ;
674676 xl_heap_header_len xlhdr ;
675677
@@ -678,12 +680,13 @@ DecodeUpdate(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
678680 memcpy (& xlhdr , data , sizeof (xlhdr ));
679681 data += offsetof(xl_heap_header_len , header );
680682
681- tuplelen = xlhdr .t_len + SizeOfHeapHeader ;
683+ datalen = xlhdr .t_len + SizeOfHeapHeader ;
684+ tuplelen = xlhdr .t_len ;
682685
683686 change -> data .tp .newtuple =
684687 ReorderBufferGetTupleBuf (ctx -> reorder , tuplelen );
685688
686- DecodeXLogTuple (data , tuplelen , change -> data .tp .newtuple );
689+ DecodeXLogTuple (data , datalen , change -> data .tp .newtuple );
687690 /* skip over the rest of the tuple header */
688691 data += SizeOfHeapHeader ;
689692 /* skip over the tuple data */
@@ -692,18 +695,20 @@ DecodeUpdate(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
692695
693696 if (xlrec -> flags & XLOG_HEAP_CONTAINS_OLD )
694697 {
698+ Size datalen ;
695699 Size tuplelen ;
696700 xl_heap_header_len xlhdr ;
697701
698702 memcpy (& xlhdr , data , sizeof (xlhdr ));
699703 data += offsetof(xl_heap_header_len , header );
700704
701- tuplelen = xlhdr .t_len + SizeOfHeapHeader ;
705+ datalen = xlhdr .t_len + SizeOfHeapHeader ;
706+ tuplelen = xlhdr .t_len ;
702707
703708 change -> data .tp .oldtuple =
704709 ReorderBufferGetTupleBuf (ctx -> reorder , tuplelen );
705710
706- DecodeXLogTuple (data , tuplelen , change -> data .tp .oldtuple );
711+ DecodeXLogTuple (data , datalen , change -> data .tp .oldtuple );
707712#ifdef NOT_USED
708713 data += SizeOfHeapHeader ;
709714 data += xlhdr .t_len ;
@@ -741,15 +746,16 @@ DecodeDelete(LogicalDecodingContext *ctx, XLogRecordBuffer *buf)
741746 /* old primary key stored */
742747 if (xlrec -> flags & XLOG_HEAP_CONTAINS_OLD )
743748 {
744- Size len = r -> xl_len - SizeOfHeapDelete ;
749+ Size datalen = r -> xl_len - SizeOfHeapDelete ;
750+ Size tuplelen = datalen - SizeOfHeapHeader ;
745751
746752 Assert (r -> xl_len > (SizeOfHeapDelete + SizeOfHeapHeader ));
747753
748754 change -> data .tp .oldtuple =
749- ReorderBufferGetTupleBuf (ctx -> reorder , len );
755+ ReorderBufferGetTupleBuf (ctx -> reorder , tuplelen );
750756
751757 DecodeXLogTuple ((char * ) xlrec + SizeOfHeapDelete ,
752- len , change -> data .tp .oldtuple );
758+ datalen , change -> data .tp .oldtuple );
753759 }
754760
755761 change -> data .tp .clear_toast_afterwards = true;
0 commit comments