1/*-------------------------------------------------------------------------
2 *
3 * brindesc.c
4 * rmgr descriptor routines for BRIN indexes
5 *
6 * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 *
10 * IDENTIFICATION
11 * src/backend/access/rmgrdesc/brindesc.c
12 *
13 *-------------------------------------------------------------------------
14 */
15#include "postgres.h"
16
17#include "access/brin_xlog.h"
18
19void
20brin_desc(StringInfo buf, XLogReaderState *record)
21{
22 char *rec = XLogRecGetData(record);
23 uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
24
25 info &= XLOG_BRIN_OPMASK;
26 if (info == XLOG_BRIN_CREATE_INDEX)
27 {
28 xl_brin_createidx *xlrec = (xl_brin_createidx *) rec;
29
30 appendStringInfo(buf, "v%d pagesPerRange %u",
31 xlrec->version, xlrec->pagesPerRange);
32 }
33 else if (info == XLOG_BRIN_INSERT)
34 {
35 xl_brin_insert *xlrec = (xl_brin_insert *) rec;
36
37 appendStringInfo(buf, "heapBlk %u pagesPerRange %u offnum %u",
38 xlrec->heapBlk,
39 xlrec->pagesPerRange,
40 xlrec->offnum);
41 }
42 else if (info == XLOG_BRIN_UPDATE)
43 {
44 xl_brin_update *xlrec = (xl_brin_update *) rec;
45
46 appendStringInfo(buf, "heapBlk %u pagesPerRange %u old offnum %u, new offnum %u",
47 xlrec->insert.heapBlk,
48 xlrec->insert.pagesPerRange,
49 xlrec->oldOffnum,
50 xlrec->insert.offnum);
51 }
52 else if (info == XLOG_BRIN_SAMEPAGE_UPDATE)
53 {
54 xl_brin_samepage_update *xlrec = (xl_brin_samepage_update *) rec;
55
56 appendStringInfo(buf, "offnum %u", xlrec->offnum);
57 }
58 else if (info == XLOG_BRIN_REVMAP_EXTEND)
59 {
60 xl_brin_revmap_extend *xlrec = (xl_brin_revmap_extend *) rec;
61
62 appendStringInfo(buf, "targetBlk %u", xlrec->targetBlk);
63 }
64 else if (info == XLOG_BRIN_DESUMMARIZE)
65 {
66 xl_brin_desummarize *xlrec = (xl_brin_desummarize *) rec;
67
68 appendStringInfo(buf, "pagesPerRange %u, heapBlk %u, page offset %u",
69 xlrec->pagesPerRange, xlrec->heapBlk, xlrec->regOffset);
70 }
71}
72
73const char *
74brin_identify(uint8 info)
75{
76 const char *id = NULL;
77
78 switch (info & ~XLR_INFO_MASK)
79 {
80 case XLOG_BRIN_CREATE_INDEX:
81 id = "CREATE_INDEX";
82 break;
83 case XLOG_BRIN_INSERT:
84 id = "INSERT";
85 break;
86 case XLOG_BRIN_INSERT | XLOG_BRIN_INIT_PAGE:
87 id = "INSERT+INIT";
88 break;
89 case XLOG_BRIN_UPDATE:
90 id = "UPDATE";
91 break;
92 case XLOG_BRIN_UPDATE | XLOG_BRIN_INIT_PAGE:
93 id = "UPDATE+INIT";
94 break;
95 case XLOG_BRIN_SAMEPAGE_UPDATE:
96 id = "SAMEPAGE_UPDATE";
97 break;
98 case XLOG_BRIN_REVMAP_EXTEND:
99 id = "REVMAP_EXTEND";
100 break;
101 case XLOG_BRIN_DESUMMARIZE:
102 id = "DESUMMARIZE";
103 break;
104 }
105
106 return id;
107}
108