summaryrefslogtreecommitdiff
path: root/src/include/nodes/relation.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/include/nodes/relation.h')
-rw-r--r--src/include/nodes/relation.h466
1 files changed, 243 insertions, 223 deletions
diff --git a/src/include/nodes/relation.h b/src/include/nodes/relation.h
index 16c7dd29955..7acbc3d466c 100644
--- a/src/include/nodes/relation.h
+++ b/src/include/nodes/relation.h
@@ -1,12 +1,12 @@
/*-------------------------------------------------------------------------
*
* relation.h--
- * Definitions for internal planner nodes.
+ * Definitions for internal planner nodes.
*
*
* Copyright (c) 1994, Regents of the University of California
*
- * $Id: relation.h,v 1.4 1997/03/18 18:41:37 scrappy Exp $
+ * $Id: relation.h,v 1.5 1997/09/07 04:58:48 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -18,260 +18,280 @@
/*
* Relid
- * List of relation identifiers (indexes into the rangetable).
+ * List of relation identifiers (indexes into the rangetable).
*/
-typedef List *Relid;
+typedef List *Relid;
/*
* Rel
- * Per-base-relation information
+ * Per-base-relation information
*
- * Parts of this data structure are specific to various scan and join
- * mechanisms. It didn't seem worth creating new node types for them.
+ * Parts of this data structure are specific to various scan and join
+ * mechanisms. It didn't seem worth creating new node types for them.
*
- * relids - List of relation indentifiers
- * indexed - true if the relation has secondary indices
- * pages - number of pages in the relation
- * tuples - number of tuples in the relation
- * size - number of tuples in the relation after restrictions clauses
- * have been applied
- * width - number of bytes per tuple in the relation after the
- * appropriate projections have been done
- * targetlist - List of TargetList nodes
- * pathlist - List of Path nodes, one for each possible method of
- * generating the relation
- * unorderedpath - a Path node generating this relation whose resulting
- * tuples are unordered (this isn't necessarily a
- * sequential scan path, e.g., scanning with a hash index
- * leaves the tuples unordered)
- * cheapestpath - least expensive Path (regardless of final order)
- * pruneable - flag to let the planner know whether it can prune the plan
- * space of this Rel or not. -- JMH, 11/11/92
+ * relids - List of relation indentifiers
+ * indexed - true if the relation has secondary indices
+ * pages - number of pages in the relation
+ * tuples - number of tuples in the relation
+ * size - number of tuples in the relation after restrictions clauses
+ * have been applied
+ * width - number of bytes per tuple in the relation after the
+ * appropriate projections have been done
+ * targetlist - List of TargetList nodes
+ * pathlist - List of Path nodes, one for each possible method of
+ * generating the relation
+ * unorderedpath - a Path node generating this relation whose resulting
+ * tuples are unordered (this isn't necessarily a
+ * sequential scan path, e.g., scanning with a hash index
+ * leaves the tuples unordered)
+ * cheapestpath - least expensive Path (regardless of final order)
+ * pruneable - flag to let the planner know whether it can prune the plan
+ * space of this Rel or not. -- JMH, 11/11/92
*
- * * If the relation is a (secondary) index it will have the following
- * three fields:
+ * * If the relation is a (secondary) index it will have the following
+ * three fields:
*
- * classlist - List of PG_AMOPCLASS OIDs for the index
- * indexkeys - List of base-relation attribute numbers that are index keys
- * ordering - List of PG_OPERATOR OIDs which order the indexscan result
- * relam - the OID of the pg_am of the index
+ * classlist - List of PG_AMOPCLASS OIDs for the index
+ * indexkeys - List of base-relation attribute numbers that are index keys
+ * ordering - List of PG_OPERATOR OIDs which order the indexscan result
+ * relam - the OID of the pg_am of the index
*
- * * The presence of the remaining fields depends on the restrictions
- * and joins which the relation participates in:
+ * * The presence of the remaining fields depends on the restrictions
+ * and joins which the relation participates in:
*
- * clauseinfo - List of ClauseInfo nodes, containing info about each
- * qualification clause in which this relation participates
- * joininfo - List of JoinInfo nodes, containing info about each join
- * clause in which this relation participates
- * innerjoin - List of Path nodes that represent indices that may be used
- * as inner paths of nestloop joins
+ * clauseinfo - List of ClauseInfo nodes, containing info about each
+ * qualification clause in which this relation participates
+ * joininfo - List of JoinInfo nodes, containing info about each join
+ * clause in which this relation participates
+ * innerjoin - List of Path nodes that represent indices that may be used
+ * as inner paths of nestloop joins
*
* NB. the last element of the arrays classlist, indexkeys and ordering
- * is always 0. 2/95 - ay
+ * is always 0. 2/95 - ay
*/
-typedef struct Rel {
- NodeTag type;
-
- /* all relations: */
- Relid relids;
-
- /* catalog statistics information */
- bool indexed;
- int pages;
- int tuples;
- int size;
- int width;
-
- /* materialization information */
- List *targetlist;
- List *pathlist;
- struct Path *unorderedpath;
- struct Path *cheapestpath;
- bool pruneable;
-
- /* used solely by indices: */
- Oid *classlist; /* classes of AM operators */
- int *indexkeys; /* keys over which we're indexing */
- Oid relam; /* OID of the access method (in pg_am) */
-
- Oid indproc;
- List *indpred;
-
- /* used by various scans and joins: */
- Oid *ordering; /* OID of operators in sort order */
- List *clauseinfo; /* restriction clauses */
- List *joininfo; /* join clauses */
- List *innerjoin;
- List *superrels;
-} Rel;
-
-extern Var *get_expr(TargetEntry *foo);
-
-typedef struct MergeOrder {
- NodeTag type;
- Oid join_operator;
- Oid left_operator;
- Oid right_operator;
- Oid left_type;
- Oid right_type;
-} MergeOrder;
-
-typedef enum OrderType {
- MERGE_ORDER, SORTOP_ORDER
-} OrderType;
-
-typedef struct PathOrder {
- OrderType ordtype;
- union {
- Oid *sortop;
- MergeOrder *merge;
- } ord;
-} PathOrder;
-
-typedef struct Path {
- NodeTag type;
-
- Rel *parent;
- Cost path_cost;
-
- NodeTag pathtype;
-
- PathOrder p_ordering;
-
- List *keys;
- Cost outerjoincost;
- Relid joinid;
- List *locclauseinfo;
-} Path;
-
-typedef struct IndexPath {
- Path path;
- List *indexid;
- List *indexqual;
- int *indexkeys; /* to transform heap attnos into index ones */
-} IndexPath;
-
-typedef struct JoinPath {
- Path path;
- List *pathclauseinfo;
- Path *outerjoinpath;
- Path *innerjoinpath;
-} JoinPath;
-
-typedef struct MergePath {
- JoinPath jpath;
- List *path_mergeclauses;
- List *outersortkeys;
- List *innersortkeys;
-} MergePath;
-
-typedef struct HashPath {
- JoinPath jpath;
- List *path_hashclauses;
- List *outerhashkeys;
- List *innerhashkeys;
-} HashPath;
+typedef struct Rel
+{
+ NodeTag type;
+
+ /* all relations: */
+ Relid relids;
+
+ /* catalog statistics information */
+ bool indexed;
+ int pages;
+ int tuples;
+ int size;
+ int width;
+
+ /* materialization information */
+ List *targetlist;
+ List *pathlist;
+ struct Path *unorderedpath;
+ struct Path *cheapestpath;
+ bool pruneable;
+
+ /* used solely by indices: */
+ Oid *classlist; /* classes of AM operators */
+ int *indexkeys; /* keys over which we're indexing */
+ Oid relam; /* OID of the access method (in pg_am) */
+
+ Oid indproc;
+ List *indpred;
+
+ /* used by various scans and joins: */
+ Oid *ordering; /* OID of operators in sort order */
+ List *clauseinfo; /* restriction clauses */
+ List *joininfo; /* join clauses */
+ List *innerjoin;
+ List *superrels;
+} Rel;
+
+extern Var *get_expr(TargetEntry * foo);
+
+typedef struct MergeOrder
+{
+ NodeTag type;
+ Oid join_operator;
+ Oid left_operator;
+ Oid right_operator;
+ Oid left_type;
+ Oid right_type;
+} MergeOrder;
+
+typedef enum OrderType
+{
+ MERGE_ORDER, SORTOP_ORDER
+} OrderType;
+
+typedef struct PathOrder
+{
+ OrderType ordtype;
+ union
+ {
+ Oid *sortop;
+ MergeOrder *merge;
+ } ord;
+} PathOrder;
+
+typedef struct Path
+{
+ NodeTag type;
+
+ Rel *parent;
+ Cost path_cost;
+
+ NodeTag pathtype;
+
+ PathOrder p_ordering;
+
+ List *keys;
+ Cost outerjoincost;
+ Relid joinid;
+ List *locclauseinfo;
+} Path;
+
+typedef struct IndexPath
+{
+ Path path;
+ List *indexid;
+ List *indexqual;
+ int *indexkeys; /* to transform heap attnos into index
+ * ones */
+} IndexPath;
+
+typedef struct JoinPath
+{
+ Path path;
+ List *pathclauseinfo;
+ Path *outerjoinpath;
+ Path *innerjoinpath;
+} JoinPath;
+
+typedef struct MergePath
+{
+ JoinPath jpath;
+ List *path_mergeclauses;
+ List *outersortkeys;
+ List *innersortkeys;
+} MergePath;
+
+typedef struct HashPath
+{
+ JoinPath jpath;
+ List *path_hashclauses;
+ List *outerhashkeys;
+ List *innerhashkeys;
+} HashPath;
/******
* Keys
******/
-typedef struct OrderKey {
- NodeTag type;
- int attribute_number;
- Index array_index;
-} OrderKey;
+typedef struct OrderKey
+{
+ NodeTag type;
+ int attribute_number;
+ Index array_index;
+} OrderKey;
-typedef struct JoinKey {
- NodeTag type;
- Var *outer;
- Var *inner;
-} JoinKey;
+typedef struct JoinKey
+{
+ NodeTag type;
+ Var *outer;
+ Var *inner;
+} JoinKey;
/*******
* clause info
*******/
-typedef struct CInfo {
- NodeTag type;
- Expr *clause; /* should be an OP clause */
- Cost selectivity;
- bool notclause;
- List *indexids;
-
- /* mergesort only */
- MergeOrder *mergesortorder;
-
- /* hashjoin only */
- Oid hashjoinoperator;
- Relid cinfojoinid;
-} CInfo;
-
-typedef struct JoinMethod {
- NodeTag type;
- List *jmkeys;
- List *clauses;
-} JoinMethod;
-
-typedef struct HInfo {
- JoinMethod jmethod;
- Oid hashop;
-} HInfo;
-
-typedef struct MInfo {
- JoinMethod jmethod;
- MergeOrder *m_ordering;
-} MInfo;
-
-typedef struct JInfo {
- NodeTag type;
- List *otherrels;
- List *jinfoclauseinfo;
- bool mergesortable;
- bool hashjoinable;
- bool inactive;
-} JInfo;
-
-typedef struct Iter {
- NodeTag type;
- Node *iterexpr;
- Oid itertype; /* type of the iter expr (use for type
- checking) */
-} Iter;
+typedef struct CInfo
+{
+ NodeTag type;
+ Expr *clause; /* should be an OP clause */
+ Cost selectivity;
+ bool notclause;
+ List *indexids;
+
+ /* mergesort only */
+ MergeOrder *mergesortorder;
+
+ /* hashjoin only */
+ Oid hashjoinoperator;
+ Relid cinfojoinid;
+} CInfo;
+
+typedef struct JoinMethod
+{
+ NodeTag type;
+ List *jmkeys;
+ List *clauses;
+} JoinMethod;
+
+typedef struct HInfo
+{
+ JoinMethod jmethod;
+ Oid hashop;
+} HInfo;
+
+typedef struct MInfo
+{
+ JoinMethod jmethod;
+ MergeOrder *m_ordering;
+} MInfo;
+
+typedef struct JInfo
+{
+ NodeTag type;
+ List *otherrels;
+ List *jinfoclauseinfo;
+ bool mergesortable;
+ bool hashjoinable;
+ bool inactive;
+} JInfo;
+
+typedef struct Iter
+{
+ NodeTag type;
+ Node *iterexpr;
+ Oid itertype; /* type of the iter expr (use for type
+ * checking) */
+} Iter;
/*
** Stream:
-** A stream represents a root-to-leaf path in a plan tree (i.e. a tree of
+** A stream represents a root-to-leaf path in a plan tree (i.e. a tree of
** JoinPaths and Paths). The stream includes pointers to all Path nodes,
-** as well as to any clauses that reside above Path nodes. This structure
+** as well as to any clauses that reside above Path nodes. This structure
** is used to make Path nodes and clauses look similar, so that Predicate
** Migration can run.
**
-** pathptr -- pointer to the current path node
-** cinfo -- if NULL, this stream node referes to the path node.
-** Otherwise this is a pointer to the current clause.
-** clausetype -- whether cinfo is in locclauseinfo or pathclauseinfo in the
-** path node
-** upstream -- linked list pointer upwards
-** downstream -- ditto, downwards
-** groupup -- whether or not this node is in a group with the node upstream
-** groupcost -- total cost of the group that node is in
-** groupsel -- total selectivity of the group that node is in
+** pathptr -- pointer to the current path node
+** cinfo -- if NULL, this stream node referes to the path node.
+** Otherwise this is a pointer to the current clause.
+** clausetype -- whether cinfo is in locclauseinfo or pathclauseinfo in the
+** path node
+** upstream -- linked list pointer upwards
+** downstream -- ditto, downwards
+** groupup -- whether or not this node is in a group with the node upstream
+** groupcost -- total cost of the group that node is in
+** groupsel -- total selectivity of the group that node is in
*/
typedef struct Stream *StreamPtr;
-typedef struct Stream {
- NodeTag type;
- Path *pathptr;
- CInfo *cinfo;
- int *clausetype;
- struct Stream *upstream;
- struct Stream *downstream;
- bool groupup;
- Cost groupcost;
- Cost groupsel;
-} Stream;
-
-#endif /* RELATION_H */
+typedef struct Stream
+{
+ NodeTag type;
+ Path *pathptr;
+ CInfo *cinfo;
+ int *clausetype;
+ struct Stream *upstream;
+ struct Stream *downstream;
+ bool groupup;
+ Cost groupcost;
+ Cost groupsel;
+} Stream;
+
+#endif /* RELATION_H */