mirror of
https://github.com/postgres/postgres.git
synced 2025-08-05 07:41:25 +03:00
Remove ATPrepSetStatistics
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
This commit is contained in:
@@ -386,8 +386,6 @@ static ObjectAddress ATExecAddIdentity(Relation rel, const char *colName,
|
|||||||
static ObjectAddress ATExecSetIdentity(Relation rel, const char *colName,
|
static ObjectAddress ATExecSetIdentity(Relation rel, const char *colName,
|
||||||
Node *def, LOCKMODE lockmode);
|
Node *def, LOCKMODE lockmode);
|
||||||
static ObjectAddress ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, 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,
|
static ObjectAddress ATExecSetStatistics(Relation rel, const char *colName, int16 colNum,
|
||||||
Node *newValue, LOCKMODE lockmode);
|
Node *newValue, LOCKMODE lockmode);
|
||||||
static ObjectAddress ATExecSetOptions(Relation rel, const char *colName,
|
static ObjectAddress ATExecSetOptions(Relation rel, const char *colName,
|
||||||
@@ -3948,9 +3946,9 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd,
|
|||||||
pass = AT_PASS_COL_ATTRS;
|
pass = AT_PASS_COL_ATTRS;
|
||||||
break;
|
break;
|
||||||
case AT_SetStatistics: /* ALTER COLUMN SET STATISTICS */
|
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);
|
ATSimpleRecursion(wqueue, rel, cmd, recurse, lockmode);
|
||||||
/* Performs own permission checks */
|
/* No command-specific prep needed */
|
||||||
ATPrepSetStatistics(rel, cmd->name, cmd->num, cmd->def, lockmode);
|
|
||||||
pass = AT_PASS_MISC;
|
pass = AT_PASS_MISC;
|
||||||
break;
|
break;
|
||||||
case AT_SetOptions: /* ALTER COLUMN SET ( options ) */
|
case AT_SetOptions: /* ALTER COLUMN SET ( options ) */
|
||||||
@@ -6702,45 +6700,7 @@ ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, LOCKMODE
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* ALTER TABLE ALTER COLUMN SET STATISTICS
|
* ALTER TABLE ALTER COLUMN SET STATISTICS
|
||||||
*/
|
*
|
||||||
static void
|
|
||||||
ATPrepSetStatistics(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))));
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We allow referencing columns by numbers only for indexes, since table
|
|
||||||
* column numbers could contain gaps if columns are later dropped.
|
|
||||||
*/
|
|
||||||
if (rel->rd_rel->relkind != RELKIND_INDEX &&
|
|
||||||
rel->rd_rel->relkind != RELKIND_PARTITIONED_INDEX &&
|
|
||||||
!colName)
|
|
||||||
ereport(ERROR,
|
|
||||||
(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
|
* Return value is the address of the modified column
|
||||||
*/
|
*/
|
||||||
static ObjectAddress
|
static ObjectAddress
|
||||||
@@ -6753,6 +6713,17 @@ ATExecSetStatistics(Relation rel, const char *colName, int16 colNum, Node *newVa
|
|||||||
AttrNumber attnum;
|
AttrNumber attnum;
|
||||||
ObjectAddress address;
|
ObjectAddress address;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We allow referencing columns by numbers only for indexes, since table
|
||||||
|
* column numbers could contain gaps if columns are later dropped.
|
||||||
|
*/
|
||||||
|
if (rel->rd_rel->relkind != RELKIND_INDEX &&
|
||||||
|
rel->rd_rel->relkind != RELKIND_PARTITIONED_INDEX &&
|
||||||
|
!colName)
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
|
errmsg("cannot refer to non-index column by number")));
|
||||||
|
|
||||||
Assert(IsA(newValue, Integer));
|
Assert(IsA(newValue, Integer));
|
||||||
newtarget = intVal(newValue);
|
newtarget = intVal(newValue);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user