commit bb28cb5a69aae3bd9c7fbebc8b9483d23711bec4 Author: Shigeru Hanada Date: Thu Feb 9 16:06:14 2012 +0900 Export functions which are useful for FDW analyze support. Export examine_attribute and update_attstats (with renaming to vac_update_attstats) which are useful (and nealy required) to implement short-cut version of ANALYZE handler in FDWs. diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c index 6a22d49..d0a323a 100644 --- a/src/backend/commands/analyze.c +++ b/src/backend/commands/analyze.c @@ -94,8 +94,6 @@ static void compute_index_stats(Relation onerel, double totalrows, AnlIndexData *indexdata, int nindexes, HeapTuple *rows, int numrows, MemoryContext col_context); -static VacAttrStats *examine_attribute(Relation onerel, int attnum, - Node *index_expr); static int acquire_sample_rows(Relation onerel, HeapTuple *rows, int targrows, double *totalrows, double *totaldeadrows, @@ -105,8 +103,6 @@ static int acquire_inherited_sample_rows(Relation onerel, double *totalrows, double *totaldeadrows, BlockNumber *totalpages, int elevel); static int compare_rows(const void *a, const void *b); -static void update_attstats(Oid relid, bool inh, - int natts, VacAttrStats **vacattrstats); static Datum std_fetch_func(VacAttrStatsP stats, int rownum, bool *isNull); static Datum ind_fetch_func(VacAttrStatsP stats, int rownum, bool *isNull); @@ -215,9 +211,9 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt, BufferAccessStrategy bstrategy) } /* - * We can ANALYZE any table except pg_statistic. See update_attstats. In - * addition, we can ANALYZE foreign tables if AnalyzeForeignTable callback - * routines of underlying foreign-data wrappers are implemented. + * We can ANALYZE any table except pg_statistic. See vac_update_attstats. + * In addition, we can ANALYZE foreign tables if AnalyzeForeignTable + * callback routines of underlying foreign-data wrappers are implemented. */ if (RelationGetRelid(onerel) == StatisticRelationId) { @@ -283,7 +279,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt, BufferAccessStrategy bstrategy) * Close source relation now, but keep lock so that no one deletes it * before we commit. (If someone did, they'd fail to clean up the entries * we made in pg_statistic. Also, releasing the lock before commit would - * expose us to concurrent-update failures in update_attstats.) + * expose us to concurrent-update failures in vac_update_attstats.) */ relation_close(onerel, NoLock); @@ -551,15 +547,15 @@ do_analyze_rel(Relation onerel, VacuumStmt *vacstmt, int elevel, * previous statistics for the target columns. (If there are stats in * pg_statistic for columns we didn't process, we leave them alone.) */ - update_attstats(RelationGetRelid(onerel), inh, - attr_cnt, vacattrstats); + vac_update_attstats(RelationGetRelid(onerel), inh, + attr_cnt, vacattrstats); for (ind = 0; ind < nindexes; ind++) { AnlIndexData *thisdata = &indexdata[ind]; - update_attstats(RelationGetRelid(Irel[ind]), false, - thisdata->attr_cnt, thisdata->vacattrstats); + vac_update_attstats(RelationGetRelid(Irel[ind]), false, + thisdata->attr_cnt, thisdata->vacattrstats); } } @@ -842,7 +838,7 @@ compute_index_stats(Relation onerel, double totalrows, * If index_expr isn't NULL, then we're trying to analyze an expression index, * and index_expr is the expression tree representing the column's data. */ -static VacAttrStats * +VacAttrStats * examine_attribute(Relation onerel, int attnum, Node *index_expr) { Form_pg_attribute attr = onerel->rd_att->attrs[attnum - 1]; @@ -1583,7 +1579,7 @@ acquire_inherited_sample_rows(Relation onerel, HeapTuple *rows, int targrows, /* - * update_attstats() -- update attribute statistics for one relation + * vac_update_attstats() -- update attribute statistics for one relation * * Statistics are stored in several places: the pg_class row for the * relation has stats about the whole relation, and there is a @@ -1604,8 +1600,8 @@ acquire_inherited_sample_rows(Relation onerel, HeapTuple *rows, int targrows, * ANALYZE the same table concurrently. Presently, we lock that out * by taking a self-exclusive lock on the relation in analyze_rel(). */ -static void -update_attstats(Oid relid, bool inh, int natts, VacAttrStats **vacattrstats) +void +vac_update_attstats(Oid relid, bool inh, int natts, VacAttrStats **vacattrstats) { Relation sd; int attno; diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h index 1530970..b165953 100644 --- a/src/include/commands/vacuum.h +++ b/src/include/commands/vacuum.h @@ -152,6 +152,10 @@ extern void vac_update_relstats(Relation relation, BlockNumber num_all_visible_pages, bool hasindex, TransactionId frozenxid); +extern void vac_update_attstats(Oid relid, + bool inh, + int natts, + VacAttrStats **vacattrstats); extern void vacuum_set_xid_limits(int freeze_min_age, int freeze_table_age, bool sharedRel, TransactionId *oldestXmin, @@ -177,6 +181,8 @@ extern void do_analyze_rel(Relation onerel, VacuumStmt *vacstmt, int elevel, extern double random_fract(void); extern double init_selection_state(int n); extern double get_next_S(double t, int n, double *stateptr); +extern VacAttrStats *examine_attribute(Relation onerel, int attnum, + Node *index_expr); #endif /* VACUUM_H */