From e5bb363f514d768a4f540d9c82ad5745944b1486 Mon Sep 17 00:00:00 2001 From: Justin Pryzby Date: Mon, 30 Dec 2019 09:31:03 -0600 Subject: [PATCH v2 1/2] More specific error message when failing to alter a partitioned index.. "..is not an index" is deemed to be unfriendly https://www.postgresql.org/message-id/CA%2BTgmobq8_-DS7qDEmMi-4ARP1_0bkgFEjYfiK97L2eXq%2BQ%2Bnw%40mail.gmail.com --- src/backend/commands/tablecmds.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index b7c8d66..1b271af 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -366,7 +366,7 @@ static void ATRewriteTables(AlterTableStmt *parsetree, static void ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap, LOCKMODE lockmode); static AlteredTableInfo *ATGetQueueEntry(List **wqueue, Relation rel); static void ATSimplePermissions(Relation rel, int allowed_targets); -static void ATWrongRelkindError(Relation rel, int allowed_targets); +static void ATWrongRelkindError(Relation rel, int allowed_targets, int actual_target); static void ATSimpleRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, bool recurse, LOCKMODE lockmode, AlterTableUtilityContext *context); @@ -5458,7 +5458,7 @@ ATSimplePermissions(Relation rel, int allowed_targets) /* Wrong target type? */ if ((actual_target & allowed_targets) == 0) - ATWrongRelkindError(rel, allowed_targets); + ATWrongRelkindError(rel, allowed_targets, actual_target); /* Permissions checks */ if (!pg_class_ownercheck(RelationGetRelid(rel), GetUserId())) @@ -5479,7 +5479,7 @@ ATSimplePermissions(Relation rel, int allowed_targets) * type. */ static void -ATWrongRelkindError(Relation rel, int allowed_targets) +ATWrongRelkindError(Relation rel, int allowed_targets, int actual_target) { char *msg; @@ -5527,9 +5527,20 @@ ATWrongRelkindError(Relation rel, int allowed_targets) break; } - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg(msg, RelationGetRelationName(rel)))); + if (actual_target == ATT_PARTITIONED_INDEX && + (allowed_targets&ATT_INDEX) && + !(allowed_targets&ATT_PARTITIONED_INDEX)) + /* Add a special errhint for this case, since "is not an index" message is unfriendly */ + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg(msg, RelationGetRelationName(rel)), + // errhint("\"%s\" is a partitioned index", RelationGetRelationName(rel)))); + errhint("operation is not supported on partitioned indexes"))); + else + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg(msg, RelationGetRelationName(rel)))); + } /* -- 2.7.4