parsenodes.h 48.7 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * parsenodes.h
4
 *	  definitions for parse tree nodes
5 6
 *
 *
B
Bruce Momjian 已提交
7
 * Portions Copyright (c) 1996-2002, 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.207 2002/09/18 21:35:24 tgl 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) */
B
Bruce Momjian 已提交
44 45
	RangeVar   *into;			/* target relation or portal (cursor) 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
 *
 * 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
B
Bruce Momjian 已提交
113
 * the type of that field.	Otherwise (the normal case), names is a type
114
 * 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
 * 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 已提交
243 244
 */

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

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

257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
/*
 * ConstraintTest
 *
 * ConstraintTest represents the operation of testing a value to see whether
 * it meets a constraint.  If so, the input value is returned as the result;
 * if not, an error is raised.
 */

typedef enum ConstraintTestType
{
	CONSTR_TEST_NOTNULL,
	CONSTR_TEST_CHECK
} ConstraintTestType;

typedef struct ConstraintTest
{
	NodeTag		type;
	Node	   *arg;			/* input expression */
B
Bruce Momjian 已提交
275
	ConstraintTestType testtype;	/* test type */
276 277 278 279
	char	   *name;			/* name of constraint (for error msgs) */
	Node	   *check_expr;		/* for CHECK test, a boolean expression */
} ConstraintTest;

280 281 282 283 284 285 286 287 288 289 290 291 292 293
/*
 * 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.
294 295 296 297
 *
 * The "support" field, if not null, denotes a supporting relation that
 * should be linked by an internal dependency to the column.  Currently
 * this is only used to link a SERIAL column's sequence to the column.
298 299
 */
typedef struct ColumnDef
300
{
301
	NodeTag		type;
302 303
	char	   *colname;		/* name of column */
	TypeName   *typename;		/* type of column */
304
	bool		is_inherited;	/* column is inherited? */
305 306 307 308 309
	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 */
310
	RangeVar   *support;		/* supporting relation, if any */
311
} ColumnDef;
312

313 314 315 316 317 318 319 320 321
/*
 * 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
322 323
{
	NodeTag		type;
324
	List	   *funcname;		/* qualified name of function */
325 326 327 328
	List	   *args;			/* the arguments (list of exprs) */
	bool		agg_star;		/* argument was really '*' */
	bool		agg_distinct;	/* arguments were labeled DISTINCT */
} FuncCall;
329

330 331
/*
 * A_Indices - array reference or bounds ([lidx:uidx] or [uidx])
332
 */
333
typedef struct A_Indices
334
{
335
	NodeTag		type;
336 337 338
	Node	   *lidx;			/* could be NULL */
	Node	   *uidx;
} A_Indices;
339

340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
/*
 * 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;

355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
/*
 * 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
370 371
{
	NodeTag		type;
372 373 374 375 376 377
	char	   *name;			/* column name or NULL */
	List	   *indirection;	/* subscripts for destination column, or
								 * NIL */
	Node	   *val;			/* the value expression to compute or
								 * assign */
} ResTarget;
378

B
Bruce Momjian 已提交
379 380 381 382 383 384 385 386
/*
 * Empty node used as a marker for Default Columns
 */
typedef struct InsertDefault
{
	NodeTag		type;
} InsertDefault;

387 388 389 390
/*
 * SortGroupBy - for ORDER BY clause
 */
typedef struct SortGroupBy
391 392
{
	NodeTag		type;
393
	List	   *useOp;			/* operator to use */
394 395
	Node	   *node;			/* Expression  */
} SortGroupBy;
396

397 398
/*
 * RangeSubselect - subquery appearing in a FROM clause
399
 */
400
typedef struct RangeSubselect
401
{
402
	NodeTag		type;
403
	Node	   *subquery;		/* the untransformed sub-select clause */
404
	Alias	   *alias;			/* table alias & optional column aliases */
405
} RangeSubselect;
406

407 408 409 410 411 412 413 414
/*
 * 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 */
415 416
	List	   *coldeflist;		/* list of ColumnDef nodes for runtime
								 * assignment of RECORD TupleDesc */
417 418
} RangeFunction;

419 420 421
/*
 * IndexElem - index parameters (used in CREATE INDEX)
 *
422 423
 * 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
B
Bruce Momjian 已提交
424
 * is allowed.	It has name = NULL, funcname = name of function and args =
425
 * list of attribute names that are the function's arguments.
426 427
 */
typedef struct IndexElem
428
{
429
	NodeTag		type;
430 431
	char	   *name;			/* name of attribute to index, or NULL */
	List	   *funcname;		/* qualified name of function */
432
	List	   *args;			/* list of names of function arguments */
433
	List	   *opclass;		/* name of desired opclass; NIL = default */
434
} IndexElem;
435

436 437 438 439 440
/*
 * DefElem -
 *	  a definition (used in definition lists in the form of defname = arg)
 */
typedef struct DefElem
441
{
442
	NodeTag		type;
443 444 445
	char	   *defname;
	Node	   *arg;			/* a (Value *) or a (TypeName *) */
} DefElem;
446

V
Vadim B. Mikheev 已提交
447

448 449 450
/****************************************************************************
 *	Nodes for a Query tree
 ****************************************************************************/
V
Vadim B. Mikheev 已提交
451

452 453 454 455 456 457
/*
 * 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) ...)
458
 */
459
typedef struct TargetEntry
460
{
461
	NodeTag		type;
462 463 464 465
	Resdom	   *resdom;			/* fjoin overload this to be a list?? */
	Fjoin	   *fjoin;
	Node	   *expr;
} TargetEntry;
466

467 468 469 470
/*--------------------
 * RangeTblEntry -
 *	  A range table is a List of RangeTblEntry nodes.
 *
471 472 473 474 475 476
 *	  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.
477
 *
478
 *	  alias is an Alias node representing the AS alias-clause attached to the
479 480 481 482 483
 *	  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.
484
 *	  eref->aliasname is required to be present, and should generally be used
485 486 487 488
 *	  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
489
 *	  RTEs other than RTE_RELATION entries.
490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507
 *
 *	  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.)
 *--------------------
508
 */
509 510 511 512 513
typedef enum RTEKind
{
	RTE_RELATION,				/* ordinary relation reference */
	RTE_SUBQUERY,				/* subquery in FROM */
	RTE_JOIN,					/* join */
514 515
	RTE_SPECIAL,				/* special rule relation (NEW or OLD) */
	RTE_FUNCTION				/* function in FROM */
516 517
} RTEKind;

518
typedef struct RangeTblEntry
519
{
520
	NodeTag		type;
521

522 523
	RTEKind		rtekind;		/* see above */

524
	/*
525 526
	 * 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
B
Bruce Momjian 已提交
527
	 * a lot of code that is being actively worked on.	FIXME later.
528 529 530
	 */

	/*
531
	 * Fields valid for a plain relation RTE (else zero):
532 533
	 */
	Oid			relid;			/* OID of the relation */
534

535 536 537 538
	/*
	 * Fields valid for a subquery RTE (else NULL):
	 */
	Query	   *subquery;		/* the sub-query */
539

540 541 542 543
	/*
	 * Fields valid for a function RTE (else NULL):
	 */
	Node	   *funcexpr;		/* expression tree for func call */
544 545
	List	   *coldeflist;		/* list of ColumnDef nodes for runtime
								 * assignment of RECORD TupleDesc */
546

547
	/*
548
	 * Fields valid for a join RTE (else NULL/zero):
549
	 *
550 551 552
	 * 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
B
Bruce Momjian 已提交
553 554
	 * joinaliasvars --- but to simplify the task of reverse-listing
	 * aliases correctly, we do not do that until planning time.
555 556
	 */
	JoinType	jointype;		/* type of join */
557
	List	   *joinaliasvars;	/* list of alias-var expansions */
558

559 560 561
	/*
	 * Fields valid in all RTEs:
	 */
562 563
	Alias	   *alias;			/* user-written alias clause, if any */
	Alias	   *eref;			/* expanded reference names */
564 565 566 567 568 569
	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;
570

571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586
/*
 * 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
587
{
588
	NodeTag		type;
589 590 591
	Index		tleSortGroupRef;	/* reference into targetlist */
	Oid			sortop;			/* the sort operator to use */
} SortClause;
592

593 594 595 596 597 598 599
/*
 * 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.
600
 */
601 602 603 604 605 606
typedef SortClause GroupClause;


/*****************************************************************************
 *		Optimizable Statements
 *****************************************************************************/
607 608

/* ----------------------
609
 *		Insert Statement
610 611
 * ----------------------
 */
612
typedef struct InsertStmt
613
{
614
	NodeTag		type;
615
	RangeVar   *relation;		/* relation to insert into */
616 617 618 619 620 621 622 623 624 625
	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;
626

627
/* ----------------------
628
 *		Delete Statement
629 630
 * ----------------------
 */
631
typedef struct DeleteStmt
632
{
633
	NodeTag		type;
634
	RangeVar   *relation;		/* relation to delete from */
635 636
	Node	   *whereClause;	/* qualifications */
} DeleteStmt;
637 638

/* ----------------------
639
 *		Update Statement
640 641
 * ----------------------
 */
642
typedef struct UpdateStmt
643
{
644
	NodeTag		type;
645
	RangeVar   *relation;		/* relation to update */
646 647
	List	   *targetList;		/* the target list (of ResTarget) */
	Node	   *whereClause;	/* qualifications */
648
	List	   *fromClause;		/* optional from clause for more tables */
649
} UpdateStmt;
650 651

/* ----------------------
652 653 654 655 656 657 658 659 660 661
 *		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.
662 663
 * ----------------------
 */
664 665 666 667 668 669 670 671 672
typedef enum SetOperation
{
	SETOP_NONE = 0,
	SETOP_UNION,
	SETOP_INTERSECT,
	SETOP_EXCEPT
} SetOperation;

typedef struct SelectStmt
673
{
674
	NodeTag		type;
675 676 677 678 679 680 681

	/*
	 * These fields are used only in "leaf" SelectStmts.
	 */
	List	   *distinctClause; /* NULL, list of DISTINCT ON exprs, or
								 * lcons(NIL,NIL) for all (SELECT
								 * DISTINCT) */
682
	RangeVar   *into;			/* target table (for select into table) */
683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
	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;
710 711

/* ----------------------
712 713 714 715 716 717 718
 *		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.
719 720
 * ----------------------
 */
721
typedef struct SetOperationStmt
722
{
723
	NodeTag		type;
724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743
	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.
 *****************************************************************************/
744

745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760
/* ----------------------
 *		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;

761 762 763 764 765 766
typedef enum DropBehavior
{
	DROP_RESTRICT,				/* drop fails if any dependent objects */
	DROP_CASCADE				/* remove dependent objects too */
} DropBehavior;

767
/* ----------------------
768 769 770 771
 *	Alter Table
 *
 * The fields are used in different ways by the different variants of
 * this command.
772 773
 * ----------------------
 */
774
typedef struct AlterTableStmt
775
{
776
	NodeTag		type;
777 778 779
	char		subtype;		/*------------
								 *	A = add column
								 *	T = alter column default
780 781
								 *	N = alter column drop not null
								 *	O = alter column set not null
782
								 *	S = alter column statistics
B
Bruce Momjian 已提交
783
								 *	M = alter column storage
784 785
								 *	D = drop column
								 *	C = add constraint
786 787
								 *	c = pre-processed add constraint
								 *		(local in parser/analyze.c)
788 789 790 791 792
								 *	X = drop constraint
								 *	E = create toast table
								 *	U = change owner
								 *------------
								 */
793
	RangeVar   *relation;		/* table to work on */
794 795 796
	char	   *name;			/* column or constraint name to act on, or
								 * new owner */
	Node	   *def;			/* definition of new column or constraint */
797
	DropBehavior behavior;		/* RESTRICT or CASCADE for DROP cases */
798
} AlterTableStmt;
799

800
/* ----------------------
801
 *		Grant|Revoke Statement
802 803
 * ----------------------
 */
804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827
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 */
B
Bruce Momjian 已提交
828
#define ACL_CREATE_TEMP (1<<10) /* for databases */
829 830 831
#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
832 833

typedef struct GrantStmt
834
{
835
	NodeTag		type;
836 837
	bool		is_grant;		/* true = GRANT, false = REVOKE */
	GrantObjectType objtype;	/* kind of object being operated on */
B
Bruce Momjian 已提交
838 839 840
	List	   *objects;		/* list of RangeVar nodes, FuncWithArgs
								 * nodes, or plain names (as Value
								 * strings) */
841 842 843
	List	   *privileges;		/* integer list of privilege codes */
	List	   *grantees;		/* list of PrivGrantee nodes */
} GrantStmt;
844

845
typedef struct PrivGrantee
846
{
847
	NodeTag		type;
848 849 850
	char	   *username;		/* if both are NULL then PUBLIC */
	char	   *groupname;
} PrivGrantee;
851

852
typedef struct FuncWithArgs
853
{
854
	NodeTag		type;
855
	List	   *funcname;		/* qualified name of function */
856 857
	List	   *funcargs;		/* list of Typename nodes */
} FuncWithArgs;
858

859 860
/* This is only used internally in gram.y. */
typedef struct PrivTarget
861
{
862
	NodeTag		type;
863
	GrantObjectType objtype;
864 865 866
	List	   *objs;
} PrivTarget;

867
/* ----------------------
868
 *		Close Portal Statement
869 870
 * ----------------------
 */
871
typedef struct ClosePortalStmt
872
{
873
	NodeTag		type;
874 875
	char	   *portalname;		/* name of the portal (cursor) */
} ClosePortalStmt;
876 877

/* ----------------------
878
 *		Copy Statement
879 880
 * ----------------------
 */
881
typedef struct CopyStmt
882
{
883
	NodeTag		type;
884
	RangeVar   *relation;		/* the relation to copy */
B
Bruce Momjian 已提交
885 886
	List	   *attlist;		/* List of column names (as Strings), or
								 * NIL for all columns */
887
	bool		is_from;		/* TO or FROM */
888
	char	   *filename;		/* if NULL, use stdin/stdout */
889
	List	   *options;		/* List of DefElem nodes */
890
} CopyStmt;
M
 
Marc G. Fournier 已提交
891 892

/* ----------------------
893 894 895 896 897 898 899
 *		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 已提交
900 901
 * ----------------------
 */
902
typedef struct CreateStmt
M
 
Marc G. Fournier 已提交
903 904
{
	NodeTag		type;
905
	RangeVar   *relation;		/* relation to create */
906
	List	   *tableElts;		/* column definitions (list of ColumnDef) */
907
	List	   *inhRelations;	/* relations to inherit from */
908 909 910
	List	   *constraints;	/* constraints (list of Constraint nodes) */
	bool		hasoids;		/* should it have OIDs? */
} CreateStmt;
911

912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928
/* ----------
 * 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).
 * ----------
929
 */
930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946

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
947
{
948
	NodeTag		type;
949 950 951 952
	ConstrType	contype;
	char	   *name;			/* name, or NULL if unnamed */
	Node	   *raw_expr;		/* expr, as untransformed parse tree */
	char	   *cooked_expr;	/* expr, as nodeToString representation */
B
Bruce Momjian 已提交
953 954
	List	   *keys;			/* String nodes naming referenced
								 * column(s) */
955
} Constraint;
956

957 958
/* ----------
 * Definitions for FOREIGN KEY constraints in CreateStmt
959 960 961 962 963 964 965 966
 *
 * Note: FKCONSTR_ACTION_xxx values are stored into pg_constraint.confupdtype
 * and pg_constraint.confdeltype columns; FKCONSTR_MATCH_xxx values are
 * stored into pg_constraint.confmatchtype.  Changing the code values may
 * require an initdb!
 *
 * If skip_validation is true then we skip checking that the existing rows
 * in the table satisfy the constraint, and just install the catalog entries
B
Bruce Momjian 已提交
967
 * for the constraint.	This is currently used only during CREATE TABLE
968
 * (when we know the table must be empty).
969
 * ----------
970
 */
971 972 973 974 975
#define FKCONSTR_ACTION_NOACTION	'a'
#define FKCONSTR_ACTION_RESTRICT	'r'
#define FKCONSTR_ACTION_CASCADE		'c'
#define FKCONSTR_ACTION_SETNULL		'n'
#define FKCONSTR_ACTION_SETDEFAULT	'd'
976

977 978 979
#define FKCONSTR_MATCH_FULL			'f'
#define FKCONSTR_MATCH_PARTIAL		'p'
#define FKCONSTR_MATCH_UNSPECIFIED	'u'
980 981

typedef struct FkConstraint
982
{
983
	NodeTag		type;
984
	char	   *constr_name;	/* Constraint name, or NULL if unnamed */
985
	RangeVar   *pktable;		/* Primary key table */
986 987
	List	   *fk_attrs;		/* Attributes of foreign key */
	List	   *pk_attrs;		/* Corresponding attrs in PK table */
988 989 990
	char		fk_matchtype;	/* FULL, PARTIAL, UNSPECIFIED */
	char		fk_upd_action;	/* ON UPDATE action */
	char		fk_del_action;	/* ON DELETE action */
991 992
	bool		deferrable;		/* DEFERRABLE */
	bool		initdeferred;	/* INITIALLY DEFERRED */
B
Bruce Momjian 已提交
993
	bool		skip_validation;	/* skip validation of existing rows? */
994
} FkConstraint;
995 996

/* ----------------------
997
 *		Create/Drop TRIGGER Statements
998 999
 * ----------------------
 */
1000 1001

typedef struct CreateTrigStmt
1002
{
1003
	NodeTag		type;
1004 1005 1006 1007
	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 */
1008 1009 1010 1011 1012 1013 1014
	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 */
1015

1016 1017 1018 1019 1020
	/* 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} */
1021
	RangeVar   *constrrel;		/* opposite relation */
1022 1023
} CreateTrigStmt;

1024
/* ----------------------
1025
 *		Create/Drop PROCEDURAL LANGUAGE Statement
1026 1027
 * ----------------------
 */
1028
typedef struct CreatePLangStmt
1029 1030
{
	NodeTag		type;
1031
	char	   *plname;			/* PL name */
1032
	List	   *plhandler;		/* PL call handler function (qual. name) */
B
Bruce Momjian 已提交
1033 1034
	List	   *plvalidator;	/* optional validator function (qual.
								 * name) */
1035 1036
	bool		pltrusted;		/* PL is trusted */
} CreatePLangStmt;
1037

1038
typedef struct DropPLangStmt
1039
{
1040
	NodeTag		type;
1041
	char	   *plname;			/* PL name */
1042
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1043
} DropPLangStmt;
1044 1045

/* ----------------------
1046
 *	Create/Alter/Drop User Statements
1047 1048
 * ----------------------
 */
1049
typedef struct CreateUserStmt
1050
{
1051
	NodeTag		type;
1052 1053 1054
	char	   *user;			/* PostgreSQL user login name */
	List	   *options;		/* List of DefElem nodes */
} CreateUserStmt;
1055

1056
typedef struct AlterUserStmt
1057
{
1058
	NodeTag		type;
1059 1060 1061
	char	   *user;			/* PostgreSQL user login name */
	List	   *options;		/* List of DefElem nodes */
} AlterUserStmt;
1062

1063
typedef struct AlterUserSetStmt
1064
{
1065
	NodeTag		type;
1066 1067 1068 1069
	char	   *user;
	char	   *variable;
	List	   *value;
} AlterUserSetStmt;
1070

1071
typedef struct DropUserStmt
V
Vadim B. Mikheev 已提交
1072 1073
{
	NodeTag		type;
1074 1075
	List	   *users;			/* List of users to remove */
} DropUserStmt;
V
Vadim B. Mikheev 已提交
1076

1077
/* ----------------------
1078
 *		Create/Alter/Drop Group Statements
1079 1080
 * ----------------------
 */
1081
typedef struct CreateGroupStmt
1082
{
1083
	NodeTag		type;
1084 1085 1086
	char	   *name;			/* name of the new group */
	List	   *options;		/* List of DefElem nodes */
} CreateGroupStmt;
1087

1088 1089 1090 1091 1092 1093 1094
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;
1095

1096
typedef struct DropGroupStmt
1097
{
1098 1099
	NodeTag		type;
	char	   *name;
1100
} DropGroupStmt;
1101 1102

/* ----------------------
1103
 *		Create SEQUENCE Statement
1104 1105 1106
 * ----------------------
 */

1107
typedef struct CreateSeqStmt
1108
{
1109
	NodeTag		type;
1110
	RangeVar   *sequence;		/* the sequence to create */
1111 1112
	List	   *options;
} CreateSeqStmt;
1113

1114
/* ----------------------
1115
 *		Create {Operator|Type|Aggregate} Statement
1116 1117
 * ----------------------
 */
1118
typedef struct DefineStmt
1119 1120
{
	NodeTag		type;
T
Tom Lane 已提交
1121
	int			defType;		/* OPERATOR|TYPE_P|AGGREGATE */
1122
	List	   *defnames;		/* qualified name (list of Value strings) */
1123 1124
	List	   *definition;		/* a list of DefElem */
} DefineStmt;
1125

T
Tom Lane 已提交
1126 1127 1128 1129 1130 1131 1132
/* ----------------------
 *		Create Domain Statement
 * ----------------------
 */
typedef struct CreateDomainStmt
{
	NodeTag		type;
1133 1134 1135
	List	   *domainname;		/* qualified name (list of Value strings) */
	TypeName   *typename;		/* the base type */
	List	   *constraints;	/* constraints (list of Constraint nodes) */
T
Tom Lane 已提交
1136 1137
} CreateDomainStmt;

1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168
/* ----------------------
 *		Create Operator Class Statement
 * ----------------------
 */
typedef struct CreateOpClassStmt
{
	NodeTag		type;
	List	   *opclassname;	/* qualified name (list of Value strings) */
	char	   *amname;			/* name of index AM opclass is for */
	TypeName   *datatype;		/* datatype of indexed column */
	List	   *items;			/* List of CreateOpClassItem nodes */
	bool		isDefault;		/* Should be marked as default for type? */
} CreateOpClassStmt;

#define OPCLASS_ITEM_OPERATOR		1
#define OPCLASS_ITEM_FUNCTION		2
#define OPCLASS_ITEM_STORAGETYPE	3

typedef struct CreateOpClassItem
{
	NodeTag		type;
	int			itemtype;		/* see codes above */
	/* fields used for an operator or function item: */
	List	   *name;			/* operator or function name */
	List	   *args;			/* argument types */
	int			number;			/* strategy num or support proc num */
	bool		recheck;		/* only used for operators */
	/* fields used for a storagetype item: */
	TypeName   *storedtype;		/* datatype stored in index */
} CreateOpClassItem;

H
Hiroshi Inoue 已提交
1169
/* ----------------------
1170
 *		Drop Table|Sequence|View|Index|Type|Domain|Conversion|Schema Statement
H
Hiroshi Inoue 已提交
1171 1172 1173
 * ----------------------
 */

1174 1175 1176 1177
#define DROP_TABLE	  1
#define DROP_SEQUENCE 2
#define DROP_VIEW	  3
#define DROP_INDEX	  4
B
Bruce Momjian 已提交
1178 1179 1180 1181
#define DROP_TYPE	  5
#define DROP_DOMAIN   6
#define DROP_CONVERSION   7
#define DROP_SCHEMA   8
1182

1183 1184 1185
typedef struct DropStmt
{
	NodeTag		type;
1186
	List	   *objects;		/* list of sublists of names (as Values) */
1187 1188
	int			removeType;		/* see #defines above */
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1189
} DropStmt;
1190

1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206
/* ----------------------
 *		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 */
1207 1208
	int			removeType;		/* see #defines above */
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1209 1210
} DropPropertyStmt;

1211
/* ----------------------
1212
 *				Truncate Table Statement
1213 1214
 * ----------------------
 */
1215
typedef struct TruncateStmt
1216
{
1217
	NodeTag		type;
1218
	RangeVar   *relation;		/* relation to be truncated */
1219
} TruncateStmt;
1220 1221

/* ----------------------
1222
 *				Comment On Statement
1223 1224
 * ----------------------
 */
1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239
#define COMMENT_ON_AGGREGATE	100
#define COMMENT_ON_COLUMN		101
#define COMMENT_ON_CONSTRAINT	102
#define COMMENT_ON_DATABASE		103
#define COMMENT_ON_FUNCTION		104
#define COMMENT_ON_INDEX		105
#define COMMENT_ON_OPERATOR		106
#define COMMENT_ON_RULE			107
#define COMMENT_ON_SCHEMA		108
#define COMMENT_ON_SEQUENCE		109
#define COMMENT_ON_TABLE		110
#define COMMENT_ON_TRIGGER		111
#define COMMENT_ON_TYPE			112
#define COMMENT_ON_VIEW			113

1240
typedef struct CommentStmt
1241
{
1242
	NodeTag		type;
1243
	int			objtype;		/* Object's type, see codes above */
1244 1245 1246
	List	   *objname;		/* Qualified name of the object */
	List	   *objargs;		/* Arguments if needed (eg, for functions) */
	char	   *comment;		/* Comment to insert, or NULL to remove */
1247
} CommentStmt;
1248 1249

/* ----------------------
1250
 *		Fetch Statement
1251 1252
 * ----------------------
 */
1253
typedef struct FetchStmt
1254
{
1255
	NodeTag		type;
1256 1257 1258 1259 1260
	int			direction;		/* FORWARD or BACKWARD */
	int			howMany;		/* amount to fetch ("ALL" --> 0) */
	char	   *portalname;		/* name of portal (cursor) */
	bool		ismove;			/* TRUE if MOVE */
} FetchStmt;
1261

1262
/* ----------------------
1263
 *		Create Index Statement
1264 1265
 * ----------------------
 */
1266
typedef struct IndexStmt
1267 1268
{
	NodeTag		type;
1269
	char	   *idxname;		/* name of the index */
1270
	RangeVar   *relation;		/* relation to build index on */
1271 1272 1273 1274 1275 1276 1277
	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? */
1278
	bool		isconstraint;	/* is it from a CONSTRAINT clause? */
1279
} IndexStmt;
1280

1281 1282 1283
/* ----------------------
 *		Create Function Statement
 * ----------------------
1284
 */
1285
typedef struct CreateFunctionStmt
1286
{
1287
	NodeTag		type;
1288
	bool		replace;		/* T => replace if already exists */
1289
	List	   *funcname;		/* qualified name of function to create */
1290
	List	   *argTypes;		/* list of argument types (TypeName nodes) */
1291
	TypeName   *returnType;		/* the return type */
1292
	List	   *options;		/* a list of DefElem */
1293
	List	   *withClause;		/* a list of DefElem */
1294
} CreateFunctionStmt;
1295

1296 1297 1298
/* ----------------------
 *		Drop Aggregate Statement
 * ----------------------
1299
 */
1300
typedef struct RemoveAggrStmt
1301
{
1302
	NodeTag		type;
1303
	List	   *aggname;		/* aggregate to drop */
1304
	TypeName   *aggtype;		/* TypeName for input datatype, or NULL */
1305
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1306
} RemoveAggrStmt;
1307

1308 1309 1310
/* ----------------------
 *		Drop Function Statement
 * ----------------------
1311
 */
1312
typedef struct RemoveFuncStmt
1313
{
1314
	NodeTag		type;
1315
	List	   *funcname;		/* function to drop */
1316
	List	   *args;			/* types of the arguments */
1317
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1318
} RemoveFuncStmt;
1319

1320 1321 1322
/* ----------------------
 *		Drop Operator Statement
 * ----------------------
1323
 */
1324
typedef struct RemoveOperStmt
1325
{
1326
	NodeTag		type;
1327
	List	   *opname;			/* operator to drop */
1328
	List	   *args;			/* types of the arguments */
1329
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1330
} RemoveOperStmt;
1331

1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343
/* ----------------------
 *		Drop Operator Class Statement
 * ----------------------
 */
typedef struct RemoveOpClassStmt
{
	NodeTag		type;
	List	   *opclassname;	/* qualified name (list of Value strings) */
	char	   *amname;			/* name of index AM opclass is for */
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
} RemoveOpClassStmt;

1344
/* ----------------------
1345
 *		Alter Object Rename Statement
1346
 * ----------------------
1347 1348
 * Currently supports renaming tables, table columns, and triggers.
 * If renaming a table, oldname is ignored.
1349
 */
1350 1351 1352 1353 1354
#define RENAME_TABLE	110
#define RENAME_COLUMN	111
#define RENAME_TRIGGER	112
#define RENAME_RULE		113

1355
typedef struct RenameStmt
1356
{
1357
	NodeTag		type;
1358 1359
	RangeVar   *relation;		/* owning relation */
	char	   *oldname;		/* name of rule, trigger, etc */
1360
	char	   *newname;		/* the new name */
1361
	int			renameType;		/* RENAME_TABLE, RENAME_COLUMN, etc */
1362
} RenameStmt;
1363

1364 1365 1366
/* ----------------------
 *		Create Rule Statement
 * ----------------------
1367
 */
1368
typedef struct RuleStmt
1369 1370
{
	NodeTag		type;
1371
	RangeVar   *relation;		/* relation the rule is for */
1372 1373
	char	   *rulename;		/* name of the rule */
	Node	   *whereClause;	/* qualifications */
1374
	CmdType		event;			/* SELECT, INSERT, etc */
1375 1376
	bool		instead;		/* is a 'do instead'? */
	List	   *actions;		/* the action statements */
1377
	bool		replace;		/* OR REPLACE */
1378
} RuleStmt;
1379

1380 1381 1382
/* ----------------------
 *		Notify Statement
 * ----------------------
T
Thomas G. Lockhart 已提交
1383
 */
1384
typedef struct NotifyStmt
T
Thomas G. Lockhart 已提交
1385 1386
{
	NodeTag		type;
1387
	RangeVar   *relation;		/* qualified name to notify */
1388
} NotifyStmt;
T
Thomas G. Lockhart 已提交
1389

1390 1391 1392
/* ----------------------
 *		Listen Statement
 * ----------------------
T
Thomas G. Lockhart 已提交
1393
 */
1394
typedef struct ListenStmt
T
Thomas G. Lockhart 已提交
1395 1396
{
	NodeTag		type;
1397
	RangeVar   *relation;		/* qualified name to listen on */
1398
} ListenStmt;
T
Thomas G. Lockhart 已提交
1399

1400 1401 1402
/* ----------------------
 *		Unlisten Statement
 * ----------------------
1403
 */
1404
typedef struct UnlistenStmt
1405
{
1406
	NodeTag		type;
1407
	RangeVar   *relation;		/* qualified name to unlisten on, or '*' */
1408
} UnlistenStmt;
1409

1410
/* ----------------------
1411
 *		{Begin|Commit|Rollback} Transaction Statement
1412 1413 1414
 * ----------------------
 */
typedef struct TransactionStmt
1415
{
1416
	NodeTag		type;
1417 1418
	int			command;		/* BEGIN_TRANS|START|COMMIT|ROLLBACK */
	List	   *options;
1419
} TransactionStmt;
1420

B
Bruce Momjian 已提交
1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432
/* ----------------------
 *		Create Type Statement, composite types
 * ----------------------
 */
typedef struct CompositeTypeStmt
{
	NodeTag		type;
	RangeVar   *typevar;		/* the composite type to be created */
	List	   *coldeflist;		/* list of ColumnDef nodes */
} CompositeTypeStmt;


1433 1434 1435
/* ----------------------
 *		Create View Statement
 * ----------------------
1436
 */
1437
typedef struct ViewStmt
1438
{
1439
	NodeTag		type;
1440
	RangeVar   *view;			/* the view to be created */
1441 1442
	List	   *aliases;		/* target column names */
	Query	   *query;			/* the SQL statement */
1443
	bool		replace;		/* replace an existing view? */
1444
} ViewStmt;
1445

1446 1447 1448 1449 1450
/* ----------------------
 *		Load Statement
 * ----------------------
 */
typedef struct LoadStmt
1451
{
1452
	NodeTag		type;
1453 1454
	char	   *filename;		/* file to load */
} LoadStmt;
1455

1456 1457 1458
/* ----------------------
 *		Createdb Statement
 * ----------------------
1459
 */
1460
typedef struct CreatedbStmt
1461
{
1462
	NodeTag		type;
1463
	char	   *dbname;			/* name of database to create */
1464
	List	   *options;		/* List of DefElem nodes */
1465
} CreatedbStmt;
1466

1467 1468 1469
/* ----------------------
 *	Alter Database
 * ----------------------
1470
 */
1471
typedef struct AlterDatabaseSetStmt
1472
{
1473
	NodeTag		type;
1474 1475 1476 1477
	char	   *dbname;
	char	   *variable;
	List	   *value;
} AlterDatabaseSetStmt;
1478

1479 1480 1481
/* ----------------------
 *		Dropdb Statement
 * ----------------------
1482
 */
1483
typedef struct DropdbStmt
1484
{
1485
	NodeTag		type;
1486 1487
	char	   *dbname;			/* database to drop */
} DropdbStmt;
1488

1489 1490 1491
/* ----------------------
 *		Cluster Statement (support pbrown's cluster index implementation)
 * ----------------------
1492
 */
1493
typedef struct ClusterStmt
1494
{
1495
	NodeTag		type;
1496
	RangeVar   *relation;		/* relation being indexed */
1497 1498
	char	   *indexname;		/* original index defined */
} ClusterStmt;
1499

1500 1501
/* ----------------------
 *		Vacuum and Analyze Statements
1502
 *
1503 1504 1505
 * Even though these are nominally two statements, it's convenient to use
 * just one node type for both.
 * ----------------------
1506
 */
1507
typedef struct VacuumStmt
1508
{
1509
	NodeTag		type;
1510 1511 1512 1513 1514
	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 */
1515
	RangeVar   *relation;		/* single table to process, or NULL */
1516 1517
	List	   *va_cols;		/* list of column names, or NIL for all */
} VacuumStmt;
1518

1519 1520 1521
/* ----------------------
 *		Explain Statement
 * ----------------------
1522
 */
1523
typedef struct ExplainStmt
M
 
Marc G. Fournier 已提交
1524 1525
{
	NodeTag		type;
1526 1527 1528 1529
	Query	   *query;			/* the query */
	bool		verbose;		/* print plan info */
	bool		analyze;		/* get statistics by executing plan */
} ExplainStmt;
M
 
Marc G. Fournier 已提交
1530

1531 1532 1533
/* ----------------------
 * Checkpoint Statement
 * ----------------------
1534
 */
1535
typedef struct CheckPointStmt
1536
{
1537
	NodeTag		type;
1538
} CheckPointStmt;
1539

1540 1541 1542
/* ----------------------
 * Set Statement
 * ----------------------
1543
 */
1544 1545

typedef struct VariableSetStmt
1546 1547
{
	NodeTag		type;
1548 1549
	char	   *name;
	List	   *args;
1550
	bool		is_local;		/* SET LOCAL */
1551
} VariableSetStmt;
1552

1553 1554 1555
/* ----------------------
 * Show Statement
 * ----------------------
1556
 */
1557 1558

typedef struct VariableShowStmt
1559
{
1560
	NodeTag		type;
1561 1562
	char	   *name;
} VariableShowStmt;
1563

1564 1565 1566
/* ----------------------
 * Reset Statement
 * ----------------------
1567
 */
1568 1569

typedef struct VariableResetStmt
1570
{
1571
	NodeTag		type;
1572 1573
	char	   *name;
} VariableResetStmt;
1574

1575 1576 1577
/* ----------------------
 *		LOCK Statement
 * ----------------------
1578
 */
1579
typedef struct LockStmt
1580
{
1581
	NodeTag		type;
1582
	List	   *relations;		/* relations to lock */
1583 1584
	int			mode;			/* lock mode */
} LockStmt;
1585

1586 1587 1588
/* ----------------------
 *		SET CONSTRAINTS Statement
 * ----------------------
1589
 */
1590
typedef struct ConstraintsSetStmt
1591
{
1592
	NodeTag		type;
1593 1594 1595
	List	   *constraints;	/* List of names as Value strings */
	bool		deferred;
} ConstraintsSetStmt;
B
Bruce Momjian 已提交
1596

1597 1598 1599
/* ----------------------
 *		REINDEX Statement
 * ----------------------
1600
 */
1601
typedef struct ReindexStmt
1602
{
1603
	NodeTag		type;
1604
	int			reindexType;	/* INDEX|TABLE|DATABASE */
1605 1606
	RangeVar   *relation;		/* Table or index to reindex */
	const char *name;			/* name of database to reindex */
1607 1608 1609
	bool		force;
	bool		all;
} ReindexStmt;
1610

1611 1612 1613 1614 1615 1616 1617
/* ----------------------
 *		CREATE CONVERSION Statement
 * ----------------------
 */
typedef struct CreateConversionStmt
{
	NodeTag		type;
B
Bruce Momjian 已提交
1618 1619 1620 1621 1622
	List	   *conversion_name;	/* Name of the conversion */
	char	   *for_encoding_name;		/* source encoding name */
	char	   *to_encoding_name;		/* destiname encoding name */
	List	   *func_name;		/* qualified conversion function name */
	bool		def;			/* is this a default conversion? */
1623 1624
} CreateConversionStmt;

1625 1626 1627 1628 1629 1630 1631 1632 1633 1634
/* ----------------------
 *	CREATE CAST Statement
 * ----------------------
 */
typedef struct CreateCastStmt
{
	NodeTag		type;
	TypeName   *sourcetype;
	TypeName   *targettype;
	FuncWithArgs *func;
1635
	CoercionContext context;
1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650
} CreateCastStmt;

/* ----------------------
 *	DROP CAST Statement
 * ----------------------
 */
typedef struct DropCastStmt
{
	NodeTag		type;
	TypeName   *sourcetype;
	TypeName   *targettype;
	DropBehavior behavior;
} DropCastStmt;


1651 1652 1653 1654 1655 1656
/* ----------------------
 *		PREPARE Statement
 * ----------------------
 */
typedef struct PrepareStmt
{
B
Bruce Momjian 已提交
1657 1658 1659 1660 1661
	NodeTag		type;
	char	   *name;			/* Name of plan, arbitrary */
	List	   *argtypes;		/* Types of parameters (TypeNames) */
	List	   *argtype_oids;	/* Types of parameters (OIDs) */
	Query	   *query;			/* The query itself */
1662 1663 1664 1665 1666 1667 1668 1669 1670 1671
} PrepareStmt;


/* ----------------------
 *		EXECUTE Statement
 * ----------------------
 */

typedef struct ExecuteStmt
{
B
Bruce Momjian 已提交
1672 1673 1674 1675
	NodeTag		type;
	char	   *name;			/* The name of the plan to execute */
	RangeVar   *into;			/* Optional table to store results in */
	List	   *params;			/* Values to assign to parameters */
1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688
} ExecuteStmt;


/* ----------------------
 *		DEALLOCATE Statement
 * ----------------------
 */
typedef struct DeallocateStmt
{
	NodeTag		type;
	char	   *name;			/* The name of the plan to remove */
} DeallocateStmt;

1689
#endif   /* PARSENODES_H */