codekingpro/portable-devtools
115k
1/*--------------------------------------------------------------------------2 * ginxlog.h3 * header file for postgres inverted index xlog implementation.4 *5 * Copyright (c) 2006-2023, PostgreSQL Global Development Group6 *7 * src/include/access/ginxlog.h8 *--------------------------------------------------------------------------9 */10#ifndef GINXLOG_H11#define GINXLOG_H12 13#include "access/ginblock.h"14#include "access/itup.h"15#include "access/xlogreader.h"16#include "lib/stringinfo.h"17#include "storage/off.h"18 19#define XLOG_GIN_CREATE_PTREE 0x1020 21typedef struct ginxlogCreatePostingTree22{23 uint32 size;24 /* A compressed posting list follows */25} ginxlogCreatePostingTree;26 27/*28 * The format of the insertion record varies depending on the page type.29 * ginxlogInsert is the common part between all variants.30 *31 * Backup Blk 0: target page32 * Backup Blk 1: left child, if this insertion finishes an incomplete split33 */34 35#define XLOG_GIN_INSERT 0x2036 37typedef struct38{39 uint16 flags; /* GIN_INSERT_ISLEAF and/or GIN_INSERT_ISDATA */40 41 /*42 * FOLLOWS:43 *44 * 1. if not leaf page, block numbers of the left and right child pages45 * whose split this insertion finishes, as BlockIdData[2] (beware of46 * adding fields in this struct that would make them not 16-bit aligned)47 *48 * 2. a ginxlogInsertEntry or ginxlogRecompressDataLeaf struct, depending49 * on tree type.50 *51 * NB: the below structs are only 16-bit aligned when appended to a52 * ginxlogInsert struct! Beware of adding fields to them that require53 * stricter alignment.54 */55} ginxlogInsert;56 57typedef struct58{59 OffsetNumber offset;60 bool isDelete;61 IndexTupleData tuple; /* variable length */62} ginxlogInsertEntry;63 64 65typedef struct66{67 uint16 nactions;68 69 /* Variable number of 'actions' follow */70} ginxlogRecompressDataLeaf;71 72/*73 * Note: this struct is currently not used in code, and only acts as74 * documentation. The WAL record format is as specified here, but the code75 * uses straight access through a Pointer and memcpy to read/write these.76 */77typedef struct78{79 uint8 segno; /* segment this action applies to */80 char type; /* action type (see below) */81 82 /*83 * Action-specific data follows. For INSERT and REPLACE actions that is a84 * GinPostingList struct. For ADDITEMS, a uint16 for the number of items85 * added, followed by the items themselves as ItemPointers. DELETE actions86 * have no further data.87 */88} ginxlogSegmentAction;89 90/* Action types */91#define GIN_SEGMENT_UNMODIFIED 0 /* no action (not used in WAL records) */92#define GIN_SEGMENT_DELETE 1 /* a whole segment is removed */93#define GIN_SEGMENT_INSERT 2 /* a whole segment is added */94#define GIN_SEGMENT_REPLACE 3 /* a segment is replaced */95#define GIN_SEGMENT_ADDITEMS 4 /* items are added to existing segment */96 97typedef struct98{99 OffsetNumber offset;100 PostingItem newitem;101} ginxlogInsertDataInternal;102 103/*104 * Backup Blk 0: new left page (= original page, if not root split)105 * Backup Blk 1: new right page106 * Backup Blk 2: original page / new root page, if root split107 * Backup Blk 3: left child, if this insertion completes an earlier split108 */109#define XLOG_GIN_SPLIT 0x30110 111typedef struct ginxlogSplit112{113 RelFileLocator locator;114 BlockNumber rrlink; /* right link, or root's blocknumber if root115 * split */116 BlockNumber leftChildBlkno; /* valid on a non-leaf split */117 BlockNumber rightChildBlkno;118 uint16 flags; /* see below */119} ginxlogSplit;120 121/*122 * Flags used in ginxlogInsert and ginxlogSplit records123 */124#define GIN_INSERT_ISDATA 0x01 /* for both insert and split records */125#define GIN_INSERT_ISLEAF 0x02 /* ditto */126#define GIN_SPLIT_ROOT 0x04 /* only for split records */127 128/*129 * Vacuum simply WAL-logs the whole page, when anything is modified. This130 * is functionally identical to XLOG_FPI records, but is kept separate for131 * debugging purposes. (When inspecting the WAL stream, it's easier to see132 * what's going on when GIN vacuum records are marked as such, not as heap133 * records.) This is currently only used for entry tree leaf pages.134 */135#define XLOG_GIN_VACUUM_PAGE 0x40136 137/*138 * Vacuuming posting tree leaf page is WAL-logged like recompression caused139 * by insertion.140 */141#define XLOG_GIN_VACUUM_DATA_LEAF_PAGE 0x90142 143typedef struct ginxlogVacuumDataLeafPage144{145 ginxlogRecompressDataLeaf data;146} ginxlogVacuumDataLeafPage;147 148/*149 * Backup Blk 0: deleted page150 * Backup Blk 1: parent151 * Backup Blk 2: left sibling152 */153#define XLOG_GIN_DELETE_PAGE 0x50154 155typedef struct ginxlogDeletePage156{157 OffsetNumber parentOffset;158 BlockNumber rightLink;159 TransactionId deleteXid; /* last Xid which could see this page in scan */160} ginxlogDeletePage;161 162#define XLOG_GIN_UPDATE_META_PAGE 0x60163 164/*165 * Backup Blk 0: metapage166 * Backup Blk 1: tail page167 */168typedef struct ginxlogUpdateMeta169{170 RelFileLocator locator;171 GinMetaPageData metadata;172 BlockNumber prevTail;173 BlockNumber newRightlink;174 int32 ntuples; /* if ntuples > 0 then metadata.tail was175 * updated with that many tuples; else new sub176 * list was inserted */177 /* array of inserted tuples follows */178} ginxlogUpdateMeta;179 180#define XLOG_GIN_INSERT_LISTPAGE 0x70181 182typedef struct ginxlogInsertListPage183{184 BlockNumber rightlink;185 int32 ntuples;186 /* array of inserted tuples follows */187} ginxlogInsertListPage;188 189/*190 * Backup Blk 0: metapage191 * Backup Blk 1 to (ndeleted + 1): deleted pages192 */193 194#define XLOG_GIN_DELETE_LISTPAGE 0x80195 196/*197 * The WAL record for deleting list pages must contain a block reference to198 * all the deleted pages, so the number of pages that can be deleted in one199 * record is limited by XLR_MAX_BLOCK_ID. (block_id 0 is used for the200 * metapage.)201 */202#define GIN_NDELETE_AT_ONCE Min(16, XLR_MAX_BLOCK_ID - 1)203typedef struct ginxlogDeleteListPages204{205 GinMetaPageData metadata;206 int32 ndeleted;207} ginxlogDeleteListPages;208 209extern void gin_redo(XLogReaderState *record);210extern void gin_desc(StringInfo buf, XLogReaderState *record);211extern const char *gin_identify(uint8 info);212extern void gin_xlog_startup(void);213extern void gin_xlog_cleanup(void);214extern void gin_mask(char *pagedata, BlockNumber blkno);215 216#endif /* GINXLOG_H */217 