]> granicus.if.org Git - postgresql/commitdiff
Remove plpgsql's RENAME declaration, which has bizarre and mostly nonfunctional
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 5 Nov 2009 16:58:36 +0000 (16:58 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 5 Nov 2009 16:58:36 +0000 (16:58 +0000)
behavior, and is so little used that no one has been interested in fixing it.
To ensure that possible uses are covered, remove the ALIAS declaration's
arbitrary restriction that only $n identifiers can be aliased.

(We could alternatively make RENAME act just like ALIAS, but per discussion
having two different ways to do the same thing is probably more confusing than
helpful.)

doc/src/sgml/plpgsql.sgml
src/pl/plpgsql/src/gram.y
src/pl/plpgsql/src/pl_funcs.c
src/pl/plpgsql/src/plpgsql.h
src/pl/plpgsql/src/scan.l
src/test/regress/expected/plpgsql.out
src/test/regress/sql/plpgsql.sql

index 65d508c37ed53c92332c43632677bea1931e0e14..401d1216e4f0f56988cdd4104e6642aca4cb5d3b 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/plpgsql.sgml,v 1.143 2009/09/29 20:05:29 tgl Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/plpgsql.sgml,v 1.144 2009/11/05 16:58:36 tgl Exp $ -->
 
 <chapter id="plpgsql">
   <title><application>PL/pgSQL</application> - <acronym>SQL</acronym> Procedural Language</title>
      and <type>anyenum</>.  The actual
      data types handled by a polymorphic function can vary from call to
      call, as discussed in <xref linkend="extend-types-polymorphic">.
-     An example is shown in <xref linkend="plpgsql-declaration-aliases">.
+     An example is shown in <xref linkend="plpgsql-declaration-parameters">.
     </para>
 
     <para>
 
     <para>
      Specific examples appear in
-     <xref linkend="plpgsql-declaration-aliases"> and
+     <xref linkend="plpgsql-declaration-parameters"> and
      <xref linkend="plpgsql-statements-returning">.
     </para>
   </sect2>
@@ -353,8 +353,8 @@ user_id CONSTANT integer := 10;
 </programlisting>
      </para>
 
-    <sect2 id="plpgsql-declaration-aliases">
-     <title>Aliases for Function Parameters</title>
+    <sect2 id="plpgsql-declaration-parameters">
+     <title>Declaring Function Parameters</title>
 
      <para>
       Parameters passed to functions are named with the identifiers
@@ -401,7 +401,7 @@ $$ LANGUAGE plpgsql;
       These two examples are not perfectly equivalent.  In the first case,
       <literal>subtotal</> could be referenced as
       <literal>sales_tax.subtotal</>, but in the second case it could not.
-      (Had we attached a label to the block, <literal>subtotal</> could
+      (Had we attached a label to the inner block, <literal>subtotal</> could
       be qualified with that label, instead.)
      </para>
     </note>
@@ -532,6 +532,38 @@ $$ LANGUAGE plpgsql;
      </para>
     </sect2>
 
+  <sect2 id="plpgsql-declaration-alias">
+   <title><literal>ALIAS</></title>
+
+<synopsis>
+<replaceable>newname</> ALIAS FOR <replaceable>oldname</>;
+</synopsis>
+
+   <para>
+    The <literal>ALIAS</> syntax is more general than is suggested in the
+    previous section: you can declare an alias for any variable, not just
+    function parameters.  The main practical use for this is to assign
+    a different name for variables with predetermined names, such as
+    <varname>NEW</varname> or <varname>OLD</varname> within
+    a trigger procedure.
+   </para>
+
+   <para>
+    Examples:
+<programlisting>
+DECLARE
+  prior ALIAS FOR old;
+  updated ALIAS FOR new;
+</programlisting>
+   </para>
+
+   <para>
+    Since <literal>ALIAS</> creates two different ways to name the same
+    object, unrestricted use can be confusing.  It's best to use it only
+    for the purpose of overriding predetermined names.
+   </para>
+   </sect2>
+
   <sect2 id="plpgsql-declaration-type">
    <title>Copying Types</title>
 
@@ -664,39 +696,6 @@ SELECT merge_fields(t.*) FROM table1 t WHERE ... ;
     structure on-the-fly.
    </para>
   </sect2>
-
-  <sect2 id="plpgsql-declaration-renaming-vars">
-   <title><literal>RENAME</></title>
-
-<synopsis>
-RENAME <replaceable>oldname</replaceable> TO <replaceable>newname</replaceable>;
-</synopsis>
-
-   <para>
-    Using the <literal>RENAME</literal> declaration you can change the
-    name of a variable, record or row. This is primarily useful if
-    <varname>NEW</varname> or <varname>OLD</varname> should be
-    referenced by another name inside a trigger procedure.  See also
-    <literal>ALIAS</literal>.
-   </para>
-
-   <para>
-    Examples:
-<programlisting>
-RENAME id TO user_id;
-RENAME this_var TO that_var;
-</programlisting>
-   </para>
-
-    <note>
-     <para>
-      <literal>RENAME</literal> appears to be broken as of
-      <productname>PostgreSQL</> 7.3.  Fixing this is of low priority,
-      since <literal>ALIAS</literal> covers most of the practical uses
-      of <literal>RENAME</literal>.
-     </para>
-    </note>
-   </sect2>
   </sect1>
 
   <sect1 id="plpgsql-expressions">
index ec6b285bf2f843bfd0ccf057679978e32047ae42..e2e3f203ae07c27162a30e5feb3ccb0e89222ba2 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.129 2009/11/04 22:26:07 tgl Exp $
+ *       $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.130 2009/11/05 16:58:36 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -128,7 +128,6 @@ static List                         *read_raise_options(void);
 
 %type <declhdr> decl_sect
 %type <varname> decl_varname
-%type <str>            decl_renname
 %type <boolean>        decl_const decl_notnull exit_type
 %type <expr>   decl_defval decl_cursor_query
 %type <dtype>  decl_datatype
@@ -218,7 +217,6 @@ static List                         *read_raise_options(void);
 %token K_PERFORM
 %token K_ROW_COUNT
 %token K_RAISE
-%token K_RENAME
 %token K_RESULT_OID
 %token K_RETURN
 %token K_REVERSE
@@ -382,10 +380,6 @@ decl_statement     : decl_varname decl_const decl_datatype decl_notnull decl_defval
                                                plpgsql_ns_additem($4->itemtype,
                                                                                   $4->itemno, $1.name);
                                        }
-                               | K_RENAME decl_renname K_TO decl_renname ';'
-                                       {
-                                               plpgsql_ns_rename($2, $4);
-                                       }
                                | decl_varname opt_scrollable K_CURSOR
                                        { plpgsql_ns_push($1.name); }
                                  decl_cursor_args decl_is_for decl_cursor_query
@@ -521,9 +515,8 @@ decl_aliasitem      : any_identifier
                                                char    *name;
                                                PLpgSQL_nsitem *nsi;
 
+                                               /* XXX should allow block-label-qualified names */
                                                plpgsql_convert_ident($1, &name, 1);
-                                               if (name[0] != '$')
-                                                       yyerror("only positional parameters can be aliased");
 
                                                plpgsql_ns_setlocal(false);
 
@@ -532,8 +525,8 @@ decl_aliasitem      : any_identifier
                                                {
                                                        plpgsql_error_lineno = plpgsql_scanner_lineno();
                                                        ereport(ERROR,
-                                                                       (errcode(ERRCODE_UNDEFINED_PARAMETER),
-                                                                        errmsg("function has no parameter \"%s\"",
+                                                                       (errcode(ERRCODE_UNDEFINED_OBJECT),
+                                                                        errmsg("variable \"%s\" does not exist",
                                                                                        name)));
                                                }
 
@@ -573,17 +566,6 @@ decl_varname       : T_WORD
                                        }
                                ;
 
-/* XXX this is broken because it doesn't allow for T_SCALAR,T_ROW,T_RECORD */
-decl_renname   : T_WORD
-                                       {
-                                               char    *name;
-
-                                               plpgsql_convert_ident(yytext, &name, 1);
-                                               /* the result must be palloc'd, see plpgsql_ns_rename */
-                                               $$ = name;
-                                       }
-                               ;
-
 decl_const             :
                                        { $$ = false; }
                                | K_CONSTANT
index 274d02711416794c0113d6abf13c889e7156e00d..790e2e86bac66714bb8881e2e7cd84c4e7c70cff 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.82 2009/11/04 22:26:07 tgl Exp $
+ *       $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.83 2009/11/05 16:58:36 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -235,48 +235,6 @@ plpgsql_ns_lookup_label(const char *name)
 }
 
 
-/* ----------
- * plpgsql_ns_rename                   Rename a namespace entry
- * ----------
- */
-void
-plpgsql_ns_rename(char *oldname, char *newname)
-{
-       PLpgSQL_ns *ns;
-       PLpgSQL_nsitem *newitem;
-       int                     i;
-
-       /*
-        * Lookup name in the namestack
-        */
-       for (ns = ns_current; ns != NULL; ns = ns->upper)
-       {
-               for (i = 1; i < ns->items_used; i++)
-               {
-                       if (strcmp(ns->items[i]->name, oldname) == 0)
-                       {
-                               newitem = palloc(sizeof(PLpgSQL_nsitem) + strlen(newname));
-                               newitem->itemtype = ns->items[i]->itemtype;
-                               newitem->itemno = ns->items[i]->itemno;
-                               strcpy(newitem->name, newname);
-
-                               pfree(oldname);
-                               pfree(newname);
-
-                               pfree(ns->items[i]);
-                               ns->items[i] = newitem;
-                               return;
-                       }
-               }
-       }
-
-       ereport(ERROR,
-                       (errcode(ERRCODE_UNDEFINED_OBJECT),
-                        errmsg("variable \"%s\" does not exist in the current block",
-                                       oldname)));
-}
-
-
 /* ----------
  * plpgsql_convert_ident
  *
index 3d0f155a884142d477b8a4fbe55ece44478ad84f..193d8d5c4c683b8acd11bb749ba471d26cc4dc00 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.118 2009/11/04 22:26:07 tgl Exp $
+ *       $PostgreSQL: pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.119 2009/11/05 16:58:36 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -287,7 +287,7 @@ typedef struct
 {                                                              /* Item in the compilers namestack      */
        int                     itemtype;
        int                     itemno;
-       char            name[1];
+       char            name[1];                /* actually, as long as needed */
 } PLpgSQL_nsitem;
 
 
@@ -851,7 +851,6 @@ extern void plpgsql_ns_additem(int itemtype, int itemno, const char *name);
 extern PLpgSQL_nsitem *plpgsql_ns_lookup(const char *name1, const char *name2,
                                  const char *name3, int *names_used);
 extern PLpgSQL_nsitem *plpgsql_ns_lookup_label(const char *name);
-extern void plpgsql_ns_rename(char *oldname, char *newname);
 
 /* ----------
  * Other functions in pl_funcs.c
index b309d811872a09cbc98ddbb908bc6449bd1d9f4f..3563b2ff154f3ab0c1289d0be3aded600a42bd68 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/pl/plpgsql/src/scan.l,v 1.72 2009/09/29 20:05:29 tgl Exp $
+ *       $PostgreSQL: pgsql/src/pl/plpgsql/src/scan.l,v 1.73 2009/11/05 16:58:36 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -183,7 +183,6 @@ open                        { return K_OPEN;                        }
 or                             { return K_OR;                          }
 perform                        { return K_PERFORM;                     }
 raise                  { return K_RAISE;                       }
-rename                 { return K_RENAME;                      }
 result_oid             { return K_RESULT_OID;          }
 return                 { return K_RETURN;                      }
 reverse                        { return K_REVERSE;                     }
index e3cacf589eca3c49a9763db5accc2fd319676786..2e97bec42e91f8c11511eba89fc2ce2f51ef68bf 100644 (file)
@@ -162,7 +162,7 @@ create trigger tg_pfield_ad after delete
 create function tg_pslot_biu() returns trigger as $proc$
 declare
     pfrec      record;
-    rename new to ps;
+    ps          alias for new;
 begin
     select into pfrec * from PField where name = ps.pfname;
     if not found then
index 3e6b6de539e7bb94d675f8d9695d5b3ab2a28e73..83cda97d1bf433774793171f5f6f5dd4fcae72ed 100644 (file)
@@ -211,7 +211,7 @@ create trigger tg_pfield_ad after delete
 create function tg_pslot_biu() returns trigger as $proc$
 declare
     pfrec      record;
-    rename new to ps;
+    ps          alias for new;
 begin
     select into pfrec * from PField where name = ps.pfname;
     if not found then