Remove ATPrepSetStatistics
authorPeter Eisentraut <peter@eisentraut.org>
Wed, 11 Dec 2019 07:59:18 +0000 (08:59 +0100)
committerPeter Eisentraut <peter@eisentraut.org>
Wed, 11 Dec 2019 08:04:04 +0000 (09:04 +0100)
It was once possible to do ALTER TABLE ... SET STATISTICS on system
tables without allow_sytem_table_mods.  This was changed apparently by
accident between PostgreSQL 9.1 and 9.2, but a code comment still
claimed this was possible.  Without that functionality, having a
separate ATPrepSetStatistics() is useless, so use the generic
ATSimplePermissions() instead and move the remaining custom code into
ATExecSetStatistics().

Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://www.postgresql.org/message-id/flat/cc8d2648-a0ec-7a86-13e5-db473484e19e%402ndquadrant.com

src/backend/commands/tablecmds.c

index 5440eb90153d10b5081408194d19988df3a66b16..daa80ec4aa0bee57abbf444935146e1f9f13c86f 100644 (file)
@@ -386,8 +386,6 @@ static ObjectAddress ATExecAddIdentity(Relation rel, const char *colName,
 static ObjectAddress ATExecSetIdentity(Relation rel, const char *colName,
                                                                           Node *def, LOCKMODE lockmode);
 static ObjectAddress ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, LOCKMODE lockmode);
-static void ATPrepSetStatistics(Relation rel, const char *colName, int16 colNum,
-                                                               Node *newValue, LOCKMODE lockmode);
 static ObjectAddress ATExecSetStatistics(Relation rel, const char *colName, int16 colNum,
                                                                                 Node *newValue, LOCKMODE lockmode);
 static ObjectAddress ATExecSetOptions(Relation rel, const char *colName,
@@ -3948,9 +3946,9 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd,
                        pass = AT_PASS_COL_ATTRS;
                        break;
                case AT_SetStatistics:  /* ALTER COLUMN SET STATISTICS */
+                       ATSimplePermissions(rel, ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE);
                        ATSimpleRecursion(wqueue, rel, cmd, recurse, lockmode);
-                       /* Performs own permission checks */
-                       ATPrepSetStatistics(rel, cmd->name, cmd->num, cmd->def, lockmode);
+                       /* No command-specific prep needed */
                        pass = AT_PASS_MISC;
                        break;
                case AT_SetOptions:             /* ALTER COLUMN SET ( options ) */
@@ -6702,26 +6700,18 @@ ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, LOCKMODE
 
 /*
  * ALTER TABLE ALTER COLUMN SET STATISTICS
+ *
+ * Return value is the address of the modified column
  */
-static void
-ATPrepSetStatistics(Relation rel, const char *colName, int16 colNum, Node *newValue, LOCKMODE lockmode)
+static ObjectAddress
+ATExecSetStatistics(Relation rel, const char *colName, int16 colNum, Node *newValue, LOCKMODE lockmode)
 {
-       /*
-        * We do our own permission checking because (a) we want to allow SET
-        * STATISTICS on indexes (for expressional index columns), and (b) we want
-        * to allow SET STATISTICS on system catalogs without requiring
-        * allowSystemTableMods to be turned on.
-        */
-       if (rel->rd_rel->relkind != RELKIND_RELATION &&
-               rel->rd_rel->relkind != RELKIND_MATVIEW &&
-               rel->rd_rel->relkind != RELKIND_INDEX &&
-               rel->rd_rel->relkind != RELKIND_PARTITIONED_INDEX &&
-               rel->rd_rel->relkind != RELKIND_FOREIGN_TABLE &&
-               rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
-               ereport(ERROR,
-                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
-                                errmsg("\"%s\" is not a table, materialized view, index, or foreign table",
-                                               RelationGetRelationName(rel))));
+       int                     newtarget;
+       Relation        attrelation;
+       HeapTuple       tuple;
+       Form_pg_attribute attrtuple;
+       AttrNumber      attnum;
+       ObjectAddress address;
 
        /*
         * We allow referencing columns by numbers only for indexes, since table
@@ -6734,25 +6724,6 @@ ATPrepSetStatistics(Relation rel, const char *colName, int16 colNum, Node *newVa
                                (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                                 errmsg("cannot refer to non-index column by number")));
 
-       /* Permissions checks */
-       if (!pg_class_ownercheck(RelationGetRelid(rel), GetUserId()))
-               aclcheck_error(ACLCHECK_NOT_OWNER, get_relkind_objtype(rel->rd_rel->relkind),
-                                          RelationGetRelationName(rel));
-}
-
-/*
- * Return value is the address of the modified column
- */
-static ObjectAddress
-ATExecSetStatistics(Relation rel, const char *colName, int16 colNum, Node *newValue, LOCKMODE lockmode)
-{
-       int                     newtarget;
-       Relation        attrelation;
-       HeapTuple       tuple;
-       Form_pg_attribute attrtuple;
-       AttrNumber      attnum;
-       ObjectAddress address;
-
        Assert(IsA(newValue, Integer));
        newtarget = intVal(newValue);