aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJan Wieck <JanWieck@Yahoo.com>2001-05-18 21:16:59 +0000
committerJan Wieck <JanWieck@Yahoo.com>2001-05-18 21:16:59 +0000
commit27b0e8c0b0cf857e383595f34f98ab1dd9f35ff4 (patch)
tree0072d33ed9461ac495ae7bfef3b67ce9000c1196 /src
parenta9da3fed30f3e54ac833c09daaeb8bb168a0f5dc (diff)
downloadpostgresql-27b0e8c0b0cf857e383595f34f98ab1dd9f35ff4.tar.gz
postgresql-27b0e8c0b0cf857e383595f34f98ab1dd9f35ff4.zip
Adding ELSIF support contributed by Klaus Reger.
Jan
Diffstat (limited to 'src')
-rw-r--r--src/pl/plpgsql/src/gram.y51
-rw-r--r--src/pl/plpgsql/src/scan.l3
2 files changed, 51 insertions, 3 deletions
diff --git a/src/pl/plpgsql/src/gram.y b/src/pl/plpgsql/src/gram.y
index 1bfce18473f..b1373674540 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 ecde59df0c0..65c5c75faaa 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; }