@@ -386,8 +386,6 @@ static ObjectAddress ATExecAddIdentity(Relation rel, const char *colName,
386386static ObjectAddress ATExecSetIdentity(Relation rel, const char *colName,
387387 Node *def, LOCKMODE lockmode);
388388static ObjectAddress ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, LOCKMODE lockmode);
389- static void ATPrepSetStatistics(Relation rel, const char *colName, int16 colNum,
390- Node *newValue, LOCKMODE lockmode);
391389static ObjectAddress ATExecSetStatistics(Relation rel, const char *colName, int16 colNum,
392390 Node *newValue, LOCKMODE lockmode);
393391static ObjectAddress ATExecSetOptions(Relation rel, const char *colName,
@@ -3948,9 +3946,9 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd,
39483946 pass = AT_PASS_COL_ATTRS;
39493947 break;
39503948 case AT_SetStatistics: /* ALTER COLUMN SET STATISTICS */
3949+ ATSimplePermissions(rel, ATT_TABLE | ATT_MATVIEW | ATT_INDEX | ATT_PARTITIONED_INDEX | ATT_FOREIGN_TABLE);
39513950 ATSimpleRecursion(wqueue, rel, cmd, recurse, lockmode);
3952- /* Performs own permission checks */
3953- ATPrepSetStatistics(rel, cmd->name, cmd->num, cmd->def, lockmode);
3951+ /* No command-specific prep needed */
39543952 pass = AT_PASS_MISC;
39553953 break;
39563954 case AT_SetOptions: /* ALTER COLUMN SET ( options ) */
@@ -6702,26 +6700,18 @@ ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, LOCKMODE
67026700
67036701/*
67046702 * ALTER TABLE ALTER COLUMN SET STATISTICS
6703+ *
6704+ * Return value is the address of the modified column
67056705 */
6706- static void
6707- ATPrepSetStatistics (Relation rel, const char *colName, int16 colNum, Node *newValue, LOCKMODE lockmode)
6706+ static ObjectAddress
6707+ ATExecSetStatistics (Relation rel, const char *colName, int16 colNum, Node *newValue, LOCKMODE lockmode)
67086708{
6709- /*
6710- * We do our own permission checking because (a) we want to allow SET
6711- * STATISTICS on indexes (for expressional index columns), and (b) we want
6712- * to allow SET STATISTICS on system catalogs without requiring
6713- * allowSystemTableMods to be turned on.
6714- */
6715- if (rel->rd_rel->relkind != RELKIND_RELATION &&
6716- rel->rd_rel->relkind != RELKIND_MATVIEW &&
6717- rel->rd_rel->relkind != RELKIND_INDEX &&
6718- rel->rd_rel->relkind != RELKIND_PARTITIONED_INDEX &&
6719- rel->rd_rel->relkind != RELKIND_FOREIGN_TABLE &&
6720- rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
6721- ereport(ERROR,
6722- (errcode(ERRCODE_WRONG_OBJECT_TYPE),
6723- errmsg("\"%s\" is not a table, materialized view, index, or foreign table",
6724- RelationGetRelationName(rel))));
6709+ int newtarget;
6710+ Relation attrelation;
6711+ HeapTuple tuple;
6712+ Form_pg_attribute attrtuple;
6713+ AttrNumber attnum;
6714+ ObjectAddress address;
67256715
67266716 /*
67276717 * 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
67346724 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
67356725 errmsg("cannot refer to non-index column by number")));
67366726
6737- /* Permissions checks */
6738- if (!pg_class_ownercheck(RelationGetRelid(rel), GetUserId()))
6739- aclcheck_error(ACLCHECK_NOT_OWNER, get_relkind_objtype(rel->rd_rel->relkind),
6740- RelationGetRelationName(rel));
6741- }
6742-
6743- /*
6744- * Return value is the address of the modified column
6745- */
6746- static ObjectAddress
6747- ATExecSetStatistics(Relation rel, const char *colName, int16 colNum, Node *newValue, LOCKMODE lockmode)
6748- {
6749- int newtarget;
6750- Relation attrelation;
6751- HeapTuple tuple;
6752- Form_pg_attribute attrtuple;
6753- AttrNumber attnum;
6754- ObjectAddress address;
6755-
67566727 Assert(IsA(newValue, Integer));
67576728 newtarget = intVal(newValue);
67586729
0 commit comments