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

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * primnodes.h
  4.  *   Definitions for parse tree/query tree ("primitive") nodes.
  5.  *
  6.  *
  7.  * Copyright (c) 1994, Regents of the University of California
  8.  *
  9.  * $Id: primnodes.h,v 1.29 1999/05/25 22:42:59 momjian Exp $
  10.  *
  11.  *-------------------------------------------------------------------------
  12.  */
  13. #ifndef PRIMNODES_H
  14. #define PRIMNODES_H
  15. #include <utils/fcache.h>
  16. #include <access/attnum.h>
  17. #include <nodes/pg_list.h>
  18. /* ----------------------------------------------------------------
  19.  * node definitions
  20.  * ----------------------------------------------------------------
  21.  */
  22. /* ----------------
  23.  * Resdom (Result Domain)
  24.  * resno - attribute number
  25.  * restype - type of the resdom
  26.  * restypmod - type-specific modifier of the result
  27.  * resname - name of the resdom (could be NULL)
  28.  * reskey - order of key in a sort (for those > 0)
  29.  * reskeyop - sort operator Oid
  30.  * resgroupref - set to nonzero if referenced from a group by clause
  31.  * resjunk - set to true to eliminate the attribute
  32.  *   from final target list
  33.  *
  34.  * ----------------
  35.  */
  36. typedef struct Resdom
  37. {
  38. NodeTag type;
  39. AttrNumber resno;
  40. Oid restype;
  41. int32 restypmod;
  42. char    *resname;
  43. Index reskey;
  44. Oid reskeyop;
  45. Index resgroupref;
  46. bool resjunk;
  47. } Resdom;
  48. /* -------------
  49.  * Fjoin
  50.  * initialized - true if the Fjoin has already been initialized for
  51.  *   the current target list evaluation
  52.  * nNodes - The number of Iter nodes returning sets that the
  53.  *   node will flatten
  54.  * outerList - 1 or more Iter nodes
  55.  * inner - exactly one Iter node.  We eval every node in the
  56.  *   outerList once then eval the inner node to completion
  57.  *   pair the outerList result vector with each inner
  58.  *   result to form the full result.  When the inner has
  59.  *   been exhausted, we get the next outer result vector
  60.  *   and reset the inner.
  61.  * results - The complete (flattened) result vector
  62.  * alwaysNull - a null vector to indicate sets with a cardinality of
  63.  *   0, we treat them as the set {NULL}.
  64.  */
  65. typedef struct Fjoin
  66. {
  67. NodeTag type;
  68. bool fj_initialized;
  69. int fj_nNodes;
  70. List    *fj_innerNode;
  71. DatumPtr fj_results;
  72. BoolPtr fj_alwaysDone;
  73. } Fjoin;
  74. /* ----------------
  75.  * Expr
  76.  * typeOid - oid of the type of this expression
  77.  * opType - type of this expression
  78.  * oper - the Oper node if it is an OPER_EXPR or the
  79.  *   Func node if it is a FUNC_EXPR
  80.  * args - arguments to this expression
  81.  * ----------------
  82.  */
  83. typedef enum OpType
  84. {
  85. OP_EXPR, FUNC_EXPR, OR_EXPR, AND_EXPR, NOT_EXPR, SUBPLAN_EXPR
  86. } OpType;
  87. typedef struct Expr
  88. {
  89. NodeTag type;
  90. Oid typeOid; /* oid of the type of this expr */
  91. OpType opType; /* type of the op */
  92. Node    *oper; /* could be Oper or Func or SubPlan */
  93. List    *args; /* list of argument nodes */
  94. } Expr;
  95. /* ----------------
  96.  * Var
  97.  * varno - index of this var's relation in the range table
  98.  *   (could be INNER or OUTER)
  99.  * varattno - attribute number of this var, or zero for all
  100.  * vartype - pg_type tuple oid for the type of this var
  101.  * vartypmod - pg_attribute typmod value
  102.  * varlevelsup - for subquery variables referencing outer relations
  103.  * varnoold - keep varno around in case it got changed to INNER/
  104.  *   OUTER (see match_varid)
  105.  * varoattno - attribute number of this var
  106.  *   [ '(varnoold varoattno) was varid   -ay 2/95]
  107.  * ----------------
  108.  */
  109. #define    INNER 65000
  110. #define    OUTER 65001
  111. #define    PRS2_CURRENT_VARNO 1
  112. #define    PRS2_NEW_VARNO 2
  113. typedef struct Var
  114. {
  115. NodeTag type;
  116. Index varno;
  117. AttrNumber varattno;
  118. Oid vartype;
  119. int32 vartypmod;
  120. Index varlevelsup; /* erased by upper optimizer */
  121. Index varnoold; /* only used by optimizer */
  122. AttrNumber varoattno; /* only used by optimizer */
  123. } Var;
  124. /* ----------------
  125.  * Oper
  126.  * opno - PG_OPERATOR OID of the operator
  127.  * opid - PG_PROC OID for the operator
  128.  * opresulttype - PG_TYPE OID of the operator's return value
  129.  * opsize - size of return result (cached by executor)
  130.  * op_fcache - XXX comment me.
  131.  *
  132.  * ----
  133.  * NOTE: in the good old days 'opno' used to be both (or either, or
  134.  * neither) the pg_operator oid, and/or the pg_proc oid depending
  135.  * on the postgres module in question (parser->pg_operator,
  136.  * executor->pg_proc, planner->both), the mood of the programmer,
  137.  * and the phase of the moon (rumors that it was also depending on the day
  138.  * of the week are probably false). To make things even more postgres-like
  139.  * (i.e. a mess) some comments were referring to 'opno' using the name
  140.  * 'opid'. Anyway, now we have two separate fields, and of course that
  141.  * immediately removes all bugs from the code... [ sp :-) ].
  142.  * ----------------
  143.  */
  144. typedef struct Oper
  145. {
  146. NodeTag type;
  147. Oid opno;
  148. Oid opid;
  149. Oid opresulttype;
  150. int opsize;
  151. FunctionCachePtr op_fcache;
  152. } Oper;
  153. /* ----------------
  154.  * Const
  155.  * consttype - PG_TYPE OID of the constant's value
  156.  * constlen - length in bytes of the constant's value
  157.  * constvalue - the constant's value
  158.  * constisnull - whether the constant is null
  159.  * (if true, the other fields are undefined)
  160.  * constbyval - whether the information in constvalue
  161.  * if passed by value.  If true, then all the information
  162.  * is stored in the datum. If false, then the datum
  163.  * contains a pointer to the information.
  164.  * constisset - whether the const represents a set.  The const
  165.  * value corresponding will be the query that defines
  166.  * the set.
  167.  * ----------------
  168.  */
  169. typedef struct Const
  170. {
  171. NodeTag type;
  172. Oid consttype;
  173. int constlen;
  174. Datum constvalue;
  175. bool constisnull;
  176. bool constbyval;
  177. bool constisset;
  178. bool constiscast;
  179. } Const;
  180. /* ----------------
  181.  * Param
  182.  * paramkind - specifies the kind of parameter. The possible values
  183.  * for this field are specified in "params.h", and they are:
  184.  *
  185.  * PARAM_NAMED: The parameter has a name, i.e. something
  186.  * like `$.salary' or `$.foobar'.
  187.  * In this case field `paramname' must be a valid Name.
  188.  *
  189.  * PARAM_NUM:  The parameter has only a numeric identifier,
  190.  * i.e. something like `$1', `$2' etc.
  191.  * The number is contained in the `paramid' field.
  192.  *
  193.  * PARAM_NEW:  Used in PRS2 rule, similar to PARAM_NAMED.
  194.  *  The `paramname' and `paramid' refer to the "NEW" tuple
  195.  *  The `pramname' is the attribute name and `paramid'
  196.  *  is the attribute number.
  197.  *
  198.  * PARAM_OLD:  Same as PARAM_NEW, but in this case we refer to
  199.  * the "OLD" tuple.
  200.  *
  201.  * paramid - numeric identifier for literal-constant parameters ("$1")
  202.  * paramname - attribute name for tuple-substitution parameters ("$.foo")
  203.  * paramtype - PG_TYPE OID of the parameter's value
  204.  * param_tlist - allows for projection in a param node.
  205.  * ----------------
  206.  */
  207. typedef struct Param
  208. {
  209. NodeTag type;
  210. int paramkind;
  211. AttrNumber paramid;
  212. char    *paramname;
  213. Oid paramtype;
  214. List    *param_tlist;
  215. } Param;
  216. /* ----------------
  217.  * Func
  218.  * funcid - PG_FUNCTION OID of the function
  219.  * functype - PG_TYPE OID of the function's return value
  220.  * funcisindex - the function can be evaluated by scanning an index
  221.  *   (set during query optimization)
  222.  * funcsize - size of return result (cached by executor)
  223.  * func_fcache - runtime state while running this function.  Where
  224.  *   we are in the execution of the function if it
  225.  *   returns more than one value, etc.
  226.  *   See utils/fcache.h
  227.  * func_tlist - projection of functions returning tuples
  228.  * func_planlist - result of planning this func, if it's a PQ func
  229.  * ----------------
  230.  */
  231. typedef struct Func
  232. {
  233. NodeTag type;
  234. Oid funcid;
  235. Oid functype;
  236. bool funcisindex;
  237. int funcsize;
  238. FunctionCachePtr func_fcache;
  239. List    *func_tlist;
  240. List    *func_planlist;
  241. } Func;
  242. /* ----------------
  243.  * Aggref
  244.  * aggname - name of the aggregate
  245.  * basetype - base type Oid of the aggregate
  246.  * aggtype - type Oid of final result of the aggregate
  247.  * target - attribute or expression we are aggregating on
  248.  * aggno - index to ecxt_values
  249.  * ----------------
  250.  */
  251. typedef struct Aggref
  252. {
  253. NodeTag type;
  254. char    *aggname;
  255. Oid basetype;
  256. Oid aggtype;
  257. Node    *target;
  258. int aggno;
  259. bool usenulls;
  260. } Aggref;
  261. /* ----------------
  262.  * SubLink
  263.  * subLinkType - EXISTS, ALL, ANY, EXPR
  264.  * useor - TRUE for <>
  265.  * lefthand - list of Var/Const nodes on the left
  266.  * oper - list of Oper nodes
  267.  * subselect - subselect as Query* or parsetree
  268.  * ----------------
  269.  */
  270. typedef enum SubLinkType
  271. {
  272. EXISTS_SUBLINK, ALL_SUBLINK, ANY_SUBLINK, EXPR_SUBLINK
  273. } SubLinkType;
  274. typedef struct SubLink
  275. {
  276. NodeTag type;
  277. SubLinkType subLinkType;
  278. bool useor;
  279. List    *lefthand;
  280. List    *oper;
  281. Node    *subselect;
  282. } SubLink;
  283. /* ----------------
  284.  * Array
  285.  * arrayelemtype - base type of the array's elements (homogenous!)
  286.  * arrayelemlength - length of that type
  287.  * arrayelembyval - can you pass this element by value?
  288.  * arrayndim - number of dimensions of the array
  289.  * arraylow - base for array indexing
  290.  * arrayhigh - limit for array indexing
  291.  * arraylen -
  292.  * ----------------
  293.  *
  294.  * memo from mao: the array support we inherited from 3.1 is just
  295.  * wrong. when time exists, we should redesign this stuff to get
  296.  * around a bunch of unfortunate implementation decisions made there.
  297.  */
  298. typedef struct Array
  299. {
  300. NodeTag type;
  301. Oid arrayelemtype;
  302. int arrayelemlength;
  303. bool arrayelembyval;
  304. int arrayndim;
  305. IntArray arraylow;
  306. IntArray arrayhigh;
  307. int arraylen;
  308. } Array;
  309. /* ----------------
  310.  * ArrayRef:
  311.  * refelemtype - type of the element referenced here
  312.  * refelemlength - length of that type
  313.  * refelembyval - can you pass this element type by value?
  314.  * refupperindexpr - expressions that evaluate to upper array index
  315.  * reflowerexpr- the expressions that evaluate to a lower array index
  316.  * refexpr - the expression that evaluates to an array
  317.  * refassignexpr- the expression that evaluates to the new value
  318.  * to be assigned to the array in case of replace.
  319.  * ----------------
  320.  */
  321. typedef struct ArrayRef
  322. {
  323. NodeTag type;
  324. int refattrlength;
  325. int refelemlength;
  326. Oid refelemtype;
  327. bool refelembyval;
  328. List    *refupperindexpr;
  329. List    *reflowerindexpr;
  330. Node    *refexpr;
  331. Node    *refassgnexpr;
  332. } ArrayRef;
  333. #endif  /* PRIMNODES_H */