Commit 76d6e2db authored by unknown's avatar unknown

Merge mysql.com:/usr/local/bk/mysql-5.0

into mysql.com:/home/pem/work/mysql-5.0

parents 2821fa61 31b3ecaf
...@@ -594,4 +594,52 @@ alter function bug7047; ...@@ -594,4 +594,52 @@ alter function bug7047;
return 0; return 0;
end| end|
ERROR HY000: Can't drop or alter a FUNCTION from within another stored routine ERROR HY000: Can't drop or alter a FUNCTION from within another stored routine
drop function if exists bug8408|
drop procedure if exists bug8408|
create function bug8408() returns int
begin
select * from t1;
return 0;
end|
ERROR 0A000: Not allowed to return a result set from a function
create function bug8408() returns int
begin
show warnings;
return 0;
end|
ERROR 0A000: Not allowed to return a result set from a function
create function bug8408(a int) returns int
begin
declare b int;
select b;
return b;
end|
ERROR 0A000: Not allowed to return a result set from a function
create function bug8408() returns int
begin
call bug8408();
return 0;
end|
create procedure bug8408()
select * from t1|
call bug8408()|
val x
select bug8408()|
ERROR 0A000: SELECT in a stored procedure must have INTO
drop procedure bug8408|
drop function bug8408|
create function bug8408() returns int
begin
declare n int default 0;
select count(*) into n from t1;
return n;
end|
insert into t1 value (2, 2.7), (3, 3.14), (7, 7.0)|
select *,bug8408() from t1|
val x bug8408()
2 2.7 3
3 3.14 3
7 7 3
drop function bug8408|
delete from t1|
drop table t1| drop table t1|
...@@ -831,6 +831,67 @@ begin ...@@ -831,6 +831,67 @@ begin
end| end|
#
# BUG#8408: Stored procedure crash if function contains SHOW
# BUG#9058: Stored Procedures: Crash if function included SELECT
#
--disable_warnings
drop function if exists bug8408|
drop procedure if exists bug8408|
--enable_warnings
# Some things are caught when parsing
--error ER_SP_NO_RETSET_IN_FUNC
create function bug8408() returns int
begin
select * from t1;
return 0;
end|
--error ER_SP_NO_RETSET_IN_FUNC
create function bug8408() returns int
begin
show warnings;
return 0;
end|
--error ER_SP_NO_RETSET_IN_FUNC
create function bug8408(a int) returns int
begin
declare b int;
select b;
return b;
end|
# Some things must be caught at invokation time
create function bug8408() returns int
begin
call bug8408();
return 0;
end|
create procedure bug8408()
select * from t1|
call bug8408()|
--error ER_SP_BADSELECT
select bug8408()|
drop procedure bug8408|
drop function bug8408|
# But this is ok
create function bug8408() returns int
begin
declare n int default 0;
select count(*) into n from t1;
return n;
end|
insert into t1 value (2, 2.7), (3, 3.14), (7, 7.0)|
select *,bug8408() from t1|
drop function bug8408|
delete from t1|
# #
# BUG#NNNN: New bug synopsis # BUG#NNNN: New bug synopsis
# #
......
...@@ -4554,6 +4554,7 @@ Item_func_sp::execute(Item **itp) ...@@ -4554,6 +4554,7 @@ Item_func_sp::execute(Item **itp)
{ {
DBUG_ENTER("Item_func_sp::execute"); DBUG_ENTER("Item_func_sp::execute");
THD *thd= current_thd; THD *thd= current_thd;
bool clcap_mr;
int res; int res;
#ifndef NO_EMBEDDED_ACCESS_CHECKS #ifndef NO_EMBEDDED_ACCESS_CHECKS
st_sp_security_context save_ctx; st_sp_security_context save_ctx;
...@@ -4567,6 +4568,9 @@ Item_func_sp::execute(Item **itp) ...@@ -4567,6 +4568,9 @@ Item_func_sp::execute(Item **itp)
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
clcap_mr= (thd->client_capabilities & CLIENT_MULTI_RESULTS);
thd->client_capabilities &= ~CLIENT_MULTI_RESULTS;
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
my_bool nsok= thd->net.no_send_ok; my_bool nsok= thd->net.no_send_ok;
thd->net.no_send_ok= TRUE; thd->net.no_send_ok= TRUE;
...@@ -4582,6 +4586,8 @@ Item_func_sp::execute(Item **itp) ...@@ -4582,6 +4586,8 @@ Item_func_sp::execute(Item **itp)
m_sp->m_db.str, m_sp->m_name.str, 0)) m_sp->m_db.str, m_sp->m_name.str, 0))
{ {
sp_restore_security_context(thd, m_sp, &save_ctx); sp_restore_security_context(thd, m_sp, &save_ctx);
if (clcap_mr)
thd->client_capabilities |= CLIENT_MULTI_RESULTS;
DBUG_RETURN(-1); DBUG_RETURN(-1);
} }
#endif #endif
...@@ -4595,6 +4601,10 @@ Item_func_sp::execute(Item **itp) ...@@ -4595,6 +4601,10 @@ Item_func_sp::execute(Item **itp)
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
thd->net.no_send_ok= nsok; thd->net.no_send_ok= nsok;
#endif #endif
if (clcap_mr)
thd->client_capabilities |= CLIENT_MULTI_RESULTS;
DBUG_RETURN(res); DBUG_RETURN(res);
} }
......
...@@ -1301,6 +1301,8 @@ class Item_func_sp :public Item_func ...@@ -1301,6 +1301,8 @@ class Item_func_sp :public Item_func
void cleanup() void cleanup()
{ {
if (result_field)
delete result_field;
Item_func::cleanup(); Item_func::cleanup();
result_field= NULL; result_field= NULL;
} }
......
...@@ -5342,3 +5342,5 @@ ER_SP_DUP_HANDLER 42000 ...@@ -5342,3 +5342,5 @@ ER_SP_DUP_HANDLER 42000
eng "Duplicate handler declared in the same block" eng "Duplicate handler declared in the same block"
ER_SP_NOT_VAR_ARG 42000 ER_SP_NOT_VAR_ARG 42000
eng "OUT or INOUT argument %d for routine %s is not a variable" eng "OUT or INOUT argument %d for routine %s is not a variable"
ER_SP_NO_RETSET_IN_FUNC 0A000
eng "Not allowed to return a result set from a function"
...@@ -1442,6 +1442,12 @@ create_function_tail: ...@@ -1442,6 +1442,12 @@ create_function_tail:
LEX *lex= Lex; LEX *lex= Lex;
sp_head *sp= lex->sphead; sp_head *sp= lex->sphead;
if (sp->m_multi_results)
{
my_message(ER_SP_NO_RETSET_IN_FUNC, ER(ER_SP_NO_RETSET_IN_FUNC),
MYF(0));
YYABORT;
}
if (sp->check_backpatch(YYTHD)) if (sp->check_backpatch(YYTHD))
YYABORT; YYABORT;
lex->sql_command= SQLCOM_CREATE_SPFUNCTION; lex->sql_command= SQLCOM_CREATE_SPFUNCTION;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment