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