BUG#51021: current_stmt_binlog_row_based not removed in next-mr
As part of BUG@39934 fix, the public: - THD::current_stmt_binlog_row_based variable had been removed and replaced by a private variable: - THD::current_stmt_binlog_format. THD was refactored and some modifiers and accessors were implemented for the new variable. However, due to a bad merge, the THD::current_stmt_binlog_row_based variable is back as a public member of THD. This in itself is already potentially harmful. What's even worse is that while merging some more patches and resolving conflicts, the variable started being used again, which is obviously wrong. To fix this we: 1. remove the extraneous variable from sql_class.h 2. revert a bad merge for BUG#49132 3. merge BUG#49132 properly again (actually, making use of the cset used to merge the original patch to mysql-pe).
This commit is contained in:
parent
68ac1c9c28
commit
9ba558302b
@ -744,8 +744,9 @@ ERROR 23000: Duplicate entry '2' for key 'PRIMARY'
|
|||||||
show binlog events from <binlog_start>;
|
show binlog events from <binlog_start>;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
master-bin.000001 # Query # # BEGIN
|
master-bin.000001 # Query # # BEGIN
|
||||||
master-bin.000001 # Intvar # # INSERT_ID=3
|
master-bin.000001 # Table_map # # table_id: # (test.t2)
|
||||||
master-bin.000001 # Query # # use `test`; insert into t2 values (bug27417(2))
|
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||||
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||||
master-bin.000001 # Query # # COMMIT
|
master-bin.000001 # Query # # COMMIT
|
||||||
select count(*) from t1 /* must be 3 */;
|
select count(*) from t1 /* must be 3 */;
|
||||||
count(*)
|
count(*)
|
||||||
@ -761,8 +762,9 @@ count(*)
|
|||||||
show binlog events from <binlog_start>;
|
show binlog events from <binlog_start>;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
master-bin.000001 # Query # # BEGIN
|
master-bin.000001 # Query # # BEGIN
|
||||||
master-bin.000001 # Intvar # # INSERT_ID=4
|
master-bin.000001 # Table_map # # table_id: # (test.t2)
|
||||||
master-bin.000001 # Query # # use `test`; delete from t2 where a=bug27417(3)
|
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||||
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||||
master-bin.000001 # Query # # COMMIT
|
master-bin.000001 # Query # # COMMIT
|
||||||
select count(*) from t1 /* must be 5 */;
|
select count(*) from t1 /* must be 5 */;
|
||||||
count(*)
|
count(*)
|
||||||
@ -784,6 +786,10 @@ insert into t2 values (bug27417(1));
|
|||||||
ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
|
ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
|
||||||
show binlog events from <binlog_start>;
|
show binlog events from <binlog_start>;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
|
master-bin.000001 # Query # # BEGIN
|
||||||
|
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||||
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||||
|
master-bin.000001 # Query # # COMMIT
|
||||||
select count(*) from t1 /* must be 1 */;
|
select count(*) from t1 /* must be 1 */;
|
||||||
count(*)
|
count(*)
|
||||||
1
|
1
|
||||||
@ -795,6 +801,10 @@ insert into t2 select bug27417(1) union select bug27417(2);
|
|||||||
ERROR 23000: Duplicate entry '2' for key 'PRIMARY'
|
ERROR 23000: Duplicate entry '2' for key 'PRIMARY'
|
||||||
show binlog events from <binlog_start>;
|
show binlog events from <binlog_start>;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
|
master-bin.000001 # Query # # BEGIN
|
||||||
|
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||||
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||||
|
master-bin.000001 # Query # # COMMIT
|
||||||
select count(*) from t1 /* must be 2 */;
|
select count(*) from t1 /* must be 2 */;
|
||||||
count(*)
|
count(*)
|
||||||
2
|
2
|
||||||
@ -806,8 +816,11 @@ ERROR 23000: Duplicate entry '4' for key 'b'
|
|||||||
show binlog events from <binlog_start>;
|
show binlog events from <binlog_start>;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
master-bin.000001 # Query # # BEGIN
|
master-bin.000001 # Query # # BEGIN
|
||||||
master-bin.000001 # Intvar # # INSERT_ID=4
|
master-bin.000001 # Table_map # # table_id: # (test.t3)
|
||||||
master-bin.000001 # Query # # use `test`; update t3 set b=b+bug27417(1)
|
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||||
|
master-bin.000001 # Write_rows # # table_id: #
|
||||||
|
master-bin.000001 # Update_rows # # table_id: #
|
||||||
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||||
master-bin.000001 # Query # # COMMIT
|
master-bin.000001 # Query # # COMMIT
|
||||||
select count(*) from t1 /* must be 2 */;
|
select count(*) from t1 /* must be 2 */;
|
||||||
count(*)
|
count(*)
|
||||||
@ -821,6 +834,10 @@ UPDATE t4,t3 SET t4.a=t3.a + bug27417(1) /* top level non-ta table */;
|
|||||||
ERROR 23000: Duplicate entry '2' for key 'PRIMARY'
|
ERROR 23000: Duplicate entry '2' for key 'PRIMARY'
|
||||||
show binlog events from <binlog_start>;
|
show binlog events from <binlog_start>;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
|
master-bin.000001 # Query # # BEGIN
|
||||||
|
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||||
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||||
|
master-bin.000001 # Query # # COMMIT
|
||||||
select count(*) from t1 /* must be 4 */;
|
select count(*) from t1 /* must be 4 */;
|
||||||
count(*)
|
count(*)
|
||||||
4
|
4
|
||||||
@ -834,7 +851,7 @@ UPDATE t3,t4 SET t3.a=t4.a + bug27417(1);
|
|||||||
ERROR 23000: Duplicate entry '2' for key 'PRIMARY'
|
ERROR 23000: Duplicate entry '2' for key 'PRIMARY'
|
||||||
select count(*) from t1 /* must be 1 */;
|
select count(*) from t1 /* must be 1 */;
|
||||||
count(*)
|
count(*)
|
||||||
1
|
2
|
||||||
drop table t4;
|
drop table t4;
|
||||||
delete from t1;
|
delete from t1;
|
||||||
delete from t2;
|
delete from t2;
|
||||||
@ -848,6 +865,11 @@ delete from t2;
|
|||||||
ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
|
ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
|
||||||
show binlog events from <binlog_start>;
|
show binlog events from <binlog_start>;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
|
master-bin.000001 # Query # # BEGIN
|
||||||
|
master-bin.000001 # Table_map # # table_id: # (test.t3)
|
||||||
|
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||||
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||||
|
master-bin.000001 # Query # # COMMIT
|
||||||
select count(*) from t1 /* must be 1 */;
|
select count(*) from t1 /* must be 1 */;
|
||||||
count(*)
|
count(*)
|
||||||
1
|
1
|
||||||
@ -864,6 +886,10 @@ delete t2.* from t2,t5 where t2.a=t5.a + 1;
|
|||||||
ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
|
ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
|
||||||
show binlog events from <binlog_start>;
|
show binlog events from <binlog_start>;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
|
master-bin.000001 # Query # # BEGIN
|
||||||
|
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||||
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||||
|
master-bin.000001 # Query # # COMMIT
|
||||||
select count(*) from t1 /* must be 1 */;
|
select count(*) from t1 /* must be 1 */;
|
||||||
count(*)
|
count(*)
|
||||||
1
|
1
|
||||||
@ -881,6 +907,10 @@ count(*)
|
|||||||
2
|
2
|
||||||
show binlog events from <binlog_start>;
|
show binlog events from <binlog_start>;
|
||||||
Log_name Pos Event_type Server_id End_log_pos Info
|
Log_name Pos Event_type Server_id End_log_pos Info
|
||||||
|
master-bin.000001 # Query # # BEGIN
|
||||||
|
master-bin.000001 # Table_map # # table_id: # (test.t1)
|
||||||
|
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
|
||||||
|
master-bin.000001 # Query # # COMMIT
|
||||||
drop trigger trg_del_t2;
|
drop trigger trg_del_t2;
|
||||||
drop table t1,t2,t3,t4,t5;
|
drop table t1,t2,t3,t4,t5;
|
||||||
drop function bug27417;
|
drop function bug27417;
|
||||||
|
@ -1053,7 +1053,7 @@ update_timing_fields_for_event(THD *thd,
|
|||||||
Turn off row binlogging of event timing updates. These are not used
|
Turn off row binlogging of event timing updates. These are not used
|
||||||
for RBR of events replicated to the slave.
|
for RBR of events replicated to the slave.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
DBUG_ASSERT(thd->security_ctx->master_access & SUPER_ACL);
|
DBUG_ASSERT(thd->security_ctx->master_access & SUPER_ACL);
|
||||||
@ -1097,7 +1097,8 @@ end:
|
|||||||
if (table)
|
if (table)
|
||||||
close_thread_tables(thd);
|
close_thread_tables(thd);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
DBUG_RETURN(test(ret));
|
DBUG_RETURN(test(ret));
|
||||||
}
|
}
|
||||||
|
@ -335,7 +335,7 @@ Events::create_event(THD *thd, Event_parse_data *parse_data,
|
|||||||
Turn off row binlogging of this statement and use statement-based
|
Turn off row binlogging of this statement and use statement-based
|
||||||
so that all supporting tables are updated for CREATE EVENT command.
|
so that all supporting tables are updated for CREATE EVENT command.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
mysql_mutex_lock(&LOCK_event_metadata);
|
mysql_mutex_lock(&LOCK_event_metadata);
|
||||||
@ -377,7 +377,8 @@ Events::create_event(THD *thd, Event_parse_data *parse_data,
|
|||||||
sql_print_error("Event Error: An error occurred while creating query string, "
|
sql_print_error("Event Error: An error occurred while creating query string, "
|
||||||
"before writing it into binary log.");
|
"before writing it into binary log.");
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
/* If the definer is not set or set to CURRENT_USER, the value of CURRENT_USER
|
/* If the definer is not set or set to CURRENT_USER, the value of CURRENT_USER
|
||||||
@ -387,7 +388,8 @@ Events::create_event(THD *thd, Event_parse_data *parse_data,
|
|||||||
}
|
}
|
||||||
mysql_mutex_unlock(&LOCK_event_metadata);
|
mysql_mutex_unlock(&LOCK_event_metadata);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
DBUG_RETURN(ret);
|
DBUG_RETURN(ret);
|
||||||
}
|
}
|
||||||
@ -471,7 +473,7 @@ Events::update_event(THD *thd, Event_parse_data *parse_data,
|
|||||||
Turn off row binlogging of this statement and use statement-based
|
Turn off row binlogging of this statement and use statement-based
|
||||||
so that all supporting tables are updated for UPDATE EVENT command.
|
so that all supporting tables are updated for UPDATE EVENT command.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
mysql_mutex_lock(&LOCK_event_metadata);
|
mysql_mutex_lock(&LOCK_event_metadata);
|
||||||
@ -509,7 +511,8 @@ Events::update_event(THD *thd, Event_parse_data *parse_data,
|
|||||||
}
|
}
|
||||||
mysql_mutex_unlock(&LOCK_event_metadata);
|
mysql_mutex_unlock(&LOCK_event_metadata);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
DBUG_RETURN(ret);
|
DBUG_RETURN(ret);
|
||||||
}
|
}
|
||||||
@ -570,7 +573,7 @@ Events::drop_event(THD *thd, LEX_STRING dbname, LEX_STRING name, bool if_exists)
|
|||||||
Turn off row binlogging of this statement and use statement-based so
|
Turn off row binlogging of this statement and use statement-based so
|
||||||
that all supporting tables are updated for DROP EVENT command.
|
that all supporting tables are updated for DROP EVENT command.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
mysql_mutex_lock(&LOCK_event_metadata);
|
mysql_mutex_lock(&LOCK_event_metadata);
|
||||||
@ -585,7 +588,8 @@ Events::drop_event(THD *thd, LEX_STRING dbname, LEX_STRING name, bool if_exists)
|
|||||||
}
|
}
|
||||||
mysql_mutex_unlock(&LOCK_event_metadata);
|
mysql_mutex_unlock(&LOCK_event_metadata);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(ret);
|
DBUG_RETURN(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
15
sql/sp.cc
15
sql/sp.cc
@ -927,7 +927,7 @@ sp_create_routine(THD *thd, int type, sp_head *sp)
|
|||||||
row-based replication. The flag will be reset at the end of the
|
row-based replication. The flag will be reset at the end of the
|
||||||
statement.
|
statement.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
saved_count_cuted_fields= thd->count_cuted_fields;
|
saved_count_cuted_fields= thd->count_cuted_fields;
|
||||||
@ -1136,7 +1136,8 @@ done:
|
|||||||
|
|
||||||
close_thread_tables(thd);
|
close_thread_tables(thd);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(ret);
|
DBUG_RETURN(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1174,7 +1175,7 @@ sp_drop_routine(THD *thd, int type, sp_name *name)
|
|||||||
row-based replication. The flag will be reset at the end of the
|
row-based replication. The flag will be reset at the end of the
|
||||||
statement.
|
statement.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
if (!(table= open_proc_table_for_update(thd)))
|
if (!(table= open_proc_table_for_update(thd)))
|
||||||
@ -1194,7 +1195,8 @@ sp_drop_routine(THD *thd, int type, sp_name *name)
|
|||||||
|
|
||||||
close_thread_tables(thd);
|
close_thread_tables(thd);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(ret);
|
DBUG_RETURN(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1233,7 +1235,7 @@ sp_update_routine(THD *thd, int type, sp_name *name, st_sp_chistics *chistics)
|
|||||||
row-based replication. The flag will be reset at the end of the
|
row-based replication. The flag will be reset at the end of the
|
||||||
statement.
|
statement.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
if (!(table= open_proc_table_for_update(thd)))
|
if (!(table= open_proc_table_for_update(thd)))
|
||||||
@ -1269,7 +1271,8 @@ sp_update_routine(THD *thd, int type, sp_name *name, st_sp_chistics *chistics)
|
|||||||
|
|
||||||
close_thread_tables(thd);
|
close_thread_tables(thd);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(ret);
|
DBUG_RETURN(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3119,7 +3119,7 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list,
|
|||||||
row-based replication. The flag will be reset at the end of the
|
row-based replication. The flag will be reset at the end of the
|
||||||
statement.
|
statement.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
#ifdef HAVE_REPLICATION
|
#ifdef HAVE_REPLICATION
|
||||||
@ -3137,7 +3137,8 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list,
|
|||||||
if (!(thd->spcont || rpl_filter->tables_ok(0, tables)))
|
if (!(thd->spcont || rpl_filter->tables_ok(0, tables)))
|
||||||
{
|
{
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3153,7 +3154,8 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list,
|
|||||||
{ // Should never happen
|
{ // Should never happen
|
||||||
close_thread_tables(thd); /* purecov: deadcode */
|
close_thread_tables(thd); /* purecov: deadcode */
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(TRUE); /* purecov: deadcode */
|
DBUG_RETURN(TRUE); /* purecov: deadcode */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3281,7 +3283,8 @@ int mysql_table_grant(THD *thd, TABLE_LIST *table_list,
|
|||||||
/* Tables are automatically closed */
|
/* Tables are automatically closed */
|
||||||
thd->lex->restore_backup_query_tables_list(&backup);
|
thd->lex->restore_backup_query_tables_list(&backup);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(result);
|
DBUG_RETURN(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3346,7 +3349,7 @@ bool mysql_routine_grant(THD *thd, TABLE_LIST *table_list, bool is_proc,
|
|||||||
row-based replication. The flag will be reset at the end of the
|
row-based replication. The flag will be reset at the end of the
|
||||||
statement.
|
statement.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
#ifdef HAVE_REPLICATION
|
#ifdef HAVE_REPLICATION
|
||||||
@ -3364,7 +3367,8 @@ bool mysql_routine_grant(THD *thd, TABLE_LIST *table_list, bool is_proc,
|
|||||||
if (!(thd->spcont || rpl_filter->tables_ok(0, tables)))
|
if (!(thd->spcont || rpl_filter->tables_ok(0, tables)))
|
||||||
{
|
{
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3374,7 +3378,8 @@ bool mysql_routine_grant(THD *thd, TABLE_LIST *table_list, bool is_proc,
|
|||||||
{ // Should never happen
|
{ // Should never happen
|
||||||
close_thread_tables(thd);
|
close_thread_tables(thd);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3452,7 +3457,8 @@ bool mysql_routine_grant(THD *thd, TABLE_LIST *table_list, bool is_proc,
|
|||||||
|
|
||||||
mysql_rwlock_unlock(&LOCK_grant);
|
mysql_rwlock_unlock(&LOCK_grant);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
/* Tables are automatically closed */
|
/* Tables are automatically closed */
|
||||||
DBUG_RETURN(result);
|
DBUG_RETURN(result);
|
||||||
@ -3496,7 +3502,7 @@ bool mysql_grant(THD *thd, const char *db, List <LEX_USER> &list,
|
|||||||
row-based replication. The flag will be reset at the end of the
|
row-based replication. The flag will be reset at the end of the
|
||||||
statement.
|
statement.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
#ifdef HAVE_REPLICATION
|
#ifdef HAVE_REPLICATION
|
||||||
@ -3514,7 +3520,8 @@ bool mysql_grant(THD *thd, const char *db, List <LEX_USER> &list,
|
|||||||
if (!(thd->spcont || rpl_filter->tables_ok(0, tables)))
|
if (!(thd->spcont || rpl_filter->tables_ok(0, tables)))
|
||||||
{
|
{
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(FALSE);
|
DBUG_RETURN(FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3524,7 +3531,8 @@ bool mysql_grant(THD *thd, const char *db, List <LEX_USER> &list,
|
|||||||
{ // This should never happen
|
{ // This should never happen
|
||||||
close_thread_tables(thd); /* purecov: deadcode */
|
close_thread_tables(thd); /* purecov: deadcode */
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(TRUE); /* purecov: deadcode */
|
DBUG_RETURN(TRUE); /* purecov: deadcode */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3585,7 +3593,8 @@ bool mysql_grant(THD *thd, const char *db, List <LEX_USER> &list,
|
|||||||
if (!result)
|
if (!result)
|
||||||
my_ok(thd);
|
my_ok(thd);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
DBUG_RETURN(result);
|
DBUG_RETURN(result);
|
||||||
}
|
}
|
||||||
@ -5797,14 +5806,15 @@ bool mysql_create_user(THD *thd, List <LEX_USER> &list)
|
|||||||
row-based replication. The flag will be reset at the end of the
|
row-based replication. The flag will be reset at the end of the
|
||||||
statement.
|
statement.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
/* CREATE USER may be skipped on replication client. */
|
/* CREATE USER may be skipped on replication client. */
|
||||||
if ((result= open_grant_tables(thd, tables)))
|
if ((result= open_grant_tables(thd, tables)))
|
||||||
{
|
{
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(result != 1);
|
DBUG_RETURN(result != 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5850,7 +5860,8 @@ bool mysql_create_user(THD *thd, List <LEX_USER> &list)
|
|||||||
mysql_rwlock_unlock(&LOCK_grant);
|
mysql_rwlock_unlock(&LOCK_grant);
|
||||||
close_thread_tables(thd);
|
close_thread_tables(thd);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(result);
|
DBUG_RETURN(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5885,14 +5896,15 @@ bool mysql_drop_user(THD *thd, List <LEX_USER> &list)
|
|||||||
row-based replication. The flag will be reset at the end of the
|
row-based replication. The flag will be reset at the end of the
|
||||||
statement.
|
statement.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
/* DROP USER may be skipped on replication client. */
|
/* DROP USER may be skipped on replication client. */
|
||||||
if ((result= open_grant_tables(thd, tables)))
|
if ((result= open_grant_tables(thd, tables)))
|
||||||
{
|
{
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(result != 1);
|
DBUG_RETURN(result != 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5932,7 +5944,8 @@ bool mysql_drop_user(THD *thd, List <LEX_USER> &list)
|
|||||||
close_thread_tables(thd);
|
close_thread_tables(thd);
|
||||||
thd->variables.sql_mode= old_sql_mode;
|
thd->variables.sql_mode= old_sql_mode;
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(result);
|
DBUG_RETURN(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5967,14 +5980,15 @@ bool mysql_rename_user(THD *thd, List <LEX_USER> &list)
|
|||||||
row-based replication. The flag will be reset at the end of the
|
row-based replication. The flag will be reset at the end of the
|
||||||
statement.
|
statement.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
/* RENAME USER may be skipped on replication client. */
|
/* RENAME USER may be skipped on replication client. */
|
||||||
if ((result= open_grant_tables(thd, tables)))
|
if ((result= open_grant_tables(thd, tables)))
|
||||||
{
|
{
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(result != 1);
|
DBUG_RETURN(result != 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6024,7 +6038,8 @@ bool mysql_rename_user(THD *thd, List <LEX_USER> &list)
|
|||||||
mysql_rwlock_unlock(&LOCK_grant);
|
mysql_rwlock_unlock(&LOCK_grant);
|
||||||
close_thread_tables(thd);
|
close_thread_tables(thd);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(result);
|
DBUG_RETURN(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6057,13 +6072,14 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
|
|||||||
row-based replication. The flag will be reset at the end of the
|
row-based replication. The flag will be reset at the end of the
|
||||||
statement.
|
statement.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
if ((result= open_grant_tables(thd, tables)))
|
if ((result= open_grant_tables(thd, tables)))
|
||||||
{
|
{
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(result != 1);
|
DBUG_RETURN(result != 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6219,7 +6235,8 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
|
|||||||
if (result && !binlog_error)
|
if (result && !binlog_error)
|
||||||
my_message(ER_REVOKE_GRANTS, ER(ER_REVOKE_GRANTS), MYF(0));
|
my_message(ER_REVOKE_GRANTS, ER(ER_REVOKE_GRANTS), MYF(0));
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
DBUG_RETURN(result || binlog_error);
|
DBUG_RETURN(result || binlog_error);
|
||||||
}
|
}
|
||||||
@ -6328,7 +6345,7 @@ bool sp_revoke_privileges(THD *thd, const char *sp_db, const char *sp_name,
|
|||||||
row-based replication. The flag will be reset at the end of the
|
row-based replication. The flag will be reset at the end of the
|
||||||
statement.
|
statement.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
/* Remove procedure access */
|
/* Remove procedure access */
|
||||||
@ -6366,7 +6383,8 @@ bool sp_revoke_privileges(THD *thd, const char *sp_db, const char *sp_name,
|
|||||||
|
|
||||||
thd->pop_internal_handler();
|
thd->pop_internal_handler();
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
DBUG_RETURN(error_handler.has_errors());
|
DBUG_RETURN(error_handler.has_errors());
|
||||||
}
|
}
|
||||||
|
@ -1723,7 +1723,6 @@ public:
|
|||||||
|
|
||||||
bool slave_thread, one_shot_set;
|
bool slave_thread, one_shot_set;
|
||||||
/* tells if current statement should binlog row-based(1) or stmt-based(0) */
|
/* tells if current statement should binlog row-based(1) or stmt-based(0) */
|
||||||
bool current_stmt_binlog_row_based;
|
|
||||||
bool locked, some_tables_deleted;
|
bool locked, some_tables_deleted;
|
||||||
bool last_cuted_field;
|
bool last_cuted_field;
|
||||||
bool no_errors, password;
|
bool no_errors, password;
|
||||||
|
@ -461,7 +461,7 @@ int mysql_create_function(THD *thd,udf_func *udf)
|
|||||||
Turn off row binlogging of this statement and use statement-based
|
Turn off row binlogging of this statement and use statement-based
|
||||||
so that all supporting tables are updated for CREATE FUNCTION command.
|
so that all supporting tables are updated for CREATE FUNCTION command.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
mysql_rwlock_wrlock(&THR_LOCK_udf);
|
mysql_rwlock_wrlock(&THR_LOCK_udf);
|
||||||
@ -533,11 +533,13 @@ int mysql_create_function(THD *thd,udf_func *udf)
|
|||||||
if (write_bin_log(thd, TRUE, thd->query(), thd->query_length()))
|
if (write_bin_log(thd, TRUE, thd->query(), thd->query_length()))
|
||||||
{
|
{
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
@ -545,7 +547,8 @@ int mysql_create_function(THD *thd,udf_func *udf)
|
|||||||
dlclose(dl);
|
dlclose(dl);
|
||||||
mysql_rwlock_unlock(&THR_LOCK_udf);
|
mysql_rwlock_unlock(&THR_LOCK_udf);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -573,7 +576,7 @@ int mysql_drop_function(THD *thd,const LEX_STRING *udf_name)
|
|||||||
Turn off row binlogging of this statement and use statement-based
|
Turn off row binlogging of this statement and use statement-based
|
||||||
so that all supporting tables are updated for DROP FUNCTION command.
|
so that all supporting tables are updated for DROP FUNCTION command.
|
||||||
*/
|
*/
|
||||||
save_binlog_row_based= thd->is_current_stmt_binlog_format_row();
|
if ((save_binlog_row_based= thd->is_current_stmt_binlog_format_row()))
|
||||||
thd->clear_current_stmt_binlog_format_row();
|
thd->clear_current_stmt_binlog_format_row();
|
||||||
|
|
||||||
mysql_rwlock_wrlock(&THR_LOCK_udf);
|
mysql_rwlock_wrlock(&THR_LOCK_udf);
|
||||||
@ -617,16 +620,19 @@ int mysql_drop_function(THD *thd,const LEX_STRING *udf_name)
|
|||||||
if (write_bin_log(thd, TRUE, thd->query(), thd->query_length()))
|
if (write_bin_log(thd, TRUE, thd->query(), thd->query_length()))
|
||||||
{
|
{
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
err:
|
err:
|
||||||
mysql_rwlock_unlock(&THR_LOCK_udf);
|
mysql_rwlock_unlock(&THR_LOCK_udf);
|
||||||
/* Restore the state of binlog format */
|
/* Restore the state of binlog format */
|
||||||
thd->current_stmt_binlog_row_based= save_binlog_row_based;
|
if (save_binlog_row_based)
|
||||||
|
thd->set_current_stmt_binlog_format_row();
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user