parsenodes.h 42.9 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * parsenodes.h
4
 *	  definitions for parse tree nodes
5 6
 *
 *
7
 * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
B
Add:  
Bruce Momjian 已提交
8
 * Portions Copyright (c) 1994, Regents of the University of California
9
 *
10
 * $Id: parsenodes.h,v 1.180 2002/06/18 17:27:58 momjian Exp $
11 12 13
 *
 *-------------------------------------------------------------------------
 */
14 15
#ifndef PARSENODES_H
#define PARSENODES_H
16

17
#include "nodes/primnodes.h"
18

19

20
/*****************************************************************************
21
 *	Query Tree
22 23 24 25
 *****************************************************************************/

/*
 * Query -
26 27 28 29
 *	  all statments are turned into a Query tree (via transformStmt)
 *	  for further processing by the optimizer
 *	  utility statements (i.e. non-optimizable statements)
 *	  have the *utilityStmt field set.
30 31 32 33
 *
 * we need the isPortal flag because portal names can be null too; can
 * get rid of it if we support CURSOR as a commandType.
 */
34 35
typedef struct Query
{
36
	NodeTag		type;
37

38
	CmdType		commandType;	/* select|insert|update|delete|utility */
39

40
	Node	   *utilityStmt;	/* non-null if this is a non-optimizable
41 42
								 * statement */

43
	int			resultRelation; /* target relation (index into rtable) */
44
	RangeVar   *into;			/* target relation or portal (cursor) 
45
								 * for portal just name is meaningful */
46 47
	bool		isPortal;		/* is this a retrieve into portal? */
	bool		isBinary;		/* binary portal? */
48

49
	bool		hasAggs;		/* has aggregates in tlist or havingQual */
50
	bool		hasSubLinks;	/* has subquery SubLink */
51

52 53
	bool		originalQuery;	/* marks original query through rewriting */

54
	List	   *rtable;			/* list of range table entries */
B
Bruce Momjian 已提交
55 56
	FromExpr   *jointree;		/* table join tree (FROM and WHERE
								 * clauses) */
57

58 59
	List	   *rowMarks;		/* integer list of RT indexes of relations
								 * that are selected FOR UPDATE */
60

61
	List	   *targetList;		/* target list (of TargetEntry) */
62

63 64 65
	List	   *groupClause;	/* a list of GroupClause's */

	Node	   *havingQual;		/* qualifications applied to groups */
B
Hi!  
Bruce Momjian 已提交
66

67 68 69
	List	   *distinctClause; /* a list of SortClause's */

	List	   *sortClause;		/* a list of SortClause's */
70

B
Bruce Momjian 已提交
71 72
	Node	   *limitOffset;	/* # of result tuples to skip */
	Node	   *limitCount;		/* # of result tuples to return */
B
Bruce Momjian 已提交
73

74 75 76
	Node	   *setOperations;	/* set-operation tree if this is top level
								 * of a UNION/INTERSECT/EXCEPT query */

77 78 79 80 81 82 83 84
	/*
	 * If the resultRelation turns out to be the parent of an inheritance
	 * tree, the planner will add all the child tables to the rtable and
	 * store a list of the rtindexes of all the result relations here.
	 * This is done at plan time, not parse time, since we don't want to
	 * commit to the exact set of child tables at parse time.  This field
	 * ought to go in some sort of TopPlan plan node, not in the Query.
	 */
85
	List	   *resultRelations;	/* integer list of RT indexes, or NIL */
86

87
	/* internal to planner */
88
	List	   *base_rel_list;	/* list of base-relation RelOptInfos */
89
	List	   *other_rel_list; /* list of other 1-relation RelOptInfos */
90
	List	   *join_rel_list;	/* list of join-relation RelOptInfos */
91 92
	List	   *equi_key_list;	/* list of lists of equijoined
								 * PathKeyItems */
93
	List	   *query_pathkeys; /* pathkeys for query_planner()'s result */
94
} Query;
95 96


97 98
/****************************************************************************
 *	Supporting data structures for Parse Trees
99
 *
100 101 102 103
 *	Most of these node types appear in raw parsetrees output by the grammar,
 *	and get transformed to something else by the analyzer.	A few of them
 *	are used as-is in transformed querytrees.
 ****************************************************************************/
104

105 106
/*
 * TypeName - specifies a type in definitions
107 108 109 110 111 112 113 114
 *
 * For TypeName structures generated internally, it is often easier to
 * specify the type by OID than by name.  If "names" is NIL then the
 * actual type OID is given by typeid, otherwise typeid is unused.
 *
 * If pct_type is TRUE, then names is actually a field name and we look up
 * the type of that field.  Otherwise (the normal case), names is a type
 * name possibly qualified with schema and database name.
115
 */
116
typedef struct TypeName
117
{
118
	NodeTag		type;
119 120
	List	   *names;			/* qualified name (list of Value strings) */
	Oid			typeid;			/* type identified by OID */
121 122
	bool		timezone;		/* timezone specified? */
	bool		setof;			/* is a set? */
123
	bool		pct_type;		/* %TYPE specified? */
124 125 126
	int32		typmod;			/* type modifier */
	List	   *arrayBounds;	/* array bounds */
} TypeName;
127

128
/*
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
 * ColumnRef - specifies a reference to a column, or possibly a whole tuple
 *
 *		The "fields" list must be nonempty; its last component may be "*"
 *		instead of a field name.  Subscripts are optional.
 */
typedef struct ColumnRef
{
	NodeTag		type;
	List	   *fields;			/* field names (list of Value strings) */
	List	   *indirection;	/* subscripts (list of A_Indices) */
} ColumnRef;

/*
 * ParamRef - specifies a parameter reference
 *
 *		The parameter could be qualified with field names and/or subscripts
145
 */
146
typedef struct ParamRef
147 148
{
	NodeTag		type;
149
	int			number;			/* the number of the parameter */
150 151 152
	List	   *fields;			/* field names (list of Value strings) */
	List	   *indirection;	/* subscripts (list of A_Indices) */
} ParamRef;
153

154 155 156 157
/*
 * A_Expr - binary expressions
 */
typedef struct A_Expr
158
{
159
	NodeTag		type;
160
	int			oper;			/* type of operation (OP,OR,AND,NOT) */
161
	List	   *name;			/* possibly-qualified name of operator */
162 163 164
	Node	   *lexpr;			/* left argument */
	Node	   *rexpr;			/* right argument */
} A_Expr;
165

166 167 168 169
/*
 * A_Const - a constant expression
 */
typedef struct A_Const
170 171
{
	NodeTag		type;
172 173 174
	Value		val;			/* the value (with the tag) */
	TypeName   *typename;		/* typecast */
} A_Const;
175

176 177 178
/*
 * TypeCast - a CAST expression
 *
179
 * NOTE: for mostly historical reasons, A_Const parsenodes contain
180
 * room for a TypeName; we only generate a separate TypeCast node if the
181 182 183
 * argument to be casted is not a constant.  In theory either representation
 * would work, but it is convenient to have the target type immediately
 * available while resolving a constant's datatype.
184
 */
185
typedef struct TypeCast
186
{
187
	NodeTag		type;
188 189 190
	Node	   *arg;			/* the expression being casted */
	TypeName   *typename;		/* the target type */
} TypeCast;
191

192 193
/*
 * CaseExpr - a CASE expression
194
 */
195
typedef struct CaseExpr
196
{
197
	NodeTag		type;
198 199 200 201 202
	Oid			casetype;
	Node	   *arg;			/* implicit equality comparison argument */
	List	   *args;			/* the arguments (list of WHEN clauses) */
	Node	   *defresult;		/* the default result (ELSE clause) */
} CaseExpr;
203

204 205
/*
 * CaseWhen - an argument to a CASE expression
206
 */
207
typedef struct CaseWhen
208
{
209
	NodeTag		type;
210 211 212
	Node	   *expr;			/* comparison expression */
	Node	   *result;			/* substitution result */
} CaseWhen;
213

214 215
/* ----------------
 * NullTest
216
 *
217 218 219 220 221
 * NullTest represents the operation of testing a value for NULLness.
 * Currently, we only support scalar input values, but eventually a
 * row-constructor input should be supported.
 * The appropriate test is performed and returned as a boolean Datum.
 * ----------------
222 223
 */

224
typedef enum NullTestType
225
{
226 227
	IS_NULL, IS_NOT_NULL
} NullTestType;
228

229
typedef struct NullTest
230
{
231
	NodeTag		type;
232 233 234
	Node	   *arg;			/* input expression */
	NullTestType nulltesttype;	/* IS NULL, IS NOT NULL */
} NullTest;
J
Jan Wieck 已提交
235

236 237 238 239 240 241 242 243
/* ----------------
 * BooleanTest
 *
 * BooleanTest represents the operation of determining whether a boolean
 * is TRUE, FALSE, or UNKNOWN (ie, NULL).  All six meaningful combinations
 * are supported.  Note that a NULL input does *not* cause a NULL result.
 * The appropriate test is performed and returned as a boolean Datum.
 * ----------------
J
Jan Wieck 已提交
244 245
 */

246
typedef enum BoolTestType
J
Jan Wieck 已提交
247
{
248 249
	IS_TRUE, IS_NOT_TRUE, IS_FALSE, IS_NOT_FALSE, IS_UNKNOWN, IS_NOT_UNKNOWN
} BoolTestType;
250

251
typedef struct BooleanTest
252
{
253
	NodeTag		type;
254 255 256
	Node	   *arg;			/* input expression */
	BoolTestType booltesttype;	/* test type */
} BooleanTest;
257

258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
/*
 * ColumnDef - column definition (used in various creates)
 *
 * If the column has a default value, we may have the value expression
 * in either "raw" form (an untransformed parse tree) or "cooked" form
 * (the nodeToString representation of an executable expression tree),
 * depending on how this ColumnDef node was created (by parsing, or by
 * inheritance from an existing relation).	We should never have both
 * in the same node!
 *
 * The constraints list may contain a CONSTR_DEFAULT item in a raw
 * parsetree produced by gram.y, but transformCreateStmt will remove
 * the item and set raw_default instead.  CONSTR_DEFAULT items
 * should not appear in any subsequent processing.
 */
typedef struct ColumnDef
274
{
275
	NodeTag		type;
276 277 278 279 280 281 282 283
	char	   *colname;		/* name of column */
	TypeName   *typename;		/* type of column */
	bool		is_not_null;	/* NOT NULL constraint specified? */
	Node	   *raw_default;	/* default value (untransformed parse
								 * tree) */
	char	   *cooked_default; /* nodeToString representation */
	List	   *constraints;	/* other constraints on column */
} ColumnDef;
284

285 286
/*
 * Ident -
287 288
 *	  an unqualified identifier.  This is currently used only in the context
 *	  of column name lists.
289
 */
290
typedef struct Ident
291 292
{
	NodeTag		type;
293 294
	char	   *name;			/* its name */
} Ident;
295

296 297 298 299 300 301 302 303 304
/*
 * FuncCall - a function or aggregate invocation
 *
 * agg_star indicates we saw a 'foo(*)' construct, while agg_distinct
 * indicates we saw 'foo(DISTINCT ...)'.  In either case, the construct
 * *must* be an aggregate call.  Otherwise, it might be either an
 * aggregate or some other kind of function.
 */
typedef struct FuncCall
305 306
{
	NodeTag		type;
307
	List	   *funcname;		/* qualified name of function */
308 309 310 311
	List	   *args;			/* the arguments (list of exprs) */
	bool		agg_star;		/* argument was really '*' */
	bool		agg_distinct;	/* arguments were labeled DISTINCT */
} FuncCall;
312

313 314
/*
 * A_Indices - array reference or bounds ([lidx:uidx] or [uidx])
315
 */
316
typedef struct A_Indices
317
{
318
	NodeTag		type;
319 320 321
	Node	   *lidx;			/* could be NULL */
	Node	   *uidx;
} A_Indices;
322

323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
/*
 * ExprFieldSelect - select a field and/or array element from an expression
 *
 *		This is used in the raw parsetree to represent selection from an
 *		arbitrary expression (not a column or param reference).  Either
 *		fields or indirection may be NIL if not used.
 */
typedef struct ExprFieldSelect
{
	NodeTag		type;
	Node	   *arg;			/* the thing being selected from */
	List	   *fields;			/* field names (list of Value strings) */
	List	   *indirection;	/* subscripts (list of A_Indices) */
} ExprFieldSelect;

338 339 340 341 342 343 344 345 346 347 348 349 350 351 352
/*
 * ResTarget -
 *	  result target (used in target list of pre-transformed Parse trees)
 *
 * In a SELECT or INSERT target list, 'name' is either NULL or
 * the column name assigned to the value.  (If there is an 'AS ColumnLabel'
 * clause, the grammar sets 'name' from it; otherwise 'name' is initially NULL
 * and is filled in during the parse analysis phase.)
 * The 'indirection' field is not used at all.
 *
 * In an UPDATE target list, 'name' is the name of the destination column,
 * and 'indirection' stores any subscripts attached to the destination.
 * That is, our representation is UPDATE table SET name [indirection] = val.
 */
typedef struct ResTarget
353 354
{
	NodeTag		type;
355 356 357 358 359 360
	char	   *name;			/* column name or NULL */
	List	   *indirection;	/* subscripts for destination column, or
								 * NIL */
	Node	   *val;			/* the value expression to compute or
								 * assign */
} ResTarget;
361

B
Bruce Momjian 已提交
362 363 364 365 366 367 368 369
/*
 * Empty node used as a marker for Default Columns
 */
typedef struct InsertDefault
{
	NodeTag		type;
} InsertDefault;

370 371 372 373
/*
 * SortGroupBy - for ORDER BY clause
 */
typedef struct SortGroupBy
374 375
{
	NodeTag		type;
376
	List	   *useOp;			/* operator to use */
377 378
	Node	   *node;			/* Expression  */
} SortGroupBy;
379

380 381
/*
 * RangeSubselect - subquery appearing in a FROM clause
382
 */
383
typedef struct RangeSubselect
384
{
385
	NodeTag		type;
386
	Node	   *subquery;		/* the untransformed sub-select clause */
387
	Alias	   *alias;			/* table alias & optional column aliases */
388
} RangeSubselect;
389

390 391 392 393 394 395 396 397 398 399
/*
 * RangeFunction - function call appearing in a FROM clause
 */
typedef struct RangeFunction
{
	NodeTag		type;
	Node	   *funccallnode;	/* untransformed function call tree */
	Alias	   *alias;			/* table alias & optional column aliases */
} RangeFunction;

400 401 402
/*
 * IndexElem - index parameters (used in CREATE INDEX)
 *
403 404 405 406
 * For a plain index, each 'name' is an attribute name in the heap relation;
 * 'funcname' and 'args' are NIL.  For a functional index, only one IndexElem
 * is allowed.  It has name = NULL, funcname = name of function and args =
 * list of attribute names that are the function's arguments.
407 408
 */
typedef struct IndexElem
409
{
410
	NodeTag		type;
411 412
	char	   *name;			/* name of attribute to index, or NULL */
	List	   *funcname;		/* qualified name of function */
413
	List	   *args;			/* list of names of function arguments */
414
	List	   *opclass;		/* name of desired opclass; NIL = default */
415
} IndexElem;
416

417 418 419 420 421
/*
 * DefElem -
 *	  a definition (used in definition lists in the form of defname = arg)
 */
typedef struct DefElem
422
{
423
	NodeTag		type;
424 425 426
	char	   *defname;
	Node	   *arg;			/* a (Value *) or a (TypeName *) */
} DefElem;
427

V
Vadim B. Mikheev 已提交
428

429 430 431
/****************************************************************************
 *	Nodes for a Query tree
 ****************************************************************************/
V
Vadim B. Mikheev 已提交
432

433 434 435 436 437 438
/*
 * TargetEntry -
 *	   a target  entry (used in the transformed target list)
 *
 * one of resdom or fjoin is not NULL. a target list is
 *		((<resdom | fjoin> expr) (<resdom | fjoin> expr) ...)
439
 */
440
typedef struct TargetEntry
441
{
442
	NodeTag		type;
443 444 445 446
	Resdom	   *resdom;			/* fjoin overload this to be a list?? */
	Fjoin	   *fjoin;
	Node	   *expr;
} TargetEntry;
447

448 449 450 451
/*--------------------
 * RangeTblEntry -
 *	  A range table is a List of RangeTblEntry nodes.
 *
452 453 454 455 456 457
 *	  A range table entry may represent a plain relation, a sub-select in
 *	  FROM, or the result of a JOIN clause.  (Only explicit JOIN syntax
 *	  produces an RTE, not the implicit join resulting from multiple FROM
 *	  items.  This is because we only need the RTE to deal with SQL features
 *	  like outer joins and join-output-column aliasing.)  Other special
 *	  RTE types also exist, as indicated by RTEKind.
458
 *
459
 *	  alias is an Alias node representing the AS alias-clause attached to the
460 461 462 463 464
 *	  FROM expression, or NULL if no clause.
 *
 *	  eref is the table reference name and column reference names (either
 *	  real or aliases).  Note that system columns (OID etc) are not included
 *	  in the column list.
465
 *	  eref->aliasname is required to be present, and should generally be used
466 467 468 469
 *	  to identify the RTE for error messages etc.
 *
 *	  inh is TRUE for relation references that should be expanded to include
 *	  inheritance children, if the rel has any.  This *must* be FALSE for
470
 *	  RTEs other than RTE_RELATION entries.
471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
 *
 *	  inFromCl marks those range variables that are listed in the FROM clause.
 *	  In SQL, the query can only refer to range variables listed in the
 *	  FROM clause, but POSTQUEL allows you to refer to tables not listed,
 *	  in which case a range table entry will be generated.	We still support
 *	  this POSTQUEL feature, although there is some doubt whether it's
 *	  convenient or merely confusing.  The flag is needed since an
 *	  implicitly-added RTE shouldn't change the namespace for unqualified
 *	  column names processed later, and it also shouldn't affect the
 *	  expansion of '*'.
 *
 *	  checkForRead, checkForWrite, and checkAsUser control run-time access
 *	  permissions checks.  A rel will be checked for read or write access
 *	  (or both, or neither) per checkForRead and checkForWrite.  If
 *	  checkAsUser is not InvalidOid, then do the permissions checks using
 *	  the access rights of that user, not the current effective user ID.
 *	  (This allows rules to act as setuid gateways.)
 *--------------------
489
 */
490 491 492 493 494
typedef enum RTEKind
{
	RTE_RELATION,				/* ordinary relation reference */
	RTE_SUBQUERY,				/* subquery in FROM */
	RTE_JOIN,					/* join */
495 496
	RTE_SPECIAL,				/* special rule relation (NEW or OLD) */
	RTE_FUNCTION				/* function in FROM */
497 498
} RTEKind;

499
typedef struct RangeTblEntry
500
{
501
	NodeTag		type;
502

503 504
	RTEKind		rtekind;		/* see above */

505
	/*
506 507 508 509 510 511
	 * XXX the fields applicable to only some rte kinds should be merged
	 * into a union.  I didn't do this yet because the diffs would impact
	 * a lot of code that is being actively worked on.  FIXME later.
	 */

	/*
512
	 * Fields valid for a plain relation RTE (else zero):
513 514
	 */
	Oid			relid;			/* OID of the relation */
515

516 517 518 519
	/*
	 * Fields valid for a subquery RTE (else NULL):
	 */
	Query	   *subquery;		/* the sub-query */
520

521 522 523 524 525
	/*
	 * Fields valid for a function RTE (else NULL):
	 */
	Node	   *funcexpr;		/* expression tree for func call */

526
	/*
527
	 * Fields valid for a join RTE (else NULL/zero):
528
	 *
529 530 531 532 533
	 * joinaliasvars is a list of Vars or COALESCE expressions corresponding
	 * to the columns of the join result.  An alias Var referencing column
	 * K of the join result can be replaced by the K'th element of
	 * joinaliasvars --- but to simplify the task of reverse-listing aliases
	 * correctly, we do not do that until planning time.
534 535
	 */
	JoinType	jointype;		/* type of join */
536
	List	   *joinaliasvars;	/* list of alias-var expansions */
537

538 539 540
	/*
	 * Fields valid in all RTEs:
	 */
541 542
	Alias	   *alias;			/* user-written alias clause, if any */
	Alias	   *eref;			/* expanded reference names */
543 544 545 546 547 548
	bool		inh;			/* inheritance requested? */
	bool		inFromCl;		/* present in FROM clause */
	bool		checkForRead;	/* check rel for read access */
	bool		checkForWrite;	/* check rel for write access */
	Oid			checkAsUser;	/* if not zero, check access as this user */
} RangeTblEntry;
549

550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
/*
 * SortClause -
 *	   representation of ORDER BY clauses
 *
 * tleSortGroupRef must match ressortgroupref of exactly one Resdom of the
 * associated targetlist; that is the expression to be sorted (or grouped) by.
 * sortop is the OID of the ordering operator.
 *
 * SortClauses are also used to identify Resdoms that we will do a "Unique"
 * filter step on (for SELECT DISTINCT and SELECT DISTINCT ON).  The
 * distinctClause list is simply a copy of the relevant members of the
 * sortClause list.  Note that distinctClause can be a subset of sortClause,
 * but cannot have members not present in sortClause; and the members that
 * do appear must be in the same order as in sortClause.
 */
typedef struct SortClause
566
{
567
	NodeTag		type;
568 569 570
	Index		tleSortGroupRef;	/* reference into targetlist */
	Oid			sortop;			/* the sort operator to use */
} SortClause;
571

572 573 574 575 576 577 578
/*
 * GroupClause -
 *	   representation of GROUP BY clauses
 *
 * GroupClause is exactly like SortClause except for the nodetag value
 * (it's probably not even really necessary to have two different
 * nodetags...).  We have routines that operate interchangeably on both.
579
 */
580 581 582 583 584 585
typedef SortClause GroupClause;


/*****************************************************************************
 *		Optimizable Statements
 *****************************************************************************/
586 587

/* ----------------------
588
 *		Insert Statement
589 590
 * ----------------------
 */
591
typedef struct InsertStmt
592
{
593
	NodeTag		type;
594
	RangeVar   *relation;		/* relation to insert into */
595 596 597 598 599 600 601 602 603 604
	List	   *cols;			/* optional: names of the target columns */

	/*
	 * An INSERT statement has *either* VALUES or SELECT, never both. If
	 * VALUES, a targetList is supplied (empty for DEFAULT VALUES). If
	 * SELECT, a complete SelectStmt (or set-operation tree) is supplied.
	 */
	List	   *targetList;		/* the target list (of ResTarget) */
	Node	   *selectStmt;		/* the source SELECT */
} InsertStmt;
605

606
/* ----------------------
607
 *		Delete Statement
608 609
 * ----------------------
 */
610
typedef struct DeleteStmt
611
{
612
	NodeTag		type;
613
	RangeVar   *relation;		/* relation to delete from */
614 615
	Node	   *whereClause;	/* qualifications */
} DeleteStmt;
616 617

/* ----------------------
618
 *		Update Statement
619 620
 * ----------------------
 */
621
typedef struct UpdateStmt
622
{
623
	NodeTag		type;
624
	RangeVar   *relation;		/* relation to update */
625 626
	List	   *targetList;		/* the target list (of ResTarget) */
	Node	   *whereClause;	/* qualifications */
627
	List	   *fromClause;		/* optional from clause for more tables */
628
} UpdateStmt;
629 630

/* ----------------------
631 632 633 634 635 636 637 638 639 640
 *		Select Statement
 *
 * A "simple" SELECT is represented in the output of gram.y by a single
 * SelectStmt node.  A SELECT construct containing set operators (UNION,
 * INTERSECT, EXCEPT) is represented by a tree of SelectStmt nodes, in
 * which the leaf nodes are component SELECTs and the internal nodes
 * represent UNION, INTERSECT, or EXCEPT operators.  Using the same node
 * type for both leaf and internal nodes allows gram.y to stick ORDER BY,
 * LIMIT, etc, clause values into a SELECT statement without worrying
 * whether it is a simple or compound SELECT.
641 642
 * ----------------------
 */
643 644 645 646 647 648 649 650 651
typedef enum SetOperation
{
	SETOP_NONE = 0,
	SETOP_UNION,
	SETOP_INTERSECT,
	SETOP_EXCEPT
} SetOperation;

typedef struct SelectStmt
652
{
653
	NodeTag		type;
654 655 656 657 658 659 660

	/*
	 * These fields are used only in "leaf" SelectStmts.
	 */
	List	   *distinctClause; /* NULL, list of DISTINCT ON exprs, or
								 * lcons(NIL,NIL) for all (SELECT
								 * DISTINCT) */
661
	RangeVar   *into;			/* target table (for select into table) */
662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
	List	   *intoColNames;	/* column names for into table */
	List	   *targetList;		/* the target list (of ResTarget) */
	List	   *fromClause;		/* the FROM clause */
	Node	   *whereClause;	/* WHERE qualification */
	List	   *groupClause;	/* GROUP BY clauses */
	Node	   *havingClause;	/* HAVING conditional-expression */

	/*
	 * These fields are used in both "leaf" SelectStmts and upper-level
	 * SelectStmts.  portalname/binary may only be set at the top level.
	 */
	List	   *sortClause;		/* sort clause (a list of SortGroupBy's) */
	char	   *portalname;		/* the portal (cursor) to create */
	bool		binary;			/* a binary (internal) portal? */
	Node	   *limitOffset;	/* # of result tuples to skip */
	Node	   *limitCount;		/* # of result tuples to return */
	List	   *forUpdate;		/* FOR UPDATE clause */

	/*
	 * These fields are used only in upper-level SelectStmts.
	 */
	SetOperation op;			/* type of set op */
	bool		all;			/* ALL specified? */
	struct SelectStmt *larg;	/* left child */
	struct SelectStmt *rarg;	/* right child */
	/* Eventually add fields for CORRESPONDING spec here */
} SelectStmt;
689 690

/* ----------------------
691 692 693 694 695 696 697
 *		Set Operation node for post-analysis query trees
 *
 * After parse analysis, a SELECT with set operations is represented by a
 * top-level Query node containing the leaf SELECTs as subqueries in its
 * range table.  Its setOperations field shows the tree of set operations,
 * with leaf SelectStmt nodes replaced by RangeTblRef nodes, and internal
 * nodes replaced by SetOperationStmt nodes.
698 699
 * ----------------------
 */
700
typedef struct SetOperationStmt
701
{
702
	NodeTag		type;
703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722
	SetOperation op;			/* type of set op */
	bool		all;			/* ALL specified? */
	Node	   *larg;			/* left child */
	Node	   *rarg;			/* right child */
	/* Eventually add fields for CORRESPONDING spec here */

	/* Fields derived during parse analysis: */
	List	   *colTypes;		/* integer list of OIDs of output column
								 * types */
} SetOperationStmt;


/*****************************************************************************
 *		Other Statements (no optimizations required)
 *
 *		Some of them require a little bit of transformation (which is also
 *		done by transformStmt). The whole structure is then passed on to
 *		ProcessUtility (by-passing the optimization step) as the utilityStmt
 *		field in Query.
 *****************************************************************************/
723

724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739
/* ----------------------
 *		Create Schema Statement
 *
 * NOTE: the schemaElts list contains raw parsetrees for component statements
 * of the schema, such as CREATE TABLE, GRANT, etc.  These are analyzed and
 * executed after the schema itself is created.
 * ----------------------
 */
typedef struct CreateSchemaStmt
{
	NodeTag		type;
	char	   *schemaname;		/* the name of the schema to create */
	char	   *authid;			/* the owner of the created schema */
	List	   *schemaElts;		/* schema components (list of parsenodes) */
} CreateSchemaStmt;

740
/* ----------------------
741 742 743 744
 *	Alter Table
 *
 * The fields are used in different ways by the different variants of
 * this command.
745 746
 * ----------------------
 */
747
typedef struct AlterTableStmt
748
{
749
	NodeTag		type;
750 751 752
	char		subtype;		/*------------
								 *	A = add column
								 *	T = alter column default
753 754
								 *	N = alter column drop not null
								 *	O = alter column set not null
755 756 757 758 759 760 761 762 763
								 *	S = alter column statistics
								 *  M = alter column storage
								 *	D = drop column
								 *	C = add constraint
								 *	X = drop constraint
								 *	E = create toast table
								 *	U = change owner
								 *------------
								 */
764
	RangeVar   *relation;		/* table to work on */
765 766 767 768 769
	char	   *name;			/* column or constraint name to act on, or
								 * new owner */
	Node	   *def;			/* definition of new column or constraint */
	int			behavior;		/* CASCADE or RESTRICT drop behavior */
} AlterTableStmt;
770

771
/* ----------------------
772
 *		Grant|Revoke Statement
773 774
 * ----------------------
 */
775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802
typedef enum GrantObjectType
{
	ACL_OBJECT_RELATION,		/* table, view, sequence */
	ACL_OBJECT_DATABASE,		/* database */
	ACL_OBJECT_FUNCTION,		/* function */
	ACL_OBJECT_LANGUAGE,		/* procedural language */
	ACL_OBJECT_NAMESPACE		/* namespace */
} GrantObjectType;

/*
 * Grantable rights are encoded so that we can OR them together in a bitmask.
 * The present representation of AclItem limits us to 30 distinct rights.
 * Caution: changing these codes breaks stored ACLs, hence forces initdb.
 */
#define ACL_INSERT		(1<<0)	/* for relations */
#define ACL_SELECT		(1<<1)
#define ACL_UPDATE		(1<<2)
#define ACL_DELETE		(1<<3)
#define ACL_RULE		(1<<4)
#define ACL_REFERENCES	(1<<5)
#define ACL_TRIGGER		(1<<6)
#define ACL_EXECUTE		(1<<7)	/* for functions */
#define ACL_USAGE		(1<<8)	/* for languages and namespaces */
#define ACL_CREATE		(1<<9)	/* for namespaces and databases */
#define ACL_CREATE_TEMP	(1<<10)	/* for databases */
#define N_ACL_RIGHTS	11		/* 1 plus the last 1<<x */
#define ACL_ALL_RIGHTS	(-1)	/* all-privileges marker in GRANT list */
#define ACL_NO_RIGHTS	0
803 804

typedef struct GrantStmt
805
{
806
	NodeTag		type;
807 808 809 810
	bool		is_grant;		/* true = GRANT, false = REVOKE */
	GrantObjectType objtype;	/* kind of object being operated on */
	List	   *objects;		/* list of RangeVar nodes, FuncWithArgs nodes,
								 * or plain names (as Value strings) */
811 812 813
	List	   *privileges;		/* integer list of privilege codes */
	List	   *grantees;		/* list of PrivGrantee nodes */
} GrantStmt;
814

815
typedef struct PrivGrantee
816
{
817
	NodeTag		type;
818 819 820
	char	   *username;		/* if both are NULL then PUBLIC */
	char	   *groupname;
} PrivGrantee;
821

822
typedef struct FuncWithArgs
823
{
824
	NodeTag		type;
825
	List	   *funcname;		/* qualified name of function */
826 827
	List	   *funcargs;		/* list of Typename nodes */
} FuncWithArgs;
828

829 830
/* This is only used internally in gram.y. */
typedef struct PrivTarget
831
{
832
	NodeTag		type;
833
	GrantObjectType objtype;
834 835 836
	List	   *objs;
} PrivTarget;

837
/* ----------------------
838
 *		Close Portal Statement
839 840
 * ----------------------
 */
841
typedef struct ClosePortalStmt
842
{
843
	NodeTag		type;
844 845
	char	   *portalname;		/* name of the portal (cursor) */
} ClosePortalStmt;
846 847

/* ----------------------
848
 *		Copy Statement
849 850
 * ----------------------
 */
851
typedef struct CopyStmt
852
{
853
	NodeTag		type;
854
	bool		binary;			/* is a binary copy? */
855
	RangeVar   *relation;		/* the relation to copy */
856 857 858 859 860 861
	bool		oids;			/* copy oid's? */
	int			direction;		/* TO or FROM */
	char	   *filename;		/* if NULL, use stdin/stdout */
	char	   *delimiter;		/* delimiter character, \t by default */
	char	   *null_print;		/* how to print NULLs, `\N' by default */
} CopyStmt;
M
 
Marc G. Fournier 已提交
862 863

/* ----------------------
864 865 866 867 868 869 870
 *		Create Table Statement
 *
 * NOTE: in the raw gram.y output, ColumnDef, Constraint, and FkConstraint
 * nodes are intermixed in tableElts, and constraints is NIL.  After parse
 * analysis, tableElts contains just ColumnDefs, and constraints contains
 * just Constraint nodes (in fact, only CONSTR_CHECK nodes, in the present
 * implementation).
M
 
Marc G. Fournier 已提交
871 872
 * ----------------------
 */
873
typedef struct CreateStmt
M
 
Marc G. Fournier 已提交
874 875
{
	NodeTag		type;
876
	RangeVar   *relation;		/* relation to create */
877
	List	   *tableElts;		/* column definitions (list of ColumnDef) */
878
	List	   *inhRelations;	/* relations to inherit from */
879 880 881
	List	   *constraints;	/* constraints (list of Constraint nodes) */
	bool		hasoids;		/* should it have OIDs? */
} CreateStmt;
882

883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899
/* ----------
 * Definitions for plain (non-FOREIGN KEY) constraints in CreateStmt
 *
 * XXX probably these ought to be unified with FkConstraints at some point?
 *
 * For constraints that use expressions (CONSTR_DEFAULT, CONSTR_CHECK)
 * we may have the expression in either "raw" form (an untransformed
 * parse tree) or "cooked" form (the nodeToString representation of
 * an executable expression tree), depending on how this Constraint
 * node was created (by parsing, or by inheritance from an existing
 * relation).  We should never have both in the same node!
 *
 * Constraint attributes (DEFERRABLE etc) are initially represented as
 * separate Constraint nodes for simplicity of parsing.  analyze.c makes
 * a pass through the constraints list to attach the info to the appropriate
 * FkConstraint node (and, perhaps, someday to other kinds of constraints).
 * ----------
900
 */
901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917

typedef enum ConstrType			/* types of constraints */
{
	CONSTR_NULL,				/* not SQL92, but a lot of people expect
								 * it */
	CONSTR_NOTNULL,
	CONSTR_DEFAULT,
	CONSTR_CHECK,
	CONSTR_PRIMARY,
	CONSTR_UNIQUE,
	CONSTR_ATTR_DEFERRABLE,		/* attributes for previous constraint node */
	CONSTR_ATTR_NOT_DEFERRABLE,
	CONSTR_ATTR_DEFERRED,
	CONSTR_ATTR_IMMEDIATE
} ConstrType;

typedef struct Constraint
918
{
919
	NodeTag		type;
920 921 922 923 924 925
	ConstrType	contype;
	char	   *name;			/* name, or NULL if unnamed */
	Node	   *raw_expr;		/* expr, as untransformed parse tree */
	char	   *cooked_expr;	/* expr, as nodeToString representation */
	List	   *keys;			/* Ident nodes naming referenced column(s) */
} Constraint;
926

927 928 929
/* ----------
 * Definitions for FOREIGN KEY constraints in CreateStmt
 * ----------
930
 */
931 932 933 934 935 936 937 938 939 940 941 942 943
#define FKCONSTR_ON_KEY_NOACTION		0x0000
#define FKCONSTR_ON_KEY_RESTRICT		0x0001
#define FKCONSTR_ON_KEY_CASCADE			0x0002
#define FKCONSTR_ON_KEY_SETNULL			0x0004
#define FKCONSTR_ON_KEY_SETDEFAULT		0x0008

#define FKCONSTR_ON_DELETE_MASK			0x000F
#define FKCONSTR_ON_DELETE_SHIFT		0

#define FKCONSTR_ON_UPDATE_MASK			0x00F0
#define FKCONSTR_ON_UPDATE_SHIFT		4

typedef struct FkConstraint
944
{
945
	NodeTag		type;
946
	char	   *constr_name;	/* Constraint name */
947
	RangeVar   *pktable;		/* Primary key table */
948 949 950 951 952 953 954
	List	   *fk_attrs;		/* Attributes of foreign key */
	List	   *pk_attrs;		/* Corresponding attrs in PK table */
	char	   *match_type;		/* FULL or PARTIAL */
	int32		actions;		/* ON DELETE/UPDATE actions */
	bool		deferrable;		/* DEFERRABLE */
	bool		initdeferred;	/* INITIALLY DEFERRED */
} FkConstraint;
955 956

/* ----------------------
957
 *		Create/Drop TRIGGER Statements
958 959
 * ----------------------
 */
960 961

typedef struct CreateTrigStmt
962
{
963
	NodeTag		type;
964 965 966 967
	char	   *trigname;		/* TRIGGER's name */
	RangeVar   *relation;		/* relation trigger is on */
	List	   *funcname;		/* qual. name of function to call */
	List	   *args;			/* list of (T_String) Values or NIL */
968 969 970 971 972 973 974
	bool		before;			/* BEFORE/AFTER */
	bool		row;			/* ROW/STATEMENT */
	char		actions[4];		/* Insert, Update, Delete */
	char	   *lang;			/* currently not used, always NULL */
	char	   *text;			/* AS 'text' */
	List	   *attr;			/* UPDATE OF a, b,... (NI) or NULL */
	char	   *when;			/* WHEN 'a > 10 ...' (NI) or NULL */
975

976 977 978 979 980
	/* The following are used for referential */
	/* integrity constraint triggers */
	bool		isconstraint;	/* This is an RI trigger */
	bool		deferrable;		/* [NOT] DEFERRABLE */
	bool		initdeferred;	/* INITIALLY {DEFERRED|IMMEDIATE} */
981
	RangeVar   *constrrel;		/* opposite relation */
982 983
} CreateTrigStmt;

984
/* ----------------------
985
 *		Create/Drop PROCEDURAL LANGUAGE Statement
986 987
 * ----------------------
 */
988
typedef struct CreatePLangStmt
989 990
{
	NodeTag		type;
991
	char	   *plname;			/* PL name */
992
	List	   *plhandler;		/* PL call handler function (qual. name) */
993
	List	   *plvalidator;	/* optional validator function (qual. name) */
994 995 996
	char	   *plcompiler;		/* lancompiler text */
	bool		pltrusted;		/* PL is trusted */
} CreatePLangStmt;
997

998
typedef struct DropPLangStmt
999
{
1000
	NodeTag		type;
1001 1002
	char	   *plname;			/* PL name */
} DropPLangStmt;
1003 1004

/* ----------------------
1005
 *	Create/Alter/Drop User Statements
1006 1007
 * ----------------------
 */
1008
typedef struct CreateUserStmt
1009
{
1010
	NodeTag		type;
1011 1012 1013
	char	   *user;			/* PostgreSQL user login name */
	List	   *options;		/* List of DefElem nodes */
} CreateUserStmt;
1014

1015
typedef struct AlterUserStmt
1016
{
1017
	NodeTag		type;
1018 1019 1020
	char	   *user;			/* PostgreSQL user login name */
	List	   *options;		/* List of DefElem nodes */
} AlterUserStmt;
1021

1022
typedef struct AlterUserSetStmt
1023
{
1024
	NodeTag		type;
1025 1026 1027 1028
	char	   *user;
	char	   *variable;
	List	   *value;
} AlterUserSetStmt;
1029

1030
typedef struct DropUserStmt
V
Vadim B. Mikheev 已提交
1031 1032
{
	NodeTag		type;
1033 1034
	List	   *users;			/* List of users to remove */
} DropUserStmt;
V
Vadim B. Mikheev 已提交
1035

1036
/* ----------------------
1037
 *		Create/Alter/Drop Group Statements
1038 1039
 * ----------------------
 */
1040
typedef struct CreateGroupStmt
1041
{
1042
	NodeTag		type;
1043 1044 1045
	char	   *name;			/* name of the new group */
	List	   *options;		/* List of DefElem nodes */
} CreateGroupStmt;
1046

1047 1048 1049 1050 1051 1052 1053
typedef struct AlterGroupStmt
{
	NodeTag		type;
	char	   *name;			/* name of group to alter */
	int			action;			/* +1 = add, -1 = drop user */
	List	   *listUsers;		/* list of users to add/drop */
} AlterGroupStmt;
1054

1055
typedef struct DropGroupStmt
1056
{
1057 1058
	NodeTag		type;
	char	   *name;
1059
} DropGroupStmt;
1060 1061

/* ----------------------
1062
 *		Create SEQUENCE Statement
1063 1064 1065
 * ----------------------
 */

1066
typedef struct CreateSeqStmt
1067
{
1068
	NodeTag		type;
1069
	RangeVar   *sequence;		/* the sequence to create */
1070 1071
	List	   *options;
} CreateSeqStmt;
1072

1073
/* ----------------------
1074
 *		Create {Operator|Type|Aggregate} Statement
1075 1076
 * ----------------------
 */
1077
typedef struct DefineStmt
1078 1079
{
	NodeTag		type;
T
Tom Lane 已提交
1080
	int			defType;		/* OPERATOR|TYPE_P|AGGREGATE */
1081
	List	   *defnames;		/* qualified name (list of Value strings) */
1082 1083
	List	   *definition;		/* a list of DefElem */
} DefineStmt;
1084

T
Tom Lane 已提交
1085 1086 1087 1088 1089 1090 1091
/* ----------------------
 *		Create Domain Statement
 * ----------------------
 */
typedef struct CreateDomainStmt
{
	NodeTag		type;
1092 1093 1094
	List	   *domainname;		/* qualified name (list of Value strings) */
	TypeName   *typename;		/* the base type */
	List	   *constraints;	/* constraints (list of Constraint nodes) */
T
Tom Lane 已提交
1095 1096
} CreateDomainStmt;

H
Hiroshi Inoue 已提交
1097
/* ----------------------
1098
 *		Drop Table|Sequence|View|Index|Type|Domain Statement
H
Hiroshi Inoue 已提交
1099 1100 1101
 * ----------------------
 */

1102 1103 1104 1105
#define DROP_TABLE	  1
#define DROP_SEQUENCE 2
#define DROP_VIEW	  3
#define DROP_INDEX	  4
1106 1107
#define DROP_TYPE     5
#define DROP_DOMAIN	  6
1108

1109 1110 1111
typedef struct DropStmt
{
	NodeTag		type;
1112
	List	   *objects;		/* list of sublists of names (as Values) */
1113
	int			removeType;
1114
	int	   		behavior;		/* CASCADE or RESTRICT drop behavior */
1115
} DropStmt;
1116

1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135
/* ----------------------
 *		Drop Rule|Trigger Statement
 *
 * In general this may be used for dropping any property of a relation;
 * for example, someday soon we may have DROP ATTRIBUTE.
 * ----------------------
 */

#define DROP_RULE	  100
#define DROP_TRIGGER  101

typedef struct DropPropertyStmt
{
	NodeTag		type;
	RangeVar   *relation;		/* owning relation */
	char	   *property;		/* name of rule, trigger, etc */
	int			removeType;
} DropPropertyStmt;

1136
/* ----------------------
1137
 *				Truncate Table Statement
1138 1139
 * ----------------------
 */
1140
typedef struct TruncateStmt
1141
{
1142
	NodeTag		type;
1143
	RangeVar   *relation;		/* relation to be truncated */
1144
} TruncateStmt;
1145 1146

/* ----------------------
1147
 *				Comment On Statement
1148 1149
 * ----------------------
 */
1150
typedef struct CommentStmt
1151
{
1152
	NodeTag		type;
1153
	int			objtype;		/* Object's type */
1154 1155 1156
	List	   *objname;		/* Qualified name of the object */
	List	   *objargs;		/* Arguments if needed (eg, for functions) */
	char	   *comment;		/* Comment to insert, or NULL to remove */
1157
} CommentStmt;
1158 1159

/* ----------------------
1160
 *		Begin Recipe Statement
1161 1162
 * ----------------------
 */
1163
typedef struct RecipeStmt
1164
{
1165
	NodeTag		type;
1166 1167
	char	   *recipeName;		/* name of the recipe */
} RecipeStmt;
1168 1169

/* ----------------------
1170
 *		Fetch Statement
1171 1172
 * ----------------------
 */
1173
typedef struct FetchStmt
1174
{
1175
	NodeTag		type;
1176 1177 1178 1179 1180
	int			direction;		/* FORWARD or BACKWARD */
	int			howMany;		/* amount to fetch ("ALL" --> 0) */
	char	   *portalname;		/* name of portal (cursor) */
	bool		ismove;			/* TRUE if MOVE */
} FetchStmt;
1181

1182
/* ----------------------
1183
 *		Create Index Statement
1184 1185
 * ----------------------
 */
1186
typedef struct IndexStmt
1187 1188
{
	NodeTag		type;
1189
	char	   *idxname;		/* name of the index */
1190
	RangeVar   *relation;		/* relation to build index on */
1191 1192 1193 1194 1195 1196 1197 1198
	char	   *accessMethod;	/* name of access method (eg. btree) */
	List	   *indexParams;	/* a list of IndexElem */
	Node	   *whereClause;	/* qualification (partial-index predicate) */
	List	   *rangetable;		/* range table for qual, filled in by
								 * transformStmt() */
	bool		unique;			/* is index unique? */
	bool		primary;		/* is index on primary key? */
} IndexStmt;
1199

1200 1201 1202
/* ----------------------
 *		Create Function Statement
 * ----------------------
1203
 */
1204
typedef struct CreateFunctionStmt
1205
{
1206
	NodeTag		type;
1207
	bool		replace;		/* T => replace if already exists */
1208
	List	   *funcname;		/* qualified name of function to create */
1209
	List	   *argTypes;		/* list of argument types (TypeName nodes) */
1210
	TypeName   *returnType;		/* the return type */
1211
	List	   *options;		/* a list of DefElem */
1212
	List	   *withClause;		/* a list of DefElem */
1213
} CreateFunctionStmt;
1214

1215 1216 1217
/* ----------------------
 *		Drop Aggregate Statement
 * ----------------------
1218
 */
1219
typedef struct RemoveAggrStmt
1220
{
1221
	NodeTag		type;
1222
	List	   *aggname;		/* aggregate to drop */
1223
	TypeName   *aggtype;		/* TypeName for input datatype, or NULL */
1224
} RemoveAggrStmt;
1225

1226 1227 1228
/* ----------------------
 *		Drop Function Statement
 * ----------------------
1229
 */
1230
typedef struct RemoveFuncStmt
1231
{
1232
	NodeTag		type;
1233
	List	   *funcname;		/* function to drop */
1234 1235
	List	   *args;			/* types of the arguments */
} RemoveFuncStmt;
1236

1237 1238 1239
/* ----------------------
 *		Drop Operator Statement
 * ----------------------
1240
 */
1241
typedef struct RemoveOperStmt
1242
{
1243
	NodeTag		type;
1244
	List	   *opname;			/* operator to drop */
1245 1246
	List	   *args;			/* types of the arguments */
} RemoveOperStmt;
1247

1248
/* ----------------------
1249
 *		Alter Object Rename Statement
1250
 * ----------------------
1251 1252
 * Currently supports renaming tables, table columns, and triggers.
 * If renaming a table, oldname is ignored.
1253
 */
1254 1255 1256 1257 1258
#define RENAME_TABLE	110
#define RENAME_COLUMN	111
#define RENAME_TRIGGER	112
#define RENAME_RULE		113

1259
typedef struct RenameStmt
1260
{
1261
	NodeTag		type;
1262 1263
	RangeVar   *relation;		/* owning relation */
	char	   *oldname;		/* name of rule, trigger, etc */
1264
	char	   *newname;		/* the new name */
1265
	int			renameType;		/* RENAME_TABLE, RENAME_COLUMN, etc */
1266
} RenameStmt;
1267

1268 1269 1270
/* ----------------------
 *		Create Rule Statement
 * ----------------------
1271
 */
1272
typedef struct RuleStmt
1273 1274
{
	NodeTag		type;
1275
	RangeVar   *relation;		/* relation the rule is for */
1276 1277
	char	   *rulename;		/* name of the rule */
	Node	   *whereClause;	/* qualifications */
1278
	CmdType		event;			/* SELECT, INSERT, etc */
1279 1280 1281
	bool		instead;		/* is a 'do instead'? */
	List	   *actions;		/* the action statements */
} RuleStmt;
1282

1283 1284 1285
/* ----------------------
 *		Notify Statement
 * ----------------------
T
Thomas G. Lockhart 已提交
1286
 */
1287
typedef struct NotifyStmt
T
Thomas G. Lockhart 已提交
1288 1289
{
	NodeTag		type;
1290
	RangeVar   *relation;		/* qualified name to notify */
1291
} NotifyStmt;
T
Thomas G. Lockhart 已提交
1292

1293 1294 1295
/* ----------------------
 *		Listen Statement
 * ----------------------
T
Thomas G. Lockhart 已提交
1296
 */
1297
typedef struct ListenStmt
T
Thomas G. Lockhart 已提交
1298 1299
{
	NodeTag		type;
1300
	RangeVar   *relation;		/* qualified name to listen on */
1301
} ListenStmt;
T
Thomas G. Lockhart 已提交
1302

1303 1304 1305
/* ----------------------
 *		Unlisten Statement
 * ----------------------
1306
 */
1307
typedef struct UnlistenStmt
1308
{
1309
	NodeTag		type;
1310
	RangeVar   *relation;		/* qualified name to unlisten on, or '*' */
1311
} UnlistenStmt;
1312

1313 1314 1315 1316 1317
/* ----------------------
 *		{Begin|Abort|End} Transaction Statement
 * ----------------------
 */
typedef struct TransactionStmt
1318
{
1319
	NodeTag		type;
1320 1321
	int			command;		/* BEGIN|END|ABORT */
} TransactionStmt;
1322

1323 1324 1325
/* ----------------------
 *		Create View Statement
 * ----------------------
1326
 */
1327
typedef struct ViewStmt
1328
{
1329
	NodeTag		type;
1330
	RangeVar   *view;			/* the view to be created */
1331 1332 1333
	List	   *aliases;		/* target column names */
	Query	   *query;			/* the SQL statement */
} ViewStmt;
1334

1335 1336 1337 1338 1339
/* ----------------------
 *		Load Statement
 * ----------------------
 */
typedef struct LoadStmt
1340
{
1341
	NodeTag		type;
1342 1343
	char	   *filename;		/* file to load */
} LoadStmt;
1344

1345 1346 1347
/* ----------------------
 *		Createdb Statement
 * ----------------------
1348
 */
1349
typedef struct CreatedbStmt
1350
{
1351
	NodeTag		type;
1352
	char	   *dbname;			/* name of database to create */
1353
	List	   *options;		/* List of DefElem nodes */
1354
} CreatedbStmt;
1355

1356 1357 1358
/* ----------------------
 *	Alter Database
 * ----------------------
1359
 */
1360
typedef struct AlterDatabaseSetStmt
1361
{
1362
	NodeTag		type;
1363 1364 1365 1366
	char	   *dbname;
	char	   *variable;
	List	   *value;
} AlterDatabaseSetStmt;
1367

1368 1369 1370
/* ----------------------
 *		Dropdb Statement
 * ----------------------
1371
 */
1372
typedef struct DropdbStmt
1373
{
1374
	NodeTag		type;
1375 1376
	char	   *dbname;			/* database to drop */
} DropdbStmt;
1377

1378 1379 1380
/* ----------------------
 *		Cluster Statement (support pbrown's cluster index implementation)
 * ----------------------
1381
 */
1382
typedef struct ClusterStmt
1383
{
1384
	NodeTag		type;
1385
	RangeVar   *relation;		/* relation being indexed */
1386 1387
	char	   *indexname;		/* original index defined */
} ClusterStmt;
1388

1389 1390
/* ----------------------
 *		Vacuum and Analyze Statements
1391
 *
1392 1393 1394
 * Even though these are nominally two statements, it's convenient to use
 * just one node type for both.
 * ----------------------
1395
 */
1396
typedef struct VacuumStmt
1397
{
1398
	NodeTag		type;
1399 1400 1401 1402 1403
	bool		vacuum;			/* do VACUUM step */
	bool		full;			/* do FULL (non-concurrent) vacuum */
	bool		analyze;		/* do ANALYZE step */
	bool		freeze;			/* early-freeze option */
	bool		verbose;		/* print progress info */
1404
	RangeVar   *relation;		/* single table to process, or NULL */
1405 1406
	List	   *va_cols;		/* list of column names, or NIL for all */
} VacuumStmt;
1407

1408 1409 1410
/* ----------------------
 *		Explain Statement
 * ----------------------
1411
 */
1412
typedef struct ExplainStmt
M
 
Marc G. Fournier 已提交
1413 1414
{
	NodeTag		type;
1415 1416 1417 1418
	Query	   *query;			/* the query */
	bool		verbose;		/* print plan info */
	bool		analyze;		/* get statistics by executing plan */
} ExplainStmt;
M
 
Marc G. Fournier 已提交
1419

1420 1421 1422
/* ----------------------
 * Checkpoint Statement
 * ----------------------
1423
 */
1424
typedef struct CheckPointStmt
1425
{
1426
	NodeTag		type;
1427
} CheckPointStmt;
1428

1429 1430 1431
/* ----------------------
 * Set Statement
 * ----------------------
1432
 */
1433 1434

typedef struct VariableSetStmt
1435 1436
{
	NodeTag		type;
1437 1438
	char	   *name;
	List	   *args;
1439
	bool		is_local;		/* SET LOCAL */
1440
} VariableSetStmt;
1441

1442 1443 1444
/* ----------------------
 * Show Statement
 * ----------------------
1445
 */
1446 1447

typedef struct VariableShowStmt
1448
{
1449
	NodeTag		type;
1450 1451
	char	   *name;
} VariableShowStmt;
1452

1453 1454 1455
/* ----------------------
 * Reset Statement
 * ----------------------
1456
 */
1457 1458

typedef struct VariableResetStmt
1459
{
1460
	NodeTag		type;
1461 1462
	char	   *name;
} VariableResetStmt;
1463

1464 1465 1466
/* ----------------------
 *		LOCK Statement
 * ----------------------
1467
 */
1468
typedef struct LockStmt
1469
{
1470
	NodeTag		type;
1471
	List	   *relations;		/* relations to lock */
1472 1473
	int			mode;			/* lock mode */
} LockStmt;
1474

1475 1476 1477
/* ----------------------
 *		SET CONSTRAINTS Statement
 * ----------------------
1478
 */
1479
typedef struct ConstraintsSetStmt
1480
{
1481
	NodeTag		type;
1482 1483 1484
	List	   *constraints;	/* List of names as Value strings */
	bool		deferred;
} ConstraintsSetStmt;
B
Bruce Momjian 已提交
1485

1486 1487 1488
/* ----------------------
 *		REINDEX Statement
 * ----------------------
1489
 */
1490
typedef struct ReindexStmt
1491
{
1492
	NodeTag		type;
1493
	int			reindexType;	/* INDEX|TABLE|DATABASE */
1494 1495
	RangeVar   *relation;		/* Table or index to reindex */
	const char *name;			/* name of database to reindex */
1496 1497 1498
	bool		force;
	bool		all;
} ReindexStmt;
1499

1500
#endif   /* PARSENODES_H */