Hi all,
Please find the attachment.
By my friend asking, for convenience,
support to define multi variables in single PL/pgSQL line.
Like this:
CREATE OR REPLACE FUNCTION try_mutlivardef() RETURNS text AS $$
DECLARE
local_a, local_b, local_c text := 'a1----';
BEGIN
return local_a || local_b || local_c;
end;
$$ LANGUAGE plpgsql;
Regards,
Quan Zongliang
---
此电子邮件没有病毒和恶意软件,因为 avast! 防病毒保护处于活动状态。
http://www.avast.com
diff --git a/src/pl/plpgsql/src/pl_gram.y b/src/pl/plpgsql/src/pl_gram.y
index e3a992c..2737a3a 100644
--- a/src/pl/plpgsql/src/pl_gram.y
+++ b/src/pl/plpgsql/src/pl_gram.y
@@ -167,6 +167,7 @@ static List *read_raise_options(void);
%type <declhdr> decl_sect
%type <varname> decl_varname
+%type <list> decl_varnames
%type <boolean> decl_const decl_notnull exit_type
%type <expr> decl_defval decl_cursor_query
%type <dtype> decl_datatype
@@ -471,9 +472,10 @@ decl_stmt : decl_statement
}
;
-decl_statement : decl_varname decl_const decl_datatype decl_collate decl_notnull decl_defval
+decl_statement : decl_varnames decl_const decl_datatype decl_collate decl_notnull decl_defval
{
PLpgSQL_variable *var;
+ ListCell *lc;
/*
* If a collation is supplied, insert it into the
@@ -492,38 +494,44 @@ decl_statement : decl_varname decl_const decl_datatype decl_collate decl_notnull
$3->collation = $4;
}
- var = plpgsql_build_variable($1.name, $1.lineno,
- $3, true);
- if ($2)
- {
- if (var->dtype == PLPGSQL_DTYPE_VAR)
- ((PLpgSQL_var *) var)->isconst = $2;
- else
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("row or record variable cannot be CONSTANT"),
- parser_errposition(@2)));
- }
- if ($5)
- {
- if (var->dtype == PLPGSQL_DTYPE_VAR)
- ((PLpgSQL_var *) var)->notnull = $5;
- else
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("row or record variable cannot be NOT NULL"),
- parser_errposition(@4)));
- }
- if ($6 != NULL)
+ foreach(lc, $1)
{
- if (var->dtype == PLPGSQL_DTYPE_VAR)
- ((PLpgSQL_var *) var)->default_val = $6;
- else
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("default value for row or record variable is not supported"),
- parser_errposition(@5)));
+ YYSTYPE *v = (YYSTYPE *) lfirst(lc);
+
+ var = plpgsql_build_variable(v->varname.name, v->varname.lineno,
+ $3, true);
+ if ($2)
+ {
+ if (var->dtype == PLPGSQL_DTYPE_VAR)
+ ((PLpgSQL_var *) var)->isconst = $2;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("row or record variable cannot be CONSTANT"),
+ parser_errposition(@2)));
+ }
+ if ($5)
+ {
+ if (var->dtype == PLPGSQL_DTYPE_VAR)
+ ((PLpgSQL_var *) var)->notnull = $5;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("row or record variable cannot be NOT NULL"),
+ parser_errposition(@4)));
+
+ }
+ if ($6 != NULL)
+ {
+ if (var->dtype == PLPGSQL_DTYPE_VAR)
+ ((PLpgSQL_var *) var)->default_val = $6;
+ else
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("default value for row or record variable is not supported"),
+ parser_errposition(@5)));
+ }
}
}
| decl_varname K_ALIAS K_FOR decl_aliasitem ';'
@@ -773,6 +781,22 @@ decl_varname : T_WORD
}
;
+decl_varnames : decl_varname
+ {
+ YYSTYPE *v = palloc(sizeof(YYSTYPE));
+ v->varname.name = pstrdup($1.name);
+ v->varname.lineno = $1.lineno;
+ $$ = list_make1(v);
+ }
+ | decl_varnames ',' decl_varname
+ {
+ YYSTYPE *v = palloc(sizeof(YYSTYPE));
+ v->varname.name = pstrdup($3.name);
+ v->varname.lineno = $3.lineno;
+ $$ = lappend($1, v);
+ }
+ ;
+
decl_const :
{ $$ = false; }
| K_CONSTANT
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers