parsenodes.h 47.3 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
 *
B
Bruce Momjian 已提交
10
 * $Id: parsenodes.h,v 1.199 2002/08/15 16:36:07 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
/*
 * 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.
272 273 274 275
 *
 * 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.
276 277
 */
typedef struct ColumnDef
278
{
279
	NodeTag		type;
280 281 282 283 284 285 286
	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 */
287
	RangeVar   *support;		/* supporting relation, if any */
288
} ColumnDef;
289

290 291
/*
 * Ident -
292 293
 *	  an unqualified identifier.  This is currently used only in the context
 *	  of column name lists.
294
 */
295
typedef struct Ident
296 297
{
	NodeTag		type;
298 299
	char	   *name;			/* its name */
} Ident;
300

301 302 303 304 305 306 307 308 309
/*
 * 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
310 311
{
	NodeTag		type;
312
	List	   *funcname;		/* qualified name of function */
313 314 315 316
	List	   *args;			/* the arguments (list of exprs) */
	bool		agg_star;		/* argument was really '*' */
	bool		agg_distinct;	/* arguments were labeled DISTINCT */
} FuncCall;
317

318 319
/*
 * A_Indices - array reference or bounds ([lidx:uidx] or [uidx])
320
 */
321
typedef struct A_Indices
322
{
323
	NodeTag		type;
324 325 326
	Node	   *lidx;			/* could be NULL */
	Node	   *uidx;
} A_Indices;
327

328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
/*
 * 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;

343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
/*
 * 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
358 359
{
	NodeTag		type;
360 361 362 363 364 365
	char	   *name;			/* column name or NULL */
	List	   *indirection;	/* subscripts for destination column, or
								 * NIL */
	Node	   *val;			/* the value expression to compute or
								 * assign */
} ResTarget;
366

B
Bruce Momjian 已提交
367 368 369 370 371 372 373 374
/*
 * Empty node used as a marker for Default Columns
 */
typedef struct InsertDefault
{
	NodeTag		type;
} InsertDefault;

375 376 377 378
/*
 * SortGroupBy - for ORDER BY clause
 */
typedef struct SortGroupBy
379 380
{
	NodeTag		type;
381
	List	   *useOp;			/* operator to use */
382 383
	Node	   *node;			/* Expression  */
} SortGroupBy;
384

385 386
/*
 * RangeSubselect - subquery appearing in a FROM clause
387
 */
388
typedef struct RangeSubselect
389
{
390
	NodeTag		type;
391
	Node	   *subquery;		/* the untransformed sub-select clause */
392
	Alias	   *alias;			/* table alias & optional column aliases */
393
} RangeSubselect;
394

395 396 397 398 399 400 401 402
/*
 * 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 */
403 404
	List	   *coldeflist;		/* list of ColumnDef nodes for runtime
								 * assignment of RECORD TupleDesc */
405 406
} RangeFunction;

407 408 409
/*
 * IndexElem - index parameters (used in CREATE INDEX)
 *
410 411 412 413
 * 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.
414 415
 */
typedef struct IndexElem
416
{
417
	NodeTag		type;
418 419
	char	   *name;			/* name of attribute to index, or NULL */
	List	   *funcname;		/* qualified name of function */
420
	List	   *args;			/* list of names of function arguments */
421
	List	   *opclass;		/* name of desired opclass; NIL = default */
422
} IndexElem;
423

424 425 426 427 428
/*
 * DefElem -
 *	  a definition (used in definition lists in the form of defname = arg)
 */
typedef struct DefElem
429
{
430
	NodeTag		type;
431 432 433
	char	   *defname;
	Node	   *arg;			/* a (Value *) or a (TypeName *) */
} DefElem;
434

V
Vadim B. Mikheev 已提交
435

436 437 438
/****************************************************************************
 *	Nodes for a Query tree
 ****************************************************************************/
V
Vadim B. Mikheev 已提交
439

440 441 442 443 444 445
/*
 * 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) ...)
446
 */
447
typedef struct TargetEntry
448
{
449
	NodeTag		type;
450 451 452 453
	Resdom	   *resdom;			/* fjoin overload this to be a list?? */
	Fjoin	   *fjoin;
	Node	   *expr;
} TargetEntry;
454

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

506
typedef struct RangeTblEntry
507
{
508
	NodeTag		type;
509

510 511
	RTEKind		rtekind;		/* see above */

512
	/*
513 514 515 516 517 518
	 * 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.
	 */

	/*
519
	 * Fields valid for a plain relation RTE (else zero):
520 521
	 */
	Oid			relid;			/* OID of the relation */
522

523 524 525 526
	/*
	 * Fields valid for a subquery RTE (else NULL):
	 */
	Query	   *subquery;		/* the sub-query */
527

528 529 530 531
	/*
	 * Fields valid for a function RTE (else NULL):
	 */
	Node	   *funcexpr;		/* expression tree for func call */
532 533
	List	   *coldeflist;		/* list of ColumnDef nodes for runtime
								 * assignment of RECORD TupleDesc */
534

535
	/*
536
	 * Fields valid for a join RTE (else NULL/zero):
537
	 *
538 539 540 541 542
	 * 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.
543 544
	 */
	JoinType	jointype;		/* type of join */
545
	List	   *joinaliasvars;	/* list of alias-var expansions */
546

547 548 549
	/*
	 * Fields valid in all RTEs:
	 */
550 551
	Alias	   *alias;			/* user-written alias clause, if any */
	Alias	   *eref;			/* expanded reference names */
552 553 554 555 556 557
	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;
558

559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574
/*
 * 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
575
{
576
	NodeTag		type;
577 578 579
	Index		tleSortGroupRef;	/* reference into targetlist */
	Oid			sortop;			/* the sort operator to use */
} SortClause;
580

581 582 583 584 585 586 587
/*
 * 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.
588
 */
589 590 591 592 593 594
typedef SortClause GroupClause;


/*****************************************************************************
 *		Optimizable Statements
 *****************************************************************************/
595 596

/* ----------------------
597
 *		Insert Statement
598 599
 * ----------------------
 */
600
typedef struct InsertStmt
601
{
602
	NodeTag		type;
603
	RangeVar   *relation;		/* relation to insert into */
604 605 606 607 608 609 610 611 612 613
	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;
614

615
/* ----------------------
616
 *		Delete Statement
617 618
 * ----------------------
 */
619
typedef struct DeleteStmt
620
{
621
	NodeTag		type;
622
	RangeVar   *relation;		/* relation to delete from */
623 624
	Node	   *whereClause;	/* qualifications */
} DeleteStmt;
625 626

/* ----------------------
627
 *		Update Statement
628 629
 * ----------------------
 */
630
typedef struct UpdateStmt
631
{
632
	NodeTag		type;
633
	RangeVar   *relation;		/* relation to update */
634 635
	List	   *targetList;		/* the target list (of ResTarget) */
	Node	   *whereClause;	/* qualifications */
636
	List	   *fromClause;		/* optional from clause for more tables */
637
} UpdateStmt;
638 639

/* ----------------------
640 641 642 643 644 645 646 647 648 649
 *		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.
650 651
 * ----------------------
 */
652 653 654 655 656 657 658 659 660
typedef enum SetOperation
{
	SETOP_NONE = 0,
	SETOP_UNION,
	SETOP_INTERSECT,
	SETOP_EXCEPT
} SetOperation;

typedef struct SelectStmt
661
{
662
	NodeTag		type;
663 664 665 666 667 668 669

	/*
	 * These fields are used only in "leaf" SelectStmts.
	 */
	List	   *distinctClause; /* NULL, list of DISTINCT ON exprs, or
								 * lcons(NIL,NIL) for all (SELECT
								 * DISTINCT) */
670
	RangeVar   *into;			/* target table (for select into table) */
671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697
	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;
698 699

/* ----------------------
700 701 702 703 704 705 706
 *		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.
707 708
 * ----------------------
 */
709
typedef struct SetOperationStmt
710
{
711
	NodeTag		type;
712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731
	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.
 *****************************************************************************/
732

733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748
/* ----------------------
 *		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;

749 750 751 752 753 754
typedef enum DropBehavior
{
	DROP_RESTRICT,				/* drop fails if any dependent objects */
	DROP_CASCADE				/* remove dependent objects too */
} DropBehavior;

755
/* ----------------------
756 757 758 759
 *	Alter Table
 *
 * The fields are used in different ways by the different variants of
 * this command.
760 761
 * ----------------------
 */
762
typedef struct AlterTableStmt
763
{
764
	NodeTag		type;
765 766 767
	char		subtype;		/*------------
								 *	A = add column
								 *	T = alter column default
768 769
								 *	N = alter column drop not null
								 *	O = alter column set not null
770 771 772 773
								 *	S = alter column statistics
								 *  M = alter column storage
								 *	D = drop column
								 *	C = add constraint
774 775
								 *	c = pre-processed add constraint
								 *		(local in parser/analyze.c)
776 777 778 779 780
								 *	X = drop constraint
								 *	E = create toast table
								 *	U = change owner
								 *------------
								 */
781
	RangeVar   *relation;		/* table to work on */
782 783 784
	char	   *name;			/* column or constraint name to act on, or
								 * new owner */
	Node	   *def;			/* definition of new column or constraint */
785
	DropBehavior behavior;		/* RESTRICT or CASCADE for DROP cases */
786
} AlterTableStmt;
787

788
/* ----------------------
789
 *		Grant|Revoke Statement
790 791
 * ----------------------
 */
792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819
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
820 821

typedef struct GrantStmt
822
{
823
	NodeTag		type;
824 825 826 827
	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) */
828 829 830
	List	   *privileges;		/* integer list of privilege codes */
	List	   *grantees;		/* list of PrivGrantee nodes */
} GrantStmt;
831

832
typedef struct PrivGrantee
833
{
834
	NodeTag		type;
835 836 837
	char	   *username;		/* if both are NULL then PUBLIC */
	char	   *groupname;
} PrivGrantee;
838

839
typedef struct FuncWithArgs
840
{
841
	NodeTag		type;
842
	List	   *funcname;		/* qualified name of function */
843 844
	List	   *funcargs;		/* list of Typename nodes */
} FuncWithArgs;
845

846 847
/* This is only used internally in gram.y. */
typedef struct PrivTarget
848
{
849
	NodeTag		type;
850
	GrantObjectType objtype;
851 852 853
	List	   *objs;
} PrivTarget;

854
/* ----------------------
855
 *		Close Portal Statement
856 857
 * ----------------------
 */
858
typedef struct ClosePortalStmt
859
{
860
	NodeTag		type;
861 862
	char	   *portalname;		/* name of the portal (cursor) */
} ClosePortalStmt;
863 864

/* ----------------------
865
 *		Copy Statement
866 867
 * ----------------------
 */
868
typedef struct CopyStmt
869
{
870
	NodeTag		type;
871
	RangeVar   *relation;		/* the relation to copy */
872
	List *attlist;
873
	bool		is_from;		/* TO or FROM */
874
	char	   *filename;		/* if NULL, use stdin/stdout */
875
	List	   *options;		/* List of DefElem nodes */
876
} CopyStmt;
M
 
Marc G. Fournier 已提交
877 878

/* ----------------------
879 880 881 882 883 884 885
 *		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 已提交
886 887
 * ----------------------
 */
888
typedef struct CreateStmt
M
 
Marc G. Fournier 已提交
889 890
{
	NodeTag		type;
891
	RangeVar   *relation;		/* relation to create */
892
	List	   *tableElts;		/* column definitions (list of ColumnDef) */
893
	List	   *inhRelations;	/* relations to inherit from */
894 895 896
	List	   *constraints;	/* constraints (list of Constraint nodes) */
	bool		hasoids;		/* should it have OIDs? */
} CreateStmt;
897

898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914
/* ----------
 * 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).
 * ----------
915
 */
916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932

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
933
{
934
	NodeTag		type;
935 936 937 938 939 940
	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;
941

942 943
/* ----------
 * Definitions for FOREIGN KEY constraints in CreateStmt
944 945 946 947 948 949 950 951 952 953
 *
 * 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
 * for the constraint.  This is currently used only during CREATE TABLE
 * (when we know the table must be empty).
954
 * ----------
955
 */
956 957 958 959 960
#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'
961

962 963 964
#define FKCONSTR_MATCH_FULL			'f'
#define FKCONSTR_MATCH_PARTIAL		'p'
#define FKCONSTR_MATCH_UNSPECIFIED	'u'
965 966

typedef struct FkConstraint
967
{
968
	NodeTag		type;
969
	char	   *constr_name;	/* Constraint name, or NULL if unnamed */
970
	RangeVar   *pktable;		/* Primary key table */
971 972
	List	   *fk_attrs;		/* Attributes of foreign key */
	List	   *pk_attrs;		/* Corresponding attrs in PK table */
973 974 975
	char		fk_matchtype;	/* FULL, PARTIAL, UNSPECIFIED */
	char		fk_upd_action;	/* ON UPDATE action */
	char		fk_del_action;	/* ON DELETE action */
976 977
	bool		deferrable;		/* DEFERRABLE */
	bool		initdeferred;	/* INITIALLY DEFERRED */
978
	bool		skip_validation; /* skip validation of existing rows? */
979
} FkConstraint;
980 981

/* ----------------------
982
 *		Create/Drop TRIGGER Statements
983 984
 * ----------------------
 */
985 986

typedef struct CreateTrigStmt
987
{
988
	NodeTag		type;
989 990 991 992
	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 */
993 994 995 996 997 998 999
	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 */
1000

1001 1002 1003 1004 1005
	/* 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} */
1006
	RangeVar   *constrrel;		/* opposite relation */
1007 1008
} CreateTrigStmt;

1009
/* ----------------------
1010
 *		Create/Drop PROCEDURAL LANGUAGE Statement
1011 1012
 * ----------------------
 */
1013
typedef struct CreatePLangStmt
1014 1015
{
	NodeTag		type;
1016
	char	   *plname;			/* PL name */
1017
	List	   *plhandler;		/* PL call handler function (qual. name) */
1018
	List	   *plvalidator;	/* optional validator function (qual. name) */
1019 1020
	bool		pltrusted;		/* PL is trusted */
} CreatePLangStmt;
1021

1022
typedef struct DropPLangStmt
1023
{
1024
	NodeTag		type;
1025
	char	   *plname;			/* PL name */
1026
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1027
} DropPLangStmt;
1028 1029

/* ----------------------
1030
 *	Create/Alter/Drop User Statements
1031 1032
 * ----------------------
 */
1033
typedef struct CreateUserStmt
1034
{
1035
	NodeTag		type;
1036 1037 1038
	char	   *user;			/* PostgreSQL user login name */
	List	   *options;		/* List of DefElem nodes */
} CreateUserStmt;
1039

1040
typedef struct AlterUserStmt
1041
{
1042
	NodeTag		type;
1043 1044 1045
	char	   *user;			/* PostgreSQL user login name */
	List	   *options;		/* List of DefElem nodes */
} AlterUserStmt;
1046

1047
typedef struct AlterUserSetStmt
1048
{
1049
	NodeTag		type;
1050 1051 1052 1053
	char	   *user;
	char	   *variable;
	List	   *value;
} AlterUserSetStmt;
1054

1055
typedef struct DropUserStmt
V
Vadim B. Mikheev 已提交
1056 1057
{
	NodeTag		type;
1058 1059
	List	   *users;			/* List of users to remove */
} DropUserStmt;
V
Vadim B. Mikheev 已提交
1060

1061
/* ----------------------
1062
 *		Create/Alter/Drop Group Statements
1063 1064
 * ----------------------
 */
1065
typedef struct CreateGroupStmt
1066
{
1067
	NodeTag		type;
1068 1069 1070
	char	   *name;			/* name of the new group */
	List	   *options;		/* List of DefElem nodes */
} CreateGroupStmt;
1071

1072 1073 1074 1075 1076 1077 1078
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;
1079

1080
typedef struct DropGroupStmt
1081
{
1082 1083
	NodeTag		type;
	char	   *name;
1084
} DropGroupStmt;
1085 1086

/* ----------------------
1087
 *		Create SEQUENCE Statement
1088 1089 1090
 * ----------------------
 */

1091
typedef struct CreateSeqStmt
1092
{
1093
	NodeTag		type;
1094
	RangeVar   *sequence;		/* the sequence to create */
1095 1096
	List	   *options;
} CreateSeqStmt;
1097

1098
/* ----------------------
1099
 *		Create {Operator|Type|Aggregate} Statement
1100 1101
 * ----------------------
 */
1102
typedef struct DefineStmt
1103 1104
{
	NodeTag		type;
T
Tom Lane 已提交
1105
	int			defType;		/* OPERATOR|TYPE_P|AGGREGATE */
1106
	List	   *defnames;		/* qualified name (list of Value strings) */
1107 1108
	List	   *definition;		/* a list of DefElem */
} DefineStmt;
1109

T
Tom Lane 已提交
1110 1111 1112 1113 1114 1115 1116
/* ----------------------
 *		Create Domain Statement
 * ----------------------
 */
typedef struct CreateDomainStmt
{
	NodeTag		type;
1117 1118 1119
	List	   *domainname;		/* qualified name (list of Value strings) */
	TypeName   *typename;		/* the base type */
	List	   *constraints;	/* constraints (list of Constraint nodes) */
T
Tom Lane 已提交
1120 1121
} CreateDomainStmt;

1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152
/* ----------------------
 *		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 已提交
1153
/* ----------------------
1154
 *		Drop Table|Sequence|View|Index|Type|Domain|Conversion|Schema Statement
H
Hiroshi Inoue 已提交
1155 1156 1157
 * ----------------------
 */

1158 1159 1160 1161
#define DROP_TABLE	  1
#define DROP_SEQUENCE 2
#define DROP_VIEW	  3
#define DROP_INDEX	  4
1162 1163
#define DROP_TYPE     5
#define DROP_DOMAIN	  6
1164
#define DROP_CONVERSION	  7
1165
#define DROP_SCHEMA	  8
1166

1167 1168 1169
typedef struct DropStmt
{
	NodeTag		type;
1170
	List	   *objects;		/* list of sublists of names (as Values) */
1171 1172
	int			removeType;		/* see #defines above */
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1173
} DropStmt;
1174

1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190
/* ----------------------
 *		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 */
1191 1192
	int			removeType;		/* see #defines above */
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1193 1194
} DropPropertyStmt;

1195
/* ----------------------
1196
 *				Truncate Table Statement
1197 1198
 * ----------------------
 */
1199
typedef struct TruncateStmt
1200
{
1201
	NodeTag		type;
1202
	RangeVar   *relation;		/* relation to be truncated */
1203
} TruncateStmt;
1204 1205

/* ----------------------
1206
 *				Comment On Statement
1207 1208
 * ----------------------
 */
1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223
#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

1224
typedef struct CommentStmt
1225
{
1226
	NodeTag		type;
1227
	int			objtype;		/* Object's type, see codes above */
1228 1229 1230
	List	   *objname;		/* Qualified name of the object */
	List	   *objargs;		/* Arguments if needed (eg, for functions) */
	char	   *comment;		/* Comment to insert, or NULL to remove */
1231
} CommentStmt;
1232 1233

/* ----------------------
1234
 *		Fetch Statement
1235 1236
 * ----------------------
 */
1237
typedef struct FetchStmt
1238
{
1239
	NodeTag		type;
1240 1241 1242 1243 1244
	int			direction;		/* FORWARD or BACKWARD */
	int			howMany;		/* amount to fetch ("ALL" --> 0) */
	char	   *portalname;		/* name of portal (cursor) */
	bool		ismove;			/* TRUE if MOVE */
} FetchStmt;
1245

1246
/* ----------------------
1247
 *		Create Index Statement
1248 1249
 * ----------------------
 */
1250
typedef struct IndexStmt
1251 1252
{
	NodeTag		type;
1253
	char	   *idxname;		/* name of the index */
1254
	RangeVar   *relation;		/* relation to build index on */
1255 1256 1257 1258 1259 1260 1261
	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? */
1262
	bool		isconstraint;	/* is it from a CONSTRAINT clause? */
1263
} IndexStmt;
1264

1265 1266 1267
/* ----------------------
 *		Create Function Statement
 * ----------------------
1268
 */
1269
typedef struct CreateFunctionStmt
1270
{
1271
	NodeTag		type;
1272
	bool		replace;		/* T => replace if already exists */
1273
	List	   *funcname;		/* qualified name of function to create */
1274
	List	   *argTypes;		/* list of argument types (TypeName nodes) */
1275
	TypeName   *returnType;		/* the return type */
1276
	List	   *options;		/* a list of DefElem */
1277
	List	   *withClause;		/* a list of DefElem */
1278
} CreateFunctionStmt;
1279

1280 1281 1282
/* ----------------------
 *		Drop Aggregate Statement
 * ----------------------
1283
 */
1284
typedef struct RemoveAggrStmt
1285
{
1286
	NodeTag		type;
1287
	List	   *aggname;		/* aggregate to drop */
1288
	TypeName   *aggtype;		/* TypeName for input datatype, or NULL */
1289
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1290
} RemoveAggrStmt;
1291

1292 1293 1294
/* ----------------------
 *		Drop Function Statement
 * ----------------------
1295
 */
1296
typedef struct RemoveFuncStmt
1297
{
1298
	NodeTag		type;
1299
	List	   *funcname;		/* function to drop */
1300
	List	   *args;			/* types of the arguments */
1301
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1302
} RemoveFuncStmt;
1303

1304 1305 1306
/* ----------------------
 *		Drop Operator Statement
 * ----------------------
1307
 */
1308
typedef struct RemoveOperStmt
1309
{
1310
	NodeTag		type;
1311
	List	   *opname;			/* operator to drop */
1312
	List	   *args;			/* types of the arguments */
1313
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1314
} RemoveOperStmt;
1315

1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327
/* ----------------------
 *		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;

1328
/* ----------------------
1329
 *		Alter Object Rename Statement
1330
 * ----------------------
1331 1332
 * Currently supports renaming tables, table columns, and triggers.
 * If renaming a table, oldname is ignored.
1333
 */
1334 1335 1336 1337 1338
#define RENAME_TABLE	110
#define RENAME_COLUMN	111
#define RENAME_TRIGGER	112
#define RENAME_RULE		113

1339
typedef struct RenameStmt
1340
{
1341
	NodeTag		type;
1342 1343
	RangeVar   *relation;		/* owning relation */
	char	   *oldname;		/* name of rule, trigger, etc */
1344
	char	   *newname;		/* the new name */
1345
	int			renameType;		/* RENAME_TABLE, RENAME_COLUMN, etc */
1346
} RenameStmt;
1347

1348 1349 1350
/* ----------------------
 *		Create Rule Statement
 * ----------------------
1351
 */
1352
typedef struct RuleStmt
1353 1354
{
	NodeTag		type;
1355
	RangeVar   *relation;		/* relation the rule is for */
1356 1357
	char	   *rulename;		/* name of the rule */
	Node	   *whereClause;	/* qualifications */
1358
	CmdType		event;			/* SELECT, INSERT, etc */
1359 1360 1361
	bool		instead;		/* is a 'do instead'? */
	List	   *actions;		/* the action statements */
} RuleStmt;
1362

1363 1364 1365
/* ----------------------
 *		Notify Statement
 * ----------------------
T
Thomas G. Lockhart 已提交
1366
 */
1367
typedef struct NotifyStmt
T
Thomas G. Lockhart 已提交
1368 1369
{
	NodeTag		type;
1370
	RangeVar   *relation;		/* qualified name to notify */
1371
} NotifyStmt;
T
Thomas G. Lockhart 已提交
1372

1373 1374 1375
/* ----------------------
 *		Listen Statement
 * ----------------------
T
Thomas G. Lockhart 已提交
1376
 */
1377
typedef struct ListenStmt
T
Thomas G. Lockhart 已提交
1378 1379
{
	NodeTag		type;
1380
	RangeVar   *relation;		/* qualified name to listen on */
1381
} ListenStmt;
T
Thomas G. Lockhart 已提交
1382

1383 1384 1385
/* ----------------------
 *		Unlisten Statement
 * ----------------------
1386
 */
1387
typedef struct UnlistenStmt
1388
{
1389
	NodeTag		type;
1390
	RangeVar   *relation;		/* qualified name to unlisten on, or '*' */
1391
} UnlistenStmt;
1392

1393
/* ----------------------
1394
 *		{Begin|Commit|Rollback} Transaction Statement
1395 1396 1397
 * ----------------------
 */
typedef struct TransactionStmt
1398
{
1399
	NodeTag		type;
1400 1401
	int			command;		/* BEGIN_TRANS|START|COMMIT|ROLLBACK */
	List	   *options;
1402
} TransactionStmt;
1403

B
Bruce Momjian 已提交
1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415
/* ----------------------
 *		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;


1416 1417 1418
/* ----------------------
 *		Create View Statement
 * ----------------------
1419
 */
1420
typedef struct ViewStmt
1421
{
1422
	NodeTag		type;
1423
	RangeVar   *view;			/* the view to be created */
1424 1425 1426
	List	   *aliases;		/* target column names */
	Query	   *query;			/* the SQL statement */
} ViewStmt;
1427

1428 1429 1430 1431 1432
/* ----------------------
 *		Load Statement
 * ----------------------
 */
typedef struct LoadStmt
1433
{
1434
	NodeTag		type;
1435 1436
	char	   *filename;		/* file to load */
} LoadStmt;
1437

1438 1439 1440
/* ----------------------
 *		Createdb Statement
 * ----------------------
1441
 */
1442
typedef struct CreatedbStmt
1443
{
1444
	NodeTag		type;
1445
	char	   *dbname;			/* name of database to create */
1446
	List	   *options;		/* List of DefElem nodes */
1447
} CreatedbStmt;
1448

1449 1450 1451
/* ----------------------
 *	Alter Database
 * ----------------------
1452
 */
1453
typedef struct AlterDatabaseSetStmt
1454
{
1455
	NodeTag		type;
1456 1457 1458 1459
	char	   *dbname;
	char	   *variable;
	List	   *value;
} AlterDatabaseSetStmt;
1460

1461 1462 1463
/* ----------------------
 *		Dropdb Statement
 * ----------------------
1464
 */
1465
typedef struct DropdbStmt
1466
{
1467
	NodeTag		type;
1468 1469
	char	   *dbname;			/* database to drop */
} DropdbStmt;
1470

1471 1472 1473
/* ----------------------
 *		Cluster Statement (support pbrown's cluster index implementation)
 * ----------------------
1474
 */
1475
typedef struct ClusterStmt
1476
{
1477
	NodeTag		type;
1478
	RangeVar   *relation;		/* relation being indexed */
1479 1480
	char	   *indexname;		/* original index defined */
} ClusterStmt;
1481

1482 1483
/* ----------------------
 *		Vacuum and Analyze Statements
1484
 *
1485 1486 1487
 * Even though these are nominally two statements, it's convenient to use
 * just one node type for both.
 * ----------------------
1488
 */
1489
typedef struct VacuumStmt
1490
{
1491
	NodeTag		type;
1492 1493 1494 1495 1496
	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 */
1497
	RangeVar   *relation;		/* single table to process, or NULL */
1498 1499
	List	   *va_cols;		/* list of column names, or NIL for all */
} VacuumStmt;
1500

1501 1502 1503
/* ----------------------
 *		Explain Statement
 * ----------------------
1504
 */
1505
typedef struct ExplainStmt
M
 
Marc G. Fournier 已提交
1506 1507
{
	NodeTag		type;
1508 1509 1510 1511
	Query	   *query;			/* the query */
	bool		verbose;		/* print plan info */
	bool		analyze;		/* get statistics by executing plan */
} ExplainStmt;
M
 
Marc G. Fournier 已提交
1512

1513 1514 1515
/* ----------------------
 * Checkpoint Statement
 * ----------------------
1516
 */
1517
typedef struct CheckPointStmt
1518
{
1519
	NodeTag		type;
1520
} CheckPointStmt;
1521

1522 1523 1524
/* ----------------------
 * Set Statement
 * ----------------------
1525
 */
1526 1527

typedef struct VariableSetStmt
1528 1529
{
	NodeTag		type;
1530 1531
	char	   *name;
	List	   *args;
1532
	bool		is_local;		/* SET LOCAL */
1533
} VariableSetStmt;
1534

1535 1536 1537
/* ----------------------
 * Show Statement
 * ----------------------
1538
 */
1539 1540

typedef struct VariableShowStmt
1541
{
1542
	NodeTag		type;
1543 1544
	char	   *name;
} VariableShowStmt;
1545

1546 1547 1548
/* ----------------------
 * Reset Statement
 * ----------------------
1549
 */
1550 1551

typedef struct VariableResetStmt
1552
{
1553
	NodeTag		type;
1554 1555
	char	   *name;
} VariableResetStmt;
1556

1557 1558 1559
/* ----------------------
 *		LOCK Statement
 * ----------------------
1560
 */
1561
typedef struct LockStmt
1562
{
1563
	NodeTag		type;
1564
	List	   *relations;		/* relations to lock */
1565 1566
	int			mode;			/* lock mode */
} LockStmt;
1567

1568 1569 1570
/* ----------------------
 *		SET CONSTRAINTS Statement
 * ----------------------
1571
 */
1572
typedef struct ConstraintsSetStmt
1573
{
1574
	NodeTag		type;
1575 1576 1577
	List	   *constraints;	/* List of names as Value strings */
	bool		deferred;
} ConstraintsSetStmt;
B
Bruce Momjian 已提交
1578

1579 1580 1581
/* ----------------------
 *		REINDEX Statement
 * ----------------------
1582
 */
1583
typedef struct ReindexStmt
1584
{
1585
	NodeTag		type;
1586
	int			reindexType;	/* INDEX|TABLE|DATABASE */
1587 1588
	RangeVar   *relation;		/* Table or index to reindex */
	const char *name;			/* name of database to reindex */
1589 1590 1591
	bool		force;
	bool		all;
} ReindexStmt;
1592

1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606
/* ----------------------
 *		CREATE CONVERSION Statement
 * ----------------------
 */
typedef struct CreateConversionStmt
{
	NodeTag		type;
	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? */
} CreateConversionStmt;

1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632
/* ----------------------
 *	CREATE CAST Statement
 * ----------------------
 */
typedef struct CreateCastStmt
{
	NodeTag		type;
	TypeName   *sourcetype;
	TypeName   *targettype;
	FuncWithArgs *func;
	bool		implicit;
} CreateCastStmt;

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


1633
#endif   /* PARSENODES_H */