diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml index 65d508c37e..401d1216e4 100644 --- a/doc/src/sgml/plpgsql.sgml +++ b/doc/src/sgml/plpgsql.sgml @@ -1,4 +1,4 @@ - + <application>PL/pgSQL</application> - <acronym>SQL</acronym> Procedural Language @@ -135,7 +135,7 @@ and anyenum. The actual data types handled by a polymorphic function can vary from call to call, as discussed in . - An example is shown in . + An example is shown in . @@ -163,7 +163,7 @@ Specific examples appear in - and + and . @@ -353,8 +353,8 @@ user_id CONSTANT integer := 10; - - Aliases for Function Parameters + + Declaring Function Parameters 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, subtotal could be referenced as sales_tax.subtotal, but in the second case it could not. - (Had we attached a label to the block, subtotal could + (Had we attached a label to the inner block, subtotal could be qualified with that label, instead.) @@ -532,6 +532,38 @@ $$ LANGUAGE plpgsql; + + <literal>ALIAS</> + + +newname ALIAS FOR oldname; + + + + The 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 + NEW or OLD within + a trigger procedure. + + + + Examples: + +DECLARE + prior ALIAS FOR old; + updated ALIAS FOR new; + + + + + Since 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. + + + Copying Types @@ -664,39 +696,6 @@ SELECT merge_fields(t.*) FROM table1 t WHERE ... ; structure on-the-fly. - - - <literal>RENAME</> - - -RENAME oldname TO newname; - - - - Using the RENAME declaration you can change the - name of a variable, record or row. This is primarily useful if - NEW or OLD should be - referenced by another name inside a trigger procedure. See also - ALIAS. - - - - Examples: - -RENAME id TO user_id; -RENAME this_var TO that_var; - - - - - - RENAME appears to be broken as of - PostgreSQL 7.3. Fixing this is of low priority, - since ALIAS covers most of the practical uses - of RENAME. - - - diff --git a/src/pl/plpgsql/src/gram.y b/src/pl/plpgsql/src/gram.y index ec6b285bf2..e2e3f203ae 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 decl_sect %type decl_varname -%type decl_renname %type decl_const decl_notnull exit_type %type decl_defval decl_cursor_query %type 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 274d027114..790e2e86ba 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 $ * *------------------------------------------------------------------------- */ @@ -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 * diff --git a/src/pl/plpgsql/src/plpgsql.h b/src/pl/plpgsql/src/plpgsql.h index 3d0f155a88..193d8d5c4c 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 b309d81187..3563b2ff15 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 e3cacf589e..2e97bec42e 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 3e6b6de539..83cda97d1b 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