aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/analyze.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/analyze.c')
-rw-r--r--src/backend/commands/analyze.c60
1 files changed, 38 insertions, 22 deletions
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index df9735089aa..ea778de3360 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.29 2002/03/21 23:27:20 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.30 2002/04/02 01:03:05 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -20,6 +20,7 @@
#include "access/tuptoaster.h"
#include "catalog/catname.h"
#include "catalog/indexing.h"
+#include "catalog/pg_namespace.h"
#include "catalog/pg_operator.h"
#include "catalog/pg_statistic.h"
#include "catalog/pg_type.h"
@@ -30,6 +31,7 @@
#include "utils/builtins.h"
#include "utils/datum.h"
#include "utils/fmgroids.h"
+#include "utils/lsyscache.h"
#include "utils/syscache.h"
#include "utils/tuplesort.h"
@@ -147,7 +149,6 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
numrows;
double totalrows;
HeapTuple *rows;
- HeapTuple tuple;
if (vacstmt->verbose)
elevel = INFO;
@@ -173,46 +174,61 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
* Race condition -- if the pg_class tuple has gone away since the
* last time we saw it, we don't need to process it.
*/
- tuple = SearchSysCache(RELOID,
- ObjectIdGetDatum(relid),
- 0, 0, 0);
- if (!HeapTupleIsValid(tuple))
+ if (!SearchSysCacheExists(RELOID,
+ ObjectIdGetDatum(relid),
+ 0, 0, 0))
{
CommitTransactionCommand();
return;
}
/*
- * We can ANALYZE any table except pg_statistic. See update_attstats
+ * Open the class, getting only a read lock on it, and check
+ * permissions. Permissions check should match vacuum's check!
*/
- if (strcmp(NameStr(((Form_pg_class) GETSTRUCT(tuple))->relname),
- StatisticRelationName) == 0)
+ onerel = relation_open(relid, AccessShareLock);
+
+ if (!(pg_class_ownercheck(RelationGetRelid(onerel), GetUserId()) ||
+ (is_dbadmin(MyDatabaseId) && !onerel->rd_rel->relisshared)))
{
- ReleaseSysCache(tuple);
+ /* No need for a WARNING if we already complained during VACUUM */
+ if (!vacstmt->vacuum)
+ elog(WARNING, "Skipping \"%s\" --- only table or database owner can ANALYZE it",
+ RelationGetRelationName(onerel));
+ relation_close(onerel, AccessShareLock);
CommitTransactionCommand();
return;
}
- ReleaseSysCache(tuple);
/*
- * Open the class, getting only a read lock on it, and check
- * permissions. Permissions check should match vacuum's check!
+ * Check that it's a plain table; we used to do this in getrels() but
+ * seems safer to check after we've locked the relation.
*/
- onerel = heap_open(relid, AccessShareLock);
-
- if (!(pg_class_ownercheck(RelationGetRelid(onerel), GetUserId()) ||
- (is_dbadmin(MyDatabaseId) && !onerel->rd_rel->relisshared)))
+ if (onerel->rd_rel->relkind != RELKIND_RELATION)
{
/* No need for a WARNING if we already complained during VACUUM */
if (!vacstmt->vacuum)
- elog(WARNING, "Skipping \"%s\" --- only table or database owner can ANALYZE it",
+ elog(WARNING, "Skipping \"%s\" --- can not process indexes, views or special system tables",
RelationGetRelationName(onerel));
- heap_close(onerel, NoLock);
+ relation_close(onerel, AccessShareLock);
+ CommitTransactionCommand();
+ return;
+ }
+
+ /*
+ * We can ANALYZE any table except pg_statistic. See update_attstats
+ */
+ if (RelationGetNamespace(onerel) == PG_CATALOG_NAMESPACE &&
+ strcmp(RelationGetRelationName(onerel), StatisticRelationName) == 0)
+ {
+ relation_close(onerel, AccessShareLock);
CommitTransactionCommand();
return;
}
- elog(elevel, "Analyzing %s", RelationGetRelationName(onerel));
+ elog(elevel, "Analyzing %s.%s",
+ get_namespace_name(RelationGetNamespace(onerel)),
+ RelationGetRelationName(onerel));
/*
* Determine which columns to analyze
@@ -266,7 +282,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
*/
if (attr_cnt <= 0)
{
- heap_close(onerel, NoLock);
+ relation_close(onerel, NoLock);
CommitTransactionCommand();
return;
}
@@ -353,7 +369,7 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt)
* before we commit. (If someone did, they'd fail to clean up the
* entries we made in pg_statistic.)
*/
- heap_close(onerel, NoLock);
+ relation_close(onerel, NoLock);
/* Commit and release working memory */
CommitTransactionCommand();