]> granicus.if.org Git - postgresql/blob - src/include/nodes/parsenodes.h
Fix misc typos, mostly in comments.
[postgresql] / src / include / nodes / parsenodes.h
1 /*-------------------------------------------------------------------------
2  *
3  * parsenodes.h
4  *        definitions for parse tree nodes
5  *
6  * Many of the node types used in parsetrees include a "location" field.
7  * This is a byte (not character) offset in the original source text, to be
8  * used for positioning an error cursor when there is an error related to
9  * the node.  Access to the original source text is needed to make use of
10  * the location.  At the topmost (statement) level, we also provide a
11  * statement length, likewise measured in bytes, for convenience in
12  * identifying statement boundaries in multi-statement source strings.
13  *
14  *
15  * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
16  * Portions Copyright (c) 1994, Regents of the University of California
17  *
18  * src/include/nodes/parsenodes.h
19  *
20  *-------------------------------------------------------------------------
21  */
22 #ifndef PARSENODES_H
23 #define PARSENODES_H
24
25 #include "nodes/bitmapset.h"
26 #include "nodes/lockoptions.h"
27 #include "nodes/primnodes.h"
28 #include "nodes/value.h"
29 #include "partitioning/partdefs.h"
30
31
32 typedef enum OverridingKind
33 {
34         OVERRIDING_NOT_SET = 0,
35         OVERRIDING_USER_VALUE,
36         OVERRIDING_SYSTEM_VALUE
37 } OverridingKind;
38
39 /* Possible sources of a Query */
40 typedef enum QuerySource
41 {
42         QSRC_ORIGINAL,                          /* original parsetree (explicit query) */
43         QSRC_PARSER,                            /* added by parse analysis (now unused) */
44         QSRC_INSTEAD_RULE,                      /* added by unconditional INSTEAD rule */
45         QSRC_QUAL_INSTEAD_RULE,         /* added by conditional INSTEAD rule */
46         QSRC_NON_INSTEAD_RULE           /* added by non-INSTEAD rule */
47 } QuerySource;
48
49 /* Sort ordering options for ORDER BY and CREATE INDEX */
50 typedef enum SortByDir
51 {
52         SORTBY_DEFAULT,
53         SORTBY_ASC,
54         SORTBY_DESC,
55         SORTBY_USING                            /* not allowed in CREATE INDEX ... */
56 } SortByDir;
57
58 typedef enum SortByNulls
59 {
60         SORTBY_NULLS_DEFAULT,
61         SORTBY_NULLS_FIRST,
62         SORTBY_NULLS_LAST
63 } SortByNulls;
64
65 /*
66  * Grantable rights are encoded so that we can OR them together in a bitmask.
67  * The present representation of AclItem limits us to 16 distinct rights,
68  * even though AclMode is defined as uint32.  See utils/acl.h.
69  *
70  * Caution: changing these codes breaks stored ACLs, hence forces initdb.
71  */
72 typedef uint32 AclMode;                 /* a bitmask of privilege bits */
73
74 #define ACL_INSERT              (1<<0)  /* for relations */
75 #define ACL_SELECT              (1<<1)
76 #define ACL_UPDATE              (1<<2)
77 #define ACL_DELETE              (1<<3)
78 #define ACL_TRUNCATE    (1<<4)
79 #define ACL_REFERENCES  (1<<5)
80 #define ACL_TRIGGER             (1<<6)
81 #define ACL_EXECUTE             (1<<7)  /* for functions */
82 #define ACL_USAGE               (1<<8)  /* for languages, namespaces, FDWs, and
83                                                                  * servers */
84 #define ACL_CREATE              (1<<9)  /* for namespaces and databases */
85 #define ACL_CREATE_TEMP (1<<10) /* for databases */
86 #define ACL_CONNECT             (1<<11) /* for databases */
87 #define N_ACL_RIGHTS    12              /* 1 plus the last 1<<x */
88 #define ACL_NO_RIGHTS   0
89 /* Currently, SELECT ... FOR [KEY] UPDATE/SHARE requires UPDATE privileges */
90 #define ACL_SELECT_FOR_UPDATE   ACL_UPDATE
91
92
93 /*****************************************************************************
94  *      Query Tree
95  *****************************************************************************/
96
97 /*
98  * Query -
99  *        Parse analysis turns all statements into a Query tree
100  *        for further processing by the rewriter and planner.
101  *
102  *        Utility statements (i.e. non-optimizable statements) have the
103  *        utilityStmt field set, and the rest of the Query is mostly dummy.
104  *
105  *        Planning converts a Query tree into a Plan tree headed by a PlannedStmt
106  *        node --- the Query structure is not used by the executor.
107  */
108 typedef struct Query
109 {
110         NodeTag         type;
111
112         CmdType         commandType;    /* select|insert|update|delete|utility */
113
114         QuerySource querySource;        /* where did I come from? */
115
116         uint64          queryId;                /* query identifier (can be set by plugins) */
117
118         bool            canSetTag;              /* do I set the command result tag? */
119
120         Node       *utilityStmt;        /* non-null if commandType == CMD_UTILITY */
121
122         int                     resultRelation; /* rtable index of target relation for
123                                                                  * INSERT/UPDATE/DELETE; 0 for SELECT */
124
125         bool            hasAggs;                /* has aggregates in tlist or havingQual */
126         bool            hasWindowFuncs; /* has window functions in tlist */
127         bool            hasTargetSRFs;  /* has set-returning functions in tlist */
128         bool            hasSubLinks;    /* has subquery SubLink */
129         bool            hasDistinctOn;  /* distinctClause is from DISTINCT ON */
130         bool            hasRecursive;   /* WITH RECURSIVE was specified */
131         bool            hasModifyingCTE;        /* has INSERT/UPDATE/DELETE in WITH */
132         bool            hasForUpdate;   /* FOR [KEY] UPDATE/SHARE was specified */
133         bool            hasRowSecurity; /* rewriter has applied some RLS policy */
134
135         List       *cteList;            /* WITH list (of CommonTableExpr's) */
136
137         List       *rtable;                     /* list of range table entries */
138         FromExpr   *jointree;           /* table join tree (FROM and WHERE clauses) */
139
140         List       *targetList;         /* target list (of TargetEntry) */
141
142         OverridingKind override;        /* OVERRIDING clause */
143
144         OnConflictExpr *onConflict; /* ON CONFLICT DO [NOTHING | UPDATE] */
145
146         List       *returningList;      /* return-values list (of TargetEntry) */
147
148         List       *groupClause;        /* a list of SortGroupClause's */
149
150         List       *groupingSets;       /* a list of GroupingSet's if present */
151
152         Node       *havingQual;         /* qualifications applied to groups */
153
154         List       *windowClause;       /* a list of WindowClause's */
155
156         List       *distinctClause; /* a list of SortGroupClause's */
157
158         List       *sortClause;         /* a list of SortGroupClause's */
159
160         Node       *limitOffset;        /* # of result tuples to skip (int8 expr) */
161         Node       *limitCount;         /* # of result tuples to return (int8 expr) */
162
163         List       *rowMarks;           /* a list of RowMarkClause's */
164
165         Node       *setOperations;      /* set-operation tree if this is top level of
166                                                                  * a UNION/INTERSECT/EXCEPT query */
167
168         List       *constraintDeps; /* a list of pg_constraint OIDs that the query
169                                                                  * depends on to be semantically valid */
170
171         List       *withCheckOptions;   /* a list of WithCheckOption's, which are
172                                                                          * only added during rewrite and therefore
173                                                                          * are not written out as part of Query. */
174
175         /*
176          * The following two fields identify the portion of the source text string
177          * containing this query.  They are typically only populated in top-level
178          * Queries, not in sub-queries.  When not set, they might both be zero, or
179          * both be -1 meaning "unknown".
180          */
181         int                     stmt_location;  /* start location, or -1 if unknown */
182         int                     stmt_len;               /* length in bytes; 0 means "rest of string" */
183 } Query;
184
185
186 /****************************************************************************
187  *      Supporting data structures for Parse Trees
188  *
189  *      Most of these node types appear in raw parsetrees output by the grammar,
190  *      and get transformed to something else by the analyzer.  A few of them
191  *      are used as-is in transformed querytrees.
192  ****************************************************************************/
193
194 /*
195  * TypeName - specifies a type in definitions
196  *
197  * For TypeName structures generated internally, it is often easier to
198  * specify the type by OID than by name.  If "names" is NIL then the
199  * actual type OID is given by typeOid, otherwise typeOid is unused.
200  * Similarly, if "typmods" is NIL then the actual typmod is expected to
201  * be prespecified in typemod, otherwise typemod is unused.
202  *
203  * If pct_type is true, then names is actually a field name and we look up
204  * the type of that field.  Otherwise (the normal case), names is a type
205  * name possibly qualified with schema and database name.
206  */
207 typedef struct TypeName
208 {
209         NodeTag         type;
210         List       *names;                      /* qualified name (list of Value strings) */
211         Oid                     typeOid;                /* type identified by OID */
212         bool            setof;                  /* is a set? */
213         bool            pct_type;               /* %TYPE specified? */
214         List       *typmods;            /* type modifier expression(s) */
215         int32           typemod;                /* prespecified type modifier */
216         List       *arrayBounds;        /* array bounds */
217         int                     location;               /* token location, or -1 if unknown */
218 } TypeName;
219
220 /*
221  * ColumnRef - specifies a reference to a column, or possibly a whole tuple
222  *
223  * The "fields" list must be nonempty.  It can contain string Value nodes
224  * (representing names) and A_Star nodes (representing occurrence of a '*').
225  * Currently, A_Star must appear only as the last list element --- the grammar
226  * is responsible for enforcing this!
227  *
228  * Note: any array subscripting or selection of fields from composite columns
229  * is represented by an A_Indirection node above the ColumnRef.  However,
230  * for simplicity in the normal case, initial field selection from a table
231  * name is represented within ColumnRef and not by adding A_Indirection.
232  */
233 typedef struct ColumnRef
234 {
235         NodeTag         type;
236         List       *fields;                     /* field names (Value strings) or A_Star */
237         int                     location;               /* token location, or -1 if unknown */
238 } ColumnRef;
239
240 /*
241  * ParamRef - specifies a $n parameter reference
242  */
243 typedef struct ParamRef
244 {
245         NodeTag         type;
246         int                     number;                 /* the number of the parameter */
247         int                     location;               /* token location, or -1 if unknown */
248 } ParamRef;
249
250 /*
251  * A_Expr - infix, prefix, and postfix expressions
252  */
253 typedef enum A_Expr_Kind
254 {
255         AEXPR_OP,                                       /* normal operator */
256         AEXPR_OP_ANY,                           /* scalar op ANY (array) */
257         AEXPR_OP_ALL,                           /* scalar op ALL (array) */
258         AEXPR_DISTINCT,                         /* IS DISTINCT FROM - name must be "=" */
259         AEXPR_NOT_DISTINCT,                     /* IS NOT DISTINCT FROM - name must be "=" */
260         AEXPR_NULLIF,                           /* NULLIF - name must be "=" */
261         AEXPR_OF,                                       /* IS [NOT] OF - name must be "=" or "<>" */
262         AEXPR_IN,                                       /* [NOT] IN - name must be "=" or "<>" */
263         AEXPR_LIKE,                                     /* [NOT] LIKE - name must be "~~" or "!~~" */
264         AEXPR_ILIKE,                            /* [NOT] ILIKE - name must be "~~*" or "!~~*" */
265         AEXPR_SIMILAR,                          /* [NOT] SIMILAR - name must be "~" or "!~" */
266         AEXPR_BETWEEN,                          /* name must be "BETWEEN" */
267         AEXPR_NOT_BETWEEN,                      /* name must be "NOT BETWEEN" */
268         AEXPR_BETWEEN_SYM,                      /* name must be "BETWEEN SYMMETRIC" */
269         AEXPR_NOT_BETWEEN_SYM,          /* name must be "NOT BETWEEN SYMMETRIC" */
270         AEXPR_PAREN                                     /* nameless dummy node for parentheses */
271 } A_Expr_Kind;
272
273 typedef struct A_Expr
274 {
275         NodeTag         type;
276         A_Expr_Kind kind;                       /* see above */
277         List       *name;                       /* possibly-qualified name of operator */
278         Node       *lexpr;                      /* left argument, or NULL if none */
279         Node       *rexpr;                      /* right argument, or NULL if none */
280         int                     location;               /* token location, or -1 if unknown */
281 } A_Expr;
282
283 /*
284  * A_Const - a literal constant
285  */
286 typedef struct A_Const
287 {
288         NodeTag         type;
289         Value           val;                    /* value (includes type info, see value.h) */
290         int                     location;               /* token location, or -1 if unknown */
291 } A_Const;
292
293 /*
294  * TypeCast - a CAST expression
295  */
296 typedef struct TypeCast
297 {
298         NodeTag         type;
299         Node       *arg;                        /* the expression being casted */
300         TypeName   *typeName;           /* the target type */
301         int                     location;               /* token location, or -1 if unknown */
302 } TypeCast;
303
304 /*
305  * CollateClause - a COLLATE expression
306  */
307 typedef struct CollateClause
308 {
309         NodeTag         type;
310         Node       *arg;                        /* input expression */
311         List       *collname;           /* possibly-qualified collation name */
312         int                     location;               /* token location, or -1 if unknown */
313 } CollateClause;
314
315 /*
316  * RoleSpec - a role name or one of a few special values.
317  */
318 typedef enum RoleSpecType
319 {
320         ROLESPEC_CSTRING,                       /* role name is stored as a C string */
321         ROLESPEC_CURRENT_USER,          /* role spec is CURRENT_USER */
322         ROLESPEC_SESSION_USER,          /* role spec is SESSION_USER */
323         ROLESPEC_PUBLIC                         /* role name is "public" */
324 } RoleSpecType;
325
326 typedef struct RoleSpec
327 {
328         NodeTag         type;
329         RoleSpecType roletype;          /* Type of this rolespec */
330         char       *rolename;           /* filled only for ROLESPEC_CSTRING */
331         int                     location;               /* token location, or -1 if unknown */
332 } RoleSpec;
333
334 /*
335  * FuncCall - a function or aggregate invocation
336  *
337  * agg_order (if not NIL) indicates we saw 'foo(... ORDER BY ...)', or if
338  * agg_within_group is true, it was 'foo(...) WITHIN GROUP (ORDER BY ...)'.
339  * agg_star indicates we saw a 'foo(*)' construct, while agg_distinct
340  * indicates we saw 'foo(DISTINCT ...)'.  In any of these cases, the
341  * construct *must* be an aggregate call.  Otherwise, it might be either an
342  * aggregate or some other kind of function.  However, if FILTER or OVER is
343  * present it had better be an aggregate or window function.
344  *
345  * Normally, you'd initialize this via makeFuncCall() and then only change the
346  * parts of the struct its defaults don't match afterwards, as needed.
347  */
348 typedef struct FuncCall
349 {
350         NodeTag         type;
351         List       *funcname;           /* qualified name of function */
352         List       *args;                       /* the arguments (list of exprs) */
353         List       *agg_order;          /* ORDER BY (list of SortBy) */
354         Node       *agg_filter;         /* FILTER clause, if any */
355         bool            agg_within_group;       /* ORDER BY appeared in WITHIN GROUP */
356         bool            agg_star;               /* argument was really '*' */
357         bool            agg_distinct;   /* arguments were labeled DISTINCT */
358         bool            func_variadic;  /* last argument was labeled VARIADIC */
359         struct WindowDef *over;         /* OVER clause, if any */
360         int                     location;               /* token location, or -1 if unknown */
361 } FuncCall;
362
363 /*
364  * A_Star - '*' representing all columns of a table or compound field
365  *
366  * This can appear within ColumnRef.fields, A_Indirection.indirection, and
367  * ResTarget.indirection lists.
368  */
369 typedef struct A_Star
370 {
371         NodeTag         type;
372 } A_Star;
373
374 /*
375  * A_Indices - array subscript or slice bounds ([idx] or [lidx:uidx])
376  *
377  * In slice case, either or both of lidx and uidx can be NULL (omitted).
378  * In non-slice case, uidx holds the single subscript and lidx is always NULL.
379  */
380 typedef struct A_Indices
381 {
382         NodeTag         type;
383         bool            is_slice;               /* true if slice (i.e., colon present) */
384         Node       *lidx;                       /* slice lower bound, if any */
385         Node       *uidx;                       /* subscript, or slice upper bound if any */
386 } A_Indices;
387
388 /*
389  * A_Indirection - select a field and/or array element from an expression
390  *
391  * The indirection list can contain A_Indices nodes (representing
392  * subscripting), string Value nodes (representing field selection --- the
393  * string value is the name of the field to select), and A_Star nodes
394  * (representing selection of all fields of a composite type).
395  * For example, a complex selection operation like
396  *                              (foo).field1[42][7].field2
397  * would be represented with a single A_Indirection node having a 4-element
398  * indirection list.
399  *
400  * Currently, A_Star must appear only as the last list element --- the grammar
401  * is responsible for enforcing this!
402  */
403 typedef struct A_Indirection
404 {
405         NodeTag         type;
406         Node       *arg;                        /* the thing being selected from */
407         List       *indirection;        /* subscripts and/or field names and/or * */
408 } A_Indirection;
409
410 /*
411  * A_ArrayExpr - an ARRAY[] construct
412  */
413 typedef struct A_ArrayExpr
414 {
415         NodeTag         type;
416         List       *elements;           /* array element expressions */
417         int                     location;               /* token location, or -1 if unknown */
418 } A_ArrayExpr;
419
420 /*
421  * ResTarget -
422  *        result target (used in target list of pre-transformed parse trees)
423  *
424  * In a SELECT target list, 'name' is the column label from an
425  * 'AS ColumnLabel' clause, or NULL if there was none, and 'val' is the
426  * value expression itself.  The 'indirection' field is not used.
427  *
428  * INSERT uses ResTarget in its target-column-names list.  Here, 'name' is
429  * the name of the destination column, 'indirection' stores any subscripts
430  * attached to the destination, and 'val' is not used.
431  *
432  * In an UPDATE target list, 'name' is the name of the destination column,
433  * 'indirection' stores any subscripts attached to the destination, and
434  * 'val' is the expression to assign.
435  *
436  * See A_Indirection for more info about what can appear in 'indirection'.
437  */
438 typedef struct ResTarget
439 {
440         NodeTag         type;
441         char       *name;                       /* column name or NULL */
442         List       *indirection;        /* subscripts, field names, and '*', or NIL */
443         Node       *val;                        /* the value expression to compute or assign */
444         int                     location;               /* token location, or -1 if unknown */
445 } ResTarget;
446
447 /*
448  * MultiAssignRef - element of a row source expression for UPDATE
449  *
450  * In an UPDATE target list, when we have SET (a,b,c) = row-valued-expression,
451  * we generate separate ResTarget items for each of a,b,c.  Their "val" trees
452  * are MultiAssignRef nodes numbered 1..n, linking to a common copy of the
453  * row-valued-expression (which parse analysis will process only once, when
454  * handling the MultiAssignRef with colno=1).
455  */
456 typedef struct MultiAssignRef
457 {
458         NodeTag         type;
459         Node       *source;                     /* the row-valued expression */
460         int                     colno;                  /* column number for this target (1..n) */
461         int                     ncolumns;               /* number of targets in the construct */
462 } MultiAssignRef;
463
464 /*
465  * SortBy - for ORDER BY clause
466  */
467 typedef struct SortBy
468 {
469         NodeTag         type;
470         Node       *node;                       /* expression to sort on */
471         SortByDir       sortby_dir;             /* ASC/DESC/USING/default */
472         SortByNulls sortby_nulls;       /* NULLS FIRST/LAST */
473         List       *useOp;                      /* name of op to use, if SORTBY_USING */
474         int                     location;               /* operator location, or -1 if none/unknown */
475 } SortBy;
476
477 /*
478  * WindowDef - raw representation of WINDOW and OVER clauses
479  *
480  * For entries in a WINDOW list, "name" is the window name being defined.
481  * For OVER clauses, we use "name" for the "OVER window" syntax, or "refname"
482  * for the "OVER (window)" syntax, which is subtly different --- the latter
483  * implies overriding the window frame clause.
484  */
485 typedef struct WindowDef
486 {
487         NodeTag         type;
488         char       *name;                       /* window's own name */
489         char       *refname;            /* referenced window name, if any */
490         List       *partitionClause;    /* PARTITION BY expression list */
491         List       *orderClause;        /* ORDER BY (list of SortBy) */
492         int                     frameOptions;   /* frame_clause options, see below */
493         Node       *startOffset;        /* expression for starting bound, if any */
494         Node       *endOffset;          /* expression for ending bound, if any */
495         int                     location;               /* parse location, or -1 if none/unknown */
496 } WindowDef;
497
498 /*
499  * frameOptions is an OR of these bits.  The NONDEFAULT and BETWEEN bits are
500  * used so that ruleutils.c can tell which properties were specified and
501  * which were defaulted; the correct behavioral bits must be set either way.
502  * The START_foo and END_foo options must come in pairs of adjacent bits for
503  * the convenience of gram.y, even though some of them are useless/invalid.
504  */
505 #define FRAMEOPTION_NONDEFAULT                                  0x00001 /* any specified? */
506 #define FRAMEOPTION_RANGE                                               0x00002 /* RANGE behavior */
507 #define FRAMEOPTION_ROWS                                                0x00004 /* ROWS behavior */
508 #define FRAMEOPTION_GROUPS                                              0x00008 /* GROUPS behavior */
509 #define FRAMEOPTION_BETWEEN                                             0x00010 /* BETWEEN given? */
510 #define FRAMEOPTION_START_UNBOUNDED_PRECEDING   0x00020 /* start is U. P. */
511 #define FRAMEOPTION_END_UNBOUNDED_PRECEDING             0x00040 /* (disallowed) */
512 #define FRAMEOPTION_START_UNBOUNDED_FOLLOWING   0x00080 /* (disallowed) */
513 #define FRAMEOPTION_END_UNBOUNDED_FOLLOWING             0x00100 /* end is U. F. */
514 #define FRAMEOPTION_START_CURRENT_ROW                   0x00200 /* start is C. R. */
515 #define FRAMEOPTION_END_CURRENT_ROW                             0x00400 /* end is C. R. */
516 #define FRAMEOPTION_START_OFFSET_PRECEDING              0x00800 /* start is O. P. */
517 #define FRAMEOPTION_END_OFFSET_PRECEDING                0x01000 /* end is O. P. */
518 #define FRAMEOPTION_START_OFFSET_FOLLOWING              0x02000 /* start is O. F. */
519 #define FRAMEOPTION_END_OFFSET_FOLLOWING                0x04000 /* end is O. F. */
520 #define FRAMEOPTION_EXCLUDE_CURRENT_ROW                 0x08000 /* omit C.R. */
521 #define FRAMEOPTION_EXCLUDE_GROUP                               0x10000 /* omit C.R. & peers */
522 #define FRAMEOPTION_EXCLUDE_TIES                                0x20000 /* omit C.R.'s peers */
523
524 #define FRAMEOPTION_START_OFFSET \
525         (FRAMEOPTION_START_OFFSET_PRECEDING | FRAMEOPTION_START_OFFSET_FOLLOWING)
526 #define FRAMEOPTION_END_OFFSET \
527         (FRAMEOPTION_END_OFFSET_PRECEDING | FRAMEOPTION_END_OFFSET_FOLLOWING)
528 #define FRAMEOPTION_EXCLUSION \
529         (FRAMEOPTION_EXCLUDE_CURRENT_ROW | FRAMEOPTION_EXCLUDE_GROUP | \
530          FRAMEOPTION_EXCLUDE_TIES)
531
532 #define FRAMEOPTION_DEFAULTS \
533         (FRAMEOPTION_RANGE | FRAMEOPTION_START_UNBOUNDED_PRECEDING | \
534          FRAMEOPTION_END_CURRENT_ROW)
535
536 /*
537  * RangeSubselect - subquery appearing in a FROM clause
538  */
539 typedef struct RangeSubselect
540 {
541         NodeTag         type;
542         bool            lateral;                /* does it have LATERAL prefix? */
543         Node       *subquery;           /* the untransformed sub-select clause */
544         Alias      *alias;                      /* table alias & optional column aliases */
545 } RangeSubselect;
546
547 /*
548  * RangeFunction - function call appearing in a FROM clause
549  *
550  * functions is a List because we use this to represent the construct
551  * ROWS FROM(func1(...), func2(...), ...).  Each element of this list is a
552  * two-element sublist, the first element being the untransformed function
553  * call tree, and the second element being a possibly-empty list of ColumnDef
554  * nodes representing any columndef list attached to that function within the
555  * ROWS FROM() syntax.
556  *
557  * alias and coldeflist represent any alias and/or columndef list attached
558  * at the top level.  (We disallow coldeflist appearing both here and
559  * per-function, but that's checked in parse analysis, not by the grammar.)
560  */
561 typedef struct RangeFunction
562 {
563         NodeTag         type;
564         bool            lateral;                /* does it have LATERAL prefix? */
565         bool            ordinality;             /* does it have WITH ORDINALITY suffix? */
566         bool            is_rowsfrom;    /* is result of ROWS FROM() syntax? */
567         List       *functions;          /* per-function information, see above */
568         Alias      *alias;                      /* table alias & optional column aliases */
569         List       *coldeflist;         /* list of ColumnDef nodes to describe result
570                                                                  * of function returning RECORD */
571 } RangeFunction;
572
573 /*
574  * RangeTableFunc - raw form of "table functions" such as XMLTABLE
575  */
576 typedef struct RangeTableFunc
577 {
578         NodeTag         type;
579         bool            lateral;                /* does it have LATERAL prefix? */
580         Node       *docexpr;            /* document expression */
581         Node       *rowexpr;            /* row generator expression */
582         List       *namespaces;         /* list of namespaces as ResTarget */
583         List       *columns;            /* list of RangeTableFuncCol */
584         Alias      *alias;                      /* table alias & optional column aliases */
585         int                     location;               /* token location, or -1 if unknown */
586 } RangeTableFunc;
587
588 /*
589  * RangeTableFuncCol - one column in a RangeTableFunc->columns
590  *
591  * If for_ordinality is true (FOR ORDINALITY), then the column is an int4
592  * column and the rest of the fields are ignored.
593  */
594 typedef struct RangeTableFuncCol
595 {
596         NodeTag         type;
597         char       *colname;            /* name of generated column */
598         TypeName   *typeName;           /* type of generated column */
599         bool            for_ordinality; /* does it have FOR ORDINALITY? */
600         bool            is_not_null;    /* does it have NOT NULL? */
601         Node       *colexpr;            /* column filter expression */
602         Node       *coldefexpr;         /* column default value expression */
603         int                     location;               /* token location, or -1 if unknown */
604 } RangeTableFuncCol;
605
606 /*
607  * RangeTableSample - TABLESAMPLE appearing in a raw FROM clause
608  *
609  * This node, appearing only in raw parse trees, represents
610  *              <relation> TABLESAMPLE <method> (<params>) REPEATABLE (<num>)
611  * Currently, the <relation> can only be a RangeVar, but we might in future
612  * allow RangeSubselect and other options.  Note that the RangeTableSample
613  * is wrapped around the node representing the <relation>, rather than being
614  * a subfield of it.
615  */
616 typedef struct RangeTableSample
617 {
618         NodeTag         type;
619         Node       *relation;           /* relation to be sampled */
620         List       *method;                     /* sampling method name (possibly qualified) */
621         List       *args;                       /* argument(s) for sampling method */
622         Node       *repeatable;         /* REPEATABLE expression, or NULL if none */
623         int                     location;               /* method name location, or -1 if unknown */
624 } RangeTableSample;
625
626 /*
627  * ColumnDef - column definition (used in various creates)
628  *
629  * If the column has a default value, we may have the value expression
630  * in either "raw" form (an untransformed parse tree) or "cooked" form
631  * (a post-parse-analysis, executable expression tree), depending on
632  * how this ColumnDef node was created (by parsing, or by inheritance
633  * from an existing relation).  We should never have both in the same node!
634  *
635  * Similarly, we may have a COLLATE specification in either raw form
636  * (represented as a CollateClause with arg==NULL) or cooked form
637  * (the collation's OID).
638  *
639  * The constraints list may contain a CONSTR_DEFAULT item in a raw
640  * parsetree produced by gram.y, but transformCreateStmt will remove
641  * the item and set raw_default instead.  CONSTR_DEFAULT items
642  * should not appear in any subsequent processing.
643  */
644 typedef struct ColumnDef
645 {
646         NodeTag         type;
647         char       *colname;            /* name of column */
648         TypeName   *typeName;           /* type of column */
649         int                     inhcount;               /* number of times column is inherited */
650         bool            is_local;               /* column has local (non-inherited) def'n */
651         bool            is_not_null;    /* NOT NULL constraint specified? */
652         bool            is_from_type;   /* column definition came from table type */
653         bool            is_from_parent; /* column def came from partition parent */
654         char            storage;                /* attstorage setting, or 0 for default */
655         Node       *raw_default;        /* default value (untransformed parse tree) */
656         Node       *cooked_default; /* default value (transformed expr tree) */
657         char            identity;               /* attidentity setting */
658         RangeVar   *identitySequence;   /* to store identity sequence name for
659                                                                          * ALTER TABLE ... ADD COLUMN */
660         CollateClause *collClause;      /* untransformed COLLATE spec, if any */
661         Oid                     collOid;                /* collation OID (InvalidOid if not set) */
662         List       *constraints;        /* other constraints on column */
663         List       *fdwoptions;         /* per-column FDW options */
664         int                     location;               /* parse location, or -1 if none/unknown */
665 } ColumnDef;
666
667 /*
668  * TableLikeClause - CREATE TABLE ( ... LIKE ... ) clause
669  */
670 typedef struct TableLikeClause
671 {
672         NodeTag         type;
673         RangeVar   *relation;
674         bits32          options;                /* OR of TableLikeOption flags */
675 } TableLikeClause;
676
677 typedef enum TableLikeOption
678 {
679         CREATE_TABLE_LIKE_COMMENTS = 1 << 0,
680         CREATE_TABLE_LIKE_CONSTRAINTS = 1 << 1,
681         CREATE_TABLE_LIKE_DEFAULTS = 1 << 2,
682         CREATE_TABLE_LIKE_IDENTITY = 1 << 3,
683         CREATE_TABLE_LIKE_INDEXES = 1 << 4,
684         CREATE_TABLE_LIKE_STATISTICS = 1 << 5,
685         CREATE_TABLE_LIKE_STORAGE = 1 << 6,
686         CREATE_TABLE_LIKE_ALL = PG_INT32_MAX
687 } TableLikeOption;
688
689 /*
690  * IndexElem - index parameters (used in CREATE INDEX, and in ON CONFLICT)
691  *
692  * For a plain index attribute, 'name' is the name of the table column to
693  * index, and 'expr' is NULL.  For an index expression, 'name' is NULL and
694  * 'expr' is the expression tree.
695  */
696 typedef struct IndexElem
697 {
698         NodeTag         type;
699         char       *name;                       /* name of attribute to index, or NULL */
700         Node       *expr;                       /* expression to index, or NULL */
701         char       *indexcolname;       /* name for index column; NULL = default */
702         List       *collation;          /* name of collation; NIL = default */
703         List       *opclass;            /* name of desired opclass; NIL = default */
704         SortByDir       ordering;               /* ASC/DESC/default */
705         SortByNulls nulls_ordering; /* FIRST/LAST/default */
706 } IndexElem;
707
708 /*
709  * DefElem - a generic "name = value" option definition
710  *
711  * In some contexts the name can be qualified.  Also, certain SQL commands
712  * allow a SET/ADD/DROP action to be attached to option settings, so it's
713  * convenient to carry a field for that too.  (Note: currently, it is our
714  * practice that the grammar allows namespace and action only in statements
715  * where they are relevant; C code can just ignore those fields in other
716  * statements.)
717  */
718 typedef enum DefElemAction
719 {
720         DEFELEM_UNSPEC,                         /* no action given */
721         DEFELEM_SET,
722         DEFELEM_ADD,
723         DEFELEM_DROP
724 } DefElemAction;
725
726 typedef struct DefElem
727 {
728         NodeTag         type;
729         char       *defnamespace;       /* NULL if unqualified name */
730         char       *defname;
731         Node       *arg;                        /* a (Value *) or a (TypeName *) */
732         DefElemAction defaction;        /* unspecified action, or SET/ADD/DROP */
733         int                     location;               /* token location, or -1 if unknown */
734 } DefElem;
735
736 /*
737  * LockingClause - raw representation of FOR [NO KEY] UPDATE/[KEY] SHARE
738  *              options
739  *
740  * Note: lockedRels == NIL means "all relations in query".  Otherwise it
741  * is a list of RangeVar nodes.  (We use RangeVar mainly because it carries
742  * a location field --- currently, parse analysis insists on unqualified
743  * names in LockingClause.)
744  */
745 typedef struct LockingClause
746 {
747         NodeTag         type;
748         List       *lockedRels;         /* FOR [KEY] UPDATE/SHARE relations */
749         LockClauseStrength strength;
750         LockWaitPolicy waitPolicy;      /* NOWAIT and SKIP LOCKED */
751 } LockingClause;
752
753 /*
754  * XMLSERIALIZE (in raw parse tree only)
755  */
756 typedef struct XmlSerialize
757 {
758         NodeTag         type;
759         XmlOptionType xmloption;        /* DOCUMENT or CONTENT */
760         Node       *expr;
761         TypeName   *typeName;
762         int                     location;               /* token location, or -1 if unknown */
763 } XmlSerialize;
764
765 /* Partitioning related definitions */
766
767 /*
768  * PartitionElem - parse-time representation of a single partition key
769  *
770  * expr can be either a raw expression tree or a parse-analyzed expression.
771  * We don't store these on-disk, though.
772  */
773 typedef struct PartitionElem
774 {
775         NodeTag         type;
776         char       *name;                       /* name of column to partition on, or NULL */
777         Node       *expr;                       /* expression to partition on, or NULL */
778         List       *collation;          /* name of collation; NIL = default */
779         List       *opclass;            /* name of desired opclass; NIL = default */
780         int                     location;               /* token location, or -1 if unknown */
781 } PartitionElem;
782
783 /*
784  * PartitionSpec - parse-time representation of a partition key specification
785  *
786  * This represents the key space we will be partitioning on.
787  */
788 typedef struct PartitionSpec
789 {
790         NodeTag         type;
791         char       *strategy;           /* partitioning strategy ('hash', 'list' or
792                                                                  * 'range') */
793         List       *partParams;         /* List of PartitionElems */
794         int                     location;               /* token location, or -1 if unknown */
795 } PartitionSpec;
796
797 /* Internal codes for partitioning strategies */
798 #define PARTITION_STRATEGY_HASH         'h'
799 #define PARTITION_STRATEGY_LIST         'l'
800 #define PARTITION_STRATEGY_RANGE        'r'
801
802 /*
803  * PartitionBoundSpec - a partition bound specification
804  *
805  * This represents the portion of the partition key space assigned to a
806  * particular partition.  These are stored on disk in pg_class.relpartbound.
807  */
808 struct PartitionBoundSpec
809 {
810         NodeTag         type;
811
812         char            strategy;               /* see PARTITION_STRATEGY codes above */
813         bool            is_default;             /* is it a default partition bound? */
814
815         /* Partitioning info for HASH strategy: */
816         int                     modulus;
817         int                     remainder;
818
819         /* Partitioning info for LIST strategy: */
820         List       *listdatums;         /* List of Consts (or A_Consts in raw tree) */
821
822         /* Partitioning info for RANGE strategy: */
823         List       *lowerdatums;        /* List of PartitionRangeDatums */
824         List       *upperdatums;        /* List of PartitionRangeDatums */
825
826         int                     location;               /* token location, or -1 if unknown */
827 };
828
829 /*
830  * PartitionRangeDatum - one of the values in a range partition bound
831  *
832  * This can be MINVALUE, MAXVALUE or a specific bounded value.
833  */
834 typedef enum PartitionRangeDatumKind
835 {
836         PARTITION_RANGE_DATUM_MINVALUE = -1,    /* less than any other value */
837         PARTITION_RANGE_DATUM_VALUE = 0,        /* a specific (bounded) value */
838         PARTITION_RANGE_DATUM_MAXVALUE = 1      /* greater than any other value */
839 } PartitionRangeDatumKind;
840
841 typedef struct PartitionRangeDatum
842 {
843         NodeTag         type;
844
845         PartitionRangeDatumKind kind;
846         Node       *value;                      /* Const (or A_Const in raw tree), if kind is
847                                                                  * PARTITION_RANGE_DATUM_VALUE, else NULL */
848
849         int                     location;               /* token location, or -1 if unknown */
850 } PartitionRangeDatum;
851
852 /*
853  * PartitionCmd - info for ALTER TABLE/INDEX ATTACH/DETACH PARTITION commands
854  */
855 typedef struct PartitionCmd
856 {
857         NodeTag         type;
858         RangeVar   *name;                       /* name of partition to attach/detach */
859         PartitionBoundSpec *bound;      /* FOR VALUES, if attaching */
860 } PartitionCmd;
861
862 /****************************************************************************
863  *      Nodes for a Query tree
864  ****************************************************************************/
865
866 /*--------------------
867  * RangeTblEntry -
868  *        A range table is a List of RangeTblEntry nodes.
869  *
870  *        A range table entry may represent a plain relation, a sub-select in
871  *        FROM, or the result of a JOIN clause.  (Only explicit JOIN syntax
872  *        produces an RTE, not the implicit join resulting from multiple FROM
873  *        items.  This is because we only need the RTE to deal with SQL features
874  *        like outer joins and join-output-column aliasing.)  Other special
875  *        RTE types also exist, as indicated by RTEKind.
876  *
877  *        Note that we consider RTE_RELATION to cover anything that has a pg_class
878  *        entry.  relkind distinguishes the sub-cases.
879  *
880  *        alias is an Alias node representing the AS alias-clause attached to the
881  *        FROM expression, or NULL if no clause.
882  *
883  *        eref is the table reference name and column reference names (either
884  *        real or aliases).  Note that system columns (OID etc) are not included
885  *        in the column list.
886  *        eref->aliasname is required to be present, and should generally be used
887  *        to identify the RTE for error messages etc.
888  *
889  *        In RELATION RTEs, the colnames in both alias and eref are indexed by
890  *        physical attribute number; this means there must be colname entries for
891  *        dropped columns.  When building an RTE we insert empty strings ("") for
892  *        dropped columns.  Note however that a stored rule may have nonempty
893  *        colnames for columns dropped since the rule was created (and for that
894  *        matter the colnames might be out of date due to column renamings).
895  *        The same comments apply to FUNCTION RTEs when a function's return type
896  *        is a named composite type.
897  *
898  *        In JOIN RTEs, the colnames in both alias and eref are one-to-one with
899  *        joinaliasvars entries.  A JOIN RTE will omit columns of its inputs when
900  *        those columns are known to be dropped at parse time.  Again, however,
901  *        a stored rule might contain entries for columns dropped since the rule
902  *        was created.  (This is only possible for columns not actually referenced
903  *        in the rule.)  When loading a stored rule, we replace the joinaliasvars
904  *        items for any such columns with null pointers.  (We can't simply delete
905  *        them from the joinaliasvars list, because that would affect the attnums
906  *        of Vars referencing the rest of the list.)
907  *
908  *        inh is true for relation references that should be expanded to include
909  *        inheritance children, if the rel has any.  This *must* be false for
910  *        RTEs other than RTE_RELATION entries.
911  *
912  *        inFromCl marks those range variables that are listed in the FROM clause.
913  *        It's false for RTEs that are added to a query behind the scenes, such
914  *        as the NEW and OLD variables for a rule, or the subqueries of a UNION.
915  *        This flag is not used anymore during parsing, since the parser now uses
916  *        a separate "namespace" data structure to control visibility, but it is
917  *        needed by ruleutils.c to determine whether RTEs should be shown in
918  *        decompiled queries.
919  *
920  *        requiredPerms and checkAsUser specify run-time access permissions
921  *        checks to be performed at query startup.  The user must have *all*
922  *        of the permissions that are OR'd together in requiredPerms (zero
923  *        indicates no permissions checking).  If checkAsUser is not zero,
924  *        then do the permissions checks using the access rights of that user,
925  *        not the current effective user ID.  (This allows rules to act as
926  *        setuid gateways.)  Permissions checks only apply to RELATION RTEs.
927  *
928  *        For SELECT/INSERT/UPDATE permissions, if the user doesn't have
929  *        table-wide permissions then it is sufficient to have the permissions
930  *        on all columns identified in selectedCols (for SELECT) and/or
931  *        insertedCols and/or updatedCols (INSERT with ON CONFLICT DO UPDATE may
932  *        have all 3).  selectedCols, insertedCols and updatedCols are bitmapsets,
933  *        which cannot have negative integer members, so we subtract
934  *        FirstLowInvalidHeapAttributeNumber from column numbers before storing
935  *        them in these fields.  A whole-row Var reference is represented by
936  *        setting the bit for InvalidAttrNumber.
937  *
938  *        securityQuals is a list of security barrier quals (boolean expressions),
939  *        to be tested in the listed order before returning a row from the
940  *        relation.  It is always NIL in parser output.  Entries are added by the
941  *        rewriter to implement security-barrier views and/or row-level security.
942  *        Note that the planner turns each boolean expression into an implicitly
943  *        AND'ed sublist, as is its usual habit with qualification expressions.
944  *--------------------
945  */
946 typedef enum RTEKind
947 {
948         RTE_RELATION,                           /* ordinary relation reference */
949         RTE_SUBQUERY,                           /* subquery in FROM */
950         RTE_JOIN,                                       /* join */
951         RTE_FUNCTION,                           /* function in FROM */
952         RTE_TABLEFUNC,                          /* TableFunc(.., column list) */
953         RTE_VALUES,                                     /* VALUES (<exprlist>), (<exprlist>), ... */
954         RTE_CTE,                                        /* common table expr (WITH list element) */
955         RTE_NAMEDTUPLESTORE                     /* tuplestore, e.g. for AFTER triggers */
956 } RTEKind;
957
958 typedef struct RangeTblEntry
959 {
960         NodeTag         type;
961
962         RTEKind         rtekind;                /* see above */
963
964         /*
965          * XXX the fields applicable to only some rte kinds should be merged into
966          * a union.  I didn't do this yet because the diffs would impact a lot of
967          * code that is being actively worked on.  FIXME someday.
968          */
969
970         /*
971          * Fields valid for a plain relation RTE (else zero):
972          *
973          * As a special case, RTE_NAMEDTUPLESTORE can also set relid to indicate
974          * that the tuple format of the tuplestore is the same as the referenced
975          * relation.  This allows plans referencing AFTER trigger transition
976          * tables to be invalidated if the underlying table is altered.
977          */
978         Oid                     relid;                  /* OID of the relation */
979         char            relkind;                /* relation kind (see pg_class.relkind) */
980         struct TableSampleClause *tablesample;  /* sampling info, or NULL */
981
982         /*
983          * Fields valid for a subquery RTE (else NULL):
984          */
985         Query      *subquery;           /* the sub-query */
986         bool            security_barrier;       /* is from security_barrier view? */
987
988         /*
989          * Fields valid for a join RTE (else NULL/zero):
990          *
991          * joinaliasvars is a list of (usually) Vars corresponding to the columns
992          * of the join result.  An alias Var referencing column K of the join
993          * result can be replaced by the K'th element of joinaliasvars --- but to
994          * simplify the task of reverse-listing aliases correctly, we do not do
995          * that until planning time.  In detail: an element of joinaliasvars can
996          * be a Var of one of the join's input relations, or such a Var with an
997          * implicit coercion to the join's output column type, or a COALESCE
998          * expression containing the two input column Vars (possibly coerced).
999          * Within a Query loaded from a stored rule, it is also possible for
1000          * joinaliasvars items to be null pointers, which are placeholders for
1001          * (necessarily unreferenced) columns dropped since the rule was made.
1002          * Also, once planning begins, joinaliasvars items can be almost anything,
1003          * as a result of subquery-flattening substitutions.
1004          */
1005         JoinType        jointype;               /* type of join */
1006         List       *joinaliasvars;      /* list of alias-var expansions */
1007
1008         /*
1009          * Fields valid for a function RTE (else NIL/zero):
1010          *
1011          * When funcordinality is true, the eref->colnames list includes an alias
1012          * for the ordinality column.  The ordinality column is otherwise
1013          * implicit, and must be accounted for "by hand" in places such as
1014          * expandRTE().
1015          */
1016         List       *functions;          /* list of RangeTblFunction nodes */
1017         bool            funcordinality; /* is this called WITH ORDINALITY? */
1018
1019         /*
1020          * Fields valid for a TableFunc RTE (else NULL):
1021          */
1022         TableFunc  *tablefunc;
1023
1024         /*
1025          * Fields valid for a values RTE (else NIL):
1026          */
1027         List       *values_lists;       /* list of expression lists */
1028
1029         /*
1030          * Fields valid for a CTE RTE (else NULL/zero):
1031          */
1032         char       *ctename;            /* name of the WITH list item */
1033         Index           ctelevelsup;    /* number of query levels up */
1034         bool            self_reference; /* is this a recursive self-reference? */
1035
1036         /*
1037          * Fields valid for table functions, values, CTE and ENR RTEs (else NIL):
1038          *
1039          * We need these for CTE RTEs so that the types of self-referential
1040          * columns are well-defined.  For VALUES RTEs, storing these explicitly
1041          * saves having to re-determine the info by scanning the values_lists. For
1042          * ENRs, we store the types explicitly here (we could get the information
1043          * from the catalogs if 'relid' was supplied, but we'd still need these
1044          * for TupleDesc-based ENRs, so we might as well always store the type
1045          * info here).
1046          *
1047          * For ENRs only, we have to consider the possibility of dropped columns.
1048          * A dropped column is included in these lists, but it will have zeroes in
1049          * all three lists (as well as an empty-string entry in eref).  Testing
1050          * for zero coltype is the standard way to detect a dropped column.
1051          */
1052         List       *coltypes;           /* OID list of column type OIDs */
1053         List       *coltypmods;         /* integer list of column typmods */
1054         List       *colcollations;      /* OID list of column collation OIDs */
1055
1056         /*
1057          * Fields valid for ENR RTEs (else NULL/zero):
1058          */
1059         char       *enrname;            /* name of ephemeral named relation */
1060         double          enrtuples;              /* estimated or actual from caller */
1061
1062         /*
1063          * Fields valid in all RTEs:
1064          */
1065         Alias      *alias;                      /* user-written alias clause, if any */
1066         Alias      *eref;                       /* expanded reference names */
1067         bool            lateral;                /* subquery, function, or values is LATERAL? */
1068         bool            inh;                    /* inheritance requested? */
1069         bool            inFromCl;               /* present in FROM clause? */
1070         AclMode         requiredPerms;  /* bitmask of required access permissions */
1071         Oid                     checkAsUser;    /* if valid, check access as this role */
1072         Bitmapset  *selectedCols;       /* columns needing SELECT permission */
1073         Bitmapset  *insertedCols;       /* columns needing INSERT permission */
1074         Bitmapset  *updatedCols;        /* columns needing UPDATE permission */
1075         List       *securityQuals;      /* security barrier quals to apply, if any */
1076 } RangeTblEntry;
1077
1078 /*
1079  * RangeTblFunction -
1080  *        RangeTblEntry subsidiary data for one function in a FUNCTION RTE.
1081  *
1082  * If the function had a column definition list (required for an
1083  * otherwise-unspecified RECORD result), funccolnames lists the names given
1084  * in the definition list, funccoltypes lists their declared column types,
1085  * funccoltypmods lists their typmods, funccolcollations their collations.
1086  * Otherwise, those fields are NIL.
1087  *
1088  * Notice we don't attempt to store info about the results of functions
1089  * returning named composite types, because those can change from time to
1090  * time.  We do however remember how many columns we thought the type had
1091  * (including dropped columns!), so that we can successfully ignore any
1092  * columns added after the query was parsed.
1093  */
1094 typedef struct RangeTblFunction
1095 {
1096         NodeTag         type;
1097
1098         Node       *funcexpr;           /* expression tree for func call */
1099         int                     funccolcount;   /* number of columns it contributes to RTE */
1100         /* These fields record the contents of a column definition list, if any: */
1101         List       *funccolnames;       /* column names (list of String) */
1102         List       *funccoltypes;       /* OID list of column type OIDs */
1103         List       *funccoltypmods; /* integer list of column typmods */
1104         List       *funccolcollations;  /* OID list of column collation OIDs */
1105         /* This is set during planning for use by the executor: */
1106         Bitmapset  *funcparams;         /* PARAM_EXEC Param IDs affecting this func */
1107 } RangeTblFunction;
1108
1109 /*
1110  * TableSampleClause - TABLESAMPLE appearing in a transformed FROM clause
1111  *
1112  * Unlike RangeTableSample, this is a subnode of the relevant RangeTblEntry.
1113  */
1114 typedef struct TableSampleClause
1115 {
1116         NodeTag         type;
1117         Oid                     tsmhandler;             /* OID of the tablesample handler function */
1118         List       *args;                       /* tablesample argument expression(s) */
1119         Expr       *repeatable;         /* REPEATABLE expression, or NULL if none */
1120 } TableSampleClause;
1121
1122 /*
1123  * WithCheckOption -
1124  *              representation of WITH CHECK OPTION checks to be applied to new tuples
1125  *              when inserting/updating an auto-updatable view, or RLS WITH CHECK
1126  *              policies to be applied when inserting/updating a relation with RLS.
1127  */
1128 typedef enum WCOKind
1129 {
1130         WCO_VIEW_CHECK,                         /* WCO on an auto-updatable view */
1131         WCO_RLS_INSERT_CHECK,           /* RLS INSERT WITH CHECK policy */
1132         WCO_RLS_UPDATE_CHECK,           /* RLS UPDATE WITH CHECK policy */
1133         WCO_RLS_CONFLICT_CHECK          /* RLS ON CONFLICT DO UPDATE USING policy */
1134 } WCOKind;
1135
1136 typedef struct WithCheckOption
1137 {
1138         NodeTag         type;
1139         WCOKind         kind;                   /* kind of WCO */
1140         char       *relname;            /* name of relation that specified the WCO */
1141         char       *polname;            /* name of RLS policy being checked */
1142         Node       *qual;                       /* constraint qual to check */
1143         bool            cascaded;               /* true for a cascaded WCO on a view */
1144 } WithCheckOption;
1145
1146 /*
1147  * SortGroupClause -
1148  *              representation of ORDER BY, GROUP BY, PARTITION BY,
1149  *              DISTINCT, DISTINCT ON items
1150  *
1151  * You might think that ORDER BY is only interested in defining ordering,
1152  * and GROUP/DISTINCT are only interested in defining equality.  However,
1153  * one way to implement grouping is to sort and then apply a "uniq"-like
1154  * filter.  So it's also interesting to keep track of possible sort operators
1155  * for GROUP/DISTINCT, and in particular to try to sort for the grouping
1156  * in a way that will also yield a requested ORDER BY ordering.  So we need
1157  * to be able to compare ORDER BY and GROUP/DISTINCT lists, which motivates
1158  * the decision to give them the same representation.
1159  *
1160  * tleSortGroupRef must match ressortgroupref of exactly one entry of the
1161  *              query's targetlist; that is the expression to be sorted or grouped by.
1162  * eqop is the OID of the equality operator.
1163  * sortop is the OID of the ordering operator (a "<" or ">" operator),
1164  *              or InvalidOid if not available.
1165  * nulls_first means about what you'd expect.  If sortop is InvalidOid
1166  *              then nulls_first is meaningless and should be set to false.
1167  * hashable is true if eqop is hashable (note this condition also depends
1168  *              on the datatype of the input expression).
1169  *
1170  * In an ORDER BY item, all fields must be valid.  (The eqop isn't essential
1171  * here, but it's cheap to get it along with the sortop, and requiring it
1172  * to be valid eases comparisons to grouping items.)  Note that this isn't
1173  * actually enough information to determine an ordering: if the sortop is
1174  * collation-sensitive, a collation OID is needed too.  We don't store the
1175  * collation in SortGroupClause because it's not available at the time the
1176  * parser builds the SortGroupClause; instead, consult the exposed collation
1177  * of the referenced targetlist expression to find out what it is.
1178  *
1179  * In a grouping item, eqop must be valid.  If the eqop is a btree equality
1180  * operator, then sortop should be set to a compatible ordering operator.
1181  * We prefer to set eqop/sortop/nulls_first to match any ORDER BY item that
1182  * the query presents for the same tlist item.  If there is none, we just
1183  * use the default ordering op for the datatype.
1184  *
1185  * If the tlist item's type has a hash opclass but no btree opclass, then
1186  * we will set eqop to the hash equality operator, sortop to InvalidOid,
1187  * and nulls_first to false.  A grouping item of this kind can only be
1188  * implemented by hashing, and of course it'll never match an ORDER BY item.
1189  *
1190  * The hashable flag is provided since we generally have the requisite
1191  * information readily available when the SortGroupClause is constructed,
1192  * and it's relatively expensive to get it again later.  Note there is no
1193  * need for a "sortable" flag since OidIsValid(sortop) serves the purpose.
1194  *
1195  * A query might have both ORDER BY and DISTINCT (or DISTINCT ON) clauses.
1196  * In SELECT DISTINCT, the distinctClause list is as long or longer than the
1197  * sortClause list, while in SELECT DISTINCT ON it's typically shorter.
1198  * The two lists must match up to the end of the shorter one --- the parser
1199  * rearranges the distinctClause if necessary to make this true.  (This
1200  * restriction ensures that only one sort step is needed to both satisfy the
1201  * ORDER BY and set up for the Unique step.  This is semantically necessary
1202  * for DISTINCT ON, and presents no real drawback for DISTINCT.)
1203  */
1204 typedef struct SortGroupClause
1205 {
1206         NodeTag         type;
1207         Index           tleSortGroupRef;        /* reference into targetlist */
1208         Oid                     eqop;                   /* the equality operator ('=' op) */
1209         Oid                     sortop;                 /* the ordering operator ('<' op), or 0 */
1210         bool            nulls_first;    /* do NULLs come before normal values? */
1211         bool            hashable;               /* can eqop be implemented by hashing? */
1212 } SortGroupClause;
1213
1214 /*
1215  * GroupingSet -
1216  *              representation of CUBE, ROLLUP and GROUPING SETS clauses
1217  *
1218  * In a Query with grouping sets, the groupClause contains a flat list of
1219  * SortGroupClause nodes for each distinct expression used.  The actual
1220  * structure of the GROUP BY clause is given by the groupingSets tree.
1221  *
1222  * In the raw parser output, GroupingSet nodes (of all types except SIMPLE
1223  * which is not used) are potentially mixed in with the expressions in the
1224  * groupClause of the SelectStmt.  (An expression can't contain a GroupingSet,
1225  * but a list may mix GroupingSet and expression nodes.)  At this stage, the
1226  * content of each node is a list of expressions, some of which may be RowExprs
1227  * which represent sublists rather than actual row constructors, and nested
1228  * GroupingSet nodes where legal in the grammar.  The structure directly
1229  * reflects the query syntax.
1230  *
1231  * In parse analysis, the transformed expressions are used to build the tlist
1232  * and groupClause list (of SortGroupClause nodes), and the groupingSets tree
1233  * is eventually reduced to a fixed format:
1234  *
1235  * EMPTY nodes represent (), and obviously have no content
1236  *
1237  * SIMPLE nodes represent a list of one or more expressions to be treated as an
1238  * atom by the enclosing structure; the content is an integer list of
1239  * ressortgroupref values (see SortGroupClause)
1240  *
1241  * CUBE and ROLLUP nodes contain a list of one or more SIMPLE nodes.
1242  *
1243  * SETS nodes contain a list of EMPTY, SIMPLE, CUBE or ROLLUP nodes, but after
1244  * parse analysis they cannot contain more SETS nodes; enough of the syntactic
1245  * transforms of the spec have been applied that we no longer have arbitrarily
1246  * deep nesting (though we still preserve the use of cube/rollup).
1247  *
1248  * Note that if the groupingSets tree contains no SIMPLE nodes (only EMPTY
1249  * nodes at the leaves), then the groupClause will be empty, but this is still
1250  * an aggregation query (similar to using aggs or HAVING without GROUP BY).
1251  *
1252  * As an example, the following clause:
1253  *
1254  * GROUP BY GROUPING SETS ((a,b), CUBE(c,(d,e)))
1255  *
1256  * looks like this after raw parsing:
1257  *
1258  * SETS( RowExpr(a,b) , CUBE( c, RowExpr(d,e) ) )
1259  *
1260  * and parse analysis converts it to:
1261  *
1262  * SETS( SIMPLE(1,2), CUBE( SIMPLE(3), SIMPLE(4,5) ) )
1263  */
1264 typedef enum
1265 {
1266         GROUPING_SET_EMPTY,
1267         GROUPING_SET_SIMPLE,
1268         GROUPING_SET_ROLLUP,
1269         GROUPING_SET_CUBE,
1270         GROUPING_SET_SETS
1271 } GroupingSetKind;
1272
1273 typedef struct GroupingSet
1274 {
1275         NodeTag         type;
1276         GroupingSetKind kind;
1277         List       *content;
1278         int                     location;
1279 } GroupingSet;
1280
1281 /*
1282  * WindowClause -
1283  *              transformed representation of WINDOW and OVER clauses
1284  *
1285  * A parsed Query's windowClause list contains these structs.  "name" is set
1286  * if the clause originally came from WINDOW, and is NULL if it originally
1287  * was an OVER clause (but note that we collapse out duplicate OVERs).
1288  * partitionClause and orderClause are lists of SortGroupClause structs.
1289  * If we have RANGE with offset PRECEDING/FOLLOWING, the semantics of that are
1290  * specified by startInRangeFunc/inRangeColl/inRangeAsc/inRangeNullsFirst
1291  * for the start offset, or endInRangeFunc/inRange* for the end offset.
1292  * winref is an ID number referenced by WindowFunc nodes; it must be unique
1293  * among the members of a Query's windowClause list.
1294  * When refname isn't null, the partitionClause is always copied from there;
1295  * the orderClause might or might not be copied (see copiedOrder); the framing
1296  * options are never copied, per spec.
1297  */
1298 typedef struct WindowClause
1299 {
1300         NodeTag         type;
1301         char       *name;                       /* window name (NULL in an OVER clause) */
1302         char       *refname;            /* referenced window name, if any */
1303         List       *partitionClause;    /* PARTITION BY list */
1304         List       *orderClause;        /* ORDER BY list */
1305         int                     frameOptions;   /* frame_clause options, see WindowDef */
1306         Node       *startOffset;        /* expression for starting bound, if any */
1307         Node       *endOffset;          /* expression for ending bound, if any */
1308         Oid                     startInRangeFunc;       /* in_range function for startOffset */
1309         Oid                     endInRangeFunc; /* in_range function for endOffset */
1310         Oid                     inRangeColl;    /* collation for in_range tests */
1311         bool            inRangeAsc;             /* use ASC sort order for in_range tests? */
1312         bool            inRangeNullsFirst;      /* nulls sort first for in_range tests? */
1313         Index           winref;                 /* ID referenced by window functions */
1314         bool            copiedOrder;    /* did we copy orderClause from refname? */
1315 } WindowClause;
1316
1317 /*
1318  * RowMarkClause -
1319  *         parser output representation of FOR [KEY] UPDATE/SHARE clauses
1320  *
1321  * Query.rowMarks contains a separate RowMarkClause node for each relation
1322  * identified as a FOR [KEY] UPDATE/SHARE target.  If one of these clauses
1323  * is applied to a subquery, we generate RowMarkClauses for all normal and
1324  * subquery rels in the subquery, but they are marked pushedDown = true to
1325  * distinguish them from clauses that were explicitly written at this query
1326  * level.  Also, Query.hasForUpdate tells whether there were explicit FOR
1327  * UPDATE/SHARE/KEY SHARE clauses in the current query level.
1328  */
1329 typedef struct RowMarkClause
1330 {
1331         NodeTag         type;
1332         Index           rti;                    /* range table index of target relation */
1333         LockClauseStrength strength;
1334         LockWaitPolicy waitPolicy;      /* NOWAIT and SKIP LOCKED */
1335         bool            pushedDown;             /* pushed down from higher query level? */
1336 } RowMarkClause;
1337
1338 /*
1339  * WithClause -
1340  *         representation of WITH clause
1341  *
1342  * Note: WithClause does not propagate into the Query representation;
1343  * but CommonTableExpr does.
1344  */
1345 typedef struct WithClause
1346 {
1347         NodeTag         type;
1348         List       *ctes;                       /* list of CommonTableExprs */
1349         bool            recursive;              /* true = WITH RECURSIVE */
1350         int                     location;               /* token location, or -1 if unknown */
1351 } WithClause;
1352
1353 /*
1354  * InferClause -
1355  *              ON CONFLICT unique index inference clause
1356  *
1357  * Note: InferClause does not propagate into the Query representation.
1358  */
1359 typedef struct InferClause
1360 {
1361         NodeTag         type;
1362         List       *indexElems;         /* IndexElems to infer unique index */
1363         Node       *whereClause;        /* qualification (partial-index predicate) */
1364         char       *conname;            /* Constraint name, or NULL if unnamed */
1365         int                     location;               /* token location, or -1 if unknown */
1366 } InferClause;
1367
1368 /*
1369  * OnConflictClause -
1370  *              representation of ON CONFLICT clause
1371  *
1372  * Note: OnConflictClause does not propagate into the Query representation.
1373  */
1374 typedef struct OnConflictClause
1375 {
1376         NodeTag         type;
1377         OnConflictAction action;        /* DO NOTHING or UPDATE? */
1378         InferClause *infer;                     /* Optional index inference clause */
1379         List       *targetList;         /* the target list (of ResTarget) */
1380         Node       *whereClause;        /* qualifications */
1381         int                     location;               /* token location, or -1 if unknown */
1382 } OnConflictClause;
1383
1384 /*
1385  * CommonTableExpr -
1386  *         representation of WITH list element
1387  *
1388  * We don't currently support the SEARCH or CYCLE clause.
1389  */
1390 typedef struct CommonTableExpr
1391 {
1392         NodeTag         type;
1393         char       *ctename;            /* query name (never qualified) */
1394         List       *aliascolnames;      /* optional list of column names */
1395         /* SelectStmt/InsertStmt/etc before parse analysis, Query afterwards: */
1396         Node       *ctequery;           /* the CTE's subquery */
1397         int                     location;               /* token location, or -1 if unknown */
1398         /* These fields are set during parse analysis: */
1399         bool            cterecursive;   /* is this CTE actually recursive? */
1400         int                     cterefcount;    /* number of RTEs referencing this CTE
1401                                                                  * (excluding internal self-references) */
1402         List       *ctecolnames;        /* list of output column names */
1403         List       *ctecoltypes;        /* OID list of output column type OIDs */
1404         List       *ctecoltypmods;      /* integer list of output column typmods */
1405         List       *ctecolcollations;   /* OID list of column collation OIDs */
1406 } CommonTableExpr;
1407
1408 /* Convenience macro to get the output tlist of a CTE's query */
1409 #define GetCTETargetList(cte) \
1410         (AssertMacro(IsA((cte)->ctequery, Query)), \
1411          ((Query *) (cte)->ctequery)->commandType == CMD_SELECT ? \
1412          ((Query *) (cte)->ctequery)->targetList : \
1413          ((Query *) (cte)->ctequery)->returningList)
1414
1415 /*
1416  * TriggerTransition -
1417  *         representation of transition row or table naming clause
1418  *
1419  * Only transition tables are initially supported in the syntax, and only for
1420  * AFTER triggers, but other permutations are accepted by the parser so we can
1421  * give a meaningful message from C code.
1422  */
1423 typedef struct TriggerTransition
1424 {
1425         NodeTag         type;
1426         char       *name;
1427         bool            isNew;
1428         bool            isTable;
1429 } TriggerTransition;
1430
1431 /*****************************************************************************
1432  *              Raw Grammar Output Statements
1433  *****************************************************************************/
1434
1435 /*
1436  *              RawStmt --- container for any one statement's raw parse tree
1437  *
1438  * Parse analysis converts a raw parse tree headed by a RawStmt node into
1439  * an analyzed statement headed by a Query node.  For optimizable statements,
1440  * the conversion is complex.  For utility statements, the parser usually just
1441  * transfers the raw parse tree (sans RawStmt) into the utilityStmt field of
1442  * the Query node, and all the useful work happens at execution time.
1443  *
1444  * stmt_location/stmt_len identify the portion of the source text string
1445  * containing this raw statement (useful for multi-statement strings).
1446  */
1447 typedef struct RawStmt
1448 {
1449         NodeTag         type;
1450         Node       *stmt;                       /* raw parse tree */
1451         int                     stmt_location;  /* start location, or -1 if unknown */
1452         int                     stmt_len;               /* length in bytes; 0 means "rest of string" */
1453 } RawStmt;
1454
1455 /*****************************************************************************
1456  *              Optimizable Statements
1457  *****************************************************************************/
1458
1459 /* ----------------------
1460  *              Insert Statement
1461  *
1462  * The source expression is represented by SelectStmt for both the
1463  * SELECT and VALUES cases.  If selectStmt is NULL, then the query
1464  * is INSERT ... DEFAULT VALUES.
1465  * ----------------------
1466  */
1467 typedef struct InsertStmt
1468 {
1469         NodeTag         type;
1470         RangeVar   *relation;           /* relation to insert into */
1471         List       *cols;                       /* optional: names of the target columns */
1472         Node       *selectStmt;         /* the source SELECT/VALUES, or NULL */
1473         OnConflictClause *onConflictClause; /* ON CONFLICT clause */
1474         List       *returningList;      /* list of expressions to return */
1475         WithClause *withClause;         /* WITH clause */
1476         OverridingKind override;        /* OVERRIDING clause */
1477 } InsertStmt;
1478
1479 /* ----------------------
1480  *              Delete Statement
1481  * ----------------------
1482  */
1483 typedef struct DeleteStmt
1484 {
1485         NodeTag         type;
1486         RangeVar   *relation;           /* relation to delete from */
1487         List       *usingClause;        /* optional using clause for more tables */
1488         Node       *whereClause;        /* qualifications */
1489         List       *returningList;      /* list of expressions to return */
1490         WithClause *withClause;         /* WITH clause */
1491 } DeleteStmt;
1492
1493 /* ----------------------
1494  *              Update Statement
1495  * ----------------------
1496  */
1497 typedef struct UpdateStmt
1498 {
1499         NodeTag         type;
1500         RangeVar   *relation;           /* relation to update */
1501         List       *targetList;         /* the target list (of ResTarget) */
1502         Node       *whereClause;        /* qualifications */
1503         List       *fromClause;         /* optional from clause for more tables */
1504         List       *returningList;      /* list of expressions to return */
1505         WithClause *withClause;         /* WITH clause */
1506 } UpdateStmt;
1507
1508 /* ----------------------
1509  *              Select Statement
1510  *
1511  * A "simple" SELECT is represented in the output of gram.y by a single
1512  * SelectStmt node; so is a VALUES construct.  A query containing set
1513  * operators (UNION, INTERSECT, EXCEPT) is represented by a tree of SelectStmt
1514  * nodes, in which the leaf nodes are component SELECTs and the internal nodes
1515  * represent UNION, INTERSECT, or EXCEPT operators.  Using the same node
1516  * type for both leaf and internal nodes allows gram.y to stick ORDER BY,
1517  * LIMIT, etc, clause values into a SELECT statement without worrying
1518  * whether it is a simple or compound SELECT.
1519  * ----------------------
1520  */
1521 typedef enum SetOperation
1522 {
1523         SETOP_NONE = 0,
1524         SETOP_UNION,
1525         SETOP_INTERSECT,
1526         SETOP_EXCEPT
1527 } SetOperation;
1528
1529 typedef struct SelectStmt
1530 {
1531         NodeTag         type;
1532
1533         /*
1534          * These fields are used only in "leaf" SelectStmts.
1535          */
1536         List       *distinctClause; /* NULL, list of DISTINCT ON exprs, or
1537                                                                  * lcons(NIL,NIL) for all (SELECT DISTINCT) */
1538         IntoClause *intoClause;         /* target for SELECT INTO */
1539         List       *targetList;         /* the target list (of ResTarget) */
1540         List       *fromClause;         /* the FROM clause */
1541         Node       *whereClause;        /* WHERE qualification */
1542         List       *groupClause;        /* GROUP BY clauses */
1543         Node       *havingClause;       /* HAVING conditional-expression */
1544         List       *windowClause;       /* WINDOW window_name AS (...), ... */
1545
1546         /*
1547          * In a "leaf" node representing a VALUES list, the above fields are all
1548          * null, and instead this field is set.  Note that the elements of the
1549          * sublists are just expressions, without ResTarget decoration. Also note
1550          * that a list element can be DEFAULT (represented as a SetToDefault
1551          * node), regardless of the context of the VALUES list. It's up to parse
1552          * analysis to reject that where not valid.
1553          */
1554         List       *valuesLists;        /* untransformed list of expression lists */
1555
1556         /*
1557          * These fields are used in both "leaf" SelectStmts and upper-level
1558          * SelectStmts.
1559          */
1560         List       *sortClause;         /* sort clause (a list of SortBy's) */
1561         Node       *limitOffset;        /* # of result tuples to skip */
1562         Node       *limitCount;         /* # of result tuples to return */
1563         List       *lockingClause;      /* FOR UPDATE (list of LockingClause's) */
1564         WithClause *withClause;         /* WITH clause */
1565
1566         /*
1567          * These fields are used only in upper-level SelectStmts.
1568          */
1569         SetOperation op;                        /* type of set op */
1570         bool            all;                    /* ALL specified? */
1571         struct SelectStmt *larg;        /* left child */
1572         struct SelectStmt *rarg;        /* right child */
1573         /* Eventually add fields for CORRESPONDING spec here */
1574 } SelectStmt;
1575
1576
1577 /* ----------------------
1578  *              Set Operation node for post-analysis query trees
1579  *
1580  * After parse analysis, a SELECT with set operations is represented by a
1581  * top-level Query node containing the leaf SELECTs as subqueries in its
1582  * range table.  Its setOperations field shows the tree of set operations,
1583  * with leaf SelectStmt nodes replaced by RangeTblRef nodes, and internal
1584  * nodes replaced by SetOperationStmt nodes.  Information about the output
1585  * column types is added, too.  (Note that the child nodes do not necessarily
1586  * produce these types directly, but we've checked that their output types
1587  * can be coerced to the output column type.)  Also, if it's not UNION ALL,
1588  * information about the types' sort/group semantics is provided in the form
1589  * of a SortGroupClause list (same representation as, eg, DISTINCT).
1590  * The resolved common column collations are provided too; but note that if
1591  * it's not UNION ALL, it's okay for a column to not have a common collation,
1592  * so a member of the colCollations list could be InvalidOid even though the
1593  * column has a collatable type.
1594  * ----------------------
1595  */
1596 typedef struct SetOperationStmt
1597 {
1598         NodeTag         type;
1599         SetOperation op;                        /* type of set op */
1600         bool            all;                    /* ALL specified? */
1601         Node       *larg;                       /* left child */
1602         Node       *rarg;                       /* right child */
1603         /* Eventually add fields for CORRESPONDING spec here */
1604
1605         /* Fields derived during parse analysis: */
1606         List       *colTypes;           /* OID list of output column type OIDs */
1607         List       *colTypmods;         /* integer list of output column typmods */
1608         List       *colCollations;      /* OID list of output column collation OIDs */
1609         List       *groupClauses;       /* a list of SortGroupClause's */
1610         /* groupClauses is NIL if UNION ALL, but must be set otherwise */
1611 } SetOperationStmt;
1612
1613
1614 /*****************************************************************************
1615  *              Other Statements (no optimizations required)
1616  *
1617  *              These are not touched by parser/analyze.c except to put them into
1618  *              the utilityStmt field of a Query.  This is eventually passed to
1619  *              ProcessUtility (by-passing rewriting and planning).  Some of the
1620  *              statements do need attention from parse analysis, and this is
1621  *              done by routines in parser/parse_utilcmd.c after ProcessUtility
1622  *              receives the command for execution.
1623  *              DECLARE CURSOR, EXPLAIN, and CREATE TABLE AS are special cases:
1624  *              they contain optimizable statements, which get processed normally
1625  *              by parser/analyze.c.
1626  *****************************************************************************/
1627
1628 /*
1629  * When a command can act on several kinds of objects with only one
1630  * parse structure required, use these constants to designate the
1631  * object type.  Note that commands typically don't support all the types.
1632  */
1633
1634 typedef enum ObjectType
1635 {
1636         OBJECT_ACCESS_METHOD,
1637         OBJECT_AGGREGATE,
1638         OBJECT_AMOP,
1639         OBJECT_AMPROC,
1640         OBJECT_ATTRIBUTE,                       /* type's attribute, when distinct from column */
1641         OBJECT_CAST,
1642         OBJECT_COLUMN,
1643         OBJECT_COLLATION,
1644         OBJECT_CONVERSION,
1645         OBJECT_DATABASE,
1646         OBJECT_DEFAULT,
1647         OBJECT_DEFACL,
1648         OBJECT_DOMAIN,
1649         OBJECT_DOMCONSTRAINT,
1650         OBJECT_EVENT_TRIGGER,
1651         OBJECT_EXTENSION,
1652         OBJECT_FDW,
1653         OBJECT_FOREIGN_SERVER,
1654         OBJECT_FOREIGN_TABLE,
1655         OBJECT_FUNCTION,
1656         OBJECT_INDEX,
1657         OBJECT_LANGUAGE,
1658         OBJECT_LARGEOBJECT,
1659         OBJECT_MATVIEW,
1660         OBJECT_OPCLASS,
1661         OBJECT_OPERATOR,
1662         OBJECT_OPFAMILY,
1663         OBJECT_POLICY,
1664         OBJECT_PROCEDURE,
1665         OBJECT_PUBLICATION,
1666         OBJECT_PUBLICATION_REL,
1667         OBJECT_ROLE,
1668         OBJECT_ROUTINE,
1669         OBJECT_RULE,
1670         OBJECT_SCHEMA,
1671         OBJECT_SEQUENCE,
1672         OBJECT_SUBSCRIPTION,
1673         OBJECT_STATISTIC_EXT,
1674         OBJECT_TABCONSTRAINT,
1675         OBJECT_TABLE,
1676         OBJECT_TABLESPACE,
1677         OBJECT_TRANSFORM,
1678         OBJECT_TRIGGER,
1679         OBJECT_TSCONFIGURATION,
1680         OBJECT_TSDICTIONARY,
1681         OBJECT_TSPARSER,
1682         OBJECT_TSTEMPLATE,
1683         OBJECT_TYPE,
1684         OBJECT_USER_MAPPING,
1685         OBJECT_VIEW
1686 } ObjectType;
1687
1688 /* ----------------------
1689  *              Create Schema Statement
1690  *
1691  * NOTE: the schemaElts list contains raw parsetrees for component statements
1692  * of the schema, such as CREATE TABLE, GRANT, etc.  These are analyzed and
1693  * executed after the schema itself is created.
1694  * ----------------------
1695  */
1696 typedef struct CreateSchemaStmt
1697 {
1698         NodeTag         type;
1699         char       *schemaname;         /* the name of the schema to create */
1700         RoleSpec   *authrole;           /* the owner of the created schema */
1701         List       *schemaElts;         /* schema components (list of parsenodes) */
1702         bool            if_not_exists;  /* just do nothing if schema already exists? */
1703 } CreateSchemaStmt;
1704
1705 typedef enum DropBehavior
1706 {
1707         DROP_RESTRICT,                          /* drop fails if any dependent objects */
1708         DROP_CASCADE                            /* remove dependent objects too */
1709 } DropBehavior;
1710
1711 /* ----------------------
1712  *      Alter Table
1713  * ----------------------
1714  */
1715 typedef struct AlterTableStmt
1716 {
1717         NodeTag         type;
1718         RangeVar   *relation;           /* table to work on */
1719         List       *cmds;                       /* list of subcommands */
1720         ObjectType      relkind;                /* type of object */
1721         bool            missing_ok;             /* skip error if table missing */
1722 } AlterTableStmt;
1723
1724 typedef enum AlterTableType
1725 {
1726         AT_AddColumn,                           /* add column */
1727         AT_AddColumnRecurse,            /* internal to commands/tablecmds.c */
1728         AT_AddColumnToView,                     /* implicitly via CREATE OR REPLACE VIEW */
1729         AT_ColumnDefault,                       /* alter column default */
1730         AT_DropNotNull,                         /* alter column drop not null */
1731         AT_SetNotNull,                          /* alter column set not null */
1732         AT_SetStatistics,                       /* alter column set statistics */
1733         AT_SetOptions,                          /* alter column set ( options ) */
1734         AT_ResetOptions,                        /* alter column reset ( options ) */
1735         AT_SetStorage,                          /* alter column set storage */
1736         AT_DropColumn,                          /* drop column */
1737         AT_DropColumnRecurse,           /* internal to commands/tablecmds.c */
1738         AT_AddIndex,                            /* add index */
1739         AT_ReAddIndex,                          /* internal to commands/tablecmds.c */
1740         AT_AddConstraint,                       /* add constraint */
1741         AT_AddConstraintRecurse,        /* internal to commands/tablecmds.c */
1742         AT_ReAddConstraint,                     /* internal to commands/tablecmds.c */
1743         AT_ReAddDomainConstraint,       /* internal to commands/tablecmds.c */
1744         AT_AlterConstraint,                     /* alter constraint */
1745         AT_ValidateConstraint,          /* validate constraint */
1746         AT_ValidateConstraintRecurse,   /* internal to commands/tablecmds.c */
1747         AT_ProcessedConstraint,         /* pre-processed add constraint (local in
1748                                                                  * parser/parse_utilcmd.c) */
1749         AT_AddIndexConstraint,          /* add constraint using existing index */
1750         AT_DropConstraint,                      /* drop constraint */
1751         AT_DropConstraintRecurse,       /* internal to commands/tablecmds.c */
1752         AT_ReAddComment,                        /* internal to commands/tablecmds.c */
1753         AT_AlterColumnType,                     /* alter column type */
1754         AT_AlterColumnGenericOptions,   /* alter column OPTIONS (...) */
1755         AT_ChangeOwner,                         /* change owner */
1756         AT_ClusterOn,                           /* CLUSTER ON */
1757         AT_DropCluster,                         /* SET WITHOUT CLUSTER */
1758         AT_SetLogged,                           /* SET LOGGED */
1759         AT_SetUnLogged,                         /* SET UNLOGGED */
1760         AT_AddOids,                                     /* SET WITH OIDS */
1761         AT_AddOidsRecurse,                      /* internal to commands/tablecmds.c */
1762         AT_DropOids,                            /* SET WITHOUT OIDS */
1763         AT_SetTableSpace,                       /* SET TABLESPACE */
1764         AT_SetRelOptions,                       /* SET (...) -- AM specific parameters */
1765         AT_ResetRelOptions,                     /* RESET (...) -- AM specific parameters */
1766         AT_ReplaceRelOptions,           /* replace reloption list in its entirety */
1767         AT_EnableTrig,                          /* ENABLE TRIGGER name */
1768         AT_EnableAlwaysTrig,            /* ENABLE ALWAYS TRIGGER name */
1769         AT_EnableReplicaTrig,           /* ENABLE REPLICA TRIGGER name */
1770         AT_DisableTrig,                         /* DISABLE TRIGGER name */
1771         AT_EnableTrigAll,                       /* ENABLE TRIGGER ALL */
1772         AT_DisableTrigAll,                      /* DISABLE TRIGGER ALL */
1773         AT_EnableTrigUser,                      /* ENABLE TRIGGER USER */
1774         AT_DisableTrigUser,                     /* DISABLE TRIGGER USER */
1775         AT_EnableRule,                          /* ENABLE RULE name */
1776         AT_EnableAlwaysRule,            /* ENABLE ALWAYS RULE name */
1777         AT_EnableReplicaRule,           /* ENABLE REPLICA RULE name */
1778         AT_DisableRule,                         /* DISABLE RULE name */
1779         AT_AddInherit,                          /* INHERIT parent */
1780         AT_DropInherit,                         /* NO INHERIT parent */
1781         AT_AddOf,                                       /* OF <type_name> */
1782         AT_DropOf,                                      /* NOT OF */
1783         AT_ReplicaIdentity,                     /* REPLICA IDENTITY */
1784         AT_EnableRowSecurity,           /* ENABLE ROW SECURITY */
1785         AT_DisableRowSecurity,          /* DISABLE ROW SECURITY */
1786         AT_ForceRowSecurity,            /* FORCE ROW SECURITY */
1787         AT_NoForceRowSecurity,          /* NO FORCE ROW SECURITY */
1788         AT_GenericOptions,                      /* OPTIONS (...) */
1789         AT_AttachPartition,                     /* ATTACH PARTITION */
1790         AT_DetachPartition,                     /* DETACH PARTITION */
1791         AT_AddIdentity,                         /* ADD IDENTITY */
1792         AT_SetIdentity,                         /* SET identity column options */
1793         AT_DropIdentity                         /* DROP IDENTITY */
1794 } AlterTableType;
1795
1796 typedef struct ReplicaIdentityStmt
1797 {
1798         NodeTag         type;
1799         char            identity_type;
1800         char       *name;
1801 } ReplicaIdentityStmt;
1802
1803 typedef struct AlterTableCmd    /* one subcommand of an ALTER TABLE */
1804 {
1805         NodeTag         type;
1806         AlterTableType subtype;         /* Type of table alteration to apply */
1807         char       *name;                       /* column, constraint, or trigger to act on,
1808                                                                  * or tablespace */
1809         int16           num;                    /* attribute number for columns referenced by
1810                                                                  * number */
1811         RoleSpec   *newowner;
1812         Node       *def;                        /* definition of new column, index,
1813                                                                  * constraint, or parent table */
1814         DropBehavior behavior;          /* RESTRICT or CASCADE for DROP cases */
1815         bool            missing_ok;             /* skip error if missing? */
1816 } AlterTableCmd;
1817
1818
1819 /* ----------------------
1820  * Alter Collation
1821  * ----------------------
1822  */
1823 typedef struct AlterCollationStmt
1824 {
1825         NodeTag         type;
1826         List       *collname;
1827 } AlterCollationStmt;
1828
1829
1830 /* ----------------------
1831  *      Alter Domain
1832  *
1833  * The fields are used in different ways by the different variants of
1834  * this command.
1835  * ----------------------
1836  */
1837 typedef struct AlterDomainStmt
1838 {
1839         NodeTag         type;
1840         char            subtype;                /*------------
1841                                                                  *      T = alter column default
1842                                                                  *      N = alter column drop not null
1843                                                                  *      O = alter column set not null
1844                                                                  *      C = add constraint
1845                                                                  *      X = drop constraint
1846                                                                  *------------
1847                                                                  */
1848         List       *typeName;           /* domain to work on */
1849         char       *name;                       /* column or constraint name to act on */
1850         Node       *def;                        /* definition of default or constraint */
1851         DropBehavior behavior;          /* RESTRICT or CASCADE for DROP cases */
1852         bool            missing_ok;             /* skip error if missing? */
1853 } AlterDomainStmt;
1854
1855
1856 /* ----------------------
1857  *              Grant|Revoke Statement
1858  * ----------------------
1859  */
1860 typedef enum GrantTargetType
1861 {
1862         ACL_TARGET_OBJECT,                      /* grant on specific named object(s) */
1863         ACL_TARGET_ALL_IN_SCHEMA,       /* grant on all objects in given schema(s) */
1864         ACL_TARGET_DEFAULTS                     /* ALTER DEFAULT PRIVILEGES */
1865 } GrantTargetType;
1866
1867 typedef struct GrantStmt
1868 {
1869         NodeTag         type;
1870         bool            is_grant;               /* true = GRANT, false = REVOKE */
1871         GrantTargetType targtype;       /* type of the grant target */
1872         ObjectType      objtype;                /* kind of object being operated on */
1873         List       *objects;            /* list of RangeVar nodes, ObjectWithArgs
1874                                                                  * nodes, or plain names (as Value strings) */
1875         List       *privileges;         /* list of AccessPriv nodes */
1876         /* privileges == NIL denotes ALL PRIVILEGES */
1877         List       *grantees;           /* list of RoleSpec nodes */
1878         bool            grant_option;   /* grant or revoke grant option */
1879         DropBehavior behavior;          /* drop behavior (for REVOKE) */
1880 } GrantStmt;
1881
1882 /*
1883  * Note: ObjectWithArgs carries only the types of the input parameters of the
1884  * function.  So it is sufficient to identify an existing function, but it
1885  * is not enough info to define a function nor to call it.
1886  */
1887 typedef struct ObjectWithArgs
1888 {
1889         NodeTag         type;
1890         List       *objname;            /* qualified name of function/operator */
1891         List       *objargs;            /* list of Typename nodes */
1892         bool            args_unspecified;       /* argument list was omitted, so name must
1893                                                                          * be unique (note that objargs == NIL
1894                                                                          * means zero args) */
1895 } ObjectWithArgs;
1896
1897 /*
1898  * An access privilege, with optional list of column names
1899  * priv_name == NULL denotes ALL PRIVILEGES (only used with a column list)
1900  * cols == NIL denotes "all columns"
1901  * Note that simple "ALL PRIVILEGES" is represented as a NIL list, not
1902  * an AccessPriv with both fields null.
1903  */
1904 typedef struct AccessPriv
1905 {
1906         NodeTag         type;
1907         char       *priv_name;          /* string name of privilege */
1908         List       *cols;                       /* list of Value strings */
1909 } AccessPriv;
1910
1911 /* ----------------------
1912  *              Grant/Revoke Role Statement
1913  *
1914  * Note: because of the parsing ambiguity with the GRANT <privileges>
1915  * statement, granted_roles is a list of AccessPriv; the execution code
1916  * should complain if any column lists appear.  grantee_roles is a list
1917  * of role names, as Value strings.
1918  * ----------------------
1919  */
1920 typedef struct GrantRoleStmt
1921 {
1922         NodeTag         type;
1923         List       *granted_roles;      /* list of roles to be granted/revoked */
1924         List       *grantee_roles;      /* list of member roles to add/delete */
1925         bool            is_grant;               /* true = GRANT, false = REVOKE */
1926         bool            admin_opt;              /* with admin option */
1927         RoleSpec   *grantor;            /* set grantor to other than current role */
1928         DropBehavior behavior;          /* drop behavior (for REVOKE) */
1929 } GrantRoleStmt;
1930
1931 /* ----------------------
1932  *      Alter Default Privileges Statement
1933  * ----------------------
1934  */
1935 typedef struct AlterDefaultPrivilegesStmt
1936 {
1937         NodeTag         type;
1938         List       *options;            /* list of DefElem */
1939         GrantStmt  *action;                     /* GRANT/REVOKE action (with objects=NIL) */
1940 } AlterDefaultPrivilegesStmt;
1941
1942 /* ----------------------
1943  *              Copy Statement
1944  *
1945  * We support "COPY relation FROM file", "COPY relation TO file", and
1946  * "COPY (query) TO file".  In any given CopyStmt, exactly one of "relation"
1947  * and "query" must be non-NULL.
1948  * ----------------------
1949  */
1950 typedef struct CopyStmt
1951 {
1952         NodeTag         type;
1953         RangeVar   *relation;           /* the relation to copy */
1954         Node       *query;                      /* the query (SELECT or DML statement with
1955                                                                  * RETURNING) to copy, as a raw parse tree */
1956         List       *attlist;            /* List of column names (as Strings), or NIL
1957                                                                  * for all columns */
1958         bool            is_from;                /* TO or FROM */
1959         bool            is_program;             /* is 'filename' a program to popen? */
1960         char       *filename;           /* filename, or NULL for STDIN/STDOUT */
1961         List       *options;            /* List of DefElem nodes */
1962 } CopyStmt;
1963
1964 /* ----------------------
1965  * SET Statement (includes RESET)
1966  *
1967  * "SET var TO DEFAULT" and "RESET var" are semantically equivalent, but we
1968  * preserve the distinction in VariableSetKind for CreateCommandTag().
1969  * ----------------------
1970  */
1971 typedef enum
1972 {
1973         VAR_SET_VALUE,                          /* SET var = value */
1974         VAR_SET_DEFAULT,                        /* SET var TO DEFAULT */
1975         VAR_SET_CURRENT,                        /* SET var FROM CURRENT */
1976         VAR_SET_MULTI,                          /* special case for SET TRANSACTION ... */
1977         VAR_RESET,                                      /* RESET var */
1978         VAR_RESET_ALL                           /* RESET ALL */
1979 } VariableSetKind;
1980
1981 typedef struct VariableSetStmt
1982 {
1983         NodeTag         type;
1984         VariableSetKind kind;
1985         char       *name;                       /* variable to be set */
1986         List       *args;                       /* List of A_Const nodes */
1987         bool            is_local;               /* SET LOCAL? */
1988 } VariableSetStmt;
1989
1990 /* ----------------------
1991  * Show Statement
1992  * ----------------------
1993  */
1994 typedef struct VariableShowStmt
1995 {
1996         NodeTag         type;
1997         char       *name;
1998 } VariableShowStmt;
1999
2000 /* ----------------------
2001  *              Create Table Statement
2002  *
2003  * NOTE: in the raw gram.y output, ColumnDef and Constraint nodes are
2004  * intermixed in tableElts, and constraints is NIL.  After parse analysis,
2005  * tableElts contains just ColumnDefs, and constraints contains just
2006  * Constraint nodes (in fact, only CONSTR_CHECK nodes, in the present
2007  * implementation).
2008  * ----------------------
2009  */
2010
2011 typedef struct CreateStmt
2012 {
2013         NodeTag         type;
2014         RangeVar   *relation;           /* relation to create */
2015         List       *tableElts;          /* column definitions (list of ColumnDef) */
2016         List       *inhRelations;       /* relations to inherit from (list of
2017                                                                  * inhRelation) */
2018         PartitionBoundSpec *partbound;  /* FOR VALUES clause */
2019         PartitionSpec *partspec;        /* PARTITION BY clause */
2020         TypeName   *ofTypename;         /* OF typename */
2021         List       *constraints;        /* constraints (list of Constraint nodes) */
2022         List       *options;            /* options from WITH clause */
2023         OnCommitAction oncommit;        /* what do we do at COMMIT? */
2024         char       *tablespacename; /* table space to use, or NULL */
2025         bool            if_not_exists;  /* just do nothing if it already exists? */
2026 } CreateStmt;
2027
2028 /* ----------
2029  * Definitions for constraints in CreateStmt
2030  *
2031  * Note that column defaults are treated as a type of constraint,
2032  * even though that's a bit odd semantically.
2033  *
2034  * For constraints that use expressions (CONSTR_CHECK, CONSTR_DEFAULT)
2035  * we may have the expression in either "raw" form (an untransformed
2036  * parse tree) or "cooked" form (the nodeToString representation of
2037  * an executable expression tree), depending on how this Constraint
2038  * node was created (by parsing, or by inheritance from an existing
2039  * relation).  We should never have both in the same node!
2040  *
2041  * FKCONSTR_ACTION_xxx values are stored into pg_constraint.confupdtype
2042  * and pg_constraint.confdeltype columns; FKCONSTR_MATCH_xxx values are
2043  * stored into pg_constraint.confmatchtype.  Changing the code values may
2044  * require an initdb!
2045  *
2046  * If skip_validation is true then we skip checking that the existing rows
2047  * in the table satisfy the constraint, and just install the catalog entries
2048  * for the constraint.  A new FK constraint is marked as valid iff
2049  * initially_valid is true.  (Usually skip_validation and initially_valid
2050  * are inverses, but we can set both true if the table is known empty.)
2051  *
2052  * Constraint attributes (DEFERRABLE etc) are initially represented as
2053  * separate Constraint nodes for simplicity of parsing.  parse_utilcmd.c makes
2054  * a pass through the constraints list to insert the info into the appropriate
2055  * Constraint node.
2056  * ----------
2057  */
2058
2059 typedef enum ConstrType                 /* types of constraints */
2060 {
2061         CONSTR_NULL,                            /* not standard SQL, but a lot of people
2062                                                                  * expect it */
2063         CONSTR_NOTNULL,
2064         CONSTR_DEFAULT,
2065         CONSTR_IDENTITY,
2066         CONSTR_CHECK,
2067         CONSTR_PRIMARY,
2068         CONSTR_UNIQUE,
2069         CONSTR_EXCLUSION,
2070         CONSTR_FOREIGN,
2071         CONSTR_ATTR_DEFERRABLE,         /* attributes for previous constraint node */
2072         CONSTR_ATTR_NOT_DEFERRABLE,
2073         CONSTR_ATTR_DEFERRED,
2074         CONSTR_ATTR_IMMEDIATE
2075 } ConstrType;
2076
2077 /* Foreign key action codes */
2078 #define FKCONSTR_ACTION_NOACTION        'a'
2079 #define FKCONSTR_ACTION_RESTRICT        'r'
2080 #define FKCONSTR_ACTION_CASCADE         'c'
2081 #define FKCONSTR_ACTION_SETNULL         'n'
2082 #define FKCONSTR_ACTION_SETDEFAULT      'd'
2083
2084 /* Foreign key matchtype codes */
2085 #define FKCONSTR_MATCH_FULL                     'f'
2086 #define FKCONSTR_MATCH_PARTIAL          'p'
2087 #define FKCONSTR_MATCH_SIMPLE           's'
2088
2089 typedef struct Constraint
2090 {
2091         NodeTag         type;
2092         ConstrType      contype;                /* see above */
2093
2094         /* Fields used for most/all constraint types: */
2095         char       *conname;            /* Constraint name, or NULL if unnamed */
2096         bool            deferrable;             /* DEFERRABLE? */
2097         bool            initdeferred;   /* INITIALLY DEFERRED? */
2098         int                     location;               /* token location, or -1 if unknown */
2099
2100         /* Fields used for constraints with expressions (CHECK and DEFAULT): */
2101         bool            is_no_inherit;  /* is constraint non-inheritable? */
2102         Node       *raw_expr;           /* expr, as untransformed parse tree */
2103         char       *cooked_expr;        /* expr, as nodeToString representation */
2104         char            generated_when;
2105
2106         /* Fields used for unique constraints (UNIQUE and PRIMARY KEY): */
2107         List       *keys;                       /* String nodes naming referenced key
2108                                                                  * column(s) */
2109         List       *including;          /* String nodes naming referenced nonkey
2110                                                                  * column(s) */
2111
2112         /* Fields used for EXCLUSION constraints: */
2113         List       *exclusions;         /* list of (IndexElem, operator name) pairs */
2114
2115         /* Fields used for index constraints (UNIQUE, PRIMARY KEY, EXCLUSION): */
2116         List       *options;            /* options from WITH clause */
2117         char       *indexname;          /* existing index to use; otherwise NULL */
2118         char       *indexspace;         /* index tablespace; NULL for default */
2119         /* These could be, but currently are not, used for UNIQUE/PKEY: */
2120         char       *access_method;      /* index access method; NULL for default */
2121         Node       *where_clause;       /* partial index predicate */
2122
2123         /* Fields used for FOREIGN KEY constraints: */
2124         RangeVar   *pktable;            /* Primary key table */
2125         List       *fk_attrs;           /* Attributes of foreign key */
2126         List       *pk_attrs;           /* Corresponding attrs in PK table */
2127         char            fk_matchtype;   /* FULL, PARTIAL, SIMPLE */
2128         char            fk_upd_action;  /* ON UPDATE action */
2129         char            fk_del_action;  /* ON DELETE action */
2130         List       *old_conpfeqop;      /* pg_constraint.conpfeqop of my former self */
2131         Oid                     old_pktable_oid;        /* pg_constraint.confrelid of my former
2132                                                                          * self */
2133
2134         /* Fields used for constraints that allow a NOT VALID specification */
2135         bool            skip_validation;        /* skip validation of existing rows? */
2136         bool            initially_valid;        /* mark the new constraint as valid? */
2137 } Constraint;
2138
2139 /* ----------------------
2140  *              Create/Drop Table Space Statements
2141  * ----------------------
2142  */
2143
2144 typedef struct CreateTableSpaceStmt
2145 {
2146         NodeTag         type;
2147         char       *tablespacename;
2148         RoleSpec   *owner;
2149         char       *location;
2150         List       *options;
2151 } CreateTableSpaceStmt;
2152
2153 typedef struct DropTableSpaceStmt
2154 {
2155         NodeTag         type;
2156         char       *tablespacename;
2157         bool            missing_ok;             /* skip error if missing? */
2158 } DropTableSpaceStmt;
2159
2160 typedef struct AlterTableSpaceOptionsStmt
2161 {
2162         NodeTag         type;
2163         char       *tablespacename;
2164         List       *options;
2165         bool            isReset;
2166 } AlterTableSpaceOptionsStmt;
2167
2168 typedef struct AlterTableMoveAllStmt
2169 {
2170         NodeTag         type;
2171         char       *orig_tablespacename;
2172         ObjectType      objtype;                /* Object type to move */
2173         List       *roles;                      /* List of roles to move objects of */
2174         char       *new_tablespacename;
2175         bool            nowait;
2176 } AlterTableMoveAllStmt;
2177
2178 /* ----------------------
2179  *              Create/Alter Extension Statements
2180  * ----------------------
2181  */
2182
2183 typedef struct CreateExtensionStmt
2184 {
2185         NodeTag         type;
2186         char       *extname;
2187         bool            if_not_exists;  /* just do nothing if it already exists? */
2188         List       *options;            /* List of DefElem nodes */
2189 } CreateExtensionStmt;
2190
2191 /* Only used for ALTER EXTENSION UPDATE; later might need an action field */
2192 typedef struct AlterExtensionStmt
2193 {
2194         NodeTag         type;
2195         char       *extname;
2196         List       *options;            /* List of DefElem nodes */
2197 } AlterExtensionStmt;
2198
2199 typedef struct AlterExtensionContentsStmt
2200 {
2201         NodeTag         type;
2202         char       *extname;            /* Extension's name */
2203         int                     action;                 /* +1 = add object, -1 = drop object */
2204         ObjectType      objtype;                /* Object's type */
2205         Node       *object;                     /* Qualified name of the object */
2206 } AlterExtensionContentsStmt;
2207
2208 /* ----------------------
2209  *              Create/Alter FOREIGN DATA WRAPPER Statements
2210  * ----------------------
2211  */
2212
2213 typedef struct CreateFdwStmt
2214 {
2215         NodeTag         type;
2216         char       *fdwname;            /* foreign-data wrapper name */
2217         List       *func_options;       /* HANDLER/VALIDATOR options */
2218         List       *options;            /* generic options to FDW */
2219 } CreateFdwStmt;
2220
2221 typedef struct AlterFdwStmt
2222 {
2223         NodeTag         type;
2224         char       *fdwname;            /* foreign-data wrapper name */
2225         List       *func_options;       /* HANDLER/VALIDATOR options */
2226         List       *options;            /* generic options to FDW */
2227 } AlterFdwStmt;
2228
2229 /* ----------------------
2230  *              Create/Alter FOREIGN SERVER Statements
2231  * ----------------------
2232  */
2233
2234 typedef struct CreateForeignServerStmt
2235 {
2236         NodeTag         type;
2237         char       *servername;         /* server name */
2238         char       *servertype;         /* optional server type */
2239         char       *version;            /* optional server version */
2240         char       *fdwname;            /* FDW name */
2241         bool            if_not_exists;  /* just do nothing if it already exists? */
2242         List       *options;            /* generic options to server */
2243 } CreateForeignServerStmt;
2244
2245 typedef struct AlterForeignServerStmt
2246 {
2247         NodeTag         type;
2248         char       *servername;         /* server name */
2249         char       *version;            /* optional server version */
2250         List       *options;            /* generic options to server */
2251         bool            has_version;    /* version specified */
2252 } AlterForeignServerStmt;
2253
2254 /* ----------------------
2255  *              Create FOREIGN TABLE Statement
2256  * ----------------------
2257  */
2258
2259 typedef struct CreateForeignTableStmt
2260 {
2261         CreateStmt      base;
2262         char       *servername;
2263         List       *options;
2264 } CreateForeignTableStmt;
2265
2266 /* ----------------------
2267  *              Create/Drop USER MAPPING Statements
2268  * ----------------------
2269  */
2270
2271 typedef struct CreateUserMappingStmt
2272 {
2273         NodeTag         type;
2274         RoleSpec   *user;                       /* user role */
2275         char       *servername;         /* server name */
2276         bool            if_not_exists;  /* just do nothing if it already exists? */
2277         List       *options;            /* generic options to server */
2278 } CreateUserMappingStmt;
2279
2280 typedef struct AlterUserMappingStmt
2281 {
2282         NodeTag         type;
2283         RoleSpec   *user;                       /* user role */
2284         char       *servername;         /* server name */
2285         List       *options;            /* generic options to server */
2286 } AlterUserMappingStmt;
2287
2288 typedef struct DropUserMappingStmt
2289 {
2290         NodeTag         type;
2291         RoleSpec   *user;                       /* user role */
2292         char       *servername;         /* server name */
2293         bool            missing_ok;             /* ignore missing mappings */
2294 } DropUserMappingStmt;
2295
2296 /* ----------------------
2297  *              Import Foreign Schema Statement
2298  * ----------------------
2299  */
2300
2301 typedef enum ImportForeignSchemaType
2302 {
2303         FDW_IMPORT_SCHEMA_ALL,          /* all relations wanted */
2304         FDW_IMPORT_SCHEMA_LIMIT_TO, /* include only listed tables in import */
2305         FDW_IMPORT_SCHEMA_EXCEPT        /* exclude listed tables from import */
2306 } ImportForeignSchemaType;
2307
2308 typedef struct ImportForeignSchemaStmt
2309 {
2310         NodeTag         type;
2311         char       *server_name;        /* FDW server name */
2312         char       *remote_schema;      /* remote schema name to query */
2313         char       *local_schema;       /* local schema to create objects in */
2314         ImportForeignSchemaType list_type;      /* type of table list */
2315         List       *table_list;         /* List of RangeVar */
2316         List       *options;            /* list of options to pass to FDW */
2317 } ImportForeignSchemaStmt;
2318
2319 /*----------------------
2320  *              Create POLICY Statement
2321  *----------------------
2322  */
2323 typedef struct CreatePolicyStmt
2324 {
2325         NodeTag         type;
2326         char       *policy_name;        /* Policy's name */
2327         RangeVar   *table;                      /* the table name the policy applies to */
2328         char       *cmd_name;           /* the command name the policy applies to */
2329         bool            permissive;             /* restrictive or permissive policy */
2330         List       *roles;                      /* the roles associated with the policy */
2331         Node       *qual;                       /* the policy's condition */
2332         Node       *with_check;         /* the policy's WITH CHECK condition. */
2333 } CreatePolicyStmt;
2334
2335 /*----------------------
2336  *              Alter POLICY Statement
2337  *----------------------
2338  */
2339 typedef struct AlterPolicyStmt
2340 {
2341         NodeTag         type;
2342         char       *policy_name;        /* Policy's name */
2343         RangeVar   *table;                      /* the table name the policy applies to */
2344         List       *roles;                      /* the roles associated with the policy */
2345         Node       *qual;                       /* the policy's condition */
2346         Node       *with_check;         /* the policy's WITH CHECK condition. */
2347 } AlterPolicyStmt;
2348
2349 /*----------------------
2350  *              Create ACCESS METHOD Statement
2351  *----------------------
2352  */
2353 typedef struct CreateAmStmt
2354 {
2355         NodeTag         type;
2356         char       *amname;                     /* access method name */
2357         List       *handler_name;       /* handler function name */
2358         char            amtype;                 /* type of access method */
2359 } CreateAmStmt;
2360
2361 /* ----------------------
2362  *              Create TRIGGER Statement
2363  * ----------------------
2364  */
2365 typedef struct CreateTrigStmt
2366 {
2367         NodeTag         type;
2368         char       *trigname;           /* TRIGGER's name */
2369         RangeVar   *relation;           /* relation trigger is on */
2370         List       *funcname;           /* qual. name of function to call */
2371         List       *args;                       /* list of (T_String) Values or NIL */
2372         bool            row;                    /* ROW/STATEMENT */
2373         /* timing uses the TRIGGER_TYPE bits defined in catalog/pg_trigger.h */
2374         int16           timing;                 /* BEFORE, AFTER, or INSTEAD */
2375         /* events uses the TRIGGER_TYPE bits defined in catalog/pg_trigger.h */
2376         int16           events;                 /* "OR" of INSERT/UPDATE/DELETE/TRUNCATE */
2377         List       *columns;            /* column names, or NIL for all columns */
2378         Node       *whenClause;         /* qual expression, or NULL if none */
2379         bool            isconstraint;   /* This is a constraint trigger */
2380         /* explicitly named transition data */
2381         List       *transitionRels; /* TriggerTransition nodes, or NIL if none */
2382         /* The remaining fields are only used for constraint triggers */
2383         bool            deferrable;             /* [NOT] DEFERRABLE */
2384         bool            initdeferred;   /* INITIALLY {DEFERRED|IMMEDIATE} */
2385         RangeVar   *constrrel;          /* opposite relation, if RI trigger */
2386 } CreateTrigStmt;
2387
2388 /* ----------------------
2389  *              Create EVENT TRIGGER Statement
2390  * ----------------------
2391  */
2392 typedef struct CreateEventTrigStmt
2393 {
2394         NodeTag         type;
2395         char       *trigname;           /* TRIGGER's name */
2396         char       *eventname;          /* event's identifier */
2397         List       *whenclause;         /* list of DefElems indicating filtering */
2398         List       *funcname;           /* qual. name of function to call */
2399 } CreateEventTrigStmt;
2400
2401 /* ----------------------
2402  *              Alter EVENT TRIGGER Statement
2403  * ----------------------
2404  */
2405 typedef struct AlterEventTrigStmt
2406 {
2407         NodeTag         type;
2408         char       *trigname;           /* TRIGGER's name */
2409         char            tgenabled;              /* trigger's firing configuration WRT
2410                                                                  * session_replication_role */
2411 } AlterEventTrigStmt;
2412
2413 /* ----------------------
2414  *              Create/Drop PROCEDURAL LANGUAGE Statements
2415  *              Create PROCEDURAL LANGUAGE Statements
2416  * ----------------------
2417  */
2418 typedef struct CreatePLangStmt
2419 {
2420         NodeTag         type;
2421         bool            replace;                /* T => replace if already exists */
2422         char       *plname;                     /* PL name */
2423         List       *plhandler;          /* PL call handler function (qual. name) */
2424         List       *plinline;           /* optional inline function (qual. name) */
2425         List       *plvalidator;        /* optional validator function (qual. name) */
2426         bool            pltrusted;              /* PL is trusted */
2427 } CreatePLangStmt;
2428
2429 /* ----------------------
2430  *      Create/Alter/Drop Role Statements
2431  *
2432  * Note: these node types are also used for the backwards-compatible
2433  * Create/Alter/Drop User/Group statements.  In the ALTER and DROP cases
2434  * there's really no need to distinguish what the original spelling was,
2435  * but for CREATE we mark the type because the defaults vary.
2436  * ----------------------
2437  */
2438 typedef enum RoleStmtType
2439 {
2440         ROLESTMT_ROLE,
2441         ROLESTMT_USER,
2442         ROLESTMT_GROUP
2443 } RoleStmtType;
2444
2445 typedef struct CreateRoleStmt
2446 {
2447         NodeTag         type;
2448         RoleStmtType stmt_type;         /* ROLE/USER/GROUP */
2449         char       *role;                       /* role name */
2450         List       *options;            /* List of DefElem nodes */
2451 } CreateRoleStmt;
2452
2453 typedef struct AlterRoleStmt
2454 {
2455         NodeTag         type;
2456         RoleSpec   *role;                       /* role */
2457         List       *options;            /* List of DefElem nodes */
2458         int                     action;                 /* +1 = add members, -1 = drop members */
2459 } AlterRoleStmt;
2460
2461 typedef struct AlterRoleSetStmt
2462 {
2463         NodeTag         type;
2464         RoleSpec   *role;                       /* role */
2465         char       *database;           /* database name, or NULL */
2466         VariableSetStmt *setstmt;       /* SET or RESET subcommand */
2467 } AlterRoleSetStmt;
2468
2469 typedef struct DropRoleStmt
2470 {
2471         NodeTag         type;
2472         List       *roles;                      /* List of roles to remove */
2473         bool            missing_ok;             /* skip error if a role is missing? */
2474 } DropRoleStmt;
2475
2476 /* ----------------------
2477  *              {Create|Alter} SEQUENCE Statement
2478  * ----------------------
2479  */
2480
2481 typedef struct CreateSeqStmt
2482 {
2483         NodeTag         type;
2484         RangeVar   *sequence;           /* the sequence to create */
2485         List       *options;
2486         Oid                     ownerId;                /* ID of owner, or InvalidOid for default */
2487         bool            for_identity;
2488         bool            if_not_exists;  /* just do nothing if it already exists? */
2489 } CreateSeqStmt;
2490
2491 typedef struct AlterSeqStmt
2492 {
2493         NodeTag         type;
2494         RangeVar   *sequence;           /* the sequence to alter */
2495         List       *options;
2496         bool            for_identity;
2497         bool            missing_ok;             /* skip error if a role is missing? */
2498 } AlterSeqStmt;
2499
2500 /* ----------------------
2501  *              Create {Aggregate|Operator|Type} Statement
2502  * ----------------------
2503  */
2504 typedef struct DefineStmt
2505 {
2506         NodeTag         type;
2507         ObjectType      kind;                   /* aggregate, operator, type */
2508         bool            oldstyle;               /* hack to signal old CREATE AGG syntax */
2509         List       *defnames;           /* qualified name (list of Value strings) */
2510         List       *args;                       /* a list of TypeName (if needed) */
2511         List       *definition;         /* a list of DefElem */
2512         bool            if_not_exists;  /* just do nothing if it already exists? */
2513 } DefineStmt;
2514
2515 /* ----------------------
2516  *              Create Domain Statement
2517  * ----------------------
2518  */
2519 typedef struct CreateDomainStmt
2520 {
2521         NodeTag         type;
2522         List       *domainname;         /* qualified name (list of Value strings) */
2523         TypeName   *typeName;           /* the base type */
2524         CollateClause *collClause;      /* untransformed COLLATE spec, if any */
2525         List       *constraints;        /* constraints (list of Constraint nodes) */
2526 } CreateDomainStmt;
2527
2528 /* ----------------------
2529  *              Create Operator Class Statement
2530  * ----------------------
2531  */
2532 typedef struct CreateOpClassStmt
2533 {
2534         NodeTag         type;
2535         List       *opclassname;        /* qualified name (list of Value strings) */
2536         List       *opfamilyname;       /* qualified name (ditto); NIL if omitted */
2537         char       *amname;                     /* name of index AM opclass is for */
2538         TypeName   *datatype;           /* datatype of indexed column */
2539         List       *items;                      /* List of CreateOpClassItem nodes */
2540         bool            isDefault;              /* Should be marked as default for type? */
2541 } CreateOpClassStmt;
2542
2543 #define OPCLASS_ITEM_OPERATOR           1
2544 #define OPCLASS_ITEM_FUNCTION           2
2545 #define OPCLASS_ITEM_STORAGETYPE        3
2546
2547 typedef struct CreateOpClassItem
2548 {
2549         NodeTag         type;
2550         int                     itemtype;               /* see codes above */
2551         ObjectWithArgs *name;           /* operator or function name and args */
2552         int                     number;                 /* strategy num or support proc num */
2553         List       *order_family;       /* only used for ordering operators */
2554         List       *class_args;         /* amproclefttype/amprocrighttype or
2555                                                                  * amoplefttype/amoprighttype */
2556         /* fields used for a storagetype item: */
2557         TypeName   *storedtype;         /* datatype stored in index */
2558 } CreateOpClassItem;
2559
2560 /* ----------------------
2561  *              Create Operator Family Statement
2562  * ----------------------
2563  */
2564 typedef struct CreateOpFamilyStmt
2565 {
2566         NodeTag         type;
2567         List       *opfamilyname;       /* qualified name (list of Value strings) */
2568         char       *amname;                     /* name of index AM opfamily is for */
2569 } CreateOpFamilyStmt;
2570
2571 /* ----------------------
2572  *              Alter Operator Family Statement
2573  * ----------------------
2574  */
2575 typedef struct AlterOpFamilyStmt
2576 {
2577         NodeTag         type;
2578         List       *opfamilyname;       /* qualified name (list of Value strings) */
2579         char       *amname;                     /* name of index AM opfamily is for */
2580         bool            isDrop;                 /* ADD or DROP the items? */
2581         List       *items;                      /* List of CreateOpClassItem nodes */
2582 } AlterOpFamilyStmt;
2583
2584 /* ----------------------
2585  *              Drop Table|Sequence|View|Index|Type|Domain|Conversion|Schema Statement
2586  * ----------------------
2587  */
2588
2589 typedef struct DropStmt
2590 {
2591         NodeTag         type;
2592         List       *objects;            /* list of names */
2593         ObjectType      removeType;             /* object type */
2594         DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
2595         bool            missing_ok;             /* skip error if object is missing? */
2596         bool            concurrent;             /* drop index concurrently? */
2597 } DropStmt;
2598
2599 /* ----------------------
2600  *                              Truncate Table Statement
2601  * ----------------------
2602  */
2603 typedef struct TruncateStmt
2604 {
2605         NodeTag         type;
2606         List       *relations;          /* relations (RangeVars) to be truncated */
2607         bool            restart_seqs;   /* restart owned sequences? */
2608         DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
2609 } TruncateStmt;
2610
2611 /* ----------------------
2612  *                              Comment On Statement
2613  * ----------------------
2614  */
2615 typedef struct CommentStmt
2616 {
2617         NodeTag         type;
2618         ObjectType      objtype;                /* Object's type */
2619         Node       *object;                     /* Qualified name of the object */
2620         char       *comment;            /* Comment to insert, or NULL to remove */
2621 } CommentStmt;
2622
2623 /* ----------------------
2624  *                              SECURITY LABEL Statement
2625  * ----------------------
2626  */
2627 typedef struct SecLabelStmt
2628 {
2629         NodeTag         type;
2630         ObjectType      objtype;                /* Object's type */
2631         Node       *object;                     /* Qualified name of the object */
2632         char       *provider;           /* Label provider (or NULL) */
2633         char       *label;                      /* New security label to be assigned */
2634 } SecLabelStmt;
2635
2636 /* ----------------------
2637  *              Declare Cursor Statement
2638  *
2639  * The "query" field is initially a raw parse tree, and is converted to a
2640  * Query node during parse analysis.  Note that rewriting and planning
2641  * of the query are always postponed until execution.
2642  * ----------------------
2643  */
2644 #define CURSOR_OPT_BINARY               0x0001  /* BINARY */
2645 #define CURSOR_OPT_SCROLL               0x0002  /* SCROLL explicitly given */
2646 #define CURSOR_OPT_NO_SCROLL    0x0004  /* NO SCROLL explicitly given */
2647 #define CURSOR_OPT_INSENSITIVE  0x0008  /* INSENSITIVE */
2648 #define CURSOR_OPT_HOLD                 0x0010  /* WITH HOLD */
2649 /* these planner-control flags do not correspond to any SQL grammar: */
2650 #define CURSOR_OPT_FAST_PLAN    0x0020  /* prefer fast-start plan */
2651 #define CURSOR_OPT_GENERIC_PLAN 0x0040  /* force use of generic plan */
2652 #define CURSOR_OPT_CUSTOM_PLAN  0x0080  /* force use of custom plan */
2653 #define CURSOR_OPT_PARALLEL_OK  0x0100  /* parallel mode OK */
2654
2655 typedef struct DeclareCursorStmt
2656 {
2657         NodeTag         type;
2658         char       *portalname;         /* name of the portal (cursor) */
2659         int                     options;                /* bitmask of options (see above) */
2660         Node       *query;                      /* the query (see comments above) */
2661 } DeclareCursorStmt;
2662
2663 /* ----------------------
2664  *              Close Portal Statement
2665  * ----------------------
2666  */
2667 typedef struct ClosePortalStmt
2668 {
2669         NodeTag         type;
2670         char       *portalname;         /* name of the portal (cursor) */
2671         /* NULL means CLOSE ALL */
2672 } ClosePortalStmt;
2673
2674 /* ----------------------
2675  *              Fetch Statement (also Move)
2676  * ----------------------
2677  */
2678 typedef enum FetchDirection
2679 {
2680         /* for these, howMany is how many rows to fetch; FETCH_ALL means ALL */
2681         FETCH_FORWARD,
2682         FETCH_BACKWARD,
2683         /* for these, howMany indicates a position; only one row is fetched */
2684         FETCH_ABSOLUTE,
2685         FETCH_RELATIVE
2686 } FetchDirection;
2687
2688 #define FETCH_ALL       LONG_MAX
2689
2690 typedef struct FetchStmt
2691 {
2692         NodeTag         type;
2693         FetchDirection direction;       /* see above */
2694         long            howMany;                /* number of rows, or position argument */
2695         char       *portalname;         /* name of portal (cursor) */
2696         bool            ismove;                 /* true if MOVE */
2697 } FetchStmt;
2698
2699 /* ----------------------
2700  *              Create Index Statement
2701  *
2702  * This represents creation of an index and/or an associated constraint.
2703  * If isconstraint is true, we should create a pg_constraint entry along
2704  * with the index.  But if indexOid isn't InvalidOid, we are not creating an
2705  * index, just a UNIQUE/PKEY constraint using an existing index.  isconstraint
2706  * must always be true in this case, and the fields describing the index
2707  * properties are empty.
2708  *
2709  * The relation to build the index on can be represented either by name
2710  * (in which case the RangeVar indicates whether to recurse or not) or by OID
2711  * (in which case the command is always recursive).
2712  * ----------------------
2713  */
2714 typedef struct IndexStmt
2715 {
2716         NodeTag         type;
2717         char       *idxname;            /* name of new index, or NULL for default */
2718         RangeVar   *relation;           /* relation to build index on */
2719         Oid                     relationId;             /* OID of relation to build index on */
2720         char       *accessMethod;       /* name of access method (eg. btree) */
2721         char       *tableSpace;         /* tablespace, or NULL for default */
2722         List       *indexParams;        /* columns to index: a list of IndexElem */
2723         List       *indexIncludingParams;       /* additional columns to index: a list
2724                                                                                  * of IndexElem */
2725         List       *options;            /* WITH clause options: a list of DefElem */
2726         Node       *whereClause;        /* qualification (partial-index predicate) */
2727         List       *excludeOpNames; /* exclusion operator names, or NIL if none */
2728         char       *idxcomment;         /* comment to apply to index, or NULL */
2729         Oid                     indexOid;               /* OID of an existing index, if any */
2730         Oid                     oldNode;                /* relfilenode of existing storage, if any */
2731         bool            unique;                 /* is index unique? */
2732         bool            primary;                /* is index a primary key? */
2733         bool            isconstraint;   /* is it for a pkey/unique constraint? */
2734         bool            deferrable;             /* is the constraint DEFERRABLE? */
2735         bool            initdeferred;   /* is the constraint INITIALLY DEFERRED? */
2736         bool            transformed;    /* true when transformIndexStmt is finished */
2737         bool            concurrent;             /* should this be a concurrent index build? */
2738         bool            if_not_exists;  /* just do nothing if index already exists? */
2739 } IndexStmt;
2740
2741 /* ----------------------
2742  *              Create Statistics Statement
2743  * ----------------------
2744  */
2745 typedef struct CreateStatsStmt
2746 {
2747         NodeTag         type;
2748         List       *defnames;           /* qualified name (list of Value strings) */
2749         List       *stat_types;         /* stat types (list of Value strings) */
2750         List       *exprs;                      /* expressions to build statistics on */
2751         List       *relations;          /* rels to build stats on (list of RangeVar) */
2752         char       *stxcomment;         /* comment to apply to stats, or NULL */
2753         bool            if_not_exists;  /* do nothing if stats name already exists */
2754 } CreateStatsStmt;
2755
2756 /* ----------------------
2757  *              Create Function Statement
2758  * ----------------------
2759  */
2760 typedef struct CreateFunctionStmt
2761 {
2762         NodeTag         type;
2763         bool            is_procedure;   /* it's really CREATE PROCEDURE */
2764         bool            replace;                /* T => replace if already exists */
2765         List       *funcname;           /* qualified name of function to create */
2766         List       *parameters;         /* a list of FunctionParameter */
2767         TypeName   *returnType;         /* the return type */
2768         List       *options;            /* a list of DefElem */
2769 } CreateFunctionStmt;
2770
2771 typedef enum FunctionParameterMode
2772 {
2773         /* the assigned enum values appear in pg_proc, don't change 'em! */
2774         FUNC_PARAM_IN = 'i',            /* input only */
2775         FUNC_PARAM_OUT = 'o',           /* output only */
2776         FUNC_PARAM_INOUT = 'b',         /* both */
2777         FUNC_PARAM_VARIADIC = 'v',      /* variadic (always input) */
2778         FUNC_PARAM_TABLE = 't'          /* table function output column */
2779 } FunctionParameterMode;
2780
2781 typedef struct FunctionParameter
2782 {
2783         NodeTag         type;
2784         char       *name;                       /* parameter name, or NULL if not given */
2785         TypeName   *argType;            /* TypeName for parameter type */
2786         FunctionParameterMode mode; /* IN/OUT/etc */
2787         Node       *defexpr;            /* raw default expr, or NULL if not given */
2788 } FunctionParameter;
2789
2790 typedef struct AlterFunctionStmt
2791 {
2792         NodeTag         type;
2793         ObjectType      objtype;
2794         ObjectWithArgs *func;           /* name and args of function */
2795         List       *actions;            /* list of DefElem */
2796 } AlterFunctionStmt;
2797
2798 /* ----------------------
2799  *              DO Statement
2800  *
2801  * DoStmt is the raw parser output, InlineCodeBlock is the execution-time API
2802  * ----------------------
2803  */
2804 typedef struct DoStmt
2805 {
2806         NodeTag         type;
2807         List       *args;                       /* List of DefElem nodes */
2808 } DoStmt;
2809
2810 typedef struct InlineCodeBlock
2811 {
2812         NodeTag         type;
2813         char       *source_text;        /* source text of anonymous code block */
2814         Oid                     langOid;                /* OID of selected language */
2815         bool            langIsTrusted;  /* trusted property of the language */
2816         bool            atomic;                 /* atomic execution context */
2817 } InlineCodeBlock;
2818
2819 /* ----------------------
2820  *              CALL statement
2821  * ----------------------
2822  */
2823 typedef struct CallStmt
2824 {
2825         NodeTag         type;
2826         FuncCall   *funccall;           /* from the parser */
2827         FuncExpr   *funcexpr;           /* transformed */
2828 } CallStmt;
2829
2830 typedef struct CallContext
2831 {
2832         NodeTag         type;
2833         bool            atomic;
2834 } CallContext;
2835
2836 /* ----------------------
2837  *              Alter Object Rename Statement
2838  * ----------------------
2839  */
2840 typedef struct RenameStmt
2841 {
2842         NodeTag         type;
2843         ObjectType      renameType;             /* OBJECT_TABLE, OBJECT_COLUMN, etc */
2844         ObjectType      relationType;   /* if column name, associated relation type */
2845         RangeVar   *relation;           /* in case it's a table */
2846         Node       *object;                     /* in case it's some other object */
2847         char       *subname;            /* name of contained object (column, rule,
2848                                                                  * trigger, etc) */
2849         char       *newname;            /* the new name */
2850         DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
2851         bool            missing_ok;             /* skip error if missing? */
2852 } RenameStmt;
2853
2854 /* ----------------------
2855  * ALTER object DEPENDS ON EXTENSION extname
2856  * ----------------------
2857  */
2858 typedef struct AlterObjectDependsStmt
2859 {
2860         NodeTag         type;
2861         ObjectType      objectType;             /* OBJECT_FUNCTION, OBJECT_TRIGGER, etc */
2862         RangeVar   *relation;           /* in case a table is involved */
2863         Node       *object;                     /* name of the object */
2864         Value      *extname;            /* extension name */
2865 } AlterObjectDependsStmt;
2866
2867 /* ----------------------
2868  *              ALTER object SET SCHEMA Statement
2869  * ----------------------
2870  */
2871 typedef struct AlterObjectSchemaStmt
2872 {
2873         NodeTag         type;
2874         ObjectType      objectType;             /* OBJECT_TABLE, OBJECT_TYPE, etc */
2875         RangeVar   *relation;           /* in case it's a table */
2876         Node       *object;                     /* in case it's some other object */
2877         char       *newschema;          /* the new schema */
2878         bool            missing_ok;             /* skip error if missing? */
2879 } AlterObjectSchemaStmt;
2880
2881 /* ----------------------
2882  *              Alter Object Owner Statement
2883  * ----------------------
2884  */
2885 typedef struct AlterOwnerStmt
2886 {
2887         NodeTag         type;
2888         ObjectType      objectType;             /* OBJECT_TABLE, OBJECT_TYPE, etc */
2889         RangeVar   *relation;           /* in case it's a table */
2890         Node       *object;                     /* in case it's some other object */
2891         RoleSpec   *newowner;           /* the new owner */
2892 } AlterOwnerStmt;
2893
2894
2895 /* ----------------------
2896  *              Alter Operator Set Restrict, Join
2897  * ----------------------
2898  */
2899 typedef struct AlterOperatorStmt
2900 {
2901         NodeTag         type;
2902         ObjectWithArgs *opername;       /* operator name and argument types */
2903         List       *options;            /* List of DefElem nodes */
2904 } AlterOperatorStmt;
2905
2906
2907 /* ----------------------
2908  *              Create Rule Statement
2909  * ----------------------
2910  */
2911 typedef struct RuleStmt
2912 {
2913         NodeTag         type;
2914         RangeVar   *relation;           /* relation the rule is for */
2915         char       *rulename;           /* name of the rule */
2916         Node       *whereClause;        /* qualifications */
2917         CmdType         event;                  /* SELECT, INSERT, etc */
2918         bool            instead;                /* is a 'do instead'? */
2919         List       *actions;            /* the action statements */
2920         bool            replace;                /* OR REPLACE */
2921 } RuleStmt;
2922
2923 /* ----------------------
2924  *              Notify Statement
2925  * ----------------------
2926  */
2927 typedef struct NotifyStmt
2928 {
2929         NodeTag         type;
2930         char       *conditionname;      /* condition name to notify */
2931         char       *payload;            /* the payload string, or NULL if none */
2932 } NotifyStmt;
2933
2934 /* ----------------------
2935  *              Listen Statement
2936  * ----------------------
2937  */
2938 typedef struct ListenStmt
2939 {
2940         NodeTag         type;
2941         char       *conditionname;      /* condition name to listen on */
2942 } ListenStmt;
2943
2944 /* ----------------------
2945  *              Unlisten Statement
2946  * ----------------------
2947  */
2948 typedef struct UnlistenStmt
2949 {
2950         NodeTag         type;
2951         char       *conditionname;      /* name to unlisten on, or NULL for all */
2952 } UnlistenStmt;
2953
2954 /* ----------------------
2955  *              {Begin|Commit|Rollback} Transaction Statement
2956  * ----------------------
2957  */
2958 typedef enum TransactionStmtKind
2959 {
2960         TRANS_STMT_BEGIN,
2961         TRANS_STMT_START,                       /* semantically identical to BEGIN */
2962         TRANS_STMT_COMMIT,
2963         TRANS_STMT_ROLLBACK,
2964         TRANS_STMT_SAVEPOINT,
2965         TRANS_STMT_RELEASE,
2966         TRANS_STMT_ROLLBACK_TO,
2967         TRANS_STMT_PREPARE,
2968         TRANS_STMT_COMMIT_PREPARED,
2969         TRANS_STMT_ROLLBACK_PREPARED
2970 } TransactionStmtKind;
2971
2972 typedef struct TransactionStmt
2973 {
2974         NodeTag         type;
2975         TransactionStmtKind kind;       /* see above */
2976         List       *options;            /* for BEGIN/START commands */
2977         char       *savepoint_name; /* for savepoint commands */
2978         char       *gid;                        /* for two-phase-commit related commands */
2979 } TransactionStmt;
2980
2981 /* ----------------------
2982  *              Create Type Statement, composite types
2983  * ----------------------
2984  */
2985 typedef struct CompositeTypeStmt
2986 {
2987         NodeTag         type;
2988         RangeVar   *typevar;            /* the composite type to be created */
2989         List       *coldeflist;         /* list of ColumnDef nodes */
2990 } CompositeTypeStmt;
2991
2992 /* ----------------------
2993  *              Create Type Statement, enum types
2994  * ----------------------
2995  */
2996 typedef struct CreateEnumStmt
2997 {
2998         NodeTag         type;
2999         List       *typeName;           /* qualified name (list of Value strings) */
3000         List       *vals;                       /* enum values (list of Value strings) */
3001 } CreateEnumStmt;
3002
3003 /* ----------------------
3004  *              Create Type Statement, range types
3005  * ----------------------
3006  */
3007 typedef struct CreateRangeStmt
3008 {
3009         NodeTag         type;
3010         List       *typeName;           /* qualified name (list of Value strings) */
3011         List       *params;                     /* range parameters (list of DefElem) */
3012 } CreateRangeStmt;
3013
3014 /* ----------------------
3015  *              Alter Type Statement, enum types
3016  * ----------------------
3017  */
3018 typedef struct AlterEnumStmt
3019 {
3020         NodeTag         type;
3021         List       *typeName;           /* qualified name (list of Value strings) */
3022         char       *oldVal;                     /* old enum value's name, if renaming */
3023         char       *newVal;                     /* new enum value's name */
3024         char       *newValNeighbor; /* neighboring enum value, if specified */
3025         bool            newValIsAfter;  /* place new enum value after neighbor? */
3026         bool            skipIfNewValExists; /* no error if new already exists? */
3027 } AlterEnumStmt;
3028
3029 /* ----------------------
3030  *              Create View Statement
3031  * ----------------------
3032  */
3033 typedef enum ViewCheckOption
3034 {
3035         NO_CHECK_OPTION,
3036         LOCAL_CHECK_OPTION,
3037         CASCADED_CHECK_OPTION
3038 } ViewCheckOption;
3039
3040 typedef struct ViewStmt
3041 {
3042         NodeTag         type;
3043         RangeVar   *view;                       /* the view to be created */
3044         List       *aliases;            /* target column names */
3045         Node       *query;                      /* the SELECT query (as a raw parse tree) */
3046         bool            replace;                /* replace an existing view? */
3047         List       *options;            /* options from WITH clause */
3048         ViewCheckOption withCheckOption;        /* WITH CHECK OPTION */
3049 } ViewStmt;
3050
3051 /* ----------------------
3052  *              Load Statement
3053  * ----------------------
3054  */
3055 typedef struct LoadStmt
3056 {
3057         NodeTag         type;
3058         char       *filename;           /* file to load */
3059 } LoadStmt;
3060
3061 /* ----------------------
3062  *              Createdb Statement
3063  * ----------------------
3064  */
3065 typedef struct CreatedbStmt
3066 {
3067         NodeTag         type;
3068         char       *dbname;                     /* name of database to create */
3069         List       *options;            /* List of DefElem nodes */
3070 } CreatedbStmt;
3071
3072 /* ----------------------
3073  *      Alter Database
3074  * ----------------------
3075  */
3076 typedef struct AlterDatabaseStmt
3077 {
3078         NodeTag         type;
3079         char       *dbname;                     /* name of database to alter */
3080         List       *options;            /* List of DefElem nodes */
3081 } AlterDatabaseStmt;
3082
3083 typedef struct AlterDatabaseSetStmt
3084 {
3085         NodeTag         type;
3086         char       *dbname;                     /* database name */
3087         VariableSetStmt *setstmt;       /* SET or RESET subcommand */
3088 } AlterDatabaseSetStmt;
3089
3090 /* ----------------------
3091  *              Dropdb Statement
3092  * ----------------------
3093  */
3094 typedef struct DropdbStmt
3095 {
3096         NodeTag         type;
3097         char       *dbname;                     /* database to drop */
3098         bool            missing_ok;             /* skip error if db is missing? */
3099 } DropdbStmt;
3100
3101 /* ----------------------
3102  *              Alter System Statement
3103  * ----------------------
3104  */
3105 typedef struct AlterSystemStmt
3106 {
3107         NodeTag         type;
3108         VariableSetStmt *setstmt;       /* SET subcommand */
3109 } AlterSystemStmt;
3110
3111 /* ----------------------
3112  *              Cluster Statement (support pbrown's cluster index implementation)
3113  * ----------------------
3114  */
3115 typedef struct ClusterStmt
3116 {
3117         NodeTag         type;
3118         RangeVar   *relation;           /* relation being indexed, or NULL if all */
3119         char       *indexname;          /* original index defined */
3120         bool            verbose;                /* print progress info */
3121 } ClusterStmt;
3122
3123 /* ----------------------
3124  *              Vacuum and Analyze Statements
3125  *
3126  * Even though these are nominally two statements, it's convenient to use
3127  * just one node type for both.  Note that at least one of VACOPT_VACUUM
3128  * and VACOPT_ANALYZE must be set in options.
3129  * ----------------------
3130  */
3131 typedef enum VacuumOption
3132 {
3133         VACOPT_VACUUM = 1 << 0,         /* do VACUUM */
3134         VACOPT_ANALYZE = 1 << 1,        /* do ANALYZE */
3135         VACOPT_VERBOSE = 1 << 2,        /* print progress info */
3136         VACOPT_FREEZE = 1 << 3,         /* FREEZE option */
3137         VACOPT_FULL = 1 << 4,           /* FULL (non-concurrent) vacuum */
3138         VACOPT_SKIP_LOCKED = 1 << 5,    /* skip if cannot get lock (autovacuum
3139                                                                          * only) */
3140         VACOPT_SKIPTOAST = 1 << 6,      /* don't process the TOAST table, if any */
3141         VACOPT_DISABLE_PAGE_SKIPPING = 1 << 7   /* don't skip any pages */
3142 } VacuumOption;
3143
3144 /*
3145  * Info about a single target table of VACUUM/ANALYZE.
3146  *
3147  * If the OID field is set, it always identifies the table to process.
3148  * Then the relation field can be NULL; if it isn't, it's used only to report
3149  * failure to open/lock the relation.
3150  */
3151 typedef struct VacuumRelation
3152 {
3153         NodeTag         type;
3154         RangeVar   *relation;           /* table name to process, or NULL */
3155         Oid                     oid;                    /* table's OID; InvalidOid if not looked up */
3156         List       *va_cols;            /* list of column names, or NIL for all */
3157 } VacuumRelation;
3158
3159 typedef struct VacuumStmt
3160 {
3161         NodeTag         type;
3162         int                     options;                /* OR of VacuumOption flags */
3163         List       *rels;                       /* list of VacuumRelation, or NIL for all */
3164 } VacuumStmt;
3165
3166 /* ----------------------
3167  *              Explain Statement
3168  *
3169  * The "query" field is initially a raw parse tree, and is converted to a
3170  * Query node during parse analysis.  Note that rewriting and planning
3171  * of the query are always postponed until execution.
3172  * ----------------------
3173  */
3174 typedef struct ExplainStmt
3175 {
3176         NodeTag         type;
3177         Node       *query;                      /* the query (see comments above) */
3178         List       *options;            /* list of DefElem nodes */
3179 } ExplainStmt;
3180
3181 /* ----------------------
3182  *              CREATE TABLE AS Statement (a/k/a SELECT INTO)
3183  *
3184  * A query written as CREATE TABLE AS will produce this node type natively.
3185  * A query written as SELECT ... INTO will be transformed to this form during
3186  * parse analysis.
3187  * A query written as CREATE MATERIALIZED view will produce this node type,
3188  * during parse analysis, since it needs all the same data.
3189  *
3190  * The "query" field is handled similarly to EXPLAIN, though note that it
3191  * can be a SELECT or an EXECUTE, but not other DML statements.
3192  * ----------------------
3193  */
3194 typedef struct CreateTableAsStmt
3195 {
3196         NodeTag         type;
3197         Node       *query;                      /* the query (see comments above) */
3198         IntoClause *into;                       /* destination table */
3199         ObjectType      relkind;                /* OBJECT_TABLE or OBJECT_MATVIEW */
3200         bool            is_select_into; /* it was written as SELECT INTO */
3201         bool            if_not_exists;  /* just do nothing if it already exists? */
3202 } CreateTableAsStmt;
3203
3204 /* ----------------------
3205  *              REFRESH MATERIALIZED VIEW Statement
3206  * ----------------------
3207  */
3208 typedef struct RefreshMatViewStmt
3209 {
3210         NodeTag         type;
3211         bool            concurrent;             /* allow concurrent access? */
3212         bool            skipData;               /* true for WITH NO DATA */
3213         RangeVar   *relation;           /* relation to insert into */
3214 } RefreshMatViewStmt;
3215
3216 /* ----------------------
3217  * Checkpoint Statement
3218  * ----------------------
3219  */
3220 typedef struct CheckPointStmt
3221 {
3222         NodeTag         type;
3223 } CheckPointStmt;
3224
3225 /* ----------------------
3226  * Discard Statement
3227  * ----------------------
3228  */
3229
3230 typedef enum DiscardMode
3231 {
3232         DISCARD_ALL,
3233         DISCARD_PLANS,
3234         DISCARD_SEQUENCES,
3235         DISCARD_TEMP
3236 } DiscardMode;
3237
3238 typedef struct DiscardStmt
3239 {
3240         NodeTag         type;
3241         DiscardMode target;
3242 } DiscardStmt;
3243
3244 /* ----------------------
3245  *              LOCK Statement
3246  * ----------------------
3247  */
3248 typedef struct LockStmt
3249 {
3250         NodeTag         type;
3251         List       *relations;          /* relations to lock */
3252         int                     mode;                   /* lock mode */
3253         bool            nowait;                 /* no wait mode */
3254 } LockStmt;
3255
3256 /* ----------------------
3257  *              SET CONSTRAINTS Statement
3258  * ----------------------
3259  */
3260 typedef struct ConstraintsSetStmt
3261 {
3262         NodeTag         type;
3263         List       *constraints;        /* List of names as RangeVars */
3264         bool            deferred;
3265 } ConstraintsSetStmt;
3266
3267 /* ----------------------
3268  *              REINDEX Statement
3269  * ----------------------
3270  */
3271
3272 /* Reindex options */
3273 #define REINDEXOPT_VERBOSE 1 << 0       /* print progress info */
3274
3275 typedef enum ReindexObjectType
3276 {
3277         REINDEX_OBJECT_INDEX,           /* index */
3278         REINDEX_OBJECT_TABLE,           /* table or materialized view */
3279         REINDEX_OBJECT_SCHEMA,          /* schema */
3280         REINDEX_OBJECT_SYSTEM,          /* system catalogs */
3281         REINDEX_OBJECT_DATABASE         /* database */
3282 } ReindexObjectType;
3283
3284 typedef struct ReindexStmt
3285 {
3286         NodeTag         type;
3287         ReindexObjectType kind;         /* REINDEX_OBJECT_INDEX, REINDEX_OBJECT_TABLE,
3288                                                                  * etc. */
3289         RangeVar   *relation;           /* Table or index to reindex */
3290         const char *name;                       /* name of database to reindex */
3291         int                     options;                /* Reindex options flags */
3292 } ReindexStmt;
3293
3294 /* ----------------------
3295  *              CREATE CONVERSION Statement
3296  * ----------------------
3297  */
3298 typedef struct CreateConversionStmt
3299 {
3300         NodeTag         type;
3301         List       *conversion_name;    /* Name of the conversion */
3302         char       *for_encoding_name;  /* source encoding name */
3303         char       *to_encoding_name;   /* destination encoding name */
3304         List       *func_name;          /* qualified conversion function name */
3305         bool            def;                    /* is this a default conversion? */
3306 } CreateConversionStmt;
3307
3308 /* ----------------------
3309  *      CREATE CAST Statement
3310  * ----------------------
3311  */
3312 typedef struct CreateCastStmt
3313 {
3314         NodeTag         type;
3315         TypeName   *sourcetype;
3316         TypeName   *targettype;
3317         ObjectWithArgs *func;
3318         CoercionContext context;
3319         bool            inout;
3320 } CreateCastStmt;
3321
3322 /* ----------------------
3323  *      CREATE TRANSFORM Statement
3324  * ----------------------
3325  */
3326 typedef struct CreateTransformStmt
3327 {
3328         NodeTag         type;
3329         bool            replace;
3330         TypeName   *type_name;
3331         char       *lang;
3332         ObjectWithArgs *fromsql;
3333         ObjectWithArgs *tosql;
3334 } CreateTransformStmt;
3335
3336 /* ----------------------
3337  *              PREPARE Statement
3338  * ----------------------
3339  */
3340 typedef struct PrepareStmt
3341 {
3342         NodeTag         type;
3343         char       *name;                       /* Name of plan, arbitrary */
3344         List       *argtypes;           /* Types of parameters (List of TypeName) */
3345         Node       *query;                      /* The query itself (as a raw parsetree) */
3346 } PrepareStmt;
3347
3348
3349 /* ----------------------
3350  *              EXECUTE Statement
3351  * ----------------------
3352  */
3353
3354 typedef struct ExecuteStmt
3355 {
3356         NodeTag         type;
3357         char       *name;                       /* The name of the plan to execute */
3358         List       *params;                     /* Values to assign to parameters */
3359 } ExecuteStmt;
3360
3361
3362 /* ----------------------
3363  *              DEALLOCATE Statement
3364  * ----------------------
3365  */
3366 typedef struct DeallocateStmt
3367 {
3368         NodeTag         type;
3369         char       *name;                       /* The name of the plan to remove */
3370         /* NULL means DEALLOCATE ALL */
3371 } DeallocateStmt;
3372
3373 /*
3374  *              DROP OWNED statement
3375  */
3376 typedef struct DropOwnedStmt
3377 {
3378         NodeTag         type;
3379         List       *roles;
3380         DropBehavior behavior;
3381 } DropOwnedStmt;
3382
3383 /*
3384  *              REASSIGN OWNED statement
3385  */
3386 typedef struct ReassignOwnedStmt
3387 {
3388         NodeTag         type;
3389         List       *roles;
3390         RoleSpec   *newrole;
3391 } ReassignOwnedStmt;
3392
3393 /*
3394  * TS Dictionary stmts: DefineStmt, RenameStmt and DropStmt are default
3395  */
3396 typedef struct AlterTSDictionaryStmt
3397 {
3398         NodeTag         type;
3399         List       *dictname;           /* qualified name (list of Value strings) */
3400         List       *options;            /* List of DefElem nodes */
3401 } AlterTSDictionaryStmt;
3402
3403 /*
3404  * TS Configuration stmts: DefineStmt, RenameStmt and DropStmt are default
3405  */
3406 typedef enum AlterTSConfigType
3407 {
3408         ALTER_TSCONFIG_ADD_MAPPING,
3409         ALTER_TSCONFIG_ALTER_MAPPING_FOR_TOKEN,
3410         ALTER_TSCONFIG_REPLACE_DICT,
3411         ALTER_TSCONFIG_REPLACE_DICT_FOR_TOKEN,
3412         ALTER_TSCONFIG_DROP_MAPPING
3413 } AlterTSConfigType;
3414
3415 typedef struct AlterTSConfigurationStmt
3416 {
3417         NodeTag         type;
3418         AlterTSConfigType kind;         /* ALTER_TSCONFIG_ADD_MAPPING, etc */
3419         List       *cfgname;            /* qualified name (list of Value strings) */
3420
3421         /*
3422          * dicts will be non-NIL if ADD/ALTER MAPPING was specified. If dicts is
3423          * NIL, but tokentype isn't, DROP MAPPING was specified.
3424          */
3425         List       *tokentype;          /* list of Value strings */
3426         List       *dicts;                      /* list of list of Value strings */
3427         bool            override;               /* if true - remove old variant */
3428         bool            replace;                /* if true - replace dictionary by another */
3429         bool            missing_ok;             /* for DROP - skip error if missing? */
3430 } AlterTSConfigurationStmt;
3431
3432
3433 typedef struct CreatePublicationStmt
3434 {
3435         NodeTag         type;
3436         char       *pubname;            /* Name of the publication */
3437         List       *options;            /* List of DefElem nodes */
3438         List       *tables;                     /* Optional list of tables to add */
3439         bool            for_all_tables; /* Special publication for all tables in db */
3440 } CreatePublicationStmt;
3441
3442 typedef struct AlterPublicationStmt
3443 {
3444         NodeTag         type;
3445         char       *pubname;            /* Name of the publication */
3446
3447         /* parameters used for ALTER PUBLICATION ... WITH */
3448         List       *options;            /* List of DefElem nodes */
3449
3450         /* parameters used for ALTER PUBLICATION ... ADD/DROP TABLE */
3451         List       *tables;                     /* List of tables to add/drop */
3452         bool            for_all_tables; /* Special publication for all tables in db */
3453         DefElemAction tableAction;      /* What action to perform with the tables */
3454 } AlterPublicationStmt;
3455
3456 typedef struct CreateSubscriptionStmt
3457 {
3458         NodeTag         type;
3459         char       *subname;            /* Name of the subscription */
3460         char       *conninfo;           /* Connection string to publisher */
3461         List       *publication;        /* One or more publication to subscribe to */
3462         List       *options;            /* List of DefElem nodes */
3463 } CreateSubscriptionStmt;
3464
3465 typedef enum AlterSubscriptionType
3466 {
3467         ALTER_SUBSCRIPTION_OPTIONS,
3468         ALTER_SUBSCRIPTION_CONNECTION,
3469         ALTER_SUBSCRIPTION_PUBLICATION,
3470         ALTER_SUBSCRIPTION_REFRESH,
3471         ALTER_SUBSCRIPTION_ENABLED
3472 } AlterSubscriptionType;
3473
3474 typedef struct AlterSubscriptionStmt
3475 {
3476         NodeTag         type;
3477         AlterSubscriptionType kind; /* ALTER_SUBSCRIPTION_OPTIONS, etc */
3478         char       *subname;            /* Name of the subscription */
3479         char       *conninfo;           /* Connection string to publisher */
3480         List       *publication;        /* One or more publication to subscribe to */
3481         List       *options;            /* List of DefElem nodes */
3482 } AlterSubscriptionStmt;
3483
3484 typedef struct DropSubscriptionStmt
3485 {
3486         NodeTag         type;
3487         char       *subname;            /* Name of the subscription */
3488         bool            missing_ok;             /* Skip error if missing? */
3489         DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
3490 } DropSubscriptionStmt;
3491
3492 #endif                                                  /* PARSENODES_H */