aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/src/sgml/plpgsql.sgml77
-rw-r--r--src/pl/plpgsql/src/gram.y26
-rw-r--r--src/pl/plpgsql/src/pl_funcs.c44
-rw-r--r--src/pl/plpgsql/src/plpgsql.h5
-rw-r--r--src/pl/plpgsql/src/scan.l3
-rw-r--r--src/test/regress/expected/plpgsql.out2
-rw-r--r--src/test/regress/sql/plpgsql.sql2
7 files changed, 48 insertions, 111 deletions
diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index 65d508c37ed..401d1216e4f 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -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>
@@ -135,7 +135,7 @@
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>
@@ -163,7 +163,7 @@
<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">
diff --git a/src/pl/plpgsql/src/gram.y b/src/pl/plpgsql/src/gram.y
index ec6b285bf2f..e2e3f203ae0 100644
--- a/src/pl/plpgsql/src/gram.y
+++ b/src/pl/plpgsql/src/gram.y
@@ -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
diff --git a/src/pl/plpgsql/src/pl_funcs.c b/src/pl/plpgsql/src/pl_funcs.c
index 274d0271141..790e2e86bac 100644
--- a/src/pl/plpgsql/src/pl_funcs.c
+++ b/src/pl/plpgsql/src/pl_funcs.c
@@ -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 $
*
*-------------------------------------------------------------------------
*/
@@ -236,48 +236,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
*
* Convert a possibly-qualified identifier to internal form: handle
diff --git a/src/pl/plpgsql/src/plpgsql.h b/src/pl/plpgsql/src/plpgsql.h
index 3d0f155a884..193d8d5c4c6 100644
--- a/src/pl/plpgsql/src/plpgsql.h
+++ b/src/pl/plpgsql/src/plpgsql.h
@@ -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
diff --git a/src/pl/plpgsql/src/scan.l b/src/pl/plpgsql/src/scan.l
index b309d811872..3563b2ff154 100644
--- a/src/pl/plpgsql/src/scan.l
+++ b/src/pl/plpgsql/src/scan.l
@@ -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; }
diff --git a/src/test/regress/expected/plpgsql.out b/src/test/regress/expected/plpgsql.out
index e3cacf589ec..2e97bec42e9 100644
--- a/src/test/regress/expected/plpgsql.out
+++ b/src/test/regress/expected/plpgsql.out
@@ -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
diff --git a/src/test/regress/sql/plpgsql.sql b/src/test/regress/sql/plpgsql.sql
index 3e6b6de539e..83cda97d1bf 100644
--- a/src/test/regress/sql/plpgsql.sql
+++ b/src/test/regress/sql/plpgsql.sql
@@ -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