summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorAndres Freund2019-03-30 23:40:33 +0000
committerAndres Freund2019-03-31 02:26:36 +0000
commit696d78469f3714a8159f7a145af1fe9179fe3291 (patch)
treed8fe6c5543a3b388d80e1ee087bd15035542ccff /src/include
parent737a292b5de296615a715ddce2b2d83d1ee245c5 (diff)
tableam: Move heap specific logic from estimate_rel_size below tableam.
This just moves the table/matview[/toast] determination of relation size to a callback, and uses a copy of the existing logic to implement that callback for heap. It probably would make sense to also move the index specific logic into a callback, so the metapage handling (and probably more) can be index specific. But that's a separate task. Author: Andres Freund Discussion: https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de
Diffstat (limited to 'src/include')
-rw-r--r--src/include/access/tableam.h35
-rw-r--r--src/include/optimizer/plancat.h1
2 files changed, 36 insertions, 0 deletions
diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h
index 1f0eb2fdb7c..873ad153134 100644
--- a/src/include/access/tableam.h
+++ b/src/include/access/tableam.h
@@ -491,6 +491,22 @@ typedef struct TableAmRoutine
Snapshot snapshot,
struct ValidateIndexState *state);
+
+ /* ------------------------------------------------------------------------
+ * Planner related functions.
+ * ------------------------------------------------------------------------
+ */
+
+ /*
+ * See table_relation_estimate_size().
+ *
+ * While block oriented, it shouldn't be too hard to for an AM that
+ * doesn't internally use blocks to convert into a usable representation.
+ */
+ void (*relation_estimate_size) (Relation rel, int32 *attr_widths,
+ BlockNumber *pages, double *tuples,
+ double *allvisfrac);
+
} TableAmRoutine;
@@ -1287,6 +1303,25 @@ table_index_validate_scan(Relation heap_rel,
/* ----------------------------------------------------------------------------
+ * Planner related functionality
+ * ----------------------------------------------------------------------------
+ */
+
+/*
+ * Estimate the current size of the relation, as an AM specific workhorse for
+ * estimate_rel_size(). Look there for an explanation of the parameters.
+ */
+static inline void
+table_relation_estimate_size(Relation rel, int32 *attr_widths,
+ BlockNumber *pages, double *tuples,
+ double *allvisfrac)
+{
+ rel->rd_tableam->relation_estimate_size(rel, attr_widths, pages, tuples,
+ allvisfrac);
+}
+
+
+/* ----------------------------------------------------------------------------
* Functions to make modifications a bit simpler.
* ----------------------------------------------------------------------------
*/
diff --git a/src/include/optimizer/plancat.h b/src/include/optimizer/plancat.h
index c556e0f2589..3254613e6e4 100644
--- a/src/include/optimizer/plancat.h
+++ b/src/include/optimizer/plancat.h
@@ -33,6 +33,7 @@ extern List *infer_arbiter_indexes(PlannerInfo *root);
extern void estimate_rel_size(Relation rel, int32 *attr_widths,
BlockNumber *pages, double *tuples, double *allvisfrac);
+extern int32 get_rel_data_width(Relation rel, int32 *attr_widths);
extern int32 get_relation_data_width(Oid relid, int32 *attr_widths);
extern bool relation_excluded_by_constraints(PlannerInfo *root,