diff --git a/doc/src/sgml/ref/alter_domain.sgml b/doc/src/sgml/ref/alter_domain.sgml index 4f60fe334c0e5b569a58e85a0257db7af9b3ede4..29504ccd7cb155658b5147a3d62cb9ab284d9d32 100644 --- a/doc/src/sgml/ref/alter_domain.sgml +++ b/doc/src/sgml/ref/alter_domain.sgml @@ -35,6 +35,8 @@ ALTER DOMAIN <replaceable class="PARAMETER">name</replaceable> VALIDATE CONSTRAINT <replaceable class="PARAMETER">constraint_name</replaceable> ALTER DOMAIN <replaceable class="PARAMETER">name</replaceable> OWNER TO <replaceable class="PARAMETER">new_owner</replaceable> +ALTER DOMAIN <replaceable class="PARAMETER">name</replaceable> + RENAME TO <replaceable class="PARAMETER">new_name</replaceable> ALTER DOMAIN <replaceable class="PARAMETER">name</replaceable> SET SCHEMA <replaceable class="PARAMETER">new_schema</replaceable> </synopsis> @@ -118,6 +120,15 @@ ALTER DOMAIN <replaceable class="PARAMETER">name</replaceable> </listitem> </varlistentry> + <varlistentry> + <term><literal>RENAME</literal></term> + <listitem> + <para> + This form changes the name of the domain. + </para> + </listitem> + </varlistentry> + <varlistentry> <term>SET SCHEMA</term> <listitem> @@ -203,6 +214,15 @@ ALTER DOMAIN <replaceable class="PARAMETER">name</replaceable> </listitem> </varlistentry> + <varlistentry> + <term><replaceable class="PARAMETER">new_name</replaceable></term> + <listitem> + <para> + The new name for the domain. + </para> + </listitem> + </varlistentry> + <varlistentry> <term><replaceable class="PARAMETER">new_owner</replaceable></term> <listitem> @@ -278,7 +298,7 @@ ALTER DOMAIN zipcode SET SCHEMA customers; <para> <command>ALTER DOMAIN</command> conforms to the <acronym>SQL</acronym> - standard, except for the <literal>OWNER</>, <literal>SET SCHEMA</> and + standard, except for the <literal>OWNER</>, <literal>RENAME</literal>, <literal>SET SCHEMA</>, and <literal>VALIDATE CONSTRAINT</> variants, which are <productname>PostgreSQL</productname> extensions. The <literal>NOT VALID</> clause of the <literal>ADD CONSTRAINT</> variant is also a diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c index 8513837fa1033e3eb435fea3d493b1603261ee07..cc11858d1746237d5b1a7313434d5ff0fbf6efe1 100644 --- a/src/backend/commands/alter.c +++ b/src/backend/commands/alter.c @@ -134,8 +134,9 @@ ExecRenameStmt(RenameStmt *stmt) RenameTSConfiguration(stmt->object, stmt->newname); break; + case OBJECT_DOMAIN: case OBJECT_TYPE: - RenameType(stmt->object, stmt->newname); + RenameType(stmt); break; default: diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c index ea8f7f099a2c9820a2f0ed362d0cc931c7e58d74..811273a01d77661063b94c90c9f521638d2a109f 100644 --- a/src/backend/commands/typecmds.c +++ b/src/backend/commands/typecmds.c @@ -3074,8 +3074,10 @@ GetDomainConstraints(Oid typeOid) * Execute ALTER TYPE RENAME */ void -RenameType(List *names, const char *newTypeName) +RenameType(RenameStmt *stmt) { + List *names = stmt->object; + const char *newTypeName = stmt->newname; TypeName *typename; Oid typeOid; Relation rel; @@ -3099,6 +3101,13 @@ RenameType(List *names, const char *newTypeName) aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_TYPE, format_type_be(typeOid)); + /* ALTER DOMAIN used on a non-domain? */ + if (stmt->renameType == OBJECT_DOMAIN && typTup->typtype != TYPTYPE_DOMAIN) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is not a domain", + format_type_be(typeOid)))); + /* * If it's a composite type, we need to check that it really is a * free-standing composite type, and not a table's rowtype. We want people diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index e0ff49f048a91883bbe48689270fd02c70eada34..7e8f39abdf7085dfe434adb93acce4cb11b2df25 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -6451,6 +6451,14 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->newname = $6; $$ = (Node *)n; } + | ALTER DOMAIN_P any_name RENAME TO name + { + RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_DOMAIN; + n->object = $3; + n->newname = $6; + $$ = (Node *)n; + } | ALTER FOREIGN DATA_P WRAPPER name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); diff --git a/src/include/commands/typecmds.h b/src/include/commands/typecmds.h index 0c328958635ed250a44c610b802e05fd4c12ef63..0dcbcd6cfb468fdc1074e14a305a3e9b45338f3c 100644 --- a/src/include/commands/typecmds.h +++ b/src/include/commands/typecmds.h @@ -37,7 +37,7 @@ extern void AlterDomainDropConstraint(List *names, const char *constrName, extern List *GetDomainConstraints(Oid typeOid); -extern void RenameType(List *names, const char *newTypeName); +extern void RenameType(RenameStmt *stmt); extern void AlterTypeOwner(List *names, Oid newOwnerId); extern void AlterTypeOwnerInternal(Oid typeOid, Oid newOwnerId, bool hasDependEntry); diff --git a/src/test/regress/expected/domain.out b/src/test/regress/expected/domain.out index 69373efc55b01540414e55e441b1cef2b076669e..3e44e3b53316b5f4d4aa1df7d0a3a0df63c91a3a 100644 --- a/src/test/regress/expected/domain.out +++ b/src/test/regress/expected/domain.out @@ -648,3 +648,10 @@ select array_elem_check(-1); ERROR: value for domain orderedpair violates check constraint "orderedpair_check" CONTEXT: PL/pgSQL function "array_elem_check" line 5 at assignment drop function array_elem_check(int); +-- +-- Renaming +-- +create domain testdomain1 as int; +alter domain testdomain1 rename to testdomain2; +alter type testdomain2 rename to testdomain3; -- alter type also works +drop domain testdomain3; diff --git a/src/test/regress/sql/domain.sql b/src/test/regress/sql/domain.sql index 449b4234a5c8b0bc688f43d53e290cb244a12be7..1fd39008e684dfcb75929f4a9175f99e1920cac2 100644 --- a/src/test/regress/sql/domain.sql +++ b/src/test/regress/sql/domain.sql @@ -483,3 +483,13 @@ select array_elem_check(3); select array_elem_check(-1); drop function array_elem_check(int); + + +-- +-- Renaming +-- + +create domain testdomain1 as int; +alter domain testdomain1 rename to testdomain2; +alter type testdomain2 rename to testdomain3; -- alter type also works +drop domain testdomain3;