primnodes.h 16.1 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * primnodes.h
4
 *	  Definitions for parse tree/query tree ("primitive") nodes.
5 6 7 8
 *
 *
 * Copyright (c) 1994, Regents of the University of California
 *
9
 * $Id: primnodes.h,v 1.37 1999/11/15 02:00:15 tgl Exp $
10 11 12 13
 *
 *-------------------------------------------------------------------------
 */
#ifndef PRIMNODES_H
14
#define PRIMNODES_H
15

16 17
#include "access/attnum.h"
#include "nodes/pg_list.h"
B
Bruce Momjian 已提交
18
#include "utils/fcache.h"
19 20

/* ----------------------------------------------------------------
21
 *						node definitions
22 23 24 25 26
 * ----------------------------------------------------------------
 */

/* ----------------
 * Resdom (Result Domain)
27
 *		resno			- attribute number
28 29
 *		restype			- type of the value
 *		restypmod		- type-specific modifier of the value
30
 *		resname			- name of the resdom (could be NULL)
31
 *		ressortgroupref	- nonzero if referenced by a sort/group clause
32
 *		reskey			- order of key in a sort (for those > 0)
33
 *		reskeyop		- sort operator's regproc Oid
B
Bruce Momjian 已提交
34 35
 *		resjunk			- set to true to eliminate the attribute
 *						  from final target list
36
 *
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
 * Notes:
 * ressortgroupref is the parse/plan-time 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.
 *
 * reskey and reskeyop are the execution-time representation of sorting.
 * reskey must be zero in any non-sort-key item.  The reskey of sort key
 * targetlist items for a sort plan node is 1,2,...,n for the n sort keys.
 * The reskeyop of each such targetlist item is the sort operator's
 * regproc OID.  reskeyop will be zero in non-sort-key items.
 *
 * Both reskey and reskeyop are typically zero during parse/plan stages.
 * The executor does not pay any attention to ressortgroupref.
55 56
 * ----------------
 */
57 58
typedef struct Resdom
{
59 60 61
	NodeTag		type;
	AttrNumber	resno;
	Oid			restype;
62
	int32		restypmod;
63
	char	   *resname;
64
	Index		ressortgroupref;
65 66
	Index		reskey;
	Oid			reskeyop;
B
Bruce Momjian 已提交
67
	bool		resjunk;
68
} Resdom;
69 70 71

/* -------------
 * Fjoin
72 73 74 75 76 77 78 79 80 81 82 83 84 85
 *		initialized		- true if the Fjoin has already been initialized for
 *						  the current target list evaluation
 *		nNodes			- The number of Iter nodes returning sets that the
 *						  node will flatten
 *		outerList		- 1 or more Iter nodes
 *		inner			- exactly one Iter node.  We eval every node in the
 *						  outerList once then eval the inner node to completion
 *						  pair the outerList result vector with each inner
 *						  result to form the full result.  When the inner has
 *						  been exhausted, we get the next outer result vector
 *						  and reset the inner.
 *		results			- The complete (flattened) result vector
 *		alwaysNull		- a null vector to indicate sets with a cardinality of
 *						  0, we treat them as the set {NULL}.
86
 */
87 88
typedef struct Fjoin
{
89 90 91 92 93 94
	NodeTag		type;
	bool		fj_initialized;
	int			fj_nNodes;
	List	   *fj_innerNode;
	DatumPtr	fj_results;
	BoolPtr		fj_alwaysDone;
95
} Fjoin;
96 97 98

/* ----------------
 * Expr
99 100
 *		typeOid			- oid of the type of this expression
 *		opType			- type of this expression
101
 *		oper			- operator node if needed (Oper, Func, or SubPlan)
102
 *		args			- arguments to this expression
103 104
 * ----------------
 */
105 106
typedef enum OpType
{
107
	OP_EXPR, FUNC_EXPR, OR_EXPR, AND_EXPR, NOT_EXPR, SUBPLAN_EXPR
108
} OpType;
109

110 111
typedef struct Expr
{
112 113 114
	NodeTag		type;
	Oid			typeOid;		/* oid of the type of this expr */
	OpType		opType;			/* type of the op */
115
	Node	   *oper;			/* could be Oper or Func or SubPlan */
116
	List	   *args;			/* list of argument nodes */
117
} Expr;
118 119 120

/* ----------------
 * Var
121
 *		varno			- index of this var's relation in the range table
122
 *						  (could also be INNER or OUTER)
123
 *		varattno		- attribute number of this var, or zero for all
124
 *		vartype			- pg_type tuple OID for the type of this var
125
 *		vartypmod		- pg_attribute typmod value
126 127 128 129 130 131 132 133 134 135 136 137 138
 *		varlevelsup		- for subquery variables referencing outer relations;
 *						  0 in a normal var, >0 means N levels up
 *		varnoold		- original value of varno
 *		varoattno		- original value of varattno
 *
 * 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.
139 140
 * ----------------
 */
141 142
#define    INNER		65000
#define    OUTER		65001
143

144 145
#define    PRS2_CURRENT_VARNO			1
#define    PRS2_NEW_VARNO				2
146

147 148
typedef struct Var
{
149 150 151 152
	NodeTag		type;
	Index		varno;
	AttrNumber	varattno;
	Oid			vartype;
153
	int32		vartypmod;
154
	Index		varlevelsup;	/* erased by upper optimizer */
155 156
	Index		varnoold;		/* mainly for debugging --- see above */
	AttrNumber	varoattno;
157
} Var;
158 159 160

/* ----------------
 * Oper
161 162 163 164 165
 *		opno			- PG_OPERATOR OID of the operator
 *		opid			- PG_PROC OID for the operator
 *		opresulttype	- PG_TYPE OID of the operator's return value
 *		opsize			- size of return result (cached by executor)
 *		op_fcache		- XXX comment me.
166 167 168
 *
 * ----
 * NOTE: in the good old days 'opno' used to be both (or either, or
169
 * neither) the pg_operator oid, and/or the pg_proc oid depending
170 171 172 173 174 175
 * on the postgres module in question (parser->pg_operator,
 * executor->pg_proc, planner->both), the mood of the programmer,
 * and the phase of the moon (rumors that it was also depending on the day
 * of the week are probably false). To make things even more postgres-like
 * (i.e. a mess) some comments were referring to 'opno' using the name
 * 'opid'. Anyway, now we have two separate fields, and of course that
176
 * immediately removes all bugs from the code...		[ sp :-) ].
177 178
 * ----------------
 */
179 180
typedef struct Oper
{
181 182 183 184 185
	NodeTag		type;
	Oid			opno;
	Oid			opid;
	Oid			opresulttype;
	int			opsize;
186
	FunctionCachePtr op_fcache;
187
} Oper;
188 189 190 191


/* ----------------
 * Const
192 193 194 195 196 197 198 199 200 201 202 203
 *		consttype - PG_TYPE OID of the constant's value
 *		constlen - length in bytes of the constant's value
 *		constvalue - the constant's value
 *		constisnull - whether the constant is null
 *				(if true, the other fields are undefined)
 *		constbyval - whether the information in constvalue
 *				if passed by value.  If true, then all the information
 *				is stored in the datum. If false, then the datum
 *				contains a pointer to the information.
 *		constisset - whether the const represents a set.  The const
 *				value corresponding will be the query that defines
 *				the set.
204 205
 * ----------------
 */
206 207
typedef struct Const
{
208 209
	NodeTag		type;
	Oid			consttype;
210
	int			constlen;
211 212 213 214 215
	Datum		constvalue;
	bool		constisnull;
	bool		constbyval;
	bool		constisset;
	bool		constiscast;
216
} Const;
217 218 219

/* ----------------
 * Param
220 221
 *		paramkind - specifies the kind of parameter. The possible values
 *		for this field are specified in "params.h", and they are:
222
 *
223 224 225
 *		PARAM_NAMED: The parameter has a name, i.e. something
 *				like `$.salary' or `$.foobar'.
 *				In this case field `paramname' must be a valid Name.
226
 *
227 228 229
 *		PARAM_NUM:	 The parameter has only a numeric identifier,
 *				i.e. something like `$1', `$2' etc.
 *				The number is contained in the `paramid' field.
230
 *
231 232 233 234
 *		PARAM_NEW:	 Used in PRS2 rule, similar to PARAM_NAMED.
 *					 The `paramname' and `paramid' refer to the "NEW" tuple
 *					 The `pramname' is the attribute name and `paramid'
 *					 is the attribute number.
235
 *
236 237
 *		PARAM_OLD:	 Same as PARAM_NEW, but in this case we refer to
 *				the "OLD" tuple.
238
 *
239 240 241 242
 *		paramid - numeric identifier for literal-constant parameters ("$1")
 *		paramname - attribute name for tuple-substitution parameters ("$.foo")
 *		paramtype - PG_TYPE OID of the parameter's value
 *		param_tlist - allows for projection in a param node.
243 244
 * ----------------
 */
245 246
typedef struct Param
{
247 248 249 250 251 252
	NodeTag		type;
	int			paramkind;
	AttrNumber	paramid;
	char	   *paramname;
	Oid			paramtype;
	List	   *param_tlist;
253
} Param;
254 255 256 257


/* ----------------
 * Func
258 259 260 261 262 263 264 265 266 267 268
 *		funcid			- PG_FUNCTION OID of the function
 *		functype		- PG_TYPE OID of the function's return value
 *		funcisindex		- the function can be evaluated by scanning an index
 *						  (set during query optimization)
 *		funcsize		- size of return result (cached by executor)
 *		func_fcache		- runtime state while running this function.  Where
 *						  we are in the execution of the function if it
 *						  returns more than one value, etc.
 *						  See utils/fcache.h
 *		func_tlist		- projection of functions returning tuples
 *		func_planlist	- result of planning this func, if it's a PQ func
269 270
 * ----------------
 */
271 272
typedef struct Func
{
273 274 275 276 277
	NodeTag		type;
	Oid			funcid;
	Oid			functype;
	bool		funcisindex;
	int			funcsize;
278
	FunctionCachePtr func_fcache;
279 280
	List	   *func_tlist;
	List	   *func_planlist;
281
} Func;
282

283 284 285 286 287 288 289 290 291 292 293 294 295 296
/* ----------------
 * Iter
 *		can anyone explain what this is for?  Seems to have something to do
 *		with evaluation of functions that return sets...
 * ----------------
 */
typedef struct Iter
{
	NodeTag		type;
	Node	   *iterexpr;
	Oid			itertype;		/* type of the iter expr (use for type
								 * checking) */
} Iter;

297
/* ----------------
B
Bruce Momjian 已提交
298
 * Aggref
299 300 301
 *		aggname			- name of the aggregate
 *		basetype		- base type Oid of the aggregate
 *		aggtype			- type Oid of final result of the aggregate
302
 *		target			- attribute or expression we are aggregating on
303 304
 *		usenulls		- TRUE to accept null values as inputs
 *		aggno			- workspace for nodeAgg.c executor
305 306
 * ----------------
 */
B
Bruce Momjian 已提交
307
typedef struct Aggref
308
{
309 310
	NodeTag		type;
	char	   *aggname;
311 312
	Oid			basetype;
	Oid			aggtype;
313
	Node	   *target;
314
	bool		usenulls;
315
	int			aggno;
316
} Aggref;
317

318 319
/* ----------------
 * SubLink
320 321
 *		subLinkType		- EXISTS, ALL, ANY, MULTIEXPR, EXPR
 *		useor			- TRUE to combine column results with "OR" not "AND"
322
 *		lefthand		- list of outer-query expressions on the left
323
 *		oper			- list of Oper nodes for combining operators
324
 *		subselect		- subselect as Query* or parsetree
325
 *
326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344
 * 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:
 *	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 ...)
 * 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.
 * 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
 * depending on the "useor" flag.  ALL and ANY combine the per-row results
 * using AND and OR semantics respectively.
 *
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368
 * NOTE: lefthand and oper have varying meanings depending on where you look
 * in the parse/plan pipeline:
 * 1. gram.y delivers a list of the (untransformed) lefthand expressions in
 *    lefthand, and sets oper to a one-element list containing the string
 *    name of the operator.
 * 2. The parser's expression transformation transforms lefthand normally,
 *    and replaces oper with a list of Oper nodes, one per lefthand
 *    expression.  These nodes represent the parser's resolution of exactly
 *    which operator to apply to each pair of lefthand and targetlist
 *    expressions.  However, we have not constructed actual Expr trees for
 *    these operators yet.  This is the representation seen in saved rules
 *    and in the rewriter.
 * 3. Finally, the planner converts the oper list to a list of normal Expr
 *    nodes representing the application of the operator(s) to the lefthand
 *    expressions and values from the inner targetlist.  The inner
 *    targetlist items are represented by placeholder Param or Const nodes.
 *    The lefthand field is set to NIL, since its expressions are now in
 *    the Expr list.  This representation is passed to the executor.
 *
 * Planner routines that might see either representation 2 or 3 can tell
 * the difference by checking whether lefthand is NIL or not.  Also,
 * representation 2 appears in a "bare" SubLink, while representation 3 is
 * found in SubLinks that are children of SubPlan nodes.
 *
369 370
 * In EXISTS and EXPR SubLinks, both lefthand and oper are unused and are
 * always NIL.  useor is not significant either for these sublink types.
371 372 373 374
 * ----------------
 */
typedef enum SubLinkType
{
375
	EXISTS_SUBLINK, ALL_SUBLINK, ANY_SUBLINK, MULTIEXPR_SUBLINK, EXPR_SUBLINK
376 377 378 379 380 381
} SubLinkType;


typedef struct SubLink
{
	NodeTag		type;
382
	SubLinkType subLinkType;
383
	bool		useor;
384 385 386
	List	   *lefthand;
	List	   *oper;
	Node	   *subselect;
387 388
} SubLink;

389 390
/* ----------------
 * Array
391
 *		arrayelemtype	- type of the array's elements (homogenous!)
392
 *		arrayelemlength - length of that type
393
 *		arrayelembyval	- is the element type pass-by-value?
394 395 396
 *		arrayndim		- number of dimensions of the array
 *		arraylow		- base for array indexing
 *		arrayhigh		- limit for array indexing
397
 *		arraylen		- total length of array object
398 399
 * ----------------
 *
400 401 402
 *	memo from mao:	the array support we inherited from 3.1 is just
 *	wrong.	when time exists, we should redesign this stuff to get
 *	around a bunch of unfortunate implementation decisions made there.
403
 */
404 405
typedef struct Array
{
406 407 408 409 410 411 412 413
	NodeTag		type;
	Oid			arrayelemtype;
	int			arrayelemlength;
	bool		arrayelembyval;
	int			arrayndim;
	IntArray	arraylow;
	IntArray	arrayhigh;
	int			arraylen;
B
Bruce Momjian 已提交
414
} Array;
415 416

/* ----------------
417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449
 *	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.
 *
 *		refattrlength	- total length of array object
 *		refelemtype		- type of the result of the subscript operation
 *		refelemlength	- length of the array element type
 *		refelembyval	- is the element type pass-by-value?
 *		refupperindexpr - expressions that evaluate to upper array indexes
 *		reflowerindexpr	- expressions that evaluate to lower array indexes
 *		refexpr			- the expression that evaluates to an array value
 *		refassgnexpr	- expression for the source value, or NULL if fetch
 *
 * 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: array types can be fixed-length (refattrlength > 0), but only
 * when the element type is itself fixed-length.  Otherwise they are
 * varlena structures and have refattrlength = -1.  In any case,
 * an array type is never pass-by-value.
 *
 * Note: currently, refelemtype is NOT the element type, but the array type,
 * when doing subarray fetch or either type of store.  It would be cleaner
 * to add more fields so we can distinguish the array element type from the
 * result type of the subscript operator...
450 451
 * ----------------
 */
452 453
typedef struct ArrayRef
{
454 455 456 457 458 459 460 461 462
	NodeTag		type;
	int			refattrlength;
	int			refelemlength;
	Oid			refelemtype;
	bool		refelembyval;
	List	   *refupperindexpr;
	List	   *reflowerindexpr;
	Node	   *refexpr;
	Node	   *refassgnexpr;
B
Bruce Momjian 已提交
463
} ArrayRef;
464

465
#endif	 /* PRIMNODES_H */