📄 nbtree.h
字号:
/*------------------------------------------------------------------------- * * nbtree.h * header file for postgres btree access method implementation. * * * Copyright (c) 1994, Regents of the University of California * * $Id: nbtree.h,v 1.27.2.1 1999/08/08 20:24:09 tgl Exp $ * *------------------------------------------------------------------------- */#ifndef NBTREE_H#define NBTREE_H#include <access/sdir.h>#include <access/relscan.h>#include <storage/itemid.h>#include <storage/page.h>#include <access/funcindex.h>#include <access/itup.h>#include <storage/bufmgr.h> /* don't remove, required by * BT_READ/BT_WRITE */#include <storage/itemptr.h>/* * BTPageOpaqueData -- At the end of every page, we store a pointer * to both siblings in the tree. See Lehman and Yao's paper for more * info. In addition, we need to know what sort of page this is * (leaf or internal), and whether the page is available for reuse. * * Lehman and Yao's algorithm requires a ``high key'' on every page. * The high key on a page is guaranteed to be greater than or equal * to any key that appears on this page. Our insertion algorithm * guarantees that we can use the initial least key on our right * sibling as the high key. We allocate space for the line pointer * to the high key in the opaque data at the end of the page. * * Rightmost pages in the tree have no high key. */typedef struct BTPageOpaqueData{ BlockNumber btpo_prev; BlockNumber btpo_next; BlockNumber btpo_parent; uint16 btpo_flags;#define BTP_LEAF (1 << 0)#define BTP_ROOT (1 << 1)#define BTP_FREE (1 << 2)#define BTP_META (1 << 3)#define BTP_CHAIN (1 << 4)} BTPageOpaqueData;typedef BTPageOpaqueData *BTPageOpaque;/* * ScanOpaqueData is used to remember which buffers we're currently * examining in the scan. We keep these buffers locked and pinned * and recorded in the opaque entry of the scan in order to avoid * doing a ReadBuffer() for every tuple in the index. This avoids * semop() calls, which are expensive. * * And it's used to remember actual scankey info (we need in it * if some scankeys evaled at runtime). * * curHeapIptr & mrkHeapIptr are heap iptr-s from current/marked * index tuples: we don't adjust scans on insertions (and, if LLL * is ON, don't hold locks on index pages between passes) - we * use these pointers to restore index scan positions... * - vadim 07/29/98 */typedef struct BTScanOpaqueData{ Buffer btso_curbuf; Buffer btso_mrkbuf; ItemPointerData curHeapIptr; ItemPointerData mrkHeapIptr; uint16 qual_ok; /* 0 for quals like key == 1 && key > 2 */ uint16 numberOfKeys; /* number of keys */ uint16 numberOfFirstKeys; /* number of keys for 1st * attribute */ ScanKey keyData; /* key descriptor */} BTScanOpaqueData;typedef BTScanOpaqueData *BTScanOpaque;/* * BTItems are what we store in the btree. Each item has an index * tuple, including key and pointer values. In addition, we must * guarantee that all tuples in the index are unique, in order to * satisfy some assumptions in Lehman and Yao. The way that we do * this is by generating a new OID for every insertion that we do in * the tree. This adds eight bytes to the size of btree index * tuples. Note that we do not use the OID as part of a composite * key; the OID only serves as a unique identifier for a given index * tuple (logical position within a page). * * New comments: * actually, we must guarantee that all tuples in A LEVEL * are unique, not in ALL INDEX. So, we can use bti_itup->t_tid * as unique identifier for a given index tuple (logical position * within a level). - vadim 04/09/97 */typedef struct BTItemData{ IndexTupleData bti_itup;} BTItemData;typedef BTItemData *BTItem;#define BTItemSame(i1, i2) ( i1->bti_itup.t_tid.ip_blkid.bi_hi == \ i2->bti_itup.t_tid.ip_blkid.bi_hi && \ i1->bti_itup.t_tid.ip_blkid.bi_lo == \ i2->bti_itup.t_tid.ip_blkid.bi_lo && \ i1->bti_itup.t_tid.ip_posid == \ i2->bti_itup.t_tid.ip_posid )/* * BTStackData -- As we descend a tree, we push the (key, pointer) * pairs from internal nodes onto a private stack. If we split a * leaf, we use this stack to walk back up the tree and insert data * into parent nodes (and possibly to split them, too). Lehman and * Yao's update algorithm guarantees that under no circumstances can * our private stack give us an irredeemably bad picture up the tree. * Again, see the paper for details. */typedef struct BTStackData{ BlockNumber bts_blkno; OffsetNumber bts_offset; BTItem bts_btitem; struct BTStackData *bts_parent;} BTStackData;typedef BTStackData *BTStack;typedef struct BTPageState{ Buffer btps_buf; Page btps_page; BTItem btps_lastbti; OffsetNumber btps_lastoff; OffsetNumber btps_firstoff; int btps_level; bool btps_doupper; struct BTPageState *btps_next;} BTPageState;/* * We need to be able to tell the difference between read and write * requests for pages, in order to do locking correctly. */#define BT_READ BUFFER_LOCK_SHARE#define BT_WRITE BUFFER_LOCK_EXCLUSIVE/* * Similarly, the difference between insertion and non-insertion binary * searches on a given page makes a difference when we're descending the * tree. */#define BT_INSERTION 0#define BT_DESCENT 1/* * In general, the btree code tries to localize its knowledge about * page layout to a couple of routines. However, we need a special * value to indicate "no page number" in those places where we expect * page numbers. */#define P_NONE 0#define P_LEFTMOST(opaque) ((opaque)->btpo_prev == P_NONE)#define P_RIGHTMOST(opaque) ((opaque)->btpo_next == P_NONE)#define P_HIKEY ((OffsetNumber) 1)#define P_FIRSTKEY ((OffsetNumber) 2)/* * Strategy numbers -- ordering of these is <, <=, =, >=, > */#define BTLessStrategyNumber 1#define BTLessEqualStrategyNumber 2#define BTEqualStrategyNumber 3#define BTGreaterEqualStrategyNumber 4#define BTGreaterStrategyNumber 5#define BTMaxStrategyNumber 5/* * When a new operator class is declared, we require that the user * supply us with an amproc procedure for determining whether, for * two keys a and b, a < b, a = b, or a > b. This routine must * return < 0, 0, > 0, respectively, in these three cases. Since we * only have one such proc in amproc, it's number 1. */#define BTORDER_PROC 1/* * prototypes for functions in nbtinsert.c */extern InsertIndexResult _bt_doinsert(Relation rel, BTItem btitem, bool index_is_unique, Relation heapRel); /* default is to allow duplicates */extern bool _bt_itemcmp(Relation rel, Size keysz, BTItem item1, BTItem item2, StrategyNumber strat);/* * prototypes for functions in nbtpage.c */extern void _bt_metapinit(Relation rel);extern Buffer _bt_getroot(Relation rel, int access);extern Buffer _bt_getbuf(Relation rel, BlockNumber blkno, int access);extern void _bt_relbuf(Relation rel, Buffer buf, int access);extern void _bt_wrtbuf(Relation rel, Buffer buf);extern void _bt_wrtnorelbuf(Relation rel, Buffer buf);extern void _bt_pageinit(Page page, Size size);extern void _bt_metaproot(Relation rel, BlockNumber rootbknum, int level);extern Buffer _bt_getstackbuf(Relation rel, BTStack stack, int access);extern void _bt_pagedel(Relation rel, ItemPointer tid);/* * prototypes for functions in nbtree.c */extern bool BuildingBtree; /* in nbtree.c */extern void btbuild(Relation heap, Relation index, int natts, AttrNumber *attnum, IndexStrategy istrat, uint16 pcount, Datum *params, FuncIndexInfo *finfo, PredInfo *predInfo);extern InsertIndexResult btinsert(Relation rel, Datum *datum, char *nulls, ItemPointer ht_ctid, Relation heapRel);extern char *btgettuple(IndexScanDesc scan, ScanDirection dir);extern char *btbeginscan(Relation rel, bool fromEnd, uint16 keysz, ScanKey scankey);extern void btrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey);extern void btmovescan(IndexScanDesc scan, Datum v);extern void btendscan(IndexScanDesc scan);extern void btmarkpos(IndexScanDesc scan);extern void btrestrpos(IndexScanDesc scan);extern void btdelete(Relation rel, ItemPointer tid);/* * prototypes for functions in nbtscan.c */extern void _bt_regscan(IndexScanDesc scan);extern void _bt_dropscan(IndexScanDesc scan);extern void _bt_adjscans(Relation rel, ItemPointer tid);extern void AtEOXact_nbtree(void);/* * prototypes for functions in nbtsearch.c */extern BTStack _bt_search(Relation rel, int keysz, ScanKey scankey, Buffer *bufP);extern Buffer _bt_moveright(Relation rel, Buffer buf, int keysz, ScanKey scankey, int access);extern bool _bt_skeycmp(Relation rel, Size keysz, ScanKey scankey, Page page, ItemId itemid, StrategyNumber strat);extern OffsetNumber _bt_binsrch(Relation rel, Buffer buf, int keysz, ScanKey scankey, int srchtype);extern RetrieveIndexResult _bt_next(IndexScanDesc scan, ScanDirection dir);extern RetrieveIndexResult _bt_first(IndexScanDesc scan, ScanDirection dir);extern bool _bt_step(IndexScanDesc scan, Buffer *bufP, ScanDirection dir);/* * prototypes for functions in nbtstrat.c */extern StrategyNumber _bt_getstrat(Relation rel, AttrNumber attno, RegProcedure proc);extern bool _bt_invokestrat(Relation rel, AttrNumber attno, StrategyNumber strat, Datum left, Datum right);/* * prototypes for functions in nbtutils.c */extern ScanKey _bt_mkscankey(Relation rel, IndexTuple itup);extern void _bt_freeskey(ScanKey skey);extern void _bt_freestack(BTStack stack);extern void _bt_orderkeys(Relation relation, BTScanOpaque so);extern bool _bt_checkkeys(IndexScanDesc scan, IndexTuple tuple, Size *keysok);extern BTItem _bt_formitem(IndexTuple itup);/* * prototypes for functions in nbtsort.c */extern void *_bt_spoolinit(Relation index, int ntapes, bool isunique);extern void _bt_spooldestroy(void *spool);extern void _bt_spool(Relation index, BTItem btitem, void *spool);extern void _bt_leafbuild(Relation index, void *spool);#endif /* NBTREE_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -