#include "access/heapam_xlog.h"
#include "access/rmgrdesc_utils.h"
+/*
+ * NOTE: "keyname" argument cannot have trailing spaces or punctuation
+ * characters
+ */
static void
-out_infobits(StringInfo buf, uint8 infobits)
+infobits_desc(StringInfo buf, uint8 infobits, const char *keyname)
{
- if ((infobits & XLHL_XMAX_IS_MULTI) == 0 &&
- (infobits & XLHL_XMAX_LOCK_ONLY) == 0 &&
- (infobits & XLHL_XMAX_EXCL_LOCK) == 0 &&
- (infobits & XLHL_XMAX_KEYSHR_LOCK) == 0 &&
- (infobits & XLHL_KEYS_UPDATED) == 0)
- return;
+ appendStringInfo(buf, "%s: [", keyname);
- appendStringInfoString(buf, ", infobits: [");
+ Assert(buf->data[buf->len - 1] != ' ');
if (infobits & XLHL_XMAX_IS_MULTI)
- appendStringInfoString(buf, " IS_MULTI");
+ appendStringInfoString(buf, "IS_MULTI, ");
if (infobits & XLHL_XMAX_LOCK_ONLY)
- appendStringInfoString(buf, ", LOCK_ONLY");
+ appendStringInfoString(buf, "LOCK_ONLY, ");
if (infobits & XLHL_XMAX_EXCL_LOCK)
- appendStringInfoString(buf, ", EXCL_LOCK");
+ appendStringInfoString(buf, "EXCL_LOCK, ");
if (infobits & XLHL_XMAX_KEYSHR_LOCK)
- appendStringInfoString(buf, ", KEYSHR_LOCK");
+ appendStringInfoString(buf, "KEYSHR_LOCK, ");
if (infobits & XLHL_KEYS_UPDATED)
- appendStringInfoString(buf, ", KEYS_UPDATED");
+ appendStringInfoString(buf, "KEYS_UPDATED, ");
+
+ if (buf->data[buf->len - 1] == ' ')
+ {
+ /* Truncate-away final unneeded ", " */
+ Assert(buf->data[buf->len - 2] == ',');
+ buf->len -= 2;
+ buf->data[buf->len] = '\0';
+ }
- appendStringInfoString(buf, " ]");
+ appendStringInfoString(buf, "]");
+}
+
+static void
+truncate_flags_desc(StringInfo buf, uint8 flags)
+{
+ appendStringInfoString(buf, "flags: [");
+
+ if (flags & XLH_TRUNCATE_CASCADE)
+ appendStringInfoString(buf, "CASCADE, ");
+ if (flags & XLH_TRUNCATE_RESTART_SEQS)
+ appendStringInfoString(buf, "RESTART_SEQS, ");
+
+ if (buf->data[buf->len - 1] == ' ')
+ {
+ /* Truncate-away final unneeded ", " */
+ Assert(buf->data[buf->len - 2] == ',');
+ buf->len -= 2;
+ buf->data[buf->len] = '\0';
+ }
+
+ appendStringInfoString(buf, "]");
}
static void
{
xl_heap_delete *xlrec = (xl_heap_delete *) rec;
- appendStringInfo(buf, "off: %u, flags: 0x%02X",
- xlrec->offnum,
- xlrec->flags);
- out_infobits(buf, xlrec->infobits_set);
+ appendStringInfo(buf, "xmax: %u, off: %u, ",
+ xlrec->xmax, xlrec->offnum);
+ infobits_desc(buf, xlrec->infobits_set, "infobits");
+ appendStringInfo(buf, ", flags: 0x%02X", xlrec->flags);
}
else if (info == XLOG_HEAP_UPDATE)
{
xl_heap_update *xlrec = (xl_heap_update *) rec;
- appendStringInfo(buf, "off: %u, xmax: %u, flags: 0x%02X",
- xlrec->old_offnum,
- xlrec->old_xmax,
- xlrec->flags);
- out_infobits(buf, xlrec->old_infobits_set);
- appendStringInfo(buf, ", new off: %u, xmax %u",
- xlrec->new_offnum,
- xlrec->new_xmax);
+ appendStringInfo(buf, "old_xmax: %u, old_off: %u, ",
+ xlrec->old_xmax, xlrec->old_offnum);
+ infobits_desc(buf, xlrec->old_infobits_set, "old_infobits");
+ appendStringInfo(buf, ", flags: 0x%02X, new_xmax: %u, new_off: %u",
+ xlrec->flags, xlrec->new_xmax, xlrec->new_offnum);
}
else if (info == XLOG_HEAP_HOT_UPDATE)
{
xl_heap_update *xlrec = (xl_heap_update *) rec;
- appendStringInfo(buf, "off: %u, xmax: %u, flags: 0x%02X",
- xlrec->old_offnum,
- xlrec->old_xmax,
- xlrec->flags);
- out_infobits(buf, xlrec->old_infobits_set);
- appendStringInfo(buf, ", new off: %u, xmax: %u",
- xlrec->new_offnum,
- xlrec->new_xmax);
+ appendStringInfo(buf, "old_xmax: %u, old_off: %u, ",
+ xlrec->old_xmax, xlrec->old_offnum);
+ infobits_desc(buf, xlrec->old_infobits_set, "old_infobits");
+ appendStringInfo(buf, ", flags: 0x%02X, new_xmax: %u, new_off: %u",
+ xlrec->flags, xlrec->new_xmax, xlrec->new_offnum);
}
else if (info == XLOG_HEAP_TRUNCATE)
{
xl_heap_truncate *xlrec = (xl_heap_truncate *) rec;
- appendStringInfoString(buf, "flags: [");
- if (xlrec->flags & XLH_TRUNCATE_CASCADE)
- appendStringInfoString(buf, " CASCADE");
- if (xlrec->flags & XLH_TRUNCATE_RESTART_SEQS)
- appendStringInfoString(buf, ", RESTART_SEQS");
- appendStringInfoString(buf, " ]");
-
+ truncate_flags_desc(buf, xlrec->flags);
appendStringInfo(buf, ", nrelids: %u", xlrec->nrelids);
appendStringInfoString(buf, ", relids:");
array_desc(buf, xlrec->relids, sizeof(Oid), xlrec->nrelids,
{
xl_heap_lock *xlrec = (xl_heap_lock *) rec;
- appendStringInfo(buf, "off: %u, xmax: %u, flags: 0x%02X",
- xlrec->offnum, xlrec->xmax, xlrec->flags);
- out_infobits(buf, xlrec->infobits_set);
+ appendStringInfo(buf, "xmax: %u, off: %u, ",
+ xlrec->xmax, xlrec->offnum);
+ infobits_desc(buf, xlrec->infobits_set, "infobits");
+ appendStringInfo(buf, ", flags: 0x%02X", xlrec->flags);
}
else if (info == XLOG_HEAP_INPLACE)
{
OffsetNumber *offsets;
plans = (xl_heap_freeze_plan *) XLogRecGetBlockData(record, 0, NULL);
- offsets = (OffsetNumber *) &plans[xlrec->nplans];
+ offsets = (OffsetNumber *) ((char *) plans +
+ (xlrec->nplans *
+ sizeof(xl_heap_freeze_plan)));
appendStringInfoString(buf, ", plans:");
array_desc(buf, plans, sizeof(xl_heap_freeze_plan), xlrec->nplans,
&plan_elem_desc, &offsets);
appendStringInfo(buf, "ntuples: %d, flags: 0x%02X", xlrec->ntuples,
xlrec->flags);
- appendStringInfoString(buf, ", offsets:");
if (!XLogRecHasBlockImage(record, 0) && !isinit)
+ {
+ appendStringInfoString(buf, ", offsets:");
array_desc(buf, xlrec->offsets, sizeof(OffsetNumber),
xlrec->ntuples, &offset_elem_desc, NULL);
+ }
}
else if (info == XLOG_HEAP2_LOCK_UPDATED)
{
xl_heap_lock_updated *xlrec = (xl_heap_lock_updated *) rec;
- appendStringInfo(buf, "off: %u, xmax: %u, flags: 0x%02X",
- xlrec->offnum, xlrec->xmax, xlrec->flags);
- out_infobits(buf, xlrec->infobits_set);
+ appendStringInfo(buf, "xmax: %u, off: %u, ",
+ xlrec->xmax, xlrec->offnum);
+ infobits_desc(buf, xlrec->infobits_set, "infobits");
+ appendStringInfo(buf, ", flags: 0x%02X", xlrec->flags);
}
else if (info == XLOG_HEAP2_NEW_CID)
{