From a1b67ce2a237c1f5e487e425e51db5e9fc0e6371 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 28 Jan 2006 12:50:16 +0300 Subject: [PATCH] Fix for bug #16829 "Firing trigger with RETURN crashes the server" We should disallow usage of RETURN statement in triggers and emit error at parsing time (instead of crashing when trigger is fired). mysql-test/r/trigger.result: Added test for bug #16829 "Firing trigger with RETURN crashes the server". mysql-test/t/trigger.test: Added test for bug #16829 "Firing trigger with RETURN crashes the server". sql/sql_yacc.yy: We should disallow usage of RETURN statement in triggers and emit error at parsing time (instead of crashing when trigger is fired). --- mysql-test/r/trigger.result | 5 +++++ mysql-test/t/trigger.test | 9 +++++++++ sql/sql_yacc.yy | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/trigger.result b/mysql-test/r/trigger.result index 9cfecde7610..ec63757df3a 100644 --- a/mysql-test/r/trigger.result +++ b/mysql-test/r/trigger.result @@ -785,3 +785,8 @@ create trigger test.t1_bi before insert on t1 for each row set @a:=0; ERROR 3D000: No database selected drop trigger t1_bi; ERROR 3D000: No database selected +create table t1 (i int); +create trigger t1_bi before insert on t1 for each row return 0; +ERROR 42000: RETURN is only allowed in a FUNCTION +insert into t1 values (1); +drop table t1; diff --git a/mysql-test/t/trigger.test b/mysql-test/t/trigger.test index f2d9bb6c856..679698db4c0 100644 --- a/mysql-test/t/trigger.test +++ b/mysql-test/t/trigger.test @@ -958,3 +958,12 @@ create trigger test.t1_bi before insert on t1 for each row set @a:=0; --error ER_NO_DB_ERROR drop trigger t1_bi; connection default; + +# Test for bug #16829 "Firing trigger with RETURN crashes the server" +# RETURN is not supposed to be used anywhere except functions, so error +# should be returned when one attempts to create trigger with RETURN. +create table t1 (i int); +--error ER_SP_BADRETURN +create trigger t1_bi before insert on t1 for each row return 0; +insert into t1 values (1); +drop table t1; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 0ef389950fc..055e5a9e908 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1981,7 +1981,7 @@ sp_proc_stmt: LEX *lex= Lex; sp_head *sp= lex->sphead; - if (sp->m_type == TYPE_ENUM_PROCEDURE) + if (sp->m_type != TYPE_ENUM_FUNCTION) { my_message(ER_SP_BADRETURN, ER(ER_SP_BADRETURN), MYF(0)); YYABORT;