summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Eisentraut2011-12-22 20:43:56 +0000
committerPeter Eisentraut2011-12-22 20:43:56 +0000
commitf90dd28062db2128a340fbe02f55829f15ab5561 (patch)
tree06636b98c913bfde151cc5ce2d62649f4a14eedb /src
parent8d15e3ec4fcb735875a8a70a09ec0c62153c3329 (diff)
Add ALTER DOMAIN ... RENAME
You could already rename domains using ALTER TYPE, but with this new command it is more consistent with how other commands treat domains as a subcategory of types.
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/alter.c3
-rw-r--r--src/backend/commands/typecmds.c11
-rw-r--r--src/backend/parser/gram.y8
-rw-r--r--src/include/commands/typecmds.h2
-rw-r--r--src/test/regress/expected/domain.out7
-rw-r--r--src/test/regress/sql/domain.sql10
6 files changed, 38 insertions, 3 deletions
diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c
index 8513837fa10..cc11858d174 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 ea8f7f099a2..811273a01d7 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 e0ff49f048a..7e8f39abdf7 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 0c328958635..0dcbcd6cfb4 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 69373efc55b..3e44e3b5331 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 449b4234a5c..1fd39008e68 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;