David Fetter <[EMAIL PROTECTED]> writes: > On Mon, Dec 22, 2003 at 05:50:12PM -0500, Tom Lane wrote: >> David Fetter <[EMAIL PROTECTED]> writes: > + Note that it is not possible to assign function arguments during > + a <literal>DECLARE</> block. >> >> Seems to me this is a bug that should be fixed, not documented.
> I got the impression from Jan Wieck that it wasn't fixable, or at
> least not without a major rewrite of the plpgsql engine. I'm sure
> somebody will correct me if I got a mistaken impression, though :)
Not that hard ... just requires replacing some special-purpose code with
general-purpose code ...
regards, tom lane
*** src/pl/plpgsql/src/gram.y.orig Sat Nov 29 14:52:12 2003
--- src/pl/plpgsql/src/gram.y Mon Dec 22 18:50:35 2003
***************
*** 628,679 ****
{ $$ = NULL; }
| decl_defkey
{
! int tok;
! int lno;
! PLpgSQL_dstring ds;
! PLpgSQL_expr *expr;
!
! lno = plpgsql_scanner_lineno();
! expr = malloc(sizeof(PLpgSQL_expr));
! plpgsql_dstring_init(&ds);
! plpgsql_dstring_append(&ds, "SELECT ");
!
! expr->dtype = PLPGSQL_DTYPE_EXPR;
! expr->plan = NULL;
! expr->nparams = 0;
!
! tok = yylex();
! switch (tok)
! {
! case 0:
! yyerror("unexpected
end of function");
! case K_NULL:
! if (yylex() != ';')
!
yyerror("expected \";\" after \"NULL\"");
!
! free(expr);
!
plpgsql_dstring_free(&ds);
!
! $$ = NULL;
! break;
!
! default:
!
plpgsql_dstring_append(&ds, yytext);
! while ((tok = yylex())
!= ';')
! {
! if (tok == 0)
!
yyerror("unterminated default value");
!
! if
(plpgsql_SpaceScanned)
!
plpgsql_dstring_append(&ds, " ");
!
plpgsql_dstring_append(&ds, yytext);
! }
! expr->query =
strdup(plpgsql_dstring_get(&ds));
!
plpgsql_dstring_free(&ds);
!
! $$ = expr;
! break;
! }
}
;
--- 628,636 ----
{ $$ = NULL; }
| decl_defkey
{
! plpgsql_ns_setlocal(false);
! $$ = plpgsql_read_expression(';', ";");
! plpgsql_ns_setlocal(true);
}
;
---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly
