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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * plannodes.h
  4.  *   definitions for query plan nodes
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: plannodes.h,v 1.27 1999/05/25 22:42:58 momjian Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef PLANNODES_H
  14. #define PLANNODES_H
  15. #include <nodes/execnodes.h>
  16. /* ----------------------------------------------------------------
  17.  * Executor State types are used in the plannode structures
  18.  * so we have to include their definitions too.
  19.  *
  20.  * Node Type node information used by executor
  21.  *
  22.  * control nodes
  23.  *
  24.  * Result ResultState resstate;
  25.  * Append AppendState appendstate;
  26.  *
  27.  * scan nodes
  28.  *
  29.  * Scan *** CommonScanState scanstate;
  30.  * IndexScan IndexScanState indxstate;
  31.  *
  32.  *   (*** nodes which inherit Scan also inherit scanstate)
  33.  *
  34.  * join nodes
  35.  *
  36.  * NestLoop NestLoopState nlstate;
  37.  * MergeJoin MergeJoinState mergestate;
  38.  * HashJoin HashJoinState hashjoinstate;
  39.  *
  40.  * materialize nodes
  41.  *
  42.  * Material MaterialState matstate;
  43.  * Sort SortState sortstate;
  44.  * Unique UniqueState uniquestate;
  45.  * Hash HashState hashstate;
  46.  *
  47.  * ----------------------------------------------------------------
  48.  */
  49. /* ----------------------------------------------------------------
  50.  * node definitions
  51.  * ----------------------------------------------------------------
  52.  */
  53. /* ----------------
  54.  * Plan node
  55.  * ----------------
  56.  */
  57. typedef struct Plan
  58. {
  59. NodeTag type;
  60. Cost cost;
  61. int plan_size;
  62. int plan_width;
  63. int plan_tupperpage;
  64. EState    *state; /* at execution time, state's of
  65.  * individual nodes point to one EState
  66.  * for the whole top-level plan */
  67. List    *targetlist;
  68. List    *qual; /* Node* or List* ?? */
  69. struct Plan *lefttree;
  70. struct Plan *righttree;
  71. List    *extParam; /* indices of _all_ _external_ PARAM_EXEC
  72.  * for this plan in global
  73.  * es_param_exec_vals. Params from
  74.  * setParam from initPlan-s are not
  75.  * included, but their execParam-s are
  76.  * here!!! */
  77. List    *locParam; /* someones from setParam-s */
  78. List    *chgParam; /* list of changed ones from the above */
  79. List    *initPlan; /* Init Plan nodes (un-correlated expr
  80.  * subselects) */
  81. List    *subPlan; /* Other SubPlan nodes */
  82. /*
  83.  * We really need in some TopPlan node to store range table and
  84.  * resultRelation from Query there and get rid of Query itself from
  85.  * Executor. Some other stuff like below could be put there, too.
  86.  */
  87. int nParamExec; /* Number of them in entire query. This is
  88.  * to get Executor know about how many
  89.  * param_exec there are in query plan. */
  90. } Plan;
  91. /* ----------------
  92.  * these are are defined to avoid confusion problems with "left"
  93.  * and "right" and "inner" and "outer".  The convention is that
  94.  * the "left" plan is the "outer" plan and the "right" plan is
  95.  * the inner plan, but these make the code more readable.
  96.  * ----------------
  97.  */
  98. #define innerPlan(node) (((Plan *)(node))->righttree)
  99. #define outerPlan(node) (((Plan *)(node))->lefttree)
  100. /*
  101.  * ===============
  102.  * Top-level nodes
  103.  * ===============
  104.  */
  105. /* all plan nodes "derive" from the Plan structure by having the
  106.    Plan structure as the first field.  This ensures that everything works
  107.    when nodes are cast to Plan's.  (node pointers are frequently cast to Plan*
  108.    when passed around generically in the executor */
  109. /* ----------------
  110.  *  result node -
  111.  * returns tuples from outer plan that satisfy the qualifications
  112.  * ----------------
  113.  */
  114. typedef struct Result
  115. {
  116. Plan plan;
  117. Node    *resconstantqual;
  118. ResultState *resstate;
  119. } Result;
  120. /* ----------------
  121.  * append node
  122.  * ----------------
  123.  */
  124. typedef struct Append
  125. {
  126. Plan plan;
  127. List    *appendplans;
  128. List    *unionrtables; /* List of range tables, one for each
  129.  * union query. */
  130. Index inheritrelid; /* The range table has to be changed for
  131.  * inheritance. */
  132. List    *inheritrtable;
  133. AppendState *appendstate;
  134. } Append;
  135. /*
  136.  * ==========
  137.  * Scan nodes
  138.  * ==========
  139.  */
  140. typedef struct Scan
  141. {
  142. Plan plan;
  143. Index scanrelid; /* relid is index into the range table */
  144. CommonScanState *scanstate;
  145. } Scan;
  146. /* ----------------
  147.  * sequential scan node
  148.  * ----------------
  149.  */
  150. typedef Scan SeqScan;
  151. /* ----------------
  152.  * index scan node
  153.  * ----------------
  154.  */
  155. typedef struct IndexScan
  156. {
  157. Scan scan;
  158. List    *indxid;
  159. List    *indxqual;
  160. List    *indxqualorig;
  161. IndexScanState *indxstate;
  162. } IndexScan;
  163. /*
  164.  * ==========
  165.  * Join nodes
  166.  * ==========
  167.  */
  168. /* ----------------
  169.  * Join node
  170.  * ----------------
  171.  */
  172. typedef Plan Join;
  173. /* ----------------
  174.  * nest loop join node
  175.  * ----------------
  176.  */
  177. typedef struct NestLoop
  178. {
  179. Join join;
  180. NestLoopState *nlstate;
  181. } NestLoop;
  182. /* ----------------
  183.  * merge join node
  184.  * ----------------
  185.  */
  186. typedef struct MergeJoin
  187. {
  188. Join join;
  189. List    *mergeclauses;
  190. MergeJoinState *mergestate;
  191. } MergeJoin;
  192. /* ----------------
  193.  * hash join (probe) node
  194.  * ----------------
  195.  */
  196. typedef struct HashJoin
  197. {
  198. Join join;
  199. List    *hashclauses;
  200. Oid hashjoinop;
  201. HashJoinState *hashjoinstate;
  202. bool hashdone;
  203. } HashJoin;
  204. /* ---------------
  205.  * aggregate node
  206.  * ---------------
  207.  */
  208. typedef struct Agg
  209. {
  210. Plan plan;
  211. List    *aggs;
  212. AggState   *aggstate;
  213. } Agg;
  214. /* ---------------
  215.  *  group node -
  216.  * use for queries with GROUP BY specified.
  217.  *
  218.  * If tuplePerGroup is true, one tuple (with group columns only) is
  219.  * returned for each group and NULL is returned when there are no more
  220.  * groups. Otherwise, all the tuples of a group are returned with a
  221.  * NULL returned at the end of each group. (see nodeGroup.c for details)
  222.  * ---------------
  223.  */
  224. typedef struct Group
  225. {
  226. Plan plan;
  227. bool tuplePerGroup; /* what tuples to return (see above) */
  228. int numCols; /* number of group columns */
  229. AttrNumber *grpColIdx; /* index into the target list */
  230. GroupState *grpstate;
  231. } Group;
  232. /*
  233.  * ==========
  234.  * Noname nodes
  235.  * ==========
  236.  */
  237. typedef struct Noname
  238. {
  239. Plan plan;
  240. Oid nonameid;
  241. int keycount;
  242. } Noname;
  243. /* ----------------
  244.  * materialization node
  245.  * ----------------
  246.  */
  247. typedef struct Material
  248. {
  249. Plan plan; /* noname node flattened out */
  250. Oid nonameid;
  251. int keycount;
  252. MaterialState *matstate;
  253. } Material;
  254. /* ----------------
  255.  * sort node
  256.  * ----------------
  257.  */
  258. typedef struct Sort
  259. {
  260. Plan plan; /* noname node flattened out */
  261. Oid nonameid;
  262. int keycount;
  263. SortState  *sortstate;
  264. void    *psortstate;
  265. bool cleaned;
  266. } Sort;
  267. /* ----------------
  268.  * unique node
  269.  * ----------------
  270.  */
  271. typedef struct Unique
  272. {
  273. Plan plan; /* noname node flattened out */
  274. Oid nonameid;
  275. int keycount;
  276. char    *uniqueAttr; /* NULL if all attrs, or unique attribute
  277.  * name */
  278. AttrNumber uniqueAttrNum; /* attribute number of attribute to select
  279.  * distinct on */
  280. UniqueState *uniquestate;
  281. } Unique;
  282. /* ----------------
  283.  * hash build node
  284.  * ----------------
  285.  */
  286. typedef struct Hash
  287. {
  288. Plan plan;
  289. Var    *hashkey;
  290. HashState  *hashstate;
  291. } Hash;
  292. #ifdef NOT_USED
  293. /* -------------------
  294.  * Tee node information
  295.  *
  296.  *   leftParent : the left parent of this node
  297.  *   rightParent: the right parent of this node
  298.  * -------------------
  299. */
  300. typedef struct Tee
  301. {
  302. Plan plan;
  303. Plan    *leftParent;
  304. Plan    *rightParent;
  305. TeeState   *teestate;
  306. char    *teeTableName; /* the name of the table to materialize
  307.  * the tee into */
  308. List    *rtentries; /* the range table for the plan below the
  309.  * Tee may be different than the parent
  310.  * plans */
  311. } Tee;
  312. #endif
  313. /* ---------------------
  314.  * SubPlan node
  315.  * ---------------------
  316.  */
  317. typedef struct SubPlan
  318. {
  319. NodeTag type;
  320. Plan    *plan; /* subselect plan itself */
  321. int plan_id; /* dummy thing because of we haven't equal
  322.  * funcs for plan nodes... actually, we
  323.  * could put *plan itself somewhere else
  324.  * (TopPlan node ?)... */
  325. List    *rtable; /* range table */
  326. List    *setParam; /* non-correlated EXPR & EXISTS subqueries
  327.  * have to set some Params for paren Plan */
  328. List    *parParam; /* indices of corr. Vars from parent plan */
  329. SubLink    *sublink; /* SubLink node for subselects in WHERE
  330.  * and HAVING */
  331. bool shutdown; /* shutdown plan if TRUE */
  332. } SubPlan;
  333. #endif  /* PLANNODES_H */