Grammar-problems with pl/pgsql in gram.y - Mailing list pgsql-hackers

From Klaus Reger
Subject Grammar-problems with pl/pgsql in gram.y
Date
Msg-id 200105161029.f4GATII18440@pc01.reger-clan.de
Whole thread Raw
Responses Re: Grammar-problems with pl/pgsql in gram.y  (Jan Wieck <JanWieck@Yahoo.com>)
List pgsql-hackers
Hi,

I want to learn, how the pl/plsql-parser/compiler works. Therefore I planned 
to implement a simple ELSIF, like oracle does.

I added the following K_ELSIF branch to gram.y, in the hope that, when ELSIF 
is parsed, simply another if-structure in inserted.

---------------------------------------------------------
stmt_else        :{    PLpgSQL_stmts    *new;        new = malloc(sizeof(PLpgSQL_stmts));    memset(new, 0,
sizeof(PLpgSQL_stmts));   $$ = new;    elog(NOTICE, "empty ELSE detected");}| K_ELSIF expr_until_then proc_sect
stmt_else{   PLpgSQL_stmt_if *new;    elog(NOTICE, "ELSIF detected");    new = malloc(sizeof(PLpgSQL_stmt_if));
memset(new,0, sizeof(PLpgSQL_stmt_if));    new->cmd_type    = PLPGSQL_STMT_IF;    // new->lineno        = $2;
new->cond       = $2;    new->true_body    = $3;    new->false_body = $4;
 
    $$ = (PLpgSQL_stmts *)new;    
                }| K_ELSE proc_sect{              $$ = $2;                              elog(NOTICE, "ELSE detected
(%s)",     strdup(yytext));};
 
--------------------------------------------------------------

A testprocedure, which looks like that:
--------------------------------------------------------------

DECLARE   iPar1PI ALIAS FOR $1;   iTmp    integer;   iResult varchar;

BEGIN
   iTmp = iPar1PI;      raise notice '1.0';
   if iTmp IS NULL then       raise notice '2.0';       iResult = 'Echt NULL';
   else       if iTmp = 0 then           raise notice '2.1.0';           iResult = 'Null (0)';
       elsif (iTmp < 0) THEN           raise notice '2.1.1';           iResult = 'Negativ';
       elsif (iTmp > 0) THEN           raise notice '2.1.2';           iResult = 'Positiv';
       else           raise notice '2.1.3';           iResult = 'Gibts nicht!';       end if;   end if;          raise
notice'3.0';
 
   return iResult;
END;
--------------------------------------------------------------

is dumped in this way ...

--------------------------------------------------------------
Execution tree of successfully compiled PL/pgSQL function kr_test:
Functions data area:   entry 0: VAR $1               type int4 (typoid 23) atttypmod -1   entry 1: VAR found
typebool (typoid 16) atttypmod -1   entry 2: VAR itmp             type int4 (typoid 23) atttypmod -1   entry 3: VAR
iresult         type varchar (typoid 1043) atttypmod -1
 
Functions statements: 8:BLOCK <<*unnamed*>>10:  ASSIGN var 2 := 'SELECT   $1  {$1=0}'12:  RAISE ''1.0''14:  IF 'SELECT
$1  IS NULL {$1=2}' THEN15:    RAISE ''2.0''16:    ASSIGN var 3 := 'SELECT  'Echt NULL''     ELSE19:    IF 'SELECT   $1
= 0 {$1=2}' THEN20:      RAISE ''2.1.0''21:      ASSIGN var 3 := 'SELECT  'Null (0)''       ELSE       ENDIF
ENDIF37: RAISE ''3.0''39:  RETURN 'SELECT   $1  {$1=3}'   END -- *unnamed*
 
End of execution tree of function kr_test
--------------------------------------------------------------

So my question is: Why does my inserted 
PLpgSQL_stmt_if *new;
is not executed, because I do it in the same way like stmt_if does?

Who can halp me (Maybe Jan??)

Regards, Klaus


pgsql-hackers by date:

Previous
From: Lincoln Yeoh
Date:
Subject: Re: index ops for _int4 and trees?
Next
From: Jan Wieck
Date:
Subject: Re: Grammar-problems with pl/pgsql in gram.y