mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 02:51:44 +01:00
cd64b23fcf
It is not necessary to support INSERT DELAYED for a single value insert, while we do not support that for multi-values insert when binlog is enabled in SBR. The lock_type is upgrade to TL_WRITE from TL_WRITE_DELAYED for INSERT DELAYED for single value insert as multi-values insert did when binlog is enabled. Then it's safe. And binlog it as INSERT without DELAYED. mysql-test/extra/binlog_tests/binlog_insert_delayed.test: Added test case for bug#57666. mysql-test/suite/binlog/r/binlog_row_binlog.result: Updated for bug#57666 mysql-test/suite/binlog/r/binlog_statement_insert_delayed.result: Updated for bug#57666 mysql-test/suite/binlog/r/binlog_stm_binlog.result: Updated for bug#57666 mysql-test/suite/rpl/r/rpl_stm_insert_delayed.result: Updated for bug#57666 sql/sql_insert.cc: Updated code for the following things: 1. Upgrade the lock_type to TL_WRITE from TL_WRITE_DELAYED for INSERT DELAYED for single value insert as multi-values insert did when binlog is enabled. 2. Clear code to not binlog INSERT DELAYED STMT in SBR. 3. Get rid of privilege check for log_on.
70 lines
2.4 KiB
Text
70 lines
2.4 KiB
Text
# ==== Purpose ====
|
|
#
|
|
# Verify that INSERT DELAYED in mixed or row mode writes events to the
|
|
# binlog, and that AUTO_INCREMENT works correctly.
|
|
#
|
|
# ==== Method ====
|
|
#
|
|
# Insert both single and multiple rows into an autoincrement column,
|
|
# both with specified value and with NULL.
|
|
#
|
|
# With INSERT DELAYED, the rows do not show up in the table
|
|
# immediately, so we must do source include/wait_until_rows_count.inc
|
|
# between any two INSERT DELAYED statements. Moreover, if mixed or
|
|
# row-based logging is used, there is also a delay between when rows
|
|
# show up in the table and when they show up in the binlog. To ensure
|
|
# that the rows show up in the binlog, we call FLUSH TABLES, which
|
|
# waits until the delayed_insert thread has finished.
|
|
#
|
|
# We cannot read the binlog after executing INSERT DELAYED statements
|
|
# that insert multiple rows, because that is nondeterministic. More
|
|
# precisely, rows may be written in batches to the binlog, where each
|
|
# batch has one Table_map_log_event and one or more
|
|
# Write_rows_log_event. The number of rows included in each batch is
|
|
# nondeterministic.
|
|
#
|
|
# ==== Related bugs ====
|
|
#
|
|
# BUG#20627: INSERT DELAYED does not honour auto_increment_* variables
|
|
# Bug in this test: BUG#38068: binlog_stm_binlog fails sporadically in pushbuild
|
|
|
|
|
|
create table t1 (a int not null auto_increment, primary key (a)) engine=myisam;
|
|
|
|
let $table=t1;
|
|
let $count=0;
|
|
|
|
insert /* before delayed */ delayed /* after delayed */ into t1 values (207);
|
|
inc $count;
|
|
--source include/wait_until_rows_count.inc
|
|
|
|
insert /*! delayed */ into t1 values (null);
|
|
inc $count;
|
|
--source include/wait_until_rows_count.inc
|
|
|
|
insert delayed into t1 values (300);
|
|
inc $count;
|
|
--source include/wait_until_rows_count.inc
|
|
|
|
# It is not enough to wait until all rows have been inserted into the
|
|
# table. FLUSH TABLES ensures that they are in the binlog too. See
|
|
# comment above.
|
|
FLUSH TABLES;
|
|
source include/show_binlog_events.inc;
|
|
|
|
RESET MASTER;
|
|
insert /* before delayed */ delayed /* after delayed */ into t1 values (null),(null),(null),(null);
|
|
inc $count; inc $count; inc $count; inc $count;
|
|
--source include/wait_until_rows_count.inc
|
|
|
|
insert /*! delayed */ into t1 values (null),(null),(400),(null);
|
|
inc $count; inc $count; inc $count; inc $count;
|
|
--source include/wait_until_rows_count.inc
|
|
|
|
if (`SELECT @@SESSION.BINLOG_FORMAT = 'STATEMENT'`) {
|
|
FLUSH TABLES;
|
|
source include/show_binlog_events.inc;
|
|
}
|
|
|
|
select * from t1;
|
|
drop table t1;
|