From 27b0e8c0b0cf857e383595f34f98ab1dd9f35ff4 Mon Sep 17 00:00:00 2001 From: Jan Wieck Date: Fri, 18 May 2001 21:16:59 +0000 Subject: [PATCH] Adding ELSIF support contributed by Klaus Reger. Jan --- src/pl/plpgsql/src/gram.y | 51 +++++++++++++++++++++++++++++++++++++++++++++-- src/pl/plpgsql/src/scan.l | 3 ++- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/pl/plpgsql/src/gram.y b/src/pl/plpgsql/src/gram.y index 1bfce18473..b137367454 100644 --- a/src/pl/plpgsql/src/gram.y +++ b/src/pl/plpgsql/src/gram.y @@ -4,7 +4,7 @@ * procedural language * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.17 2001/04/18 20:42:56 tgl Exp $ + * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.18 2001/05/18 21:16:59 wieck Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -147,6 +147,7 @@ static PLpgSQL_expr *make_tupret_expr(PLpgSQL_row *row); %token K_DIAGNOSTICS %token K_DOTDOT %token K_ELSE +%token K_ELSIF %token K_END %token K_EXCEPTION %token K_EXECUTE @@ -544,6 +545,7 @@ proc_stmts : proc_stmts proc_stmt new->stmts[0] = (struct PLpgSQL_stmt *)$1; $$ = new; + } ; @@ -721,8 +723,53 @@ stmt_else : memset(new, 0, sizeof(PLpgSQL_stmts)); $$ = new; } + | K_ELSIF lno expr_until_then proc_sect stmt_else + { + /* + * Translate the structure: into: + * + * IF c1 THEN IF c1 THEN + * ... ... + * ELSIF c2 THEN ELSE + * IF c2 THEN + * ... ... + * ELSE ELSE + * ... ... + * END IF END IF + * END IF + * + */ + + PLpgSQL_stmts *new; + PLpgSQL_stmt_if *new_if; + + /* first create a new if-statement */ + new_if = malloc(sizeof(PLpgSQL_stmt_if)); + memset(new_if, 0, sizeof(PLpgSQL_stmt_if)); + + new_if->cmd_type = PLPGSQL_STMT_IF; + new_if->lineno = $2; + new_if->cond = $3; + new_if->true_body = $4; + new_if->false_body = $5; + + /* this is a 'container' for the if-statement */ + new = malloc(sizeof(PLpgSQL_stmts)); + memset(new, 0, sizeof(PLpgSQL_stmts)); + + new->stmts_alloc = 64; + new->stmts_used = 1; + new->stmts = malloc(sizeof(PLpgSQL_stmt *) * new->stmts_alloc); + new->stmts[0] = (struct PLpgSQL_stmt *)new_if; + + $$ = new; + + } + | K_ELSE proc_sect - { $$ = $2; } + { + $$ = $2; + } ; stmt_loop : opt_label K_LOOP lno loop_body diff --git a/src/pl/plpgsql/src/scan.l b/src/pl/plpgsql/src/scan.l index ecde59df0c..65c5c75faa 100644 --- a/src/pl/plpgsql/src/scan.l +++ b/src/pl/plpgsql/src/scan.l @@ -4,7 +4,7 @@ * procedural language * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.10 2001/04/18 20:42:56 tgl Exp $ + * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.11 2001/05/18 21:16:59 wieck Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -99,6 +99,7 @@ declare { return K_DECLARE; } default { return K_DEFAULT; } diagnostics { return K_DIAGNOSTICS; } else { return K_ELSE; } +elsif { return K_ELSIF; } end { return K_END; } exception { return K_EXCEPTION; } execute { return K_EXECUTE; } -- 2.11.0