From 4c179ccb05062ebf29c2936e67842010d71742d0 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Fri, 14 Nov 2025 13:20:09 -0600 Subject: [PATCH] Add note about CreateStatistics()'s selective use of check_rights. Commit 5e4fcbe531 added a check_rights parameter to this function for use by ALTER TABLE commands that re-create statistics objects. However, we intentionally ignore check_rights when verifying relation ownership because this function's lookup could return a different answer than the caller's. This commit adds a note to this effect so that we remember it down the road. Reviewed-by: Noah Misch Backpatch-through: 14 --- src/backend/commands/statscmds.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/backend/commands/statscmds.c b/src/backend/commands/statscmds.c index b06758f5e85..38c76feb5c7 100644 --- a/src/backend/commands/statscmds.c +++ b/src/backend/commands/statscmds.c @@ -139,7 +139,13 @@ CreateStatistics(CreateStatsStmt *stmt, bool check_rights) errmsg("relation \"%s\" is not a table, foreign table, or materialized view", RelationGetRelationName(rel)))); - /* You must own the relation to create stats on it */ + /* + * You must own the relation to create stats on it. + * + * NB: Concurrent changes could cause this function's lookup to find a + * different relation than a previous lookup by the caller, so we must + * perform this check even when check_rights == false. + */ if (!pg_class_ownercheck(RelationGetRelid(rel), stxowner)) aclcheck_error(ACLCHECK_NOT_OWNER, get_relkind_objtype(rel->rd_rel->relkind), RelationGetRelationName(rel));