Merge mysql.com:/home/kostja/mysql/tmp_merge
into mysql.com:/home/kostja/mysql/mysql-5.1-merge
This commit is contained in:
commit
365404a048
@ -506,3 +506,12 @@ d1 d2
|
||||
02 February
|
||||
01 January
|
||||
drop table t1;
|
||||
select str_to_date( 1, NULL );
|
||||
str_to_date( 1, NULL )
|
||||
NULL
|
||||
select str_to_date( NULL, 1 );
|
||||
str_to_date( NULL, 1 )
|
||||
NULL
|
||||
select str_to_date( 1, IF(1=1,NULL,NULL) );
|
||||
str_to_date( 1, IF(1=1,NULL,NULL) )
|
||||
NULL
|
||||
|
@ -1134,3 +1134,32 @@ show procedure status;
|
||||
Db Name Type Definer Modified Created Security_type Comment
|
||||
test bug15658 PROCEDURE root@localhost 0000-00-00 00:00:00 0000-00-00 00:00:00 DEFINER
|
||||
drop procedure ` bug15658`;
|
||||
drop function if exists bug14270;
|
||||
drop table if exists t1;
|
||||
create table t1 (s1 int primary key);
|
||||
create function bug14270() returns int
|
||||
begin
|
||||
load index into cache t1;
|
||||
return 1;
|
||||
end|
|
||||
ERROR 0A000: Not allowed to return a result set from a function
|
||||
create function bug14270() returns int
|
||||
begin
|
||||
cache index t1 key (`primary`) in keycache1;
|
||||
return 1;
|
||||
end|
|
||||
ERROR 0A000: Not allowed to return a result set from a function
|
||||
drop table t1;
|
||||
drop procedure if exists bug15091;
|
||||
create procedure bug15091()
|
||||
begin
|
||||
declare selectstr varchar(6000) default ' ';
|
||||
declare conditionstr varchar(5000) default '';
|
||||
set selectstr = concat(selectstr,
|
||||
' and ',
|
||||
c.operatorid,
|
||||
'in (',conditionstr, ')');
|
||||
end|
|
||||
call bug15091();
|
||||
ERROR 42S02: Unknown table 'c' in field list
|
||||
drop procedure bug15091;
|
||||
|
@ -291,3 +291,26 @@ drop user user1_bug14834@localhost;
|
||||
drop user user2_bug14834@localhost;
|
||||
drop user user3_bug14834@localhost;
|
||||
drop database db_bug14834;
|
||||
create database db_bug14533;
|
||||
use db_bug14533;
|
||||
create table t1 (id int);
|
||||
create user user_bug14533@localhost identified by '';
|
||||
create procedure bug14533_1()
|
||||
sql security definer
|
||||
desc db_bug14533.t1;
|
||||
create procedure bug14533_2()
|
||||
sql security definer
|
||||
select * from db_bug14533.t1;
|
||||
grant execute on procedure db_bug14533.bug14533_1 to user_bug14533@localhost;
|
||||
grant execute on procedure db_bug14533.bug14533_2 to user_bug14533@localhost;
|
||||
call db_bug14533.bug14533_1();
|
||||
Field Type Null Key Default Extra
|
||||
id int(11) YES NULL
|
||||
call db_bug14533.bug14533_2();
|
||||
id
|
||||
desc db_bug14533.t1;
|
||||
ERROR 42000: SELECT command denied to user 'user_bug14533'@'localhost' for table 't1'
|
||||
select * from db_bug14533.t1;
|
||||
ERROR 42000: SELECT command denied to user 'user_bug14533'@'localhost' for table 't1'
|
||||
drop user user_bug14533@localhost;
|
||||
drop database db_bug14533;
|
||||
|
@ -4425,4 +4425,23 @@ drop procedure if exists bug15231_1|
|
||||
drop procedure if exists bug15231_2|
|
||||
drop procedure if exists bug15231_3|
|
||||
drop procedure if exists bug15231_4|
|
||||
drop procedure if exists bug15011|
|
||||
create table t3 (c1 int primary key)|
|
||||
insert into t3 values (1)|
|
||||
create procedure bug15011()
|
||||
deterministic
|
||||
begin
|
||||
declare continue handler for 1062
|
||||
select 'Outer' as 'Handler';
|
||||
begin
|
||||
declare continue handler for 1062
|
||||
select 'Inner' as 'Handler';
|
||||
insert into t3 values (1);
|
||||
end;
|
||||
end|
|
||||
call bug15011()|
|
||||
Handler
|
||||
Inner
|
||||
drop procedure bug15011|
|
||||
drop table t3|
|
||||
drop table t1,t2;
|
||||
|
@ -272,4 +272,11 @@ insert into t1 (f1) values ("2005-01-01");
|
||||
insert into t1 (f1) values ("2005-02-01");
|
||||
select date_format(f1, "%m") as d1, date_format(f1, "%M") as d2 from t1 order by date_format(f1, "%M");
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #15828
|
||||
#
|
||||
select str_to_date( 1, NULL );
|
||||
select str_to_date( NULL, 1 );
|
||||
select str_to_date( 1, IF(1=1,NULL,NULL) );
|
||||
# End of 4.1 tests
|
||||
|
@ -1621,6 +1621,66 @@ show procedure status;
|
||||
drop procedure ` bug15658`;
|
||||
|
||||
|
||||
#
|
||||
# BUG#14270: Stored procedures: crash if load index
|
||||
#
|
||||
--disable_warnings
|
||||
drop function if exists bug14270;
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
|
||||
create table t1 (s1 int primary key);
|
||||
|
||||
delimiter |;
|
||||
--error ER_SP_NO_RETSET
|
||||
create function bug14270() returns int
|
||||
begin
|
||||
load index into cache t1;
|
||||
return 1;
|
||||
end|
|
||||
|
||||
--error ER_SP_NO_RETSET
|
||||
create function bug14270() returns int
|
||||
begin
|
||||
cache index t1 key (`primary`) in keycache1;
|
||||
return 1;
|
||||
end|
|
||||
delimiter ;|
|
||||
|
||||
drop table t1;
|
||||
|
||||
|
||||
#
|
||||
# BUG#15091: Sp Returns Unknown error in order clause....and
|
||||
# there is no order by clause
|
||||
#
|
||||
--disable_warnings
|
||||
drop procedure if exists bug15091;
|
||||
--enable_warnings
|
||||
|
||||
delimiter |;
|
||||
create procedure bug15091()
|
||||
begin
|
||||
declare selectstr varchar(6000) default ' ';
|
||||
declare conditionstr varchar(5000) default '';
|
||||
|
||||
set selectstr = concat(selectstr,
|
||||
' and ',
|
||||
c.operatorid,
|
||||
'in (',conditionstr, ')');
|
||||
end|
|
||||
delimiter ;|
|
||||
|
||||
# The error message used to be:
|
||||
# ERROR 1109 (42S02): Unknown table 'c' in order clause
|
||||
# but is now rephrased to something less misleading:
|
||||
# ERROR 1109 (42S02): Unknown table 'c' in field list
|
||||
--error ER_UNKNOWN_TABLE
|
||||
call bug15091();
|
||||
|
||||
drop procedure bug15091;
|
||||
|
||||
|
||||
#
|
||||
# BUG#NNNN: New bug synopsis
|
||||
#
|
||||
|
@ -487,4 +487,42 @@ drop user user2_bug14834@localhost;
|
||||
drop user user3_bug14834@localhost;
|
||||
drop database db_bug14834;
|
||||
|
||||
|
||||
#
|
||||
# BUG#14533: 'desc tbl' in stored procedure causes error 1142
|
||||
#
|
||||
create database db_bug14533;
|
||||
use db_bug14533;
|
||||
create table t1 (id int);
|
||||
create user user_bug14533@localhost identified by '';
|
||||
|
||||
create procedure bug14533_1()
|
||||
sql security definer
|
||||
desc db_bug14533.t1;
|
||||
|
||||
create procedure bug14533_2()
|
||||
sql security definer
|
||||
select * from db_bug14533.t1;
|
||||
|
||||
grant execute on procedure db_bug14533.bug14533_1 to user_bug14533@localhost;
|
||||
grant execute on procedure db_bug14533.bug14533_2 to user_bug14533@localhost;
|
||||
|
||||
connect (user_bug14533,localhost,user_bug14533,,test);
|
||||
|
||||
# These should work
|
||||
call db_bug14533.bug14533_1();
|
||||
call db_bug14533.bug14533_2();
|
||||
|
||||
# For reference, these should not work
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
desc db_bug14533.t1;
|
||||
--error ER_TABLEACCESS_DENIED_ERROR
|
||||
select * from db_bug14533.t1;
|
||||
|
||||
# Cleanup
|
||||
connection default;
|
||||
disconnect user_bug14533;
|
||||
drop user user_bug14533@localhost;
|
||||
drop database db_bug14533;
|
||||
|
||||
# End of 5.0 bugs.
|
||||
|
@ -5198,6 +5198,37 @@ drop procedure if exists bug15231_3|
|
||||
drop procedure if exists bug15231_4|
|
||||
|
||||
|
||||
#
|
||||
# BUG#15011: error handler in nested block not activated
|
||||
#
|
||||
--disable_warnings
|
||||
drop procedure if exists bug15011|
|
||||
--enable_warnings
|
||||
|
||||
create table t3 (c1 int primary key)|
|
||||
|
||||
insert into t3 values (1)|
|
||||
|
||||
create procedure bug15011()
|
||||
deterministic
|
||||
begin
|
||||
declare continue handler for 1062
|
||||
select 'Outer' as 'Handler';
|
||||
|
||||
begin
|
||||
declare continue handler for 1062
|
||||
select 'Inner' as 'Handler';
|
||||
|
||||
insert into t3 values (1);
|
||||
end;
|
||||
end|
|
||||
|
||||
call bug15011()|
|
||||
|
||||
drop procedure bug15011|
|
||||
drop table t3|
|
||||
|
||||
|
||||
#
|
||||
# BUG#NNNN: New bug synopsis
|
||||
#
|
||||
|
@ -2967,9 +2967,9 @@ void Item_func_str_to_date::fix_length_and_dec()
|
||||
cached_field_type= MYSQL_TYPE_STRING;
|
||||
max_length= MAX_DATETIME_FULL_WIDTH*MY_CHARSET_BIN_MB_MAXLEN;
|
||||
cached_timestamp_type= MYSQL_TIMESTAMP_NONE;
|
||||
if ((const_item= args[1]->const_item()))
|
||||
format= args[1]->val_str(&format_str);
|
||||
if (!args[1]->null_value && (const_item= args[1]->const_item()))
|
||||
{
|
||||
format= args[1]->val_str(&format_str);
|
||||
cached_format_type= get_date_time_result_type(format->ptr(),
|
||||
format->length());
|
||||
switch (cached_format_type) {
|
||||
|
@ -164,6 +164,33 @@ sp_rcontext::set_return_value(THD *thd, Item *return_value_item)
|
||||
#define IS_NOT_FOUND_CONDITION(S) ((S)[0] == '0' && (S)[1] == '2')
|
||||
#define IS_EXCEPTION_CONDITION(S) ((S)[0] != '0' || (S)[1] > '2')
|
||||
|
||||
/*
|
||||
Find a handler for the given errno.
|
||||
This is called from all error message functions (e.g. push_warning,
|
||||
net_send_error, et al) when a sp_rcontext is in effect. If a handler
|
||||
is found, no error is sent, and the the SP execution loop will instead
|
||||
invoke the found handler.
|
||||
This might be called several times before we get back to the execution
|
||||
loop, so m_hfound can be >= 0 if a handler has already been found.
|
||||
(In which case we don't search again - the first found handler will
|
||||
be used.)
|
||||
Handlers are pushed on the stack m_handler, with the latest/innermost
|
||||
one on the top; we then search for matching handlers from the top and
|
||||
down.
|
||||
We search through all the handlers, looking for the most specific one
|
||||
(sql_errno more specific than sqlstate more specific than the rest).
|
||||
Note that mysql error code handlers is a MySQL extension, not part of
|
||||
the standard.
|
||||
|
||||
SYNOPSIS
|
||||
sql_errno The error code
|
||||
level Warning level
|
||||
|
||||
RETURN
|
||||
1 if a handler was found, m_hfound is set to its index (>= 0)
|
||||
0 if not found, m_hfound is -1
|
||||
*/
|
||||
|
||||
bool
|
||||
sp_rcontext::find_handler(uint sql_errno,
|
||||
MYSQL_ERROR::enum_warning_level level)
|
||||
@ -174,11 +201,13 @@ sp_rcontext::find_handler(uint sql_errno,
|
||||
const char *sqlstate= mysql_errno_to_sqlstate(sql_errno);
|
||||
int i= m_hcount, found= -1;
|
||||
|
||||
/* Search handlers from the latest (innermost) to the oldest (outermost) */
|
||||
while (i--)
|
||||
{
|
||||
sp_cond_type_t *cond= m_handler[i].cond;
|
||||
int j= m_ihsp;
|
||||
|
||||
/* Check active handlers, to avoid invoking one recursively */
|
||||
while (j--)
|
||||
if (m_in_handler[j] == m_handler[i].handler)
|
||||
break;
|
||||
@ -188,7 +217,8 @@ sp_rcontext::find_handler(uint sql_errno,
|
||||
switch (cond->type)
|
||||
{
|
||||
case sp_cond_type_t::number:
|
||||
if (sql_errno == cond->mysqlerr)
|
||||
if (sql_errno == cond->mysqlerr &&
|
||||
(found < 0 || m_handler[found].cond->type > sp_cond_type_t::number))
|
||||
found= i; // Always the most specific
|
||||
break;
|
||||
case sp_cond_type_t::state:
|
||||
|
Loading…
x
Reference in New Issue
Block a user