Commit 22d2df8c authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.3 into 10.4

parents 77c184df 1766a18e
......@@ -42,6 +42,14 @@ GCCVERSION=$(gcc -dumpfullversion -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g
# Debian policy and targeting Debian Sid. Then case-by-case run in autobake-deb.sh
# tests for backwards compatibility and strip away parts on older builders.
CODENAME="$(lsb_release -sc)"
case "${CODENAME}" in
stretch)
# MDEV-28022 libzstd-dev-1.1.3 minimum version
sed -i -e '/libzstd-dev/d' debian/control
;;
esac
# If libcrack2 (>= 2.9.0) is not available (before Debian Jessie and Ubuntu Trusty)
# clean away the cracklib stanzas so the package can build without them.
if ! apt-cache madison libcrack2-dev | grep 'libcrack2-dev *| *2\.9' >/dev/null 2>&1
......@@ -72,13 +80,6 @@ then
sed '/mariadb-service-convert/d' -i debian/mariadb-server-10.4.install
fi
# If libzstd-dev is not available (before Debian Stretch and Ubuntu Xenial)
# remove the dependency from server and rocksdb so it can build properly
if ! apt-cache madison libzstd-dev | grep 'libzstd-dev' >/dev/null 2>&1
then
sed '/libzstd-dev/d' -i debian/control
fi
# The binaries should be fully hardened by default. However TokuDB compilation seems to fail on
# Debian Jessie and older and on Ubuntu Xenial and older with the following error message:
# /usr/bin/ld.bfd.real: /tmp/ccOIwjFo.ltrans0.ltrans.o: relocation R_X86_64_PC32 against symbol
......@@ -139,7 +140,6 @@ source ./VERSION
UPSTREAM="${MYSQL_VERSION_MAJOR}.${MYSQL_VERSION_MINOR}.${MYSQL_VERSION_PATCH}${MYSQL_VERSION_EXTRA}"
PATCHLEVEL="+maria"
LOGSTRING="MariaDB build"
CODENAME="$(lsb_release -sc)"
EPOCH="1:"
dch -b -D ${CODENAME} -v "${EPOCH}${UPSTREAM}${PATCHLEVEL}~${CODENAME}" "Automatic build with ${LOGSTRING}."
......
......@@ -104,6 +104,17 @@ Note 1592 Unsafe statement written to the binary log using statement format sinc
SHOW WARNINGS;
Level Code Message
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTO_INCREMENT column. Inserted values cannot be logged correctly
CREATE TABLE t3 (a INT(11) DEFAULT NULL);
INSERT INTO t3 VALUES (1);
CREATE TABLE t4 (a INT(11) DEFAULT NULL, b BIGINT(20) DEFAULT uuid_short()) SELECT * FROM t3;
Warnings:
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave
SHOW WARNINGS;
Level Code Message
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave
CREATE OR REPLACE TABLE t4 (a INT(11) DEFAULT NULL) SELECT * FROM t3;
SHOW WARNINGS;
Level Code Message
DROP FUNCTION sf_bug50192;
DROP TRIGGER tr_bug50192;
DROP TABLE t1, t2;
DROP TABLE t1, t2, t3, t4;
call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
select @@innodb_autoinc_lock_mode;
@@innodb_autoinc_lock_mode
2
select @@binlog_format;
@@binlog_format
MIXED
create table t1 (a int not null auto_increment,b int, primary key (a)) engine=InnoDB;
insert into t1 values (NULL,1);
include/show_binlog_events.inc
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
master-bin.000001 # Query # # use `mtr`; INSERT INTO test_suppressions (pattern) VALUES ( NAME_CONST('pattern',_latin1'Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT' COLLATE 'latin1_swedish_ci'))
master-bin.000001 # Query # # COMMIT
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; create table t1 (a int not null auto_increment,b int, primary key (a)) engine=InnoDB
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
master-bin.000001 # Annotate_rows # # insert into t1 values (NULL,1)
master-bin.000001 # Table_map # # table_id: # (test.t1)
master-bin.000001 # Write_rows_v1 # # table_id: # flags: STMT_END_F
master-bin.000001 # Xid # # COMMIT /* XID */
set global binlog_format=STATEMENT;
connect con1,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK;
insert into t1 values (NULL,1);
Warnings:
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system variable that may have a different value on the slave
insert into t1 values (NULL,1);
Warnings:
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system variable that may have a different value on the slave
disconnect con1;
connection default;
set global binlog_format=MIXED;
DROP TABLE t1;
......@@ -189,8 +189,20 @@ SHOW WARNINGS;
SELECT sf_bug50192();
SHOW WARNINGS;
# The test proves MDEV-24617 fixes leave in force
# unsafe warnings in non-deterministic CREATE..SELECT cases.
# Below an inserted default value to `b` of the target table is replication
# unsafe. A warning must be out.
CREATE TABLE t3 (a INT(11) DEFAULT NULL);
INSERT INTO t3 VALUES (1);
CREATE TABLE t4 (a INT(11) DEFAULT NULL, b BIGINT(20) DEFAULT uuid_short()) SELECT * FROM t3;
SHOW WARNINGS;
# no warning out of a deterministic "rhs" of SELECT
CREATE OR REPLACE TABLE t4 (a INT(11) DEFAULT NULL) SELECT * FROM t3;
SHOW WARNINGS;
# cleanup
DROP FUNCTION sf_bug50192;
DROP TRIGGER tr_bug50192;
DROP TABLE t1, t2;
DROP TABLE t1, t2, t3, t4;
--source include/have_innodb.inc
--source include/have_binlog_format_mixed.inc
call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
select @@innodb_autoinc_lock_mode;
select @@binlog_format;
create table t1 (a int not null auto_increment,b int, primary key (a)) engine=InnoDB;
insert into t1 values (NULL,1);
--source include/show_binlog_events.inc
set global binlog_format=STATEMENT;
--connect (con1,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK)
insert into t1 values (NULL,1);
insert into t1 values (NULL,1);
--disconnect con1
--connection default
set global binlog_format=MIXED;
DROP TABLE t1;
......@@ -12,6 +12,21 @@ select next value for s1, minimum_value from s1 where maximum_value> 4;
next value for s1 minimum_value
4 1
alter sequence s1 maxvalue 1000;
optimize table s1;
Table Op Msg_type Msg_text
test.s1 optimize note The storage engine for the table doesn't support optimize
analyze table s1;
Table Op Msg_type Msg_text
test.s1 analyze status Engine-independent statistics collected
test.s1 analyze note The storage engine for the table doesn't support analyze
repair table s1;
Table Op Msg_type Msg_text
test.s1 repair status OK
check table s1;
Table Op Msg_type Msg_text
test.s1 check note The storage engine for the table doesn't support check
rename table s1 to tmp_s;
rename table tmp_s to s1;
drop sequence s1;
include/show_binlog_events.inc
Log_name Pos Event_type Server_id End_log_pos Info
......@@ -30,4 +45,14 @@ master-bin.000001 # Query # # COMMIT
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; alter sequence s1 maxvalue 1000
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; optimize table s1
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; analyze table s1
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; repair table s1
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; rename table s1 to tmp_s
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; rename table tmp_s to s1
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; DROP SEQUENCE `s1` /* generated by server */
--source include/have_udf.inc
--source include/have_log_bin.inc
--source include/have_sequence.inc
--source include/have_binlog_format_mixed_or_row.inc
--source include/binlog_start_pos.inc
#
......@@ -21,6 +21,17 @@ select next value for s1, minimum_value from s1 where maximum_value> 4;
#
alter sequence s1 maxvalue 1000;
# MDEV-24617 OPTIMIZE on a sequence causes unexpected
# ER_BINLOG_UNSAFE_STATEMENT The test below verifies no unsafe
# warnings anymore for any relavant commands that like OPTIMIZE can
# not produce ROW format events therefore the unsafe warning either.
optimize table s1;
analyze table s1;
repair table s1;
check table s1;
rename table s1 to tmp_s;
rename table tmp_s to s1;
drop sequence s1;
--let $binlog_file = LAST
......
......@@ -4867,6 +4867,11 @@ class handler :public Sql_alloc
const uchar *pack_frm_data,
size_t pack_frm_len)
{ return HA_ERR_WRONG_COMMAND; }
/* @return true if it's necessary to switch current statement log format from
STATEMENT to ROW if binary log format is MIXED and autoincrement values
are changed in the statement */
virtual bool autoinc_lock_mode_stmt_unsafe() const
{ return false; }
virtual int drop_partitions(const char *path)
{ return HA_ERR_WRONG_COMMAND; }
virtual int rename_partitions(const char *path)
......
......@@ -5927,6 +5927,10 @@ int THD::decide_logging_format(TABLE_LIST *tables)
bool is_write= FALSE; // If any write tables
bool has_read_tables= FALSE; // If any read only tables
bool has_auto_increment_write_tables= FALSE; // Write with auto-increment
/* true if it's necessary to switch current statement log format from
STATEMENT to ROW if binary log format is MIXED and autoincrement values
are changed in the statement */
bool has_unsafe_stmt_autoinc_lock_mode= false;
/* If a write table that doesn't have auto increment part first */
bool has_write_table_auto_increment_not_first_in_pk= FALSE;
bool has_auto_increment_write_tables_not_first= FALSE;
......@@ -6048,6 +6052,8 @@ int THD::decide_logging_format(TABLE_LIST *tables)
has_auto_increment_write_tables_not_first= found_first_not_own_table;
if (share->next_number_keypart != 0)
has_write_table_auto_increment_not_first_in_pk= true;
has_unsafe_stmt_autoinc_lock_mode=
table->file->autoinc_lock_mode_stmt_unsafe();
}
}
......@@ -6058,7 +6064,8 @@ int THD::decide_logging_format(TABLE_LIST *tables)
table->file->ht)
multi_write_engine= TRUE;
if (share->non_determinstic_insert &&
!(sql_command_flags[lex->sql_command] & CF_SCHEMA_CHANGE))
(sql_command_flags[lex->sql_command] & CF_CAN_GENERATE_ROW_EVENTS
&& !(sql_command_flags[lex->sql_command] & CF_SCHEMA_CHANGE)))
has_write_tables_with_unsafe_statements= true;
trans= table->file->has_transactions();
......@@ -6115,6 +6122,9 @@ int THD::decide_logging_format(TABLE_LIST *tables)
if (has_write_tables_with_unsafe_statements)
lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_SYSTEM_FUNCTION);
if (has_unsafe_stmt_autoinc_lock_mode)
lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_AUTOINC_LOCK_MODE);
/*
A query that modifies autoinc column in sub-statement can make the
master and slave inconsistent.
......
......@@ -79,7 +79,14 @@ Query_tables_list::binlog_stmt_unsafe_errcode[BINLOG_STMT_UNSAFE_COUNT] =
ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC,
ER_BINLOG_UNSAFE_UPDATE_IGNORE,
ER_BINLOG_UNSAFE_INSERT_TWO_KEYS,
ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST
ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST,
/*
There is no need to add new error code as we plan to get rid of auto
increment lock mode variable, so we use existing error code below, add
the correspondent text to the existing error message during merging to
non-GA release.
*/
ER_BINLOG_UNSAFE_SYSTEM_VARIABLE
};
......
......@@ -1902,6 +1902,11 @@ class Query_tables_list
*/
BINLOG_STMT_UNSAFE_AUTOINC_NOT_FIRST,
/**
Autoincrement lock mode is incompatible with STATEMENT binlog format.
*/
BINLOG_STMT_UNSAFE_AUTOINC_LOCK_MODE,
/* The last element of this enumeration type. */
BINLOG_STMT_UNSAFE_COUNT
};
......
......@@ -9579,6 +9579,14 @@ ha_innobase::change_active_index(
DBUG_RETURN(0);
}
/* @return true if it's necessary to switch current statement log format from
STATEMENT to ROW if binary log format is MIXED and autoincrement values
are changed in the statement */
bool ha_innobase::autoinc_lock_mode_stmt_unsafe() const
{
return innobase_autoinc_lock_mode == AUTOINC_NO_LOCKING;
}
/***********************************************************************//**
Reads the next or previous row from a cursor, which must have previously been
positioned using index_read.
......
......@@ -456,6 +456,10 @@ class ha_innobase final: public handler
int general_fetch(uchar* buf, uint direction, uint match_mode);
int change_active_index(uint keynr);
/* @return true if it's necessary to switch current statement log
format from STATEMENT to ROW if binary log format is MIXED and
autoincrement values are changed in the statement */
bool autoinc_lock_mode_stmt_unsafe() const;
dict_index_t* innobase_get_index(uint keynr);
#ifdef WITH_WSREP
......
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