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            type bool (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}' THEN
 15:    RAISE ''2.0''
 16:    ASSIGN var 3 := 'SELECT  'Echt NULL''
      ELSE
 19:    IF 'SELECT   $1  = 0 {$1=2}' THEN
 20:      RAISE ''2.1.0''
 21:      ASSIGN var 3 := 'SELECT  'Null (0)''
        ELSE
        ENDIF
      ENDIF
 37:  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

---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?

http://www.postgresql.org/users-lounge/docs/faq.html

Reply via email to