postgresql/src/include/nodes/primnodes.h

356 lines
10 KiB
C
Raw Normal View History

/*-------------------------------------------------------------------------
*
* primnodes.h
* Definitions for parse tree/query tree ("primitive") nodes.
*
*
* Copyright (c) 1994, Regents of the University of California
*
1999-07-16 19:07:40 +02:00
* $Id: primnodes.h,v 1.31 1999/07/16 17:07:33 momjian Exp $
*
*-------------------------------------------------------------------------
*/
#ifndef PRIMNODES_H
#define PRIMNODES_H
#include "access/attnum.h"
#include "nodes/pg_list.h"
1999-07-16 19:07:40 +02:00
#include "utils/fcache.h"
/* ----------------------------------------------------------------
* node definitions
* ----------------------------------------------------------------
*/
/* ----------------
* Resdom (Result Domain)
* resno - attribute number
* restype - type of the resdom
* restypmod - type-specific modifier of the result
* resname - name of the resdom (could be NULL)
* reskey - order of key in a sort (for those > 0)
* reskeyop - sort operator Oid
* resgroupref - set to nonzero if referenced from a group by clause
1999-05-17 19:03:51 +02:00
* resjunk - set to true to eliminate the attribute
* from final target list
*
* ----------------
*/
typedef struct Resdom
{
NodeTag type;
AttrNumber resno;
Oid restype;
int32 restypmod;
char *resname;
Index reskey;
Oid reskeyop;
Index resgroupref;
1999-05-17 19:03:51 +02:00
bool resjunk;
} Resdom;
/* -------------
* Fjoin
* 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}.
*/
typedef struct Fjoin
{
NodeTag type;
bool fj_initialized;
int fj_nNodes;
List *fj_innerNode;
DatumPtr fj_results;
BoolPtr fj_alwaysDone;
} Fjoin;
/* ----------------
* Expr
* typeOid - oid of the type of this expression
* opType - type of this expression
* oper - the Oper node if it is an OPER_EXPR or the
* Func node if it is a FUNC_EXPR
* args - arguments to this expression
* ----------------
*/
typedef enum OpType
{
OP_EXPR, FUNC_EXPR, OR_EXPR, AND_EXPR, NOT_EXPR, SUBPLAN_EXPR
} OpType;
typedef struct Expr
{
NodeTag type;
Oid typeOid; /* oid of the type of this expr */
OpType opType; /* type of the op */
Node *oper; /* could be Oper or Func or SubPlan */
List *args; /* list of argument nodes */
} Expr;
/* ----------------
* Var
* varno - index of this var's relation in the range table
* (could be INNER or OUTER)
* varattno - attribute number of this var, or zero for all
* vartype - pg_type tuple oid for the type of this var
* vartypmod - pg_attribute typmod value
* varlevelsup - for subquery variables referencing outer relations
* varnoold - keep varno around in case it got changed to INNER/
* OUTER (see match_varid)
* varoattno - attribute number of this var
* [ '(varnoold varoattno) was varid -ay 2/95]
* ----------------
*/
#define INNER 65000
#define OUTER 65001
#define PRS2_CURRENT_VARNO 1
#define PRS2_NEW_VARNO 2
typedef struct Var
{
NodeTag type;
Index varno;
AttrNumber varattno;
Oid vartype;
int32 vartypmod;
Index varlevelsup; /* erased by upper optimizer */
Index varnoold; /* only used by optimizer */
AttrNumber varoattno; /* only used by optimizer */
} Var;
/* ----------------
* Oper
* 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.
*
* ----
* NOTE: in the good old days 'opno' used to be both (or either, or
* neither) the pg_operator oid, and/or the pg_proc oid depending
* 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
* immediately removes all bugs from the code... [ sp :-) ].
* ----------------
*/
typedef struct Oper
{
NodeTag type;
Oid opno;
Oid opid;
Oid opresulttype;
int opsize;
FunctionCachePtr op_fcache;
} Oper;
/* ----------------
* Const
* 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.
* ----------------
*/
typedef struct Const
{
NodeTag type;
Oid consttype;
int constlen;
Datum constvalue;
bool constisnull;
bool constbyval;
bool constisset;
bool constiscast;
} Const;
/* ----------------
* Param
* paramkind - specifies the kind of parameter. The possible values
* for this field are specified in "params.h", and they are:
*
* PARAM_NAMED: The parameter has a name, i.e. something
* like `$.salary' or `$.foobar'.
* In this case field `paramname' must be a valid Name.
*
* PARAM_NUM: The parameter has only a numeric identifier,
* i.e. something like `$1', `$2' etc.
* The number is contained in the `paramid' field.
*
* 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.
*
* PARAM_OLD: Same as PARAM_NEW, but in this case we refer to
* the "OLD" tuple.
*
* 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.
* ----------------
*/
typedef struct Param
{
NodeTag type;
int paramkind;
AttrNumber paramid;
char *paramname;
Oid paramtype;
List *param_tlist;
} Param;
/* ----------------
* Func
* 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
* ----------------
*/
typedef struct Func
{
NodeTag type;
Oid funcid;
Oid functype;
bool funcisindex;
int funcsize;
FunctionCachePtr func_fcache;
List *func_tlist;
List *func_planlist;
} Func;
/* ----------------
1999-01-24 01:28:37 +01:00
* Aggref
* aggname - name of the aggregate
* basetype - base type Oid of the aggregate
* aggtype - type Oid of final result of the aggregate
* target - attribute or expression we are aggregating on
* aggno - index to ecxt_values
* ----------------
*/
1999-01-24 01:28:37 +01:00
typedef struct Aggref
{
NodeTag type;
char *aggname;
Oid basetype;
Oid aggtype;
Node *target;
int aggno;
bool usenulls;
1999-05-26 00:43:53 +02:00
} Aggref;
/* ----------------
* SubLink
* subLinkType - EXISTS, ALL, ANY, EXPR
* useor - TRUE for <>
* lefthand - list of Var/Const nodes on the left
* oper - list of Oper nodes
* subselect - subselect as Query* or parsetree
* ----------------
*/
typedef enum SubLinkType
{
EXISTS_SUBLINK, ALL_SUBLINK, ANY_SUBLINK, EXPR_SUBLINK
} SubLinkType;
typedef struct SubLink
{
NodeTag type;
SubLinkType subLinkType;
bool useor;
List *lefthand;
List *oper;
Node *subselect;
} SubLink;
/* ----------------
* Array
* arrayelemtype - base type of the array's elements (homogenous!)
* arrayelemlength - length of that type
* arrayelembyval - can you pass this element by value?
* arrayndim - number of dimensions of the array
* arraylow - base for array indexing
* arrayhigh - limit for array indexing
* arraylen -
* ----------------
*
* 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.
*/
typedef struct Array
{
NodeTag type;
Oid arrayelemtype;
int arrayelemlength;
bool arrayelembyval;
int arrayndim;
IntArray arraylow;
IntArray arrayhigh;
int arraylen;
1997-09-08 22:59:27 +02:00
} Array;
/* ----------------
* ArrayRef:
* refelemtype - type of the element referenced here
* refelemlength - length of that type
* refelembyval - can you pass this element type by value?
* refupperindexpr - expressions that evaluate to upper array index
* reflowerexpr- the expressions that evaluate to a lower array index
* refexpr - the expression that evaluates to an array
* refassignexpr- the expression that evaluates to the new value
* to be assigned to the array in case of replace.
* ----------------
*/
typedef struct ArrayRef
{
NodeTag type;
int refattrlength;
int refelemlength;
Oid refelemtype;
bool refelembyval;
List *refupperindexpr;
List *reflowerindexpr;
Node *refexpr;
Node *refassgnexpr;
1997-09-08 22:59:27 +02:00
} ArrayRef;
#endif /* PRIMNODES_H */