Add ALTER VIEW ... RENAME TO, and a RENAME TO clause to ALTER SEQUENCE.
authorNeil Conway
Tue, 3 Jul 2007 01:30:37 +0000 (01:30 +0000)
committerNeil Conway
Tue, 3 Jul 2007 01:30:37 +0000 (01:30 +0000)
Sequences and views could previously be renamed using ALTER TABLE, but
this was a repeated source of confusion for users. Update the docs,
and psql tab completion. Patch from David Fetter; various minor fixes
by myself.

12 files changed:
doc/src/sgml/ref/allfiles.sgml
doc/src/sgml/ref/alter_sequence.sgml
doc/src/sgml/ref/alter_view.sgml [new file with mode: 0644]
doc/src/sgml/ref/create_view.sgml
doc/src/sgml/ref/drop_view.sgml
doc/src/sgml/reference.sgml
src/backend/commands/alter.c
src/backend/commands/tablecmds.c
src/backend/parser/gram.y
src/backend/tcop/utility.c
src/bin/psql/tab-complete.c
src/include/commands/tablecmds.h

index 90ad9adc53c3fe1e051bf6ed28bf773ea3192154..3e08b55bab12a1f3b88347bfbcdad821cc675bca 100644 (file)
@@ -1,5 +1,5 @@
 
@@ -25,6 +25,7 @@ Complete list of usable sgml source files in this directory.
 
 
 
+
 
 
 
index 37c2ceb6314c8db13a6c39473fd4be47dd354727..c2bc3cd8bf516479603f50bd88af448525348f24 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -29,6 +29,7 @@ ALTER SEQUENCE name [ INCREMENT [ B
     [ RESTART [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
     [ OWNED BY { table.column | NONE } ]
 ALTER SEQUENCE name SET SCHEMA new_schema
+ALTER SEQUENCE name RENAME TO new_name
   
  
 
@@ -182,14 +183,24 @@ ALTER SEQUENCE name SET SCHEMA 
     
    
 
-     
-      new_schema
-      
-       
-        The new schema for the sequence.
-       
-      
-     
+   
+    new_schema
+    
+     
+      The new schema for the sequence.
+     
+    
+   
+
+   
+    new_name
+    
+     
+      The new name for the sequence.
+     
+    
+   
+
     
    
   
diff --git a/doc/src/sgml/ref/alter_view.sgml b/doc/src/sgml/ref/alter_view.sgml
new file mode 100644 (file)
index 0000000..62723c7
--- /dev/null
@@ -0,0 +1,88 @@
+
+
+
+  ALTER VIEW
+  SQL - Language Statements
+
+  ALTER VIEW
+  change the definition of a view
+   
+  
+  ALTER VIEW
+
+
+ALTER VIEW name RENAME TO newname
+
+  
+  Description
+
+  
+   ALTER VIEW changes the definition of a
+   view. To execute this command you must be the owner of the view.
+  
+  
+  Parameters
+
+  
+   
+    name
+    
+     
+      The name (optionally schema-qualified) of an existing view.
+     
+    
+   
+
+   
+    newname
+    
+     
+      The new name of the view.
+     
+    
+   
+  
+
+  Examples
+
+  
+   To rename the view foo to
+   bar:
+
+ALTER VIEW foo RENAME TO bar;
+
+  
+
+  Compatibility
+
+  
+   ALTER VIEW is a PostgreSQL
+   extension of the SQL standard.
+  
+
+  See Also
+
+  
+   
+   
+  
+
index f1466c867800acb99c922775aab64eb6302a9196..1ad50f05d2ef80735f5e2436b33eef26d46ef19f 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -226,6 +226,7 @@ CREATE VIEW name [ ( 
   See Also
 
   
+   
    
   
  
index 03a8d4aa0e2d7a2257ed24810f95e00a64a36d96..b531c6d235b20cbb02182111c92be069f8088acd 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -104,6 +104,7 @@ DROP VIEW kinds;
   See Also
 
   
+   
    
   
  
index 06699a5b34ba920d8afe4d3c424a650d91e697f2..a52fe7a9644b6c12ddba13d48bc52c6ec1ce10bc 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
 
  Reference
@@ -53,6 +53,7 @@
    &alterTrigger;
    &alterType;
    &alterUser;
+   &alterView;
    &analyze;
    &begin;
    &checkpoint;
index 118e4adb16650ea86088c46468ce97bdae03c1c1..7cd347b69f99fcec98e16df4025669df3290c950 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/alter.c,v 1.23 2007/03/26 16:58:38 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/alter.c,v 1.24 2007/07/03 01:30:36 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -83,6 +83,8 @@ ExecRenameStmt(RenameStmt *stmt)
            break;
 
        case OBJECT_TABLE:
+       case OBJECT_SEQUENCE:
+       case OBJECT_VIEW:
        case OBJECT_INDEX:
        case OBJECT_COLUMN:
        case OBJECT_TRIGGER:
@@ -96,6 +98,8 @@ ExecRenameStmt(RenameStmt *stmt)
                switch (stmt->renameType)
                {
                    case OBJECT_TABLE:
+                   case OBJECT_SEQUENCE:
+                   case OBJECT_VIEW:
                    case OBJECT_INDEX:
                        {
                            /*
@@ -113,7 +117,7 @@ ExecRenameStmt(RenameStmt *stmt)
                                aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
                                            get_namespace_name(namespaceId));
 
-                           renamerel(relid, stmt->newname);
+                           renamerel(relid, stmt->newname, stmt->renameType);
                            break;
                        }
                    case OBJECT_COLUMN:
index f50b59d0d8fa8dab7d4d9886fdc9f997c49c94cc..4bc2a25fcddde07c275e10c50f4cddcd7097c543 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.228 2007/06/23 22:12:50 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.229 2007/07/03 01:30:36 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -41,6 +41,7 @@
 #include "executor/executor.h"
 #include "miscadmin.h"
 #include "nodes/makefuncs.h"
+#include "nodes/parsenodes.h"
 #include "optimizer/clauses.h"
 #include "optimizer/plancat.h"
 #include "optimizer/prep.h"
@@ -1621,7 +1622,7 @@ renameatt(Oid myrelid,
  *           sequence, AFAIK there's no need for it to be there.
  */
 void
-renamerel(Oid myrelid, const char *newrelname)
+renamerel(Oid myrelid, const char *newrelname, ObjectType reltype)
 {
    Relation    targetrelation;
    Relation    relrelation;    /* for RELATION relation */
@@ -1633,8 +1634,8 @@ renamerel(Oid myrelid, const char *newrelname)
    bool        relhastriggers;
 
    /*
-    * Grab an exclusive lock on the target table or index, which we will NOT
-    * release until end of transaction.
+    * Grab an exclusive lock on the target table, index, sequence or
+    * view, which we will NOT release until end of transaction.
     */
    targetrelation = relation_open(myrelid, AccessExclusiveLock);
 
@@ -1647,7 +1648,24 @@ renamerel(Oid myrelid, const char *newrelname)
                 errmsg("permission denied: \"%s\" is a system catalog",
                        RelationGetRelationName(targetrelation))));
 
+   /*
+    * For compatibility with prior releases, we don't complain if
+    * ALTER TABLE or ALTER INDEX is used to rename a sequence or
+    * view.
+    */
    relkind = targetrelation->rd_rel->relkind;
+   if (reltype == OBJECT_SEQUENCE && relkind != 'S')
+       ereport(ERROR,
+               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                errmsg("\"%s\" is not a sequence",
+                       RelationGetRelationName(targetrelation))));
+
+   if (reltype == OBJECT_VIEW && relkind != 'v')
+       ereport(ERROR,
+               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                errmsg("\"%s\" is not a view",
+                       RelationGetRelationName(targetrelation))));
+
    relhastriggers = (targetrelation->rd_rel->reltriggers > 0);
 
    /*
index d9e981bb5724b99440c4945e7606e3132048bb64..324f89a256634c3988b7596f27f8390b6cefacbf 100644 (file)
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.596 2007/06/23 22:12:51 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.597 2007/07/03 01:30:36 neilc Exp $
  *
  * HISTORY
  *   AUTHOR            DATE            MAJOR EVENT
@@ -4546,6 +4546,24 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name
                    n->newname = $6;
                    $$ = (Node *)n;
                }
+           | ALTER SEQUENCE relation_expr RENAME TO name
+               {
+                   RenameStmt *n = makeNode(RenameStmt);
+                   n->renameType = OBJECT_SEQUENCE;
+                   n->relation = $3;
+                   n->subname = NULL;
+                   n->newname = $6;
+                   $$ = (Node *)n;
+               }
+           | ALTER VIEW relation_expr RENAME TO name
+               {
+                   RenameStmt *n = makeNode(RenameStmt);
+                   n->renameType = OBJECT_VIEW;
+                   n->relation = $3;
+                   n->subname = NULL;
+                   n->newname = $6;
+                   $$ = (Node *)n;
+               }
            | ALTER INDEX relation_expr RENAME TO name
                {
                    RenameStmt *n = makeNode(RenameStmt);
index a01c99b005b35aae6c41bf35f3aa7e7c991b248a..ec9aa9d26374514b8837896396090c0a83674b2a 100644 (file)
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.282 2007/06/28 00:02:39 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/tcop/utility.c,v 1.283 2007/07/03 01:30:37 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1574,6 +1574,9 @@ CreateCommandTag(Node *parsetree)
                case OBJECT_SCHEMA:
                    tag = "ALTER SCHEMA";
                    break;
+               case OBJECT_SEQUENCE:
+                   tag = "ALTER SEQUENCE";
+                   break;
                case OBJECT_COLUMN:
                case OBJECT_TABLE:
                    tag = "ALTER TABLE";
@@ -1584,6 +1587,9 @@ CreateCommandTag(Node *parsetree)
                case OBJECT_TRIGGER:
                    tag = "ALTER TRIGGER";
                    break;
+               case OBJECT_VIEW:
+                   tag = "ALTER VIEW";
+                   break;
                default:
                    tag = "???";
                    break;
index a30a07501fad6408b38715a1b132d1280645c1cc..9a9e952ac96c8b5761538fb8dda606656f7ae9ab 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2007, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.165 2007/06/13 23:59:47 neilc Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.166 2007/07/03 01:30:37 neilc Exp $
  */
 
 /*----------------------------------------------------------------------
@@ -602,7 +602,7 @@ psql_completion(char *text, int start, int end)
        static const char *const list_ALTER[] =
        {"AGGREGATE", "CONVERSION", "DATABASE", "DOMAIN", "FUNCTION",
            "GROUP", "INDEX", "LANGUAGE", "OPERATOR", "ROLE", "SCHEMA", "SEQUENCE", "TABLE",
-       "TABLESPACE", "TRIGGER", "TYPE", "USER", NULL};
+       "TABLESPACE", "TRIGGER", "TYPE", "USER", "VIEW", NULL};
 
        COMPLETE_WITH_LIST(list_ALTER);
    }
@@ -714,7 +714,7 @@ psql_completion(char *text, int start, int end)
    {
        static const char *const list_ALTERSEQUENCE[] =
        {"INCREMENT", "MINVALUE", "MAXVALUE", "RESTART", "NO", "CACHE", "CYCLE",
-       "SET SCHEMA", NULL};
+       "SET SCHEMA", "RENAME TO", NULL};
 
        COMPLETE_WITH_LIST(list_ALTERSEQUENCE);
    }
@@ -728,6 +728,14 @@ psql_completion(char *text, int start, int end)
 
        COMPLETE_WITH_LIST(list_ALTERSEQUENCE2);
    }
+   /* ALTER VIEW  */
+   else if (pg_strcasecmp(prev3_wd, "ALTER") == 0 &&
+            pg_strcasecmp(prev2_wd, "VIEW") == 0)
+   {
+       static const char *const list_ALTERVIEW[] = {"RENAME TO", NULL};
+
+       COMPLETE_WITH_LIST(list_ALTERVIEW);
+   }
    /* ALTER TRIGGER , add ON */
    else if (pg_strcasecmp(prev3_wd, "ALTER") == 0 &&
             pg_strcasecmp(prev2_wd, "TRIGGER") == 0)
index 3acbe84b522cef18de802bf602985104cad2368f..44df10ceb3acbfb494d6f5422f83fc0b5f2dee47 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/commands/tablecmds.h,v 1.33 2007/05/11 20:17:10 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/commands/tablecmds.h,v 1.34 2007/07/03 01:30:37 neilc Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -43,7 +43,8 @@ extern void renameatt(Oid myrelid,
          bool recursing);
 
 extern void renamerel(Oid myrelid,
-         const char *newrelname);
+         const char *newrelname,
+         ObjectType reltype);
 
 extern void find_composite_type_dependencies(Oid typeOid,
                                             const char *origTblName,