]> git.8kb.co.uk Git - pgpool-ii/pgpool-ii_2.2.5/blob - parser/primnodes.h
Attempt to send a proper failure message to frontend when authentication
[pgpool-ii/pgpool-ii_2.2.5] / parser / primnodes.h
1 /*-------------------------------------------------------------------------
2  *
3  * primnodes.h
4  *        Definitions for "primitive" node types, those that are used in more
5  *        than one of the parse/plan/execute stages of the query pipeline.
6  *        Currently, these are mostly nodes for executable expressions
7  *        and join trees.
8  *
9  *
10  * Portions Copyright (c) 2003-2008, PgPool Global Development Group
11  * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
12  * Portions Copyright (c) 1994, Regents of the University of California
13  *
14  * $PostgreSQL: pgsql/src/include/nodes/primnodes.h,v 1.133 2007/08/26 21:44:25 tgl Exp $
15  *
16  *-------------------------------------------------------------------------
17  */
18 #ifndef PRIMNODES_H
19 #define PRIMNODES_H
20
21 #include "pg_list.h"
22
23
24 /* ----------------------------------------------------------------
25  *                                              node definitions
26  * ----------------------------------------------------------------
27  */
28
29 /*
30  * Alias -
31  *        specifies an alias for a range variable; the alias might also
32  *        specify renaming of columns within the table.
33  *
34  * Note: colnames is a list of Value nodes (always strings).  In Alias structs
35  * associated with RTEs, there may be entries corresponding to dropped
36  * columns; these are normally empty strings ("").      See parsenodes.h for info.
37  */
38 typedef struct Alias
39 {
40         NodeTag         type;
41         char       *aliasname;          /* aliased rel name (never qualified) */
42         List       *colnames;           /* optional list of column aliases */
43 } Alias;
44
45 typedef enum InhOption
46 {
47         INH_NO,                                         /* Do NOT scan child tables */
48         INH_YES,                                        /* DO scan child tables */
49         INH_DEFAULT                                     /* Use current SQL_inheritance option */
50 } InhOption;
51
52 /* What to do at commit time for temporary relations */
53 typedef enum OnCommitAction
54 {
55         ONCOMMIT_NOOP,                          /* No ON COMMIT clause (do nothing) */
56         ONCOMMIT_PRESERVE_ROWS,         /* ON COMMIT PRESERVE ROWS (do nothing) */
57         ONCOMMIT_DELETE_ROWS,           /* ON COMMIT DELETE ROWS */
58         ONCOMMIT_DROP                           /* ON COMMIT DROP */
59 } OnCommitAction;
60
61 /*
62  * RangeVar - range variable, used in FROM clauses
63  *
64  * Also used to represent table names in utility statements; there, the alias
65  * field is not used, and inhOpt shows whether to apply the operation
66  * recursively to child tables.  In some contexts it is also useful to carry
67  * a TEMP table indication here.
68  */
69 typedef struct RangeVar
70 {
71         NodeTag         type;
72         char       *catalogname;        /* the catalog (database) name, or NULL */
73         char       *schemaname;         /* the schema name, or NULL */
74         char       *relname;            /* the relation/sequence name */
75         InhOption       inhOpt;                 /* expand rel by inheritance? recursively act
76                                                                  * on children? */
77         bool            istemp;                 /* is this a temp relation/sequence? */
78         Alias      *alias;                      /* table alias & optional column aliases */
79 } RangeVar;
80
81 /*
82  * IntoClause - target information for SELECT INTO and CREATE TABLE AS
83  */
84 typedef struct IntoClause
85 {
86         NodeTag         type;
87
88         RangeVar   *rel;                        /* target relation name */
89         List       *colNames;           /* column names to assign, or NIL */
90         List       *options;            /* options from WITH clause */
91         OnCommitAction onCommit;        /* what do we do at COMMIT? */
92         char       *tableSpaceName;     /* table space to use, or NULL */
93 } IntoClause;
94
95
96 /* ----------------------------------------------------------------
97  *                                      node types for executable expressions
98  * ----------------------------------------------------------------
99  */
100
101 /*
102  * Expr - generic superclass for executable-expression nodes
103  *
104  * All node types that are used in executable expression trees should derive
105  * from Expr (that is, have Expr as their first field).  Since Expr only
106  * contains NodeTag, this is a formality, but it is an easy form of
107  * documentation.  See also the ExprState node types in execnodes.h.
108  */
109 typedef struct Expr
110 {
111         NodeTag         type;
112 } Expr;
113
114 /*
115  * Var - expression node representing a variable (ie, a table column)
116  *
117  * Note: during parsing/planning, varnoold/varoattno are always just copies
118  * of varno/varattno.  At the tail end of planning, Var nodes appearing in
119  * upper-level plan nodes are reassigned to point to the outputs of their
120  * subplans; for example, in a join node varno becomes INNER or OUTER and
121  * varattno becomes the index of the proper element of that subplan's target
122  * list.  But varnoold/varoattno continue to hold the original values.
123  * The code doesn't really need varnoold/varoattno, but they are very useful
124  * for debugging and interpreting completed plans, so we keep them around.
125  */
126 #define    INNER                65000
127 #define    OUTER                65001
128
129 #define    PRS2_OLD_VARNO                       1
130 #define    PRS2_NEW_VARNO                       2
131
132 typedef struct Var
133 {
134         Expr            xpr;
135         Index           varno;                  /* index of this var's relation in the range
136                                                                  * table (could also be INNER or OUTER) */
137         AttrNumber      varattno;               /* attribute number of this var, or zero for
138                                                                  * all */
139         Oid                     vartype;                /* pg_type OID for the type of this var */
140         int32           vartypmod;              /* pg_attribute typmod value */
141         Index           varlevelsup;
142
143         /*
144          * for subquery variables referencing outer relations; 0 in a normal var,
145          * >0 means N levels up
146          */
147         Index           varnoold;               /* original value of varno, for debugging */
148         AttrNumber      varoattno;              /* original value of varattno */
149 } Var;
150
151 /*
152  * Const
153  */
154 typedef struct Const
155 {
156         Expr            xpr;
157         Oid                     consttype;              /* pg_type OID of the constant's datatype */
158         int32           consttypmod;    /* typmod value, if any */
159         int                     constlen;               /* typlen of the constant's datatype */
160         Datum           constvalue;             /* the constant's value */
161         bool            constisnull;    /* whether the constant is null (if true,
162                                                                  * constvalue is undefined) */
163         bool            constbyval;             /* whether this datatype is passed by value.
164                                                                  * If true, then all the information is stored
165                                                                  * in the Datum. If false, then the Datum
166                                                                  * contains a pointer to the information. */
167 } Const;
168
169 /* ----------------
170  * Param
171  *              paramkind - specifies the kind of parameter. The possible values
172  *              for this field are:
173  *
174  *              PARAM_EXTERN:  The parameter value is supplied from outside the plan.
175  *                              Such parameters are numbered from 1 to n.
176  *
177  *              PARAM_EXEC:  The parameter is an internal executor parameter, used
178  *                              for passing values into and out of sub-queries.
179  *                              For historical reasons, such parameters are numbered from 0.
180  *                              These numbers are independent of PARAM_EXTERN numbers.
181  *
182  *              PARAM_SUBLINK:  The parameter represents an output column of a SubLink
183  *                              node's sub-select.  The column number is contained in the
184  *                              `paramid' field.  (This type of Param is converted to
185  *                              PARAM_EXEC during planning.)
186  *
187  * Note: currently, paramtypmod is valid for PARAM_SUBLINK Params, and for
188  * PARAM_EXEC Params generated from them; it is always -1 for PARAM_EXTERN
189  * params, since the APIs that supply values for such parameters don't carry
190  * any typmod info.
191  * ----------------
192  */
193 typedef enum ParamKind
194 {
195         PARAM_EXTERN,
196         PARAM_EXEC,
197         PARAM_SUBLINK
198 } ParamKind;
199
200 typedef struct Param
201 {
202         Expr            xpr;
203         ParamKind       paramkind;              /* kind of parameter. See above */
204         int                     paramid;                /* numeric ID for parameter */
205         Oid                     paramtype;              /* pg_type OID of parameter's datatype */
206         int32           paramtypmod;    /* typmod value, if known */
207 } Param;
208
209 /*
210  * Aggref
211  */
212 typedef struct Aggref
213 {
214         Expr            xpr;
215         Oid                     aggfnoid;               /* pg_proc Oid of the aggregate */
216         Oid                     aggtype;                /* type Oid of result of the aggregate */
217         List       *args;                       /* arguments to the aggregate */
218         Index           agglevelsup;    /* > 0 if agg belongs to outer query */
219         bool            aggstar;                /* TRUE if argument list was really '*' */
220         bool            aggdistinct;    /* TRUE if it's agg(DISTINCT ...) */
221 } Aggref;
222
223 /* ----------------
224  *      ArrayRef: describes an array subscripting operation
225  *
226  * An ArrayRef can describe fetching a single element from an array,
227  * fetching a subarray (array slice), storing a single element into
228  * an array, or storing a slice.  The "store" cases work with an
229  * initial array value and a source value that is inserted into the
230  * appropriate part of the array; the result of the operation is an
231  * entire new modified array value.
232  *
233  * If reflowerindexpr = NIL, then we are fetching or storing a single array
234  * element at the subscripts given by refupperindexpr.  Otherwise we are
235  * fetching or storing an array slice, that is a rectangular subarray
236  * with lower and upper bounds given by the index expressions.
237  * reflowerindexpr must be the same length as refupperindexpr when it
238  * is not NIL.
239  *
240  * Note: the result datatype is the element type when fetching a single
241  * element; but it is the array type when doing subarray fetch or either
242  * type of store.
243  * ----------------
244  */
245 typedef struct ArrayRef
246 {
247         Expr            xpr;
248         Oid                     refarraytype;   /* type of the array proper */
249         Oid                     refelemtype;    /* type of the array elements */
250         int32           reftypmod;              /* typmod of the array (and elements too) */
251         List       *refupperindexpr;/* expressions that evaluate to upper array
252                                                                  * indexes */
253         List       *reflowerindexpr;/* expressions that evaluate to lower array
254                                                                  * indexes */
255         Expr       *refexpr;            /* the expression that evaluates to an array
256                                                                  * value */
257         Expr       *refassgnexpr;       /* expression for the source value, or NULL if
258                                                                  * fetch */
259 } ArrayRef;
260
261 /*
262  * CoercionContext - distinguishes the allowed set of type casts
263  *
264  * NB: ordering of the alternatives is significant; later (larger) values
265  * allow more casts than earlier ones.
266  */
267 typedef enum CoercionContext
268 {
269         COERCION_IMPLICIT,                      /* coercion in context of expression */
270         COERCION_ASSIGNMENT,            /* coercion in context of assignment */
271         COERCION_EXPLICIT                       /* explicit cast operation */
272 } CoercionContext;
273
274 /*
275  * CoercionForm - information showing how to display a function-call node
276  */
277 typedef enum CoercionForm
278 {
279         COERCE_EXPLICIT_CALL,           /* display as a function call */
280         COERCE_EXPLICIT_CAST,           /* display as an explicit cast */
281         COERCE_IMPLICIT_CAST,           /* implicit cast, so hide it */
282         COERCE_DONTCARE                         /* special case for planner */
283 } CoercionForm;
284
285 /*
286  * FuncExpr - expression node for a function call
287  */
288 typedef struct FuncExpr
289 {
290         Expr            xpr;
291         Oid                     funcid;                 /* PG_PROC OID of the function */
292         Oid                     funcresulttype; /* PG_TYPE OID of result value */
293         bool            funcretset;             /* true if function returns set */
294         CoercionForm funcformat;        /* how to display this function call */
295         List       *args;                       /* arguments to the function */
296 } FuncExpr;
297
298 /*
299  * OpExpr - expression node for an operator invocation
300  *
301  * Semantically, this is essentially the same as a function call.
302  *
303  * Note that opfuncid is not necessarily filled in immediately on creation
304  * of the node.  The planner makes sure it is valid before passing the node
305  * tree to the executor, but during parsing/planning opfuncid is typically 0.
306  */
307 typedef struct OpExpr
308 {
309         Expr            xpr;
310         Oid                     opno;                   /* PG_OPERATOR OID of the operator */
311         Oid                     opfuncid;               /* PG_PROC OID of underlying function */
312         Oid                     opresulttype;   /* PG_TYPE OID of result value */
313         bool            opretset;               /* true if operator returns set */
314         List       *args;                       /* arguments to the operator (1 or 2) */
315 } OpExpr;
316
317 /*
318  * DistinctExpr - expression node for "x IS DISTINCT FROM y"
319  *
320  * Except for the nodetag, this is represented identically to an OpExpr
321  * referencing the "=" operator for x and y.
322  * We use "=", not the more obvious "<>", because more datatypes have "="
323  * than "<>".  This means the executor must invert the operator result.
324  * Note that the operator function won't be called at all if either input
325  * is NULL, since then the result can be determined directly.
326  */
327 typedef OpExpr DistinctExpr;
328
329 /*
330  * ScalarArrayOpExpr - expression node for "scalar op ANY/ALL (array)"
331  *
332  * The operator must yield boolean.  It is applied to the left operand
333  * and each element of the righthand array, and the results are combined
334  * with OR or AND (for ANY or ALL respectively).  The node representation
335  * is almost the same as for the underlying operator, but we need a useOr
336  * flag to remember whether it's ANY or ALL, and we don't have to store
337  * the result type because it must be boolean.
338  */
339 typedef struct ScalarArrayOpExpr
340 {
341         Expr            xpr;
342         Oid                     opno;                   /* PG_OPERATOR OID of the operator */
343         Oid                     opfuncid;               /* PG_PROC OID of underlying function */
344         bool            useOr;                  /* true for ANY, false for ALL */
345         List       *args;                       /* the scalar and array operands */
346 } ScalarArrayOpExpr;
347
348 /*
349  * BoolExpr - expression node for the basic Boolean operators AND, OR, NOT
350  *
351  * Notice the arguments are given as a List.  For NOT, of course the list
352  * must always have exactly one element.  For AND and OR, the executor can
353  * handle any number of arguments.      The parser treats AND and OR as binary
354  * and so it only produces two-element lists, but the optimizer will flatten
355  * trees of AND and OR nodes to produce longer lists when possible.
356  */
357 typedef enum BoolExprType
358 {
359         AND_EXPR, OR_EXPR, NOT_EXPR
360 } BoolExprType;
361
362 typedef struct BoolExpr
363 {
364         Expr            xpr;
365         BoolExprType boolop;
366         List       *args;                       /* arguments to this expression */
367 } BoolExpr;
368
369 /*
370  * SubLink
371  *
372  * A SubLink represents a subselect appearing in an expression, and in some
373  * cases also the combining operator(s) just above it.  The subLinkType
374  * indicates the form of the expression represented:
375  *      EXISTS_SUBLINK          EXISTS(SELECT ...)
376  *      ALL_SUBLINK                     (lefthand) op ALL (SELECT ...)
377  *      ANY_SUBLINK                     (lefthand) op ANY (SELECT ...)
378  *      ROWCOMPARE_SUBLINK      (lefthand) op (SELECT ...)
379  *      EXPR_SUBLINK            (SELECT with single targetlist item ...)
380  *      ARRAY_SUBLINK           ARRAY(SELECT with single targetlist item ...)
381  * For ALL, ANY, and ROWCOMPARE, the lefthand is a list of expressions of the
382  * same length as the subselect's targetlist.  ROWCOMPARE will *always* have
383  * a list with more than one entry; if the subselect has just one target
384  * then the parser will create an EXPR_SUBLINK instead (and any operator
385  * above the subselect will be represented separately).  Note that both
386  * ROWCOMPARE and EXPR require the subselect to deliver only one row.
387  * ALL, ANY, and ROWCOMPARE require the combining operators to deliver boolean
388  * results.  ALL and ANY combine the per-row results using AND and OR
389  * semantics respectively.
390  * ARRAY requires just one target column, and creates an array of the target
391  * column's type using any number of rows resulting from the subselect.
392  *
393  * SubLink is classed as an Expr node, but it is not actually executable;
394  * it must be replaced in the expression tree by a SubPlan node during
395  * planning.
396  *
397  * NOTE: in the raw output of gram.y, testexpr contains just the raw form
398  * of the lefthand expression (if any), and operName is the String name of
399  * the combining operator.      Also, subselect is a raw parsetree.  During parse
400  * analysis, the parser transforms testexpr into a complete boolean expression
401  * that compares the lefthand value(s) to PARAM_SUBLINK nodes representing the
402  * output columns of the subselect.  And subselect is transformed to a Query.
403  * This is the representation seen in saved rules and in the rewriter.
404  *
405  * In EXISTS, EXPR, and ARRAY SubLinks, testexpr and operName are unused and
406  * are always null.
407  */
408 typedef enum SubLinkType
409 {
410         EXISTS_SUBLINK,
411         ALL_SUBLINK,
412         ANY_SUBLINK,
413         ROWCOMPARE_SUBLINK,
414         EXPR_SUBLINK,
415         ARRAY_SUBLINK
416 } SubLinkType;
417
418
419 typedef struct SubLink
420 {
421         Expr            xpr;
422         SubLinkType subLinkType;        /* see above */
423         Node       *testexpr;           /* outer-query test for ALL/ANY/ROWCOMPARE */
424         List       *operName;           /* originally specified operator name */
425         Node       *subselect;          /* subselect as Query* or parsetree */
426 } SubLink;
427
428 /*
429  * SubPlan - executable expression node for a subplan (sub-SELECT)
430  *
431  * The planner replaces SubLink nodes in expression trees with SubPlan
432  * nodes after it has finished planning the subquery.  SubPlan references
433  * a sub-plantree stored in the subplans list of the toplevel PlannedStmt.
434  * (We avoid a direct link to make it easier to copy expression trees
435  * without causing multiple processing of the subplan.)
436  *
437  * In an ordinary subplan, testexpr points to an executable expression
438  * (OpExpr, an AND/OR tree of OpExprs, or RowCompareExpr) for the combining
439  * operator(s); the left-hand arguments are the original lefthand expressions,
440  * and the right-hand arguments are PARAM_EXEC Param nodes representing the
441  * outputs of the sub-select.  (NOTE: runtime coercion functions may be
442  * inserted as well.)  This is just the same expression tree as testexpr in
443  * the original SubLink node, but the PARAM_SUBLINK nodes are replaced by
444  * suitably numbered PARAM_EXEC nodes.
445  *
446  * If the sub-select becomes an initplan rather than a subplan, the executable
447  * expression is part of the outer plan's expression tree (and the SubPlan
448  * node itself is not).  In this case testexpr is NULL to avoid duplication.
449  *
450  * The planner also derives lists of the values that need to be passed into
451  * and out of the subplan.      Input values are represented as a list "args" of
452  * expressions to be evaluated in the outer-query context (currently these
453  * args are always just Vars, but in principle they could be any expression).
454  * The values are assigned to the global PARAM_EXEC params indexed by parParam
455  * (the parParam and args lists must have the same ordering).  setParam is a
456  * list of the PARAM_EXEC params that are computed by the sub-select, if it
457  * is an initplan; they are listed in order by sub-select output column
458  * position.  (parParam and setParam are integer Lists, not Bitmapsets,
459  * because their ordering is significant.)
460  */
461 typedef struct SubPlan
462 {
463         Expr            xpr;
464         /* Fields copied from original SubLink: */
465         SubLinkType subLinkType;        /* see above */
466         /* The combining operators, transformed to an executable expression: */
467         Node       *testexpr;           /* OpExpr or RowCompareExpr expression tree */
468         List       *paramIds;           /* IDs of Params embedded in the above */
469         /* Identification of the Plan tree to use: */
470         int                     plan_id;                /* Index (from 1) in PlannedStmt.subplans */
471         /* Extra data useful for determining subplan's output type: */
472         Oid                     firstColType;   /* Type of first column of subplan result */
473         /* Information about execution strategy: */
474         bool            useHashTable;   /* TRUE to store subselect output in a hash
475                                                                  * table (implies we are doing "IN") */
476         bool            unknownEqFalse; /* TRUE if it's okay to return FALSE when the
477                                                                  * spec result is UNKNOWN; this allows much
478                                                                  * simpler handling of null values */
479         /* Information for passing params into and out of the subselect: */
480         /* setParam and parParam are lists of integers (param IDs) */
481         List       *setParam;           /* initplan subqueries have to set these
482                                                                  * Params for parent plan */
483         List       *parParam;           /* indices of input Params from parent plan */
484         List       *args;                       /* exprs to pass as parParam values */
485 } SubPlan;
486
487 /* ----------------
488  * FieldSelect
489  *
490  * FieldSelect represents the operation of extracting one field from a tuple
491  * value.  At runtime, the input expression is expected to yield a rowtype
492  * Datum.  The specified field number is extracted and returned as a Datum.
493  * ----------------
494  */
495
496 typedef struct FieldSelect
497 {
498         Expr            xpr;
499         Expr       *arg;                        /* input expression */
500         AttrNumber      fieldnum;               /* attribute number of field to extract */
501         Oid                     resulttype;             /* type of the field (result type of this
502                                                                  * node) */
503         int32           resulttypmod;   /* output typmod (usually -1) */
504 } FieldSelect;
505
506 /* ----------------
507  * FieldStore
508  *
509  * FieldStore represents the operation of modifying one field in a tuple
510  * value, yielding a new tuple value (the input is not touched!).  Like
511  * the assign case of ArrayRef, this is used to implement UPDATE of a
512  * portion of a column.
513  *
514  * A single FieldStore can actually represent updates of several different
515  * fields.      The parser only generates FieldStores with single-element lists,
516  * but the planner will collapse multiple updates of the same base column
517  * into one FieldStore.
518  * ----------------
519  */
520
521 typedef struct FieldStore
522 {
523         Expr            xpr;
524         Expr       *arg;                        /* input tuple value */
525         List       *newvals;            /* new value(s) for field(s) */
526         List       *fieldnums;          /* integer list of field attnums */
527         Oid                     resulttype;             /* type of result (same as type of arg) */
528         /* Like RowExpr, we deliberately omit a typmod here */
529 } FieldStore;
530
531 /* ----------------
532  * RelabelType
533  *
534  * RelabelType represents a "dummy" type coercion between two binary-
535  * compatible datatypes, such as reinterpreting the result of an OID
536  * expression as an int4.  It is a no-op at runtime; we only need it
537  * to provide a place to store the correct type to be attributed to
538  * the expression result during type resolution.  (We can't get away
539  * with just overwriting the type field of the input expression node,
540  * so we need a separate node to show the coercion's result type.)
541  * ----------------
542  */
543
544 typedef struct RelabelType
545 {
546         Expr            xpr;
547         Expr       *arg;                        /* input expression */
548         Oid                     resulttype;             /* output type of coercion expression */
549         int32           resulttypmod;   /* output typmod (usually -1) */
550         CoercionForm relabelformat; /* how to display this node */
551 } RelabelType;
552
553 /* ----------------
554  * CoerceViaIO
555  *
556  * CoerceViaIO represents a type coercion between two types whose textual
557  * representations are compatible, implemented by invoking the source type's
558  * typoutput function then the destination type's typinput function.
559  * ----------------
560  */
561
562 typedef struct CoerceViaIO
563 {
564         Expr            xpr;
565         Expr       *arg;                        /* input expression */
566         Oid                     resulttype;             /* output type of coercion */
567         /* output typmod is not stored, but is presumed -1 */
568         CoercionForm coerceformat;      /* how to display this node */
569 } CoerceViaIO;
570
571 /* ----------------
572  * ArrayCoerceExpr
573  *
574  * ArrayCoerceExpr represents a type coercion from one array type to another,
575  * which is implemented by applying the indicated element-type coercion
576  * function to each element of the source array.  If elemfuncid is InvalidOid
577  * then the element types are binary-compatible, but the coercion still
578  * requires some effort (we have to fix the element type ID stored in the
579  * array header).
580  * ----------------
581  */
582
583 typedef struct ArrayCoerceExpr
584 {
585         Expr            xpr;
586         Expr       *arg;                        /* input expression (yields an array) */
587         Oid                     elemfuncid;             /* OID of element coercion function, or 0 */
588         Oid                     resulttype;             /* output type of coercion (an array type) */
589         int32           resulttypmod;   /* output typmod (also element typmod) */
590         bool            isExplicit;             /* conversion semantics flag to pass to func */
591         CoercionForm coerceformat;      /* how to display this node */
592 } ArrayCoerceExpr;
593
594 /* ----------------
595  * ConvertRowtypeExpr
596  *
597  * ConvertRowtypeExpr represents a type coercion from one composite type
598  * to another, where the source type is guaranteed to contain all the columns
599  * needed for the destination type plus possibly others; the columns need not
600  * be in the same positions, but are matched up by name.  This is primarily
601  * used to convert a whole-row value of an inheritance child table into a
602  * valid whole-row value of its parent table's rowtype.
603  * ----------------
604  */
605
606 typedef struct ConvertRowtypeExpr
607 {
608         Expr            xpr;
609         Expr       *arg;                        /* input expression */
610         Oid                     resulttype;             /* output type (always a composite type) */
611         /* result typmod is not stored, but must be -1; see RowExpr comments */
612         CoercionForm convertformat; /* how to display this node */
613 } ConvertRowtypeExpr;
614
615 /*----------
616  * CaseExpr - a CASE expression
617  *
618  * We support two distinct forms of CASE expression:
619  *              CASE WHEN boolexpr THEN expr [ WHEN boolexpr THEN expr ... ]
620  *              CASE testexpr WHEN compexpr THEN expr [ WHEN compexpr THEN expr ... ]
621  * These are distinguishable by the "arg" field being NULL in the first case
622  * and the testexpr in the second case.
623  *
624  * In the raw grammar output for the second form, the condition expressions
625  * of the WHEN clauses are just the comparison values.  Parse analysis
626  * converts these to valid boolean expressions of the form
627  *              CaseTestExpr '=' compexpr
628  * where the CaseTestExpr node is a placeholder that emits the correct
629  * value at runtime.  This structure is used so that the testexpr need be
630  * evaluated only once.  Note that after parse analysis, the condition
631  * expressions always yield boolean.
632  *
633  * Note: we can test whether a CaseExpr has been through parse analysis
634  * yet by checking whether casetype is InvalidOid or not.
635  *----------
636  */
637 typedef struct CaseExpr
638 {
639         Expr            xpr;
640         Oid                     casetype;               /* type of expression result */
641         Expr       *arg;                        /* implicit equality comparison argument */
642         List       *args;                       /* the arguments (list of WHEN clauses) */
643         Expr       *defresult;          /* the default result (ELSE clause) */
644 } CaseExpr;
645
646 /*
647  * CaseWhen - one arm of a CASE expression
648  */
649 typedef struct CaseWhen
650 {
651         Expr            xpr;
652         Expr       *expr;                       /* condition expression */
653         Expr       *result;                     /* substitution result */
654 } CaseWhen;
655
656 /*
657  * Placeholder node for the test value to be processed by a CASE expression.
658  * This is effectively like a Param, but can be implemented more simply
659  * since we need only one replacement value at a time.
660  *
661  * We also use this in nested UPDATE expressions.
662  * See transformAssignmentIndirection().
663  */
664 typedef struct CaseTestExpr
665 {
666         Expr            xpr;
667         Oid                     typeId;                 /* type for substituted value */
668         int32           typeMod;                /* typemod for substituted value */
669 } CaseTestExpr;
670
671 /*
672  * ArrayExpr - an ARRAY[] expression
673  *
674  * Note: if multidims is false, the constituent expressions all yield the
675  * scalar type identified by element_typeid.  If multidims is true, the
676  * constituent expressions all yield arrays of element_typeid (ie, the same
677  * type as array_typeid); at runtime we must check for compatible subscripts.
678  */
679 typedef struct ArrayExpr
680 {
681         Expr            xpr;
682         Oid                     array_typeid;   /* type of expression result */
683         Oid                     element_typeid; /* common type of array elements */
684         List       *elements;           /* the array elements or sub-arrays */
685         bool            multidims;              /* true if elements are sub-arrays */
686 } ArrayExpr;
687
688 /*
689  * RowExpr - a ROW() expression
690  *
691  * Note: the list of fields must have a one-for-one correspondence with
692  * physical fields of the associated rowtype, although it is okay for it
693  * to be shorter than the rowtype.      That is, the N'th list element must
694  * match up with the N'th physical field.  When the N'th physical field
695  * is a dropped column (attisdropped) then the N'th list element can just
696  * be a NULL constant.  (This case can only occur for named composite types,
697  * not RECORD types, since those are built from the RowExpr itself rather
698  * than vice versa.)  It is important not to assume that length(args) is
699  * the same as the number of columns logically present in the rowtype.
700  */
701 typedef struct RowExpr
702 {
703         Expr            xpr;
704         List       *args;                       /* the fields */
705         Oid                     row_typeid;             /* RECORDOID or a composite type's ID */
706
707         /*
708          * Note: we deliberately do NOT store a typmod.  Although a typmod will be
709          * associated with specific RECORD types at runtime, it will differ for
710          * different backends, and so cannot safely be stored in stored
711          * parsetrees.  We must assume typmod -1 for a RowExpr node.
712          */
713         CoercionForm row_format;        /* how to display this node */
714 } RowExpr;
715
716 /*
717  * RowCompareExpr - row-wise comparison, such as (a, b) <= (1, 2)
718  *
719  * We support row comparison for any operator that can be determined to
720  * act like =, <>, <, <=, >, or >= (we determine this by looking for the
721  * operator in btree opfamilies).  Note that the same operator name might
722  * map to a different operator for each pair of row elements, since the
723  * element datatypes can vary.
724  *
725  * A RowCompareExpr node is only generated for the < <= > >= cases;
726  * the = and <> cases are translated to simple AND or OR combinations
727  * of the pairwise comparisons.  However, we include = and <> in the
728  * RowCompareType enum for the convenience of parser logic.
729  */
730 typedef enum RowCompareType
731 {
732         /* Values of this enum are chosen to match btree strategy numbers */
733         ROWCOMPARE_LT = 1,                      /* BTLessStrategyNumber */
734         ROWCOMPARE_LE = 2,                      /* BTLessEqualStrategyNumber */
735         ROWCOMPARE_EQ = 3,                      /* BTEqualStrategyNumber */
736         ROWCOMPARE_GE = 4,                      /* BTGreaterEqualStrategyNumber */
737         ROWCOMPARE_GT = 5,                      /* BTGreaterStrategyNumber */
738         ROWCOMPARE_NE = 6                       /* no such btree strategy */
739 } RowCompareType;
740
741 typedef struct RowCompareExpr
742 {
743         Expr            xpr;
744         RowCompareType rctype;          /* LT LE GE or GT, never EQ or NE */
745         List       *opnos;                      /* OID list of pairwise comparison ops */
746         List       *opfamilies;         /* OID list of containing operator families */
747         List       *largs;                      /* the left-hand input arguments */
748         List       *rargs;                      /* the right-hand input arguments */
749 } RowCompareExpr;
750
751 /*
752  * CoalesceExpr - a COALESCE expression
753  */
754 typedef struct CoalesceExpr
755 {
756         Expr            xpr;
757         Oid                     coalescetype;   /* type of expression result */
758         List       *args;                       /* the arguments */
759 } CoalesceExpr;
760
761 /*
762  * MinMaxExpr - a GREATEST or LEAST function
763  */
764 typedef enum MinMaxOp
765 {
766         IS_GREATEST,
767         IS_LEAST
768 } MinMaxOp;
769
770 typedef struct MinMaxExpr
771 {
772         Expr            xpr;
773         Oid                     minmaxtype;             /* common type of arguments and result */
774         MinMaxOp        op;                             /* function to execute */
775         List       *args;                       /* the arguments */
776 } MinMaxExpr;
777
778 /*
779  * XmlExpr - various SQL/XML functions requiring special grammar productions
780  *
781  * 'name' carries the "NAME foo" argument (already XML-escaped).
782  * 'named_args' and 'arg_names' represent an xml_attribute list.
783  * 'args' carries all other arguments.
784  */
785 typedef enum XmlExprOp
786 {
787         IS_XMLCONCAT,                           /* XMLCONCAT(args) */
788         IS_XMLELEMENT,                          /* XMLELEMENT(name, xml_attributes, args) */
789         IS_XMLFOREST,                           /* XMLFOREST(xml_attributes) */
790         IS_XMLPARSE,                            /* XMLPARSE(text, is_doc, preserve_ws) */
791         IS_XMLPI,                                       /* XMLPI(name [, args]) */
792         IS_XMLROOT,                                     /* XMLROOT(xml, version, standalone) */
793         IS_XMLSERIALIZE,                        /* XMLSERIALIZE(is_document, xmlval) */
794         IS_DOCUMENT                                     /* xmlval IS DOCUMENT */
795 } XmlExprOp;
796
797 typedef enum
798 {
799         XMLOPTION_DOCUMENT,
800         XMLOPTION_CONTENT
801 } XmlOptionType;
802
803 typedef struct XmlExpr
804 {
805         Expr            xpr;
806         XmlExprOp       op;                             /* xml function ID */
807         char       *name;                       /* name in xml(NAME foo ...) syntaxes */
808         List       *named_args;         /* non-XML expressions for xml_attributes */
809         List       *arg_names;          /* parallel list of Value strings */
810         List       *args;                       /* list of expressions */
811         XmlOptionType xmloption;        /* DOCUMENT or CONTENT */
812         Oid                     type;                   /* target type for XMLSERIALIZE */
813         int32           typmod;
814 } XmlExpr;
815
816 /*
817  * NullIfExpr - a NULLIF expression
818  *
819  * Like DistinctExpr, this is represented the same as an OpExpr referencing
820  * the "=" operator for x and y.
821  */
822 typedef OpExpr NullIfExpr;
823
824 /* ----------------
825  * NullTest
826  *
827  * NullTest represents the operation of testing a value for NULLness.
828  * The appropriate test is performed and returned as a boolean Datum.
829  *
830  * NOTE: the semantics of this for rowtype inputs are noticeably different
831  * from the scalar case.  It would probably be a good idea to include an
832  * "argisrow" flag in the struct to reflect that, but for the moment,
833  * we do not do so to avoid forcing an initdb during 8.2beta.
834  * ----------------
835  */
836
837 typedef enum NullTestType
838 {
839         IS_NULL, IS_NOT_NULL
840 } NullTestType;
841
842 typedef struct NullTest
843 {
844         Expr            xpr;
845         Expr       *arg;                        /* input expression */
846         NullTestType nulltesttype;      /* IS NULL, IS NOT NULL */
847 } NullTest;
848
849 /*
850  * BooleanTest
851  *
852  * BooleanTest represents the operation of determining whether a boolean
853  * is TRUE, FALSE, or UNKNOWN (ie, NULL).  All six meaningful combinations
854  * are supported.  Note that a NULL input does *not* cause a NULL result.
855  * The appropriate test is performed and returned as a boolean Datum.
856  */
857
858 typedef enum BoolTestType
859 {
860         IS_TRUE, IS_NOT_TRUE, IS_FALSE, IS_NOT_FALSE, IS_UNKNOWN, IS_NOT_UNKNOWN
861 } BoolTestType;
862
863 typedef struct BooleanTest
864 {
865         Expr            xpr;
866         Expr       *arg;                        /* input expression */
867         BoolTestType booltesttype;      /* test type */
868 } BooleanTest;
869
870 /*
871  * CoerceToDomain
872  *
873  * CoerceToDomain represents the operation of coercing a value to a domain
874  * type.  At runtime (and not before) the precise set of constraints to be
875  * checked will be determined.  If the value passes, it is returned as the
876  * result; if not, an error is raised.  Note that this is equivalent to
877  * RelabelType in the scenario where no constraints are applied.
878  */
879 typedef struct CoerceToDomain
880 {
881         Expr            xpr;
882         Expr       *arg;                        /* input expression */
883         Oid                     resulttype;             /* domain type ID (result type) */
884         int32           resulttypmod;   /* output typmod (currently always -1) */
885         CoercionForm coercionformat;    /* how to display this node */
886 } CoerceToDomain;
887
888 /*
889  * Placeholder node for the value to be processed by a domain's check
890  * constraint.  This is effectively like a Param, but can be implemented more
891  * simply since we need only one replacement value at a time.
892  *
893  * Note: the typeId/typeMod will be set from the domain's base type, not
894  * the domain itself.  This is because we shouldn't consider the value to
895  * be a member of the domain if we haven't yet checked its constraints.
896  */
897 typedef struct CoerceToDomainValue
898 {
899         Expr            xpr;
900         Oid                     typeId;                 /* type for substituted value */
901         int32           typeMod;                /* typemod for substituted value */
902 } CoerceToDomainValue;
903
904 /*
905  * Placeholder node for a DEFAULT marker in an INSERT or UPDATE command.
906  *
907  * This is not an executable expression: it must be replaced by the actual
908  * column default expression during rewriting.  But it is convenient to
909  * treat it as an expression node during parsing and rewriting.
910  */
911 typedef struct SetToDefault
912 {
913         Expr            xpr;
914         Oid                     typeId;                 /* type for substituted value */
915         int32           typeMod;                /* typemod for substituted value */
916 } SetToDefault;
917
918 /*
919  * Node representing [WHERE] CURRENT OF cursor_name
920  *
921  * CURRENT OF is a bit like a Var, in that it carries the rangetable index
922  * of the target relation being constrained; this aids placing the expression
923  * correctly during planning.  We can assume however that its "levelsup" is
924  * always zero, due to the syntactic constraints on where it can appear.
925  *
926  * The referenced cursor can be represented either as a hardwired string
927  * or as a reference to a run-time parameter of type REFCURSOR.  The latter
928  * case is for the convenience of plpgsql.
929  */
930 typedef struct CurrentOfExpr
931 {
932         Expr            xpr;
933         Index           cvarno;                 /* RT index of target relation */
934         char       *cursor_name;        /* name of referenced cursor, or NULL */
935         int                     cursor_param;   /* refcursor parameter number, or 0 */
936 } CurrentOfExpr;
937
938 /*--------------------
939  * TargetEntry -
940  *         a target entry (used in query target lists)
941  *
942  * Strictly speaking, a TargetEntry isn't an expression node (since it can't
943  * be evaluated by ExecEvalExpr).  But we treat it as one anyway, since in
944  * very many places it's convenient to process a whole query targetlist as a
945  * single expression tree.
946  *
947  * In a SELECT's targetlist, resno should always be equal to the item's
948  * ordinal position (counting from 1).  However, in an INSERT or UPDATE
949  * targetlist, resno represents the attribute number of the destination
950  * column for the item; so there may be missing or out-of-order resnos.
951  * It is even legal to have duplicated resnos; consider
952  *              UPDATE table SET arraycol[1] = ..., arraycol[2] = ..., ...
953  * The two meanings come together in the executor, because the planner
954  * transforms INSERT/UPDATE tlists into a normalized form with exactly
955  * one entry for each column of the destination table.  Before that's
956  * happened, however, it is risky to assume that resno == position.
957  * Generally get_tle_by_resno() should be used rather than list_nth()
958  * to fetch tlist entries by resno, and only in SELECT should you assume
959  * that resno is a unique identifier.
960  *
961  * resname is required to represent the correct column name in non-resjunk
962  * entries of top-level SELECT targetlists, since it will be used as the
963  * column title sent to the frontend.  In most other contexts it is only
964  * a debugging aid, and may be wrong or even NULL.      (In particular, it may
965  * be wrong in a tlist from a stored rule, if the referenced column has been
966  * renamed by ALTER TABLE since the rule was made.      Also, the planner tends
967  * to store NULL rather than look up a valid name for tlist entries in
968  * non-toplevel plan nodes.)  In resjunk entries, resname should be either
969  * a specific system-generated name (such as "ctid") or NULL; anything else
970  * risks confusing ExecGetJunkAttribute!
971  *
972  * ressortgroupref is used in the representation of ORDER BY and
973  * GROUP BY items.      Targetlist entries with ressortgroupref=0 are not
974  * sort/group items.  If ressortgroupref>0, then this item is an ORDER BY or
975  * GROUP BY value.      No two entries in a targetlist may have the same nonzero
976  * ressortgroupref --- but there is no particular meaning to the nonzero
977  * values, except as tags.      (For example, one must not assume that lower
978  * ressortgroupref means a more significant sort key.)  The order of the
979  * associated SortClause or GroupClause lists determine the semantics.
980  *
981  * resorigtbl/resorigcol identify the source of the column, if it is a
982  * simple reference to a column of a base table (or view).      If it is not
983  * a simple reference, these fields are zeroes.
984  *
985  * If resjunk is true then the column is a working column (such as a sort key)
986  * that should be removed from the final output of the query.  Resjunk columns
987  * must have resnos that cannot duplicate any regular column's resno.  Also
988  * note that there are places that assume resjunk columns come after non-junk
989  * columns.
990  *--------------------
991  */
992 typedef struct TargetEntry
993 {
994         Expr            xpr;
995         Expr       *expr;                       /* expression to evaluate */
996         AttrNumber      resno;                  /* attribute number (see notes above) */
997         char       *resname;            /* name of the column (could be NULL) */
998         Index           ressortgroupref;/* nonzero if referenced by a sort/group
999                                                                  * clause */
1000         Oid                     resorigtbl;             /* OID of column's source table */
1001         AttrNumber      resorigcol;             /* column's number in source table */
1002         bool            resjunk;                /* set to true to eliminate the attribute from
1003                                                                  * final target list */
1004 } TargetEntry;
1005
1006
1007 /* ----------------------------------------------------------------
1008  *                                      node types for join trees
1009  *
1010  * The leaves of a join tree structure are RangeTblRef nodes.  Above
1011  * these, JoinExpr nodes can appear to denote a specific kind of join
1012  * or qualified join.  Also, FromExpr nodes can appear to denote an
1013  * ordinary cross-product join ("FROM foo, bar, baz WHERE ...").
1014  * FromExpr is like a JoinExpr of jointype JOIN_INNER, except that it
1015  * may have any number of child nodes, not just two.
1016  *
1017  * NOTE: the top level of a Query's jointree is always a FromExpr.
1018  * Even if the jointree contains no rels, there will be a FromExpr.
1019  *
1020  * NOTE: the qualification expressions present in JoinExpr nodes are
1021  * *in addition to* the query's main WHERE clause, which appears as the
1022  * qual of the top-level FromExpr.      The reason for associating quals with
1023  * specific nodes in the jointree is that the position of a qual is critical
1024  * when outer joins are present.  (If we enforce a qual too soon or too late,
1025  * that may cause the outer join to produce the wrong set of NULL-extended
1026  * rows.)  If all joins are inner joins then all the qual positions are
1027  * semantically interchangeable.
1028  *
1029  * NOTE: in the raw output of gram.y, a join tree contains RangeVar,
1030  * RangeSubselect, and RangeFunction nodes, which are all replaced by
1031  * RangeTblRef nodes during the parse analysis phase.  Also, the top-level
1032  * FromExpr is added during parse analysis; the grammar regards FROM and
1033  * WHERE as separate.
1034  * ----------------------------------------------------------------
1035  */
1036
1037 /*
1038  * RangeTblRef - reference to an entry in the query's rangetable
1039  *
1040  * We could use direct pointers to the RT entries and skip having these
1041  * nodes, but multiple pointers to the same node in a querytree cause
1042  * lots of headaches, so it seems better to store an index into the RT.
1043  */
1044 typedef struct RangeTblRef
1045 {
1046         NodeTag         type;
1047         int                     rtindex;
1048 } RangeTblRef;
1049
1050 /*----------
1051  * JoinExpr - for SQL JOIN expressions
1052  *
1053  * isNatural, using, and quals are interdependent.      The user can write only
1054  * one of NATURAL, USING(), or ON() (this is enforced by the grammar).
1055  * If he writes NATURAL then parse analysis generates the equivalent USING()
1056  * list, and from that fills in "quals" with the right equality comparisons.
1057  * If he writes USING() then "quals" is filled with equality comparisons.
1058  * If he writes ON() then only "quals" is set.  Note that NATURAL/USING
1059  * are not equivalent to ON() since they also affect the output column list.
1060  *
1061  * alias is an Alias node representing the AS alias-clause attached to the
1062  * join expression, or NULL if no clause.  NB: presence or absence of the
1063  * alias has a critical impact on semantics, because a join with an alias
1064  * restricts visibility of the tables/columns inside it.
1065  *
1066  * During parse analysis, an RTE is created for the Join, and its index
1067  * is filled into rtindex.      This RTE is present mainly so that Vars can
1068  * be created that refer to the outputs of the join.
1069  *----------
1070  */
1071 typedef struct JoinExpr
1072 {
1073         NodeTag         type;
1074         JoinType        jointype;               /* type of join */
1075         bool            isNatural;              /* Natural join? Will need to shape table */
1076         Node       *larg;                       /* left subtree */
1077         Node       *rarg;                       /* right subtree */
1078         List       *using;                      /* USING clause, if any (list of String) */
1079         Node       *quals;                      /* qualifiers on join, if any */
1080         Alias      *alias;                      /* user-written alias clause, if any */
1081         int                     rtindex;                /* RT index assigned for join */
1082 } JoinExpr;
1083
1084 /*----------
1085  * FromExpr - represents a FROM ... WHERE ... construct
1086  *
1087  * This is both more flexible than a JoinExpr (it can have any number of
1088  * children, including zero) and less so --- we don't need to deal with
1089  * aliases and so on.  The output column set is implicitly just the union
1090  * of the outputs of the children.
1091  *----------
1092  */
1093 typedef struct FromExpr
1094 {
1095         NodeTag         type;
1096         List       *fromlist;           /* List of join subtrees */
1097         Node       *quals;                      /* qualifiers on join, if any */
1098 } FromExpr;
1099
1100 #endif   /* PRIMNODES_H */