1 /*-------------------------------------------------------------------------
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
10 * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
11 * Portions Copyright (c) 1994, Regents of the University of California
13 * $Id: primnodes.h,v 1.77 2003/01/10 21:08:15 tgl Exp $
15 *-------------------------------------------------------------------------
20 #include "access/attnum.h"
21 #include "nodes/pg_list.h"
24 /* ----------------------------------------------------------------
26 * ----------------------------------------------------------------
29 /*--------------------
30 * Resdom (Result Domain)
33 * ressortgroupref is the parse/plan-time representation of ORDER BY and
34 * GROUP BY items. Targetlist entries with ressortgroupref=0 are not
35 * sort/group items. If ressortgroupref>0, then this item is an ORDER BY or
36 * GROUP BY value. No two entries in a targetlist may have the same nonzero
37 * ressortgroupref --- but there is no particular meaning to the nonzero
38 * values, except as tags. (For example, one must not assume that lower
39 * ressortgroupref means a more significant sort key.) The order of the
40 * associated SortClause or GroupClause lists determine the semantics.
42 * reskey and reskeyop are the execution-time representation of sorting.
43 * reskey must be zero in any non-sort-key item. The reskey of sort key
44 * targetlist items for a sort plan node is 1,2,...,n for the n sort keys.
45 * The reskeyop of each such targetlist item is the sort operator's OID.
46 * reskeyop will be zero in non-sort-key items.
48 * Both reskey and reskeyop are typically zero during parse/plan stages.
49 * The executor does not pay any attention to ressortgroupref.
55 AttrNumber resno; /* attribute number */
56 Oid restype; /* type of the value */
57 int32 restypmod; /* type-specific modifier of the value */
58 char *resname; /* name of the resdom (could be NULL) */
59 Index ressortgroupref;
60 /* nonzero if referenced by a sort/group clause */
61 Index reskey; /* order of key in a sort (for those > 0) */
62 Oid reskeyop; /* sort operator's Oid */
63 bool resjunk; /* set to true to eliminate the attribute
64 * from final target list */
70 * specifies an alias for a range variable; the alias might also
71 * specify renaming of columns within the table.
76 char *aliasname; /* aliased rel name (never qualified) */
77 List *colnames; /* optional list of column aliases */
78 /* Note: colnames is a list of Value nodes (always strings) */
81 typedef enum InhOption
83 INH_NO, /* Do NOT scan child tables */
84 INH_YES, /* DO scan child tables */
85 INH_DEFAULT /* Use current SQL_inheritance option */
89 * RangeVar - range variable, used in FROM clauses
91 * Also used to represent table names in utility statements; there, the alias
92 * field is not used, and inhOpt shows whether to apply the operation
93 * recursively to child tables. In some contexts it is also useful to carry
94 * a TEMP table indication here.
96 typedef struct RangeVar
99 char *catalogname; /* the catalog (database) name, or NULL */
100 char *schemaname; /* the schema name, or NULL */
101 char *relname; /* the relation/sequence name */
102 InhOption inhOpt; /* expand rel by inheritance? recursively
103 * act on children? */
104 bool istemp; /* is this a temp relation/sequence? */
105 Alias *alias; /* table alias & optional column aliases */
109 /* ----------------------------------------------------------------
110 * node types for executable expressions
111 * ----------------------------------------------------------------
115 * Expr - generic superclass for executable-expression nodes
117 * All node types that are used in executable expression trees should derive
118 * from Expr (that is, have Expr as their first field). Since Expr only
119 * contains NodeTag, this is a formality, but it is an easy form of
120 * documentation. See also the ExprState node types in execnodes.h.
128 * Var - expression node representing a variable (ie, a table column)
130 * Note: during parsing/planning, varnoold/varoattno are always just copies
131 * of varno/varattno. At the tail end of planning, Var nodes appearing in
132 * upper-level plan nodes are reassigned to point to the outputs of their
133 * subplans; for example, in a join node varno becomes INNER or OUTER and
134 * varattno becomes the index of the proper element of that subplan's target
135 * list. But varnoold/varoattno continue to hold the original values.
136 * The code doesn't really need varnoold/varoattno, but they are very useful
137 * for debugging and interpreting completed plans, so we keep them around.
142 #define PRS2_OLD_VARNO 1
143 #define PRS2_NEW_VARNO 2
148 Index varno; /* index of this var's relation in the
149 * range table (could also be INNER or
151 AttrNumber varattno; /* attribute number of this var, or zero
153 Oid vartype; /* pg_type tuple OID for the type of this
155 int32 vartypmod; /* pg_attribute typmod value */
159 * for subquery variables referencing outer relations; 0 in a normal
160 * var, >0 means N levels up
162 Index varnoold; /* original value of varno, for debugging */
163 AttrNumber varoattno; /* original value of varattno */
172 Oid consttype; /* PG_TYPE OID of the constant's datatype */
173 int constlen; /* typlen of the constant's datatype */
174 Datum constvalue; /* the constant's value */
175 bool constisnull; /* whether the constant is null (if true,
176 * constvalue is undefined) */
177 bool constbyval; /* whether this datatype is passed by value.
178 * If true, then all the information is
179 * stored in the Datum.
180 * If false, then the Datum contains a
181 * pointer to the information. */
186 * paramkind - specifies the kind of parameter. The possible values
187 * for this field are specified in "params.h", and they are:
189 * PARAM_NAMED: The parameter has a name, i.e. something
190 * like `$.salary' or `$.foobar'.
191 * In this case field `paramname' must be a valid name.
193 * PARAM_NUM: The parameter has only a numeric identifier,
194 * i.e. something like `$1', `$2' etc.
195 * The number is contained in the `paramid' field.
197 * PARAM_EXEC: The parameter is an internal executor parameter.
198 * It has a number contained in the `paramid' field.
204 int paramkind; /* kind of parameter. See above */
205 AttrNumber paramid; /* numeric ID for parameter ("$1") */
206 char *paramname; /* name for parameter ("$.foo") */
207 Oid paramtype; /* PG_TYPE OID of parameter's datatype */
213 typedef struct Aggref
216 Oid aggfnoid; /* pg_proc Oid of the aggregate */
217 Oid aggtype; /* type Oid of result of the aggregate */
218 Expr *target; /* expression we are aggregating on */
219 bool aggstar; /* TRUE if argument was really '*' */
220 bool aggdistinct; /* TRUE if it's agg(DISTINCT ...) */
224 * ArrayRef: describes an array subscripting operation
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.
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
240 * Note: array types can be fixed-length (refattrlength > 0), but only
241 * when the element type is itself fixed-length. Otherwise they are
242 * varlena structures and have refattrlength = -1. In any case,
243 * an array type is never pass-by-value.
245 * Note: refrestype is NOT the element type, but the array type,
246 * when doing subarray fetch or either type of store. It might be a good
247 * idea to include a refelemtype field as well.
250 typedef struct ArrayRef
253 Oid refrestype; /* type of the result of the ArrayRef
255 int refattrlength; /* typlen of array type */
256 int refelemlength; /* typlen of the array element type */
257 bool refelembyval; /* is the element type pass-by-value? */
258 char refelemalign; /* typalign of the element type */
259 List *refupperindexpr;/* expressions that evaluate to upper
261 List *reflowerindexpr;/* expressions that evaluate to lower
263 Expr *refexpr; /* the expression that evaluates to an
265 Expr *refassgnexpr; /* expression for the source value, or
270 * CoercionContext - distinguishes the allowed set of type casts
272 * NB: ordering of the alternatives is significant; later (larger) values
273 * allow more casts than earlier ones.
275 typedef enum CoercionContext
277 COERCION_IMPLICIT, /* coercion in context of expression */
278 COERCION_ASSIGNMENT, /* coercion in context of assignment */
279 COERCION_EXPLICIT /* explicit cast operation */
283 * CoercionForm - information showing how to display a function-call node
285 typedef enum CoercionForm
287 COERCE_EXPLICIT_CALL, /* display as a function call */
288 COERCE_EXPLICIT_CAST, /* display as an explicit cast */
289 COERCE_IMPLICIT_CAST, /* implicit cast, so hide it */
290 COERCE_DONTCARE /* special case for pathkeys */
294 * FuncExpr - expression node for a function call
296 typedef struct FuncExpr
299 Oid funcid; /* PG_PROC OID of the function */
300 Oid funcresulttype; /* PG_TYPE OID of result value */
301 bool funcretset; /* true if function returns set */
302 CoercionForm funcformat; /* how to display this function call */
303 List *args; /* arguments to the function */
307 * OpExpr - expression node for an operator invocation
309 * Semantically, this is essentially the same as a function call.
311 * Note that opfuncid is not necessarily filled in immediately on creation
312 * of the node. The planner makes sure it is valid before passing the node
313 * tree to the executor, but during parsing/planning opfuncid is typically 0.
315 typedef struct OpExpr
318 Oid opno; /* PG_OPERATOR OID of the operator */
319 Oid opfuncid; /* PG_PROC OID of underlying function */
320 Oid opresulttype; /* PG_TYPE OID of result value */
321 bool opretset; /* true if operator returns set */
322 List *args; /* arguments to the operator (1 or 2) */
326 * DistinctExpr - expression node for "x IS DISTINCT FROM y"
328 * Except for the nodetag, this is represented identically to an OpExpr
329 * referencing the "=" operator for x and y.
330 * We use "=", not the more obvious "<>", because more datatypes have "="
331 * than "<>". This means the executor must invert the operator result.
332 * Note that the operator function won't be called at all if either input
333 * is NULL, since then the result can be determined directly.
335 typedef OpExpr DistinctExpr;
338 * BoolExpr - expression node for the basic Boolean operators AND, OR, NOT
340 * Notice the arguments are given as a List. For NOT, of course the list
341 * must always have exactly one element. For AND and OR, the executor can
342 * handle any number of arguments. The parser treats AND and OR as binary
343 * and so it only produces two-element lists, but the optimizer will flatten
344 * trees of AND and OR nodes to produce longer lists when possible.
346 typedef enum BoolExprType
348 AND_EXPR, OR_EXPR, NOT_EXPR
351 typedef struct BoolExpr
355 List *args; /* arguments to this expression */
361 * A SubLink represents a subselect appearing in an expression, and in some
362 * cases also the combining operator(s) just above it. The subLinkType
363 * indicates the form of the expression represented:
364 * EXISTS_SUBLINK EXISTS(SELECT ...)
365 * ALL_SUBLINK (lefthand) op ALL (SELECT ...)
366 * ANY_SUBLINK (lefthand) op ANY (SELECT ...)
367 * MULTIEXPR_SUBLINK (lefthand) op (SELECT ...)
368 * EXPR_SUBLINK (SELECT with single targetlist item ...)
369 * For ALL, ANY, and MULTIEXPR, the lefthand is a list of expressions of the
370 * same length as the subselect's targetlist. MULTIEXPR will *always* have
371 * a list with more than one entry; if the subselect has just one target
372 * then the parser will create an EXPR_SUBLINK instead (and any operator
373 * above the subselect will be represented separately). Note that both
374 * MULTIEXPR and EXPR require the subselect to deliver only one row.
375 * ALL, ANY, and MULTIEXPR require the combining operators to deliver boolean
376 * results. These are reduced to one result per row using OR or AND semantics
377 * depending on the "useOr" flag. ALL and ANY combine the per-row results
378 * using AND and OR semantics respectively.
380 * SubLink is classed as an Expr node, but it is not actually executable;
381 * it must be replaced in the expression tree by a SubPlan node during
384 * NOTE: in the raw output of gram.y, lefthand contains a list of raw
385 * expressions; useOr and operOids are not filled in yet. Also, subselect
386 * is a raw parsetree. During parse analysis, the parser transforms the
387 * lefthand expression list using normal expression transformation rules.
388 * It fills operOids with the OIDs representing the specific operator(s)
389 * to apply to each pair of lefthand and targetlist expressions.
390 * And subselect is transformed to a Query. This is the representation
391 * seen in saved rules and in the rewriter.
393 * In EXISTS and EXPR SubLinks, lefthand, operName, and operOids are unused
394 * and are always NIL. useOr is not significant either for these sublink
398 typedef enum SubLinkType
400 EXISTS_SUBLINK, ALL_SUBLINK, ANY_SUBLINK, MULTIEXPR_SUBLINK, EXPR_SUBLINK
404 typedef struct SubLink
407 SubLinkType subLinkType; /* EXISTS, ALL, ANY, MULTIEXPR, EXPR */
408 bool useOr; /* TRUE to combine column results with
410 List *lefthand; /* list of outer-query expressions on the
412 List *operName; /* originally specified operator name */
413 List *operOids; /* OIDs of actual combining operators */
414 Node *subselect; /* subselect as Query* or parsetree */
418 * SubPlan - executable expression node for a subplan (sub-SELECT)
420 * The planner replaces SubLink nodes in expression trees with SubPlan
421 * nodes after it has finished planning the subquery. SubPlan contains
422 * a sub-plantree and rtable instead of a sub-Query.
424 * In an ordinary subplan, "exprs" points to a list of executable expressions
425 * (OpExpr trees) for the combining operators; their left-hand arguments are
426 * the original lefthand expressions, and their right-hand arguments are
427 * PARAM_EXEC Param nodes representing the outputs of the sub-select.
428 * (NOTE: runtime coercion functions may be inserted as well.) But if the
429 * sub-select becomes an initplan rather than a subplan, these executable
430 * expressions are part of the outer plan's expression tree (and the SubPlan
431 * node itself is not). In this case "exprs" is NIL to avoid duplication.
433 * The planner also derives lists of the values that need to be passed into
434 * and out of the subplan. Input values are represented as a list "args" of
435 * expressions to be evaluated in the outer-query context (currently these
436 * args are always just Vars, but in principle they could be any expression).
437 * The values are assigned to the global PARAM_EXEC params indexed by parParam
438 * (the parParam and args lists must have the same length). setParam is a
439 * list of the PARAM_EXEC params that are computed by the sub-select, if it
442 typedef struct SubPlan
445 /* Fields copied from original SubLink: */
446 SubLinkType subLinkType; /* EXISTS, ALL, ANY, MULTIEXPR, EXPR */
447 bool useOr; /* TRUE to combine column results with
449 /* The combining operators, transformed to executable expressions: */
450 List *exprs; /* list of OpExpr expression trees */
451 List *paramIds; /* IDs of Params embedded in the above */
452 /* The subselect, transformed to a Plan: */
453 struct Plan *plan; /* subselect plan itself */
454 int plan_id; /* dummy thing because of we haven't equal
455 * funcs for plan nodes... actually, we
456 * could put *plan itself somewhere else
457 * (TopPlan node ?)... */
458 List *rtable; /* range table for subselect */
459 /* Information about execution strategy: */
460 bool useHashTable; /* TRUE to store subselect output in a hash
461 * table (implies we are doing "IN") */
462 bool unknownEqFalse; /* TRUE if it's okay to return FALSE when
463 * the spec result is UNKNOWN; this allows
464 * much simpler handling of null values */
465 /* Information for passing params into and out of the subselect: */
466 /* setParam and parParam are lists of integers (param IDs) */
467 List *setParam; /* initplan subqueries have to set these
468 * Params for parent plan */
469 List *parParam; /* indices of input Params from parent plan */
470 List *args; /* exprs to pass as parParam values */
476 * FieldSelect represents the operation of extracting one field from a tuple
477 * value. At runtime, the input expression is expected to yield a Datum
478 * that contains a pointer-to-TupleTableSlot. The specified field number
479 * is extracted and returned as a Datum.
483 typedef struct FieldSelect
486 Expr *arg; /* input expression */
487 AttrNumber fieldnum; /* attribute number of field to extract */
488 Oid resulttype; /* type of the field (result type of this
490 int32 resulttypmod; /* output typmod (usually -1) */
496 * RelabelType represents a "dummy" type coercion between two binary-
497 * compatible datatypes, such as reinterpreting the result of an OID
498 * expression as an int4. It is a no-op at runtime; we only need it
499 * to provide a place to store the correct type to be attributed to
500 * the expression result during type resolution. (We can't get away
501 * with just overwriting the type field of the input expression node,
502 * so we need a separate node to show the coercion's result type.)
506 typedef struct RelabelType
509 Expr *arg; /* input expression */
510 Oid resulttype; /* output type of coercion expression */
511 int32 resulttypmod; /* output typmod (usually -1) */
512 CoercionForm relabelformat; /* how to display this node */
516 * CaseExpr - a CASE expression
518 typedef struct CaseExpr
521 Oid casetype; /* type of expression result */
522 Expr *arg; /* implicit equality comparison argument */
523 List *args; /* the arguments (list of WHEN clauses) */
524 Expr *defresult; /* the default result (ELSE clause) */
528 * CaseWhen - an argument to a CASE expression
530 typedef struct CaseWhen
533 Expr *expr; /* condition expression */
534 Expr *result; /* substitution result */
540 * NullTest represents the operation of testing a value for NULLness.
541 * Currently, we only support scalar input values, but eventually a
542 * row-constructor input should be supported.
543 * The appropriate test is performed and returned as a boolean Datum.
547 typedef enum NullTestType
552 typedef struct NullTest
555 Expr *arg; /* input expression */
556 NullTestType nulltesttype; /* IS NULL, IS NOT NULL */
562 * BooleanTest represents the operation of determining whether a boolean
563 * is TRUE, FALSE, or UNKNOWN (ie, NULL). All six meaningful combinations
564 * are supported. Note that a NULL input does *not* cause a NULL result.
565 * The appropriate test is performed and returned as a boolean Datum.
568 typedef enum BoolTestType
570 IS_TRUE, IS_NOT_TRUE, IS_FALSE, IS_NOT_FALSE, IS_UNKNOWN, IS_NOT_UNKNOWN
573 typedef struct BooleanTest
576 Expr *arg; /* input expression */
577 BoolTestType booltesttype; /* test type */
583 * ConstraintTest represents the operation of testing a value to see whether
584 * it meets a constraint. If so, the input value is returned as the result;
585 * if not, an error is raised.
588 typedef enum ConstraintTestType
592 } ConstraintTestType;
594 typedef struct ConstraintTest
597 Expr *arg; /* input expression */
598 ConstraintTestType testtype; /* test type */
599 char *name; /* name of constraint (for error msgs) */
600 char *domname; /* name of domain (for error messages) */
601 Expr *check_expr; /* for CHECK test, a boolean expression */
605 * Placeholder node for the value to be processed by a domain's check
606 * constraint. This is effectively like a Param, but can be implemented more
607 * simply since we need only one replacement value at a time.
609 * Note: the typeId/typeMod will be set from the domain's base type, not
610 * the domain itself. This is because we shouldn't consider the value to
611 * be a member of the domain if we haven't yet checked its constraints.
613 typedef struct ConstraintTestValue
616 Oid typeId; /* type for substituted value */
617 int32 typeMod; /* typemod for substituted value */
618 } ConstraintTestValue;
623 * a target entry (used in query target lists)
625 * Strictly speaking, a TargetEntry isn't an expression node (since it can't
626 * be evaluated by ExecEvalExpr). But we treat it as one anyway, since in
627 * very many places it's convenient to process a whole query targetlist as a
628 * single expression tree.
630 * The separation between TargetEntry and Resdom is historical. One of these
631 * days, Resdom should probably get folded into TargetEntry.
633 typedef struct TargetEntry
636 Resdom *resdom; /* descriptor for targetlist item */
637 Expr *expr; /* expression to evaluate */
641 /* ----------------------------------------------------------------
642 * node types for join trees
644 * The leaves of a join tree structure are RangeTblRef nodes. Above
645 * these, JoinExpr nodes can appear to denote a specific kind of join
646 * or qualified join. Also, FromExpr nodes can appear to denote an
647 * ordinary cross-product join ("FROM foo, bar, baz WHERE ...").
648 * FromExpr is like a JoinExpr of jointype JOIN_INNER, except that it
649 * may have any number of child nodes, not just two. Also, there is an
650 * implementation-defined difference: the planner is allowed to join the
651 * children of a FromExpr using whatever join order seems good to it.
652 * At present, JoinExpr nodes are always joined in exactly the order
653 * implied by the jointree structure (except the planner may choose to
654 * swap inner and outer members of a join pair).
656 * NOTE: the top level of a Query's jointree is always a FromExpr.
657 * Even if the jointree contains no rels, there will be a FromExpr.
659 * NOTE: the qualification expressions present in JoinExpr nodes are
660 * *in addition to* the query's main WHERE clause, which appears as the
661 * qual of the top-level FromExpr. The reason for associating quals with
662 * specific nodes in the jointree is that the position of a qual is critical
663 * when outer joins are present. (If we enforce a qual too soon or too late,
664 * that may cause the outer join to produce the wrong set of NULL-extended
665 * rows.) If all joins are inner joins then all the qual positions are
666 * semantically interchangeable.
668 * NOTE: in the raw output of gram.y, a join tree contains RangeVar,
669 * RangeSubselect, and RangeFunction nodes, which are all replaced by
670 * RangeTblRef nodes during the parse analysis phase. Also, the top-level
671 * FromExpr is added during parse analysis; the grammar regards FROM and
673 * ----------------------------------------------------------------
677 * RangeTblRef - reference to an entry in the query's rangetable
679 * We could use direct pointers to the RT entries and skip having these
680 * nodes, but multiple pointers to the same node in a querytree cause
681 * lots of headaches, so it seems better to store an index into the RT.
683 typedef struct RangeTblRef
690 * JoinExpr - for SQL JOIN expressions
692 * isNatural, using, and quals are interdependent. The user can write only
693 * one of NATURAL, USING(), or ON() (this is enforced by the grammar).
694 * If he writes NATURAL then parse analysis generates the equivalent USING()
695 * list, and from that fills in "quals" with the right equality comparisons.
696 * If he writes USING() then "quals" is filled with equality comparisons.
697 * If he writes ON() then only "quals" is set. Note that NATURAL/USING
698 * are not equivalent to ON() since they also affect the output column list.
700 * alias is an Alias node representing the AS alias-clause attached to the
701 * join expression, or NULL if no clause. NB: presence or absence of the
702 * alias has a critical impact on semantics, because a join with an alias
703 * restricts visibility of the tables/columns inside it.
705 * During parse analysis, an RTE is created for the Join, and its index
706 * is filled into rtindex. This RTE is present mainly so that Vars can
707 * be created that refer to the outputs of the join.
710 typedef struct JoinExpr
713 JoinType jointype; /* type of join */
714 bool isNatural; /* Natural join? Will need to shape table */
715 Node *larg; /* left subtree */
716 Node *rarg; /* right subtree */
717 List *using; /* USING clause, if any (list of String) */
718 Node *quals; /* qualifiers on join, if any */
719 Alias *alias; /* user-written alias clause, if any */
720 int rtindex; /* RT index assigned for join */
724 * FromExpr - represents a FROM ... WHERE ... construct
726 * This is both more flexible than a JoinExpr (it can have any number of
727 * children, including zero) and less so --- we don't need to deal with
728 * aliases and so on. The output column set is implicitly just the union
729 * of the outputs of the children.
732 typedef struct FromExpr
735 List *fromlist; /* List of join subtrees */
736 Node *quals; /* qualifiers on join, if any */
739 #endif /* PRIMNODES_H */