Commit 26e03211 authored by Bruce Momjian's avatar Bruce Momjian

Move structure comments from the top block down to the line entries for

this file to match all the other files, and to be clearer.
parent 4c4f305b
......@@ -80,7 +80,7 @@ example, the WHERE clause "tab1.col1 = tab2.col1" generates a JoinInfo
for tab1 listing tab2 as an unjoined relation, and also one for tab2
showing tab1 as an unjoined relation.
If we have only a single base relation in the query, we are done now.
If we have only a single base relation in the query, we are done.
Otherwise we have to figure out how to join the base relations into a
single join relation.
......
......@@ -10,7 +10,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: primnodes.h,v 1.49 2000/09/29 18:21:39 tgl Exp $
* $Id: primnodes.h,v 1.50 2001/01/17 06:41:31 momjian Exp $
*
*-------------------------------------------------------------------------
*/
......@@ -29,17 +29,8 @@ typedef struct FunctionCache *FunctionCachePtr;
* ----------------------------------------------------------------
*/
/* ----------------
/*
* Resdom (Result Domain)
* resno - attribute number
* restype - type of the value
* restypmod - type-specific modifier of the value
* resname - name of the resdom (could be NULL)
* ressortgroupref - nonzero if referenced by a sort/group clause
* reskey - order of key in a sort (for those > 0)
* reskeyop - sort operator's regproc Oid
* resjunk - set to true to eliminate the attribute
* from final target list
*
* Notes:
* ressortgroupref is the parse/plan-time representation of ORDER BY and
......@@ -59,46 +50,48 @@ typedef struct FunctionCache *FunctionCachePtr;
*
* Both reskey and reskeyop are typically zero during parse/plan stages.
* The executor does not pay any attention to ressortgroupref.
* ----------------
*
*/
typedef struct Resdom
{
NodeTag type;
AttrNumber resno;
Oid restype;
int32 restypmod;
char *resname;
AttrNumber resno; /* attribute number */
Oid restype; /* type of the value */
int32 restypmod; /* type-specific modifier of the value */
char *resname; /* name of the resdom (could be NULL) */
Index ressortgroupref;
Index reskey;
Oid reskeyop;
bool resjunk;
/* nonzero if referenced by a sort/group clause */
Index reskey; /* order of key in a sort (for those > 0) */
Oid reskeyop; /* sort operator's regproc Oid */
bool resjunk; /* set to true to eliminate the attribute
* from final target list */
} 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;
bool fj_initialized; /* true if the Fjoin has already been
* initialized for the current target
* list evaluation */
int fj_nNodes; /* The number of Iter nodes returning
* sets that the node will flatten */
List *fj_innerNode; /* 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.
*/
DatumPtr fj_results; /* The complete (flattened) result vector */
BoolPtr fj_alwaysDone; /* a null vector to indicate sets with a
* cardinality of 0, we treat them as the
* set {NULL}.
*/
} Fjoin;
......@@ -107,13 +100,8 @@ typedef struct Fjoin
* ----------------------------------------------------------------
*/
/* ----------------
/*
* Expr
* typeOid - oid of the type of this expression
* opType - type of this expression
* oper - operator node if needed (Oper, Func, or SubPlan)
* args - arguments to this expression
* ----------------
*/
typedef enum OpType
{
......@@ -123,23 +111,15 @@ typedef enum 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 */
Oid typeOid; /* oid of the type of this expression */
OpType opType; /* type of this expression */
Node *oper; /* operator node if needed (Oper, Func, or
* SubPlan) */
List *args; /* arguments to this expression */
} Expr;
/* ----------------
/*
* Var
* varno - index of this var's relation in the range table
* (could also 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;
* 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
......@@ -160,23 +140,22 @@ typedef struct Expr
typedef struct Var
{
NodeTag type;
Index varno;
AttrNumber varattno;
Oid vartype;
int32 vartypmod;
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 */
Index varlevelsup;
Index varnoold; /* mainly for debugging --- see above */
AttrNumber varoattno;
/* 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 */
} Var;
/* ----------------
/*
* Oper
* opno - PG_OPERATOR OID of the operator
* opid - PG_PROC OID for the operator's underlying function
* opresulttype - PG_TYPE OID of the operator's return value
* op_fcache - runtime state while running the function
*
* ----
* 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,
......@@ -190,43 +169,40 @@ typedef struct Var
* Note also that opid 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 opid is typically 0.
* ----------------
*
*/
typedef struct Oper
{
NodeTag type;
Oid opno;
Oid opid;
Oid opno; /* PG_OPERATOR OID of the operator */
Oid opid; /* PG_PROC OID for the operator's underlying
* function */
Oid opresulttype;
/* PG_TYPE OID of the operator's return value */
FunctionCachePtr op_fcache;
/* runtime state while running the function */
} 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;
Oid consttype; /* PG_TYPE OID of the constant's value */
int constlen; /* length in bytes of the constant's value */
Datum constvalue; /* the constant's value */
bool constisnull; /* whether the constant is null (if true,
* the other fields are undefined) */
bool 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. */
bool constisset; /* whether the const represents a set.
* The const value corresponding will be the
* query that defines the set. */
bool constiscast;
} Const;
......@@ -250,38 +226,33 @@ typedef struct Const
*
* 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
* ----------------
*/
typedef struct Param
{
NodeTag type;
int paramkind;
AttrNumber paramid;
char *paramname;
Oid paramtype;
int paramkind; /* specifies the kind of parameter. See above */
AttrNumber paramid; /* numeric identifier for literal-constant
* parameters ("$1") */
char *paramname; /* attribute name for tuple-substitution
* parameters ("$.foo") */
Oid paramtype; /* PG_TYPE OID of the parameter's value */
} Param;
/* ----------------
/*
* Func
* funcid - PG_PROC OID of the function
* functype - PG_TYPE OID of the function's return value
* 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
* ----------------
*/
typedef struct Func
{
NodeTag type;
Oid funcid;
Oid functype;
Oid funcid; /* PG_PROC OID of the function */
Oid functype; /* PG_TYPE OID of the function's return value */
FunctionCachePtr 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;
/* ----------------
......@@ -298,36 +269,24 @@ typedef struct Iter
* checking) */
} Iter;
/* ----------------
/*
* Aggref
* aggname - name of the aggregate
* basetype - base type Oid of the aggregate (ie, input type)
* aggtype - type Oid of final result of the aggregate
* target - attribute or expression we are aggregating on
* aggstar - TRUE if argument was really '*'
* aggdistinct - TRUE if it's agg(DISTINCT ...)
* aggno - workspace for executor (see nodeAgg.c)
* ----------------
*/
typedef struct Aggref
{
NodeTag type;
char *aggname;
Oid basetype;
Oid aggtype;
Node *target;
bool aggstar;
bool aggdistinct;
int aggno;
char *aggname; /* name of the aggregate */
Oid basetype; /* base type Oid of the aggregate
* (ie, input type) */
Oid aggtype; /* type Oid of final result of the aggregate */
Node *target; /* attribute or expression we are aggregating on */
bool aggstar; /* TRUE if argument was really '*' */
bool aggdistinct;/* TRUE if it's agg(DISTINCT ...) */
int aggno; /* workspace for executor (see nodeAgg.c) */
} Aggref;
/* ----------------
* SubLink
* subLinkType - EXISTS, ALL, ANY, MULTIEXPR, EXPR
* useor - TRUE to combine column results with "OR" not "AND"
* lefthand - list of outer-query expressions on the left
* oper - list of Oper nodes for combining operators
* subselect - subselect as Query* or parsetree
*
* A SubLink represents a subselect appearing in an expression, and in some
* cases also the combining operator(s) just above it. The subLinkType
......@@ -385,11 +344,12 @@ typedef enum SubLinkType
typedef struct SubLink
{
NodeTag type;
SubLinkType subLinkType;
bool useor;
List *lefthand;
List *oper;
Node *subselect;
SubLinkType subLinkType;/* EXISTS, ALL, ANY, MULTIEXPR, EXPR */
bool useor; /* TRUE to combine column results with "OR"
* not "AND" */
List *lefthand; /* list of outer-query expressions on the left */
List *oper; /* list of Oper nodes for combining operators */
Node *subselect; /* subselect as Query* or parsetree */
} SubLink;
/* ----------------
......@@ -402,15 +362,6 @@ typedef struct SubLink
* appropriate part of the array; the result of the operation is an
* entire new modified array value.
*
* refattrlength - typlen of array type
* refelemtype - type of the result of the ArrayRef operation
* refelemlength - typlen 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
......@@ -432,22 +383,23 @@ typedef struct SubLink
typedef struct ArrayRef
{
NodeTag type;
int refattrlength;
int refelemlength;
Oid refelemtype;
bool refelembyval;
List *refupperindexpr;
List *reflowerindexpr;
Node *refexpr;
Node *refassgnexpr;
int refattrlength; /* typlen of array type */
int refelemlength; /* typlen of the array element type */
Oid refelemtype; /* type of the result of the ArrayRef
* operation */
bool refelembyval; /* is the element type pass-by-value? */
List *refupperindexpr; /* expressions that evaluate to upper
* array indexes */
List *reflowerindexpr; /* expressions that evaluate to lower
* array indexes */
Node *refexpr; /* the expression that evaluates to an
* array value */
Node *refassgnexpr; /* expression for the source value, or NULL
* if fetch */
} ArrayRef;
/* ----------------
* FieldSelect
* arg - input expression
* fieldnum - attribute number of field to extract
* resulttype - type of the field (result type of this node)
* resulttypmod - output typmod (usually -1)
*
* FieldSelect represents the operation of extracting one field from a tuple
* value. At runtime, the input expression is expected to yield a Datum
......@@ -459,17 +411,15 @@ typedef struct ArrayRef
typedef struct FieldSelect
{
NodeTag type;
Node *arg;
AttrNumber fieldnum;
Oid resulttype;
int32 resulttypmod;
Node *arg; /* input expression */
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) */
} FieldSelect;
/* ----------------
* RelabelType
* arg - input expression
* resulttype - output type of coercion expression
* resulttypmod - output typmod (usually -1)
*
* RelabelType represents a "dummy" type coercion between two binary-
* compatible datatypes, such as reinterpreting the result of an OID
......@@ -484,9 +434,9 @@ typedef struct FieldSelect
typedef struct RelabelType
{
NodeTag type;
Node *arg;
Oid resulttype;
int32 resulttypmod;
Node *arg; /* input expression */
Oid resulttype; /* output type of coercion expression */
int32 resulttypmod; /* output typmod (usually -1) */
} RelabelType;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment