Manual merge.
This commit is contained in:
commit
aca1a83fed
@ -164,6 +164,46 @@ DROP TABLE t1;
|
|||||||
DROP DATABASE bug39182;
|
DROP DATABASE bug39182;
|
||||||
USE test;
|
USE test;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#35383: binlog playback and replication breaks due to
|
||||||
|
# name_const substitution
|
||||||
|
#
|
||||||
|
DELIMITER //;
|
||||||
|
CREATE PROCEDURE p1(IN v1 INT)
|
||||||
|
BEGIN
|
||||||
|
CREATE TABLE t1 SELECT v1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
END//
|
||||||
|
CREATE PROCEDURE p2()
|
||||||
|
BEGIN
|
||||||
|
DECLARE v1 INT;
|
||||||
|
CREATE TABLE t1 SELECT v1+1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
END//
|
||||||
|
CREATE PROCEDURE p3(IN v1 INT)
|
||||||
|
BEGIN
|
||||||
|
CREATE TABLE t1 SELECT 1 FROM DUAL WHERE v1!=0;
|
||||||
|
DROP TABLE t1;
|
||||||
|
END//
|
||||||
|
CREATE PROCEDURE p4(IN v1 INT)
|
||||||
|
BEGIN
|
||||||
|
DECLARE v2 INT;
|
||||||
|
CREATE TABLE t1 SELECT 1, v1, v2;
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 SELECT 1, v1+1, v2;
|
||||||
|
DROP TABLE t1;
|
||||||
|
END//
|
||||||
|
DELIMITER ;//
|
||||||
|
|
||||||
|
CALL p1(1);
|
||||||
|
CALL p2();
|
||||||
|
CALL p3(0);
|
||||||
|
CALL p4(0);
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
DROP PROCEDURE p2;
|
||||||
|
DROP PROCEDURE p3;
|
||||||
|
DROP PROCEDURE p4;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
|
||||||
# Test of a too big SET INSERT_ID: see if the truncated value goes
|
# Test of a too big SET INSERT_ID: see if the truncated value goes
|
||||||
|
@ -1137,6 +1137,38 @@ DROP PROCEDURE p1;
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
DROP DATABASE bug39182;
|
DROP DATABASE bug39182;
|
||||||
USE test;
|
USE test;
|
||||||
|
CREATE PROCEDURE p1(IN v1 INT)
|
||||||
|
BEGIN
|
||||||
|
CREATE TABLE t1 SELECT v1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
END//
|
||||||
|
CREATE PROCEDURE p2()
|
||||||
|
BEGIN
|
||||||
|
DECLARE v1 INT;
|
||||||
|
CREATE TABLE t1 SELECT v1+1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
END//
|
||||||
|
CREATE PROCEDURE p3(IN v1 INT)
|
||||||
|
BEGIN
|
||||||
|
CREATE TABLE t1 SELECT 1 FROM DUAL WHERE v1!=0;
|
||||||
|
DROP TABLE t1;
|
||||||
|
END//
|
||||||
|
CREATE PROCEDURE p4(IN v1 INT)
|
||||||
|
BEGIN
|
||||||
|
DECLARE v2 INT;
|
||||||
|
CREATE TABLE t1 SELECT 1, v1, v2;
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 SELECT 1, v1+1, v2;
|
||||||
|
DROP TABLE t1;
|
||||||
|
END//
|
||||||
|
CALL p1(1);
|
||||||
|
CALL p2();
|
||||||
|
CALL p3(0);
|
||||||
|
CALL p4(0);
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
DROP PROCEDURE p2;
|
||||||
|
DROP PROCEDURE p3;
|
||||||
|
DROP PROCEDURE p4;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
reset master;
|
reset master;
|
||||||
create table t1 (id tinyint auto_increment primary key);
|
create table t1 (id tinyint auto_increment primary key);
|
||||||
|
@ -644,6 +644,38 @@ DROP PROCEDURE p1;
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
DROP DATABASE bug39182;
|
DROP DATABASE bug39182;
|
||||||
USE test;
|
USE test;
|
||||||
|
CREATE PROCEDURE p1(IN v1 INT)
|
||||||
|
BEGIN
|
||||||
|
CREATE TABLE t1 SELECT v1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
END//
|
||||||
|
CREATE PROCEDURE p2()
|
||||||
|
BEGIN
|
||||||
|
DECLARE v1 INT;
|
||||||
|
CREATE TABLE t1 SELECT v1+1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
END//
|
||||||
|
CREATE PROCEDURE p3(IN v1 INT)
|
||||||
|
BEGIN
|
||||||
|
CREATE TABLE t1 SELECT 1 FROM DUAL WHERE v1!=0;
|
||||||
|
DROP TABLE t1;
|
||||||
|
END//
|
||||||
|
CREATE PROCEDURE p4(IN v1 INT)
|
||||||
|
BEGIN
|
||||||
|
DECLARE v2 INT;
|
||||||
|
CREATE TABLE t1 SELECT 1, v1, v2;
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 SELECT 1, v1+1, v2;
|
||||||
|
DROP TABLE t1;
|
||||||
|
END//
|
||||||
|
CALL p1(1);
|
||||||
|
CALL p2();
|
||||||
|
CALL p3(0);
|
||||||
|
CALL p4(0);
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
DROP PROCEDURE p2;
|
||||||
|
DROP PROCEDURE p3;
|
||||||
|
DROP PROCEDURE p4;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
reset master;
|
reset master;
|
||||||
create table t1 (id tinyint auto_increment primary key);
|
create table t1 (id tinyint auto_increment primary key);
|
||||||
|
@ -956,6 +956,8 @@ subst_spvars(THD *thd, sp_instr *instr, LEX_STRING *query_str)
|
|||||||
qbuf.length(0);
|
qbuf.length(0);
|
||||||
cur= query_str->str;
|
cur= query_str->str;
|
||||||
prev_pos= res= 0;
|
prev_pos= res= 0;
|
||||||
|
thd->query_name_consts= 0;
|
||||||
|
|
||||||
for (Item_splocal **splocal= sp_vars_uses.front();
|
for (Item_splocal **splocal= sp_vars_uses.front();
|
||||||
splocal < sp_vars_uses.back(); splocal++)
|
splocal < sp_vars_uses.back(); splocal++)
|
||||||
{
|
{
|
||||||
@ -989,6 +991,8 @@ subst_spvars(THD *thd, sp_instr *instr, LEX_STRING *query_str)
|
|||||||
res|= qbuf.append(')');
|
res|= qbuf.append(')');
|
||||||
if (res)
|
if (res)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
thd->query_name_consts++;
|
||||||
}
|
}
|
||||||
res|= qbuf.append(cur + prev_pos, query_str->length - prev_pos);
|
res|= qbuf.append(cur + prev_pos, query_str->length - prev_pos);
|
||||||
if (res)
|
if (res)
|
||||||
@ -2853,6 +2857,7 @@ sp_instr_stmt::execute(THD *thd, uint *nextp)
|
|||||||
*nextp= m_ip+1;
|
*nextp= m_ip+1;
|
||||||
thd->query= query;
|
thd->query= query;
|
||||||
thd->query_length= query_length;
|
thd->query_length= query_length;
|
||||||
|
thd->query_name_consts= 0;
|
||||||
|
|
||||||
if (!thd->is_error())
|
if (!thd->is_error())
|
||||||
thd->main_da.reset_diagnostics_area();
|
thd->main_da.reset_diagnostics_area();
|
||||||
|
@ -599,6 +599,7 @@ THD::THD()
|
|||||||
one_shot_set= 0;
|
one_shot_set= 0;
|
||||||
file_id = 0;
|
file_id = 0;
|
||||||
query_id= 0;
|
query_id= 0;
|
||||||
|
query_name_consts= 0;
|
||||||
warn_id= 0;
|
warn_id= 0;
|
||||||
db_charset= global_system_variables.collation_database;
|
db_charset= global_system_variables.collation_database;
|
||||||
bzero(ha_data, sizeof(ha_data));
|
bzero(ha_data, sizeof(ha_data));
|
||||||
|
@ -1775,6 +1775,9 @@ public:
|
|||||||
sp_cache *sp_proc_cache;
|
sp_cache *sp_proc_cache;
|
||||||
sp_cache *sp_func_cache;
|
sp_cache *sp_func_cache;
|
||||||
|
|
||||||
|
/** number of name_const() substitutions, see sp_head.cc:subst_spvars() */
|
||||||
|
uint query_name_consts;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If we do a purge of binary logs, log index info of the threads
|
If we do a purge of binary logs, log index info of the threads
|
||||||
that are currently reading it needs to be adjusted. To do that
|
that are currently reading it needs to be adjusted. To do that
|
||||||
|
@ -2558,6 +2558,43 @@ mysql_execute_command(THD *thd)
|
|||||||
{
|
{
|
||||||
select_result *result;
|
select_result *result;
|
||||||
|
|
||||||
|
/*
|
||||||
|
If:
|
||||||
|
a) we inside an SP and there was NAME_CONST substitution,
|
||||||
|
b) binlogging is on (STMT mode),
|
||||||
|
c) we log the SP as separate statements
|
||||||
|
raise a warning, as it may cause problems
|
||||||
|
(see 'NAME_CONST issues' in 'Binary Logging of Stored Programs')
|
||||||
|
*/
|
||||||
|
if (thd->query_name_consts &&
|
||||||
|
mysql_bin_log.is_open() &&
|
||||||
|
thd->variables.binlog_format == BINLOG_FORMAT_STMT &&
|
||||||
|
!mysql_bin_log.is_query_in_union(thd, thd->query_id))
|
||||||
|
{
|
||||||
|
List_iterator_fast<Item> it(select_lex->item_list);
|
||||||
|
Item *item;
|
||||||
|
uint splocal_refs= 0;
|
||||||
|
/* Count SP local vars in the top-level SELECT list */
|
||||||
|
while ((item= it++))
|
||||||
|
{
|
||||||
|
if (item->is_splocal())
|
||||||
|
splocal_refs++;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
If it differs from number of NAME_CONST substitution applied,
|
||||||
|
we may have a SOME_FUNC(NAME_CONST()) in the SELECT list,
|
||||||
|
that may cause a problem with binary log (see BUG#35383),
|
||||||
|
raise a warning.
|
||||||
|
*/
|
||||||
|
if (splocal_refs != thd->query_name_consts)
|
||||||
|
push_warning(thd,
|
||||||
|
MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||||
|
ER_UNKNOWN_ERROR,
|
||||||
|
"Invoked routine ran a statement that may cause problems with "
|
||||||
|
"binary log, see 'NAME_CONST issues' in 'Binary Logging of Stored Programs' "
|
||||||
|
"section of the manual.");
|
||||||
|
}
|
||||||
|
|
||||||
select_lex->options|= SELECT_NO_UNLOCK;
|
select_lex->options|= SELECT_NO_UNLOCK;
|
||||||
unit->set_limit(select_lex);
|
unit->set_limit(select_lex);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user