Adding ELSIF support contributed by Klaus Reger.
authorJan Wieck <JanWieck@Yahoo.com>
Fri, 18 May 2001 21:16:59 +0000 (21:16 +0000)
committerJan Wieck <JanWieck@Yahoo.com>
Fri, 18 May 2001 21:16:59 +0000 (21:16 +0000)
Jan

src/pl/plpgsql/src/gram.y
src/pl/plpgsql/src/scan.l

index 1bfce18473f377cda969d259853d1dbd32bf32fd..b137367454058ebe2c49773858be81396b010201 100644 (file)
@@ -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
index ecde59df0c018aa993fad9099ae9632f0beb53c9..65c5c75faaa2a992e7a1bcb86a4bb2d2eb556387 100644 (file)
@@ -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;         }