Code cleanup for REINDEX DATABASE/SCHEMA/SYSTEM.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 8 Mar 2015 16:18:43 +0000 (12:18 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 8 Mar 2015 16:18:43 +0000 (12:18 -0400)
Fix some minor infelicities.  Some of these things were introduced in
commit fe263d115a7dd16095b8b8f1e943aff2bb4574d2, and some are older.

src/backend/commands/indexcmds.c
src/backend/tcop/utility.c
src/include/commands/defrem.h

index 6563f2bb5bf3aa751d982b9815eb6bc2ebffbdb4..1c1d0da448d83708e3ee898a8acffa9f0d45e68f 100644 (file)
@@ -1780,26 +1780,26 @@ ReindexTable(RangeVar *relation)
 }
 
 /*
- * ReindexObject
- *     Recreate indexes of object whose type is defined by objectKind.
+ * ReindexMultipleTables
+ *     Recreate indexes of tables selected by objectName/objectKind.
  *
  * To reduce the probability of deadlocks, each table is reindexed in a
  * separate transaction, so we can release the lock on it right away.
  * That means this must not be called within a user transaction block!
  */
-Oid
-ReindexObject(const char *objectName, ReindexObjectType objectKind)
+void
+ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind)
 {
    Oid         objectOid;
    Relation    relationRelation;
    HeapScanDesc scan;
-   ScanKeyData *scan_keys = NULL;
+   ScanKeyData scan_keys[1];
    HeapTuple   tuple;
    MemoryContext private_context;
    MemoryContext old;
    List       *relids = NIL;
    ListCell   *l;
-   int num_keys;
+   int         num_keys;
 
    AssertArg(objectName);
    Assert(objectKind == REINDEX_OBJECT_SCHEMA ||
@@ -1807,10 +1807,10 @@ ReindexObject(const char *objectName, ReindexObjectType objectKind)
           objectKind == REINDEX_OBJECT_DATABASE);
 
    /*
-    * Get OID of object to reindex, being the database currently being
-    * used by session for a database or for system catalogs, or the schema
-    * defined by caller. At the same time do permission checks that need
-    * different processing depending on the object type.
+    * Get OID of object to reindex, being the database currently being used
+    * by session for a database or for system catalogs, or the schema defined
+    * by caller. At the same time do permission checks that need different
+    * processing depending on the object type.
     */
    if (objectKind == REINDEX_OBJECT_SCHEMA)
    {
@@ -1824,11 +1824,11 @@ ReindexObject(const char *objectName, ReindexObjectType objectKind)
    {
        objectOid = MyDatabaseId;
 
-       if (strcmp(objectName, get_database_name(MyDatabaseId)) != 0)
+       if (strcmp(objectName, get_database_name(objectOid)) != 0)
            ereport(ERROR,
                    (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                     errmsg("can only reindex the currently open database")));
-       if (!pg_database_ownercheck(MyDatabaseId, GetUserId()))
+       if (!pg_database_ownercheck(objectOid, GetUserId()))
            aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_DATABASE,
                           objectName);
    }
@@ -1840,42 +1840,19 @@ ReindexObject(const char *objectName, ReindexObjectType objectKind)
     * abort cleanup logic.
     */
    private_context = AllocSetContextCreate(PortalContext,
-                                           (objectKind == REINDEX_OBJECT_SCHEMA) ?
-                                           "ReindexSchema" : "ReindexDatabase",
+                                           "ReindexMultipleTables",
                                            ALLOCSET_DEFAULT_MINSIZE,
                                            ALLOCSET_DEFAULT_INITSIZE,
                                            ALLOCSET_DEFAULT_MAXSIZE);
 
    /*
-    * We always want to reindex pg_class first when reindexing system
-    * catalogs or a database.  This ensures that if there is any corruption
-    * in pg_class' indexes, they will be fixed before we process any other
-    * tables.  This is critical because reindexing itself will try to
-    * update pg_class.
-    */
-   if (objectKind == REINDEX_OBJECT_DATABASE ||
-       objectKind == REINDEX_OBJECT_SYSTEM ||
-       (objectKind == REINDEX_OBJECT_SCHEMA &&
-        IsSystemNamespace(objectOid)))
-   {
-       old = MemoryContextSwitchTo(private_context);
-       relids = lappend_oid(relids, RelationRelationId);
-       MemoryContextSwitchTo(old);
-   }
-
-   /*
-    * Define the search keys to find the objects to reindex. For a schema,
-    * we search target relations using relnamespace and relkind, something
-    * not necessary for a database-wide operation.
+    * Define the search keys to find the objects to reindex. For a schema, we
+    * select target relations using relnamespace, something not necessary for
+    * a database-wide operation.
     */
    if (objectKind == REINDEX_OBJECT_SCHEMA)
    {
-       /*
-        * Return all objects in schema. We filter out
-        * inappropriate objects as we walk through results.
-        */
        num_keys = 1;
-       scan_keys = palloc(sizeof(ScanKeyData));
        ScanKeyInit(&scan_keys[0],
                    Anum_pg_class_relnamespace,
                    BTEqualStrategyNumber, F_OIDEQ,
@@ -1898,8 +1875,8 @@ ReindexObject(const char *objectName, ReindexObjectType objectKind)
        Oid         relid = HeapTupleGetOid(tuple);
 
        /*
-        * Only regular tables and matviews can have indexes,
-        * so filter out any other kind of object.
+        * Only regular tables and matviews can have indexes, so ignore any
+        * other kind of relation.
         */
        if (classtuple->relkind != RELKIND_RELATION &&
            classtuple->relkind != RELKIND_MATVIEW)
@@ -1911,20 +1888,25 @@ ReindexObject(const char *objectName, ReindexObjectType objectKind)
            continue;
 
        /* Check user/system classification, and optionally skip */
-       if (!IsSystemClass(relid, classtuple) &&
-           objectKind == REINDEX_OBJECT_SYSTEM)
+       if (objectKind == REINDEX_OBJECT_SYSTEM &&
+           !IsSystemClass(relid, classtuple))
            continue;
 
+       /* Save the list of relation OIDs in private context */
+       old = MemoryContextSwitchTo(private_context);
+
        /*
-        * Already have it in the case of system catalogs being all
-        * reindexed, of a database or of a system catalog being reindexed
-        * as a schema.
+        * We always want to reindex pg_class first if it's selected to be
+        * reindexed.  This ensures that if there is any corruption in
+        * pg_class' indexes, they will be fixed before we process any other
+        * tables.  This is critical because reindexing itself will try to
+        * update pg_class.
         */
-       if (HeapTupleGetOid(tuple) == RelationRelationId)
-           continue;
+       if (relid == RelationRelationId)
+           relids = lcons_oid(relid, relids);
+       else
+           relids = lappend_oid(relids, relid);
 
-       old = MemoryContextSwitchTo(private_context);
-       relids = lappend_oid(relids, relid);
        MemoryContextSwitchTo(old);
    }
    heap_endscan(scan);
@@ -1953,8 +1935,4 @@ ReindexObject(const char *objectName, ReindexObjectType objectKind)
    StartTransactionCommand();
 
    MemoryContextDelete(private_context);
-   if (scan_keys)
-       pfree(scan_keys);
-
-   return objectOid;
 }
index e2e718e216aa27701a2f8cb74cf82bf25f4e38cf..126e38d7f73935812c15bbaf2076137fb97fd146 100644 (file)
@@ -756,7 +756,7 @@ standard_ProcessUtility(Node *parsetree,
                                                (stmt->kind == REINDEX_OBJECT_SCHEMA) ? "REINDEX SCHEMA" :
                                                (stmt->kind == REINDEX_OBJECT_SYSTEM) ? "REINDEX SYSTEM" :
                                                "REINDEX DATABASE");
-                       ReindexObject(stmt->name, stmt->kind);
+                       ReindexMultipleTables(stmt->name, stmt->kind);
                        break;
                    default:
                        elog(ERROR, "unrecognized object type: %d",
index 9e3e93b605554b8de179ce5d8ddcca722d71a17d..a9c67838a63560cdebadfe80749432df9e8d35aa 100644 (file)
@@ -31,7 +31,7 @@ extern ObjectAddress DefineIndex(Oid relationId,
            bool quiet);
 extern Oid ReindexIndex(RangeVar *indexRelation);
 extern Oid ReindexTable(RangeVar *relation);
-extern Oid ReindexObject(const char *databaseName, ReindexObjectType kind);
+extern void ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind);
 extern char *makeObjectName(const char *name1, const char *name2,
               const char *label);
 extern char *ChooseRelationName(const char *name1, const char *name2,