Move structure comments from the top block down to the line entries for
authorBruce Momjian
Wed, 17 Jan 2001 06:41:31 +0000 (06:41 +0000)
committerBruce Momjian
Wed, 17 Jan 2001 06:41:31 +0000 (06:41 +0000)
this file to match all the other files, and to be clearer.

src/backend/optimizer/README
src/include/nodes/primnodes.h

index 49450ff1fb371386d43841e7b70c4ac71f88f1fe..520ab1b24211343cede23f2356dcbceac4154910 100644 (file)
@@ -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.
 
index 62b65fee8b07e908d6191a036f5adaa5937ae20f..4cfda0d2ffdaa479f37493d3bbd2c6f1e7b5c1f4 100644 (file)
@@ -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;
+   NodeTag     type;       
+   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;