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 
19 void
brin_desc(StringInfo buf,XLogReaderState * record)20 brin_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 
73 const char *
brin_identify(uint8 info)74 brin_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