commit bb28cb5a69aae3bd9c7fbebc8b9483d23711bec4
Author: Shigeru Hanada <shigeru.hanada@gmail.com>
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 */
