mirror of
https://github.com/MariaDB/server.git
synced 2025-07-26 07:02:12 +03:00
Merge mysql.com:/usr/local/bk/mysql-5.0
into mysql.com:/home/pem/work/mysql-5.0
This commit is contained in:
@ -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
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
#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 @@ public:
|
|||||||
|
|
||||||
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
|
|||||||
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:
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user