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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * rtree.h
  4.  *   common declarations for the rtree access method code.
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: rtree.h,v 1.14.2.1 1999/08/02 05:25:22 scrappy Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef RTREE_H
  14. #define RTREE_H
  15. #include "access/funcindex.h"
  16. #include "access/itup.h"
  17. #include "access/relscan.h"
  18. #include "access/sdir.h"
  19. /* see rtstrat.c for what all this is about */
  20. #define RTNStrategies 8
  21. #define RTLeftStrategyNumber 1
  22. #define RTOverLeftStrategyNumber 2
  23. #define RTOverlapStrategyNumber 3
  24. #define RTOverRightStrategyNumber 4
  25. #define RTRightStrategyNumber 5
  26. #define RTSameStrategyNumber 6
  27. #define RTContainsStrategyNumber 7
  28. #define RTContainedByStrategyNumber 8
  29. #define RTNProcs 3
  30. #define RT_UNION_PROC 1
  31. #define RT_INTER_PROC 2
  32. #define RT_SIZE_PROC 3
  33. #define F_LEAF (1 << 0)
  34. typedef struct RTreePageOpaqueData
  35. {
  36. uint32 flags;
  37. } RTreePageOpaqueData;
  38. typedef RTreePageOpaqueData *RTreePageOpaque;
  39. /*
  40.  * When we descend a tree, we keep a stack of parent pointers.
  41.  */
  42. typedef struct RTSTACK
  43. {
  44. struct RTSTACK *rts_parent;
  45. OffsetNumber rts_child;
  46. BlockNumber rts_blk;
  47. } RTSTACK;
  48. /*
  49.  * When we're doing a scan, we need to keep track of the parent stack
  50.  * for the marked and current items.  Also, rtrees have the following
  51.  * property:  if you're looking for the box (1,1,2,2), on the internal
  52.  * nodes you have to search for all boxes that *contain* (1,1,2,2), and
  53.  * not the ones that match it.  We have a private scan key for internal
  54.  * nodes in the opaque structure for rtrees for this reason.  See
  55.  * access/index-rtree/rtscan.c and rtstrat.c for how it gets initialized.
  56.  */
  57. typedef struct RTreeScanOpaqueData
  58. {
  59. struct RTSTACK *s_stack;
  60. struct RTSTACK *s_markstk;
  61. uint16 s_flags;
  62. uint16 s_internalNKey;
  63. ScanKey s_internalKey;
  64. } RTreeScanOpaqueData;
  65. typedef RTreeScanOpaqueData *RTreeScanOpaque;
  66. /*
  67.  * When we're doing a scan and updating a tree at the same time, the
  68.  * updates may affect the scan.  We use the flags entry of the scan's
  69.  * opaque space to record our actual position in response to updates
  70.  * that we can't handle simply by adjusting pointers.
  71.  */
  72. #define RTS_CURBEFORE ((uint16) (1 << 0))
  73. #define RTS_MRKBEFORE ((uint16) (1 << 1))
  74. /* root page of an rtree */
  75. #define P_ROOT 0
  76. /*
  77.  * When we update a relation on which we're doing a scan, we need to
  78.  * check the scan and fix it if the update affected any of the pages it
  79.  * touches.  Otherwise, we can miss records that we should see.  The only
  80.  * times we need to do this are for deletions and splits. See the code in
  81.  * rtscan.c for how the scan is fixed.  These two contants tell us what sort
  82.  * of operation changed the index.
  83.  */
  84. #define RTOP_DEL 0
  85. #define RTOP_SPLIT 1
  86. /* defined in rtree.c */
  87. extern void freestack(RTSTACK *s);
  88. /* rget.c */
  89. extern RetrieveIndexResult rtgettuple(IndexScanDesc s, ScanDirection dir);
  90. /*
  91.  * RTree code.
  92.  * Defined in access/index-rtree/
  93.  */
  94. extern InsertIndexResult rtinsert(Relation r, Datum *datum, char *nulls,
  95.  ItemPointer ht_ctid, Relation heapRel);
  96. extern char *rtdelete(Relation r, ItemPointer tid);
  97. extern RetrieveIndexResult rtgettuple(IndexScanDesc s, ScanDirection dir);
  98. extern IndexScanDesc rtbeginscan(Relation r, bool fromEnd, uint16 nkeys,
  99. ScanKey key);
  100. extern void rtendscan(IndexScanDesc s);
  101. extern void rtmarkpos(IndexScanDesc s);
  102. extern void rtrestrpos(IndexScanDesc s);
  103. extern void rtrescan(IndexScanDesc s, bool fromEnd, ScanKey key);
  104. extern void rtbuild(Relation heap, Relation index, int natts,
  105. AttrNumber *attnum, IndexStrategy istrat, uint16 pcount,
  106. Datum *params, FuncIndexInfo *finfo, PredInfo *predInfo);
  107. extern void _rtdump(Relation r);
  108. /* rtscan.c */
  109. extern void rtadjscans(Relation r, int op, BlockNumber blkno,
  110.    OffsetNumber offnum);
  111. /* rtstrat.h */
  112. extern RegProcedure RTMapOperator(Relation r, AttrNumber attnum,
  113.   RegProcedure proc);
  114. #endif  /* RTREE_H */