primnodes.h 34.9 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * primnodes.h
4 5 6 7
 *	  Definitions for "primitive" node types, those that are used in more
 *	  than one of the parse/plan/execute stages of the query pipeline.
 *	  Currently, these are mostly nodes for executable expressions
 *	  and join trees.
8 9
 *
 *
P
 
PostgreSQL Daemon 已提交
10
 * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
B
Add:  
Bruce Momjian 已提交
11
 * Portions Copyright (c) 1994, Regents of the University of California
12
 *
13
 * $PostgreSQL: pgsql/src/include/nodes/primnodes.h,v 1.107 2005/04/06 16:34:07 tgl Exp $
14 15 16 17
 *
 *-------------------------------------------------------------------------
 */
#ifndef PRIMNODES_H
18
#define PRIMNODES_H
19

20 21
#include "access/attnum.h"
#include "nodes/pg_list.h"
22
#include "nodes/value.h"
23

24 25

/* ----------------------------------------------------------------
26
 *						node definitions
27 28 29
 * ----------------------------------------------------------------
 */

30 31 32 33
/*
 * Alias -
 *	  specifies an alias for a range variable; the alias might also
 *	  specify renaming of columns within the table.
34
 *
35 36
 * Note: colnames is a list of Value nodes (always strings).  In Alias structs
 * associated with RTEs, there may be entries corresponding to dropped
B
Bruce Momjian 已提交
37
 * columns; these are normally empty strings ("").	See parsenodes.h for info.
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
 */
typedef struct Alias
{
	NodeTag		type;
	char	   *aliasname;		/* aliased rel name (never qualified) */
	List	   *colnames;		/* optional list of column aliases */
} Alias;

typedef enum InhOption
{
	INH_NO,						/* Do NOT scan child tables */
	INH_YES,					/* DO scan child tables */
	INH_DEFAULT					/* Use current SQL_inheritance option */
} InhOption;

/*
 * RangeVar - range variable, used in FROM clauses
 *
 * Also used to represent table names in utility statements; there, the alias
 * field is not used, and inhOpt shows whether to apply the operation
 * recursively to child tables.  In some contexts it is also useful to carry
 * a TEMP table indication here.
 */
typedef struct RangeVar
{
	NodeTag		type;
	char	   *catalogname;	/* the catalog (database) name, or NULL */
	char	   *schemaname;		/* the schema name, or NULL */
	char	   *relname;		/* the relation/sequence name */
B
Bruce Momjian 已提交
67 68
	InhOption	inhOpt;			/* expand rel by inheritance? recursively
								 * act on children? */
69 70 71 72 73
	bool		istemp;			/* is this a temp relation/sequence? */
	Alias	   *alias;			/* table alias & optional column aliases */
} RangeVar;


74 75 76 77 78
/* ----------------------------------------------------------------
 *					node types for executable expressions
 * ----------------------------------------------------------------
 */

79
/*
80
 * Expr - generic superclass for executable-expression nodes
81
 *
82 83 84 85
 * All node types that are used in executable expression trees should derive
 * from Expr (that is, have Expr as their first field).  Since Expr only
 * contains NodeTag, this is a formality, but it is an easy form of
 * documentation.  See also the ExprState node types in execnodes.h.
86
 */
87 88
typedef struct Expr
{
89
	NodeTag		type;
90
} Expr;
91

92
/*
93
 * Var - expression node representing a variable (ie, a table column)
94 95 96 97 98 99 100 101 102
 *
 * Note: during parsing/planning, varnoold/varoattno are always just copies
 * of varno/varattno.  At the tail end of planning, Var nodes appearing in
 * upper-level plan nodes are reassigned to point to the outputs of their
 * subplans; for example, in a join node varno becomes INNER or OUTER and
 * varattno becomes the index of the proper element of that subplan's target
 * list.  But varnoold/varoattno continue to hold the original values.
 * The code doesn't really need varnoold/varoattno, but they are very useful
 * for debugging and interpreting completed plans, so we keep them around.
103
 */
104 105
#define    INNER		65000
#define    OUTER		65001
106

107 108
#define    PRS2_OLD_VARNO			1
#define    PRS2_NEW_VARNO			2
109

110 111
typedef struct Var
{
112
	Expr		xpr;
B
Bruce Momjian 已提交
113 114 115 116 117 118 119 120
	Index		varno;			/* index of this var's relation in the
								 * range table (could also be INNER or
								 * OUTER) */
	AttrNumber	varattno;		/* attribute number of this var, or zero
								 * for all */
	Oid			vartype;		/* pg_type tuple OID for the type of this
								 * var */
	int32		vartypmod;		/* pg_attribute typmod value */
121
	Index		varlevelsup;
B
Bruce Momjian 已提交
122 123 124 125 126 127 128

	/*
	 * for subquery variables referencing outer relations; 0 in a normal
	 * var, >0 means N levels up
	 */
	Index		varnoold;		/* original value of varno, for debugging */
	AttrNumber	varoattno;		/* original value of varattno */
129
} Var;
130

131
/*
132 133
 * Const
 */
134 135
typedef struct Const
{
136
	Expr		xpr;
137 138
	Oid			consttype;		/* PG_TYPE OID of the constant's datatype */
	int			constlen;		/* typlen of the constant's datatype */
139 140
	Datum		constvalue;		/* the constant's value */
	bool		constisnull;	/* whether the constant is null (if true,
141
								 * constvalue is undefined) */
B
Bruce Momjian 已提交
142 143 144 145
	bool		constbyval;		/* whether this datatype is passed by
								 * value. If true, then all the
								 * information is stored in the Datum. If
								 * false, then the Datum contains a
B
Bruce Momjian 已提交
146
								 * pointer to the information. */
147
} Const;
148 149 150

/* ----------------
 * Param
151 152
 *		paramkind - specifies the kind of parameter. The possible values
 *		for this field are specified in "params.h", and they are:
153
 *
154 155
 *		PARAM_NAMED: The parameter has a name, i.e. something
 *				like `$.salary' or `$.foobar'.
156
 *				In this case field `paramname' must be a valid name.
157
 *
158 159 160
 *		PARAM_NUM:	 The parameter has only a numeric identifier,
 *				i.e. something like `$1', `$2' etc.
 *				The number is contained in the `paramid' field.
161
 *
B
Bruce Momjian 已提交
162
 *		PARAM_EXEC:  The parameter is an internal executor parameter.
163
 *				It has a number contained in the `paramid' field.
164 165
 * ----------------
 */
166 167
typedef struct Param
{
168
	Expr		xpr;
169 170 171 172
	int			paramkind;		/* kind of parameter. See above */
	AttrNumber	paramid;		/* numeric ID for parameter ("$1") */
	char	   *paramname;		/* name for parameter ("$.foo") */
	Oid			paramtype;		/* PG_TYPE OID of parameter's datatype */
173
} Param;
174

175
/*
B
Bruce Momjian 已提交
176
 * Aggref
177
 */
B
Bruce Momjian 已提交
178
typedef struct Aggref
179
{
180
	Expr		xpr;
181 182
	Oid			aggfnoid;		/* pg_proc Oid of the aggregate */
	Oid			aggtype;		/* type Oid of result of the aggregate */
183
	Expr	   *target;			/* expression we are aggregating on */
184
	Index		agglevelsup;	/* > 0 if agg belongs to outer query */
B
Bruce Momjian 已提交
185 186
	bool		aggstar;		/* TRUE if argument was really '*' */
	bool		aggdistinct;	/* TRUE if it's agg(DISTINCT ...) */
187
} Aggref;
188

189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206
/* ----------------
 *	ArrayRef: describes an array subscripting operation
 *
 * An ArrayRef can describe fetching a single element from an array,
 * fetching a subarray (array slice), storing a single element into
 * an array, or storing a slice.  The "store" cases work with an
 * initial array value and a source value that is inserted into the
 * appropriate part of the array; the result of the operation is an
 * entire new modified array value.
 *
 * If reflowerindexpr = NIL, then we are fetching or storing a single array
 * element at the subscripts given by refupperindexpr.	Otherwise we are
 * fetching or storing an array slice, that is a rectangular subarray
 * with lower and upper bounds given by the index expressions.
 * reflowerindexpr must be the same length as refupperindexpr when it
 * is not NIL.
 *
 * Note: refrestype is NOT the element type, but the array type,
207
 * when doing subarray fetch or either type of store.
208 209 210 211 212 213 214
 * ----------------
 */
typedef struct ArrayRef
{
	Expr		xpr;
	Oid			refrestype;		/* type of the result of the ArrayRef
								 * operation */
215 216
	Oid			refarraytype;	/* type of the array proper */
	Oid			refelemtype;	/* type of the array elements */
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
	List	   *refupperindexpr;/* expressions that evaluate to upper
								 * array indexes */
	List	   *reflowerindexpr;/* expressions that evaluate to lower
								 * array indexes */
	Expr	   *refexpr;		/* the expression that evaluates to an
								 * array value */
	Expr	   *refassgnexpr;	/* expression for the source value, or
								 * NULL if fetch */
} ArrayRef;

/*
 * CoercionContext - distinguishes the allowed set of type casts
 *
 * NB: ordering of the alternatives is significant; later (larger) values
 * allow more casts than earlier ones.
 */
typedef enum CoercionContext
{
	COERCION_IMPLICIT,			/* coercion in context of expression */
	COERCION_ASSIGNMENT,		/* coercion in context of assignment */
	COERCION_EXPLICIT			/* explicit cast operation */
238
} CoercionContext;
239 240 241 242 243 244 245 246 247

/*
 * CoercionForm - information showing how to display a function-call node
 */
typedef enum CoercionForm
{
	COERCE_EXPLICIT_CALL,		/* display as a function call */
	COERCE_EXPLICIT_CAST,		/* display as an explicit cast */
	COERCE_IMPLICIT_CAST,		/* implicit cast, so hide it */
248
	COERCE_DONTCARE				/* special case for planner */
249
} CoercionForm;
250 251 252 253 254 255 256 257 258 259 260 261

/*
 * FuncExpr - expression node for a function call
 */
typedef struct FuncExpr
{
	Expr		xpr;
	Oid			funcid;			/* PG_PROC OID of the function */
	Oid			funcresulttype; /* PG_TYPE OID of result value */
	bool		funcretset;		/* true if function returns set */
	CoercionForm funcformat;	/* how to display this function call */
	List	   *args;			/* arguments to the function */
262
} FuncExpr;
263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280

/*
 * OpExpr - expression node for an operator invocation
 *
 * Semantically, this is essentially the same as a function call.
 *
 * Note that opfuncid is not necessarily filled in immediately on creation
 * of the node.  The planner makes sure it is valid before passing the node
 * tree to the executor, but during parsing/planning opfuncid is typically 0.
 */
typedef struct OpExpr
{
	Expr		xpr;
	Oid			opno;			/* PG_OPERATOR OID of the operator */
	Oid			opfuncid;		/* PG_PROC OID of underlying function */
	Oid			opresulttype;	/* PG_TYPE OID of result value */
	bool		opretset;		/* true if operator returns set */
	List	   *args;			/* arguments to the operator (1 or 2) */
281
} OpExpr;
282 283 284 285 286 287 288 289 290 291 292 293 294

/*
 * DistinctExpr - expression node for "x IS DISTINCT FROM y"
 *
 * Except for the nodetag, this is represented identically to an OpExpr
 * referencing the "=" operator for x and y.
 * We use "=", not the more obvious "<>", because more datatypes have "="
 * than "<>".  This means the executor must invert the operator result.
 * Note that the operator function won't be called at all if either input
 * is NULL, since then the result can be determined directly.
 */
typedef OpExpr DistinctExpr;

295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
/*
 * ScalarArrayOpExpr - expression node for "scalar op ANY/ALL (array)"
 *
 * The operator must yield boolean.  It is applied to the left operand
 * and each element of the righthand array, and the results are combined
 * with OR or AND (for ANY or ALL respectively).  The node representation
 * is almost the same as for the underlying operator, but we need a useOr
 * flag to remember whether it's ANY or ALL, and we don't have to store
 * the result type because it must be boolean.
 */
typedef struct ScalarArrayOpExpr
{
	Expr		xpr;
	Oid			opno;			/* PG_OPERATOR OID of the operator */
	Oid			opfuncid;		/* PG_PROC OID of underlying function */
	bool		useOr;			/* true for ANY, false for ALL */
	List	   *args;			/* the scalar and array operands */
312
} ScalarArrayOpExpr;
313

314 315 316 317 318
/*
 * BoolExpr - expression node for the basic Boolean operators AND, OR, NOT
 *
 * Notice the arguments are given as a List.  For NOT, of course the list
 * must always have exactly one element.  For AND and OR, the executor can
B
Bruce Momjian 已提交
319
 * handle any number of arguments.	The parser treats AND and OR as binary
320 321 322 323 324 325
 * and so it only produces two-element lists, but the optimizer will flatten
 * trees of AND and OR nodes to produce longer lists when possible.
 */
typedef enum BoolExprType
{
	AND_EXPR, OR_EXPR, NOT_EXPR
326
} BoolExprType;
327 328 329 330 331 332

typedef struct BoolExpr
{
	Expr		xpr;
	BoolExprType boolop;
	List	   *args;			/* arguments to this expression */
333
} BoolExpr;
334

335 336
/* ----------------
 * SubLink
337
 *
B
Bruce Momjian 已提交
338 339 340
 * A SubLink represents a subselect appearing in an expression, and in some
 * cases also the combining operator(s) just above it.	The subLinkType
 * indicates the form of the expression represented:
341 342 343 344 345
 *	EXISTS_SUBLINK		EXISTS(SELECT ...)
 *	ALL_SUBLINK			(lefthand) op ALL (SELECT ...)
 *	ANY_SUBLINK			(lefthand) op ANY (SELECT ...)
 *	MULTIEXPR_SUBLINK	(lefthand) op (SELECT ...)
 *	EXPR_SUBLINK		(SELECT with single targetlist item ...)
346
 *	ARRAY_SUBLINK		ARRAY(SELECT with single targetlist item ...)
347 348 349 350 351 352
 * For ALL, ANY, and MULTIEXPR, the lefthand is a list of expressions of the
 * same length as the subselect's targetlist.  MULTIEXPR will *always* have
 * a list with more than one entry; if the subselect has just one target
 * then the parser will create an EXPR_SUBLINK instead (and any operator
 * above the subselect will be represented separately).  Note that both
 * MULTIEXPR and EXPR require the subselect to deliver only one row.
353 354
 * ARRAY requires just one target column, and creates an array of the target
 * column's type using one or more rows resulting from the subselect.
355 356
 * ALL, ANY, and MULTIEXPR require the combining operators to deliver boolean
 * results.  These are reduced to one result per row using OR or AND semantics
357
 * depending on the "useOr" flag.  ALL and ANY combine the per-row results
358 359
 * using AND and OR semantics respectively.
 *
360
 * SubLink is classed as an Expr node, but it is not actually executable;
361
 * it must be replaced in the expression tree by a SubPlan node during
362 363
 * planning.
 *
364 365
 * NOTE: in the raw output of gram.y, lefthand contains a list of raw
 * expressions; useOr and operOids are not filled in yet.  Also, subselect
B
Bruce Momjian 已提交
366
 * is a raw parsetree.	During parse analysis, the parser transforms the
367
 * lefthand expression list using normal expression transformation rules.
368 369 370 371
 * It fills operOids with the OIDs representing the specific operator(s)
 * to apply to each pair of lefthand and targetlist expressions.
 * And subselect is transformed to a Query.  This is the representation
 * seen in saved rules and in the rewriter.
372
 *
373 374 375
 * In EXISTS, EXPR, and ARRAY SubLinks, lefthand, operName, and operOids are
 * unused and are always NIL.  useOr is not significant either for these
 * sublink types.
376 377 378 379
 * ----------------
 */
typedef enum SubLinkType
{
380 381 382 383 384 385
	EXISTS_SUBLINK,
	ALL_SUBLINK,
	ANY_SUBLINK,
	MULTIEXPR_SUBLINK,
	EXPR_SUBLINK,
	ARRAY_SUBLINK
386 387 388 389 390
} SubLinkType;


typedef struct SubLink
{
391
	Expr		xpr;
B
Bruce Momjian 已提交
392
	SubLinkType subLinkType;	/* EXISTS, ALL, ANY, MULTIEXPR, EXPR */
393
	bool		useOr;			/* TRUE to combine column results with
B
Bruce Momjian 已提交
394 395 396
								 * "OR" not "AND" */
	List	   *lefthand;		/* list of outer-query expressions on the
								 * left */
397 398
	List	   *operName;		/* originally specified operator name */
	List	   *operOids;		/* OIDs of actual combining operators */
B
Bruce Momjian 已提交
399
	Node	   *subselect;		/* subselect as Query* or parsetree */
400 401
} SubLink;

402
/*
403 404 405 406
 * SubPlan - executable expression node for a subplan (sub-SELECT)
 *
 * The planner replaces SubLink nodes in expression trees with SubPlan
 * nodes after it has finished planning the subquery.  SubPlan contains
407 408 409 410 411 412
 * a sub-plantree and rtable instead of a sub-Query.
 *
 * In an ordinary subplan, "exprs" points to a list of executable expressions
 * (OpExpr trees) for the combining operators; their left-hand arguments are
 * the original lefthand expressions, and their right-hand arguments are
 * PARAM_EXEC Param nodes representing the outputs of the sub-select.
B
Bruce Momjian 已提交
413
 * (NOTE: runtime coercion functions may be inserted as well.)	But if the
414 415 416
 * sub-select becomes an initplan rather than a subplan, these executable
 * expressions are part of the outer plan's expression tree (and the SubPlan
 * node itself is not).  In this case "exprs" is NIL to avoid duplication.
417
 *
418
 * The planner also derives lists of the values that need to be passed into
B
Bruce Momjian 已提交
419
 * and out of the subplan.	Input values are represented as a list "args" of
420 421 422
 * expressions to be evaluated in the outer-query context (currently these
 * args are always just Vars, but in principle they could be any expression).
 * The values are assigned to the global PARAM_EXEC params indexed by parParam
423
 * (the parParam and args lists must have the same ordering).  setParam is a
424
 * list of the PARAM_EXEC params that are computed by the sub-select, if it
425 426 427
 * is an initplan; they are listed in order by sub-select output column
 * position.  (parParam and setParam are integer Lists, not Bitmapsets,
 * because their ordering is significant.)
428
 */
429
typedef struct SubPlan
430
{
431
	Expr		xpr;
432 433
	/* Fields copied from original SubLink: */
	SubLinkType subLinkType;	/* EXISTS, ALL, ANY, MULTIEXPR, EXPR */
434
	bool		useOr;			/* TRUE to combine column results with
435
								 * "OR" not "AND" */
436 437 438
	/* The combining operators, transformed to executable expressions: */
	List	   *exprs;			/* list of OpExpr expression trees */
	List	   *paramIds;		/* IDs of Params embedded in the above */
439
	/* Note: paramIds has a one-to-one correspondence to the exprs list */
440
	/* The subselect, transformed to a Plan: */
441 442 443 444 445 446
	struct Plan *plan;			/* subselect plan itself */
	int			plan_id;		/* dummy thing because of we haven't equal
								 * funcs for plan nodes... actually, we
								 * could put *plan itself somewhere else
								 * (TopPlan node ?)... */
	List	   *rtable;			/* range table for subselect */
447
	/* Information about execution strategy: */
B
Bruce Momjian 已提交
448 449 450
	bool		useHashTable;	/* TRUE to store subselect output in a
								 * hash table (implies we are doing "IN") */
	bool		unknownEqFalse; /* TRUE if it's okay to return FALSE when
451 452
								 * the spec result is UNKNOWN; this allows
								 * much simpler handling of null values */
453
	/* Information for passing params into and out of the subselect: */
454
	/* setParam and parParam are lists of integers (param IDs) */
455 456
	List	   *setParam;		/* initplan subqueries have to set these
								 * Params for parent plan */
B
Bruce Momjian 已提交
457 458
	List	   *parParam;		/* indices of input Params from parent
								 * plan */
459
	List	   *args;			/* exprs to pass as parParam values */
460
} SubPlan;
461

462 463 464 465
/* ----------------
 * FieldSelect
 *
 * FieldSelect represents the operation of extracting one field from a tuple
466 467
 * value.  At runtime, the input expression is expected to yield a rowtype
 * Datum.  The specified field number is extracted and returned as a Datum.
468 469 470 471 472
 * ----------------
 */

typedef struct FieldSelect
{
473 474
	Expr		xpr;
	Expr	   *arg;			/* input expression */
475 476 477 478
	AttrNumber	fieldnum;		/* attribute number of field to extract */
	Oid			resulttype;		/* type of the field (result type of this
								 * node) */
	int32		resulttypmod;	/* output typmod (usually -1) */
479 480
} FieldSelect;

481 482 483 484 485 486 487 488 489
/* ----------------
 * FieldStore
 *
 * FieldStore represents the operation of modifying one field in a tuple
 * value, yielding a new tuple value (the input is not touched!).  Like
 * the assign case of ArrayRef, this is used to implement UPDATE of a
 * portion of a column.
 *
 * A single FieldStore can actually represent updates of several different
B
Bruce Momjian 已提交
490
 * fields.	The parser only generates FieldStores with single-element lists,
491 492 493 494 495 496 497 498 499 500 501 502 503 504 505
 * but the planner will collapse multiple updates of the same base column
 * into one FieldStore.
 * ----------------
 */

typedef struct FieldStore
{
	Expr		xpr;
	Expr	   *arg;			/* input tuple value */
	List	   *newvals;		/* new value(s) for field(s) */
	List	   *fieldnums;		/* integer list of field attnums */
	Oid			resulttype;		/* type of result (same as type of arg) */
	/* Like RowExpr, we deliberately omit a typmod here */
} FieldStore;

506 507 508 509 510 511 512 513 514 515 516 517 518 519 520
/* ----------------
 * RelabelType
 *
 * RelabelType represents a "dummy" type coercion between two binary-
 * compatible datatypes, such as reinterpreting the result of an OID
 * expression as an int4.  It is a no-op at runtime; we only need it
 * to provide a place to store the correct type to be attributed to
 * the expression result during type resolution.  (We can't get away
 * with just overwriting the type field of the input expression node,
 * so we need a separate node to show the coercion's result type.)
 * ----------------
 */

typedef struct RelabelType
{
521 522
	Expr		xpr;
	Expr	   *arg;			/* input expression */
523 524
	Oid			resulttype;		/* output type of coercion expression */
	int32		resulttypmod;	/* output typmod (usually -1) */
B
Bruce Momjian 已提交
525
	CoercionForm relabelformat; /* how to display this node */
526 527
} RelabelType;

528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548
/* ----------------
 * ConvertRowtypeExpr
 *
 * ConvertRowtypeExpr represents a type coercion from one composite type
 * to another, where the source type is guaranteed to contain all the columns
 * needed for the destination type plus possibly others; the columns need not
 * be in the same positions, but are matched up by name.  This is primarily
 * used to convert a whole-row value of an inheritance child table into a
 * valid whole-row value of its parent table's rowtype.
 * ----------------
 */

typedef struct ConvertRowtypeExpr
{
	Expr		xpr;
	Expr	   *arg;			/* input expression */
	Oid			resulttype;		/* output type (always a composite type) */
	/* result typmod is not stored, but must be -1; see RowExpr comments */
	CoercionForm convertformat; /* how to display this node */
} ConvertRowtypeExpr;

549
/*----------
550
 * CaseExpr - a CASE expression
551 552 553 554 555 556 557 558
 *
 * We support two distinct forms of CASE expression:
 *		CASE WHEN boolexpr THEN expr [ WHEN boolexpr THEN expr ... ]
 *		CASE testexpr WHEN compexpr THEN expr [ WHEN compexpr THEN expr ... ]
 * These are distinguishable by the "arg" field being NULL in the first case
 * and the testexpr in the second case.
 *
 * In the raw grammar output for the second form, the condition expressions
B
Bruce Momjian 已提交
559
 * of the WHEN clauses are just the comparison values.	Parse analysis
560 561 562 563 564 565 566 567 568 569
 * converts these to valid boolean expressions of the form
 *		CaseTestExpr '=' compexpr
 * where the CaseTestExpr node is a placeholder that emits the correct
 * value at runtime.  This structure is used so that the testexpr need be
 * evaluated only once.  Note that after parse analysis, the condition
 * expressions always yield boolean.
 *
 * Note: we can test whether a CaseExpr has been through parse analysis
 * yet by checking whether casetype is InvalidOid or not.
 *----------
570 571 572 573 574 575 576 577 578 579 580
 */
typedef struct CaseExpr
{
	Expr		xpr;
	Oid			casetype;		/* type of expression result */
	Expr	   *arg;			/* implicit equality comparison argument */
	List	   *args;			/* the arguments (list of WHEN clauses) */
	Expr	   *defresult;		/* the default result (ELSE clause) */
} CaseExpr;

/*
581
 * CaseWhen - one arm of a CASE expression
582 583 584 585 586 587 588 589
 */
typedef struct CaseWhen
{
	Expr		xpr;
	Expr	   *expr;			/* condition expression */
	Expr	   *result;			/* substitution result */
} CaseWhen;

590 591 592 593
/*
 * Placeholder node for the test value to be processed by a CASE expression.
 * This is effectively like a Param, but can be implemented more simply
 * since we need only one replacement value at a time.
594 595 596
 *
 * We also use this in nested UPDATE expressions.
 * See transformAssignmentIndirection().
597 598 599 600 601 602 603 604
 */
typedef struct CaseTestExpr
{
	Expr		xpr;
	Oid			typeId;			/* type for substituted value */
	int32		typeMod;		/* typemod for substituted value */
} CaseTestExpr;

605 606 607
/*
 * ArrayExpr - an ARRAY[] expression
 *
608 609 610 611
 * Note: if multidims is false, the constituent expressions all yield the
 * scalar type identified by element_typeid.  If multidims is true, the
 * constituent expressions all yield arrays of element_typeid (ie, the same
 * type as array_typeid); at runtime we must check for compatible subscripts.
612 613 614 615 616
 */
typedef struct ArrayExpr
{
	Expr		xpr;
	Oid			array_typeid;	/* type of expression result */
617 618 619
	Oid			element_typeid; /* common type of array elements */
	List	   *elements;		/* the array elements or sub-arrays */
	bool		multidims;		/* true if elements are sub-arrays */
620
} ArrayExpr;
621

622 623
/*
 * RowExpr - a ROW() expression
624 625 626
 *
 * Note: the list of fields must have a one-for-one correspondence with
 * physical fields of the associated rowtype, although it is okay for it
B
Bruce Momjian 已提交
627
 * to be shorter than the rowtype.	That is, the N'th list element must
628 629
 * match up with the N'th physical field.  When the N'th physical field
 * is a dropped column (attisdropped) then the N'th list element can just
B
Bruce Momjian 已提交
630
 * be a NULL constant.	(This case can only occur for named composite types,
631 632 633
 * not RECORD types, since those are built from the RowExpr itself rather
 * than vice versa.)  It is important not to assume that length(args) is
 * the same as the number of columns logically present in the rowtype.
634 635 636 637 638 639
 */
typedef struct RowExpr
{
	Expr		xpr;
	List	   *args;			/* the fields */
	Oid			row_typeid;		/* RECORDOID or a composite type's ID */
B
Bruce Momjian 已提交
640

641 642 643 644 645 646 647 648 649
	/*
	 * Note: we deliberately do NOT store a typmod.  Although a typmod
	 * will be associated with specific RECORD types at runtime, it will
	 * differ for different backends, and so cannot safely be stored in
	 * stored parsetrees.  We must assume typmod -1 for a RowExpr node.
	 */
	CoercionForm row_format;	/* how to display this node */
} RowExpr;

650 651 652 653 654
/*
 * CoalesceExpr - a COALESCE expression
 */
typedef struct CoalesceExpr
{
B
Bruce Momjian 已提交
655 656 657
	Expr		xpr;
	Oid			coalescetype;	/* type of expression result */
	List	   *args;			/* the arguments */
658
} CoalesceExpr;
659 660 661 662 663 664 665 666 667

/*
 * NullIfExpr - a NULLIF expression
 *
 * Like DistinctExpr, this is represented the same as an OpExpr referencing
 * the "=" operator for x and y.
 */
typedef OpExpr NullIfExpr;

668 669 670 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 698 699 700 701 702 703 704 705 706 707 708 709 710 711
/* ----------------
 * NullTest
 *
 * 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.
 * ----------------
 */

typedef enum NullTestType
{
	IS_NULL, IS_NOT_NULL
} NullTestType;

typedef struct NullTest
{
	Expr		xpr;
	Expr	   *arg;			/* input expression */
	NullTestType nulltesttype;	/* IS NULL, IS NOT NULL */
} NullTest;

/*
 * 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.
 */

typedef enum BoolTestType
{
	IS_TRUE, IS_NOT_TRUE, IS_FALSE, IS_NOT_FALSE, IS_UNKNOWN, IS_NOT_UNKNOWN
} BoolTestType;

typedef struct BooleanTest
{
	Expr		xpr;
	Expr	   *arg;			/* input expression */
	BoolTestType booltesttype;	/* test type */
} BooleanTest;

/*
712
 * CoerceToDomain
713
 *
714 715
 * CoerceToDomain represents the operation of coercing a value to a domain
 * type.  At runtime (and not before) the precise set of constraints to be
B
Bruce Momjian 已提交
716 717
 * checked will be determined.	If the value passes, it is returned as the
 * result; if not, an error is raised.	Note that this is equivalent to
718
 * RelabelType in the scenario where no constraints are applied.
719
 */
720
typedef struct CoerceToDomain
721 722 723
{
	Expr		xpr;
	Expr	   *arg;			/* input expression */
724 725
	Oid			resulttype;		/* domain type ID (result type) */
	int32		resulttypmod;	/* output typmod (currently always -1) */
B
Bruce Momjian 已提交
726
	CoercionForm coercionformat;	/* how to display this node */
727
} CoerceToDomain;
728 729

/*
730
 * Placeholder node for the value to be processed by a domain's check
B
Bruce Momjian 已提交
731
 * constraint.	This is effectively like a Param, but can be implemented more
732 733 734 735 736
 * simply since we need only one replacement value at a time.
 *
 * Note: the typeId/typeMod will be set from the domain's base type, not
 * the domain itself.  This is because we shouldn't consider the value to
 * be a member of the domain if we haven't yet checked its constraints.
737
 */
738
typedef struct CoerceToDomainValue
739 740
{
	Expr		xpr;
741 742
	Oid			typeId;			/* type for substituted value */
	int32		typeMod;		/* typemod for substituted value */
743
} CoerceToDomainValue;
744

745 746 747 748
/*
 * Placeholder node for a DEFAULT marker in an INSERT or UPDATE command.
 *
 * This is not an executable expression: it must be replaced by the actual
B
Bruce Momjian 已提交
749
 * column default expression during rewriting.	But it is convenient to
750 751 752 753 754 755 756
 * treat it as an expression node during parsing and rewriting.
 */
typedef struct SetToDefault
{
	Expr		xpr;
	Oid			typeId;			/* type for substituted value */
	int32		typeMod;		/* typemod for substituted value */
757
} SetToDefault;
758

759
/*--------------------
760 761 762 763 764 765 766 767
 * TargetEntry -
 *	   a target entry (used in query target lists)
 *
 * Strictly speaking, a TargetEntry isn't an expression node (since it can't
 * be evaluated by ExecEvalExpr).  But we treat it as one anyway, since in
 * very many places it's convenient to process a whole query targetlist as a
 * single expression tree.
 *
768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811
 * In a SELECT's targetlist, resno should always be equal to the item's
 * ordinal position (counting from 1).	However, in an INSERT or UPDATE
 * targetlist, resno represents the attribute number of the destination
 * column for the item; so there may be missing or out-of-order resnos.
 * It is even legal to have duplicated resnos; consider
 *		UPDATE table SET arraycol[1] = ..., arraycol[2] = ..., ...
 * The two meanings come together in the executor, because the planner
 * transforms INSERT/UPDATE tlists into a normalized form with exactly
 * one entry for each column of the destination table.	Before that's
 * happened, however, it is risky to assume that resno == position.
 * Generally get_tle_by_resno() should be used rather than list_nth()
 * to fetch tlist entries by resno, and only in SELECT should you assume
 * that resno is a unique identifier.
 *
 * resname is required to represent the correct column name in non-resjunk
 * entries of top-level SELECT targetlists, since it will be used as the
 * column title sent to the frontend.  In most other contexts it is only
 * a debugging aid, and may be wrong or even NULL.	(In particular, it may
 * be wrong in a tlist from a stored rule, if the referenced column has been
 * renamed by ALTER TABLE since the rule was made.	Also, the planner tends
 * to store NULL rather than look up a valid name for tlist entries in
 * non-toplevel plan nodes.)  In resjunk entries, resname should be either
 * a specific system-generated name (such as "ctid") or NULL; anything else
 * risks confusing ExecGetJunkAttribute!
 *
 * ressortgroupref is used in the representation of ORDER BY and
 * GROUP BY items.	Targetlist entries with ressortgroupref=0 are not
 * sort/group items.  If ressortgroupref>0, then this item is an ORDER BY or
 * GROUP BY value.	No two entries in a targetlist may have the same nonzero
 * ressortgroupref --- but there is no particular meaning to the nonzero
 * values, except as tags.	(For example, one must not assume that lower
 * ressortgroupref means a more significant sort key.)	The order of the
 * associated SortClause or GroupClause lists determine the semantics.
 *
 * resorigtbl/resorigcol identify the source of the column, if it is a
 * simple reference to a column of a base table (or view).	If it is not
 * a simple reference, these fields are zeroes.
 *
 * If resjunk is true then the column is a working column (such as a sort key)
 * that should be removed from the final output of the query.  Resjunk columns
 * must have resnos that cannot duplicate any regular column's resno.  Also
 * note that there are places that assume resjunk columns come after non-junk
 * columns.
 *--------------------
812 813 814 815 816
 */
typedef struct TargetEntry
{
	Expr		xpr;
	Expr	   *expr;			/* expression to evaluate */
817 818 819 820 821 822 823 824
	AttrNumber	resno;			/* attribute number (see notes above) */
	char	   *resname;		/* name of the column (could be NULL) */
	Index		ressortgroupref;/* nonzero if referenced by a sort/group
								 * clause */
	Oid			resorigtbl;		/* OID of column's source table */
	AttrNumber	resorigcol;		/* column's number in source table */
	bool		resjunk;		/* set to true to eliminate the attribute
								 * from final target list */
825 826
} TargetEntry;

827 828 829 830 831 832

/* ----------------------------------------------------------------
 *					node types for join trees
 *
 * The leaves of a join tree structure are RangeTblRef nodes.  Above
 * these, JoinExpr nodes can appear to denote a specific kind of join
833 834 835 836 837 838 839 840 841 842 843 844
 * or qualified join.  Also, FromExpr nodes can appear to denote an
 * ordinary cross-product join ("FROM foo, bar, baz WHERE ...").
 * FromExpr is like a JoinExpr of jointype JOIN_INNER, except that it
 * may have any number of child nodes, not just two.  Also, there is an
 * implementation-defined difference: the planner is allowed to join the
 * children of a FromExpr using whatever join order seems good to it.
 * At present, JoinExpr nodes are always joined in exactly the order
 * implied by the jointree structure (except the planner may choose to
 * swap inner and outer members of a join pair).
 *
 * NOTE: the top level of a Query's jointree is always a FromExpr.
 * Even if the jointree contains no rels, there will be a FromExpr.
845 846
 *
 * NOTE: the qualification expressions present in JoinExpr nodes are
847
 * *in addition to* the query's main WHERE clause, which appears as the
B
Bruce Momjian 已提交
848
 * qual of the top-level FromExpr.	The reason for associating quals with
849 850 851 852 853
 * specific nodes in the jointree is that the position of a qual is critical
 * when outer joins are present.  (If we enforce a qual too soon or too late,
 * that may cause the outer join to produce the wrong set of NULL-extended
 * rows.)  If all joins are inner joins then all the qual positions are
 * semantically interchangeable.
854
 *
855 856 857 858 859
 * NOTE: in the raw output of gram.y, a join tree contains RangeVar,
 * RangeSubselect, and RangeFunction nodes, which are all replaced by
 * RangeTblRef nodes during the parse analysis phase.  Also, the top-level
 * FromExpr is added during parse analysis; the grammar regards FROM and
 * WHERE as separate.
860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878
 * ----------------------------------------------------------------
 */

/*
 * RangeTblRef - reference to an entry in the query's rangetable
 *
 * We could use direct pointers to the RT entries and skip having these
 * nodes, but multiple pointers to the same node in a querytree cause
 * lots of headaches, so it seems better to store an index into the RT.
 */
typedef struct RangeTblRef
{
	NodeTag		type;
	int			rtindex;
} RangeTblRef;

/*----------
 * JoinExpr - for SQL JOIN expressions
 *
B
Bruce Momjian 已提交
879
 * isNatural, using, and quals are interdependent.	The user can write only
880 881 882 883
 * one of NATURAL, USING(), or ON() (this is enforced by the grammar).
 * If he writes NATURAL then parse analysis generates the equivalent USING()
 * list, and from that fills in "quals" with the right equality comparisons.
 * If he writes USING() then "quals" is filled with equality comparisons.
B
Bruce Momjian 已提交
884
 * If he writes ON() then only "quals" is set.	Note that NATURAL/USING
885 886
 * are not equivalent to ON() since they also affect the output column list.
 *
887
 * alias is an Alias node representing the AS alias-clause attached to the
888 889 890 891
 * join expression, or NULL if no clause.  NB: presence or absence of the
 * alias has a critical impact on semantics, because a join with an alias
 * restricts visibility of the tables/columns inside it.
 *
892
 * During parse analysis, an RTE is created for the Join, and its index
B
Bruce Momjian 已提交
893
 * is filled into rtindex.	This RTE is present mainly so that Vars can
894
 * be created that refer to the outputs of the join.
895 896 897 898 899 900 901 902 903 904 905
 *----------
 */
typedef struct JoinExpr
{
	NodeTag		type;
	JoinType	jointype;		/* type of join */
	bool		isNatural;		/* Natural join? Will need to shape table */
	Node	   *larg;			/* left subtree */
	Node	   *rarg;			/* right subtree */
	List	   *using;			/* USING clause, if any (list of String) */
	Node	   *quals;			/* qualifiers on join, if any */
906
	Alias	   *alias;			/* user-written alias clause, if any */
907
	int			rtindex;		/* RT index assigned for join */
908 909
} JoinExpr;

910 911 912 913 914 915 916 917 918 919 920 921 922 923 924
/*----------
 * FromExpr - represents a FROM ... WHERE ... construct
 *
 * This is both more flexible than a JoinExpr (it can have any number of
 * children, including zero) and less so --- we don't need to deal with
 * aliases and so on.  The output column set is implicitly just the union
 * of the outputs of the children.
 *----------
 */
typedef struct FromExpr
{
	NodeTag		type;
	List	   *fromlist;		/* List of join subtrees */
	Node	   *quals;			/* qualifiers on join, if any */
} FromExpr;
925

926
#endif   /* PRIMNODES_H */