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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * itup.h
  4.  *   POSTGRES index tuple definitions.
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: itup.h,v 1.17.2.1 1999/08/02 05:25:22 scrappy Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef ITUP_H
  14. #define ITUP_H
  15. #include "access/ibit.h"
  16. #include "access/tupdesc.h"
  17. #include "access/tupmacs.h"
  18. #include "storage/itemptr.h"
  19. #define MaxIndexAttributeNumber 7
  20. typedef struct IndexTupleData
  21. {
  22. ItemPointerData t_tid; /* reference TID to base tuple */
  23. /*
  24.  * t_info is layed out in the following fashion:
  25.  *
  26.  * 15th (leftmost) bit: "has nulls" bit 14th bit: "has varlenas" bit 13th
  27.  * bit: "has rules" bit - (removed ay 11/94) bits 12-0 bit: size of
  28.  * tuple.
  29.  */
  30. unsigned short t_info; /* various info about tuple */
  31. /*
  32.  * please make sure sizeof(IndexTupleData) is MAXALIGN'ed. See
  33.  * IndexInfoFindDataOffset() for the reason.
  34.  */
  35. } IndexTupleData; /* MORE DATA FOLLOWS AT END OF STRUCT */
  36. typedef IndexTupleData *IndexTuple;
  37. typedef struct InsertIndexResultData
  38. {
  39. ItemPointerData pointerData;
  40. } InsertIndexResultData;
  41. typedef InsertIndexResultData *InsertIndexResult;
  42. typedef struct RetrieveIndexResultData
  43. {
  44. ItemPointerData index_iptr;
  45. ItemPointerData heap_iptr;
  46. } RetrieveIndexResultData;
  47. typedef RetrieveIndexResultData *RetrieveIndexResult;
  48. /*-----------------
  49.  * PredInfo -
  50.  *   used for partial indices
  51.  *-----------------
  52.  */
  53. typedef struct PredInfo
  54. {
  55. Node    *pred;
  56. Node    *oldPred;
  57. } PredInfo;
  58. /* ----------------
  59.  * externs
  60.  * ----------------
  61.  */
  62. #define INDEX_SIZE_MASK 0x1FFF
  63. #define INDEX_NULL_MASK 0x8000
  64. #define INDEX_VAR_MASK 0x4000
  65. #define IndexTupleSize(itup)    (((IndexTuple) (itup))->t_info & 0x1FFF)
  66. #define IndexTupleDSize(itup)    ((itup).t_info & 0x1FFF)
  67. #define IndexTupleNoNulls(itup)  (!(((IndexTuple) (itup))->t_info & 0x8000))
  68. #define IndexTupleAllFixed(itup) (!(((IndexTuple) (itup))->t_info & 0x4000))
  69. #define IndexTupleHasMinHeader(itup) (IndexTupleNoNulls(itup))
  70. /*
  71.  * Takes an infomask as argument (primarily because this needs to be usable
  72.  * at index_formtuple time so enough space is allocated).
  73.  *
  74.  * Change me if adding an attribute to IndexTuples!!!!!!!!!!!
  75.  */
  76. #define IndexInfoFindDataOffset(t_info) 
  77. (!((unsigned short)(t_info) & INDEX_NULL_MASK)) ? 
  78. (Size)sizeof(IndexTupleData) 
  79. (Size)MAXALIGN(sizeof(IndexTupleData) + sizeof(IndexAttributeBitMapData)) 
  80. )
  81. /* ----------------
  82.  * index_getattr
  83.  *
  84.  * This gets called many times, so we macro the cacheable and NULL
  85.  * lookups, and call noncachegetattr() for the rest.
  86.  *
  87.  * ----------------
  88.  */
  89. #define index_getattr(tup, attnum, tupleDesc, isnull) 
  90. AssertMacro(PointerIsValid(isnull) && (attnum) > 0), 
  91. *(isnull) = false, 
  92. IndexTupleNoNulls(tup) ? 
  93. ((tupleDesc)->attrs[(attnum)-1]->attcacheoff != -1 || 
  94.  (attnum) == 1) ? 
  95. (Datum)fetchatt(&((tupleDesc)->attrs[(attnum)-1]), 
  96. (char *) (tup) + 
  97. IndexTupleHasMinHeader(tup) ? 
  98. sizeof (*(tup)) 
  99. IndexInfoFindDataOffset((tup)->t_info) 
  100. ) + 
  101. ((attnum) != 1) ? 
  102. (tupleDesc)->attrs[(attnum)-1]->attcacheoff 
  103. nocache_index_getattr((tup), (attnum), (tupleDesc), (isnull)) 
  104. (att_isnull((attnum)-1, (char *)(tup) + sizeof(*(tup)))) ? 
  105. *(isnull) = true, 
  106. (Datum)NULL 
  107. nocache_index_getattr((tup), (attnum), (tupleDesc), (isnull)) 
  108. )
  109. /* indextuple.h */
  110. extern IndexTuple index_formtuple(TupleDesc tupleDescriptor,
  111. Datum *value, char *null);
  112. extern Datum nocache_index_getattr(IndexTuple tup, int attnum,
  113.   TupleDesc tupleDesc, bool *isnull);
  114. extern RetrieveIndexResult FormRetrieveIndexResult(ItemPointer indexItemPointer,
  115. ItemPointer heapItemPointer);
  116. extern void CopyIndexTuple(IndexTuple source, IndexTuple *target);
  117. #endif  /* ITUP_H */