1/*-------------------------------------------------------------------------
2 *
3 * gistxlog.h
4 * gist xlog routines
5 *
6 * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 * src/include/access/gistxlog.h
10 *
11 *-------------------------------------------------------------------------
12 */
13#ifndef GIST_XLOG_H
14#define GIST_XLOG_H
15
16#include "access/gist.h"
17#include "access/xlogreader.h"
18#include "lib/stringinfo.h"
19
20#define XLOG_GIST_PAGE_UPDATE 0x00
21#define XLOG_GIST_DELETE 0x10 /* delete leaf index tuples for a
22 * page */
23#define XLOG_GIST_PAGE_REUSE 0x20 /* old page is about to be reused
24 * from FSM */
25#define XLOG_GIST_PAGE_SPLIT 0x30
26 /* #define XLOG_GIST_INSERT_COMPLETE 0x40 */ /* not used anymore */
27 /* #define XLOG_GIST_CREATE_INDEX 0x50 */ /* not used anymore */
28#define XLOG_GIST_PAGE_DELETE 0x60
29
30/*
31 * Backup Blk 0: updated page.
32 * Backup Blk 1: If this operation completes a page split, by inserting a
33 * downlink for the split page, the left half of the split
34 */
35typedef struct gistxlogPageUpdate
36{
37 /* number of deleted offsets */
38 uint16 ntodelete;
39 uint16 ntoinsert;
40
41 /*
42 * In payload of blk 0 : 1. todelete OffsetNumbers 2. tuples to insert
43 */
44} gistxlogPageUpdate;
45
46/*
47 * Backup Blk 0: Leaf page, whose index tuples are deleted.
48 */
49typedef struct gistxlogDelete
50{
51 TransactionId latestRemovedXid;
52 uint16 ntodelete; /* number of deleted offsets */
53
54 /*
55 * In payload of blk 0 : todelete OffsetNumbers
56 */
57} gistxlogDelete;
58
59#define SizeOfGistxlogDelete (offsetof(gistxlogDelete, ntodelete) + sizeof(uint16))
60
61/*
62 * Backup Blk 0: If this operation completes a page split, by inserting a
63 * downlink for the split page, the left half of the split
64 * Backup Blk 1 - npage: split pages (1 is the original page)
65 */
66typedef struct gistxlogPageSplit
67{
68 BlockNumber origrlink; /* rightlink of the page before split */
69 GistNSN orignsn; /* NSN of the page before split */
70 bool origleaf; /* was splitted page a leaf page? */
71
72 uint16 npage; /* # of pages in the split */
73 bool markfollowright; /* set F_FOLLOW_RIGHT flags */
74
75 /*
76 * follow: 1. gistxlogPage and array of IndexTupleData per page
77 */
78} gistxlogPageSplit;
79
80/*
81 * Backup Blk 0: page that was deleted.
82 * Backup Blk 1: parent page, containing the downlink to the deleted page.
83 */
84typedef struct gistxlogPageDelete
85{
86 FullTransactionId deleteXid; /* last Xid which could see page in scan */
87 OffsetNumber downlinkOffset; /* Offset of downlink referencing this
88 * page */
89} gistxlogPageDelete;
90
91#define SizeOfGistxlogPageDelete (offsetof(gistxlogPageDelete, downlinkOffset) + sizeof(OffsetNumber))
92
93
94/*
95 * This is what we need to know about page reuse, for hot standby.
96 */
97typedef struct gistxlogPageReuse
98{
99 RelFileNode node;
100 BlockNumber block;
101 FullTransactionId latestRemovedFullXid;
102} gistxlogPageReuse;
103
104#define SizeOfGistxlogPageReuse (offsetof(gistxlogPageReuse, latestRemovedFullXid) + sizeof(FullTransactionId))
105
106extern void gist_redo(XLogReaderState *record);
107extern void gist_desc(StringInfo buf, XLogReaderState *record);
108extern const char *gist_identify(uint8 info);
109extern void gist_xlog_startup(void);
110extern void gist_xlog_cleanup(void);
111extern void gist_mask(char *pagedata, BlockNumber blkno);
112
113#endif
114