codekingpro/portable-devtools
114k
1/*-------------------------------------------------------------------------2 *3 * hash_xlog.h4 * header file for Postgres hash AM implementation5 *6 *7 * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group8 * Portions Copyright (c) 1994, Regents of the University of California9 *10 * src/include/access/hash_xlog.h11 *12 *-------------------------------------------------------------------------13 */14#ifndef HASH_XLOG_H15#define HASH_XLOG_H16 17#include "access/xlogreader.h"18#include "lib/stringinfo.h"19#include "storage/off.h"20 21/* Number of buffers required for XLOG_HASH_SQUEEZE_PAGE operation */22#define HASH_XLOG_FREE_OVFL_BUFS 623 24/*25 * XLOG records for hash operations26 */27#define XLOG_HASH_INIT_META_PAGE 0x00 /* initialize the meta page */28#define XLOG_HASH_INIT_BITMAP_PAGE 0x10 /* initialize the bitmap page */29#define XLOG_HASH_INSERT 0x20 /* add index tuple without split */30#define XLOG_HASH_ADD_OVFL_PAGE 0x30 /* add overflow page */31#define XLOG_HASH_SPLIT_ALLOCATE_PAGE 0x40 /* allocate new page for split */32#define XLOG_HASH_SPLIT_PAGE 0x50 /* split page */33#define XLOG_HASH_SPLIT_COMPLETE 0x60 /* completion of split operation */34#define XLOG_HASH_MOVE_PAGE_CONTENTS 0x70 /* remove tuples from one page35 * and add to another page */36#define XLOG_HASH_SQUEEZE_PAGE 0x80 /* add tuples to one of the previous37 * pages in chain and free the ovfl38 * page */39#define XLOG_HASH_DELETE 0x90 /* delete index tuples from a page */40#define XLOG_HASH_SPLIT_CLEANUP 0xA0 /* clear split-cleanup flag in primary41 * bucket page after deleting tuples42 * that are moved due to split */43#define XLOG_HASH_UPDATE_META_PAGE 0xB0 /* update meta page after vacuum */44 45#define XLOG_HASH_VACUUM_ONE_PAGE 0xC0 /* remove dead tuples from index46 * page */47 48/*49 * xl_hash_split_allocate_page flag values, 8 bits are available.50 */51#define XLH_SPLIT_META_UPDATE_MASKS (1<<0)52#define XLH_SPLIT_META_UPDATE_SPLITPOINT (1<<1)53 54/*55 * This is what we need to know about simple (without split) insert.56 *57 * This data record is used for XLOG_HASH_INSERT58 *59 * Backup Blk 0: original page (data contains the inserted tuple)60 * Backup Blk 1: metapage (HashMetaPageData)61 */62typedef struct xl_hash_insert63{64 OffsetNumber offnum;65} xl_hash_insert;66 67#define SizeOfHashInsert (offsetof(xl_hash_insert, offnum) + sizeof(OffsetNumber))68 69/*70 * This is what we need to know about addition of overflow page.71 *72 * This data record is used for XLOG_HASH_ADD_OVFL_PAGE73 *74 * Backup Blk 0: newly allocated overflow page75 * Backup Blk 1: page before new overflow page in the bucket chain76 * Backup Blk 2: bitmap page77 * Backup Blk 3: new bitmap page78 * Backup Blk 4: metapage79 */80typedef struct xl_hash_add_ovfl_page81{82 uint16 bmsize;83 bool bmpage_found;84} xl_hash_add_ovfl_page;85 86#define SizeOfHashAddOvflPage \87 (offsetof(xl_hash_add_ovfl_page, bmpage_found) + sizeof(bool))88 89/*90 * This is what we need to know about allocating a page for split.91 *92 * This data record is used for XLOG_HASH_SPLIT_ALLOCATE_PAGE93 *94 * Backup Blk 0: page for old bucket95 * Backup Blk 1: page for new bucket96 * Backup Blk 2: metapage97 */98typedef struct xl_hash_split_allocate_page99{100 uint32 new_bucket;101 uint16 old_bucket_flag;102 uint16 new_bucket_flag;103 uint8 flags;104} xl_hash_split_allocate_page;105 106#define SizeOfHashSplitAllocPage \107 (offsetof(xl_hash_split_allocate_page, flags) + sizeof(uint8))108 109/*110 * This is what we need to know about completing the split operation.111 *112 * This data record is used for XLOG_HASH_SPLIT_COMPLETE113 *114 * Backup Blk 0: page for old bucket115 * Backup Blk 1: page for new bucket116 */117typedef struct xl_hash_split_complete118{119 uint16 old_bucket_flag;120 uint16 new_bucket_flag;121} xl_hash_split_complete;122 123#define SizeOfHashSplitComplete \124 (offsetof(xl_hash_split_complete, new_bucket_flag) + sizeof(uint16))125 126/*127 * This is what we need to know about move page contents required during128 * squeeze operation.129 *130 * This data record is used for XLOG_HASH_MOVE_PAGE_CONTENTS131 *132 * Backup Blk 0: bucket page133 * Backup Blk 1: page containing moved tuples134 * Backup Blk 2: page from which tuples will be removed135 */136typedef struct xl_hash_move_page_contents137{138 uint16 ntups;139 bool is_prim_bucket_same_wrt; /* true if the page to which140 * tuples are moved is same as141 * primary bucket page */142} xl_hash_move_page_contents;143 144#define SizeOfHashMovePageContents \145 (offsetof(xl_hash_move_page_contents, is_prim_bucket_same_wrt) + sizeof(bool))146 147/*148 * This is what we need to know about the squeeze page operation.149 *150 * This data record is used for XLOG_HASH_SQUEEZE_PAGE151 *152 * Backup Blk 0: page containing tuples moved from freed overflow page153 * Backup Blk 1: freed overflow page154 * Backup Blk 2: page previous to the freed overflow page155 * Backup Blk 3: page next to the freed overflow page156 * Backup Blk 4: bitmap page containing info of freed overflow page157 * Backup Blk 5: meta page158 */159typedef struct xl_hash_squeeze_page160{161 BlockNumber prevblkno;162 BlockNumber nextblkno;163 uint16 ntups;164 bool is_prim_bucket_same_wrt; /* true if the page to which165 * tuples are moved is same as166 * primary bucket page */167 bool is_prev_bucket_same_wrt; /* true if the page to which168 * tuples are moved is the page169 * previous to the freed overflow170 * page */171} xl_hash_squeeze_page;172 173#define SizeOfHashSqueezePage \174 (offsetof(xl_hash_squeeze_page, is_prev_bucket_same_wrt) + sizeof(bool))175 176/*177 * This is what we need to know about the deletion of index tuples from a page.178 *179 * This data record is used for XLOG_HASH_DELETE180 *181 * Backup Blk 0: primary bucket page182 * Backup Blk 1: page from which tuples are deleted183 */184typedef struct xl_hash_delete185{186 bool clear_dead_marking; /* true if this operation clears187 * LH_PAGE_HAS_DEAD_TUPLES flag */188 bool is_primary_bucket_page; /* true if the operation is for189 * primary bucket page */190} xl_hash_delete;191 192#define SizeOfHashDelete (offsetof(xl_hash_delete, is_primary_bucket_page) + sizeof(bool))193 194/*195 * This is what we need for metapage update operation.196 *197 * This data record is used for XLOG_HASH_UPDATE_META_PAGE198 *199 * Backup Blk 0: meta page200 */201typedef struct xl_hash_update_meta_page202{203 double ntuples;204} xl_hash_update_meta_page;205 206#define SizeOfHashUpdateMetaPage \207 (offsetof(xl_hash_update_meta_page, ntuples) + sizeof(double))208 209/*210 * This is what we need to initialize metapage.211 *212 * This data record is used for XLOG_HASH_INIT_META_PAGE213 *214 * Backup Blk 0: meta page215 */216typedef struct xl_hash_init_meta_page217{218 double num_tuples;219 RegProcedure procid;220 uint16 ffactor;221} xl_hash_init_meta_page;222 223#define SizeOfHashInitMetaPage \224 (offsetof(xl_hash_init_meta_page, ffactor) + sizeof(uint16))225 226/*227 * This is what we need to initialize bitmap page.228 *229 * This data record is used for XLOG_HASH_INIT_BITMAP_PAGE230 *231 * Backup Blk 0: bitmap page232 * Backup Blk 1: meta page233 */234typedef struct xl_hash_init_bitmap_page235{236 uint16 bmsize;237} xl_hash_init_bitmap_page;238 239#define SizeOfHashInitBitmapPage \240 (offsetof(xl_hash_init_bitmap_page, bmsize) + sizeof(uint16))241 242/*243 * This is what we need for index tuple deletion and to244 * update the meta page.245 *246 * This data record is used for XLOG_HASH_VACUUM_ONE_PAGE247 *248 * Backup Blk 0: bucket page249 * Backup Blk 1: meta page250 */251typedef struct xl_hash_vacuum_one_page252{253 TransactionId snapshotConflictHorizon;254 uint16 ntuples;255 bool isCatalogRel; /* to handle recovery conflict during logical256 * decoding on standby */257 258 /* TARGET OFFSET NUMBERS */259 OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];260} xl_hash_vacuum_one_page;261 262#define SizeOfHashVacuumOnePage offsetof(xl_hash_vacuum_one_page, offsets)263 264extern void hash_redo(XLogReaderState *record);265extern void hash_desc(StringInfo buf, XLogReaderState *record);266extern const char *hash_identify(uint8 info);267extern void hash_mask(char *pagedata, BlockNumber blkno);268 269#endif /* HASH_XLOG_H */270 