~ubuntu-branches/ubuntu/oneiric/postgresql-9.1/oneiric-security

« back to all changes in this revision

Viewing changes to src/include/nodes/parsenodes.h

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2011-05-11 10:41:53 UTC
  • Revision ID: james.westby@ubuntu.com-20110511104153-psbh2o58553fv1m0
Tags: upstream-9.1~beta1
ImportĀ upstreamĀ versionĀ 9.1~beta1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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.
 
11
 *
 
12
 *
 
13
 * Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
 
14
 * Portions Copyright (c) 1994, Regents of the University of California
 
15
 *
 
16
 * src/include/nodes/parsenodes.h
 
17
 *
 
18
 *-------------------------------------------------------------------------
 
19
 */
 
20
#ifndef PARSENODES_H
 
21
#define PARSENODES_H
 
22
 
 
23
#include "nodes/bitmapset.h"
 
24
#include "nodes/primnodes.h"
 
25
#include "nodes/value.h"
 
26
 
 
27
/* Possible sources of a Query */
 
28
typedef enum QuerySource
 
29
{
 
30
        QSRC_ORIGINAL,                          /* original parsetree (explicit query) */
 
31
        QSRC_PARSER,                            /* added by parse analysis (now unused) */
 
32
        QSRC_INSTEAD_RULE,                      /* added by unconditional INSTEAD rule */
 
33
        QSRC_QUAL_INSTEAD_RULE,         /* added by conditional INSTEAD rule */
 
34
        QSRC_NON_INSTEAD_RULE           /* added by non-INSTEAD rule */
 
35
} QuerySource;
 
36
 
 
37
/* Sort ordering options for ORDER BY and CREATE INDEX */
 
38
typedef enum SortByDir
 
39
{
 
40
        SORTBY_DEFAULT,
 
41
        SORTBY_ASC,
 
42
        SORTBY_DESC,
 
43
        SORTBY_USING                            /* not allowed in CREATE INDEX ... */
 
44
} SortByDir;
 
45
 
 
46
typedef enum SortByNulls
 
47
{
 
48
        SORTBY_NULLS_DEFAULT,
 
49
        SORTBY_NULLS_FIRST,
 
50
        SORTBY_NULLS_LAST
 
51
} SortByNulls;
 
52
 
 
53
/*
 
54
 * Grantable rights are encoded so that we can OR them together in a bitmask.
 
55
 * The present representation of AclItem limits us to 16 distinct rights,
 
56
 * even though AclMode is defined as uint32.  See utils/acl.h.
 
57
 *
 
58
 * Caution: changing these codes breaks stored ACLs, hence forces initdb.
 
59
 */
 
60
typedef uint32 AclMode;                 /* a bitmask of privilege bits */
 
61
 
 
62
#define ACL_INSERT              (1<<0)  /* for relations */
 
63
#define ACL_SELECT              (1<<1)
 
64
#define ACL_UPDATE              (1<<2)
 
65
#define ACL_DELETE              (1<<3)
 
66
#define ACL_TRUNCATE    (1<<4)
 
67
#define ACL_REFERENCES  (1<<5)
 
68
#define ACL_TRIGGER             (1<<6)
 
69
#define ACL_EXECUTE             (1<<7)  /* for functions */
 
70
#define ACL_USAGE               (1<<8)  /* for languages, namespaces, FDWs, and
 
71
                                                                 * servers */
 
72
#define ACL_CREATE              (1<<9)  /* for namespaces and databases */
 
73
#define ACL_CREATE_TEMP (1<<10) /* for databases */
 
74
#define ACL_CONNECT             (1<<11) /* for databases */
 
75
#define N_ACL_RIGHTS    12              /* 1 plus the last 1<<x */
 
76
#define ACL_NO_RIGHTS   0
 
77
/* Currently, SELECT ... FOR UPDATE/FOR SHARE requires UPDATE privileges */
 
78
#define ACL_SELECT_FOR_UPDATE   ACL_UPDATE
 
79
 
 
80
 
 
81
/*****************************************************************************
 
82
 *      Query Tree
 
83
 *****************************************************************************/
 
84
 
 
85
/*
 
86
 * Query -
 
87
 *        Parse analysis turns all statements into a Query tree (via transformStmt)
 
88
 *        for further processing by the rewriter and planner.
 
89
 *
 
90
 *        Utility statements (i.e. non-optimizable statements) have the
 
91
 *        utilityStmt field set, and the Query itself is mostly dummy.
 
92
 *        DECLARE CURSOR is a special case: it is represented like a SELECT,
 
93
 *        but the original DeclareCursorStmt is stored in utilityStmt.
 
94
 *
 
95
 *        Planning converts a Query tree into a Plan tree headed by a PlannedStmt
 
96
 *        node --- the Query structure is not used by the executor.
 
97
 */
 
98
typedef struct Query
 
99
{
 
100
        NodeTag         type;
 
101
 
 
102
        CmdType         commandType;    /* select|insert|update|delete|utility */
 
103
 
 
104
        QuerySource querySource;        /* where did I come from? */
 
105
 
 
106
        bool            canSetTag;              /* do I set the command result tag? */
 
107
 
 
108
        Node       *utilityStmt;        /* non-null if this is DECLARE CURSOR or a
 
109
                                                                 * non-optimizable statement */
 
110
 
 
111
        int                     resultRelation; /* rtable index of target relation for
 
112
                                                                 * INSERT/UPDATE/DELETE; 0 for SELECT */
 
113
 
 
114
        IntoClause *intoClause;         /* target for SELECT INTO / CREATE TABLE AS */
 
115
 
 
116
        bool            hasAggs;                /* has aggregates in tlist or havingQual */
 
117
        bool            hasWindowFuncs; /* has window functions in tlist */
 
118
        bool            hasSubLinks;    /* has subquery SubLink */
 
119
        bool            hasDistinctOn;  /* distinctClause is from DISTINCT ON */
 
120
        bool            hasRecursive;   /* WITH RECURSIVE was specified */
 
121
        bool            hasModifyingCTE;        /* has INSERT/UPDATE/DELETE in WITH */
 
122
        bool            hasForUpdate;   /* FOR UPDATE or FOR SHARE was specified */
 
123
 
 
124
        List       *cteList;            /* WITH list (of CommonTableExpr's) */
 
125
 
 
126
        List       *rtable;                     /* list of range table entries */
 
127
        FromExpr   *jointree;           /* table join tree (FROM and WHERE clauses) */
 
128
 
 
129
        List       *targetList;         /* target list (of TargetEntry) */
 
130
 
 
131
        List       *returningList;      /* return-values list (of TargetEntry) */
 
132
 
 
133
        List       *groupClause;        /* a list of SortGroupClause's */
 
134
 
 
135
        Node       *havingQual;         /* qualifications applied to groups */
 
136
 
 
137
        List       *windowClause;       /* a list of WindowClause's */
 
138
 
 
139
        List       *distinctClause; /* a list of SortGroupClause's */
 
140
 
 
141
        List       *sortClause;         /* a list of SortGroupClause's */
 
142
 
 
143
        Node       *limitOffset;        /* # of result tuples to skip (int8 expr) */
 
144
        Node       *limitCount;         /* # of result tuples to return (int8 expr) */
 
145
 
 
146
        List       *rowMarks;           /* a list of RowMarkClause's */
 
147
 
 
148
        Node       *setOperations;      /* set-operation tree if this is top level of
 
149
                                                                 * a UNION/INTERSECT/EXCEPT query */
 
150
 
 
151
        List       *constraintDeps; /* a list of pg_constraint OIDs that the query
 
152
                                                                 * depends on to be semantically valid */
 
153
} Query;
 
154
 
 
155
 
 
156
/****************************************************************************
 
157
 *      Supporting data structures for Parse Trees
 
158
 *
 
159
 *      Most of these node types appear in raw parsetrees output by the grammar,
 
160
 *      and get transformed to something else by the analyzer.  A few of them
 
161
 *      are used as-is in transformed querytrees.
 
162
 ****************************************************************************/
 
163
 
 
164
/*
 
165
 * TypeName - specifies a type in definitions
 
166
 *
 
167
 * For TypeName structures generated internally, it is often easier to
 
168
 * specify the type by OID than by name.  If "names" is NIL then the
 
169
 * actual type OID is given by typeOid, otherwise typeOid is unused.
 
170
 * Similarly, if "typmods" is NIL then the actual typmod is expected to
 
171
 * be prespecified in typemod, otherwise typemod is unused.
 
172
 *
 
173
 * If pct_type is TRUE, then names is actually a field name and we look up
 
174
 * the type of that field.      Otherwise (the normal case), names is a type
 
175
 * name possibly qualified with schema and database name.
 
176
 */
 
177
typedef struct TypeName
 
178
{
 
179
        NodeTag         type;
 
180
        List       *names;                      /* qualified name (list of Value strings) */
 
181
        Oid                     typeOid;                /* type identified by OID */
 
182
        bool            setof;                  /* is a set? */
 
183
        bool            pct_type;               /* %TYPE specified? */
 
184
        List       *typmods;            /* type modifier expression(s) */
 
185
        int32           typemod;                /* prespecified type modifier */
 
186
        List       *arrayBounds;        /* array bounds */
 
187
        int                     location;               /* token location, or -1 if unknown */
 
188
} TypeName;
 
189
 
 
190
/*
 
191
 * ColumnRef - specifies a reference to a column, or possibly a whole tuple
 
192
 *
 
193
 * The "fields" list must be nonempty.  It can contain string Value nodes
 
194
 * (representing names) and A_Star nodes (representing occurrence of a '*').
 
195
 * Currently, A_Star must appear only as the last list element --- the grammar
 
196
 * is responsible for enforcing this!
 
197
 *
 
198
 * Note: any array subscripting or selection of fields from composite columns
 
199
 * is represented by an A_Indirection node above the ColumnRef.  However,
 
200
 * for simplicity in the normal case, initial field selection from a table
 
201
 * name is represented within ColumnRef and not by adding A_Indirection.
 
202
 */
 
203
typedef struct ColumnRef
 
204
{
 
205
        NodeTag         type;
 
206
        List       *fields;                     /* field names (Value strings) or A_Star */
 
207
        int                     location;               /* token location, or -1 if unknown */
 
208
} ColumnRef;
 
209
 
 
210
/*
 
211
 * ParamRef - specifies a $n parameter reference
 
212
 */
 
213
typedef struct ParamRef
 
214
{
 
215
        NodeTag         type;
 
216
        int                     number;                 /* the number of the parameter */
 
217
        int                     location;               /* token location, or -1 if unknown */
 
218
} ParamRef;
 
219
 
 
220
/*
 
221
 * A_Expr - infix, prefix, and postfix expressions
 
222
 */
 
223
typedef enum A_Expr_Kind
 
224
{
 
225
        AEXPR_OP,                                       /* normal operator */
 
226
        AEXPR_AND,                                      /* booleans - name field is unused */
 
227
        AEXPR_OR,
 
228
        AEXPR_NOT,
 
229
        AEXPR_OP_ANY,                           /* scalar op ANY (array) */
 
230
        AEXPR_OP_ALL,                           /* scalar op ALL (array) */
 
231
        AEXPR_DISTINCT,                         /* IS DISTINCT FROM - name must be "=" */
 
232
        AEXPR_NULLIF,                           /* NULLIF - name must be "=" */
 
233
        AEXPR_OF,                                       /* IS [NOT] OF - name must be "=" or "<>" */
 
234
        AEXPR_IN                                        /* [NOT] IN - name must be "=" or "<>" */
 
235
} A_Expr_Kind;
 
236
 
 
237
typedef struct A_Expr
 
238
{
 
239
        NodeTag         type;
 
240
        A_Expr_Kind kind;                       /* see above */
 
241
        List       *name;                       /* possibly-qualified name of operator */
 
242
        Node       *lexpr;                      /* left argument, or NULL if none */
 
243
        Node       *rexpr;                      /* right argument, or NULL if none */
 
244
        int                     location;               /* token location, or -1 if unknown */
 
245
} A_Expr;
 
246
 
 
247
/*
 
248
 * A_Const - a literal constant
 
249
 */
 
250
typedef struct A_Const
 
251
{
 
252
        NodeTag         type;
 
253
        Value           val;                    /* value (includes type info, see value.h) */
 
254
        int                     location;               /* token location, or -1 if unknown */
 
255
} A_Const;
 
256
 
 
257
/*
 
258
 * TypeCast - a CAST expression
 
259
 */
 
260
typedef struct TypeCast
 
261
{
 
262
        NodeTag         type;
 
263
        Node       *arg;                        /* the expression being casted */
 
264
        TypeName   *typeName;           /* the target type */
 
265
        int                     location;               /* token location, or -1 if unknown */
 
266
} TypeCast;
 
267
 
 
268
/*
 
269
 * CollateClause - a COLLATE expression
 
270
 */
 
271
typedef struct CollateClause
 
272
{
 
273
        NodeTag         type;
 
274
        Node       *arg;                        /* input expression */
 
275
        List       *collname;           /* possibly-qualified collation name */
 
276
        int                     location;               /* token location, or -1 if unknown */
 
277
} CollateClause;
 
278
 
 
279
/*
 
280
 * FuncCall - a function or aggregate invocation
 
281
 *
 
282
 * agg_order (if not NIL) indicates we saw 'foo(... ORDER BY ...)'.
 
283
 * agg_star indicates we saw a 'foo(*)' construct, while agg_distinct
 
284
 * indicates we saw 'foo(DISTINCT ...)'.  In any of these cases, the
 
285
 * construct *must* be an aggregate call.  Otherwise, it might be either an
 
286
 * aggregate or some other kind of function.  However, if OVER is present
 
287
 * it had better be an aggregate or window function.
 
288
 */
 
289
typedef struct FuncCall
 
290
{
 
291
        NodeTag         type;
 
292
        List       *funcname;           /* qualified name of function */
 
293
        List       *args;                       /* the arguments (list of exprs) */
 
294
        List       *agg_order;          /* ORDER BY (list of SortBy) */
 
295
        bool            agg_star;               /* argument was really '*' */
 
296
        bool            agg_distinct;   /* arguments were labeled DISTINCT */
 
297
        bool            func_variadic;  /* last argument was labeled VARIADIC */
 
298
        struct WindowDef *over;         /* OVER clause, if any */
 
299
        int                     location;               /* token location, or -1 if unknown */
 
300
} FuncCall;
 
301
 
 
302
/*
 
303
 * A_Star - '*' representing all columns of a table or compound field
 
304
 *
 
305
 * This can appear within ColumnRef.fields, A_Indirection.indirection, and
 
306
 * ResTarget.indirection lists.
 
307
 */
 
308
typedef struct A_Star
 
309
{
 
310
        NodeTag         type;
 
311
} A_Star;
 
312
 
 
313
/*
 
314
 * A_Indices - array subscript or slice bounds ([lidx:uidx] or [uidx])
 
315
 */
 
316
typedef struct A_Indices
 
317
{
 
318
        NodeTag         type;
 
319
        Node       *lidx;                       /* NULL if it's a single subscript */
 
320
        Node       *uidx;
 
321
} A_Indices;
 
322
 
 
323
/*
 
324
 * A_Indirection - select a field and/or array element from an expression
 
325
 *
 
326
 * The indirection list can contain A_Indices nodes (representing
 
327
 * subscripting), string Value nodes (representing field selection --- the
 
328
 * string value is the name of the field to select), and A_Star nodes
 
329
 * (representing selection of all fields of a composite type).
 
330
 * For example, a complex selection operation like
 
331
 *                              (foo).field1[42][7].field2
 
332
 * would be represented with a single A_Indirection node having a 4-element
 
333
 * indirection list.
 
334
 *
 
335
 * Currently, A_Star must appear only as the last list element --- the grammar
 
336
 * is responsible for enforcing this!
 
337
 */
 
338
typedef struct A_Indirection
 
339
{
 
340
        NodeTag         type;
 
341
        Node       *arg;                        /* the thing being selected from */
 
342
        List       *indirection;        /* subscripts and/or field names and/or * */
 
343
} A_Indirection;
 
344
 
 
345
/*
 
346
 * A_ArrayExpr - an ARRAY[] construct
 
347
 */
 
348
typedef struct A_ArrayExpr
 
349
{
 
350
        NodeTag         type;
 
351
        List       *elements;           /* array element expressions */
 
352
        int                     location;               /* token location, or -1 if unknown */
 
353
} A_ArrayExpr;
 
354
 
 
355
/*
 
356
 * ResTarget -
 
357
 *        result target (used in target list of pre-transformed parse trees)
 
358
 *
 
359
 * In a SELECT target list, 'name' is the column label from an
 
360
 * 'AS ColumnLabel' clause, or NULL if there was none, and 'val' is the
 
361
 * value expression itself.  The 'indirection' field is not used.
 
362
 *
 
363
 * INSERT uses ResTarget in its target-column-names list.  Here, 'name' is
 
364
 * the name of the destination column, 'indirection' stores any subscripts
 
365
 * attached to the destination, and 'val' is not used.
 
366
 *
 
367
 * In an UPDATE target list, 'name' is the name of the destination column,
 
368
 * 'indirection' stores any subscripts attached to the destination, and
 
369
 * 'val' is the expression to assign.
 
370
 *
 
371
 * See A_Indirection for more info about what can appear in 'indirection'.
 
372
 */
 
373
typedef struct ResTarget
 
374
{
 
375
        NodeTag         type;
 
376
        char       *name;                       /* column name or NULL */
 
377
        List       *indirection;        /* subscripts, field names, and '*', or NIL */
 
378
        Node       *val;                        /* the value expression to compute or assign */
 
379
        int                     location;               /* token location, or -1 if unknown */
 
380
} ResTarget;
 
381
 
 
382
/*
 
383
 * SortBy - for ORDER BY clause
 
384
 */
 
385
typedef struct SortBy
 
386
{
 
387
        NodeTag         type;
 
388
        Node       *node;                       /* expression to sort on */
 
389
        SortByDir       sortby_dir;             /* ASC/DESC/USING/default */
 
390
        SortByNulls sortby_nulls;       /* NULLS FIRST/LAST */
 
391
        List       *useOp;                      /* name of op to use, if SORTBY_USING */
 
392
        int                     location;               /* operator location, or -1 if none/unknown */
 
393
} SortBy;
 
394
 
 
395
/*
 
396
 * WindowDef - raw representation of WINDOW and OVER clauses
 
397
 *
 
398
 * For entries in a WINDOW list, "name" is the window name being defined.
 
399
 * For OVER clauses, we use "name" for the "OVER window" syntax, or "refname"
 
400
 * for the "OVER (window)" syntax, which is subtly different --- the latter
 
401
 * implies overriding the window frame clause.
 
402
 */
 
403
typedef struct WindowDef
 
404
{
 
405
        NodeTag         type;
 
406
        char       *name;                       /* window's own name */
 
407
        char       *refname;            /* referenced window name, if any */
 
408
        List       *partitionClause;    /* PARTITION BY expression list */
 
409
        List       *orderClause;        /* ORDER BY (list of SortBy) */
 
410
        int                     frameOptions;   /* frame_clause options, see below */
 
411
        Node       *startOffset;        /* expression for starting bound, if any */
 
412
        Node       *endOffset;          /* expression for ending bound, if any */
 
413
        int                     location;               /* parse location, or -1 if none/unknown */
 
414
} WindowDef;
 
415
 
 
416
/*
 
417
 * frameOptions is an OR of these bits.  The NONDEFAULT and BETWEEN bits are
 
418
 * used so that ruleutils.c can tell which properties were specified and
 
419
 * which were defaulted; the correct behavioral bits must be set either way.
 
420
 * The START_foo and END_foo options must come in pairs of adjacent bits for
 
421
 * the convenience of gram.y, even though some of them are useless/invalid.
 
422
 * We will need more bits (and fields) to cover the full SQL:2008 option set.
 
423
 */
 
424
#define FRAMEOPTION_NONDEFAULT                                  0x00001 /* any specified? */
 
425
#define FRAMEOPTION_RANGE                                               0x00002 /* RANGE behavior */
 
426
#define FRAMEOPTION_ROWS                                                0x00004 /* ROWS behavior */
 
427
#define FRAMEOPTION_BETWEEN                                             0x00008 /* BETWEEN given? */
 
428
#define FRAMEOPTION_START_UNBOUNDED_PRECEDING   0x00010 /* start is U. P. */
 
429
#define FRAMEOPTION_END_UNBOUNDED_PRECEDING             0x00020 /* (disallowed) */
 
430
#define FRAMEOPTION_START_UNBOUNDED_FOLLOWING   0x00040 /* (disallowed) */
 
431
#define FRAMEOPTION_END_UNBOUNDED_FOLLOWING             0x00080 /* end is U. F. */
 
432
#define FRAMEOPTION_START_CURRENT_ROW                   0x00100 /* start is C. R. */
 
433
#define FRAMEOPTION_END_CURRENT_ROW                             0x00200 /* end is C. R. */
 
434
#define FRAMEOPTION_START_VALUE_PRECEDING               0x00400 /* start is V. P. */
 
435
#define FRAMEOPTION_END_VALUE_PRECEDING                 0x00800 /* end is V. P. */
 
436
#define FRAMEOPTION_START_VALUE_FOLLOWING               0x01000 /* start is V. F. */
 
437
#define FRAMEOPTION_END_VALUE_FOLLOWING                 0x02000 /* end is V. F. */
 
438
 
 
439
#define FRAMEOPTION_START_VALUE \
 
440
        (FRAMEOPTION_START_VALUE_PRECEDING | FRAMEOPTION_START_VALUE_FOLLOWING)
 
441
#define FRAMEOPTION_END_VALUE \
 
442
        (FRAMEOPTION_END_VALUE_PRECEDING | FRAMEOPTION_END_VALUE_FOLLOWING)
 
443
 
 
444
#define FRAMEOPTION_DEFAULTS \
 
445
        (FRAMEOPTION_RANGE | FRAMEOPTION_START_UNBOUNDED_PRECEDING | \
 
446
         FRAMEOPTION_END_CURRENT_ROW)
 
447
 
 
448
/*
 
449
 * RangeSubselect - subquery appearing in a FROM clause
 
450
 */
 
451
typedef struct RangeSubselect
 
452
{
 
453
        NodeTag         type;
 
454
        Node       *subquery;           /* the untransformed sub-select clause */
 
455
        Alias      *alias;                      /* table alias & optional column aliases */
 
456
} RangeSubselect;
 
457
 
 
458
/*
 
459
 * RangeFunction - function call appearing in a FROM clause
 
460
 */
 
461
typedef struct RangeFunction
 
462
{
 
463
        NodeTag         type;
 
464
        Node       *funccallnode;       /* untransformed function call tree */
 
465
        Alias      *alias;                      /* table alias & optional column aliases */
 
466
        List       *coldeflist;         /* list of ColumnDef nodes to describe result
 
467
                                                                 * of function returning RECORD */
 
468
} RangeFunction;
 
469
 
 
470
/*
 
471
 * ColumnDef - column definition (used in various creates)
 
472
 *
 
473
 * If the column has a default value, we may have the value expression
 
474
 * in either "raw" form (an untransformed parse tree) or "cooked" form
 
475
 * (a post-parse-analysis, executable expression tree), depending on
 
476
 * how this ColumnDef node was created (by parsing, or by inheritance
 
477
 * from an existing relation).  We should never have both in the same node!
 
478
 *
 
479
 * Similarly, we may have a COLLATE specification in either raw form
 
480
 * (represented as a CollateClause with arg==NULL) or cooked form
 
481
 * (the collation's OID).
 
482
 *
 
483
 * The constraints list may contain a CONSTR_DEFAULT item in a raw
 
484
 * parsetree produced by gram.y, but transformCreateStmt will remove
 
485
 * the item and set raw_default instead.  CONSTR_DEFAULT items
 
486
 * should not appear in any subsequent processing.
 
487
 */
 
488
typedef struct ColumnDef
 
489
{
 
490
        NodeTag         type;
 
491
        char       *colname;            /* name of column */
 
492
        TypeName   *typeName;           /* type of column */
 
493
        int                     inhcount;               /* number of times column is inherited */
 
494
        bool            is_local;               /* column has local (non-inherited) def'n */
 
495
        bool            is_not_null;    /* NOT NULL constraint specified? */
 
496
        bool            is_from_type;   /* column definition came from table type */
 
497
        char            storage;                /* attstorage setting, or 0 for default */
 
498
        Node       *raw_default;        /* default value (untransformed parse tree) */
 
499
        Node       *cooked_default; /* default value (transformed expr tree) */
 
500
        CollateClause *collClause;      /* untransformed COLLATE spec, if any */
 
501
        Oid                     collOid;                /* collation OID (InvalidOid if not set) */
 
502
        List       *constraints;        /* other constraints on column */
 
503
} ColumnDef;
 
504
 
 
505
/*
 
506
 * inhRelation - Relation a CREATE TABLE is to inherit attributes of
 
507
 */
 
508
typedef struct InhRelation
 
509
{
 
510
        NodeTag         type;
 
511
        RangeVar   *relation;
 
512
        bits32          options;                /* OR of CreateStmtLikeOption flags */
 
513
} InhRelation;
 
514
 
 
515
typedef enum CreateStmtLikeOption
 
516
{
 
517
        CREATE_TABLE_LIKE_DEFAULTS = 1 << 0,
 
518
        CREATE_TABLE_LIKE_CONSTRAINTS = 1 << 1,
 
519
        CREATE_TABLE_LIKE_INDEXES = 1 << 2,
 
520
        CREATE_TABLE_LIKE_STORAGE = 1 << 3,
 
521
        CREATE_TABLE_LIKE_COMMENTS = 1 << 4,
 
522
        CREATE_TABLE_LIKE_ALL = 0x7FFFFFFF
 
523
} CreateStmtLikeOption;
 
524
 
 
525
/*
 
526
 * IndexElem - index parameters (used in CREATE INDEX)
 
527
 *
 
528
 * For a plain index attribute, 'name' is the name of the table column to
 
529
 * index, and 'expr' is NULL.  For an index expression, 'name' is NULL and
 
530
 * 'expr' is the expression tree.
 
531
 */
 
532
typedef struct IndexElem
 
533
{
 
534
        NodeTag         type;
 
535
        char       *name;                       /* name of attribute to index, or NULL */
 
536
        Node       *expr;                       /* expression to index, or NULL */
 
537
        char       *indexcolname;       /* name for index column; NULL = default */
 
538
        List       *collation;          /* name of collation; NIL = default */
 
539
        List       *opclass;            /* name of desired opclass; NIL = default */
 
540
        SortByDir       ordering;               /* ASC/DESC/default */
 
541
        SortByNulls nulls_ordering; /* FIRST/LAST/default */
 
542
} IndexElem;
 
543
 
 
544
/*
 
545
 * DefElem - a generic "name = value" option definition
 
546
 *
 
547
 * In some contexts the name can be qualified.  Also, certain SQL commands
 
548
 * allow a SET/ADD/DROP action to be attached to option settings, so it's
 
549
 * convenient to carry a field for that too.  (Note: currently, it is our
 
550
 * practice that the grammar allows namespace and action only in statements
 
551
 * where they are relevant; C code can just ignore those fields in other
 
552
 * statements.)
 
553
 */
 
554
typedef enum DefElemAction
 
555
{
 
556
        DEFELEM_UNSPEC,                         /* no action given */
 
557
        DEFELEM_SET,
 
558
        DEFELEM_ADD,
 
559
        DEFELEM_DROP
 
560
} DefElemAction;
 
561
 
 
562
typedef struct DefElem
 
563
{
 
564
        NodeTag         type;
 
565
        char       *defnamespace;       /* NULL if unqualified name */
 
566
        char       *defname;
 
567
        Node       *arg;                        /* a (Value *) or a (TypeName *) */
 
568
        DefElemAction defaction;        /* unspecified action, or SET/ADD/DROP */
 
569
} DefElem;
 
570
 
 
571
/*
 
572
 * LockingClause - raw representation of FOR UPDATE/SHARE options
 
573
 *
 
574
 * Note: lockedRels == NIL means "all relations in query".      Otherwise it
 
575
 * is a list of RangeVar nodes.  (We use RangeVar mainly because it carries
 
576
 * a location field --- currently, parse analysis insists on unqualified
 
577
 * names in LockingClause.)
 
578
 */
 
579
typedef struct LockingClause
 
580
{
 
581
        NodeTag         type;
 
582
        List       *lockedRels;         /* FOR UPDATE or FOR SHARE relations */
 
583
        bool            forUpdate;              /* true = FOR UPDATE, false = FOR SHARE */
 
584
        bool            noWait;                 /* NOWAIT option */
 
585
} LockingClause;
 
586
 
 
587
/*
 
588
 * XMLSERIALIZE (in raw parse tree only)
 
589
 */
 
590
typedef struct XmlSerialize
 
591
{
 
592
        NodeTag         type;
 
593
        XmlOptionType xmloption;        /* DOCUMENT or CONTENT */
 
594
        Node       *expr;
 
595
        TypeName   *typeName;
 
596
        int                     location;               /* token location, or -1 if unknown */
 
597
} XmlSerialize;
 
598
 
 
599
 
 
600
/****************************************************************************
 
601
 *      Nodes for a Query tree
 
602
 ****************************************************************************/
 
603
 
 
604
/*--------------------
 
605
 * RangeTblEntry -
 
606
 *        A range table is a List of RangeTblEntry nodes.
 
607
 *
 
608
 *        A range table entry may represent a plain relation, a sub-select in
 
609
 *        FROM, or the result of a JOIN clause.  (Only explicit JOIN syntax
 
610
 *        produces an RTE, not the implicit join resulting from multiple FROM
 
611
 *        items.  This is because we only need the RTE to deal with SQL features
 
612
 *        like outer joins and join-output-column aliasing.)  Other special
 
613
 *        RTE types also exist, as indicated by RTEKind.
 
614
 *
 
615
 *        Note that we consider RTE_RELATION to cover anything that has a pg_class
 
616
 *        entry.  relkind distinguishes the sub-cases.
 
617
 *
 
618
 *        alias is an Alias node representing the AS alias-clause attached to the
 
619
 *        FROM expression, or NULL if no clause.
 
620
 *
 
621
 *        eref is the table reference name and column reference names (either
 
622
 *        real or aliases).  Note that system columns (OID etc) are not included
 
623
 *        in the column list.
 
624
 *        eref->aliasname is required to be present, and should generally be used
 
625
 *        to identify the RTE for error messages etc.
 
626
 *
 
627
 *        In RELATION RTEs, the colnames in both alias and eref are indexed by
 
628
 *        physical attribute number; this means there must be colname entries for
 
629
 *        dropped columns.      When building an RTE we insert empty strings ("") for
 
630
 *        dropped columns.      Note however that a stored rule may have nonempty
 
631
 *        colnames for columns dropped since the rule was created (and for that
 
632
 *        matter the colnames might be out of date due to column renamings).
 
633
 *        The same comments apply to FUNCTION RTEs when the function's return type
 
634
 *        is a named composite type.
 
635
 *
 
636
 *        In JOIN RTEs, the colnames in both alias and eref are one-to-one with
 
637
 *        joinaliasvars entries.  A JOIN RTE will omit columns of its inputs when
 
638
 *        those columns are known to be dropped at parse time.  Again, however,
 
639
 *        a stored rule might contain entries for columns dropped since the rule
 
640
 *        was created.  (This is only possible for columns not actually referenced
 
641
 *        in the rule.)  When loading a stored rule, we replace the joinaliasvars
 
642
 *        items for any such columns with NULL Consts.  (We can't simply delete
 
643
 *        them from the joinaliasvars list, because that would affect the attnums
 
644
 *        of Vars referencing the rest of the list.)
 
645
 *
 
646
 *        inh is TRUE for relation references that should be expanded to include
 
647
 *        inheritance children, if the rel has any.  This *must* be FALSE for
 
648
 *        RTEs other than RTE_RELATION entries.
 
649
 *
 
650
 *        inFromCl marks those range variables that are listed in the FROM clause.
 
651
 *        It's false for RTEs that are added to a query behind the scenes, such
 
652
 *        as the NEW and OLD variables for a rule, or the subqueries of a UNION.
 
653
 *        This flag is not used anymore during parsing, since the parser now uses
 
654
 *        a separate "namespace" data structure to control visibility, but it is
 
655
 *        needed by ruleutils.c to determine whether RTEs should be shown in
 
656
 *        decompiled queries.
 
657
 *
 
658
 *        requiredPerms and checkAsUser specify run-time access permissions
 
659
 *        checks to be performed at query startup.      The user must have *all*
 
660
 *        of the permissions that are OR'd together in requiredPerms (zero
 
661
 *        indicates no permissions checking).  If checkAsUser is not zero,
 
662
 *        then do the permissions checks using the access rights of that user,
 
663
 *        not the current effective user ID.  (This allows rules to act as
 
664
 *        setuid gateways.)  Permissions checks only apply to RELATION RTEs.
 
665
 *
 
666
 *        For SELECT/INSERT/UPDATE permissions, if the user doesn't have
 
667
 *        table-wide permissions then it is sufficient to have the permissions
 
668
 *        on all columns identified in selectedCols (for SELECT) and/or
 
669
 *        modifiedCols (for INSERT/UPDATE; we can tell which from the query type).
 
670
 *        selectedCols and modifiedCols are bitmapsets, which cannot have negative
 
671
 *        integer members, so we subtract FirstLowInvalidHeapAttributeNumber from
 
672
 *        column numbers before storing them in these fields.  A whole-row Var
 
673
 *        reference is represented by setting the bit for InvalidAttrNumber.
 
674
 *--------------------
 
675
 */
 
676
typedef enum RTEKind
 
677
{
 
678
        RTE_RELATION,                           /* ordinary relation reference */
 
679
        RTE_SUBQUERY,                           /* subquery in FROM */
 
680
        RTE_JOIN,                                       /* join */
 
681
        RTE_FUNCTION,                           /* function in FROM */
 
682
        RTE_VALUES,                                     /* VALUES (<exprlist>), (<exprlist>), ... */
 
683
        RTE_CTE                                         /* common table expr (WITH list element) */
 
684
} RTEKind;
 
685
 
 
686
typedef struct RangeTblEntry
 
687
{
 
688
        NodeTag         type;
 
689
 
 
690
        RTEKind         rtekind;                /* see above */
 
691
 
 
692
        /*
 
693
         * XXX the fields applicable to only some rte kinds should be merged into
 
694
         * a union.  I didn't do this yet because the diffs would impact a lot of
 
695
         * code that is being actively worked on.  FIXME someday.
 
696
         */
 
697
 
 
698
        /*
 
699
         * Fields valid for a plain relation RTE (else zero):
 
700
         */
 
701
        Oid                     relid;                  /* OID of the relation */
 
702
        char            relkind;                /* relation kind (see pg_class.relkind) */
 
703
 
 
704
        /*
 
705
         * Fields valid for a subquery RTE (else NULL):
 
706
         */
 
707
        Query      *subquery;           /* the sub-query */
 
708
 
 
709
        /*
 
710
         * Fields valid for a join RTE (else NULL/zero):
 
711
         *
 
712
         * joinaliasvars is a list of Vars or COALESCE expressions corresponding
 
713
         * to the columns of the join result.  An alias Var referencing column K
 
714
         * of the join result can be replaced by the K'th element of joinaliasvars
 
715
         * --- but to simplify the task of reverse-listing aliases correctly, we
 
716
         * do not do that until planning time.  In a Query loaded from a stored
 
717
         * rule, it is also possible for joinaliasvars items to be NULL Consts,
 
718
         * denoting columns dropped since the rule was made.
 
719
         */
 
720
        JoinType        jointype;               /* type of join */
 
721
        List       *joinaliasvars;      /* list of alias-var expansions */
 
722
 
 
723
        /*
 
724
         * Fields valid for a function RTE (else NULL):
 
725
         *
 
726
         * If the function returns RECORD, funccoltypes lists the column types
 
727
         * declared in the RTE's column type specification, funccoltypmods lists
 
728
         * their declared typmods, funccolcollations their collations.  Otherwise,
 
729
         * those fields are NIL.
 
730
         */
 
731
        Node       *funcexpr;           /* expression tree for func call */
 
732
        List       *funccoltypes;       /* OID list of column type OIDs */
 
733
        List       *funccoltypmods; /* integer list of column typmods */
 
734
        List       *funccolcollations;          /* OID list of column collation OIDs */
 
735
 
 
736
        /*
 
737
         * Fields valid for a values RTE (else NIL):
 
738
         */
 
739
        List       *values_lists;       /* list of expression lists */
 
740
        List       *values_collations;          /* OID list of column collation OIDs */
 
741
 
 
742
        /*
 
743
         * Fields valid for a CTE RTE (else NULL/zero):
 
744
         */
 
745
        char       *ctename;            /* name of the WITH list item */
 
746
        Index           ctelevelsup;    /* number of query levels up */
 
747
        bool            self_reference; /* is this a recursive self-reference? */
 
748
        List       *ctecoltypes;        /* OID list of column type OIDs */
 
749
        List       *ctecoltypmods;      /* integer list of column typmods */
 
750
        List       *ctecolcollations;           /* OID list of column collation OIDs */
 
751
 
 
752
        /*
 
753
         * Fields valid in all RTEs:
 
754
         */
 
755
        Alias      *alias;                      /* user-written alias clause, if any */
 
756
        Alias      *eref;                       /* expanded reference names */
 
757
        bool            inh;                    /* inheritance requested? */
 
758
        bool            inFromCl;               /* present in FROM clause? */
 
759
        AclMode         requiredPerms;  /* bitmask of required access permissions */
 
760
        Oid                     checkAsUser;    /* if valid, check access as this role */
 
761
        Bitmapset  *selectedCols;       /* columns needing SELECT permission */
 
762
        Bitmapset  *modifiedCols;       /* columns needing INSERT/UPDATE permission */
 
763
} RangeTblEntry;
 
764
 
 
765
/*
 
766
 * SortGroupClause -
 
767
 *              representation of ORDER BY, GROUP BY, PARTITION BY,
 
768
 *              DISTINCT, DISTINCT ON items
 
769
 *
 
770
 * You might think that ORDER BY is only interested in defining ordering,
 
771
 * and GROUP/DISTINCT are only interested in defining equality.  However,
 
772
 * one way to implement grouping is to sort and then apply a "uniq"-like
 
773
 * filter.      So it's also interesting to keep track of possible sort operators
 
774
 * for GROUP/DISTINCT, and in particular to try to sort for the grouping
 
775
 * in a way that will also yield a requested ORDER BY ordering.  So we need
 
776
 * to be able to compare ORDER BY and GROUP/DISTINCT lists, which motivates
 
777
 * the decision to give them the same representation.
 
778
 *
 
779
 * tleSortGroupRef must match ressortgroupref of exactly one entry of the
 
780
 *              query's targetlist; that is the expression to be sorted or grouped by.
 
781
 * eqop is the OID of the equality operator.
 
782
 * sortop is the OID of the ordering operator (a "<" or ">" operator),
 
783
 *              or InvalidOid if not available.
 
784
 * nulls_first means about what you'd expect.  If sortop is InvalidOid
 
785
 *              then nulls_first is meaningless and should be set to false.
 
786
 * hashable is TRUE if eqop is hashable (note this condition also depends
 
787
 *              on the datatype of the input expression).
 
788
 *
 
789
 * In an ORDER BY item, all fields must be valid.  (The eqop isn't essential
 
790
 * here, but it's cheap to get it along with the sortop, and requiring it
 
791
 * to be valid eases comparisons to grouping items.)  Note that this isn't
 
792
 * actually enough information to determine an ordering: if the sortop is
 
793
 * collation-sensitive, a collation OID is needed too.  We don't store the
 
794
 * collation in SortGroupClause because it's not available at the time the
 
795
 * parser builds the SortGroupClause; instead, consult the exposed collation
 
796
 * of the referenced targetlist expression to find out what it is.
 
797
 *
 
798
 * In a grouping item, eqop must be valid.      If the eqop is a btree equality
 
799
 * operator, then sortop should be set to a compatible ordering operator.
 
800
 * We prefer to set eqop/sortop/nulls_first to match any ORDER BY item that
 
801
 * the query presents for the same tlist item.  If there is none, we just
 
802
 * use the default ordering op for the datatype.
 
803
 *
 
804
 * If the tlist item's type has a hash opclass but no btree opclass, then
 
805
 * we will set eqop to the hash equality operator, sortop to InvalidOid,
 
806
 * and nulls_first to false.  A grouping item of this kind can only be
 
807
 * implemented by hashing, and of course it'll never match an ORDER BY item.
 
808
 *
 
809
 * The hashable flag is provided since we generally have the requisite
 
810
 * information readily available when the SortGroupClause is constructed,
 
811
 * and it's relatively expensive to get it again later.  Note there is no
 
812
 * need for a "sortable" flag since OidIsValid(sortop) serves the purpose.
 
813
 *
 
814
 * A query might have both ORDER BY and DISTINCT (or DISTINCT ON) clauses.
 
815
 * In SELECT DISTINCT, the distinctClause list is as long or longer than the
 
816
 * sortClause list, while in SELECT DISTINCT ON it's typically shorter.
 
817
 * The two lists must match up to the end of the shorter one --- the parser
 
818
 * rearranges the distinctClause if necessary to make this true.  (This
 
819
 * restriction ensures that only one sort step is needed to both satisfy the
 
820
 * ORDER BY and set up for the Unique step.  This is semantically necessary
 
821
 * for DISTINCT ON, and presents no real drawback for DISTINCT.)
 
822
 */
 
823
typedef struct SortGroupClause
 
824
{
 
825
        NodeTag         type;
 
826
        Index           tleSortGroupRef;        /* reference into targetlist */
 
827
        Oid                     eqop;                   /* the equality operator ('=' op) */
 
828
        Oid                     sortop;                 /* the ordering operator ('<' op), or 0 */
 
829
        bool            nulls_first;    /* do NULLs come before normal values? */
 
830
        bool            hashable;               /* can eqop be implemented by hashing? */
 
831
} SortGroupClause;
 
832
 
 
833
/*
 
834
 * WindowClause -
 
835
 *              transformed representation of WINDOW and OVER clauses
 
836
 *
 
837
 * A parsed Query's windowClause list contains these structs.  "name" is set
 
838
 * if the clause originally came from WINDOW, and is NULL if it originally
 
839
 * was an OVER clause (but note that we collapse out duplicate OVERs).
 
840
 * partitionClause and orderClause are lists of SortGroupClause structs.
 
841
 * winref is an ID number referenced by WindowFunc nodes; it must be unique
 
842
 * among the members of a Query's windowClause list.
 
843
 * When refname isn't null, the partitionClause is always copied from there;
 
844
 * the orderClause might or might not be copied (see copiedOrder); the framing
 
845
 * options are never copied, per spec.
 
846
 */
 
847
typedef struct WindowClause
 
848
{
 
849
        NodeTag         type;
 
850
        char       *name;                       /* window name (NULL in an OVER clause) */
 
851
        char       *refname;            /* referenced window name, if any */
 
852
        List       *partitionClause;    /* PARTITION BY list */
 
853
        List       *orderClause;        /* ORDER BY list */
 
854
        int                     frameOptions;   /* frame_clause options, see WindowDef */
 
855
        Node       *startOffset;        /* expression for starting bound, if any */
 
856
        Node       *endOffset;          /* expression for ending bound, if any */
 
857
        Index           winref;                 /* ID referenced by window functions */
 
858
        bool            copiedOrder;    /* did we copy orderClause from refname? */
 
859
} WindowClause;
 
860
 
 
861
/*
 
862
 * RowMarkClause -
 
863
 *         parser output representation of FOR UPDATE/SHARE clauses
 
864
 *
 
865
 * Query.rowMarks contains a separate RowMarkClause node for each relation
 
866
 * identified as a FOR UPDATE/SHARE target.  If FOR UPDATE/SHARE is applied
 
867
 * to a subquery, we generate RowMarkClauses for all normal and subquery rels
 
868
 * in the subquery, but they are marked pushedDown = true to distinguish them
 
869
 * from clauses that were explicitly written at this query level.  Also,
 
870
 * Query.hasForUpdate tells whether there were explicit FOR UPDATE/SHARE
 
871
 * clauses in the current query level.
 
872
 */
 
873
typedef struct RowMarkClause
 
874
{
 
875
        NodeTag         type;
 
876
        Index           rti;                    /* range table index of target relation */
 
877
        bool            forUpdate;              /* true = FOR UPDATE, false = FOR SHARE */
 
878
        bool            noWait;                 /* NOWAIT option */
 
879
        bool            pushedDown;             /* pushed down from higher query level? */
 
880
} RowMarkClause;
 
881
 
 
882
/*
 
883
 * WithClause -
 
884
 *         representation of WITH clause
 
885
 *
 
886
 * Note: WithClause does not propagate into the Query representation;
 
887
 * but CommonTableExpr does.
 
888
 */
 
889
typedef struct WithClause
 
890
{
 
891
        NodeTag         type;
 
892
        List       *ctes;                       /* list of CommonTableExprs */
 
893
        bool            recursive;              /* true = WITH RECURSIVE */
 
894
        int                     location;               /* token location, or -1 if unknown */
 
895
} WithClause;
 
896
 
 
897
/*
 
898
 * CommonTableExpr -
 
899
 *         representation of WITH list element
 
900
 *
 
901
 * We don't currently support the SEARCH or CYCLE clause.
 
902
 */
 
903
typedef struct CommonTableExpr
 
904
{
 
905
        NodeTag         type;
 
906
        char       *ctename;            /* query name (never qualified) */
 
907
        List       *aliascolnames;      /* optional list of column names */
 
908
        /* SelectStmt/InsertStmt/etc before parse analysis, Query afterwards: */
 
909
        Node       *ctequery;           /* the CTE's subquery */
 
910
        int                     location;               /* token location, or -1 if unknown */
 
911
        /* These fields are set during parse analysis: */
 
912
        bool            cterecursive;   /* is this CTE actually recursive? */
 
913
        int                     cterefcount;    /* number of RTEs referencing this CTE
 
914
                                                                 * (excluding internal self-references) */
 
915
        List       *ctecolnames;        /* list of output column names */
 
916
        List       *ctecoltypes;        /* OID list of output column type OIDs */
 
917
        List       *ctecoltypmods;      /* integer list of output column typmods */
 
918
        List       *ctecolcollations;           /* OID list of column collation OIDs */
 
919
} CommonTableExpr;
 
920
 
 
921
/* Convenience macro to get the output tlist of a CTE's query */
 
922
#define GetCTETargetList(cte) \
 
923
        (AssertMacro(IsA((cte)->ctequery, Query)), \
 
924
         ((Query *) (cte)->ctequery)->commandType == CMD_SELECT ? \
 
925
         ((Query *) (cte)->ctequery)->targetList : \
 
926
         ((Query *) (cte)->ctequery)->returningList)
 
927
 
 
928
 
 
929
/*****************************************************************************
 
930
 *              Optimizable Statements
 
931
 *****************************************************************************/
 
932
 
 
933
/* ----------------------
 
934
 *              Insert Statement
 
935
 *
 
936
 * The source expression is represented by SelectStmt for both the
 
937
 * SELECT and VALUES cases.  If selectStmt is NULL, then the query
 
938
 * is INSERT ... DEFAULT VALUES.
 
939
 * ----------------------
 
940
 */
 
941
typedef struct InsertStmt
 
942
{
 
943
        NodeTag         type;
 
944
        RangeVar   *relation;           /* relation to insert into */
 
945
        List       *cols;                       /* optional: names of the target columns */
 
946
        Node       *selectStmt;         /* the source SELECT/VALUES, or NULL */
 
947
        List       *returningList;      /* list of expressions to return */
 
948
        WithClause *withClause;         /* WITH clause */
 
949
} InsertStmt;
 
950
 
 
951
/* ----------------------
 
952
 *              Delete Statement
 
953
 * ----------------------
 
954
 */
 
955
typedef struct DeleteStmt
 
956
{
 
957
        NodeTag         type;
 
958
        RangeVar   *relation;           /* relation to delete from */
 
959
        List       *usingClause;        /* optional using clause for more tables */
 
960
        Node       *whereClause;        /* qualifications */
 
961
        List       *returningList;      /* list of expressions to return */
 
962
        WithClause *withClause;         /* WITH clause */
 
963
} DeleteStmt;
 
964
 
 
965
/* ----------------------
 
966
 *              Update Statement
 
967
 * ----------------------
 
968
 */
 
969
typedef struct UpdateStmt
 
970
{
 
971
        NodeTag         type;
 
972
        RangeVar   *relation;           /* relation to update */
 
973
        List       *targetList;         /* the target list (of ResTarget) */
 
974
        Node       *whereClause;        /* qualifications */
 
975
        List       *fromClause;         /* optional from clause for more tables */
 
976
        List       *returningList;      /* list of expressions to return */
 
977
        WithClause *withClause;         /* WITH clause */
 
978
} UpdateStmt;
 
979
 
 
980
/* ----------------------
 
981
 *              Select Statement
 
982
 *
 
983
 * A "simple" SELECT is represented in the output of gram.y by a single
 
984
 * SelectStmt node; so is a VALUES construct.  A query containing set
 
985
 * operators (UNION, INTERSECT, EXCEPT) is represented by a tree of SelectStmt
 
986
 * nodes, in which the leaf nodes are component SELECTs and the internal nodes
 
987
 * represent UNION, INTERSECT, or EXCEPT operators.  Using the same node
 
988
 * type for both leaf and internal nodes allows gram.y to stick ORDER BY,
 
989
 * LIMIT, etc, clause values into a SELECT statement without worrying
 
990
 * whether it is a simple or compound SELECT.
 
991
 * ----------------------
 
992
 */
 
993
typedef enum SetOperation
 
994
{
 
995
        SETOP_NONE = 0,
 
996
        SETOP_UNION,
 
997
        SETOP_INTERSECT,
 
998
        SETOP_EXCEPT
 
999
} SetOperation;
 
1000
 
 
1001
typedef struct SelectStmt
 
1002
{
 
1003
        NodeTag         type;
 
1004
 
 
1005
        /*
 
1006
         * These fields are used only in "leaf" SelectStmts.
 
1007
         */
 
1008
        List       *distinctClause; /* NULL, list of DISTINCT ON exprs, or
 
1009
                                                                 * lcons(NIL,NIL) for all (SELECT DISTINCT) */
 
1010
        IntoClause *intoClause;         /* target for SELECT INTO / CREATE TABLE AS */
 
1011
        List       *targetList;         /* the target list (of ResTarget) */
 
1012
        List       *fromClause;         /* the FROM clause */
 
1013
        Node       *whereClause;        /* WHERE qualification */
 
1014
        List       *groupClause;        /* GROUP BY clauses */
 
1015
        Node       *havingClause;       /* HAVING conditional-expression */
 
1016
        List       *windowClause;       /* WINDOW window_name AS (...), ... */
 
1017
        WithClause *withClause;         /* WITH clause */
 
1018
 
 
1019
        /*
 
1020
         * In a "leaf" node representing a VALUES list, the above fields are all
 
1021
         * null, and instead this field is set.  Note that the elements of the
 
1022
         * sublists are just expressions, without ResTarget decoration. Also note
 
1023
         * that a list element can be DEFAULT (represented as a SetToDefault
 
1024
         * node), regardless of the context of the VALUES list. It's up to parse
 
1025
         * analysis to reject that where not valid.
 
1026
         */
 
1027
        List       *valuesLists;        /* untransformed list of expression lists */
 
1028
 
 
1029
        /*
 
1030
         * These fields are used in both "leaf" SelectStmts and upper-level
 
1031
         * SelectStmts.
 
1032
         */
 
1033
        List       *sortClause;         /* sort clause (a list of SortBy's) */
 
1034
        Node       *limitOffset;        /* # of result tuples to skip */
 
1035
        Node       *limitCount;         /* # of result tuples to return */
 
1036
        List       *lockingClause;      /* FOR UPDATE (list of LockingClause's) */
 
1037
 
 
1038
        /*
 
1039
         * These fields are used only in upper-level SelectStmts.
 
1040
         */
 
1041
        SetOperation op;                        /* type of set op */
 
1042
        bool            all;                    /* ALL specified? */
 
1043
        struct SelectStmt *larg;        /* left child */
 
1044
        struct SelectStmt *rarg;        /* right child */
 
1045
        /* Eventually add fields for CORRESPONDING spec here */
 
1046
} SelectStmt;
 
1047
 
 
1048
 
 
1049
/* ----------------------
 
1050
 *              Set Operation node for post-analysis query trees
 
1051
 *
 
1052
 * After parse analysis, a SELECT with set operations is represented by a
 
1053
 * top-level Query node containing the leaf SELECTs as subqueries in its
 
1054
 * range table.  Its setOperations field shows the tree of set operations,
 
1055
 * with leaf SelectStmt nodes replaced by RangeTblRef nodes, and internal
 
1056
 * nodes replaced by SetOperationStmt nodes.  Information about the output
 
1057
 * column types is added, too.  (Note that the child nodes do not necessarily
 
1058
 * produce these types directly, but we've checked that their output types
 
1059
 * can be coerced to the output column type.)  Also, if it's not UNION ALL,
 
1060
 * information about the types' sort/group semantics is provided in the form
 
1061
 * of a SortGroupClause list (same representation as, eg, DISTINCT).
 
1062
 * The resolved common column collations are provided too; but note that if
 
1063
 * it's not UNION ALL, it's okay for a column to not have a common collation,
 
1064
 * so a member of the colCollations list could be InvalidOid even though the
 
1065
 * column has a collatable type.
 
1066
 * ----------------------
 
1067
 */
 
1068
typedef struct SetOperationStmt
 
1069
{
 
1070
        NodeTag         type;
 
1071
        SetOperation op;                        /* type of set op */
 
1072
        bool            all;                    /* ALL specified? */
 
1073
        Node       *larg;                       /* left child */
 
1074
        Node       *rarg;                       /* right child */
 
1075
        /* Eventually add fields for CORRESPONDING spec here */
 
1076
 
 
1077
        /* Fields derived during parse analysis: */
 
1078
        List       *colTypes;           /* OID list of output column type OIDs */
 
1079
        List       *colTypmods;         /* integer list of output column typmods */
 
1080
        List       *colCollations;      /* OID list of output column collation OIDs */
 
1081
        List       *groupClauses;       /* a list of SortGroupClause's */
 
1082
        /* groupClauses is NIL if UNION ALL, but must be set otherwise */
 
1083
} SetOperationStmt;
 
1084
 
 
1085
 
 
1086
/*****************************************************************************
 
1087
 *              Other Statements (no optimizations required)
 
1088
 *
 
1089
 *              These are not touched by parser/analyze.c except to put them into
 
1090
 *              the utilityStmt field of a Query.  This is eventually passed to
 
1091
 *              ProcessUtility (by-passing rewriting and planning).  Some of the
 
1092
 *              statements do need attention from parse analysis, and this is
 
1093
 *              done by routines in parser/parse_utilcmd.c after ProcessUtility
 
1094
 *              receives the command for execution.
 
1095
 *****************************************************************************/
 
1096
 
 
1097
/*
 
1098
 * When a command can act on several kinds of objects with only one
 
1099
 * parse structure required, use these constants to designate the
 
1100
 * object type.  Note that commands typically don't support all the types.
 
1101
 */
 
1102
 
 
1103
typedef enum ObjectType
 
1104
{
 
1105
        OBJECT_AGGREGATE,
 
1106
        OBJECT_ATTRIBUTE,                       /* type's attribute, when distinct from column */
 
1107
        OBJECT_CAST,
 
1108
        OBJECT_COLUMN,
 
1109
        OBJECT_CONSTRAINT,
 
1110
        OBJECT_COLLATION,
 
1111
        OBJECT_CONVERSION,
 
1112
        OBJECT_DATABASE,
 
1113
        OBJECT_DOMAIN,
 
1114
        OBJECT_EXTENSION,
 
1115
        OBJECT_FDW,
 
1116
        OBJECT_FOREIGN_SERVER,
 
1117
        OBJECT_FOREIGN_TABLE,
 
1118
        OBJECT_FUNCTION,
 
1119
        OBJECT_INDEX,
 
1120
        OBJECT_LANGUAGE,
 
1121
        OBJECT_LARGEOBJECT,
 
1122
        OBJECT_OPCLASS,
 
1123
        OBJECT_OPERATOR,
 
1124
        OBJECT_OPFAMILY,
 
1125
        OBJECT_ROLE,
 
1126
        OBJECT_RULE,
 
1127
        OBJECT_SCHEMA,
 
1128
        OBJECT_SEQUENCE,
 
1129
        OBJECT_TABLE,
 
1130
        OBJECT_TABLESPACE,
 
1131
        OBJECT_TRIGGER,
 
1132
        OBJECT_TSCONFIGURATION,
 
1133
        OBJECT_TSDICTIONARY,
 
1134
        OBJECT_TSPARSER,
 
1135
        OBJECT_TSTEMPLATE,
 
1136
        OBJECT_TYPE,
 
1137
        OBJECT_VIEW
 
1138
} ObjectType;
 
1139
 
 
1140
/* ----------------------
 
1141
 *              Create Schema Statement
 
1142
 *
 
1143
 * NOTE: the schemaElts list contains raw parsetrees for component statements
 
1144
 * of the schema, such as CREATE TABLE, GRANT, etc.  These are analyzed and
 
1145
 * executed after the schema itself is created.
 
1146
 * ----------------------
 
1147
 */
 
1148
typedef struct CreateSchemaStmt
 
1149
{
 
1150
        NodeTag         type;
 
1151
        char       *schemaname;         /* the name of the schema to create */
 
1152
        char       *authid;                     /* the owner of the created schema */
 
1153
        List       *schemaElts;         /* schema components (list of parsenodes) */
 
1154
} CreateSchemaStmt;
 
1155
 
 
1156
typedef enum DropBehavior
 
1157
{
 
1158
        DROP_RESTRICT,                          /* drop fails if any dependent objects */
 
1159
        DROP_CASCADE                            /* remove dependent objects too */
 
1160
} DropBehavior;
 
1161
 
 
1162
/* ----------------------
 
1163
 *      Alter Table
 
1164
 * ----------------------
 
1165
 */
 
1166
typedef struct AlterTableStmt
 
1167
{
 
1168
        NodeTag         type;
 
1169
        RangeVar   *relation;           /* table to work on */
 
1170
        List       *cmds;                       /* list of subcommands */
 
1171
        ObjectType      relkind;                /* type of object */
 
1172
} AlterTableStmt;
 
1173
 
 
1174
typedef enum AlterTableType
 
1175
{
 
1176
        AT_AddColumn,                           /* add column */
 
1177
        AT_AddColumnRecurse,            /* internal to commands/tablecmds.c */
 
1178
        AT_AddColumnToView,                     /* implicitly via CREATE OR REPLACE VIEW */
 
1179
        AT_ColumnDefault,                       /* alter column default */
 
1180
        AT_DropNotNull,                         /* alter column drop not null */
 
1181
        AT_SetNotNull,                          /* alter column set not null */
 
1182
        AT_SetStatistics,                       /* alter column set statistics */
 
1183
        AT_SetOptions,                          /* alter column set ( options ) */
 
1184
        AT_ResetOptions,                        /* alter column reset ( options ) */
 
1185
        AT_SetStorage,                          /* alter column set storage */
 
1186
        AT_DropColumn,                          /* drop column */
 
1187
        AT_DropColumnRecurse,           /* internal to commands/tablecmds.c */
 
1188
        AT_AddIndex,                            /* add index */
 
1189
        AT_ReAddIndex,                          /* internal to commands/tablecmds.c */
 
1190
        AT_AddConstraint,                       /* add constraint */
 
1191
        AT_AddConstraintRecurse,        /* internal to commands/tablecmds.c */
 
1192
        AT_ValidateConstraint,          /* validate constraint */
 
1193
        AT_ProcessedConstraint,         /* pre-processed add constraint (local in
 
1194
                                                                 * parser/parse_utilcmd.c) */
 
1195
        AT_AddIndexConstraint,          /* add constraint using existing index */
 
1196
        AT_DropConstraint,                      /* drop constraint */
 
1197
        AT_DropConstraintRecurse,       /* internal to commands/tablecmds.c */
 
1198
        AT_AlterColumnType,                     /* alter column type */
 
1199
        AT_ChangeOwner,                         /* change owner */
 
1200
        AT_ClusterOn,                           /* CLUSTER ON */
 
1201
        AT_DropCluster,                         /* SET WITHOUT CLUSTER */
 
1202
        AT_AddOids,                                     /* SET WITH OIDS */
 
1203
        AT_AddOidsRecurse,                      /* internal to commands/tablecmds.c */
 
1204
        AT_DropOids,                            /* SET WITHOUT OIDS */
 
1205
        AT_SetTableSpace,                       /* SET TABLESPACE */
 
1206
        AT_SetRelOptions,                       /* SET (...) -- AM specific parameters */
 
1207
        AT_ResetRelOptions,                     /* RESET (...) -- AM specific parameters */
 
1208
        AT_EnableTrig,                          /* ENABLE TRIGGER name */
 
1209
        AT_EnableAlwaysTrig,            /* ENABLE ALWAYS TRIGGER name */
 
1210
        AT_EnableReplicaTrig,           /* ENABLE REPLICA TRIGGER name */
 
1211
        AT_DisableTrig,                         /* DISABLE TRIGGER name */
 
1212
        AT_EnableTrigAll,                       /* ENABLE TRIGGER ALL */
 
1213
        AT_DisableTrigAll,                      /* DISABLE TRIGGER ALL */
 
1214
        AT_EnableTrigUser,                      /* ENABLE TRIGGER USER */
 
1215
        AT_DisableTrigUser,                     /* DISABLE TRIGGER USER */
 
1216
        AT_EnableRule,                          /* ENABLE RULE name */
 
1217
        AT_EnableAlwaysRule,            /* ENABLE ALWAYS RULE name */
 
1218
        AT_EnableReplicaRule,           /* ENABLE REPLICA RULE name */
 
1219
        AT_DisableRule,                         /* DISABLE RULE name */
 
1220
        AT_AddInherit,                          /* INHERIT parent */
 
1221
        AT_DropInherit,                         /* NO INHERIT parent */
 
1222
        AT_AddOf,                                       /* OF <type_name> */
 
1223
        AT_DropOf,                                      /* NOT OF */
 
1224
        AT_GenericOptions,                      /* OPTIONS (...) */
 
1225
} AlterTableType;
 
1226
 
 
1227
typedef struct AlterTableCmd    /* one subcommand of an ALTER TABLE */
 
1228
{
 
1229
        NodeTag         type;
 
1230
        AlterTableType subtype;         /* Type of table alteration to apply */
 
1231
        char       *name;                       /* column, constraint, or trigger to act on,
 
1232
                                                                 * or new owner or tablespace */
 
1233
        Node       *def;                        /* definition of new column, index,
 
1234
                                                                 * constraint, or parent table */
 
1235
        DropBehavior behavior;          /* RESTRICT or CASCADE for DROP cases */
 
1236
        bool            missing_ok;             /* skip error if missing? */
 
1237
        bool            validated;
 
1238
} AlterTableCmd;
 
1239
 
 
1240
 
 
1241
/* ----------------------
 
1242
 *      Alter Domain
 
1243
 *
 
1244
 * The fields are used in different ways by the different variants of
 
1245
 * this command.
 
1246
 * ----------------------
 
1247
 */
 
1248
typedef struct AlterDomainStmt
 
1249
{
 
1250
        NodeTag         type;
 
1251
        char            subtype;                /*------------
 
1252
                                                                 *      T = alter column default
 
1253
                                                                 *      N = alter column drop not null
 
1254
                                                                 *      O = alter column set not null
 
1255
                                                                 *      C = add constraint
 
1256
                                                                 *      X = drop constraint
 
1257
                                                                 *------------
 
1258
                                                                 */
 
1259
        List       *typeName;           /* domain to work on */
 
1260
        char       *name;                       /* column or constraint name to act on */
 
1261
        Node       *def;                        /* definition of default or constraint */
 
1262
        DropBehavior behavior;          /* RESTRICT or CASCADE for DROP cases */
 
1263
} AlterDomainStmt;
 
1264
 
 
1265
 
 
1266
/* ----------------------
 
1267
 *              Grant|Revoke Statement
 
1268
 * ----------------------
 
1269
 */
 
1270
typedef enum GrantTargetType
 
1271
{
 
1272
        ACL_TARGET_OBJECT,                      /* grant on specific named object(s) */
 
1273
        ACL_TARGET_ALL_IN_SCHEMA,       /* grant on all objects in given schema(s) */
 
1274
        ACL_TARGET_DEFAULTS                     /* ALTER DEFAULT PRIVILEGES */
 
1275
} GrantTargetType;
 
1276
 
 
1277
typedef enum GrantObjectType
 
1278
{
 
1279
        ACL_OBJECT_COLUMN,                      /* column */
 
1280
        ACL_OBJECT_RELATION,            /* table, view */
 
1281
        ACL_OBJECT_SEQUENCE,            /* sequence */
 
1282
        ACL_OBJECT_DATABASE,            /* database */
 
1283
        ACL_OBJECT_FDW,                         /* foreign-data wrapper */
 
1284
        ACL_OBJECT_FOREIGN_SERVER,      /* foreign server */
 
1285
        ACL_OBJECT_FUNCTION,            /* function */
 
1286
        ACL_OBJECT_LANGUAGE,            /* procedural language */
 
1287
        ACL_OBJECT_LARGEOBJECT,         /* largeobject */
 
1288
        ACL_OBJECT_NAMESPACE,           /* namespace */
 
1289
        ACL_OBJECT_TABLESPACE           /* tablespace */
 
1290
} GrantObjectType;
 
1291
 
 
1292
typedef struct GrantStmt
 
1293
{
 
1294
        NodeTag         type;
 
1295
        bool            is_grant;               /* true = GRANT, false = REVOKE */
 
1296
        GrantTargetType targtype;       /* type of the grant target */
 
1297
        GrantObjectType objtype;        /* kind of object being operated on */
 
1298
        List       *objects;            /* list of RangeVar nodes, FuncWithArgs nodes,
 
1299
                                                                 * or plain names (as Value strings) */
 
1300
        List       *privileges;         /* list of AccessPriv nodes */
 
1301
        /* privileges == NIL denotes ALL PRIVILEGES */
 
1302
        List       *grantees;           /* list of PrivGrantee nodes */
 
1303
        bool            grant_option;   /* grant or revoke grant option */
 
1304
        DropBehavior behavior;          /* drop behavior (for REVOKE) */
 
1305
} GrantStmt;
 
1306
 
 
1307
typedef struct PrivGrantee
 
1308
{
 
1309
        NodeTag         type;
 
1310
        char       *rolname;            /* if NULL then PUBLIC */
 
1311
} PrivGrantee;
 
1312
 
 
1313
/*
 
1314
 * Note: FuncWithArgs carries only the types of the input parameters of the
 
1315
 * function.  So it is sufficient to identify an existing function, but it
 
1316
 * is not enough info to define a function nor to call it.
 
1317
 */
 
1318
typedef struct FuncWithArgs
 
1319
{
 
1320
        NodeTag         type;
 
1321
        List       *funcname;           /* qualified name of function */
 
1322
        List       *funcargs;           /* list of Typename nodes */
 
1323
} FuncWithArgs;
 
1324
 
 
1325
/*
 
1326
 * An access privilege, with optional list of column names
 
1327
 * priv_name == NULL denotes ALL PRIVILEGES (only used with a column list)
 
1328
 * cols == NIL denotes "all columns"
 
1329
 * Note that simple "ALL PRIVILEGES" is represented as a NIL list, not
 
1330
 * an AccessPriv with both fields null.
 
1331
 */
 
1332
typedef struct AccessPriv
 
1333
{
 
1334
        NodeTag         type;
 
1335
        char       *priv_name;          /* string name of privilege */
 
1336
        List       *cols;                       /* list of Value strings */
 
1337
} AccessPriv;
 
1338
 
 
1339
/* ----------------------
 
1340
 *              Grant/Revoke Role Statement
 
1341
 *
 
1342
 * Note: because of the parsing ambiguity with the GRANT <privileges>
 
1343
 * statement, granted_roles is a list of AccessPriv; the execution code
 
1344
 * should complain if any column lists appear.  grantee_roles is a list
 
1345
 * of role names, as Value strings.
 
1346
 * ----------------------
 
1347
 */
 
1348
typedef struct GrantRoleStmt
 
1349
{
 
1350
        NodeTag         type;
 
1351
        List       *granted_roles;      /* list of roles to be granted/revoked */
 
1352
        List       *grantee_roles;      /* list of member roles to add/delete */
 
1353
        bool            is_grant;               /* true = GRANT, false = REVOKE */
 
1354
        bool            admin_opt;              /* with admin option */
 
1355
        char       *grantor;            /* set grantor to other than current role */
 
1356
        DropBehavior behavior;          /* drop behavior (for REVOKE) */
 
1357
} GrantRoleStmt;
 
1358
 
 
1359
/* ----------------------
 
1360
 *      Alter Default Privileges Statement
 
1361
 * ----------------------
 
1362
 */
 
1363
typedef struct AlterDefaultPrivilegesStmt
 
1364
{
 
1365
        NodeTag         type;
 
1366
        List       *options;            /* list of DefElem */
 
1367
        GrantStmt  *action;                     /* GRANT/REVOKE action (with objects=NIL) */
 
1368
} AlterDefaultPrivilegesStmt;
 
1369
 
 
1370
/* ----------------------
 
1371
 *              Copy Statement
 
1372
 *
 
1373
 * We support "COPY relation FROM file", "COPY relation TO file", and
 
1374
 * "COPY (query) TO file".      In any given CopyStmt, exactly one of "relation"
 
1375
 * and "query" must be non-NULL.
 
1376
 * ----------------------
 
1377
 */
 
1378
typedef struct CopyStmt
 
1379
{
 
1380
        NodeTag         type;
 
1381
        RangeVar   *relation;           /* the relation to copy */
 
1382
        Node       *query;                      /* the SELECT query to copy */
 
1383
        List       *attlist;            /* List of column names (as Strings), or NIL
 
1384
                                                                 * for all columns */
 
1385
        bool            is_from;                /* TO or FROM */
 
1386
        char       *filename;           /* filename, or NULL for STDIN/STDOUT */
 
1387
        List       *options;            /* List of DefElem nodes */
 
1388
} CopyStmt;
 
1389
 
 
1390
/* ----------------------
 
1391
 * SET Statement (includes RESET)
 
1392
 *
 
1393
 * "SET var TO DEFAULT" and "RESET var" are semantically equivalent, but we
 
1394
 * preserve the distinction in VariableSetKind for CreateCommandTag().
 
1395
 * ----------------------
 
1396
 */
 
1397
typedef enum
 
1398
{
 
1399
        VAR_SET_VALUE,                          /* SET var = value */
 
1400
        VAR_SET_DEFAULT,                        /* SET var TO DEFAULT */
 
1401
        VAR_SET_CURRENT,                        /* SET var FROM CURRENT */
 
1402
        VAR_SET_MULTI,                          /* special case for SET TRANSACTION ... */
 
1403
        VAR_RESET,                                      /* RESET var */
 
1404
        VAR_RESET_ALL                           /* RESET ALL */
 
1405
} VariableSetKind;
 
1406
 
 
1407
typedef struct VariableSetStmt
 
1408
{
 
1409
        NodeTag         type;
 
1410
        VariableSetKind kind;
 
1411
        char       *name;                       /* variable to be set */
 
1412
        List       *args;                       /* List of A_Const nodes */
 
1413
        bool            is_local;               /* SET LOCAL? */
 
1414
} VariableSetStmt;
 
1415
 
 
1416
/* ----------------------
 
1417
 * Show Statement
 
1418
 * ----------------------
 
1419
 */
 
1420
typedef struct VariableShowStmt
 
1421
{
 
1422
        NodeTag         type;
 
1423
        char       *name;
 
1424
} VariableShowStmt;
 
1425
 
 
1426
/* ----------------------
 
1427
 *              Create Table Statement
 
1428
 *
 
1429
 * NOTE: in the raw gram.y output, ColumnDef and Constraint nodes are
 
1430
 * intermixed in tableElts, and constraints is NIL.  After parse analysis,
 
1431
 * tableElts contains just ColumnDefs, and constraints contains just
 
1432
 * Constraint nodes (in fact, only CONSTR_CHECK nodes, in the present
 
1433
 * implementation).
 
1434
 * ----------------------
 
1435
 */
 
1436
 
 
1437
typedef struct CreateStmt
 
1438
{
 
1439
        NodeTag         type;
 
1440
        RangeVar   *relation;           /* relation to create */
 
1441
        List       *tableElts;          /* column definitions (list of ColumnDef) */
 
1442
        List       *inhRelations;       /* relations to inherit from (list of
 
1443
                                                                 * inhRelation) */
 
1444
        TypeName   *ofTypename;         /* OF typename */
 
1445
        List       *constraints;        /* constraints (list of Constraint nodes) */
 
1446
        List       *options;            /* options from WITH clause */
 
1447
        OnCommitAction oncommit;        /* what do we do at COMMIT? */
 
1448
        char       *tablespacename; /* table space to use, or NULL */
 
1449
        bool            if_not_exists;  /* just do nothing if it already exists? */
 
1450
} CreateStmt;
 
1451
 
 
1452
/* ----------
 
1453
 * Definitions for constraints in CreateStmt
 
1454
 *
 
1455
 * Note that column defaults are treated as a type of constraint,
 
1456
 * even though that's a bit odd semantically.
 
1457
 *
 
1458
 * For constraints that use expressions (CONSTR_CHECK, CONSTR_DEFAULT)
 
1459
 * we may have the expression in either "raw" form (an untransformed
 
1460
 * parse tree) or "cooked" form (the nodeToString representation of
 
1461
 * an executable expression tree), depending on how this Constraint
 
1462
 * node was created (by parsing, or by inheritance from an existing
 
1463
 * relation).  We should never have both in the same node!
 
1464
 *
 
1465
 * FKCONSTR_ACTION_xxx values are stored into pg_constraint.confupdtype
 
1466
 * and pg_constraint.confdeltype columns; FKCONSTR_MATCH_xxx values are
 
1467
 * stored into pg_constraint.confmatchtype.  Changing the code values may
 
1468
 * require an initdb!
 
1469
 *
 
1470
 * If skip_validation is true then we skip checking that the existing rows
 
1471
 * in the table satisfy the constraint, and just install the catalog entries
 
1472
 * for the constraint.  This is currently used only during CREATE TABLE
 
1473
 * (when we know the table must be empty).
 
1474
 *
 
1475
 * Constraint attributes (DEFERRABLE etc) are initially represented as
 
1476
 * separate Constraint nodes for simplicity of parsing.  parse_utilcmd.c makes
 
1477
 * a pass through the constraints list to insert the info into the appropriate
 
1478
 * Constraint node.
 
1479
 * ----------
 
1480
 */
 
1481
 
 
1482
typedef enum ConstrType                 /* types of constraints */
 
1483
{
 
1484
        CONSTR_NULL,                            /* not SQL92, but a lot of people expect it */
 
1485
        CONSTR_NOTNULL,
 
1486
        CONSTR_DEFAULT,
 
1487
        CONSTR_CHECK,
 
1488
        CONSTR_PRIMARY,
 
1489
        CONSTR_UNIQUE,
 
1490
        CONSTR_EXCLUSION,
 
1491
        CONSTR_FOREIGN,
 
1492
        CONSTR_ATTR_DEFERRABLE,         /* attributes for previous constraint node */
 
1493
        CONSTR_ATTR_NOT_DEFERRABLE,
 
1494
        CONSTR_ATTR_DEFERRED,
 
1495
        CONSTR_ATTR_IMMEDIATE
 
1496
} ConstrType;
 
1497
 
 
1498
/* Foreign key action codes */
 
1499
#define FKCONSTR_ACTION_NOACTION        'a'
 
1500
#define FKCONSTR_ACTION_RESTRICT        'r'
 
1501
#define FKCONSTR_ACTION_CASCADE         'c'
 
1502
#define FKCONSTR_ACTION_SETNULL         'n'
 
1503
#define FKCONSTR_ACTION_SETDEFAULT      'd'
 
1504
 
 
1505
/* Foreign key matchtype codes */
 
1506
#define FKCONSTR_MATCH_FULL                     'f'
 
1507
#define FKCONSTR_MATCH_PARTIAL          'p'
 
1508
#define FKCONSTR_MATCH_UNSPECIFIED      'u'
 
1509
 
 
1510
typedef struct Constraint
 
1511
{
 
1512
        NodeTag         type;
 
1513
        ConstrType      contype;                /* see above */
 
1514
 
 
1515
        /* Fields used for most/all constraint types: */
 
1516
        char       *conname;            /* Constraint name, or NULL if unnamed */
 
1517
        bool            deferrable;             /* DEFERRABLE? */
 
1518
        bool            initdeferred;   /* INITIALLY DEFERRED? */
 
1519
        int                     location;               /* token location, or -1 if unknown */
 
1520
 
 
1521
        /* Fields used for constraints with expressions (CHECK and DEFAULT): */
 
1522
        Node       *raw_expr;           /* expr, as untransformed parse tree */
 
1523
        char       *cooked_expr;        /* expr, as nodeToString representation */
 
1524
 
 
1525
        /* Fields used for unique constraints (UNIQUE and PRIMARY KEY): */
 
1526
        List       *keys;                       /* String nodes naming referenced column(s) */
 
1527
 
 
1528
        /* Fields used for EXCLUSION constraints: */
 
1529
        List       *exclusions;         /* list of (IndexElem, operator name) pairs */
 
1530
 
 
1531
        /* Fields used for index constraints (UNIQUE, PRIMARY KEY, EXCLUSION): */
 
1532
        List       *options;            /* options from WITH clause */
 
1533
        char       *indexname;          /* existing index to use; otherwise NULL */
 
1534
        char       *indexspace;         /* index tablespace; NULL for default */
 
1535
        /* These could be, but currently are not, used for UNIQUE/PKEY: */
 
1536
        char       *access_method;      /* index access method; NULL for default */
 
1537
        Node       *where_clause;       /* partial index predicate */
 
1538
 
 
1539
        /* Fields used for FOREIGN KEY constraints: */
 
1540
        RangeVar   *pktable;            /* Primary key table */
 
1541
        List       *fk_attrs;           /* Attributes of foreign key */
 
1542
        List       *pk_attrs;           /* Corresponding attrs in PK table */
 
1543
        char            fk_matchtype;   /* FULL, PARTIAL, UNSPECIFIED */
 
1544
        char            fk_upd_action;  /* ON UPDATE action */
 
1545
        char            fk_del_action;  /* ON DELETE action */
 
1546
        bool            skip_validation;        /* skip validation of existing rows? */
 
1547
        bool            initially_valid;        /* start the new constraint as valid */
 
1548
} Constraint;
 
1549
 
 
1550
/* ----------------------
 
1551
 *              Create/Drop Table Space Statements
 
1552
 * ----------------------
 
1553
 */
 
1554
 
 
1555
typedef struct CreateTableSpaceStmt
 
1556
{
 
1557
        NodeTag         type;
 
1558
        char       *tablespacename;
 
1559
        char       *owner;
 
1560
        char       *location;
 
1561
} CreateTableSpaceStmt;
 
1562
 
 
1563
typedef struct DropTableSpaceStmt
 
1564
{
 
1565
        NodeTag         type;
 
1566
        char       *tablespacename;
 
1567
        bool            missing_ok;             /* skip error if missing? */
 
1568
} DropTableSpaceStmt;
 
1569
 
 
1570
typedef struct AlterTableSpaceOptionsStmt
 
1571
{
 
1572
        NodeTag         type;
 
1573
        char       *tablespacename;
 
1574
        List       *options;
 
1575
        bool            isReset;
 
1576
} AlterTableSpaceOptionsStmt;
 
1577
 
 
1578
/* ----------------------
 
1579
 *              Create/Alter Extension Statements
 
1580
 * ----------------------
 
1581
 */
 
1582
 
 
1583
typedef struct CreateExtensionStmt
 
1584
{
 
1585
        NodeTag         type;
 
1586
        char       *extname;
 
1587
        bool            if_not_exists;  /* just do nothing if it already exists? */
 
1588
        List       *options;            /* List of DefElem nodes */
 
1589
} CreateExtensionStmt;
 
1590
 
 
1591
/* Only used for ALTER EXTENSION UPDATE; later might need an action field */
 
1592
typedef struct AlterExtensionStmt
 
1593
{
 
1594
        NodeTag         type;
 
1595
        char       *extname;
 
1596
        List       *options;            /* List of DefElem nodes */
 
1597
} AlterExtensionStmt;
 
1598
 
 
1599
typedef struct AlterExtensionContentsStmt
 
1600
{
 
1601
        NodeTag         type;
 
1602
        char       *extname;            /* Extension's name */
 
1603
        int                     action;                 /* +1 = add object, -1 = drop object */
 
1604
        ObjectType      objtype;                /* Object's type */
 
1605
        List       *objname;            /* Qualified name of the object */
 
1606
        List       *objargs;            /* Arguments if needed (eg, for functions) */
 
1607
} AlterExtensionContentsStmt;
 
1608
 
 
1609
/* ----------------------
 
1610
 *              Create/Drop FOREIGN DATA WRAPPER Statements
 
1611
 * ----------------------
 
1612
 */
 
1613
 
 
1614
typedef struct CreateFdwStmt
 
1615
{
 
1616
        NodeTag         type;
 
1617
        char       *fdwname;            /* foreign-data wrapper name */
 
1618
        List       *func_options;       /* HANDLER/VALIDATOR options */
 
1619
        List       *options;            /* generic options to FDW */
 
1620
} CreateFdwStmt;
 
1621
 
 
1622
typedef struct AlterFdwStmt
 
1623
{
 
1624
        NodeTag         type;
 
1625
        char       *fdwname;            /* foreign-data wrapper name */
 
1626
        List       *func_options;       /* HANDLER/VALIDATOR options */
 
1627
        List       *options;            /* generic options to FDW */
 
1628
} AlterFdwStmt;
 
1629
 
 
1630
typedef struct DropFdwStmt
 
1631
{
 
1632
        NodeTag         type;
 
1633
        char       *fdwname;            /* foreign-data wrapper name */
 
1634
        bool            missing_ok;             /* don't complain if missing */
 
1635
        DropBehavior behavior;          /* drop behavior - cascade/restrict */
 
1636
} DropFdwStmt;
 
1637
 
 
1638
/* ----------------------
 
1639
 *              Create/Drop FOREIGN SERVER Statements
 
1640
 * ----------------------
 
1641
 */
 
1642
 
 
1643
typedef struct CreateForeignServerStmt
 
1644
{
 
1645
        NodeTag         type;
 
1646
        char       *servername;         /* server name */
 
1647
        char       *servertype;         /* optional server type */
 
1648
        char       *version;            /* optional server version */
 
1649
        char       *fdwname;            /* FDW name */
 
1650
        List       *options;            /* generic options to server */
 
1651
} CreateForeignServerStmt;
 
1652
 
 
1653
typedef struct AlterForeignServerStmt
 
1654
{
 
1655
        NodeTag         type;
 
1656
        char       *servername;         /* server name */
 
1657
        char       *version;            /* optional server version */
 
1658
        List       *options;            /* generic options to server */
 
1659
        bool            has_version;    /* version specified */
 
1660
} AlterForeignServerStmt;
 
1661
 
 
1662
typedef struct DropForeignServerStmt
 
1663
{
 
1664
        NodeTag         type;
 
1665
        char       *servername;         /* server name */
 
1666
        bool            missing_ok;             /* ignore missing servers */
 
1667
        DropBehavior behavior;          /* drop behavior - cascade/restrict */
 
1668
} DropForeignServerStmt;
 
1669
 
 
1670
/* ----------------------
 
1671
 *              Create FOREIGN TABLE Statements
 
1672
 * ----------------------
 
1673
 */
 
1674
 
 
1675
typedef struct CreateForeignTableStmt
 
1676
{
 
1677
        CreateStmt      base;
 
1678
        char       *servername;
 
1679
        List       *options;
 
1680
} CreateForeignTableStmt;
 
1681
 
 
1682
/* ----------------------
 
1683
 *              Create/Drop USER MAPPING Statements
 
1684
 * ----------------------
 
1685
 */
 
1686
 
 
1687
typedef struct CreateUserMappingStmt
 
1688
{
 
1689
        NodeTag         type;
 
1690
        char       *username;           /* username or PUBLIC/CURRENT_USER */
 
1691
        char       *servername;         /* server name */
 
1692
        List       *options;            /* generic options to server */
 
1693
} CreateUserMappingStmt;
 
1694
 
 
1695
typedef struct AlterUserMappingStmt
 
1696
{
 
1697
        NodeTag         type;
 
1698
        char       *username;           /* username or PUBLIC/CURRENT_USER */
 
1699
        char       *servername;         /* server name */
 
1700
        List       *options;            /* generic options to server */
 
1701
} AlterUserMappingStmt;
 
1702
 
 
1703
typedef struct DropUserMappingStmt
 
1704
{
 
1705
        NodeTag         type;
 
1706
        char       *username;           /* username or PUBLIC/CURRENT_USER */
 
1707
        char       *servername;         /* server name */
 
1708
        bool            missing_ok;             /* ignore missing mappings */
 
1709
} DropUserMappingStmt;
 
1710
 
 
1711
/* ----------------------
 
1712
 *              Create TRIGGER Statement
 
1713
 * ----------------------
 
1714
 */
 
1715
typedef struct CreateTrigStmt
 
1716
{
 
1717
        NodeTag         type;
 
1718
        char       *trigname;           /* TRIGGER's name */
 
1719
        RangeVar   *relation;           /* relation trigger is on */
 
1720
        List       *funcname;           /* qual. name of function to call */
 
1721
        List       *args;                       /* list of (T_String) Values or NIL */
 
1722
        bool            row;                    /* ROW/STATEMENT */
 
1723
        /* timing uses the TRIGGER_TYPE bits defined in catalog/pg_trigger.h */
 
1724
        int16           timing;                 /* BEFORE, AFTER, or INSTEAD */
 
1725
        /* events uses the TRIGGER_TYPE bits defined in catalog/pg_trigger.h */
 
1726
        int16           events;                 /* "OR" of INSERT/UPDATE/DELETE/TRUNCATE */
 
1727
        List       *columns;            /* column names, or NIL for all columns */
 
1728
        Node       *whenClause;         /* qual expression, or NULL if none */
 
1729
        bool            isconstraint;   /* This is a constraint trigger */
 
1730
        /* The remaining fields are only used for constraint triggers */
 
1731
        bool            deferrable;             /* [NOT] DEFERRABLE */
 
1732
        bool            initdeferred;   /* INITIALLY {DEFERRED|IMMEDIATE} */
 
1733
        RangeVar   *constrrel;          /* opposite relation, if RI trigger */
 
1734
} CreateTrigStmt;
 
1735
 
 
1736
/* ----------------------
 
1737
 *              Create/Drop PROCEDURAL LANGUAGE Statements
 
1738
 * ----------------------
 
1739
 */
 
1740
typedef struct CreatePLangStmt
 
1741
{
 
1742
        NodeTag         type;
 
1743
        bool            replace;                /* T => replace if already exists */
 
1744
        char       *plname;                     /* PL name */
 
1745
        List       *plhandler;          /* PL call handler function (qual. name) */
 
1746
        List       *plinline;           /* optional inline function (qual. name) */
 
1747
        List       *plvalidator;        /* optional validator function (qual. name) */
 
1748
        bool            pltrusted;              /* PL is trusted */
 
1749
} CreatePLangStmt;
 
1750
 
 
1751
typedef struct DropPLangStmt
 
1752
{
 
1753
        NodeTag         type;
 
1754
        char       *plname;                     /* PL name */
 
1755
        DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
 
1756
        bool            missing_ok;             /* skip error if missing? */
 
1757
} DropPLangStmt;
 
1758
 
 
1759
/* ----------------------
 
1760
 *      Create/Alter/Drop Role Statements
 
1761
 *
 
1762
 * Note: these node types are also used for the backwards-compatible
 
1763
 * Create/Alter/Drop User/Group statements.  In the ALTER and DROP cases
 
1764
 * there's really no need to distinguish what the original spelling was,
 
1765
 * but for CREATE we mark the type because the defaults vary.
 
1766
 * ----------------------
 
1767
 */
 
1768
typedef enum RoleStmtType
 
1769
{
 
1770
        ROLESTMT_ROLE,
 
1771
        ROLESTMT_USER,
 
1772
        ROLESTMT_GROUP
 
1773
} RoleStmtType;
 
1774
 
 
1775
typedef struct CreateRoleStmt
 
1776
{
 
1777
        NodeTag         type;
 
1778
        RoleStmtType stmt_type;         /* ROLE/USER/GROUP */
 
1779
        char       *role;                       /* role name */
 
1780
        List       *options;            /* List of DefElem nodes */
 
1781
} CreateRoleStmt;
 
1782
 
 
1783
typedef struct AlterRoleStmt
 
1784
{
 
1785
        NodeTag         type;
 
1786
        char       *role;                       /* role name */
 
1787
        List       *options;            /* List of DefElem nodes */
 
1788
        int                     action;                 /* +1 = add members, -1 = drop members */
 
1789
} AlterRoleStmt;
 
1790
 
 
1791
typedef struct AlterRoleSetStmt
 
1792
{
 
1793
        NodeTag         type;
 
1794
        char       *role;                       /* role name */
 
1795
        char       *database;           /* database name, or NULL */
 
1796
        VariableSetStmt *setstmt;       /* SET or RESET subcommand */
 
1797
} AlterRoleSetStmt;
 
1798
 
 
1799
typedef struct DropRoleStmt
 
1800
{
 
1801
        NodeTag         type;
 
1802
        List       *roles;                      /* List of roles to remove */
 
1803
        bool            missing_ok;             /* skip error if a role is missing? */
 
1804
} DropRoleStmt;
 
1805
 
 
1806
/* ----------------------
 
1807
 *              {Create|Alter} SEQUENCE Statement
 
1808
 * ----------------------
 
1809
 */
 
1810
 
 
1811
typedef struct CreateSeqStmt
 
1812
{
 
1813
        NodeTag         type;
 
1814
        RangeVar   *sequence;           /* the sequence to create */
 
1815
        List       *options;
 
1816
        Oid                     ownerId;                /* ID of owner, or InvalidOid for default */
 
1817
} CreateSeqStmt;
 
1818
 
 
1819
typedef struct AlterSeqStmt
 
1820
{
 
1821
        NodeTag         type;
 
1822
        RangeVar   *sequence;           /* the sequence to alter */
 
1823
        List       *options;
 
1824
} AlterSeqStmt;
 
1825
 
 
1826
/* ----------------------
 
1827
 *              Create {Aggregate|Operator|Type} Statement
 
1828
 * ----------------------
 
1829
 */
 
1830
typedef struct DefineStmt
 
1831
{
 
1832
        NodeTag         type;
 
1833
        ObjectType      kind;                   /* aggregate, operator, type */
 
1834
        bool            oldstyle;               /* hack to signal old CREATE AGG syntax */
 
1835
        List       *defnames;           /* qualified name (list of Value strings) */
 
1836
        List       *args;                       /* a list of TypeName (if needed) */
 
1837
        List       *definition;         /* a list of DefElem */
 
1838
} DefineStmt;
 
1839
 
 
1840
/* ----------------------
 
1841
 *              Create Domain Statement
 
1842
 * ----------------------
 
1843
 */
 
1844
typedef struct CreateDomainStmt
 
1845
{
 
1846
        NodeTag         type;
 
1847
        List       *domainname;         /* qualified name (list of Value strings) */
 
1848
        TypeName   *typeName;           /* the base type */
 
1849
        CollateClause *collClause;      /* untransformed COLLATE spec, if any */
 
1850
        List       *constraints;        /* constraints (list of Constraint nodes) */
 
1851
} CreateDomainStmt;
 
1852
 
 
1853
/* ----------------------
 
1854
 *              Create Operator Class Statement
 
1855
 * ----------------------
 
1856
 */
 
1857
typedef struct CreateOpClassStmt
 
1858
{
 
1859
        NodeTag         type;
 
1860
        List       *opclassname;        /* qualified name (list of Value strings) */
 
1861
        List       *opfamilyname;       /* qualified name (ditto); NIL if omitted */
 
1862
        char       *amname;                     /* name of index AM opclass is for */
 
1863
        TypeName   *datatype;           /* datatype of indexed column */
 
1864
        List       *items;                      /* List of CreateOpClassItem nodes */
 
1865
        bool            isDefault;              /* Should be marked as default for type? */
 
1866
} CreateOpClassStmt;
 
1867
 
 
1868
#define OPCLASS_ITEM_OPERATOR           1
 
1869
#define OPCLASS_ITEM_FUNCTION           2
 
1870
#define OPCLASS_ITEM_STORAGETYPE        3
 
1871
 
 
1872
typedef struct CreateOpClassItem
 
1873
{
 
1874
        NodeTag         type;
 
1875
        int                     itemtype;               /* see codes above */
 
1876
        /* fields used for an operator or function item: */
 
1877
        List       *name;                       /* operator or function name */
 
1878
        List       *args;                       /* argument types */
 
1879
        int                     number;                 /* strategy num or support proc num */
 
1880
        List       *order_family;       /* only used for ordering operators */
 
1881
        List       *class_args;         /* only used for functions */
 
1882
        /* fields used for a storagetype item: */
 
1883
        TypeName   *storedtype;         /* datatype stored in index */
 
1884
} CreateOpClassItem;
 
1885
 
 
1886
/* ----------------------
 
1887
 *              Create Operator Family Statement
 
1888
 * ----------------------
 
1889
 */
 
1890
typedef struct CreateOpFamilyStmt
 
1891
{
 
1892
        NodeTag         type;
 
1893
        List       *opfamilyname;       /* qualified name (list of Value strings) */
 
1894
        char       *amname;                     /* name of index AM opfamily is for */
 
1895
} CreateOpFamilyStmt;
 
1896
 
 
1897
/* ----------------------
 
1898
 *              Alter Operator Family Statement
 
1899
 * ----------------------
 
1900
 */
 
1901
typedef struct AlterOpFamilyStmt
 
1902
{
 
1903
        NodeTag         type;
 
1904
        List       *opfamilyname;       /* qualified name (list of Value strings) */
 
1905
        char       *amname;                     /* name of index AM opfamily is for */
 
1906
        bool            isDrop;                 /* ADD or DROP the items? */
 
1907
        List       *items;                      /* List of CreateOpClassItem nodes */
 
1908
} AlterOpFamilyStmt;
 
1909
 
 
1910
/* ----------------------
 
1911
 *              Drop Table|Sequence|View|Index|Type|Domain|Conversion|Schema Statement
 
1912
 * ----------------------
 
1913
 */
 
1914
 
 
1915
typedef struct DropStmt
 
1916
{
 
1917
        NodeTag         type;
 
1918
        List       *objects;            /* list of sublists of names (as Values) */
 
1919
        ObjectType      removeType;             /* object type */
 
1920
        DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
 
1921
        bool            missing_ok;             /* skip error if object is missing? */
 
1922
} DropStmt;
 
1923
 
 
1924
/* ----------------------
 
1925
 *              Drop Rule|Trigger Statement
 
1926
 *
 
1927
 * In general this may be used for dropping any property of a relation;
 
1928
 * for example, someday soon we may have DROP ATTRIBUTE.
 
1929
 * ----------------------
 
1930
 */
 
1931
 
 
1932
typedef struct DropPropertyStmt
 
1933
{
 
1934
        NodeTag         type;
 
1935
        RangeVar   *relation;           /* owning relation */
 
1936
        char       *property;           /* name of rule, trigger, etc */
 
1937
        ObjectType      removeType;             /* OBJECT_RULE or OBJECT_TRIGGER */
 
1938
        DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
 
1939
        bool            missing_ok;             /* skip error if missing? */
 
1940
} DropPropertyStmt;
 
1941
 
 
1942
/* ----------------------
 
1943
 *                              Truncate Table Statement
 
1944
 * ----------------------
 
1945
 */
 
1946
typedef struct TruncateStmt
 
1947
{
 
1948
        NodeTag         type;
 
1949
        List       *relations;          /* relations (RangeVars) to be truncated */
 
1950
        bool            restart_seqs;   /* restart owned sequences? */
 
1951
        DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
 
1952
} TruncateStmt;
 
1953
 
 
1954
/* ----------------------
 
1955
 *                              Comment On Statement
 
1956
 * ----------------------
 
1957
 */
 
1958
typedef struct CommentStmt
 
1959
{
 
1960
        NodeTag         type;
 
1961
        ObjectType      objtype;                /* Object's type */
 
1962
        List       *objname;            /* Qualified name of the object */
 
1963
        List       *objargs;            /* Arguments if needed (eg, for functions) */
 
1964
        char       *comment;            /* Comment to insert, or NULL to remove */
 
1965
} CommentStmt;
 
1966
 
 
1967
/* ----------------------
 
1968
 *                              SECURITY LABEL Statement
 
1969
 * ----------------------
 
1970
 */
 
1971
typedef struct SecLabelStmt
 
1972
{
 
1973
        NodeTag         type;
 
1974
        ObjectType      objtype;                /* Object's type */
 
1975
        List       *objname;            /* Qualified name of the object */
 
1976
        List       *objargs;            /* Arguments if needed (eg, for functions) */
 
1977
        char       *provider;           /* Label provider (or NULL) */
 
1978
        char       *label;                      /* New security label to be assigned */
 
1979
} SecLabelStmt;
 
1980
 
 
1981
/* ----------------------
 
1982
 *              Declare Cursor Statement
 
1983
 *
 
1984
 * Note: the "query" field of DeclareCursorStmt is only used in the raw grammar
 
1985
 * output.      After parse analysis it's set to null, and the Query points to the
 
1986
 * DeclareCursorStmt, not vice versa.
 
1987
 * ----------------------
 
1988
 */
 
1989
#define CURSOR_OPT_BINARY               0x0001  /* BINARY */
 
1990
#define CURSOR_OPT_SCROLL               0x0002  /* SCROLL explicitly given */
 
1991
#define CURSOR_OPT_NO_SCROLL    0x0004  /* NO SCROLL explicitly given */
 
1992
#define CURSOR_OPT_INSENSITIVE  0x0008  /* INSENSITIVE */
 
1993
#define CURSOR_OPT_HOLD                 0x0010  /* WITH HOLD */
 
1994
#define CURSOR_OPT_FAST_PLAN    0x0020  /* prefer fast-start plan */
 
1995
 
 
1996
typedef struct DeclareCursorStmt
 
1997
{
 
1998
        NodeTag         type;
 
1999
        char       *portalname;         /* name of the portal (cursor) */
 
2000
        int                     options;                /* bitmask of options (see above) */
 
2001
        Node       *query;                      /* the raw SELECT query */
 
2002
} DeclareCursorStmt;
 
2003
 
 
2004
/* ----------------------
 
2005
 *              Close Portal Statement
 
2006
 * ----------------------
 
2007
 */
 
2008
typedef struct ClosePortalStmt
 
2009
{
 
2010
        NodeTag         type;
 
2011
        char       *portalname;         /* name of the portal (cursor) */
 
2012
        /* NULL means CLOSE ALL */
 
2013
} ClosePortalStmt;
 
2014
 
 
2015
/* ----------------------
 
2016
 *              Fetch Statement (also Move)
 
2017
 * ----------------------
 
2018
 */
 
2019
typedef enum FetchDirection
 
2020
{
 
2021
        /* for these, howMany is how many rows to fetch; FETCH_ALL means ALL */
 
2022
        FETCH_FORWARD,
 
2023
        FETCH_BACKWARD,
 
2024
        /* for these, howMany indicates a position; only one row is fetched */
 
2025
        FETCH_ABSOLUTE,
 
2026
        FETCH_RELATIVE
 
2027
} FetchDirection;
 
2028
 
 
2029
#define FETCH_ALL       LONG_MAX
 
2030
 
 
2031
typedef struct FetchStmt
 
2032
{
 
2033
        NodeTag         type;
 
2034
        FetchDirection direction;       /* see above */
 
2035
        long            howMany;                /* number of rows, or position argument */
 
2036
        char       *portalname;         /* name of portal (cursor) */
 
2037
        bool            ismove;                 /* TRUE if MOVE */
 
2038
} FetchStmt;
 
2039
 
 
2040
/* ----------------------
 
2041
 *              Create Index Statement
 
2042
 *
 
2043
 * This represents creation of an index and/or an associated constraint.
 
2044
 * If indexOid isn't InvalidOid, we are not creating an index, just a
 
2045
 * UNIQUE/PKEY constraint using an existing index.      isconstraint must always
 
2046
 * be true in this case, and the fields describing the index properties are
 
2047
 * empty.
 
2048
 * ----------------------
 
2049
 */
 
2050
typedef struct IndexStmt
 
2051
{
 
2052
        NodeTag         type;
 
2053
        char       *idxname;            /* name of new index, or NULL for default */
 
2054
        RangeVar   *relation;           /* relation to build index on */
 
2055
        char       *accessMethod;       /* name of access method (eg. btree) */
 
2056
        char       *tableSpace;         /* tablespace, or NULL for default */
 
2057
        List       *indexParams;        /* a list of IndexElem */
 
2058
        List       *options;            /* options from WITH clause */
 
2059
        Node       *whereClause;        /* qualification (partial-index predicate) */
 
2060
        List       *excludeOpNames; /* exclusion operator names, or NIL if none */
 
2061
        Oid                     indexOid;               /* OID of an existing index, if any */
 
2062
        bool            unique;                 /* is index unique? */
 
2063
        bool            primary;                /* is index on primary key? */
 
2064
        bool            isconstraint;   /* is it from a CONSTRAINT clause? */
 
2065
        bool            deferrable;             /* is the constraint DEFERRABLE? */
 
2066
        bool            initdeferred;   /* is the constraint INITIALLY DEFERRED? */
 
2067
        bool            concurrent;             /* should this be a concurrent index build? */
 
2068
} IndexStmt;
 
2069
 
 
2070
/* ----------------------
 
2071
 *              Create Function Statement
 
2072
 * ----------------------
 
2073
 */
 
2074
typedef struct CreateFunctionStmt
 
2075
{
 
2076
        NodeTag         type;
 
2077
        bool            replace;                /* T => replace if already exists */
 
2078
        List       *funcname;           /* qualified name of function to create */
 
2079
        List       *parameters;         /* a list of FunctionParameter */
 
2080
        TypeName   *returnType;         /* the return type */
 
2081
        List       *options;            /* a list of DefElem */
 
2082
        List       *withClause;         /* a list of DefElem */
 
2083
} CreateFunctionStmt;
 
2084
 
 
2085
typedef enum FunctionParameterMode
 
2086
{
 
2087
        /* the assigned enum values appear in pg_proc, don't change 'em! */
 
2088
        FUNC_PARAM_IN = 'i',            /* input only */
 
2089
        FUNC_PARAM_OUT = 'o',           /* output only */
 
2090
        FUNC_PARAM_INOUT = 'b',         /* both */
 
2091
        FUNC_PARAM_VARIADIC = 'v',      /* variadic (always input) */
 
2092
        FUNC_PARAM_TABLE = 't'          /* table function output column */
 
2093
} FunctionParameterMode;
 
2094
 
 
2095
typedef struct FunctionParameter
 
2096
{
 
2097
        NodeTag         type;
 
2098
        char       *name;                       /* parameter name, or NULL if not given */
 
2099
        TypeName   *argType;            /* TypeName for parameter type */
 
2100
        FunctionParameterMode mode; /* IN/OUT/etc */
 
2101
        Node       *defexpr;            /* raw default expr, or NULL if not given */
 
2102
} FunctionParameter;
 
2103
 
 
2104
typedef struct AlterFunctionStmt
 
2105
{
 
2106
        NodeTag         type;
 
2107
        FuncWithArgs *func;                     /* name and args of function */
 
2108
        List       *actions;            /* list of DefElem */
 
2109
} AlterFunctionStmt;
 
2110
 
 
2111
/* ----------------------
 
2112
 *              Drop {Function|Aggregate|Operator} Statement
 
2113
 * ----------------------
 
2114
 */
 
2115
typedef struct RemoveFuncStmt
 
2116
{
 
2117
        NodeTag         type;
 
2118
        ObjectType      kind;                   /* function, aggregate, operator */
 
2119
        List       *name;                       /* qualified name of object to drop */
 
2120
        List       *args;                       /* types of the arguments */
 
2121
        DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
 
2122
        bool            missing_ok;             /* skip error if missing? */
 
2123
} RemoveFuncStmt;
 
2124
 
 
2125
/* ----------------------
 
2126
 *              DO Statement
 
2127
 *
 
2128
 * DoStmt is the raw parser output, InlineCodeBlock is the execution-time API
 
2129
 * ----------------------
 
2130
 */
 
2131
typedef struct DoStmt
 
2132
{
 
2133
        NodeTag         type;
 
2134
        List       *args;                       /* List of DefElem nodes */
 
2135
} DoStmt;
 
2136
 
 
2137
typedef struct InlineCodeBlock
 
2138
{
 
2139
        NodeTag         type;
 
2140
        char       *source_text;        /* source text of anonymous code block */
 
2141
        Oid                     langOid;                /* OID of selected language */
 
2142
        bool            langIsTrusted;  /* trusted property of the language */
 
2143
} InlineCodeBlock;
 
2144
 
 
2145
/* ----------------------
 
2146
 *              Drop Operator Class Statement
 
2147
 * ----------------------
 
2148
 */
 
2149
typedef struct RemoveOpClassStmt
 
2150
{
 
2151
        NodeTag         type;
 
2152
        List       *opclassname;        /* qualified name (list of Value strings) */
 
2153
        char       *amname;                     /* name of index AM opclass is for */
 
2154
        DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
 
2155
        bool            missing_ok;             /* skip error if missing? */
 
2156
} RemoveOpClassStmt;
 
2157
 
 
2158
/* ----------------------
 
2159
 *              Drop Operator Family Statement
 
2160
 * ----------------------
 
2161
 */
 
2162
typedef struct RemoveOpFamilyStmt
 
2163
{
 
2164
        NodeTag         type;
 
2165
        List       *opfamilyname;       /* qualified name (list of Value strings) */
 
2166
        char       *amname;                     /* name of index AM opfamily is for */
 
2167
        DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
 
2168
        bool            missing_ok;             /* skip error if missing? */
 
2169
} RemoveOpFamilyStmt;
 
2170
 
 
2171
/* ----------------------
 
2172
 *              Alter Object Rename Statement
 
2173
 * ----------------------
 
2174
 */
 
2175
typedef struct RenameStmt
 
2176
{
 
2177
        NodeTag         type;
 
2178
        ObjectType      renameType;             /* OBJECT_TABLE, OBJECT_COLUMN, etc */
 
2179
        ObjectType      relationType;   /* if column name, associated relation type */
 
2180
        RangeVar   *relation;           /* in case it's a table */
 
2181
        List       *object;                     /* in case it's some other object */
 
2182
        List       *objarg;                     /* argument types, if applicable */
 
2183
        char       *subname;            /* name of contained object (column, rule,
 
2184
                                                                 * trigger, etc) */
 
2185
        char       *newname;            /* the new name */
 
2186
        DropBehavior behavior;          /* RESTRICT or CASCADE behavior */
 
2187
} RenameStmt;
 
2188
 
 
2189
/* ----------------------
 
2190
 *              ALTER object SET SCHEMA Statement
 
2191
 * ----------------------
 
2192
 */
 
2193
typedef struct AlterObjectSchemaStmt
 
2194
{
 
2195
        NodeTag         type;
 
2196
        ObjectType objectType;          /* OBJECT_TABLE, OBJECT_TYPE, etc */
 
2197
        RangeVar   *relation;           /* in case it's a table */
 
2198
        List       *object;                     /* in case it's some other object */
 
2199
        List       *objarg;                     /* argument types, if applicable */
 
2200
        char       *addname;            /* additional name if needed */
 
2201
        char       *newschema;          /* the new schema */
 
2202
} AlterObjectSchemaStmt;
 
2203
 
 
2204
/* ----------------------
 
2205
 *              Alter Object Owner Statement
 
2206
 * ----------------------
 
2207
 */
 
2208
typedef struct AlterOwnerStmt
 
2209
{
 
2210
        NodeTag         type;
 
2211
        ObjectType objectType;          /* OBJECT_TABLE, OBJECT_TYPE, etc */
 
2212
        RangeVar   *relation;           /* in case it's a table */
 
2213
        List       *object;                     /* in case it's some other object */
 
2214
        List       *objarg;                     /* argument types, if applicable */
 
2215
        char       *addname;            /* additional name if needed */
 
2216
        char       *newowner;           /* the new owner */
 
2217
} AlterOwnerStmt;
 
2218
 
 
2219
 
 
2220
/* ----------------------
 
2221
 *              Create Rule Statement
 
2222
 * ----------------------
 
2223
 */
 
2224
typedef struct RuleStmt
 
2225
{
 
2226
        NodeTag         type;
 
2227
        RangeVar   *relation;           /* relation the rule is for */
 
2228
        char       *rulename;           /* name of the rule */
 
2229
        Node       *whereClause;        /* qualifications */
 
2230
        CmdType         event;                  /* SELECT, INSERT, etc */
 
2231
        bool            instead;                /* is a 'do instead'? */
 
2232
        List       *actions;            /* the action statements */
 
2233
        bool            replace;                /* OR REPLACE */
 
2234
} RuleStmt;
 
2235
 
 
2236
/* ----------------------
 
2237
 *              Notify Statement
 
2238
 * ----------------------
 
2239
 */
 
2240
typedef struct NotifyStmt
 
2241
{
 
2242
        NodeTag         type;
 
2243
        char       *conditionname;      /* condition name to notify */
 
2244
        char       *payload;            /* the payload string, or NULL if none */
 
2245
} NotifyStmt;
 
2246
 
 
2247
/* ----------------------
 
2248
 *              Listen Statement
 
2249
 * ----------------------
 
2250
 */
 
2251
typedef struct ListenStmt
 
2252
{
 
2253
        NodeTag         type;
 
2254
        char       *conditionname;      /* condition name to listen on */
 
2255
} ListenStmt;
 
2256
 
 
2257
/* ----------------------
 
2258
 *              Unlisten Statement
 
2259
 * ----------------------
 
2260
 */
 
2261
typedef struct UnlistenStmt
 
2262
{
 
2263
        NodeTag         type;
 
2264
        char       *conditionname;      /* name to unlisten on, or NULL for all */
 
2265
} UnlistenStmt;
 
2266
 
 
2267
/* ----------------------
 
2268
 *              {Begin|Commit|Rollback} Transaction Statement
 
2269
 * ----------------------
 
2270
 */
 
2271
typedef enum TransactionStmtKind
 
2272
{
 
2273
        TRANS_STMT_BEGIN,
 
2274
        TRANS_STMT_START,                       /* semantically identical to BEGIN */
 
2275
        TRANS_STMT_COMMIT,
 
2276
        TRANS_STMT_ROLLBACK,
 
2277
        TRANS_STMT_SAVEPOINT,
 
2278
        TRANS_STMT_RELEASE,
 
2279
        TRANS_STMT_ROLLBACK_TO,
 
2280
        TRANS_STMT_PREPARE,
 
2281
        TRANS_STMT_COMMIT_PREPARED,
 
2282
        TRANS_STMT_ROLLBACK_PREPARED
 
2283
} TransactionStmtKind;
 
2284
 
 
2285
typedef struct TransactionStmt
 
2286
{
 
2287
        NodeTag         type;
 
2288
        TransactionStmtKind kind;       /* see above */
 
2289
        List       *options;            /* for BEGIN/START and savepoint commands */
 
2290
        char       *gid;                        /* for two-phase-commit related commands */
 
2291
} TransactionStmt;
 
2292
 
 
2293
/* ----------------------
 
2294
 *              Create Type Statement, composite types
 
2295
 * ----------------------
 
2296
 */
 
2297
typedef struct CompositeTypeStmt
 
2298
{
 
2299
        NodeTag         type;
 
2300
        RangeVar   *typevar;            /* the composite type to be created */
 
2301
        List       *coldeflist;         /* list of ColumnDef nodes */
 
2302
} CompositeTypeStmt;
 
2303
 
 
2304
/* ----------------------
 
2305
 *              Create Type Statement, enum types
 
2306
 * ----------------------
 
2307
 */
 
2308
typedef struct CreateEnumStmt
 
2309
{
 
2310
        NodeTag         type;
 
2311
        List       *typeName;           /* qualified name (list of Value strings) */
 
2312
        List       *vals;                       /* enum values (list of Value strings) */
 
2313
} CreateEnumStmt;
 
2314
 
 
2315
/* ----------------------
 
2316
 *              Alter Type Statement, enum types
 
2317
 * ----------------------
 
2318
 */
 
2319
typedef struct AlterEnumStmt
 
2320
{
 
2321
        NodeTag         type;
 
2322
        List       *typeName;           /* qualified name (list of Value strings) */
 
2323
        char       *newVal;                     /* new enum value's name */
 
2324
        char       *newValNeighbor; /* neighboring enum value, if specified */
 
2325
        bool            newValIsAfter;  /* place new enum value after neighbor? */
 
2326
} AlterEnumStmt;
 
2327
 
 
2328
/* ----------------------
 
2329
 *              Create View Statement
 
2330
 * ----------------------
 
2331
 */
 
2332
typedef struct ViewStmt
 
2333
{
 
2334
        NodeTag         type;
 
2335
        RangeVar   *view;                       /* the view to be created */
 
2336
        List       *aliases;            /* target column names */
 
2337
        Node       *query;                      /* the SELECT query */
 
2338
        bool            replace;                /* replace an existing view? */
 
2339
} ViewStmt;
 
2340
 
 
2341
/* ----------------------
 
2342
 *              Load Statement
 
2343
 * ----------------------
 
2344
 */
 
2345
typedef struct LoadStmt
 
2346
{
 
2347
        NodeTag         type;
 
2348
        char       *filename;           /* file to load */
 
2349
} LoadStmt;
 
2350
 
 
2351
/* ----------------------
 
2352
 *              Createdb Statement
 
2353
 * ----------------------
 
2354
 */
 
2355
typedef struct CreatedbStmt
 
2356
{
 
2357
        NodeTag         type;
 
2358
        char       *dbname;                     /* name of database to create */
 
2359
        List       *options;            /* List of DefElem nodes */
 
2360
} CreatedbStmt;
 
2361
 
 
2362
/* ----------------------
 
2363
 *      Alter Database
 
2364
 * ----------------------
 
2365
 */
 
2366
typedef struct AlterDatabaseStmt
 
2367
{
 
2368
        NodeTag         type;
 
2369
        char       *dbname;                     /* name of database to alter */
 
2370
        List       *options;            /* List of DefElem nodes */
 
2371
} AlterDatabaseStmt;
 
2372
 
 
2373
typedef struct AlterDatabaseSetStmt
 
2374
{
 
2375
        NodeTag         type;
 
2376
        char       *dbname;                     /* database name */
 
2377
        VariableSetStmt *setstmt;       /* SET or RESET subcommand */
 
2378
} AlterDatabaseSetStmt;
 
2379
 
 
2380
/* ----------------------
 
2381
 *              Dropdb Statement
 
2382
 * ----------------------
 
2383
 */
 
2384
typedef struct DropdbStmt
 
2385
{
 
2386
        NodeTag         type;
 
2387
        char       *dbname;                     /* database to drop */
 
2388
        bool            missing_ok;             /* skip error if db is missing? */
 
2389
} DropdbStmt;
 
2390
 
 
2391
/* ----------------------
 
2392
 *              Cluster Statement (support pbrown's cluster index implementation)
 
2393
 * ----------------------
 
2394
 */
 
2395
typedef struct ClusterStmt
 
2396
{
 
2397
        NodeTag         type;
 
2398
        RangeVar   *relation;           /* relation being indexed, or NULL if all */
 
2399
        char       *indexname;          /* original index defined */
 
2400
        bool            verbose;                /* print progress info */
 
2401
} ClusterStmt;
 
2402
 
 
2403
/* ----------------------
 
2404
 *              Vacuum and Analyze Statements
 
2405
 *
 
2406
 * Even though these are nominally two statements, it's convenient to use
 
2407
 * just one node type for both.  Note that at least one of VACOPT_VACUUM
 
2408
 * and VACOPT_ANALYZE must be set in options.  VACOPT_FREEZE is an internal
 
2409
 * convenience for the grammar and is not examined at runtime --- the
 
2410
 * freeze_min_age and freeze_table_age fields are what matter.
 
2411
 * ----------------------
 
2412
 */
 
2413
typedef enum VacuumOption
 
2414
{
 
2415
        VACOPT_VACUUM = 1 << 0,         /* do VACUUM */
 
2416
        VACOPT_ANALYZE = 1 << 1,        /* do ANALYZE */
 
2417
        VACOPT_VERBOSE = 1 << 2,        /* print progress info */
 
2418
        VACOPT_FREEZE = 1 << 3,         /* FREEZE option */
 
2419
        VACOPT_FULL = 1 << 4,           /* FULL (non-concurrent) vacuum */
 
2420
        VACOPT_NOWAIT = 1 << 5
 
2421
} VacuumOption;
 
2422
 
 
2423
typedef struct VacuumStmt
 
2424
{
 
2425
        NodeTag         type;
 
2426
        int                     options;                /* OR of VacuumOption flags */
 
2427
        int                     freeze_min_age; /* min freeze age, or -1 to use default */
 
2428
        int                     freeze_table_age;               /* age at which to scan whole table */
 
2429
        RangeVar   *relation;           /* single table to process, or NULL */
 
2430
        List       *va_cols;            /* list of column names, or NIL for all */
 
2431
} VacuumStmt;
 
2432
 
 
2433
/* ----------------------
 
2434
 *              Explain Statement
 
2435
 *
 
2436
 * The "query" field is either a raw parse tree (SelectStmt, InsertStmt, etc)
 
2437
 * or a Query node if parse analysis has been done.  Note that rewriting and
 
2438
 * planning of the query are always postponed until execution of EXPLAIN.
 
2439
 * ----------------------
 
2440
 */
 
2441
typedef struct ExplainStmt
 
2442
{
 
2443
        NodeTag         type;
 
2444
        Node       *query;                      /* the query (see comments above) */
 
2445
        List       *options;            /* list of DefElem nodes */
 
2446
} ExplainStmt;
 
2447
 
 
2448
/* ----------------------
 
2449
 * Checkpoint Statement
 
2450
 * ----------------------
 
2451
 */
 
2452
typedef struct CheckPointStmt
 
2453
{
 
2454
        NodeTag         type;
 
2455
} CheckPointStmt;
 
2456
 
 
2457
/* ----------------------
 
2458
 * Discard Statement
 
2459
 * ----------------------
 
2460
 */
 
2461
 
 
2462
typedef enum DiscardMode
 
2463
{
 
2464
        DISCARD_ALL,
 
2465
        DISCARD_PLANS,
 
2466
        DISCARD_TEMP
 
2467
} DiscardMode;
 
2468
 
 
2469
typedef struct DiscardStmt
 
2470
{
 
2471
        NodeTag         type;
 
2472
        DiscardMode target;
 
2473
} DiscardStmt;
 
2474
 
 
2475
/* ----------------------
 
2476
 *              LOCK Statement
 
2477
 * ----------------------
 
2478
 */
 
2479
typedef struct LockStmt
 
2480
{
 
2481
        NodeTag         type;
 
2482
        List       *relations;          /* relations to lock */
 
2483
        int                     mode;                   /* lock mode */
 
2484
        bool            nowait;                 /* no wait mode */
 
2485
} LockStmt;
 
2486
 
 
2487
/* ----------------------
 
2488
 *              SET CONSTRAINTS Statement
 
2489
 * ----------------------
 
2490
 */
 
2491
typedef struct ConstraintsSetStmt
 
2492
{
 
2493
        NodeTag         type;
 
2494
        List       *constraints;        /* List of names as RangeVars */
 
2495
        bool            deferred;
 
2496
} ConstraintsSetStmt;
 
2497
 
 
2498
/* ----------------------
 
2499
 *              REINDEX Statement
 
2500
 * ----------------------
 
2501
 */
 
2502
typedef struct ReindexStmt
 
2503
{
 
2504
        NodeTag         type;
 
2505
        ObjectType      kind;                   /* OBJECT_INDEX, OBJECT_TABLE, OBJECT_DATABASE */
 
2506
        RangeVar   *relation;           /* Table or index to reindex */
 
2507
        const char *name;                       /* name of database to reindex */
 
2508
        bool            do_system;              /* include system tables in database case */
 
2509
        bool            do_user;                /* include user tables in database case */
 
2510
} ReindexStmt;
 
2511
 
 
2512
/* ----------------------
 
2513
 *              CREATE CONVERSION Statement
 
2514
 * ----------------------
 
2515
 */
 
2516
typedef struct CreateConversionStmt
 
2517
{
 
2518
        NodeTag         type;
 
2519
        List       *conversion_name;    /* Name of the conversion */
 
2520
        char       *for_encoding_name;          /* source encoding name */
 
2521
        char       *to_encoding_name;           /* destination encoding name */
 
2522
        List       *func_name;          /* qualified conversion function name */
 
2523
        bool            def;                    /* is this a default conversion? */
 
2524
} CreateConversionStmt;
 
2525
 
 
2526
/* ----------------------
 
2527
 *      CREATE CAST Statement
 
2528
 * ----------------------
 
2529
 */
 
2530
typedef struct CreateCastStmt
 
2531
{
 
2532
        NodeTag         type;
 
2533
        TypeName   *sourcetype;
 
2534
        TypeName   *targettype;
 
2535
        FuncWithArgs *func;
 
2536
        CoercionContext context;
 
2537
        bool            inout;
 
2538
} CreateCastStmt;
 
2539
 
 
2540
/* ----------------------
 
2541
 *      DROP CAST Statement
 
2542
 * ----------------------
 
2543
 */
 
2544
typedef struct DropCastStmt
 
2545
{
 
2546
        NodeTag         type;
 
2547
        TypeName   *sourcetype;
 
2548
        TypeName   *targettype;
 
2549
        DropBehavior behavior;
 
2550
        bool            missing_ok;             /* skip error if missing? */
 
2551
} DropCastStmt;
 
2552
 
 
2553
 
 
2554
/* ----------------------
 
2555
 *              PREPARE Statement
 
2556
 * ----------------------
 
2557
 */
 
2558
typedef struct PrepareStmt
 
2559
{
 
2560
        NodeTag         type;
 
2561
        char       *name;                       /* Name of plan, arbitrary */
 
2562
        List       *argtypes;           /* Types of parameters (List of TypeName) */
 
2563
        Node       *query;                      /* The query itself (as a raw parsetree) */
 
2564
} PrepareStmt;
 
2565
 
 
2566
 
 
2567
/* ----------------------
 
2568
 *              EXECUTE Statement
 
2569
 * ----------------------
 
2570
 */
 
2571
 
 
2572
typedef struct ExecuteStmt
 
2573
{
 
2574
        NodeTag         type;
 
2575
        char       *name;                       /* The name of the plan to execute */
 
2576
        IntoClause *into;                       /* Optional table to store results in */
 
2577
        List       *params;                     /* Values to assign to parameters */
 
2578
} ExecuteStmt;
 
2579
 
 
2580
 
 
2581
/* ----------------------
 
2582
 *              DEALLOCATE Statement
 
2583
 * ----------------------
 
2584
 */
 
2585
typedef struct DeallocateStmt
 
2586
{
 
2587
        NodeTag         type;
 
2588
        char       *name;                       /* The name of the plan to remove */
 
2589
        /* NULL means DEALLOCATE ALL */
 
2590
} DeallocateStmt;
 
2591
 
 
2592
/*
 
2593
 *              DROP OWNED statement
 
2594
 */
 
2595
typedef struct DropOwnedStmt
 
2596
{
 
2597
        NodeTag         type;
 
2598
        List       *roles;
 
2599
        DropBehavior behavior;
 
2600
} DropOwnedStmt;
 
2601
 
 
2602
/*
 
2603
 *              REASSIGN OWNED statement
 
2604
 */
 
2605
typedef struct ReassignOwnedStmt
 
2606
{
 
2607
        NodeTag         type;
 
2608
        List       *roles;
 
2609
        char       *newrole;
 
2610
} ReassignOwnedStmt;
 
2611
 
 
2612
/*
 
2613
 * TS Dictionary stmts: DefineStmt, RenameStmt and DropStmt are default
 
2614
 */
 
2615
typedef struct AlterTSDictionaryStmt
 
2616
{
 
2617
        NodeTag         type;
 
2618
        List       *dictname;           /* qualified name (list of Value strings) */
 
2619
        List       *options;            /* List of DefElem nodes */
 
2620
} AlterTSDictionaryStmt;
 
2621
 
 
2622
/*
 
2623
 * TS Configuration stmts: DefineStmt, RenameStmt and DropStmt are default
 
2624
 */
 
2625
typedef struct AlterTSConfigurationStmt
 
2626
{
 
2627
        NodeTag         type;
 
2628
        List       *cfgname;            /* qualified name (list of Value strings) */
 
2629
 
 
2630
        /*
 
2631
         * dicts will be non-NIL if ADD/ALTER MAPPING was specified. If dicts is
 
2632
         * NIL, but tokentype isn't, DROP MAPPING was specified.
 
2633
         */
 
2634
        List       *tokentype;          /* list of Value strings */
 
2635
        List       *dicts;                      /* list of list of Value strings */
 
2636
        bool            override;               /* if true - remove old variant */
 
2637
        bool            replace;                /* if true - replace dictionary by another */
 
2638
        bool            missing_ok;             /* for DROP - skip error if missing? */
 
2639
} AlterTSConfigurationStmt;
 
2640
 
 
2641
#endif   /* PARSENODES_H */