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-2017, PostgreSQL Global Development PGGroup |
16 | * Portions Copyright (c) 1994, Regents of the University of California |
17 | * |
18 | * src/include/nodes/parsenodes.h |
19 | * |
20 | *------------------------------------------------------------------------- |
21 | */ |
22 | #pragma once |
23 | |
24 | #include "nodes/bitmapset.hpp" |
25 | #include "nodes/lockoptions.hpp" |
26 | #include "nodes/primnodes.hpp" |
27 | #include "nodes/value.hpp" |
28 | |
29 | namespace duckdb_libpgquery { |
30 | |
31 | typedef enum PGOverridingKind { |
32 | PG_OVERRIDING_NOT_SET = 0, |
33 | PG_OVERRIDING_USER_VALUE, |
34 | OVERRIDING_SYSTEM_VALUE |
35 | } PGOverridingKind; |
36 | |
37 | /* Possible sources of a PGQuery */ |
38 | typedef enum PGQuerySource { |
39 | PG_QSRC_ORIGINAL, /* original parsetree (explicit query) */ |
40 | PG_QSRC_PARSER, /* added by parse analysis (now unused) */ |
41 | PG_QSRC_INSTEAD_RULE, /* added by unconditional INSTEAD rule */ |
42 | PG_QSRC_QUAL_INSTEAD_RULE, /* added by conditional INSTEAD rule */ |
43 | QSRC_NON_INSTEAD_RULE /* added by non-INSTEAD rule */ |
44 | } PGQuerySource; |
45 | |
46 | /* PGSort ordering options for ORDER BY and CREATE INDEX */ |
47 | typedef enum PGSortByDir { |
48 | PG_SORTBY_DEFAULT, |
49 | PG_SORTBY_ASC, |
50 | PG_SORTBY_DESC, |
51 | SORTBY_USING /* not allowed in CREATE INDEX ... */ |
52 | } PGSortByDir; |
53 | |
54 | typedef enum PGSortByNulls { PG_SORTBY_NULLS_DEFAULT, PG_SORTBY_NULLS_FIRST, PG_SORTBY_NULLS_LAST } PGSortByNulls; |
55 | |
56 | /***************************************************************************** |
57 | * PGQuery Tree |
58 | *****************************************************************************/ |
59 | |
60 | /* |
61 | * PGQuery - |
62 | * Parse analysis turns all statements into a PGQuery tree |
63 | * for further processing by the rewriter and planner. |
64 | * |
65 | * Utility statements (i.e. non-optimizable statements) have the |
66 | * utilityStmt field set, and the rest of the PGQuery is mostly dummy. |
67 | * |
68 | * Planning converts a PGQuery tree into a PGPlan tree headed by a PGPlannedStmt |
69 | * node --- the PGQuery structure is not used by the executor. |
70 | */ |
71 | typedef struct PGQuery { |
72 | PGNodeTag type; |
73 | |
74 | PGCmdType commandType; /* select|insert|update|delete|utility */ |
75 | |
76 | PGQuerySource querySource; /* where did I come from? */ |
77 | |
78 | uint32_t queryId; /* query identifier (can be set by plugins) */ |
79 | |
80 | bool canSetTag; /* do I set the command result tag? */ |
81 | |
82 | PGNode *utilityStmt; /* non-null if commandType == PG_CMD_UTILITY */ |
83 | |
84 | int resultRelation; /* rtable index of target relation for |
85 | * INSERT/UPDATE/DELETE; 0 for SELECT */ |
86 | |
87 | bool hasAggs; /* has aggregates in tlist or havingQual */ |
88 | bool hasWindowFuncs; /* has window functions in tlist */ |
89 | bool hasTargetSRFs; /* has set-returning functions in tlist */ |
90 | bool hasSubLinks; /* has subquery PGSubLink */ |
91 | bool hasDistinctOn; /* distinctClause is from DISTINCT ON */ |
92 | bool hasRecursive; /* WITH RECURSIVE was specified */ |
93 | bool hasModifyingCTE; /* has INSERT/UPDATE/DELETE in WITH */ |
94 | bool hasForUpdate; /* FOR [KEY] UPDATE/SHARE was specified */ |
95 | bool hasRowSecurity; /* rewriter has applied some RLS policy */ |
96 | |
97 | PGList *cteList; /* WITH list (of CommonTableExpr's) */ |
98 | |
99 | PGList *rtable; /* list of range table entries */ |
100 | PGFromExpr *jointree; /* table join tree (FROM and WHERE clauses) */ |
101 | |
102 | PGList *targetList; /* target list (of PGTargetEntry) */ |
103 | |
104 | PGOverridingKind override; /* OVERRIDING clause */ |
105 | |
106 | PGOnConflictExpr *onConflict; /* ON CONFLICT DO [NOTHING | UPDATE] */ |
107 | |
108 | PGList *returningList; /* return-values list (of PGTargetEntry) */ |
109 | |
110 | PGList *groupClause; /* a list of SortGroupClause's */ |
111 | |
112 | PGList *groupingSets; /* a list of GroupingSet's if present */ |
113 | |
114 | PGNode *havingQual; /* qualifications applied to groups */ |
115 | |
116 | PGList *windowClause; /* a list of WindowClause's */ |
117 | |
118 | PGList *distinctClause; /* a list of SortGroupClause's */ |
119 | |
120 | PGList *sortClause; /* a list of SortGroupClause's */ |
121 | |
122 | PGNode *limitOffset; /* # of result tuples to skip (int8_t expr) */ |
123 | PGNode *limitCount; /* # of result tuples to return (int8_t expr) */ |
124 | |
125 | PGList *rowMarks; /* a list of RowMarkClause's */ |
126 | |
127 | PGNode *setOperations; /* set-operation tree if this is top level of |
128 | * a UNION/INTERSECT/EXCEPT query */ |
129 | |
130 | PGList *constraintDeps; /* a list of pg_constraint OIDs that the query |
131 | * depends on to be semantically valid */ |
132 | |
133 | PGList *withCheckOptions; /* a list of WithCheckOption's, which are |
134 | * only added during rewrite and therefore |
135 | * are not written out as part of Query. */ |
136 | |
137 | /* |
138 | * The following two fields identify the portion of the source text string |
139 | * containing this query. They are typically only populated in top-level |
140 | * Queries, not in sub-queries. When not set, they might both be zero, or |
141 | * both be -1 meaning "unknown". |
142 | */ |
143 | int stmt_location; /* start location, or -1 if unknown */ |
144 | int stmt_len; /* length in bytes; 0 means "rest of string" */ |
145 | } PGQuery; |
146 | |
147 | /**************************************************************************** |
148 | * Supporting data structures for Parse Trees |
149 | * |
150 | * Most of these node types appear in raw parsetrees output by the grammar, |
151 | * and get transformed to something else by the analyzer. A few of them |
152 | * are used as-is in transformed querytrees. |
153 | ****************************************************************************/ |
154 | |
155 | /* |
156 | * PGTypeName - specifies a type in definitions |
157 | * |
158 | * For PGTypeName structures generated internally, it is often easier to |
159 | * specify the type by OID than by name. If "names" is NIL then the |
160 | * actual type OID is given by typeOid, otherwise typeOid is unused. |
161 | * Similarly, if "typmods" is NIL then the actual typmod is expected to |
162 | * be prespecified in typemod, otherwise typemod is unused. |
163 | * |
164 | * If pct_type is true, then names is actually a field name and we look up |
165 | * the type of that field. Otherwise (the normal case), names is a type |
166 | * name possibly qualified with schema and database name. |
167 | */ |
168 | typedef struct PGTypeName { |
169 | PGNodeTag type; |
170 | PGList *names; /* qualified name (list of PGValue strings) */ |
171 | PGOid typeOid; /* type identified by OID */ |
172 | bool setof; /* is a set? */ |
173 | bool pct_type; /* %TYPE specified? */ |
174 | PGList *typmods; /* type modifier expression(s) */ |
175 | int32_t typemod; /* prespecified type modifier */ |
176 | PGList *arrayBounds; /* array bounds */ |
177 | int location; /* token location, or -1 if unknown */ |
178 | } PGTypeName; |
179 | |
180 | /* |
181 | * PGColumnRef - specifies a reference to a column, or possibly a whole tuple |
182 | * |
183 | * The "fields" list must be nonempty. It can contain string PGValue nodes |
184 | * (representing names) and PGAStar nodes (representing occurrence of a '*'). |
185 | * Currently, PGAStar must appear only as the last list element --- the grammar |
186 | * is responsible for enforcing this! |
187 | * |
188 | * Note: any array subscripting or selection of fields from composite columns |
189 | * is represented by an PGAIndirection node above the ColumnRef. However, |
190 | * for simplicity in the normal case, initial field selection from a table |
191 | * name is represented within PGColumnRef and not by adding AIndirection. |
192 | */ |
193 | typedef struct PGColumnRef { |
194 | PGNodeTag type; |
195 | PGList *fields; /* field names (PGValue strings) or PGAStar */ |
196 | int location; /* token location, or -1 if unknown */ |
197 | } PGColumnRef; |
198 | |
199 | /* |
200 | * PGParamRef - specifies a $n parameter reference |
201 | */ |
202 | typedef struct PGParamRef { |
203 | PGNodeTag type; |
204 | int number; /* the number of the parameter */ |
205 | int location; /* token location, or -1 if unknown */ |
206 | char *name; /* optional name of the parameter */ |
207 | } PGParamRef; |
208 | |
209 | /* |
210 | * PGAExpr - infix, prefix, and postfix expressions |
211 | */ |
212 | typedef enum PGAExpr_Kind { |
213 | PG_AEXPR_OP, /* normal operator */ |
214 | PG_AEXPR_OP_ANY, /* scalar op ANY (array) */ |
215 | PG_AEXPR_OP_ALL, /* scalar op ALL (array) */ |
216 | PG_AEXPR_DISTINCT, /* IS DISTINCT FROM - name must be "=" */ |
217 | PG_AEXPR_NOT_DISTINCT, /* IS NOT DISTINCT FROM - name must be "=" */ |
218 | PG_AEXPR_NULLIF, /* NULLIF - name must be "=" */ |
219 | PG_AEXPR_OF, /* IS [NOT] OF - name must be "=" or "<>" */ |
220 | PG_AEXPR_IN, /* [NOT] IN - name must be "=" or "<>" */ |
221 | PG_AEXPR_LIKE, /* [NOT] LIKE - name must be "~~" or "!~~" */ |
222 | PG_AEXPR_ILIKE, /* [NOT] ILIKE - name must be "~~*" or "!~~*" */ |
223 | PG_AEXPR_GLOB, /* [NOT] GLOB - name must be "~~~" or "!~~~" */ |
224 | PG_AEXPR_SIMILAR, /* [NOT] SIMILAR - name must be "~" or "!~" */ |
225 | PG_AEXPR_BETWEEN, /* name must be "BETWEEN" */ |
226 | PG_AEXPR_NOT_BETWEEN, /* name must be "NOT BETWEEN" */ |
227 | PG_AEXPR_BETWEEN_SYM, /* name must be "BETWEEN SYMMETRIC" */ |
228 | PG_AEXPR_NOT_BETWEEN_SYM, /* name must be "NOT BETWEEN SYMMETRIC" */ |
229 | AEXPR_PAREN /* nameless dummy node for parentheses */ |
230 | } PGAExpr_Kind; |
231 | |
232 | typedef struct PGAExpr { |
233 | PGNodeTag type; |
234 | PGAExpr_Kind kind; /* see above */ |
235 | PGList *name; /* possibly-qualified name of operator */ |
236 | PGNode *lexpr; /* left argument, or NULL if none */ |
237 | PGNode *rexpr; /* right argument, or NULL if none */ |
238 | int location; /* token location, or -1 if unknown */ |
239 | } PGAExpr; |
240 | |
241 | /* |
242 | * PGAConst - a literal constant |
243 | */ |
244 | typedef struct PGAConst { |
245 | PGNodeTag type; |
246 | PGValue val; /* value (includes type info, see value.h) */ |
247 | int location; /* token location, or -1 if unknown */ |
248 | } PGAConst; |
249 | |
250 | /* |
251 | * PGTypeCast - a CAST expression |
252 | */ |
253 | typedef struct PGTypeCast { |
254 | PGNodeTag type; |
255 | PGNode *arg; /* the expression being casted */ |
256 | PGTypeName *typeName; /* the target type */ |
257 | int tryCast; /* TRY_CAST or CAST */ |
258 | int location; /* token location, or -1 if unknown */ |
259 | } PGTypeCast; |
260 | |
261 | /* |
262 | * PGCollateClause - a COLLATE expression |
263 | */ |
264 | typedef struct PGCollateClause { |
265 | PGNodeTag type; |
266 | PGNode *arg; /* input expression */ |
267 | PGList *collname; /* possibly-qualified collation name */ |
268 | int location; /* token location, or -1 if unknown */ |
269 | } PGCollateClause; |
270 | |
271 | /* |
272 | * PGFuncCall - a function or aggregate invocation |
273 | * |
274 | * agg_order (if not NIL) indicates we saw 'foo(... ORDER BY ...)', or if |
275 | * agg_within_group is true, it was 'foo(...) WITHIN GROUP (ORDER BY ...)'. |
276 | * agg_star indicates we saw a 'foo(*)' construct, while agg_distinct |
277 | * indicates we saw 'foo(DISTINCT ...)'. In any of these cases, the |
278 | * construct *must* be an aggregate call. Otherwise, it might be either an |
279 | * aggregate or some other kind of function. However, if FILTER or OVER is |
280 | * present it had better be an aggregate or window function. |
281 | * |
282 | * Normally, you'd initialize this via makeFuncCall() and then only change the |
283 | * parts of the struct its defaults don't match afterwards, as needed. |
284 | */ |
285 | typedef struct PGFuncCall { |
286 | PGNodeTag type; |
287 | PGList *funcname; /* qualified name of function */ |
288 | PGList *args; /* the arguments (list of exprs) */ |
289 | PGList *agg_order; /* ORDER BY (list of PGSortBy) */ |
290 | PGNode *agg_filter; /* FILTER clause, if any */ |
291 | bool export_state; /* EXPORT_STATE clause, if any */ |
292 | bool agg_within_group; /* ORDER BY appeared in WITHIN GROUP */ |
293 | bool agg_star; /* argument was really '*' */ |
294 | bool agg_distinct; /* arguments were labeled DISTINCT */ |
295 | bool agg_ignore_nulls; /* arguments were labeled IGNORE NULLS */ |
296 | bool func_variadic; /* last argument was labeled VARIADIC */ |
297 | struct PGWindowDef *over; /* OVER clause, if any */ |
298 | int location; /* token location, or -1 if unknown */ |
299 | } PGFuncCall; |
300 | |
301 | /* |
302 | * PGAStar - '*' representing all columns of a table or compound field |
303 | * |
304 | * This can appear within ColumnRef.fields, AIndirection.indirection, and |
305 | * ResTarget.indirection lists. |
306 | */ |
307 | typedef struct PGAStar { |
308 | PGNodeTag type; |
309 | char *relation; /* relation name (optional) */ |
310 | PGNode *expr; /* optional: the expression (regex or list) to select columns */ |
311 | PGList *except_list; /* optional: EXCLUDE list */ |
312 | PGList *replace_list; /* optional: REPLACE list */ |
313 | bool columns; /* whether or not this is a columns list */ |
314 | int location; |
315 | } PGAStar; |
316 | |
317 | /* |
318 | * PGAIndices - array subscript or slice bounds ([idx] or [lidx:uidx]) |
319 | * |
320 | * In slice case, either or both of lidx and uidx can be NULL (omitted). |
321 | * In non-slice case, uidx holds the single subscript and lidx is always NULL. |
322 | */ |
323 | typedef struct PGAIndices { |
324 | PGNodeTag type; |
325 | bool is_slice; /* true if slice (i.e., colon present) */ |
326 | PGNode *lidx; /* slice lower bound, if any */ |
327 | PGNode *uidx; /* subscript, or slice upper bound if any */ |
328 | } PGAIndices; |
329 | |
330 | /* |
331 | * PGAIndirection - select a field and/or array element from an expression |
332 | * |
333 | * The indirection list can contain PGAIndices nodes (representing |
334 | * subscripting), string PGValue nodes (representing field selection --- the |
335 | * string value is the name of the field to select), and PGAStar nodes |
336 | * (representing selection of all fields of a composite type). |
337 | * For example, a complex selection operation like |
338 | * (foo).field1[42][7].field2 |
339 | * would be represented with a single PGAIndirection node having a 4-element |
340 | * indirection list. |
341 | * |
342 | * Currently, PGAStar must appear only as the last list element --- the grammar |
343 | * is responsible for enforcing this! |
344 | */ |
345 | typedef struct PGAIndirection { |
346 | PGNodeTag type; |
347 | PGNode *arg; /* the thing being selected from */ |
348 | PGList *indirection; /* subscripts and/or field names and/or * */ |
349 | } PGAIndirection; |
350 | |
351 | /* |
352 | * PGAArrayExpr - an ARRAY[] construct |
353 | */ |
354 | typedef struct PGAArrayExpr { |
355 | PGNodeTag type; |
356 | PGList *elements; /* array element expressions */ |
357 | int location; /* token location, or -1 if unknown */ |
358 | } PGAArrayExpr; |
359 | |
360 | /* |
361 | * PGResTarget - |
362 | * result target (used in target list of pre-transformed parse trees) |
363 | * |
364 | * In a SELECT target list, 'name' is the column label from an |
365 | * 'AS ColumnLabel' clause, or NULL if there was none, and 'val' is the |
366 | * value expression itself. The 'indirection' field is not used. |
367 | * |
368 | * INSERT uses PGResTarget in its target-column-names list. Here, 'name' is |
369 | * the name of the destination column, 'indirection' stores any subscripts |
370 | * attached to the destination, and 'val' is not used. |
371 | * |
372 | * In an UPDATE target list, 'name' is the name of the destination column, |
373 | * 'indirection' stores any subscripts attached to the destination, and |
374 | * 'val' is the expression to assign. |
375 | * |
376 | * See PGAIndirection for more info about what can appear in 'indirection'. |
377 | */ |
378 | typedef struct PGResTarget { |
379 | PGNodeTag type; |
380 | char *name; /* column name or NULL */ |
381 | PGList *indirection; /* subscripts, field names, and '*', or NIL */ |
382 | PGNode *val; /* the value expression to compute or assign */ |
383 | int location; /* token location, or -1 if unknown */ |
384 | } PGResTarget; |
385 | |
386 | /* |
387 | * PGMultiAssignRef - element of a row source expression for UPDATE |
388 | * |
389 | * In an UPDATE target list, when we have SET (a,b,c) = row-valued-expression, |
390 | * we generate separate PGResTarget items for each of a,b,c. Their "val" trees |
391 | * are PGMultiAssignRef nodes numbered 1..n, linking to a common copy of the |
392 | * row-valued-expression (which parse analysis will process only once, when |
393 | * handling the PGMultiAssignRef with colno=1). |
394 | */ |
395 | typedef struct PGMultiAssignRef { |
396 | PGNodeTag type; |
397 | PGNode *source; /* the row-valued expression */ |
398 | int colno; /* column number for this target (1..n) */ |
399 | int ncolumns; /* number of targets in the construct */ |
400 | } PGMultiAssignRef; |
401 | |
402 | /* |
403 | * PGSortBy - for ORDER BY clause |
404 | */ |
405 | typedef struct PGSortBy { |
406 | PGNodeTag type; |
407 | PGNode *node; /* expression to sort on */ |
408 | PGSortByDir sortby_dir; /* ASC/DESC/USING/default */ |
409 | PGSortByNulls sortby_nulls; /* NULLS FIRST/LAST */ |
410 | PGList *useOp; /* name of op to use, if SORTBY_USING */ |
411 | int location; /* operator location, or -1 if none/unknown */ |
412 | } PGSortBy; |
413 | |
414 | /* |
415 | * PGWindowDef - raw representation of WINDOW and OVER clauses |
416 | * |
417 | * For entries in a WINDOW list, "name" is the window name being defined. |
418 | * For OVER clauses, we use "name" for the "OVER window" syntax, or "refname" |
419 | * for the "OVER (window)" syntax, which is subtly different --- the latter |
420 | * implies overriding the window frame clause. |
421 | */ |
422 | typedef struct PGWindowDef { |
423 | PGNodeTag type; |
424 | char *name; /* window's own name */ |
425 | char *refname; /* referenced window name, if any */ |
426 | PGList *partitionClause; /* PARTITION BY expression list */ |
427 | PGList *orderClause; /* ORDER BY (list of PGSortBy) */ |
428 | int frameOptions; /* frame_clause options, see below */ |
429 | PGNode *startOffset; /* expression for starting bound, if any */ |
430 | PGNode *endOffset; /* expression for ending bound, if any */ |
431 | int location; /* parse location, or -1 if none/unknown */ |
432 | } PGWindowDef; |
433 | |
434 | /* |
435 | * frameOptions is an OR of these bits. The NONDEFAULT and BETWEEN bits are |
436 | * used so that ruleutils.c can tell which properties were specified and |
437 | * which were defaulted; the correct behavioral bits must be set either way. |
438 | * The START_foo and END_foo options must come in pairs of adjacent bits for |
439 | * the convenience of gram.y, even though some of them are useless/invalid. |
440 | * We will need more bits (and fields) to cover the full SQL:2008 option set. |
441 | */ |
442 | #define FRAMEOPTION_NONDEFAULT 0x00001 /* any specified? */ |
443 | #define FRAMEOPTION_RANGE 0x00002 /* RANGE behavior */ |
444 | #define FRAMEOPTION_ROWS 0x00004 /* ROWS behavior */ |
445 | #define FRAMEOPTION_BETWEEN 0x00008 /* BETWEEN given? */ |
446 | #define FRAMEOPTION_START_UNBOUNDED_PRECEDING 0x00010 /* start is U. P. */ |
447 | #define FRAMEOPTION_END_UNBOUNDED_PRECEDING 0x00020 /* (disallowed) */ |
448 | #define FRAMEOPTION_START_UNBOUNDED_FOLLOWING 0x00040 /* (disallowed) */ |
449 | #define FRAMEOPTION_END_UNBOUNDED_FOLLOWING 0x00080 /* end is U. F. */ |
450 | #define FRAMEOPTION_START_CURRENT_ROW 0x00100 /* start is C. R. */ |
451 | #define FRAMEOPTION_END_CURRENT_ROW 0x00200 /* end is C. R. */ |
452 | #define FRAMEOPTION_START_VALUE_PRECEDING 0x00400 /* start is V. P. */ |
453 | #define FRAMEOPTION_END_VALUE_PRECEDING 0x00800 /* end is V. P. */ |
454 | #define FRAMEOPTION_START_VALUE_FOLLOWING 0x01000 /* start is V. F. */ |
455 | #define FRAMEOPTION_END_VALUE_FOLLOWING 0x02000 /* end is V. F. */ |
456 | |
457 | #define FRAMEOPTION_START_VALUE (FRAMEOPTION_START_VALUE_PRECEDING | FRAMEOPTION_START_VALUE_FOLLOWING) |
458 | #define FRAMEOPTION_END_VALUE (FRAMEOPTION_END_VALUE_PRECEDING | FRAMEOPTION_END_VALUE_FOLLOWING) |
459 | |
460 | #define FRAMEOPTION_DEFAULTS (FRAMEOPTION_RANGE | FRAMEOPTION_START_UNBOUNDED_PRECEDING | FRAMEOPTION_END_CURRENT_ROW) |
461 | |
462 | /* |
463 | * PGRangeSubselect - subquery appearing in a FROM clause |
464 | */ |
465 | typedef struct PGRangeSubselect { |
466 | PGNodeTag type; |
467 | bool lateral; /* does it have LATERAL prefix? */ |
468 | PGNode *subquery; /* the untransformed sub-select clause */ |
469 | PGAlias *alias; /* table alias & optional column aliases */ |
470 | PGNode *sample; /* sample options (if any) */ |
471 | } PGRangeSubselect; |
472 | |
473 | /* |
474 | * PGRangeFunction - function call appearing in a FROM clause |
475 | * |
476 | * functions is a PGList because we use this to represent the construct |
477 | * ROWS FROM(func1(...), func2(...), ...). Each element of this list is a |
478 | * two-element sublist, the first element being the untransformed function |
479 | * call tree, and the second element being a possibly-empty list of PGColumnDef |
480 | * nodes representing any columndef list attached to that function within the |
481 | * ROWS FROM() syntax. |
482 | * |
483 | * alias and coldeflist represent any alias and/or columndef list attached |
484 | * at the top level. (We disallow coldeflist appearing both here and |
485 | * per-function, but that's checked in parse analysis, not by the grammar.) |
486 | */ |
487 | typedef struct PGRangeFunction { |
488 | PGNodeTag type; |
489 | bool lateral; /* does it have LATERAL prefix? */ |
490 | bool ordinality; /* does it have WITH ORDINALITY suffix? */ |
491 | bool is_rowsfrom; /* is result of ROWS FROM() syntax? */ |
492 | PGList *functions; /* per-function information, see above */ |
493 | PGAlias *alias; /* table alias & optional column aliases */ |
494 | PGList *coldeflist; /* list of PGColumnDef nodes to describe result |
495 | * of function returning RECORD */ |
496 | PGNode *sample; /* sample options (if any) */ |
497 | } PGRangeFunction; |
498 | |
499 | /* Category of the column */ |
500 | typedef enum ColumnCategory { |
501 | COL_STANDARD, /* regular column */ |
502 | COL_GENERATED /* generated (VIRTUAL|STORED) */ |
503 | } ColumnCategory; |
504 | |
505 | /* |
506 | * PGColumnDef - column definition (used in various creates) |
507 | * |
508 | * If the column has a default value, we may have the value expression |
509 | * in either "raw" form (an untransformed parse tree) or "cooked" form |
510 | * (a post-parse-analysis, executable expression tree), depending on |
511 | * how this PGColumnDef node was created (by parsing, or by inheritance |
512 | * from an existing relation). We should never have both in the same node! |
513 | * |
514 | * Similarly, we may have a COLLATE specification in either raw form |
515 | * (represented as a PGCollateClause with arg==NULL) or cooked form |
516 | * (the collation's OID). |
517 | * |
518 | * The constraints list may contain a PG_CONSTR_DEFAULT item in a raw |
519 | * parsetree produced by gram.y, but transformCreateStmt will remove |
520 | * the item and set raw_default instead. PG_CONSTR_DEFAULT items |
521 | * should not appear in any subsequent processing. |
522 | */ |
523 | |
524 | typedef struct PGColumnDef { |
525 | PGNodeTag type; /* ENSURES COMPATIBILITY WITH 'PGNode' - has to be first line */ |
526 | char *colname; /* name of column */ |
527 | PGTypeName *typeName; /* type of column */ |
528 | int inhcount; /* number of times column is inherited */ |
529 | bool is_local; /* column has local (non-inherited) def'n */ |
530 | bool is_not_null; /* NOT NULL constraint specified? */ |
531 | bool is_from_type; /* column definition came from table type */ |
532 | bool is_from_parent; /* column def came from partition parent */ |
533 | char storage; /* attstorage setting, or 0 for default */ |
534 | PGNode *raw_default; /* default value (untransformed parse tree) */ |
535 | PGNode *cooked_default; /* default value (transformed expr tree) */ |
536 | char identity; /* attidentity setting */ |
537 | PGRangeVar *identitySequence; /* to store identity sequence name for ALTER |
538 | * TABLE ... ADD COLUMN */ |
539 | PGCollateClause *collClause; /* untransformed COLLATE spec, if any */ |
540 | PGOid collOid; /* collation OID (InvalidOid if not set) */ |
541 | PGList *constraints; /* other constraints on column */ |
542 | PGList *fdwoptions; /* per-column FDW options */ |
543 | int location; /* parse location, or -1 if none/unknown */ |
544 | ColumnCategory category; /* category of the column */ |
545 | } PGColumnDef; |
546 | |
547 | /* |
548 | * PGTableLikeClause - CREATE TABLE ( ... LIKE ... ) clause |
549 | */ |
550 | typedef struct PGTableLikeClause { |
551 | PGNodeTag type; |
552 | PGRangeVar *relation; |
553 | uint32_t options; /* OR of PGTableLikeOption flags */ |
554 | } PGTableLikeClause; |
555 | |
556 | typedef enum PGTableLikeOption { |
557 | PG_CREATE_TABLE_LIKE_DEFAULTS = 1 << 0, |
558 | PG_CREATE_TABLE_LIKE_CONSTRAINTS = 1 << 1, |
559 | PG_CREATE_TABLE_LIKE_IDENTITY = 1 << 2, |
560 | PG_CREATE_TABLE_LIKE_INDEXES = 1 << 3, |
561 | PG_CREATE_TABLE_LIKE_STORAGE = 1 << 4, |
562 | = 1 << 5, |
563 | PG_CREATE_TABLE_LIKE_STATISTICS = 1 << 6, |
564 | PG_CREATE_TABLE_LIKE_ALL = INT_MAX |
565 | } PGTableLikeOption; |
566 | |
567 | /* |
568 | * PGIndexElem - index parameters (used in CREATE INDEX, and in ON CONFLICT) |
569 | * |
570 | * For a plain index attribute, 'name' is the name of the table column to |
571 | * index, and 'expr' is NULL. For an index expression, 'name' is NULL and |
572 | * 'expr' is the expression tree. |
573 | */ |
574 | typedef struct PGIndexElem { |
575 | PGNodeTag type; |
576 | char *name; /* name of attribute to index, or NULL */ |
577 | PGNode *expr; /* expression to index, or NULL */ |
578 | char *indexcolname; /* name for index column; NULL = default */ |
579 | PGList *collation; /* name of collation; NIL = default */ |
580 | PGList *opclass; /* name of desired opclass; NIL = default */ |
581 | PGSortByDir ordering; /* ASC/DESC/default */ |
582 | PGSortByNulls nulls_ordering; /* FIRST/LAST/default */ |
583 | } PGIndexElem; |
584 | |
585 | /* |
586 | * PGDefElem - a generic "name = value" option definition |
587 | * |
588 | * In some contexts the name can be qualified. Also, certain SQL commands |
589 | * allow a SET/ADD/DROP action to be attached to option settings, so it's |
590 | * convenient to carry a field for that too. (Note: currently, it is our |
591 | * practice that the grammar allows namespace and action only in statements |
592 | * where they are relevant; C code can just ignore those fields in other |
593 | * statements.) |
594 | */ |
595 | typedef enum PGDefElemAction { |
596 | PG_DEFELEM_UNSPEC, /* no action given */ |
597 | PG_DEFELEM_SET, |
598 | PG_DEFELEM_ADD, |
599 | DEFELEM_DROP |
600 | } PGDefElemAction; |
601 | |
602 | typedef struct PGDefElem { |
603 | PGNodeTag type; |
604 | char *defnamespace; /* NULL if unqualified name */ |
605 | char *defname; |
606 | PGNode *arg; /* a (PGValue *) or a (PGTypeName *) */ |
607 | PGDefElemAction defaction; /* unspecified action, or SET/ADD/DROP */ |
608 | int location; /* token location, or -1 if unknown */ |
609 | } PGDefElem; |
610 | |
611 | /* |
612 | * PGLockingClause - raw representation of FOR [NO KEY] UPDATE/[KEY] SHARE |
613 | * options |
614 | * |
615 | * Note: lockedRels == NIL means "all relations in query". Otherwise it |
616 | * is a list of PGRangeVar nodes. (We use PGRangeVar mainly because it carries |
617 | * a location field --- currently, parse analysis insists on unqualified |
618 | * names in LockingClause.) |
619 | */ |
620 | typedef struct PGLockingClause { |
621 | PGNodeTag type; |
622 | PGList *lockedRels; /* FOR [KEY] UPDATE/SHARE relations */ |
623 | PGLockClauseStrength strength; |
624 | PGLockWaitPolicy waitPolicy; /* NOWAIT and SKIP LOCKED */ |
625 | } PGLockingClause; |
626 | |
627 | /**************************************************************************** |
628 | * Nodes for a PGQuery tree |
629 | ****************************************************************************/ |
630 | |
631 | /*-------------------- |
632 | * PGRangeTblEntry - |
633 | * A range table is a PGList of PGRangeTblEntry nodes. |
634 | * |
635 | * A range table entry may represent a plain relation, a sub-select in |
636 | * FROM, or the result of a JOIN clause. (Only explicit JOIN syntax |
637 | * produces an RTE, not the implicit join resulting from multiple FROM |
638 | * items. This is because we only need the RTE to deal with SQL features |
639 | * like outer joins and join-output-column aliasing.) Other special |
640 | * RTE types also exist, as indicated by RTEKind. |
641 | * |
642 | * Note that we consider PG_RTE_RELATION to cover anything that has a pg_class |
643 | * entry. relkind distinguishes the sub-cases. |
644 | * |
645 | * alias is an PGAlias node representing the AS alias-clause attached to the |
646 | * FROM expression, or NULL if no clause. |
647 | * |
648 | * eref is the table reference name and column reference names (either |
649 | * real or aliases). Note that system columns (OID etc) are not included |
650 | * in the column list. |
651 | * eref->aliasname is required to be present, and should generally be used |
652 | * to identify the RTE for error messages etc. |
653 | * |
654 | * In RELATION RTEs, the colnames in both alias and eref are indexed by |
655 | * physical attribute number; this means there must be colname entries for |
656 | * dropped columns. When building an RTE we insert empty strings ("") for |
657 | * dropped columns. Note however that a stored rule may have nonempty |
658 | * colnames for columns dropped since the rule was created (and for that |
659 | * matter the colnames might be out of date due to column renamings). |
660 | * The same comments apply to FUNCTION RTEs when a function's return type |
661 | * is a named composite type. |
662 | * |
663 | * In JOIN RTEs, the colnames in both alias and eref are one-to-one with |
664 | * joinaliasvars entries. A JOIN RTE will omit columns of its inputs when |
665 | * those columns are known to be dropped at parse time. Again, however, |
666 | * a stored rule might contain entries for columns dropped since the rule |
667 | * was created. (This is only possible for columns not actually referenced |
668 | * in the rule.) When loading a stored rule, we replace the joinaliasvars |
669 | * items for any such columns with null pointers. (We can't simply delete |
670 | * them from the joinaliasvars list, because that would affect the attnums |
671 | * of Vars referencing the rest of the list.) |
672 | * |
673 | * inh is true for relation references that should be expanded to include |
674 | * inheritance children, if the rel has any. This *must* be false for |
675 | * RTEs other than PG_RTE_RELATION entries. |
676 | * |
677 | * inFromCl marks those range variables that are listed in the FROM clause. |
678 | * It's false for RTEs that are added to a query behind the scenes, such |
679 | * as the NEW and OLD variables for a rule, or the subqueries of a UNION. |
680 | * This flag is not used anymore during parsing, since the parser now uses |
681 | * a separate "namespace" data structure to control visibility, but it is |
682 | * needed by ruleutils.c to determine whether RTEs should be shown in |
683 | * decompiled queries. |
684 | *-------------------- |
685 | */ |
686 | typedef enum PGRTEKind { |
687 | PG_RTE_RELATION, /* ordinary relation reference */ |
688 | PG_RTE_SUBQUERY, /* subquery in FROM */ |
689 | PG_RTE_JOIN, /* join */ |
690 | PG_RTE_FUNCTION, /* function in FROM */ |
691 | PG_RTE_TABLEFUNC, /* TableFunc(.., column list) */ |
692 | PG_RTE_VALUES, /* VALUES (<exprlist>), (<exprlist>), ... */ |
693 | PG_RTE_CTE, /* common table expr (WITH list element) */ |
694 | RTE_NAMEDTUPLESTORE /* tuplestore, e.g. for AFTER triggers */ |
695 | } PGRTEKind; |
696 | |
697 | typedef struct PGRangeTblEntry { |
698 | PGNodeTag type; |
699 | |
700 | PGRTEKind rtekind; /* see above */ |
701 | |
702 | /* |
703 | * XXX the fields applicable to only some rte kinds should be merged into |
704 | * a union. I didn't do this yet because the diffs would impact a lot of |
705 | * code that is being actively worked on. FIXME someday. |
706 | */ |
707 | |
708 | /* |
709 | * Fields valid for a plain relation RTE (else zero): |
710 | * |
711 | * As a special case, RTE_NAMEDTUPLESTORE can also set relid to indicate |
712 | * that the tuple format of the tuplestore is the same as the referenced |
713 | * relation. This allows plans referencing AFTER trigger transition |
714 | * tables to be invalidated if the underlying table is altered. |
715 | */ |
716 | PGOid relid; /* OID of the relation */ |
717 | char relkind; /* relation kind (see pg_class.relkind) */ |
718 | struct PGTableSampleClause *tablesample; /* sampling info, or NULL */ |
719 | |
720 | /* |
721 | * Fields valid for a subquery RTE (else NULL): |
722 | */ |
723 | PGQuery *subquery; /* the sub-query */ |
724 | |
725 | /* |
726 | * Fields valid for a join RTE (else NULL/zero): |
727 | * |
728 | * joinaliasvars is a list of (usually) Vars corresponding to the columns |
729 | * of the join result. An alias PGVar referencing column K of the join |
730 | * result can be replaced by the K'th element of joinaliasvars --- but to |
731 | * simplify the task of reverse-listing aliases correctly, we do not do |
732 | * that until planning time. In detail: an element of joinaliasvars can |
733 | * be a PGVar of one of the join's input relations, or such a PGVar with an |
734 | * implicit coercion to the join's output column type, or a COALESCE |
735 | * expression containing the two input column Vars (possibly coerced). |
736 | * Within a PGQuery loaded from a stored rule, it is also possible for |
737 | * joinaliasvars items to be null pointers, which are placeholders for |
738 | * (necessarily unreferenced) columns dropped since the rule was made. |
739 | * Also, once planning begins, joinaliasvars items can be almost anything, |
740 | * as a result of subquery-flattening substitutions. |
741 | */ |
742 | PGJoinType jointype; /* type of join */ |
743 | PGList *joinaliasvars; /* list of alias-var expansions */ |
744 | |
745 | /* |
746 | * Fields valid for a function RTE (else NIL/zero): |
747 | * |
748 | * When funcordinality is true, the eref->colnames list includes an alias |
749 | * for the ordinality column. The ordinality column is otherwise |
750 | * implicit, and must be accounted for "by hand" in places such as |
751 | * expandRTE(). |
752 | */ |
753 | PGList *functions; /* list of PGRangeTblFunction nodes */ |
754 | bool funcordinality; /* is this called WITH ORDINALITY? */ |
755 | |
756 | /* |
757 | * Fields valid for a PGTableFunc RTE (else NULL): |
758 | */ |
759 | PGTableFunc *tablefunc; |
760 | |
761 | /* |
762 | * Fields valid for a values RTE (else NIL): |
763 | */ |
764 | PGList *values_lists; /* list of expression lists */ |
765 | |
766 | /* |
767 | * Fields valid for a CTE RTE (else NULL/zero): |
768 | */ |
769 | char *ctename; /* name of the WITH list item */ |
770 | PGIndex ctelevelsup; /* number of query levels up */ |
771 | bool self_reference; /* is this a recursive self-reference? */ |
772 | |
773 | /* |
774 | * Fields valid for table functions, values, CTE and ENR RTEs (else NIL): |
775 | * |
776 | * We need these for CTE RTEs so that the types of self-referential |
777 | * columns are well-defined. For VALUES RTEs, storing these explicitly |
778 | * saves having to re-determine the info by scanning the values_lists. For |
779 | * ENRs, we store the types explicitly here (we could get the information |
780 | * from the catalogs if 'relid' was supplied, but we'd still need these |
781 | * for TupleDesc-based ENRs, so we might as well always store the type |
782 | * info here). |
783 | * |
784 | * For ENRs only, we have to consider the possibility of dropped columns. |
785 | * A dropped column is included in these lists, but it will have zeroes in |
786 | * all three lists (as well as an empty-string entry in eref). Testing |
787 | * for zero coltype is the standard way to detect a dropped column. |
788 | */ |
789 | PGList *coltypes; /* OID list of column type OIDs */ |
790 | PGList *coltypmods; /* integer list of column typmods */ |
791 | PGList *colcollations; /* OID list of column collation OIDs */ |
792 | |
793 | /* |
794 | * Fields valid for ENR RTEs (else NULL/zero): |
795 | */ |
796 | char *enrname; /* name of ephemeral named relation */ |
797 | double enrtuples; /* estimated or actual from caller */ |
798 | |
799 | /* |
800 | * Fields valid in all RTEs: |
801 | */ |
802 | PGAlias *alias; /* user-written alias clause, if any */ |
803 | PGAlias *eref; /* expanded reference names */ |
804 | bool lateral; /* subquery, function, or values is LATERAL? */ |
805 | bool inh; /* inheritance requested? */ |
806 | bool inFromCl; /* present in FROM clause? */ |
807 | } PGRangeTblEntry; |
808 | |
809 | /* |
810 | * PGRangeTblFunction - |
811 | * PGRangeTblEntry subsidiary data for one function in a FUNCTION RTE. |
812 | * |
813 | * If the function had a column definition list (required for an |
814 | * otherwise-unspecified RECORD result), funccolnames lists the names given |
815 | * in the definition list, funccoltypes lists their declared column types, |
816 | * funccoltypmods lists their typmods, funccolcollations their collations. |
817 | * Otherwise, those fields are NIL. |
818 | * |
819 | * Notice we don't attempt to store info about the results of functions |
820 | * returning named composite types, because those can change from time to |
821 | * time. We do however remember how many columns we thought the type had |
822 | * (including dropped columns!), so that we can successfully ignore any |
823 | * columns added after the query was parsed. |
824 | */ |
825 | typedef struct PGRangeTblFunction { |
826 | PGNodeTag type; |
827 | |
828 | PGNode *funcexpr; /* expression tree for func call */ |
829 | int funccolcount; /* number of columns it contributes to RTE */ |
830 | /* These fields record the contents of a column definition list, if any: */ |
831 | PGList *funccolnames; /* column names (list of String) */ |
832 | PGList *funccoltypes; /* OID list of column type OIDs */ |
833 | PGList *funccoltypmods; /* integer list of column typmods */ |
834 | PGList *funccolcollations; /* OID list of column collation OIDs */ |
835 | /* This is set during planning for use by the executor: */ |
836 | PGBitmapset *funcparams; /* PG_PARAM_EXEC PGParam IDs affecting this func */ |
837 | } PGRangeTblFunction; |
838 | |
839 | /* |
840 | * PGSortGroupClause - |
841 | * representation of ORDER BY, GROUP BY, PARTITION BY, |
842 | * DISTINCT, DISTINCT ON items |
843 | * |
844 | * You might think that ORDER BY is only interested in defining ordering, |
845 | * and GROUP/DISTINCT are only interested in defining equality. However, |
846 | * one way to implement grouping is to sort and then apply a "uniq"-like |
847 | * filter. So it's also interesting to keep track of possible sort operators |
848 | * for GROUP/DISTINCT, and in particular to try to sort for the grouping |
849 | * in a way that will also yield a requested ORDER BY ordering. So we need |
850 | * to be able to compare ORDER BY and GROUP/DISTINCT lists, which motivates |
851 | * the decision to give them the same representation. |
852 | * |
853 | * tleSortGroupRef must match ressortgroupref of exactly one entry of the |
854 | * query's targetlist; that is the expression to be sorted or grouped by. |
855 | * eqop is the OID of the equality operator. |
856 | * sortop is the OID of the ordering operator (a "<" or ">" operator), |
857 | * or InvalidOid if not available. |
858 | * nulls_first means about what you'd expect. If sortop is InvalidOid |
859 | * then nulls_first is meaningless and should be set to false. |
860 | * hashable is true if eqop is hashable (note this condition also depends |
861 | * on the datatype of the input expression). |
862 | * |
863 | * In an ORDER BY item, all fields must be valid. (The eqop isn't essential |
864 | * here, but it's cheap to get it along with the sortop, and requiring it |
865 | * to be valid eases comparisons to grouping items.) Note that this isn't |
866 | * actually enough information to determine an ordering: if the sortop is |
867 | * collation-sensitive, a collation OID is needed too. We don't store the |
868 | * collation in PGSortGroupClause because it's not available at the time the |
869 | * parser builds the PGSortGroupClause; instead, consult the exposed collation |
870 | * of the referenced targetlist expression to find out what it is. |
871 | * |
872 | * In a grouping item, eqop must be valid. If the eqop is a btree equality |
873 | * operator, then sortop should be set to a compatible ordering operator. |
874 | * We prefer to set eqop/sortop/nulls_first to match any ORDER BY item that |
875 | * the query presents for the same tlist item. If there is none, we just |
876 | * use the default ordering op for the datatype. |
877 | * |
878 | * If the tlist item's type has a hash opclass but no btree opclass, then |
879 | * we will set eqop to the hash equality operator, sortop to InvalidOid, |
880 | * and nulls_first to false. A grouping item of this kind can only be |
881 | * implemented by hashing, and of course it'll never match an ORDER BY item. |
882 | * |
883 | * The hashable flag is provided since we generally have the requisite |
884 | * information readily available when the PGSortGroupClause is constructed, |
885 | * and it's relatively expensive to get it again later. Note there is no |
886 | * need for a "sortable" flag since OidIsValid(sortop) serves the purpose. |
887 | * |
888 | * A query might have both ORDER BY and DISTINCT (or DISTINCT ON) clauses. |
889 | * In SELECT DISTINCT, the distinctClause list is as long or longer than the |
890 | * sortClause list, while in SELECT DISTINCT ON it's typically shorter. |
891 | * The two lists must match up to the end of the shorter one --- the parser |
892 | * rearranges the distinctClause if necessary to make this true. (This |
893 | * restriction ensures that only one sort step is needed to both satisfy the |
894 | * ORDER BY and set up for the PGUnique step. This is semantically necessary |
895 | * for DISTINCT ON, and presents no real drawback for DISTINCT.) |
896 | */ |
897 | typedef struct PGSortGroupClause { |
898 | PGNodeTag type; |
899 | PGIndex tleSortGroupRef; /* reference into targetlist */ |
900 | PGOid eqop; /* the equality operator ('=' op) */ |
901 | PGOid sortop; /* the ordering operator ('<' op), or 0 */ |
902 | bool nulls_first; /* do NULLs come before normal values? */ |
903 | bool hashable; /* can eqop be implemented by hashing? */ |
904 | } PGSortGroupClause; |
905 | |
906 | /* |
907 | * PGGroupingSet - |
908 | * representation of CUBE, ROLLUP and GROUPING SETS clauses |
909 | * |
910 | * In a PGQuery with grouping sets, the groupClause contains a flat list of |
911 | * PGSortGroupClause nodes for each distinct expression used. The actual |
912 | * structure of the GROUP BY clause is given by the groupingSets tree. |
913 | * |
914 | * In the raw parser output, PGGroupingSet nodes (of all types except SIMPLE |
915 | * which is not used) are potentially mixed in with the expressions in the |
916 | * groupClause of the SelectStmt. (An expression can't contain a PGGroupingSet, |
917 | * but a list may mix PGGroupingSet and expression nodes.) At this stage, the |
918 | * content of each node is a list of expressions, some of which may be RowExprs |
919 | * which represent sublists rather than actual row constructors, and nested |
920 | * PGGroupingSet nodes where legal in the grammar. The structure directly |
921 | * reflects the query syntax. |
922 | * |
923 | * In parse analysis, the transformed expressions are used to build the tlist |
924 | * and groupClause list (of PGSortGroupClause nodes), and the groupingSets tree |
925 | * is eventually reduced to a fixed format: |
926 | * |
927 | * EMPTY nodes represent (), and obviously have no content |
928 | * |
929 | * SIMPLE nodes represent a list of one or more expressions to be treated as an |
930 | * atom by the enclosing structure; the content is an integer list of |
931 | * ressortgroupref values (see PGSortGroupClause) |
932 | * |
933 | * CUBE and ROLLUP nodes contain a list of one or more SIMPLE nodes. |
934 | * |
935 | * SETS nodes contain a list of EMPTY, SIMPLE, CUBE or ROLLUP nodes, but after |
936 | * parse analysis they cannot contain more SETS nodes; enough of the syntactic |
937 | * transforms of the spec have been applied that we no longer have arbitrarily |
938 | * deep nesting (though we still preserve the use of cube/rollup). |
939 | * |
940 | * Note that if the groupingSets tree contains no SIMPLE nodes (only EMPTY |
941 | * nodes at the leaves), then the groupClause will be empty, but this is still |
942 | * an aggregation query (similar to using aggs or HAVING without GROUP BY). |
943 | * |
944 | * As an example, the following clause: |
945 | * |
946 | * GROUP BY GROUPING SETS ((a,b), CUBE(c,(d,e))) |
947 | * |
948 | * looks like this after raw parsing: |
949 | * |
950 | * SETS( RowExpr(a,b) , CUBE( c, RowExpr(d,e) ) ) |
951 | * |
952 | * and parse analysis converts it to: |
953 | * |
954 | * SETS( SIMPLE(1,2), CUBE( SIMPLE(3), SIMPLE(4,5) ) ) |
955 | */ |
956 | typedef enum { |
957 | GROUPING_SET_EMPTY, |
958 | GROUPING_SET_SIMPLE, |
959 | GROUPING_SET_ROLLUP, |
960 | GROUPING_SET_CUBE, |
961 | GROUPING_SET_SETS, |
962 | GROUPING_SET_ALL |
963 | } GroupingSetKind; |
964 | |
965 | typedef struct PGGroupingSet { |
966 | PGNodeTag type; |
967 | GroupingSetKind kind; |
968 | PGList *content; |
969 | int location; |
970 | } PGGroupingSet; |
971 | |
972 | /* |
973 | * PGWindowClause - |
974 | * transformed representation of WINDOW and OVER clauses |
975 | * |
976 | * A parsed Query's windowClause list contains these structs. "name" is set |
977 | * if the clause originally came from WINDOW, and is NULL if it originally |
978 | * was an OVER clause (but note that we collapse out duplicate OVERs). |
979 | * partitionClause and orderClause are lists of PGSortGroupClause structs. |
980 | * winref is an ID number referenced by PGWindowFunc nodes; it must be unique |
981 | * among the members of a Query's windowClause list. |
982 | * When refname isn't null, the partitionClause is always copied from there; |
983 | * the orderClause might or might not be copied (see copiedOrder); the framing |
984 | * options are never copied, per spec. |
985 | */ |
986 | typedef struct PGWindowClause { |
987 | PGNodeTag type; |
988 | char *name; /* window name (NULL in an OVER clause) */ |
989 | char *refname; /* referenced window name, if any */ |
990 | PGList *partitionClause; /* PARTITION BY list */ |
991 | PGList *orderClause; /* ORDER BY list */ |
992 | int frameOptions; /* frame_clause options, see PGWindowDef */ |
993 | PGNode *startOffset; /* expression for starting bound, if any */ |
994 | PGNode *endOffset; /* expression for ending bound, if any */ |
995 | PGIndex winref; /* ID referenced by window functions */ |
996 | bool copiedOrder; /* did we copy orderClause from refname? */ |
997 | } PGWindowClause; |
998 | |
999 | /* |
1000 | * RowMarkClause - |
1001 | * parser output representation of FOR [KEY] UPDATE/SHARE clauses |
1002 | * |
1003 | * Query.rowMarks contains a separate RowMarkClause node for each relation |
1004 | * identified as a FOR [KEY] UPDATE/SHARE target. If one of these clauses |
1005 | * is applied to a subquery, we generate RowMarkClauses for all normal and |
1006 | * subquery rels in the subquery, but they are marked pushedDown = true to |
1007 | * distinguish them from clauses that were explicitly written at this query |
1008 | * level. Also, Query.hasForUpdate tells whether there were explicit FOR |
1009 | * UPDATE/SHARE/KEY SHARE clauses in the current query level. |
1010 | */ |
1011 | |
1012 | /* |
1013 | * PGWithClause - |
1014 | * representation of WITH clause |
1015 | * |
1016 | * Note: PGWithClause does not propagate into the PGQuery representation; |
1017 | * but PGCommonTableExpr does. |
1018 | */ |
1019 | typedef struct PGWithClause { |
1020 | PGNodeTag type; |
1021 | PGList *ctes; /* list of CommonTableExprs */ |
1022 | bool recursive; /* true = WITH RECURSIVE */ |
1023 | int location; /* token location, or -1 if unknown */ |
1024 | } PGWithClause; |
1025 | |
1026 | /* |
1027 | * PGInferClause - |
1028 | * ON CONFLICT unique index inference clause |
1029 | * |
1030 | * Note: PGInferClause does not propagate into the PGQuery representation. |
1031 | */ |
1032 | typedef struct PGInferClause { |
1033 | PGNodeTag type; |
1034 | PGList *indexElems; /* IndexElems to infer unique index */ |
1035 | PGNode *whereClause; /* qualification (partial-index predicate) */ |
1036 | char *conname; /* PGConstraint name, or NULL if unnamed */ |
1037 | int location; /* token location, or -1 if unknown */ |
1038 | } PGInferClause; |
1039 | |
1040 | /* |
1041 | * PGOnConflictClause - |
1042 | * representation of ON CONFLICT clause |
1043 | * |
1044 | * Note: PGOnConflictClause does not propagate into the PGQuery representation. |
1045 | */ |
1046 | typedef struct PGOnConflictClause { |
1047 | PGNodeTag type; |
1048 | PGOnConflictAction action; /* DO NOTHING or UPDATE? */ |
1049 | PGInferClause *infer; /* Optional index inference clause */ |
1050 | PGList *targetList; /* the target list (of PGResTarget) */ |
1051 | PGNode *whereClause; /* qualifications */ |
1052 | int location; /* token location, or -1 if unknown */ |
1053 | } PGOnConflictClause; |
1054 | |
1055 | /* |
1056 | * PGCommonTableExpr - |
1057 | * representation of WITH list element |
1058 | * |
1059 | * We don't currently support the SEARCH or CYCLE clause. |
1060 | */ |
1061 | typedef struct PGCommonTableExpr { |
1062 | PGNodeTag type; |
1063 | char *ctename; /* query name (never qualified) */ |
1064 | PGList *aliascolnames; /* optional list of column names */ |
1065 | /* SelectStmt/InsertStmt/etc before parse analysis, PGQuery afterwards: */ |
1066 | PGNode *ctequery; /* the CTE's subquery */ |
1067 | int location; /* token location, or -1 if unknown */ |
1068 | /* These fields are set during parse analysis: */ |
1069 | bool cterecursive; /* is this CTE actually recursive? */ |
1070 | int cterefcount; /* number of RTEs referencing this CTE |
1071 | * (excluding internal self-references) */ |
1072 | PGList *ctecolnames; /* list of output column names */ |
1073 | PGList *ctecoltypes; /* OID list of output column type OIDs */ |
1074 | PGList *ctecoltypmods; /* integer list of output column typmods */ |
1075 | PGList *ctecolcollations; /* OID list of column collation OIDs */ |
1076 | } PGCommonTableExpr; |
1077 | |
1078 | /* Convenience macro to get the output tlist of a CTE's query */ |
1079 | #define GetCTETargetList(cte) \ |
1080 | (AssertMacro(IsA((cte)->ctequery, PGQuery)), ((PGQuery *)(cte)->ctequery)->commandType == PG_CMD_SELECT ? ((PGQuery *)(cte)->ctequery)->targetList : ((PGQuery *)(cte)->ctequery)->returningList) |
1081 | |
1082 | /* |
1083 | * TriggerTransition - |
1084 | * representation of transition row or table naming clause |
1085 | * |
1086 | * Only transition tables are initially supported in the syntax, and only for |
1087 | * AFTER triggers, but other permutations are accepted by the parser so we can |
1088 | * give a meaningful message from C code. |
1089 | */ |
1090 | |
1091 | /***************************************************************************** |
1092 | * Raw Grammar Output Statements |
1093 | *****************************************************************************/ |
1094 | |
1095 | /* |
1096 | * PGRawStmt --- container for any one statement's raw parse tree |
1097 | * |
1098 | * Parse analysis converts a raw parse tree headed by a PGRawStmt node into |
1099 | * an analyzed statement headed by a PGQuery node. For optimizable statements, |
1100 | * the conversion is complex. For utility statements, the parser usually just |
1101 | * transfers the raw parse tree (sans PGRawStmt) into the utilityStmt field of |
1102 | * the PGQuery node, and all the useful work happens at execution time. |
1103 | * |
1104 | * stmt_location/stmt_len identify the portion of the source text string |
1105 | * containing this raw statement (useful for multi-statement strings). |
1106 | */ |
1107 | typedef struct PGRawStmt { |
1108 | PGNodeTag type; |
1109 | PGNode *stmt; /* raw parse tree */ |
1110 | int stmt_location; /* start location, or -1 if unknown */ |
1111 | int stmt_len; /* length in bytes; 0 means "rest of string" */ |
1112 | } PGRawStmt; |
1113 | |
1114 | /***************************************************************************** |
1115 | * Optimizable Statements |
1116 | *****************************************************************************/ |
1117 | |
1118 | /* ---------------------- |
1119 | * Insert Statement |
1120 | * |
1121 | * The source expression is represented by PGSelectStmt for both the |
1122 | * SELECT and VALUES cases. If selectStmt is NULL, then the query |
1123 | * is INSERT ... DEFAULT VALUES. |
1124 | * ---------------------- |
1125 | */ |
1126 | typedef struct PGInsertStmt { |
1127 | PGNodeTag type; |
1128 | PGRangeVar *relation; /* relation to insert into */ |
1129 | PGList *cols; /* optional: names of the target columns */ |
1130 | PGNode *selectStmt; /* the source SELECT/VALUES, or NULL */ |
1131 | PGOnConflictActionAlias onConflictAlias; /* the (optional) shorthand provided for the onConflictClause */ |
1132 | PGOnConflictClause *onConflictClause; /* ON CONFLICT clause */ |
1133 | PGList *returningList; /* list of expressions to return */ |
1134 | PGWithClause *withClause; /* WITH clause */ |
1135 | PGOverridingKind override; /* OVERRIDING clause */ |
1136 | PGInsertColumnOrder insert_column_order; /* INSERT BY NAME or INSERT BY POSITION */ |
1137 | } PGInsertStmt; |
1138 | |
1139 | /* ---------------------- |
1140 | * Delete Statement |
1141 | * ---------------------- |
1142 | */ |
1143 | typedef struct PGDeleteStmt { |
1144 | PGNodeTag type; |
1145 | PGRangeVar *relation; /* relation to delete from */ |
1146 | PGList *usingClause; /* optional using clause for more tables */ |
1147 | PGNode *whereClause; /* qualifications */ |
1148 | PGList *returningList; /* list of expressions to return */ |
1149 | PGWithClause *withClause; /* WITH clause */ |
1150 | } PGDeleteStmt; |
1151 | |
1152 | /* ---------------------- |
1153 | * Update Statement |
1154 | * ---------------------- |
1155 | */ |
1156 | typedef struct PGUpdateStmt { |
1157 | PGNodeTag type; |
1158 | PGRangeVar *relation; /* relation to update */ |
1159 | PGList *targetList; /* the target list (of PGResTarget) */ |
1160 | PGNode *whereClause; /* qualifications */ |
1161 | PGList *fromClause; /* optional from clause for more tables */ |
1162 | PGList *returningList; /* list of expressions to return */ |
1163 | PGWithClause *withClause; /* WITH clause */ |
1164 | } PGUpdateStmt; |
1165 | |
1166 | /* ---------------------- |
1167 | * Pivot Expression |
1168 | * ---------------------- |
1169 | */ |
1170 | typedef struct PGPivot { |
1171 | PGNodeTag type; |
1172 | PGList *pivot_columns; /* The column names to pivot on */ |
1173 | PGList *unpivot_columns;/* The column names to unpivot */ |
1174 | PGList *pivot_value; /* The set of pivot values */ |
1175 | PGNode *subquery; /* Subquery to fetch valid pivot values (if any) */ |
1176 | char *pivot_enum; /* The enum to fetch the unique values from */ |
1177 | } PGPivot; |
1178 | |
1179 | typedef struct PGPivotExpr { |
1180 | PGNodeTag type; |
1181 | PGNode *source; /* the source subtree */ |
1182 | PGList *aggrs; /* The aggregations to pivot over (PIVOT only) */ |
1183 | PGList *unpivots; /* The names to unpivot over (UNPIVOT only) */ |
1184 | PGList *pivots; /* The set of pivot values */ |
1185 | PGList *groups; /* The set of groups to pivot over (if any) */ |
1186 | PGAlias *alias; /* table alias & optional column aliases */ |
1187 | bool include_nulls; /* Whether or not to include NULL values (UNPIVOT only */ |
1188 | } PGPivotExpr; |
1189 | |
1190 | typedef struct PGPivotStmt { |
1191 | PGNodeTag type; |
1192 | PGNode *source; /* The source to pivot */ |
1193 | PGList *aggrs; /* The aggregations to pivot over (PIVOT only) */ |
1194 | PGList *unpivots; /* The names to unpivot over (UNPIVOT only) */ |
1195 | PGList *columns; /* The set of columns to pivot over */ |
1196 | PGList *groups; /* The set of groups to pivot over (if any) */ |
1197 | } PGPivotStmt; |
1198 | |
1199 | /* ---------------------- |
1200 | * Select Statement |
1201 | * |
1202 | * A "simple" SELECT is represented in the output of gram.y by a single |
1203 | * PGSelectStmt node; so is a VALUES construct. A query containing set |
1204 | * operators (UNION, INTERSECT, EXCEPT) is represented by a tree of PGSelectStmt |
1205 | * nodes, in which the leaf nodes are component SELECTs and the internal nodes |
1206 | * represent UNION, INTERSECT, or EXCEPT operators. Using the same node |
1207 | * type for both leaf and internal nodes allows gram.y to stick ORDER BY, |
1208 | * LIMIT, etc, clause values into a SELECT statement without worrying |
1209 | * whether it is a simple or compound SELECT. |
1210 | * ---------------------- |
1211 | */ |
1212 | typedef enum PGSetOperation { PG_SETOP_NONE = 0, PG_SETOP_UNION, PG_SETOP_INTERSECT, PG_SETOP_EXCEPT, PG_SETOP_UNION_BY_NAME } PGSetOperation; |
1213 | |
1214 | typedef struct PGSelectStmt { |
1215 | PGNodeTag type; |
1216 | |
1217 | /* |
1218 | * These fields are used only in "leaf" SelectStmts. |
1219 | */ |
1220 | PGList *distinctClause; /* NULL, list of DISTINCT ON exprs, or |
1221 | * lcons(NIL,NIL) for all (SELECT DISTINCT) */ |
1222 | PGIntoClause *intoClause; /* target for SELECT INTO */ |
1223 | PGList *targetList; /* the target list (of PGResTarget) */ |
1224 | PGList *fromClause; /* the FROM clause */ |
1225 | PGNode *whereClause; /* WHERE qualification */ |
1226 | PGList *groupClause; /* GROUP BY clauses */ |
1227 | PGNode *havingClause; /* HAVING conditional-expression */ |
1228 | PGList *windowClause; /* WINDOW window_name AS (...), ... */ |
1229 | PGNode *qualifyClause; /* QUALIFY conditional-expression */ |
1230 | |
1231 | /* |
1232 | * In a "leaf" node representing a VALUES list, the above fields are all |
1233 | * null, and instead this field is set. Note that the elements of the |
1234 | * sublists are just expressions, without PGResTarget decoration. Also note |
1235 | * that a list element can be DEFAULT (represented as a PGSetToDefault |
1236 | * node), regardless of the context of the VALUES list. It's up to parse |
1237 | * analysis to reject that where not valid. |
1238 | */ |
1239 | PGList *valuesLists; /* untransformed list of expression lists */ |
1240 | |
1241 | /* When representing a pivot statement, all values are NULL besides the pivot field */ |
1242 | PGPivotStmt *pivot; /* PIVOT statement */ |
1243 | |
1244 | /* |
1245 | * These fields are used in both "leaf" SelectStmts and upper-level |
1246 | * SelectStmts. |
1247 | */ |
1248 | PGList *sortClause; /* sort clause (a list of SortBy's) */ |
1249 | PGNode *limitOffset; /* # of result tuples to skip */ |
1250 | PGNode *limitCount; /* # of result tuples to return */ |
1251 | PGNode *sampleOptions; /* sample options (if any) */ |
1252 | PGList *lockingClause; /* FOR UPDATE (list of LockingClause's) */ |
1253 | PGWithClause *withClause; /* WITH clause */ |
1254 | |
1255 | /* |
1256 | * These fields are used only in upper-level SelectStmts. |
1257 | */ |
1258 | PGSetOperation op; /* type of set op */ |
1259 | bool all; /* ALL specified? */ |
1260 | struct PGSelectStmt *larg; /* left child */ |
1261 | struct PGSelectStmt *rarg; /* right child */ |
1262 | /* Eventually add fields for CORRESPONDING spec here */ |
1263 | } PGSelectStmt; |
1264 | |
1265 | /* ---------------------- |
1266 | * Set Operation node for post-analysis query trees |
1267 | * |
1268 | * After parse analysis, a SELECT with set operations is represented by a |
1269 | * top-level PGQuery node containing the leaf SELECTs as subqueries in its |
1270 | * range table. Its setOperations field shows the tree of set operations, |
1271 | * with leaf PGSelectStmt nodes replaced by PGRangeTblRef nodes, and internal |
1272 | * nodes replaced by SetOperationStmt nodes. Information about the output |
1273 | * column types is added, too. (Note that the child nodes do not necessarily |
1274 | * produce these types directly, but we've checked that their output types |
1275 | * can be coerced to the output column type.) Also, if it's not UNION ALL, |
1276 | * information about the types' sort/group semantics is provided in the form |
1277 | * of a PGSortGroupClause list (same representation as, eg, DISTINCT). |
1278 | * The resolved common column collations are provided too; but note that if |
1279 | * it's not UNION ALL, it's okay for a column to not have a common collation, |
1280 | * so a member of the colCollations list could be InvalidOid even though the |
1281 | * column has a collatable type. |
1282 | * ---------------------- |
1283 | */ |
1284 | |
1285 | /***************************************************************************** |
1286 | * Other Statements (no optimizations required) |
1287 | * |
1288 | * These are not touched by parser/analyze.c except to put them into |
1289 | * the utilityStmt field of a Query. This is eventually passed to |
1290 | * ProcessUtility (by-passing rewriting and planning). Some of the |
1291 | * statements do need attention from parse analysis, and this is |
1292 | * done by routines in parser/parse_utilcmd.c after ProcessUtility |
1293 | * receives the command for execution. |
1294 | * DECLARE CURSOR, EXPLAIN, and CREATE TABLE AS are special cases: |
1295 | * they contain optimizable statements, which get processed normally |
1296 | * by parser/analyze.c. |
1297 | *****************************************************************************/ |
1298 | |
1299 | /* |
1300 | * When a command can act on several kinds of objects with only one |
1301 | * parse structure required, use these constants to designate the |
1302 | * object type. Note that commands typically don't support all the types. |
1303 | */ |
1304 | |
1305 | typedef enum PGObjectType { |
1306 | PG_OBJECT_ACCESS_METHOD, |
1307 | PG_OBJECT_AGGREGATE, |
1308 | PG_OBJECT_AMOP, |
1309 | PG_OBJECT_AMPROC, |
1310 | PG_OBJECT_ATTRIBUTE, /* type's attribute, when distinct from column */ |
1311 | PG_OBJECT_CAST, |
1312 | PG_OBJECT_COLUMN, |
1313 | PG_OBJECT_COLLATION, |
1314 | PG_OBJECT_CONVERSION, |
1315 | PG_OBJECT_DATABASE, |
1316 | PG_OBJECT_DEFAULT, |
1317 | PG_OBJECT_DEFACL, |
1318 | PG_OBJECT_DOMAIN, |
1319 | PG_OBJECT_DOMCONSTRAINT, |
1320 | PG_OBJECT_EVENT_TRIGGER, |
1321 | PG_OBJECT_EXTENSION, |
1322 | PG_OBJECT_FDW, |
1323 | PG_OBJECT_FOREIGN_SERVER, |
1324 | PG_OBJECT_FOREIGN_TABLE, |
1325 | PG_OBJECT_FUNCTION, |
1326 | PG_OBJECT_TABLE_MACRO, |
1327 | PG_OBJECT_INDEX, |
1328 | PG_OBJECT_LANGUAGE, |
1329 | PG_OBJECT_LARGEOBJECT, |
1330 | PG_OBJECT_MATVIEW, |
1331 | PG_OBJECT_OPCLASS, |
1332 | PG_OBJECT_OPERATOR, |
1333 | PG_OBJECT_OPFAMILY, |
1334 | PG_OBJECT_POLICY, |
1335 | PG_OBJECT_PUBLICATION, |
1336 | PG_OBJECT_PUBLICATION_REL, |
1337 | PG_OBJECT_ROLE, |
1338 | PG_OBJECT_RULE, |
1339 | PG_OBJECT_SCHEMA, |
1340 | PG_OBJECT_SEQUENCE, |
1341 | PG_OBJECT_SUBSCRIPTION, |
1342 | PG_OBJECT_STATISTIC_EXT, |
1343 | PG_OBJECT_TABCONSTRAINT, |
1344 | PG_OBJECT_TABLE, |
1345 | PG_OBJECT_TABLESPACE, |
1346 | PG_OBJECT_TRANSFORM, |
1347 | PG_OBJECT_TRIGGER, |
1348 | PG_OBJECT_TSCONFIGURATION, |
1349 | PG_OBJECT_TSDICTIONARY, |
1350 | PG_OBJECT_TSPARSER, |
1351 | PG_OBJECT_TSTEMPLATE, |
1352 | PG_OBJECT_TYPE, |
1353 | PG_OBJECT_USER_MAPPING, |
1354 | PG_OBJECT_VIEW |
1355 | } PGObjectType; |
1356 | |
1357 | /* ---------------------- |
1358 | * Create Schema Statement |
1359 | * |
1360 | * NOTE: the schemaElts list contains raw parsetrees for component statements |
1361 | * of the schema, such as CREATE TABLE, GRANT, etc. These are analyzed and |
1362 | * executed after the schema itself is created. |
1363 | * ---------------------- |
1364 | */ |
1365 | typedef struct PGCreateSchemaStmt { |
1366 | PGNodeTag type; |
1367 | char *catalogname; /* the name of the catalog in which to create the schema */ |
1368 | char *schemaname; /* the name of the schema to create */ |
1369 | PGList *schemaElts; /* schema components (list of parsenodes) */ |
1370 | PGOnCreateConflict onconflict; /* what to do on create conflict */ |
1371 | } PGCreateSchemaStmt; |
1372 | |
1373 | typedef enum PGDropBehavior { |
1374 | PG_DROP_RESTRICT, /* drop fails if any dependent objects */ |
1375 | PG_DROP_CASCADE /* remove dependent objects too */ |
1376 | } PGDropBehavior; |
1377 | |
1378 | /* ---------------------- |
1379 | * Alter Table |
1380 | * ---------------------- |
1381 | */ |
1382 | typedef struct PGAlterTableStmt { |
1383 | PGNodeTag type; |
1384 | PGRangeVar *relation; /* table to work on */ |
1385 | PGList *cmds; /* list of subcommands */ |
1386 | PGObjectType relkind; /* type of object */ |
1387 | bool missing_ok; /* skip error if table missing */ |
1388 | } PGAlterTableStmt; |
1389 | |
1390 | typedef enum PGAlterTableType { |
1391 | PG_AT_AddColumn, /* add column */ |
1392 | PG_AT_AddColumnRecurse, /* internal to commands/tablecmds.c */ |
1393 | PG_AT_AddColumnToView, /* implicitly via CREATE OR REPLACE VIEW */ |
1394 | PG_AT_ColumnDefault, /* alter column default */ |
1395 | PG_AT_DropNotNull, /* alter column drop not null */ |
1396 | PG_AT_SetNotNull, /* alter column set not null */ |
1397 | PG_AT_SetStatistics, /* alter column set statistics */ |
1398 | PG_AT_SetOptions, /* alter column set ( options ) */ |
1399 | PG_AT_ResetOptions, /* alter column reset ( options ) */ |
1400 | PG_AT_SetStorage, /* alter column set storage */ |
1401 | PG_AT_DropColumn, /* drop column */ |
1402 | PG_AT_DropColumnRecurse, /* internal to commands/tablecmds.c */ |
1403 | PG_AT_AddIndex, /* add index */ |
1404 | PG_AT_ReAddIndex, /* internal to commands/tablecmds.c */ |
1405 | PG_AT_AddConstraint, /* add constraint */ |
1406 | PG_AT_AddConstraintRecurse, /* internal to commands/tablecmds.c */ |
1407 | PG_AT_ReAddConstraint, /* internal to commands/tablecmds.c */ |
1408 | PG_AT_AlterConstraint, /* alter constraint */ |
1409 | PG_AT_ValidateConstraint, /* validate constraint */ |
1410 | PG_AT_ValidateConstraintRecurse, /* internal to commands/tablecmds.c */ |
1411 | PG_AT_ProcessedConstraint, /* pre-processed add constraint (local in |
1412 | * parser/parse_utilcmd.c) */ |
1413 | PG_AT_AddIndexConstraint, /* add constraint using existing index */ |
1414 | PG_AT_DropConstraint, /* drop constraint */ |
1415 | PG_AT_DropConstraintRecurse, /* internal to commands/tablecmds.c */ |
1416 | , /* internal to commands/tablecmds.c */ |
1417 | PG_AT_AlterColumnType, /* alter column type */ |
1418 | PG_AT_AlterColumnGenericOptions, /* alter column OPTIONS (...) */ |
1419 | PG_AT_ChangeOwner, /* change owner */ |
1420 | PG_AT_ClusterOn, /* CLUSTER ON */ |
1421 | PG_AT_DropCluster, /* SET WITHOUT CLUSTER */ |
1422 | PG_AT_SetLogged, /* SET LOGGED */ |
1423 | PG_AT_SetUnLogged, /* SET UNLOGGED */ |
1424 | PG_AT_AddOids, /* SET WITH OIDS */ |
1425 | PG_AT_AddOidsRecurse, /* internal to commands/tablecmds.c */ |
1426 | PG_AT_DropOids, /* SET WITHOUT OIDS */ |
1427 | PG_AT_SetTableSpace, /* SET TABLESPACE */ |
1428 | PG_AT_SetRelOptions, /* SET (...) -- AM specific parameters */ |
1429 | PG_AT_ResetRelOptions, /* RESET (...) -- AM specific parameters */ |
1430 | PG_AT_ReplaceRelOptions, /* replace reloption list in its entirety */ |
1431 | PG_AT_EnableTrig, /* ENABLE TRIGGER name */ |
1432 | PG_AT_EnableAlwaysTrig, /* ENABLE ALWAYS TRIGGER name */ |
1433 | PG_AT_EnableReplicaTrig, /* ENABLE REPLICA TRIGGER name */ |
1434 | PG_AT_DisableTrig, /* DISABLE TRIGGER name */ |
1435 | PG_AT_EnableTrigAll, /* ENABLE TRIGGER ALL */ |
1436 | PG_AT_DisableTrigAll, /* DISABLE TRIGGER ALL */ |
1437 | PG_AT_EnableTrigUser, /* ENABLE TRIGGER USER */ |
1438 | PG_AT_DisableTrigUser, /* DISABLE TRIGGER USER */ |
1439 | PG_AT_EnableRule, /* ENABLE RULE name */ |
1440 | PG_AT_EnableAlwaysRule, /* ENABLE ALWAYS RULE name */ |
1441 | PG_AT_EnableReplicaRule, /* ENABLE REPLICA RULE name */ |
1442 | PG_AT_DisableRule, /* DISABLE RULE name */ |
1443 | PG_AT_AddInherit, /* INHERIT parent */ |
1444 | PG_AT_DropInherit, /* NO INHERIT parent */ |
1445 | PG_AT_AddOf, /* OF <type_name> */ |
1446 | PG_AT_DropOf, /* NOT OF */ |
1447 | PG_AT_ReplicaIdentity, /* REPLICA IDENTITY */ |
1448 | PG_AT_EnableRowSecurity, /* ENABLE ROW SECURITY */ |
1449 | PG_AT_DisableRowSecurity, /* DISABLE ROW SECURITY */ |
1450 | PG_AT_ForceRowSecurity, /* FORCE ROW SECURITY */ |
1451 | PG_AT_NoForceRowSecurity, /* NO FORCE ROW SECURITY */ |
1452 | PG_AT_GenericOptions, /* OPTIONS (...) */ |
1453 | PG_AT_AttachPartition, /* ATTACH PARTITION */ |
1454 | PG_AT_DetachPartition, /* DETACH PARTITION */ |
1455 | PG_AT_AddIdentity, /* ADD IDENTITY */ |
1456 | PG_AT_SetIdentity, /* SET identity column options */ |
1457 | AT_DropIdentity /* DROP IDENTITY */ |
1458 | } PGAlterTableType; |
1459 | |
1460 | typedef struct PGAlterTableCmd /* one subcommand of an ALTER TABLE */ |
1461 | { |
1462 | PGNodeTag type; |
1463 | PGAlterTableType subtype; /* Type of table alteration to apply */ |
1464 | char *name; /* column, constraint, or trigger to act on, |
1465 | * or tablespace */ |
1466 | PGNode *def; /* definition of new column, index, |
1467 | * constraint, or parent table */ |
1468 | PGDropBehavior behavior; /* RESTRICT or CASCADE for DROP cases */ |
1469 | bool missing_ok; /* skip error if missing? */ |
1470 | } PGAlterTableCmd; |
1471 | |
1472 | /* |
1473 | * Note: PGObjectWithArgs carries only the types of the input parameters of the |
1474 | * function. So it is sufficient to identify an existing function, but it |
1475 | * is not enough info to define a function nor to call it. |
1476 | */ |
1477 | typedef struct PGObjectWithArgs { |
1478 | PGNodeTag type; |
1479 | PGList *objname; /* qualified name of function/operator */ |
1480 | PGList *objargs; /* list of Typename nodes */ |
1481 | bool args_unspecified; /* argument list was omitted, so name must |
1482 | * be unique (note that objargs == NIL |
1483 | * means zero args) */ |
1484 | } PGObjectWithArgs; |
1485 | |
1486 | /* ---------------------- |
1487 | * Copy Statement |
1488 | * |
1489 | * We support "COPY relation FROM file", "COPY relation TO file", and |
1490 | * "COPY (query) TO file". In any given PGCopyStmt, exactly one of "relation" |
1491 | * and "query" must be non-NULL. |
1492 | * ---------------------- |
1493 | */ |
1494 | typedef struct PGCopyStmt { |
1495 | PGNodeTag type; |
1496 | PGRangeVar *relation; /* the relation to copy */ |
1497 | PGNode *query; /* the query (SELECT or DML statement with |
1498 | * RETURNING) to copy, as a raw parse tree */ |
1499 | PGList *attlist; /* PGList of column names (as Strings), or NIL |
1500 | * for all columns */ |
1501 | bool is_from; /* TO or FROM */ |
1502 | bool is_program; /* is 'filename' a program to popen? */ |
1503 | char *filename; /* filename, or NULL for STDIN/STDOUT */ |
1504 | PGList *options; /* PGList of PGDefElem nodes */ |
1505 | } PGCopyStmt; |
1506 | |
1507 | /* ---------------------- |
1508 | * SET Statement (includes RESET) |
1509 | * |
1510 | * "SET var TO DEFAULT" and "RESET var" are semantically equivalent, but we |
1511 | * preserve the distinction in VariableSetKind for CreateCommandTag(). |
1512 | * ---------------------- |
1513 | */ |
1514 | typedef enum { |
1515 | VAR_SET_VALUE, /* SET var = value */ |
1516 | VAR_SET_DEFAULT, /* SET var TO DEFAULT */ |
1517 | VAR_SET_CURRENT, /* SET var FROM CURRENT */ |
1518 | VAR_SET_MULTI, /* special case for SET TRANSACTION ... */ |
1519 | VAR_RESET, /* RESET var */ |
1520 | VAR_RESET_ALL /* RESET ALL */ |
1521 | } VariableSetKind; |
1522 | |
1523 | typedef enum { |
1524 | VAR_SET_SCOPE_LOCAL, /* SET LOCAL var */ |
1525 | VAR_SET_SCOPE_SESSION, /* SET SESSION var */ |
1526 | VAR_SET_SCOPE_GLOBAL, /* SET GLOBAL var */ |
1527 | VAR_SET_SCOPE_DEFAULT /* SET var (same as SET_SESSION) */ |
1528 | } VariableSetScope; |
1529 | |
1530 | typedef struct PGVariableSetStmt { |
1531 | PGNodeTag type; |
1532 | VariableSetKind kind; |
1533 | VariableSetScope scope; |
1534 | char *name; /* variable to be set */ |
1535 | PGList *args; /* PGList of PGAConst nodes */ |
1536 | } PGVariableSetStmt; |
1537 | |
1538 | /* ---------------------- |
1539 | * Show Statement |
1540 | * ---------------------- |
1541 | */ |
1542 | typedef struct PGVariableShowStmt { |
1543 | PGNodeTag type; |
1544 | char *name; |
1545 | int is_summary; // whether or not this is a DESCRIBE or a SUMMARIZE |
1546 | } PGVariableShowStmt; |
1547 | |
1548 | /* ---------------------- |
1549 | * Show Statement with Select Statement |
1550 | * ---------------------- |
1551 | */ |
1552 | typedef struct PGVariableShowSelectStmt |
1553 | { |
1554 | PGNodeTag type; |
1555 | PGNode *stmt; |
1556 | char *name; |
1557 | int is_summary; // whether or not this is a DESCRIBE or a SUMMARIZE |
1558 | } PGVariableShowSelectStmt; |
1559 | |
1560 | |
1561 | /* ---------------------- |
1562 | * Create Table Statement |
1563 | * |
1564 | * NOTE: in the raw gram.y output, PGColumnDef and PGConstraint nodes are |
1565 | * intermixed in tableElts, and constraints is NIL. After parse analysis, |
1566 | * tableElts contains just ColumnDefs, and constraints contains just |
1567 | * PGConstraint nodes (in fact, only PG_CONSTR_CHECK nodes, in the present |
1568 | * implementation). |
1569 | * ---------------------- |
1570 | */ |
1571 | |
1572 | typedef struct PGCreateStmt { |
1573 | PGNodeTag type; |
1574 | PGRangeVar *relation; /* relation to create */ |
1575 | PGList *tableElts; /* column definitions (list of PGColumnDef) */ |
1576 | PGList *inhRelations; /* relations to inherit from (list of |
1577 | * inhRelation) */ |
1578 | PGTypeName *ofTypename; /* OF typename */ |
1579 | PGList *constraints; /* constraints (list of PGConstraint nodes) */ |
1580 | PGList *options; /* options from WITH clause */ |
1581 | PGOnCommitAction oncommit; /* what do we do at COMMIT? */ |
1582 | char *tablespacename; /* table space to use, or NULL */ |
1583 | PGOnCreateConflict onconflict; /* what to do on create conflict */ |
1584 | } PGCreateStmt; |
1585 | |
1586 | /* ---------- |
1587 | * Definitions for constraints in PGCreateStmt |
1588 | * |
1589 | * Note that column defaults are treated as a type of constraint, |
1590 | * even though that's a bit odd semantically. |
1591 | * |
1592 | * For constraints that use expressions (CONSTR_CHECK, PG_CONSTR_DEFAULT) |
1593 | * we may have the expression in either "raw" form (an untransformed |
1594 | * parse tree) or "cooked" form (the nodeToString representation of |
1595 | * an executable expression tree), depending on how this PGConstraint |
1596 | * node was created (by parsing, or by inheritance from an existing |
1597 | * relation). We should never have both in the same node! |
1598 | * |
1599 | * PG_FKCONSTR_ACTION_xxx values are stored into pg_constraint.confupdtype |
1600 | * and pg_constraint.confdeltype columns; PG_FKCONSTR_MATCH_xxx values are |
1601 | * stored into pg_constraint.confmatchtype. Changing the code values may |
1602 | * require an initdb! |
1603 | * |
1604 | * If skip_validation is true then we skip checking that the existing rows |
1605 | * in the table satisfy the constraint, and just install the catalog entries |
1606 | * for the constraint. A new FK constraint is marked as valid iff |
1607 | * initially_valid is true. (Usually skip_validation and initially_valid |
1608 | * are inverses, but we can set both true if the table is known empty.) |
1609 | * |
1610 | * PGConstraint attributes (DEFERRABLE etc) are initially represented as |
1611 | * separate PGConstraint nodes for simplicity of parsing. parse_utilcmd.c makes |
1612 | * a pass through the constraints list to insert the info into the appropriate |
1613 | * PGConstraint node. |
1614 | * ---------- |
1615 | */ |
1616 | |
1617 | typedef enum PGConstrType /* types of constraints */ |
1618 | { PG_CONSTR_NULL, /* not standard SQL, but a lot of people |
1619 | * expect it */ |
1620 | PG_CONSTR_NOTNULL, |
1621 | PG_CONSTR_DEFAULT, |
1622 | PG_CONSTR_IDENTITY, |
1623 | PG_CONSTR_CHECK, |
1624 | PG_CONSTR_PRIMARY, |
1625 | PG_CONSTR_UNIQUE, |
1626 | PG_CONSTR_EXCLUSION, |
1627 | PG_CONSTR_FOREIGN, |
1628 | PG_CONSTR_ATTR_DEFERRABLE, /* attributes for previous constraint node */ |
1629 | PG_CONSTR_ATTR_NOT_DEFERRABLE, |
1630 | PG_CONSTR_ATTR_DEFERRED, |
1631 | PG_CONSTR_ATTR_IMMEDIATE, |
1632 | PG_CONSTR_COMPRESSION, |
1633 | PG_CONSTR_GENERATED_VIRTUAL, |
1634 | PG_CONSTR_GENERATED_STORED, |
1635 | } PGConstrType; |
1636 | |
1637 | /* Foreign key action codes */ |
1638 | #define PG_FKCONSTR_ACTION_NOACTION 'a' |
1639 | #define PG_FKCONSTR_ACTION_RESTRICT 'r' |
1640 | #define PG_FKCONSTR_ACTION_CASCADE 'c' |
1641 | #define PG_FKCONSTR_ACTION_SETNULL 'n' |
1642 | #define PG_FKCONSTR_ACTION_SETDEFAULT 'd' |
1643 | |
1644 | /* Foreign key matchtype codes */ |
1645 | #define PG_FKCONSTR_MATCH_FULL 'f' |
1646 | #define PG_FKCONSTR_MATCH_PARTIAL 'p' |
1647 | #define PG_FKCONSTR_MATCH_SIMPLE 's' |
1648 | |
1649 | typedef struct PGConstraint { |
1650 | PGNodeTag type; |
1651 | PGConstrType contype; /* see above */ |
1652 | |
1653 | /* Fields used for most/all constraint types: */ |
1654 | char *conname; /* PGConstraint name, or NULL if unnamed */ |
1655 | bool deferrable; /* DEFERRABLE? */ |
1656 | bool initdeferred; /* INITIALLY DEFERRED? */ |
1657 | int location; /* token location, or -1 if unknown */ |
1658 | |
1659 | /* Fields used for constraints with expressions (CHECK and DEFAULT): */ |
1660 | bool is_no_inherit; /* is constraint non-inheritable? */ |
1661 | PGNode *raw_expr; /* expr, as untransformed parse tree */ |
1662 | char *cooked_expr; /* expr, as nodeToString representation */ |
1663 | char generated_when; |
1664 | |
1665 | /* Fields used for unique constraints (UNIQUE and PRIMARY KEY): */ |
1666 | PGList *keys; /* String nodes naming referenced column(s) */ |
1667 | |
1668 | /* Fields used for EXCLUSION constraints: */ |
1669 | PGList *exclusions; /* list of (PGIndexElem, operator name) pairs */ |
1670 | |
1671 | /* Fields used for index constraints (UNIQUE, PRIMARY KEY, EXCLUSION): */ |
1672 | PGList *options; /* options from WITH clause */ |
1673 | char *indexname; /* existing index to use; otherwise NULL */ |
1674 | char *indexspace; /* index tablespace; NULL for default */ |
1675 | /* These could be, but currently are not, used for UNIQUE/PKEY: */ |
1676 | char *access_method; /* index access method; NULL for default */ |
1677 | PGNode *where_clause; /* partial index predicate */ |
1678 | |
1679 | /* Fields used for FOREIGN KEY constraints: */ |
1680 | PGRangeVar *pktable; /* Primary key table */ |
1681 | PGList *fk_attrs; /* Attributes of foreign key */ |
1682 | PGList *pk_attrs; /* Corresponding attrs in PK table */ |
1683 | char fk_matchtype; /* FULL, PARTIAL, SIMPLE */ |
1684 | char fk_upd_action; /* ON UPDATE action */ |
1685 | char fk_del_action; /* ON DELETE action */ |
1686 | PGList *old_conpfeqop; /* pg_constraint.conpfeqop of my former self */ |
1687 | PGOid old_pktable_oid; /* pg_constraint.confrelid of my former |
1688 | * self */ |
1689 | |
1690 | /* Fields used for constraints that allow a NOT VALID specification */ |
1691 | bool skip_validation; /* skip validation of existing rows? */ |
1692 | bool initially_valid; /* mark the new constraint as valid? */ |
1693 | |
1694 | |
1695 | /* Field Used for COMPRESSION constraint */ |
1696 | char *compression_name; /* existing index to use; otherwise NULL */ |
1697 | |
1698 | } PGConstraint; |
1699 | |
1700 | /* ---------------------- |
1701 | * {Create|Alter} SEQUENCE Statement |
1702 | * ---------------------- |
1703 | */ |
1704 | |
1705 | typedef struct PGCreateSeqStmt { |
1706 | PGNodeTag type; |
1707 | PGRangeVar *sequence; /* the sequence to create */ |
1708 | PGList *options; |
1709 | PGOid ownerId; /* ID of owner, or InvalidOid for default */ |
1710 | bool for_identity; |
1711 | PGOnCreateConflict onconflict; /* what to do on create conflict */ |
1712 | } PGCreateSeqStmt; |
1713 | |
1714 | typedef struct PGAlterSeqStmt { |
1715 | PGNodeTag type; |
1716 | PGRangeVar *sequence; /* the sequence to alter */ |
1717 | PGList *options; |
1718 | bool for_identity; |
1719 | bool missing_ok; /* skip error if a role is missing? */ |
1720 | } PGAlterSeqStmt; |
1721 | |
1722 | /* ---------------------- |
1723 | * CREATE FUNCTION Statement |
1724 | * ---------------------- |
1725 | */ |
1726 | |
1727 | typedef struct PGCreateFunctionStmt { |
1728 | PGNodeTag type; |
1729 | PGRangeVar *name; |
1730 | PGList *params; |
1731 | PGNode *function; |
1732 | PGNode *query; |
1733 | PGOnCreateConflict onconflict; |
1734 | } PGCreateFunctionStmt; |
1735 | |
1736 | /* ---------------------- |
1737 | * Drop Table|Sequence|View|Index|Type|Domain|Conversion|Schema Statement |
1738 | * ---------------------- |
1739 | */ |
1740 | |
1741 | typedef struct PGDropStmt { |
1742 | PGNodeTag type; |
1743 | PGList *objects; /* list of names */ |
1744 | PGObjectType removeType; /* object type */ |
1745 | PGDropBehavior behavior; /* RESTRICT or CASCADE behavior */ |
1746 | bool missing_ok; /* skip error if object is missing? */ |
1747 | bool concurrent; /* drop index concurrently? */ |
1748 | } PGDropStmt; |
1749 | |
1750 | /* ---------------------- |
1751 | * Create PGIndex Statement |
1752 | * |
1753 | * This represents creation of an index and/or an associated constraint. |
1754 | * If isconstraint is true, we should create a pg_constraint entry along |
1755 | * with the index. But if indexOid isn't InvalidOid, we are not creating an |
1756 | * index, just a UNIQUE/PKEY constraint using an existing index. isconstraint |
1757 | * must always be true in this case, and the fields describing the index |
1758 | * properties are empty. |
1759 | * ---------------------- |
1760 | */ |
1761 | typedef struct PGIndexStmt { |
1762 | PGNodeTag type; |
1763 | char *idxname; /* name of new index, or NULL for default */ |
1764 | PGRangeVar *relation; /* relation to build index on */ |
1765 | char *accessMethod; /* name of access method (eg. btree) */ |
1766 | char *tableSpace; /* tablespace, or NULL for default */ |
1767 | PGList *indexParams; /* columns to index: a list of PGIndexElem */ |
1768 | PGList *options; /* WITH clause options: a list of PGDefElem */ |
1769 | PGNode *whereClause; /* qualification (partial-index predicate) */ |
1770 | PGList *excludeOpNames; /* exclusion operator names, or NIL if none */ |
1771 | char *; /* comment to apply to index, or NULL */ |
1772 | PGOid indexOid; /* OID of an existing index, if any */ |
1773 | PGOid oldNode; /* relfilenode of existing storage, if any */ |
1774 | bool unique; /* is index unique? */ |
1775 | bool primary; /* is index a primary key? */ |
1776 | bool isconstraint; /* is it for a pkey/unique constraint? */ |
1777 | bool deferrable; /* is the constraint DEFERRABLE? */ |
1778 | bool initdeferred; /* is the constraint INITIALLY DEFERRED? */ |
1779 | bool transformed; /* true when transformIndexStmt is finished */ |
1780 | bool concurrent; /* should this be a concurrent index build? */ |
1781 | PGOnCreateConflict onconflict; /* what to do on create conflict */ |
1782 | } PGIndexStmt; |
1783 | |
1784 | /* ---------------------- |
1785 | * Alter Object Rename Statement |
1786 | * ---------------------- |
1787 | */ |
1788 | typedef struct PGRenameStmt { |
1789 | PGNodeTag type; |
1790 | PGObjectType renameType; /* PG_OBJECT_TABLE, PG_OBJECT_COLUMN, etc */ |
1791 | PGObjectType relationType; /* if column name, associated relation type */ |
1792 | PGRangeVar *relation; /* in case it's a table */ |
1793 | PGNode *object; /* in case it's some other object */ |
1794 | char *subname; /* name of contained object (column, rule, |
1795 | * trigger, etc) */ |
1796 | char *newname; /* the new name */ |
1797 | PGDropBehavior behavior; /* RESTRICT or CASCADE behavior */ |
1798 | bool missing_ok; /* skip error if missing? */ |
1799 | } PGRenameStmt; |
1800 | |
1801 | /* ---------------------- |
1802 | * ALTER object SET SCHEMA Statement |
1803 | * ---------------------- |
1804 | */ |
1805 | typedef struct PGAlterObjectSchemaStmt { |
1806 | PGNodeTag type; |
1807 | PGObjectType objectType; /* PG_OBJECT_TABLE, PG_OBJECT_TYPE, etc */ |
1808 | PGRangeVar *relation; /* in case it's a table */ |
1809 | PGNode *object; /* in case it's some other object */ |
1810 | char *newschema; /* the new schema */ |
1811 | bool missing_ok; /* skip error if missing? */ |
1812 | } PGAlterObjectSchemaStmt; |
1813 | |
1814 | /* ---------------------- |
1815 | * {Begin|Commit|Rollback} Transaction Statement |
1816 | * ---------------------- |
1817 | */ |
1818 | typedef enum PGTransactionStmtKind { |
1819 | PG_TRANS_STMT_BEGIN, |
1820 | PG_TRANS_STMT_START, /* semantically identical to BEGIN */ |
1821 | PG_TRANS_STMT_COMMIT, |
1822 | PG_TRANS_STMT_ROLLBACK, |
1823 | PG_TRANS_STMT_SAVEPOINT, |
1824 | PG_TRANS_STMT_RELEASE, |
1825 | PG_TRANS_STMT_ROLLBACK_TO, |
1826 | PG_TRANS_STMT_PREPARE, |
1827 | PG_TRANS_STMT_COMMIT_PREPARED, |
1828 | TRANS_STMT_ROLLBACK_PREPARED |
1829 | } PGTransactionStmtKind; |
1830 | |
1831 | typedef struct PGTransactionStmt { |
1832 | PGNodeTag type; |
1833 | PGTransactionStmtKind kind; /* see above */ |
1834 | PGList *options; /* for BEGIN/START and savepoint commands */ |
1835 | char *gid; /* for two-phase-commit related commands */ |
1836 | } PGTransactionStmt; |
1837 | |
1838 | /* ---------------------- |
1839 | * Create View Statement |
1840 | * ---------------------- |
1841 | */ |
1842 | typedef enum PGViewCheckOption { PG_NO_CHECK_OPTION, PG_LOCAL_CHECK_OPTION, CASCADED_CHECK_OPTION } PGViewCheckOption; |
1843 | |
1844 | typedef struct PGViewStmt { |
1845 | PGNodeTag type; |
1846 | PGRangeVar *view; /* the view to be created */ |
1847 | PGList *aliases; /* target column names */ |
1848 | PGNode *query; /* the SELECT query (as a raw parse tree) */ |
1849 | PGOnCreateConflict onconflict; /* what to do on create conflict */ |
1850 | PGList *options; /* options from WITH clause */ |
1851 | PGViewCheckOption withCheckOption; /* WITH CHECK OPTION */ |
1852 | } PGViewStmt; |
1853 | |
1854 | /* ---------------------- |
1855 | * Load Statement |
1856 | * ---------------------- |
1857 | */ |
1858 | |
1859 | typedef enum PGLoadInstallType { PG_LOAD_TYPE_LOAD, PG_LOAD_TYPE_INSTALL, PG_LOAD_TYPE_FORCE_INSTALL } PGLoadInstallType; |
1860 | |
1861 | |
1862 | typedef struct PGLoadStmt { |
1863 | PGNodeTag type; |
1864 | const char *filename; /* file to load */ |
1865 | PGLoadInstallType load_type; |
1866 | } PGLoadStmt; |
1867 | |
1868 | /* ---------------------- |
1869 | * Vacuum and Analyze Statements |
1870 | * |
1871 | * Even though these are nominally two statements, it's convenient to use |
1872 | * just one node type for both. Note that at least one of PG_VACOPT_VACUUM |
1873 | * and PG_VACOPT_ANALYZE must be set in options. |
1874 | * ---------------------- |
1875 | */ |
1876 | typedef enum PGVacuumOption { |
1877 | PG_VACOPT_VACUUM = 1 << 0, /* do VACUUM */ |
1878 | PG_VACOPT_ANALYZE = 1 << 1, /* do ANALYZE */ |
1879 | PG_VACOPT_VERBOSE = 1 << 2, /* print progress info */ |
1880 | PG_VACOPT_FREEZE = 1 << 3, /* FREEZE option */ |
1881 | PG_VACOPT_FULL = 1 << 4, /* FULL (non-concurrent) vacuum */ |
1882 | PG_VACOPT_NOWAIT = 1 << 5, /* don't wait to get lock (autovacuum only) */ |
1883 | PG_VACOPT_SKIPTOAST = 1 << 6, /* don't process the TOAST table, if any */ |
1884 | PG_VACOPT_DISABLE_PAGE_SKIPPING = 1 << 7 /* don't skip any pages */ |
1885 | } PGVacuumOption; |
1886 | |
1887 | typedef struct PGVacuumStmt { |
1888 | PGNodeTag type; |
1889 | int options; /* OR of PGVacuumOption flags */ |
1890 | PGRangeVar *relation; /* single table to process, or NULL */ |
1891 | PGList *va_cols; /* list of column names, or NIL for all */ |
1892 | } PGVacuumStmt; |
1893 | |
1894 | /* ---------------------- |
1895 | * Explain Statement |
1896 | * |
1897 | * The "query" field is initially a raw parse tree, and is converted to a |
1898 | * PGQuery node during parse analysis. Note that rewriting and planning |
1899 | * of the query are always postponed until execution. |
1900 | * ---------------------- |
1901 | */ |
1902 | typedef struct PGExplainStmt { |
1903 | PGNodeTag type; |
1904 | PGNode *query; /* the query (see comments above) */ |
1905 | PGList *options; /* list of PGDefElem nodes */ |
1906 | } PGExplainStmt; |
1907 | |
1908 | /* ---------------------- |
1909 | * CREATE TABLE AS Statement (a/k/a SELECT INTO) |
1910 | * |
1911 | * A query written as CREATE TABLE AS will produce this node type natively. |
1912 | * A query written as SELECT ... INTO will be transformed to this form during |
1913 | * parse analysis. |
1914 | * A query written as CREATE MATERIALIZED view will produce this node type, |
1915 | * during parse analysis, since it needs all the same data. |
1916 | * |
1917 | * The "query" field is handled similarly to EXPLAIN, though note that it |
1918 | * can be a SELECT or an EXECUTE, but not other DML statements. |
1919 | * ---------------------- |
1920 | */ |
1921 | typedef struct PGCreateTableAsStmt { |
1922 | PGNodeTag type; |
1923 | PGNode *query; /* the query (see comments above) */ |
1924 | PGIntoClause *into; /* destination table */ |
1925 | PGObjectType relkind; /* PG_OBJECT_TABLE or PG_OBJECT_MATVIEW */ |
1926 | bool is_select_into; /* it was written as SELECT INTO */ |
1927 | PGOnCreateConflict onconflict; /* what to do on create conflict */ |
1928 | } PGCreateTableAsStmt; |
1929 | |
1930 | /* ---------------------- |
1931 | * Checkpoint Statement |
1932 | * ---------------------- |
1933 | */ |
1934 | typedef struct PGCheckPointStmt { |
1935 | PGNodeTag type; |
1936 | bool force; |
1937 | char *name; |
1938 | } PGCheckPointStmt; |
1939 | |
1940 | /* ---------------------- |
1941 | * PREPARE Statement |
1942 | * ---------------------- |
1943 | */ |
1944 | typedef struct PGPrepareStmt { |
1945 | PGNodeTag type; |
1946 | char *name; /* Name of plan, arbitrary */ |
1947 | PGList *argtypes; /* Types of parameters (PGList of PGTypeName) */ |
1948 | PGNode *query; /* The query itself (as a raw parsetree) */ |
1949 | } PGPrepareStmt; |
1950 | |
1951 | /* ---------------------- |
1952 | * EXECUTE Statement |
1953 | * ---------------------- |
1954 | */ |
1955 | |
1956 | typedef struct PGExecuteStmt { |
1957 | PGNodeTag type; |
1958 | char *name; /* The name of the plan to execute */ |
1959 | PGList *params; /* Values to assign to parameters */ |
1960 | } PGExecuteStmt; |
1961 | |
1962 | /* ---------------------- |
1963 | * DEALLOCATE Statement |
1964 | * ---------------------- |
1965 | */ |
1966 | typedef struct PGDeallocateStmt { |
1967 | PGNodeTag type; |
1968 | char *name; /* The name of the plan to remove */ |
1969 | /* NULL means DEALLOCATE ALL */ |
1970 | } PGDeallocateStmt; |
1971 | |
1972 | /* ---------------------- |
1973 | * PRAGMA statements |
1974 | * Three types of pragma statements: |
1975 | * PRAGMA pragma_name; (NOTHING) |
1976 | * PRAGMA pragma_name='param'; (ASSIGNMENT) |
1977 | * PRAGMA pragma_name('param'); (CALL) |
1978 | * ---------------------- |
1979 | */ |
1980 | typedef enum { PG_PRAGMA_TYPE_NOTHING, PG_PRAGMA_TYPE_ASSIGNMENT, PG_PRAGMA_TYPE_CALL } PGPragmaKind; |
1981 | |
1982 | typedef struct PGPragmaStmt { |
1983 | PGNodeTag type; |
1984 | PGPragmaKind kind; |
1985 | char *name; /* variable to be set */ |
1986 | PGList *args; /* PGList of PGAConst nodes */ |
1987 | } PGPragmaStmt; |
1988 | |
1989 | /* ---------------------- |
1990 | * CALL Statement |
1991 | * ---------------------- |
1992 | */ |
1993 | |
1994 | typedef struct PGCallStmt { |
1995 | PGNodeTag type; |
1996 | PGNode *func; |
1997 | } PGCallStmt; |
1998 | |
1999 | /* ---------------------- |
2000 | * EXPORT/IMPORT Statements |
2001 | * ---------------------- |
2002 | */ |
2003 | |
2004 | typedef struct PGExportStmt { |
2005 | PGNodeTag type; |
2006 | char *database; /* database name */ |
2007 | char *filename; /* filename */ |
2008 | PGList *options; /* PGList of PGDefElem nodes */ |
2009 | } PGExportStmt; |
2010 | |
2011 | typedef struct PGImportStmt { |
2012 | PGNodeTag type; |
2013 | char *filename; /* filename */ |
2014 | } PGImportStmt; |
2015 | |
2016 | /* ---------------------- |
2017 | * Interval Constant |
2018 | * ---------------------- |
2019 | */ |
2020 | typedef struct PGIntervalConstant { |
2021 | PGNodeTag type; |
2022 | int val_type; /* interval constant type, either duckdb_libpgquery::T_PGString, duckdb_libpgquery::T_PGInteger or duckdb_libpgquery::T_PGAExpr */ |
2023 | char *sval; /* duckdb_libpgquery::T_PGString */ |
2024 | int ival; /* duckdb_libpgquery::T_PGString */ |
2025 | PGNode *eval; /* duckdb_libpgquery::T_PGAExpr */ |
2026 | PGList *typmods; /* how to interpret the interval constant (year, month, day, etc) */ |
2027 | int location; /* token location, or -1 if unknown */ |
2028 | } PGIntervalConstant; |
2029 | |
2030 | /* ---------------------- |
2031 | * Sample Options |
2032 | * ---------------------- |
2033 | */ |
2034 | typedef struct PGSampleSize { |
2035 | PGNodeTag type; |
2036 | bool is_percentage; /* whether or not the sample size is expressed in row numbers or a percentage */ |
2037 | PGValue sample_size; /* sample size */ |
2038 | } PGSampleSize; |
2039 | |
2040 | typedef struct PGSampleOptions { |
2041 | PGNodeTag type; |
2042 | PGNode *sample_size; /* the size of the sample to take */ |
2043 | char *method; /* sample method, or NULL for default */ |
2044 | bool has_seed; /* if the sample method has seed */ |
2045 | int seed; /* the seed value if set; */ |
2046 | int location; /* token location, or -1 if unknown */ |
2047 | } PGSampleOptions; |
2048 | |
2049 | /* ---------------------- |
2050 | * Limit Percentage |
2051 | * ---------------------- |
2052 | */ |
2053 | typedef struct PGLimitPercent { |
2054 | PGNodeTag type; |
2055 | PGNode* limit_percent; /* limit percent */ |
2056 | } PGLimitPercent; |
2057 | |
2058 | /* ---------------------- |
2059 | * Lambda Function (or Arrow Operator) |
2060 | * ---------------------- |
2061 | */ |
2062 | typedef struct PGLambdaFunction { |
2063 | PGNodeTag type; |
2064 | PGNode *lhs; /* parameter expression */ |
2065 | PGNode *rhs; /* lambda expression */ |
2066 | int location; /* token location, or -1 if unknown */ |
2067 | } PGLambdaFunction; |
2068 | |
2069 | /* ---------------------- |
2070 | * Positional Reference |
2071 | * ---------------------- |
2072 | */ |
2073 | typedef struct PGPositionalReference { |
2074 | PGNodeTag type; |
2075 | int position; |
2076 | int location; /* token location, or -1 if unknown */ |
2077 | } PGPositionalReference; |
2078 | |
2079 | /* ---------------------- |
2080 | * Type Statement |
2081 | * ---------------------- |
2082 | */ |
2083 | |
2084 | typedef enum { PG_NEWTYPE_NONE, PG_NEWTYPE_ENUM, PG_NEWTYPE_ALIAS } PGNewTypeKind; |
2085 | |
2086 | typedef struct PGCreateTypeStmt |
2087 | { |
2088 | PGNodeTag type; |
2089 | PGNewTypeKind kind; |
2090 | PGRangeVar *typeName; /* qualified name (list of Value strings) */ |
2091 | PGList *vals; /* enum values (list of Value strings) */ |
2092 | PGTypeName *ofType; /* original type of alias name */ |
2093 | PGNode *query; |
2094 | } PGCreateTypeStmt; |
2095 | |
2096 | /* ---------------------- |
2097 | * Attach Statement |
2098 | * ---------------------- |
2099 | */ |
2100 | |
2101 | typedef struct PGAttachStmt |
2102 | { |
2103 | PGNodeTag type; |
2104 | char *path; /* The file path of the to-be-attached database */ |
2105 | char *name; /* The name of the attached database */ |
2106 | PGList *options; /* PGList of PGDefElem nodes */ |
2107 | PGNode *query; |
2108 | } PGAttachStmt; |
2109 | |
2110 | /* ---------------------- |
2111 | * Dettach Statement |
2112 | * ---------------------- |
2113 | */ |
2114 | |
2115 | typedef struct PGDetachStmt |
2116 | { |
2117 | PGNodeTag type; |
2118 | char *db_name; /* list of names of attached databases */ |
2119 | bool missing_ok; |
2120 | } PGDetachStmt; |
2121 | |
2122 | /* ---------------------- |
2123 | * Use Statement |
2124 | * ---------------------- |
2125 | */ |
2126 | |
2127 | typedef struct PGUseStmt { |
2128 | PGNodeTag type; |
2129 | PGRangeVar *name; /* variable to be set */ |
2130 | } PGUseStmt; |
2131 | |
2132 | |
2133 | } |
2134 | |