OSDN Git Service

Improve error messages emitted when VACUUM and ANALYZE skip a table.
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Wed, 20 Feb 2008 14:31:35 +0000 (14:31 +0000)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Wed, 20 Feb 2008 14:31:35 +0000 (14:31 +0000)
Per gripe from Clodoaldo Pinto Neto on
Message-ID: <a595de7a0801060326qbfc790ax2a60573043c2e2be@mail.gmail.com>

src/backend/commands/analyze.c
src/backend/commands/vacuum.c

index 82bb020..4d2ea3c 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/analyze.c,v 1.114 2008/01/03 21:23:15 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/analyze.c,v 1.115 2008/02/20 14:31:35 alvherre Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -22,6 +22,7 @@
 #include "catalog/index.h"
 #include "catalog/indexing.h"
 #include "catalog/namespace.h"
+#include "catalog/pg_namespace.h"
 #include "commands/dbcommands.h"
 #include "commands/vacuum.h"
 #include "executor/executor.h"
@@ -161,9 +162,20 @@ analyze_rel(Oid relid, VacuumStmt *vacstmt,
        {
                /* No need for a WARNING if we already complained during VACUUM */
                if (!vacstmt->vacuum)
-                       ereport(WARNING,
-                                       (errmsg("skipping \"%s\" --- only table or database owner can analyze it",
-                                                       RelationGetRelationName(onerel))));
+               {
+                       if (onerel->rd_rel->relisshared)
+                               ereport(WARNING,
+                                               (errmsg("skipping \"%s\" --- only superuser can analyze it",
+                                                               RelationGetRelationName(onerel))));
+                       else if (onerel->rd_rel->relnamespace == PG_CATALOG_NAMESPACE)
+                               ereport(WARNING,
+                                               (errmsg("skipping \"%s\" --- only superuser or database owner can analyze it",
+                                                               RelationGetRelationName(onerel))));
+                       else
+                               ereport(WARNING,
+                                               (errmsg("skipping \"%s\" --- only table or database owner can analyze it",
+                                                               RelationGetRelationName(onerel))));
+               }
                relation_close(onerel, ShareUpdateExclusiveLock);
                return;
        }
index 20374f4..7e31ac4 100644 (file)
@@ -13,7 +13,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.364 2008/02/11 19:14:30 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/vacuum.c,v 1.365 2008/02/20 14:31:35 alvherre Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -30,6 +30,7 @@
 #include "access/xlog.h"
 #include "catalog/namespace.h"
 #include "catalog/pg_database.h"
+#include "catalog/pg_namespace.h"
 #include "commands/dbcommands.h"
 #include "commands/vacuum.h"
 #include "executor/executor.h"
@@ -1048,9 +1049,18 @@ vacuum_rel(Oid relid, VacuumStmt *vacstmt, char expected_relkind)
        if (!(pg_class_ownercheck(RelationGetRelid(onerel), GetUserId()) ||
                  (pg_database_ownercheck(MyDatabaseId, GetUserId()) && !onerel->rd_rel->relisshared)))
        {
-               ereport(WARNING,
-                               (errmsg("skipping \"%s\" --- only table or database owner can vacuum it",
-                                               RelationGetRelationName(onerel))));
+               if (onerel->rd_rel->relisshared)
+                       ereport(WARNING,
+                                       (errmsg("skipping \"%s\" --- only superuser can vacuum it",
+                                                       RelationGetRelationName(onerel))));
+               else if (onerel->rd_rel->relnamespace == PG_CATALOG_NAMESPACE)
+                       ereport(WARNING,
+                                       (errmsg("skipping \"%s\" --- only superuser or database owner can vacuum it",
+                                                       RelationGetRelationName(onerel))));
+               else
+                       ereport(WARNING,
+                                       (errmsg("skipping \"%s\" --- only table or database owner can vacuum it",
+                                                       RelationGetRelationName(onerel))));
                relation_close(onerel, lmode);
                CommitTransactionCommand();
                return;