nbtree.h
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:10k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * nbtree.h
  4.  *   header file for postgres btree access method implementation.
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: nbtree.h,v 1.27.2.1 1999/08/08 20:24:09 tgl Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef NBTREE_H
  14. #define NBTREE_H
  15. #include <access/sdir.h>
  16. #include <access/relscan.h>
  17. #include <storage/itemid.h>
  18. #include <storage/page.h>
  19. #include <access/funcindex.h>
  20. #include <access/itup.h>
  21. #include <storage/bufmgr.h> /* don't remove, required by
  22.  * BT_READ/BT_WRITE */
  23. #include <storage/itemptr.h>
  24. /*
  25.  * BTPageOpaqueData -- At the end of every page, we store a pointer
  26.  * to both siblings in the tree.  See Lehman and Yao's paper for more
  27.  * info.  In addition, we need to know what sort of page this is
  28.  * (leaf or internal), and whether the page is available for reuse.
  29.  *
  30.  * Lehman and Yao's algorithm requires a ``high key'' on every page.
  31.  * The high key on a page is guaranteed to be greater than or equal
  32.  * to any key that appears on this page.  Our insertion algorithm
  33.  * guarantees that we can use the initial least key on our right
  34.  * sibling as the high key.  We allocate space for the line pointer
  35.  * to the high key in the opaque data at the end of the page.
  36.  *
  37.  * Rightmost pages in the tree have no high key.
  38.  */
  39. typedef struct BTPageOpaqueData
  40. {
  41. BlockNumber btpo_prev;
  42. BlockNumber btpo_next;
  43. BlockNumber btpo_parent;
  44. uint16 btpo_flags;
  45. #define BTP_LEAF (1 << 0)
  46. #define BTP_ROOT (1 << 1)
  47. #define BTP_FREE (1 << 2)
  48. #define BTP_META (1 << 3)
  49. #define BTP_CHAIN (1 << 4)
  50. } BTPageOpaqueData;
  51. typedef BTPageOpaqueData *BTPageOpaque;
  52. /*
  53.  * ScanOpaqueData is used to remember which buffers we're currently
  54.  * examining in the scan. We keep these buffers locked and pinned
  55.  * and recorded in the opaque entry of the scan in order to avoid
  56.  * doing a ReadBuffer() for every tuple in the index. This avoids
  57.  * semop() calls, which are expensive.
  58.  *
  59.  * And it's used to remember actual scankey info (we need in it
  60.  * if some scankeys evaled at runtime).
  61.  *
  62.  * curHeapIptr & mrkHeapIptr are heap iptr-s from current/marked
  63.  * index tuples: we don't adjust scans on insertions (and, if LLL
  64.  * is ON, don't hold locks on index pages between passes) - we
  65.  * use these pointers to restore index scan positions...
  66.  * - vadim 07/29/98
  67.  */
  68. typedef struct BTScanOpaqueData
  69. {
  70. Buffer btso_curbuf;
  71. Buffer btso_mrkbuf;
  72. ItemPointerData curHeapIptr;
  73. ItemPointerData mrkHeapIptr;
  74. uint16 qual_ok; /* 0 for quals like key == 1 && key > 2 */
  75. uint16 numberOfKeys; /* number of keys */
  76. uint16 numberOfFirstKeys; /* number of keys for 1st
  77.  * attribute */
  78. ScanKey keyData; /* key descriptor */
  79. } BTScanOpaqueData;
  80. typedef BTScanOpaqueData *BTScanOpaque;
  81. /*
  82.  * BTItems are what we store in the btree.  Each item has an index
  83.  * tuple, including key and pointer values.  In addition, we must
  84.  * guarantee that all tuples in the index are unique, in order to
  85.  * satisfy some assumptions in Lehman and Yao.  The way that we do
  86.  * this is by generating a new OID for every insertion that we do in
  87.  * the tree.  This adds eight bytes to the size of btree index
  88.  * tuples.  Note that we do not use the OID as part of a composite
  89.  * key; the OID only serves as a unique identifier for a given index
  90.  * tuple (logical position within a page).
  91.  *
  92.  * New comments:
  93.  * actually, we must guarantee that all tuples in A LEVEL
  94.  * are unique, not in ALL INDEX. So, we can use bti_itup->t_tid
  95.  * as unique identifier for a given index tuple (logical position
  96.  * within a level). - vadim 04/09/97
  97.  */
  98. typedef struct BTItemData
  99. {
  100. IndexTupleData bti_itup;
  101. } BTItemData;
  102. typedef BTItemData *BTItem;
  103. #define BTItemSame(i1, i2)   ( i1->bti_itup.t_tid.ip_blkid.bi_hi == 
  104. i2->bti_itup.t_tid.ip_blkid.bi_hi && 
  105. i1->bti_itup.t_tid.ip_blkid.bi_lo == 
  106. i2->bti_itup.t_tid.ip_blkid.bi_lo && 
  107. i1->bti_itup.t_tid.ip_posid == 
  108. i2->bti_itup.t_tid.ip_posid )
  109. /*
  110.  * BTStackData -- As we descend a tree, we push the (key, pointer)
  111.  * pairs from internal nodes onto a private stack.  If we split a
  112.  * leaf, we use this stack to walk back up the tree and insert data
  113.  * into parent nodes (and possibly to split them, too).  Lehman and
  114.  * Yao's update algorithm guarantees that under no circumstances can
  115.  * our private stack give us an irredeemably bad picture up the tree.
  116.  * Again, see the paper for details.
  117.  */
  118. typedef struct BTStackData
  119. {
  120. BlockNumber bts_blkno;
  121. OffsetNumber bts_offset;
  122. BTItem bts_btitem;
  123. struct BTStackData *bts_parent;
  124. } BTStackData;
  125. typedef BTStackData *BTStack;
  126. typedef struct BTPageState
  127. {
  128. Buffer btps_buf;
  129. Page btps_page;
  130. BTItem btps_lastbti;
  131. OffsetNumber btps_lastoff;
  132. OffsetNumber btps_firstoff;
  133. int btps_level;
  134. bool btps_doupper;
  135. struct BTPageState *btps_next;
  136. } BTPageState;
  137. /*
  138.  * We need to be able to tell the difference between read and write
  139.  * requests for pages, in order to do locking correctly.
  140.  */
  141. #define BT_READ BUFFER_LOCK_SHARE
  142. #define BT_WRITE BUFFER_LOCK_EXCLUSIVE
  143. /*
  144.  * Similarly, the difference between insertion and non-insertion binary
  145.  * searches on a given page makes a difference when we're descending the
  146.  * tree.
  147.  */
  148. #define BT_INSERTION 0
  149. #define BT_DESCENT 1
  150. /*
  151.  * In general, the btree code tries to localize its knowledge about
  152.  * page layout to a couple of routines.  However, we need a special
  153.  * value to indicate "no page number" in those places where we expect
  154.  * page numbers.
  155.  */
  156. #define P_NONE 0
  157. #define P_LEFTMOST(opaque) ((opaque)->btpo_prev == P_NONE)
  158. #define P_RIGHTMOST(opaque) ((opaque)->btpo_next == P_NONE)
  159. #define P_HIKEY ((OffsetNumber) 1)
  160. #define P_FIRSTKEY ((OffsetNumber) 2)
  161. /*
  162.  * Strategy numbers -- ordering of these is <, <=, =, >=, >
  163.  */
  164. #define BTLessStrategyNumber 1
  165. #define BTLessEqualStrategyNumber 2
  166. #define BTEqualStrategyNumber 3
  167. #define BTGreaterEqualStrategyNumber 4
  168. #define BTGreaterStrategyNumber 5
  169. #define BTMaxStrategyNumber 5
  170. /*
  171.  * When a new operator class is declared, we require that the user
  172.  * supply us with an amproc procedure for determining whether, for
  173.  * two keys a and b, a < b, a = b, or a > b.  This routine must
  174.  * return < 0, 0, > 0, respectively, in these three cases.  Since we
  175.  * only have one such proc in amproc, it's number 1.
  176.  */
  177. #define BTORDER_PROC 1
  178. /*
  179.  * prototypes for functions in nbtinsert.c
  180.  */
  181. extern InsertIndexResult _bt_doinsert(Relation rel, BTItem btitem,
  182.  bool index_is_unique, Relation heapRel);
  183.  /* default is to allow duplicates */
  184. extern bool _bt_itemcmp(Relation rel, Size keysz, BTItem item1, BTItem item2,
  185. StrategyNumber strat);
  186. /*
  187.  * prototypes for functions in nbtpage.c
  188.  */
  189. extern void _bt_metapinit(Relation rel);
  190. extern Buffer _bt_getroot(Relation rel, int access);
  191. extern Buffer _bt_getbuf(Relation rel, BlockNumber blkno, int access);
  192. extern void _bt_relbuf(Relation rel, Buffer buf, int access);
  193. extern void _bt_wrtbuf(Relation rel, Buffer buf);
  194. extern void _bt_wrtnorelbuf(Relation rel, Buffer buf);
  195. extern void _bt_pageinit(Page page, Size size);
  196. extern void _bt_metaproot(Relation rel, BlockNumber rootbknum, int level);
  197. extern Buffer _bt_getstackbuf(Relation rel, BTStack stack, int access);
  198. extern void _bt_pagedel(Relation rel, ItemPointer tid);
  199. /*
  200.  * prototypes for functions in nbtree.c
  201.  */
  202. extern bool BuildingBtree; /* in nbtree.c */
  203. extern void btbuild(Relation heap, Relation index, int natts,
  204. AttrNumber *attnum, IndexStrategy istrat, uint16 pcount,
  205. Datum *params, FuncIndexInfo *finfo, PredInfo *predInfo);
  206. extern InsertIndexResult btinsert(Relation rel, Datum *datum, char *nulls,
  207.  ItemPointer ht_ctid, Relation heapRel);
  208. extern char *btgettuple(IndexScanDesc scan, ScanDirection dir);
  209. extern char *btbeginscan(Relation rel, bool fromEnd, uint16 keysz,
  210. ScanKey scankey);
  211. extern void btrescan(IndexScanDesc scan, bool fromEnd, ScanKey scankey);
  212. extern void btmovescan(IndexScanDesc scan, Datum v);
  213. extern void btendscan(IndexScanDesc scan);
  214. extern void btmarkpos(IndexScanDesc scan);
  215. extern void btrestrpos(IndexScanDesc scan);
  216. extern void btdelete(Relation rel, ItemPointer tid);
  217. /*
  218.  * prototypes for functions in nbtscan.c
  219.  */
  220. extern void _bt_regscan(IndexScanDesc scan);
  221. extern void _bt_dropscan(IndexScanDesc scan);
  222. extern void _bt_adjscans(Relation rel, ItemPointer tid);
  223. extern void AtEOXact_nbtree(void);
  224. /*
  225.  * prototypes for functions in nbtsearch.c
  226.  */
  227. extern BTStack _bt_search(Relation rel, int keysz, ScanKey scankey,
  228.    Buffer *bufP);
  229. extern Buffer _bt_moveright(Relation rel, Buffer buf, int keysz,
  230.   ScanKey scankey, int access);
  231. extern bool _bt_skeycmp(Relation rel, Size keysz, ScanKey scankey,
  232. Page page, ItemId itemid, StrategyNumber strat);
  233. extern OffsetNumber _bt_binsrch(Relation rel, Buffer buf, int keysz,
  234. ScanKey scankey, int srchtype);
  235. extern RetrieveIndexResult _bt_next(IndexScanDesc scan, ScanDirection dir);
  236. extern RetrieveIndexResult _bt_first(IndexScanDesc scan, ScanDirection dir);
  237. extern bool _bt_step(IndexScanDesc scan, Buffer *bufP, ScanDirection dir);
  238. /*
  239.  * prototypes for functions in nbtstrat.c
  240.  */
  241. extern StrategyNumber _bt_getstrat(Relation rel, AttrNumber attno,
  242.  RegProcedure proc);
  243. extern bool _bt_invokestrat(Relation rel, AttrNumber attno,
  244. StrategyNumber strat, Datum left, Datum right);
  245. /*
  246.  * prototypes for functions in nbtutils.c
  247.  */
  248. extern ScanKey _bt_mkscankey(Relation rel, IndexTuple itup);
  249. extern void _bt_freeskey(ScanKey skey);
  250. extern void _bt_freestack(BTStack stack);
  251. extern void _bt_orderkeys(Relation relation, BTScanOpaque so);
  252. extern bool _bt_checkkeys(IndexScanDesc scan, IndexTuple tuple, Size *keysok);
  253. extern BTItem _bt_formitem(IndexTuple itup);
  254. /*
  255.  * prototypes for functions in nbtsort.c
  256.  */
  257. extern void *_bt_spoolinit(Relation index, int ntapes, bool isunique);
  258. extern void _bt_spooldestroy(void *spool);
  259. extern void _bt_spool(Relation index, BTItem btitem, void *spool);
  260. extern void _bt_leafbuild(Relation index, void *spool);
  261. #endif  /* NBTREE_H */