Commit 73e03852 authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.2 into 10.3

parents 874f8f30 409e210e
...@@ -572,3 +572,15 @@ LOCK TABLES t2 WRITE; ...@@ -572,3 +572,15 @@ LOCK TABLES t2 WRITE;
TRUNCATE TABLE t1; TRUNCATE TABLE t1;
UNLOCK TABLES; UNLOCK TABLES;
DROP TABLE t1, t2; DROP TABLE t1, t2;
#
# MDEV-19449 1030: Got error 168 "Unknown (generic) error from engine"
# for valid TRUNCATE (temporary) TABLE
#
CREATE TEMPORARY TABLE t1 (col1 BIGINT) ENGINE = InnoDB;
INSERT INTO t1 (no_such_col) SELECT * FROM t1;
ERROR 42S22: Unknown column 'no_such_col' in 'field list'
TRUNCATE TABLE t1;
ALTER TABLE t1 CHANGE no_such_col1 col1 BIGINT NULL;
ERROR 42S22: Unknown column 'no_such_col1' in 't1'
TRUNCATE TABLE t1;
DROP TEMPORARY TABLE t1;
...@@ -623,3 +623,19 @@ TRUNCATE TABLE t1; ...@@ -623,3 +623,19 @@ TRUNCATE TABLE t1;
UNLOCK TABLES; UNLOCK TABLES;
DROP TABLE t1, t2; DROP TABLE t1, t2;
--echo #
--echo # MDEV-19449 1030: Got error 168 "Unknown (generic) error from engine"
--echo # for valid TRUNCATE (temporary) TABLE
--echo #
CREATE TEMPORARY TABLE t1 (col1 BIGINT) ENGINE = InnoDB;
--error ER_BAD_FIELD_ERROR
INSERT INTO t1 (no_such_col) SELECT * FROM t1;
TRUNCATE TABLE t1;
--error ER_BAD_FIELD_ERROR
ALTER TABLE t1 CHANGE no_such_col1 col1 BIGINT NULL;
# This would wrongly try to re-truncate the old copy of the table that
# was not dropped during the first TRUNCATE due to extra table handles.
TRUNCATE TABLE t1;
DROP TEMPORARY TABLE t1;
...@@ -15,7 +15,6 @@ rpl_get_master_version_and_clock : Bug#11766137 Jan 05 2011 joro Valgrind warnin ...@@ -15,7 +15,6 @@ rpl_get_master_version_and_clock : Bug#11766137 Jan 05 2011 joro Valgrind warnin
rpl_partition_archive : MDEV-5077 2013-09-27 svoj Cannot exchange partition with archive table rpl_partition_archive : MDEV-5077 2013-09-27 svoj Cannot exchange partition with archive table
rpl_row_binlog_max_cache_size : MDEV-11092 rpl_row_binlog_max_cache_size : MDEV-11092
rpl_blackhole : MDEV-11094 rpl_blackhole : MDEV-11094
rpl_row_mysqlbinlog : MDEV-11095
rpl_row_index_choice : MDEV-11666 rpl_row_index_choice : MDEV-11666
rpl_parallel2 : fails after MDEV-16172 rpl_parallel2 : fails after MDEV-16172
rpl_semi_sync_after_sync : fails after MDEV-16172 rpl_semi_sync_after_sync : fails after MDEV-16172
include/master-slave.inc
[connection master]
CREATE TABLE t1 (id mediumint(8) unsigned NOT NULL AUTO_INCREMENT, someLabel varchar(30) NOT NULL, flag tinyint(1) NOT NULL DEFAULT 0, PRIMARY KEY (id)) Engine=MyISAM;
CREATE TABLE t2 (id mediumint(8) unsigned NOT NULL AUTO_INCREMENT, data varchar(30) NOT NULL, status tinyint(1) NOT NULL, PRIMARY KEY (id)) Engine=MyISAM;
CREATE TABLE t3 (id mediumint(8) unsigned NOT NULL AUTO_INCREMENT, t1id mediumint(8) unsigned NOT NULL, flag tinyint(1) NOT NULL DEFAULT 0, status tinyint(1) NOT NULL DEFAULT 0, PRIMARY KEY (id)) Engine=MyISAM;
INSERT INTO t1 ( id, someLabel, flag ) VALUES ( 1, 'ABC', 0 );
CREATE OR REPLACE TRIGGER doNothing
BEFORE UPDATE ON t1
FOR EACH ROW
BEGIN
IF
new.someLabel != old.someLabel
THEN
UPDATE t3 SET t3.flag = 0;
END IF;
END|
FLUSH LOGS;
LOCK TABLES t1 WRITE, t2 WRITE;
INSERT INTO t2 (data, status) VALUES ('1', 4);
UPDATE t1 SET flag = 1 WHERE id = 1;
INSERT INTO t2 (data, status) VALUES ('2', 4);
UNLOCK TABLES;
connection slave;
include/diff_tables.inc [master:t1, slave:t1]
include/diff_tables.inc [master:t2, slave:t2]
include/diff_tables.inc [master:t3, slave:t3]
connection master;
DROP TABLE t1, t2, t3;
include/rpl_end.inc
...@@ -169,7 +169,7 @@ use `test`/*!*/; ...@@ -169,7 +169,7 @@ use `test`/*!*/;
SET TIMESTAMP=1000000000/*!*/; SET TIMESTAMP=1000000000/*!*/;
SET @@session.pseudo_thread_id=999999999/*!*/; SET @@session.pseudo_thread_id=999999999/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1, @@session.check_constraint_checks=1/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1, @@session.check_constraint_checks=1/*!*/;
SET @@session.sql_mode=1342177280/*!*/; SET @@session.sql_mode=1411383296/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C latin1 *//*!*/; /*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/; SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
...@@ -192,7 +192,7 @@ use `test`/*!*/; ...@@ -192,7 +192,7 @@ use `test`/*!*/;
SET TIMESTAMP=1000000000/*!*/; SET TIMESTAMP=1000000000/*!*/;
SET @@session.pseudo_thread_id=999999999/*!*/; SET @@session.pseudo_thread_id=999999999/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1, @@session.check_constraint_checks=1/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1, @@session.check_constraint_checks=1/*!*/;
SET @@session.sql_mode=1342177280/*!*/; SET @@session.sql_mode=1411383296/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C latin1 *//*!*/; /*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/; SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
...@@ -307,7 +307,7 @@ use `test`/*!*/; ...@@ -307,7 +307,7 @@ use `test`/*!*/;
SET TIMESTAMP=1000000000/*!*/; SET TIMESTAMP=1000000000/*!*/;
SET @@session.pseudo_thread_id=999999999/*!*/; SET @@session.pseudo_thread_id=999999999/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1, @@session.check_constraint_checks=1/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1, @@session.check_constraint_checks=1/*!*/;
SET @@session.sql_mode=1342177280/*!*/; SET @@session.sql_mode=1411383296/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C latin1 *//*!*/; /*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/; SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
...@@ -336,7 +336,7 @@ use `test`/*!*/; ...@@ -336,7 +336,7 @@ use `test`/*!*/;
SET TIMESTAMP=1000000000/*!*/; SET TIMESTAMP=1000000000/*!*/;
SET @@session.pseudo_thread_id=999999999/*!*/; SET @@session.pseudo_thread_id=999999999/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1, @@session.check_constraint_checks=1/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1, @@session.check_constraint_checks=1/*!*/;
SET @@session.sql_mode=1342177280/*!*/; SET @@session.sql_mode=1411383296/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C latin1 *//*!*/; /*!\C latin1 *//*!*/;
SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/; SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
......
# ==== Purpose ====
#
# Test verifies that there are no duplicate entries in binlog (i.e a safe
# statement which follows an unsafe statement gets logged in both row format
# and statement format resulting in duplicate entry) when binlog-format=MIXED
# and LOCK TABLES are enabled.
#
# ==== Implementation ====
#
# Steps:
# 1 - Create three tables t1,t2 and t3 with AUTO_INCREMENT on.
# 2 - Create a trigger on table t3, so that trigger execution results in
# unsafe statement. Note query that modifies autoinc column in
# sub-statement can make the master and slave inconsistent. Hence they
# are logged in row format.
# 3 - Lock tables t1,t2 and t3.
# 4 - Execute an unsafe update which modifies tables t1 and t3. But since t2
# table is also locked its table map event also gets written into the
# binary log during the execution of update.
# 5 - Execute a safe DML operation using table 't2' and verify that master
# doesn't report any assert.
# 6 - Ensure that slave is in sync with master and data is consistent.
#
# ==== References ====
#
# MDEV-19158: MariaDB 10.2.22 is writing duplicate entries into binary log
--source include/have_binlog_format_mixed.inc
--source include/master-slave.inc
CREATE TABLE t1 (id mediumint(8) unsigned NOT NULL AUTO_INCREMENT, someLabel varchar(30) NOT NULL, flag tinyint(1) NOT NULL DEFAULT 0, PRIMARY KEY (id)) Engine=MyISAM;
CREATE TABLE t2 (id mediumint(8) unsigned NOT NULL AUTO_INCREMENT, data varchar(30) NOT NULL, status tinyint(1) NOT NULL, PRIMARY KEY (id)) Engine=MyISAM;
CREATE TABLE t3 (id mediumint(8) unsigned NOT NULL AUTO_INCREMENT, t1id mediumint(8) unsigned NOT NULL, flag tinyint(1) NOT NULL DEFAULT 0, status tinyint(1) NOT NULL DEFAULT 0, PRIMARY KEY (id)) Engine=MyISAM;
INSERT INTO t1 ( id, someLabel, flag ) VALUES ( 1, 'ABC', 0 );
DELIMITER |;
CREATE OR REPLACE TRIGGER doNothing
BEFORE UPDATE ON t1
FOR EACH ROW
BEGIN
IF
new.someLabel != old.someLabel
THEN
UPDATE t3 SET t3.flag = 0;
END IF;
END|
DELIMITER ;|
FLUSH LOGS;
LOCK TABLES t1 WRITE, t2 WRITE;
INSERT INTO t2 (data, status) VALUES ('1', 4);
UPDATE t1 SET flag = 1 WHERE id = 1;
INSERT INTO t2 (data, status) VALUES ('2', 4);
UNLOCK TABLES;
sync_slave_with_master;
let $diff_tables= master:t1, slave:t1;
--source include/diff_tables.inc
let $diff_tables= master:t2, slave:t2;
--source include/diff_tables.inc
let $diff_tables= master:t3, slave:t3;
--source include/diff_tables.inc
--connection master
DROP TABLE t1, t2, t3;
--source include/rpl_end.inc
...@@ -151,8 +151,7 @@ remove_file $MYSQLTEST_VARDIR/tmp/master.sql; ...@@ -151,8 +151,7 @@ remove_file $MYSQLTEST_VARDIR/tmp/master.sql;
--exec $MYSQL_BINLOG --short-form --local-load=$MYSQLTEST_VARDIR/tmp/ --stop-position=$stop_position --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 --exec $MYSQL_BINLOG --short-form --local-load=$MYSQLTEST_VARDIR/tmp/ --stop-position=$stop_position --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001
--echo --- Test 4 Second Remote test -- --echo --- Test 4 Second Remote test --
--exec $MYSQL_BINLOG --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 > $MYSQLTEST_VARDIR/tmp/remote.sql --exec $MYSQL_BINLOG --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT --to-last-log master-bin.000001 > $MYSQLTEST_VARDIR/tmp/remote.sql
--exec $MYSQL_BINLOG --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000002 >> $MYSQLTEST_VARDIR/tmp/remote.sql
# Now that we have our file, lets get rid of the current database. # Now that we have our file, lets get rid of the current database.
# Cleanup the master and the slave and try to recreate. # Cleanup the master and the slave and try to recreate.
......
...@@ -6394,8 +6394,8 @@ int handler::ha_reset() ...@@ -6394,8 +6394,8 @@ int handler::ha_reset()
table->default_column_bitmaps(); table->default_column_bitmaps();
pushed_cond= NULL; pushed_cond= NULL;
tracker= NULL; tracker= NULL;
mark_trx_read_write_done= check_table_binlog_row_based_done= mark_trx_read_write_done= 0;
check_table_binlog_row_based_result= 0; clear_cached_table_binlog_row_based_flag();
/* Reset information about pushed engine conditions */ /* Reset information about pushed engine conditions */
cancel_pushed_idx_cond(); cancel_pushed_idx_cond();
/* Reset information about pushed index conditions */ /* Reset information about pushed index conditions */
......
...@@ -4372,6 +4372,12 @@ class handler :public Sql_alloc ...@@ -4372,6 +4372,12 @@ class handler :public Sql_alloc
public: public:
bool check_table_binlog_row_based(bool binlog_row); bool check_table_binlog_row_based(bool binlog_row);
inline void clear_cached_table_binlog_row_based_flag()
{
check_table_binlog_row_based_done= 0;
check_table_binlog_row_based_result= 0;
}
private:
/* Cache result to avoid extra calls */ /* Cache result to avoid extra calls */
inline void mark_trx_read_write() inline void mark_trx_read_write()
{ {
......
...@@ -586,6 +586,12 @@ bool close_cached_connection_tables(THD *thd, LEX_CSTRING *connection) ...@@ -586,6 +586,12 @@ bool close_cached_connection_tables(THD *thd, LEX_CSTRING *connection)
Marks all tables in the list which were used by current substatement Marks all tables in the list which were used by current substatement
(they are marked by its query_id) as free for reuse. (they are marked by its query_id) as free for reuse.
Clear 'check_table_binlog_row_based_done' flag. For tables which were used
by current substatement the flag is cleared as part of 'ha_reset()' call.
For the rest of the open tables not used by current substament if this
flag is enabled as part of current substatement execution, clear the flag
explicitly.
NOTE NOTE
The reason we reset query_id is that it's not enough to just test The reason we reset query_id is that it's not enough to just test
if table->query_id != thd->query_id to know if a table is in use. if table->query_id != thd->query_id to know if a table is in use.
...@@ -607,6 +613,8 @@ static void mark_used_tables_as_free_for_reuse(THD *thd, TABLE *table) ...@@ -607,6 +613,8 @@ static void mark_used_tables_as_free_for_reuse(THD *thd, TABLE *table)
table->query_id= 0; table->query_id= 0;
table->file->ha_reset(); table->file->ha_reset();
} }
else if (table->file->check_table_binlog_row_based_done)
table->file->clear_cached_table_binlog_row_based_flag();
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment