mirror of
https://github.com/MariaDB/server.git
synced 2025-02-01 11:31:51 +01:00
Merge 192.168.0.20:mysql/my51-m-bug21039
into neptunus.(none):/home/msvensson/mysql/mysql-5.1-new-maint
This commit is contained in:
commit
4632f97e21
7 changed files with 22 additions and 49 deletions
|
@ -754,7 +754,7 @@ bug11834_2()
|
||||||
10
|
10
|
||||||
drop function bug11834_1;
|
drop function bug11834_1;
|
||||||
execute stmt;
|
execute stmt;
|
||||||
ERROR 42000: FUNCTION test.bug11834_1 does not exist
|
ERROR 42000: FUNCTION test.bug11834_2 does not exist
|
||||||
deallocate prepare stmt;
|
deallocate prepare stmt;
|
||||||
drop function bug11834_2;
|
drop function bug11834_2;
|
||||||
DROP FUNCTION IF EXISTS bug12953|
|
DROP FUNCTION IF EXISTS bug12953|
|
||||||
|
|
|
@ -25,17 +25,6 @@ Id User Host db Command Time State Info
|
||||||
# event_scheduler localhost NULL Connect # Suspended NULL
|
# event_scheduler localhost NULL Connect # Suspended NULL
|
||||||
# root localhost test Query # NULL show processlist
|
# root localhost test Query # NULL show processlist
|
||||||
drop procedure bug4902_2|
|
drop procedure bug4902_2|
|
||||||
drop function if exists bug5278|
|
|
||||||
create function bug5278 () returns char
|
|
||||||
begin
|
|
||||||
SET PASSWORD FOR 'bob'@'%.loc.gov' = PASSWORD('newpass');
|
|
||||||
return 'okay';
|
|
||||||
end|
|
|
||||||
select bug5278()|
|
|
||||||
ERROR 42000: Can't find any matching row in the user table
|
|
||||||
select bug5278()|
|
|
||||||
ERROR 42000: Can't find any matching row in the user table
|
|
||||||
drop function bug5278|
|
|
||||||
drop table if exists t1|
|
drop table if exists t1|
|
||||||
create table t1 (
|
create table t1 (
|
||||||
id char(16) not null default '',
|
id char(16) not null default '',
|
||||||
|
|
|
@ -1075,6 +1075,10 @@ execute stmt;
|
||||||
drop function bug11834_1;
|
drop function bug11834_1;
|
||||||
# Attempt to execute statement should return proper error and
|
# Attempt to execute statement should return proper error and
|
||||||
# should not crash server.
|
# should not crash server.
|
||||||
|
|
||||||
|
# NOTE! The error we get from the below query indicates that the sp bug11834_2
|
||||||
|
# does not exist(this is wrong but can be accepted)
|
||||||
|
# This behaviour has been reported as bug#21294
|
||||||
--error ER_SP_DOES_NOT_EXIST
|
--error ER_SP_DOES_NOT_EXIST
|
||||||
execute stmt;
|
execute stmt;
|
||||||
deallocate prepare stmt;
|
deallocate prepare stmt;
|
||||||
|
|
|
@ -46,6 +46,8 @@ call bug4902_2()|
|
||||||
drop procedure bug4902_2|
|
drop procedure bug4902_2|
|
||||||
|
|
||||||
|
|
||||||
|
# Disable until bug#17244 is fixed
|
||||||
|
--disable_parsing
|
||||||
#
|
#
|
||||||
# BUG#5278: Stored procedure packets out of order if SET PASSWORD.
|
# BUG#5278: Stored procedure packets out of order if SET PASSWORD.
|
||||||
#
|
#
|
||||||
|
@ -63,7 +65,7 @@ select bug5278()|
|
||||||
--error 1133
|
--error 1133
|
||||||
select bug5278()|
|
select bug5278()|
|
||||||
drop function bug5278|
|
drop function bug5278|
|
||||||
|
--enable_parsing
|
||||||
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
drop table if exists t1|
|
drop table if exists t1|
|
||||||
|
|
27
sql/sp.cc
27
sql/sp.cc
|
@ -1537,7 +1537,6 @@ static void sp_update_stmt_used_routines(THD *thd, LEX *lex, SQL_LIST *src,
|
||||||
first_no_prelock - If true, don't add tables or cache routines used by
|
first_no_prelock - If true, don't add tables or cache routines used by
|
||||||
the body of the first routine (i.e. *start)
|
the body of the first routine (i.e. *start)
|
||||||
will be executed in non-prelocked mode.
|
will be executed in non-prelocked mode.
|
||||||
tabs_changed - Set to TRUE some tables were added, FALSE otherwise
|
|
||||||
NOTE
|
NOTE
|
||||||
If some function is missing this won't be reported here.
|
If some function is missing this won't be reported here.
|
||||||
Instead this fact will be discovered during query execution.
|
Instead this fact will be discovered during query execution.
|
||||||
|
@ -1550,10 +1549,9 @@ static void sp_update_stmt_used_routines(THD *thd, LEX *lex, SQL_LIST *src,
|
||||||
static int
|
static int
|
||||||
sp_cache_routines_and_add_tables_aux(THD *thd, LEX *lex,
|
sp_cache_routines_and_add_tables_aux(THD *thd, LEX *lex,
|
||||||
Sroutine_hash_entry *start,
|
Sroutine_hash_entry *start,
|
||||||
bool first_no_prelock, bool *tabs_changed)
|
bool first_no_prelock)
|
||||||
{
|
{
|
||||||
int ret= 0;
|
int ret= 0;
|
||||||
bool tabschnd= 0; /* Set if tables changed */
|
|
||||||
bool first= TRUE;
|
bool first= TRUE;
|
||||||
DBUG_ENTER("sp_cache_routines_and_add_tables_aux");
|
DBUG_ENTER("sp_cache_routines_and_add_tables_aux");
|
||||||
|
|
||||||
|
@ -1626,16 +1624,13 @@ sp_cache_routines_and_add_tables_aux(THD *thd, LEX *lex,
|
||||||
{
|
{
|
||||||
sp_update_stmt_used_routines(thd, lex, &sp->m_sroutines,
|
sp_update_stmt_used_routines(thd, lex, &sp->m_sroutines,
|
||||||
rt->belong_to_view);
|
rt->belong_to_view);
|
||||||
tabschnd|=
|
(void)sp->add_used_tables_to_table_list(thd, &lex->query_tables_last,
|
||||||
sp->add_used_tables_to_table_list(thd, &lex->query_tables_last,
|
rt->belong_to_view);
|
||||||
rt->belong_to_view);
|
|
||||||
}
|
}
|
||||||
sp->propagate_attributes(lex);
|
sp->propagate_attributes(lex);
|
||||||
}
|
}
|
||||||
first= FALSE;
|
first= FALSE;
|
||||||
}
|
}
|
||||||
if (tabs_changed) /* it can be NULL */
|
|
||||||
*tabs_changed= tabschnd;
|
|
||||||
DBUG_RETURN(ret);
|
DBUG_RETURN(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1651,20 +1646,18 @@ sp_cache_routines_and_add_tables_aux(THD *thd, LEX *lex,
|
||||||
lex - LEX representing statement
|
lex - LEX representing statement
|
||||||
first_no_prelock - If true, don't add tables or cache routines used by
|
first_no_prelock - If true, don't add tables or cache routines used by
|
||||||
the body of the first routine (i.e. *start)
|
the body of the first routine (i.e. *start)
|
||||||
tabs_changed - Set to TRUE some tables were added, FALSE otherwise
|
|
||||||
|
|
||||||
RETURN VALUE
|
RETURN VALUE
|
||||||
0 - success
|
0 - success
|
||||||
non-0 - failure
|
non-0 - failure
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int
|
int
|
||||||
sp_cache_routines_and_add_tables(THD *thd, LEX *lex, bool first_no_prelock,
|
sp_cache_routines_and_add_tables(THD *thd, LEX *lex, bool first_no_prelock)
|
||||||
bool *tabs_changed)
|
|
||||||
{
|
{
|
||||||
return sp_cache_routines_and_add_tables_aux(thd, lex,
|
return sp_cache_routines_and_add_tables_aux(thd, lex,
|
||||||
(Sroutine_hash_entry *)lex->sroutines_list.first,
|
(Sroutine_hash_entry *)lex->sroutines_list.first,
|
||||||
first_no_prelock, tabs_changed);
|
first_no_prelock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1691,9 +1684,8 @@ sp_cache_routines_and_add_tables_for_view(THD *thd, LEX *lex, TABLE_LIST *view)
|
||||||
(Sroutine_hash_entry **)lex->sroutines_list.next;
|
(Sroutine_hash_entry **)lex->sroutines_list.next;
|
||||||
sp_update_stmt_used_routines(thd, lex, &view->view->sroutines_list,
|
sp_update_stmt_used_routines(thd, lex, &view->view->sroutines_list,
|
||||||
view->top_table());
|
view->top_table());
|
||||||
return sp_cache_routines_and_add_tables_aux(thd, lex,
|
return sp_cache_routines_and_add_tables_aux(thd, lex,
|
||||||
*last_cached_routine_ptr, FALSE,
|
*last_cached_routine_ptr, FALSE);
|
||||||
NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1742,8 +1734,7 @@ sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret= sp_cache_routines_and_add_tables_aux(thd, lex,
|
ret= sp_cache_routines_and_add_tables_aux(thd, lex,
|
||||||
*last_cached_routine_ptr,
|
*last_cached_routine_ptr, FALSE);
|
||||||
FALSE, NULL);
|
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
3
sql/sp.h
3
sql/sp.h
|
@ -88,8 +88,7 @@ void sp_add_used_routine(LEX *lex, Query_arena *arena,
|
||||||
void sp_remove_not_own_routines(LEX *lex);
|
void sp_remove_not_own_routines(LEX *lex);
|
||||||
void sp_update_sp_used_routines(HASH *dst, HASH *src);
|
void sp_update_sp_used_routines(HASH *dst, HASH *src);
|
||||||
int sp_cache_routines_and_add_tables(THD *thd, LEX *lex,
|
int sp_cache_routines_and_add_tables(THD *thd, LEX *lex,
|
||||||
bool first_no_prelock,
|
bool first_no_prelock);
|
||||||
bool *tabs_changed);
|
|
||||||
int sp_cache_routines_and_add_tables_for_view(THD *thd, LEX *lex,
|
int sp_cache_routines_and_add_tables_for_view(THD *thd, LEX *lex,
|
||||||
TABLE_LIST *view);
|
TABLE_LIST *view);
|
||||||
int sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex,
|
int sp_cache_routines_and_add_tables_for_triggers(THD *thd, LEX *lex,
|
||||||
|
|
|
@ -2855,25 +2855,18 @@ int open_tables(THD *thd, TABLE_LIST **start, uint *counter, uint flags)
|
||||||
statement for which table list for prelocking is already built, let
|
statement for which table list for prelocking is already built, let
|
||||||
us cache routines and try to build such table list.
|
us cache routines and try to build such table list.
|
||||||
|
|
||||||
NOTE: We will mark statement as requiring prelocking only if we will
|
|
||||||
have non empty table list. But this does not guarantee that in prelocked
|
|
||||||
mode we will have some locked tables, because queries which use only
|
|
||||||
derived/information schema tables and views possible. Thus "counter"
|
|
||||||
may be still zero for prelocked statement...
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!thd->prelocked_mode && !thd->lex->requires_prelocking() &&
|
if (!thd->prelocked_mode && !thd->lex->requires_prelocking() &&
|
||||||
thd->lex->sroutines_list.elements)
|
thd->lex->sroutines_list.elements)
|
||||||
{
|
{
|
||||||
bool first_no_prelocking, need_prelocking, tabs_changed;
|
bool first_no_prelocking, need_prelocking;
|
||||||
TABLE_LIST **save_query_tables_last= thd->lex->query_tables_last;
|
TABLE_LIST **save_query_tables_last= thd->lex->query_tables_last;
|
||||||
|
|
||||||
DBUG_ASSERT(thd->lex->query_tables == *start);
|
DBUG_ASSERT(thd->lex->query_tables == *start);
|
||||||
sp_get_prelocking_info(thd, &need_prelocking, &first_no_prelocking);
|
sp_get_prelocking_info(thd, &need_prelocking, &first_no_prelocking);
|
||||||
|
|
||||||
if (sp_cache_routines_and_add_tables(thd, thd->lex,
|
if (sp_cache_routines_and_add_tables(thd, thd->lex, first_no_prelocking))
|
||||||
first_no_prelocking,
|
|
||||||
&tabs_changed))
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
Serious error during reading stored routines from mysql.proc table.
|
Serious error during reading stored routines from mysql.proc table.
|
||||||
|
@ -2883,7 +2876,7 @@ int open_tables(THD *thd, TABLE_LIST **start, uint *counter, uint flags)
|
||||||
result= -1;
|
result= -1;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
else if ((tabs_changed || *start) && need_prelocking)
|
else if (need_prelocking)
|
||||||
{
|
{
|
||||||
query_tables_last_own= save_query_tables_last;
|
query_tables_last_own= save_query_tables_last;
|
||||||
*start= thd->lex->query_tables;
|
*start= thd->lex->query_tables;
|
||||||
|
@ -3310,11 +3303,6 @@ int lock_tables(THD *thd, TABLE_LIST *tables, uint count, bool *need_reopen)
|
||||||
in prelocked mode.
|
in prelocked mode.
|
||||||
*/
|
*/
|
||||||
DBUG_ASSERT(!thd->prelocked_mode || !thd->lex->requires_prelocking());
|
DBUG_ASSERT(!thd->prelocked_mode || !thd->lex->requires_prelocking());
|
||||||
/*
|
|
||||||
If statement requires prelocking then it has non-empty table list.
|
|
||||||
So it is safe to shortcut.
|
|
||||||
*/
|
|
||||||
DBUG_ASSERT(!thd->lex->requires_prelocking() || tables);
|
|
||||||
|
|
||||||
*need_reopen= FALSE;
|
*need_reopen= FALSE;
|
||||||
|
|
||||||
|
@ -3326,7 +3314,7 @@ int lock_tables(THD *thd, TABLE_LIST *tables, uint count, bool *need_reopen)
|
||||||
thd->set_current_stmt_binlog_row_based_if_mixed();
|
thd->set_current_stmt_binlog_row_based_if_mixed();
|
||||||
#endif /*HAVE_ROW_BASED_REPLICATION*/
|
#endif /*HAVE_ROW_BASED_REPLICATION*/
|
||||||
|
|
||||||
if (!tables)
|
if (!tables && !thd->lex->requires_prelocking())
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Add table
Reference in a new issue