Repair pg_upgrade for identity sequences with non-default persistence.
[pgsql.git] / src / include / nodes / primnodes.h
blobea47652adb871112d0652a7d4f5994609f563259
1 /*-------------------------------------------------------------------------
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.
10 * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
11 * Portions Copyright (c) 1994, Regents of the University of California
13 * src/include/nodes/primnodes.h
15 *-------------------------------------------------------------------------
17 #ifndef PRIMNODES_H
18 #define PRIMNODES_H
20 #include "access/attnum.h"
21 #include "nodes/bitmapset.h"
22 #include "nodes/pg_list.h"
25 typedef enum OverridingKind
27 OVERRIDING_NOT_SET = 0,
28 OVERRIDING_USER_VALUE,
29 OVERRIDING_SYSTEM_VALUE,
30 } OverridingKind;
33 /* ----------------------------------------------------------------
34 * node definitions
35 * ----------------------------------------------------------------
39 * Alias -
40 * specifies an alias for a range variable; the alias might also
41 * specify renaming of columns within the table.
43 * Note: colnames is a list of String nodes. In Alias structs
44 * associated with RTEs, there may be entries corresponding to dropped
45 * columns; these are normally empty strings (""). See parsenodes.h for info.
47 typedef struct Alias
49 NodeTag type;
50 char *aliasname; /* aliased rel name (never qualified) */
51 List *colnames; /* optional list of column aliases */
52 } Alias;
54 /* What to do at commit time for temporary relations */
55 typedef enum OnCommitAction
57 ONCOMMIT_NOOP, /* No ON COMMIT clause (do nothing) */
58 ONCOMMIT_PRESERVE_ROWS, /* ON COMMIT PRESERVE ROWS (do nothing) */
59 ONCOMMIT_DELETE_ROWS, /* ON COMMIT DELETE ROWS */
60 ONCOMMIT_DROP, /* ON COMMIT DROP */
61 } OnCommitAction;
64 * RangeVar - range variable, used in FROM clauses
66 * Also used to represent table names in utility statements; there, the alias
67 * field is not used, and inh tells whether to apply the operation
68 * recursively to child tables. In some contexts it is also useful to carry
69 * a TEMP table indication here.
71 typedef struct RangeVar
73 NodeTag type;
75 /* the catalog (database) name, or NULL */
76 char *catalogname;
78 /* the schema name, or NULL */
79 char *schemaname;
81 /* the relation/sequence name */
82 char *relname;
84 /* expand rel by inheritance? recursively act on children? */
85 bool inh;
87 /* see RELPERSISTENCE_* in pg_class.h */
88 char relpersistence;
90 /* table alias & optional column aliases */
91 Alias *alias;
93 /* token location, or -1 if unknown */
94 ParseLoc location;
95 } RangeVar;
97 typedef enum TableFuncType
99 TFT_XMLTABLE,
100 TFT_JSON_TABLE,
101 } TableFuncType;
104 * TableFunc - node for a table function, such as XMLTABLE and JSON_TABLE.
106 * Entries in the ns_names list are either String nodes containing
107 * literal namespace names, or NULL pointers to represent DEFAULT.
109 typedef struct TableFunc
111 NodeTag type;
112 /* XMLTABLE or JSON_TABLE */
113 TableFuncType functype;
114 /* list of namespace URI expressions */
115 List *ns_uris pg_node_attr(query_jumble_ignore);
116 /* list of namespace names or NULL */
117 List *ns_names pg_node_attr(query_jumble_ignore);
118 /* input document expression */
119 Node *docexpr;
120 /* row filter expression */
121 Node *rowexpr;
122 /* column names (list of String) */
123 List *colnames pg_node_attr(query_jumble_ignore);
124 /* OID list of column type OIDs */
125 List *coltypes pg_node_attr(query_jumble_ignore);
126 /* integer list of column typmods */
127 List *coltypmods pg_node_attr(query_jumble_ignore);
128 /* OID list of column collation OIDs */
129 List *colcollations pg_node_attr(query_jumble_ignore);
130 /* list of column filter expressions */
131 List *colexprs;
132 /* list of column default expressions */
133 List *coldefexprs pg_node_attr(query_jumble_ignore);
134 /* JSON_TABLE: list of column value expressions */
135 List *colvalexprs pg_node_attr(query_jumble_ignore);
136 /* JSON_TABLE: list of PASSING argument expressions */
137 List *passingvalexprs pg_node_attr(query_jumble_ignore);
138 /* nullability flag for each output column */
139 Bitmapset *notnulls pg_node_attr(query_jumble_ignore);
140 /* JSON_TABLE plan */
141 Node *plan pg_node_attr(query_jumble_ignore);
142 /* counts from 0; -1 if none specified */
143 int ordinalitycol pg_node_attr(query_jumble_ignore);
144 /* token location, or -1 if unknown */
145 ParseLoc location;
146 } TableFunc;
149 * IntoClause - target information for SELECT INTO, CREATE TABLE AS, and
150 * CREATE MATERIALIZED VIEW
152 * For CREATE MATERIALIZED VIEW, viewQuery is the parsed-but-not-rewritten
153 * SELECT Query for the view; otherwise it's NULL. This is irrelevant in
154 * the query jumbling as CreateTableAsStmt already includes a reference to
155 * its own Query, so ignore it. (Although it's actually Query*, we declare
156 * it as Node* to avoid a forward reference.)
158 typedef struct IntoClause
160 NodeTag type;
162 RangeVar *rel; /* target relation name */
163 List *colNames; /* column names to assign, or NIL */
164 char *accessMethod; /* table access method */
165 List *options; /* options from WITH clause */
166 OnCommitAction onCommit; /* what do we do at COMMIT? */
167 char *tableSpaceName; /* table space to use, or NULL */
168 /* materialized view's SELECT query */
169 Node *viewQuery pg_node_attr(query_jumble_ignore);
170 bool skipData; /* true for WITH NO DATA */
171 } IntoClause;
174 /* ----------------------------------------------------------------
175 * node types for executable expressions
176 * ----------------------------------------------------------------
180 * Expr - generic superclass for executable-expression nodes
182 * All node types that are used in executable expression trees should derive
183 * from Expr (that is, have Expr as their first field). Since Expr only
184 * contains NodeTag, this is a formality, but it is an easy form of
185 * documentation. See also the ExprState node types in execnodes.h.
187 typedef struct Expr
189 pg_node_attr(abstract)
191 NodeTag type;
192 } Expr;
195 * Var - expression node representing a variable (ie, a table column)
197 * In the parser and planner, varno and varattno identify the semantic
198 * referent, which is a base-relation column unless the reference is to a join
199 * USING column that isn't semantically equivalent to either join input column
200 * (because it is a FULL join or the input column requires a type coercion).
201 * In those cases varno and varattno refer to the JOIN RTE. (Early in the
202 * planner, we replace such join references by the implied expression; but up
203 * till then we want join reference Vars to keep their original identity for
204 * query-printing purposes.)
206 * At the end of planning, Var nodes appearing in upper-level plan nodes are
207 * reassigned to point to the outputs of their subplans; for example, in a
208 * join node varno becomes INNER_VAR or OUTER_VAR and varattno becomes the
209 * index of the proper element of that subplan's target list. Similarly,
210 * INDEX_VAR is used to identify Vars that reference an index column rather
211 * than a heap column. (In ForeignScan and CustomScan plan nodes, INDEX_VAR
212 * is abused to signify references to columns of a custom scan tuple type.)
214 * ROWID_VAR is used in the planner to identify nonce variables that carry
215 * row identity information during UPDATE/DELETE/MERGE. This value should
216 * never be seen outside the planner.
218 * varnullingrels is the set of RT indexes of outer joins that can force
219 * the Var's value to null (at the point where it appears in the query).
220 * See optimizer/README for discussion of that.
222 * varlevelsup is greater than zero in Vars that represent outer references.
223 * Note that it affects the meaning of all of varno, varnullingrels, and
224 * varnosyn, all of which refer to the range table of that query level.
226 * In the parser, varnosyn and varattnosyn are either identical to
227 * varno/varattno, or they specify the column's position in an aliased JOIN
228 * RTE that hides the semantic referent RTE's refname. This is a syntactic
229 * identifier as opposed to the semantic identifier; it tells ruleutils.c
230 * how to print the Var properly. varnosyn/varattnosyn retain their values
231 * throughout planning and execution, so they are particularly helpful to
232 * identify Vars when debugging. Note, however, that a Var that is generated
233 * in the planner and doesn't correspond to any simple relation column may
234 * have varnosyn = varattnosyn = 0.
236 #define INNER_VAR (-1) /* reference to inner subplan */
237 #define OUTER_VAR (-2) /* reference to outer subplan */
238 #define INDEX_VAR (-3) /* reference to index column */
239 #define ROWID_VAR (-4) /* row identity column during planning */
241 #define IS_SPECIAL_VARNO(varno) ((int) (varno) < 0)
243 /* Symbols for the indexes of the special RTE entries in rules */
244 #define PRS2_OLD_VARNO 1
245 #define PRS2_NEW_VARNO 2
247 typedef struct Var
249 Expr xpr;
252 * index of this var's relation in the range table, or
253 * INNER_VAR/OUTER_VAR/etc
255 int varno;
258 * attribute number of this var, or zero for all attrs ("whole-row Var")
260 AttrNumber varattno;
262 /* pg_type OID for the type of this var */
263 Oid vartype pg_node_attr(query_jumble_ignore);
264 /* pg_attribute typmod value */
265 int32 vartypmod pg_node_attr(query_jumble_ignore);
266 /* OID of collation, or InvalidOid if none */
267 Oid varcollid pg_node_attr(query_jumble_ignore);
270 * RT indexes of outer joins that can replace the Var's value with null.
271 * We can omit varnullingrels in the query jumble, because it's fully
272 * determined by varno/varlevelsup plus the Var's query location.
274 Bitmapset *varnullingrels pg_node_attr(query_jumble_ignore);
277 * for subquery variables referencing outer relations; 0 in a normal var,
278 * >0 means N levels up
280 Index varlevelsup;
283 * varnosyn/varattnosyn are ignored for equality, because Vars with
284 * different syntactic identifiers are semantically the same as long as
285 * their varno/varattno match.
287 /* syntactic relation index (0 if unknown) */
288 Index varnosyn pg_node_attr(equal_ignore, query_jumble_ignore);
289 /* syntactic attribute number */
290 AttrNumber varattnosyn pg_node_attr(equal_ignore, query_jumble_ignore);
292 /* token location, or -1 if unknown */
293 ParseLoc location;
294 } Var;
297 * Const
299 * Note: for varlena data types, we make a rule that a Const node's value
300 * must be in non-extended form (4-byte header, no compression or external
301 * references). This ensures that the Const node is self-contained and makes
302 * it more likely that equal() will see logically identical values as equal.
304 * Only the constant type OID is relevant for the query jumbling.
306 typedef struct Const
308 pg_node_attr(custom_copy_equal, custom_read_write)
310 Expr xpr;
311 /* pg_type OID of the constant's datatype */
312 Oid consttype;
313 /* typmod value, if any */
314 int32 consttypmod pg_node_attr(query_jumble_ignore);
315 /* OID of collation, or InvalidOid if none */
316 Oid constcollid pg_node_attr(query_jumble_ignore);
317 /* typlen of the constant's datatype */
318 int constlen pg_node_attr(query_jumble_ignore);
319 /* the constant's value */
320 Datum constvalue pg_node_attr(query_jumble_ignore);
321 /* whether the constant is null (if true, constvalue is undefined) */
322 bool constisnull pg_node_attr(query_jumble_ignore);
325 * Whether this datatype is passed by value. If true, then all the
326 * information is stored in the Datum. If false, then the Datum contains
327 * a pointer to the information.
329 bool constbyval pg_node_attr(query_jumble_ignore);
332 * token location, or -1 if unknown. All constants are tracked as
333 * locations in query jumbling, to be marked as parameters.
335 ParseLoc location pg_node_attr(query_jumble_location);
336 } Const;
339 * Param
341 * paramkind specifies the kind of parameter. The possible values
342 * for this field are:
344 * PARAM_EXTERN: The parameter value is supplied from outside the plan.
345 * Such parameters are numbered from 1 to n.
347 * PARAM_EXEC: The parameter is an internal executor parameter, used
348 * for passing values into and out of sub-queries or from
349 * nestloop joins to their inner scans.
350 * For historical reasons, such parameters are numbered from 0.
351 * These numbers are independent of PARAM_EXTERN numbers.
353 * PARAM_SUBLINK: The parameter represents an output column of a SubLink
354 * node's sub-select. The column number is contained in the
355 * `paramid' field. (This type of Param is converted to
356 * PARAM_EXEC during planning.)
358 * PARAM_MULTIEXPR: Like PARAM_SUBLINK, the parameter represents an
359 * output column of a SubLink node's sub-select, but here, the
360 * SubLink is always a MULTIEXPR SubLink. The high-order 16 bits
361 * of the `paramid' field contain the SubLink's subLinkId, and
362 * the low-order 16 bits contain the column number. (This type
363 * of Param is also converted to PARAM_EXEC during planning.)
365 typedef enum ParamKind
367 PARAM_EXTERN,
368 PARAM_EXEC,
369 PARAM_SUBLINK,
370 PARAM_MULTIEXPR,
371 } ParamKind;
373 typedef struct Param
375 Expr xpr;
376 ParamKind paramkind; /* kind of parameter. See above */
377 int paramid; /* numeric ID for parameter */
378 Oid paramtype; /* pg_type OID of parameter's datatype */
379 /* typmod value, if known */
380 int32 paramtypmod pg_node_attr(query_jumble_ignore);
381 /* OID of collation, or InvalidOid if none */
382 Oid paramcollid pg_node_attr(query_jumble_ignore);
383 /* token location, or -1 if unknown */
384 ParseLoc location;
385 } Param;
388 * Aggref
390 * The aggregate's args list is a targetlist, ie, a list of TargetEntry nodes.
392 * For a normal (non-ordered-set) aggregate, the non-resjunk TargetEntries
393 * represent the aggregate's regular arguments (if any) and resjunk TLEs can
394 * be added at the end to represent ORDER BY expressions that are not also
395 * arguments. As in a top-level Query, the TLEs can be marked with
396 * ressortgroupref indexes to let them be referenced by SortGroupClause
397 * entries in the aggorder and/or aggdistinct lists. This represents ORDER BY
398 * and DISTINCT operations to be applied to the aggregate input rows before
399 * they are passed to the transition function. The grammar only allows a
400 * simple "DISTINCT" specifier for the arguments, but we use the full
401 * query-level representation to allow more code sharing.
403 * For an ordered-set aggregate, the args list represents the WITHIN GROUP
404 * (aggregated) arguments, all of which will be listed in the aggorder list.
405 * DISTINCT is not supported in this case, so aggdistinct will be NIL.
406 * The direct arguments appear in aggdirectargs (as a list of plain
407 * expressions, not TargetEntry nodes).
409 * aggtranstype is the data type of the state transition values for this
410 * aggregate (resolved to an actual type, if agg's transtype is polymorphic).
411 * This is determined during planning and is InvalidOid before that.
413 * aggargtypes is an OID list of the data types of the direct and regular
414 * arguments. Normally it's redundant with the aggdirectargs and args lists,
415 * but in a combining aggregate, it's not because the args list has been
416 * replaced with a single argument representing the partial-aggregate
417 * transition values.
419 * aggpresorted is set by the query planner for ORDER BY and DISTINCT
420 * aggregates where the chosen plan provides presorted input for this
421 * aggregate during execution.
423 * aggsplit indicates the expected partial-aggregation mode for the Aggref's
424 * parent plan node. It's always set to AGGSPLIT_SIMPLE in the parser, but
425 * the planner might change it to something else. We use this mainly as
426 * a crosscheck that the Aggrefs match the plan; but note that when aggsplit
427 * indicates a non-final mode, aggtype reflects the transition data type
428 * not the SQL-level output type of the aggregate.
430 * aggno and aggtransno are -1 in the parse stage, and are set in planning.
431 * Aggregates with the same 'aggno' represent the same aggregate expression,
432 * and can share the result. Aggregates with same 'transno' but different
433 * 'aggno' can share the same transition state, only the final function needs
434 * to be called separately.
436 * Information related to collations, transition types and internal states
437 * are irrelevant for the query jumbling.
439 typedef struct Aggref
441 Expr xpr;
443 /* pg_proc Oid of the aggregate */
444 Oid aggfnoid;
446 /* type Oid of result of the aggregate */
447 Oid aggtype pg_node_attr(query_jumble_ignore);
449 /* OID of collation of result */
450 Oid aggcollid pg_node_attr(query_jumble_ignore);
452 /* OID of collation that function should use */
453 Oid inputcollid pg_node_attr(query_jumble_ignore);
456 * type Oid of aggregate's transition value; ignored for equal since it
457 * might not be set yet
459 Oid aggtranstype pg_node_attr(equal_ignore, query_jumble_ignore);
461 /* type Oids of direct and aggregated args */
462 List *aggargtypes pg_node_attr(query_jumble_ignore);
464 /* direct arguments, if an ordered-set agg */
465 List *aggdirectargs;
467 /* aggregated arguments and sort expressions */
468 List *args;
470 /* ORDER BY (list of SortGroupClause) */
471 List *aggorder;
473 /* DISTINCT (list of SortGroupClause) */
474 List *aggdistinct;
476 /* FILTER expression, if any */
477 Expr *aggfilter;
479 /* true if argument list was really '*' */
480 bool aggstar pg_node_attr(query_jumble_ignore);
483 * true if variadic arguments have been combined into an array last
484 * argument
486 bool aggvariadic pg_node_attr(query_jumble_ignore);
488 /* aggregate kind (see pg_aggregate.h) */
489 char aggkind pg_node_attr(query_jumble_ignore);
491 /* aggregate input already sorted */
492 bool aggpresorted pg_node_attr(equal_ignore, query_jumble_ignore);
494 /* > 0 if agg belongs to outer query */
495 Index agglevelsup pg_node_attr(query_jumble_ignore);
497 /* expected agg-splitting mode of parent Agg */
498 AggSplit aggsplit pg_node_attr(query_jumble_ignore);
500 /* unique ID within the Agg node */
501 int aggno pg_node_attr(query_jumble_ignore);
503 /* unique ID of transition state in the Agg */
504 int aggtransno pg_node_attr(query_jumble_ignore);
506 /* token location, or -1 if unknown */
507 ParseLoc location;
508 } Aggref;
511 * GroupingFunc
513 * A GroupingFunc is a GROUPING(...) expression, which behaves in many ways
514 * like an aggregate function (e.g. it "belongs" to a specific query level,
515 * which might not be the one immediately containing it), but also differs in
516 * an important respect: it never evaluates its arguments, they merely
517 * designate expressions from the GROUP BY clause of the query level to which
518 * it belongs.
520 * The spec defines the evaluation of GROUPING() purely by syntactic
521 * replacement, but we make it a real expression for optimization purposes so
522 * that one Agg node can handle multiple grouping sets at once. Evaluating the
523 * result only needs the column positions to check against the grouping set
524 * being projected. However, for EXPLAIN to produce meaningful output, we have
525 * to keep the original expressions around, since expression deparse does not
526 * give us any feasible way to get at the GROUP BY clause.
528 * Also, we treat two GroupingFunc nodes as equal if they have equal arguments
529 * lists and agglevelsup, without comparing the refs and cols annotations.
531 * In raw parse output we have only the args list; parse analysis fills in the
532 * refs list, and the planner fills in the cols list.
534 * All the fields used as information for an internal state are irrelevant
535 * for the query jumbling.
537 typedef struct GroupingFunc
539 Expr xpr;
541 /* arguments, not evaluated but kept for benefit of EXPLAIN etc. */
542 List *args pg_node_attr(query_jumble_ignore);
544 /* ressortgrouprefs of arguments */
545 List *refs pg_node_attr(equal_ignore);
547 /* actual column positions set by planner */
548 List *cols pg_node_attr(equal_ignore, query_jumble_ignore);
550 /* same as Aggref.agglevelsup */
551 Index agglevelsup;
553 /* token location */
554 ParseLoc location;
555 } GroupingFunc;
558 * WindowFunc
560 * Collation information is irrelevant for the query jumbling, as is the
561 * internal state information of the node like "winstar" and "winagg".
563 typedef struct WindowFunc
565 Expr xpr;
566 /* pg_proc Oid of the function */
567 Oid winfnoid;
568 /* type Oid of result of the window function */
569 Oid wintype pg_node_attr(query_jumble_ignore);
570 /* OID of collation of result */
571 Oid wincollid pg_node_attr(query_jumble_ignore);
572 /* OID of collation that function should use */
573 Oid inputcollid pg_node_attr(query_jumble_ignore);
574 /* arguments to the window function */
575 List *args;
576 /* FILTER expression, if any */
577 Expr *aggfilter;
578 /* List of WindowFuncRunConditions to help short-circuit execution */
579 List *runCondition pg_node_attr(query_jumble_ignore);
580 /* index of associated WindowClause */
581 Index winref;
582 /* true if argument list was really '*' */
583 bool winstar pg_node_attr(query_jumble_ignore);
584 /* is function a simple aggregate? */
585 bool winagg pg_node_attr(query_jumble_ignore);
586 /* token location, or -1 if unknown */
587 ParseLoc location;
588 } WindowFunc;
591 * WindowFuncRunCondition
593 * Represents intermediate OpExprs which will be used by WindowAgg to
594 * short-circuit execution.
596 typedef struct WindowFuncRunCondition
598 Expr xpr;
600 /* PG_OPERATOR OID of the operator */
601 Oid opno;
602 /* OID of collation that operator should use */
603 Oid inputcollid pg_node_attr(query_jumble_ignore);
606 * true of WindowFunc belongs on the left of the resulting OpExpr or false
607 * if the WindowFunc is on the right.
609 bool wfunc_left;
612 * The Expr being compared to the WindowFunc to use in the OpExpr in the
613 * WindowAgg's runCondition
615 Expr *arg;
616 } WindowFuncRunCondition;
619 * MergeSupportFunc
621 * A MergeSupportFunc is a merge support function expression that can only
622 * appear in the RETURNING list of a MERGE command. It returns information
623 * about the currently executing merge action.
625 * Currently, the only supported function is MERGE_ACTION(), which returns the
626 * command executed ("INSERT", "UPDATE", or "DELETE").
628 typedef struct MergeSupportFunc
630 Expr xpr;
631 /* type Oid of result */
632 Oid msftype;
633 /* OID of collation, or InvalidOid if none */
634 Oid msfcollid;
635 /* token location, or -1 if unknown */
636 ParseLoc location;
637 } MergeSupportFunc;
640 * SubscriptingRef: describes a subscripting operation over a container
641 * (array, etc).
643 * A SubscriptingRef can describe fetching a single element from a container,
644 * fetching a part of a container (e.g. an array slice), storing a single
645 * element into a container, or storing a slice. The "store" cases work with
646 * an initial container value and a source value that is inserted into the
647 * appropriate part of the container; the result of the operation is an
648 * entire new modified container value.
650 * If reflowerindexpr = NIL, then we are fetching or storing a single container
651 * element at the subscripts given by refupperindexpr. Otherwise we are
652 * fetching or storing a container slice, that is a rectangular subcontainer
653 * with lower and upper bounds given by the index expressions.
654 * reflowerindexpr must be the same length as refupperindexpr when it
655 * is not NIL.
657 * In the slice case, individual expressions in the subscript lists can be
658 * NULL, meaning "substitute the array's current lower or upper bound".
659 * (Non-array containers may or may not support this.)
661 * refcontainertype is the actual container type that determines the
662 * subscripting semantics. (This will generally be either the exposed type of
663 * refexpr, or the base type if that is a domain.) refelemtype is the type of
664 * the container's elements; this is saved for the use of the subscripting
665 * functions, but is not used by the core code. refrestype, reftypmod, and
666 * refcollid describe the type of the SubscriptingRef's result. In a store
667 * expression, refrestype will always match refcontainertype; in a fetch,
668 * it could be refelemtype for an element fetch, or refcontainertype for a
669 * slice fetch, or possibly something else as determined by type-specific
670 * subscripting logic. Likewise, reftypmod and refcollid will match the
671 * container's properties in a store, but could be different in a fetch.
673 * Any internal state data is ignored for the query jumbling.
675 * Note: for the cases where a container is returned, if refexpr yields a R/W
676 * expanded container, then the implementation is allowed to modify that
677 * object in-place and return the same object.
679 typedef struct SubscriptingRef
681 Expr xpr;
682 /* type of the container proper */
683 Oid refcontainertype pg_node_attr(query_jumble_ignore);
684 /* the container type's pg_type.typelem */
685 Oid refelemtype pg_node_attr(query_jumble_ignore);
686 /* type of the SubscriptingRef's result */
687 Oid refrestype pg_node_attr(query_jumble_ignore);
688 /* typmod of the result */
689 int32 reftypmod pg_node_attr(query_jumble_ignore);
690 /* collation of result, or InvalidOid if none */
691 Oid refcollid pg_node_attr(query_jumble_ignore);
692 /* expressions that evaluate to upper container indexes */
693 List *refupperindexpr;
696 * expressions that evaluate to lower container indexes, or NIL for single
697 * container element.
699 List *reflowerindexpr;
700 /* the expression that evaluates to a container value */
701 Expr *refexpr;
702 /* expression for the source value, or NULL if fetch */
703 Expr *refassgnexpr;
704 } SubscriptingRef;
707 * CoercionContext - distinguishes the allowed set of type casts
709 * NB: ordering of the alternatives is significant; later (larger) values
710 * allow more casts than earlier ones.
712 typedef enum CoercionContext
714 COERCION_IMPLICIT, /* coercion in context of expression */
715 COERCION_ASSIGNMENT, /* coercion in context of assignment */
716 COERCION_PLPGSQL, /* if no assignment cast, use CoerceViaIO */
717 COERCION_EXPLICIT, /* explicit cast operation */
718 } CoercionContext;
721 * CoercionForm - how to display a FuncExpr or related node
723 * "Coercion" is a bit of a misnomer, since this value records other
724 * special syntaxes besides casts, but for now we'll keep this naming.
726 * NB: equal() ignores CoercionForm fields, therefore this *must* not carry
727 * any semantically significant information. We need that behavior so that
728 * the planner will consider equivalent implicit and explicit casts to be
729 * equivalent. In cases where those actually behave differently, the coercion
730 * function's arguments will be different.
732 typedef enum CoercionForm
734 COERCE_EXPLICIT_CALL, /* display as a function call */
735 COERCE_EXPLICIT_CAST, /* display as an explicit cast */
736 COERCE_IMPLICIT_CAST, /* implicit cast, so hide it */
737 COERCE_SQL_SYNTAX, /* display with SQL-mandated special syntax */
738 } CoercionForm;
741 * FuncExpr - expression node for a function call
743 * Collation information is irrelevant for the query jumbling, only the
744 * arguments and the function OID matter.
746 typedef struct FuncExpr
748 Expr xpr;
749 /* PG_PROC OID of the function */
750 Oid funcid;
751 /* PG_TYPE OID of result value */
752 Oid funcresulttype pg_node_attr(query_jumble_ignore);
753 /* true if function returns set */
754 bool funcretset pg_node_attr(query_jumble_ignore);
757 * true if variadic arguments have been combined into an array last
758 * argument
760 bool funcvariadic pg_node_attr(query_jumble_ignore);
761 /* how to display this function call */
762 CoercionForm funcformat pg_node_attr(query_jumble_ignore);
763 /* OID of collation of result */
764 Oid funccollid pg_node_attr(query_jumble_ignore);
765 /* OID of collation that function should use */
766 Oid inputcollid pg_node_attr(query_jumble_ignore);
767 /* arguments to the function */
768 List *args;
769 /* token location, or -1 if unknown */
770 ParseLoc location;
771 } FuncExpr;
774 * NamedArgExpr - a named argument of a function
776 * This node type can only appear in the args list of a FuncCall or FuncExpr
777 * node. We support pure positional call notation (no named arguments),
778 * named notation (all arguments are named), and mixed notation (unnamed
779 * arguments followed by named ones).
781 * Parse analysis sets argnumber to the positional index of the argument,
782 * but doesn't rearrange the argument list.
784 * The planner will convert argument lists to pure positional notation
785 * during expression preprocessing, so execution never sees a NamedArgExpr.
787 typedef struct NamedArgExpr
789 Expr xpr;
790 /* the argument expression */
791 Expr *arg;
792 /* the name */
793 char *name pg_node_attr(query_jumble_ignore);
794 /* argument's number in positional notation */
795 int argnumber;
796 /* argument name location, or -1 if unknown */
797 ParseLoc location;
798 } NamedArgExpr;
801 * OpExpr - expression node for an operator invocation
803 * Semantically, this is essentially the same as a function call.
805 * Note that opfuncid is not necessarily filled in immediately on creation
806 * of the node. The planner makes sure it is valid before passing the node
807 * tree to the executor, but during parsing/planning opfuncid can be 0.
808 * Therefore, equal() will accept a zero value as being equal to other values.
810 * Internal state information and collation data is irrelevant for the query
811 * jumbling.
813 typedef struct OpExpr
815 Expr xpr;
817 /* PG_OPERATOR OID of the operator */
818 Oid opno;
820 /* PG_PROC OID of underlying function */
821 Oid opfuncid pg_node_attr(equal_ignore_if_zero, query_jumble_ignore);
823 /* PG_TYPE OID of result value */
824 Oid opresulttype pg_node_attr(query_jumble_ignore);
826 /* true if operator returns set */
827 bool opretset pg_node_attr(query_jumble_ignore);
829 /* OID of collation of result */
830 Oid opcollid pg_node_attr(query_jumble_ignore);
832 /* OID of collation that operator should use */
833 Oid inputcollid pg_node_attr(query_jumble_ignore);
835 /* arguments to the operator (1 or 2) */
836 List *args;
838 /* token location, or -1 if unknown */
839 ParseLoc location;
840 } OpExpr;
843 * DistinctExpr - expression node for "x IS DISTINCT FROM y"
845 * Except for the nodetag, this is represented identically to an OpExpr
846 * referencing the "=" operator for x and y.
847 * We use "=", not the more obvious "<>", because more datatypes have "="
848 * than "<>". This means the executor must invert the operator result.
849 * Note that the operator function won't be called at all if either input
850 * is NULL, since then the result can be determined directly.
852 typedef OpExpr DistinctExpr;
855 * NullIfExpr - a NULLIF expression
857 * Like DistinctExpr, this is represented the same as an OpExpr referencing
858 * the "=" operator for x and y.
860 typedef OpExpr NullIfExpr;
863 * ScalarArrayOpExpr - expression node for "scalar op ANY/ALL (array)"
865 * The operator must yield boolean. It is applied to the left operand
866 * and each element of the righthand array, and the results are combined
867 * with OR or AND (for ANY or ALL respectively). The node representation
868 * is almost the same as for the underlying operator, but we need a useOr
869 * flag to remember whether it's ANY or ALL, and we don't have to store
870 * the result type (or the collation) because it must be boolean.
872 * A ScalarArrayOpExpr with a valid hashfuncid is evaluated during execution
873 * by building a hash table containing the Const values from the RHS arg.
874 * This table is probed during expression evaluation. The planner will set
875 * hashfuncid to the hash function which must be used to build and probe the
876 * hash table. The executor determines if it should use hash-based checks or
877 * the more traditional means based on if the hashfuncid is set or not.
879 * When performing hashed NOT IN, the negfuncid will also be set to the
880 * equality function which the hash table must use to build and probe the hash
881 * table. opno and opfuncid will remain set to the <> operator and its
882 * corresponding function and won't be used during execution. For
883 * non-hashtable based NOT INs, negfuncid will be set to InvalidOid. See
884 * convert_saop_to_hashed_saop().
886 * Similar to OpExpr, opfuncid, hashfuncid, and negfuncid are not necessarily
887 * filled in right away, so will be ignored for equality if they are not set
888 * yet.
890 * OID entries of the internal function types are irrelevant for the query
891 * jumbling, but the operator OID and the arguments are.
893 typedef struct ScalarArrayOpExpr
895 Expr xpr;
897 /* PG_OPERATOR OID of the operator */
898 Oid opno;
900 /* PG_PROC OID of comparison function */
901 Oid opfuncid pg_node_attr(equal_ignore_if_zero, query_jumble_ignore);
903 /* PG_PROC OID of hash func or InvalidOid */
904 Oid hashfuncid pg_node_attr(equal_ignore_if_zero, query_jumble_ignore);
906 /* PG_PROC OID of negator of opfuncid function or InvalidOid. See above */
907 Oid negfuncid pg_node_attr(equal_ignore_if_zero, query_jumble_ignore);
909 /* true for ANY, false for ALL */
910 bool useOr;
912 /* OID of collation that operator should use */
913 Oid inputcollid pg_node_attr(query_jumble_ignore);
915 /* the scalar and array operands */
916 List *args;
918 /* token location, or -1 if unknown */
919 ParseLoc location;
920 } ScalarArrayOpExpr;
923 * BoolExpr - expression node for the basic Boolean operators AND, OR, NOT
925 * Notice the arguments are given as a List. For NOT, of course the list
926 * must always have exactly one element. For AND and OR, there can be two
927 * or more arguments.
929 typedef enum BoolExprType
931 AND_EXPR, OR_EXPR, NOT_EXPR
932 } BoolExprType;
934 typedef struct BoolExpr
936 pg_node_attr(custom_read_write)
938 Expr xpr;
939 BoolExprType boolop;
940 List *args; /* arguments to this expression */
941 ParseLoc location; /* token location, or -1 if unknown */
942 } BoolExpr;
945 * SubLink
947 * A SubLink represents a subselect appearing in an expression, and in some
948 * cases also the combining operator(s) just above it. The subLinkType
949 * indicates the form of the expression represented:
950 * EXISTS_SUBLINK EXISTS(SELECT ...)
951 * ALL_SUBLINK (lefthand) op ALL (SELECT ...)
952 * ANY_SUBLINK (lefthand) op ANY (SELECT ...)
953 * ROWCOMPARE_SUBLINK (lefthand) op (SELECT ...)
954 * EXPR_SUBLINK (SELECT with single targetlist item ...)
955 * MULTIEXPR_SUBLINK (SELECT with multiple targetlist items ...)
956 * ARRAY_SUBLINK ARRAY(SELECT with single targetlist item ...)
957 * CTE_SUBLINK WITH query (never actually part of an expression)
958 * For ALL, ANY, and ROWCOMPARE, the lefthand is a list of expressions of the
959 * same length as the subselect's targetlist. ROWCOMPARE will *always* have
960 * a list with more than one entry; if the subselect has just one target
961 * then the parser will create an EXPR_SUBLINK instead (and any operator
962 * above the subselect will be represented separately).
963 * ROWCOMPARE, EXPR, and MULTIEXPR require the subselect to deliver at most
964 * one row (if it returns no rows, the result is NULL).
965 * ALL, ANY, and ROWCOMPARE require the combining operators to deliver boolean
966 * results. ALL and ANY combine the per-row results using AND and OR
967 * semantics respectively.
968 * ARRAY requires just one target column, and creates an array of the target
969 * column's type using any number of rows resulting from the subselect.
971 * SubLink is classed as an Expr node, but it is not actually executable;
972 * it must be replaced in the expression tree by a SubPlan node during
973 * planning.
975 * NOTE: in the raw output of gram.y, testexpr contains just the raw form
976 * of the lefthand expression (if any), and operName is the String name of
977 * the combining operator. Also, subselect is a raw parsetree. During parse
978 * analysis, the parser transforms testexpr into a complete boolean expression
979 * that compares the lefthand value(s) to PARAM_SUBLINK nodes representing the
980 * output columns of the subselect. And subselect is transformed to a Query.
981 * This is the representation seen in saved rules and in the rewriter.
983 * In EXISTS, EXPR, MULTIEXPR, and ARRAY SubLinks, testexpr and operName
984 * are unused and are always null.
986 * subLinkId is currently used only for MULTIEXPR SubLinks, and is zero in
987 * other SubLinks. This number identifies different multiple-assignment
988 * subqueries within an UPDATE statement's SET list. It is unique only
989 * within a particular targetlist. The output column(s) of the MULTIEXPR
990 * are referenced by PARAM_MULTIEXPR Params appearing elsewhere in the tlist.
992 * The CTE_SUBLINK case never occurs in actual SubLink nodes, but it is used
993 * in SubPlans generated for WITH subqueries.
995 typedef enum SubLinkType
997 EXISTS_SUBLINK,
998 ALL_SUBLINK,
999 ANY_SUBLINK,
1000 ROWCOMPARE_SUBLINK,
1001 EXPR_SUBLINK,
1002 MULTIEXPR_SUBLINK,
1003 ARRAY_SUBLINK,
1004 CTE_SUBLINK, /* for SubPlans only */
1005 } SubLinkType;
1008 typedef struct SubLink
1010 Expr xpr;
1011 SubLinkType subLinkType; /* see above */
1012 int subLinkId; /* ID (1..n); 0 if not MULTIEXPR */
1013 Node *testexpr; /* outer-query test for ALL/ANY/ROWCOMPARE */
1014 /* originally specified operator name */
1015 List *operName pg_node_attr(query_jumble_ignore);
1016 /* subselect as Query* or raw parsetree */
1017 Node *subselect;
1018 ParseLoc location; /* token location, or -1 if unknown */
1019 } SubLink;
1022 * SubPlan - executable expression node for a subplan (sub-SELECT)
1024 * The planner replaces SubLink nodes in expression trees with SubPlan
1025 * nodes after it has finished planning the subquery. SubPlan references
1026 * a sub-plantree stored in the subplans list of the toplevel PlannedStmt.
1027 * (We avoid a direct link to make it easier to copy expression trees
1028 * without causing multiple processing of the subplan.)
1030 * In an ordinary subplan, testexpr points to an executable expression
1031 * (OpExpr, an AND/OR tree of OpExprs, or RowCompareExpr) for the combining
1032 * operator(s); the left-hand arguments are the original lefthand expressions,
1033 * and the right-hand arguments are PARAM_EXEC Param nodes representing the
1034 * outputs of the sub-select. (NOTE: runtime coercion functions may be
1035 * inserted as well.) This is just the same expression tree as testexpr in
1036 * the original SubLink node, but the PARAM_SUBLINK nodes are replaced by
1037 * suitably numbered PARAM_EXEC nodes.
1039 * If the sub-select becomes an initplan rather than a subplan, the executable
1040 * expression is part of the outer plan's expression tree (and the SubPlan
1041 * node itself is not, but rather is found in the outer plan's initPlan
1042 * list). In this case testexpr is NULL to avoid duplication.
1044 * The planner also derives lists of the values that need to be passed into
1045 * and out of the subplan. Input values are represented as a list "args" of
1046 * expressions to be evaluated in the outer-query context (currently these
1047 * args are always just Vars, but in principle they could be any expression).
1048 * The values are assigned to the global PARAM_EXEC params indexed by parParam
1049 * (the parParam and args lists must have the same ordering). setParam is a
1050 * list of the PARAM_EXEC params that are computed by the sub-select, if it
1051 * is an initplan or MULTIEXPR plan; they are listed in order by sub-select
1052 * output column position. (parParam and setParam are integer Lists, not
1053 * Bitmapsets, because their ordering is significant.)
1055 * Also, the planner computes startup and per-call costs for use of the
1056 * SubPlan. Note that these include the cost of the subquery proper,
1057 * evaluation of the testexpr if any, and any hashtable management overhead.
1059 typedef struct SubPlan
1061 pg_node_attr(no_query_jumble)
1063 Expr xpr;
1064 /* Fields copied from original SubLink: */
1065 SubLinkType subLinkType; /* see above */
1066 /* The combining operators, transformed to an executable expression: */
1067 Node *testexpr; /* OpExpr or RowCompareExpr expression tree */
1068 List *paramIds; /* IDs of Params embedded in the above */
1069 /* Identification of the Plan tree to use: */
1070 int plan_id; /* Index (from 1) in PlannedStmt.subplans */
1071 /* Identification of the SubPlan for EXPLAIN and debugging purposes: */
1072 char *plan_name; /* A name assigned during planning */
1073 /* Extra data useful for determining subplan's output type: */
1074 Oid firstColType; /* Type of first column of subplan result */
1075 int32 firstColTypmod; /* Typmod of first column of subplan result */
1076 Oid firstColCollation; /* Collation of first column of subplan
1077 * result */
1078 /* Information about execution strategy: */
1079 bool useHashTable; /* true to store subselect output in a hash
1080 * table (implies we are doing "IN") */
1081 bool unknownEqFalse; /* true if it's okay to return FALSE when the
1082 * spec result is UNKNOWN; this allows much
1083 * simpler handling of null values */
1084 bool parallel_safe; /* is the subplan parallel-safe? */
1085 /* Note: parallel_safe does not consider contents of testexpr or args */
1086 /* Information for passing params into and out of the subselect: */
1087 /* setParam and parParam are lists of integers (param IDs) */
1088 List *setParam; /* initplan and MULTIEXPR subqueries have to
1089 * set these Params for parent plan */
1090 List *parParam; /* indices of input Params from parent plan */
1091 List *args; /* exprs to pass as parParam values */
1092 /* Estimated execution costs: */
1093 Cost startup_cost; /* one-time setup cost */
1094 Cost per_call_cost; /* cost for each subplan evaluation */
1095 } SubPlan;
1098 * AlternativeSubPlan - expression node for a choice among SubPlans
1100 * This is used only transiently during planning: by the time the plan
1101 * reaches the executor, all AlternativeSubPlan nodes have been removed.
1103 * The subplans are given as a List so that the node definition need not
1104 * change if there's ever more than two alternatives. For the moment,
1105 * though, there are always exactly two; and the first one is the fast-start
1106 * plan.
1108 typedef struct AlternativeSubPlan
1110 pg_node_attr(no_query_jumble)
1112 Expr xpr;
1113 List *subplans; /* SubPlan(s) with equivalent results */
1114 } AlternativeSubPlan;
1116 /* ----------------
1117 * FieldSelect
1119 * FieldSelect represents the operation of extracting one field from a tuple
1120 * value. At runtime, the input expression is expected to yield a rowtype
1121 * Datum. The specified field number is extracted and returned as a Datum.
1122 * ----------------
1125 typedef struct FieldSelect
1127 Expr xpr;
1128 Expr *arg; /* input expression */
1129 AttrNumber fieldnum; /* attribute number of field to extract */
1130 /* type of the field (result type of this node) */
1131 Oid resulttype pg_node_attr(query_jumble_ignore);
1132 /* output typmod (usually -1) */
1133 int32 resulttypmod pg_node_attr(query_jumble_ignore);
1134 /* OID of collation of the field */
1135 Oid resultcollid pg_node_attr(query_jumble_ignore);
1136 } FieldSelect;
1138 /* ----------------
1139 * FieldStore
1141 * FieldStore represents the operation of modifying one field in a tuple
1142 * value, yielding a new tuple value (the input is not touched!). Like
1143 * the assign case of SubscriptingRef, this is used to implement UPDATE of a
1144 * portion of a column.
1146 * resulttype is always a named composite type (not a domain). To update
1147 * a composite domain value, apply CoerceToDomain to the FieldStore.
1149 * A single FieldStore can actually represent updates of several different
1150 * fields. The parser only generates FieldStores with single-element lists,
1151 * but the planner will collapse multiple updates of the same base column
1152 * into one FieldStore.
1153 * ----------------
1156 typedef struct FieldStore
1158 Expr xpr;
1159 Expr *arg; /* input tuple value */
1160 List *newvals; /* new value(s) for field(s) */
1161 /* integer list of field attnums */
1162 List *fieldnums pg_node_attr(query_jumble_ignore);
1163 /* type of result (same as type of arg) */
1164 Oid resulttype pg_node_attr(query_jumble_ignore);
1165 /* Like RowExpr, we deliberately omit a typmod and collation here */
1166 } FieldStore;
1168 /* ----------------
1169 * RelabelType
1171 * RelabelType represents a "dummy" type coercion between two binary-
1172 * compatible datatypes, such as reinterpreting the result of an OID
1173 * expression as an int4. It is a no-op at runtime; we only need it
1174 * to provide a place to store the correct type to be attributed to
1175 * the expression result during type resolution. (We can't get away
1176 * with just overwriting the type field of the input expression node,
1177 * so we need a separate node to show the coercion's result type.)
1178 * ----------------
1181 typedef struct RelabelType
1183 Expr xpr;
1184 Expr *arg; /* input expression */
1185 Oid resulttype; /* output type of coercion expression */
1186 /* output typmod (usually -1) */
1187 int32 resulttypmod pg_node_attr(query_jumble_ignore);
1188 /* OID of collation, or InvalidOid if none */
1189 Oid resultcollid pg_node_attr(query_jumble_ignore);
1190 /* how to display this node */
1191 CoercionForm relabelformat pg_node_attr(query_jumble_ignore);
1192 ParseLoc location; /* token location, or -1 if unknown */
1193 } RelabelType;
1195 /* ----------------
1196 * CoerceViaIO
1198 * CoerceViaIO represents a type coercion between two types whose textual
1199 * representations are compatible, implemented by invoking the source type's
1200 * typoutput function then the destination type's typinput function.
1201 * ----------------
1204 typedef struct CoerceViaIO
1206 Expr xpr;
1207 Expr *arg; /* input expression */
1208 Oid resulttype; /* output type of coercion */
1209 /* output typmod is not stored, but is presumed -1 */
1210 /* OID of collation, or InvalidOid if none */
1211 Oid resultcollid pg_node_attr(query_jumble_ignore);
1212 /* how to display this node */
1213 CoercionForm coerceformat pg_node_attr(query_jumble_ignore);
1214 ParseLoc location; /* token location, or -1 if unknown */
1215 } CoerceViaIO;
1217 /* ----------------
1218 * ArrayCoerceExpr
1220 * ArrayCoerceExpr represents a type coercion from one array type to another,
1221 * which is implemented by applying the per-element coercion expression
1222 * "elemexpr" to each element of the source array. Within elemexpr, the
1223 * source element is represented by a CaseTestExpr node. Note that even if
1224 * elemexpr is a no-op (that is, just CaseTestExpr + RelabelType), the
1225 * coercion still requires some effort: we have to fix the element type OID
1226 * stored in the array header.
1227 * ----------------
1230 typedef struct ArrayCoerceExpr
1232 Expr xpr;
1233 Expr *arg; /* input expression (yields an array) */
1234 Expr *elemexpr; /* expression representing per-element work */
1235 Oid resulttype; /* output type of coercion (an array type) */
1236 /* output typmod (also element typmod) */
1237 int32 resulttypmod pg_node_attr(query_jumble_ignore);
1238 /* OID of collation, or InvalidOid if none */
1239 Oid resultcollid pg_node_attr(query_jumble_ignore);
1240 /* how to display this node */
1241 CoercionForm coerceformat pg_node_attr(query_jumble_ignore);
1242 ParseLoc location; /* token location, or -1 if unknown */
1243 } ArrayCoerceExpr;
1245 /* ----------------
1246 * ConvertRowtypeExpr
1248 * ConvertRowtypeExpr represents a type coercion from one composite type
1249 * to another, where the source type is guaranteed to contain all the columns
1250 * needed for the destination type plus possibly others; the columns need not
1251 * be in the same positions, but are matched up by name. This is primarily
1252 * used to convert a whole-row value of an inheritance child table into a
1253 * valid whole-row value of its parent table's rowtype. Both resulttype
1254 * and the exposed type of "arg" must be named composite types (not domains).
1255 * ----------------
1258 typedef struct ConvertRowtypeExpr
1260 Expr xpr;
1261 Expr *arg; /* input expression */
1262 Oid resulttype; /* output type (always a composite type) */
1263 /* Like RowExpr, we deliberately omit a typmod and collation here */
1264 /* how to display this node */
1265 CoercionForm convertformat pg_node_attr(query_jumble_ignore);
1266 ParseLoc location; /* token location, or -1 if unknown */
1267 } ConvertRowtypeExpr;
1269 /*----------
1270 * CollateExpr - COLLATE
1272 * The planner replaces CollateExpr with RelabelType during expression
1273 * preprocessing, so execution never sees a CollateExpr.
1274 *----------
1276 typedef struct CollateExpr
1278 Expr xpr;
1279 Expr *arg; /* input expression */
1280 Oid collOid; /* collation's OID */
1281 ParseLoc location; /* token location, or -1 if unknown */
1282 } CollateExpr;
1284 /*----------
1285 * CaseExpr - a CASE expression
1287 * We support two distinct forms of CASE expression:
1288 * CASE WHEN boolexpr THEN expr [ WHEN boolexpr THEN expr ... ]
1289 * CASE testexpr WHEN compexpr THEN expr [ WHEN compexpr THEN expr ... ]
1290 * These are distinguishable by the "arg" field being NULL in the first case
1291 * and the testexpr in the second case.
1293 * In the raw grammar output for the second form, the condition expressions
1294 * of the WHEN clauses are just the comparison values. Parse analysis
1295 * converts these to valid boolean expressions of the form
1296 * CaseTestExpr '=' compexpr
1297 * where the CaseTestExpr node is a placeholder that emits the correct
1298 * value at runtime. This structure is used so that the testexpr need be
1299 * evaluated only once. Note that after parse analysis, the condition
1300 * expressions always yield boolean.
1302 * Note: we can test whether a CaseExpr has been through parse analysis
1303 * yet by checking whether casetype is InvalidOid or not.
1304 *----------
1306 typedef struct CaseExpr
1308 Expr xpr;
1309 /* type of expression result */
1310 Oid casetype pg_node_attr(query_jumble_ignore);
1311 /* OID of collation, or InvalidOid if none */
1312 Oid casecollid pg_node_attr(query_jumble_ignore);
1313 Expr *arg; /* implicit equality comparison argument */
1314 List *args; /* the arguments (list of WHEN clauses) */
1315 Expr *defresult; /* the default result (ELSE clause) */
1316 ParseLoc location; /* token location, or -1 if unknown */
1317 } CaseExpr;
1320 * CaseWhen - one arm of a CASE expression
1322 typedef struct CaseWhen
1324 Expr xpr;
1325 Expr *expr; /* condition expression */
1326 Expr *result; /* substitution result */
1327 ParseLoc location; /* token location, or -1 if unknown */
1328 } CaseWhen;
1331 * Placeholder node for the test value to be processed by a CASE expression.
1332 * This is effectively like a Param, but can be implemented more simply
1333 * since we need only one replacement value at a time.
1335 * We also abuse this node type for some other purposes, including:
1336 * * Placeholder for the current array element value in ArrayCoerceExpr;
1337 * see build_coercion_expression().
1338 * * Nested FieldStore/SubscriptingRef assignment expressions in INSERT/UPDATE;
1339 * see transformAssignmentIndirection().
1340 * * Placeholder for intermediate results in some SQL/JSON expression nodes,
1341 * such as JsonConstructorExpr.
1343 * The uses in CaseExpr and ArrayCoerceExpr are safe only to the extent that
1344 * there is not any other CaseExpr or ArrayCoerceExpr between the value source
1345 * node and its child CaseTestExpr(s). This is true in the parse analysis
1346 * output, but the planner's function-inlining logic has to be careful not to
1347 * break it.
1349 * The nested-assignment-expression case is safe because the only node types
1350 * that can be above such CaseTestExprs are FieldStore and SubscriptingRef.
1352 typedef struct CaseTestExpr
1354 Expr xpr;
1355 Oid typeId; /* type for substituted value */
1356 /* typemod for substituted value */
1357 int32 typeMod pg_node_attr(query_jumble_ignore);
1358 /* collation for the substituted value */
1359 Oid collation pg_node_attr(query_jumble_ignore);
1360 } CaseTestExpr;
1363 * ArrayExpr - an ARRAY[] expression
1365 * Note: if multidims is false, the constituent expressions all yield the
1366 * scalar type identified by element_typeid. If multidims is true, the
1367 * constituent expressions all yield arrays of element_typeid (ie, the same
1368 * type as array_typeid); at runtime we must check for compatible subscripts.
1370 typedef struct ArrayExpr
1372 Expr xpr;
1373 /* type of expression result */
1374 Oid array_typeid pg_node_attr(query_jumble_ignore);
1375 /* OID of collation, or InvalidOid if none */
1376 Oid array_collid pg_node_attr(query_jumble_ignore);
1377 /* common type of array elements */
1378 Oid element_typeid pg_node_attr(query_jumble_ignore);
1379 /* the array elements or sub-arrays */
1380 List *elements;
1381 /* true if elements are sub-arrays */
1382 bool multidims pg_node_attr(query_jumble_ignore);
1383 /* token location, or -1 if unknown */
1384 ParseLoc location;
1385 } ArrayExpr;
1388 * RowExpr - a ROW() expression
1390 * Note: the list of fields must have a one-for-one correspondence with
1391 * physical fields of the associated rowtype, although it is okay for it
1392 * to be shorter than the rowtype. That is, the N'th list element must
1393 * match up with the N'th physical field. When the N'th physical field
1394 * is a dropped column (attisdropped) then the N'th list element can just
1395 * be a NULL constant. (This case can only occur for named composite types,
1396 * not RECORD types, since those are built from the RowExpr itself rather
1397 * than vice versa.) It is important not to assume that length(args) is
1398 * the same as the number of columns logically present in the rowtype.
1400 * colnames provides field names if the ROW() result is of type RECORD.
1401 * Names *must* be provided if row_typeid is RECORDOID; but if it is a
1402 * named composite type, colnames will be ignored in favor of using the
1403 * type's cataloged field names, so colnames should be NIL. Like the
1404 * args list, colnames is defined to be one-for-one with physical fields
1405 * of the rowtype (although dropped columns shouldn't appear in the
1406 * RECORD case, so this fine point is currently moot).
1408 typedef struct RowExpr
1410 Expr xpr;
1411 List *args; /* the fields */
1413 /* RECORDOID or a composite type's ID */
1414 Oid row_typeid pg_node_attr(query_jumble_ignore);
1417 * row_typeid cannot be a domain over composite, only plain composite. To
1418 * create a composite domain value, apply CoerceToDomain to the RowExpr.
1420 * Note: we deliberately do NOT store a typmod. Although a typmod will be
1421 * associated with specific RECORD types at runtime, it will differ for
1422 * different backends, and so cannot safely be stored in stored
1423 * parsetrees. We must assume typmod -1 for a RowExpr node.
1425 * We don't need to store a collation either. The result type is
1426 * necessarily composite, and composite types never have a collation.
1429 /* how to display this node */
1430 CoercionForm row_format pg_node_attr(query_jumble_ignore);
1432 /* list of String, or NIL */
1433 List *colnames pg_node_attr(query_jumble_ignore);
1435 ParseLoc location; /* token location, or -1 if unknown */
1436 } RowExpr;
1439 * RowCompareExpr - row-wise comparison, such as (a, b) <= (1, 2)
1441 * We support row comparison for any operator that can be determined to
1442 * act like =, <>, <, <=, >, or >= (we determine this by looking for the
1443 * operator in btree opfamilies). Note that the same operator name might
1444 * map to a different operator for each pair of row elements, since the
1445 * element datatypes can vary.
1447 * A RowCompareExpr node is only generated for the < <= > >= cases;
1448 * the = and <> cases are translated to simple AND or OR combinations
1449 * of the pairwise comparisons. However, we include = and <> in the
1450 * RowCompareType enum for the convenience of parser logic.
1452 typedef enum RowCompareType
1454 /* Values of this enum are chosen to match btree strategy numbers */
1455 ROWCOMPARE_LT = 1, /* BTLessStrategyNumber */
1456 ROWCOMPARE_LE = 2, /* BTLessEqualStrategyNumber */
1457 ROWCOMPARE_EQ = 3, /* BTEqualStrategyNumber */
1458 ROWCOMPARE_GE = 4, /* BTGreaterEqualStrategyNumber */
1459 ROWCOMPARE_GT = 5, /* BTGreaterStrategyNumber */
1460 ROWCOMPARE_NE = 6, /* no such btree strategy */
1461 } RowCompareType;
1463 typedef struct RowCompareExpr
1465 Expr xpr;
1467 /* LT LE GE or GT, never EQ or NE */
1468 RowCompareType rctype;
1469 /* OID list of pairwise comparison ops */
1470 List *opnos pg_node_attr(query_jumble_ignore);
1471 /* OID list of containing operator families */
1472 List *opfamilies pg_node_attr(query_jumble_ignore);
1473 /* OID list of collations for comparisons */
1474 List *inputcollids pg_node_attr(query_jumble_ignore);
1475 /* the left-hand input arguments */
1476 List *largs;
1477 /* the right-hand input arguments */
1478 List *rargs;
1479 } RowCompareExpr;
1482 * CoalesceExpr - a COALESCE expression
1484 typedef struct CoalesceExpr
1486 Expr xpr;
1487 /* type of expression result */
1488 Oid coalescetype pg_node_attr(query_jumble_ignore);
1489 /* OID of collation, or InvalidOid if none */
1490 Oid coalescecollid pg_node_attr(query_jumble_ignore);
1491 /* the arguments */
1492 List *args;
1493 /* token location, or -1 if unknown */
1494 ParseLoc location;
1495 } CoalesceExpr;
1498 * MinMaxExpr - a GREATEST or LEAST function
1500 typedef enum MinMaxOp
1502 IS_GREATEST,
1503 IS_LEAST
1504 } MinMaxOp;
1506 typedef struct MinMaxExpr
1508 Expr xpr;
1509 /* common type of arguments and result */
1510 Oid minmaxtype pg_node_attr(query_jumble_ignore);
1511 /* OID of collation of result */
1512 Oid minmaxcollid pg_node_attr(query_jumble_ignore);
1513 /* OID of collation that function should use */
1514 Oid inputcollid pg_node_attr(query_jumble_ignore);
1515 /* function to execute */
1516 MinMaxOp op;
1517 /* the arguments */
1518 List *args;
1519 /* token location, or -1 if unknown */
1520 ParseLoc location;
1521 } MinMaxExpr;
1524 * SQLValueFunction - parameterless functions with special grammar productions
1526 * The SQL standard categorizes some of these as <datetime value function>
1527 * and others as <general value specification>. We call 'em SQLValueFunctions
1528 * for lack of a better term. We store type and typmod of the result so that
1529 * some code doesn't need to know each function individually, and because
1530 * we would need to store typmod anyway for some of the datetime functions.
1531 * Note that currently, all variants return non-collating datatypes, so we do
1532 * not need a collation field; also, all these functions are stable.
1534 typedef enum SQLValueFunctionOp
1536 SVFOP_CURRENT_DATE,
1537 SVFOP_CURRENT_TIME,
1538 SVFOP_CURRENT_TIME_N,
1539 SVFOP_CURRENT_TIMESTAMP,
1540 SVFOP_CURRENT_TIMESTAMP_N,
1541 SVFOP_LOCALTIME,
1542 SVFOP_LOCALTIME_N,
1543 SVFOP_LOCALTIMESTAMP,
1544 SVFOP_LOCALTIMESTAMP_N,
1545 SVFOP_CURRENT_ROLE,
1546 SVFOP_CURRENT_USER,
1547 SVFOP_USER,
1548 SVFOP_SESSION_USER,
1549 SVFOP_CURRENT_CATALOG,
1550 SVFOP_CURRENT_SCHEMA,
1551 } SQLValueFunctionOp;
1553 typedef struct SQLValueFunction
1555 Expr xpr;
1556 SQLValueFunctionOp op; /* which function this is */
1559 * Result type/typmod. Type is fully determined by "op", so no need to
1560 * include this Oid in the query jumbling.
1562 Oid type pg_node_attr(query_jumble_ignore);
1563 int32 typmod;
1564 ParseLoc location; /* token location, or -1 if unknown */
1565 } SQLValueFunction;
1568 * XmlExpr - various SQL/XML functions requiring special grammar productions
1570 * 'name' carries the "NAME foo" argument (already XML-escaped).
1571 * 'named_args' and 'arg_names' represent an xml_attribute list.
1572 * 'args' carries all other arguments.
1574 * Note: result type/typmod/collation are not stored, but can be deduced
1575 * from the XmlExprOp. The type/typmod fields are just used for display
1576 * purposes, and are NOT necessarily the true result type of the node.
1578 typedef enum XmlExprOp
1580 IS_XMLCONCAT, /* XMLCONCAT(args) */
1581 IS_XMLELEMENT, /* XMLELEMENT(name, xml_attributes, args) */
1582 IS_XMLFOREST, /* XMLFOREST(xml_attributes) */
1583 IS_XMLPARSE, /* XMLPARSE(text, is_doc, preserve_ws) */
1584 IS_XMLPI, /* XMLPI(name [, args]) */
1585 IS_XMLROOT, /* XMLROOT(xml, version, standalone) */
1586 IS_XMLSERIALIZE, /* XMLSERIALIZE(is_document, xmlval, indent) */
1587 IS_DOCUMENT, /* xmlval IS DOCUMENT */
1588 } XmlExprOp;
1590 typedef enum XmlOptionType
1592 XMLOPTION_DOCUMENT,
1593 XMLOPTION_CONTENT,
1594 } XmlOptionType;
1596 typedef struct XmlExpr
1598 Expr xpr;
1599 /* xml function ID */
1600 XmlExprOp op;
1601 /* name in xml(NAME foo ...) syntaxes */
1602 char *name pg_node_attr(query_jumble_ignore);
1603 /* non-XML expressions for xml_attributes */
1604 List *named_args;
1605 /* parallel list of String values */
1606 List *arg_names pg_node_attr(query_jumble_ignore);
1607 /* list of expressions */
1608 List *args;
1609 /* DOCUMENT or CONTENT */
1610 XmlOptionType xmloption pg_node_attr(query_jumble_ignore);
1611 /* INDENT option for XMLSERIALIZE */
1612 bool indent;
1613 /* target type/typmod for XMLSERIALIZE */
1614 Oid type pg_node_attr(query_jumble_ignore);
1615 int32 typmod pg_node_attr(query_jumble_ignore);
1616 /* token location, or -1 if unknown */
1617 ParseLoc location;
1618 } XmlExpr;
1621 * JsonEncoding -
1622 * representation of JSON ENCODING clause
1624 typedef enum JsonEncoding
1626 JS_ENC_DEFAULT, /* unspecified */
1627 JS_ENC_UTF8,
1628 JS_ENC_UTF16,
1629 JS_ENC_UTF32,
1630 } JsonEncoding;
1633 * JsonFormatType -
1634 * enumeration of JSON formats used in JSON FORMAT clause
1636 typedef enum JsonFormatType
1638 JS_FORMAT_DEFAULT, /* unspecified */
1639 JS_FORMAT_JSON, /* FORMAT JSON [ENCODING ...] */
1640 JS_FORMAT_JSONB, /* implicit internal format for RETURNING
1641 * jsonb */
1642 } JsonFormatType;
1645 * JsonFormat -
1646 * representation of JSON FORMAT clause
1648 typedef struct JsonFormat
1650 NodeTag type;
1651 JsonFormatType format_type; /* format type */
1652 JsonEncoding encoding; /* JSON encoding */
1653 ParseLoc location; /* token location, or -1 if unknown */
1654 } JsonFormat;
1657 * JsonReturning -
1658 * transformed representation of JSON RETURNING clause
1660 typedef struct JsonReturning
1662 NodeTag type;
1663 JsonFormat *format; /* output JSON format */
1664 Oid typid; /* target type Oid */
1665 int32 typmod; /* target type modifier */
1666 } JsonReturning;
1669 * JsonValueExpr -
1670 * representation of JSON value expression (expr [FORMAT JsonFormat])
1672 * The actual value is obtained by evaluating formatted_expr. raw_expr is
1673 * only there for displaying the original user-written expression and is not
1674 * evaluated by ExecInterpExpr() and eval_const_expressions_mutator().
1676 typedef struct JsonValueExpr
1678 NodeTag type;
1679 Expr *raw_expr; /* raw expression */
1680 Expr *formatted_expr; /* formatted expression */
1681 JsonFormat *format; /* FORMAT clause, if specified */
1682 } JsonValueExpr;
1684 typedef enum JsonConstructorType
1686 JSCTOR_JSON_OBJECT = 1,
1687 JSCTOR_JSON_ARRAY = 2,
1688 JSCTOR_JSON_OBJECTAGG = 3,
1689 JSCTOR_JSON_ARRAYAGG = 4,
1690 JSCTOR_JSON_PARSE = 5,
1691 JSCTOR_JSON_SCALAR = 6,
1692 JSCTOR_JSON_SERIALIZE = 7,
1693 } JsonConstructorType;
1696 * JsonConstructorExpr -
1697 * wrapper over FuncExpr/Aggref/WindowFunc for SQL/JSON constructors
1699 typedef struct JsonConstructorExpr
1701 Expr xpr;
1702 JsonConstructorType type; /* constructor type */
1703 List *args;
1704 Expr *func; /* underlying json[b]_xxx() function call */
1705 Expr *coercion; /* coercion to RETURNING type */
1706 JsonReturning *returning; /* RETURNING clause */
1707 bool absent_on_null; /* ABSENT ON NULL? */
1708 bool unique; /* WITH UNIQUE KEYS? (JSON_OBJECT[AGG] only) */
1709 ParseLoc location;
1710 } JsonConstructorExpr;
1713 * JsonValueType -
1714 * representation of JSON item type in IS JSON predicate
1716 typedef enum JsonValueType
1718 JS_TYPE_ANY, /* IS JSON [VALUE] */
1719 JS_TYPE_OBJECT, /* IS JSON OBJECT */
1720 JS_TYPE_ARRAY, /* IS JSON ARRAY */
1721 JS_TYPE_SCALAR, /* IS JSON SCALAR */
1722 } JsonValueType;
1725 * JsonIsPredicate -
1726 * representation of IS JSON predicate
1728 typedef struct JsonIsPredicate
1730 NodeTag type;
1731 Node *expr; /* subject expression */
1732 JsonFormat *format; /* FORMAT clause, if specified */
1733 JsonValueType item_type; /* JSON item type */
1734 bool unique_keys; /* check key uniqueness? */
1735 ParseLoc location; /* token location, or -1 if unknown */
1736 } JsonIsPredicate;
1738 /* Nodes used in SQL/JSON query functions */
1741 * JsonWrapper -
1742 * representation of WRAPPER clause for JSON_QUERY()
1744 typedef enum JsonWrapper
1746 JSW_UNSPEC,
1747 JSW_NONE,
1748 JSW_CONDITIONAL,
1749 JSW_UNCONDITIONAL,
1750 } JsonWrapper;
1753 * JsonBehaviorType -
1754 * enumeration of behavior types used in SQL/JSON ON ERROR/EMPTY clauses
1756 * If enum members are reordered, get_json_behavior() from ruleutils.c
1757 * must be updated accordingly.
1759 typedef enum JsonBehaviorType
1761 JSON_BEHAVIOR_NULL = 0,
1762 JSON_BEHAVIOR_ERROR,
1763 JSON_BEHAVIOR_EMPTY,
1764 JSON_BEHAVIOR_TRUE,
1765 JSON_BEHAVIOR_FALSE,
1766 JSON_BEHAVIOR_UNKNOWN,
1767 JSON_BEHAVIOR_EMPTY_ARRAY,
1768 JSON_BEHAVIOR_EMPTY_OBJECT,
1769 JSON_BEHAVIOR_DEFAULT,
1770 } JsonBehaviorType;
1773 * JsonBehavior
1774 * Specifications for ON ERROR / ON EMPTY behaviors of SQL/JSON
1775 * query functions specified by a JsonExpr
1777 * 'expr' is the expression to emit when a given behavior (EMPTY or ERROR)
1778 * occurs on evaluating the SQL/JSON query function. 'coerce' is set to true
1779 * if 'expr' isn't already of the expected target type given by
1780 * JsonExpr.returning.
1782 typedef struct JsonBehavior
1784 NodeTag type;
1786 JsonBehaviorType btype;
1787 Node *expr;
1788 bool coerce;
1789 ParseLoc location; /* token location, or -1 if unknown */
1790 } JsonBehavior;
1793 * JsonExprOp -
1794 * enumeration of SQL/JSON query function types
1796 typedef enum JsonExprOp
1798 JSON_EXISTS_OP, /* JSON_EXISTS() */
1799 JSON_QUERY_OP, /* JSON_QUERY() */
1800 JSON_VALUE_OP, /* JSON_VALUE() */
1801 JSON_TABLE_OP, /* JSON_TABLE() */
1802 } JsonExprOp;
1805 * JsonExpr -
1806 * Transformed representation of JSON_VALUE(), JSON_QUERY(), and
1807 * JSON_EXISTS()
1809 typedef struct JsonExpr
1811 Expr xpr;
1813 JsonExprOp op;
1815 char *column_name; /* JSON_TABLE() column name or NULL if this is
1816 * not for a JSON_TABLE() */
1818 /* jsonb-valued expression to query */
1819 Node *formatted_expr;
1821 /* Format of the above expression needed by ruleutils.c */
1822 JsonFormat *format;
1824 /* jsonpath-valued expression containing the query pattern */
1825 Node *path_spec;
1827 /* Expected type/format of the output. */
1828 JsonReturning *returning;
1830 /* Information about the PASSING argument expressions */
1831 List *passing_names;
1832 List *passing_values;
1834 /* User-specified or default ON EMPTY and ON ERROR behaviors */
1835 JsonBehavior *on_empty;
1836 JsonBehavior *on_error;
1839 * Information about converting the result of jsonpath functions
1840 * JsonPathQuery() and JsonPathValue() to the RETURNING type.
1842 bool use_io_coercion;
1843 bool use_json_coercion;
1845 /* WRAPPER specification for JSON_QUERY */
1846 JsonWrapper wrapper;
1848 /* KEEP or OMIT QUOTES for singleton scalars returned by JSON_QUERY() */
1849 bool omit_quotes;
1851 /* JsonExpr's collation. */
1852 Oid collation;
1854 /* Original JsonFuncExpr's location */
1855 ParseLoc location;
1856 } JsonExpr;
1859 * JsonTablePath
1860 * A JSON path expression to be computed as part of evaluating
1861 * a JSON_TABLE plan node
1863 typedef struct JsonTablePath
1865 NodeTag type;
1867 Const *value;
1868 char *name;
1869 } JsonTablePath;
1872 * JsonTablePlan -
1873 * Abstract class to represent different types of JSON_TABLE "plans".
1874 * A plan is used to generate a "row pattern" value by evaluating a JSON
1875 * path expression against an input JSON document, which is then used for
1876 * populating JSON_TABLE() columns
1878 typedef struct JsonTablePlan
1880 pg_node_attr(abstract)
1882 NodeTag type;
1883 } JsonTablePlan;
1886 * JSON_TABLE plan to evaluate a JSON path expression and NESTED paths, if
1887 * any.
1889 typedef struct JsonTablePathScan
1891 JsonTablePlan plan;
1893 /* JSON path to evaluate */
1894 JsonTablePath *path;
1897 * ERROR/EMPTY ON ERROR behavior; only significant in the plan for the
1898 * top-level path.
1900 bool errorOnError;
1902 /* Plan(s) for nested columns, if any. */
1903 JsonTablePlan *child;
1906 * 0-based index in TableFunc.colvalexprs of the 1st and the last column
1907 * covered by this plan. Both are -1 if all columns are nested and thus
1908 * computed by the child plan(s).
1910 int colMin;
1911 int colMax;
1912 } JsonTablePathScan;
1915 * JsonTableSiblingJoin -
1916 * Plan to join rows of sibling NESTED COLUMNS clauses in the same parent
1917 * COLUMNS clause
1919 typedef struct JsonTableSiblingJoin
1921 JsonTablePlan plan;
1923 JsonTablePlan *lplan;
1924 JsonTablePlan *rplan;
1925 } JsonTableSiblingJoin;
1927 /* ----------------
1928 * NullTest
1930 * NullTest represents the operation of testing a value for NULLness.
1931 * The appropriate test is performed and returned as a boolean Datum.
1933 * When argisrow is false, this simply represents a test for the null value.
1935 * When argisrow is true, the input expression must yield a rowtype, and
1936 * the node implements "row IS [NOT] NULL" per the SQL standard. This
1937 * includes checking individual fields for NULLness when the row datum
1938 * itself isn't NULL.
1940 * NOTE: the combination of a rowtype input and argisrow==false does NOT
1941 * correspond to the SQL notation "row IS [NOT] NULL"; instead, this case
1942 * represents the SQL notation "row IS [NOT] DISTINCT FROM NULL".
1943 * ----------------
1946 typedef enum NullTestType
1948 IS_NULL, IS_NOT_NULL
1949 } NullTestType;
1951 typedef struct NullTest
1953 Expr xpr;
1954 Expr *arg; /* input expression */
1955 NullTestType nulltesttype; /* IS NULL, IS NOT NULL */
1956 /* T to perform field-by-field null checks */
1957 bool argisrow pg_node_attr(query_jumble_ignore);
1958 ParseLoc location; /* token location, or -1 if unknown */
1959 } NullTest;
1962 * BooleanTest
1964 * BooleanTest represents the operation of determining whether a boolean
1965 * is TRUE, FALSE, or UNKNOWN (ie, NULL). All six meaningful combinations
1966 * are supported. Note that a NULL input does *not* cause a NULL result.
1967 * The appropriate test is performed and returned as a boolean Datum.
1970 typedef enum BoolTestType
1972 IS_TRUE, IS_NOT_TRUE, IS_FALSE, IS_NOT_FALSE, IS_UNKNOWN, IS_NOT_UNKNOWN
1973 } BoolTestType;
1975 typedef struct BooleanTest
1977 Expr xpr;
1978 Expr *arg; /* input expression */
1979 BoolTestType booltesttype; /* test type */
1980 ParseLoc location; /* token location, or -1 if unknown */
1981 } BooleanTest;
1985 * MergeAction
1987 * Transformed representation of a WHEN clause in a MERGE statement
1990 typedef enum MergeMatchKind
1992 MERGE_WHEN_MATCHED,
1993 MERGE_WHEN_NOT_MATCHED_BY_SOURCE,
1994 MERGE_WHEN_NOT_MATCHED_BY_TARGET
1995 } MergeMatchKind;
1997 #define NUM_MERGE_MATCH_KINDS (MERGE_WHEN_NOT_MATCHED_BY_TARGET + 1)
1999 typedef struct MergeAction
2001 NodeTag type;
2002 MergeMatchKind matchKind; /* MATCHED/NOT MATCHED BY SOURCE/TARGET */
2003 CmdType commandType; /* INSERT/UPDATE/DELETE/DO NOTHING */
2004 /* OVERRIDING clause */
2005 OverridingKind override pg_node_attr(query_jumble_ignore);
2006 Node *qual; /* transformed WHEN conditions */
2007 List *targetList; /* the target list (of TargetEntry) */
2008 /* target attribute numbers of an UPDATE */
2009 List *updateColnos pg_node_attr(query_jumble_ignore);
2010 } MergeAction;
2013 * CoerceToDomain
2015 * CoerceToDomain represents the operation of coercing a value to a domain
2016 * type. At runtime (and not before) the precise set of constraints to be
2017 * checked will be determined. If the value passes, it is returned as the
2018 * result; if not, an error is raised. Note that this is equivalent to
2019 * RelabelType in the scenario where no constraints are applied.
2021 typedef struct CoerceToDomain
2023 Expr xpr;
2024 Expr *arg; /* input expression */
2025 Oid resulttype; /* domain type ID (result type) */
2026 /* output typmod (currently always -1) */
2027 int32 resulttypmod pg_node_attr(query_jumble_ignore);
2028 /* OID of collation, or InvalidOid if none */
2029 Oid resultcollid pg_node_attr(query_jumble_ignore);
2030 /* how to display this node */
2031 CoercionForm coercionformat pg_node_attr(query_jumble_ignore);
2032 ParseLoc location; /* token location, or -1 if unknown */
2033 } CoerceToDomain;
2036 * Placeholder node for the value to be processed by a domain's check
2037 * constraint. This is effectively like a Param, but can be implemented more
2038 * simply since we need only one replacement value at a time.
2040 * Note: the typeId/typeMod/collation will be set from the domain's base type,
2041 * not the domain itself. This is because we shouldn't consider the value
2042 * to be a member of the domain if we haven't yet checked its constraints.
2044 typedef struct CoerceToDomainValue
2046 Expr xpr;
2047 /* type for substituted value */
2048 Oid typeId;
2049 /* typemod for substituted value */
2050 int32 typeMod pg_node_attr(query_jumble_ignore);
2051 /* collation for the substituted value */
2052 Oid collation pg_node_attr(query_jumble_ignore);
2053 /* token location, or -1 if unknown */
2054 ParseLoc location;
2055 } CoerceToDomainValue;
2058 * Placeholder node for a DEFAULT marker in an INSERT or UPDATE command.
2060 * This is not an executable expression: it must be replaced by the actual
2061 * column default expression during rewriting. But it is convenient to
2062 * treat it as an expression node during parsing and rewriting.
2064 typedef struct SetToDefault
2066 Expr xpr;
2067 /* type for substituted value */
2068 Oid typeId;
2069 /* typemod for substituted value */
2070 int32 typeMod pg_node_attr(query_jumble_ignore);
2071 /* collation for the substituted value */
2072 Oid collation pg_node_attr(query_jumble_ignore);
2073 /* token location, or -1 if unknown */
2074 ParseLoc location;
2075 } SetToDefault;
2078 * Node representing [WHERE] CURRENT OF cursor_name
2080 * CURRENT OF is a bit like a Var, in that it carries the rangetable index
2081 * of the target relation being constrained; this aids placing the expression
2082 * correctly during planning. We can assume however that its "levelsup" is
2083 * always zero, due to the syntactic constraints on where it can appear.
2084 * Also, cvarno will always be a true RT index, never INNER_VAR etc.
2086 * The referenced cursor can be represented either as a hardwired string
2087 * or as a reference to a run-time parameter of type REFCURSOR. The latter
2088 * case is for the convenience of plpgsql.
2090 typedef struct CurrentOfExpr
2092 Expr xpr;
2093 Index cvarno; /* RT index of target relation */
2094 char *cursor_name; /* name of referenced cursor, or NULL */
2095 int cursor_param; /* refcursor parameter number, or 0 */
2096 } CurrentOfExpr;
2099 * NextValueExpr - get next value from sequence
2101 * This has the same effect as calling the nextval() function, but it does not
2102 * check permissions on the sequence. This is used for identity columns,
2103 * where the sequence is an implicit dependency without its own permissions.
2105 typedef struct NextValueExpr
2107 Expr xpr;
2108 Oid seqid;
2109 Oid typeId;
2110 } NextValueExpr;
2113 * InferenceElem - an element of a unique index inference specification
2115 * This mostly matches the structure of IndexElems, but having a dedicated
2116 * primnode allows for a clean separation between the use of index parameters
2117 * by utility commands, and this node.
2119 typedef struct InferenceElem
2121 Expr xpr;
2122 Node *expr; /* expression to infer from, or NULL */
2123 Oid infercollid; /* OID of collation, or InvalidOid */
2124 Oid inferopclass; /* OID of att opclass, or InvalidOid */
2125 } InferenceElem;
2127 /*--------------------
2128 * TargetEntry -
2129 * a target entry (used in query target lists)
2131 * Strictly speaking, a TargetEntry isn't an expression node (since it can't
2132 * be evaluated by ExecEvalExpr). But we treat it as one anyway, since in
2133 * very many places it's convenient to process a whole query targetlist as a
2134 * single expression tree.
2136 * In a SELECT's targetlist, resno should always be equal to the item's
2137 * ordinal position (counting from 1). However, in an INSERT or UPDATE
2138 * targetlist, resno represents the attribute number of the destination
2139 * column for the item; so there may be missing or out-of-order resnos.
2140 * It is even legal to have duplicated resnos; consider
2141 * UPDATE table SET arraycol[1] = ..., arraycol[2] = ..., ...
2142 * In an INSERT, the rewriter and planner will normalize the tlist by
2143 * reordering it into physical column order and filling in default values
2144 * for any columns not assigned values by the original query. In an UPDATE,
2145 * after the rewriter merges multiple assignments for the same column, the
2146 * planner extracts the target-column numbers into a separate "update_colnos"
2147 * list, and then renumbers the tlist elements serially. Thus, tlist resnos
2148 * match ordinal position in all tlists seen by the executor; but it is wrong
2149 * to assume that before planning has happened.
2151 * resname is required to represent the correct column name in non-resjunk
2152 * entries of top-level SELECT targetlists, since it will be used as the
2153 * column title sent to the frontend. In most other contexts it is only
2154 * a debugging aid, and may be wrong or even NULL. (In particular, it may
2155 * be wrong in a tlist from a stored rule, if the referenced column has been
2156 * renamed by ALTER TABLE since the rule was made. Also, the planner tends
2157 * to store NULL rather than look up a valid name for tlist entries in
2158 * non-toplevel plan nodes.) In resjunk entries, resname should be either
2159 * a specific system-generated name (such as "ctid") or NULL; anything else
2160 * risks confusing ExecGetJunkAttribute!
2162 * ressortgroupref is used in the representation of ORDER BY, GROUP BY, and
2163 * DISTINCT items. Targetlist entries with ressortgroupref=0 are not
2164 * sort/group items. If ressortgroupref>0, then this item is an ORDER BY,
2165 * GROUP BY, and/or DISTINCT target value. No two entries in a targetlist
2166 * may have the same nonzero ressortgroupref --- but there is no particular
2167 * meaning to the nonzero values, except as tags. (For example, one must
2168 * not assume that lower ressortgroupref means a more significant sort key.)
2169 * The order of the associated SortGroupClause lists determine the semantics.
2171 * resorigtbl/resorigcol identify the source of the column, if it is a
2172 * simple reference to a column of a base table (or view). If it is not
2173 * a simple reference, these fields are zeroes.
2175 * If resjunk is true then the column is a working column (such as a sort key)
2176 * that should be removed from the final output of the query. Resjunk columns
2177 * must have resnos that cannot duplicate any regular column's resno. Also
2178 * note that there are places that assume resjunk columns come after non-junk
2179 * columns.
2180 *--------------------
2182 typedef struct TargetEntry
2184 Expr xpr;
2185 /* expression to evaluate */
2186 Expr *expr;
2187 /* attribute number (see notes above) */
2188 AttrNumber resno;
2189 /* name of the column (could be NULL) */
2190 char *resname pg_node_attr(query_jumble_ignore);
2191 /* nonzero if referenced by a sort/group clause */
2192 Index ressortgroupref;
2193 /* OID of column's source table */
2194 Oid resorigtbl pg_node_attr(query_jumble_ignore);
2195 /* column's number in source table */
2196 AttrNumber resorigcol pg_node_attr(query_jumble_ignore);
2197 /* set to true to eliminate the attribute from final target list */
2198 bool resjunk pg_node_attr(query_jumble_ignore);
2199 } TargetEntry;
2202 /* ----------------------------------------------------------------
2203 * node types for join trees
2205 * The leaves of a join tree structure are RangeTblRef nodes. Above
2206 * these, JoinExpr nodes can appear to denote a specific kind of join
2207 * or qualified join. Also, FromExpr nodes can appear to denote an
2208 * ordinary cross-product join ("FROM foo, bar, baz WHERE ...").
2209 * FromExpr is like a JoinExpr of jointype JOIN_INNER, except that it
2210 * may have any number of child nodes, not just two.
2212 * NOTE: the top level of a Query's jointree is always a FromExpr.
2213 * Even if the jointree contains no rels, there will be a FromExpr.
2215 * NOTE: the qualification expressions present in JoinExpr nodes are
2216 * *in addition to* the query's main WHERE clause, which appears as the
2217 * qual of the top-level FromExpr. The reason for associating quals with
2218 * specific nodes in the jointree is that the position of a qual is critical
2219 * when outer joins are present. (If we enforce a qual too soon or too late,
2220 * that may cause the outer join to produce the wrong set of NULL-extended
2221 * rows.) If all joins are inner joins then all the qual positions are
2222 * semantically interchangeable.
2224 * NOTE: in the raw output of gram.y, a join tree contains RangeVar,
2225 * RangeSubselect, and RangeFunction nodes, which are all replaced by
2226 * RangeTblRef nodes during the parse analysis phase. Also, the top-level
2227 * FromExpr is added during parse analysis; the grammar regards FROM and
2228 * WHERE as separate.
2229 * ----------------------------------------------------------------
2233 * RangeTblRef - reference to an entry in the query's rangetable
2235 * We could use direct pointers to the RT entries and skip having these
2236 * nodes, but multiple pointers to the same node in a querytree cause
2237 * lots of headaches, so it seems better to store an index into the RT.
2239 typedef struct RangeTblRef
2241 NodeTag type;
2242 int rtindex;
2243 } RangeTblRef;
2245 /*----------
2246 * JoinExpr - for SQL JOIN expressions
2248 * isNatural, usingClause, and quals are interdependent. The user can write
2249 * only one of NATURAL, USING(), or ON() (this is enforced by the grammar).
2250 * If he writes NATURAL then parse analysis generates the equivalent USING()
2251 * list, and from that fills in "quals" with the right equality comparisons.
2252 * If he writes USING() then "quals" is filled with equality comparisons.
2253 * If he writes ON() then only "quals" is set. Note that NATURAL/USING
2254 * are not equivalent to ON() since they also affect the output column list.
2256 * alias is an Alias node representing the AS alias-clause attached to the
2257 * join expression, or NULL if no clause. NB: presence or absence of the
2258 * alias has a critical impact on semantics, because a join with an alias
2259 * restricts visibility of the tables/columns inside it.
2261 * join_using_alias is an Alias node representing the join correlation
2262 * name that SQL:2016 and later allow to be attached to JOIN/USING.
2263 * Its column alias list includes only the common column names from USING,
2264 * and it does not restrict visibility of the join's input tables.
2266 * During parse analysis, an RTE is created for the Join, and its index
2267 * is filled into rtindex. This RTE is present mainly so that Vars can
2268 * be created that refer to the outputs of the join. The planner sometimes
2269 * generates JoinExprs internally; these can have rtindex = 0 if there are
2270 * no join alias variables referencing such joins.
2271 *----------
2273 typedef struct JoinExpr
2275 NodeTag type;
2276 JoinType jointype; /* type of join */
2277 bool isNatural; /* Natural join? Will need to shape table */
2278 Node *larg; /* left subtree */
2279 Node *rarg; /* right subtree */
2280 /* USING clause, if any (list of String) */
2281 List *usingClause pg_node_attr(query_jumble_ignore);
2282 /* alias attached to USING clause, if any */
2283 Alias *join_using_alias pg_node_attr(query_jumble_ignore);
2284 /* qualifiers on join, if any */
2285 Node *quals;
2286 /* user-written alias clause, if any */
2287 Alias *alias pg_node_attr(query_jumble_ignore);
2288 /* RT index assigned for join, or 0 */
2289 int rtindex;
2290 } JoinExpr;
2292 /*----------
2293 * FromExpr - represents a FROM ... WHERE ... construct
2295 * This is both more flexible than a JoinExpr (it can have any number of
2296 * children, including zero) and less so --- we don't need to deal with
2297 * aliases and so on. The output column set is implicitly just the union
2298 * of the outputs of the children.
2299 *----------
2301 typedef struct FromExpr
2303 NodeTag type;
2304 List *fromlist; /* List of join subtrees */
2305 Node *quals; /* qualifiers on join, if any */
2306 } FromExpr;
2308 /*----------
2309 * OnConflictExpr - represents an ON CONFLICT DO ... expression
2311 * The optimizer requires a list of inference elements, and optionally a WHERE
2312 * clause to infer a unique index. The unique index (or, occasionally,
2313 * indexes) inferred are used to arbitrate whether or not the alternative ON
2314 * CONFLICT path is taken.
2315 *----------
2317 typedef struct OnConflictExpr
2319 NodeTag type;
2320 OnConflictAction action; /* DO NOTHING or UPDATE? */
2322 /* Arbiter */
2323 List *arbiterElems; /* unique index arbiter list (of
2324 * InferenceElem's) */
2325 Node *arbiterWhere; /* unique index arbiter WHERE clause */
2326 Oid constraint; /* pg_constraint OID for arbiter */
2328 /* ON CONFLICT UPDATE */
2329 List *onConflictSet; /* List of ON CONFLICT SET TargetEntrys */
2330 Node *onConflictWhere; /* qualifiers to restrict UPDATE to */
2331 int exclRelIndex; /* RT index of 'excluded' relation */
2332 List *exclRelTlist; /* tlist of the EXCLUDED pseudo relation */
2333 } OnConflictExpr;
2335 #endif /* PRIMNODES_H */