Add ALTER DOMAIN ... RENAME
authorPeter Eisentraut
Thu, 22 Dec 2011 20:43:56 +0000 (22:43 +0200)
committerPeter Eisentraut
Thu, 22 Dec 2011 20:43:56 +0000 (22:43 +0200)
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.

doc/src/sgml/ref/alter_domain.sgml
src/backend/commands/alter.c
src/backend/commands/typecmds.c
src/backend/parser/gram.y
src/include/commands/typecmds.h
src/test/regress/expected/domain.out
src/test/regress/sql/domain.sql

index 4f60fe334c0e5b569a58e85a0257db7af9b3ede4..29504ccd7cb155658b5147a3d62cb9ab284d9d32 100644 (file)
@@ -35,6 +35,8 @@ ALTER DOMAIN name
     VALIDATE CONSTRAINT constraint_name
 ALTER DOMAIN name
     OWNER TO new_owner
+ALTER DOMAIN name
+    RENAME TO new_name
 ALTER DOMAIN name
     SET SCHEMA new_schema
 
@@ -118,6 +120,15 @@ ALTER DOMAIN name
     
    
 
+   
+    RENAME
+    
+     
+      This form changes the name of the domain.
+     
+    
+   
+
    
     SET SCHEMA
     
@@ -203,6 +214,15 @@ ALTER DOMAIN name
       
      
 
+     
+      new_name
+      
+       
+        The new name for the domain.
+       
+      
+     
+
      
       new_owner
       
@@ -278,7 +298,7 @@ ALTER DOMAIN zipcode SET SCHEMA customers;
 
   
    ALTER DOMAIN conforms to the SQL
-   standard, except for the OWNER, SET SCHEMA and
+   standard, except for the OWNER, RENAMESET SCHEMA, and
    VALIDATE CONSTRAINT variants, which are
    PostgreSQL extensions.  The NOT VALID
    clause of the ADD CONSTRAINT variant is also a
index 8513837fa1033e3eb435fea3d493b1603261ee07..cc11858d1746237d5b1a7313434d5ff0fbf6efe1 100644 (file)
@@ -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:
index ea8f7f099a2c9820a2f0ed362d0cc931c7e58d74..811273a01d77661063b94c90c9f521638d2a109f 100644 (file)
@@ -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
index e0ff49f048a91883bbe48689270fd02c70eada34..7e8f39abdf7085dfe434adb93acce4cb11b2df25 100644 (file)
@@ -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);
index 0c328958635ed250a44c610b802e05fd4c12ef63..0dcbcd6cfb468fdc1074e14a305a3e9b45338f3c 100644 (file)
@@ -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);
index 69373efc55b01540414e55e441b1cef2b076669e..3e44e3b53316b5f4d4aa1df7d0a3a0df63c91a3a 100644 (file)
@@ -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;
index 449b4234a5c8b0bc688f43d53e290cb244a12be7..1fd39008e684dfcb75929f4a9175f99e1920cac2 100644 (file)
@@ -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;