diff options
| author | Andres Freund | 2019-03-30 23:40:33 +0000 |
|---|---|---|
| committer | Andres Freund | 2019-03-31 02:26:36 +0000 |
| commit | 696d78469f3714a8159f7a145af1fe9179fe3291 (patch) | |
| tree | d8fe6c5543a3b388d80e1ee087bd15035542ccff /src/include | |
| parent | 737a292b5de296615a715ddce2b2d83d1ee245c5 (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.h | 35 | ||||
| -rw-r--r-- | src/include/optimizer/plancat.h | 1 |
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, |
