PostgreSQL Source Code  git master
heapdesc.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * heapdesc.c
4  * rmgr descriptor routines for access/heap/heapam.c
5  *
6  * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  *
10  * IDENTIFICATION
11  * src/backend/access/rmgrdesc/heapdesc.c
12  *
13  *-------------------------------------------------------------------------
14  */
15 #include "postgres.h"
16 
17 #include "access/heapam_xlog.h"
18 
19 static void
21 {
22  if (infobits & XLHL_XMAX_IS_MULTI)
23  appendStringInfoString(buf, "IS_MULTI ");
24  if (infobits & XLHL_XMAX_LOCK_ONLY)
25  appendStringInfoString(buf, "LOCK_ONLY ");
26  if (infobits & XLHL_XMAX_EXCL_LOCK)
27  appendStringInfoString(buf, "EXCL_LOCK ");
28  if (infobits & XLHL_XMAX_KEYSHR_LOCK)
29  appendStringInfoString(buf, "KEYSHR_LOCK ");
30  if (infobits & XLHL_KEYS_UPDATED)
31  appendStringInfoString(buf, "KEYS_UPDATED ");
32 }
33 
34 void
36 {
37  char *rec = XLogRecGetData(record);
38  uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
39 
40  info &= XLOG_HEAP_OPMASK;
41  if (info == XLOG_HEAP_INSERT)
42  {
43  xl_heap_insert *xlrec = (xl_heap_insert *) rec;
44 
45  appendStringInfo(buf, "off %u flags 0x%02X", xlrec->offnum,
46  xlrec->flags);
47  }
48  else if (info == XLOG_HEAP_DELETE)
49  {
50  xl_heap_delete *xlrec = (xl_heap_delete *) rec;
51 
52  appendStringInfo(buf, "off %u flags 0x%02X ",
53  xlrec->offnum,
54  xlrec->flags);
55  out_infobits(buf, xlrec->infobits_set);
56  }
57  else if (info == XLOG_HEAP_UPDATE)
58  {
59  xl_heap_update *xlrec = (xl_heap_update *) rec;
60 
61  appendStringInfo(buf, "off %u xmax %u flags 0x%02X ",
62  xlrec->old_offnum,
63  xlrec->old_xmax,
64  xlrec->flags);
66  appendStringInfo(buf, "; new off %u xmax %u",
67  xlrec->new_offnum,
68  xlrec->new_xmax);
69  }
70  else if (info == XLOG_HEAP_HOT_UPDATE)
71  {
72  xl_heap_update *xlrec = (xl_heap_update *) rec;
73 
74  appendStringInfo(buf, "off %u xmax %u flags 0x%02X ",
75  xlrec->old_offnum,
76  xlrec->old_xmax,
77  xlrec->flags);
79  appendStringInfo(buf, "; new off %u xmax %u",
80  xlrec->new_offnum,
81  xlrec->new_xmax);
82  }
83  else if (info == XLOG_HEAP_TRUNCATE)
84  {
85  xl_heap_truncate *xlrec = (xl_heap_truncate *) rec;
86  int i;
87 
88  if (xlrec->flags & XLH_TRUNCATE_CASCADE)
89  appendStringInfoString(buf, "cascade ");
90  if (xlrec->flags & XLH_TRUNCATE_RESTART_SEQS)
91  appendStringInfoString(buf, "restart_seqs ");
92  appendStringInfo(buf, "nrelids %u relids", xlrec->nrelids);
93  for (i = 0; i < xlrec->nrelids; i++)
94  appendStringInfo(buf, " %u", xlrec->relids[i]);
95  }
96  else if (info == XLOG_HEAP_CONFIRM)
97  {
98  xl_heap_confirm *xlrec = (xl_heap_confirm *) rec;
99 
100  appendStringInfo(buf, "off %u", xlrec->offnum);
101  }
102  else if (info == XLOG_HEAP_LOCK)
103  {
104  xl_heap_lock *xlrec = (xl_heap_lock *) rec;
105 
106  appendStringInfo(buf, "off %u: xid %u: flags 0x%02X ",
107  xlrec->offnum, xlrec->locking_xid, xlrec->flags);
108  out_infobits(buf, xlrec->infobits_set);
109  }
110  else if (info == XLOG_HEAP_INPLACE)
111  {
112  xl_heap_inplace *xlrec = (xl_heap_inplace *) rec;
113 
114  appendStringInfo(buf, "off %u", xlrec->offnum);
115  }
116 }
117 void
119 {
120  char *rec = XLogRecGetData(record);
121  uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
122 
123  info &= XLOG_HEAP_OPMASK;
124  if (info == XLOG_HEAP2_PRUNE)
125  {
126  xl_heap_prune *xlrec = (xl_heap_prune *) rec;
127 
128  appendStringInfo(buf, "snapshotConflictHorizon %u nredirected %u ndead %u",
130  xlrec->nredirected,
131  xlrec->ndead);
132  }
133  else if (info == XLOG_HEAP2_VACUUM)
134  {
135  xl_heap_vacuum *xlrec = (xl_heap_vacuum *) rec;
136 
137  appendStringInfo(buf, "nunused %u", xlrec->nunused);
138  }
139  else if (info == XLOG_HEAP2_FREEZE_PAGE)
140  {
141  xl_heap_freeze_page *xlrec = (xl_heap_freeze_page *) rec;
142 
143  appendStringInfo(buf, "snapshotConflictHorizon %u nplans %u",
144  xlrec->snapshotConflictHorizon, xlrec->nplans);
145  }
146  else if (info == XLOG_HEAP2_VISIBLE)
147  {
148  xl_heap_visible *xlrec = (xl_heap_visible *) rec;
149 
150  appendStringInfo(buf, "snapshotConflictHorizon %u flags 0x%02X",
151  xlrec->snapshotConflictHorizon, xlrec->flags);
152  }
153  else if (info == XLOG_HEAP2_MULTI_INSERT)
154  {
156 
157  appendStringInfo(buf, "%d tuples flags 0x%02X", xlrec->ntuples,
158  xlrec->flags);
159  }
160  else if (info == XLOG_HEAP2_LOCK_UPDATED)
161  {
163 
164  appendStringInfo(buf, "off %u: xmax %u: flags 0x%02X ",
165  xlrec->offnum, xlrec->xmax, xlrec->flags);
166  out_infobits(buf, xlrec->infobits_set);
167  }
168  else if (info == XLOG_HEAP2_NEW_CID)
169  {
170  xl_heap_new_cid *xlrec = (xl_heap_new_cid *) rec;
171 
172  appendStringInfo(buf, "rel %u/%u/%u; tid %u/%u",
173  xlrec->target_locator.spcOid,
174  xlrec->target_locator.dbOid,
175  xlrec->target_locator.relNumber,
178  appendStringInfo(buf, "; cmin: %u, cmax: %u, combo: %u",
179  xlrec->cmin, xlrec->cmax, xlrec->combocid);
180  }
181 }
182 
183 const char *
185 {
186  const char *id = NULL;
187 
188  switch (info & ~XLR_INFO_MASK)
189  {
190  case XLOG_HEAP_INSERT:
191  id = "INSERT";
192  break;
194  id = "INSERT+INIT";
195  break;
196  case XLOG_HEAP_DELETE:
197  id = "DELETE";
198  break;
199  case XLOG_HEAP_UPDATE:
200  id = "UPDATE";
201  break;
203  id = "UPDATE+INIT";
204  break;
206  id = "HOT_UPDATE";
207  break;
209  id = "HOT_UPDATE+INIT";
210  break;
211  case XLOG_HEAP_TRUNCATE:
212  id = "TRUNCATE";
213  break;
214  case XLOG_HEAP_CONFIRM:
215  id = "HEAP_CONFIRM";
216  break;
217  case XLOG_HEAP_LOCK:
218  id = "LOCK";
219  break;
220  case XLOG_HEAP_INPLACE:
221  id = "INPLACE";
222  break;
223  }
224 
225  return id;
226 }
227 
228 const char *
230 {
231  const char *id = NULL;
232 
233  switch (info & ~XLR_INFO_MASK)
234  {
235  case XLOG_HEAP2_PRUNE:
236  id = "PRUNE";
237  break;
238  case XLOG_HEAP2_VACUUM:
239  id = "VACUUM";
240  break;
242  id = "FREEZE_PAGE";
243  break;
244  case XLOG_HEAP2_VISIBLE:
245  id = "VISIBLE";
246  break;
248  id = "MULTI_INSERT";
249  break;
251  id = "MULTI_INSERT+INIT";
252  break;
254  id = "LOCK_UPDATED";
255  break;
256  case XLOG_HEAP2_NEW_CID:
257  id = "NEW_CID";
258  break;
259  case XLOG_HEAP2_REWRITE:
260  id = "REWRITE";
261  break;
262  }
263 
264  return id;
265 }
unsigned char uint8
Definition: c.h:488
#define XLOG_HEAP2_PRUNE
Definition: heapam_xlog.h:54
#define XLOG_HEAP2_MULTI_INSERT
Definition: heapam_xlog.h:58
#define XLOG_HEAP_HOT_UPDATE
Definition: heapam_xlog.h:36
#define XLOG_HEAP_DELETE
Definition: heapam_xlog.h:33
#define XLOG_HEAP2_VACUUM
Definition: heapam_xlog.h:55
#define XLOG_HEAP2_REWRITE
Definition: heapam_xlog.h:53
#define XLOG_HEAP_TRUNCATE
Definition: heapam_xlog.h:35
#define XLOG_HEAP_OPMASK
Definition: heapam_xlog.h:41
#define XLH_TRUNCATE_RESTART_SEQS
Definition: heapam_xlog.h:121
#define XLOG_HEAP_UPDATE
Definition: heapam_xlog.h:34
#define XLHL_XMAX_KEYSHR_LOCK
Definition: heapam_xlog.h:271
#define XLHL_XMAX_IS_MULTI
Definition: heapam_xlog.h:268
#define XLHL_XMAX_LOCK_ONLY
Definition: heapam_xlog.h:269
#define XLOG_HEAP_INPLACE
Definition: heapam_xlog.h:39
#define XLOG_HEAP2_LOCK_UPDATED
Definition: heapam_xlog.h:59
#define XLOG_HEAP2_FREEZE_PAGE
Definition: heapam_xlog.h:56
#define XLHL_XMAX_EXCL_LOCK
Definition: heapam_xlog.h:270
#define XLOG_HEAP2_NEW_CID
Definition: heapam_xlog.h:60
#define XLOG_HEAP_LOCK
Definition: heapam_xlog.h:38
#define XLH_TRUNCATE_CASCADE
Definition: heapam_xlog.h:120
#define XLOG_HEAP_INSERT
Definition: heapam_xlog.h:32
#define XLHL_KEYS_UPDATED
Definition: heapam_xlog.h:272
#define XLOG_HEAP2_VISIBLE
Definition: heapam_xlog.h:57
#define XLOG_HEAP_INIT_PAGE
Definition: heapam_xlog.h:46
#define XLOG_HEAP_CONFIRM
Definition: heapam_xlog.h:37
void heap_desc(StringInfo buf, XLogReaderState *record)
Definition: heapdesc.c:35
const char * heap_identify(uint8 info)
Definition: heapdesc.c:184
void heap2_desc(StringInfo buf, XLogReaderState *record)
Definition: heapdesc.c:118
static void out_infobits(StringInfo buf, uint8 infobits)
Definition: heapdesc.c:20
const char * heap2_identify(uint8 info)
Definition: heapdesc.c:229
int i
Definition: isn.c:73
static OffsetNumber ItemPointerGetOffsetNumber(const ItemPointerData *pointer)
Definition: itemptr.h:124
static BlockNumber ItemPointerGetBlockNumber(const ItemPointerData *pointer)
Definition: itemptr.h:103
static char * buf
Definition: pg_test_fsync.c:67
void appendStringInfo(StringInfo str, const char *fmt,...)
Definition: stringinfo.c:91
void appendStringInfoString(StringInfo str, const char *s)
Definition: stringinfo.c:176
RelFileNumber relNumber
OffsetNumber offnum
Definition: heapam_xlog.h:302
OffsetNumber offnum
Definition: heapam_xlog.h:110
uint8 infobits_set
Definition: heapam_xlog.h:111
TransactionId snapshotConflictHorizon
Definition: heapam_xlog.h:345
OffsetNumber offnum
Definition: heapam_xlog.h:310
OffsetNumber offnum
Definition: heapam_xlog.h:156
TransactionId xmax
Definition: heapam_xlog.h:291
OffsetNumber offnum
Definition: heapam_xlog.h:292
OffsetNumber offnum
Definition: heapam_xlog.h:281
int8 infobits_set
Definition: heapam_xlog.h:282
TransactionId locking_xid
Definition: heapam_xlog.h:280
CommandId cmin
Definition: heapam_xlog.h:376
CommandId combocid
Definition: heapam_xlog.h:378
ItemPointerData target_tid
Definition: heapam_xlog.h:384
CommandId cmax
Definition: heapam_xlog.h:377
RelFileLocator target_locator
Definition: heapam_xlog.h:383
TransactionId snapshotConflictHorizon
Definition: heapam_xlog.h:245
uint16 nredirected
Definition: heapam_xlog.h:246
Oid relids[FLEXIBLE_ARRAY_MEMBER]
Definition: heapam_xlog.h:133
TransactionId new_xmax
Definition: heapam_xlog.h:218
uint8 old_infobits_set
Definition: heapam_xlog.h:216
TransactionId old_xmax
Definition: heapam_xlog.h:214
OffsetNumber old_offnum
Definition: heapam_xlog.h:215
OffsetNumber new_offnum
Definition: heapam_xlog.h:219
TransactionId snapshotConflictHorizon
Definition: heapam_xlog.h:363
#define XLogRecGetInfo(decoder)
Definition: xlogreader.h:409
#define XLogRecGetData(decoder)
Definition: xlogreader.h:414
#define XLR_INFO_MASK
Definition: xlogrecord.h:62