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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * relation.h
  4.  *   Definitions for internal planner nodes.
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: relation.h,v 1.32 1999/05/25 22:43:01 momjian Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef RELATION_H
  14. #define RELATION_H
  15. #include <nodes/parsenodes.h>
  16. #include <nodes/primnodes.h>
  17. /*
  18.  * Relids
  19.  * List of relation identifiers (indexes into the rangetable).
  20.  */
  21. typedef List *Relids;
  22. /*
  23.  * RelOptInfo
  24.  * Per-base-relation information
  25.  *
  26.  * Parts of this data structure are specific to various scan and join
  27.  * mechanisms.  It didn't seem worth creating new node types for them.
  28.  *
  29.  * relids - List of relation indentifiers
  30.  * indexed - true if the relation has secondary indices
  31.  * pages - number of pages in the relation
  32.  * tuples - number of tuples in the relation
  33.  * size - number of tuples in the relation after restrictions clauses
  34.  *    have been applied
  35.  * width - number of bytes per tuple in the relation after the
  36.  * appropriate projections have been done
  37.  * targetlist - List of TargetList nodes
  38.  * pathlist - List of Path nodes, one for each possible method of
  39.  *    generating the relation
  40.  * cheapestpath - least expensive Path (regardless of final order)
  41.  * pruneable - flag to let the planner know whether it can prune the plan
  42.  * space of this RelOptInfo or not.
  43.  *
  44.  *  * If the relation is a (secondary) index it will have the following
  45.  * three fields:
  46.  *
  47.  * classlist - List of PG_AMOPCLASS OIDs for the index
  48.  * indexkeys - List of base-relation attribute numbers that are index keys
  49.  * ordering - List of PG_OPERATOR OIDs which order the indexscan result
  50.  * relam   - the OID of the pg_am of the index
  51.  *
  52.  *  * The presence of the remaining fields depends on the restrictions
  53.  * and joins which the relation participates in:
  54.  *
  55.  * restrictinfo - List of RestrictInfo nodes, containing info about each
  56.  *  qualification clause in which this relation participates
  57.  * joininfo  - List of JoinInfo nodes, containing info about each join
  58.  * clause in which this relation participates
  59.  * innerjoin - List of Path nodes that represent indices that may be used
  60.  * as inner paths of nestloop joins
  61.  *
  62.  * NB. the last element of the arrays classlist, indexkeys and ordering
  63.  *    is always 0. 2/95 - ay
  64.  */
  65. typedef struct RelOptInfo
  66. {
  67. NodeTag type;
  68. /* all relations: */
  69. Relids relids; /* integer list of base relids involved */
  70. /* catalog statistics information */
  71. bool indexed;
  72. int pages;
  73. int tuples;
  74. int size;
  75. int width;
  76. /* materialization information */
  77. List    *targetlist;
  78. List    *pathlist; /* Path structures */
  79. struct Path *cheapestpath;
  80. bool pruneable;
  81. /* used solely by indices: */
  82. Oid    *classlist; /* classes of AM operators */
  83. int    *indexkeys; /* keys over which we're indexing */
  84. Oid relam; /* OID of the access method (in pg_am) */
  85. Oid indproc;
  86. List    *indpred;
  87. /* used by various scans and joins: */
  88. Oid    *ordering; /* OID of operators in sort order */
  89. List    *restrictinfo; /* RestrictInfo structures */
  90. List    *joininfo; /* JoinInfo structures */
  91. List    *innerjoin;
  92. } RelOptInfo;
  93. extern Var *get_expr(TargetEntry *foo);
  94. extern Var *get_groupclause_expr(GroupClause *groupClause, List *targetList);
  95. typedef struct MergeOrder
  96. {
  97. NodeTag type;
  98. Oid join_operator;
  99. Oid left_operator;
  100. Oid right_operator;
  101. Oid left_type;
  102. Oid right_type;
  103. } MergeOrder;
  104. typedef enum OrderType
  105. {
  106. MERGE_ORDER, SORTOP_ORDER
  107. } OrderType;
  108. typedef struct PathOrder
  109. {
  110. NodeTag type;
  111. OrderType ordtype;
  112. union
  113. {
  114. Oid    *sortop;
  115. MergeOrder *merge;
  116. } ord;
  117. } PathOrder;
  118. typedef struct Path
  119. {
  120. NodeTag type;
  121. RelOptInfo *parent;
  122. Cost path_cost;
  123. NodeTag pathtype;
  124. PathOrder  *pathorder;
  125. List    *pathkeys; /* This is a List of List of Var nodes.
  126.  * See the top of
  127.  * optimizer/path/pathkeys.c for more
  128.  * information. */
  129. Cost outerjoincost;
  130. Relids joinid;
  131. List    *loc_restrictinfo;
  132. } Path;
  133. typedef struct IndexPath
  134. {
  135. Path path;
  136. List    *indexid;
  137. List    *indexqual;
  138. int    *indexkeys; /* to transform heap attnos into index
  139.  * ones */
  140. } IndexPath;
  141. typedef struct NestPath
  142. {
  143. Path path;
  144. List    *pathinfo;
  145. Path    *outerjoinpath;
  146. Path    *innerjoinpath;
  147. } NestPath;
  148. typedef NestPath JoinPath;
  149. typedef struct MergePath
  150. {
  151. JoinPath jpath;
  152. List    *path_mergeclauses;
  153. List    *outersortkeys;
  154. List    *innersortkeys;
  155. } MergePath;
  156. typedef struct HashPath
  157. {
  158. JoinPath jpath;
  159. List    *path_hashclauses;
  160. List    *outerhashkeys;
  161. List    *innerhashkeys;
  162. } HashPath;
  163. /*
  164.  * Keys
  165.  */
  166. typedef struct OrderKey
  167. {
  168. NodeTag type;
  169. int attribute_number;
  170. Index array_index;
  171. } OrderKey;
  172. typedef struct JoinKey
  173. {
  174. NodeTag type;
  175. Var    *outer;
  176. Var    *inner;
  177. } JoinKey;
  178. /*
  179.  * clause info
  180.  */
  181. typedef struct RestrictInfo
  182. {
  183. NodeTag type;
  184. Expr    *clause; /* should be an OP clause */
  185. Cost selectivity;
  186. bool notclause;
  187. List    *indexids;
  188. /* mergejoin only */
  189. MergeOrder *mergejoinorder;
  190. /* hashjoin only */
  191. Oid hashjoinoperator;
  192. Relids restrictinfojoinid;
  193. } RestrictInfo;
  194. typedef struct JoinMethod
  195. {
  196. NodeTag type;
  197. List    *jmkeys;
  198. List    *clauses;
  199. } JoinMethod;
  200. typedef struct HashInfo
  201. {
  202. JoinMethod jmethod;
  203. Oid hashop;
  204. } HashInfo;
  205. typedef struct MergeInfo
  206. {
  207. JoinMethod jmethod;
  208. MergeOrder *m_ordering;
  209. } MergeInfo;
  210. typedef struct JoinInfo
  211. {
  212. NodeTag type;
  213. Relids unjoined_relids;
  214. List    *jinfo_restrictinfo;
  215. bool mergejoinable;
  216. bool hashjoinable;
  217. } JoinInfo;
  218. typedef struct Iter
  219. {
  220. NodeTag type;
  221. Node    *iterexpr;
  222. Oid itertype; /* type of the iter expr (use for type
  223.  * checking) */
  224. } Iter;
  225. /*
  226.  * Stream:
  227.  * A stream represents a root-to-leaf path in a plan tree (i.e. a tree of
  228.  * JoinPaths and Paths).  The stream includes pointers to all Path nodes,
  229.  * as well as to any clauses that reside above Path nodes. This structure
  230.  * is used to make Path nodes and clauses look similar, so that Predicate
  231.  * Migration can run.
  232.  *
  233.  * pathptr -- pointer to the current path node
  234.  * cinfo -- if NULL, this stream node referes to the path node.
  235.  *   Otherwise this is a pointer to the current clause.
  236.  * clausetype -- whether cinfo is in loc_restrictinfo or pathinfo in the
  237.  *   path node
  238.  * upstream -- linked list pointer upwards
  239.  * downstream -- ditto, downwards
  240.  * groupup -- whether or not this node is in a group with the node upstream
  241.  * groupcost -- total cost of the group that node is in
  242.  * groupsel -- total selectivity of the group that node is in
  243.  */
  244. typedef struct Stream *StreamPtr;
  245. typedef struct Stream
  246. {
  247. NodeTag type;
  248. Path    *pathptr;
  249. RestrictInfo *cinfo;
  250. int    *clausetype;
  251. struct Stream *upstream;
  252. struct Stream *downstream;
  253. bool groupup;
  254. Cost groupcost;
  255. Cost groupsel;
  256. } Stream;
  257. #endif  /* RELATION_H */