Add Cardinality typedef
authorPeter Eisentraut <peter@eisentraut.org>
Wed, 15 Sep 2021 16:56:13 +0000 (18:56 +0200)
committerPeter Eisentraut <peter@eisentraut.org>
Wed, 15 Sep 2021 16:56:13 +0000 (18:56 +0200)
Similar to Cost and Selectivity, this is just a double, which can be
used in path and plan nodes to give some hint about the meaning of a
field.

Discussion: https://www.postgresql.org/message-id/c091e5cd-45f8-69ee-6a9b-de86912cc7e7@enterprisedb.com

src/include/nodes/nodes.h
src/include/nodes/parsenodes.h
src/include/nodes/pathnodes.h
src/include/nodes/plannodes.h

index b3ee4194d3938b56e94672af5ed75ac7e0e0f6f7..e0057daa0616a3cbf35a6aa1afedbbe877e5fd36 100644 (file)
@@ -668,6 +668,7 @@ extern bool equal(const void *a, const void *b);
  */
 typedef double Selectivity;        /* fraction of tuples a qualifier will pass */
 typedef double Cost;           /* execution cost (in page-access units) */
+typedef double Cardinality;        /* (estimated) number of rows or other integer count */
 
 
 /*
index 45e4f2a16e66a0171aca5b924a29fa4b3cc1defd..3138877553f59ade00b40973caec31025de5dbc0 100644 (file)
@@ -1144,7 +1144,7 @@ typedef struct RangeTblEntry
     * Fields valid for ENR RTEs (else NULL/zero):
     */
    char       *enrname;        /* name of ephemeral named relation */
-   double      enrtuples;      /* estimated or actual from caller */
+   Cardinality enrtuples;      /* estimated or actual from caller */
 
    /*
     * Fields valid in all RTEs:
index c8a8eec6e2f208a2e8477910ea36fc6558576c6b..2a53a6e344b0dfe98ae31bc990317dc7729b0443 100644 (file)
@@ -334,11 +334,11 @@ struct PlannerInfo
 
    MemoryContext planner_cxt;  /* context holding PlannerInfo */
 
-   double      total_table_pages;  /* # of pages in all non-dummy tables of
+   Cardinality total_table_pages;  /* # of pages in all non-dummy tables of
                                     * query */
 
-   double      tuple_fraction; /* tuple_fraction passed to query_planner */
-   double      limit_tuples;   /* limit_tuples passed to query_planner */
+   Selectivity tuple_fraction; /* tuple_fraction passed to query_planner */
+   Cardinality limit_tuples;   /* limit_tuples passed to query_planner */
 
    Index       qual_security_level;    /* minimum security_level for quals */
    /* Note: qual_security_level is zero if there are no securityQuals */
@@ -681,7 +681,7 @@ typedef struct RelOptInfo
    Relids      relids;         /* set of base relids (rangetable indexes) */
 
    /* size estimates generated by planner */
-   double      rows;           /* estimated number of result tuples */
+   Cardinality rows;           /* estimated number of result tuples */
 
    /* per-relation planner control flags */
    bool        consider_startup;   /* keep cheap-startup-cost paths? */
@@ -718,7 +718,7 @@ typedef struct RelOptInfo
    List       *indexlist;      /* list of IndexOptInfo */
    List       *statlist;       /* list of StatisticExtInfo */
    BlockNumber pages;          /* size estimates derived from pg_class */
-   double      tuples;
+   Cardinality tuples;
    double      allvisfrac;
    Bitmapset  *eclass_indexes; /* Indexes in PlannerInfo's eq_classes list of
                                 * ECs that mention this rel */
@@ -841,7 +841,7 @@ struct IndexOptInfo
 
    /* index-size statistics (from pg_class and elsewhere) */
    BlockNumber pages;          /* number of disk pages in index */
-   double      tuples;         /* number of index tuples in index */
+   Cardinality tuples;         /* number of index tuples in index */
    int         tree_height;    /* index tree height, or -1 if unknown */
 
    /* index descriptor information */
@@ -1139,7 +1139,7 @@ typedef struct ParamPathInfo
    NodeTag     type;
 
    Relids      ppi_req_outer;  /* rels supplying parameters used by path */
-   double      ppi_rows;       /* estimated number of result tuples */
+   Cardinality ppi_rows;       /* estimated number of result tuples */
    List       *ppi_clauses;    /* join clauses available from outer rels */
 } ParamPathInfo;
 
@@ -1189,7 +1189,7 @@ typedef struct Path
    int         parallel_workers;   /* desired # of workers; 0 = not parallel */
 
    /* estimated size/costs for path (see costsize.c for more info) */
-   double      rows;           /* estimated number of result tuples */
+   Cardinality rows;           /* estimated number of result tuples */
    Cost        startup_cost;   /* cost expended before fetching any tuples */
    Cost        total_cost;     /* total cost (assuming all tuples fetched) */
 
@@ -1452,7 +1452,7 @@ typedef struct AppendPath
    List       *subpaths;       /* list of component Paths */
    /* Index of first partial path in subpaths; list_length(subpaths) if none */
    int         first_partial_path;
-   double      limit_tuples;   /* hard limit on output tuples, or -1 */
+   Cardinality limit_tuples;   /* hard limit on output tuples, or -1 */
 } AppendPath;
 
 #define IS_DUMMY_APPEND(p) \
@@ -1474,7 +1474,7 @@ typedef struct MergeAppendPath
 {
    Path        path;
    List       *subpaths;       /* list of component Paths */
-   double      limit_tuples;   /* hard limit on output tuples, or -1 */
+   Cardinality limit_tuples;   /* hard limit on output tuples, or -1 */
 } MergeAppendPath;
 
 /*
@@ -1515,7 +1515,7 @@ typedef struct MemoizePath
    List       *param_exprs;    /* cache keys */
    bool        singlerow;      /* true if the cache entry is to be marked as
                                 * complete after caching the first record. */
-   double      calls;          /* expected number of rescans */
+   Cardinality calls;          /* expected number of rescans */
    uint32      est_entries;    /* The maximum number of entries that the
                                 * planner expects will fit in the cache, or 0
                                 * if unknown */
@@ -1667,7 +1667,7 @@ typedef struct HashPath
    JoinPath    jpath;
    List       *path_hashclauses;   /* join clauses used for hashing */
    int         num_batches;    /* number of batches expected */
-   double      inner_rows_total;   /* total inner rows expected */
+   Cardinality inner_rows_total;   /* total inner rows expected */
 } HashPath;
 
 /*
@@ -1770,7 +1770,7 @@ typedef struct AggPath
    Path       *subpath;        /* path representing input source */
    AggStrategy aggstrategy;    /* basic strategy, see nodes.h */
    AggSplit    aggsplit;       /* agg-splitting mode, see nodes.h */
-   double      numGroups;      /* estimated number of groups in input */
+   Cardinality numGroups;      /* estimated number of groups in input */
    uint64      transitionSpace;    /* for pass-by-ref transition data */
    List       *groupClause;    /* a list of SortGroupClause's */
    List       *qual;           /* quals (HAVING quals), if any */
@@ -1784,7 +1784,7 @@ typedef struct GroupingSetData
 {
    NodeTag     type;
    List       *set;            /* grouping set as list of sortgrouprefs */
-   double      numGroups;      /* est. number of result groups */
+   Cardinality numGroups;      /* est. number of result groups */
 } GroupingSetData;
 
 typedef struct RollupData
@@ -1793,7 +1793,7 @@ typedef struct RollupData
    List       *groupClause;    /* applicable subset of parse->groupClause */
    List       *gsets;          /* lists of integer indexes into groupClause */
    List       *gsets_data;     /* list of GroupingSetData */
-   double      numGroups;      /* est. number of result groups */
+   Cardinality numGroups;      /* est. number of result groups */
    bool        hashable;       /* can be hashed */
    bool        is_hashed;      /* to be implemented as a hashagg */
 } RollupData;
@@ -1844,7 +1844,7 @@ typedef struct SetOpPath
    List       *distinctList;   /* SortGroupClauses identifying target cols */
    AttrNumber  flagColIdx;     /* where is the flag column, if any */
    int         firstFlag;      /* flag value for first input relation */
-   double      numGroups;      /* estimated number of groups in input */
+   Cardinality numGroups;      /* estimated number of groups in input */
 } SetOpPath;
 
 /*
@@ -1857,7 +1857,7 @@ typedef struct RecursiveUnionPath
    Path       *rightpath;
    List       *distinctList;   /* SortGroupClauses identifying target cols */
    int         wtParam;        /* ID of Param representing work table */
-   double      numGroups;      /* estimated number of groups in input */
+   Cardinality numGroups;      /* estimated number of groups in input */
 } RecursiveUnionPath;
 
 /*
@@ -2612,7 +2612,7 @@ typedef struct
 typedef struct
 {
    bool        limit_needed;
-   double      limit_tuples;
+   Cardinality limit_tuples;
    int64       count_est;
    int64       offset_est;
 } FinalPathExtraData;
@@ -2643,15 +2643,15 @@ typedef struct JoinCostWorkspace
    Cost        inner_rescan_run_cost;
 
    /* private for cost_mergejoin code */
-   double      outer_rows;
-   double      inner_rows;
-   double      outer_skip_rows;
-   double      inner_skip_rows;
+   Cardinality outer_rows;
+   Cardinality inner_rows;
+   Cardinality outer_skip_rows;
+   Cardinality inner_skip_rows;
 
    /* private for cost_hashjoin code */
    int         numbuckets;
    int         numbatches;
-   double      inner_rows_total;
+   Cardinality inner_rows_total;
 } JoinCostWorkspace;
 
 /*
index ec9a8b0c819f15a959d75608bacc2efd77fbda4a..01a246d50ed6033158d169dddf56df872ef0f673 100644 (file)
@@ -120,7 +120,7 @@ typedef struct Plan
    /*
     * planner's estimate of result size of this plan step
     */
-   double      plan_rows;      /* number of rows plan is expected to emit */
+   Cardinality plan_rows;      /* number of rows plan is expected to emit */
    int         plan_width;     /* average row width in bytes */
 
    /*
@@ -976,7 +976,7 @@ typedef struct Hash
    AttrNumber  skewColumn;     /* outer join key's column #, or zero */
    bool        skewInherit;    /* is outer join rel an inheritance tree? */
    /* all other info is in the parent HashJoin node */
-   double      rows_total;     /* estimate total rows if parallel_aware */
+   Cardinality rows_total;     /* estimate total rows if parallel_aware */
 } Hash;
 
 /* ----------------