parsenodes.h 49.8 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.220 2002/12/06 03:43:28 momjian Exp $
11 12 13
 *
 *-------------------------------------------------------------------------
 */
14 15
#ifndef PARSENODES_H
#define PARSENODES_H
16

17
#include "nodes/primnodes.h"
18

19

20 21 22 23 24 25 26 27 28 29 30
/* Possible sources of a Query */
typedef enum QuerySource
{
	QSRC_ORIGINAL,				/* original parsetree (explicit query) */
	QSRC_PARSER,				/* added by parse analysis */
	QSRC_INSTEAD_RULE,			/* added by unconditional INSTEAD rule */
	QSRC_QUAL_INSTEAD_RULE,		/* added by conditional INSTEAD rule */
	QSRC_NON_INSTEAD_RULE		/* added by non-INSTEAD rule */
} QuerySource;


31
/*****************************************************************************
32
 *	Query Tree
33 34 35 36
 *****************************************************************************/

/*
 * Query -
37 38 39 40
 *	  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.
41 42 43 44
 *
 * we need the isPortal flag because portal names can be null too; can
 * get rid of it if we support CURSOR as a commandType.
 */
45 46
typedef struct Query
{
47
	NodeTag		type;
48

49
	CmdType		commandType;	/* select|insert|update|delete|utility */
50

51 52
	QuerySource	querySource;	/* where did I come from? */

53
	Node	   *utilityStmt;	/* non-null if this is a non-optimizable
54 55
								 * statement */

56
	int			resultRelation; /* target relation (index into rtable) */
B
Bruce Momjian 已提交
57 58
	RangeVar   *into;			/* target relation or portal (cursor) for
								 * portal just name is meaningful */
59 60
	bool		isPortal;		/* is this a retrieve into portal? */
	bool		isBinary;		/* binary portal? */
61

62
	bool		hasAggs;		/* has aggregates in tlist or havingQual */
63
	bool		hasSubLinks;	/* has subquery SubLink */
64

65
	List	   *rtable;			/* list of range table entries */
B
Bruce Momjian 已提交
66 67
	FromExpr   *jointree;		/* table join tree (FROM and WHERE
								 * clauses) */
68

69 70
	List	   *rowMarks;		/* integer list of RT indexes of relations
								 * that are selected FOR UPDATE */
71

72
	List	   *targetList;		/* target list (of TargetEntry) */
73

74 75 76
	List	   *groupClause;	/* a list of GroupClause's */

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

78 79 80
	List	   *distinctClause; /* a list of SortClause's */

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

B
Bruce Momjian 已提交
82 83
	Node	   *limitOffset;	/* # of result tuples to skip */
	Node	   *limitCount;		/* # of result tuples to return */
B
Bruce Momjian 已提交
84

85 86 87
	Node	   *setOperations;	/* set-operation tree if this is top level
								 * of a UNION/INTERSECT/EXCEPT query */

88 89 90 91 92 93 94 95
	/*
	 * 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.
	 */
96
	List	   *resultRelations;	/* integer list of RT indexes, or NIL */
97

98
	/* internal to planner */
99
	List	   *base_rel_list;	/* list of base-relation RelOptInfos */
100
	List	   *other_rel_list; /* list of other 1-relation RelOptInfos */
101
	List	   *join_rel_list;	/* list of join-relation RelOptInfos */
102 103
	List	   *equi_key_list;	/* list of lists of equijoined
								 * PathKeyItems */
104
	List	   *query_pathkeys; /* desired pathkeys for query_planner() */
105
	bool		hasJoinRTEs;	/* true if any RTEs are RTE_JOIN kind */
106
} Query;
107 108


109 110
/****************************************************************************
 *	Supporting data structures for Parse Trees
111
 *
112 113 114 115
 *	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.
 ****************************************************************************/
116

117 118
/*
 * TypeName - specifies a type in definitions
119 120 121 122 123 124
 *
 * 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 已提交
125
 * the type of that field.	Otherwise (the normal case), names is a type
126
 * name possibly qualified with schema and database name.
127
 */
128
typedef struct TypeName
129
{
130
	NodeTag		type;
131 132
	List	   *names;			/* qualified name (list of Value strings) */
	Oid			typeid;			/* type identified by OID */
133 134
	bool		timezone;		/* timezone specified? */
	bool		setof;			/* is a set? */
135
	bool		pct_type;		/* %TYPE specified? */
136 137 138
	int32		typmod;			/* type modifier */
	List	   *arrayBounds;	/* array bounds */
} TypeName;
139

140
/*
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
 * 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
157
 */
158
typedef struct ParamRef
159 160
{
	NodeTag		type;
161
	int			number;			/* the number of the parameter */
162 163 164
	List	   *fields;			/* field names (list of Value strings) */
	List	   *indirection;	/* subscripts (list of A_Indices) */
} ParamRef;
165

166 167 168 169
/*
 * A_Expr - binary expressions
 */
typedef struct A_Expr
170
{
171
	NodeTag		type;
172
	int			oper;			/* type of operation (OP,OR,AND,NOT) */
173
	List	   *name;			/* possibly-qualified name of operator */
174 175 176
	Node	   *lexpr;			/* left argument */
	Node	   *rexpr;			/* right argument */
} A_Expr;
177

178 179 180 181
/*
 * A_Const - a constant expression
 */
typedef struct A_Const
182 183
{
	NodeTag		type;
184 185 186
	Value		val;			/* the value (with the tag) */
	TypeName   *typename;		/* typecast */
} A_Const;
187

188 189 190
/*
 * TypeCast - a CAST expression
 *
191
 * NOTE: for mostly historical reasons, A_Const parsenodes contain
192
 * room for a TypeName; we only generate a separate TypeCast node if the
193 194 195
 * 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.
196
 */
197
typedef struct TypeCast
198
{
199
	NodeTag		type;
200 201 202
	Node	   *arg;			/* the expression being casted */
	TypeName   *typename;		/* the target type */
} TypeCast;
203

204 205
/*
 * CaseExpr - a CASE expression
206
 */
207
typedef struct CaseExpr
208
{
209
	NodeTag		type;
210 211 212 213 214
	Oid			casetype;
	Node	   *arg;			/* implicit equality comparison argument */
	List	   *args;			/* the arguments (list of WHEN clauses) */
	Node	   *defresult;		/* the default result (ELSE clause) */
} CaseExpr;
215

216 217
/*
 * CaseWhen - an argument to a CASE expression
218
 */
219
typedef struct CaseWhen
220
{
221
	NodeTag		type;
222 223 224
	Node	   *expr;			/* comparison expression */
	Node	   *result;			/* substitution result */
} CaseWhen;
225

226 227
/* ----------------
 * NullTest
228
 *
229 230 231 232 233
 * 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.
 * ----------------
234 235
 */

236
typedef enum NullTestType
237
{
238 239
	IS_NULL, IS_NOT_NULL
} NullTestType;
240

241
typedef struct NullTest
242
{
243
	NodeTag		type;
244 245 246
	Node	   *arg;			/* input expression */
	NullTestType nulltesttype;	/* IS NULL, IS NOT NULL */
} NullTest;
J
Jan Wieck 已提交
247

248
/*
249 250 251 252 253 254
 * 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 已提交
255 256
 */

257
typedef enum BoolTestType
J
Jan Wieck 已提交
258
{
259 260
	IS_TRUE, IS_NOT_TRUE, IS_FALSE, IS_NOT_FALSE, IS_UNKNOWN, IS_NOT_UNKNOWN
} BoolTestType;
261

262
typedef struct BooleanTest
263
{
264
	NodeTag		type;
265 266 267
	Node	   *arg;			/* input expression */
	BoolTestType booltesttype;	/* test type */
} BooleanTest;
268

269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
/*
 * 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 已提交
287
	ConstraintTestType testtype;	/* test type */
288
	char	   *name;			/* name of constraint (for error msgs) */
B
Bruce Momjian 已提交
289
	char	   *domname; 		/* name of domain (for error messages) */
290 291 292
	Node	   *check_expr;		/* for CHECK test, a boolean expression */
} ConstraintTest;

B
Bruce Momjian 已提交
293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
/*
 * Placeholder node for the value to be processed by a domains
 * check constraint.
 */
typedef struct DomainConstraintValue
{
	NodeTag		type;
} DomainConstraintValue;

typedef struct ConstraintTestValue
{
	NodeTag		type;
	Oid			typeId;
	int32		typeMod;
} ConstraintTestValue;

309 310 311 312 313 314 315 316 317 318 319 320 321 322
/*
 * 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.
323 324 325 326
 *
 * 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.
327 328
 */
typedef struct ColumnDef
329
{
330
	NodeTag		type;
331 332
	char	   *colname;		/* name of column */
	TypeName   *typename;		/* type of column */
333 334
	int			inhcount;		/* number of times column is inherited */
	bool		is_local;		/* column has local (non-inherited) def'n */
335 336 337 338 339
	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 */
340
	RangeVar   *support;		/* supporting relation, if any */
341
} ColumnDef;
342

343 344 345 346 347 348 349 350 351
/*
 * 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
352 353
{
	NodeTag		type;
354
	List	   *funcname;		/* qualified name of function */
355 356 357 358
	List	   *args;			/* the arguments (list of exprs) */
	bool		agg_star;		/* argument was really '*' */
	bool		agg_distinct;	/* arguments were labeled DISTINCT */
} FuncCall;
359

360 361
/*
 * A_Indices - array reference or bounds ([lidx:uidx] or [uidx])
362
 */
363
typedef struct A_Indices
364
{
365
	NodeTag		type;
366 367 368
	Node	   *lidx;			/* could be NULL */
	Node	   *uidx;
} A_Indices;
369

370 371 372 373 374 375 376 377 378 379 380 381 382 383 384
/*
 * 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;

385 386 387 388 389 390 391 392 393 394 395 396 397 398 399
/*
 * 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
400 401
{
	NodeTag		type;
402 403 404 405 406 407
	char	   *name;			/* column name or NULL */
	List	   *indirection;	/* subscripts for destination column, or
								 * NIL */
	Node	   *val;			/* the value expression to compute or
								 * assign */
} ResTarget;
408

B
Bruce Momjian 已提交
409 410 411 412 413 414 415 416
/*
 * Empty node used as a marker for Default Columns
 */
typedef struct InsertDefault
{
	NodeTag		type;
} InsertDefault;

417 418 419 420
/*
 * SortGroupBy - for ORDER BY clause
 */
typedef struct SortGroupBy
421 422
{
	NodeTag		type;
423
	List	   *useOp;			/* operator to use */
424 425
	Node	   *node;			/* Expression  */
} SortGroupBy;
426

427 428
/*
 * RangeSubselect - subquery appearing in a FROM clause
429
 */
430
typedef struct RangeSubselect
431
{
432
	NodeTag		type;
433
	Node	   *subquery;		/* the untransformed sub-select clause */
434
	Alias	   *alias;			/* table alias & optional column aliases */
435
} RangeSubselect;
436

437 438 439 440 441 442 443 444
/*
 * 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 */
445 446
	List	   *coldeflist;		/* list of ColumnDef nodes for runtime
								 * assignment of RECORD TupleDesc */
447 448
} RangeFunction;

449 450 451
/*
 * IndexElem - index parameters (used in CREATE INDEX)
 *
452 453
 * 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 已提交
454
 * is allowed.	It has name = NULL, funcname = name of function and args =
455
 * list of attribute names that are the function's arguments.
456 457
 */
typedef struct IndexElem
458
{
459
	NodeTag		type;
460 461
	char	   *name;			/* name of attribute to index, or NULL */
	List	   *funcname;		/* qualified name of function */
462
	List	   *args;			/* list of names of function arguments */
463
	List	   *opclass;		/* name of desired opclass; NIL = default */
464
} IndexElem;
465

466 467 468 469 470
/*
 * DefElem -
 *	  a definition (used in definition lists in the form of defname = arg)
 */
typedef struct DefElem
471
{
472
	NodeTag		type;
473 474 475
	char	   *defname;
	Node	   *arg;			/* a (Value *) or a (TypeName *) */
} DefElem;
476

V
Vadim B. Mikheev 已提交
477

478 479 480
/****************************************************************************
 *	Nodes for a Query tree
 ****************************************************************************/
V
Vadim B. Mikheev 已提交
481

482 483 484 485 486 487
/*
 * 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) ...)
488
 */
489
typedef struct TargetEntry
490
{
491
	NodeTag		type;
492 493 494 495
	Resdom	   *resdom;			/* fjoin overload this to be a list?? */
	Fjoin	   *fjoin;
	Node	   *expr;
} TargetEntry;
496

497 498 499 500
/*--------------------
 * RangeTblEntry -
 *	  A range table is a List of RangeTblEntry nodes.
 *
501 502 503 504 505 506
 *	  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.
507
 *
508
 *	  alias is an Alias node representing the AS alias-clause attached to the
509 510 511 512 513
 *	  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.
514
 *	  eref->aliasname is required to be present, and should generally be used
515 516 517 518
 *	  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
519
 *	  RTEs other than RTE_RELATION entries.
520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537
 *
 *	  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.)
 *--------------------
538
 */
539 540 541 542 543
typedef enum RTEKind
{
	RTE_RELATION,				/* ordinary relation reference */
	RTE_SUBQUERY,				/* subquery in FROM */
	RTE_JOIN,					/* join */
544 545
	RTE_SPECIAL,				/* special rule relation (NEW or OLD) */
	RTE_FUNCTION				/* function in FROM */
546 547
} RTEKind;

548
typedef struct RangeTblEntry
549
{
550
	NodeTag		type;
551

552 553
	RTEKind		rtekind;		/* see above */

554
	/*
555 556
	 * 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 已提交
557
	 * a lot of code that is being actively worked on.	FIXME later.
558 559 560
	 */

	/*
561
	 * Fields valid for a plain relation RTE (else zero):
562 563
	 */
	Oid			relid;			/* OID of the relation */
564

565 566 567 568
	/*
	 * Fields valid for a subquery RTE (else NULL):
	 */
	Query	   *subquery;		/* the sub-query */
569

570 571 572 573
	/*
	 * Fields valid for a function RTE (else NULL):
	 */
	Node	   *funcexpr;		/* expression tree for func call */
574 575
	List	   *coldeflist;		/* list of ColumnDef nodes for runtime
								 * assignment of RECORD TupleDesc */
576

577
	/*
578
	 * Fields valid for a join RTE (else NULL/zero):
579
	 *
580 581 582
	 * 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 已提交
583 584
	 * joinaliasvars --- but to simplify the task of reverse-listing
	 * aliases correctly, we do not do that until planning time.
585 586
	 */
	JoinType	jointype;		/* type of join */
587
	List	   *joinaliasvars;	/* list of alias-var expansions */
588

589 590 591
	/*
	 * Fields valid in all RTEs:
	 */
592 593
	Alias	   *alias;			/* user-written alias clause, if any */
	Alias	   *eref;			/* expanded reference names */
594 595 596 597 598 599
	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;
600

601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616
/*
 * 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
617
{
618
	NodeTag		type;
619 620 621
	Index		tleSortGroupRef;	/* reference into targetlist */
	Oid			sortop;			/* the sort operator to use */
} SortClause;
622

623 624 625 626 627 628 629
/*
 * 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.
630
 */
631 632 633 634 635 636
typedef SortClause GroupClause;


/*****************************************************************************
 *		Optimizable Statements
 *****************************************************************************/
637 638

/* ----------------------
639
 *		Insert Statement
640 641
 * ----------------------
 */
642
typedef struct InsertStmt
643
{
644
	NodeTag		type;
645
	RangeVar   *relation;		/* relation to insert into */
646 647 648 649 650 651 652 653 654 655
	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;
656

657
/* ----------------------
658
 *		Delete Statement
659 660
 * ----------------------
 */
661
typedef struct DeleteStmt
662
{
663
	NodeTag		type;
664
	RangeVar   *relation;		/* relation to delete from */
665 666
	Node	   *whereClause;	/* qualifications */
} DeleteStmt;
667 668

/* ----------------------
669
 *		Update Statement
670 671
 * ----------------------
 */
672
typedef struct UpdateStmt
673
{
674
	NodeTag		type;
675
	RangeVar   *relation;		/* relation to update */
676 677
	List	   *targetList;		/* the target list (of ResTarget) */
	Node	   *whereClause;	/* qualifications */
678
	List	   *fromClause;		/* optional from clause for more tables */
679
} UpdateStmt;
680 681

/* ----------------------
682 683 684 685 686 687 688 689 690 691
 *		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.
692 693
 * ----------------------
 */
694 695 696 697 698 699 700 701 702
typedef enum SetOperation
{
	SETOP_NONE = 0,
	SETOP_UNION,
	SETOP_INTERSECT,
	SETOP_EXCEPT
} SetOperation;

typedef struct SelectStmt
703
{
704
	NodeTag		type;
705 706 707 708 709 710 711

	/*
	 * These fields are used only in "leaf" SelectStmts.
	 */
	List	   *distinctClause; /* NULL, list of DISTINCT ON exprs, or
								 * lcons(NIL,NIL) for all (SELECT
								 * DISTINCT) */
712
	RangeVar   *into;			/* target table (for select into table) */
713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739
	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;
740 741

/* ----------------------
742 743 744 745 746 747 748
 *		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.
749 750
 * ----------------------
 */
751
typedef struct SetOperationStmt
752
{
753
	NodeTag		type;
754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773
	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.
 *****************************************************************************/
774

775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790
/* ----------------------
 *		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;

791 792 793 794 795 796
typedef enum DropBehavior
{
	DROP_RESTRICT,				/* drop fails if any dependent objects */
	DROP_CASCADE				/* remove dependent objects too */
} DropBehavior;

797
/* ----------------------
798 799 800 801
 *	Alter Table
 *
 * The fields are used in different ways by the different variants of
 * this command.
802 803
 * ----------------------
 */
804
typedef struct AlterTableStmt
805
{
806
	NodeTag		type;
807 808 809
	char		subtype;		/*------------
								 *	A = add column
								 *	T = alter column default
810 811
								 *	N = alter column drop not null
								 *	O = alter column set not null
812
								 *	S = alter column statistics
B
Bruce Momjian 已提交
813
								 *	M = alter column storage
814 815
								 *	D = drop column
								 *	C = add constraint
816 817
								 *	c = pre-processed add constraint
								 *		(local in parser/analyze.c)
818 819 820 821 822
								 *	X = drop constraint
								 *	E = create toast table
								 *	U = change owner
								 *------------
								 */
823
	RangeVar   *relation;		/* table to work on */
824 825 826
	char	   *name;			/* column or constraint name to act on, or
								 * new owner */
	Node	   *def;			/* definition of new column or constraint */
827
	DropBehavior behavior;		/* RESTRICT or CASCADE for DROP cases */
828
} AlterTableStmt;
829

830
/* ----------------------
831
 *		Grant|Revoke Statement
832 833
 * ----------------------
 */
834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857
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 已提交
858
#define ACL_CREATE_TEMP (1<<10) /* for databases */
859 860 861
#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
862 863

typedef struct GrantStmt
864
{
865
	NodeTag		type;
866 867
	bool		is_grant;		/* true = GRANT, false = REVOKE */
	GrantObjectType objtype;	/* kind of object being operated on */
B
Bruce Momjian 已提交
868 869 870
	List	   *objects;		/* list of RangeVar nodes, FuncWithArgs
								 * nodes, or plain names (as Value
								 * strings) */
871 872 873
	List	   *privileges;		/* integer list of privilege codes */
	List	   *grantees;		/* list of PrivGrantee nodes */
} GrantStmt;
874

875
typedef struct PrivGrantee
876
{
877
	NodeTag		type;
878 879 880
	char	   *username;		/* if both are NULL then PUBLIC */
	char	   *groupname;
} PrivGrantee;
881

882
typedef struct FuncWithArgs
883
{
884
	NodeTag		type;
885
	List	   *funcname;		/* qualified name of function */
886 887
	List	   *funcargs;		/* list of Typename nodes */
} FuncWithArgs;
888

889 890
/* This is only used internally in gram.y. */
typedef struct PrivTarget
891
{
892
	NodeTag		type;
893
	GrantObjectType objtype;
894 895 896
	List	   *objs;
} PrivTarget;

897
/* ----------------------
898
 *		Close Portal Statement
899 900
 * ----------------------
 */
901
typedef struct ClosePortalStmt
902
{
903
	NodeTag		type;
904 905
	char	   *portalname;		/* name of the portal (cursor) */
} ClosePortalStmt;
906 907

/* ----------------------
908
 *		Copy Statement
909 910
 * ----------------------
 */
911
typedef struct CopyStmt
912
{
913
	NodeTag		type;
914
	RangeVar   *relation;		/* the relation to copy */
B
Bruce Momjian 已提交
915 916
	List	   *attlist;		/* List of column names (as Strings), or
								 * NIL for all columns */
917
	bool		is_from;		/* TO or FROM */
918
	char	   *filename;		/* if NULL, use stdin/stdout */
919
	List	   *options;		/* List of DefElem nodes */
920
} CopyStmt;
M
 
Marc G. Fournier 已提交
921 922

/* ----------------------
923 924 925 926 927 928 929
 *		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 已提交
930 931
 * ----------------------
 */
932 933 934 935 936 937 938 939 940 941

/* What to do at commit time for temporary relations */
typedef enum OnCommitAction
{
	ONCOMMIT_NOOP,				/* No ON COMMIT clause (do nothing) */
	ONCOMMIT_PRESERVE_ROWS,		/* ON COMMIT PRESERVE ROWS (do nothing) */
	ONCOMMIT_DELETE_ROWS,		/* ON COMMIT DELETE ROWS */
	ONCOMMIT_DROP				/* ON COMMIT DROP */
} OnCommitAction;

942
typedef struct CreateStmt
M
 
Marc G. Fournier 已提交
943 944
{
	NodeTag		type;
945
	RangeVar   *relation;		/* relation to create */
946
	List	   *tableElts;		/* column definitions (list of ColumnDef) */
947
	List	   *inhRelations;	/* relations to inherit from */
948 949
	List	   *constraints;	/* constraints (list of Constraint nodes) */
	bool		hasoids;		/* should it have OIDs? */
950
	OnCommitAction oncommit;	/* what do we do at COMMIT? */
951
} CreateStmt;
952

953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969
/* ----------
 * 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).
 * ----------
970
 */
971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987

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
988
{
989
	NodeTag		type;
990 991 992 993
	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 已提交
994 995
	List	   *keys;			/* String nodes naming referenced
								 * column(s) */
996
} Constraint;
997

998 999
/* ----------
 * Definitions for FOREIGN KEY constraints in CreateStmt
1000 1001 1002 1003 1004 1005 1006 1007
 *
 * 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 已提交
1008
 * for the constraint.	This is currently used only during CREATE TABLE
1009
 * (when we know the table must be empty).
1010
 * ----------
1011
 */
1012 1013 1014 1015 1016
#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'
1017

1018 1019 1020
#define FKCONSTR_MATCH_FULL			'f'
#define FKCONSTR_MATCH_PARTIAL		'p'
#define FKCONSTR_MATCH_UNSPECIFIED	'u'
1021 1022

typedef struct FkConstraint
1023
{
1024
	NodeTag		type;
1025
	char	   *constr_name;	/* Constraint name, or NULL if unnamed */
1026
	RangeVar   *pktable;		/* Primary key table */
1027 1028
	List	   *fk_attrs;		/* Attributes of foreign key */
	List	   *pk_attrs;		/* Corresponding attrs in PK table */
1029 1030 1031
	char		fk_matchtype;	/* FULL, PARTIAL, UNSPECIFIED */
	char		fk_upd_action;	/* ON UPDATE action */
	char		fk_del_action;	/* ON DELETE action */
1032 1033
	bool		deferrable;		/* DEFERRABLE */
	bool		initdeferred;	/* INITIALLY DEFERRED */
B
Bruce Momjian 已提交
1034
	bool		skip_validation;	/* skip validation of existing rows? */
1035
} FkConstraint;
1036 1037

/* ----------------------
1038
 *		Create/Drop TRIGGER Statements
1039 1040
 * ----------------------
 */
1041 1042

typedef struct CreateTrigStmt
1043
{
1044
	NodeTag		type;
1045 1046 1047 1048
	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 */
1049 1050
	bool		before;			/* BEFORE/AFTER */
	bool		row;			/* ROW/STATEMENT */
1051
	char		actions[4];		/* 1 to 3 of 'i', 'u', 'd', + trailing \0 */
1052

1053 1054 1055 1056 1057
	/* 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} */
1058
	RangeVar   *constrrel;		/* opposite relation */
1059 1060
} CreateTrigStmt;

1061
/* ----------------------
1062
 *		Create/Drop PROCEDURAL LANGUAGE Statement
1063 1064
 * ----------------------
 */
1065
typedef struct CreatePLangStmt
1066 1067
{
	NodeTag		type;
1068
	char	   *plname;			/* PL name */
1069
	List	   *plhandler;		/* PL call handler function (qual. name) */
B
Bruce Momjian 已提交
1070 1071
	List	   *plvalidator;	/* optional validator function (qual.
								 * name) */
1072 1073
	bool		pltrusted;		/* PL is trusted */
} CreatePLangStmt;
1074

1075
typedef struct DropPLangStmt
1076
{
1077
	NodeTag		type;
1078
	char	   *plname;			/* PL name */
1079
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1080
} DropPLangStmt;
1081 1082

/* ----------------------
1083
 *	Create/Alter/Drop User Statements
1084 1085
 * ----------------------
 */
1086
typedef struct CreateUserStmt
1087
{
1088
	NodeTag		type;
1089 1090 1091
	char	   *user;			/* PostgreSQL user login name */
	List	   *options;		/* List of DefElem nodes */
} CreateUserStmt;
1092

1093
typedef struct AlterUserStmt
1094
{
1095
	NodeTag		type;
1096 1097 1098
	char	   *user;			/* PostgreSQL user login name */
	List	   *options;		/* List of DefElem nodes */
} AlterUserStmt;
1099

1100
typedef struct AlterUserSetStmt
1101
{
1102
	NodeTag		type;
1103 1104 1105 1106
	char	   *user;
	char	   *variable;
	List	   *value;
} AlterUserSetStmt;
1107

1108
typedef struct DropUserStmt
V
Vadim B. Mikheev 已提交
1109 1110
{
	NodeTag		type;
1111 1112
	List	   *users;			/* List of users to remove */
} DropUserStmt;
V
Vadim B. Mikheev 已提交
1113

1114
/* ----------------------
1115
 *		Create/Alter/Drop Group Statements
1116 1117
 * ----------------------
 */
1118
typedef struct CreateGroupStmt
1119
{
1120
	NodeTag		type;
1121 1122 1123
	char	   *name;			/* name of the new group */
	List	   *options;		/* List of DefElem nodes */
} CreateGroupStmt;
1124

1125 1126 1127 1128 1129 1130 1131
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;
1132

1133
typedef struct DropGroupStmt
1134
{
1135 1136
	NodeTag		type;
	char	   *name;
1137
} DropGroupStmt;
1138 1139

/* ----------------------
1140
 *		Create SEQUENCE Statement
1141 1142 1143
 * ----------------------
 */

1144
typedef struct CreateSeqStmt
1145
{
1146
	NodeTag		type;
1147
	RangeVar   *sequence;		/* the sequence to create */
1148 1149
	List	   *options;
} CreateSeqStmt;
1150

1151
/* ----------------------
1152
 *		Create {Operator|Type|Aggregate} Statement
1153 1154
 * ----------------------
 */
1155
typedef struct DefineStmt
1156 1157
{
	NodeTag		type;
T
Tom Lane 已提交
1158
	int			defType;		/* OPERATOR|TYPE_P|AGGREGATE */
1159
	List	   *defnames;		/* qualified name (list of Value strings) */
1160 1161
	List	   *definition;		/* a list of DefElem */
} DefineStmt;
1162

T
Tom Lane 已提交
1163 1164 1165 1166 1167 1168 1169
/* ----------------------
 *		Create Domain Statement
 * ----------------------
 */
typedef struct CreateDomainStmt
{
	NodeTag		type;
1170 1171 1172
	List	   *domainname;		/* qualified name (list of Value strings) */
	TypeName   *typename;		/* the base type */
	List	   *constraints;	/* constraints (list of Constraint nodes) */
T
Tom Lane 已提交
1173 1174
} CreateDomainStmt;

1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205
/* ----------------------
 *		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 已提交
1206
/* ----------------------
1207
 *		Drop Table|Sequence|View|Index|Type|Domain|Conversion|Schema Statement
H
Hiroshi Inoue 已提交
1208 1209 1210
 * ----------------------
 */

1211 1212 1213 1214
#define DROP_TABLE	  1
#define DROP_SEQUENCE 2
#define DROP_VIEW	  3
#define DROP_INDEX	  4
B
Bruce Momjian 已提交
1215 1216 1217 1218
#define DROP_TYPE	  5
#define DROP_DOMAIN   6
#define DROP_CONVERSION   7
#define DROP_SCHEMA   8
1219

1220 1221 1222
typedef struct DropStmt
{
	NodeTag		type;
1223
	List	   *objects;		/* list of sublists of names (as Values) */
1224 1225
	int			removeType;		/* see #defines above */
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1226
} DropStmt;
1227

1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243
/* ----------------------
 *		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 */
1244 1245
	int			removeType;		/* see #defines above */
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1246 1247
} DropPropertyStmt;

1248
/* ----------------------
1249
 *				Truncate Table Statement
1250 1251
 * ----------------------
 */
1252
typedef struct TruncateStmt
1253
{
1254
	NodeTag		type;
1255
	RangeVar   *relation;		/* relation to be truncated */
1256
} TruncateStmt;
1257 1258

/* ----------------------
1259
 *				Comment On Statement
1260 1261
 * ----------------------
 */
1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276
#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

1277
typedef struct CommentStmt
1278
{
1279
	NodeTag		type;
1280
	int			objtype;		/* Object's type, see codes above */
1281 1282 1283
	List	   *objname;		/* Qualified name of the object */
	List	   *objargs;		/* Arguments if needed (eg, for functions) */
	char	   *comment;		/* Comment to insert, or NULL to remove */
1284
} CommentStmt;
1285 1286

/* ----------------------
1287
 *		Fetch Statement
1288 1289
 * ----------------------
 */
1290
typedef struct FetchStmt
1291
{
1292
	NodeTag		type;
1293
	int			direction;		/* FORWARD or BACKWARD */
1294
	int			howMany;		/* amount to fetch */
1295 1296 1297
	char	   *portalname;		/* name of portal (cursor) */
	bool		ismove;			/* TRUE if MOVE */
} FetchStmt;
1298

1299
/* ----------------------
1300
 *		Create Index Statement
1301 1302
 * ----------------------
 */
1303
typedef struct IndexStmt
1304 1305
{
	NodeTag		type;
1306
	char	   *idxname;		/* name of the index */
1307
	RangeVar   *relation;		/* relation to build index on */
1308 1309 1310 1311 1312 1313 1314
	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? */
1315
	bool		isconstraint;	/* is it from a CONSTRAINT clause? */
1316
} IndexStmt;
1317

1318 1319 1320
/* ----------------------
 *		Create Function Statement
 * ----------------------
1321
 */
1322
typedef struct CreateFunctionStmt
1323
{
1324
	NodeTag		type;
1325
	bool		replace;		/* T => replace if already exists */
1326
	List	   *funcname;		/* qualified name of function to create */
1327
	List	   *argTypes;		/* list of argument types (TypeName nodes) */
1328
	TypeName   *returnType;		/* the return type */
1329
	List	   *options;		/* a list of DefElem */
1330
	List	   *withClause;		/* a list of DefElem */
1331
} CreateFunctionStmt;
1332

1333 1334 1335
/* ----------------------
 *		Drop Aggregate Statement
 * ----------------------
1336
 */
1337
typedef struct RemoveAggrStmt
1338
{
1339
	NodeTag		type;
1340
	List	   *aggname;		/* aggregate to drop */
1341
	TypeName   *aggtype;		/* TypeName for input datatype, or NULL */
1342
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1343
} RemoveAggrStmt;
1344

1345 1346 1347
/* ----------------------
 *		Drop Function Statement
 * ----------------------
1348
 */
1349
typedef struct RemoveFuncStmt
1350
{
1351
	NodeTag		type;
1352
	List	   *funcname;		/* function to drop */
1353
	List	   *args;			/* types of the arguments */
1354
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1355
} RemoveFuncStmt;
1356

1357 1358 1359
/* ----------------------
 *		Drop Operator Statement
 * ----------------------
1360
 */
1361
typedef struct RemoveOperStmt
1362
{
1363
	NodeTag		type;
1364
	List	   *opname;			/* operator to drop */
1365
	List	   *args;			/* types of the arguments */
1366
	DropBehavior behavior;		/* RESTRICT or CASCADE behavior */
1367
} RemoveOperStmt;
1368

1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380
/* ----------------------
 *		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;

1381
/* ----------------------
1382
 *		Alter Object Rename Statement
1383
 * ----------------------
1384 1385
 * Currently supports renaming tables, table columns, and triggers.
 * If renaming a table, oldname is ignored.
1386
 */
1387 1388 1389 1390 1391
#define RENAME_TABLE	110
#define RENAME_COLUMN	111
#define RENAME_TRIGGER	112
#define RENAME_RULE		113

1392
typedef struct RenameStmt
1393
{
1394
	NodeTag		type;
1395 1396
	RangeVar   *relation;		/* owning relation */
	char	   *oldname;		/* name of rule, trigger, etc */
1397
	char	   *newname;		/* the new name */
1398
	int			renameType;		/* RENAME_TABLE, RENAME_COLUMN, etc */
1399
} RenameStmt;
1400

1401 1402 1403
/* ----------------------
 *		Create Rule Statement
 * ----------------------
1404
 */
1405
typedef struct RuleStmt
1406 1407
{
	NodeTag		type;
1408
	RangeVar   *relation;		/* relation the rule is for */
1409 1410
	char	   *rulename;		/* name of the rule */
	Node	   *whereClause;	/* qualifications */
1411
	CmdType		event;			/* SELECT, INSERT, etc */
1412 1413
	bool		instead;		/* is a 'do instead'? */
	List	   *actions;		/* the action statements */
1414
	bool		replace;		/* OR REPLACE */
1415
} RuleStmt;
1416

1417 1418 1419
/* ----------------------
 *		Notify Statement
 * ----------------------
T
Thomas G. Lockhart 已提交
1420
 */
1421
typedef struct NotifyStmt
T
Thomas G. Lockhart 已提交
1422 1423
{
	NodeTag		type;
1424
	RangeVar   *relation;		/* qualified name to notify */
1425
} NotifyStmt;
T
Thomas G. Lockhart 已提交
1426

1427 1428 1429
/* ----------------------
 *		Listen Statement
 * ----------------------
T
Thomas G. Lockhart 已提交
1430
 */
1431
typedef struct ListenStmt
T
Thomas G. Lockhart 已提交
1432 1433
{
	NodeTag		type;
1434
	RangeVar   *relation;		/* qualified name to listen on */
1435
} ListenStmt;
T
Thomas G. Lockhart 已提交
1436

1437 1438 1439
/* ----------------------
 *		Unlisten Statement
 * ----------------------
1440
 */
1441
typedef struct UnlistenStmt
1442
{
1443
	NodeTag		type;
1444
	RangeVar   *relation;		/* qualified name to unlisten on, or '*' */
1445
} UnlistenStmt;
1446

1447
/* ----------------------
1448
 *		{Begin|Commit|Rollback} Transaction Statement
1449 1450 1451
 * ----------------------
 */
typedef struct TransactionStmt
1452
{
1453
	NodeTag		type;
1454 1455
	int			command;		/* BEGIN_TRANS|START|COMMIT|ROLLBACK */
	List	   *options;
1456
} TransactionStmt;
1457

B
Bruce Momjian 已提交
1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469
/* ----------------------
 *		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;


1470 1471 1472
/* ----------------------
 *		Create View Statement
 * ----------------------
1473
 */
1474
typedef struct ViewStmt
1475
{
1476
	NodeTag		type;
1477
	RangeVar   *view;			/* the view to be created */
1478 1479
	List	   *aliases;		/* target column names */
	Query	   *query;			/* the SQL statement */
1480
	bool		replace;		/* replace an existing view? */
1481
} ViewStmt;
1482

1483 1484 1485 1486 1487
/* ----------------------
 *		Load Statement
 * ----------------------
 */
typedef struct LoadStmt
1488
{
1489
	NodeTag		type;
1490 1491
	char	   *filename;		/* file to load */
} LoadStmt;
1492

1493 1494 1495
/* ----------------------
 *		Createdb Statement
 * ----------------------
1496
 */
1497
typedef struct CreatedbStmt
1498
{
1499
	NodeTag		type;
1500
	char	   *dbname;			/* name of database to create */
1501
	List	   *options;		/* List of DefElem nodes */
1502
} CreatedbStmt;
1503

1504 1505 1506
/* ----------------------
 *	Alter Database
 * ----------------------
1507
 */
1508
typedef struct AlterDatabaseSetStmt
1509
{
1510
	NodeTag		type;
1511 1512 1513 1514
	char	   *dbname;
	char	   *variable;
	List	   *value;
} AlterDatabaseSetStmt;
1515

1516 1517 1518
/* ----------------------
 *		Dropdb Statement
 * ----------------------
1519
 */
1520
typedef struct DropdbStmt
1521
{
1522
	NodeTag		type;
1523 1524
	char	   *dbname;			/* database to drop */
} DropdbStmt;
1525

1526 1527 1528
/* ----------------------
 *		Cluster Statement (support pbrown's cluster index implementation)
 * ----------------------
1529
 */
1530
typedef struct ClusterStmt
1531
{
1532
	NodeTag		type;
1533
	RangeVar   *relation;		/* relation being indexed, or NULL if all */
1534 1535
	char	   *indexname;		/* original index defined */
} ClusterStmt;
1536

1537 1538
/* ----------------------
 *		Vacuum and Analyze Statements
1539
 *
1540 1541 1542
 * Even though these are nominally two statements, it's convenient to use
 * just one node type for both.
 * ----------------------
1543
 */
1544
typedef struct VacuumStmt
1545
{
1546
	NodeTag		type;
1547 1548 1549 1550 1551
	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 */
1552
	RangeVar   *relation;		/* single table to process, or NULL */
1553 1554
	List	   *va_cols;		/* list of column names, or NIL for all */
} VacuumStmt;
1555

1556 1557 1558
/* ----------------------
 *		Explain Statement
 * ----------------------
1559
 */
1560
typedef struct ExplainStmt
M
 
Marc G. Fournier 已提交
1561 1562
{
	NodeTag		type;
1563 1564 1565 1566
	Query	   *query;			/* the query */
	bool		verbose;		/* print plan info */
	bool		analyze;		/* get statistics by executing plan */
} ExplainStmt;
M
 
Marc G. Fournier 已提交
1567

1568 1569 1570
/* ----------------------
 * Checkpoint Statement
 * ----------------------
1571
 */
1572
typedef struct CheckPointStmt
1573
{
1574
	NodeTag		type;
1575
} CheckPointStmt;
1576

1577 1578 1579
/* ----------------------
 * Set Statement
 * ----------------------
1580
 */
1581 1582

typedef struct VariableSetStmt
1583 1584
{
	NodeTag		type;
1585 1586
	char	   *name;
	List	   *args;
1587
	bool		is_local;		/* SET LOCAL */
1588
} VariableSetStmt;
1589

1590 1591 1592
/* ----------------------
 * Show Statement
 * ----------------------
1593
 */
1594 1595

typedef struct VariableShowStmt
1596
{
1597
	NodeTag		type;
1598 1599
	char	   *name;
} VariableShowStmt;
1600

1601 1602 1603
/* ----------------------
 * Reset Statement
 * ----------------------
1604
 */
1605 1606

typedef struct VariableResetStmt
1607
{
1608
	NodeTag		type;
1609 1610
	char	   *name;
} VariableResetStmt;
1611

1612 1613 1614
/* ----------------------
 *		LOCK Statement
 * ----------------------
1615
 */
1616
typedef struct LockStmt
1617
{
1618
	NodeTag		type;
1619
	List	   *relations;		/* relations to lock */
1620 1621
	int			mode;			/* lock mode */
} LockStmt;
1622

1623 1624 1625
/* ----------------------
 *		SET CONSTRAINTS Statement
 * ----------------------
1626
 */
1627
typedef struct ConstraintsSetStmt
1628
{
1629
	NodeTag		type;
1630 1631 1632
	List	   *constraints;	/* List of names as Value strings */
	bool		deferred;
} ConstraintsSetStmt;
B
Bruce Momjian 已提交
1633

1634 1635 1636
/* ----------------------
 *		REINDEX Statement
 * ----------------------
1637
 */
1638
typedef struct ReindexStmt
1639
{
1640
	NodeTag		type;
1641
	int			reindexType;	/* INDEX|TABLE|DATABASE */
1642 1643
	RangeVar   *relation;		/* Table or index to reindex */
	const char *name;			/* name of database to reindex */
1644 1645 1646
	bool		force;
	bool		all;
} ReindexStmt;
1647

1648 1649 1650 1651 1652 1653 1654
/* ----------------------
 *		CREATE CONVERSION Statement
 * ----------------------
 */
typedef struct CreateConversionStmt
{
	NodeTag		type;
B
Bruce Momjian 已提交
1655 1656 1657 1658 1659
	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? */
1660 1661
} CreateConversionStmt;

1662 1663 1664 1665 1666 1667 1668 1669 1670 1671
/* ----------------------
 *	CREATE CAST Statement
 * ----------------------
 */
typedef struct CreateCastStmt
{
	NodeTag		type;
	TypeName   *sourcetype;
	TypeName   *targettype;
	FuncWithArgs *func;
1672
	CoercionContext context;
1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687
} CreateCastStmt;

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


1688 1689 1690 1691 1692 1693
/* ----------------------
 *		PREPARE Statement
 * ----------------------
 */
typedef struct PrepareStmt
{
B
Bruce Momjian 已提交
1694 1695 1696 1697 1698
	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 */
1699 1700 1701 1702 1703 1704 1705 1706 1707 1708
} PrepareStmt;


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

typedef struct ExecuteStmt
{
B
Bruce Momjian 已提交
1709 1710 1711 1712
	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 */
1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725
} ExecuteStmt;


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

1726
#endif   /* PARSENODES_H */