MDEV-18466 Unsafe to log updates on tables referenced by foreign keys with triggers in statement format
ignore FK-prelocked tables when looking for write-prelocked tables with auto-increment to complain about "Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column"
This commit is contained in:
parent
d8084116b5
commit
deff3f7572
17
mysql-test/suite/binlog/r/binlog_innodb_stm.result
Normal file
17
mysql-test/suite/binlog/r/binlog_innodb_stm.result
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
create table categories(
|
||||||
|
cat_id int not null primary key,
|
||||||
|
cat_name varchar(255) not null,
|
||||||
|
cat_description text
|
||||||
|
) engine=innodb;
|
||||||
|
create table products(
|
||||||
|
prd_id int not null auto_increment primary key,
|
||||||
|
prd_name varchar(355) not null,
|
||||||
|
prd_price decimal,
|
||||||
|
cat_id int not null,
|
||||||
|
foreign key fk_cat(cat_id)
|
||||||
|
references categories(cat_id)
|
||||||
|
on update cascade
|
||||||
|
) engine=innodb;
|
||||||
|
insert into categories values (1, 'drinks', 'drinks');
|
||||||
|
update categories set cat_description=2 where cat_id=1;
|
||||||
|
drop table products, categories;
|
26
mysql-test/suite/binlog/t/binlog_innodb_stm.test
Normal file
26
mysql-test/suite/binlog/t/binlog_innodb_stm.test
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
source include/have_innodb.inc;
|
||||||
|
source include/have_binlog_format_statement.inc;
|
||||||
|
|
||||||
|
#
|
||||||
|
# MDEV-18466 Unsafe to log updates on tables referenced by foreign keys with triggers in statement format
|
||||||
|
#
|
||||||
|
|
||||||
|
create table categories(
|
||||||
|
cat_id int not null primary key,
|
||||||
|
cat_name varchar(255) not null,
|
||||||
|
cat_description text
|
||||||
|
) engine=innodb;
|
||||||
|
|
||||||
|
create table products(
|
||||||
|
prd_id int not null auto_increment primary key,
|
||||||
|
prd_name varchar(355) not null,
|
||||||
|
prd_price decimal,
|
||||||
|
cat_id int not null,
|
||||||
|
foreign key fk_cat(cat_id)
|
||||||
|
references categories(cat_id)
|
||||||
|
on update cascade
|
||||||
|
) engine=innodb;
|
||||||
|
|
||||||
|
insert into categories values (1, 'drinks', 'drinks');
|
||||||
|
update categories set cat_description=2 where cat_id=1;
|
||||||
|
drop table products, categories;
|
@ -5542,6 +5542,9 @@ int xid_cache_iterate(THD *thd, my_hash_walk_action action, void *arg)
|
|||||||
Call this function only when you have established the list of all tables
|
Call this function only when you have established the list of all tables
|
||||||
which you'll want to update (including stored functions, triggers, views
|
which you'll want to update (including stored functions, triggers, views
|
||||||
inside your statement).
|
inside your statement).
|
||||||
|
|
||||||
|
Ignore tables prelocked for foreign key cascading actions, as these
|
||||||
|
actions cannot generate new auto_increment values.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
@ -5551,6 +5554,7 @@ has_write_table_with_auto_increment(TABLE_LIST *tables)
|
|||||||
{
|
{
|
||||||
/* we must do preliminary checks as table->table may be NULL */
|
/* we must do preliminary checks as table->table may be NULL */
|
||||||
if (!table->placeholder() &&
|
if (!table->placeholder() &&
|
||||||
|
table->prelocking_placeholder != TABLE_LIST::FK &&
|
||||||
table->table->found_next_number_field &&
|
table->table->found_next_number_field &&
|
||||||
(table->lock_type >= TL_WRITE_ALLOW_WRITE))
|
(table->lock_type >= TL_WRITE_ALLOW_WRITE))
|
||||||
return 1;
|
return 1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user