From 327eb9bbff7646999babde43f2842d15b6fff342 Mon Sep 17 00:00:00 2001 From: "pem@mysql.comhem.se" <> Date: Wed, 3 Nov 2004 13:49:54 +0100 Subject: [PATCH] Various syntax fixes in sql/sql_yacc.yy for stored procedures: - No RESTICT|CASCADE in DROP SP (since it's not implemented) - Added optional "noise" to FETCH: [[NEXT] FROM] - At least one statement required in all block constructs except BEGIN-END (where zero is allowed) --- mysql-test/r/sp.result | 4 ++-- mysql-test/t/sp.test | 4 ++-- sql/sql_yacc.yy | 36 +++++++++++++++++++++++------------- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index 7ff7779aa83..bcabf693e4c 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -851,8 +851,8 @@ repeat begin declare a char(16); declare b,c int; -fetch c1 into a, b; -fetch c2 into c; +fetch from c1 into a, b; +fetch next from c2 into c; if not done then if b < c then insert into test.t3 values (a, b); diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 654d8966255..88d1b8c0356 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -953,8 +953,8 @@ begin declare a char(16); declare b,c int; - fetch c1 into a, b; - fetch c2 into c; + fetch from c1 into a, b; + fetch next from c2 into c; if not done then if b < c then insert into test.t3 values (a, b); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index ca6757f6e4f..55e4381875e 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -792,7 +792,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); sp_c_chistics sp_a_chistics sp_chistic sp_c_chistic END_OF_INPUT -%type call sp_proc_stmts sp_proc_stmt +%type call sp_proc_stmts sp_proc_stmts1 sp_proc_stmt %type sp_decl_idents sp_opt_inout sp_handler_type sp_hcond_list %type sp_cond sp_hcond %type sp_decls sp_decl @@ -1507,7 +1507,11 @@ sp_opt_inout: sp_proc_stmts: /* Empty */ {} | sp_proc_stmts { Lex->query_tables= 0; } sp_proc_stmt ';' + ; +sp_proc_stmts1: + sp_proc_stmt ';' {} + | sp_proc_stmts1 { Lex->query_tables= 0; } sp_proc_stmt ';' ; sp_decls: @@ -2070,16 +2074,16 @@ sp_proc_stmt: i= new sp_instr_copen(sp->instructions(), lex->spcont, offset); sp->add_instr(i); } - | FETCH_SYM ident INTO + | FETCH_SYM sp_opt_fetch_noise ident INTO { LEX *lex= Lex; sp_head *sp= lex->sphead; uint offset; sp_instr_cfetch *i; - if (! lex->spcont->find_cursor(&$2, &offset)) + if (! lex->spcont->find_cursor(&$3, &offset)) { - net_printf(YYTHD, ER_SP_CURSOR_MISMATCH, $2.str); + net_printf(YYTHD, ER_SP_CURSOR_MISMATCH, $3.str); YYABORT; } i= new sp_instr_cfetch(sp->instructions(), lex->spcont, offset); @@ -2104,6 +2108,12 @@ sp_proc_stmt: } ; +sp_opt_fetch_noise: + /* Empty */ + | NEXT_SYM FROM + | FROM + ; + sp_fetch_list: ident { @@ -2164,7 +2174,7 @@ sp_if: sp->push_backpatch(i, ctx->push_label((char *)"", 0)); sp->add_instr(i); } - sp_proc_stmts + sp_proc_stmts1 { sp_head *sp= Lex->sphead; sp_pcontext *ctx= Lex->spcont; @@ -2186,7 +2196,7 @@ sp_if: sp_elseifs: /* Empty */ | ELSEIF_SYM sp_if - | ELSE sp_proc_stmts + | ELSE sp_proc_stmts1 ; sp_case: @@ -2218,7 +2228,7 @@ sp_case: lex->query_tables= 0; sp->add_instr(i); } - sp_proc_stmts + sp_proc_stmts1 { sp_head *sp= Lex->sphead; sp_pcontext *ctx= Lex->spcont; @@ -2247,7 +2257,7 @@ sp_whens: sp->add_instr(i); } - | ELSE sp_proc_stmts {} + | ELSE sp_proc_stmts1 {} | WHEN_SYM sp_case {} ; @@ -2325,7 +2335,7 @@ sp_unlabeled_control: lex->spcont= ctx->pop_context(); } | LOOP_SYM - sp_proc_stmts END LOOP_SYM + sp_proc_stmts1 END LOOP_SYM { LEX *lex= Lex; uint ip= lex->sphead->instructions(); @@ -2348,7 +2358,7 @@ sp_unlabeled_control: lex->query_tables= 0; sp->add_instr(i); } - sp_proc_stmts END WHILE_SYM + sp_proc_stmts1 END WHILE_SYM { LEX *lex= Lex; uint ip= lex->sphead->instructions(); @@ -2357,7 +2367,7 @@ sp_unlabeled_control: lex->sphead->add_instr(i); } - | REPEAT_SYM sp_proc_stmts UNTIL_SYM expr END REPEAT_SYM + | REPEAT_SYM sp_proc_stmts1 UNTIL_SYM expr END REPEAT_SYM { LEX *lex= Lex; uint ip= lex->sphead->instructions(); @@ -5473,7 +5483,7 @@ drop: lex->drop_if_exists=$3; lex->name=$4.str; } - | DROP FUNCTION_SYM if_exists sp_name opt_restrict + | DROP FUNCTION_SYM if_exists sp_name { LEX *lex=Lex; if (lex->sphead) @@ -5485,7 +5495,7 @@ drop: lex->drop_if_exists= $3; lex->spname= $4; } - | DROP PROCEDURE if_exists sp_name opt_restrict + | DROP PROCEDURE if_exists sp_name { LEX *lex=Lex; if (lex->sphead)