diff options
-rw-r--r-- | mysql-test/r/sp-error.result | 5 | ||||
-rw-r--r-- | mysql-test/r/sp.result | 7 | ||||
-rw-r--r-- | mysql-test/t/sp-error.test | 18 | ||||
-rw-r--r-- | mysql-test/t/sp.test | 19 | ||||
-rw-r--r-- | sql/sp.cc | 21 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 11 |
6 files changed, 67 insertions, 14 deletions
diff --git a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result index bf36b4796b9..63401845f23 100644 --- a/mysql-test/r/sp-error.result +++ b/mysql-test/r/sp-error.result @@ -1181,3 +1181,8 @@ show authors; return 42; end| ERROR 0A000: Not allowed to return a result set from a function +drop function if exists bug20701| +create function bug20701() returns varchar(25) binary return "test"| +ERROR 42000: This version of MySQL doesn't yet support 'return value collation' +create function bug20701() returns varchar(25) return "test"| +drop function bug20701| diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index 7b31744cba9..ec4065fbc1d 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -3625,7 +3625,6 @@ begin set f1= concat( 'hello', f1 ); return f1; end| -drop function bug9048| drop procedure if exists bug12849_1| create procedure bug12849_1(inout x char) select x into x| set @var='a'| @@ -4074,7 +4073,7 @@ select res; end| create table t3 (a int)| insert into t3 values (0)| -create view v1 as select a from t3; +create view v1 as select a from t3| create procedure bug10100pt(level int, lim int) begin if level < lim then @@ -4095,7 +4094,7 @@ else select * from v1; end if; end| -prepare stmt2 from "select * from t3;"; +prepare stmt2 from "select * from t3;"| create procedure bug10100pd(level int, lim int) begin if level < lim then @@ -4465,7 +4464,7 @@ Error 1347 'test.v1' is not BASE TABLE Error 1347 'test.v1' is not BASE TABLE Error 1347 'test.v1' is not BASE TABLE drop procedure bug13012| -drop view v1; +drop view v1| select * from t1 order by data| id data aa 0 diff --git a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test index d370cb3037c..73a64b6feeb 100644 --- a/mysql-test/t/sp-error.test +++ b/mysql-test/t/sp-error.test @@ -1729,9 +1729,27 @@ begin end| # +# BUG#20701: BINARY keyword should be forbidden in stored routines +# +--disable_warnings +drop function if exists bug20701| +--enable_warnings +# +# This was disabled in 5.1.12. See bug #20701 +# When collation support in SP is implemented, then this test should +# be removed. +# +--error ER_NOT_SUPPORTED_YET +create function bug20701() returns varchar(25) binary return "test"| +create function bug20701() returns varchar(25) return "test"| +drop function bug20701| + +# # BUG#NNNN: New bug synopsis # #--disable_warnings #drop procedure if exists bugNNNN| +#drop function if exists bugNNNN| #--enable_warnings #create procedure bugNNNN... +#create function bugNNNN... diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 322e21d989b..da5e40682f9 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -4381,12 +4381,23 @@ drop table t3| --disable_warnings drop function if exists bug9048| --enable_warnings -create function bug9048(f1 char binary) returns char binary +create function bug9048(f1 char binary) returns char begin set f1= concat( 'hello', f1 ); return f1; end| drop function bug9048| +# +# This was disabled in 5.1.12. See bug #20701 +# When collation support in SP is implemented, then this test should +# be removed. +# +--error ER_NOT_SUPPORTED_YET +create function bug9048(f1 char binary) returns char binary +begin + set f1= concat( 'hello', f1 ); + return f1; +end| # Bug #12849 Stored Procedure: Crash on procedure call with CHAR type # 'INOUT' parameter @@ -4940,7 +4951,7 @@ end| # a procedure which use tables and recursion create table t3 (a int)| insert into t3 values (0)| -create view v1 as select a from t3; +create view v1 as select a from t3| create procedure bug10100pt(level int, lim int) begin if level < lim then @@ -4963,7 +4974,7 @@ begin end if; end| # dynamic sql & recursion -prepare stmt2 from "select * from t3;"; +prepare stmt2 from "select * from t3;"| create procedure bug10100pd(level int, lim int) begin if level < lim then @@ -5258,7 +5269,7 @@ call bug13012()| call bug13012()| call bug13012()| drop procedure bug13012| -drop view v1; +drop view v1| select * from t1 order by data| # diff --git a/sql/sp.cc b/sql/sp.cc index c1bfc4f26cd..d8bbd97f601 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -992,6 +992,12 @@ sp_find_routine(THD *thd, int type, sp_name *name, sp_cache **cp, } DBUG_RETURN(sp->m_first_free_instance); } + /* + Actually depth could be +1 than the actual value in case a SP calls + SHOW CREATE PROCEDURE. Hence, the linked list could hold up to one more + instance. + */ + level= sp->m_last_cached_sp->m_recursion_level + 1; if (level > depth) { @@ -1161,19 +1167,22 @@ sp_update_procedure(THD *thd, sp_name *name, st_sp_chistics *chistics) int sp_show_create_procedure(THD *thd, sp_name *name) { + int ret= SP_KEY_NOT_FOUND; sp_head *sp; DBUG_ENTER("sp_show_create_procedure"); DBUG_PRINT("enter", ("name: %.*s", name->m_name.length, name->m_name.str)); + /* + Increase the recursion limit for this statement. SHOW CREATE PROCEDURE + does not do actual recursion. + */ + thd->variables.max_sp_recursion_depth++; if ((sp= sp_find_routine(thd, TYPE_ENUM_PROCEDURE, name, &thd->sp_proc_cache, FALSE))) - { - int ret= sp->show_create_procedure(thd); + ret= sp->show_create_procedure(thd); - DBUG_RETURN(ret); - } - - DBUG_RETURN(SP_KEY_NOT_FOUND); + thd->variables.max_sp_recursion_depth--; + DBUG_RETURN(ret); } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index b8d68a91afc..4fd4572e58b 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1672,6 +1672,17 @@ create_function_tail: { LEX *lex= Lex; sp_head *sp= lex->sphead; + /* + This was disabled in 5.1.12. See bug #20701 + When collation support in SP is implemented, then this test + should be removed. + */ + if (($8 == FIELD_TYPE_STRING || $8 == MYSQL_TYPE_VARCHAR) + && (lex->type & BINCMP_FLAG)) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), "return value collation"); + YYABORT; + } if (sp->fill_field_definition(YYTHD, lex, (enum enum_field_types) $8, |