Hi all,

I was just playing with the WAL consistency issue with rows moved across
partitions when I noticed that heapdesc.c is not really talkative about
the different flag records set.

What about something like the patch attached?  I found that useful for
debugging.

(One comment of heapam_xlog.h mentions xl_heap_delete instead of
xl_heap_truncate, noticed it on the way.)

Thanks,
--
Michael
diff --git a/src/backend/access/rmgrdesc/heapdesc.c b/src/backend/access/rmgrdesc/heapdesc.c
index 318a281d7f..f03dbca55b 100644
--- a/src/backend/access/rmgrdesc/heapdesc.c
+++ b/src/backend/access/rmgrdesc/heapdesc.c
@@ -42,12 +42,32 @@ heap_desc(StringInfo buf, XLogReaderState *record)
 	{
 		xl_heap_insert *xlrec = (xl_heap_insert *) rec;
 
+		if (xlrec->flags & XLH_INSERT_ALL_VISIBLE_CLEARED)
+			appendStringInfo(buf, "all_visible_cleared ");
+		if (xlrec->flags & XLH_INSERT_LAST_IN_MULTI)
+			appendStringInfo(buf, "last_in_multi ");
+		if (xlrec->flags & XLH_INSERT_IS_SPECULATIVE)
+			appendStringInfo(buf, "is_speculative ");
+		if (xlrec->flags & XLH_INSERT_CONTAINS_NEW_TUPLE)
+			appendStringInfo(buf, "contains_new_tuple ");
+
 		appendStringInfo(buf, "off %u", xlrec->offnum);
 	}
 	else if (info == XLOG_HEAP_DELETE)
 	{
 		xl_heap_delete *xlrec = (xl_heap_delete *) rec;
 
+		if (xlrec->flags & XLH_DELETE_ALL_VISIBLE_CLEARED)
+			appendStringInfo(buf, "all_visible_cleared ");
+		if (xlrec->flags & XLH_DELETE_CONTAINS_OLD_TUPLE)
+			appendStringInfo(buf, "contains_old_tuple ");
+		if (xlrec->flags & XLH_DELETE_CONTAINS_OLD_KEY)
+			appendStringInfo(buf, "contains_old_key ");
+		if (xlrec->flags & XLH_DELETE_IS_SUPER)
+			appendStringInfo(buf, "is_super ");
+		if (xlrec->flags & XLH_DELETE_IS_PARTITION_MOVE)
+			appendStringInfo(buf, "is_partition_move ");
+
 		appendStringInfo(buf, "off %u ", xlrec->offnum);
 		out_infobits(buf, xlrec->infobits_set);
 	}
@@ -55,6 +75,21 @@ heap_desc(StringInfo buf, XLogReaderState *record)
 	{
 		xl_heap_update *xlrec = (xl_heap_update *) rec;
 
+		if (xlrec->flags & XLH_UPDATE_OLD_ALL_VISIBLE_CLEARED)
+			appendStringInfo(buf, "old_all_visible_cleared ");
+		if (xlrec->flags & XLH_UPDATE_NEW_ALL_VISIBLE_CLEARED)
+			appendStringInfo(buf, "new_all_visible_cleared ");
+		if (xlrec->flags & XLH_UPDATE_CONTAINS_OLD_TUPLE)
+			appendStringInfo(buf, "contains_old_tuple ");
+		if (xlrec->flags & XLH_UPDATE_CONTAINS_OLD_KEY)
+			appendStringInfo(buf, "contains_old_key ");
+		if (xlrec->flags & XLH_UPDATE_CONTAINS_NEW_TUPLE)
+			appendStringInfo(buf, "contains_new_tuple ");
+		if (xlrec->flags & XLH_UPDATE_PREFIX_FROM_OLD)
+			appendStringInfo(buf, "prefix_from_old ");
+		if (xlrec->flags & XLH_UPDATE_SUFFIX_FROM_OLD)
+			appendStringInfo(buf, "suffix_from_old ");
+
 		appendStringInfo(buf, "off %u xmax %u ",
 						 xlrec->old_offnum,
 						 xlrec->old_xmax);
@@ -146,6 +181,15 @@ heap2_desc(StringInfo buf, XLogReaderState *record)
 	{
 		xl_heap_multi_insert *xlrec = (xl_heap_multi_insert *) rec;
 
+		if (xlrec->flags & XLH_INSERT_ALL_VISIBLE_CLEARED)
+			appendStringInfo(buf, "all_visible_cleared ");
+		if (xlrec->flags & XLH_INSERT_LAST_IN_MULTI)
+			appendStringInfo(buf, "last_in_multi ");
+		if (xlrec->flags & XLH_INSERT_IS_SPECULATIVE)
+			appendStringInfo(buf, "is_speculative ");
+		if (xlrec->flags & XLH_INSERT_CONTAINS_NEW_TUPLE)
+			appendStringInfo(buf, "contains_new_tuple ");
+
 		appendStringInfo(buf, "%d tuples", xlrec->ntuples);
 	}
 	else if (info == XLOG_HEAP2_LOCK_UPDATED)
diff --git a/src/include/access/heapam_xlog.h b/src/include/access/heapam_xlog.h
index cf88ff7cb4..cc85f4b3c7 100644
--- a/src/include/access/heapam_xlog.h
+++ b/src/include/access/heapam_xlog.h
@@ -111,7 +111,7 @@ typedef struct xl_heap_delete
 #define SizeOfHeapDelete	(offsetof(xl_heap_delete, flags) + sizeof(uint8))
 
 /*
- * xl_heap_delete flag values, 8 bits are available.
+ * xl_heap_truncate flag values, 8 bits are available.
  */
 #define XLH_TRUNCATE_CASCADE					(1<<0)
 #define XLH_TRUNCATE_RESTART_SEQS				(1<<1)

Attachment: signature.asc
Description: PGP signature

Reply via email to