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

Reply via email to