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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * gist.h
  4.  *   common declarations for the GiST access method code.
  5.  *
  6.  *
  7.  *
  8.  *
  9.  *
  10.  *-------------------------------------------------------------------------
  11.  */
  12. #ifndef GIST_H
  13. #define GIST_H
  14. #include "access/funcindex.h"
  15. #include "access/itup.h"
  16. #include "access/relscan.h"
  17. #include "access/sdir.h"
  18. /*
  19. ** You can have as many strategies as you please in GiSTs, as
  20. ** long as your consistent method can handle them
  21. **
  22. ** But strat.h->StrategyEvaluationData->StrategyExpression expression[12]
  23. ** - so 12 is real max # of strategies, or StrategyEvaluationIsValid
  24. ** crashes backend... - vadim 05/21/97
  25. #define GISTNStrategies 100
  26. */
  27. #define GISTNStrategies 12
  28. /*
  29. ** Helper routines
  30. */
  31. #define GISTNProcs 8
  32. #define GIST_CONSISTENT_PROC 1
  33. #define GIST_UNION_PROC 2
  34. #define GIST_COMPRESS_PROC 3
  35. #define GIST_DECOMPRESS_PROC 4
  36. #define GIST_PENALTY_PROC 5
  37. #define GIST_PICKSPLIT_PROC 6
  38. #define GIST_EQUAL_PROC 7
  39. #define GIST_INFO_PROC 8
  40. #define F_LEAF (1 << 0)
  41. typedef struct GISTPageOpaqueData
  42. {
  43. uint32 flags;
  44. } GISTPageOpaqueData;
  45. typedef GISTPageOpaqueData *GISTPageOpaque;
  46. #define GIST_LEAF(entry) (((GISTPageOpaque) PageGetSpecialPointer((entry)->page))->flags & F_LEAF)
  47. /*
  48.  * When we descend a tree, we keep a stack of parent pointers.
  49.  */
  50. typedef struct GISTSTACK
  51. {
  52. struct GISTSTACK *gs_parent;
  53. OffsetNumber gs_child;
  54. BlockNumber gs_blk;
  55. } GISTSTACK;
  56. typedef struct GISTSTATE
  57. {
  58. FmgrInfo consistentFn;
  59. FmgrInfo unionFn;
  60. FmgrInfo compressFn;
  61. FmgrInfo decompressFn;
  62. FmgrInfo penaltyFn;
  63. FmgrInfo picksplitFn;
  64. FmgrInfo equalFn;
  65. bool haskeytype;
  66. bool keytypbyval;
  67. } GISTSTATE;
  68. /*
  69. ** When we're doing a scan, we need to keep track of the parent stack
  70. ** for the marked and current items.
  71. */
  72. typedef struct GISTScanOpaqueData
  73. {
  74. struct GISTSTACK *s_stack;
  75. struct GISTSTACK *s_markstk;
  76. uint16 s_flags;
  77. struct GISTSTATE *giststate;
  78. } GISTScanOpaqueData;
  79. typedef GISTScanOpaqueData *GISTScanOpaque;
  80. /*
  81. ** When we're doing a scan and updating a tree at the same time, the
  82. ** updates may affect the scan.  We use the flags entry of the scan's
  83. ** opaque space to record our actual position in response to updates
  84. ** that we can't handle simply by adjusting pointers.
  85. */
  86. #define GS_CURBEFORE ((uint16) (1 << 0))
  87. #define GS_MRKBEFORE ((uint16) (1 << 1))
  88. /* root page of a gist */
  89. #define GISTP_ROOT 0
  90. /*
  91. ** When we update a relation on which we're doing a scan, we need to
  92. ** check the scan and fix it if the update affected any of the pages it
  93. ** touches.  Otherwise, we can miss records that we should see.  The only
  94. ** times we need to do this are for deletions and splits. See the code in
  95. ** gistscan.c for how the scan is fixed. These two constants tell us what sort
  96. ** of operation changed the index.
  97. */
  98. #define GISTOP_DEL 0
  99. #define GISTOP_SPLIT 1
  100. /*
  101. ** This is the Split Vector to be returned by the PickSplit method.
  102. */
  103. typedef struct GIST_SPLITVEC
  104. {
  105. OffsetNumber *spl_left; /* array of entries that go left */
  106. int spl_nleft; /* size of this array */
  107. char    *spl_ldatum; /* Union of keys in spl_left */
  108. OffsetNumber *spl_right; /* array of entries that go right */
  109. int spl_nright; /* size of the array */
  110. char    *spl_rdatum; /* Union of keys in spl_right */
  111. } GIST_SPLITVEC;
  112. /*
  113. ** An entry on a GiST node.  Contains the key (pred), as well as
  114. ** its own location (rel,page,offset) which can supply the matching
  115. ** pointer.  The size of the pred is in bytes, and leafkey is a flag to
  116. ** tell us if the entry is in a leaf node.
  117. */
  118. typedef struct GISTENTRY
  119. {
  120. char    *pred;
  121. Relation rel;
  122. Page page;
  123. OffsetNumber offset;
  124. int bytes;
  125. bool leafkey;
  126. } GISTENTRY;
  127. /*
  128. ** macro to initialize a GISTENTRY
  129. */
  130. #define gistentryinit(e, pr, r, pg, o, b, l)
  131.    {(e).pred = pr; (e).rel = r; (e).page = pg; (e).offset = o; (e).bytes = b; (e).leafkey = l;}
  132. /* defined in gist.c */
  133. #define TRLOWER(tr) (((tr)->bytes))
  134. #define TRUPPER(tr) (&((tr)->bytes[MAXALIGN(VARSIZE(TRLOWER(tr)))]))
  135. typedef struct txtrange
  136. {
  137. /*
  138.  * flag: NINF means that lower is negative infinity; PINF means that *
  139.  * upper is positive infinity. 0 means that both are numbers.
  140.  */
  141. int32 vl_len;
  142. int32 flag;
  143. char bytes[2];
  144. } TXTRANGE;
  145. typedef struct intrange
  146. {
  147. int lower;
  148. int upper;
  149. /*
  150.  * flag: NINF means that lower is negative infinity; PINF means that *
  151.  * upper is positive infinity. 0 means that both are numbers.
  152.  */
  153. int flag;
  154. } INTRANGE;
  155. extern void gistbuild(Relation heap,
  156.   Relation index, int natts,
  157.   AttrNumber *attnum, IndexStrategy istrat,
  158.   uint16 pint, Datum *params,
  159.   FuncIndexInfo *finfo,
  160.   PredInfo *predInfo);
  161. extern InsertIndexResult gistinsert(Relation r, Datum *datum,
  162.    char *nulls, ItemPointer ht_ctid, Relation heapRel);
  163. extern void _gistdump(Relation r);
  164. extern void gistfreestack(GISTSTACK *s);
  165. extern void initGISTstate(GISTSTATE *giststate, Relation index);
  166. extern void gistdentryinit(GISTSTATE *giststate, GISTENTRY *e, char *pr,
  167.    Relation r, Page pg, OffsetNumber o, int b, bool l);
  168. extern StrategyNumber RelationGetGISTStrategy(Relation, AttrNumber, RegProcedure);
  169. /* gistget.c */
  170. extern RetrieveIndexResult gistgettuple(IndexScanDesc s, ScanDirection dir);
  171. #endif  /* GIST_H */