From 5a7794d3a8b522f7b043d93f2c8a7bad8c726b5e Mon Sep 17 00:00:00 2001 From: sjaakola Date: Tue, 19 May 2020 11:12:26 +0300 Subject: [PATCH 001/188] MDEV-21910 Deadlock between BF abort and manual KILL command When high priority replication slave applier encounters lock conflict in innodb, it will force the conflicting lock holder transaction (victim) to rollback. This is a must in multi-master sychronous replication model to avoid cluster lock-up. This high priority victim abort (aka "brute force" (BF) abort), is started from innodb lock manager while holding the victim's transaction's (trx) mutex. Depending on the execution state of the victim transaction, it may happen that the BF abort will call for THD::awake() to wake up the victim transaction for the rollback. Now, if BF abort requires THD::awake() to be called, then the applier thread executed locking protocol of: victim trx mutex -> victim THD::LOCK_thd_data If, at the same time another DBMS super user issues KILL command to abort the same victim, it will execute locking protocol of: victim THD::LOCK_thd_data -> victim trx mutex. These two locking protocol acquire mutexes in opposite order, hence unresolvable mutex locking deadlock may occur. The fix in this commit adds THD::wsrep_aborter flag to synchronize who can kill the victim This flag is set both when BF is called for from innodb and by KILL command. Either path of victim killing will bail out if victim's wsrep_killed is already set to avoid mutex conflicts with the other aborter execution. THD::wsrep_aborter records the aborter THD's ID. This is needed to preserve the right to kill the victim from different locations for the same aborter thread. It is also good error logging, to see who is reponsible for the abort. A new test case was added in galera.galera_bf_kill_debug.test for scenario where wsrep applier thread and manual KILL command try to kill same idle victim --- include/mysql/service_wsrep.h | 5 + .../suite/galera/r/galera_bf_kill.result | 18 +-- .../galera/r/galera_bf_kill_debug.result | 54 +++++++ .../suite/galera/r/galera_bf_lock_wait.result | 2 + mysql-test/suite/galera/t/galera_bf_kill.test | 51 +------ .../suite/galera/t/galera_bf_kill_debug.cnf | 7 + .../suite/galera/t/galera_bf_kill_debug.test | 140 ++++++++++++++++++ .../suite/galera/t/galera_bf_lock_wait.test | 4 +- sql/service_wsrep.cc | 34 +++++ sql/sql_class.cc | 10 ++ sql/sql_class.h | 3 +- sql/sql_parse.cc | 22 ++- sql/sql_plugin_services.ic | 3 +- sql/wsrep_dummy.cc | 3 + storage/innobase/handler/ha_innodb.cc | 7 + 15 files changed, 290 insertions(+), 73 deletions(-) create mode 100644 mysql-test/suite/galera/r/galera_bf_kill_debug.result create mode 100644 mysql-test/suite/galera/t/galera_bf_kill_debug.cnf create mode 100644 mysql-test/suite/galera/t/galera_bf_kill_debug.test diff --git a/include/mysql/service_wsrep.h b/include/mysql/service_wsrep.h index 522eb56fc4e..0a06445de00 100644 --- a/include/mysql/service_wsrep.h +++ b/include/mysql/service_wsrep.h @@ -84,6 +84,7 @@ extern struct wsrep_service_st { my_bool (*wsrep_get_debug_func)(); void (*wsrep_commit_ordered_func)(MYSQL_THD thd); my_bool (*wsrep_thd_is_applying_func)(const MYSQL_THD thd); + bool (*wsrep_thd_set_wsrep_aborter_func)(MYSQL_THD bf_thd, MYSQL_THD thd); } *wsrep_service; #define MYSQL_SERVICE_WSREP_INCLUDED @@ -124,6 +125,7 @@ extern struct wsrep_service_st { #define wsrep_get_debug() wsrep_service->wsrep_get_debug_func() #define wsrep_commit_ordered(T) wsrep_service->wsrep_commit_ordered_func(T) #define wsrep_thd_is_applying(T) wsrep_service->wsrep_thd_is_applying_func(T) +#define wsrep_thd_set_wsrep_aborter(T) wsrep_service->wsrep_thd_set_wsrep_aborter_func(T1, T2) #else @@ -176,6 +178,8 @@ extern "C" my_bool wsrep_thd_is_local(const MYSQL_THD thd); /* Return true if thd is in high priority mode */ /* todo: rename to is_high_priority() */ extern "C" my_bool wsrep_thd_is_applying(const MYSQL_THD thd); +/* set wsrep_aborter for the target THD */ +extern "C" bool wsrep_thd_set_wsrep_aborter(MYSQL_THD bf_thd, MYSQL_THD victim_thd); /* Return true if thd is in TOI mode */ extern "C" my_bool wsrep_thd_is_toi(const MYSQL_THD thd); /* Return true if thd is in replicating TOI mode */ @@ -216,6 +220,7 @@ extern "C" my_bool wsrep_get_debug(); extern "C" void wsrep_commit_ordered(MYSQL_THD thd); extern "C" my_bool wsrep_thd_is_applying(const MYSQL_THD thd); +extern "C" bool wsrep_thd_set_wsrep_aborter(MYSQL_THD bf_thd, MYSQL_THD victim_thd); #endif #endif /* MYSQL_SERVICE_WSREP_INCLUDED */ diff --git a/mysql-test/suite/galera/r/galera_bf_kill.result b/mysql-test/suite/galera/r/galera_bf_kill.result index 2a7bc9eac29..3738e8c9684 100644 --- a/mysql-test/suite/galera/r/galera_bf_kill.result +++ b/mysql-test/suite/galera/r/galera_bf_kill.result @@ -69,21 +69,5 @@ select * from t1; a b 2 1 disconnect node_2a; -drop table t1; -connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; -connection node_2a; -CREATE TABLE t1 (i int primary key); -SET DEBUG_SYNC = "before_wsrep_ordered_commit SIGNAL bwoc_reached WAIT_FOR bwoc_continue"; -INSERT INTO t1 VALUES (1); -connection node_2; -SET DEBUG_SYNC = "now WAIT_FOR bwoc_reached"; -SET DEBUG_SYNC = "now SIGNAL bwoc_continue"; -SET DEBUG_SYNC='RESET'; -connection node_2a; -connection node_2; -select * from t1; -i -1 -disconnect node_2a; -connection node_2; +connection node_1; drop table t1; diff --git a/mysql-test/suite/galera/r/galera_bf_kill_debug.result b/mysql-test/suite/galera/r/galera_bf_kill_debug.result new file mode 100644 index 00000000000..c3eae243f47 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_bf_kill_debug.result @@ -0,0 +1,54 @@ +connection node_2; +connection node_1; +connection node_2; +CREATE TABLE t1(a int not null primary key auto_increment,b int) engine=InnoDB; +insert into t1 values (NULL,1); +connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connection node_2a; +truncate t1; +insert into t1 values (1,0); +begin; +update t1 set b=2 where a=1; +connection node_2; +set session wsrep_sync_wait=0; +connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connection node_2b; +SET GLOBAL debug_dbug = "d,sync.before_wsrep_thd_abort"; +connection node_1; +select * from t1; +a b +1 0 +update t1 set b= 1 where a=1; +connection node_2b; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.before_wsrep_thd_abort_reached"; +connection node_2; +SET DEBUG_SYNC= 'before_awake_no_mutex SIGNAL awake_reached WAIT_FOR continue_kill'; +connection node_2b; +SET DEBUG_SYNC='now WAIT_FOR awake_reached'; +SET GLOBAL debug_dbug = ""; +SET DEBUG_SYNC = "now SIGNAL signal.before_wsrep_thd_abort"; +SET DEBUG_SYNC = "now SIGNAL continue_kill"; +connection node_2; +connection node_2a; +select * from t1; +connection node_2; +SET DEBUG_SYNC = "RESET"; +drop table t1; +disconnect node_2a; +connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connection node_2a; +CREATE TABLE t1 (i int primary key); +SET DEBUG_SYNC = "before_wsrep_ordered_commit SIGNAL bwoc_reached WAIT_FOR bwoc_continue"; +INSERT INTO t1 VALUES (1); +connection node_2; +SET DEBUG_SYNC = "now WAIT_FOR bwoc_reached"; +SET DEBUG_SYNC = "now SIGNAL bwoc_continue"; +SET DEBUG_SYNC='RESET'; +connection node_2a; +connection node_2; +select * from t1; +i +1 +disconnect node_2a; +connection node_1; +drop table t1; diff --git a/mysql-test/suite/galera/r/galera_bf_lock_wait.result b/mysql-test/suite/galera/r/galera_bf_lock_wait.result index 71627d11a4e..723f3e37282 100644 --- a/mysql-test/suite/galera/r/galera_bf_lock_wait.result +++ b/mysql-test/suite/galera/r/galera_bf_lock_wait.result @@ -1,5 +1,7 @@ connection node_2; connection node_1; +connection node_2; +call mtr.add_suppression("WSREP: Trying to continue unpaused monitor"); connection node_1; call mtr.add_suppression("WSREP: Trying to continue unpaused monitor"); CREATE TABLE t1 ENGINE=InnoDB select 1 as a, 1 as b union select 2, 2; diff --git a/mysql-test/suite/galera/t/galera_bf_kill.test b/mysql-test/suite/galera/t/galera_bf_kill.test index 3eb3ddc32b5..c8564bc9219 100644 --- a/mysql-test/suite/galera/t/galera_bf_kill.test +++ b/mysql-test/suite/galera/t/galera_bf_kill.test @@ -1,7 +1,5 @@ --source include/galera_cluster.inc --source include/have_innodb.inc ---source include/have_debug.inc ---source include/have_debug_sync.inc # # Test case 1: Start a transaction on node_2a and kill it @@ -135,56 +133,9 @@ update t1 set a =5, b=2; --eval KILL $k_thread --enable_query_log - select * from t1; --disconnect node_2a +--connection node_1 drop table t1; - - -# -# Test case 7: -# run a transaction in node 2, and set a sync point to pause the transaction -# in commit phase. -# Through another connection to node 2, kill the committing transaction by -# KILL QUERY command -# - ---connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 ---connection node_2a ---let $connection_id = `SELECT CONNECTION_ID()` - -CREATE TABLE t1 (i int primary key); - -# Set up sync point -SET DEBUG_SYNC = "before_wsrep_ordered_commit SIGNAL bwoc_reached WAIT_FOR bwoc_continue"; - -# Send insert which will block in the sync point above ---send INSERT INTO t1 VALUES (1) - ---connection node_2 -SET DEBUG_SYNC = "now WAIT_FOR bwoc_reached"; - ---disable_query_log ---disable_result_log -# victim has passed the point of no return, kill is not possible anymore ---eval KILL QUERY $connection_id ---enable_result_log ---enable_query_log - -SET DEBUG_SYNC = "now SIGNAL bwoc_continue"; -SET DEBUG_SYNC='RESET'; ---connection node_2a ---error 0,1213 ---reap - ---connection node_2 -# victim was able to complete the INSERT -select * from t1; - ---disconnect node_2a - ---connection node_2 -drop table t1; - diff --git a/mysql-test/suite/galera/t/galera_bf_kill_debug.cnf b/mysql-test/suite/galera/t/galera_bf_kill_debug.cnf new file mode 100644 index 00000000000..e68f891792c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_kill_debug.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-debug=SERVER + +[mysqld.2] +wsrep-debug=SERVER diff --git a/mysql-test/suite/galera/t/galera_bf_kill_debug.test b/mysql-test/suite/galera/t/galera_bf_kill_debug.test new file mode 100644 index 00000000000..b687a5a6a67 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_kill_debug.test @@ -0,0 +1,140 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +# +# Test case 7: +# 1. Start a transaction on node_2, +# and leave it pending while holding a row locked +# 2. set sync point pause applier +# 3. send a conflicting write on node_1, it will pause +# at the sync point +# 4. though another connection to node_2, kill the local +# transaction +# + +--connection node_2 +CREATE TABLE t1(a int not null primary key auto_increment,b int) engine=InnoDB; +insert into t1 values (NULL,1); + +# +# connection node_2a runs a local transaction, that is victim of BF abort +# and victim of KILL command by connection node_2 +# +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +truncate t1; +insert into t1 values (1,0); + +# start a transaction that will conflict with later applier +begin; +update t1 set b=2 where a=1; + +--connection node_2 +set session wsrep_sync_wait=0; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1 +--source include/wait_condition.inc + +--let $k_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1` + +# connection node_2b is for controlling debug syn points +# first set a sync point for applier, to pause during BF aborting +# and before THD::awake would be called +# +--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2b +SET GLOBAL debug_dbug = "d,sync.before_wsrep_thd_abort"; + +# +# replicate an update, which will BF abort the victim node_2a +# however, while applier in node 2 is handling the abort, +# it will pause in sync point set by node_2b +# +--connection node_1 +select * from t1; +update t1 set b= 1 where a=1; + +# +# wait until the applying of above update has reached the sync point +# in node 2 +# +--connection node_2b +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.before_wsrep_thd_abort_reached"; + +--connection node_2 +# +# pause KILL execution before awake +# +SET DEBUG_SYNC= 'before_awake_no_mutex SIGNAL awake_reached WAIT_FOR continue_kill'; +--disable_query_log +--send_eval KILL $k_thread +--enable_query_log + + +--connection node_2b +SET DEBUG_SYNC='now WAIT_FOR awake_reached'; + +# release applier and KILL operator +SET GLOBAL debug_dbug = ""; +SET DEBUG_SYNC = "now SIGNAL signal.before_wsrep_thd_abort"; +SET DEBUG_SYNC = "now SIGNAL continue_kill"; + +--connection node_2 +--reap + +--connection node_2a +--error 0,1213 +select * from t1; + +--connection node_2 +SET DEBUG_SYNC = "RESET"; + +drop table t1; + +--disconnect node_2a +# +# Test case 7: +# run a transaction in node 2, and set a sync point to pause the transaction +# in commit phase. +# Through another connection to node 2, kill the committing transaction by +# KILL QUERY command +# + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +--let $connection_id = `SELECT CONNECTION_ID()` + +CREATE TABLE t1 (i int primary key); + +# Set up sync point +SET DEBUG_SYNC = "before_wsrep_ordered_commit SIGNAL bwoc_reached WAIT_FOR bwoc_continue"; + +# Send insert which will block in the sync point above +--send INSERT INTO t1 VALUES (1) + +--connection node_2 +SET DEBUG_SYNC = "now WAIT_FOR bwoc_reached"; + +--disable_query_log +--disable_result_log +# victim has passed the point of no return, kill is not possible anymore +--eval KILL QUERY $connection_id +--enable_result_log +--enable_query_log + +SET DEBUG_SYNC = "now SIGNAL bwoc_continue"; +SET DEBUG_SYNC='RESET'; +--connection node_2a +--error 0,1213 +--reap + +--connection node_2 +# victim was able to complete the INSERT +select * from t1; + +--disconnect node_2a + +--connection node_1 +drop table t1; + diff --git a/mysql-test/suite/galera/t/galera_bf_lock_wait.test b/mysql-test/suite/galera/t/galera_bf_lock_wait.test index 97d3b8e0710..a78a94eb1db 100644 --- a/mysql-test/suite/galera/t/galera_bf_lock_wait.test +++ b/mysql-test/suite/galera/t/galera_bf_lock_wait.test @@ -2,8 +2,10 @@ --source include/have_innodb.inc --source include/big_test.inc ---connection node_1 +--connection node_2 +call mtr.add_suppression("WSREP: Trying to continue unpaused monitor"); +--connection node_1 call mtr.add_suppression("WSREP: Trying to continue unpaused monitor"); CREATE TABLE t1 ENGINE=InnoDB select 1 as a, 1 as b union select 2, 2; diff --git a/sql/service_wsrep.cc b/sql/service_wsrep.cc index ada0bde803f..889f3630cc3 100644 --- a/sql/service_wsrep.cc +++ b/sql/service_wsrep.cc @@ -200,6 +200,16 @@ extern "C" void wsrep_handle_SR_rollback(THD *bf_thd, extern "C" my_bool wsrep_thd_bf_abort(THD *bf_thd, THD *victim_thd, my_bool signal) { + DBUG_EXECUTE_IF("sync.before_wsrep_thd_abort", + { + const char act[]= + "now " + "SIGNAL sync.before_wsrep_thd_abort_reached " + "WAIT_FOR signal.before_wsrep_thd_abort"; + DBUG_ASSERT(!debug_sync_set_action(bf_thd, + STRING_WITH_LEN(act))); + };); + my_bool ret= wsrep_bf_abort(bf_thd, victim_thd); /* Send awake signal if victim was BF aborted or does not @@ -211,10 +221,22 @@ extern "C" my_bool wsrep_thd_bf_abort(THD *bf_thd, THD *victim_thd, mysql_mutex_assert_not_owner(&victim_thd->LOCK_thd_data); mysql_mutex_assert_not_owner(&victim_thd->LOCK_thd_kill); mysql_mutex_lock(&victim_thd->LOCK_thd_data); + + if (victim_thd->wsrep_aborter && victim_thd->wsrep_aborter != bf_thd->thread_id) + { + WSREP_DEBUG("victim is killed already by %llu, skipping awake", + victim_thd->wsrep_aborter); + mysql_mutex_unlock(&victim_thd->LOCK_thd_data); + return false; + } + mysql_mutex_lock(&victim_thd->LOCK_thd_kill); + victim_thd->wsrep_aborter= bf_thd->thread_id; victim_thd->awake_no_mutex(KILL_QUERY); mysql_mutex_unlock(&victim_thd->LOCK_thd_kill); mysql_mutex_unlock(&victim_thd->LOCK_thd_data); + } else { + WSREP_DEBUG("wsrep_thd_bf_abort skipped awake"); } return ret; } @@ -303,3 +325,15 @@ extern "C" void wsrep_commit_ordered(THD *thd) thd->wsrep_cs().ordered_commit(); } } + +extern "C" bool wsrep_thd_set_wsrep_aborter(THD *bf_thd, THD *victim_thd) +{ + WSREP_DEBUG("wsrep_thd_set_wsrep_aborter called"); + mysql_mutex_assert_owner(&victim_thd->LOCK_thd_data); + if (victim_thd->wsrep_aborter && victim_thd->wsrep_aborter != bf_thd->thread_id) + { + return true; + } + victim_thd->wsrep_aborter = bf_thd->thread_id; + return false; +} diff --git a/sql/sql_class.cc b/sql/sql_class.cc index fbe73072863..40e606425c5 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -674,6 +674,7 @@ THD::THD(my_thread_id id, bool is_wsrep_applier) wsrep_has_ignored_error(false), wsrep_replicate_GTID(false), wsrep_ignore_table(false), + wsrep_aborter(0), /* wsrep-lib */ m_wsrep_next_trx_id(WSREP_UNDEFINED_TRX_ID), @@ -1288,6 +1289,7 @@ void THD::init() wsrep_affected_rows = 0; m_wsrep_next_trx_id = WSREP_UNDEFINED_TRX_ID; wsrep_replicate_GTID = false; + wsrep_aborter = 0; #endif /* WITH_WSREP */ if (variables.sql_log_bin) @@ -2121,11 +2123,19 @@ void THD::reset_killed() DBUG_ENTER("reset_killed"); if (killed != NOT_KILLED) { + mysql_mutex_assert_not_owner(&LOCK_thd_kill); mysql_mutex_lock(&LOCK_thd_kill); killed= NOT_KILLED; killed_err= 0; mysql_mutex_unlock(&LOCK_thd_kill); } +#ifdef WITH_WSREP + mysql_mutex_assert_not_owner(&LOCK_thd_data); + mysql_mutex_lock(&LOCK_thd_data); + wsrep_aborter= 0; + mysql_mutex_unlock(&LOCK_thd_data); +#endif /* WITH_WSREP */ + DBUG_VOID_RETURN; } diff --git a/sql/sql_class.h b/sql/sql_class.h index 02ecb87038c..ad7631a66bb 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -4859,7 +4859,8 @@ public: table updates from being replicated to other nodes via galera replication. */ bool wsrep_ignore_table; - + /* thread who has started kill for this THD protected by LOCK_thd_data*/ + my_thread_id wsrep_aborter; /* Transaction id: diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index a7f2f472b0a..8c1b4c7e00d 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -9048,7 +9048,6 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ uint error= (type == KILL_TYPE_QUERY ? ER_NO_SUCH_QUERY : ER_NO_SUCH_THREAD); DBUG_ENTER("kill_one_thread"); DBUG_PRINT("enter", ("id: %lld signal: %u", id, (uint) kill_signal)); - WSREP_DEBUG("kill_one_thread %llu", thd->thread_id); if (id && (tmp= find_thread_by_id(id, type == KILL_TYPE_QUERY))) { /* @@ -9081,12 +9080,29 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ thd->security_ctx->user_matches(tmp->security_ctx)) #endif /* WITH_WSREP */ { - tmp->awake_no_mutex(kill_signal); - error=0; +#ifdef WITH_WSREP + DEBUG_SYNC(thd, "before_awake_no_mutex"); + if (tmp->wsrep_aborter && tmp->wsrep_aborter != thd->thread_id) + { + /* victim is in hit list already, bail out */ + WSREP_DEBUG("victim has wsrep aborter: %lu, skipping awake()", + tmp->wsrep_aborter); + error= 0; + } + else +#endif /* WITH_WSREP */ + { + WSREP_DEBUG("kill_one_thread %llu, victim: %llu wsrep_aborter %llu by signal %d", + thd->thread_id, id, tmp->wsrep_aborter, kill_signal); + tmp->awake_no_mutex(kill_signal); + WSREP_DEBUG("victim: %llu taken care of", id); + error= 0; + } } else error= (type == KILL_TYPE_QUERY ? ER_KILL_QUERY_DENIED_ERROR : ER_KILL_DENIED_ERROR); + if (WSREP(tmp)) mysql_mutex_unlock(&tmp->LOCK_thd_data); mysql_mutex_unlock(&tmp->LOCK_thd_kill); } diff --git a/sql/sql_plugin_services.ic b/sql/sql_plugin_services.ic index c7ecfcd482e..42fc0600807 100644 --- a/sql/sql_plugin_services.ic +++ b/sql/sql_plugin_services.ic @@ -173,7 +173,8 @@ static struct wsrep_service_st wsrep_handler = { wsrep_get_sr_table_name, wsrep_get_debug, wsrep_commit_ordered, - wsrep_thd_is_applying + wsrep_thd_is_applying, + wsrep_thd_set_wsrep_aborter }; static struct thd_specifics_service_st thd_specifics_handler= diff --git a/sql/wsrep_dummy.cc b/sql/wsrep_dummy.cc index 8e2b09cfe55..11fd90091f6 100644 --- a/sql/wsrep_dummy.cc +++ b/sql/wsrep_dummy.cc @@ -142,3 +142,6 @@ void wsrep_log(void (*)(const char *, ...), const char *, ...) my_bool wsrep_thd_is_applying(const THD*) { return 0;} + +bool wsrep_thd_set_wsrep_aborter(THD*, THD*) +{ return 0;} diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 06d63fbe84a..bc144b0834a 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -18705,10 +18705,17 @@ wsrep_innobase_kill_one_trx( /* Mark transaction as a victim for Galera abort */ victim_trx->lock.was_chosen_as_wsrep_victim= true; + if (wsrep_thd_set_wsrep_aborter(bf_thd, thd)) + { + WSREP_DEBUG("innodb kill transaction skipped due to wsrep_aborter set"); + wsrep_thd_UNLOCK(thd); + DBUG_RETURN(0); + } /* Note that we need to release this as it will be acquired below in wsrep-lib */ wsrep_thd_UNLOCK(thd); + DEBUG_SYNC(bf_thd, "before_wsrep_thd_abort"); if (wsrep_thd_bf_abort(bf_thd, thd, signal)) { From 6a1713ac17a882e0d5a44fa68edd47c064220975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Fri, 26 Jun 2020 21:40:13 +0300 Subject: [PATCH 002/188] Fix perfschema.nesting test case after fix. --- mysql-test/suite/perfschema/r/nesting.result | 295 ++++++++++--------- 1 file changed, 152 insertions(+), 143 deletions(-) diff --git a/mysql-test/suite/perfschema/r/nesting.result b/mysql-test/suite/perfschema/r/nesting.result index 37681757973..6f0030489f6 100644 --- a/mysql-test/suite/perfschema/r/nesting.result +++ b/mysql-test/suite/perfschema/r/nesting.result @@ -107,152 +107,161 @@ and (end_event_id <= @marker_end) ) all_events order by relative_event_id asc; relative_event_id relative_end_event_id event_name comment nesting_event_type relative_nesting_event_id -0 20 statement/sql/select select "MARKER_BEGIN" as marker NULL NULL -1 4 stage/sql/Init (stage) STATEMENT 0 +0 21 statement/sql/select select "MARKER_BEGIN" as marker NULL NULL +1 5 stage/sql/Init (stage) STATEMENT 0 2 2 wait/io/socket/sql/client_connection recv STAGE 1 3 3 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 1 -4 4 wait/io/file/sql/query_log write STAGE 1 -5 5 stage/sql/Checking permissions (stage) STATEMENT 0 -6 6 stage/sql/Opening tables (stage) STATEMENT 0 -7 7 stage/sql/After opening tables (stage) STATEMENT 0 -8 8 stage/sql/Init (stage) STATEMENT 0 -9 9 stage/sql/Optimizing (stage) STATEMENT 0 -10 10 stage/sql/Executing (stage) STATEMENT 0 -11 11 stage/sql/End of update loop (stage) STATEMENT 0 -12 12 stage/sql/Query end (stage) STATEMENT 0 -13 13 stage/sql/Commit (stage) STATEMENT 0 -14 14 stage/sql/Closing tables (stage) STATEMENT 0 -15 15 stage/sql/Starting cleanup (stage) STATEMENT 0 -16 16 stage/sql/Freeing items (stage) STATEMENT 0 -17 17 wait/io/socket/sql/client_connection send STATEMENT 0 -18 18 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 0 -19 20 stage/sql/Reset for next command (stage) STATEMENT 0 -20 20 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 19 -21 21 idle idle NULL NULL -22 42 statement/sql/select select "This is simple statement one" as payload NULL NULL -23 26 stage/sql/Init (stage) STATEMENT 22 -24 24 wait/io/socket/sql/client_connection recv STAGE 23 -25 25 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 23 -26 26 wait/io/file/sql/query_log write STAGE 23 -27 27 stage/sql/Checking permissions (stage) STATEMENT 22 -28 28 stage/sql/Opening tables (stage) STATEMENT 22 -29 29 stage/sql/After opening tables (stage) STATEMENT 22 -30 30 stage/sql/Init (stage) STATEMENT 22 -31 31 stage/sql/Optimizing (stage) STATEMENT 22 -32 32 stage/sql/Executing (stage) STATEMENT 22 -33 33 stage/sql/End of update loop (stage) STATEMENT 22 -34 34 stage/sql/Query end (stage) STATEMENT 22 -35 35 stage/sql/Commit (stage) STATEMENT 22 -36 36 stage/sql/Closing tables (stage) STATEMENT 22 -37 37 stage/sql/Starting cleanup (stage) STATEMENT 22 -38 38 stage/sql/Freeing items (stage) STATEMENT 22 -39 39 wait/io/socket/sql/client_connection send STATEMENT 22 -40 40 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 22 -41 42 stage/sql/Reset for next command (stage) STATEMENT 22 -42 42 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 41 -43 43 idle idle NULL NULL -44 64 statement/sql/select select "This is simple statement two" as payload NULL NULL -45 48 stage/sql/Init (stage) STATEMENT 44 -46 46 wait/io/socket/sql/client_connection recv STAGE 45 -47 47 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 45 -48 48 wait/io/file/sql/query_log write STAGE 45 -49 49 stage/sql/Checking permissions (stage) STATEMENT 44 -50 50 stage/sql/Opening tables (stage) STATEMENT 44 -51 51 stage/sql/After opening tables (stage) STATEMENT 44 -52 52 stage/sql/Init (stage) STATEMENT 44 -53 53 stage/sql/Optimizing (stage) STATEMENT 44 -54 54 stage/sql/Executing (stage) STATEMENT 44 -55 55 stage/sql/End of update loop (stage) STATEMENT 44 -56 56 stage/sql/Query end (stage) STATEMENT 44 -57 57 stage/sql/Commit (stage) STATEMENT 44 -58 58 stage/sql/Closing tables (stage) STATEMENT 44 -59 59 stage/sql/Starting cleanup (stage) STATEMENT 44 -60 60 stage/sql/Freeing items (stage) STATEMENT 44 -61 61 wait/io/socket/sql/client_connection send STATEMENT 44 -62 62 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 44 -63 64 stage/sql/Reset for next command (stage) STATEMENT 44 -64 64 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 63 -65 65 idle idle NULL NULL -66 85 statement/sql/select select "This is the first part of a multi query" as payload; +4 4 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 1 +5 5 wait/io/file/sql/query_log write STAGE 1 +6 6 stage/sql/Checking permissions (stage) STATEMENT 0 +7 7 stage/sql/Opening tables (stage) STATEMENT 0 +8 8 stage/sql/After opening tables (stage) STATEMENT 0 +9 9 stage/sql/Init (stage) STATEMENT 0 +10 10 stage/sql/Optimizing (stage) STATEMENT 0 +11 11 stage/sql/Executing (stage) STATEMENT 0 +12 12 stage/sql/End of update loop (stage) STATEMENT 0 +13 13 stage/sql/Query end (stage) STATEMENT 0 +14 14 stage/sql/Commit (stage) STATEMENT 0 +15 15 stage/sql/Closing tables (stage) STATEMENT 0 +16 16 stage/sql/Starting cleanup (stage) STATEMENT 0 +17 17 stage/sql/Freeing items (stage) STATEMENT 0 +18 18 wait/io/socket/sql/client_connection send STATEMENT 0 +19 19 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 0 +20 21 stage/sql/Reset for next command (stage) STATEMENT 0 +21 21 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 20 +22 22 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 0 +23 23 idle idle NULL NULL +24 45 statement/sql/select select "This is simple statement one" as payload NULL NULL +25 29 stage/sql/Init (stage) STATEMENT 24 +26 26 wait/io/socket/sql/client_connection recv STAGE 25 +27 27 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 25 +28 28 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 25 +29 29 wait/io/file/sql/query_log write STAGE 25 +30 30 stage/sql/Checking permissions (stage) STATEMENT 24 +31 31 stage/sql/Opening tables (stage) STATEMENT 24 +32 32 stage/sql/After opening tables (stage) STATEMENT 24 +33 33 stage/sql/Init (stage) STATEMENT 24 +34 34 stage/sql/Optimizing (stage) STATEMENT 24 +35 35 stage/sql/Executing (stage) STATEMENT 24 +36 36 stage/sql/End of update loop (stage) STATEMENT 24 +37 37 stage/sql/Query end (stage) STATEMENT 24 +38 38 stage/sql/Commit (stage) STATEMENT 24 +39 39 stage/sql/Closing tables (stage) STATEMENT 24 +40 40 stage/sql/Starting cleanup (stage) STATEMENT 24 +41 41 stage/sql/Freeing items (stage) STATEMENT 24 +42 42 wait/io/socket/sql/client_connection send STATEMENT 24 +43 43 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 24 +44 45 stage/sql/Reset for next command (stage) STATEMENT 24 +45 45 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 44 +46 46 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 24 +47 47 idle idle NULL NULL +48 69 statement/sql/select select "This is simple statement two" as payload NULL NULL +49 53 stage/sql/Init (stage) STATEMENT 48 +50 50 wait/io/socket/sql/client_connection recv STAGE 49 +51 51 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 49 +52 52 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 49 +53 53 wait/io/file/sql/query_log write STAGE 49 +54 54 stage/sql/Checking permissions (stage) STATEMENT 48 +55 55 stage/sql/Opening tables (stage) STATEMENT 48 +56 56 stage/sql/After opening tables (stage) STATEMENT 48 +57 57 stage/sql/Init (stage) STATEMENT 48 +58 58 stage/sql/Optimizing (stage) STATEMENT 48 +59 59 stage/sql/Executing (stage) STATEMENT 48 +60 60 stage/sql/End of update loop (stage) STATEMENT 48 +61 61 stage/sql/Query end (stage) STATEMENT 48 +62 62 stage/sql/Commit (stage) STATEMENT 48 +63 63 stage/sql/Closing tables (stage) STATEMENT 48 +64 64 stage/sql/Starting cleanup (stage) STATEMENT 48 +65 65 stage/sql/Freeing items (stage) STATEMENT 48 +66 66 wait/io/socket/sql/client_connection send STATEMENT 48 +67 67 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 48 +68 69 stage/sql/Reset for next command (stage) STATEMENT 48 +69 69 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 68 +70 70 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 48 +71 71 idle idle NULL NULL +72 92 statement/sql/select select "This is the first part of a multi query" as payload; select "And this is the second part of a multi query" as payload; select "With a third part to make things complete" as payload NULL NULL -67 71 stage/sql/Init (stage) STATEMENT 66 -68 68 wait/io/socket/sql/client_connection recv STAGE 67 -69 69 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 67 -70 70 wait/io/file/sql/query_log write STAGE 67 -71 71 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 67 -72 72 stage/sql/Checking permissions (stage) STATEMENT 66 -73 73 stage/sql/Opening tables (stage) STATEMENT 66 -74 74 stage/sql/After opening tables (stage) STATEMENT 66 -75 75 stage/sql/Init (stage) STATEMENT 66 -76 76 stage/sql/Optimizing (stage) STATEMENT 66 -77 77 stage/sql/Executing (stage) STATEMENT 66 -78 78 stage/sql/End of update loop (stage) STATEMENT 66 -79 79 stage/sql/Query end (stage) STATEMENT 66 -80 80 stage/sql/Commit (stage) STATEMENT 66 -81 81 stage/sql/Closing tables (stage) STATEMENT 66 -82 82 stage/sql/Starting cleanup (stage) STATEMENT 66 -83 85 stage/sql/Freeing items (stage) STATEMENT 66 -84 84 wait/io/socket/sql/client_connection send STAGE 83 -85 85 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 83 -86 103 statement/sql/select select "And this is the second part of a multi query" as payload; +73 78 stage/sql/Init (stage) STATEMENT 72 +74 74 wait/io/socket/sql/client_connection recv STAGE 73 +75 75 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 73 +76 76 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 73 +77 77 wait/io/file/sql/query_log write STAGE 73 +78 78 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 73 +79 79 stage/sql/Checking permissions (stage) STATEMENT 72 +80 80 stage/sql/Opening tables (stage) STATEMENT 72 +81 81 stage/sql/After opening tables (stage) STATEMENT 72 +82 82 stage/sql/Init (stage) STATEMENT 72 +83 83 stage/sql/Optimizing (stage) STATEMENT 72 +84 84 stage/sql/Executing (stage) STATEMENT 72 +85 85 stage/sql/End of update loop (stage) STATEMENT 72 +86 86 stage/sql/Query end (stage) STATEMENT 72 +87 87 stage/sql/Commit (stage) STATEMENT 72 +88 88 stage/sql/Closing tables (stage) STATEMENT 72 +89 89 stage/sql/Starting cleanup (stage) STATEMENT 72 +90 92 stage/sql/Freeing items (stage) STATEMENT 72 +91 91 wait/io/socket/sql/client_connection send STAGE 90 +92 92 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 90 +93 110 statement/sql/select select "And this is the second part of a multi query" as payload; select "With a third part to make things complete" as payload NULL NULL -87 89 stage/sql/Init (stage) STATEMENT 86 -88 88 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 87 -89 89 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 87 -90 90 stage/sql/Checking permissions (stage) STATEMENT 86 -91 91 stage/sql/Opening tables (stage) STATEMENT 86 -92 92 stage/sql/After opening tables (stage) STATEMENT 86 -93 93 stage/sql/Init (stage) STATEMENT 86 -94 94 stage/sql/Optimizing (stage) STATEMENT 86 -95 95 stage/sql/Executing (stage) STATEMENT 86 -96 96 stage/sql/End of update loop (stage) STATEMENT 86 -97 97 stage/sql/Query end (stage) STATEMENT 86 -98 98 stage/sql/Commit (stage) STATEMENT 86 -99 99 stage/sql/Closing tables (stage) STATEMENT 86 -100 100 stage/sql/Starting cleanup (stage) STATEMENT 86 -101 103 stage/sql/Freeing items (stage) STATEMENT 86 -102 102 wait/io/socket/sql/client_connection send STAGE 101 -103 103 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 101 -104 122 statement/sql/select select "With a third part to make things complete" as payload NULL NULL -105 106 stage/sql/Init (stage) STATEMENT 104 -106 106 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 105 -107 107 stage/sql/Checking permissions (stage) STATEMENT 104 -108 108 stage/sql/Opening tables (stage) STATEMENT 104 -109 109 stage/sql/After opening tables (stage) STATEMENT 104 -110 110 stage/sql/Init (stage) STATEMENT 104 -111 111 stage/sql/Optimizing (stage) STATEMENT 104 -112 112 stage/sql/Executing (stage) STATEMENT 104 -113 113 stage/sql/End of update loop (stage) STATEMENT 104 -114 114 stage/sql/Query end (stage) STATEMENT 104 -115 115 stage/sql/Commit (stage) STATEMENT 104 -116 116 stage/sql/Closing tables (stage) STATEMENT 104 -117 117 stage/sql/Starting cleanup (stage) STATEMENT 104 -118 118 stage/sql/Freeing items (stage) STATEMENT 104 -119 119 wait/io/socket/sql/client_connection send STATEMENT 104 -120 120 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 104 -121 122 stage/sql/Reset for next command (stage) STATEMENT 104 -122 122 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 121 -123 123 idle idle NULL NULL -124 144 statement/sql/select select "MARKER_END" as marker NULL NULL -125 128 stage/sql/Init (stage) STATEMENT 124 -126 126 wait/io/socket/sql/client_connection recv STAGE 125 -127 127 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 125 -128 128 wait/io/file/sql/query_log write STAGE 125 -129 129 stage/sql/Checking permissions (stage) STATEMENT 124 -130 130 stage/sql/Opening tables (stage) STATEMENT 124 -131 131 stage/sql/After opening tables (stage) STATEMENT 124 -132 132 stage/sql/Init (stage) STATEMENT 124 -133 133 stage/sql/Optimizing (stage) STATEMENT 124 -134 134 stage/sql/Executing (stage) STATEMENT 124 -135 135 stage/sql/End of update loop (stage) STATEMENT 124 -136 136 stage/sql/Query end (stage) STATEMENT 124 -137 137 stage/sql/Commit (stage) STATEMENT 124 -138 138 stage/sql/Closing tables (stage) STATEMENT 124 -139 139 stage/sql/Starting cleanup (stage) STATEMENT 124 -140 140 stage/sql/Freeing items (stage) STATEMENT 124 -141 141 wait/io/socket/sql/client_connection send STATEMENT 124 -142 142 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 124 -143 144 stage/sql/Reset for next command (stage) STATEMENT 124 -144 144 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 143 +94 96 stage/sql/Init (stage) STATEMENT 93 +95 95 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 94 +96 96 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 94 +97 97 stage/sql/Checking permissions (stage) STATEMENT 93 +98 98 stage/sql/Opening tables (stage) STATEMENT 93 +99 99 stage/sql/After opening tables (stage) STATEMENT 93 +100 100 stage/sql/Init (stage) STATEMENT 93 +101 101 stage/sql/Optimizing (stage) STATEMENT 93 +102 102 stage/sql/Executing (stage) STATEMENT 93 +103 103 stage/sql/End of update loop (stage) STATEMENT 93 +104 104 stage/sql/Query end (stage) STATEMENT 93 +105 105 stage/sql/Commit (stage) STATEMENT 93 +106 106 stage/sql/Closing tables (stage) STATEMENT 93 +107 107 stage/sql/Starting cleanup (stage) STATEMENT 93 +108 110 stage/sql/Freeing items (stage) STATEMENT 93 +109 109 wait/io/socket/sql/client_connection send STAGE 108 +110 110 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 108 +111 129 statement/sql/select select "With a third part to make things complete" as payload NULL NULL +112 113 stage/sql/Init (stage) STATEMENT 111 +113 113 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 112 +114 114 stage/sql/Checking permissions (stage) STATEMENT 111 +115 115 stage/sql/Opening tables (stage) STATEMENT 111 +116 116 stage/sql/After opening tables (stage) STATEMENT 111 +117 117 stage/sql/Init (stage) STATEMENT 111 +118 118 stage/sql/Optimizing (stage) STATEMENT 111 +119 119 stage/sql/Executing (stage) STATEMENT 111 +120 120 stage/sql/End of update loop (stage) STATEMENT 111 +121 121 stage/sql/Query end (stage) STATEMENT 111 +122 122 stage/sql/Commit (stage) STATEMENT 111 +123 123 stage/sql/Closing tables (stage) STATEMENT 111 +124 124 stage/sql/Starting cleanup (stage) STATEMENT 111 +125 125 stage/sql/Freeing items (stage) STATEMENT 111 +126 126 wait/io/socket/sql/client_connection send STATEMENT 111 +127 127 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 111 +128 129 stage/sql/Reset for next command (stage) STATEMENT 111 +129 129 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 128 +130 130 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 111 +131 131 idle idle NULL NULL +132 153 statement/sql/select select "MARKER_END" as marker NULL NULL +133 137 stage/sql/Init (stage) STATEMENT 132 +134 134 wait/io/socket/sql/client_connection recv STAGE 133 +135 135 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 133 +136 136 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 133 +137 137 wait/io/file/sql/query_log write STAGE 133 +138 138 stage/sql/Checking permissions (stage) STATEMENT 132 +139 139 stage/sql/Opening tables (stage) STATEMENT 132 +140 140 stage/sql/After opening tables (stage) STATEMENT 132 +141 141 stage/sql/Init (stage) STATEMENT 132 +142 142 stage/sql/Optimizing (stage) STATEMENT 132 +143 143 stage/sql/Executing (stage) STATEMENT 132 +144 144 stage/sql/End of update loop (stage) STATEMENT 132 +145 145 stage/sql/Query end (stage) STATEMENT 132 +146 146 stage/sql/Commit (stage) STATEMENT 132 +147 147 stage/sql/Closing tables (stage) STATEMENT 132 +148 148 stage/sql/Starting cleanup (stage) STATEMENT 132 +149 149 stage/sql/Freeing items (stage) STATEMENT 132 +150 150 wait/io/socket/sql/client_connection send STATEMENT 132 +151 151 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 132 +152 153 stage/sql/Reset for next command (stage) STATEMENT 132 +153 153 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 152 disconnect con1; From 7b8319f3f134da7929409e3fcb6681145a8e9173 Mon Sep 17 00:00:00 2001 From: MikkoJaakola Date: Wed, 1 Jul 2020 16:58:59 +0300 Subject: [PATCH 003/188] MDEV-22966- Hang on galera_toi_truncate test case galera_toi_truncate test launches a long term INSERT statement in node 2, and then submits an offending TRUNCATE through node 1. The idea is that the replicated TRUNCATE will conflict with INSERT in node 2, and force the INSERT to abort. The test first issues --send INSERT in node 2, and then switches to node 1 to launch --send TRUNCATE. As the INSERT is launched asynchronously by --send, it may happen that INSERT has not yet started to process, before the TRUNCATE is replicated. The net effect may be that TRUCATE processes to completion in node 2, and only after that INSERT starts to execute. As the INSERT is very long query, it will last longer than mtr test suite max test time, the test will fail for timeout. The fix in this commit uses another connection in node 2, to wait until the INSERT has started to process in node 2. TRUNCATE in node 1, will be submitted in node 1 after this wait condition. --- mysql-test/suite/galera/r/galera_toi_truncate.result | 6 +++--- mysql-test/suite/galera/t/galera_toi_truncate.test | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_toi_truncate.result b/mysql-test/suite/galera/r/galera_toi_truncate.result index 7db0f8abdb8..a02487ac347 100644 --- a/mysql-test/suite/galera/r/galera_toi_truncate.result +++ b/mysql-test/suite/galera/r/galera_toi_truncate.result @@ -7,12 +7,12 @@ CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; connection node_2; SET SESSION wsrep_retry_autocommit = 0; INSERT INTO t1 (f1) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5, ten AS a6, ten AS a7, ten AS a8; +connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connection node_2a; connection node_1; -TRUNCATE TABLE t1;; +TRUNCATE TABLE t1; connection node_2; ERROR 40001: Deadlock found when trying to get lock; try restarting transaction -connection node_1; -connection node_2; SELECT COUNT(*) AS EXPECT_0 FROM t1; EXPECT_0 0 diff --git a/mysql-test/suite/galera/t/galera_toi_truncate.test b/mysql-test/suite/galera/t/galera_toi_truncate.test index 30e0e802816..5b23a8c3f3e 100644 --- a/mysql-test/suite/galera/t/galera_toi_truncate.test +++ b/mysql-test/suite/galera/t/galera_toi_truncate.test @@ -25,17 +25,18 @@ CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; SET SESSION wsrep_retry_autocommit = 0; --send INSERT INTO t1 (f1) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5, ten AS a6, ten AS a7, ten AS a8 +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Sending data%' AND INFO LIKE 'INSERT INTO t1 (f1)%'; +--source include/wait_condition.inc + --connection node_1 ---send TRUNCATE TABLE t1; +TRUNCATE TABLE t1; --connection node_2 --error ER_LOCK_DEADLOCK --reap ---connection node_1 ---reap - ---connection node_2 SELECT COUNT(*) AS EXPECT_0 FROM t1; --connection node_1 From 453dc4b300e0d595adb736fb555e62a42accfa2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Sat, 4 Jul 2020 22:02:30 +0300 Subject: [PATCH 004/188] Fixup the parent commit for MSAN and Valgrind commit 484931325e7bcecddc6daf1a55c008ddd67497e4 was a necessary fix for the buffer pool resizing tests in 10.5 in AddressSanitizer. However, that change would break the tests innodb.innodb_buffer_pool_resize and innodb.innodb_buffer_pool_resize_with_chunks when run in MemorySanitizer, or presumably in Valgrind as well. (Those tests run "forever" in Valgrind.) buf_pool_resize(): Cancel the effect of MEM_NOACCESS() in Valgrind and ASAN. In MSAN, MEM_NOACCESS() is a no-op, and hence we must do nothing special here. MEM_MAKE_ADDRESSABLE() would declare the memory contents undefined. In this particular case, we must actually declare the contents defined for Valgrind. --- storage/innobase/buf/buf0buf.cc | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index c9cff9b3295..f2594725391 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -1622,7 +1622,7 @@ buf_chunk_init( return(NULL); } - MEM_MAKE_ADDRESSABLE(chunk->mem, chunk->mem_size()); + MEM_MAKE_ADDRESSABLE(chunk->mem, chunk->mem_size()); #ifdef HAVE_LIBNUMA if (srv_numa_interleave) { @@ -2910,8 +2910,21 @@ withdraw_retry: while (chunk < echunk) { buf_block_t* block = chunk->blocks; - MEM_MAKE_ADDRESSABLE(chunk->mem, - chunk->mem_size()); + /* buf_LRU_block_free_non_file_page() + invokes MEM_NOACCESS() on any blocks + that are in free_list. We must + cancel the effect of that. In MemorySanitizer, + MEM_NOACCESS() is no-op, so we must not do + anything special for it here. */ +#ifdef HAVE_valgrind +# if !__has_feature(memory_sanitizer) + MEM_MAKE_DEFINED(chunk->mem, + chunk->mem_size()); +# endif +#else + MEM_MAKE_ADDRESSABLE(chunk->mem, + chunk->mem_size()); +#endif for (ulint j = chunk->size; j--; block++) { From ab4069909d1f8d0c4740b5bd90e1422ce1978187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Sun, 5 Jul 2020 16:25:29 +0300 Subject: [PATCH 005/188] After-merge fix for ASAN and MSAN The merge commit 0fd89a1a89da73cec8e87e1f007637eaec51dcc0 of commit b6ec1e8bbf0ffca2d715aded694722e0c4b5d484 seems to cause occasional MemorySanitizer failures, because it failed to replace some MEM_UNDEFINED() calls with MEM_MAKE_ADDRESSABLE(). my_large_free(): Correctly invoke MEM_MAKE_ADDRESSABLE() after freeing memory. Failure to do so could cause bogus AddressSanitizer failures for memory allocated by my_large_malloc(). On MemorySanitizer, we will do nothing. buf_pool_t::chunk_t::create(): Replace the MEM_MAKE_ADDRESSABLE() that had been added in commit 484931325e7bcecddc6daf1a55c008ddd67497e4 to work around the issue. --- mysys/my_largepage.c | 8 ++++++-- storage/innobase/buf/buf0buf.cc | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/mysys/my_largepage.c b/mysys/my_largepage.c index 447d5c50a59..89c314c6ca8 100644 --- a/mysys/my_largepage.c +++ b/mysys/my_largepage.c @@ -421,9 +421,11 @@ void my_large_free(void *ptr, size_t size) { my_error(EE_BADMEMORYRELEASE, MYF(ME_ERROR_LOG_ONLY), ptr, size, errno); } +# if !__has_feature(memory_sanitizer) else { - MEM_UNDEFINED(ptr, size); + MEM_MAKE_ADDRESSABLE(ptr, size); +# endif } #elif defined(_WIN32) /* @@ -435,9 +437,11 @@ void my_large_free(void *ptr, size_t size) my_error(EE_BADMEMORYRELEASE, MYF(ME_ERROR_LOG_ONLY), ptr, size, GetLastError()); } +# if !__has_feature(memory_sanitizer) else { - MEM_UNDEFINED(ptr, size); + MEM_MAKE_ADDRESSABLE(ptr, size); +# endif } #else my_free_lock(ptr); diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index df529ae83ac..8f9a230fcd5 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -1356,7 +1356,7 @@ inline bool buf_pool_t::chunk_t::create(size_t bytes) if (UNIV_UNLIKELY(!mem)) return false; - MEM_MAKE_ADDRESSABLE(mem, mem_size()); + MEM_UNDEFINED(mem, mem_size()); #ifdef HAVE_LIBNUMA if (srv_numa_interleave) From f3f23b5c4bdc669ad0af4a1c79bd70c40ed9c594 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Sun, 5 Jul 2020 16:31:34 +0300 Subject: [PATCH 006/188] One more ASAN/MSAN cleanup commit 484931325e7bcecddc6daf1a55c008ddd67497e4 included a workaround for a 10.5 merge issue that should now be properly addressed in commit ab4069909d1f8d0c4740b5bd90e1422ce1978187. buf_chunk_init(): Remove an unnecessary MEM_MAKE_ADDRESSABLE(). We might invoke MEM_UNDEFINED() here, but actually the allocated memory ought to be guaranteed to be zero-initialized. --- storage/innobase/buf/buf0buf.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index f2594725391..88c4c7ba7fd 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -1622,8 +1622,6 @@ buf_chunk_init( return(NULL); } - MEM_MAKE_ADDRESSABLE(chunk->mem, chunk->mem_size()); - #ifdef HAVE_LIBNUMA if (srv_numa_interleave) { struct bitmask *numa_mems_allowed = numa_get_mems_allowed(); From 79c166c56db7b48fac682c87f68a221539e58551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Sun, 5 Jul 2020 20:38:50 +0300 Subject: [PATCH 007/188] Fix cmake -DWITH_MSAN=ON commit ab4069909d1f8d0c4740b5bd90e1422ce1978187 accidentally misplaced #endif directives. --- mysys/my_largepage.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mysys/my_largepage.c b/mysys/my_largepage.c index 89c314c6ca8..e107c62b987 100644 --- a/mysys/my_largepage.c +++ b/mysys/my_largepage.c @@ -425,8 +425,8 @@ void my_large_free(void *ptr, size_t size) else { MEM_MAKE_ADDRESSABLE(ptr, size); -# endif } +# endif #elif defined(_WIN32) /* When RELEASE memory, the size parameter must be 0. @@ -441,8 +441,8 @@ void my_large_free(void *ptr, size_t size) else { MEM_MAKE_ADDRESSABLE(ptr, size); -# endif } +# endif #else my_free_lock(ptr); #endif From 846174c5ba832fe7c7282a575c104cb7d8497b3d Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Tue, 30 Jun 2020 15:20:11 +0200 Subject: [PATCH 008/188] MDEV-23071 remove potentially dangerouws casting to Item_in_subselect Remove types casting with a help of virtual functions. --- sql/item.h | 15 +++++- sql/item_cmpfunc.cc | 28 +++++------ sql/item_cmpfunc.h | 6 +-- sql/item_subselect.cc | 53 +++++++++++---------- sql/item_subselect.h | 31 +++++++----- sql/opt_subselect.cc | 107 ++++++++++++++++++++++++------------------ sql/sql_base.cc | 11 +++-- sql/sql_lex.cc | 11 +++-- sql/sql_select.cc | 11 +++-- 9 files changed, 155 insertions(+), 118 deletions(-) diff --git a/sql/item.h b/sql/item.h index 8118b079ca1..ad746a4c3eb 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1840,6 +1840,18 @@ public: when they are "top level". */ virtual void top_level_item() {} + /* + Return TRUE if it is item of top WHERE level (AND/OR) and it is + important, return FALSE if it not important (we can not use to simplify + calculations) or not top level + */ + virtual bool is_top_level_item() const + { return FALSE; /* not important */} + /* + return IN/ALL/ANY subquery or NULL + */ + virtual Item_in_subselect* get_IN_subquery() + { return NULL; /* in is not IN/ALL/ANY */ } /* set field of temporary table for Item which can be switched on temporary table during query processing (grouping and so on) @@ -2435,7 +2447,8 @@ public: } bool pushable_cond_checker_for_subquery(uchar *arg) { - return excl_dep_on_in_subq_left_part((Item_in_subselect *)arg); + DBUG_ASSERT(((Item*) arg)->get_IN_subquery()); + return excl_dep_on_in_subq_left_part(((Item*)arg)->get_IN_subquery()); } Item *build_pushable_cond(THD *thd, Pushdown_checker checker, diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 24914accc6f..8203af5c7dc 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -1197,11 +1197,9 @@ longlong Item_func_truth::val_int() } -bool Item_in_optimizer::is_top_level_item() +bool Item_in_optimizer::is_top_level_item() const { - if (invisible_mode()) - return FALSE; - return ((Item_in_subselect *)args[1])->is_top_level_item(); + return args[1]->is_top_level_item(); } @@ -1265,10 +1263,9 @@ void Item_in_optimizer::print(String *str, enum_query_type query_type) void Item_in_optimizer::restore_first_argument() { - if (!invisible_mode()) - { - args[0]= ((Item_in_subselect *)args[1])->left_expr; - } + Item_in_subselect *in_subs= args[1]->get_IN_subquery(); + if (in_subs) + args[0]= in_subs->left_exp(); } @@ -1292,8 +1289,8 @@ bool Item_in_optimizer::fix_left(THD *thd) the pointer to the post-transformation item. Because of that, on the next execution we need to copy args[1]->left_expr again. */ - ref0= &(((Item_in_subselect *)args[1])->left_expr); - args[0]= ((Item_in_subselect *)args[1])->left_expr; + ref0= args[1]->get_IN_subquery()->left_exp_ptr(); + args[0]= (*ref0); } if ((*ref0)->fix_fields_if_needed(thd, ref0) || (!cache && !(cache= (*ref0)->get_cache(thd)))) @@ -1419,9 +1416,7 @@ bool Item_in_optimizer::fix_fields(THD *thd, Item **ref) bool Item_in_optimizer::invisible_mode() { /* MAX/MIN transformed or EXISTS->IN prepared => do nothing */ - return (args[1]->type() != Item::SUBSELECT_ITEM || - ((Item_subselect *)args[1])->substype() == - Item_subselect::EXISTS_SUBS); + return (args[1]->get_IN_subquery() == NULL); } @@ -1583,7 +1578,7 @@ longlong Item_in_optimizer::val_int() " [NOT] IN (SELECT ...)" where one or more of the outer values is NULL. */ - if (((Item_in_subselect*)args[1])->is_top_level_item()) + if (args[1]->is_top_level_item()) { /* We're evaluating a top level item, e.g. @@ -1606,7 +1601,7 @@ longlong Item_in_optimizer::val_int() SELECT evaluated over the non-NULL values produces at least one row, FALSE otherwise */ - Item_in_subselect *item_subs=(Item_in_subselect*)args[1]; + Item_in_subselect *item_subs= args[1]->get_IN_subquery(); bool all_left_cols_null= true; const uint ncols= cache->cols(); @@ -1752,8 +1747,7 @@ Item *Item_in_optimizer::transform(THD *thd, Item_transformer transformer, ((Item_subselect*)(args[1]))->substype() == Item_subselect::ANY_SUBS)); - Item_in_subselect *in_arg= (Item_in_subselect*)args[1]; - thd->change_item_tree(&in_arg->left_expr, args[0]); + thd->change_item_tree(args[1]->get_IN_subquery()->left_exp_ptr(), args[0]); } return (this->*transformer)(thd, argument); } diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 6d02d6642e2..4b64ac82c72 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -384,7 +384,7 @@ public: void set_join_tab_idx(uint join_tab_idx_arg) { args[1]->set_join_tab_idx(join_tab_idx_arg); } virtual void get_cache_parameters(List ¶meters); - bool is_top_level_item(); + bool is_top_level_item() const override; bool eval_not_null_tables(void *opt_arg); bool find_not_null_fields(table_map allowed); void fix_after_pullout(st_select_lex *new_parent, Item **ref, bool merge); @@ -602,7 +602,7 @@ public: Item_func_not(THD *thd, Item *a): Item_bool_func(thd, a), abort_on_null(FALSE) {} virtual void top_level_item() { abort_on_null= 1; } - bool is_top_level_item() { return abort_on_null; } + bool is_top_level_item() const override { return abort_on_null; } longlong val_int(); enum Functype functype() const { return NOT_FUNC; } const char *func_name() const { return "not"; } @@ -890,7 +890,7 @@ public: Item_bool_func(thd, list), negated(0), pred_level(0) {} public: inline void top_level_item() { pred_level= 1; } - bool is_top_level_item() const { return pred_level; } + bool is_top_level_item() const override { return pred_level; } Item *neg_transformer(THD *thd) { negated= !negated; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 1690ec96e65..16fa06f4cda 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -4141,7 +4141,8 @@ int subselect_uniquesubquery_engine::exec() TABLE *table= tab->table; empty_result_set= TRUE; table->status= 0; - Item_in_subselect *in_subs= (Item_in_subselect *) item; + Item_in_subselect *in_subs= item->get_IN_subquery(); + DBUG_ASSERT(in_subs); if (!tab->preread_init_done && tab->preread_init()) DBUG_RETURN(1); @@ -4186,11 +4187,11 @@ int subselect_uniquesubquery_engine::exec() table->null_row= 0; if (!table->status && (!cond || cond->val_int())) { - ((Item_in_subselect *) item)->value= 1; + in_subs->value= 1; empty_result_set= FALSE; } else - ((Item_in_subselect *) item)->value= 0; + in_subs->value= 0; } DBUG_RETURN(error != 0); @@ -4229,9 +4230,9 @@ int subselect_uniquesubquery_engine::index_lookup() table->null_row= 0; if (!error && (!cond || cond->val_int())) - ((Item_in_subselect *) item)->value= 1; + item->get_IN_subquery()->value= 1; else - ((Item_in_subselect *) item)->value= 0; + item->get_IN_subquery()->value= 0; DBUG_RETURN(0); } @@ -4301,9 +4302,9 @@ int subselect_indexsubquery_engine::exec() int error; bool null_finding= 0; TABLE *table= tab->table; - Item_in_subselect *in_subs= (Item_in_subselect *) item; + Item_in_subselect *in_subs= item->get_IN_subquery(); - ((Item_in_subselect *) item)->value= 0; + in_subs->value= 0; empty_result_set= TRUE; table->status= 0; @@ -4311,7 +4312,7 @@ int subselect_indexsubquery_engine::exec() { /* We need to check for NULL if there wasn't a matching value */ *tab->ref.null_ref_key= 0; // Search first for not null - ((Item_in_subselect *) item)->was_null= 0; + in_subs->was_null= 0; } if (!tab->preread_init_done && tab->preread_init()) @@ -4363,9 +4364,9 @@ int subselect_indexsubquery_engine::exec() { empty_result_set= FALSE; if (null_finding) - ((Item_in_subselect *) item)->was_null= 1; + in_subs->was_null= 1; else - ((Item_in_subselect *) item)->value= 1; + in_subs->value= 1; break; } error= table->file->ha_index_next_same(table->record[0], @@ -4751,7 +4752,7 @@ bool subselect_uniquesubquery_engine::no_tables() subselect_hash_sj_engine::exec_strategy subselect_hash_sj_engine::get_strategy_using_schema() { - Item_in_subselect *item_in= (Item_in_subselect *) item; + Item_in_subselect *item_in= item->get_IN_subquery(); if (item_in->is_top_level_item()) return COMPLETE_MATCH; @@ -4798,7 +4799,7 @@ subselect_hash_sj_engine::get_strategy_using_schema() subselect_hash_sj_engine::exec_strategy subselect_hash_sj_engine::get_strategy_using_data() { - Item_in_subselect *item_in= (Item_in_subselect *) item; + Item_in_subselect *item_in= item->get_IN_subquery(); select_materialize_with_stats *result_sink= (select_materialize_with_stats *) result; Item *outer_col; @@ -5049,8 +5050,9 @@ bool subselect_hash_sj_engine::init(List *tmp_columns, uint subquery_id) DBUG_RETURN(TRUE); result_sink->get_tmp_table_param()->materialized_subquery= true; - if (item->substype() == Item_subselect::IN_SUBS && - ((Item_in_subselect*)item)->is_jtbm_merged) + + if (item->substype() == Item_subselect::IN_SUBS && + (item->get_IN_subquery()->is_jtbm_merged)) { result_sink->get_tmp_table_param()->force_not_null_cols= true; } @@ -5090,9 +5092,12 @@ bool subselect_hash_sj_engine::init(List *tmp_columns, uint subquery_id) /* Make sure there is only one index on the temp table, and it doesn't have the extra key part created when s->uniques > 0. + + NOTE: item have to be Item_in_subselect, because class constructor + accept Item_in_subselect as the parmeter. */ DBUG_ASSERT(tmp_table->s->keys == 1 && - ((Item_in_subselect *) item)->left_expr->cols() == + item->get_IN_subquery()->left_expr->cols() == tmp_table->key_info->user_defined_key_parts); if (make_semi_join_conds() || @@ -5141,7 +5146,7 @@ bool subselect_hash_sj_engine::make_semi_join_conds() TABLE_LIST *tmp_table_ref; /* Name resolution context for all tmp_table columns created below. */ Name_resolution_context *context; - Item_in_subselect *item_in= (Item_in_subselect *) item; + Item_in_subselect *item_in= item->get_IN_subquery(); LEX_CSTRING table_name; DBUG_ENTER("subselect_hash_sj_engine::make_semi_join_conds"); DBUG_ASSERT(semi_join_conds == NULL); @@ -5203,7 +5208,7 @@ bool subselect_hash_sj_engine::make_semi_join_conds() subselect_uniquesubquery_engine* subselect_hash_sj_engine::make_unique_engine() { - Item_in_subselect *item_in= (Item_in_subselect *) item; + Item_in_subselect *item_in= item->get_IN_subquery(); Item_iterator_row it(item_in->left_expr); /* The only index on the temporary table. */ KEY *tmp_key= tmp_table->key_info; @@ -5225,7 +5230,7 @@ subselect_hash_sj_engine::make_unique_engine() tab->preread_init_done= FALSE; tab->ref.tmp_table_index_lookup_init(thd, tmp_key, it, FALSE); - DBUG_RETURN(new subselect_uniquesubquery_engine(thd, tab, item, + DBUG_RETURN(new subselect_uniquesubquery_engine(thd, tab, item_in, semi_join_conds)); } @@ -5272,7 +5277,7 @@ void subselect_hash_sj_engine::cleanup() at parse time and stored across executions, while all other materialization related engines are created and chosen for each execution. */ - ((Item_in_subselect *) item)->engine= materialize_engine; + item->get_IN_subquery()->engine= materialize_engine; if (lookup_engine_type == TABLE_SCAN_ENGINE || lookup_engine_type == ROWID_MERGE_ENGINE) { @@ -5512,7 +5517,7 @@ double get_post_group_estimate(JOIN* join, double join_op_rows) int subselect_hash_sj_engine::exec() { - Item_in_subselect *item_in= (Item_in_subselect *) item; + Item_in_subselect *item_in= item->get_IN_subquery(); SELECT_LEX *save_select= thd->lex->current_select; subselect_partial_match_engine *pm_engine= NULL; int res= 0; @@ -6129,7 +6134,7 @@ subselect_partial_match_engine::subselect_partial_match_engine( int subselect_partial_match_engine::exec() { - Item_in_subselect *item_in= (Item_in_subselect *) item; + Item_in_subselect *item_in= item->get_IN_subquery(); int lookup_res; DBUG_ASSERT(!(item_in->left_expr_has_null() && @@ -6251,7 +6256,7 @@ subselect_rowid_merge_engine::init(MY_BITMAP *non_null_key_parts, select_materialize_with_stats *result_sink= (select_materialize_with_stats *) result; uint cur_keyid= 0; - Item_in_subselect *item_in= (Item_in_subselect*) item; + Item *left= item->get_IN_subquery()->left_exp(); int error; if (merge_keys_count == 0) @@ -6286,7 +6291,7 @@ subselect_rowid_merge_engine::init(MY_BITMAP *non_null_key_parts, /* Create the only non-NULL key if there is any. */ if (non_null_key_parts) { - non_null_key= new Ordered_key(cur_keyid, tmp_table, item_in->left_expr, + non_null_key= new Ordered_key(cur_keyid, tmp_table, left, 0, 0, 0, row_num_to_rowid); if (non_null_key->init(non_null_key_parts)) return TRUE; @@ -6318,7 +6323,7 @@ subselect_rowid_merge_engine::init(MY_BITMAP *non_null_key_parts, merge_keys[cur_keyid]= new Ordered_key( cur_keyid, tmp_table, - item_in->left_expr->element_index(i), + left->element_index(i), result_sink->get_null_count_of_col(i), result_sink->get_min_null_of_col(i), result_sink->get_max_null_of_col(i), diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 8f6e4836ac7..e2c82554b73 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -151,9 +151,7 @@ public: virtual subs_type substype() { return UNKNOWN_SUBS; } bool is_in_predicate() { - return (substype() == Item_subselect::IN_SUBS || - substype() == Item_subselect::ALL_SUBS || - substype() == Item_subselect::ANY_SUBS); + return get_IN_subquery() != NULL; } /* @@ -416,7 +414,7 @@ public: void print(String *str, enum_query_type query_type); bool select_transformer(JOIN *join); void top_level_item() { abort_on_null=1; } - inline bool is_top_level_item() { return abort_on_null; } + bool is_top_level_item() const override { return abort_on_null; } bool exists2in_processor(void *opt_arg); Item* expr_cache_insert_transformer(THD *thd, uchar *unused); @@ -507,7 +505,6 @@ protected: bool create_row_in_to_exists_cond(JOIN * join, Item **where_item, Item **having_item); -public: Item *left_expr; /* Important for PS/SP: left_expr_orig is the item that left_expr originally @@ -515,6 +512,7 @@ public: left_expr could later be changed to something on the execution arena. */ Item *left_expr_orig; +public: /* Priority of this predicate in the convert-to-semi-join-nest process. */ int sj_convert_priority; /* May be TRUE only for the candidates to semi-join conversion */ @@ -752,6 +750,15 @@ public: bool pushdown_cond_for_in_subquery(THD *thd, Item *cond); + Item_in_subselect *get_IN_subquery() override + { return this; } + inline Item** left_exp_ptr() + { return &left_expr; } + inline Item* left_exp() const + { return left_expr; } + inline Item* left_exp_orig() const + { return left_expr_orig; } + friend class Item_ref_null_helper; friend class Item_is_not_null_test; friend class Item_in_optimizer; @@ -964,9 +971,9 @@ public: // constructor can assign THD because it will be called after JOIN::prepare subselect_uniquesubquery_engine(THD *thd_arg, st_join_table *tab_arg, - Item_subselect *subs, Item *where) + Item_in_subselect *subs, Item *where) :subselect_engine(subs, 0), tab(tab_arg), cond(where) - {} + { DBUG_ASSERT(subs); } ~subselect_uniquesubquery_engine(); void cleanup(); int prepare(THD *); @@ -1027,12 +1034,12 @@ public: // constructor can assign THD because it will be called after JOIN::prepare subselect_indexsubquery_engine(THD *thd_arg, st_join_table *tab_arg, - Item_subselect *subs, Item *where, + Item_in_subselect *subs, Item *where, Item *having_arg, bool chk_null) :subselect_uniquesubquery_engine(thd_arg, tab_arg, subs, where), check_null(chk_null), having(having_arg) - {} + { DBUG_ASSERT(subs); } int exec(); void print (String *str, enum_query_type query_type); virtual enum_engine_type engine_type() { return INDEXSUBQUERY_ENGINE; } @@ -1095,14 +1102,14 @@ public: Name_resolution_context *semi_join_conds_context; - subselect_hash_sj_engine(THD *thd_arg, Item_subselect *in_predicate, + subselect_hash_sj_engine(THD *thd_arg, Item_in_subselect *in_predicate, subselect_single_select_engine *old_engine) : subselect_engine(in_predicate, NULL), tmp_table(NULL), is_materialized(FALSE), materialize_engine(old_engine), materialize_join(NULL), semi_join_conds(NULL), lookup_engine(NULL), count_partial_match_columns(0), count_null_only_columns(0), count_columns_with_nulls(0), strategy(UNDEFINED) - {} + { DBUG_ASSERT(in_predicate); } ~subselect_hash_sj_engine(); bool init(List *tmp_columns, uint subquery_id); @@ -1410,7 +1417,7 @@ public: from Item_in_optimizer::val_int() sets Item_in_optimizer::null_value correctly. */ - return !(((Item_in_subselect *) item)->null_value); + return !(item->get_IN_subquery()->null_value); } void print(String*, enum_query_type); diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index 62f5964cd3c..343d12b0d60 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -592,10 +592,11 @@ int check_and_do_in_subquery_rewrites(JOIN *join) Item_subselect::subs_type substype= subselect->substype(); switch (substype) { case Item_subselect::IN_SUBS: - in_subs= (Item_in_subselect *)subselect; + in_subs= subselect->get_IN_subquery(); break; case Item_subselect::ALL_SUBS: case Item_subselect::ANY_SUBS: + DBUG_ASSERT(subselect->get_IN_subquery()); allany_subs= (Item_allany_subselect *)subselect; break; default: @@ -640,13 +641,15 @@ int check_and_do_in_subquery_rewrites(JOIN *join) char const *save_where= thd->where; thd->where= "IN/ALL/ANY subquery"; - bool failure= in_subs->left_expr->fix_fields_if_needed(thd, - &in_subs->left_expr); + Item **left= in_subs->left_exp_ptr(); + bool failure= (*left)->fix_fields_if_needed(thd, left); thd->lex->current_select= current; thd->where= save_where; if (failure) DBUG_RETURN(-1); /* purecov: deadcode */ + // fix_field above can rewrite left expression + uint ncols= (*left)->cols(); /* Check if the left and right expressions have the same # of columns, i.e. we don't have a case like @@ -655,9 +658,9 @@ int check_and_do_in_subquery_rewrites(JOIN *join) TODO why do we have this duplicated in IN->EXISTS transformers? psergey-todo: fix these: grep for duplicated_subselect_card_check */ - if (select_lex->item_list.elements != in_subs->left_expr->cols()) + if (select_lex->item_list.elements != ncols) { - my_error(ER_OPERAND_COLUMNS, MYF(0), in_subs->left_expr->cols()); + my_error(ER_OPERAND_COLUMNS, MYF(0), ncols); DBUG_RETURN(-1); } } @@ -847,9 +850,10 @@ int check_and_do_in_subquery_rewrites(JOIN *join) static bool subquery_types_allow_materialization(THD* thd, Item_in_subselect *in_subs) { + Item *left_exp= in_subs->left_exp(); DBUG_ENTER("subquery_types_allow_materialization"); - DBUG_ASSERT(in_subs->left_expr->is_fixed()); + DBUG_ASSERT(left_exp->is_fixed()); List_iterator it(in_subs->unit->first_select()->item_list); uint elements= in_subs->unit->first_select()->item_list.elements; @@ -871,7 +875,7 @@ bool subquery_types_allow_materialization(THD* thd, Item_in_subselect *in_subs) uint32 total_key_length = 0; for (uint i= 0; i < elements; i++) { - Item *outer= in_subs->left_expr->element_index(i); + Item *outer= left_exp->element_index(i); Item *inner= it++; all_are_fields &= (outer->real_item()->type() == Item::FIELD_ITEM && inner->real_item()->type() == Item::FIELD_ITEM); @@ -1706,7 +1710,7 @@ static bool convert_subq_to_sj(JOIN *parent_join, Item_in_subselect *subq_pred) sj_nest->alias= sj_nest_name; sj_nest->sj_subq_pred= subq_pred; sj_nest->original_subq_pred_used_tables= subq_pred->used_tables() | - subq_pred->left_expr->used_tables(); + subq_pred->left_exp()->used_tables(); /* Nests do not participate in those 'chains', so: */ /* sj_nest->next_leaf= sj_nest->next_local= sj_nest->next_global == NULL*/ emb_join_list->push_back(sj_nest, thd->mem_root); @@ -1794,14 +1798,17 @@ static bool convert_subq_to_sj(JOIN *parent_join, Item_in_subselect *subq_pred) */ SELECT_LEX *save_lex= thd->lex->current_select; thd->lex->current_select=subq_lex; - if (subq_pred->left_expr->fix_fields_if_needed(thd, &subq_pred->left_expr)) + Item **left= subq_pred->left_exp_ptr(); + if ((*left)->fix_fields_if_needed(thd, left)) DBUG_RETURN(TRUE); + Item *left_exp= *left; + Item *left_exp_orig= subq_pred->left_exp_orig(); thd->lex->current_select=save_lex; table_map subq_pred_used_tables= subq_pred->used_tables(); sj_nest->nested_join->sj_corr_tables= subq_pred_used_tables; sj_nest->nested_join->sj_depends_on= subq_pred_used_tables | - subq_pred->left_expr->used_tables(); + left_exp->used_tables(); sj_nest->sj_on_expr= subq_lex->join->conds; /* @@ -1819,14 +1826,14 @@ static bool convert_subq_to_sj(JOIN *parent_join, Item_in_subselect *subq_pred) Item_direct_view_refs doesn't substitute itself with anything in Item_direct_view_ref::fix_fields. */ - sj_nest->sj_in_exprs= subq_pred->left_expr->cols(); + uint ncols= sj_nest->sj_in_exprs= left_exp->cols(); sj_nest->nested_join->sj_outer_expr_list.empty(); reset_equality_number_for_subq_conds(sj_nest->sj_on_expr); - if (subq_pred->left_expr->cols() == 1) + if (ncols == 1) { /* add left = select_list_element */ - nested_join->sj_outer_expr_list.push_back(&subq_pred->left_expr, + nested_join->sj_outer_expr_list.push_back(left, thd->mem_root); /* Create Item_func_eq. Note that @@ -1838,36 +1845,36 @@ static bool convert_subq_to_sj(JOIN *parent_join, Item_in_subselect *subq_pred) with thd->change_item_tree */ Item_func_eq *item_eq= - new (thd->mem_root) Item_func_eq(thd, subq_pred->left_expr_orig, + new (thd->mem_root) Item_func_eq(thd, left_exp_orig, subq_lex->ref_pointer_array[0]); if (!item_eq) DBUG_RETURN(TRUE); - if (subq_pred->left_expr_orig != subq_pred->left_expr) - thd->change_item_tree(item_eq->arguments(), subq_pred->left_expr); + if (left_exp_orig != left_exp) + thd->change_item_tree(item_eq->arguments(), left_exp); item_eq->in_equality_no= 0; sj_nest->sj_on_expr= and_items(thd, sj_nest->sj_on_expr, item_eq); } - else if (subq_pred->left_expr->type() == Item::ROW_ITEM) + else if (left_exp->type() == Item::ROW_ITEM) { /* disassemple left expression and add left1 = select_list_element1 and left2 = select_list_element2 ... */ - for (uint i= 0; i < subq_pred->left_expr->cols(); i++) + for (uint i= 0; i < ncols; i++) { - nested_join->sj_outer_expr_list.push_back(subq_pred->left_expr->addr(i), + nested_join->sj_outer_expr_list.push_back(left_exp->addr(i), thd->mem_root); Item_func_eq *item_eq= new (thd->mem_root) - Item_func_eq(thd, subq_pred->left_expr_orig->element_index(i), + Item_func_eq(thd, left_exp_orig->element_index(i), subq_lex->ref_pointer_array[i]); if (!item_eq) DBUG_RETURN(TRUE); - DBUG_ASSERT(subq_pred->left_expr->element_index(i)->is_fixed()); - if (subq_pred->left_expr_orig->element_index(i) != - subq_pred->left_expr->element_index(i)) + DBUG_ASSERT(left_exp->element_index(i)->is_fixed()); + if (left_exp_orig->element_index(i) != + left_exp->element_index(i)) thd->change_item_tree(item_eq->arguments(), - subq_pred->left_expr->element_index(i)); + left_exp->element_index(i)); item_eq->in_equality_no= i; sj_nest->sj_on_expr= and_items(thd, sj_nest->sj_on_expr, item_eq); } @@ -1882,10 +1889,10 @@ static bool convert_subq_to_sj(JOIN *parent_join, Item_in_subselect *subq_pred) /* fix fields on subquery was call so they should be the same */ if (!row) DBUG_RETURN(TRUE); - DBUG_ASSERT(subq_pred->left_expr->cols() == row->cols()); - nested_join->sj_outer_expr_list.push_back(&subq_pred->left_expr); + DBUG_ASSERT(ncols == row->cols()); + nested_join->sj_outer_expr_list.push_back(left); Item_func_eq *item_eq= - new (thd->mem_root) Item_func_eq(thd, subq_pred->left_expr_orig, row); + new (thd->mem_root) Item_func_eq(thd, left_exp_orig, row); if (!item_eq) DBUG_RETURN(TRUE); for (uint i= 0; i < row->cols(); i++) @@ -4140,7 +4147,8 @@ bool setup_sj_materialization_part2(JOIN_TAB *sjm_tab) for (i= 0; i < tmp_key_parts; i++, cur_key_part++, ref_key++) { - tab_ref->items[i]= emb_sj_nest->sj_subq_pred->left_expr->element_index(i); + tab_ref->items[i]= + emb_sj_nest->sj_subq_pred->left_exp()->element_index(i); int null_count= MY_TEST(cur_key_part->field->real_maybe_null()); *ref_key= new store_key_item(thd, cur_key_part->field, /* TODO: @@ -4325,18 +4333,20 @@ static Item *create_subq_in_equalities(THD *thd, SJ_MATERIALIZATION_INFO *sjm, Item_in_subselect *subq_pred) { Item *res= NULL; - if (subq_pred->left_expr->cols() == 1) + Item *left_exp= subq_pred->left_exp(); + uint ncols= left_exp->cols(); + if (ncols == 1) { - if (!(res= new (thd->mem_root) Item_func_eq(thd, subq_pred->left_expr, + if (!(res= new (thd->mem_root) Item_func_eq(thd, left_exp, new (thd->mem_root) Item_field(thd, sjm->table->field[0])))) return NULL; /* purecov: inspected */ } else { Item *conj; - for (uint i= 0; i < subq_pred->left_expr->cols(); i++) + for (uint i= 0; i < ncols; i++) { - if (!(conj= new (thd->mem_root) Item_func_eq(thd, subq_pred->left_expr->element_index(i), + if (!(conj= new (thd->mem_root) Item_func_eq(thd, left_exp->element_index(i), new (thd->mem_root) Item_field(thd, sjm->table->field[i]))) || !(res= and_items(thd, res, conj))) return NULL; /* purecov: inspected */ @@ -5404,7 +5414,7 @@ int rewrite_to_index_subquery_engine(JOIN *join) change_engine(new subselect_uniquesubquery_engine(thd, join_tab, - unit->item, + unit->item->get_IN_subquery(), where))); } else if (join_tab[0].type == JT_REF && @@ -5418,7 +5428,7 @@ int rewrite_to_index_subquery_engine(JOIN *join) change_engine(new subselect_indexsubquery_engine(thd, join_tab, - unit->item, + unit->item->get_IN_subquery(), where, NULL, 0))); @@ -5434,7 +5444,7 @@ int rewrite_to_index_subquery_engine(JOIN *join) DBUG_RETURN(unit->item-> change_engine(new subselect_indexsubquery_engine(thd, join_tab, - unit->item, + unit->item->get_IN_subquery(), join->conds, join->having, 1))); @@ -6109,11 +6119,13 @@ bool execute_degenerate_jtbm_semi_join(THD *thd, subq_pred->jtbm_const_row_found= TRUE; Item *eq_cond; - for (uint i= 0; i < subq_pred->left_expr->cols(); i++) + Item *left_exp= subq_pred->left_exp(); + uint ncols= left_exp->cols(); + for (uint i= 0; i < ncols; i++) { eq_cond= new (thd->mem_root) Item_func_eq(thd, - subq_pred->left_expr->element_index(i), + left_exp->element_index(i), new_sink->row[i]); if (!eq_cond || eq_cond->fix_fields(thd, NULL) || eq_list.push_back(eq_cond, thd->mem_root)) @@ -6408,7 +6420,7 @@ bool JOIN::choose_subquery_plan(table_map join_tables) if (is_in_subquery()) { - in_subs= (Item_in_subselect*) unit->item; + in_subs= unit->item->get_IN_subquery(); if (in_subs->create_in_to_exists_cond(this)) return true; } @@ -6692,12 +6704,12 @@ bool JOIN::choose_tableless_subquery_plan() everything as-is, setup_jtbm_semi_joins() has special handling for cases like this. */ - if (subs_predicate->is_in_predicate() && - !(subs_predicate->substype() == Item_subselect::IN_SUBS && - ((Item_in_subselect*)subs_predicate)->is_jtbm_merged)) + Item_in_subselect *in_subs; + in_subs= subs_predicate->get_IN_subquery(); + if (in_subs && + !(subs_predicate->substype() == Item_subselect::IN_SUBS && + in_subs->is_jtbm_merged)) { - Item_in_subselect *in_subs; - in_subs= (Item_in_subselect*) subs_predicate; in_subs->set_strategy(SUBS_IN_TO_EXISTS); if (in_subs->create_in_to_exists_cond(this) || in_subs->inject_in_to_exists_cond(this)) @@ -6714,7 +6726,8 @@ bool Item::pushable_equality_checker_for_subquery(uchar *arg) { return get_corresponding_field_pair(this, - ((Item_in_subselect *)arg)->corresponding_fields); + ((Item *)arg)->get_IN_subquery()-> + corresponding_fields); } @@ -6853,7 +6866,7 @@ Item *get_corresponding_item(THD *thd, Item *item, Item *Item_field::in_subq_field_transformer_for_where(THD *thd, uchar *arg) { - Item_in_subselect *subq_pred= (Item_in_subselect *)arg; + Item_in_subselect *subq_pred= ((Item *)arg)->get_IN_subquery(); Item *producing_item= get_corresponding_item(thd, this, subq_pred); if (producing_item) return producing_item->build_clone(thd); @@ -6866,7 +6879,7 @@ Item *Item_direct_view_ref::in_subq_field_transformer_for_where(THD *thd, { if (item_equal) { - Item_in_subselect *subq_pred= (Item_in_subselect *)arg; + Item_in_subselect *subq_pred= ((Item *)arg)->get_IN_subquery(); Item *producing_item= get_corresponding_item(thd, this, subq_pred); DBUG_ASSERT (producing_item != NULL); return producing_item->build_clone(thd); @@ -6916,6 +6929,7 @@ get_corresponding_item_for_in_subq_having(THD *thd, Item *in_item, Item *Item_field::in_subq_field_transformer_for_having(THD *thd, uchar *arg) { + DBUG_ASSERT(((Item *)arg)->get_IN_subquery()); return get_corresponding_item_for_in_subq_having(thd, this, (Item_in_subselect *)arg); } @@ -6928,6 +6942,7 @@ Item *Item_direct_view_ref::in_subq_field_transformer_for_having(THD *thd, return this; else { + DBUG_ASSERT(((Item *)arg)->get_IN_subquery()); Item *new_item= get_corresponding_item_for_in_subq_having(thd, this, (Item_in_subselect *)arg); if (!new_item) diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 6d53a8ee6e3..c85c2b6449a 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -6328,10 +6328,11 @@ find_field_in_tables(THD *thd, Item_ident *item, for (SELECT_LEX *sl= current_sel; sl && sl!=last_select; sl=sl->outer_select()) { - Item *subs= sl->master_unit()->item; - if (subs->type() == Item::SUBSELECT_ITEM && - ((Item_subselect*)subs)->substype() == Item_subselect::IN_SUBS && - ((Item_in_subselect*)subs)->test_strategy(SUBS_SEMI_JOIN)) + Item_in_subselect *in_subs= + sl->master_unit()->item->get_IN_subquery(); + if (in_subs && + in_subs->substype() == Item_subselect::IN_SUBS && + in_subs->test_strategy(SUBS_SEMI_JOIN)) { continue; } @@ -8230,7 +8231,7 @@ bool setup_on_expr(THD *thd, TABLE_LIST *table, bool is_update) */ if (embedded->sj_subq_pred) { - Item **left_expr= &embedded->sj_subq_pred->left_expr; + Item **left_expr= embedded->sj_subq_pred->left_exp_ptr(); if ((*left_expr)->fix_fields_if_needed(thd, left_expr)) return TRUE; } diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index f39f88fe843..4cc93c31b38 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -4740,7 +4740,7 @@ bool st_select_lex::optimize_unflattened_subqueries(bool const_only) } if (subquery_predicate->substype() == Item_subselect::IN_SUBS) { - Item_in_subselect *in_subs= (Item_in_subselect*) subquery_predicate; + Item_in_subselect *in_subs= subquery_predicate->get_IN_subquery(); if (in_subs->is_jtbm_merged) continue; } @@ -5167,7 +5167,7 @@ void SELECT_LEX::update_used_tables() */ if (tl->jtbm_subselect) { - Item *left_expr= tl->jtbm_subselect->left_expr; + Item *left_expr= tl->jtbm_subselect->left_exp(); left_expr->walk(&Item::update_table_bitmaps_processor, FALSE, NULL); } @@ -5324,7 +5324,7 @@ void st_select_lex::set_explain_type(bool on_the_fly) if ((parent_item= master_unit()->item) && parent_item->substype() == Item_subselect::IN_SUBS) { - Item_in_subselect *in_subs= (Item_in_subselect*)parent_item; + Item_in_subselect *in_subs= parent_item->get_IN_subquery(); /* Surprisingly, in_subs->is_set_strategy() can return FALSE here, even for the last invocation of this function for the select. @@ -5613,9 +5613,10 @@ bool st_select_lex::is_merged_child_of(st_select_lex *ancestor) sl=sl->outer_select()) { Item *subs= sl->master_unit()->item; - if (subs && subs->type() == Item::SUBSELECT_ITEM && + Item_in_subselect *in_subs= (subs ? subs->get_IN_subquery() : NULL); + if (in_subs && ((Item_subselect*)subs)->substype() == Item_subselect::IN_SUBS && - ((Item_in_subselect*)subs)->test_strategy(SUBS_SEMI_JOIN)) + in_subs->test_strategy(SUBS_SEMI_JOIN)) { continue; } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index fc9fea42a99..36bf0dd5840 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1425,7 +1425,7 @@ JOIN::prepare(TABLE_LIST *tables_init, COND *conds_init, uint og_num, if (thd->variables.sql_mode & MODE_ONLY_FULL_GROUP_BY && !group_list && !(select_lex->master_unit()->item && select_lex->master_unit()->item->is_in_predicate() && - ((Item_in_subselect*)select_lex->master_unit()->item)-> + select_lex->master_unit()->item->get_IN_subquery()-> test_set_strategy(SUBS_MAXMIN_INJECTED)) && select_lex->non_agg_field_used() && select_lex->agg_func_used()) @@ -5046,7 +5046,7 @@ make_join_statistics(JOIN *join, List &tables_list, */ bool skip_unprefixed_keyparts= !(join->is_in_subquery() && - ((Item_in_subselect*)join->unit->item)->test_strategy(SUBS_IN_TO_EXISTS)); + join->unit->item->get_IN_subquery()->test_strategy(SUBS_IN_TO_EXISTS)); if (keyuse_array->elements && sort_and_filter_keyuse(thd, keyuse_array, @@ -5799,7 +5799,8 @@ static uint get_semi_join_select_list_index(Field *field) { Item_in_subselect *subq_pred= emb_sj_nest->sj_subq_pred; st_select_lex *subq_lex= subq_pred->unit->first_select(); - if (subq_pred->left_expr->cols() == 1) + uint ncols= subq_pred->left_exp()->cols(); + if (ncols == 1) { Item *sel_item= subq_lex->ref_pointer_array[0]; if (sel_item->type() == Item::FIELD_ITEM && @@ -5810,7 +5811,7 @@ static uint get_semi_join_select_list_index(Field *field) } else { - for (uint i= 0; i < subq_pred->left_expr->cols(); i++) + for (uint i= 0; i < ncols; i++) { Item *sel_item= subq_lex->ref_pointer_array[i]; if (sel_item->type() == Item::FIELD_ITEM && @@ -21290,7 +21291,7 @@ int join_read_key2(THD *thd, JOIN_TAB *tab, TABLE *table, TABLE_REF *table_ref) if (tab && tab->bush_children) { TABLE_LIST *emb_sj_nest= tab->bush_children->start->emb_sj_nest; - emb_sj_nest->sj_subq_pred->left_expr->bring_value(); + emb_sj_nest->sj_subq_pred->left_exp()->bring_value(); } /* TODO: Why don't we do "Late NULLs Filtering" here? */ From 3efdac2064c5ea5bd58538396d1a7a9fe6f498d1 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Wed, 29 Apr 2020 13:22:25 +1000 Subject: [PATCH 009/188] MDEV-22173: socket accept - test for failure accept might return an error, including SOCKET_EAGAIN/ SOCKET_EINTR. The caller, usually handle_connections_sockets can these however and invalid file descriptor isn't something to call fcntl on. Thanks to Etienne Guesnet (ATOS) for diagnosis, sample patch description and testing. --- include/mysql/psi/mysql_socket.h | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/include/mysql/psi/mysql_socket.h b/include/mysql/psi/mysql_socket.h index a7397795f77..2ab6932e396 100644 --- a/include/mysql/psi/mysql_socket.h +++ b/include/mysql/psi/mysql_socket.h @@ -1048,10 +1048,14 @@ inline_mysql_socket_accept #else socket_accept.fd= accept(socket_listen.fd, addr, &addr_length); #ifdef FD_CLOEXEC - flags= fcntl(socket_accept.fd, F_GETFD); - if (flags != -1) { - flags |= FD_CLOEXEC; - fcntl(socket_accept.fd, F_SETFD, flags); + if (socket_accept.fd != INVALID_SOCKET) + { + flags= fcntl(socket_accept.fd, F_GETFD); + if (flags != -1) + { + flags |= FD_CLOEXEC; + fcntl(socket_accept.fd, F_SETFD, flags); + } } #endif #endif @@ -1070,10 +1074,14 @@ inline_mysql_socket_accept #else socket_accept.fd= accept(socket_listen.fd, addr, &addr_length); #ifdef FD_CLOEXEC - flags= fcntl(socket_accept.fd, F_GETFD); - if (flags != -1) { - flags |= FD_CLOEXEC; - fcntl(socket_accept.fd, F_SETFD, flags); + if (socket_accept.fd != INVALID_SOCKET) + { + flags= fcntl(socket_accept.fd, F_GETFD); + if (flags != -1) + { + flags |= FD_CLOEXEC; + fcntl(socket_accept.fd, F_SETFD, flags); + } } #endif #endif From 6163af93975d4084580363321e5edfaebfb800cd Mon Sep 17 00:00:00 2001 From: Varun Gupta Date: Mon, 6 Jul 2020 16:29:09 +0530 Subject: [PATCH 010/188] MDEV-22390: Assertion `m_next_rec_ptr >= m_rawmem' failed in Filesort_buffer::spaceleft | SIGSEGV in __memmove_avx_unaligned_erms from my_b_write Make sure that the sort_buffer that is allocated has atleast space for MERGEBUFF2 keys. The issue here was that the record length is quite high and sort buffer size is very small, due to which we end up with zero number of keys in the sort buffer. The Sort_param::max_keys_per_buffer was zero in such a case, due to which we were flushing empty sort_buffer to the disk. --- mysql-test/r/order_by.result | 54 ++++++++++++++++++++++++++++++++++++ mysql-test/t/order_by.test | 22 +++++++++++++++ sql/filesort.cc | 3 +- sql/filesort_utils.cc | 1 - 4 files changed, 78 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/order_by.result b/mysql-test/r/order_by.result index d35012e0de5..ffb37c9309f 100644 --- a/mysql-test/r/order_by.result +++ b/mysql-test/r/order_by.result @@ -3302,3 +3302,57 @@ a b c SET @@sort_buffer_size= @save_sort_buffer_size; SET @@max_sort_length= @save_max_sort_length; DROP TABLE t1; +# +# MDEV-22390: Assertion `m_next_rec_ptr >= m_rawmem' failed in Filesort_buffer::spaceleft | +# SIGSEGV in __memmove_avx_unaligned_erms from my_b_write (on optimized) +# +SET @save_max_sort_length= @@max_sort_length; +SET @save_sort_buffer_size= @@sort_buffer_size; +SET @save_max_length_for_sort_data= @@max_length_for_sort_data; +SET max_sort_length=8; +SET sort_buffer_size=1024; +SET max_length_for_sort_data=7000; +CREATE TABLE t1(a VARCHAR(64), b VARCHAR(2048))DEFAULT CHARSET=utf8; +INSERT INTO t1 SELECT seq,seq from seq_1_to_100; +ANALYZE FORMAT=JSON SELECT * FROM t1 ORDER BY a LIMIT 5; +ANALYZE +{ + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "read_sorted_file": { + "r_rows": 5, + "filesort": { + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "r_limit": 5, + "r_used_priority_queue": false, + "r_output_rows": 35, + "r_sort_passes": 1, + "r_buffer_size": "REPLACED", + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 100, + "r_rows": 100, + "r_total_time_ms": "REPLACED", + "filtered": 100, + "r_filtered": 100 + } + } + } + } +} +SELECT * FROM t1 ORDER BY a LIMIT 5; +a b +1 1 +10 10 +100 100 +11 11 +12 12 +SET max_sort_length= @save_max_sort_length; +SET sort_buffer_size= @save_sort_buffer_size; +SET max_length_for_sort_data= @save_max_length_for_sort_data; +DROP TABLE t1; diff --git a/mysql-test/t/order_by.test b/mysql-test/t/order_by.test index 2fbacb10b68..3a30e0b6c76 100644 --- a/mysql-test/t/order_by.test +++ b/mysql-test/t/order_by.test @@ -2174,3 +2174,25 @@ SELECT * FROM t1 ORDER BY a,b; SET @@sort_buffer_size= @save_sort_buffer_size; SET @@max_sort_length= @save_max_sort_length; DROP TABLE t1; + +--echo # +--echo # MDEV-22390: Assertion `m_next_rec_ptr >= m_rawmem' failed in Filesort_buffer::spaceleft | +--echo # SIGSEGV in __memmove_avx_unaligned_erms from my_b_write (on optimized) +--echo # + +SET @save_max_sort_length= @@max_sort_length; +SET @save_sort_buffer_size= @@sort_buffer_size; +SET @save_max_length_for_sort_data= @@max_length_for_sort_data; +SET max_sort_length=8; +SET sort_buffer_size=1024; +# needed to make sure we use addon fields +SET max_length_for_sort_data=7000; +CREATE TABLE t1(a VARCHAR(64), b VARCHAR(2048))DEFAULT CHARSET=utf8; +INSERT INTO t1 SELECT seq,seq from seq_1_to_100; +--source include/analyze-format.inc +ANALYZE FORMAT=JSON SELECT * FROM t1 ORDER BY a LIMIT 5; +SELECT * FROM t1 ORDER BY a LIMIT 5; +SET max_sort_length= @save_max_sort_length; +SET sort_buffer_size= @save_sort_buffer_size; +SET max_length_for_sort_data= @save_max_length_for_sort_data; +DROP TABLE t1; diff --git a/sql/filesort.cc b/sql/filesort.cc index bb3e73343ad..90edd39b1da 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -256,7 +256,8 @@ ha_rows filesort(THD *thd, TABLE *table, SORT_FIELD *sortorder, uint s_length, while (memory_available >= min_sort_memory) { ulonglong keys= memory_available / (param.rec_length + sizeof(char*)); - param.max_keys_per_buffer= (uint) MY_MIN(num_rows, keys); + param.max_keys_per_buffer= MY_MAX(MERGEBUFF2, + (uint) MY_MIN(num_rows, keys)); if (table_sort.get_sort_keys()) { // If we have already allocated a buffer, it better have same size! diff --git a/sql/filesort_utils.cc b/sql/filesort_utils.cc index f1a164dd9fe..287edddf619 100644 --- a/sql/filesort_utils.cc +++ b/sql/filesort_utils.cc @@ -97,7 +97,6 @@ uchar **Filesort_buffer::alloc_sort_buffer(uint num_records, uint record_length) if (m_idx_array.is_null()) { sort_buff_sz= ((size_t)num_records) * (record_length + sizeof(uchar*)); - set_if_bigger(sort_buff_sz, record_length * MERGEBUFF2); uchar **sort_keys= (uchar**) my_malloc(sort_buff_sz, MYF(MY_THREAD_SPECIFIC)); m_idx_array= Idx_array(sort_keys, num_records); From cad9a9b1f8f09a3d7f4597bf1d68bd9c2e0c5879 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Mon, 6 Jul 2020 13:51:13 +0200 Subject: [PATCH 011/188] MDEV-23098 mariadb-upgrade-service.exe does not work on WAMPServer While trying to detect datadir, take into account that one can use Windows service name as section name in options file, for Windows service. The historical obscurity is being used by WAMP installations. --- sql/winservice.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/sql/winservice.c b/sql/winservice.c index fe1fb0cb2bb..7a7e7616e76 100644 --- a/sql/winservice.c +++ b/sql/winservice.c @@ -116,6 +116,23 @@ BOOL exclude_service(mysqld_service_properties *props) } +static void get_datadir_from_ini(const char *ini, char *service_name, char *datadir, size_t sz) +{ + *datadir= 0; + const char *sections[]= {service_name, "mysqld", "server", "mariadb", + "mariadbd"}; + for (int i= 0; i < sizeof(sections) / sizeof(sections[0]); i++) + { + if (sections[i]) + { + GetPrivateProfileStringA(sections[i], "datadir", NULL, datadir, sz, ini); + if (*datadir) + return; + } + } +} + + /* Retrieve some properties from windows mysqld service binary path. We're interested in ini file location and datadir, and also in version of @@ -135,6 +152,7 @@ int get_mysql_service_properties(const wchar_t *bin_path, wchar_t **args= NULL; int retval= 1; BOOL have_inifile; + char service_name[MAX_PATH]; props->datadir[0]= 0; props->inifile[0]= 0; @@ -148,7 +166,7 @@ int get_mysql_service_properties(const wchar_t *bin_path, { /* There are rare cases where service config does not have - --defaults-filein the binary parth . There services were registered with + --defaults-file in the binary parth . There services were registered with plain mysqld --install, the data directory is next to "bin" in this case. */ have_inifile= FALSE; @@ -162,6 +180,9 @@ int get_mysql_service_properties(const wchar_t *bin_path, goto end; } + /* Last parameter is the service name*/ + wcstombs(service_name, args[numargs-1], MAX_PATH); + if(have_inifile && wcsncmp(args[1], L"--defaults-file=", 16) != 0) goto end; @@ -193,8 +214,8 @@ int get_mysql_service_properties(const wchar_t *bin_path, normalize_path(props->inifile, MAX_PATH); if (GetFileAttributes(props->inifile) != INVALID_FILE_ATTRIBUTES) { - GetPrivateProfileString("mysqld", "datadir", NULL, props->datadir, MAX_PATH, - props->inifile); + get_datadir_from_ini(props->inifile, service_name, props->datadir, + sizeof(props->datadir)); } else { @@ -243,8 +264,8 @@ int get_mysql_service_properties(const wchar_t *bin_path, if (GetFileAttributes(props->inifile) != INVALID_FILE_ATTRIBUTES) { /* Ini file found, get datadir from there */ - GetPrivateProfileString("mysqld", "datadir", NULL, props->datadir, - MAX_PATH, props->inifile); + get_datadir_from_ini(props->inifile, service_name, props->datadir, + sizeof(props->datadir)); } else { From a53662555302f08dc7dfb89c6ad12863fbf4e8d7 Mon Sep 17 00:00:00 2001 From: Rucha Deodhar Date: Wed, 1 Jul 2020 14:11:31 +0530 Subject: [PATCH 012/188] MDEV-22654: Assertion `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())' failed in Diagnostics_area::set_ok_status on FUNCTION replace When there is REPLACE in the statement, sp_drop_routine_internal() returns 0 (SP_OK) on success which is then assigned to ret. So ret becomes false and the error state is lost. The expression inside DBUG_ASSERT() evaluates to false and thus the assertion failure. --- mysql-test/r/create_drop_function.result | 17 +++++++++++++++++ mysql-test/t/create_drop_function.test | 24 ++++++++++++++++++++++++ sql/sp.cc | 2 +- 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/create_drop_function.result b/mysql-test/r/create_drop_function.result index e9db636ab87..bdac57751b8 100644 --- a/mysql-test/r/create_drop_function.result +++ b/mysql-test/r/create_drop_function.result @@ -52,3 +52,20 @@ body DROP FUNCTION IF EXISTS f1; Warnings: Note 1305 FUNCTION test.f1 does not exist +# +# 10.1 Test +# +# MDEV-22654: Assertion `!is_set() || (m_status == DA_OK_BULK && +# is_bulk_op())' failed in Diagnostics_area::set_ok_status on FUNCTION replace +# +SET GLOBAL log_bin_trust_function_creators=0; +CREATE FUNCTION f(c INT) RETURNS NUMERIC NO SQL RETURN 0; +CREATE OR REPLACE FUNCTION f(c INT) RETURNS INT RETURN 0; +ERROR HY000: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable) +CREATE OR REPLACE FUNCTION sp1_thisisaveryverylongnamelongnameverylongname_thisisaveryverylongname234872934(a INT) RETURNS INT RETURN 0; +ERROR 42000: Identifier name 'sp1_thisisaveryverylongnamelongnameverylongname_thisisaveryverylongname234872934' is too long +DROP FUNCTION IF EXISTS f; +Warnings: +Note 1305 FUNCTION test.f does not exist +SET GLOBAL log_bin_trust_function_creators=1; +# End of 10.1 Test diff --git a/mysql-test/t/create_drop_function.test b/mysql-test/t/create_drop_function.test index e4d3d684cd5..3c4770e25e3 100644 --- a/mysql-test/t/create_drop_function.test +++ b/mysql-test/t/create_drop_function.test @@ -1,3 +1,5 @@ +source include/have_log_bin.inc; + SET timestamp=UNIX_TIMESTAMP('2014-09-30 08:00:00'); CREATE FUNCTION f1(str char(20)) @@ -39,3 +41,25 @@ DROP FUNCTION IF EXISTS f1; SELECT body FROM mysql.proc WHERE name like 'f1'; DROP FUNCTION IF EXISTS f1; +--echo # +--echo # 10.1 Test +--echo # +--echo # MDEV-22654: Assertion `!is_set() || (m_status == DA_OK_BULK && +--echo # is_bulk_op())' failed in Diagnostics_area::set_ok_status on FUNCTION replace +--echo # + +SET GLOBAL log_bin_trust_function_creators=0; + +CREATE FUNCTION f(c INT) RETURNS NUMERIC NO SQL RETURN 0; + +--error ER_BINLOG_UNSAFE_ROUTINE +CREATE OR REPLACE FUNCTION f(c INT) RETURNS INT RETURN 0; + +--error ER_TOO_LONG_IDENT +CREATE OR REPLACE FUNCTION sp1_thisisaveryverylongnamelongnameverylongname_thisisaveryverylongname234872934(a INT) RETURNS INT RETURN 0; + +DROP FUNCTION IF EXISTS f; + +SET GLOBAL log_bin_trust_function_creators=1; + +--echo # End of 10.1 Test diff --git a/sql/sp.cc b/sql/sp.cc index 1d340644ba1..b783ff3b583 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -1080,7 +1080,7 @@ sp_create_routine(THD *thd, stored_procedure_type type, sp_head *sp) { if (lex->create_info.or_replace()) { - if ((ret= sp_drop_routine_internal(thd, type, lex->spname, table))) + if (sp_drop_routine_internal(thd, type, lex->spname, table)) goto done; } else if (lex->create_info.if_not_exists()) From ee5841376aa4c1cbd9903a920310dc778d9a2d28 Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Mon, 6 Jul 2020 22:02:16 +0300 Subject: [PATCH 013/188] fix clang compilation --- sql/item_cmpfunc.h | 74 +++++++++++---------- sql/item_subselect.h | 149 ++++++++++++++++++++++--------------------- 2 files changed, 116 insertions(+), 107 deletions(-) diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 4b64ac82c72..b943bfc90da 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -367,36 +367,37 @@ public: Item_bool_func(thd, a, b), cache(0), expr_cache(0), save_cache(0), result_for_null_param(UNKNOWN) { m_with_subquery= true; } - bool fix_fields(THD *, Item **); + bool fix_fields(THD *, Item **) override; bool fix_left(THD *thd); - table_map not_null_tables() const { return 0; } - bool is_null(); - longlong val_int(); - void cleanup(); - enum Functype functype() const { return IN_OPTIMIZER_FUNC; } - const char *func_name() const { return ""; } + table_map not_null_tables() const override { return 0; } + bool is_null() override; + longlong val_int() override; + void cleanup() override; + enum Functype functype() const override { return IN_OPTIMIZER_FUNC; } + const char *func_name() const override { return ""; } Item_cache **get_cache() { return &cache; } void keep_top_level_cache(); - Item *transform(THD *thd, Item_transformer transformer, uchar *arg); - virtual Item *expr_cache_insert_transformer(THD *thd, uchar *unused); - bool is_expensive_processor(void *arg); - bool is_expensive(); - void set_join_tab_idx(uint join_tab_idx_arg) + Item *transform(THD *thd, Item_transformer transformer, uchar *arg) override; + Item *expr_cache_insert_transformer(THD *thd, uchar *unused) override; + bool is_expensive_processor(void *arg) override; + bool is_expensive() override; + void set_join_tab_idx(uint join_tab_idx_arg) override { args[1]->set_join_tab_idx(join_tab_idx_arg); } - virtual void get_cache_parameters(List ¶meters); + void get_cache_parameters(List ¶meters) override; bool is_top_level_item() const override; - bool eval_not_null_tables(void *opt_arg); - bool find_not_null_fields(table_map allowed); - void fix_after_pullout(st_select_lex *new_parent, Item **ref, bool merge); + bool eval_not_null_tables(void *opt_arg) override; + bool find_not_null_fields(table_map allowed) override; + void fix_after_pullout(st_select_lex *new_parent, Item **ref, + bool merge) override; bool invisible_mode(); void reset_cache() { cache= NULL; } - virtual void print(String *str, enum_query_type query_type); + void print(String *str, enum_query_type query_type) override; void restore_first_argument(); Item* get_wrapped_in_subselect_item() { return args[1]; } - Item *get_copy(THD *thd) + Item *get_copy(THD *thd) override { return get_item_copy(thd, this); } - enum precedence precedence() const { return args[1]->precedence(); } + enum precedence precedence() const override { return args[1]->precedence(); } }; @@ -601,17 +602,17 @@ class Item_func_not :public Item_bool_func public: Item_func_not(THD *thd, Item *a): Item_bool_func(thd, a), abort_on_null(FALSE) {} - virtual void top_level_item() { abort_on_null= 1; } + void top_level_item() override { abort_on_null= 1; } bool is_top_level_item() const override { return abort_on_null; } - longlong val_int(); - enum Functype functype() const { return NOT_FUNC; } - const char *func_name() const { return "not"; } - bool find_not_null_fields(table_map allowed) { return false; } - enum precedence precedence() const { return BANG_PRECEDENCE; } - Item *neg_transformer(THD *thd); - bool fix_fields(THD *, Item **); - virtual void print(String *str, enum_query_type query_type); - Item *get_copy(THD *thd) + longlong val_int() override; + enum Functype functype() const override { return NOT_FUNC; } + const char *func_name() const override { return "not"; } + bool find_not_null_fields(table_map allowed) override { return false; } + enum precedence precedence() const override { return BANG_PRECEDENCE; } + Item *neg_transformer(THD *thd) override; + bool fix_fields(THD *, Item **) override; + void print(String *str, enum_query_type query_type) override; + Item *get_copy(THD *thd) override { return get_item_copy(thd, this); } }; @@ -889,19 +890,22 @@ public: Item_func_opt_neg(THD *thd, List &list): Item_bool_func(thd, list), negated(0), pred_level(0) {} public: - inline void top_level_item() { pred_level= 1; } + void top_level_item() override { pred_level= 1; } bool is_top_level_item() const override { return pred_level; } - Item *neg_transformer(THD *thd) + Item *neg_transformer(THD *thd) override { negated= !negated; return this; } - bool eq(const Item *item, bool binary_cmp) const; - CHARSET_INFO *compare_collation() const { return cmp_collation.collation; } - Item* propagate_equal_fields(THD *, const Context &, COND_EQUAL *) = 0; + bool eq(const Item *item, bool binary_cmp) const override; + CHARSET_INFO *compare_collation() const override + { + return cmp_collation.collation; + } + Item *propagate_equal_fields(THD *, const Context &, + COND_EQUAL *) override= 0; }; - class Item_func_between :public Item_func_opt_neg { protected: diff --git a/sql/item_subselect.h b/sql/item_subselect.h index e2c82554b73..b4b278083fc 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -163,7 +163,7 @@ public: select_result_interceptor *result); ~Item_subselect(); - void cleanup(); + void cleanup() override; virtual void reset() { eliminated= FALSE; @@ -173,22 +173,23 @@ public: Set the subquery result to a default value consistent with the semantics of the result row produced for queries with implicit grouping. */ - void no_rows_in_result()= 0; + void no_rows_in_result() override= 0; virtual bool select_transformer(JOIN *join); bool assigned() { return value_assigned; } void assigned(bool a) { value_assigned= a; } - enum Type type() const; - bool is_null() + enum Type type() const override; + bool is_null() override { update_null_value(); return null_value; } - bool fix_fields(THD *thd, Item **ref); - bool with_subquery() const { DBUG_ASSERT(fixed); return true; } - bool with_sum_func() const { return m_with_sum_func; } - With_sum_func_cache* get_with_sum_func_cache() { return this; } + bool fix_fields(THD *thd, Item **ref) override; + bool with_subquery() const override { DBUG_ASSERT(fixed); return true; } + bool with_sum_func() const override { return m_with_sum_func; } + With_sum_func_cache* get_with_sum_func_cache() override { return this; } bool mark_as_dependent(THD *thd, st_select_lex *select, Item *item); - void fix_after_pullout(st_select_lex *new_parent, Item **ref, bool merge); + void fix_after_pullout(st_select_lex *new_parent, Item **ref, + bool merge) override; void recalc_used_tables(st_select_lex *new_parent, bool after_pullout); virtual bool exec(); /* @@ -202,13 +203,13 @@ public: forced_const= TRUE; } virtual bool fix_length_and_dec(); - table_map used_tables() const; - table_map not_null_tables() const { return 0; } - bool const_item() const; + table_map used_tables() const override; + table_map not_null_tables() const override { return 0; } + bool const_item() const override; inline table_map get_used_tables_cache() { return used_tables_cache; } - Item *get_tmp_table_item(THD *thd); - void update_used_tables(); - virtual void print(String *str, enum_query_type query_type); + Item *get_tmp_table_item(THD *thd) override; + void update_used_tables() override; + void print(String *str, enum_query_type query_type) override; virtual bool have_guarded_conds() { return FALSE; } bool change_engine(subselect_engine *eng) { @@ -223,7 +224,7 @@ public: */ bool is_evaluated() const; bool is_uncacheable() const; - bool is_expensive(); + bool is_expensive() override; /* Used by max/min subquery to initialize value presence registration @@ -231,13 +232,13 @@ public: */ virtual void reset_value_registration() {} enum_parsing_place place() { return parsing_place; } - bool walk(Item_processor processor, bool walk_subquery, void *arg); - bool unknown_splocal_processor(void *arg); - bool mark_as_eliminated_processor(void *arg); - bool eliminate_subselect_processor(void *arg); - bool set_fake_select_as_master_processor(void *arg); - bool enumerate_field_refs_processor(void *arg); - bool check_vcol_func_processor(void *arg) + bool walk(Item_processor processor, bool walk_subquery, void *arg) override; + bool unknown_splocal_processor(void *arg) override; + bool mark_as_eliminated_processor(void *arg) override; + bool eliminate_subselect_processor(void *arg) override; + bool set_fake_select_as_master_processor(void *arg) override; + bool enumerate_field_refs_processor(void *arg) override; + bool check_vcol_func_processor(void *arg) override { return mark_unsupported_function("select ...", arg, VCOL_IMPOSSIBLE); } @@ -250,27 +251,27 @@ public: @retval TRUE if the predicate is expensive @retval FALSE otherwise */ - bool is_expensive_processor(void *arg) { return is_expensive(); } + bool is_expensive_processor(void *arg) override { return is_expensive(); } /** Get the SELECT_LEX structure associated with this Item. @return the SELECT_LEX structure associated with this Item */ st_select_lex* get_select_lex(); - virtual bool expr_cache_is_needed(THD *); - virtual void get_cache_parameters(List ¶meters); - virtual bool is_subquery_processor (void *opt_arg) { return 1; } - bool exists2in_processor(void *opt_arg) { return 0; } - bool limit_index_condition_pushdown_processor(void *opt_arg) + bool expr_cache_is_needed(THD *) override; + void get_cache_parameters(List ¶meters) override; + bool is_subquery_processor (void *opt_arg) override { return 1; } + bool exists2in_processor(void *opt_arg) override { return 0; } + bool limit_index_condition_pushdown_processor(void *opt_arg) override { return TRUE; } void register_as_with_rec_ref(With_element *with_elem); void init_expr_cache_tracker(THD *thd); - - Item* build_clone(THD *thd) { return 0; } - Item* get_copy(THD *thd) { return 0; } + + Item* build_clone(THD *thd) override { return 0; } + Item* get_copy(THD *thd) override { return 0; } bool wrap_tvc_into_select(THD *thd, st_select_lex *tvc_sl); @@ -393,37 +394,40 @@ public: emb_on_expr_nest(NULL), optimizer(0), exists_transformed(0) {} - subs_type substype() { return EXISTS_SUBS; } - void reset() + subs_type substype() override { return EXISTS_SUBS; } + void reset() override { eliminated= FALSE; value= 0; } - void no_rows_in_result(); + void no_rows_in_result() override; - const Type_handler *type_handler() const { return &type_handler_bool; } - longlong val_int(); - double val_real(); - String *val_str(String*); - my_decimal *val_decimal(my_decimal *); - bool val_bool(); - bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) + const Type_handler *type_handler() const override + { + return &type_handler_bool; + } + longlong val_int() override; + double val_real() override; + String *val_str(String*) override; + my_decimal *val_decimal(my_decimal *) override; + bool val_bool() override; + bool get_date(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override { return get_date_from_int(thd, ltime, fuzzydate); } - bool fix_fields(THD *thd, Item **ref); - bool fix_length_and_dec(); - void print(String *str, enum_query_type query_type); - bool select_transformer(JOIN *join); - void top_level_item() { abort_on_null=1; } + bool fix_fields(THD *thd, Item **ref) override; + bool fix_length_and_dec() override; + void print(String *str, enum_query_type query_type) override; + bool select_transformer(JOIN *join) override; + void top_level_item() override { abort_on_null=1; } bool is_top_level_item() const override { return abort_on_null; } - bool exists2in_processor(void *opt_arg); + bool exists2in_processor(void *opt_arg) override; - Item* expr_cache_insert_transformer(THD *thd, uchar *unused); + Item* expr_cache_insert_transformer(THD *thd, uchar *unused) override; - void mark_as_condition_AND_part(TABLE_LIST *embedding) + void mark_as_condition_AND_part(TABLE_LIST *embedding) override { emb_on_expr_nest= embedding; } - virtual void under_not(Item_func_not *upper) { upper_not= upper; }; + void under_not(Item_func_not *upper) override { upper_not= upper; }; void set_exists_transformed() { exists_transformed= TRUE; } @@ -601,7 +605,7 @@ public: if ( pushed_cond_guards) pushed_cond_guards[i]= v; } - bool have_guarded_conds() { return MY_TEST(pushed_cond_guards); } + bool have_guarded_conds() override { return MY_TEST(pushed_cond_guards); } Item_func_not_all *upper_item; // point on NOT/NOP before ALL/SOME subquery @@ -611,41 +615,42 @@ public: in_strategy(SUBS_NOT_TRANSFORMED), pushed_cond_guards(NULL), func(NULL), do_not_convert_to_sj(FALSE), is_jtbm_merged(FALSE), is_jtbm_const_tab(FALSE), upper_item(0) {} - void cleanup(); - subs_type substype() { return IN_SUBS; } - void reset() + void cleanup() override; + subs_type substype() override { return IN_SUBS; } + void reset() override { eliminated= FALSE; value= 0; null_value= 0; was_null= 0; } - bool select_transformer(JOIN *join); + bool select_transformer(JOIN *join) override; bool create_in_to_exists_cond(JOIN *join_arg); bool inject_in_to_exists_cond(JOIN *join_arg); - virtual bool exec(); - longlong val_int(); - double val_real(); - String *val_str(String*); - my_decimal *val_decimal(my_decimal *); - bool val_bool(); + bool exec() override; + longlong val_int() override; + double val_real() override; + String *val_str(String*) override; + my_decimal *val_decimal(my_decimal *) override; + bool val_bool() override; bool test_limit(st_select_lex_unit *unit); - void print(String *str, enum_query_type query_type); - enum precedence precedence() const { return CMP_PRECEDENCE; } - bool fix_fields(THD *thd, Item **ref); - bool fix_length_and_dec(); - void fix_after_pullout(st_select_lex *new_parent, Item **ref, bool merge); - bool const_item() const + void print(String *str, enum_query_type query_type) override; + enum precedence precedence() const override { return CMP_PRECEDENCE; } + bool fix_fields(THD *thd, Item **ref) override; + bool fix_length_and_dec() override; + void fix_after_pullout(st_select_lex *new_parent, Item **ref, + bool merge) override; + bool const_item() const override { return Item_subselect::const_item() && left_expr->const_item(); } - void update_used_tables(); + void update_used_tables() override; bool setup_mat_engine(); bool init_left_expr_cache(); /* Inform 'this' that it was computed, and contains a valid result. */ void set_first_execution() { if (first_execution) first_execution= FALSE; } - bool expr_cache_is_needed(THD *thd); + bool expr_cache_is_needed(THD *thd) override; inline bool left_expr_has_null(); void disable_cond_guard_for_const_null_left_expr(int i) @@ -737,13 +742,13 @@ public: DBUG_VOID_RETURN; } - bool walk(Item_processor processor, bool walk_subquery, void *arg) + bool walk(Item_processor processor, bool walk_subquery, void *arg) override { return left_expr->walk(processor, walk_subquery, arg) || Item_subselect::walk(processor, walk_subquery, arg); } - bool exists2in_processor(void *opt_arg __attribute__((unused))) + bool exists2in_processor(void *opt_arg __attribute__((unused))) override { return 0; }; From 1ae008d272ad3f424fd3341c9b973e58531ca7e5 Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Fri, 3 Jul 2020 12:08:43 +0300 Subject: [PATCH 014/188] replace UT_LIST with ilist in rw_lock_list_t --- storage/innobase/handler/ha_innodb.cc | 20 +++++++++----------- storage/innobase/handler/i_s.cc | 22 ++++++++++------------ storage/innobase/include/sync0rw.h | 13 +++++-------- storage/innobase/sync/sync0debug.cc | 4 +--- storage/innobase/sync/sync0rw.cc | 18 ++++++++---------- storage/innobase/sync/sync0sync.cc | 7 ++----- 6 files changed, 35 insertions(+), 49 deletions(-) diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 858fefaf2de..4e84873fa23 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -16388,7 +16388,7 @@ innodb_show_rwlock_status( { DBUG_ENTER("innodb_show_rwlock_status"); - rw_lock_t* block_rwlock = NULL; + const rw_lock_t* block_rwlock= nullptr; ulint block_rwlock_oswait_count = 0; uint hton_name_len = (uint) strlen(innobase_hton_name); @@ -16396,36 +16396,34 @@ innodb_show_rwlock_status( mutex_enter(&rw_lock_list_mutex); - for (rw_lock_t* rw_lock = UT_LIST_GET_FIRST(rw_lock_list); - rw_lock != NULL; - rw_lock = UT_LIST_GET_NEXT(list, rw_lock)) { + for (const rw_lock_t& rw_lock : rw_lock_list) { - if (rw_lock->count_os_wait == 0) { + if (rw_lock.count_os_wait == 0) { continue; } int buf1len; char buf1[IO_SIZE]; - if (rw_lock->is_block_lock) { + if (rw_lock.is_block_lock) { - block_rwlock = rw_lock; - block_rwlock_oswait_count += rw_lock->count_os_wait; + block_rwlock = &rw_lock; + block_rwlock_oswait_count += rw_lock.count_os_wait; continue; } buf1len = snprintf( buf1, sizeof buf1, "rwlock: %s:%u", - innobase_basename(rw_lock->cfile_name), - rw_lock->cline); + innobase_basename(rw_lock.cfile_name), + rw_lock.cline); int buf2len; char buf2[IO_SIZE]; buf2len = snprintf( buf2, sizeof buf2, "waits=%u", - rw_lock->count_os_wait); + rw_lock.count_os_wait); if (stat_print(thd, innobase_hton_name, hton_name_len, diff --git a/storage/innobase/handler/i_s.cc b/storage/innobase/handler/i_s.cc index 0f1fe0bf814..ce984ee1d26 100644 --- a/storage/innobase/handler/i_s.cc +++ b/storage/innobase/handler/i_s.cc @@ -7165,9 +7165,8 @@ i_s_innodb_mutexes_fill_table( TABLE_LIST* tables, /*!< in/out: tables to fill */ Item* ) /*!< in: condition (not used) */ { - rw_lock_t* lock; ulint block_lock_oswait_count = 0; - rw_lock_t* block_lock = NULL; + const rw_lock_t* block_lock= nullptr; Field** fields = tables->table->field; DBUG_ENTER("i_s_innodb_mutexes_fill_table"); @@ -7210,32 +7209,31 @@ i_s_innodb_mutexes_fill_table( char lock_name[sizeof "buf0dump.cc:12345"]; - for (lock = UT_LIST_GET_FIRST(rw_lock_list); lock != NULL; - lock = UT_LIST_GET_NEXT(list, lock)) { - if (lock->count_os_wait == 0) { + for (const rw_lock_t& lock : rw_lock_list) { + if (lock.count_os_wait == 0) { continue; } - if (buf_pool.is_block_lock(lock)) { - block_lock = lock; - block_lock_oswait_count += lock->count_os_wait; + if (buf_pool.is_block_lock(&lock)) { + block_lock = &lock; + block_lock_oswait_count += lock.count_os_wait; continue; } const char* basename = innobase_basename( - lock->cfile_name); + lock.cfile_name); snprintf(lock_name, sizeof lock_name, "%s:%u", - basename, lock->cline); + basename, lock.cline); OK(field_store_string(fields[MUTEXES_NAME], lock_name)); OK(field_store_string(fields[MUTEXES_CREATE_FILE], basename)); - OK(fields[MUTEXES_CREATE_LINE]->store(lock->cline, + OK(fields[MUTEXES_CREATE_LINE]->store(lock.cline, true)); fields[MUTEXES_CREATE_LINE]->set_notnull(); - OK(fields[MUTEXES_OS_WAITS]->store(lock->count_os_wait, + OK(fields[MUTEXES_OS_WAITS]->store(lock.count_os_wait, true)); fields[MUTEXES_OS_WAITS]->set_notnull(); OK(schema_table_store_record(thd, tables->table)); diff --git a/storage/innobase/include/sync0rw.h b/storage/innobase/include/sync0rw.h index 84f4957c4f6..93c42b61132 100644 --- a/storage/innobase/include/sync0rw.h +++ b/storage/innobase/include/sync0rw.h @@ -36,6 +36,7 @@ Created 9/11/1995 Heikki Tuuri #include "os0event.h" #include "ut0mutex.h" +#include "ilist.h" /** Counters for RW locks. */ struct rw_lock_stats_t { @@ -105,9 +106,7 @@ struct rw_lock_t; struct rw_lock_debug_t; #endif /* UNIV_DEBUG */ -typedef UT_LIST_BASE_NODE_T(rw_lock_t) rw_lock_list_t; - -extern rw_lock_list_t rw_lock_list; +extern ilist rw_lock_list; extern ib_mutex_t rw_lock_list_mutex; /** Counters for RW locks. */ @@ -562,10 +561,11 @@ readers, a writer may queue for x-lock by decrementing lock_word: no new readers will be let in while the thread waits for readers to exit. */ -struct rw_lock_t +struct rw_lock_t : #ifdef UNIV_DEBUG - : public latch_t + public latch_t, #endif /* UNIV_DEBUG */ + public ilist_node<> { /** Holds the state of the lock. */ Atomic_relaxed lock_word; @@ -615,9 +615,6 @@ struct rw_lock_t /** Count of os_waits. May not be accurate */ uint32_t count_os_wait; - /** All allocated rw locks are put into a list */ - UT_LIST_NODE_T(rw_lock_t) list; - #ifdef UNIV_PFS_RWLOCK /** The instrumentation hook */ struct PSI_rwlock* pfs_psi; diff --git a/storage/innobase/sync/sync0debug.cc b/storage/innobase/sync/sync0debug.cc index 08f8baab101..c23e40c8379 100644 --- a/storage/innobase/sync/sync0debug.cc +++ b/storage/innobase/sync/sync0debug.cc @@ -1682,9 +1682,7 @@ sync_check_init() sync_latch_meta_init(); - /* Init the rw-lock & mutex list and create the mutex to protect it. */ - - UT_LIST_INIT(rw_lock_list, &rw_lock_t::list); + /* create the mutex to protect rw_lock list. */ mutex_create(LATCH_ID_RW_LOCK_LIST, &rw_lock_list_mutex); diff --git a/storage/innobase/sync/sync0rw.cc b/storage/innobase/sync/sync0rw.cc index 638896a9a86..db19323509f 100644 --- a/storage/innobase/sync/sync0rw.cc +++ b/storage/innobase/sync/sync0rw.cc @@ -141,7 +141,7 @@ wait_ex_event: A thread may only wait on the wait_ex_event after it has rw_lock_stats_t rw_lock_stats; /* The global list of rw-locks */ -rw_lock_list_t rw_lock_list; +ilist rw_lock_list; ib_mutex_t rw_lock_list_mutex; #ifdef UNIV_DEBUG @@ -235,7 +235,7 @@ rw_lock_create_func( lock->is_block_lock = 0; mutex_enter(&rw_lock_list_mutex); - UT_LIST_ADD_FIRST(rw_lock_list, lock); + rw_lock_list.push_front(*lock); mutex_exit(&rw_lock_list_mutex); } @@ -257,7 +257,7 @@ rw_lock_free_func( os_event_destroy(lock->wait_ex_event); - UT_LIST_REMOVE(rw_lock_list, lock); + rw_lock_list.remove(*lock); mutex_exit(&rw_lock_list_mutex); } @@ -1095,17 +1095,15 @@ rw_lock_list_print_info( "RW-LATCH INFO\n" "-------------\n", file); - for (const rw_lock_t* lock = UT_LIST_GET_FIRST(rw_lock_list); - lock != NULL; - lock = UT_LIST_GET_NEXT(list, lock)) { + for (const rw_lock_t& lock : rw_lock_list) { count++; - if (lock->lock_word != X_LOCK_DECR) { + if (lock.lock_word != X_LOCK_DECR) { - fprintf(file, "RW-LOCK: %p ", (void*) lock); + fprintf(file, "RW-LOCK: %p ", (void*) &lock); - if (int32_t waiters= lock->waiters) { + if (int32_t waiters= lock.waiters) { fprintf(file, " (%d waiters)\n", waiters); } else { putc('\n', file); @@ -1115,7 +1113,7 @@ rw_lock_list_print_info( rw_lock_debug_mutex_enter(); - for (info = UT_LIST_GET_FIRST(lock->debug_list); + for (info = UT_LIST_GET_FIRST(lock.debug_list); info != NULL; info = UT_LIST_GET_NEXT(list, info)) { diff --git a/storage/innobase/sync/sync0sync.cc b/storage/innobase/sync/sync0sync.cc index 8b81d8a5ff8..30f446fd7be 100644 --- a/storage/innobase/sync/sync0sync.cc +++ b/storage/innobase/sync/sync0sync.cc @@ -257,11 +257,8 @@ MutexMonitor::reset() mutex_enter(&rw_lock_list_mutex); - for (rw_lock_t* rw_lock = UT_LIST_GET_FIRST(rw_lock_list); - rw_lock != NULL; - rw_lock = UT_LIST_GET_NEXT(list, rw_lock)) { - - rw_lock->count_os_wait = 0; + for (rw_lock_t& rw_lock : rw_lock_list) { + rw_lock.count_os_wait = 0; } mutex_exit(&rw_lock_list_mutex); From 253aa7bbc4dda77427f6b1bf47620db36ada75b9 Mon Sep 17 00:00:00 2001 From: Varun Gupta Date: Tue, 7 Jul 2020 17:30:52 +0530 Subject: [PATCH 015/188] MDEV-12059: Assertion `precision > 0' failed with a window function or window aggregate function Pass the unsigned flag from the Item_sum to the window function --- mysql-test/r/win.result | 10 ++++++++++ mysql-test/t/win.test | 9 +++++++++ sql/item_windowfunc.h | 1 + 3 files changed, 20 insertions(+) diff --git a/mysql-test/r/win.result b/mysql-test/r/win.result index 9c85315b7c1..71953871295 100644 --- a/mysql-test/r/win.result +++ b/mysql-test/r/win.result @@ -3798,5 +3798,15 @@ SELECT FIRST_VALUE(MAX(a) OVER (PARTITION BY a)) OVER (ORDER BY a) AS x FROM t1 ERROR HY000: Window functions can not be used as arguments to group functions. DROP TABLE t1; # +# MDEV-12059: Assertion `precision > 0' failed with a window function or window aggregate function +# +CREATE TABLE t1 (d DECIMAL(1,0) UNSIGNED); +INSERT INTO t1 VALUES (1),(2); +SELECT MIN(d) OVER () FROM t1; +MIN(d) OVER () +1 +1 +DROP TABLE t1; +# # End of 10.2 tests # diff --git a/mysql-test/t/win.test b/mysql-test/t/win.test index d19ff2c624d..a768b893432 100644 --- a/mysql-test/t/win.test +++ b/mysql-test/t/win.test @@ -2472,6 +2472,15 @@ SELECT NTILE(MAX(a) OVER (PARTITION BY a)) OVER (PARTITION BY a ORDER BY b) FROM SELECT FIRST_VALUE(MAX(a) OVER (PARTITION BY a)) OVER (ORDER BY a) AS x FROM t1 GROUP BY a; DROP TABLE t1; +--echo # +--echo # MDEV-12059: Assertion `precision > 0' failed with a window function or window aggregate function +--echo # + +CREATE TABLE t1 (d DECIMAL(1,0) UNSIGNED); +INSERT INTO t1 VALUES (1),(2); +SELECT MIN(d) OVER () FROM t1; +DROP TABLE t1; + --echo # --echo # End of 10.2 tests --echo # diff --git a/sql/item_windowfunc.h b/sql/item_windowfunc.h index b9df1b7482b..85957949053 100644 --- a/sql/item_windowfunc.h +++ b/sql/item_windowfunc.h @@ -953,6 +953,7 @@ public: bool fix_length_and_dec() { decimals = window_func()->decimals; + unsigned_flag= window_func()->unsigned_flag; return FALSE; } From f18c5a7ed774228cee4fdeb4ed4b16b68ae9f4bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vicen=C8=9Biu=20Ciorbaru?= Date: Tue, 7 Jul 2020 17:58:24 +0300 Subject: [PATCH 016/188] MDEV-23114 AUTH_PAM plugin can not be disabled when using mysql_release config When setting the PLUGIN_AUTH_PAM variable, mark it as a "CACHE" variable so it can be overridden by the user. --- cmake/build_configurations/mysql_release.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/build_configurations/mysql_release.cmake b/cmake/build_configurations/mysql_release.cmake index 2a8461bf370..5af197c7f11 100644 --- a/cmake/build_configurations/mysql_release.cmake +++ b/cmake/build_configurations/mysql_release.cmake @@ -118,7 +118,7 @@ ENDIF() IF(UNIX) SET(WITH_EXTRA_CHARSETS all CACHE STRING "") - SET(PLUGIN_AUTH_PAM YES) + SET(PLUGIN_AUTH_PAM YES CACHE BOOL "") IF(CMAKE_SYSTEM_NAME STREQUAL "Linux") IF(NOT IGNORE_AIO_CHECK) From 0e86254b057d91e7532564ea0747224d0db4635b Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Mon, 6 Jul 2020 15:23:39 +0300 Subject: [PATCH 017/188] MDEV-22930 Unnecessary contention on rw_lock_list_mutex in ibuf_dummy_index_create() 1. Do not initialize dict_table_t::stats_latch in ibuf 2. Remove overengineering in GenericPolicy to speed up things dict_mem_table_create(): add new argument init_stats_latch ibuf_dummy_index_create(): do not initialize dict_table_t::stats_latch GenericPolicy: add new members m_filename and m_line sync_file_create_register() sync_file_created_deregister() sync_file_created_get() CreateTracker: remove rw_lock_t::created: a new debug member --- storage/innobase/dict/dict0mem.cc | 37 ++++-- storage/innobase/ibuf/ibuf0ibuf.cc | 2 +- storage/innobase/include/dict0mem.h | 31 ++--- storage/innobase/include/sync0policy.h | 15 ++- storage/innobase/include/sync0rw.h | 2 + storage/innobase/include/sync0types.h | 21 --- storage/innobase/sync/sync0debug.cc | 169 +------------------------ storage/innobase/sync/sync0rw.cc | 6 + 8 files changed, 61 insertions(+), 222 deletions(-) diff --git a/storage/innobase/dict/dict0mem.cc b/storage/innobase/dict/dict0mem.cc index 22a77a7a220..76b410f1f46 100644 --- a/storage/innobase/dict/dict0mem.cc +++ b/storage/innobase/dict/dict0mem.cc @@ -124,19 +124,25 @@ bool dict_col_t::same_encoding(uint16_t a, uint16_t b) return false; } -/**********************************************************************//** -Creates a table memory object. +/** Creates a table memory object. +@param[in] name table name +@param[in] space tablespace +@param[in] n_cols total number of columns including virtual and + non-virtual columns +@param[in] n_v_cols number of virtual columns +@param[in] flags table flags +@param[in] flags2 table flags2 +@param[in] init_stats_latch whether to init the stats latch @return own: table object */ dict_table_t* dict_mem_table_create( -/*==================*/ - const char* name, /*!< in: table name */ - fil_space_t* space, /*!< in: tablespace */ - ulint n_cols, /*!< in: total number of columns including - virtual and non-virtual columns */ - ulint n_v_cols,/*!< in: number of virtual columns */ - ulint flags, /*!< in: table flags */ - ulint flags2) /*!< in: table flags2 */ + const char* name, + fil_space_t* space, + ulint n_cols, + ulint n_v_cols, + ulint flags, + ulint flags2, + bool init_stats_latch) { dict_table_t* table; mem_heap_t* heap; @@ -204,8 +210,11 @@ dict_mem_table_create( new(&table->foreign_set) dict_foreign_set(); new(&table->referenced_set) dict_foreign_set(); - rw_lock_create(dict_table_stats_key, &table->stats_latch, - SYNC_INDEX_TREE); + if (init_stats_latch) { + rw_lock_create(dict_table_stats_key, &table->stats_latch, + SYNC_INDEX_TREE); + table->stats_latch_inited = true; + } return(table); } @@ -249,7 +258,9 @@ dict_mem_table_free( UT_DELETE(table->s_cols); - rw_lock_free(&table->stats_latch); + if (table->stats_latch_inited) { + rw_lock_free(&table->stats_latch); + } mem_heap_free(table->heap); } diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc index 9ae9eb6580c..a3ed5b104c6 100644 --- a/storage/innobase/ibuf/ibuf0ibuf.cc +++ b/storage/innobase/ibuf/ibuf0ibuf.cc @@ -1309,7 +1309,7 @@ ibuf_dummy_index_create( dict_index_t* index; table = dict_mem_table_create("IBUF_DUMMY", NULL, n, 0, - comp ? DICT_TF_COMPACT : 0, 0); + comp ? DICT_TF_COMPACT : 0, 0, false); index = dict_mem_index_create(table, "IBUF_DUMMY", 0, n); diff --git a/storage/innobase/include/dict0mem.h b/storage/innobase/include/dict0mem.h index 694c7081574..5baacbfb657 100644 --- a/storage/innobase/include/dict0mem.h +++ b/storage/innobase/include/dict0mem.h @@ -297,22 +297,21 @@ parent table will fail, and user has to drop excessive foreign constraint before proceeds. */ #define FK_MAX_CASCADE_DEL 15 -/**********************************************************************//** -Creates a table memory object. +/** Creates a table memory object. +@param[in] name table name +@param[in] space tablespace +@param[in] n_cols total number of columns including virtual and + non-virtual columns +@param[in] n_v_cols number of virtual columns +@param[in] flags table flags +@param[in] flags2 table flags2 +@param[in] init_stats_latch whether to init the stats latch @return own: table object */ -dict_table_t* -dict_mem_table_create( -/*==================*/ - const char* name, /*!< in: table name */ - fil_space_t* space, /*!< in: tablespace */ - ulint n_cols, /*!< in: total number of columns - including virtual and non-virtual - columns */ - ulint n_v_cols, /*!< in: number of virtual columns */ - ulint flags, /*!< in: table flags */ - ulint flags2); /*!< in: table flags2 */ -/****************************************************************//** -Free a table memory object. */ +dict_table_t *dict_mem_table_create(const char *name, fil_space_t *space, + ulint n_cols, ulint n_v_cols, ulint flags, + ulint flags2, bool init_stats_latch= true); +/****************************************************************/ /** + Free a table memory object. */ void dict_mem_table_free( /*================*/ @@ -2146,6 +2145,8 @@ public: performance reasons. */ rw_lock_t stats_latch; + bool stats_latch_inited= false; + /** TRUE if statistics have been calculated the first time after database startup or table creation. */ unsigned stat_initialized:1; diff --git a/storage/innobase/include/sync0policy.h b/storage/innobase/include/sync0policy.h index 4fd03eaea06..68397827891 100644 --- a/storage/innobase/include/sync0policy.h +++ b/storage/innobase/include/sync0policy.h @@ -220,7 +220,8 @@ public: meta.get_counter()->single_register(&m_count); - sync_file_created_register(this, filename, uint16_t(line)); + m_filename = filename; + m_line = line; } /** Called when the mutex is destroyed. */ @@ -230,8 +231,6 @@ public: latch_meta_t& meta = sync_latch_get_meta(m_id); meta.get_counter()->single_deregister(&m_count); - - sync_file_created_deregister(this); } /** Called after a successful mutex acquire. @@ -272,13 +271,21 @@ public: /** @return the string representation */ std::string to_string() const - { return sync_mutex_to_string(get_id(), sync_file_created_get(this)); } + { + return sync_mutex_to_string(get_id(), + std::string(m_filename) + .append(":") + .append(std::to_string(m_line))); + } #ifdef UNIV_DEBUG MutexDebug context; #endif private: + const char *m_filename; + uint32_t m_line; + /** The user visible counters, registered with the meta-data. */ latch_meta_t::CounterType::Count m_count; diff --git a/storage/innobase/include/sync0rw.h b/storage/innobase/include/sync0rw.h index 93c42b61132..e7bf694a4cc 100644 --- a/storage/innobase/include/sync0rw.h +++ b/storage/innobase/include/sync0rw.h @@ -567,6 +567,8 @@ struct rw_lock_t : #endif /* UNIV_DEBUG */ public ilist_node<> { + ut_d(bool created= false;) + /** Holds the state of the lock. */ Atomic_relaxed lock_word; diff --git a/storage/innobase/include/sync0types.h b/storage/innobase/include/sync0types.h index 0aa1326509e..5d2edb6d90e 100644 --- a/storage/innobase/include/sync0types.h +++ b/storage/innobase/include/sync0types.h @@ -941,27 +941,6 @@ sync_latch_get_name(latch_level_t level); const char* sync_basename(const char* filename); -/** Register a latch, called when it is created -@param[in] ptr Latch instance that was created -@param[in] filename Filename where it was created -@param[in] line Line number in filename */ -void -sync_file_created_register( - const void* ptr, - const char* filename, - uint16_t line); - -/** Deregister a latch, called when it is destroyed -@param[in] ptr Latch to be destroyed */ -void -sync_file_created_deregister(const void* ptr); - -/** Get the string where the file was created. Its format is "name:line" -@param[in] ptr Latch instance -@return created information or "" if can't be found */ -std::string -sync_file_created_get(const void* ptr); - #ifdef UNIV_DEBUG /** All (ordered) latches, used in debugging, must derive from this class. */ diff --git a/storage/innobase/sync/sync0debug.cc b/storage/innobase/sync/sync0debug.cc index c23e40c8379..a39062908e2 100644 --- a/storage/innobase/sync/sync0debug.cc +++ b/storage/innobase/sync/sync0debug.cc @@ -38,7 +38,7 @@ Created 2012-08-21 Sunny Bains #include #include #include -#include +#include #ifdef UNIV_DEBUG @@ -1506,173 +1506,6 @@ sync_latch_meta_destroy() latch_meta.clear(); } -/** Track mutex file creation name and line number. This is to avoid storing -{ const char* name; uint16_t line; } in every instance. This results in the -sizeof(Mutex) > 64. We use a lookup table to store it separately. Fetching -the values is very rare, only required for diagnostic purposes. And, we -don't create/destroy mutexes that frequently. */ -struct CreateTracker { - - /** Constructor */ - CreateTracker() - UNIV_NOTHROW - { - m_mutex.init(); - } - - /** Destructor */ - ~CreateTracker() - UNIV_NOTHROW - { - ut_ad(m_files.empty()); - - m_mutex.destroy(); - } - - /** Register where the latch was created - @param[in] ptr Latch instance - @param[in] filename Where created - @param[in] line Line number in filename */ - void register_latch( - const void* ptr, - const char* filename, - uint16_t line) - UNIV_NOTHROW - { - m_mutex.enter(); - - Files::iterator lb = m_files.lower_bound(ptr); - - ut_ad(lb == m_files.end() - || m_files.key_comp()(ptr, lb->first)); - - typedef Files::value_type value_type; - - m_files.insert(lb, value_type(ptr, File(filename, line))); - - m_mutex.exit(); - } - - /** Deregister a latch - when it is destroyed - @param[in] ptr Latch instance being destroyed */ - void deregister_latch(const void* ptr) - UNIV_NOTHROW - { - m_mutex.enter(); - - Files::iterator lb = m_files.lower_bound(ptr); - - ut_ad(lb != m_files.end() - && !(m_files.key_comp()(ptr, lb->first))); - - m_files.erase(lb); - - m_mutex.exit(); - } - - /** Get the create string, format is "name:line" - @param[in] ptr Latch instance - @return the create string or "" if not found */ - std::string get(const void* ptr) - UNIV_NOTHROW - { - m_mutex.enter(); - - std::string created; - - Files::iterator lb = m_files.lower_bound(ptr); - - if (lb != m_files.end() - && !(m_files.key_comp()(ptr, lb->first))) { - - std::ostringstream msg; - - msg << lb->second.m_name << ":" << lb->second.m_line; - - created = msg.str(); - } - - m_mutex.exit(); - - return(created); - } - -private: - /** For tracking the filename and line number */ - struct File { - - /** Constructor */ - File() UNIV_NOTHROW : m_name(), m_line() { } - - /** Constructor - @param[in] name Filename where created - @param[in] line Line number where created */ - File(const char* name, uint16_t line) - UNIV_NOTHROW - : - m_name(sync_basename(name)), - m_line(line) - { - /* No op */ - } - - /** Filename where created */ - std::string m_name; - - /** Line number where created */ - uint16_t m_line; - }; - - /** Map the mutex instance to where it was created */ - typedef std::map< - const void*, - File, - std::less, - ut_allocator > > - Files; - - typedef OSMutex Mutex; - - /** Mutex protecting m_files */ - Mutex m_mutex; - - /** Track the latch creation */ - Files m_files; -}; - -/** Track latch creation location. For reducing the size of the latches */ -static CreateTracker create_tracker; - -/** Register a latch, called when it is created -@param[in] ptr Latch instance that was created -@param[in] filename Filename where it was created -@param[in] line Line number in filename */ -void -sync_file_created_register( - const void* ptr, - const char* filename, - uint16_t line) -{ - create_tracker.register_latch(ptr, filename, line); -} - -/** Deregister a latch, called when it is destroyed -@param[in] ptr Latch to be destroyed */ -void -sync_file_created_deregister(const void* ptr) -{ - create_tracker.deregister_latch(ptr); -} - -/** Get the string where the file was created. Its format is "name:line" -@param[in] ptr Latch instance -@return created information or "" if can't be found */ -std::string -sync_file_created_get(const void* ptr) -{ - return(create_tracker.get(ptr)); -} - /** Initializes the synchronization data structures. */ void sync_check_init() diff --git a/storage/innobase/sync/sync0rw.cc b/storage/innobase/sync/sync0rw.cc index db19323509f..b86e11900b8 100644 --- a/storage/innobase/sync/sync0rw.cc +++ b/storage/innobase/sync/sync0rw.cc @@ -234,6 +234,8 @@ rw_lock_create_func( lock->is_block_lock = 0; + ut_d(lock->created = true); + mutex_enter(&rw_lock_list_mutex); rw_lock_list.push_front(*lock); mutex_exit(&rw_lock_list_mutex); @@ -251,6 +253,8 @@ rw_lock_free_func( ut_ad(rw_lock_validate(lock)); ut_a(lock->lock_word == X_LOCK_DECR); + ut_d(lock->created = false); + mutex_enter(&rw_lock_list_mutex); os_event_destroy(lock->event); @@ -850,6 +854,8 @@ rw_lock_validate( { ut_ad(lock); + ut_ad(lock->created); + int32_t lock_word = lock->lock_word; ut_ad(lock->waiters < 2); From 55c7536a0268f65d8ffcdb9399795679eaf0ddaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Thu, 25 Jun 2020 21:59:13 +0300 Subject: [PATCH 018/188] Add man page for new command aria_s3_copy Based on output of 'aria_s3_copy --help'. Also fix a typo in command help. --- debian/mariadb-plugin-s3.install | 1 + man/CMakeLists.txt | 1 + man/aria_s3_copy.1 | 52 ++++++++++++++++++++++++++++++++ storage/maria/aria_s3_copy.cc | 2 +- 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 man/aria_s3_copy.1 diff --git a/debian/mariadb-plugin-s3.install b/debian/mariadb-plugin-s3.install index a6f90b76f82..b951e49dd0b 100644 --- a/debian/mariadb-plugin-s3.install +++ b/debian/mariadb-plugin-s3.install @@ -1,3 +1,4 @@ etc/mysql/mariadb.conf.d/s3.cnf usr/bin/aria_s3_copy usr/lib/mysql/plugin/ha_s3.so +usr/share/man/man1/aria_s3_copy.1 diff --git a/man/CMakeLists.txt b/man/CMakeLists.txt index 4faaf062666..6c5fe2c2050 100644 --- a/man/CMakeLists.txt +++ b/man/CMakeLists.txt @@ -15,6 +15,7 @@ SET(MAN1_SERVER innochecksum.1 my_print_defaults.1 myisam_ftdump.1 myisamchk.1 aria_chk.1 aria_dump_log.1 aria_ftdump.1 aria_pack.1 aria_read_log.1 + aria_s3_copy.1 myisamlog.1 myisampack.1 mysql.server.1 mariadb-conv.1 mysql_convert_table_format.1 mysql_fix_extensions.1 mysql_install_db.1 diff --git a/man/aria_s3_copy.1 b/man/aria_s3_copy.1 new file mode 100644 index 00000000000..5844d5a76f0 --- /dev/null +++ b/man/aria_s3_copy.1 @@ -0,0 +1,52 @@ +.TH ARIA_S3_COPY "1" "June 2020" "aria_s3_copy Ver 1.0" "User Commands" +.SH NAME +aria_s3_copy \- Copy an Aria table to and from s3 +.SH DESCRIPTION +Usage: aria_s3_copy \-\-aws\-access\-key=# \-\-aws\-secret\-access\-key=# \-\-aws\-region=# \-\-op=(from_s3 | to_s3 | delete_from_s3) [OPTIONS] tables[.MAI] +.TP +\fB\-?\fR, \fB\-h\fR, \fB\-\-help\fR +Display help and exit. +.TP +\fB\-k\fR, \fB\-\-s3\-access\-key=name\fR +AWS access key ID +.TP +\fB\-r\fR, \fB\-s3\-region=name\fR +AWS region +.TP +\fB\-K\fR, \fB\-s3\-secret\-key=name\fR +AWS secret access key ID +.TP +\fB\-b\fR, \fB\-s3\-bucket=name\fR +AWS prefix for tables +.TP +\fB\-h\fR, \fB\-s3\-host\-name=name\fR +Host name to S3 provider +.TP +\fB\-c\fR, \fB\-compress\fR +Use compression +.TP +\fB\-o\fR, \fB\-op=name\fR +Operation to execute. One of 'from_s3', 'to_s3' or 'delete_from_s3' +.TP +\fB\-d\fR, \fB\-database=name\fR +Database for copied table (second prefix). If not given, the directory of the table file is used +.TP +\fB\-B\fR, \fB\-s3\-block\-size=#\fR +Block size for data/index blocks in s3 +.TP +\fB\-L\fR, \fB\-s3\-protocol\-version=name\fR +Protocol used to communication with S3. One of "Auto", "Amazon" or "Original". +.TP +\fB\-f\fR, \fB\-force\fR +Force copy even if target exists +.TP +\fB\-V\fR, \fB\-version\fR +Print version and exit. +.TP +\fB\-\-s3\-debug\fR +Output debug log from marias3 to stdout +.TP +\fB\-v\fR, \fB\-\-verbose\fR +Be verbose. +.PP +For more information, please refer to the MariaDB Knowledge Base page https://mariadb.com/kb/en/aria_s3_copy/ diff --git a/storage/maria/aria_s3_copy.cc b/storage/maria/aria_s3_copy.cc index 2eac95ab9de..734c99eac3b 100644 --- a/storage/maria/aria_s3_copy.cc +++ b/storage/maria/aria_s3_copy.cc @@ -67,7 +67,7 @@ static struct my_option my_long_options[] = GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, {"compress", 'c', "Use compression", &opt_compression, &opt_compression, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, - {"op", 'o', "Operation to excecute. One of 'from_s3', 'to_s3' or " + {"op", 'o', "Operation to execute. One of 'from_s3', 'to_s3' or " "'delete_from_s3'", &opt_operation, &opt_operation, &op_typelib, GET_ENUM, REQUIRED_ARG, OP_IMPOSSIBLE, 0, 0, 0, 0, 0}, From 0d6d801e5886208b2632247d88da106a543e1032 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Wed, 8 Jul 2020 13:10:07 +0200 Subject: [PATCH 019/188] MDEV-23102 10.4 create mariadb.sys user on each update even is the user is not needed Check if we really need the mariadb.sys user --- mysql-test/main/upgrade_MDEV-19650.test | 4 +- mysql-test/main/upgrade_MDEV-23102-1.result | 286 ++++++++++++++++++++ mysql-test/main/upgrade_MDEV-23102-1.test | 163 +++++++++++ mysql-test/main/upgrade_MDEV-23102-2.result | 262 ++++++++++++++++++ mysql-test/main/upgrade_MDEV-23102-2.test | 141 ++++++++++ scripts/mysql_system_tables.sql | 10 +- 6 files changed, 862 insertions(+), 4 deletions(-) create mode 100644 mysql-test/main/upgrade_MDEV-23102-1.result create mode 100644 mysql-test/main/upgrade_MDEV-23102-1.test create mode 100644 mysql-test/main/upgrade_MDEV-23102-2.result create mode 100644 mysql-test/main/upgrade_MDEV-23102-2.test diff --git a/mysql-test/main/upgrade_MDEV-19650.test b/mysql-test/main/upgrade_MDEV-19650.test index 89cbfc8c7aa..a2f9fee705f 100644 --- a/mysql-test/main/upgrade_MDEV-19650.test +++ b/mysql-test/main/upgrade_MDEV-19650.test @@ -70,11 +70,11 @@ CREATE DEFINER='root'@'localhost' SQL SECURITY DEFINER VIEW IF NOT EXISTS user A SET sql_mode=''; -delimiter |; - DROP PROCEDURE IF EXISTS mysql.AddGeometryColumn; DROP PROCEDURE IF EXISTS mysql.DropGeometryColumn; +delimiter |; + CREATE DEFINER=`root`@`localhost` PROCEDURE AddGeometryColumn(catalog varchar(64), t_schema varchar(64), t_name varchar(64), geometry_column varchar(64), t_srid int) SQL SECURITY INVOKER begin diff --git a/mysql-test/main/upgrade_MDEV-23102-1.result b/mysql-test/main/upgrade_MDEV-23102-1.result new file mode 100644 index 00000000000..8caa49180ee --- /dev/null +++ b/mysql-test/main/upgrade_MDEV-23102-1.result @@ -0,0 +1,286 @@ +# +# MDEV-23102: 10.4 create mariadb.sys user on each update even +# is the user is not needed +# +# part 1: reassigning mysql.user and gis procedures to other user +call mtr.add_suppression("Cannot load from mysql.proc. The table is probably corrupted"); +create database mysqltest1; +use mysqltest1; +create table save_global_priv as select * from mysql.global_priv; +create table save_tables_priv as select * from mysql.tables_priv; +create table save_proxies_priv as select * from mysql.proxies_priv; +create table mysql.save_proc like mysql.proc; +insert into mysql.save_proc select * from mysql.proc; +set @save_sql_mode= @@sql_mode; +use mysql; +# make changed definition of gis procedures and user view +create user superuser@localhost; +grant all privileges on mysql.* to superuser@localhost; +drop view user; +CREATE DEFINER='superuser'@'localhost' SQL SECURITY DEFINER VIEW IF NOT EXISTS user AS SELECT +Host, +User, +IF(JSON_VALUE(Priv, '$.plugin') IN ('mysql_native_password', 'mysql_old_password'), IFNULL(JSON_VALUE(Priv, '$.authentication_string'), ''), '') AS Password, +IF(JSON_VALUE(Priv, '$.access') & 1, 'Y', 'N') AS Select_priv, +IF(JSON_VALUE(Priv, '$.access') & 2, 'Y', 'N') AS Insert_priv, +IF(JSON_VALUE(Priv, '$.access') & 4, 'Y', 'N') AS Update_priv, +IF(JSON_VALUE(Priv, '$.access') & 8, 'Y', 'N') AS Delete_priv, +IF(JSON_VALUE(Priv, '$.access') & 16, 'Y', 'N') AS Create_priv, +IF(JSON_VALUE(Priv, '$.access') & 32, 'Y', 'N') AS Drop_priv, +IF(JSON_VALUE(Priv, '$.access') & 64, 'Y', 'N') AS Reload_priv, +IF(JSON_VALUE(Priv, '$.access') & 128, 'Y', 'N') AS Shutdown_priv, +IF(JSON_VALUE(Priv, '$.access') & 256, 'Y', 'N') AS Process_priv, +IF(JSON_VALUE(Priv, '$.access') & 512, 'Y', 'N') AS File_priv, +IF(JSON_VALUE(Priv, '$.access') & 1024, 'Y', 'N') AS Grant_priv, +IF(JSON_VALUE(Priv, '$.access') & 2048, 'Y', 'N') AS References_priv, +IF(JSON_VALUE(Priv, '$.access') & 4096, 'Y', 'N') AS Index_priv, +IF(JSON_VALUE(Priv, '$.access') & 8192, 'Y', 'N') AS Alter_priv, +IF(JSON_VALUE(Priv, '$.access') & 16384, 'Y', 'N') AS Show_db_priv, +IF(JSON_VALUE(Priv, '$.access') & 32768, 'Y', 'N') AS Super_priv, +IF(JSON_VALUE(Priv, '$.access') & 65536, 'Y', 'N') AS Create_tmp_table_priv, +IF(JSON_VALUE(Priv, '$.access') & 131072, 'Y', 'N') AS Lock_tables_priv, +IF(JSON_VALUE(Priv, '$.access') & 262144, 'Y', 'N') AS Execute_priv, +IF(JSON_VALUE(Priv, '$.access') & 524288, 'Y', 'N') AS Repl_slave_priv, +IF(JSON_VALUE(Priv, '$.access') & 1048576, 'Y', 'N') AS Repl_client_priv, +IF(JSON_VALUE(Priv, '$.access') & 2097152, 'Y', 'N') AS Create_view_priv, +IF(JSON_VALUE(Priv, '$.access') & 4194304, 'Y', 'N') AS Show_view_priv, +IF(JSON_VALUE(Priv, '$.access') & 8388608, 'Y', 'N') AS Create_routine_priv, +IF(JSON_VALUE(Priv, '$.access') & 16777216, 'Y', 'N') AS Alter_routine_priv, +IF(JSON_VALUE(Priv, '$.access') & 33554432, 'Y', 'N') AS Create_user_priv, +IF(JSON_VALUE(Priv, '$.access') & 67108864, 'Y', 'N') AS Event_priv, +IF(JSON_VALUE(Priv, '$.access') & 134217728, 'Y', 'N') AS Trigger_priv, +IF(JSON_VALUE(Priv, '$.access') & 268435456, 'Y', 'N') AS Create_tablespace_priv, +IF(JSON_VALUE(Priv, '$.access') & 536870912, 'Y', 'N') AS Delete_history_priv, +ELT(IFNULL(JSON_VALUE(Priv, '$.ssl_type'), 0) + 1, '', 'ANY','X509', 'SPECIFIED') AS ssl_type, +IFNULL(JSON_VALUE(Priv, '$.ssl_cipher'), '') AS ssl_cipher, +IFNULL(JSON_VALUE(Priv, '$.x509_issuer'), '') AS x509_issuer, +IFNULL(JSON_VALUE(Priv, '$.x509_subject'), '') AS x509_subject, +CAST(IFNULL(JSON_VALUE(Priv, '$.max_questions'), 0) AS UNSIGNED) AS max_questions, +CAST(IFNULL(JSON_VALUE(Priv, '$.max_updates'), 0) AS UNSIGNED) AS max_updates, +CAST(IFNULL(JSON_VALUE(Priv, '$.max_connections'), 0) AS UNSIGNED) AS max_connections, +CAST(IFNULL(JSON_VALUE(Priv, '$.max_user_connections'), 0) AS SIGNED) AS max_user_connections, +IFNULL(JSON_VALUE(Priv, '$.plugin'), '') AS plugin, +IFNULL(JSON_VALUE(Priv, '$.authentication_string'), '') AS authentication_string, +'N' AS password_expired, +ELT(IFNULL(JSON_VALUE(Priv, '$.is_role'), 0) + 1, 'N', 'Y') AS is_role, +IFNULL(JSON_VALUE(Priv, '$.default_role'), '') AS default_role, +CAST(IFNULL(JSON_VALUE(Priv, '$.max_statement_time'), 0.0) AS DECIMAL(12,6)) AS max_statement_time +FROM global_priv; +SET sql_mode=''; +DROP PROCEDURE IF EXISTS mysql.AddGeometryColumn; +DROP PROCEDURE IF EXISTS mysql.DropGeometryColumn; +CREATE DEFINER=`superuser`@`localhost` PROCEDURE AddGeometryColumn(catalog varchar(64), t_schema varchar(64), +t_name varchar(64), geometry_column varchar(64), t_srid int) SQL SECURITY INVOKER +begin +set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end | +CREATE DEFINER=`superuser`@`localhost` PROCEDURE DropGeometryColumn(catalog varchar(64), t_schema varchar(64), +t_name varchar(64), geometry_column varchar(64)) SQL SECURITY INVOKER +begin +set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' DROP ', geometry_column); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end | +set @@sql_mode= @save_sql_mode; +drop user 'mariadb.sys'@'localhost'; +# check changed definitions mysql_upgrade +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' +and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost'; +count(*) +1 +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'; +count(*) +0 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'superuser@localhost'; +count(*) +1 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; +count(*) +0 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'superuser@localhost'; +count(*) +1 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; +count(*) +0 +SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; +GRANTEE TABLE_CATALOG PRIVILEGE_TYPE IS_GRANTABLE +SELECT * FROM information_schema.TABLE_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; +GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE +# Run mysql_upgrade +Phase 1/7: Checking and upgrading mysql database +Processing databases +mysql +mysql.column_stats OK +mysql.columns_priv OK +mysql.db OK +mysql.event OK +mysql.func OK +mysql.global_priv OK +mysql.gtid_slave_pos OK +mysql.help_category OK +mysql.help_keyword OK +mysql.help_relation OK +mysql.help_topic OK +mysql.index_stats OK +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.plugin OK +mysql.proc OK +mysql.procs_priv OK +mysql.proxies_priv OK +mysql.roles_mapping OK +mysql.save_proc OK +mysql.servers OK +mysql.table_stats OK +mysql.tables_priv OK +mysql.time_zone OK +mysql.time_zone_leap_second OK +mysql.time_zone_name OK +mysql.time_zone_transition OK +mysql.time_zone_transition_type OK +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt + +Repairing tables +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt +Phase 2/7: Installing used storage engines... Skipped +Phase 3/7: Fixing views +mysql.user OK +Phase 4/7: Running 'mysql_fix_privilege_tables' +Phase 5/7: Fixing table and database names +Phase 6/7: Checking and upgrading tables +Processing databases +information_schema +mtr +mtr.global_suppressions OK +mtr.test_suppressions OK +mysqltest1 +mysqltest1.save_global_priv OK +mysqltest1.save_proxies_priv OK +mysqltest1.save_tables_priv OK +performance_schema +test +Phase 7/7: Running 'FLUSH PRIVILEGES' +OK +# check new definitions mysql_upgrade +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' +and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost'; +count(*) +1 +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'; +count(*) +0 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'superuser@localhost'; +count(*) +1 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; +count(*) +0 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'superuser@localhost'; +count(*) +1 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; +count(*) +0 +select count(*) from global_priv where user='mariadb.sys' and host='localhost'; +count(*) +0 +# above should be 0 (no mariadb.sys@localhost user) +# restore environment +DROP USER 'superuser'@'localhost'; +DROP VIEW mysql.user; +DROP PROCEDURE AddGeometryColumn; +DROP PROCEDURE DropGeometryColumn; +Phase 1/7: Checking and upgrading mysql database +Processing databases +mysql +mysql.column_stats OK +mysql.columns_priv OK +mysql.db OK +mysql.event OK +mysql.func OK +mysql.global_priv OK +mysql.gtid_slave_pos OK +mysql.help_category OK +mysql.help_keyword OK +mysql.help_relation OK +mysql.help_topic OK +mysql.index_stats OK +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.plugin OK +mysql.proc OK +mysql.procs_priv OK +mysql.proxies_priv OK +mysql.roles_mapping OK +mysql.save_proc OK +mysql.servers OK +mysql.table_stats OK +mysql.tables_priv OK +mysql.time_zone OK +mysql.time_zone_leap_second OK +mysql.time_zone_name OK +mysql.time_zone_transition OK +mysql.time_zone_transition_type OK +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt + +Repairing tables +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt +Phase 2/7: Installing used storage engines... Skipped +Phase 3/7: Fixing views +Phase 4/7: Running 'mysql_fix_privilege_tables' +Phase 5/7: Fixing table and database names +Phase 6/7: Checking and upgrading tables +Processing databases +information_schema +mtr +mtr.global_suppressions OK +mtr.test_suppressions OK +mysqltest1 +mysqltest1.save_global_priv OK +mysqltest1.save_proxies_priv OK +mysqltest1.save_tables_priv OK +performance_schema +test +Phase 7/7: Running 'FLUSH PRIVILEGES' +OK +delete from global_priv; +delete from tables_priv; +delete from proxies_priv; +delete from proc; +insert into mysql.global_priv select * from mysqltest1.save_global_priv; +insert into mysql.tables_priv select * from mysqltest1.save_tables_priv; +insert into mysql.proxies_priv select * from mysqltest1.save_proxies_priv; +rename table proc to bad_proc; +rename table save_proc to proc; +drop table bad_proc; +flush privileges; +disconnect default; +connect default,localhost,root,,; +connection default; +drop database mysqltest1; +# End of 10.4 tests (but better do not add other tests here) diff --git a/mysql-test/main/upgrade_MDEV-23102-1.test b/mysql-test/main/upgrade_MDEV-23102-1.test new file mode 100644 index 00000000000..8491ddfffe4 --- /dev/null +++ b/mysql-test/main/upgrade_MDEV-23102-1.test @@ -0,0 +1,163 @@ +--echo # +--echo # MDEV-23102: 10.4 create mariadb.sys user on each update even +--echo # is the user is not needed +--echo # +--echo # part 1: reassigning mysql.user and gis procedures to other user + +--source include/mysql_upgrade_preparation.inc + +call mtr.add_suppression("Cannot load from mysql.proc. The table is probably corrupted"); +create database mysqltest1; +use mysqltest1; +create table save_global_priv as select * from mysql.global_priv; +create table save_tables_priv as select * from mysql.tables_priv; +create table save_proxies_priv as select * from mysql.proxies_priv; +create table mysql.save_proc like mysql.proc; +insert into mysql.save_proc select * from mysql.proc; +set @save_sql_mode= @@sql_mode; + +use mysql; + +--echo # make changed definition of gis procedures and user view + +create user superuser@localhost; +grant all privileges on mysql.* to superuser@localhost; + +drop view user; + +CREATE DEFINER='superuser'@'localhost' SQL SECURITY DEFINER VIEW IF NOT EXISTS user AS SELECT + Host, + User, + IF(JSON_VALUE(Priv, '$.plugin') IN ('mysql_native_password', 'mysql_old_password'), IFNULL(JSON_VALUE(Priv, '$.authentication_string'), ''), '') AS Password, + IF(JSON_VALUE(Priv, '$.access') & 1, 'Y', 'N') AS Select_priv, + IF(JSON_VALUE(Priv, '$.access') & 2, 'Y', 'N') AS Insert_priv, + IF(JSON_VALUE(Priv, '$.access') & 4, 'Y', 'N') AS Update_priv, + IF(JSON_VALUE(Priv, '$.access') & 8, 'Y', 'N') AS Delete_priv, + IF(JSON_VALUE(Priv, '$.access') & 16, 'Y', 'N') AS Create_priv, + IF(JSON_VALUE(Priv, '$.access') & 32, 'Y', 'N') AS Drop_priv, + IF(JSON_VALUE(Priv, '$.access') & 64, 'Y', 'N') AS Reload_priv, + IF(JSON_VALUE(Priv, '$.access') & 128, 'Y', 'N') AS Shutdown_priv, + IF(JSON_VALUE(Priv, '$.access') & 256, 'Y', 'N') AS Process_priv, + IF(JSON_VALUE(Priv, '$.access') & 512, 'Y', 'N') AS File_priv, + IF(JSON_VALUE(Priv, '$.access') & 1024, 'Y', 'N') AS Grant_priv, + IF(JSON_VALUE(Priv, '$.access') & 2048, 'Y', 'N') AS References_priv, + IF(JSON_VALUE(Priv, '$.access') & 4096, 'Y', 'N') AS Index_priv, + IF(JSON_VALUE(Priv, '$.access') & 8192, 'Y', 'N') AS Alter_priv, + IF(JSON_VALUE(Priv, '$.access') & 16384, 'Y', 'N') AS Show_db_priv, + IF(JSON_VALUE(Priv, '$.access') & 32768, 'Y', 'N') AS Super_priv, + IF(JSON_VALUE(Priv, '$.access') & 65536, 'Y', 'N') AS Create_tmp_table_priv, + IF(JSON_VALUE(Priv, '$.access') & 131072, 'Y', 'N') AS Lock_tables_priv, + IF(JSON_VALUE(Priv, '$.access') & 262144, 'Y', 'N') AS Execute_priv, + IF(JSON_VALUE(Priv, '$.access') & 524288, 'Y', 'N') AS Repl_slave_priv, + IF(JSON_VALUE(Priv, '$.access') & 1048576, 'Y', 'N') AS Repl_client_priv, + IF(JSON_VALUE(Priv, '$.access') & 2097152, 'Y', 'N') AS Create_view_priv, + IF(JSON_VALUE(Priv, '$.access') & 4194304, 'Y', 'N') AS Show_view_priv, + IF(JSON_VALUE(Priv, '$.access') & 8388608, 'Y', 'N') AS Create_routine_priv, + IF(JSON_VALUE(Priv, '$.access') & 16777216, 'Y', 'N') AS Alter_routine_priv, + IF(JSON_VALUE(Priv, '$.access') & 33554432, 'Y', 'N') AS Create_user_priv, + IF(JSON_VALUE(Priv, '$.access') & 67108864, 'Y', 'N') AS Event_priv, + IF(JSON_VALUE(Priv, '$.access') & 134217728, 'Y', 'N') AS Trigger_priv, + IF(JSON_VALUE(Priv, '$.access') & 268435456, 'Y', 'N') AS Create_tablespace_priv, + IF(JSON_VALUE(Priv, '$.access') & 536870912, 'Y', 'N') AS Delete_history_priv, + ELT(IFNULL(JSON_VALUE(Priv, '$.ssl_type'), 0) + 1, '', 'ANY','X509', 'SPECIFIED') AS ssl_type, + IFNULL(JSON_VALUE(Priv, '$.ssl_cipher'), '') AS ssl_cipher, + IFNULL(JSON_VALUE(Priv, '$.x509_issuer'), '') AS x509_issuer, + IFNULL(JSON_VALUE(Priv, '$.x509_subject'), '') AS x509_subject, + CAST(IFNULL(JSON_VALUE(Priv, '$.max_questions'), 0) AS UNSIGNED) AS max_questions, + CAST(IFNULL(JSON_VALUE(Priv, '$.max_updates'), 0) AS UNSIGNED) AS max_updates, + CAST(IFNULL(JSON_VALUE(Priv, '$.max_connections'), 0) AS UNSIGNED) AS max_connections, + CAST(IFNULL(JSON_VALUE(Priv, '$.max_user_connections'), 0) AS SIGNED) AS max_user_connections, + IFNULL(JSON_VALUE(Priv, '$.plugin'), '') AS plugin, + IFNULL(JSON_VALUE(Priv, '$.authentication_string'), '') AS authentication_string, + 'N' AS password_expired, + ELT(IFNULL(JSON_VALUE(Priv, '$.is_role'), 0) + 1, 'N', 'Y') AS is_role, + IFNULL(JSON_VALUE(Priv, '$.default_role'), '') AS default_role, + CAST(IFNULL(JSON_VALUE(Priv, '$.max_statement_time'), 0.0) AS DECIMAL(12,6)) AS max_statement_time + FROM global_priv; + + +SET sql_mode=''; + +DROP PROCEDURE IF EXISTS mysql.AddGeometryColumn; +DROP PROCEDURE IF EXISTS mysql.DropGeometryColumn; + +delimiter |; + +CREATE DEFINER=`superuser`@`localhost` PROCEDURE AddGeometryColumn(catalog varchar(64), t_schema varchar(64), + t_name varchar(64), geometry_column varchar(64), t_srid int) SQL SECURITY INVOKER +begin + set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end | + +CREATE DEFINER=`superuser`@`localhost` PROCEDURE DropGeometryColumn(catalog varchar(64), t_schema varchar(64), + t_name varchar(64), geometry_column varchar(64)) SQL SECURITY INVOKER +begin + set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' DROP ', geometry_column); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end | + +delimiter ;| + +set @@sql_mode= @save_sql_mode; + +drop user 'mariadb.sys'@'localhost'; + +--echo # check changed definitions mysql_upgrade + +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' +and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost'; +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'superuser@localhost'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'superuser@localhost'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; + +SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; +SELECT * FROM information_schema.TABLE_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; + +let $MYSQLD_DATADIR= `select @@datadir`; + +--echo # Run mysql_upgrade +--exec $MYSQL_UPGRADE 2>&1 +--file_exists $MYSQLD_DATADIR/mysql_upgrade_info +--remove_file $MYSQLD_DATADIR/mysql_upgrade_info + +--echo # check new definitions mysql_upgrade + +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' +and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost'; +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'superuser@localhost'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'superuser@localhost'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'mariadb.sys@localhost'; + +select count(*) from global_priv where user='mariadb.sys' and host='localhost'; +--echo # above should be 0 (no mariadb.sys@localhost user) + +--echo # restore environment + +DROP USER 'superuser'@'localhost'; +DROP VIEW mysql.user; +DROP PROCEDURE AddGeometryColumn; +DROP PROCEDURE DropGeometryColumn; +--exec $MYSQL_UPGRADE 2>&1 +--file_exists $MYSQLD_DATADIR/mysql_upgrade_info +--remove_file $MYSQLD_DATADIR/mysql_upgrade_info + +delete from global_priv; +delete from tables_priv; +delete from proxies_priv; +delete from proc; +insert into mysql.global_priv select * from mysqltest1.save_global_priv; +insert into mysql.tables_priv select * from mysqltest1.save_tables_priv; +insert into mysql.proxies_priv select * from mysqltest1.save_proxies_priv; +rename table proc to bad_proc; +rename table save_proc to proc; +drop table bad_proc; +flush privileges; + +disconnect default; +connect default,localhost,root,,; +connection default; + +drop database mysqltest1; + +--echo # End of 10.4 tests (but better do not add other tests here) diff --git a/mysql-test/main/upgrade_MDEV-23102-2.result b/mysql-test/main/upgrade_MDEV-23102-2.result new file mode 100644 index 00000000000..4702fae812f --- /dev/null +++ b/mysql-test/main/upgrade_MDEV-23102-2.result @@ -0,0 +1,262 @@ +# +# MDEV-23102: 10.4 create mariadb.sys user on each update even +# is the user is not needed +# +# part 2: reassigning mysql.user and deleting gis procedures +call mtr.add_suppression("Cannot load from mysql.proc. The table is probably corrupted"); +create database mysqltest1; +use mysqltest1; +create table save_global_priv as select * from mysql.global_priv; +create table save_tables_priv as select * from mysql.tables_priv; +create table save_proxies_priv as select * from mysql.proxies_priv; +create table mysql.save_proc like mysql.proc; +insert into mysql.save_proc select * from mysql.proc; +set @save_sql_mode= @@sql_mode; +use mysql; +# make changed definition of gis procedures and user view +create user superuser@localhost; +grant all privileges on mysql.* to superuser@localhost; +drop view user; +CREATE DEFINER='superuser'@'localhost' SQL SECURITY DEFINER VIEW IF NOT EXISTS user AS SELECT +Host, +User, +IF(JSON_VALUE(Priv, '$.plugin') IN ('mysql_native_password', 'mysql_old_password'), IFNULL(JSON_VALUE(Priv, '$.authentication_string'), ''), '') AS Password, +IF(JSON_VALUE(Priv, '$.access') & 1, 'Y', 'N') AS Select_priv, +IF(JSON_VALUE(Priv, '$.access') & 2, 'Y', 'N') AS Insert_priv, +IF(JSON_VALUE(Priv, '$.access') & 4, 'Y', 'N') AS Update_priv, +IF(JSON_VALUE(Priv, '$.access') & 8, 'Y', 'N') AS Delete_priv, +IF(JSON_VALUE(Priv, '$.access') & 16, 'Y', 'N') AS Create_priv, +IF(JSON_VALUE(Priv, '$.access') & 32, 'Y', 'N') AS Drop_priv, +IF(JSON_VALUE(Priv, '$.access') & 64, 'Y', 'N') AS Reload_priv, +IF(JSON_VALUE(Priv, '$.access') & 128, 'Y', 'N') AS Shutdown_priv, +IF(JSON_VALUE(Priv, '$.access') & 256, 'Y', 'N') AS Process_priv, +IF(JSON_VALUE(Priv, '$.access') & 512, 'Y', 'N') AS File_priv, +IF(JSON_VALUE(Priv, '$.access') & 1024, 'Y', 'N') AS Grant_priv, +IF(JSON_VALUE(Priv, '$.access') & 2048, 'Y', 'N') AS References_priv, +IF(JSON_VALUE(Priv, '$.access') & 4096, 'Y', 'N') AS Index_priv, +IF(JSON_VALUE(Priv, '$.access') & 8192, 'Y', 'N') AS Alter_priv, +IF(JSON_VALUE(Priv, '$.access') & 16384, 'Y', 'N') AS Show_db_priv, +IF(JSON_VALUE(Priv, '$.access') & 32768, 'Y', 'N') AS Super_priv, +IF(JSON_VALUE(Priv, '$.access') & 65536, 'Y', 'N') AS Create_tmp_table_priv, +IF(JSON_VALUE(Priv, '$.access') & 131072, 'Y', 'N') AS Lock_tables_priv, +IF(JSON_VALUE(Priv, '$.access') & 262144, 'Y', 'N') AS Execute_priv, +IF(JSON_VALUE(Priv, '$.access') & 524288, 'Y', 'N') AS Repl_slave_priv, +IF(JSON_VALUE(Priv, '$.access') & 1048576, 'Y', 'N') AS Repl_client_priv, +IF(JSON_VALUE(Priv, '$.access') & 2097152, 'Y', 'N') AS Create_view_priv, +IF(JSON_VALUE(Priv, '$.access') & 4194304, 'Y', 'N') AS Show_view_priv, +IF(JSON_VALUE(Priv, '$.access') & 8388608, 'Y', 'N') AS Create_routine_priv, +IF(JSON_VALUE(Priv, '$.access') & 16777216, 'Y', 'N') AS Alter_routine_priv, +IF(JSON_VALUE(Priv, '$.access') & 33554432, 'Y', 'N') AS Create_user_priv, +IF(JSON_VALUE(Priv, '$.access') & 67108864, 'Y', 'N') AS Event_priv, +IF(JSON_VALUE(Priv, '$.access') & 134217728, 'Y', 'N') AS Trigger_priv, +IF(JSON_VALUE(Priv, '$.access') & 268435456, 'Y', 'N') AS Create_tablespace_priv, +IF(JSON_VALUE(Priv, '$.access') & 536870912, 'Y', 'N') AS Delete_history_priv, +ELT(IFNULL(JSON_VALUE(Priv, '$.ssl_type'), 0) + 1, '', 'ANY','X509', 'SPECIFIED') AS ssl_type, +IFNULL(JSON_VALUE(Priv, '$.ssl_cipher'), '') AS ssl_cipher, +IFNULL(JSON_VALUE(Priv, '$.x509_issuer'), '') AS x509_issuer, +IFNULL(JSON_VALUE(Priv, '$.x509_subject'), '') AS x509_subject, +CAST(IFNULL(JSON_VALUE(Priv, '$.max_questions'), 0) AS UNSIGNED) AS max_questions, +CAST(IFNULL(JSON_VALUE(Priv, '$.max_updates'), 0) AS UNSIGNED) AS max_updates, +CAST(IFNULL(JSON_VALUE(Priv, '$.max_connections'), 0) AS UNSIGNED) AS max_connections, +CAST(IFNULL(JSON_VALUE(Priv, '$.max_user_connections'), 0) AS SIGNED) AS max_user_connections, +IFNULL(JSON_VALUE(Priv, '$.plugin'), '') AS plugin, +IFNULL(JSON_VALUE(Priv, '$.authentication_string'), '') AS authentication_string, +'N' AS password_expired, +ELT(IFNULL(JSON_VALUE(Priv, '$.is_role'), 0) + 1, 'N', 'Y') AS is_role, +IFNULL(JSON_VALUE(Priv, '$.default_role'), '') AS default_role, +CAST(IFNULL(JSON_VALUE(Priv, '$.max_statement_time'), 0.0) AS DECIMAL(12,6)) AS max_statement_time +FROM global_priv; +DROP PROCEDURE IF EXISTS mysql.AddGeometryColumn; +DROP PROCEDURE IF EXISTS mysql.DropGeometryColumn; +drop user 'mariadb.sys'@'localhost'; +# check changed definitions mysql_upgrade +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' +and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost'; +count(*) +1 +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'; +count(*) +0 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn'; +count(*) +0 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn'; +count(*) +0 +SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; +GRANTEE TABLE_CATALOG PRIVILEGE_TYPE IS_GRANTABLE +SELECT * FROM information_schema.TABLE_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; +GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE +# Run mysql_upgrade +Phase 1/7: Checking and upgrading mysql database +Processing databases +mysql +mysql.column_stats OK +mysql.columns_priv OK +mysql.db OK +mysql.event OK +mysql.func OK +mysql.global_priv OK +mysql.gtid_slave_pos OK +mysql.help_category OK +mysql.help_keyword OK +mysql.help_relation OK +mysql.help_topic OK +mysql.index_stats OK +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.plugin OK +mysql.proc OK +mysql.procs_priv OK +mysql.proxies_priv OK +mysql.roles_mapping OK +mysql.save_proc OK +mysql.servers OK +mysql.table_stats OK +mysql.tables_priv OK +mysql.time_zone OK +mysql.time_zone_leap_second OK +mysql.time_zone_name OK +mysql.time_zone_transition OK +mysql.time_zone_transition_type OK +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt + +Repairing tables +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt +Phase 2/7: Installing used storage engines... Skipped +Phase 3/7: Fixing views +mysql.user OK +Phase 4/7: Running 'mysql_fix_privilege_tables' +Phase 5/7: Fixing table and database names +Phase 6/7: Checking and upgrading tables +Processing databases +information_schema +mtr +mtr.global_suppressions OK +mtr.test_suppressions OK +mysqltest1 +mysqltest1.save_global_priv OK +mysqltest1.save_proxies_priv OK +mysqltest1.save_tables_priv OK +performance_schema +test +Phase 7/7: Running 'FLUSH PRIVILEGES' +OK +# check new definitions mysql_upgrade +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' +and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost'; +count(*) +1 +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'; +count(*) +0 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn'; +count(*) +0 +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn'; +count(*) +0 +select count(*) from global_priv where user='mariadb.sys' and host='localhost'; +count(*) +0 +# above should be 0 (no mariadb.sys@localhost user) +# restore environment +DROP USER 'superuser'@'localhost'; +DROP VIEW mysql.user; +Phase 1/7: Checking and upgrading mysql database +Processing databases +mysql +mysql.column_stats OK +mysql.columns_priv OK +mysql.db OK +mysql.event OK +mysql.func OK +mysql.global_priv OK +mysql.gtid_slave_pos OK +mysql.help_category OK +mysql.help_keyword OK +mysql.help_relation OK +mysql.help_topic OK +mysql.index_stats OK +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.plugin OK +mysql.proc OK +mysql.procs_priv OK +mysql.proxies_priv OK +mysql.roles_mapping OK +mysql.save_proc OK +mysql.servers OK +mysql.table_stats OK +mysql.tables_priv OK +mysql.time_zone OK +mysql.time_zone_leap_second OK +mysql.time_zone_name OK +mysql.time_zone_transition OK +mysql.time_zone_transition_type OK +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt + +Repairing tables +mysql.innodb_index_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.innodb_table_stats +Error : Unknown storage engine 'InnoDB' +error : Corrupt +mysql.transaction_registry +Error : Unknown storage engine 'InnoDB' +error : Corrupt +Phase 2/7: Installing used storage engines... Skipped +Phase 3/7: Fixing views +Phase 4/7: Running 'mysql_fix_privilege_tables' +Phase 5/7: Fixing table and database names +Phase 6/7: Checking and upgrading tables +Processing databases +information_schema +mtr +mtr.global_suppressions OK +mtr.test_suppressions OK +mysqltest1 +mysqltest1.save_global_priv OK +mysqltest1.save_proxies_priv OK +mysqltest1.save_tables_priv OK +performance_schema +test +Phase 7/7: Running 'FLUSH PRIVILEGES' +OK +delete from global_priv; +delete from tables_priv; +delete from proxies_priv; +delete from proc; +insert into mysql.global_priv select * from mysqltest1.save_global_priv; +insert into mysql.tables_priv select * from mysqltest1.save_tables_priv; +insert into mysql.proxies_priv select * from mysqltest1.save_proxies_priv; +rename table proc to bad_proc; +rename table save_proc to proc; +drop table bad_proc; +flush privileges; +disconnect default; +connect default,localhost,root,,; +connection default; +drop database mysqltest1; +# End of 10.4 tests (but better do not add other tests here) diff --git a/mysql-test/main/upgrade_MDEV-23102-2.test b/mysql-test/main/upgrade_MDEV-23102-2.test new file mode 100644 index 00000000000..5ce7682fea6 --- /dev/null +++ b/mysql-test/main/upgrade_MDEV-23102-2.test @@ -0,0 +1,141 @@ +--echo # +--echo # MDEV-23102: 10.4 create mariadb.sys user on each update even +--echo # is the user is not needed +--echo # +--echo # part 2: reassigning mysql.user and deleting gis procedures + +--source include/mysql_upgrade_preparation.inc + +call mtr.add_suppression("Cannot load from mysql.proc. The table is probably corrupted"); +create database mysqltest1; +use mysqltest1; +create table save_global_priv as select * from mysql.global_priv; +create table save_tables_priv as select * from mysql.tables_priv; +create table save_proxies_priv as select * from mysql.proxies_priv; +create table mysql.save_proc like mysql.proc; +insert into mysql.save_proc select * from mysql.proc; +set @save_sql_mode= @@sql_mode; + +use mysql; + +--echo # make changed definition of gis procedures and user view + +create user superuser@localhost; +grant all privileges on mysql.* to superuser@localhost; + +drop view user; + +CREATE DEFINER='superuser'@'localhost' SQL SECURITY DEFINER VIEW IF NOT EXISTS user AS SELECT + Host, + User, + IF(JSON_VALUE(Priv, '$.plugin') IN ('mysql_native_password', 'mysql_old_password'), IFNULL(JSON_VALUE(Priv, '$.authentication_string'), ''), '') AS Password, + IF(JSON_VALUE(Priv, '$.access') & 1, 'Y', 'N') AS Select_priv, + IF(JSON_VALUE(Priv, '$.access') & 2, 'Y', 'N') AS Insert_priv, + IF(JSON_VALUE(Priv, '$.access') & 4, 'Y', 'N') AS Update_priv, + IF(JSON_VALUE(Priv, '$.access') & 8, 'Y', 'N') AS Delete_priv, + IF(JSON_VALUE(Priv, '$.access') & 16, 'Y', 'N') AS Create_priv, + IF(JSON_VALUE(Priv, '$.access') & 32, 'Y', 'N') AS Drop_priv, + IF(JSON_VALUE(Priv, '$.access') & 64, 'Y', 'N') AS Reload_priv, + IF(JSON_VALUE(Priv, '$.access') & 128, 'Y', 'N') AS Shutdown_priv, + IF(JSON_VALUE(Priv, '$.access') & 256, 'Y', 'N') AS Process_priv, + IF(JSON_VALUE(Priv, '$.access') & 512, 'Y', 'N') AS File_priv, + IF(JSON_VALUE(Priv, '$.access') & 1024, 'Y', 'N') AS Grant_priv, + IF(JSON_VALUE(Priv, '$.access') & 2048, 'Y', 'N') AS References_priv, + IF(JSON_VALUE(Priv, '$.access') & 4096, 'Y', 'N') AS Index_priv, + IF(JSON_VALUE(Priv, '$.access') & 8192, 'Y', 'N') AS Alter_priv, + IF(JSON_VALUE(Priv, '$.access') & 16384, 'Y', 'N') AS Show_db_priv, + IF(JSON_VALUE(Priv, '$.access') & 32768, 'Y', 'N') AS Super_priv, + IF(JSON_VALUE(Priv, '$.access') & 65536, 'Y', 'N') AS Create_tmp_table_priv, + IF(JSON_VALUE(Priv, '$.access') & 131072, 'Y', 'N') AS Lock_tables_priv, + IF(JSON_VALUE(Priv, '$.access') & 262144, 'Y', 'N') AS Execute_priv, + IF(JSON_VALUE(Priv, '$.access') & 524288, 'Y', 'N') AS Repl_slave_priv, + IF(JSON_VALUE(Priv, '$.access') & 1048576, 'Y', 'N') AS Repl_client_priv, + IF(JSON_VALUE(Priv, '$.access') & 2097152, 'Y', 'N') AS Create_view_priv, + IF(JSON_VALUE(Priv, '$.access') & 4194304, 'Y', 'N') AS Show_view_priv, + IF(JSON_VALUE(Priv, '$.access') & 8388608, 'Y', 'N') AS Create_routine_priv, + IF(JSON_VALUE(Priv, '$.access') & 16777216, 'Y', 'N') AS Alter_routine_priv, + IF(JSON_VALUE(Priv, '$.access') & 33554432, 'Y', 'N') AS Create_user_priv, + IF(JSON_VALUE(Priv, '$.access') & 67108864, 'Y', 'N') AS Event_priv, + IF(JSON_VALUE(Priv, '$.access') & 134217728, 'Y', 'N') AS Trigger_priv, + IF(JSON_VALUE(Priv, '$.access') & 268435456, 'Y', 'N') AS Create_tablespace_priv, + IF(JSON_VALUE(Priv, '$.access') & 536870912, 'Y', 'N') AS Delete_history_priv, + ELT(IFNULL(JSON_VALUE(Priv, '$.ssl_type'), 0) + 1, '', 'ANY','X509', 'SPECIFIED') AS ssl_type, + IFNULL(JSON_VALUE(Priv, '$.ssl_cipher'), '') AS ssl_cipher, + IFNULL(JSON_VALUE(Priv, '$.x509_issuer'), '') AS x509_issuer, + IFNULL(JSON_VALUE(Priv, '$.x509_subject'), '') AS x509_subject, + CAST(IFNULL(JSON_VALUE(Priv, '$.max_questions'), 0) AS UNSIGNED) AS max_questions, + CAST(IFNULL(JSON_VALUE(Priv, '$.max_updates'), 0) AS UNSIGNED) AS max_updates, + CAST(IFNULL(JSON_VALUE(Priv, '$.max_connections'), 0) AS UNSIGNED) AS max_connections, + CAST(IFNULL(JSON_VALUE(Priv, '$.max_user_connections'), 0) AS SIGNED) AS max_user_connections, + IFNULL(JSON_VALUE(Priv, '$.plugin'), '') AS plugin, + IFNULL(JSON_VALUE(Priv, '$.authentication_string'), '') AS authentication_string, + 'N' AS password_expired, + ELT(IFNULL(JSON_VALUE(Priv, '$.is_role'), 0) + 1, 'N', 'Y') AS is_role, + IFNULL(JSON_VALUE(Priv, '$.default_role'), '') AS default_role, + CAST(IFNULL(JSON_VALUE(Priv, '$.max_statement_time'), 0.0) AS DECIMAL(12,6)) AS max_statement_time + FROM global_priv; + + +DROP PROCEDURE IF EXISTS mysql.AddGeometryColumn; +DROP PROCEDURE IF EXISTS mysql.DropGeometryColumn; + + +drop user 'mariadb.sys'@'localhost'; + +--echo # check changed definitions mysql_upgrade + +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' +and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost'; +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn'; + +SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; +SELECT * FROM information_schema.TABLE_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; + +let $MYSQLD_DATADIR= `select @@datadir`; + +--echo # Run mysql_upgrade +--exec $MYSQL_UPGRADE 2>&1 +--file_exists $MYSQLD_DATADIR/mysql_upgrade_info +--remove_file $MYSQLD_DATADIR/mysql_upgrade_info + +--echo # check new definitions mysql_upgrade + +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' +and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost'; +SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn'; +SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn'; + + +select count(*) from global_priv where user='mariadb.sys' and host='localhost'; +--echo # above should be 0 (no mariadb.sys@localhost user) + +--echo # restore environment + +DROP USER 'superuser'@'localhost'; +DROP VIEW mysql.user; +--exec $MYSQL_UPGRADE 2>&1 +--file_exists $MYSQLD_DATADIR/mysql_upgrade_info +--remove_file $MYSQLD_DATADIR/mysql_upgrade_info + +delete from global_priv; +delete from tables_priv; +delete from proxies_priv; +delete from proc; +insert into mysql.global_priv select * from mysqltest1.save_global_priv; +insert into mysql.tables_priv select * from mysqltest1.save_tables_priv; +insert into mysql.proxies_priv select * from mysqltest1.save_proxies_priv; +rename table proc to bad_proc; +rename table save_proc to proc; +drop table bad_proc; +flush privileges; + +disconnect default; +connect default,localhost,root,,; +connection default; + +drop database mysqltest1; + +--echo # End of 10.4 tests (but better do not add other tests here) diff --git a/scripts/mysql_system_tables.sql b/scripts/mysql_system_tables.sql index 6e1377660e9..f81aa290100 100644 --- a/scripts/mysql_system_tables.sql +++ b/scripts/mysql_system_tables.sql @@ -37,9 +37,15 @@ CREATE TABLE IF NOT EXISTS global_priv (Host char(60) binary DEFAULT '', User ch set @had_sys_user= 0 <> (select count(*) from mysql.global_priv where Host="localhost" and User="mariadb.sys"); +set @exists_user_view= EXISTS (SELECT * FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user'); + +set @exists_user_view_by_root= EXISTS (SELECT * FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'); + +set @need_sys_user_creation= (NOT @had_sys_user) AND (( NOT @exists_user_view) OR @exists_user_view_by_root); + CREATE TEMPORARY TABLE tmp_user_sys LIKE global_priv; INSERT INTO tmp_user_sys (Host,User,Priv) VALUES ('localhost','mariadb.sys','{"access":0,"plugin":"mysql_native_password","authentication_string":"","account_locked":true,"password_last_changed":0}'); -INSERT INTO global_priv SELECT * FROM tmp_user_sys WHERE NOT @had_sys_user; +INSERT INTO global_priv SELECT * FROM tmp_user_sys WHERE 0 <> @need_sys_user_creation; DROP TABLE tmp_user_sys; @@ -111,7 +117,7 @@ CREATE TABLE IF NOT EXISTS tables_priv ( Host char(60) binary DEFAULT '' NOT NUL CREATE TEMPORARY TABLE tmp_user_sys LIKE tables_priv; INSERT INTO tmp_user_sys (Host,Db,User,Table_name,Grantor,Timestamp,Table_priv) VALUES ('localhost','mysql','mariadb.sys','global_priv','root@localhost','0','Select,Update,Delete'); -INSERT INTO tables_priv SELECT * FROM tmp_user_sys WHERE NOT @had_sys_user; +INSERT INTO tables_priv SELECT * FROM tmp_user_sys WHERE 0 <> @need_sys_user_creation; DROP TABLE tmp_user_sys; CREATE TABLE IF NOT EXISTS columns_priv ( Host char(60) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(80) binary DEFAULT '' NOT NULL, Table_name char(64) binary DEFAULT '' NOT NULL, Column_name char(64) binary DEFAULT '' NOT NULL, Timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, Column_priv set('Select','Insert','Update','References') COLLATE utf8_general_ci DEFAULT '' NOT NULL, PRIMARY KEY (Host,Db,User,Table_name,Column_name) ) engine=Aria transactional=1 CHARACTER SET utf8 COLLATE utf8_bin comment='Column privileges'; From 41221091f6541ea83eeec70732b92b94746a44e7 Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Wed, 8 Jul 2020 23:25:08 +0300 Subject: [PATCH 020/188] MDEV-22553: Assertion `info->lastpos == (~ (my_off_t) 0)' failed in mi_rkey In mi_check_index_tuple(), when rowid filter check returns CHECK_OUT_OF_RANGE, set info->lastpos= HA_OFFSET_ERROR, like it is done above for the ICP check. --- mysql-test/main/rowid_filter_myisam.result | 21 + mysql-test/main/rowid_filter_myisam.test | 1625 ++++++++++++++++++++ storage/myisam/mi_key.c | 10 +- 3 files changed, 1655 insertions(+), 1 deletion(-) create mode 100644 mysql-test/main/rowid_filter_myisam.result create mode 100644 mysql-test/main/rowid_filter_myisam.test diff --git a/mysql-test/main/rowid_filter_myisam.result b/mysql-test/main/rowid_filter_myisam.result new file mode 100644 index 00000000000..927257d2cc7 --- /dev/null +++ b/mysql-test/main/rowid_filter_myisam.result @@ -0,0 +1,21 @@ +# +# MDEV-22553: Assertion `info->lastpos == (~ (my_off_t) 0)' failed in mi_rkey with rowid_filer=on +# +CREATE TABLE t1 ( +a smallint(6) DEFAULT NULL, +b bigint(20) DEFAULT NULL, +c varchar(64) DEFAULT NULL, +d varchar(64) DEFAULT NULL, +e smallint(6) DEFAULT NULL, +f bigint(20) DEFAULT NULL, +KEY a (a), +KEY d (d), +KEY f (f) +) ENGINE=MyISAM; +ALTER TABLE t1 DISABLE KEYS; +# Insert a lot of rows +ALTER TABLE t1 ENABLE KEYS; +# Must not crash: +SELECT * FROM t1 WHERE ( a BETWEEN 255 AND 270 OR f = 200 ) AND f IN ( 1, 4, 112, 143 ) AND d IN ('Montana', 'South Dakota'); +a b c d e f +DROP TABLE t1; diff --git a/mysql-test/main/rowid_filter_myisam.test b/mysql-test/main/rowid_filter_myisam.test new file mode 100644 index 00000000000..3ea4dc26ea0 --- /dev/null +++ b/mysql-test/main/rowid_filter_myisam.test @@ -0,0 +1,1625 @@ +--echo # +--echo # MDEV-22553: Assertion `info->lastpos == (~ (my_off_t) 0)' failed in mi_rkey with rowid_filer=on +--echo # + +CREATE TABLE t1 ( + a smallint(6) DEFAULT NULL, + b bigint(20) DEFAULT NULL, + c varchar(64) DEFAULT NULL, + d varchar(64) DEFAULT NULL, + e smallint(6) DEFAULT NULL, + f bigint(20) DEFAULT NULL, + KEY a (a), + KEY d (d), + KEY f (f) +) ENGINE=MyISAM; + +ALTER TABLE t1 DISABLE KEYS; +--echo # Insert a lot of rows +--disable_query_log +INSERT INTO t1 VALUES (13954,0,NULL,'c',NULL,0); +INSERT INTO t1 VALUES (124,0,NULL,'j',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'h',NULL,9); +INSERT INTO t1 VALUES (4,0,NULL,'New Hampshire',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'q',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'f',NULL,NULL); +INSERT INTO t1 VALUES (2,0,NULL,'b',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'y',NULL,0); +INSERT INTO t1 VALUES (106,0,NULL,'Hawaii',NULL,-480); +INSERT INTO t1 VALUES (10534,0,NULL,'South Carolina',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'Iowa',NULL,0); +INSERT INTO t1 VALUES (6,0,NULL,'g',NULL,9); +INSERT INTO t1 VALUES (0,0,NULL,'Arkansas',NULL,116); +INSERT INTO t1 VALUES (0,0,NULL,'b',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'release',NULL,-624); +INSERT INTO t1 VALUES (169,0,NULL,'s',NULL,664); +INSERT INTO t1 VALUES (20060,0,NULL,'l',NULL,672); +INSERT INTO t1 VALUES (NULL,0,NULL,'q',NULL,235); +INSERT INTO t1 VALUES (1,0,NULL,'Tennessee',NULL,8); +INSERT INTO t1 VALUES (687,0,NULL,'j',NULL,21); +INSERT INTO t1 VALUES (-19736,0,NULL,'s',NULL,NULL); +INSERT INTO t1 VALUES (81,0,NULL,'p',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'festival',NULL,97); +INSERT INTO t1 VALUES (NULL,0,NULL,'c',NULL,264); +INSERT INTO t1 VALUES (0,0,NULL,'o',NULL,NULL); +INSERT INTO t1 VALUES (-30578,0,NULL,'exam',NULL,NULL); +INSERT INTO t1 VALUES (30751,0,NULL,'Nebraska',NULL,0); +INSERT INTO t1 VALUES (8,0,NULL,'d',NULL,0); +INSERT INTO t1 VALUES (29585,0,NULL,'California',NULL,585); +INSERT INTO t1 VALUES (15376,0,NULL,'Indiana',NULL,768); +INSERT INTO t1 VALUES (7162,0,NULL,'gifted',NULL,NULL); +INSERT INTO t1 VALUES (28102,0,NULL,'w',NULL,616); +INSERT INTO t1 VALUES (NULL,0,NULL,'b',NULL,NULL); +INSERT INTO t1 VALUES (80,0,NULL,'p',NULL,NULL); +INSERT INTO t1 VALUES (4,0,NULL,'o',NULL,282); +INSERT INTO t1 VALUES (32767,0,NULL,'p',NULL,2); +INSERT INTO t1 VALUES (255,0,NULL,'b',NULL,0); +INSERT INTO t1 VALUES (202,0,NULL,'Mississippi',NULL,0); +INSERT INTO t1 VALUES (16253,0,NULL,'Alaska',NULL,872); +INSERT INTO t1 VALUES (5,0,NULL,'q',NULL,-656); +INSERT INTO t1 VALUES (32767,0,NULL,'q',NULL,3); +INSERT INTO t1 VALUES (7,0,NULL,'Rhode Island',NULL,250); +INSERT INTO t1 VALUES (0,0,NULL,'b',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'s',NULL,885); +INSERT INTO t1 VALUES (NULL,0,NULL,'i',NULL,-56); +INSERT INTO t1 VALUES (201,0,NULL,'ridiculous',NULL,-704); +INSERT INTO t1 VALUES (5,0,NULL,'teenage',NULL,82); +INSERT INTO t1 VALUES (0,0,NULL,'Alabama',NULL,NULL); +INSERT INTO t1 VALUES (4,0,NULL,'i',NULL,1); +INSERT INTO t1 VALUES (-9774,0,NULL,'v',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'y',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'Alabama',NULL,NULL); +INSERT INTO t1 VALUES (7,0,NULL,'e',NULL,8); +INSERT INTO t1 VALUES (3,0,NULL,'l',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'drift',NULL,6); +INSERT INTO t1 VALUES (0,0,NULL,'v',NULL,230); +INSERT INTO t1 VALUES (5926,0,NULL,'Colorado',NULL,254); +INSERT INTO t1 VALUES (NULL,0,NULL,'South Carolina',NULL,512); +INSERT INTO t1 VALUES (9,0,NULL,'othapwsr',NULL,NULL); +INSERT INTO t1 VALUES (23437,0,NULL,'h',NULL,0); +INSERT INTO t1 VALUES (18863,0,NULL,'guideline',NULL,-80); +INSERT INTO t1 VALUES (NULL,0,NULL,'s',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'New Mexico',NULL,272); +INSERT INTO t1 VALUES (79,0,NULL,'partnership',NULL,5); +INSERT INTO t1 VALUES (0,0,NULL,'e',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'r',NULL,128); +INSERT INTO t1 VALUES (42,0,NULL,'tz',NULL,NULL); +INSERT INTO t1 VALUES (228,0,NULL,'Utah',NULL,3); +INSERT INTO t1 VALUES (NULL,0,NULL,'i',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'Alaska',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'wo',NULL,177); +INSERT INTO t1 VALUES (0,0,NULL,'Maryland',NULL,487); +INSERT INTO t1 VALUES (-8186,0,NULL,'Colorado',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'uj',NULL,328); +INSERT INTO t1 VALUES (4,0,NULL,'fork',NULL,0); +INSERT INTO t1 VALUES (3,0,NULL,'w',NULL,NULL); +INSERT INTO t1 VALUES (248,0,NULL,'i',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'dmkbqswrmtyabvlfylaxhnqij',NULL,24); +INSERT INTO t1 VALUES (32767,0,NULL,'achieve',NULL,1); +INSERT INTO t1 VALUES (32767,0,NULL,'existing',NULL,5); +INSERT INTO t1 VALUES (6,0,NULL,'master',NULL,-312); +INSERT INTO t1 VALUES (214,0,NULL,'b',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'Michigan',NULL,42); +INSERT INTO t1 VALUES (NULL,0,NULL,'simply',NULL,109); +INSERT INTO t1 VALUES (NULL,0,NULL,'sw',NULL,86); +INSERT INTO t1 VALUES (20697,0,NULL,'m',NULL,5); +INSERT INTO t1 VALUES (-11693,0,NULL,'mt',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'South Dakota',NULL,NULL); +INSERT INTO t1 VALUES (14825,0,NULL,'b',NULL,0); +INSERT INTO t1 VALUES (-9378,0,NULL,'Washington',NULL,593); +INSERT INTO t1 VALUES (NULL,0,NULL,'New Jersey',NULL,246); +INSERT INTO t1 VALUES (32767,0,NULL,'q',NULL,-816); +INSERT INTO t1 VALUES (0,0,NULL,'vl',NULL,232); +INSERT INTO t1 VALUES (25257,0,NULL,'Nevada',NULL,-24); +INSERT INTO t1 VALUES (0,0,NULL,'Wisconsin',NULL,9); +INSERT INTO t1 VALUES (1536,0,NULL,'x',NULL,NULL); +INSERT INTO t1 VALUES (5895,0,NULL,'Washington',NULL,170); +INSERT INTO t1 VALUES (28123,0,NULL,'h',NULL,176); +INSERT INTO t1 VALUES (9,0,NULL,'Tennessee',NULL,948); +INSERT INTO t1 VALUES (0,0,NULL,'qi',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'Tennessee',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'Oklahoma',NULL,132); +INSERT INTO t1 VALUES (-21476,0,NULL,'Montana',NULL,947); +INSERT INTO t1 VALUES (6,0,NULL,'aevevozlwbltcvzjptgbxw',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'v',NULL,4); +INSERT INTO t1 VALUES (1,0,NULL,'vo',NULL,73); +INSERT INTO t1 VALUES (3,0,NULL,'oz',NULL,328); +INSERT INTO t1 VALUES (17939,0,NULL,'exclude',NULL,175); +INSERT INTO t1 VALUES (-26579,0,NULL,'bl',NULL,32); +INSERT INTO t1 VALUES (9,0,NULL,'c',NULL,130); +INSERT INTO t1 VALUES (-26118,0,NULL,'asian',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'r',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'personal',NULL,8); +INSERT INTO t1 VALUES (26919,0,NULL,'i',NULL,550); +INSERT INTO t1 VALUES (NULL,0,NULL,'n',NULL,456); +INSERT INTO t1 VALUES (NULL,0,NULL,'tg',NULL,-40); +INSERT INTO t1 VALUES (0,0,NULL,'g',NULL,-720); +INSERT INTO t1 VALUES (5,0,NULL,'bxwggltplrozn',NULL,92); +INSERT INTO t1 VALUES (5,0,NULL,'w',NULL,-904); +INSERT INTO t1 VALUES (-5704,0,NULL,'Idaho',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'t',NULL,2); +INSERT INTO t1 VALUES (3,0,NULL,'lroznxbayvsjotzfqwye',NULL,-544); +INSERT INTO t1 VALUES (-32545,0,NULL,'oz',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'x',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'virtually',NULL,38); +INSERT INTO t1 VALUES (1,0,NULL,'beautiful',NULL,7); +INSERT INTO t1 VALUES (223,0,NULL,'vs',NULL,9); +INSERT INTO t1 VALUES (13865,0,NULL,'Arkansas',NULL,1); +INSERT INTO t1 VALUES (0,0,NULL,'h',NULL,0); +INSERT INTO t1 VALUES (-24982,0,NULL,'e',NULL,206); +INSERT INTO t1 VALUES (27039,0,NULL,'rape',NULL,-184); +INSERT INTO t1 VALUES (NULL,0,NULL,'v',NULL,74); +INSERT INTO t1 VALUES (NULL,0,NULL,'wyec',NULL,2); +INSERT INTO t1 VALUES (0,0,NULL,'cook',NULL,59); +INSERT INTO t1 VALUES (0,0,NULL,'Iowa',NULL,NULL); +INSERT INTO t1 VALUES (231,0,NULL,'ecfsb',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'p',NULL,370); +INSERT INTO t1 VALUES (-24801,0,NULL,'New Mexico',NULL,NULL); +INSERT INTO t1 VALUES (50,0,NULL,'kelhcq',NULL,104); +INSERT INTO t1 VALUES (NULL,0,NULL,'el',NULL,402); +INSERT INTO t1 VALUES (15730,0,NULL,'h',NULL,376); +INSERT INTO t1 VALUES (8,0,NULL,'p',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'h',NULL,4); +INSERT INTO t1 VALUES (32767,0,NULL,'South Carolina',NULL,382); +INSERT INTO t1 VALUES (NULL,0,NULL,'invite',NULL,816); +INSERT INTO t1 VALUES (NULL,0,NULL,'ft',NULL,538); +INSERT INTO t1 VALUES (8159,0,NULL,'q',NULL,11); +INSERT INTO t1 VALUES (0,0,NULL,'a',NULL,103); +INSERT INTO t1 VALUES (7,0,NULL,'n',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'New Jersey',NULL,146); +INSERT INTO t1 VALUES (32767,0,NULL,'odlwznvezd',NULL,295); +INSERT INTO t1 VALUES (9,0,NULL,'any',NULL,480); +INSERT INTO t1 VALUES (7,0,NULL,'znvezdlrwfvhpghujmnvqun',NULL,720); +INSERT INTO t1 VALUES (12792,0,NULL,'Iowa',NULL,NULL); +INSERT INTO t1 VALUES (148,0,NULL,'Ohio',NULL,89); +INSERT INTO t1 VALUES (NULL,0,NULL,'lr',NULL,-680); +INSERT INTO t1 VALUES (-14898,0,NULL,'fv',NULL,736); +INSERT INTO t1 VALUES (32767,0,NULL,'v',NULL,9); +INSERT INTO t1 VALUES (5808,0,NULL,'Florida',NULL,112); +INSERT INTO t1 VALUES (0,0,NULL,'gh',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'u',NULL,NULL); +INSERT INTO t1 VALUES (4,0,NULL,'mnvqunepbp',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'enemy',NULL,272); +INSERT INTO t1 VALUES (32767,0,NULL,'unhappy',NULL,8); +INSERT INTO t1 VALUES (1460,0,NULL,'Connecticut',NULL,780); +INSERT INTO t1 VALUES (0,0,NULL,'epbpabcgxxmaozb',NULL,230); +INSERT INTO t1 VALUES (NULL,0,NULL,'banana',NULL,620); +INSERT INTO t1 VALUES (0,0,NULL,'pabcgxxmaozbofwby',NULL,212); +INSERT INTO t1 VALUES (32767,0,NULL,'afterward',NULL,0); +INSERT INTO t1 VALUES (-15421,0,NULL,'important',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'Washington',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'m',NULL,3); +INSERT INTO t1 VALUES (0,0,NULL,'zb',NULL,1); +INSERT INTO t1 VALUES (0,0,NULL,'position',NULL,-632); +INSERT INTO t1 VALUES (17,0,NULL,'bofwbypkykzkbnayqfeuzxlyt',NULL,63); +INSERT INTO t1 VALUES (NULL,0,NULL,'of',NULL,488); +INSERT INTO t1 VALUES (0,0,NULL,'wbypkykzkbnayqfeuzxlyts',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'insight',NULL,632); +INSERT INTO t1 VALUES (0,0,NULL,'Arizona',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'pk',NULL,0); +INSERT INTO t1 VALUES (174,0,NULL,'yk',NULL,194); +INSERT INTO t1 VALUES (4,0,NULL,'h',NULL,NULL); +INSERT INTO t1 VALUES (19871,0,NULL,'zkbna',NULL,7); +INSERT INTO t1 VALUES (NULL,0,NULL,'l',NULL,0); +INSERT INTO t1 VALUES (-18596,0,NULL,'New York',NULL,488); +INSERT INTO t1 VALUES (18464,0,NULL,'qfeuzxlyts',NULL,3); +INSERT INTO t1 VALUES (-21912,0,NULL,'doctor',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'eu',NULL,4); +INSERT INTO t1 VALUES (0,0,NULL,'xl',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'New York',NULL,394); +INSERT INTO t1 VALUES (NULL,0,NULL,'closest',NULL,928); +INSERT INTO t1 VALUES (7,0,NULL,'jx',NULL,0); +INSERT INTO t1 VALUES (8,0,NULL,'Mississippi',NULL,236); +INSERT INTO t1 VALUES (8238,0,NULL,'n',NULL,2); +INSERT INTO t1 VALUES (137,0,NULL,'nf',NULL,3); +INSERT INTO t1 VALUES (7,0,NULL,'mm',NULL,824); +INSERT INTO t1 VALUES (-13059,0,NULL,'nfojpim',NULL,-40); +INSERT INTO t1 VALUES (NULL,0,NULL,'i',NULL,224); +INSERT INTO t1 VALUES (NULL,0,NULL,'blind',NULL,-296); +INSERT INTO t1 VALUES (0,0,NULL,'Maryland',NULL,8); +INSERT INTO t1 VALUES (0,0,NULL,'im',NULL,0); +INSERT INTO t1 VALUES (88,0,NULL,'Colorado',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'u',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'glove',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'qg',NULL,952); +INSERT INTO t1 VALUES (14297,0,NULL,'level',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'v',NULL,0); +INSERT INTO t1 VALUES (46,0,NULL,'suspicion',NULL,0); +INSERT INTO t1 VALUES (7,0,NULL,'Connecticut',NULL,NULL); +INSERT INTO t1 VALUES (32672,0,NULL,'master',NULL,224); +INSERT INTO t1 VALUES (255,0,NULL,'suffering',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'bweyg',NULL,343); +INSERT INTO t1 VALUES (32,0,NULL,'Maine',NULL,-224); +INSERT INTO t1 VALUES (2888,0,NULL,'rear',NULL,74); +INSERT INTO t1 VALUES (218,0,NULL,'New Hampshire',NULL,-416); +INSERT INTO t1 VALUES (NULL,0,NULL,'m',NULL,5); +INSERT INTO t1 VALUES (7,0,NULL,'compel',NULL,592); +INSERT INTO t1 VALUES (3,0,NULL,'Vermont',NULL,-424); +INSERT INTO t1 VALUES (0,0,NULL,'natural',NULL,6); +INSERT INTO t1 VALUES (4,0,NULL,'f',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'Maryland',NULL,0); +INSERT INTO t1 VALUES (4128,0,NULL,'lm',NULL,-128); +INSERT INTO t1 VALUES (0,0,NULL,'circuit',NULL,NULL); +INSERT INTO t1 VALUES (-23553,0,NULL,'appearance',NULL,9); +INSERT INTO t1 VALUES (32767,0,NULL,'qr',NULL,0); +INSERT INTO t1 VALUES (9700,0,NULL,'g',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'hr',NULL,9); +INSERT INTO t1 VALUES (229,0,NULL,'West Virginia',NULL,244); +INSERT INTO t1 VALUES (10379,0,NULL,'i',NULL,211); +INSERT INTO t1 VALUES (0,0,NULL,'personal',NULL,5); +INSERT INTO t1 VALUES (4298,0,NULL,'z',NULL,985); +INSERT INTO t1 VALUES (157,0,NULL,'e',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'p',NULL,5); +INSERT INTO t1 VALUES (32767,0,NULL,'lg',NULL,527); +INSERT INTO t1 VALUES (1,0,NULL,'t',NULL,208); +INSERT INTO t1 VALUES (5,0,NULL,'Kansas',NULL,587); +INSERT INTO t1 VALUES (-31188,0,NULL,'e',NULL,408); +INSERT INTO t1 VALUES (NULL,0,NULL,'v',NULL,146); +INSERT INTO t1 VALUES (15527,0,NULL,'vd',NULL,-200); +INSERT INTO t1 VALUES (11164,0,NULL,'pthiwwamjdavik',NULL,117); +INSERT INTO t1 VALUES (46,0,NULL,'iw',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'a',NULL,9); +INSERT INTO t1 VALUES (NULL,0,NULL,'gradually',NULL,0); +INSERT INTO t1 VALUES (-21366,0,NULL,'refer',NULL,146); +INSERT INTO t1 VALUES (20927,0,NULL,'c',NULL,0); +INSERT INTO t1 VALUES (43,0,NULL,'Florida',NULL,968); +INSERT INTO t1 VALUES (NULL,0,NULL,'ko',NULL,NULL); +INSERT INTO t1 VALUES (242,0,NULL,'jrydpgfyxhfqsu',NULL,-800); +INSERT INTO t1 VALUES (-12797,0,NULL,'ry',NULL,7); +INSERT INTO t1 VALUES (6,0,NULL,'x',NULL,228); +INSERT INTO t1 VALUES (9,0,NULL,'y',NULL,1); +INSERT INTO t1 VALUES (0,0,NULL,'w',NULL,4); +INSERT INTO t1 VALUES (127,0,NULL,'Maryland',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'h',NULL,NULL); +INSERT INTO t1 VALUES (7,0,NULL,'qs',NULL,512); +INSERT INTO t1 VALUES (30910,0,NULL,'disturb',NULL,960); +INSERT INTO t1 VALUES (NULL,0,NULL,'lx',NULL,4); +INSERT INTO t1 VALUES (94,0,NULL,'dhc',NULL,0); +INSERT INTO t1 VALUES (247,0,NULL,'ca',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'fi',NULL,-488); +INSERT INTO t1 VALUES (NULL,0,NULL,'i',NULL,3); +INSERT INTO t1 VALUES (9,0,NULL,'Connecticut',NULL,552); +INSERT INTO t1 VALUES (0,0,NULL,'register',NULL,0); +INSERT INTO t1 VALUES (-8679,0,NULL,'bk',NULL,-760); +INSERT INTO t1 VALUES (32767,0,NULL,'orbit',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'kvm',NULL,7); +INSERT INTO t1 VALUES (0,0,NULL,'mdqbjxjh',NULL,680); +INSERT INTO t1 VALUES (32767,0,NULL,'m',NULL,-272); +INSERT INTO t1 VALUES (0,0,NULL,'bj',NULL,0); +INSERT INTO t1 VALUES (22547,0,NULL,'xj',NULL,194); +INSERT INTO t1 VALUES (-32403,0,NULL,'gj',NULL,240); +INSERT INTO t1 VALUES (6394,0,NULL,'Arizona',NULL,16); +INSERT INTO t1 VALUES (4,0,NULL,'z',NULL,488); +INSERT INTO t1 VALUES (114,0,NULL,'i',NULL,0); +INSERT INTO t1 VALUES (3710,0,NULL,'p',NULL,291); +INSERT INTO t1 VALUES (28654,0,NULL,'empty',NULL,245); +INSERT INTO t1 VALUES (9849,0,NULL,'Pennsylvania',NULL,0); +INSERT INTO t1 VALUES (185,0,NULL,'j',NULL,320); +INSERT INTO t1 VALUES (5,0,NULL,'Tennessee',NULL,7); +INSERT INTO t1 VALUES (154,0,NULL,'hl',NULL,157); +INSERT INTO t1 VALUES (NULL,0,NULL,'lo',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'hc',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'must',NULL,755); +INSERT INTO t1 VALUES (132,0,NULL,'m',NULL,95); +INSERT INTO t1 VALUES (193,0,NULL,'poke',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'o',NULL,-656); +INSERT INTO t1 VALUES (172,0,NULL,'e',NULL,0); +INSERT INTO t1 VALUES (7642,0,NULL,'feeling',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'cwmtpp',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'e',NULL,115); +INSERT INTO t1 VALUES (32767,0,NULL,'Florida',NULL,505); +INSERT INTO t1 VALUES (3,0,NULL,'Maryland',NULL,97); +INSERT INTO t1 VALUES (NULL,0,NULL,'kill',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'qf',NULL,623); +INSERT INTO t1 VALUES (0,0,NULL,'fz',NULL,812); +INSERT INTO t1 VALUES (NULL,0,NULL,'greek',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'kglhiuodplizizzobpcq',NULL,6); +INSERT INTO t1 VALUES (NULL,0,NULL,'l',NULL,0); +INSERT INTO t1 VALUES (159,0,NULL,'s',NULL,7); +INSERT INTO t1 VALUES (-25560,0,NULL,'z',NULL,656); +INSERT INTO t1 VALUES (189,0,NULL,'u',NULL,0); +INSERT INTO t1 VALUES (27110,0,NULL,'leather',NULL,9); +INSERT INTO t1 VALUES (NULL,0,NULL,'li',NULL,944); +INSERT INTO t1 VALUES (0,0,NULL,'attract',NULL,NULL); +INSERT INTO t1 VALUES (9,0,NULL,'structural',NULL,71); +INSERT INTO t1 VALUES (NULL,0,NULL,'settlement',NULL,4); +INSERT INTO t1 VALUES (-15549,0,NULL,'n',NULL,564); +INSERT INTO t1 VALUES (30391,0,NULL,'k',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'ob',NULL,NULL); +INSERT INTO t1 VALUES (224,0,NULL,'bpcqqji',NULL,413); +INSERT INTO t1 VALUES (32767,0,NULL,'nowhere',NULL,8); +INSERT INTO t1 VALUES (15281,0,NULL,'Arkansas',NULL,-912); +INSERT INTO t1 VALUES (-9327,0,NULL,'d',NULL,-904); +INSERT INTO t1 VALUES (14055,0,NULL,'i',NULL,293); +INSERT INTO t1 VALUES (3,0,NULL,'Louisiana',NULL,224); +INSERT INTO t1 VALUES (NULL,0,NULL,'pw',NULL,-624); +INSERT INTO t1 VALUES (32767,0,NULL,'nevertheless',NULL,208); +INSERT INTO t1 VALUES (NULL,0,NULL,'z',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'spectacular',NULL,104); +INSERT INTO t1 VALUES (0,0,NULL,'digital',NULL,89); +INSERT INTO t1 VALUES (5,0,NULL,'aq',NULL,40); +INSERT INTO t1 VALUES (NULL,0,NULL,'tm',NULL,411); +INSERT INTO t1 VALUES (11726,0,NULL,'p',NULL,0); +INSERT INTO t1 VALUES (3188,0,NULL,'knykleafajkq',NULL,0); +INSERT INTO t1 VALUES (1,0,NULL,'technology',NULL,6); +INSERT INTO t1 VALUES (NULL,0,NULL,'y',NULL,58); +INSERT INTO t1 VALUES (67,0,NULL,'a',NULL,0); +INSERT INTO t1 VALUES (-6719,0,NULL,'n',NULL,136); +INSERT INTO t1 VALUES (8000,0,NULL,'j',NULL,-248); +INSERT INTO t1 VALUES (32767,0,NULL,'snow',NULL,8); +INSERT INTO t1 VALUES (-3623,0,NULL,'d',NULL,920); +INSERT INTO t1 VALUES (NULL,0,NULL,'i',NULL,NULL); +INSERT INTO t1 VALUES (3239,0,NULL,'Kansas',NULL,102); +INSERT INTO t1 VALUES (7132,0,NULL,'zt',NULL,88); +INSERT INTO t1 VALUES (-21941,0,NULL,'Tennessee',NULL,77); +INSERT INTO t1 VALUES (45,0,NULL,'Virginia',NULL,3); +INSERT INTO t1 VALUES (166,0,NULL,'m',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'l',NULL,-880); +INSERT INTO t1 VALUES (205,0,NULL,'Idaho',NULL,NULL); +INSERT INTO t1 VALUES (10679,0,NULL,'f',NULL,2); +INSERT INTO t1 VALUES (172,0,NULL,'North Dakota',NULL,NULL); +INSERT INTO t1 VALUES (30942,0,NULL,'Indiana',NULL,832); +INSERT INTO t1 VALUES (1824,0,NULL,'m',NULL,NULL); +INSERT INTO t1 VALUES (34,0,NULL,'stumble',NULL,440); +INSERT INTO t1 VALUES (12955,0,NULL,'juror',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'South Dakota',NULL,5); +INSERT INTO t1 VALUES (25891,0,NULL,'j',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'clerk',NULL,39); +INSERT INTO t1 VALUES (13187,0,NULL,'gw',NULL,811); +INSERT INTO t1 VALUES (0,0,NULL,'x',NULL,583); +INSERT INTO t1 VALUES (6,0,NULL,'fb',NULL,140); +INSERT INTO t1 VALUES (32767,0,NULL,'vp',NULL,781); +INSERT INTO t1 VALUES (0,0,NULL,'if',NULL,NULL); +INSERT INTO t1 VALUES (7497,0,NULL,'New Hampshire',NULL,233); +INSERT INTO t1 VALUES (155,0,NULL,'e',NULL,NULL); +INSERT INTO t1 VALUES (-18830,0,NULL,'q',NULL,84); +INSERT INTO t1 VALUES (3815,0,NULL,'yy',NULL,8); +INSERT INTO t1 VALUES (0,0,NULL,'Kansas',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'yqspnupv',NULL,0); +INSERT INTO t1 VALUES (1,0,NULL,'hers',NULL,688); +INSERT INTO t1 VALUES (32767,0,NULL,'pnupvmuqjaojhylsrbqichox',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'x',NULL,8); +INSERT INTO t1 VALUES (3,0,NULL,'North Carolina',NULL,-88); +INSERT INTO t1 VALUES (92,0,NULL,'u',NULL,0); +INSERT INTO t1 VALUES (32126,0,NULL,'sensation',NULL,226); +INSERT INTO t1 VALUES (4,0,NULL,'muqjao',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'aojhylsrbqichoxl',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'tribe',NULL,0); +INSERT INTO t1 VALUES (142,0,NULL,'jhy',NULL,6); +INSERT INTO t1 VALUES (0,0,NULL,'w',NULL,622); +INSERT INTO t1 VALUES (NULL,0,NULL,'New York',NULL,-56); +INSERT INTO t1 VALUES (-24954,0,NULL,'bqichoxlxsarzbqouvscstrtpofjbbjrci',NULL,8); +INSERT INTO t1 VALUES (4105,0,NULL,'New Hampshire',NULL,247); +INSERT INTO t1 VALUES (0,0,NULL,'k',NULL,0); +INSERT INTO t1 VALUES (46,0,NULL,'reader',NULL,400); +INSERT INTO t1 VALUES (-29286,0,NULL,'ho',NULL,NULL); +INSERT INTO t1 VALUES (169,0,NULL,'mr',NULL,0); +INSERT INTO t1 VALUES (9,0,NULL,'y',NULL,333); +INSERT INTO t1 VALUES (25168,0,NULL,'New Jersey',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'queen',NULL,2); +INSERT INTO t1 VALUES (9,0,NULL,'bow',NULL,NULL); +INSERT INTO t1 VALUES (7,0,NULL,'satellite',NULL,NULL); +INSERT INTO t1 VALUES (1,0,NULL,'u',NULL,31); +INSERT INTO t1 VALUES (NULL,0,NULL,'scstrtpofjbbjrcijlkzoyh',NULL,70); +INSERT INTO t1 VALUES (26275,0,NULL,'b',NULL,7); +INSERT INTO t1 VALUES (227,0,NULL,'card',NULL,6); +INSERT INTO t1 VALUES (0,0,NULL,'p',NULL,140); +INSERT INTO t1 VALUES (4,0,NULL,'Oregon',NULL,556); +INSERT INTO t1 VALUES (-12170,0,NULL,'Missouri',NULL,292); +INSERT INTO t1 VALUES (NULL,0,NULL,'bjrcijlkzoyhy',NULL,251); +INSERT INTO t1 VALUES (NULL,0,NULL,'ci',NULL,NULL); +INSERT INTO t1 VALUES (69,0,NULL,'g',NULL,-456); +INSERT INTO t1 VALUES (NULL,0,NULL,'f',NULL,9); +INSERT INTO t1 VALUES (NULL,0,NULL,'hynudnmi',NULL,45); +INSERT INTO t1 VALUES (-30445,0,NULL,'widespread',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'Maryland',NULL,407); +INSERT INTO t1 VALUES (NULL,0,NULL,'Delaware',NULL,-40); +INSERT INTO t1 VALUES (30059,0,NULL,'n',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'u',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'znwacpbwghlegvykaobxv',NULL,7); +INSERT INTO t1 VALUES (174,0,NULL,'r',NULL,9); +INSERT INTO t1 VALUES (NULL,0,NULL,'West Virginia',NULL,71); +INSERT INTO t1 VALUES (2593,0,NULL,'z',NULL,2); +INSERT INTO t1 VALUES (-28371,0,NULL,'v',NULL,89); +INSERT INTO t1 VALUES (23749,0,NULL,'e',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'w',NULL,183); +INSERT INTO t1 VALUES (NULL,0,NULL,'ghl',NULL,776); +INSERT INTO t1 VALUES (4,0,NULL,'Mississippi',NULL,8); +INSERT INTO t1 VALUES (9210,0,NULL,'z',NULL,246); +INSERT INTO t1 VALUES (12724,0,NULL,'South Dakota',NULL,222); +INSERT INTO t1 VALUES (NULL,0,NULL,'outlet',NULL,790); +INSERT INTO t1 VALUES (NULL,0,NULL,'Indiana',NULL,-8); +INSERT INTO t1 VALUES (NULL,0,NULL,'aob',NULL,0); +INSERT INTO t1 VALUES (7,0,NULL,'tell',NULL,-648); +INSERT INTO t1 VALUES (0,0,NULL,'u',NULL,381); +INSERT INTO t1 VALUES (7,0,NULL,'vqhhtakqoppfcrb',NULL,747); +INSERT INTO t1 VALUES (4,0,NULL,'Arkansas',NULL,816); +INSERT INTO t1 VALUES (0,0,NULL,'slight',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'upset',NULL,4); +INSERT INTO t1 VALUES (-17416,0,NULL,'Nebraska',NULL,9); +INSERT INTO t1 VALUES (137,0,NULL,'takqoppfcrbangizjeqc',NULL,672); +INSERT INTO t1 VALUES (-326,0,NULL,'spill',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'w',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'crb',NULL,166); +INSERT INTO t1 VALUES (NULL,0,NULL,'Mississippi',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'ba',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'a',NULL,1); +INSERT INTO t1 VALUES (61,0,NULL,'izj',NULL,-744); +INSERT INTO t1 VALUES (-26413,0,NULL,'Nevada',NULL,NULL); +INSERT INTO t1 VALUES (6,0,NULL,'Mississippi',NULL,416); +INSERT INTO t1 VALUES (0,0,NULL,'Nevada',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'b',NULL,470); +INSERT INTO t1 VALUES (2864,0,NULL,'x',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'Montana',NULL,248); +INSERT INTO t1 VALUES (32767,0,NULL,'y',NULL,2); +INSERT INTO t1 VALUES (0,0,NULL,'Arkansas',NULL,107); +INSERT INTO t1 VALUES (243,0,NULL,'bb',NULL,NULL); +INSERT INTO t1 VALUES (-7006,0,NULL,'y',NULL,262); +INSERT INTO t1 VALUES (29170,0,NULL,'data',NULL,257); +INSERT INTO t1 VALUES (NULL,0,NULL,'procedure',NULL,5); +INSERT INTO t1 VALUES (NULL,0,NULL,'u',NULL,182); +INSERT INTO t1 VALUES (0,0,NULL,'lczldnxhwgkrabptlqda',NULL,158); +INSERT INTO t1 VALUES (10754,0,NULL,'cream',NULL,0); +INSERT INTO t1 VALUES (31943,0,NULL,'open',NULL,4); +INSERT INTO t1 VALUES (NULL,0,NULL,'hwg',NULL,NULL); +INSERT INTO t1 VALUES (5,0,NULL,'Wyoming',NULL,NULL); +INSERT INTO t1 VALUES (-27782,0,NULL,'r',NULL,187); +INSERT INTO t1 VALUES (32767,0,NULL,'ab',NULL,0); +INSERT INTO t1 VALUES (3,0,NULL,'ptlqda',NULL,-288); +INSERT INTO t1 VALUES (32767,0,NULL,'q',NULL,72); +INSERT INTO t1 VALUES (-22284,0,NULL,'e',NULL,664); +INSERT INTO t1 VALUES (7,0,NULL,'Florida',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'movfyh',NULL,-784); +INSERT INTO t1 VALUES (NULL,0,NULL,'vfy',NULL,784); +INSERT INTO t1 VALUES (37,0,NULL,'h',NULL,105); +INSERT INTO t1 VALUES (32767,0,NULL,'r',NULL,0); +INSERT INTO t1 VALUES (145,0,NULL,'Hawaii',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'Minnesota',NULL,0); +INSERT INTO t1 VALUES (4,0,NULL,'ov',NULL,181); +INSERT INTO t1 VALUES (0,0,NULL,'coming',NULL,5); +INSERT INTO t1 VALUES (32767,0,NULL,'mnry',NULL,946); +INSERT INTO t1 VALUES (NULL,0,NULL,'Arizona',NULL,NULL); +INSERT INTO t1 VALUES (-2368,0,NULL,'c',NULL,0); +INSERT INTO t1 VALUES (-21715,0,NULL,'ljfxl',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'Wyoming',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'fxlxhdnief',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'MariaDB is a community-developed, commercially',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'Mississippi',NULL,624); +INSERT INTO t1 VALUES (6,0,NULL,'h',NULL,198); +INSERT INTO t1 VALUES (-11442,0,NULL,'Massachusetts',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'i',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'draw',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'k',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'ztabdvhywbflylhukxqufevtdhnfzpccsuyvzargiogjfsnofsruoqac',NULL,53); +INSERT INTO t1 VALUES (0,0,NULL,'all',NULL,994); +INSERT INTO t1 VALUES (-18287,0,NULL,'abdvhywbflylhukxqu',NULL,878); +INSERT INTO t1 VALUES (0,0,NULL,'Wyoming',NULL,847); +INSERT INTO t1 VALUES (6,0,NULL,'dv',NULL,204); +INSERT INTO t1 VALUES (246,0,NULL,'ywbflylhukxqufevtdhnfzpccsuyvzargiogjfsnofsruo',NULL,183); +INSERT INTO t1 VALUES (20335,0,NULL,'f',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'l',NULL,223); +INSERT INTO t1 VALUES (NULL,0,NULL,'hukxqufevtdhnfzpccsuyvzargiogjfsnofsruoqacwwy',NULL,577); +INSERT INTO t1 VALUES (180,0,NULL,'qu',NULL,6); +INSERT INTO t1 VALUES (9,0,NULL,'f',NULL,8); +INSERT INTO t1 VALUES (27881,0,NULL,'vt',NULL,2); +INSERT INTO t1 VALUES (3,0,NULL,'tdhnfzpccsuyvzargiogjfsnofsr',NULL,6); +INSERT INTO t1 VALUES (NULL,0,NULL,'Alabama',NULL,200); +INSERT INTO t1 VALUES (32767,0,NULL,'fzpccsuyv',NULL,20); +INSERT INTO t1 VALUES (7,0,NULL,'p',NULL,180); +INSERT INTO t1 VALUES (32767,0,NULL,'South Dakota',NULL,496); +INSERT INTO t1 VALUES (23704,0,NULL,'uyvzargiogjfsnofsruoqacwwygpgvfsciovxyvstsktvbpcoliqfqjmavyv',NULL,744); +INSERT INTO t1 VALUES (7,0,NULL,'za',NULL,4); +INSERT INTO t1 VALUES (0,0,NULL,'straighten',NULL,198); +INSERT INTO t1 VALUES (1200,0,NULL,'iogjfsnofsruoqacwwygpgv',NULL,NULL); +INSERT INTO t1 VALUES (8559,0,NULL,'j',NULL,NULL); +INSERT INTO t1 VALUES (-11567,0,NULL,'n',NULL,39); +INSERT INTO t1 VALUES (0,0,NULL,'New Jersey',NULL,723); +INSERT INTO t1 VALUES (NULL,0,NULL,'sruoqacwwygpgvfsciovxyv',NULL,150); +INSERT INTO t1 VALUES (0,0,NULL,'Massachusetts',NULL,157); +INSERT INTO t1 VALUES (10891,0,NULL,'scared',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'q',NULL,952); +INSERT INTO t1 VALUES (10180,0,NULL,'a',NULL,322); +INSERT INTO t1 VALUES (-32693,0,NULL,'hunt',NULL,-728); +INSERT INTO t1 VALUES (0,0,NULL,'f',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'yg',NULL,83); +INSERT INTO t1 VALUES (13866,0,NULL,'gp',NULL,277); +INSERT INTO t1 VALUES (32767,0,NULL,'Maine',NULL,822); +INSERT INTO t1 VALUES (19051,0,NULL,'quickly',NULL,2); +INSERT INTO t1 VALUES (14284,0,NULL,'fsciovxyvstsktvbpcoliqfqjmavyvpmtdrynjkbhcxfvua',NULL,NULL); +INSERT INTO t1 VALUES (10873,0,NULL,'Utah',NULL,0); +INSERT INTO t1 VALUES (125,0,NULL,'q',NULL,NULL); +INSERT INTO t1 VALUES (29916,0,NULL,'xyvstsktvbpcoliqfqjmavyvpmtdrynjkbhcxfv',NULL,547); +INSERT INTO t1 VALUES (0,0,NULL,'Arizona',NULL,NULL); +INSERT INTO t1 VALUES (212,0,NULL,'Kansas',NULL,650); +INSERT INTO t1 VALUES (NULL,0,NULL,'trick',NULL,87); +INSERT INTO t1 VALUES (1,0,NULL,'assign',NULL,135); +INSERT INTO t1 VALUES (0,0,NULL,'tsktvbpcoliqfqjmavyvpmtdrynjkbhcxfvuaaupgnpusgz',NULL,237); +INSERT INTO t1 VALUES (8,0,NULL,'o',NULL,NULL); +INSERT INTO t1 VALUES (-31777,0,NULL,'t',NULL,1); +INSERT INTO t1 VALUES (-10171,0,NULL,'pcoliqfqjmavyvpmtdrynjkbhcxfvuaaupgnpusgzncwf',NULL,0); +INSERT INTO t1 VALUES (7826,0,NULL,'council',NULL,273); +INSERT INTO t1 VALUES (20426,0,NULL,'r',NULL,9); +INSERT INTO t1 VALUES (32767,0,NULL,'qf',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'qjmavyvpmtdrynjkbhcxfvuaaupg',NULL,440); +INSERT INTO t1 VALUES (NULL,0,NULL,'s',NULL,-608); +INSERT INTO t1 VALUES (0,0,NULL,'vyv',NULL,111); +INSERT INTO t1 VALUES (225,0,NULL,'Michigan',NULL,NULL); +INSERT INTO t1 VALUES (10391,0,NULL,'p',NULL,2); +INSERT INTO t1 VALUES (3,0,NULL,'td',NULL,-480); +INSERT INTO t1 VALUES (0,0,NULL,'z',NULL,587); +INSERT INTO t1 VALUES (2180,0,NULL,'r',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'njkbhcxfvuaaupgnpusgzncwf',NULL,-984); +INSERT INTO t1 VALUES (81,0,NULL,'bhcxfvuaaupgnpusgzncw',NULL,146); +INSERT INTO t1 VALUES (165,0,NULL,'u',NULL,201); +INSERT INTO t1 VALUES (11251,0,NULL,'c',NULL,NULL); +INSERT INTO t1 VALUES (11703,0,NULL,'u',NULL,NULL); +INSERT INTO t1 VALUES (236,0,NULL,'opinion',NULL,207); +INSERT INTO t1 VALUES (32767,0,NULL,'Louisiana',NULL,-744); +INSERT INTO t1 VALUES (-29220,0,NULL,'Massachusetts',NULL,409); +INSERT INTO t1 VALUES (NULL,0,NULL,'up',NULL,169); +INSERT INTO t1 VALUES (18778,0,NULL,'Alabama',NULL,241); +INSERT INTO t1 VALUES (11959,0,NULL,'npusgzncwfwwbhfynsnzhmkxgjtfjjc',NULL,66); +INSERT INTO t1 VALUES (30179,0,NULL,'Hawaii',NULL,7); +INSERT INTO t1 VALUES (NULL,0,NULL,'s',NULL,100); +INSERT INTO t1 VALUES (214,0,NULL,'New Hampshire',NULL,984); +INSERT INTO t1 VALUES (5,0,NULL,'remove',NULL,NULL); +INSERT INTO t1 VALUES (143,0,NULL,'w',NULL,0); +INSERT INTO t1 VALUES (3,0,NULL,'Pennsylvania',NULL,696); +INSERT INTO t1 VALUES (191,0,NULL,'b',NULL,816); +INSERT INTO t1 VALUES (NULL,0,NULL,'hfynsnzhmkxgjtfjjcwggesvfockyauicjqw',NULL,3); +INSERT INTO t1 VALUES (0,0,NULL,'m',NULL,NULL); +INSERT INTO t1 VALUES (4,0,NULL,'Arkansas',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'s',NULL,6); +INSERT INTO t1 VALUES (1,0,NULL,'mk',NULL,36); +INSERT INTO t1 VALUES (8215,0,NULL,'xg',NULL,320); +INSERT INTO t1 VALUES (32767,0,NULL,'g',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'South Dakota',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'object',NULL,NULL); +INSERT INTO t1 VALUES (26142,0,NULL,'magnetic',NULL,-936); +INSERT INTO t1 VALUES (NULL,0,NULL,'Idaho',NULL,376); +INSERT INTO t1 VALUES (NULL,0,NULL,'g',NULL,0); +INSERT INTO t1 VALUES (-14759,0,NULL,'n',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'svfockyauic',NULL,197); +INSERT INTO t1 VALUES (25,0,NULL,'v',NULL,440); +INSERT INTO t1 VALUES (239,0,NULL,'c',NULL,642); +INSERT INTO t1 VALUES (189,0,NULL,'yauicjqwkwedvcvhsbvsgtjvqul',NULL,38); +INSERT INTO t1 VALUES (-5515,0,NULL,'auicjqwkwedvcvhsbvsgtjvqulz',NULL,NULL); +INSERT INTO t1 VALUES (25879,0,NULL,'i',NULL,416); +INSERT INTO t1 VALUES (0,0,NULL,'s',NULL,-760); +INSERT INTO t1 VALUES (1,0,NULL,'Delaware',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'w',NULL,250); +INSERT INTO t1 VALUES (0,0,NULL,'s',NULL,232); +INSERT INTO t1 VALUES (99,0,NULL,'j',NULL,-552); +INSERT INTO t1 VALUES (0,0,NULL,'full-time',NULL,10); +INSERT INTO t1 VALUES (NULL,0,NULL,'suffer',NULL,185); +INSERT INTO t1 VALUES (19461,0,NULL,'recognize',NULL,8); +INSERT INTO t1 VALUES (130,0,NULL,'learning',NULL,559); +INSERT INTO t1 VALUES (4,0,NULL,'grain',NULL,336); +INSERT INTO t1 VALUES (6,0,NULL,'correspondent',NULL,71); +INSERT INTO t1 VALUES (9,0,NULL,'b',NULL,5); +INSERT INTO t1 VALUES (18778,0,NULL,'practitioner',NULL,6); +INSERT INTO t1 VALUES (2291,0,NULL,'California',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'vq',NULL,0); +INSERT INTO t1 VALUES (34,0,NULL,'ul',NULL,81); +INSERT INTO t1 VALUES (-21757,0,NULL,'k',NULL,587); +INSERT INTO t1 VALUES (NULL,0,NULL,'New Hampshire',NULL,739); +INSERT INTO t1 VALUES (24,0,NULL,'o',NULL,NULL); +INSERT INTO t1 VALUES (26917,0,NULL,'m',NULL,102); +INSERT INTO t1 VALUES (55,0,NULL,'djvzvjevgpptiurzrjvnxsfvylicylrpwhdxky',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'k',NULL,537); +INSERT INTO t1 VALUES (-10683,0,NULL,'Nevada',NULL,6); +INSERT INTO t1 VALUES (-30580,0,NULL,'fall',NULL,432); +INSERT INTO t1 VALUES (0,0,NULL,'Pennsylvania',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'e',NULL,0); +INSERT INTO t1 VALUES (8,0,NULL,'Massachusetts',NULL,959); +INSERT INTO t1 VALUES (NULL,0,NULL,'Hawaii',NULL,NULL); +INSERT INTO t1 VALUES (11119,0,NULL,'weaken',NULL,560); +INSERT INTO t1 VALUES (-7660,0,NULL,'Massachusetts',NULL,752); +INSERT INTO t1 VALUES (38,0,NULL,'c',NULL,0); +INSERT INTO t1 VALUES (23593,0,NULL,'rzrjvnx',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'zr',NULL,7); +INSERT INTO t1 VALUES (32767,0,NULL,'vn',NULL,0); +INSERT INTO t1 VALUES (5,0,NULL,'sfv',NULL,0); +INSERT INTO t1 VALUES (2,0,NULL,'v',NULL,242); +INSERT INTO t1 VALUES (0,0,NULL,'o',NULL,2); +INSERT INTO t1 VALUES (24986,0,NULL,'Delaware',NULL,9); +INSERT INTO t1 VALUES (32767,0,NULL,'r',NULL,968); +INSERT INTO t1 VALUES (-17056,0,NULL,'human',NULL,245); +INSERT INTO t1 VALUES (0,0,NULL,'New Hampshire',NULL,4); +INSERT INTO t1 VALUES (2,0,NULL,'rpwhdxkyahrnbjkssbbgjdtkk',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'g',NULL,NULL); +INSERT INTO t1 VALUES (2,0,NULL,'hdxkyahrnbjkssbbgjdt',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'xk',NULL,840); +INSERT INTO t1 VALUES (145,0,NULL,'picture',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'h',NULL,713); +INSERT INTO t1 VALUES (-22009,0,NULL,'New Hampshire',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'x',NULL,225); +INSERT INTO t1 VALUES (0,0,NULL,'accomplish',NULL,0); +INSERT INTO t1 VALUES (166,0,NULL,'j',NULL,4); +INSERT INTO t1 VALUES (24484,0,NULL,'South Dakota',NULL,117); +INSERT INTO t1 VALUES (0,0,NULL,'Ohio',NULL,1); +INSERT INTO t1 VALUES (149,0,NULL,'prepare',NULL,958); +INSERT INTO t1 VALUES (9,0,NULL,'i',NULL,496); +INSERT INTO t1 VALUES (0,0,NULL,'she',NULL,328); +INSERT INTO t1 VALUES (0,0,NULL,'bbgjdtkkkntfogehrocicikzsxdkdefzskjbcdqkaawqmtxnpefrdshgm',NULL,NULL); +INSERT INTO t1 VALUES (206,0,NULL,'gjdtkkkntfogehrocicikzsxdkdefzskjbcdqkaawqmtxnpefrdshgmyujlf',NULL,678); +INSERT INTO t1 VALUES (83,0,NULL,'teenager',NULL,290); +INSERT INTO t1 VALUES (32767,0,NULL,'tkkkntfogehrocicikzsxdkdefzskjbcdqkaawqmtxnpefrdshgmyujlfbpksd',NULL,12); +INSERT INTO t1 VALUES (0,0,NULL,'kntfogehrocicikzsxdkdefzskjbcdqkaawqmtxnpefrdshgmyujlfbpksd',NULL,79); +INSERT INTO t1 VALUES (-1536,0,NULL,'n',NULL,192); +INSERT INTO t1 VALUES (0,0,NULL,'ignore',NULL,0); +INSERT INTO t1 VALUES (28936,0,NULL,'gehrocicikzsxdkdefzskjbcd',NULL,191); +INSERT INTO t1 VALUES (2,0,NULL,'rocicikzsxdkdefzskjbcdqkaawqmtxnpefrdshgmyujlfbpksdqbcozg',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'southwest',NULL,0); +INSERT INTO t1 VALUES (-14649,0,NULL,'icikzsxdkdefzskjbcdqkaawqmtxnp',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'i',NULL,144); +INSERT INTO t1 VALUES (54,0,NULL,'investigation',NULL,NULL); +INSERT INTO t1 VALUES (1,0,NULL,'Missouri',NULL,-880); +INSERT INTO t1 VALUES (0,0,NULL,'Minnesota',NULL,-144); +INSERT INTO t1 VALUES (NULL,0,NULL,'seek',NULL,NULL); +INSERT INTO t1 VALUES (92,0,NULL,'critical',NULL,NULL); +INSERT INTO t1 VALUES (-19917,0,NULL,'dancing',NULL,11); +INSERT INTO t1 VALUES (32767,0,NULL,'k',NULL,9); +INSERT INTO t1 VALUES (5,0,NULL,'efzskjbcd',NULL,520); +INSERT INTO t1 VALUES (NULL,0,NULL,'l',NULL,9); +INSERT INTO t1 VALUES (-18309,0,NULL,'x',NULL,0); +INSERT INTO t1 VALUES (30791,0,NULL,'v',NULL,883); +INSERT INTO t1 VALUES (17054,0,NULL,'quite',NULL,199); +INSERT INTO t1 VALUES (0,0,NULL,'Illinois',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'thought',NULL,6); +INSERT INTO t1 VALUES (32767,0,NULL,'aa',NULL,240); +INSERT INTO t1 VALUES (1,0,NULL,'builder',NULL,0); +INSERT INTO t1 VALUES (2,0,NULL,'bread',NULL,478); +INSERT INTO t1 VALUES (9,0,NULL,'mt',NULL,464); +INSERT INTO t1 VALUES (0,0,NULL,'t',NULL,471); +INSERT INTO t1 VALUES (249,0,NULL,'npefrdshgmyujlfbpksdqbcozgqnzxeuyjrdnutvbnf',NULL,272); +INSERT INTO t1 VALUES (-5659,0,NULL,'ef',NULL,845); +INSERT INTO t1 VALUES (32767,0,NULL,'Maine',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'project',NULL,-880); +INSERT INTO t1 VALUES (203,0,NULL,'f',NULL,569); +INSERT INTO t1 VALUES (6615,0,NULL,'z',NULL,820); +INSERT INTO t1 VALUES (0,0,NULL,'highlight',NULL,0); +INSERT INTO t1 VALUES (28099,0,NULL,'Louisiana',NULL,-528); +INSERT INTO t1 VALUES (NULL,0,NULL,'j',NULL,NULL); +INSERT INTO t1 VALUES (244,0,NULL,'f',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'mutter',NULL,3); +INSERT INTO t1 VALUES (32767,0,NULL,'i',NULL,4); +INSERT INTO t1 VALUES (-11010,0,NULL,'e',NULL,294); +INSERT INTO t1 VALUES (214,0,NULL,'c',NULL,-32); +INSERT INTO t1 VALUES (8,0,NULL,'ozgqnzxeuyjrdnutvbnfsjye',NULL,275); +INSERT INTO t1 VALUES (0,0,NULL,'m',NULL,808); +INSERT INTO t1 VALUES (-17980,0,NULL,'dip',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'Virginia',NULL,222); +INSERT INTO t1 VALUES (218,0,NULL,'opponent',NULL,8); +INSERT INTO t1 VALUES (32767,0,NULL,'xeuyjrdnutvbnfsjyeke',NULL,3); +INSERT INTO t1 VALUES (1,0,NULL,'jrdnutvbnfsjyekezjixrjdkyqgpokqquixax',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'s',NULL,NULL); +INSERT INTO t1 VALUES (234,0,NULL,'g',NULL,99); +INSERT INTO t1 VALUES (172,0,NULL,'appointment',NULL,821); +INSERT INTO t1 VALUES (NULL,0,NULL,'k',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'vbnfsjyekezjixrjdkyqgpokqquixaxjoyffwcfggsaoysceuzohfq',NULL,6); +INSERT INTO t1 VALUES (0,0,NULL,'nfsjyekezjixrjdkyqgpokqquixaxjoy',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'f',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'n',NULL,66); +INSERT INTO t1 VALUES (32767,0,NULL,'South Carolina',NULL,32); +INSERT INTO t1 VALUES (0,0,NULL,'ek',NULL,22); +INSERT INTO t1 VALUES (4,0,NULL,'Mississippi',NULL,132); +INSERT INTO t1 VALUES (26606,0,NULL,'p',NULL,0); +INSERT INTO t1 VALUES (26043,0,NULL,'center',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'b',NULL,1); +INSERT INTO t1 VALUES (8,0,NULL,'dk',NULL,NULL); +INSERT INTO t1 VALUES (24031,0,NULL,'l',NULL,4); +INSERT INTO t1 VALUES (79,0,NULL,'po',NULL,7); +INSERT INTO t1 VALUES (5,0,NULL,'Massachusetts',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'k',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'quixaxjoyf',NULL,213); +INSERT INTO t1 VALUES (NULL,0,NULL,'Arkansas',NULL,-160); +INSERT INTO t1 VALUES (-30994,0,NULL,'Kansas',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'wheat',NULL,-808); +INSERT INTO t1 VALUES (231,0,NULL,'less',NULL,912); +INSERT INTO t1 VALUES (NULL,0,NULL,'a',NULL,107); +INSERT INTO t1 VALUES (4,0,NULL,'ix',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'within',NULL,2); +INSERT INTO t1 VALUES (17,0,NULL,'style',NULL,19); +INSERT INTO t1 VALUES (32767,0,NULL,'o',NULL,840); +INSERT INTO t1 VALUES (-12239,0,NULL,'marker',NULL,152); +INSERT INTO t1 VALUES (9,0,NULL,'wcfggsaoysceuzohfq',NULL,160); +INSERT INTO t1 VALUES (212,0,NULL,'fggsaoysceuzohfqhhrnnxkuwsbefbdefxucxqiowgsrsq',NULL,521); +INSERT INTO t1 VALUES (NULL,0,NULL,'Pennsylvania',NULL,0); +INSERT INTO t1 VALUES (4,0,NULL,'North Dakota',NULL,67); +INSERT INTO t1 VALUES (NULL,0,NULL,'Minnesota',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'l',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'known',NULL,0); +INSERT INTO t1 VALUES (-3384,0,NULL,'uzohfqhhrnnxkuwsbefbdef',NULL,401); +INSERT INTO t1 VALUES (0,0,NULL,'f',NULL,5); +INSERT INTO t1 VALUES (210,0,NULL,'conclusion',NULL,110); +INSERT INTO t1 VALUES (17237,0,NULL,'h',NULL,NULL); +INSERT INTO t1 VALUES (21561,0,NULL,'examine',NULL,699); +INSERT INTO t1 VALUES (32767,0,NULL,'xkuwsbefbdefxucx',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'Virginia',NULL,47); +INSERT INTO t1 VALUES (3,0,NULL,'g',NULL,NULL); +INSERT INTO t1 VALUES (111,0,NULL,'correctly',NULL,0); +INSERT INTO t1 VALUES (-588,0,NULL,'j',NULL,180); +INSERT INTO t1 VALUES (10747,0,NULL,'be',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'e',NULL,8); +INSERT INTO t1 VALUES (NULL,0,NULL,'defxucxqiowgsrsqg',NULL,NULL); +INSERT INTO t1 VALUES (214,0,NULL,'v',NULL,183); +INSERT INTO t1 VALUES (0,0,NULL,'xqiowgsrsqghqvetkcthoaigpdmsltmfepvjynircsyhydh',NULL,442); +INSERT INTO t1 VALUES (21,0,NULL,'q',NULL,212); +INSERT INTO t1 VALUES (6,0,NULL,'w',NULL,474); +INSERT INTO t1 VALUES (0,0,NULL,'portfolio',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'s',NULL,NULL); +INSERT INTO t1 VALUES (-2945,0,NULL,'g',NULL,536); +INSERT INTO t1 VALUES (NULL,0,NULL,'slam',NULL,3); +INSERT INTO t1 VALUES (172,0,NULL,'South Carolina',NULL,0); +INSERT INTO t1 VALUES (-15771,0,NULL,'u',NULL,105); +INSERT INTO t1 VALUES (0,0,NULL,'New Mexico',NULL,3); +INSERT INTO t1 VALUES (-27986,0,NULL,'ho',NULL,NULL); +INSERT INTO t1 VALUES (21055,0,NULL,'igpdmsltmfepvjynircsyhydhsmudplhhmhanqhwqrvpvcwltaxycuccy',NULL,360); +INSERT INTO t1 VALUES (8,0,NULL,'q',NULL,12); +INSERT INTO t1 VALUES (235,0,NULL,'msltmfepvjynircsyhydhsmudplh',NULL,764); +INSERT INTO t1 VALUES (32767,0,NULL,'Florida',NULL,932); +INSERT INTO t1 VALUES (184,0,NULL,'vision',NULL,183); +INSERT INTO t1 VALUES (4,0,NULL,'c',NULL,776); +INSERT INTO t1 VALUES (6,0,NULL,'pv',NULL,0); +INSERT INTO t1 VALUES (-27554,0,NULL,'conference',NULL,79); +INSERT INTO t1 VALUES (32767,0,NULL,'jy',NULL,0); +INSERT INTO t1 VALUES (5,0,NULL,'ircsyhydhsmudplhhmhanqhwq',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'Washington',NULL,8); +INSERT INTO t1 VALUES (7,0,NULL,'syhydhs',NULL,387); +INSERT INTO t1 VALUES (32767,0,NULL,'z',NULL,0); +INSERT INTO t1 VALUES (3,0,NULL,'ydhsmudplhhmhanqhwqrvpvcwltaxycuccywdujpabzv',NULL,707); +INSERT INTO t1 VALUES (NULL,0,NULL,'hsmudplhhmhanqhwqrvpvcwltaxycuccywdujpabzvtngapa',NULL,6); +INSERT INTO t1 VALUES (0,0,NULL,'udplhhmhanqhwqrvpvcwltaxy',NULL,769); +INSERT INTO t1 VALUES (2,0,NULL,'plhhmh',NULL,7); +INSERT INTO t1 VALUES (39,0,NULL,'h',NULL,0); +INSERT INTO t1 VALUES (-10547,0,NULL,'devote',NULL,0); +INSERT INTO t1 VALUES (5,0,NULL,'Louisiana',NULL,49); +INSERT INTO t1 VALUES (122,0,NULL,'nqhwqrvpvcwltaxycuccywdujpabzvtngapaidsrppccpnychu',NULL,8); +INSERT INTO t1 VALUES (6778,0,NULL,'required',NULL,595); +INSERT INTO t1 VALUES (0,0,NULL,'s',NULL,800); +INSERT INTO t1 VALUES (NULL,0,NULL,'election',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'n',NULL,-360); +INSERT INTO t1 VALUES (9,0,NULL,'doorway',NULL,146); +INSERT INTO t1 VALUES (4025,0,NULL,'vpvcwltaxycuccywdujpabzvtngapaidsrppccpnychuzvzaxa',NULL,440); +INSERT INTO t1 VALUES (25553,0,NULL,'classroom',NULL,116); +INSERT INTO t1 VALUES (0,0,NULL,'duck',NULL,0); +INSERT INTO t1 VALUES (7,0,NULL,'belly',NULL,176); +INSERT INTO t1 VALUES (11217,0,NULL,'o',NULL,928); +INSERT INTO t1 VALUES (30374,0,NULL,'j',NULL,32); +INSERT INTO t1 VALUES (32767,0,NULL,'cu',NULL,-280); +INSERT INTO t1 VALUES (3292,0,NULL,'ywdujpabzvtngapaidsrppccpnychuzvzaxajyizsnovyzqqimibnvz',NULL,NULL); +INSERT INTO t1 VALUES (5,0,NULL,'uj',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'v',NULL,NULL); +INSERT INTO t1 VALUES (31072,0,NULL,'adjustment',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'vt',NULL,NULL); +INSERT INTO t1 VALUES (11282,0,NULL,'e',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'a',NULL,0); +INSERT INTO t1 VALUES (30,0,NULL,'i',NULL,5); +INSERT INTO t1 VALUES (1,0,NULL,'Maryland',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'rppccpnychuzvzaxajyizsnovyzqq',NULL,688); +INSERT INTO t1 VALUES (4426,0,NULL,'ppccpnychuzvzaxajyizsnovyzqqimibnvzudcicgutp',NULL,3); +INSERT INTO t1 VALUES (NULL,0,NULL,'Iowa',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'x',NULL,928); +INSERT INTO t1 VALUES (1,0,NULL,'k',NULL,-88); +INSERT INTO t1 VALUES (30550,0,NULL,'p',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'huzvzaxajyizsnovyzqqimibnvzudcicgutpkrnsuqdzqjvnnesqq',NULL,577); +INSERT INTO t1 VALUES (22824,0,NULL,'uzvzaxajyizsnovyzqqimibnvzudcicgutpkrnsuqdz',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'z',NULL,0); +INSERT INTO t1 VALUES (9,0,NULL,'Rhode Island',NULL,120); +INSERT INTO t1 VALUES (5,0,NULL,'zaxajyizsnovyzqqimibnvzudcicgutpkrnsuqdzqjvnnesqqprogbfwnjvym',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'xajyizsnovyzqqimibnvzudcicg',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'certainly',NULL,0); +INSERT INTO t1 VALUES (-32548,0,NULL,'zs',NULL,-232); +INSERT INTO t1 VALUES (32767,0,NULL,'vy',NULL,5); +INSERT INTO t1 VALUES (151,0,NULL,'Vermont',NULL,171); +INSERT INTO t1 VALUES (32767,0,NULL,'Virginia',NULL,0); +INSERT INTO t1 VALUES (9,0,NULL,'h',NULL,719); +INSERT INTO t1 VALUES (19723,0,NULL,'Oregon',NULL,96); +INSERT INTO t1 VALUES (0,0,NULL,'Utah',NULL,2); +INSERT INTO t1 VALUES (73,0,NULL,'qimibnvz',NULL,-160); +INSERT INTO t1 VALUES (NULL,0,NULL,'i',NULL,NULL); +INSERT INTO t1 VALUES (29652,0,NULL,'vzudcicgutpkrnsuq',NULL,117); +INSERT INTO t1 VALUES (-8160,0,NULL,'Alabama',NULL,380); +INSERT INTO t1 VALUES (28910,0,NULL,'slow',NULL,-720); +INSERT INTO t1 VALUES (23824,0,NULL,'d',NULL,0); +INSERT INTO t1 VALUES (12,0,NULL,'wake',NULL,-328); +INSERT INTO t1 VALUES (9,0,NULL,'p',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'tpkrnsuqdzqjvnnesqqprogbfwnjvymzpewbtuefqwbjzvynkwcko',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'krnsuqdzqjvnnesqq',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'r',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'nsuqdzqjvnnesqqprogbfwnjvymzpewb',NULL,264); +INSERT INTO t1 VALUES (30,0,NULL,'qdzqjvnnesqqprogbfw',NULL,749); +INSERT INTO t1 VALUES (NULL,0,NULL,'t',NULL,NULL); +INSERT INTO t1 VALUES (250,0,NULL,'qj',NULL,736); +INSERT INTO t1 VALUES (0,0,NULL,'South Carolina',NULL,113); +INSERT INTO t1 VALUES (NULL,0,NULL,'l',NULL,532); +INSERT INTO t1 VALUES (29641,0,NULL,'sqqprogbfwnjvymzpewbtuefqwbjzvynkwckorhjvecyethcprwnxptf',NULL,9); +INSERT INTO t1 VALUES (0,0,NULL,'qprogbfwnjvymzpewbtuefqwbjzvynkwckor',NULL,491); +INSERT INTO t1 VALUES (4,0,NULL,'ogbfwnjvymzpewbtuefqwbjzvynkwckorhjvecyethcprwnxpt',NULL,987); +INSERT INTO t1 VALUES (-164,0,NULL,'i',NULL,2); +INSERT INTO t1 VALUES (18056,0,NULL,'pair',NULL,3); +INSERT INTO t1 VALUES (7,0,NULL,'appointment',NULL,5); +INSERT INTO t1 VALUES (6,0,NULL,'n',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'Massachusetts',NULL,-832); +INSERT INTO t1 VALUES (32767,0,NULL,'m',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'zpewbtuefqwbjzvynkwckorh',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'announcement',NULL,3); +INSERT INTO t1 VALUES (9,0,NULL,'e',NULL,864); +INSERT INTO t1 VALUES (54,0,NULL,'f',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'beard',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'jungle',NULL,5); +INSERT INTO t1 VALUES (32767,0,NULL,'South Dakota',NULL,8); +INSERT INTO t1 VALUES (23375,0,NULL,'s',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'Idaho',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'b',NULL,0); +INSERT INTO t1 VALUES (28335,0,NULL,'qw',NULL,NULL); +INSERT INTO t1 VALUES (147,0,NULL,'jzvynkwckorhjvecyethcprwnxptfrrcftpelmjjhwzgdgqxaeqgknlz',NULL,16); +INSERT INTO t1 VALUES (32767,0,NULL,'Texas',NULL,184); +INSERT INTO t1 VALUES (NULL,0,NULL,'amazing',NULL,0); +INSERT INTO t1 VALUES (176,0,NULL,'ckorhjvecyethcprwnxptfrrcftpelmjjhwzgdgqxaeqgknlzzhcl',NULL,219); +INSERT INTO t1 VALUES (5824,0,NULL,'rhjvecyethcprwnxptfrrcftpelmjjhwzgdgqxaeqgknlzz',NULL,8); +INSERT INTO t1 VALUES (7,0,NULL,'jvecyethcprwnxp',NULL,NULL); +INSERT INTO t1 VALUES (31315,0,NULL,'k',NULL,0); +INSERT INTO t1 VALUES (6,0,NULL,'y',NULL,-472); +INSERT INTO t1 VALUES (1,0,NULL,'Wisconsin',NULL,-208); +INSERT INTO t1 VALUES (NULL,0,NULL,'Louisiana',NULL,928); +INSERT INTO t1 VALUES (9,0,NULL,'d',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'giant',NULL,505); +INSERT INTO t1 VALUES (NULL,0,NULL,'xptfrrcftpelmjjhwzgdgqxaeqgknlzzhclsosqpyoeakxhqnjaa',NULL,941); +INSERT INTO t1 VALUES (NULL,0,NULL,'w',NULL,0); +INSERT INTO t1 VALUES (6693,0,NULL,'Ohio',NULL,3); +INSERT INTO t1 VALUES (182,0,NULL,'Delaware',NULL,119); +INSERT INTO t1 VALUES (26419,0,NULL,'tp',NULL,0); +INSERT INTO t1 VALUES (77,0,NULL,'elmjjhwzgdgqxaeqgknlzzhc',NULL,227); +INSERT INTO t1 VALUES (NULL,0,NULL,'m',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'f',NULL,653); +INSERT INTO t1 VALUES (5,0,NULL,'how',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'pick',NULL,-128); +INSERT INTO t1 VALUES (21683,0,NULL,'Missouri',NULL,135); +INSERT INTO t1 VALUES (27244,0,NULL,'q',NULL,155); +INSERT INTO t1 VALUES (0,0,NULL,'Delaware',NULL,309); +INSERT INTO t1 VALUES (0,0,NULL,'eqgknlzzhclsosqpyoeakxhqnjaagzutblkgqduiopczwkjkkzjqg',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'failure',NULL,800); +INSERT INTO t1 VALUES (0,0,NULL,'Rhode Island',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'h',NULL,NULL); +INSERT INTO t1 VALUES (10453,0,NULL,'Oregon',NULL,0); +INSERT INTO t1 VALUES (4,0,NULL,'b',NULL,-648); +INSERT INTO t1 VALUES (0,0,NULL,'s',NULL,104); +INSERT INTO t1 VALUES (8,0,NULL,'qp',NULL,344); +INSERT INTO t1 VALUES (4200,0,NULL,'pyoeakxhqnjaagzutblkgqduiopczwkjkkzjqgcnzxrfvzsgcobwhzif',NULL,86); +INSERT INTO t1 VALUES (NULL,0,NULL,'property',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'akxhqnjaag',NULL,213); +INSERT INTO t1 VALUES (131,0,NULL,'New Mexico',NULL,207); +INSERT INTO t1 VALUES (NULL,0,NULL,'contest',NULL,184); +INSERT INTO t1 VALUES (-13903,0,NULL,'decade',NULL,-96); +INSERT INTO t1 VALUES (32767,0,NULL,'aagzutbl',NULL,395); +INSERT INTO t1 VALUES (7,0,NULL,'like',NULL,324); +INSERT INTO t1 VALUES (137,0,NULL,'u',NULL,0); +INSERT INTO t1 VALUES (1,0,NULL,'b',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'g',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'duiopczwkjkkzjqgcnzxrfvzsgcobwhzifhnulqzxdrmpoeyfsifyi',NULL,-960); +INSERT INTO t1 VALUES (86,0,NULL,'s',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'op',NULL,889); +INSERT INTO t1 VALUES (5,0,NULL,'g',NULL,NULL); +INSERT INTO t1 VALUES (6,0,NULL,'czwkjkkzjq',NULL,48); +INSERT INTO t1 VALUES (195,0,NULL,'w',NULL,86); +INSERT INTO t1 VALUES (15,0,NULL,'kkzjqgcnzxrfvzsgcobwhzifhnulqzxdrmpoeyfsifyiiycarluqadgl',NULL,0); +INSERT INTO t1 VALUES (7366,0,NULL,'e',NULL,8); +INSERT INTO t1 VALUES (29558,0,NULL,'j',NULL,NULL); +INSERT INTO t1 VALUES (2268,0,NULL,'cn',NULL,9); +INSERT INTO t1 VALUES (32767,0,NULL,'nzxrfvzsgcobwhzifhnulqzxdrmpoeyfsifyiiycarluqadgldl',NULL,866); +INSERT INTO t1 VALUES (0,0,NULL,'zx',NULL,172); +INSERT INTO t1 VALUES (3,0,NULL,'xrfvzsgcobwhzifhnulqzxdrmpoeyfsify',NULL,8); +INSERT INTO t1 VALUES (NULL,0,NULL,'South Dakota',NULL,584); +INSERT INTO t1 VALUES (32767,0,NULL,'z',NULL,0); +INSERT INTO t1 VALUES (-7091,0,NULL,'g',NULL,5); +INSERT INTO t1 VALUES (32767,0,NULL,'o',NULL,311); +INSERT INTO t1 VALUES (4,0,NULL,'f',NULL,432); +INSERT INTO t1 VALUES (116,0,NULL,'Indiana',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'boundary',NULL,2); +INSERT INTO t1 VALUES (219,0,NULL,'n',NULL,626); +INSERT INTO t1 VALUES (70,0,NULL,'u',NULL,7); +INSERT INTO t1 VALUES (NULL,0,NULL,'lqz',NULL,935); +INSERT INTO t1 VALUES (9,0,NULL,'coat',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'y',NULL,0); +INSERT INTO t1 VALUES (6631,0,NULL,'master',NULL,6); +INSERT INTO t1 VALUES (0,0,NULL,'rmpoeyfsifyii',NULL,654); +INSERT INTO t1 VALUES (6,0,NULL,'p',NULL,24); +INSERT INTO t1 VALUES (-30502,0,NULL,'eyfsifyiiycarluqadgldleafqwtnqxbjccqnslyksq',NULL,6); +INSERT INTO t1 VALUES (32767,0,NULL,'r',NULL,0); +INSERT INTO t1 VALUES (22650,0,NULL,'Ohio',NULL,152); +INSERT INTO t1 VALUES (21205,0,NULL,'burning',NULL,14); +INSERT INTO t1 VALUES (65,0,NULL,'condemn',NULL,200); +INSERT INTO t1 VALUES (7,0,NULL,'fyiiycarluqadgldleafqwtnq',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'iy',NULL,242); +INSERT INTO t1 VALUES (NULL,0,NULL,'ca',NULL,796); +INSERT INTO t1 VALUES (8,0,NULL,'r',NULL,8); +INSERT INTO t1 VALUES (184,0,NULL,'u',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'Georgia',NULL,752); +INSERT INTO t1 VALUES (81,0,NULL,'North Carolina',NULL,0); +INSERT INTO t1 VALUES (-15767,0,NULL,'u',NULL,656); +INSERT INTO t1 VALUES (3,0,NULL,'Texas',NULL,784); +INSERT INTO t1 VALUES (12921,0,NULL,'girlfriend',NULL,49); +INSERT INTO t1 VALUES (69,0,NULL,'n',NULL,7); +INSERT INTO t1 VALUES (5823,0,NULL,'a',NULL,929); +INSERT INTO t1 VALUES (245,0,NULL,'fqwtnq',NULL,100); +INSERT INTO t1 VALUES (0,0,NULL,'w',NULL,-328); +INSERT INTO t1 VALUES (32767,0,NULL,'tn',NULL,256); +INSERT INTO t1 VALUES (0,0,NULL,'q',NULL,-192); +INSERT INTO t1 VALUES (19430,0,NULL,'o',NULL,NULL); +INSERT INTO t1 VALUES (21086,0,NULL,'producer',NULL,0); +INSERT INTO t1 VALUES (6,0,NULL,'cq',NULL,568); +INSERT INTO t1 VALUES (0,0,NULL,'South Dakota',NULL,253); +INSERT INTO t1 VALUES (32767,0,NULL,'kill',NULL,129); +INSERT INTO t1 VALUES (NULL,0,NULL,'u',NULL,NULL); +INSERT INTO t1 VALUES (18210,0,NULL,'seal',NULL,29); +INSERT INTO t1 VALUES (102,0,NULL,'jmxngcvwlwuvtuwmyxzulbiys',NULL,0); +INSERT INTO t1 VALUES (29116,0,NULL,'ngcvwlwuvtuwmyxzulbiysrlgjzzendrgndm',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'vw',NULL,9); +INSERT INTO t1 VALUES (0,0,NULL,'West Virginia',NULL,258); +INSERT INTO t1 VALUES (32767,0,NULL,'wuvtuwmyxz',NULL,67); +INSERT INTO t1 VALUES (32767,0,NULL,'New Hampshire',NULL,113); +INSERT INTO t1 VALUES (0,0,NULL,'a',NULL,NULL); +INSERT INTO t1 VALUES (7,0,NULL,'p',NULL,24); +INSERT INTO t1 VALUES (251,0,NULL,'m',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'y',NULL,0); +INSERT INTO t1 VALUES (31980,0,NULL,'s',NULL,989); +INSERT INTO t1 VALUES (32767,0,NULL,'encounter',NULL,NULL); +INSERT INTO t1 VALUES (10072,0,NULL,'laboratory',NULL,110); +INSERT INTO t1 VALUES (64,0,NULL,'ysrlgjzzendrgndmbuqakniwwuvhdkzkpviuzhjcaeovskckoeqzaydcn',NULL,711); +INSERT INTO t1 VALUES (33,0,NULL,'a',NULL,0); +INSERT INTO t1 VALUES (9768,0,NULL,'rl',NULL,4); +INSERT INTO t1 VALUES (32767,0,NULL,'Massachusetts',NULL,0); +INSERT INTO t1 VALUES (-27608,0,NULL,'zzendrg',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'narrative',NULL,0); +INSERT INTO t1 VALUES (32652,0,NULL,'nd',NULL,758); +INSERT INTO t1 VALUES (-27421,0,NULL,'gndmbuqakniwwuvhdkzkp',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'Michigan',NULL,672); +INSERT INTO t1 VALUES (63,0,NULL,'Washington',NULL,177); +INSERT INTO t1 VALUES (32767,0,NULL,'South Dakota',NULL,NULL); +INSERT INTO t1 VALUES (89,0,NULL,'road',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'a',NULL,161); +INSERT INTO t1 VALUES (NULL,0,NULL,'breathing',NULL,4); +INSERT INTO t1 VALUES (-3678,0,NULL,'Georgia',NULL,0); +INSERT INTO t1 VALUES (20068,0,NULL,'Minnesota',NULL,199); +INSERT INTO t1 VALUES (2,0,NULL,'v',NULL,6); +INSERT INTO t1 VALUES (0,0,NULL,'Pennsylvania',NULL,177); +INSERT INTO t1 VALUES (5,0,NULL,'commonly',NULL,0); +INSERT INTO t1 VALUES (1,0,NULL,'iuzhjcaeovskckoeqzaydc',NULL,NULL); +INSERT INTO t1 VALUES (-28253,0,NULL,'c',NULL,362); +INSERT INTO t1 VALUES (NULL,0,NULL,'cook',NULL,NULL); +INSERT INTO t1 VALUES (68,0,NULL,'standard',NULL,212); +INSERT INTO t1 VALUES (71,0,NULL,'Illinois',NULL,0); +INSERT INTO t1 VALUES (25059,0,NULL,'d',NULL,952); +INSERT INTO t1 VALUES (-17615,0,NULL,'d',NULL,19); +INSERT INTO t1 VALUES (0,0,NULL,'butt',NULL,-112); +INSERT INTO t1 VALUES (32767,0,NULL,'v',NULL,-264); +INSERT INTO t1 VALUES (NULL,0,NULL,'missing',NULL,250); +INSERT INTO t1 VALUES (-17641,0,NULL,'kc',NULL,105); +INSERT INTO t1 VALUES (30903,0,NULL,'once',NULL,595); +INSERT INTO t1 VALUES (113,0,NULL,'m',NULL,-616); +INSERT INTO t1 VALUES (NULL,0,NULL,'za',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'Alaska',NULL,318); +INSERT INTO t1 VALUES (32767,0,NULL,'Oregon',NULL,NULL); +INSERT INTO t1 VALUES (21013,0,NULL,'dear',NULL,0); +INSERT INTO t1 VALUES (23803,0,NULL,'a',NULL,936); +INSERT INTO t1 VALUES (6861,0,NULL,'c',NULL,244); +INSERT INTO t1 VALUES (1,0,NULL,'ri',NULL,9); +INSERT INTO t1 VALUES (NULL,0,NULL,'New Mexico',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'xupthytmhktihnxeysankgnfqmmf',NULL,84); +INSERT INTO t1 VALUES (59,0,NULL,'d',NULL,4); +INSERT INTO t1 VALUES (NULL,0,NULL,'suddenly',NULL,162); +INSERT INTO t1 VALUES (0,0,NULL,'share',NULL,202); +INSERT INTO t1 VALUES (NULL,0,NULL,'h',NULL,0); +INSERT INTO t1 VALUES (12334,0,NULL,'kt',NULL,0); +INSERT INTO t1 VALUES (18729,0,NULL,'hn',NULL,311); +INSERT INTO t1 VALUES (0,0,NULL,'ey',NULL,1); +INSERT INTO t1 VALUES (10,0,NULL,'Virginia',NULL,0); +INSERT INTO t1 VALUES (1167,0,NULL,'Nevada',NULL,1); +INSERT INTO t1 VALUES (11065,0,NULL,'v',NULL,30); +INSERT INTO t1 VALUES (32767,0,NULL,'Mississippi',NULL,96); +INSERT INTO t1 VALUES (5376,0,NULL,'g',NULL,6); +INSERT INTO t1 VALUES (0,0,NULL,'q',NULL,161); +INSERT INTO t1 VALUES (NULL,0,NULL,'hozhvbkimrkwyfogyxqgovowrlzdlkn',NULL,145); +INSERT INTO t1 VALUES (53,0,NULL,'z',NULL,NULL); +INSERT INTO t1 VALUES (3,0,NULL,'Connecticut',NULL,0); +INSERT INTO t1 VALUES (-1242,0,NULL,'v',NULL,711); +INSERT INTO t1 VALUES (NULL,0,NULL,'Kansas',NULL,NULL); +INSERT INTO t1 VALUES (3,0,NULL,'q',NULL,0); +INSERT INTO t1 VALUES (-7994,0,NULL,'rkwyfogyxqgovowrlzdlkngplowqyzdunpamanuewqasgpjuajeyvbeqhywn',NULL,426); +INSERT INTO t1 VALUES (NULL,0,NULL,'yfogyxqgovowrlzdlkngplowqyzdunpamanuewqasgpjuajeyv',NULL,6); +INSERT INTO t1 VALUES (55,0,NULL,'o',NULL,73); +INSERT INTO t1 VALUES (NULL,0,NULL,'qgovowrlzdlk',NULL,89); +INSERT INTO t1 VALUES (32767,0,NULL,'ovowrlzdlkngp',NULL,1); +INSERT INTO t1 VALUES (0,0,NULL,'poll',NULL,73); +INSERT INTO t1 VALUES (15368,0,NULL,'Kansas',NULL,0); +INSERT INTO t1 VALUES (-11422,0,NULL,'zdlkngplow',NULL,9); +INSERT INTO t1 VALUES (-8890,0,NULL,'kngplowqyzdunpamanuewqasgpjuajeyvbeqhywnkzbtgviyukxz',NULL,685); +INSERT INTO t1 VALUES (2184,0,NULL,'ng',NULL,3); +INSERT INTO t1 VALUES (0,0,NULL,'rider',NULL,-448); +INSERT INTO t1 VALUES (3,0,NULL,'s',NULL,227); +INSERT INTO t1 VALUES (NULL,0,NULL,'true',NULL,1); +INSERT INTO t1 VALUES (0,0,NULL,'d',NULL,274); +INSERT INTO t1 VALUES (9689,0,NULL,'suite',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'Michigan',NULL,2); +INSERT INTO t1 VALUES (-30937,0,NULL,'n',NULL,202); +INSERT INTO t1 VALUES (NULL,0,NULL,'g',NULL,22); +INSERT INTO t1 VALUES (32767,0,NULL,'w',NULL,147); +INSERT INTO t1 VALUES (217,0,NULL,'d',NULL,461); +INSERT INTO t1 VALUES (6058,0,NULL,'a',NULL,432); +INSERT INTO t1 VALUES (-2853,0,NULL,'sg',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'n',NULL,196); +INSERT INTO t1 VALUES (8,0,NULL,'j',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'j',NULL,974); +INSERT INTO t1 VALUES (0,0,NULL,'industry',NULL,0); +INSERT INTO t1 VALUES (-8236,0,NULL,'d',NULL,24); +INSERT INTO t1 VALUES (NULL,0,NULL,'qh',NULL,NULL); +INSERT INTO t1 VALUES (26313,0,NULL,'California',NULL,836); +INSERT INTO t1 VALUES (0,0,NULL,'ywnkzbtgviyukxzdxkwj',NULL,NULL); +INSERT INTO t1 VALUES (22547,0,NULL,'zbtgviyukxzdxkwjxmyiszwsexxwhejgdbsainxfsu',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'Wyoming',NULL,-696); +INSERT INTO t1 VALUES (411,0,NULL,'credit',NULL,798); +INSERT INTO t1 VALUES (1,0,NULL,'v',NULL,231); +INSERT INTO t1 VALUES (4,0,NULL,'there',NULL,156); +INSERT INTO t1 VALUES (-2887,0,NULL,'Illinois',NULL,889); +INSERT INTO t1 VALUES (4,0,NULL,'yukxzdxkwjxmyiszwsexxwhejgdbsainxfsuurwwueiuzlljraimezc',NULL,-128); +INSERT INTO t1 VALUES (0,0,NULL,'q',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'xz',NULL,296); +INSERT INTO t1 VALUES (8,0,NULL,'d',NULL,2); +INSERT INTO t1 VALUES (19143,0,NULL,'ysuamdortdfpeqhchat',NULL,1); +INSERT INTO t1 VALUES (128,0,NULL,'unknown',NULL,-864); +INSERT INTO t1 VALUES (49,0,NULL,'ortdfpeqhchatthkorvzlyvcemotaanbknuuoisfyggsebeowudp',NULL,1); +INSERT INTO t1 VALUES (NULL,0,NULL,'North Carolina',NULL,8); +INSERT INTO t1 VALUES (-17574,0,NULL,'tdfpeqhchatthkorvzlyvcemotaanbknuuoisfyggsebeowudpihwiusfzabegk',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'f',NULL,137); +INSERT INTO t1 VALUES (-13055,0,NULL,'qh',NULL,209); +INSERT INTO t1 VALUES (NULL,0,NULL,'a',NULL,165); +INSERT INTO t1 VALUES (127,0,NULL,'hatthkorvzlyvcemotaanbkn',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'casualty',NULL,-824); +INSERT INTO t1 VALUES (189,0,NULL,'w',NULL,850); +INSERT INTO t1 VALUES (0,0,NULL,'th',NULL,872); +INSERT INTO t1 VALUES (7,0,NULL,'b',NULL,103); +INSERT INTO t1 VALUES (11552,0,NULL,'r',NULL,584); +INSERT INTO t1 VALUES (7,0,NULL,'halfway',NULL,-544); +INSERT INTO t1 VALUES (246,0,NULL,'peak',NULL,0); +INSERT INTO t1 VALUES (2218,0,NULL,'d',NULL,0); +INSERT INTO t1 VALUES (26017,0,NULL,'emotaanbknuuoisfyggsebeowudpihwiusfzabegktdhkddnhpuliqiao',NULL,3); +INSERT INTO t1 VALUES (32767,0,NULL,'killing',NULL,NULL); +INSERT INTO t1 VALUES (-18822,0,NULL,'Hawaii',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'New Jersey',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'Oklahoma',NULL,344); +INSERT INTO t1 VALUES (NULL,0,NULL,'nuuoisfyggsebeowudpihwiusfzabegktdhkddnhpul',NULL,896); +INSERT INTO t1 VALUES (2,0,NULL,'approval',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'v',NULL,117); +INSERT INTO t1 VALUES (0,0,NULL,'w',NULL,525); +INSERT INTO t1 VALUES (8,0,NULL,'uoisfyggseb',NULL,231); +INSERT INTO t1 VALUES (0,0,NULL,'Oklahoma',NULL,36); +INSERT INTO t1 VALUES (NULL,0,NULL,'p',NULL,-312); +INSERT INTO t1 VALUES (0,0,NULL,'South Carolina',NULL,5); +INSERT INTO t1 VALUES (127,0,NULL,'n',NULL,198); +INSERT INTO t1 VALUES (175,0,NULL,'ebeowudpihwiusfzabegktdhkddnhpuliq',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'beowudpihwiusfzabegktdhkddnhp',NULL,0); +INSERT INTO t1 VALUES (145,0,NULL,'e',NULL,888); +INSERT INTO t1 VALUES (-26393,0,NULL,'recall',NULL,172); +INSERT INTO t1 VALUES (32767,0,NULL,'Massachusetts',NULL,210); +INSERT INTO t1 VALUES (125,0,NULL,'hwiusfzabegktdhkddnhpuliqiaocxuasqfm',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'wi',NULL,132); +INSERT INTO t1 VALUES (208,0,NULL,'b',NULL,174); +INSERT INTO t1 VALUES (-2811,0,NULL,'Michigan',NULL,35); +INSERT INTO t1 VALUES (31649,0,NULL,'fz',NULL,817); +INSERT INTO t1 VALUES (NULL,0,NULL,'b',NULL,100); +INSERT INTO t1 VALUES (32767,0,NULL,'k',NULL,224); +INSERT INTO t1 VALUES (119,0,NULL,'t',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'be',NULL,NULL); +INSERT INTO t1 VALUES (9,0,NULL,'communication',NULL,960); +INSERT INTO t1 VALUES (3,0,NULL,'concrete',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'z',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'uliqiaocxuasqfmrtqzapk',NULL,115); +INSERT INTO t1 VALUES (10801,0,NULL,'Utah',NULL,473); +INSERT INTO t1 VALUES (0,0,NULL,'i',NULL,6); +INSERT INTO t1 VALUES (NULL,0,NULL,'Delaware',NULL,0); +INSERT INTO t1 VALUES (20394,0,NULL,'input',NULL,0); +INSERT INTO t1 VALUES (-7220,0,NULL,'Minnesota',NULL,214); +INSERT INTO t1 VALUES (11769,0,NULL,'o',NULL,176); +INSERT INTO t1 VALUES (0,0,NULL,'a',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'q',NULL,330); +INSERT INTO t1 VALUES (NULL,0,NULL,'loyal',NULL,4); +INSERT INTO t1 VALUES (28380,0,NULL,'p',NULL,721); +INSERT INTO t1 VALUES (0,0,NULL,'zapkkyoihc',NULL,NULL); +INSERT INTO t1 VALUES (141,0,NULL,'kkyoihcjkajdhiiuoamcqdozgdlrctoxousgtwbkorqhjxntnwvkmnpma',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'ky',NULL,-784); +INSERT INTO t1 VALUES (25414,0,NULL,'yoihcjkajdhiiuoamcqdozgdl',NULL,NULL); +INSERT INTO t1 VALUES (-23163,0,NULL,'h',NULL,720); +INSERT INTO t1 VALUES (7,0,NULL,'n',NULL,928); +INSERT INTO t1 VALUES (3,0,NULL,'kaj',NULL,NULL); +INSERT INTO t1 VALUES (145,0,NULL,'draft',NULL,88); +INSERT INTO t1 VALUES (5,0,NULL,'b',NULL,49); +INSERT INTO t1 VALUES (4,0,NULL,'dhiiuoamcqdozgdlrctoxou',NULL,0); +INSERT INTO t1 VALUES (171,0,NULL,'iu',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'mc',NULL,384); +INSERT INTO t1 VALUES (4,0,NULL,'Illinois',NULL,0); +INSERT INTO t1 VALUES (6,0,NULL,'etc',NULL,104); +INSERT INTO t1 VALUES (NULL,0,NULL,'v',NULL,968); +INSERT INTO t1 VALUES (7,0,NULL,'rctoxousgtwbkorqhjxntnwvkmnpmazmeyarrywowwntwuedjsu',NULL,NULL); +INSERT INTO t1 VALUES (57,0,NULL,'voting',NULL,9); +INSERT INTO t1 VALUES (26320,0,NULL,'u',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'x',NULL,5); +INSERT INTO t1 VALUES (7,0,NULL,'us',NULL,251); +INSERT INTO t1 VALUES (3,0,NULL,'twbkorqhjxn',NULL,334); +INSERT INTO t1 VALUES (9,0,NULL,'copy',NULL,563); +INSERT INTO t1 VALUES (0,0,NULL,'North Carolina',NULL,0); +INSERT INTO t1 VALUES (249,0,NULL,'Arkansas',NULL,114); +INSERT INTO t1 VALUES (152,0,NULL,'hjxntnwvkmnpmazmeyarrywowwntwuedjs',NULL,7); +INSERT INTO t1 VALUES (0,0,NULL,'xntnwvkmnpmazmeyarrywowwntwue',NULL,23); +INSERT INTO t1 VALUES (28399,0,NULL,'tnwvkmnpmazmeyarr',NULL,914); +INSERT INTO t1 VALUES (32767,0,NULL,'Iowa',NULL,0); +INSERT INTO t1 VALUES (43,0,NULL,'n',NULL,8); +INSERT INTO t1 VALUES (-18416,0,NULL,'maximum',NULL,190); +INSERT INTO t1 VALUES (169,0,NULL,'Louisiana',NULL,0); +INSERT INTO t1 VALUES (14,0,NULL,'q',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'n',NULL,86); +INSERT INTO t1 VALUES (0,0,NULL,'k',NULL,-912); +INSERT INTO t1 VALUES (NULL,0,NULL,'rr',NULL,368); +INSERT INTO t1 VALUES (32767,0,NULL,'g',NULL,768); +INSERT INTO t1 VALUES (3,0,NULL,'pickup',NULL,8); +INSERT INTO t1 VALUES (0,0,NULL,'honest',NULL,34); +INSERT INTO t1 VALUES (16895,0,NULL,'so',NULL,888); +INSERT INTO t1 VALUES (32767,0,NULL,'e',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'play',NULL,82); +INSERT INTO t1 VALUES (12622,0,NULL,'m',NULL,42); +INSERT INTO t1 VALUES (0,0,NULL,'ue',NULL,0); +INSERT INTO t1 VALUES (2,0,NULL,'djsuvvuntfauimqchxjgbzfiambcxhvmtltykjwu',NULL,NULL); +INSERT INTO t1 VALUES (210,0,NULL,'su',NULL,77); +INSERT INTO t1 VALUES (NULL,0,NULL,'Florida',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'Arkansas',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'untfauimqchxjgbzfia',NULL,3); +INSERT INTO t1 VALUES (29576,0,NULL,'Arkansas',NULL,980); +INSERT INTO t1 VALUES (227,0,NULL,'u',NULL,520); +INSERT INTO t1 VALUES (3,0,NULL,'imqchxjgbzfiambcxhvmtltykjwulfefqfiykyhqozcnbtzpxonitsw',NULL,-136); +INSERT INTO t1 VALUES (NULL,0,NULL,'chx',NULL,1); +INSERT INTO t1 VALUES (5537,0,NULL,'Mississippi',NULL,872); +INSERT INTO t1 VALUES (0,0,NULL,'jgbzfiambcxhvmtl',NULL,-728); +INSERT INTO t1 VALUES (229,0,NULL,'bzfiambcxhvmtltykjwulfefqfiykyhqozcnbtzpxonits',NULL,211); +INSERT INTO t1 VALUES (-16943,0,NULL,'f',NULL,641); +INSERT INTO t1 VALUES (6,0,NULL,'q',NULL,7); +INSERT INTO t1 VALUES (1066,0,NULL,'buy',NULL,NULL); +INSERT INTO t1 VALUES (9,0,NULL,'k',NULL,952); +INSERT INTO t1 VALUES (11079,0,NULL,'g',NULL,0); +INSERT INTO t1 VALUES (2,0,NULL,'xh',NULL,NULL); +INSERT INTO t1 VALUES (5,0,NULL,'mtltykjwulfefqfiykyhqozcn',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'w',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'a',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'influential',NULL,8); +INSERT INTO t1 VALUES (-26136,0,NULL,'u',NULL,460); +INSERT INTO t1 VALUES (10308,0,NULL,'lfefqfiykyhqozcnbtzpxonitswxmkoaagmmpxhyefkvhynit',NULL,383); +INSERT INTO t1 VALUES (6,0,NULL,'fq',NULL,800); +INSERT INTO t1 VALUES (9,0,NULL,'x',NULL,19); +INSERT INTO t1 VALUES (0,0,NULL,'y',NULL,0); +INSERT INTO t1 VALUES (197,0,NULL,'yhqozcnbtzpxonitswxmkoaagmmpxhyefkvhynitxebnkuj',NULL,28); +INSERT INTO t1 VALUES (0,0,NULL,'Nevada',NULL,746); +INSERT INTO t1 VALUES (233,0,NULL,'Vermont',NULL,0); +INSERT INTO t1 VALUES (34,0,NULL,'s',NULL,2); +INSERT INTO t1 VALUES (32767,0,NULL,'cnbtzpxonitswxmkoaagmmpxhyefkvhynitxebnkujdffizkgzsobnkapdhsgi',NULL,NULL); +INSERT INTO t1 VALUES (27288,0,NULL,'btzpxonitswxmkoaagmmpxhyefkvhynitxebnkujdffizkgzsobnkapd',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'m',NULL,4); +INSERT INTO t1 VALUES (NULL,0,NULL,'Nebraska',NULL,NULL); +INSERT INTO t1 VALUES (-27150,0,NULL,'o',NULL,242); +INSERT INTO t1 VALUES (0,0,NULL,'explain',NULL,15); +INSERT INTO t1 VALUES (26756,0,NULL,'x',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'than',NULL,9); +INSERT INTO t1 VALUES (NULL,0,NULL,'session',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'tswxmkoaagmmpxhyefkvhynitxebnkujdffizkgzsobnkapdhsgiyimagniglns',NULL,587); +INSERT INTO t1 VALUES (45,0,NULL,'pursue',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'m',NULL,132); +INSERT INTO t1 VALUES (9,0,NULL,'Idaho',NULL,4); +INSERT INTO t1 VALUES (1,0,NULL,'flavor',NULL,139); +INSERT INTO t1 VALUES (0,0,NULL,'offender',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'gmmpxhyefkvhynitxebnkujdffizkgzsobnkapdhsgiyimagnigl',NULL,-544); +INSERT INTO t1 VALUES (87,0,NULL,'mmpxhyefkvhyn',NULL,4); +INSERT INTO t1 VALUES (159,0,NULL,'pxhyefkvhynitxebnkujdffizkgzsobnkapdhsgi',NULL,0); +INSERT INTO t1 VALUES (242,0,NULL,'hy',NULL,113); +INSERT INTO t1 VALUES (30,0,NULL,'e',NULL,325); +INSERT INTO t1 VALUES (NULL,0,NULL,'kv',NULL,-624); +INSERT INTO t1 VALUES (0,0,NULL,'ynitxebnkujdffizkgzsobnkapdhsgiyimagniglnsaocuagnv',NULL,708); +INSERT INTO t1 VALUES (227,0,NULL,'Utah',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'Kentucky',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'hard',NULL,3); +INSERT INTO t1 VALUES (8,0,NULL,'c',NULL,NULL); +INSERT INTO t1 VALUES (4,0,NULL,'i',NULL,0); +INSERT INTO t1 VALUES (174,0,NULL,'nk',NULL,188); +INSERT INTO t1 VALUES (106,0,NULL,'spectacular',NULL,2); +INSERT INTO t1 VALUES (0,0,NULL,'quiet',NULL,586); +INSERT INTO t1 VALUES (155,0,NULL,'chop',NULL,237); +INSERT INTO t1 VALUES (1,0,NULL,'undergraduate',NULL,464); +INSERT INTO t1 VALUES (NULL,0,NULL,'iz',NULL,-224); +INSERT INTO t1 VALUES (32767,0,NULL,'Maryland',NULL,619); +INSERT INTO t1 VALUES (NULL,0,NULL,'kgzsobnkapdhsgiyimagniglnsaocuagnvqciwxiiquuzmfzfffty',NULL,-200); +INSERT INTO t1 VALUES (8,0,NULL,'so',NULL,581); +INSERT INTO t1 VALUES (1,0,NULL,'nkapdhsgiyimagniglnsaocuagnvqciwxiiquuzmfzffft',NULL,NULL); +INSERT INTO t1 VALUES (2,0,NULL,'b',NULL,0); +INSERT INTO t1 VALUES (-22001,0,NULL,'corridor',NULL,NULL); +INSERT INTO t1 VALUES (4,0,NULL,'sgiyimagniglnsaocuagnvqciwxiiquuzmfzffftyxvxxv',NULL,-24); +INSERT INTO t1 VALUES (122,0,NULL,'g',NULL,624); +INSERT INTO t1 VALUES (0,0,NULL,'makeup',NULL,NULL); +INSERT INTO t1 VALUES (32,0,NULL,'chest',NULL,-680); +INSERT INTO t1 VALUES (3,0,NULL,'w',NULL,63); +INSERT INTO t1 VALUES (224,0,NULL,'Utah',NULL,800); +INSERT INTO t1 VALUES (194,0,NULL,'ni',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'i',NULL,3); +INSERT INTO t1 VALUES (28,0,NULL,'ln',NULL,NULL); +INSERT INTO t1 VALUES (-27045,0,NULL,'protection',NULL,349); +INSERT INTO t1 VALUES (4,0,NULL,'ns',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'Tennessee',NULL,0); +INSERT INTO t1 VALUES (-21629,0,NULL,'c',NULL,4); +INSERT INTO t1 VALUES (28847,0,NULL,'g',NULL,46); +INSERT INTO t1 VALUES (44,0,NULL,'nvqciwxiiquuzmfzffftyxvxxvnsfpxpqdny',NULL,220); +INSERT INTO t1 VALUES (4,0,NULL,'s',NULL,26); +INSERT INTO t1 VALUES (77,0,NULL,'abandon',NULL,-848); +INSERT INTO t1 VALUES (-27160,0,NULL,'m',NULL,2); +INSERT INTO t1 VALUES (0,0,NULL,'qciwxiiquuzmfzffftyxvxxvnsfpxpqdnyzusaefncvuyxnqbwedgpprpgf',NULL,55); +INSERT INTO t1 VALUES (32767,0,NULL,'w',NULL,192); +INSERT INTO t1 VALUES (0,0,NULL,'could',NULL,0); +INSERT INTO t1 VALUES (6,0,NULL,'charge',NULL,-408); +INSERT INTO t1 VALUES (-22785,0,NULL,'North Dakota',NULL,-320); +INSERT INTO t1 VALUES (11582,0,NULL,'d',NULL,945); +INSERT INTO t1 VALUES (NULL,0,NULL,'mf',NULL,0); +INSERT INTO t1 VALUES (126,0,NULL,'routine',NULL,1); +INSERT INTO t1 VALUES (0,0,NULL,'zffftyxvxxvnsfpxpqdnyzu',NULL,928); +INSERT INTO t1 VALUES (16638,0,NULL,'necessity',NULL,3); +INSERT INTO t1 VALUES (32431,0,NULL,'fty',NULL,9); +INSERT INTO t1 VALUES (0,0,NULL,'Maryland',NULL,136); +INSERT INTO t1 VALUES (NULL,0,NULL,'yxvxxvnsfpxpqdnyzusaefncvuyxnqbwedgpp',NULL,3); +INSERT INTO t1 VALUES (0,0,NULL,'vxxvnsfpxpqdnyzusaefncvuyxnqbwedgpprpgfqyh',NULL,3); +INSERT INTO t1 VALUES (32767,0,NULL,'anxiety',NULL,580); +INSERT INTO t1 VALUES (32767,0,NULL,'defensive',NULL,27); +INSERT INTO t1 VALUES (NULL,0,NULL,'Pennsylvania',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'l',NULL,2); +INSERT INTO t1 VALUES (143,0,NULL,'b',NULL,31); +INSERT INTO t1 VALUES (0,0,NULL,'f',NULL,NULL); +INSERT INTO t1 VALUES (9,0,NULL,'x',NULL,-528); +INSERT INTO t1 VALUES (NULL,0,NULL,'Oklahoma',NULL,0); +INSERT INTO t1 VALUES (42,0,NULL,'p',NULL,67); +INSERT INTO t1 VALUES (3,0,NULL,'Vermont',NULL,9); +INSERT INTO t1 VALUES (58,0,NULL,'ny',NULL,0); +INSERT INTO t1 VALUES (135,0,NULL,'saefncvuyxnqbwedgpprpgfqyhmoqdmwmiwrgehdnteyvlymyccrdlobsqnvuhm',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'West Virginia',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'efncvuyxnqbwedgpprpgfqyhmoqdmwmiwrgehdnteyvlymyccrdlobs',NULL,568); +INSERT INTO t1 VALUES (1,0,NULL,'l',NULL,6); +INSERT INTO t1 VALUES (46,0,NULL,'cvuyxnqbwedgpprpgfqyhmoq',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'uyxnqbwed',NULL,928); +INSERT INTO t1 VALUES (NULL,0,NULL,'Minnesota',NULL,0); +INSERT INTO t1 VALUES (31825,0,NULL,'Illinois',NULL,NULL); +INSERT INTO t1 VALUES (9,0,NULL,'South Dakota',NULL,0); +INSERT INTO t1 VALUES (162,0,NULL,'t',NULL,74); +INSERT INTO t1 VALUES (99,0,NULL,'dg',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'pr',NULL,0); +INSERT INTO t1 VALUES (7,0,NULL,'officially',NULL,-712); +INSERT INTO t1 VALUES (12140,0,NULL,'p',NULL,0); +INSERT INTO t1 VALUES (1291,0,NULL,'yh',NULL,6); +INSERT INTO t1 VALUES (0,0,NULL,'h',NULL,115); +INSERT INTO t1 VALUES (NULL,0,NULL,'Colorado',NULL,2); +INSERT INTO t1 VALUES (32767,0,NULL,'k',NULL,3); +INSERT INTO t1 VALUES (0,0,NULL,'miwrgehdnteyvlymyccrdlobsqnvuhmgyvukmp',NULL,386); +INSERT INTO t1 VALUES (NULL,0,NULL,'North Dakota',NULL,0); +INSERT INTO t1 VALUES (-20852,0,NULL,'g',NULL,912); +INSERT INTO t1 VALUES (0,0,NULL,'dnteyvl',NULL,54); +INSERT INTO t1 VALUES (7,0,NULL,'tey',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'yvlymyccrdlobsqnvuhmg',NULL,88); +INSERT INTO t1 VALUES (0,0,NULL,'y',NULL,NULL); +INSERT INTO t1 VALUES (156,0,NULL,'my',NULL,361); +INSERT INTO t1 VALUES (32767,0,NULL,'f',NULL,227); +INSERT INTO t1 VALUES (NULL,0,NULL,'California',NULL,915); +INSERT INTO t1 VALUES (179,0,NULL,'Ohio',NULL,-968); +INSERT INTO t1 VALUES (117,0,NULL,'lobsqnvuhmgyvukmprhonjoiawllmhf',NULL,201); +INSERT INTO t1 VALUES (-27545,0,NULL,'m',NULL,109); +INSERT INTO t1 VALUES (251,0,NULL,'q',NULL,762); +INSERT INTO t1 VALUES (NULL,0,NULL,'royal',NULL,0); +INSERT INTO t1 VALUES (31557,0,NULL,'Montana',NULL,398); +INSERT INTO t1 VALUES (6,0,NULL,'gyvukmprhonjoiawllmhfdjzwfflnops',NULL,100); +INSERT INTO t1 VALUES (27311,0,NULL,'vu',NULL,990); +INSERT INTO t1 VALUES (0,0,NULL,'North Carolina',NULL,992); +INSERT INTO t1 VALUES (790,0,NULL,'mprhonjoiawllmhfdjzwfflnopswkconfvcfgxnaubjgqaouxnruacblp',NULL,911); +INSERT INTO t1 VALUES (99,0,NULL,'glass',NULL,874); +INSERT INTO t1 VALUES (3,0,NULL,'roman',NULL,821); +INSERT INTO t1 VALUES (6,0,NULL,'rhonjoiawllmhfdjzwfflnopswkconfvcfgxnaubjgqaouxn',NULL,-8); +INSERT INTO t1 VALUES (94,0,NULL,'Wisconsin',NULL,207); +INSERT INTO t1 VALUES (0,0,NULL,'Alabama',NULL,2); +INSERT INTO t1 VALUES (6,0,NULL,'suspect',NULL,6); +INSERT INTO t1 VALUES (NULL,0,NULL,'aw',NULL,-520); +INSERT INTO t1 VALUES (9,0,NULL,'lmhfdjzwfflnopswkconfvcfgxnaubjgqaouxnruacblpwurbz',NULL,3); +INSERT INTO t1 VALUES (9568,0,NULL,'g',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'djzwfflnopswkconfvcfgxnaubjgqaouxnruacblpwurbzdlpncouones',NULL,880); +INSERT INTO t1 VALUES (7001,0,NULL,'m',NULL,306); +INSERT INTO t1 VALUES (23109,0,NULL,'s',NULL,448); +INSERT INTO t1 VALUES (32767,0,NULL,'introduce',NULL,8); +INSERT INTO t1 VALUES (1,0,NULL,'fflnopswkconfvcfgxnaubjgqaouxnru',NULL,-544); +INSERT INTO t1 VALUES (214,0,NULL,'l',NULL,56); +INSERT INTO t1 VALUES (5,0,NULL,'Kentucky',NULL,259); +INSERT INTO t1 VALUES (-757,0,NULL,'p',NULL,192); +INSERT INTO t1 VALUES (NULL,0,NULL,'wkconfvcfgxnaubjgqaouxnruacblpwurbzdlpncouonesd',NULL,8); +INSERT INTO t1 VALUES (0,0,NULL,'confvcfgxnaubjgqaouxnruacblpwurb',NULL,0); +INSERT INTO t1 VALUES (-31049,0,NULL,'longtime',NULL,65); +INSERT INTO t1 VALUES (25,0,NULL,'walking',NULL,NULL); +INSERT INTO t1 VALUES (2393,0,NULL,'f',NULL,20); +INSERT INTO t1 VALUES (1,0,NULL,'Oregon',NULL,438); +INSERT INTO t1 VALUES (14610,0,NULL,'Maryland',NULL,NULL); +INSERT INTO t1 VALUES (13039,0,NULL,'New Mexico',NULL,0); +INSERT INTO t1 VALUES (24175,0,NULL,'naubjgqaouxnruacblpwurbzdlpncouonesdoepwzafzqjbxvwo',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'u',NULL,7); +INSERT INTO t1 VALUES (9,0,NULL,'gqaouxnruacblpwurbzdlpncouonesdoepwza',NULL,498); +INSERT INTO t1 VALUES (8,0,NULL,'observation',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'ouxn',NULL,132); +INSERT INTO t1 VALUES (13366,0,NULL,'nruacblpwurbzdlpncouonesdoepwzafzqjbxvwo',NULL,287); +INSERT INTO t1 VALUES (145,0,NULL,'uacblpwurbzdlpncouonesdoepwzafzqjbxvwoe',NULL,0); +INSERT INTO t1 VALUES (14293,0,NULL,'c',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'institution',NULL,8); +INSERT INTO t1 VALUES (147,0,NULL,'Maryland',NULL,0); +INSERT INTO t1 VALUES (-31412,0,NULL,'c',NULL,-440); +INSERT INTO t1 VALUES (0,0,NULL,'rbz',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'achieve',NULL,472); +INSERT INTO t1 VALUES (31,0,NULL,'s',NULL,8); +INSERT INTO t1 VALUES (5,0,NULL,'g',NULL,7); +INSERT INTO t1 VALUES (NULL,0,NULL,'North Carolina',NULL,380); +INSERT INTO t1 VALUES (32767,0,NULL,'t',NULL,-336); +INSERT INTO t1 VALUES (0,0,NULL,'lpncouonesdoepwzafzqjbxvwoekkivtce',NULL,33); +INSERT INTO t1 VALUES (0,0,NULL,'Montana',NULL,NULL); +INSERT INTO t1 VALUES (3,0,NULL,'pncouonesdoepwzafzqjbxvwoekkivtcesl',NULL,723); +INSERT INTO t1 VALUES (NULL,0,NULL,'u',NULL,0); +INSERT INTO t1 VALUES (63,0,NULL,'on',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'frustrate',NULL,83); +INSERT INTO t1 VALUES (NULL,0,NULL,'klcvzuvzzhvxqjupfbbocyvbgiwysnfjiojwzzfvdgaregnglbhd',NULL,128); +INSERT INTO t1 VALUES (25809,0,NULL,'z',NULL,NULL); +INSERT INTO t1 VALUES (34,0,NULL,'bonus',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'discover',NULL,NULL); +INSERT INTO t1 VALUES (191,0,NULL,'shorts',NULL,245); +INSERT INTO t1 VALUES (32767,0,NULL,'hungry',NULL,-944); +INSERT INTO t1 VALUES (2,0,NULL,'o',NULL,958); +INSERT INTO t1 VALUES (209,0,NULL,'ju',NULL,4); +INSERT INTO t1 VALUES (-14598,0,NULL,'spot',NULL,190); +INSERT INTO t1 VALUES (2077,0,NULL,'West Virginia',NULL,NULL); +INSERT INTO t1 VALUES (4,0,NULL,'e',NULL,350); +INSERT INTO t1 VALUES (-19212,0,NULL,'Louisiana',NULL,6); +INSERT INTO t1 VALUES (NULL,0,NULL,'North Carolina',NULL,0); +INSERT INTO t1 VALUES (60,0,NULL,'w',NULL,6); +INSERT INTO t1 VALUES (2496,0,NULL,'Alabama',NULL,NULL); +INSERT INTO t1 VALUES (30994,0,NULL,'s',NULL,6); +INSERT INTO t1 VALUES (0,0,NULL,'h',NULL,2); +INSERT INTO t1 VALUES (148,0,NULL,'w',NULL,87); +INSERT INTO t1 VALUES (-28993,0,NULL,'Nebraska',NULL,5); +INSERT INTO t1 VALUES (NULL,0,NULL,'solar',NULL,NULL); +INSERT INTO t1 VALUES (6,0,NULL,'Delaware',NULL,440); +INSERT INTO t1 VALUES (0,0,NULL,'io',NULL,-456); +INSERT INTO t1 VALUES (0,0,NULL,'nonprofit',NULL,3); +INSERT INTO t1 VALUES (94,0,NULL,'p',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'New Jersey',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'badly',NULL,-976); +INSERT INTO t1 VALUES (0,0,NULL,'vdgaregnglbhdyuz',NULL,-512); +INSERT INTO t1 VALUES (53,0,NULL,'y',NULL,3); +INSERT INTO t1 VALUES (1334,0,NULL,'re',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'gnglbhdyuzefxyqyvzgqengmivoxdyeps',NULL,91); +INSERT INTO t1 VALUES (32767,0,NULL,'r',NULL,170); +INSERT INTO t1 VALUES (0,0,NULL,'Delaware',NULL,255); +INSERT INTO t1 VALUES (83,0,NULL,'hd',NULL,811); +INSERT INTO t1 VALUES (-3048,0,NULL,'Maryland',NULL,-704); +INSERT INTO t1 VALUES (32767,0,NULL,'resist',NULL,80); +INSERT INTO t1 VALUES (32767,0,NULL,'u',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'uzefxyqyvzgqengmivoxdyepsuxvtphayypszsnjuol',NULL,496); +INSERT INTO t1 VALUES (32767,0,NULL,'Hawaii',NULL,812); +INSERT INTO t1 VALUES (32767,0,NULL,'Missouri',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'yvzgqengmivoxdyepsuxv',NULL,0); +INSERT INTO t1 VALUES (-14971,0,NULL,'Iowa',NULL,158); +INSERT INTO t1 VALUES (5,0,NULL,'zgqengmivoxdyepsuxvtphayypszsnjuoldxekhknxplp',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'gqengmivoxdyepsuxvtphayypszsnjuoldx',NULL,652); +INSERT INTO t1 VALUES (0,0,NULL,'t',NULL,649); +INSERT INTO t1 VALUES (0,0,NULL,'m',NULL,40); +INSERT INTO t1 VALUES (6,0,NULL,'oxdyepsuxvtphayypszsnjuold',NULL,NULL); +INSERT INTO t1 VALUES (4374,0,NULL,'e',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'t',NULL,168); +INSERT INTO t1 VALUES (250,0,NULL,'yepsuxvtphayypszsnjuo',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'New York',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'complete',NULL,871); +INSERT INTO t1 VALUES (9,0,NULL,'uxvtphayy',NULL,-144); +INSERT INTO t1 VALUES (56,0,NULL,'nod',NULL,-504); +INSERT INTO t1 VALUES (0,0,NULL,'v',NULL,680); +INSERT INTO t1 VALUES (181,0,NULL,'Massachusetts',NULL,322); +INSERT INTO t1 VALUES (32767,0,NULL,'nuclear',NULL,664); +INSERT INTO t1 VALUES (163,0,NULL,'u',NULL,117); +INSERT INTO t1 VALUES (32767,0,NULL,'ay',NULL,-280); +INSERT INTO t1 VALUES (11214,0,NULL,'z',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'y',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'m',NULL,822); +INSERT INTO t1 VALUES (0,0,NULL,'California',NULL,91); +INSERT INTO t1 VALUES (-26918,0,NULL,'date',NULL,343); +INSERT INTO t1 VALUES (-25243,0,NULL,'reception',NULL,NULL); +INSERT INTO t1 VALUES (210,0,NULL,'comment',NULL,4); +INSERT INTO t1 VALUES (73,0,NULL,'w',NULL,734); +INSERT INTO t1 VALUES (-7394,0,NULL,'j',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'j',NULL,5); +INSERT INTO t1 VALUES (-4137,0,NULL,'Georgia',NULL,0); +INSERT INTO t1 VALUES (140,0,NULL,'l',NULL,-880); +INSERT INTO t1 VALUES (-12829,0,NULL,'Nebraska',NULL,0); +INSERT INTO t1 VALUES (16211,0,NULL,'hknxplpjbfdlgldb',NULL,NULL); +INSERT INTO t1 VALUES (14906,0,NULL,'d',NULL,218); +INSERT INTO t1 VALUES (148,0,NULL,'x',NULL,-736); +INSERT INTO t1 VALUES (0,0,NULL,'pl',NULL,59); +INSERT INTO t1 VALUES (NULL,0,NULL,'x',NULL,183); +INSERT INTO t1 VALUES (0,0,NULL,'fd',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'possibility',NULL,3); +INSERT INTO t1 VALUES (-7506,0,NULL,'Washington',NULL,512); +INSERT INTO t1 VALUES (32767,0,NULL,'Illinois',NULL,6); +INSERT INTO t1 VALUES (NULL,0,NULL,'bhmxtau',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'Colorado',NULL,0); +INSERT INTO t1 VALUES (1,0,NULL,'mxta',NULL,NULL); +INSERT INTO t1 VALUES (6,0,NULL,'m',NULL,994); +INSERT INTO t1 VALUES (0,0,NULL,'Massachusetts',NULL,16); +INSERT INTO t1 VALUES (-17799,0,NULL,'Massachusetts',NULL,91); +INSERT INTO t1 VALUES (32767,0,NULL,'motion',NULL,139); +INSERT INTO t1 VALUES (NULL,0,NULL,'Utah',NULL,-160); +INSERT INTO t1 VALUES (6,0,NULL,'tolerate',NULL,144); +INSERT INTO t1 VALUES (0,0,NULL,'Florida',NULL,0); +INSERT INTO t1 VALUES (9,0,NULL,'Vermont',NULL,178); +INSERT INTO t1 VALUES (13228,0,NULL,'g',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'s',NULL,0); +INSERT INTO t1 VALUES (18675,0,NULL,'dcuzmmvrllxwkmcyemoriwjoyrkbhssjesnylouaiygiodldcgwktzumjpot',NULL,130); +INSERT INTO t1 VALUES (7,0,NULL,'Indiana',NULL,0); +INSERT INTO t1 VALUES (1,0,NULL,'entertainment',NULL,-736); +INSERT INTO t1 VALUES (-15594,0,NULL,'zmmvrllxwkmcyemoriwjoyrkbhssj',NULL,728); +INSERT INTO t1 VALUES (0,0,NULL,'mvrllxwkmcyemoriwjoyrk',NULL,295); +INSERT INTO t1 VALUES (NULL,0,NULL,'Virginia',NULL,23); +INSERT INTO t1 VALUES (NULL,0,NULL,'llxwkmcyemoriwjoyrkbhssjesnylouaiygiodldcgwktzumjpotwry',NULL,NULL); +INSERT INTO t1 VALUES (840,0,NULL,'tiny',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'b',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'v',NULL,0); +INSERT INTO t1 VALUES (4,0,NULL,'Pennsylvania',NULL,133); +INSERT INTO t1 VALUES (0,0,NULL,'i',NULL,34); +INSERT INTO t1 VALUES (NULL,0,NULL,'Tennessee',NULL,157); +INSERT INTO t1 VALUES (7375,0,NULL,'New York',NULL,124); +INSERT INTO t1 VALUES (8,0,NULL,'e',NULL,0); +INSERT INTO t1 VALUES (201,0,NULL,'Maine',NULL,597); +INSERT INTO t1 VALUES (22036,0,NULL,'forty',NULL,168); +INSERT INTO t1 VALUES (3,0,NULL,'jo',NULL,0); +INSERT INTO t1 VALUES (16007,0,NULL,'yr',NULL,906); +INSERT INTO t1 VALUES (NULL,0,NULL,'universe',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'jesnylouaiygiodldcgwktzumjpotwrysvhzzsophhfh',NULL,120); +INSERT INTO t1 VALUES (0,0,NULL,'Ohio',NULL,4); +INSERT INTO t1 VALUES (NULL,0,NULL,'sn',NULL,3); +INSERT INTO t1 VALUES (0,0,NULL,'nylouaiygiodldcgwktzumjpotwrysvhzzsophhfhw',NULL,48); +INSERT INTO t1 VALUES (233,0,NULL,'dissolve',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'z',NULL,45); +INSERT INTO t1 VALUES (0,0,NULL,'u',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'mentally',NULL,5); +INSERT INTO t1 VALUES (32767,0,NULL,'b',NULL,185); +INSERT INTO t1 VALUES (32767,0,NULL,'poor',NULL,104); +INSERT INTO t1 VALUES (0,0,NULL,'l',NULL,2); +INSERT INTO t1 VALUES (20709,0,NULL,'West Virginia',NULL,31); +INSERT INTO t1 VALUES (196,0,NULL,'ie',NULL,237); +INSERT INTO t1 VALUES (1,0,NULL,'tz',NULL,NULL); +INSERT INTO t1 VALUES (214,0,NULL,'mj',NULL,224); +INSERT INTO t1 VALUES (5,0,NULL,'interpretation',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'q',NULL,1); +INSERT INTO t1 VALUES (2,0,NULL,'Colorado',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'ry',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'s',NULL,8); +INSERT INTO t1 VALUES (1,0,NULL,'vhzzsophhfhwxrajsnelqegm',NULL,730); +INSERT INTO t1 VALUES (-12909,0,NULL,'web',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'zz',NULL,138); +INSERT INTO t1 VALUES (NULL,0,NULL,'New Hampshire',NULL,NULL); +INSERT INTO t1 VALUES (56,0,NULL,'u',NULL,297); +INSERT INTO t1 VALUES (0,0,NULL,'o',NULL,5); +INSERT INTO t1 VALUES (32767,0,NULL,'consume',NULL,7); +INSERT INTO t1 VALUES (21901,0,NULL,'g',NULL,0); +INSERT INTO t1 VALUES (4,0,NULL,'f',NULL,230); +INSERT INTO t1 VALUES (240,0,NULL,'tension',NULL,1); +INSERT INTO t1 VALUES (0,0,NULL,'xr',NULL,3); +INSERT INTO t1 VALUES (0,0,NULL,'h',NULL,679); +INSERT INTO t1 VALUES (5996,0,NULL,'js',NULL,197); +INSERT INTO t1 VALUES (-22204,0,NULL,'snelqegmghyhblwpwxfwdt',NULL,0); +INSERT INTO t1 VALUES (29005,0,NULL,'lqegmghyhblwpwx',NULL,329); +INSERT INTO t1 VALUES (NULL,0,NULL,'c',NULL,0); +INSERT INTO t1 VALUES (92,0,NULL,'gm',NULL,NULL); +INSERT INTO t1 VALUES (5022,0,NULL,'u',NULL,7); +INSERT INTO t1 VALUES (1,0,NULL,'gh',NULL,-336); +INSERT INTO t1 VALUES (58,0,NULL,'hyhblwpwxfwdtkjqznxsfkdilpdqhjnyyvkqbqlbighvqntgezzqyfncjcdc',NULL,NULL); +INSERT INTO t1 VALUES (18629,0,NULL,'bl',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'availability',NULL,-968); +INSERT INTO t1 VALUES (-17586,0,NULL,'f',NULL,347); +INSERT INTO t1 VALUES (0,0,NULL,'d',NULL,0); +INSERT INTO t1 VALUES (6,0,NULL,'consumer',NULL,7); +INSERT INTO t1 VALUES (2,0,NULL,'jqznxsfkd',NULL,0); +INSERT INTO t1 VALUES (2,0,NULL,'amazing',NULL,2); +INSERT INTO t1 VALUES (0,0,NULL,'accompany',NULL,-720); +INSERT INTO t1 VALUES (NULL,0,NULL,'nxsfkdilpd',NULL,92); +INSERT INTO t1 VALUES (96,0,NULL,'f',NULL,9); +INSERT INTO t1 VALUES (NULL,0,NULL,'dilpdqhjnyyvkqbqlbi',NULL,208); +INSERT INTO t1 VALUES (19,0,NULL,'ribbon',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'Oklahoma',NULL,9); +INSERT INTO t1 VALUES (22507,0,NULL,'j',NULL,NULL); +INSERT INTO t1 VALUES (NULL,0,NULL,'Rhode Island',NULL,473); +INSERT INTO t1 VALUES (167,0,NULL,'Oklahoma',NULL,0); +INSERT INTO t1 VALUES (65,0,NULL,'y',NULL,42); +INSERT INTO t1 VALUES (NULL,0,NULL,'container',NULL,0); +INSERT INTO t1 VALUES (NULL,0,NULL,'ql',NULL,5); +INSERT INTO t1 VALUES (3,0,NULL,'lbighvqntgezzqyfncjcdcedujseoodxdgibhgrvxgviemzgn',NULL,NULL); +INSERT INTO t1 VALUES (-18007,0,NULL,'suggest',NULL,0); +INSERT INTO t1 VALUES (32767,0,NULL,'g',NULL,-88); +INSERT INTO t1 VALUES (32767,0,NULL,'hvqntgezzqyfncjcdcedujseoodxdgibhgrvxgviemz',NULL,85); +INSERT INTO t1 VALUES (0,0,NULL,'Oregon',NULL,584); +INSERT INTO t1 VALUES (32767,0,NULL,'tg',NULL,128); +INSERT INTO t1 VALUES (57,0,NULL,'ez',NULL,0); +INSERT INTO t1 VALUES (25235,0,NULL,'Florida',NULL,0); +INSERT INTO t1 VALUES (245,0,NULL,'Kentucky',NULL,4); +INSERT INTO t1 VALUES (202,0,NULL,'u',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'fn',NULL,9); +INSERT INTO t1 VALUES (30016,0,NULL,'d',NULL,0); +INSERT INTO t1 VALUES (21837,0,NULL,'cd',NULL,6); +INSERT INTO t1 VALUES (NULL,0,NULL,'cedujseoodxdgibhgrvxgviemzgngjtolxd',NULL,-648); +INSERT INTO t1 VALUES (NULL,0,NULL,'jseoodxdgibhgrvxgviemzgngjtolxdrc',NULL,154); +INSERT INTO t1 VALUES (0,0,NULL,'v',NULL,-160); +INSERT INTO t1 VALUES (32767,0,NULL,'Oklahoma',NULL,27); +INSERT INTO t1 VALUES (189,0,NULL,'v',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'solar',NULL,5); +INSERT INTO t1 VALUES (3423,0,NULL,'dg',NULL,880); +INSERT INTO t1 VALUES (10026,0,NULL,'g',NULL,68); +INSERT INTO t1 VALUES (2786,0,NULL,'argue',NULL,NULL); +INSERT INTO t1 VALUES (32767,0,NULL,'i',NULL,NULL); +INSERT INTO t1 VALUES (18620,0,NULL,'Florida',NULL,197); +INSERT INTO t1 VALUES (169,0,NULL,'Michigan',NULL,584); +INSERT INTO t1 VALUES (NULL,0,NULL,'x',NULL,9); +INSERT INTO t1 VALUES (-21070,0,NULL,'cemetery',NULL,NULL); +INSERT INTO t1 VALUES (-26771,0,NULL,'Ohio',NULL,2); +INSERT INTO t1 VALUES (9937,0,NULL,'m',NULL,321); +INSERT INTO t1 VALUES (4659,0,NULL,'z',NULL,116); +INSERT INTO t1 VALUES (15502,0,NULL,'n',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'y',NULL,57); +INSERT INTO t1 VALUES (1,0,NULL,'l',NULL,70); +INSERT INTO t1 VALUES (52,0,NULL,'y',NULL,-552); +INSERT INTO t1 VALUES (0,0,NULL,'deem',NULL,544); +INSERT INTO t1 VALUES (0,0,NULL,'f',NULL,9); +INSERT INTO t1 VALUES (32767,0,NULL,'r',NULL,52); +INSERT INTO t1 VALUES (NULL,0,NULL,'o',NULL,154); +INSERT INTO t1 VALUES (11,0,NULL,'Rhode Island',NULL,176); +INSERT INTO t1 VALUES (32767,0,NULL,'South Carolina',NULL,1); +INSERT INTO t1 VALUES (32767,0,NULL,'p',NULL,672); +INSERT INTO t1 VALUES (0,0,NULL,'u',NULL,4); +INSERT INTO t1 VALUES (NULL,0,NULL,'positive',NULL,218); +INSERT INTO t1 VALUES (NULL,0,NULL,'tomorrow',NULL,-48); +INSERT INTO t1 VALUES (-30122,0,NULL,'rh',NULL,261); +INSERT INTO t1 VALUES (4,0,NULL,'tap',NULL,NULL); +INSERT INTO t1 VALUES (0,0,NULL,'overall',NULL,5); +INSERT INTO t1 VALUES (0,0,NULL,'n',NULL,146); +INSERT INTO t1 VALUES (32767,0,NULL,'sometimes',NULL,6); +INSERT INTO t1 VALUES (0,0,NULL,'n',NULL,488); +INSERT INTO t1 VALUES (NULL,0,NULL,'hw',NULL,NULL); +INSERT INTO t1 VALUES (2179,0,NULL,'o',NULL,-176); +INSERT INTO t1 VALUES (NULL,0,NULL,'Pennsylvania',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'dd',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'d',NULL,0); +INSERT INTO t1 VALUES (160,0,NULL,'h',NULL,633); +INSERT INTO t1 VALUES (228,0,NULL,'r',NULL,54); +INSERT INTO t1 VALUES (0,0,NULL,'p',NULL,7); +INSERT INTO t1 VALUES (0,0,NULL,'jr',NULL,NULL); +INSERT INTO t1 VALUES (2,0,NULL,'q',NULL,0); +INSERT INTO t1 VALUES (29,0,NULL,'w',NULL,184); +INSERT INTO t1 VALUES (14801,0,NULL,'q',NULL,0); +INSERT INTO t1 VALUES (-24663,0,NULL,'progress',NULL,270); +INSERT INTO t1 VALUES (0,0,NULL,'w',NULL,-912); +INSERT INTO t1 VALUES (27423,0,NULL,'ok',NULL,8); +INSERT INTO t1 VALUES (NULL,0,NULL,'re',NULL,NULL); +INSERT INTO t1 VALUES (29082,0,NULL,'d',NULL,2); +INSERT INTO t1 VALUES (32767,0,NULL,'name',NULL,162); +INSERT INTO t1 VALUES (NULL,0,NULL,'p',NULL,219); +INSERT INTO t1 VALUES (4801,0,NULL,'wixljp',NULL,266); +INSERT INTO t1 VALUES (36,0,NULL,'xl',NULL,NULL); +INSERT INTO t1 VALUES (1,0,NULL,'l',NULL,0); +INSERT INTO t1 VALUES (0,0,NULL,'i',NULL,584); +INSERT INTO t1 VALUES (160,0,NULL,'w',NULL,0); +INSERT INTO t1 VALUES (4,0,NULL,'s',NULL,0); +INSERT INTO t1 VALUES (20,0,NULL,'d',NULL,NULL); +INSERT INTO t1 VALUES (31136,0,NULL,'god',NULL,4); +--enable_query_log +ALTER TABLE t1 ENABLE KEYS; + +--echo # Must not crash: +SELECT * FROM t1 WHERE ( a BETWEEN 255 AND 270 OR f = 200 ) AND f IN ( 1, 4, 112, 143 ) AND d IN ('Montana', 'South Dakota'); +DROP TABLE t1; diff --git a/storage/myisam/mi_key.c b/storage/myisam/mi_key.c index d17eef06969..2909f5998e1 100644 --- a/storage/myisam/mi_key.c +++ b/storage/myisam/mi_key.c @@ -561,7 +561,15 @@ check_result_t mi_check_index_tuple(MI_INFO *info, uint keynr, uchar *record) if (need_unpack && mi_unpack_index_tuple(info, keynr, record)) res= CHECK_ERROR; else - res= info->rowid_filter_func(info->rowid_filter_func_arg); + { + if ((res= info->rowid_filter_func(info->rowid_filter_func_arg)) == + CHECK_OUT_OF_RANGE) + { + /* We got beyond the end of scanned range */ + info->lastpos= HA_OFFSET_ERROR; /* No active record */ + my_errno= HA_ERR_END_OF_FILE; + } + } } return res; } From a759f9af51b2093502d3a06c0150e9aa7fc21068 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Thu, 9 Jul 2020 08:54:59 +0200 Subject: [PATCH 021/188] Fix typo in the comment (and old info) --- sql/field.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/field.cc b/sql/field.cc index 1ea7b30f85d..65bd9d22857 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -70,7 +70,7 @@ const char field_separator=','; #define BLOB_PACK_LENGTH_TO_MAX_LENGH(arg) \ ((ulong) ((1LL << MY_MIN(arg, 4) * 8) - 1)) -// Column marked for read or the field set to read out or record[0] or [1] +// Column marked for read or the field set to read out of record[0] #define ASSERT_COLUMN_MARKED_FOR_READ \ DBUG_ASSERT(!table || \ (!table->read_set || \ From 24ed08c3c45825f0c3555389d493133996a0937b Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Thu, 9 Jul 2020 21:10:47 +0300 Subject: [PATCH 022/188] fix compilation with gcc-10 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ../sql/sql_class.cc: In constructor ‘start_new_trans::start_new_trans(THD*)’: ../include/m_string.h:61:49: error: ‘void* memset(void*, int, size_t)’ clearing an object of non-trivial type ‘struct Ha_data’; use assignment or value-initialization instead [-Werror=class-memaccess] 61 | # define bzero(A,B) memset((A),0,(B)) | ^ ../sql/sql_class.cc:5805:3: note: in expansion of macro ‘bzero’ 5805 | bzero(thd->ha_data, sizeof(thd->ha_data)); | ^~~~~ In file included from ../sql/sql_class.cc:33: ../sql/sql_class.h:2003:8: note: ‘struct Ha_data’ declared here 2003 | struct Ha_data | ^~~~~~~ --- sql/sql_class.cc | 3 ++- sql/sql_class.h | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index e11ca8c9c69..6d507197639 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -5802,7 +5802,8 @@ start_new_trans::start_new_trans(THD *thd) mdl_savepoint= thd->mdl_context.mdl_savepoint(); memcpy(old_ha_data, thd->ha_data, sizeof(old_ha_data)); thd->reset_n_backup_open_tables_state(&open_tables_state_backup); - bzero(thd->ha_data, sizeof(thd->ha_data)); + for (auto &data : thd->ha_data) + data.reset(); old_transaction= thd->transaction; thd->transaction= &new_transaction; new_transaction.on= 1; diff --git a/sql/sql_class.h b/sql/sql_class.h index 58a786ed33c..9ca1da9bbff 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -2024,6 +2024,14 @@ struct Ha_data */ plugin_ref lock; Ha_data() :ha_ptr(NULL) {} + + void reset() + { + ha_ptr= nullptr; + for (auto &info : ha_info) + info.reset(); + lock= nullptr; + } }; /** From 737c3025e9ed55855ee66806ad14e9e7e7852fa7 Mon Sep 17 00:00:00 2001 From: Varun Gupta Date: Thu, 9 Jul 2020 14:01:06 +0530 Subject: [PATCH 023/188] MDEV-10120: Wrong result of UNION .. ORDER BY GROUP_CONCAT() Reject queries that have aggregate functions with UNION as these are not allowed by standard. --- mysql-test/r/parser.result | 15 +++++---------- mysql-test/r/union.result | 29 ++++++++++++----------------- mysql-test/t/parser.test | 5 +++++ mysql-test/t/union.test | 21 +++++++++++++++------ sql/sql_select.cc | 17 ++++++++++++++++- 5 files changed, 53 insertions(+), 34 deletions(-) diff --git a/mysql-test/r/parser.result b/mysql-test/r/parser.result index 09bbd7cf176..45fcca146fe 100644 --- a/mysql-test/r/parser.result +++ b/mysql-test/r/parser.result @@ -943,11 +943,9 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (10),(20),(30); SELECT 1 AS a UNION SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a); -a -1 +ERROR HY000: Expression #1 of ORDER BY contains aggregate function and applies to a UNION SELECT 1 AS a UNION SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a ORDER BY a); -a -1 +ERROR HY000: Expression #1 of ORDER BY contains aggregate function and applies to a UNION DROP TABLE t1; # UNION with a parenthesed term CREATE TABLE t1 (a INT); @@ -1010,14 +1008,11 @@ DROP TABLE t1; CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (10),(20),(30); SELECT 1 AS a UNION SELECT a FROM t1 GROUP BY a WITH ROLLUP ORDER BY GROUP_CONCAT(a); -a -1 +ERROR HY000: Expression #1 of ORDER BY contains aggregate function and applies to a UNION SELECT 1 AS a UNION SELECT a FROM t1 GROUP BY a WITH ROLLUP ORDER BY GROUP_CONCAT(a ORDER BY a); -a -1 +ERROR HY000: Expression #1 of ORDER BY contains aggregate function and applies to a UNION SELECT 1 AS a UNION SELECT a FROM t1 GROUP BY a WITH ROLLUP ORDER BY GROUP_CONCAT(a ORDER BY a) LIMIT 1; -a -1 +ERROR HY000: Expression #1 of ORDER BY contains aggregate function and applies to a UNION DROP TABLE t1; # Derived table with ROLLUP CREATE TABLE t1 (a INT); diff --git a/mysql-test/r/union.result b/mysql-test/r/union.result index c02e590490e..f9df02b7f81 100644 --- a/mysql-test/r/union.result +++ b/mysql-test/r/union.result @@ -1757,8 +1757,7 @@ union select 4 order by max(42) + max(1) + max(1) + max(1) + max(1) + max(1) ; -foo -1 +ERROR HY000: Expression #1 of ORDER BY contains aggregate function and applies to a UNION prepare stmt1 from 'select 1 as foo union select 2 @@ -1768,12 +1767,7 @@ union select 4 order by max(42) + max(1) + max(1) + max(1) + max(1) + max(1) '; -execute stmt1; -foo -1 -execute stmt1; -foo -1 +ERROR HY000: Expression #1 of ORDER BY contains aggregate function and applies to a UNION select 1 as foo union select 2 @@ -1783,8 +1777,7 @@ union (select 4) order by max(42) + max(1) + max(1) + max(1) + max(1) + max(1) ; -foo -1 +ERROR HY000: Expression #1 of ORDER BY contains aggregate function and applies to a UNION prepare stmt1 from 'select 1 as foo union select 2 @@ -1794,13 +1787,7 @@ union (select 4) order by max(42) + max(1) + max(1) + max(1) + max(1) + max(1) '; -execute stmt1; -foo -1 -execute stmt1; -foo -1 -deallocate prepare stmt1; +ERROR HY000: Expression #1 of ORDER BY contains aggregate function and applies to a UNION End of 5.1 tests # # mdev-5091: Asseirtion failure for UNION with ORDER BY @@ -2299,3 +2286,11 @@ id select_type table type possible_keys key key_len ref rows filtered Extra Warnings: Note 1003 select 1 AS `1`,2 AS `2` union all select 1 AS `i`,count(0) AS `COUNT(*)` from `test`.`t2` where 1 group by 1 having 0 DROP TABLE t1,t2; +# +# MDEV-10120: Wrong result of UNION .. ORDER BY GROUP_CONCAT() +# +CREATE TABLE t1 (a INT); +INSERT t1 VALUES (1),(2),(3); +(SELECT 1 AS a) UNION (SELECT a FROM t1 GROUP BY a) ORDER BY GROUP_CONCAT(a); +ERROR HY000: Expression #1 of ORDER BY contains aggregate function and applies to a UNION +DROP TABLE t1; diff --git a/mysql-test/t/parser.test b/mysql-test/t/parser.test index 5faaca00ea8..7e11a71c500 100644 --- a/mysql-test/t/parser.test +++ b/mysql-test/t/parser.test @@ -1090,7 +1090,9 @@ CREATE TABLE t1 AS SELECT 1 LIMIT 1 UNION SELECT 2; --echo # For now, we're testing the parser. CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (10),(20),(30); +--error ER_AGGREGATE_ORDER_FOR_UNION SELECT 1 AS a UNION SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a); +--error ER_AGGREGATE_ORDER_FOR_UNION SELECT 1 AS a UNION SELECT a FROM t1 GROUP BY a ORDER BY GROUP_CONCAT(a ORDER BY a); DROP TABLE t1; @@ -1131,8 +1133,11 @@ DROP TABLE t1; CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (10),(20),(30); +--error ER_AGGREGATE_ORDER_FOR_UNION SELECT 1 AS a UNION SELECT a FROM t1 GROUP BY a WITH ROLLUP ORDER BY GROUP_CONCAT(a); +--error ER_AGGREGATE_ORDER_FOR_UNION SELECT 1 AS a UNION SELECT a FROM t1 GROUP BY a WITH ROLLUP ORDER BY GROUP_CONCAT(a ORDER BY a); +--error ER_AGGREGATE_ORDER_FOR_UNION SELECT 1 AS a UNION SELECT a FROM t1 GROUP BY a WITH ROLLUP ORDER BY GROUP_CONCAT(a ORDER BY a) LIMIT 1; DROP TABLE t1; diff --git a/mysql-test/t/union.test b/mysql-test/t/union.test index 707bda6d81b..9f747c9080f 100644 --- a/mysql-test/t/union.test +++ b/mysql-test/t/union.test @@ -1184,11 +1184,11 @@ select 4 order by max(42) + max(1) + max(1) + max(1) + max(1) + max(1) ; +--error ER_AGGREGATE_ORDER_FOR_UNION eval $my_stmt; +--error ER_AGGREGATE_ORDER_FOR_UNION eval prepare stmt1 from '$my_stmt'; -execute stmt1; -execute stmt1; let $my_stmt= select 1 as foo @@ -1201,13 +1201,11 @@ union order by max(42) + max(1) + max(1) + max(1) + max(1) + max(1) ; +--error ER_AGGREGATE_ORDER_FOR_UNION eval $my_stmt; +--error ER_AGGREGATE_ORDER_FOR_UNION eval prepare stmt1 from '$my_stmt'; -execute stmt1; -execute stmt1; - -deallocate prepare stmt1; --echo End of 5.1 tests @@ -1637,3 +1635,14 @@ eval $q; eval EXPLAIN EXTENDED $q; DROP TABLE t1,t2; + +--echo # +--echo # MDEV-10120: Wrong result of UNION .. ORDER BY GROUP_CONCAT() +--echo # + +CREATE TABLE t1 (a INT); +INSERT t1 VALUES (1),(2),(3); + +--error ER_AGGREGATE_ORDER_FOR_UNION +(SELECT 1 AS a) UNION (SELECT a FROM t1 GROUP BY a) ORDER BY GROUP_CONCAT(a); +DROP TABLE t1; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 4cca2d67eb8..c33e554aaca 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -22709,10 +22709,13 @@ int setup_order(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables, List &fields, List &all_fields, ORDER *order, bool from_window_spec) { + SELECT_LEX *select = thd->lex->current_select; enum_parsing_place context_analysis_place= thd->lex->current_select->context_analysis_place; thd->where="order clause"; - for (; order; order=order->next) + const bool for_union = select->master_unit()->is_union() && + select == select->master_unit()->fake_select_lex; + for (uint number = 1; order; order=order->next, number++) { if (find_order_in_list(thd, ref_pointer_array, tables, order, fields, all_fields, false, true, from_window_spec)) @@ -22723,6 +22726,18 @@ int setup_order(THD *thd, Ref_ptr_array ref_pointer_array, TABLE_LIST *tables, my_error(ER_WINDOW_FUNCTION_IN_WINDOW_SPEC, MYF(0)); return 1; } + + /* + UNION queries cannot be used with an aggregate function in + an ORDER BY clause + */ + + if (for_union && (*order->item)->with_sum_func) + { + my_error(ER_AGGREGATE_ORDER_FOR_UNION, MYF(0), number); + return 1; + } + if (from_window_spec && (*order->item)->with_sum_func && (*order->item)->type() != Item::SUM_FUNC_ITEM) (*order->item)->split_sum_func(thd, ref_pointer_array, From f81ff93287349daeb62c46e699ac54996a09860b Mon Sep 17 00:00:00 2001 From: Rucha Deodhar Date: Fri, 10 Jul 2020 21:27:20 +0530 Subject: [PATCH 024/188] MDEV-19119: main.ssl_crl fails in buildbot with wrong error code The client can only find out if the server has disconnected when it tries to read or send something. If the server gets disconnected before send_client_reply_packet(), the client will try sending authentication information but it will fail. But, if the client is fast enough to send autentication information before disconnecting, it will notice that when reading the ok packet. So the client can fail on read or on write. It is unpredictable because, the process are unsynchronized and this could happen in any order. --- mysql-test/t/ssl_crl.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/t/ssl_crl.test b/mysql-test/t/ssl_crl.test index dc30a9b5934..643fb80c747 100644 --- a/mysql-test/t/ssl_crl.test +++ b/mysql-test/t/ssl_crl.test @@ -8,6 +8,6 @@ --echo # try logging in with a certificate in the server's --ssl-crl : should fail # OpenSSL 1.1.1a correctly rejects the certificate, but the error message is wrong ---replace_result "ERROR 2013 (HY000): Lost connection to MySQL server at 'reading authorization packet', system error: 0" "ERROR 2026 (HY000): SSL connection error: sslv3 alert certificate revoked" +--replace_result "ERROR 2013 (HY000): Lost connection to MySQL server at 'reading authorization packet', system error: 0" "ERROR 2026 (HY000): SSL connection error: sslv3 alert certificate revoked" "ERROR 2013 (HY000): Lost connection to MySQL server at 'sending authentication information', system error: 32" "ERROR 2026 (HY000): SSL connection error: sslv3 alert certificate revoked" --error 1 --exec $MYSQL --ssl-ca=$MYSQL_TEST_DIR/std_data/cacert.pem --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem test -e "SHOW STATUS LIKE 'Ssl_version'" 2>&1 From 873eb4a39737b36cea0db7fbe12d70919529060a Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Fri, 10 Jul 2020 22:48:35 +0400 Subject: [PATCH 025/188] MDEV-21385 PAM v2 plugin produces lots of zombie processes. The auth_pam_tool that is executed from pam_auth() can be still not finished by the time we do the waitpid() there. As we use WNOHANG option for the waitpid(), it didn't wait and left the zombie process. So let's do the loop of waitpid() with the limited number of sleeps. --- plugin/auth_pam/auth_pam.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/plugin/auth_pam/auth_pam.c b/plugin/auth_pam/auth_pam.c index 4275b7d6750..c1c05bba216 100644 --- a/plugin/auth_pam/auth_pam.c +++ b/plugin/auth_pam/auth_pam.c @@ -36,12 +36,20 @@ static char *opt_plugin_dir; /* To be dynamically linked. */ static const char *tool_name= "auth_pam_tool_dir/auth_pam_tool"; static const int tool_name_len= 31; +/* + sleep_limit is now 5 meaning up to 1 second sleep. + each step means 10 times longer sleep, so 6 would mean 10 seconds. +*/ +static const unsigned int sleep_limit= 5; + static int pam_auth(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info) { int p_to_c[2], c_to_p[2]; /* Parent-to-child and child-to-parent pipes. */ pid_t proc_id; int result= CR_ERROR, pkt_len= 0; unsigned char field, *pkt; + unsigned int n_sleep= 0; + useconds_t sleep_time= 100; PAM_DEBUG((stderr, "PAM: opening pipes.\n")); if (pipe(p_to_c) < 0 || pipe(c_to_p) < 0) @@ -190,7 +198,24 @@ static int pam_auth(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info) error_ret: close(p_to_c[1]); close(c_to_p[0]); - waitpid(proc_id, NULL, WNOHANG); + while (waitpid(proc_id, NULL, WNOHANG) != (int) proc_id) + { + if (n_sleep++ == sleep_limit) + { + /* + The auth_pam_tool application doesn't terminate. + Means something wrong happened there like pam_xxx.so hanged. + */ + kill(proc_id, SIGKILL); + sleep_time= 1000000; /* 1 second wait should be enough. */ + PAM_DEBUG((stderr, "PAM: auth_pam_tool doesn't terminate," + " have to kill it.\n")); + } + else if (n_sleep > sleep_limit) + break; + usleep(sleep_time); + sleep_time*= 10; + } PAM_DEBUG((stderr, "PAM: auth result %d.\n", result)); return result; From 439377927baf5d82a5adffd390f762143582c14c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Fri, 3 Jul 2020 16:24:58 +0300 Subject: [PATCH 026/188] Deb: Misc ColumnStore Debian packaging improvements - Add 'libboost-all-dev' and 'libreadline-gplv2-dev' as they were was found to be a compulsory build dependency for columnstore plugin. - Add 'expect' as run-time dependencey for columnstore plugin as scripts use it: usr/bin/mcs_module_installer.sh: #!/usr/bin/expect usr/bin/remote_command.sh: #!/usr/bin/expect usr/bin/remote_command_verify.sh: #!/usr/bin/expect usr/bin/remote_scp_get.sh: #!/usr/bin/expect usr/bin/remote_scp_put.sh: #!/usr/bin/expect usr/bin/rsync.sh: #!/usr/bin/expect - Properly define depends on Python. No Python 2 support needs to be considered, Python 3 has been around long enough. Fixes Lintian errors E: mariadb-plugin-columnstore: python-script-but-no-python-dep usr/bin/mcs-loadbrm.py #!python E: mariadb-plugin-columnstore: python-script-but-no-python-dep usr/bin/mcs-start-storagemanager.py #!python - Partially revert undocumented and thus unjustified changes in commits d69a79da63287089efdc5f90a11ecd66ce55b471 and c0565666cfe6528b76bc53ce50d3690d13c92cf6. - Trigger ldconfig, otherwise Lintian complains: E: mariadb-plugin-columnstore: package-must-activate-ldconfig-trigger usr/lib/x86_64-linux-gnu/libwriteengineredistribute.so - Update postinst to be compatible with new server binary mariadbd name. - Properly detect systemd or fallback to sysv init in postrm script. - Only attempt to build ColumnStore on amd64 and i386. Test builds on Launchpad.net showed the CMake plugin configure step will prevent even attempts to build on other platforms. - Clean up and unify cmake build command in debian/rules. - Explicitly list files not installed. - Run 'wrap-and-sort -a -v'. - Truncate build logs on Salsa-CI to keep under 4 MB. This is now needed as the ColumnStore build is so verbose. See https://jira.mariadb.org/browse/MCOL-4111. - Update Travis-CI dependencies to match new debian/control. --- .travis.yml | 8 ++++++ debian/autobake-deb.sh | 13 ++++----- debian/control | 19 +++++++++---- debian/mariadb-plugin-columnstore.install | 12 ++++----- debian/mariadb-plugin-columnstore.postinst | 2 -- debian/mariadb-plugin-columnstore.postrm | 27 ++++++++----------- debian/mariadb-plugin-columnstore.prerm | 1 - debian/mariadb-plugin-columnstore.triggers | 1 + ...adb-plugin-cracklib-password-check.install | 2 +- debian/mariadb-plugin-gssapi-server.install | 2 +- debian/not-installed | 9 +++++-- debian/rules | 14 +++++++--- debian/salsa-ci.yml | 3 ++- 13 files changed, 69 insertions(+), 44 deletions(-) create mode 100644 debian/mariadb-plugin-columnstore.triggers diff --git a/.travis.yml b/.travis.yml index 09309534f4a..51897563235 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,7 +40,14 @@ addons: - g++-9 # ubuntu-toolchain-r/test (xenial and bionic) - gdb - libaio-dev + - libboost-atomic-dev + - libboost-chrono-dev + - libboost-date-time-dev - libboost-dev + - libboost-filesystem-dev + - libboost-regex-dev + - libboost-system-dev + - libboost-thread-dev - libcrack2-dev - libcurl3-dev - libdbd-mysql @@ -52,6 +59,7 @@ addons: - libnuma-dev - libpam0g-dev - libpcre2-dev + - libreadline-gplv2-dev - libsnappy-dev - libssl-dev - libstemmer-dev diff --git a/debian/autobake-deb.sh b/debian/autobake-deb.sh index e838f5964b2..5e20df3a96b 100755 --- a/debian/autobake-deb.sh +++ b/debian/autobake-deb.sh @@ -31,7 +31,7 @@ then sed 's|DINSTALL_MYSQLTESTDIR=share/mysql/mysql-test|DINSTALL_MYSQLTESTDIR=false|' -i debian/rules # Also skip building RocksDB, Mroonga etc to save even more time and disk space - sed 's|-DDEB|-DPLUGIN_MROONGA=NO -DPLUGIN_SPIDER=NO -DPLUGIN_OQGRAPH=NO -DPLUGIN_PERFSCHEMA=NO -DPLUGIN_SPHINX=NO -DDEB|' -i debian/rules + sed 's|-DDEB|-DPLUGIN_MROONGA=NO -DPLUGIN_ROCKSDB=NO -DPLUGIN_SPIDER=NO -DPLUGIN_OQGRAPH=NO -DPLUGIN_PERFSCHEMA=NO -DPLUGIN_SPHINX=NO -DDEB|' -i debian/rules fi # Convert gcc version to numberical value. Format is Mmmpp where M is Major @@ -75,7 +75,6 @@ fi if [[ $GCCVERSION -lt 40800 ]] || [[ $(arch) =~ i[346]86 ]] || [[ $TRAVIS ]] then sed '/Package: mariadb-plugin-rocksdb/,/^$/d' -i debian/control - sed -i 's|-DPLUGIN_ROCKSDB=YES|-DPLUGIN_ROCKSDB=NO|' debian/rules fi # If libpcre2-dev is not available (before Debian Stretch and Ubuntu Xenial) @@ -95,11 +94,13 @@ then sed -i -e "/Package: libmariadbd-dev/,/^$/d" debian/control fi -if [[ $TRAVIS ]] || ! [[ $(arch) =~ 86 ]] +# Don't build nor package ColumnStore on Travis-CI +if [[ $TRAVIS ]] then - sed -i -e "/Package: mariadb-plugin-columnstore/,/^$/d" debian/control - sed -i '/flex/d' debian/control - sed -i 's|-DPLUGIN_COLUMNSTORE=YES|-DPLUGIN_COLUMNSTORE=NO|' debian/rules + sed "/Package: mariadb-plugin-columnstore/,/^$/d" -i debian/control + sed '/flex/d' -i debian/control + sed -r '/libboost-[a-z-]+-dev/d' -i debian/control + sed 's|-DPLUGIN_COLUMNSTORE=YES|-DPLUGIN_COLUMNSTORE=NO|' -i debian/rules fi # Adjust changelog, add new version diff --git a/debian/control b/debian/control index 19864c6bb1b..a3bc3b91c6e 100644 --- a/debian/control +++ b/debian/control @@ -9,10 +9,17 @@ Build-Depends: bison, dh-apparmor, dh-exec, dh-systemd, - flex, + flex [i386 amd64], gdb, libaio-dev [linux-any], + libboost-atomic-dev [i386 amd64], + libboost-chrono-dev [i386 amd64], + libboost-date-time-dev [i386 amd64], libboost-dev, + libboost-filesystem-dev [i386 amd64], + libboost-regex-dev [i386 amd64], + libboost-system-dev [i386 amd64], + libboost-thread-dev [i386 amd64], libcrack2-dev (>= 2.9.0), libcurl4-openssl-dev | libcurl4-dev, libedit-dev, @@ -24,6 +31,7 @@ Build-Depends: bison, libnuma-dev [!armhf], libpam0g-dev, libpcre2-dev, + libreadline-gplv2-dev [i386 amd64], libsnappy-dev, libssl-dev | libssl1.0-dev, libsystemd-dev [linux-any], @@ -653,11 +661,12 @@ Description: RocksDB storage engine for MariaDB Package: mariadb-plugin-columnstore Architecture: amd64 i386 -Depends: mariadb-server-10.5 (= ${binary:Version}), - net-tools, - binutils, - libsnappy1 | libsnappy1v5, +Depends: binutils, + expect, libjemalloc1 | libjemalloc2, + libsnappy1 | libsnappy1v5, + mariadb-server-10.5 (= ${binary:Version}), + net-tools, python3, ${misc:Depends}, ${shlibs:Depends} diff --git a/debian/mariadb-plugin-columnstore.install b/debian/mariadb-plugin-columnstore.install index cd4461fe308..9f44f74e663 100644 --- a/debian/mariadb-plugin-columnstore.install +++ b/debian/mariadb-plugin-columnstore.install @@ -18,7 +18,6 @@ usr/bin/ProcMon usr/bin/ServerMonitor usr/bin/StorageManager usr/bin/WriteEngineServer -usr/bin/dbmsReport.sh usr/bin/autoConfigure usr/bin/bulklogReport.sh usr/bin/clearShm @@ -42,6 +41,7 @@ usr/bin/cpimport usr/bin/cpimport.bin usr/bin/cplogger usr/bin/dbbuilder +usr/bin/dbmsReport.sh usr/bin/dbrmctl usr/bin/ddlcleanup usr/bin/disable-rep-columnstore.sh @@ -51,8 +51,12 @@ usr/bin/hardwareReport.sh usr/bin/idbmeminfo usr/bin/load_brm usr/bin/logReport.sh +usr/bin/mariadb-columnstore-start.sh +usr/bin/mariadb-columnstore-stop.sh usr/bin/mariadb-command-line.sh usr/bin/master-rep-columnstore.sh +usr/bin/mcs-loadbrm.py +usr/bin/mcs-start-storagemanager.py usr/bin/mcs-stop-controllernode.sh usr/bin/mcsGetConfig usr/bin/mcsSetConfig @@ -82,10 +86,6 @@ usr/bin/smrm usr/bin/startupTests.sh usr/bin/viewtablelock usr/bin/workernode -usr/bin/mcs-start-storagemanager.py -usr/bin/mcs-loadbrm.py -usr/bin/mariadb-columnstore-start.sh -usr/bin/mariadb-columnstore-stop.sh usr/lib/*/libalarmmanager.so usr/lib/*/libbatchloader.so usr/lib/*/libbrm.so @@ -146,9 +146,9 @@ usr/share/columnstore/mcs-dmlproc.service usr/share/columnstore/mcs-exemgr.service usr/share/columnstore/mcs-loadbrm.service usr/share/columnstore/mcs-primproc.service +usr/share/columnstore/mcs-storagemanager.service usr/share/columnstore/mcs-workernode.service usr/share/columnstore/mcs-writeengineserver.service -usr/share/columnstore/mcs-storagemanager.service usr/share/columnstore/mcstest-001.sh usr/share/columnstore/mcstest-002.sh usr/share/columnstore/mcstest-003.sh diff --git a/debian/mariadb-plugin-columnstore.postinst b/debian/mariadb-plugin-columnstore.postinst index b482002c9dc..07da2b9ee46 100644 --- a/debian/mariadb-plugin-columnstore.postinst +++ b/debian/mariadb-plugin-columnstore.postinst @@ -5,6 +5,4 @@ set -e # Install ColumnStore columnstore-post-install --rpmmode=install -echo "MariaDB ColumnStore install completed" - #DEBHELPER# diff --git a/debian/mariadb-plugin-columnstore.postrm b/debian/mariadb-plugin-columnstore.postrm index cd8decbfe76..b2e19774ec1 100644 --- a/debian/mariadb-plugin-columnstore.postrm +++ b/debian/mariadb-plugin-columnstore.postrm @@ -8,22 +8,17 @@ if [ "$1" = "purge" ]; then rm -f /etc/mysql/mariadb.conf.d/columnstore.cnf.rpmsave fi -running_systemd() { - if [ "$(ps --no-headers -o comm 1)" = "systemd" ]; then - echo 0 - else - echo 1 - fi -} - -if [ ! -z "$(pgrep -x mysqld)" ];then - systemctl cat mariadb.service > /dev/null 2>&1 - if [ $? -eq 0 ] && [ $(running_systemd) -eq 0 ]; then - systemctl restart mariadb.service > /dev/null 2>&1 - else - pkill mysqld > /dev/null 2>&1 - /usr/bin/mysqld_safe & +# Automatically restart MariaDB after ColumnStore plugin has been removed +case "$1" in + purge|remove|disappear) + if [ -d /run/systemd/system ]; then + # If systemd + deb-systemd-invoke restart mariadb.service >/dev/null + elif [ -x "/etc/init.d/mariadb" ]; then + # Fall-back to SysV init + invoke-rc.d mariadb restart || exit $? fi -fi + ;; +esac #DEBHELPER# diff --git a/debian/mariadb-plugin-columnstore.prerm b/debian/mariadb-plugin-columnstore.prerm index 10e585a887b..f6a27f14499 100644 --- a/debian/mariadb-plugin-columnstore.prerm +++ b/debian/mariadb-plugin-columnstore.prerm @@ -4,6 +4,5 @@ set -e columnstore-pre-uninstall -exit 0 #DEBHELPER# diff --git a/debian/mariadb-plugin-columnstore.triggers b/debian/mariadb-plugin-columnstore.triggers new file mode 100644 index 00000000000..dd866036784 --- /dev/null +++ b/debian/mariadb-plugin-columnstore.triggers @@ -0,0 +1 @@ +activate-noawait ldconfig diff --git a/debian/mariadb-plugin-cracklib-password-check.install b/debian/mariadb-plugin-cracklib-password-check.install index 5419f05ed3d..6592c7f461b 100644 --- a/debian/mariadb-plugin-cracklib-password-check.install +++ b/debian/mariadb-plugin-cracklib-password-check.install @@ -1,2 +1,2 @@ -etc/mysql/mariadb.conf.d/cracklib_password_check.cnf +etc/mysql/mariadb.conf.d/cracklib_password_check.cnf usr/lib/mysql/plugin/cracklib_password_check.so diff --git a/debian/mariadb-plugin-gssapi-server.install b/debian/mariadb-plugin-gssapi-server.install index 70916b49052..8261db789f7 100644 --- a/debian/mariadb-plugin-gssapi-server.install +++ b/debian/mariadb-plugin-gssapi-server.install @@ -1,2 +1,2 @@ -etc/mysql/mariadb.conf.d/auth_gssapi.cnf +etc/mysql/mariadb.conf.d/auth_gssapi.cnf usr/lib/mysql/plugin/auth_gssapi.so diff --git a/debian/not-installed b/debian/not-installed index 1c20318e2b8..58cd337212b 100644 --- a/debian/not-installed +++ b/debian/not-installed @@ -1,12 +1,17 @@ +etc/columnstore/storagemanager.cnf.example # Copy of etc/columnstore/storagemanager.cnf that is installed lib/systemd/system/mariadb.service # Installed by rules file lib/systemd/system/mariadb@.service # Installed by rules file usr/bin/mysql_config # We already have the MariaDB variant usr/bin/mytop # Mytop is distributed from a separate source package usr/bin/sst_dump # Use the one from rocksdb-tools package -usr/lib/sysusers.d/sysusers.conf -usr/lib/tmpfiles.d/tmpfiles.conf usr/lib/mysql/plugin/JavaWrappers.jar # These are only built if JNI/libjawt.so is installed from e.g. openjdk-8-jre-headless usr/lib/mysql/plugin/JdbcInterface.jar # These are only built if JNI/libjawt.so is installed from e.g. openjdk-8-jre-headless +usr/lib/sysusers.d/sysusers.conf +usr/lib/tmpfiles.d/tmpfiles.conf +usr/lib/*/libdbbc.a # ColumnStore header file +usr/lib/*/libidbboot.a # ColumnStore header file +usr/lib/*/libprocessor.a # ColumnStore header file +usr/lib/*/libwe_xml.a # ColumnStore header file usr/share/doc/mariadb-server-10.5/COPYING usr/share/doc/mariadb-server-10.5/COPYING.AGPLv3 usr/share/doc/mariadb-server-10.5/COPYING.GPLv2 diff --git a/debian/rules b/debian/rules index 61717416e35..59f4c571679 100755 --- a/debian/rules +++ b/debian/rules @@ -39,6 +39,17 @@ else TESTSUITE_FAIL_CMD:=exit 1 endif +# RocksDB cannot build on 32-bit platforms +ifeq (32,$(DEB_HOST_ARCH_BITS)) + CMAKEFLAGS += -DWITHOUT_ROCKSDB=true +endif + +# ColumnStore only attempts to build on a few platforms as dictated by CMake checks +# Also note in debian/control the CS-only build deps marked '[i386 amd64]' +ifeq ($(DEB_HOST_ARCH),$(filter $(DEB_HOST_ARCH),amd64 i386)) + CMAKEFLAGS += -DPLUGIN_COLUMNSTORE=YES +endif + # Add extra flag to avoid WolfSSL code crashing the entire mariadbd on s390x. This # can be removed once upstream has made the code s390x compatible, see # https://jira.mariadb.org/browse/MDEV-21705 and @@ -83,10 +94,7 @@ endif -DBUILD_CONFIG=mysql_release \ -DPLUGIN_TOKUDB=NO \ -DPLUGIN_CASSANDRA=NO \ - -DPLUGIN_COLUMNSTORE=YES \ - -DPLUGIN_ROCKSDB=YES \ -DPLUGIN_AWS_KEY_MANAGEMENT=NO \ - -WITH_EMBEDDED_SERVER=OFF \ -DDEB=$(DEB_VENDOR) ..' # This is needed, otherwise 'make test' will run before binaries have been built diff --git a/debian/salsa-ci.yml b/debian/salsa-ci.yml index 57da0364911..bd49f864562 100644 --- a/debian/salsa-ci.yml +++ b/debian/salsa-ci.yml @@ -33,7 +33,8 @@ build: - export CCACHE_DIR="${CCACHE_TMP_DIR}" - update-ccache-symlinks; ccache -z # Zero out ccache counters - mk-build-deps debian/control -t "apt-get -y -o Debug::pkgProblemResolver=yes --no-install-recommends" -r -i - - debian/autobake-deb.sh + - while true; do sleep 600; echo "10 minutes passed" >&2; done & # Progress keeper since build is long and silent + - debian/autobake-deb.sh |& tail -n 10000 # Keep Gitlab-CI output under 4 MB - cd ..; rm -rfv *.tmp # Clean away build files not to store as artifacts - cp -v *.* ${WORKING_DIR}/ - du -shc ${WORKING_DIR}/* # Show total file size of artifacts. Must stay are under 100 MB. From 5d471453edb6f6cbe4f6c2a233c158082b4b52fb Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Sat, 11 Jul 2020 12:54:30 +0300 Subject: [PATCH 027/188] noexcept ilist --- include/ilist.h | 103 +++++++++++++++++++++++++++--------------------- 1 file changed, 57 insertions(+), 46 deletions(-) diff --git a/include/ilist.h b/include/ilist.h index 74cb472cd4e..822f0334022 100644 --- a/include/ilist.h +++ b/include/ilist.h @@ -16,7 +16,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ -#pragma once +#ifndef ILIST_H +#define ILIST_H #include #include @@ -24,15 +25,17 @@ // Derive your class from this struct to insert to a linked list. template struct ilist_node { - ilist_node() + ilist_node() noexcept #ifndef DBUG_OFF - : - next(NULL), prev(NULL) + : next(NULL), prev(NULL) #endif { } - ilist_node(ilist_node *next, ilist_node *prev) : next(next), prev(prev) {} + ilist_node(ilist_node *next, ilist_node *prev) noexcept + : next(next), prev(prev) + { + } ilist_node *next; ilist_node *prev; @@ -70,40 +73,40 @@ public: typedef T *pointer; typedef T &reference; - Iterator(ListNode *node) : node_(node) {} + Iterator(ListNode *node) noexcept : node_(node) {} - Iterator &operator++() + Iterator &operator++() noexcept { node_= node_->next; return *this; } - Iterator operator++(int) + Iterator operator++(int) noexcept { Iterator tmp(*this); operator++(); return tmp; } - Iterator &operator--() + Iterator &operator--() noexcept { node_= node_->prev; return *this; } - Iterator operator--(int) + Iterator operator--(int) noexcept { Iterator tmp(*this); operator--(); return tmp; } - reference operator*() { return *static_cast(node_); } - pointer operator->() { return static_cast(node_); } + reference operator*() noexcept { return *static_cast(node_); } + pointer operator->() noexcept { return static_cast(node_); } - friend bool operator==(const Iterator &lhs, const Iterator &rhs) + friend bool operator==(const Iterator &lhs, const Iterator &rhs) noexcept { return lhs.node_ == rhs.node_; } - friend bool operator!=(const Iterator &lhs, const Iterator &rhs) + friend bool operator!=(const Iterator &lhs, const Iterator &rhs) noexcept { return !(lhs == rhs); } @@ -114,30 +117,36 @@ public: friend class ilist; }; - ilist() : sentinel_(&sentinel_, &sentinel_) {} + ilist() noexcept : sentinel_(&sentinel_, &sentinel_) {} - reference front() { return *begin(); } - reference back() { return *--end(); } - const_reference front() const { return *begin(); } - const_reference back() const { return *--end(); } + reference front() noexcept { return *begin(); } + reference back() noexcept { return *--end(); } + const_reference front() const noexcept { return *begin(); } + const_reference back() const noexcept { return *--end(); } - iterator begin() { return iterator(sentinel_.next); } - const_iterator begin() const + iterator begin() noexcept { return iterator(sentinel_.next); } + const_iterator begin() const noexcept { return iterator(const_cast(sentinel_.next)); } - iterator end() { return iterator(&sentinel_); } - const_iterator end() const + iterator end() noexcept { return iterator(&sentinel_); } + const_iterator end() const noexcept { return iterator(const_cast(&sentinel_)); } - reverse_iterator rbegin() { return reverse_iterator(end()); } - const_reverse_iterator rbegin() const { return reverse_iterator(end()); } - reverse_iterator rend() { return reverse_iterator(begin()); } - const_reverse_iterator rend() const { return reverse_iterator(begin()); } + reverse_iterator rbegin() noexcept { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const noexcept + { + return reverse_iterator(end()); + } + reverse_iterator rend() noexcept { return reverse_iterator(begin()); } + const_reverse_iterator rend() const noexcept + { + return reverse_iterator(begin()); + } - bool empty() const { return sentinel_.next == &sentinel_; } + bool empty() const noexcept { return sentinel_.next == &sentinel_; } // Not implemented because it's O(N) // size_type size() const @@ -145,13 +154,13 @@ public: // return static_cast(std::distance(begin(), end())); // } - void clear() + void clear() noexcept { sentinel_.next= &sentinel_; sentinel_.prev= &sentinel_; } - iterator insert(iterator pos, reference value) + iterator insert(iterator pos, reference value) noexcept { ListNode *curr= pos.node_; ListNode *prev= pos.node_->prev; @@ -165,7 +174,7 @@ public: return iterator(&value); } - iterator erase(iterator pos) + iterator erase(iterator pos) noexcept { ListNode *prev= pos.node_->prev; ListNode *next= pos.node_->next; @@ -182,15 +191,15 @@ public: return next; } - void push_back(reference value) { insert(end(), value); } - void pop_back() { erase(end()); } + void push_back(reference value) noexcept { insert(end(), value); } + void pop_back() noexcept { erase(end()); } - void push_front(reference value) { insert(begin(), value); } - void pop_front() { erase(begin()); } + void push_front(reference value) noexcept { insert(begin(), value); } + void pop_front() noexcept { erase(begin()); } // STL version is O(n) but this is O(1) because an element can't be inserted // several times in the same ilist. - void remove(reference value) { erase(iterator(&value)); } + void remove(reference value) noexcept { erase(iterator(&value)); } private: ListNode sentinel_; @@ -216,36 +225,38 @@ public: typedef std::reverse_iterator reverse_iterator; typedef std::reverse_iterator const_reverse_iterator; - sized_ilist() : size_(0) {} + sized_ilist() noexcept : size_(0) {} - size_type size() const { return size_; } + size_type size() const noexcept { return size_; } - void clear() + void clear() noexcept { BASE::clear(); size_= 0; } - iterator insert(iterator pos, reference value) + iterator insert(iterator pos, reference value) noexcept { ++size_; return BASE::insert(pos, value); } - iterator erase(iterator pos) + iterator erase(iterator pos) noexcept { --size_; return BASE::erase(pos); } - void push_back(reference value) { insert(BASE::end(), value); } - void pop_back() { erase(BASE::end()); } + void push_back(reference value) noexcept { insert(BASE::end(), value); } + void pop_back() noexcept { erase(BASE::end()); } - void push_front(reference value) { insert(BASE::begin(), value); } - void pop_front() { erase(BASE::begin()); } + void push_front(reference value) noexcept { insert(BASE::begin(), value); } + void pop_front() noexcept { erase(BASE::begin()); } - void remove(reference value) { erase(iterator(&value)); } + void remove(reference value) noexcept { erase(iterator(&value)); } private: size_type size_; }; + +#endif From 272620399425a1b59f6565ff130970bca6d9b4f9 Mon Sep 17 00:00:00 2001 From: Roman Nozdrin Date: Sat, 11 Jul 2020 14:04:53 +0000 Subject: [PATCH 028/188] Remove obsolete file from the packaging list. --- debian/mariadb-plugin-columnstore.install | 1 - storage/columnstore/columnstore | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/debian/mariadb-plugin-columnstore.install b/debian/mariadb-plugin-columnstore.install index 9f44f74e663..3b4c9619dc6 100644 --- a/debian/mariadb-plugin-columnstore.install +++ b/debian/mariadb-plugin-columnstore.install @@ -56,7 +56,6 @@ usr/bin/mariadb-columnstore-stop.sh usr/bin/mariadb-command-line.sh usr/bin/master-rep-columnstore.sh usr/bin/mcs-loadbrm.py -usr/bin/mcs-start-storagemanager.py usr/bin/mcs-stop-controllernode.sh usr/bin/mcsGetConfig usr/bin/mcsSetConfig diff --git a/storage/columnstore/columnstore b/storage/columnstore/columnstore index d9a8f5fd3ca..cba638b3a52 160000 --- a/storage/columnstore/columnstore +++ b/storage/columnstore/columnstore @@ -1 +1 @@ -Subproject commit d9a8f5fd3cad63d736ca9c900ce3e9d76c4c0947 +Subproject commit cba638b3a52ca79a6bdbe187a6be46abb1806594 From 0994af43e582fccf55f7893b16228b57e92330d0 Mon Sep 17 00:00:00 2001 From: Rucha Deodhar Date: Thu, 2 Jul 2020 19:03:39 +0530 Subject: [PATCH 029/188] MDEV-22058: Assertion `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())' failed in Diagnostics_area::set_ok_status Error state is not stored in check_and_do_in_subquery_rewrites() when there is illegal combination of optimizer switches. So all the functions eventually return false. Thus the assetion failure. --- mysql-test/r/mysqltest_tracking_info.result | 4 ++-- mysql-test/r/sp-error.result | 13 +++++++++++ mysql-test/r/subselect_exists2in.result | 8 +++---- .../sys_vars/r/optimizer_switch_basic.result | 22 +++++++++---------- .../sys_vars/t/optimizer_switch_basic.test | 4 ++-- mysql-test/t/mysqltest_tracking_info.test | 2 +- mysql-test/t/sp-error.test | 19 ++++++++++++++++ mysql-test/t/subselect_exists2in.test | 8 +++---- sql/opt_subselect.cc | 5 ++--- sql/sys_vars.cc | 13 ++++++++++- 10 files changed, 70 insertions(+), 28 deletions(-) diff --git a/mysql-test/r/mysqltest_tracking_info.result b/mysql-test/r/mysqltest_tracking_info.result index 16d737dc4e6..142f5237876 100644 --- a/mysql-test/r/mysqltest_tracking_info.result +++ b/mysql-test/r/mysqltest_tracking_info.result @@ -35,10 +35,10 @@ SET @@session.session_track_system_variables= @save_session_track_system_variabl # set @save_optimizer_switch=@@optimizer_switch; SET @@session.session_track_system_variables='optimizer_switch'; -set optimizer_switch='index_merge=off,index_merge_union=off,index_merge_sort_union=off,index_merge_intersection=off,index_merge_sort_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=on,mrr_cost_based=on,mrr_sort_keys=on,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=on,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off'; +set optimizer_switch='index_merge=off,index_merge_union=off,index_merge_sort_union=off,index_merge_intersection=off,index_merge_sort_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=on,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=on,mrr_cost_based=on,mrr_sort_keys=on,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=on,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off'; -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- optimizer_switch --- index_merge=off,index_merge_union=off,index_merge_sort_union=off,index_merge_intersection=off,index_merge_sort_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=on,mrr_cost_based=on,mrr_sort_keys=on,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=on,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off +-- index_merge=off,index_merge_union=off,index_merge_sort_union=off,index_merge_intersection=off,index_merge_sort_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=on,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=on,mrr_cost_based=on,mrr_sort_keys=on,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=on,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off Warnings: Warning 1681 'engine_condition_pushdown=on' is deprecated and will be removed in a future release diff --git a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result index b9291973ab3..877c8bb1666 100644 --- a/mysql-test/r/sp-error.result +++ b/mysql-test/r/sp-error.result @@ -2872,3 +2872,16 @@ SELECT @msg; DROP FUNCTION f1; DROP FUNCTION f2; DROP TABLE t1; +# +# 10.2 Test +# +# MDEV-MDEV-22058: Assertion `!is_set() || (m_status == DA_OK_BULK && +# is_bulk_op())' failed in Diagnostics_area::set_ok_status +# +SET @old_optimizer_switch = @@SESSION.OPTIMIZER_SWITCH; +SET @cmd:="SET @@SESSION.SQL_MODE=(SELECT 'a')"; +SET @@SESSION.OPTIMIZER_SWITCH="in_to_exists=OFF,materialization=OFF"; +ERROR HY000: At least one of the 'in_to_exists' or 'materialization' optimizer_switch flags must be 'on' +PREPARE stmt FROM @cmd; +set @@SESSION.OPTIMIZER_SWITCH=@old_optimizer_switch; +# End of 10.2 Test diff --git a/mysql-test/r/subselect_exists2in.result b/mysql-test/r/subselect_exists2in.result index de01a4e7304..957f7b9bbff 100644 --- a/mysql-test/r/subselect_exists2in.result +++ b/mysql-test/r/subselect_exists2in.result @@ -437,8 +437,8 @@ drop table t1,t3; # MDEV-159 Assertion about not marked for read failed in # String* Field_varstring::val_str(String*, String*) # -SET optimizer_switch = REPLACE( @@optimizer_switch, '=on', '=off' ); -SET optimizer_switch='in_to_exists=on,exists_to_in=on'; +SET optimizer_switch = REPLACE(REPLACE(@@optimizer_switch, '=on', '=off'), 'in_to_exists=off', 'in_to_exists=on'); +SET optimizer_switch='exists_to_in=on'; CREATE TABLE t1 ( a VARCHAR(1) ); INSERT INTO t1 VALUES ('k'),('m'); CREATE TABLE t2 ( b INT, @@ -593,8 +593,8 @@ Warnings: Note 1276 Field or reference 'test.alias.a' of SELECT #2 was resolved in SELECT #1 Note 1276 Field or reference 'test.alias.b' of SELECT #2 was resolved in SELECT #1 Note 1003 select `test`.`alias`.`a` AS `a`,`test`.`alias`.`b` AS `b` from `test`.`t1` `alias` semi join (`test`.`t1`) where `test`.`t1`.`a` = `test`.`alias`.`b` and `test`.`alias`.`b` > `test`.`alias`.`a` -SET optimizer_switch = REPLACE( @@optimizer_switch, '=on', '=off' ); -SET optimizer_switch = 'exists_to_in=on,materialization=on,semijoin=off'; +SET optimizer_switch = REPLACE(REPLACE(@@optimizer_switch, '=on', '=off'), 'materialization=off', 'materialization=on'); +SET optimizer_switch = 'exists_to_in=on,semijoin=off'; SELECT * FROM t1 AS alias WHERE EXISTS ( SELECT * FROM t1 WHERE a > alias.a AND a = alias.b ); a b diff --git a/mysql-test/suite/sys_vars/r/optimizer_switch_basic.result b/mysql-test/suite/sys_vars/r/optimizer_switch_basic.result index c37c6785b9b..d813f515f83 100644 --- a/mysql-test/suite/sys_vars/r/optimizer_switch_basic.result +++ b/mysql-test/suite/sys_vars/r/optimizer_switch_basic.result @@ -17,38 +17,38 @@ OPTIMIZER_SWITCH index_merge=on,index_merge_union=on,index_merge_sort_union=on,i select * from information_schema.session_variables where variable_name='optimizer_switch'; VARIABLE_NAME VARIABLE_VALUE OPTIMIZER_SWITCH index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=on,derived_merge=on,derived_with_keys=on,firstmatch=on,loosescan=on,materialization=on,in_to_exists=on,semijoin=on,partial_match_rowid_merge=on,partial_match_table_scan=on,subquery_cache=on,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=on,semijoin_with_cache=on,join_cache_incremental=on,join_cache_hashed=on,join_cache_bka=on,optimize_join_buffer_size=off,table_elimination=on,extended_keys=on,exists_to_in=on,orderby_uses_equalities=on,condition_pushdown_for_derived=on -set global optimizer_switch=10; -set session optimizer_switch=5; +set global optimizer_switch=4101; +set session optimizer_switch=2058; select @@global.optimizer_switch; @@global.optimizer_switch -index_merge=off,index_merge_union=on,index_merge_sort_union=off,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off +index_merge=on,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=off,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off select @@session.optimizer_switch; @@session.optimizer_switch -index_merge=on,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=off,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off +index_merge=off,index_merge_union=on,index_merge_sort_union=off,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=on,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off set global optimizer_switch="index_merge_sort_union=on"; set session optimizer_switch="index_merge=off"; select @@global.optimizer_switch; @@global.optimizer_switch -index_merge=off,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off +index_merge=on,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=off,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off select @@session.optimizer_switch; @@session.optimizer_switch -index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=off,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off +index_merge=off,index_merge_union=on,index_merge_sort_union=off,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=on,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off show global variables like 'optimizer_switch'; Variable_name Value -optimizer_switch index_merge=off,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off +optimizer_switch index_merge=on,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=off,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off show session variables like 'optimizer_switch'; Variable_name Value -optimizer_switch index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=off,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off +optimizer_switch index_merge=off,index_merge_union=on,index_merge_sort_union=off,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=on,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off select * from information_schema.global_variables where variable_name='optimizer_switch'; VARIABLE_NAME VARIABLE_VALUE -OPTIMIZER_SWITCH index_merge=off,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off +OPTIMIZER_SWITCH index_merge=on,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=off,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off select * from information_schema.session_variables where variable_name='optimizer_switch'; VARIABLE_NAME VARIABLE_VALUE -OPTIMIZER_SWITCH index_merge=off,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=off,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off +OPTIMIZER_SWITCH index_merge=off,index_merge_union=on,index_merge_sort_union=off,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=on,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off set session optimizer_switch="default"; select @@session.optimizer_switch; @@session.optimizer_switch -index_merge=off,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off +index_merge=on,index_merge_union=off,index_merge_sort_union=on,index_merge_intersection=off,index_merge_sort_intersection=off,engine_condition_pushdown=off,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=on,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=off,mrr_cost_based=off,mrr_sort_keys=off,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=off,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off set optimizer_switch = replace(@@optimizer_switch, '=off', '=on'); Warnings: Warning 1681 'engine_condition_pushdown=on' is deprecated and will be removed in a future release diff --git a/mysql-test/suite/sys_vars/t/optimizer_switch_basic.test b/mysql-test/suite/sys_vars/t/optimizer_switch_basic.test index ef9d8f17832..ada22845f3e 100644 --- a/mysql-test/suite/sys_vars/t/optimizer_switch_basic.test +++ b/mysql-test/suite/sys_vars/t/optimizer_switch_basic.test @@ -19,8 +19,8 @@ select * from information_schema.session_variables where variable_name='optimize # # show that it's writable # -set global optimizer_switch=10; -set session optimizer_switch=5; +set global optimizer_switch=4101; +set session optimizer_switch=2058; select @@global.optimizer_switch; select @@session.optimizer_switch; set global optimizer_switch="index_merge_sort_union=on"; diff --git a/mysql-test/t/mysqltest_tracking_info.test b/mysql-test/t/mysqltest_tracking_info.test index da7732b5011..dc51167137a 100644 --- a/mysql-test/t/mysqltest_tracking_info.test +++ b/mysql-test/t/mysqltest_tracking_info.test @@ -36,7 +36,7 @@ set @save_optimizer_switch=@@optimizer_switch; SET @@session.session_track_system_variables='optimizer_switch'; --enable_session_track_info -set optimizer_switch='index_merge=off,index_merge_union=off,index_merge_sort_union=off,index_merge_intersection=off,index_merge_sort_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=off,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=on,mrr_cost_based=on,mrr_sort_keys=on,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=on,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off'; +set optimizer_switch='index_merge=off,index_merge_union=off,index_merge_sort_union=off,index_merge_intersection=off,index_merge_sort_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=on,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=on,mrr_cost_based=on,mrr_sort_keys=on,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=on,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off'; --disable_session_track_info set @@optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test index 4dd3c51e4b0..b0c957ad164 100644 --- a/mysql-test/t/sp-error.test +++ b/mysql-test/t/sp-error.test @@ -3851,3 +3851,22 @@ SELECT @msg; DROP FUNCTION f1; DROP FUNCTION f2; DROP TABLE t1; + +--echo # +--echo # 10.2 Test +--echo # +--echo # MDEV-MDEV-22058: Assertion `!is_set() || (m_status == DA_OK_BULK && +--echo # is_bulk_op())' failed in Diagnostics_area::set_ok_status +--echo # + +SET @old_optimizer_switch = @@SESSION.OPTIMIZER_SWITCH; + +SET @cmd:="SET @@SESSION.SQL_MODE=(SELECT 'a')"; + +--error ER_ILLEGAL_SUBQUERY_OPTIMIZER_SWITCHES +SET @@SESSION.OPTIMIZER_SWITCH="in_to_exists=OFF,materialization=OFF"; +PREPARE stmt FROM @cmd; + +set @@SESSION.OPTIMIZER_SWITCH=@old_optimizer_switch; + +--echo # End of 10.2 Test diff --git a/mysql-test/t/subselect_exists2in.test b/mysql-test/t/subselect_exists2in.test index 1354953e972..2a9947123d4 100644 --- a/mysql-test/t/subselect_exists2in.test +++ b/mysql-test/t/subselect_exists2in.test @@ -330,8 +330,8 @@ drop table t1,t3; --echo # String* Field_varstring::val_str(String*, String*) --echo # -SET optimizer_switch = REPLACE( @@optimizer_switch, '=on', '=off' ); -SET optimizer_switch='in_to_exists=on,exists_to_in=on'; +SET optimizer_switch = REPLACE(REPLACE(@@optimizer_switch, '=on', '=off'), 'in_to_exists=off', 'in_to_exists=on'); +SET optimizer_switch='exists_to_in=on'; CREATE TABLE t1 ( a VARCHAR(1) ); INSERT INTO t1 VALUES ('k'),('m'); @@ -466,8 +466,8 @@ explain extended SELECT * FROM t1 AS alias WHERE EXISTS ( SELECT * FROM t1 WHERE a > alias.a AND a = alias.b ); -SET optimizer_switch = REPLACE( @@optimizer_switch, '=on', '=off' ); -SET optimizer_switch = 'exists_to_in=on,materialization=on,semijoin=off'; +SET optimizer_switch = REPLACE(REPLACE(@@optimizer_switch, '=on', '=off'), 'materialization=off', 'materialization=on'); +SET optimizer_switch = 'exists_to_in=on,semijoin=off'; SELECT * FROM t1 AS alias WHERE EXISTS ( SELECT * FROM t1 WHERE a > alias.a AND a = alias.b ); explain extended diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index 2fb5b88687f..45aa625389d 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -701,9 +701,8 @@ int check_and_do_in_subquery_rewrites(JOIN *join) { DBUG_PRINT("info", ("Subquery can't be converted to merged semi-join")); /* Test if the user has set a legal combination of optimizer switches. */ - if (!optimizer_flag(thd, OPTIMIZER_SWITCH_IN_TO_EXISTS) && - !optimizer_flag(thd, OPTIMIZER_SWITCH_MATERIALIZATION)) - my_error(ER_ILLEGAL_SUBQUERY_OPTIMIZER_SWITCHES, MYF(0)); + DBUG_ASSERT(optimizer_flag(thd, OPTIMIZER_SWITCH_IN_TO_EXISTS | + OPTIMIZER_SWITCH_MATERIALIZATION)); /* Transform each subquery predicate according to its overloaded transformer. diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 2d40943827f..af261299496 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -2471,12 +2471,23 @@ static bool fix_optimizer_switch(sys_var *self, THD *thd, "engine_condition_pushdown=on"); return false; } +static bool check_legal_optimizer_switch(sys_var *self, THD *thd, + set_var *var) +{ + if (var->save_result.ulonglong_value & (OPTIMIZER_SWITCH_MATERIALIZATION | + OPTIMIZER_SWITCH_IN_TO_EXISTS)) + { + return false; + } + my_error(ER_ILLEGAL_SUBQUERY_OPTIMIZER_SWITCHES, MYF(0)); + return true; +} static Sys_var_flagset Sys_optimizer_switch( "optimizer_switch", "Fine-tune the optimizer behavior", SESSION_VAR(optimizer_switch), CMD_LINE(REQUIRED_ARG), optimizer_switch_names, DEFAULT(OPTIMIZER_SWITCH_DEFAULT), - NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(NULL), + NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(check_legal_optimizer_switch), ON_UPDATE(fix_optimizer_switch)); static Sys_var_charptr Sys_pid_file( From de20872331d18d804db8c2df677288659444af1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 13 Jul 2020 16:44:46 +0300 Subject: [PATCH 030/188] MDEV-22988 Corrupted table after DROP INDEX This form of corruption was only reproduced on MariaDB 10.5.4 after the MDEV-22867 fix was applied in commit 431200090e404b1fd618f1b6bda1afd830e79ce0. While we do not know how to reproduce this corruption in MariaDB 10.4, we are applying the code fix without a test case. btr_cur_pessimistic_update(): Invoke btr_set_instant() if needed. --- storage/innobase/btr/btr0cur.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index 7ffbf6882ee..8c657bc341b 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -5091,6 +5091,11 @@ btr_cur_pessimistic_update( btr_page_reorganize(page_cursor, index, mtr); rec = page_cursor->rec; rec_offs_make_valid(rec, index, true, *offsets); + if (page_cursor->block->page.id.page_no() + == index->page) { + btr_set_instant(page_cursor->block, *index, + mtr); + } } else if (!dict_table_is_locking_disabled(index->table)) { lock_rec_restore_from_page_infimum( btr_cur_get_block(cursor), rec, block); From 9b8bc713b5a9f05a92f05eb176e82d9496276801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 13 Jul 2020 17:49:09 +0300 Subject: [PATCH 031/188] Cleanup: Remove redundant #include "ha0ha.h" --- storage/innobase/btr/btr0sea.cc | 1 - storage/innobase/include/btr0cur.h | 1 - 2 files changed, 2 deletions(-) diff --git a/storage/innobase/btr/btr0sea.cc b/storage/innobase/btr/btr0sea.cc index 92cb38d0a85..ff13e0ad5e8 100644 --- a/storage/innobase/btr/btr0sea.cc +++ b/storage/innobase/btr/btr0sea.cc @@ -39,7 +39,6 @@ Created 2/17/1996 Heikki Tuuri #include "btr0cur.h" #include "btr0pcur.h" #include "btr0btr.h" -#include "ha0ha.h" #include "srv0mon.h" /** Is search system enabled. diff --git a/storage/innobase/include/btr0cur.h b/storage/innobase/include/btr0cur.h index 99aa787df79..03ebf6f448f 100644 --- a/storage/innobase/include/btr0cur.h +++ b/storage/innobase/include/btr0cur.h @@ -69,7 +69,6 @@ struct btr_latch_leaves_t { #include "que0types.h" #include "row0types.h" -#include "ha0ha.h" #ifdef UNIV_DEBUG /*********************************************************//** From 65b4b90317291d54d75c1530b00e98a1c86f1141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 13 Jul 2020 17:53:12 +0300 Subject: [PATCH 032/188] MDEV-22871 follow-up: Align buf_pool.page_hash.array buf_pool_t::page_hash_table::create(): Use aligned_malloc() for the hash array, to get the page_hash_latch aligned on the same L1 data cache line as the data that it is protecting. --- storage/innobase/buf/buf0buf.cc | 6 ++++-- storage/innobase/include/buf0buf.h | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 8f9a230fcd5..7a77ef1e016 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -1488,8 +1488,10 @@ static void buf_block_free_mutexes(buf_block_t* block) void buf_pool_t::page_hash_table::create(ulint n) { n_cells= ut_find_prime(n); - array= static_cast - (ut_zalloc_nokey(pad(n_cells) * sizeof *array)); + const size_t size= pad(n_cells) * sizeof *array; + void* v= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE); + memset(v, 0, size); + array= static_cast(v); } /** Create the buffer pool. diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index e316e1b7dab..7b5eed20ff2 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -1832,7 +1832,7 @@ public: /** number of payload elements in array[] */ Atomic_relaxed n_cells; - /** the hash array, with pad(n_cells) elements */ + /** the hash table, with pad(n_cells) elements, aligned to L1 cache size */ hash_cell_t *array; /** Create the hash table. @@ -1840,7 +1840,7 @@ public: void create(ulint n); /** Free the hash table. */ - void free() { ut_free(array); array= nullptr; } + void free() { aligned_free(array); array= nullptr; } /** @return the index of an array element */ ulint calc_hash(ulint fold) const { return calc_hash(fold, n_cells); } From d34eb4b1f6d3f98dc611b13a5d09add5cbd5a127 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 13 Jul 2020 17:57:11 +0300 Subject: [PATCH 033/188] MDEV-8139 follow-up fix: Remove an unused constexpr --- storage/innobase/btr/btr0btr.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/storage/innobase/btr/btr0btr.cc b/storage/innobase/btr/btr0btr.cc index 43a3b44903f..d2a9d9c5df7 100644 --- a/storage/innobase/btr/btr0btr.cc +++ b/storage/innobase/btr/btr0btr.cc @@ -930,8 +930,10 @@ void btr_page_get_father(dict_index_t* index, buf_block_t* block, mtr_t* mtr, mem_heap_free(heap); } +#ifdef UNIV_DEBUG /** PAGE_INDEX_ID value for freed index B-trees */ constexpr index_id_t BTR_FREED_INDEX_ID = 0; +#endif /** Free a B-tree root page. btr_free_but_not_root() must already have been called. From 5967dfdbbfd61b0ba80e0425f9263ee0df026619 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Mon, 13 Jul 2020 16:19:49 +0400 Subject: [PATCH 034/188] MDEV-23154 Add a data type my_repertoire_t --- include/m_ctype.h | 18 ++++++++++++------ sql/item.cc | 4 ++-- sql/item.h | 15 +++++++++------ sql/item_timefunc.cc | 2 +- sql/sql_class.cc | 3 ++- sql/sql_class.h | 4 ++-- sql/sql_lex.h | 4 ++-- sql/sql_locale.h | 2 +- sql/sql_type.h | 19 ++++++++++++++++--- 9 files changed, 47 insertions(+), 24 deletions(-) diff --git a/include/m_ctype.h b/include/m_ctype.h index 8440efa971c..59ac7814aee 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -226,9 +226,14 @@ extern MY_UNI_CTYPE my_uni_ctype[256]; #define MY_CHARSET_UNDEFINED 0 /* Character repertoire flags */ -#define MY_REPERTOIRE_ASCII 1 /* Pure ASCII U+0000..U+007F */ -#define MY_REPERTOIRE_EXTENDED 2 /* Extended characters: U+0080..U+FFFF */ -#define MY_REPERTOIRE_UNICODE30 3 /* ASCII | EXTENDED: U+0000..U+FFFF */ +typedef enum enum_repertoire_t +{ + MY_REPERTOIRE_NONE= 0, + MY_REPERTOIRE_ASCII= 1, /* Pure ASCII U+0000..U+007F */ + MY_REPERTOIRE_EXTENDED= 2, /* Extended characters: U+0080..U+FFFF */ + MY_REPERTOIRE_UNICODE30= 3 /* ASCII | EXTENDED: U+0000..U+FFFF */ +} my_repertoire_t; + /* Flags for strxfrm */ #define MY_STRXFRM_LEVEL1 0x00000001 /* for primary weights */ @@ -1420,14 +1425,15 @@ my_bool my_propagate_complex(CHARSET_INFO *cs, const uchar *str, size_t len); typedef struct { size_t char_length; - uint repertoire; + my_repertoire_t repertoire; } MY_STRING_METADATA; void my_string_metadata_get(MY_STRING_METADATA *metadata, CHARSET_INFO *cs, const char *str, size_t len); -uint my_string_repertoire(CHARSET_INFO *cs, const char *str, size_t len); +my_repertoire_t my_string_repertoire(CHARSET_INFO *cs, + const char *str, size_t len); my_bool my_charset_is_ascii_based(CHARSET_INFO *cs); -uint my_charset_repertoire(CHARSET_INFO *cs); +my_repertoire_t my_charset_repertoire(CHARSET_INFO *cs); uint my_strxfrm_flag_normalize(uint flags, uint nlevels); void my_strxfrm_desc_and_reverse(uchar *str, uchar *strend, diff --git a/sql/item.cc b/sql/item.cc index 9b321103e07..6f34c93e21c 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -2430,7 +2430,7 @@ bool DTCollation::aggregate(const DTCollation &dt, uint flags) { if (derivation == DERIVATION_EXPLICIT) { - set(0, DERIVATION_NONE, 0); + set(0, DERIVATION_NONE, MY_REPERTOIRE_NONE); return 1; } if (collation->state & MY_CS_BINSORT && @@ -3911,7 +3911,7 @@ Item_null::make_string_literal_concat(THD *thd, const LEX_CSTRING *str) if (str->length) { CHARSET_INFO *cs= thd->variables.collation_connection; - uint repertoire= my_string_repertoire(cs, str->str, str->length); + my_repertoire_t repertoire= my_string_repertoire(cs, str->str, str->length); return new (thd->mem_root) Item_string(thd, str->str, (uint) str->length, cs, DERIVATION_COERCIBLE, repertoire); diff --git a/sql/item.h b/sql/item.h index ad746a4c3eb..20dc1474bf9 100644 --- a/sql/item.h +++ b/sql/item.h @@ -2767,12 +2767,15 @@ protected: { my_string_metadata_get(this, str->charset(), str->ptr(), str->length()); } - Metadata(const String *str, uint repertoire_arg) + Metadata(const String *str, my_repertoire_t repertoire_arg) { MY_STRING_METADATA::repertoire= repertoire_arg; MY_STRING_METADATA::char_length= str->numchars(); } - uint repertoire() const { return MY_STRING_METADATA::repertoire; } + my_repertoire_t repertoire() const + { + return MY_STRING_METADATA::repertoire; + } size_t char_length() const { return MY_STRING_METADATA::char_length; } }; void fix_charset_and_length(CHARSET_INFO *cs, @@ -4400,7 +4403,7 @@ public: } // Constructors with the item name set from its value Item_string(THD *thd, const char *str, uint length, CHARSET_INFO *cs, - Derivation dv, uint repertoire) + Derivation dv, my_repertoire_t repertoire) :Item_literal(thd) { str_value.set_or_copy_aligned(str, length, cs); @@ -4414,7 +4417,7 @@ public: fix_and_set_name_from_value(thd, dv, Metadata(&str_value)); } Item_string(THD *thd, const String *str, CHARSET_INFO *tocs, uint *conv_errors, - Derivation dv, uint repertoire) + Derivation dv, my_repertoire_t repertoire) :Item_literal(thd) { if (str_value.copy(str, tocs, conv_errors)) @@ -4432,7 +4435,7 @@ public: set_name(thd, name_par); } Item_string(THD *thd, const LEX_CSTRING &name_par, const LEX_CSTRING &str, - CHARSET_INFO *cs, Derivation dv, uint repertoire) + CHARSET_INFO *cs, Derivation dv, my_repertoire_t repertoire) :Item_literal(thd) { str_value.set_or_copy_aligned(str.str, str.length, cs); @@ -4565,7 +4568,7 @@ public: Item_static_string_func(THD *thd, const LEX_CSTRING &name_par, const String *str, CHARSET_INFO *tocs, uint *conv_errors, - Derivation dv, uint repertoire): + Derivation dv, my_repertoire_t repertoire): Item_string(thd, str, tocs, conv_errors, dv, repertoire), func_name(name_par) {} diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index e47d4fa7f0e..3425b293193 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -1742,7 +1742,7 @@ bool Item_func_date_format::fix_length_and_dec() decimals=0; CHARSET_INFO *cs= thd->variables.collation_connection; - uint32 repertoire= arg1->collation.repertoire; + my_repertoire_t repertoire= arg1->collation.repertoire; if (!thd->variables.lc_time_names->is_ascii) repertoire|= MY_REPERTOIRE_EXTENDED; collation.set(cs, arg1->collation.derivation, repertoire); diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 6d507197639..d6a86fc1e4a 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -2493,7 +2493,8 @@ bool THD::to_ident_sys_alloc(Lex_ident_sys_st *to, const Lex_ident_cli_st *ident Item_basic_constant * -THD::make_string_literal(const char *str, size_t length, uint repertoire) +THD::make_string_literal(const char *str, size_t length, + my_repertoire_t repertoire) { if (!length && (variables.sql_mode & MODE_EMPTY_STRING_IS_NULL)) return new (mem_root) Item_null(this, 0, variables.collation_connection); diff --git a/sql/sql_class.h b/sql/sql_class.h index 9ca1da9bbff..7eba953d241 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -3935,10 +3935,10 @@ public: @param repertoire - the repertoire of the string */ Item_basic_constant *make_string_literal(const char *str, size_t length, - uint repertoire); + my_repertoire_t repertoire); Item_basic_constant *make_string_literal(const Lex_string_with_metadata_st &str) { - uint repertoire= str.repertoire(variables.character_set_client); + my_repertoire_t repertoire= str.repertoire(variables.character_set_client); return make_string_literal(str.str, str.length, repertoire); } Item_basic_constant *make_string_literal_nchar(const Lex_string_with_metadata_st &str); diff --git a/sql/sql_lex.h b/sql/sql_lex.h index b6dcb49ed08..02aec6792b6 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -85,13 +85,13 @@ public: bool is_quoted() const { return m_quote != '\0'; } char quote() const { return m_quote; } // Get string repertoire by the 8-bit flag and the character set - uint repertoire(CHARSET_INFO *cs) const + my_repertoire_t repertoire(CHARSET_INFO *cs) const { return !m_is_8bit && my_charset_is_ascii_based(cs) ? MY_REPERTOIRE_ASCII : MY_REPERTOIRE_UNICODE30; } // Get string repertoire by the 8-bit flag, for ASCII-based character sets - uint repertoire() const + my_repertoire_t repertoire() const { return !m_is_8bit ? MY_REPERTOIRE_ASCII : MY_REPERTOIRE_UNICODE30; } diff --git a/sql/sql_locale.h b/sql/sql_locale.h index feeb7a44bdf..b7ce9f7ba1d 100644 --- a/sql/sql_locale.h +++ b/sql/sql_locale.h @@ -60,7 +60,7 @@ public: grouping(grouping_par), errmsgs(errmsgs_par) {} - uint repertoire() const + my_repertoire_t repertoire() const { return is_ascii ? MY_REPERTOIRE_ASCII : MY_REPERTOIRE_EXTENDED; } }; /* Exported variables */ diff --git a/sql/sql_type.h b/sql/sql_type.h index 0850d08c5ae..dcff53eb4f1 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -2712,6 +2712,19 @@ public: #define MY_REPERTOIRE_NUMERIC MY_REPERTOIRE_ASCII +static inline my_repertoire_t operator|(const my_repertoire_t a, + const my_repertoire_t b) +{ + return (my_repertoire_t) ((uint) a | (uint) b); +} + +static inline my_repertoire_t &operator|=(my_repertoire_t &a, + const my_repertoire_t b) +{ + return a= (my_repertoire_t) ((uint) a | (uint) b); +} + + enum Derivation { DERIVATION_IGNORABLE= 6, @@ -2733,7 +2746,7 @@ class DTCollation { public: CHARSET_INFO *collation; enum Derivation derivation; - uint repertoire; + my_repertoire_t repertoire; void set_repertoire_from_charset(CHARSET_INFO *cs) { @@ -2769,7 +2782,7 @@ public: } DTCollation(CHARSET_INFO *collation_arg, Derivation derivation_arg, - uint repertoire_arg) + my_repertoire_t repertoire_arg) :collation(collation_arg), derivation(derivation_arg), repertoire(repertoire_arg) @@ -2786,7 +2799,7 @@ public: } void set(CHARSET_INFO *collation_arg, Derivation derivation_arg, - uint repertoire_arg) + my_repertoire_t repertoire_arg) { collation= collation_arg; derivation= derivation_arg; From 30e7a0a866dce530d8328c6d614e48d39a264f9b Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Mon, 13 Jul 2020 19:59:09 +0400 Subject: [PATCH 035/188] MDEV-23157 Remove redundant virtual Protocol::store() --- sql/protocol.cc | 32 ++++++++++---------------------- sql/protocol.h | 5 +---- 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/sql/protocol.cc b/sql/protocol.cc index d565a818f31..83dc66fa447 100644 --- a/sql/protocol.cc +++ b/sql/protocol.cc @@ -1205,18 +1205,6 @@ bool Protocol::store_warning(const char *from, size_t length) bool Protocol_text::store(const char *from, size_t length, CHARSET_INFO *fromcs, CHARSET_INFO *tocs) { -#ifndef DBUG_OFF - DBUG_ASSERT(valid_handler(field_pos, PROTOCOL_SEND_STRING)); - field_pos++; -#endif - return store_string_aux(from, length, fromcs, tocs); -} - - -bool Protocol_text::store(const char *from, size_t length, - CHARSET_INFO *fromcs) -{ - CHARSET_INFO *tocs= this->thd->variables.character_set_results; #ifndef DBUG_OFF DBUG_PRINT("info", ("Protocol_text::store field %u (%u): %.*b", field_pos, field_count, (int) length, (length == 0 ? "" : from))); @@ -1228,6 +1216,14 @@ bool Protocol_text::store(const char *from, size_t length, } +bool Protocol::store(const char *from, size_t length, + CHARSET_INFO *fromcs) +{ + CHARSET_INFO *tocs= this->thd->variables.character_set_results; + return store(from, length, fromcs, tocs); +} + + bool Protocol_text::store_tiny(longlong from) { #ifndef DBUG_OFF @@ -1455,14 +1451,6 @@ void Protocol_binary::prepare_for_resend() } -bool Protocol_binary::store(const char *from, size_t length, - CHARSET_INFO *fromcs) -{ - CHARSET_INFO *tocs= thd->variables.character_set_results; - field_pos++; - return store_string_aux(from, length, fromcs, tocs); -} - bool Protocol_binary::store(const char *from, size_t length, CHARSET_INFO *fromcs, CHARSET_INFO *tocs) { @@ -1526,11 +1514,11 @@ bool Protocol_binary::store_decimal(const my_decimal *d) { #ifndef DBUG_OFF DBUG_ASSERT(0); // This method is not used yet - field_pos++; #endif StringBuffer str; (void) d->to_string(&str); - return store(str.ptr(), str.length(), str.charset()); + return store(str.ptr(), str.length(), str.charset(), + thd->variables.character_set_results); } bool Protocol_binary::store(float from, uint32 decimals, String *buffer) diff --git a/sql/protocol.h b/sql/protocol.h index 661ca11d3a1..3d4ecb9f4f0 100644 --- a/sql/protocol.h +++ b/sql/protocol.h @@ -120,7 +120,7 @@ public: virtual bool store_long(longlong from)=0; virtual bool store_longlong(longlong from, bool unsigned_flag)=0; virtual bool store_decimal(const my_decimal *)=0; - virtual bool store(const char *from, size_t length, CHARSET_INFO *cs)=0; + bool store(const char *from, size_t length, CHARSET_INFO *cs); virtual bool store(const char *from, size_t length, CHARSET_INFO *fromcs, CHARSET_INFO *tocs)=0; bool store_str(const LEX_CSTRING &s, CHARSET_INFO *fromcs, CHARSET_INFO *tocs) @@ -178,7 +178,6 @@ public: virtual bool store_long(longlong from); virtual bool store_longlong(longlong from, bool unsigned_flag); virtual bool store_decimal(const my_decimal *); - virtual bool store(const char *from, size_t length, CHARSET_INFO *cs); virtual bool store(const char *from, size_t length, CHARSET_INFO *fromcs, CHARSET_INFO *tocs); virtual bool store(MYSQL_TIME *time, int decimals); @@ -223,7 +222,6 @@ public: virtual bool store_long(longlong from); virtual bool store_longlong(longlong from, bool unsigned_flag); virtual bool store_decimal(const my_decimal *); - virtual bool store(const char *from, size_t length, CHARSET_INFO *cs); virtual bool store(const char *from, size_t length, CHARSET_INFO *fromcs, CHARSET_INFO *tocs); virtual bool store(MYSQL_TIME *time, int decimals); @@ -272,7 +270,6 @@ public: bool store_long(longlong) { return false; } bool store_longlong(longlong, bool) { return false; } bool store_decimal(const my_decimal *) { return false; } - bool store(const char *, size_t, CHARSET_INFO *) { return false; } bool store(const char *, size_t, CHARSET_INFO *, CHARSET_INFO *) { return false; } bool store(MYSQL_TIME *, int) { return false; } bool store_date(MYSQL_TIME *) { return false; } From b0df247db675a721198f2d4dbeb098cd57d932a3 Mon Sep 17 00:00:00 2001 From: Varun Gupta Date: Fri, 10 Jul 2020 10:45:04 +0530 Subject: [PATCH 036/188] MDEV-22463: Element_type &Bounds_checked_array::operator[](size_t) [Element_type = Item *]: Assertion `n < m_size' failed. Allocate space for fields inside the window function (arguments, PARTITION BY and ORDER BY clause) in the ref pointer array. All fields inside the window function are part of the temporary table that is required for the window function computation. --- mysql-test/r/win.result | 35 +++++++++++++++++++++++++++++++++++ mysql-test/t/win.test | 16 ++++++++++++++++ sql/sql_lex.cc | 4 +++- sql/sql_lex.h | 13 +++++++++---- sql/sql_parse.cc | 10 ++++++++++ sql/sql_window.cc | 8 ++++++++ 6 files changed, 81 insertions(+), 5 deletions(-) diff --git a/mysql-test/r/win.result b/mysql-test/r/win.result index 71953871295..019cfd6115d 100644 --- a/mysql-test/r/win.result +++ b/mysql-test/r/win.result @@ -3808,5 +3808,40 @@ MIN(d) OVER () 1 DROP TABLE t1; # +# MDEV-22463: Element_type &Bounds_checked_array::operator[](size_t) [Element_type = Item *]: +# Assertion `n < m_size' failed +# +CREATE TABLE t1 (a INT, b INT, c INT, d INT, e INT, f INT, g int, h INT, i INT); +INSERT INTO t1 SELECT seq,seq,seq,seq, seq,seq,seq,seq,seq FROM seq_1_to_5; +SELECT ROW_NUMBER() OVER w2 FROM t1 WINDOW w2 AS (PARTITION BY -1,0,1,2,3,4,5,6); +ROW_NUMBER() OVER w2 +1 +2 +3 +4 +5 +SELECT a FROM t1 ORDER BY ROW_NUMBER() OVER (PARTITION BY -1,1,0,2,3,4,5,6,7,8); +a +1 +2 +3 +4 +5 +SELECT a,b FROM t1 WINDOW w2 AS (PARTITION BY -1,1,0,2,3,4); +a b +1 1 +2 2 +3 3 +4 4 +5 5 +SELECT ROW_NUMBER() OVER w2 FROM t1 WINDOW w2 AS (PARTITION BY -1,0,1,2,3,4,5,6); +ROW_NUMBER() OVER w2 +1 +2 +3 +4 +5 +DROP TABLE t1; +# # End of 10.2 tests # diff --git a/mysql-test/t/win.test b/mysql-test/t/win.test index a768b893432..deed7de2d23 100644 --- a/mysql-test/t/win.test +++ b/mysql-test/t/win.test @@ -1,6 +1,7 @@ # # Window Functions Tests # +--source include/have_sequence.inc --disable_warnings drop table if exists t1,t2; @@ -2481,6 +2482,21 @@ INSERT INTO t1 VALUES (1),(2); SELECT MIN(d) OVER () FROM t1; DROP TABLE t1; +--echo # +--echo # MDEV-22463: Element_type &Bounds_checked_array::operator[](size_t) [Element_type = Item *]: +--echo # Assertion `n < m_size' failed +--echo # + +CREATE TABLE t1 (a INT, b INT, c INT, d INT, e INT, f INT, g int, h INT, i INT); +INSERT INTO t1 SELECT seq,seq,seq,seq, seq,seq,seq,seq,seq FROM seq_1_to_5; + +SELECT ROW_NUMBER() OVER w2 FROM t1 WINDOW w2 AS (PARTITION BY -1,0,1,2,3,4,5,6); +--sorted_result +SELECT a FROM t1 ORDER BY ROW_NUMBER() OVER (PARTITION BY -1,1,0,2,3,4,5,6,7,8); +SELECT a,b FROM t1 WINDOW w2 AS (PARTITION BY -1,1,0,2,3,4); +SELECT ROW_NUMBER() OVER w2 FROM t1 WINDOW w2 AS (PARTITION BY -1,0,1,2,3,4,5,6); +DROP TABLE t1; + --echo # --echo # End of 10.2 tests --echo # diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 2312ec34e7b..c39afdf9e10 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -2140,6 +2140,7 @@ void st_select_lex::init_query() n_sum_items= 0; n_child_sum_items= 0; hidden_bit_fields= 0; + fields_in_window_functions= 0; subquery_in_having= explicit_limit= 0; is_item_list_lookup= 0; changed_elements= 0; @@ -2707,7 +2708,8 @@ bool st_select_lex::setup_ref_array(THD *thd, uint order_group_num) select_n_having_items + select_n_where_fields + order_group_num + - hidden_bit_fields) * 5; + hidden_bit_fields + + fields_in_window_functions) * 5; if (!ref_pointer_array.is_null()) { /* diff --git a/sql/sql_lex.h b/sql/sql_lex.h index d14843d0c24..965c3f29834 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -871,6 +871,14 @@ public: converted to a GROUP BY involving BIT fields. */ uint hidden_bit_fields; + /* + Number of fields used in the definition of all the windows functions. + This includes: + 1) Fields in the arguments + 2) Fields in the PARTITION BY clause + 3) Fields in the ORDER BY clause + */ + uint fields_in_window_functions; enum_parsing_place parsing_place; /* where we are parsing expression */ enum_parsing_place context_analysis_place; /* where we are in prepare */ bool with_sum_func; /* sum function indicator */ @@ -1180,10 +1188,7 @@ public: SQL_I_List win_order_list, Window_frame *win_frame); List window_funcs; - bool add_window_func(Item_window_func *win_func) - { - return window_funcs.push_back(win_func); - } + bool add_window_func(Item_window_func *win_func); bool have_window_funcs() const { return (window_funcs.elements !=0); } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 66433d11d8f..2879e394877 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -8556,6 +8556,11 @@ bool st_select_lex::add_window_def(THD *thd, win_frame); group_list= thd->lex->save_group_list; order_list= thd->lex->save_order_list; + if (parsing_place != SELECT_LIST) + { + fields_in_window_functions+= win_part_list_ptr->elements + + win_order_list_ptr->elements; + } return (win_def == NULL || window_specs.push_back(win_def)); } @@ -8577,6 +8582,11 @@ bool st_select_lex::add_window_spec(THD *thd, win_frame); group_list= thd->lex->save_group_list; order_list= thd->lex->save_order_list; + if (parsing_place != SELECT_LIST) + { + fields_in_window_functions+= win_part_list_ptr->elements + + win_order_list_ptr->elements; + } thd->lex->win_spec= win_spec; return (win_spec == NULL || window_specs.push_back(win_spec)); } diff --git a/sql/sql_window.cc b/sql/sql_window.cc index 18075d179d5..612c6e692fe 100644 --- a/sql/sql_window.cc +++ b/sql/sql_window.cc @@ -2969,6 +2969,14 @@ Window_funcs_computation::save_explain_plan(MEM_ROOT *mem_root, return xpl; } + +bool st_select_lex::add_window_func(Item_window_func *win_func) +{ + if (parsing_place != SELECT_LIST) + fields_in_window_functions+= win_func->window_func()->argument_count(); + return window_funcs.push_back(win_func); +} + ///////////////////////////////////////////////////////////////////////////// // Unneeded comments (will be removed when we develop a replacement for // the feature that was attempted here From f73db93329c1d22f9ca5696b46d50d137e6095ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vicen=C8=9Biu=20Ciorbaru?= Date: Mon, 13 Jul 2020 19:56:20 +0300 Subject: [PATCH 037/188] MDEV-23027 symlink_wsrep_sst_rsync target built when WITH_WSREP is off Only install wsrep scripts and links if WSREP_ON is actually set --- scripts/CMakeLists.txt | 59 +++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt index b139b51e296..536f586a17b 100644 --- a/scripts/CMakeLists.txt +++ b/scripts/CMakeLists.txt @@ -316,6 +316,36 @@ ELSE() SET(WSREP_SOURCE wsrep_sst_common ) + + SET (wsrep_sst_rsync_wan ${CMAKE_CURRENT_BINARY_DIR}/wsrep_sst_rsync_wan) + ADD_CUSTOM_COMMAND( + OUTPUT ${wsrep_sst_rsync_wan} + COMMAND ${CMAKE_COMMAND} ARGS -E create_symlink + wsrep_sst_rsync + wsrep_sst_rsync_wan + ) + ADD_CUSTOM_TARGET(symlink_wsrep_sst_rsync + ALL + DEPENDS ${wsrep_sst_rsync_wan} + ) + INSTALL( + FILES ${wsrep_sst_rsync_wan} + DESTINATION ${INSTALL_BINDIR} + COMPONENT Server + ) + + FOREACH(file ${WSREP_SOURCE}) + CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${file}.sh + ${CMAKE_CURRENT_BINARY_DIR}/${file} ESCAPE_QUOTES @ONLY) + IF(NOT ${file}_COMPONENT) + SET(${file}_COMPONENT Server) + ENDIF() + INSTALL(FILES + ${CMAKE_CURRENT_BINARY_DIR}/${file} + DESTINATION ${INSTALL_BINDIR} + COMPONENT ${${file}_COMPONENT} + ) + ENDFOREACH() ENDIF() IF (NOT WITHOUT_SERVER) SET(SERVER_SCRIPTS @@ -368,35 +398,6 @@ ELSE() COMPONENT ${${file}_COMPONENT} ) ENDFOREACH() - SET (wsrep_sst_rsync_wan ${CMAKE_CURRENT_BINARY_DIR}/wsrep_sst_rsync_wan) - ADD_CUSTOM_COMMAND( - OUTPUT ${wsrep_sst_rsync_wan} - COMMAND ${CMAKE_COMMAND} ARGS -E create_symlink - wsrep_sst_rsync - wsrep_sst_rsync_wan - ) - ADD_CUSTOM_TARGET(symlink_wsrep_sst_rsync - ALL - DEPENDS ${wsrep_sst_rsync_wan} - ) - INSTALL( - FILES ${wsrep_sst_rsync_wan} - DESTINATION ${INSTALL_BINDIR} - COMPONENT Server - ) - - FOREACH(file ${WSREP_SOURCE}) - CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/${file}.sh - ${CMAKE_CURRENT_BINARY_DIR}/${file} ESCAPE_QUOTES @ONLY) - IF(NOT ${file}_COMPONENT) - SET(${file}_COMPONENT Server) - ENDIF() - INSTALL(FILES - ${CMAKE_CURRENT_BINARY_DIR}/${file} - DESTINATION ${INSTALL_BINDIR} - COMPONENT ${${file}_COMPONENT} - ) - ENDFOREACH() ENDIF() # Install libgcc as mylibgcc.a From 194a720e28ed426552558b32c68577db9f29ab2e Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Fri, 10 Jul 2020 17:50:04 +0530 Subject: [PATCH 038/188] MDEV-22890 DEADLOCK of threads detected: row0sel.cc S-LOCK / btr0cur.cc S-LOCK / row0quiesce.cc X-LOCK Problem: ======= - Read operations are always allowed to hold a secondary index leaf latch and then look up the corresponding clustered index record. Flush table operation acquires secondary index latch while holding a clustered index latch. It leads to deadlock violation. Fix: ==== - Flush table operation should acquire secondary index before taking clustered index to avoid deadlock violation with select operation. --- storage/innobase/include/dict0dict.ic | 8 +++++--- storage/xtradb/include/dict0dict.ic | 8 +++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/storage/innobase/include/dict0dict.ic b/storage/innobase/include/dict0dict.ic index bd1d529f753..93a6c4a7cc1 100644 --- a/storage/innobase/include/dict0dict.ic +++ b/storage/innobase/include/dict0dict.ic @@ -1026,16 +1026,18 @@ dict_table_x_lock_indexes( /*======================*/ dict_table_t* table) /*!< in: table */ { - dict_index_t* index; - ut_ad(mutex_own(&dict_sys->mutex)); + dict_index_t* clust_index = dict_table_get_first_index(table); + /* Loop through each index of the table and lock them */ - for (index = dict_table_get_first_index(table); + for (dict_index_t* index = dict_table_get_next_index(clust_index); index != NULL; index = dict_table_get_next_index(index)) { rw_lock_x_lock(dict_index_get_lock(index)); } + + rw_lock_x_lock(dict_index_get_lock(clust_index)); } /*********************************************************************//** diff --git a/storage/xtradb/include/dict0dict.ic b/storage/xtradb/include/dict0dict.ic index 475391a3f75..c5ea95b7c08 100644 --- a/storage/xtradb/include/dict0dict.ic +++ b/storage/xtradb/include/dict0dict.ic @@ -1026,16 +1026,18 @@ dict_table_x_lock_indexes( /*======================*/ dict_table_t* table) /*!< in: table */ { - dict_index_t* index; - ut_ad(mutex_own(&dict_sys->mutex)); + dict_index_t* clust_index = dict_table_get_first_index(table); + /* Loop through each index of the table and lock them */ - for (index = dict_table_get_first_index(table); + for (dict_index_t* index = dict_table_get_next_index(clust_index); index != NULL; index = dict_table_get_next_index(index)) { rw_lock_x_lock(dict_index_get_lock(index)); } + + rw_lock_x_lock(dict_index_get_lock(clust_index)); } /*********************************************************************//** From e80183dbd595984a42e1265d7a257d8ca14b3bb8 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Tue, 14 Jul 2020 13:22:59 +0530 Subject: [PATCH 039/188] MDEV-15662 mariabackup.huge_lsn fails sporadically with "log sequence number is in the future" - Problem is that test case creates iblogfile* files. So existing ibdata pages could point to future LSN. Fix is that taking the backup of data before iblogfile* creation and apply it before exiting the test case. --- mysql-test/suite/mariabackup/huge_lsn.result | 4 ++++ mysql-test/suite/mariabackup/huge_lsn.test | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/mysql-test/suite/mariabackup/huge_lsn.result b/mysql-test/suite/mariabackup/huge_lsn.result index f2202c20968..b519fb1e961 100644 --- a/mysql-test/suite/mariabackup/huge_lsn.result +++ b/mysql-test/suite/mariabackup/huge_lsn.result @@ -17,3 +17,7 @@ SELECT * FROM t; i 1 DROP TABLE t; +# shutdown server +# remove datadir +# xtrabackup move back +# restart server diff --git a/mysql-test/suite/mariabackup/huge_lsn.test b/mysql-test/suite/mariabackup/huge_lsn.test index baf577769c0..9b89530a7f1 100644 --- a/mysql-test/suite/mariabackup/huge_lsn.test +++ b/mysql-test/suite/mariabackup/huge_lsn.test @@ -9,6 +9,10 @@ let INNODB_PAGE_SIZE=`select @@innodb_page_size`; let MYSQLD_DATADIR=`select @@datadir`; call mtr.add_suppression("InnoDB: New log files created"); +let $targetdir_old=$MYSQLTEST_VARDIR/tmp/backup_1; +--disable_result_log +exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$targetdir_old; +--enable_result_log --source include/shutdown_mysqld.inc perl; @@ -52,3 +56,7 @@ exec $XTRABACKUP --prepare --target-dir=$targetdir; SELECT * FROM t; DROP TABLE t; rmdir $targetdir; +let $targetdir= $targetdir_old; +exec $XTRABACKUP --prepare --target-dir=$targetdir; +--source include/restart_and_restore.inc +rmdir $targetdir_old; From 6b6c012f330cbbdcdee32333f16813764e5ed466 Mon Sep 17 00:00:00 2001 From: Julius Goryavsky Date: Tue, 14 Jul 2020 09:36:38 +0200 Subject: [PATCH 040/188] Merge branch '10.4-MDEV-18838' of https://github.com/codership/mariadb-server into 10.2-MDEV-18838 --- mysql-test/suite/galera/r/galera_toi_truncate.result | 6 +++--- mysql-test/suite/galera/t/galera_toi_truncate.test | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_toi_truncate.result b/mysql-test/suite/galera/r/galera_toi_truncate.result index f299eacda00..c92da869a02 100644 --- a/mysql-test/suite/galera/r/galera_toi_truncate.result +++ b/mysql-test/suite/galera/r/galera_toi_truncate.result @@ -5,12 +5,12 @@ CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; connection node_2; SET SESSION wsrep_retry_autocommit = 0; INSERT INTO t1 (f1) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5, ten AS a6, ten AS a7, ten AS a8; +connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connection node_2a; connection node_1; -TRUNCATE TABLE t1;; +TRUNCATE TABLE t1; connection node_2; ERROR 40001: Deadlock: wsrep aborted transaction -connection node_1; -connection node_2; SELECT COUNT(*) AS EXPECT_0 FROM t1; EXPECT_0 0 diff --git a/mysql-test/suite/galera/t/galera_toi_truncate.test b/mysql-test/suite/galera/t/galera_toi_truncate.test index 30e0e802816..5b23a8c3f3e 100644 --- a/mysql-test/suite/galera/t/galera_toi_truncate.test +++ b/mysql-test/suite/galera/t/galera_toi_truncate.test @@ -25,17 +25,18 @@ CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; SET SESSION wsrep_retry_autocommit = 0; --send INSERT INTO t1 (f1) SELECT 1 FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4, ten AS a5, ten AS a6, ten AS a7, ten AS a8 +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Sending data%' AND INFO LIKE 'INSERT INTO t1 (f1)%'; +--source include/wait_condition.inc + --connection node_1 ---send TRUNCATE TABLE t1; +TRUNCATE TABLE t1; --connection node_2 --error ER_LOCK_DEADLOCK --reap ---connection node_1 ---reap - ---connection node_2 SELECT COUNT(*) AS EXPECT_0 FROM t1; --connection node_1 From dc58987eb7112bd60122114abd56e6f9438f457f Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Tue, 14 Jul 2020 14:26:49 +0530 Subject: [PATCH 041/188] MDEV-22765 i_s_fts_index_cache_fill_one_index() is not protect by the lock - i_s_fts_index_cache_fill() should take shared lock of fts cache before accessing index cache to avoid reading stale data. --- storage/innobase/handler/i_s.cc | 3 +++ storage/xtradb/handler/i_s.cc | 3 +++ 2 files changed, 6 insertions(+) diff --git a/storage/innobase/handler/i_s.cc b/storage/innobase/handler/i_s.cc index 21eb9da481e..894e798ee27 100644 --- a/storage/innobase/handler/i_s.cc +++ b/storage/innobase/handler/i_s.cc @@ -3375,6 +3375,8 @@ no_fts: conv_str.f_len = sizeof word; conv_str.f_str = word; + rw_lock_s_lock(&cache->lock); + for (ulint i = 0; i < ib_vector_size(cache->indexes); i++) { fts_index_cache_t* index_cache; @@ -3385,6 +3387,7 @@ no_fts: index_cache, thd, &conv_str, tables)); } + rw_lock_s_unlock(&cache->lock); dict_table_close(user_table, FALSE, FALSE); rw_lock_s_unlock(&dict_operation_lock); diff --git a/storage/xtradb/handler/i_s.cc b/storage/xtradb/handler/i_s.cc index 8eb53502da8..8d7612ab16d 100644 --- a/storage/xtradb/handler/i_s.cc +++ b/storage/xtradb/handler/i_s.cc @@ -3367,6 +3367,8 @@ no_fts: conv_str.f_len = sizeof word; conv_str.f_str = word; + rw_lock_s_lock(&cache->lock); + for (ulint i = 0; i < ib_vector_size(cache->indexes); i++) { fts_index_cache_t* index_cache; @@ -3377,6 +3379,7 @@ no_fts: index_cache, thd, &conv_str, tables)); } + rw_lock_s_unlock(&cache->lock); dict_table_close(user_table, FALSE, FALSE); rw_lock_s_unlock(&dict_operation_lock); From e3a691689599abff90c228536b64c787123764de Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Tue, 14 Jul 2020 13:15:57 +0300 Subject: [PATCH 042/188] remove dead code: fil_create_directory_for_tablename() --- storage/innobase/fil/fil0fil.cc | 31 ------------------------------ storage/innobase/include/fil0fil.h | 7 ------- 2 files changed, 38 deletions(-) diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 90a6a49a006..f076f32e50f 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -1920,37 +1920,6 @@ fil_space_acquire_for_io(ulint id) return(space); } -/********************************************************//** -Creates the database directory for a table if it does not exist yet. */ -void -fil_create_directory_for_tablename( -/*===============================*/ - const char* name) /*!< in: name in the standard - 'databasename/tablename' format */ -{ - const char* namend; - char* path; - ulint len; - - len = strlen(fil_path_to_mysql_datadir); - namend = strchr(name, '/'); - ut_a(namend); - path = static_cast( - ut_malloc_nokey(len + ulint(namend - name) + 2)); - - memcpy(path, fil_path_to_mysql_datadir, len); - path[len] = '/'; - memcpy(path + len + 1, name, ulint(namend - name)); - path[len + ulint(namend - name) + 1] = 0; - - os_normalize_path(path); - - bool success = os_file_create_directory(path, false); - ut_a(success); - - ut_free(path); -} - /** Write a log record about an operation on a tablespace file. @param[in] type MLOG_FILE_NAME or MLOG_FILE_DELETE or MLOG_FILE_CREATE2 or MLOG_FILE_RENAME2 diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index e78c9587325..21f21d95ebc 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -1177,13 +1177,6 @@ fil_space_t* fil_space_keyrotate_next(fil_space_t* prev_space, bool remove) MY_ATTRIBUTE((warn_unused_result)); -/********************************************************//** -Creates the database directory for a table if it does not exist yet. */ -void -fil_create_directory_for_tablename( -/*===============================*/ - const char* name); /*!< in: name in the standard - 'databasename/tablename' format */ /** Replay a file rename operation if possible. @param[in] space_id tablespace identifier @param[in] first_page_no first page number in the file From 8d061996e6531b2809aefb0ed96e0662b2c2882e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 14 Jul 2020 13:21:01 +0300 Subject: [PATCH 043/188] MDEV-23161 avg_count_reset may wrongly be NULL in I_S.INNODB_METRICS This issue was originally reported by Fungo Wang, along with a fix, as MySQL Bug #98990. His suggested fix was applied as part of mysql/mysql-server@a003fc373d1adb3ccea353b5d7d83f6c4c552383 and released in MySQL 5.7.31. i_s_metrics_fill(): Add the missing call to Field::set_notnull(), and simplify some code. --- storage/innobase/handler/i_s.cc | 27 ++++++++++++++------------- storage/xtradb/handler/i_s.cc | 27 ++++++++++++++------------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/storage/innobase/handler/i_s.cc b/storage/innobase/handler/i_s.cc index 894e798ee27..145a5708423 100644 --- a/storage/innobase/handler/i_s.cc +++ b/storage/innobase/handler/i_s.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2019, MariaDB Corporation. +Copyright (c) 2014, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -2557,7 +2557,7 @@ i_s_metrics_fill( time_diff = 0; } - /* Unless MONITOR__NO_AVERAGE is marked, we will need + /* Unless MONITOR_NO_AVERAGE is set, we must to calculate the average value. If this is a monitor set owner marked by MONITOR_SET_OWNER, divide the value by another counter (number of calls) designated @@ -2565,8 +2565,9 @@ i_s_metrics_fill( Otherwise average the counter value by the time between the time that the counter is enabled and time it is disabled or time it is sampled. */ - if (!(monitor_info->monitor_type & MONITOR_NO_AVERAGE) - && (monitor_info->monitor_type & MONITOR_SET_OWNER) + if ((monitor_info->monitor_type + & (MONITOR_NO_AVERAGE | MONITOR_SET_OWNER)) + == MONITOR_SET_OWNER && monitor_info->monitor_related_id) { mon_type_t value_start = MONITOR_VALUE_SINCE_START( @@ -2582,18 +2583,18 @@ i_s_metrics_fill( fields[METRIC_AVG_VALUE_START]->set_null(); } - if (MONITOR_VALUE(monitor_info->monitor_related_id)) { - OK(fields[METRIC_AVG_VALUE_RESET]->store( - MONITOR_VALUE(count) - / MONITOR_VALUE( - monitor_info->monitor_related_id), - FALSE)); + if (mon_type_t related_value = + MONITOR_VALUE(monitor_info->monitor_related_id)) { + OK(fields[METRIC_AVG_VALUE_RESET] + ->store(MONITOR_VALUE(count) + / related_value, false)); + fields[METRIC_AVG_VALUE_RESET]->set_notnull(); } else { fields[METRIC_AVG_VALUE_RESET]->set_null(); } - } else if (!(monitor_info->monitor_type & MONITOR_NO_AVERAGE) - && !(monitor_info->monitor_type - & MONITOR_DISPLAY_CURRENT)) { + } else if (!(monitor_info->monitor_type + & (MONITOR_NO_AVERAGE + | MONITOR_DISPLAY_CURRENT))) { if (time_diff) { OK(fields[METRIC_AVG_VALUE_START]->store( (double) MONITOR_VALUE_SINCE_START( diff --git a/storage/xtradb/handler/i_s.cc b/storage/xtradb/handler/i_s.cc index 8d7612ab16d..9813e993411 100644 --- a/storage/xtradb/handler/i_s.cc +++ b/storage/xtradb/handler/i_s.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2007, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2019, MariaDB Corporation. +Copyright (c) 2014, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -2553,7 +2553,7 @@ i_s_metrics_fill( time_diff = 0; } - /* Unless MONITOR__NO_AVERAGE is marked, we will need + /* Unless MONITOR_NO_AVERAGE is set, we must to calculate the average value. If this is a monitor set owner marked by MONITOR_SET_OWNER, divide the value by another counter (number of calls) designated @@ -2561,8 +2561,9 @@ i_s_metrics_fill( Otherwise average the counter value by the time between the time that the counter is enabled and time it is disabled or time it is sampled. */ - if (!(monitor_info->monitor_type & MONITOR_NO_AVERAGE) - && (monitor_info->monitor_type & MONITOR_SET_OWNER) + if ((monitor_info->monitor_type + & (MONITOR_NO_AVERAGE | MONITOR_SET_OWNER)) + == MONITOR_SET_OWNER && monitor_info->monitor_related_id) { mon_type_t value_start = MONITOR_VALUE_SINCE_START( @@ -2578,18 +2579,18 @@ i_s_metrics_fill( fields[METRIC_AVG_VALUE_START]->set_null(); } - if (MONITOR_VALUE(monitor_info->monitor_related_id)) { - OK(fields[METRIC_AVG_VALUE_RESET]->store( - MONITOR_VALUE(count) - / MONITOR_VALUE( - monitor_info->monitor_related_id), - FALSE)); + if (mon_type_t related_value = + MONITOR_VALUE(monitor_info->monitor_related_id)) { + OK(fields[METRIC_AVG_VALUE_RESET] + ->store(MONITOR_VALUE(count) + / related_value, false)); + fields[METRIC_AVG_VALUE_RESET]->set_notnull(); } else { fields[METRIC_AVG_VALUE_RESET]->set_null(); } - } else if (!(monitor_info->monitor_type & MONITOR_NO_AVERAGE) - && !(monitor_info->monitor_type - & MONITOR_DISPLAY_CURRENT)) { + } else if (!(monitor_info->monitor_type + & (MONITOR_NO_AVERAGE + | MONITOR_DISPLAY_CURRENT))) { if (time_diff) { OK(fields[METRIC_AVG_VALUE_START]->store( (double) MONITOR_VALUE_SINCE_START( From 142f85142ad5a5ad5bfea057e13916e9b6609520 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 14 Jul 2020 13:25:18 +0300 Subject: [PATCH 044/188] Update the InnoDB version number to 5.6.49 There were no InnoDB changes between MySQL 5.6.48 and MySQL 5.6.49. --- mysql-test/suite/sys_vars/r/sysvars_innodb,32bit,xtradb.rdiff | 2 +- mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff | 2 +- mysql-test/suite/sys_vars/r/sysvars_innodb.result | 2 +- storage/innobase/include/univ.i | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit,xtradb.rdiff b/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit,xtradb.rdiff index 43a9c199864..1dc12226eda 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit,xtradb.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit,xtradb.rdiff @@ -1214,7 +1214,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_VERSION SESSION_VALUE NULL --GLOBAL_VALUE 5.6.48 +-GLOBAL_VALUE 5.6.49 +GLOBAL_VALUE 5.6.47-87.0 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff b/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff index 8a7685f7798..ee502508839 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff @@ -684,7 +684,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_VERSION SESSION_VALUE NULL --GLOBAL_VALUE 5.6.48 +-GLOBAL_VALUE 5.6.49 +GLOBAL_VALUE 5.6.47-87.0 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb.result b/mysql-test/suite/sys_vars/r/sysvars_innodb.result index 7019dda908b..d5d49a9b193 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result @@ -2401,7 +2401,7 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_VERSION SESSION_VALUE NULL -GLOBAL_VALUE 5.6.48 +GLOBAL_VALUE 5.6.49 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i index fb3d14a908e..bb355e0fef5 100644 --- a/storage/innobase/include/univ.i +++ b/storage/innobase/include/univ.i @@ -45,7 +45,7 @@ Created 1/20/1994 Heikki Tuuri #define INNODB_VERSION_MAJOR 5 #define INNODB_VERSION_MINOR 6 -#define INNODB_VERSION_BUGFIX 48 +#define INNODB_VERSION_BUGFIX 49 /* The following is the InnoDB version as shown in SELECT plugin_version FROM information_schema.plugins; From 67a03b7c947f5a0cfddbe1acc5e560fc737b0848 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 14 Jul 2020 13:32:32 +0300 Subject: [PATCH 045/188] XtraDB 5.6.48-88.0 The only InnoDB changes between Percona XtraDB Server 5.6.47-87.0 and 5.6.48-88.0 are related to InnoDB changes between MySQL 5.6.47 and MySQL 5.6.48, which we had already applied. --- mysql-test/suite/sys_vars/r/sysvars_innodb,32bit,xtradb.rdiff | 2 +- mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff | 2 +- storage/xtradb/include/univ.i | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit,xtradb.rdiff b/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit,xtradb.rdiff index 1dc12226eda..6181b49aa12 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit,xtradb.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit,xtradb.rdiff @@ -1215,7 +1215,7 @@ VARIABLE_NAME INNODB_VERSION SESSION_VALUE NULL -GLOBAL_VALUE 5.6.49 -+GLOBAL_VALUE 5.6.47-87.0 ++GLOBAL_VALUE 5.6.48-88.0 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff b/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff index ee502508839..bb59709ef4f 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb,xtradb.rdiff @@ -685,7 +685,7 @@ VARIABLE_NAME INNODB_VERSION SESSION_VALUE NULL -GLOBAL_VALUE 5.6.49 -+GLOBAL_VALUE 5.6.47-87.0 ++GLOBAL_VALUE 5.6.48-88.0 GLOBAL_VALUE_ORIGIN COMPILE-TIME DEFAULT_VALUE NULL VARIABLE_SCOPE GLOBAL diff --git a/storage/xtradb/include/univ.i b/storage/xtradb/include/univ.i index 0b7ab3e389e..c0849bf0e2d 100644 --- a/storage/xtradb/include/univ.i +++ b/storage/xtradb/include/univ.i @@ -45,10 +45,10 @@ Created 1/20/1994 Heikki Tuuri #define INNODB_VERSION_MAJOR 5 #define INNODB_VERSION_MINOR 6 -#define INNODB_VERSION_BUGFIX 47 +#define INNODB_VERSION_BUGFIX 48 #ifndef PERCONA_INNODB_VERSION -#define PERCONA_INNODB_VERSION 87.0 +#define PERCONA_INNODB_VERSION 88.0 #endif /* Enable UNIV_LOG_ARCHIVE in XtraDB */ From 07e89bf7d15ba9e9a3b21d087c20d687446b2ff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 14 Jul 2020 15:13:40 +0300 Subject: [PATCH 046/188] MDEV-23163 Merge new release of InnoDB 5.7.31 to 10.2 The only InnoDB change between MySQL 5.7.30 and MySQL 5.7.31 that is applicable to MariaDB Server was applied in commit 8d061996e6531b2809aefb0ed96e0662b2c2882e (MDEV-23161). --- storage/innobase/include/univ.i | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i index dbb1048a2e5..c7474cff4ea 100644 --- a/storage/innobase/include/univ.i +++ b/storage/innobase/include/univ.i @@ -41,7 +41,7 @@ Created 1/20/1994 Heikki Tuuri #define INNODB_VERSION_MAJOR 5 #define INNODB_VERSION_MINOR 7 -#define INNODB_VERSION_BUGFIX 30 +#define INNODB_VERSION_BUGFIX 31 /* The following is the InnoDB version as shown in SELECT plugin_version FROM information_schema.plugins; From c3afcc7c0a23bda01ffb0282612e33f584b0a687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 14 Jul 2020 16:17:25 +0300 Subject: [PATCH 047/188] MDEV-16678 followup: Adjust the test main.mdl We must prevent InnoDB purge from acquiring MDL on the tables. Since MDEV-12288, INSERT is generating work for purge. --- mysql-test/main/mdl.result | 3 +++ mysql-test/main/mdl.test | 3 +++ 2 files changed, 6 insertions(+) diff --git a/mysql-test/main/mdl.result b/mysql-test/main/mdl.result index 883f35674c0..fbf80312ac0 100644 --- a/mysql-test/main/mdl.result +++ b/mysql-test/main/mdl.result @@ -58,6 +58,8 @@ DROP TABLE t1,t3; # CREATE TABLE t1(a INT) ENGINE=InnoDB; CREATE TABLE t3(a INT) ENGINE=myisam; +connect purge_control,localhost,root,,; +START TRANSACTION WITH CONSISTENT SNAPSHOT; connect locker,localhost,root,,; connection default; FLUSH TABLES WITH READ LOCK; @@ -85,6 +87,7 @@ MDL_SHARED_WRITE Table metadata lock test t3 unlock tables; connection locker; unlock tables; +disconnect purge_control; connection default; disconnect locker; DROP TABLE t1,t3; diff --git a/mysql-test/main/mdl.test b/mysql-test/main/mdl.test index 23a862f5212..0c1b7a13a0c 100644 --- a/mysql-test/main/mdl.test +++ b/mysql-test/main/mdl.test @@ -40,6 +40,8 @@ DROP TABLE t1,t3; CREATE TABLE t1(a INT) ENGINE=InnoDB; CREATE TABLE t3(a INT) ENGINE=myisam; +connect(purge_control,localhost,root,,); +START TRANSACTION WITH CONSISTENT SNAPSHOT; connect (locker,localhost,root,,); connection default; @@ -75,6 +77,7 @@ unlock tables; connection locker; --reap unlock tables; +disconnect purge_control; connection default; disconnect locker; From d87006a1c1e775ac75b6cc21c8a243b8b4e61571 Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Tue, 14 Jul 2020 15:10:54 +0300 Subject: [PATCH 048/188] MDEV-20453 add class similar to std::string_view (non owning string reference) This version is not optimized yet. It could have bugs because I didn't check it with unit tests. Also, std::char_traits are not really supported. So, now it's not possible to create f.ex. a case insensitive string_view. fil_path_to_space_name(): renamed, moved to another file and refactored to use string_view --- include/string_view.h | 405 +++++++++++++++++++++++++++++ sql/CMakeLists.txt | 2 +- sql/string_view.cc | 30 +++ storage/innobase/fil/fil0fil.cc | 47 ---- storage/innobase/fsp/fsp0file.cc | 24 +- storage/innobase/include/fil0fil.h | 8 +- 6 files changed, 460 insertions(+), 56 deletions(-) create mode 100644 include/string_view.h create mode 100644 sql/string_view.cc diff --git a/include/string_view.h b/include/string_view.h new file mode 100644 index 00000000000..be568d96fa9 --- /dev/null +++ b/include/string_view.h @@ -0,0 +1,405 @@ +/***************************************************************************** + +Copyright (c) 2020 MariaDB Corporation. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA + +*****************************************************************************/ + +#ifndef STRING_VIEW_H +#define STRING_VIEW_H + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "my_attribute.h" + +class string_view +{ +public: + using traits_type= std::char_traits; + using value_type= char; + using pointer= char *; + using const_pointer= const char *; + using reference= char &; + using const_reference= const char &; + using const_iterator= const char *; + using iterator= const_iterator; + using const_reverse_iterator= std::reverse_iterator; + using reverse_iterator= const_reverse_iterator; + using size_type= std::size_t; + using difference_type= std::ptrdiff_t; + + static constexpr size_type npos= size_type(-1); + + constexpr string_view() noexcept : str_(nullptr), size_(0) {} + constexpr string_view(const string_view &rhs) noexcept= default; + constexpr string_view(const char *s, size_type count) : str_(s), size_(count) + { + } + string_view(const char *s) : str_(s), size_(traits_type::length(s)) {} + // In C++20 it's different. + template + constexpr string_view(It first, It last) : str_(&*first), size_(last - first) + { + } + // Add such ctor because we can't add string_view operator to std::string + string_view(const std::string &s) noexcept : str_(s.data()), size_(s.size()) + { + } + + string_view &operator=(const string_view &rhs) + { + str_= rhs.str_; + size_= rhs.size_; + return *this; + } + + constexpr const_iterator begin() const noexcept { return str_; } + constexpr const_iterator cbegin() const noexcept { return str_; } + + constexpr const_iterator end() const noexcept { return str_ + size_; } + constexpr const_iterator cend() const noexcept { return str_ + size_; } + + const_reverse_iterator rbegin() const noexcept + { + return const_reverse_iterator(end()); + } + const_reverse_iterator crbegin() const noexcept + { + return const_reverse_iterator(end()); + } + + const_reverse_iterator rend() const noexcept + { + return const_reverse_iterator(begin()); + } + const_reverse_iterator crend() const noexcept + { + return const_reverse_iterator(begin()); + } + + constexpr const_reference operator[](size_type pos) const noexcept + { + return str_[pos]; + } + + const_reference at(size_type pos) const + { + if (pos >= size()) + throw std::out_of_range("string_view::at()"); + + return str_[pos]; + } + + constexpr const_reference front() const noexcept { return operator[](0); } + constexpr const_reference back() const noexcept + { + return operator[](size() - 1); + } + + constexpr const_pointer data() const noexcept { return str_; } + + constexpr size_type size() const noexcept { return size_; } + constexpr size_type length() const noexcept { return size_; } + + constexpr size_type max_size() const noexcept + { + return std::numeric_limits::max(); + } + + constexpr __attribute__((warn_unused_result)) bool empty() const noexcept + { + return size() == 0; + } + + void remove_prefix(size_type n) + { + assert(n <= size()); + str_+= n; + size_-= n; + } + + void remove_suffix(size_type n) + { + assert(n <= size()); + size_-= n; + } + + void swap(string_view &rhs) noexcept + { + std::swap(str_, rhs.str_); + std::swap(size_, rhs.size_); + } + + size_type copy(char *dest, size_type count, size_type pos= 0) const + { + if (pos > size()) + throw std::out_of_range("string_view::copy()"); + + auto rcount= std::min(size() - pos, count); + traits_type::copy(dest, data() + pos, rcount); + return rcount; + } + + string_view substr(size_type pos= 0, size_type count= npos) const + { + if (pos > size()) + throw std::out_of_range("string_view::substr()"); + + auto rcount= std::min(size() - pos, count); + return {data() + pos, pos + rcount}; + } + + int compare(string_view v) const noexcept + { + auto rlen= std::min(size(), v.size()); + return traits_type::compare(data(), v.data(), rlen); + } + int compare(size_type pos1, size_type count1, string_view v) const + { + return substr(pos1, count1).compare(v); + } + int compare(size_type pos1, size_type count1, string_view v, size_type pos2, + size_type count2) const + { + return substr(pos1, count1).compare(v.substr(pos2, count2)); + } + int compare(const char *s) const { return compare(string_view(s)); } + int compare(size_type pos1, size_type count1, const char *s) const + { + return substr(pos1, count1).compare(string_view(s)); + } + int compare(size_type pos1, size_type count1, const char *s, + size_type count2) const + { + return substr(pos1, count1).compare(string_view(s, count2)); + } + + bool starts_with(string_view sv) const noexcept + { + return substr(0, sv.size()) == sv; + } + constexpr bool starts_with(char c) const noexcept + { + return !empty() && traits_type::eq(front(), c); + } + bool starts_with(const char *s) const { return starts_with(string_view(s)); } + + bool ends_with(string_view sv) const noexcept + { + return size() >= sv.size() && compare(size() - sv.size(), npos, sv) == 0; + } + constexpr bool ends_with(char c) const noexcept + { + return !empty() && traits_type::eq(back(), c); + } + bool ends_with(const char *s) const { return ends_with(string_view(s)); } + + size_type find(string_view v, size_type pos= 0) const noexcept + { + // TODO: optimize with std::strstr() + auto it= std::search(begin() + pos, end(), v.begin(), v.end()); + if (it == end()) + return npos; + return it - begin(); + } + size_type find(char ch, size_type pos= 0) const noexcept + { + return find(string_view(std::addressof(ch), 1)); + } + size_type find(const char *s, size_type pos, size_type count) const + { + return find(string_view(s, count), pos); + } + size_type find(const char *s, size_type pos= 0) const + { + return find(string_view(s), pos); + } + + size_type rfind(string_view v, size_type pos= npos) const noexcept + { + size_type result= npos; + for (;;) + { + auto where= find(v, pos); + if (where == npos) + break; + result= where; + pos= where + v.size(); + } + return result; + } + size_type rfind(char c, size_type pos= npos) const noexcept + { + return rfind(string_view(std::addressof(c), 1), pos); + } + size_type rfind(const char *s, size_type pos, size_type count) const + { + return rfind(string_view(s, count), pos); + } + size_type rfind(const char *s, size_type pos= npos) const + { + return rfind(string_view(s), pos); + } + + size_type find_first_of(string_view v, size_type pos= 0) const noexcept + { + // TODO: optimize with a lookup table. + auto it= std::find_if(begin() + pos, end(), + [v](char c) { return v.find(c) != npos; }); + if (it == end()) + return npos; + return it - begin(); + } + size_type find_first_of(char c, size_type pos= 0) const noexcept + { + return find_first_of(string_view(std::addressof(c), 1), pos); + } + size_type find_first_of(const char *s, size_type pos, size_type count) const + { + return find_first_of(string_view(s, count), pos); + } + size_type find_first_of(const char *s, size_type pos= 0) const + { + return find_first_of(string_view(s), pos); + } + + size_type find_last_of(string_view v, size_type pos= npos) const noexcept + { + // TODO: optimize with a lookup table. + auto it= std::find_if(reverse_iterator(begin() + pos), rend(), + [v](char c) { return v.find(c) != npos; }); + if (it == rend()) + return npos; + return it.base() - begin(); + } + size_type find_last_of(char c, size_type pos= npos) const noexcept + { + return find_last_of(string_view(std::addressof(c), 1), pos); + } + size_type find_last_of(const char *s, size_type pos, size_type count) const + { + return find_last_of(string_view(s, count), pos); + } + size_type find_last_of(const char *s, size_type pos= npos) const + { + return find_last_of(string_view(s), pos); + } + + size_type find_first_not_of(string_view v, size_type pos= 0) const noexcept + { + // TODO: optimize with a lookup table. + auto it= std::find_if(begin() + pos, end(), + [v](char c) { return v.find(c) == npos; }); + if (it == end()) + return npos; + return it - begin(); + } + size_type find_first_not_of(char c, size_type pos= 0) const noexcept + { + return find_first_not_of(string_view(std::addressof(c), 1), pos); + } + size_type find_first_not_of(const char *s, size_type pos, + size_type count) const + { + return find_first_not_of(string_view(s, count), pos); + } + size_type find_first_not_of(const char *s, size_type pos= 0) const + { + return find_first_not_of(string_view(s), pos); + } + + size_type find_last_not_of(string_view v, size_type pos= npos) const noexcept + { + // TODO: optimize with a lookup table. + auto it= std::find_if(reverse_iterator(begin() + pos), rend(), + [v](char c) { return v.find(c) == npos; }); + if (it == rend()) + return npos; + return it.base() - begin(); + } + size_type find_last_not_of(char c, size_type pos= npos) const noexcept + { + return find_last_not_of(string_view(std::addressof(c), 1), pos); + } + size_type find_last_not_of(const char *s, size_type pos, + size_type count) const + { + return find_last_not_of(string_view(s, count), pos); + } + size_type find_last_not_of(const char *s, size_type pos= npos) const + { + return find_last_not_of(string_view(s), pos); + } + + friend bool operator==(string_view lhs, string_view rhs) noexcept + { + return lhs.compare(rhs) == 0; + } + friend bool operator!=(string_view lhs, string_view rhs) noexcept + { + return lhs.compare(rhs) != 0; + } + friend bool operator<(string_view lhs, string_view rhs) noexcept + { + return lhs.compare(rhs) < 0; + } + friend bool operator<=(string_view lhs, string_view rhs) noexcept + { + return lhs.compare(rhs) <= 0; + } + friend bool operator>(string_view lhs, string_view rhs) noexcept + { + return lhs.compare(rhs) > 0; + } + friend bool operator>=(string_view lhs, string_view rhs) noexcept + { + return lhs.compare(rhs) >= 0; + } + +private: + const_pointer str_= nullptr; + size_type size_= 0; +}; + +std::basic_ostream &operator<<(std::basic_ostream &os, + string_view v); + +namespace std +{ + +template <> struct hash +{ + size_t operator()(string_view v) + { + uint32_t hash= 0; + + for (char c : v) + hash= (hash * 2166136261u) ^ static_cast(c); + + return static_cast(hash); + } +}; + +} // namespace std + +#endif diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index bab8e67fdac..bdddb05fd9a 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -143,7 +143,7 @@ SET (SQL_SOURCE opt_trace.cc ${WSREP_SOURCES} table_cache.cc encryption.cc temporary_tables.cc - proxy_protocol.cc backup.cc xa.cc + proxy_protocol.cc backup.cc xa.cc string_view.cc ${CMAKE_CURRENT_BINARY_DIR}/sql_builtin.cc ${CMAKE_CURRENT_BINARY_DIR}/sql_yacc.cc ${CMAKE_CURRENT_BINARY_DIR}/sql_yacc_ora.cc diff --git a/sql/string_view.cc b/sql/string_view.cc new file mode 100644 index 00000000000..7d4a512bb63 --- /dev/null +++ b/sql/string_view.cc @@ -0,0 +1,30 @@ +/***************************************************************************** + +Copyright (c) 2020 MariaDB Corporation. + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA + +*****************************************************************************/ + +#include "string_view.h" + +#include + +std::basic_ostream &operator<<(std::basic_ostream &os, + string_view v) +{ + // TODO standard requires a much more complicated code here. + auto size= static_cast(v.size()); + os.write(v.data(), size); + return os; +} diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index f076f32e50f..ae579ce46ba 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -3487,53 +3487,6 @@ fil_space_read_name_and_filepath( return(success); } -/** Convert a file name to a tablespace name. -@param[in] filename directory/databasename/tablename.ibd -@return database/tablename string, to be freed with ut_free() */ -char* -fil_path_to_space_name( - const char* filename) -{ - /* Strip the file name prefix and suffix, leaving - only databasename/tablename. */ - ulint filename_len = strlen(filename); - const char* end = filename + filename_len; -#ifdef HAVE_MEMRCHR - const char* tablename = 1 + static_cast( - memrchr(filename, OS_PATH_SEPARATOR, - filename_len)); - const char* dbname = 1 + static_cast( - memrchr(filename, OS_PATH_SEPARATOR, - tablename - filename - 1)); -#else /* HAVE_MEMRCHR */ - const char* tablename = filename; - const char* dbname = NULL; - - while (const char* t = static_cast( - memchr(tablename, OS_PATH_SEPARATOR, - ulint(end - tablename)))) { - dbname = tablename; - tablename = t + 1; - } -#endif /* HAVE_MEMRCHR */ - - ut_ad(dbname != NULL); - ut_ad(tablename > dbname); - ut_ad(tablename < end); - ut_ad(end - tablename > 4); - ut_ad(memcmp(end - 4, DOT_IBD, 4) == 0); - - char* name = mem_strdupl(dbname, ulint(end - dbname) - 4); - - ut_ad(name[tablename - dbname - 1] == OS_PATH_SEPARATOR); -#if OS_PATH_SEPARATOR != '/' - /* space->name uses '/', not OS_PATH_SEPARATOR. */ - name[tablename - dbname - 1] = '/'; -#endif - - return(name); -} - /** Discover the correct IBD file to open given a remote or missing filepath from the REDO log. Administrators can move a crashed database to another location on the same machine and try to recover it. diff --git a/storage/innobase/fsp/fsp0file.cc b/storage/innobase/fsp/fsp0file.cc index 653b74c73be..4d3d480f3aa 100644 --- a/storage/innobase/fsp/fsp0file.cc +++ b/storage/innobase/fsp/fsp0file.cc @@ -258,6 +258,28 @@ Datafile::same_as( #endif /* WIN32 */ } +/** Convert a file name to a tablespace name. +@param[in] filename directory/databasename/tablename.ibd +@return database/tablename string, to be freed with ut_free() */ +static char *fsp_path_to_space_name(string_view filename) +{ + auto last_slash= filename.rfind(OS_PATH_SEPARATOR); + auto prev_last_slash= + filename.substr(0, last_slash).rfind(OS_PATH_SEPARATOR); + filename.remove_prefix(prev_last_slash + 1); + ut_ad(filename.ends_with(DOT_IBD)); + filename.remove_suffix(strlen(DOT_IBD)); + + char *name= mem_strdupl(filename.data(), filename.size()); + +#if OS_PATH_SEPARATOR != '/' + /* space->name uses '/', not OS_PATH_SEPARATOR. */ + name[last_slash - prev_last_slash - 1]= '/'; +#endif + + return name; +} + /** Allocate and set the datafile or tablespace name in m_name. If a name is provided, use it; else extract a file-per-table tablespace name from m_filepath. The value of m_name @@ -271,7 +293,7 @@ Datafile::set_name(const char* name) if (name != NULL) { m_name = mem_strdup(name); } else { - m_name = fil_path_to_space_name(m_filepath); + m_name = fsp_path_to_space_name(m_filepath); } } diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index 21f21d95ebc..0d19722b616 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -34,6 +34,7 @@ Created 10/25/1995 Heikki Tuuri #include "log0recv.h" #include "dict0types.h" #include "ilist.h" +#include "string_view.h" #ifdef UNIV_LINUX # include #endif @@ -1495,13 +1496,6 @@ fil_space_read_name_and_filepath( char** name, char** filepath); -/** Convert a file name to a tablespace name. -@param[in] filename directory/databasename/tablename.ibd -@return database/tablename string, to be freed with ut_free() */ -char* -fil_path_to_space_name( - const char* filename); - /** Generate redo log for swapping two .ibd files @param[in] old_table old table @param[in] new_table new table From a7634281aa64a549d19cd20ead7e80d0267271ee Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Tue, 14 Jul 2020 21:11:15 +0300 Subject: [PATCH 049/188] fix header includes --- storage/innobase/fsp/fsp0file.cc | 1 + storage/innobase/include/fil0fil.h | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/innobase/fsp/fsp0file.cc b/storage/innobase/fsp/fsp0file.cc index 4d3d480f3aa..670beac2579 100644 --- a/storage/innobase/fsp/fsp0file.cc +++ b/storage/innobase/fsp/fsp0file.cc @@ -30,6 +30,7 @@ Created 2013-7-26 by Kevin Lewis #include "page0page.h" #include "srv0start.h" +#include "string_view.h" /** Initialize the name, size and order of this datafile @param[in] name tablespace name, will be copied @param[in] flags tablespace flags */ diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index 0d19722b616..ecba2db8e06 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -34,7 +34,6 @@ Created 10/25/1995 Heikki Tuuri #include "log0recv.h" #include "dict0types.h" #include "ilist.h" -#include "string_view.h" #ifdef UNIV_LINUX # include #endif From dfdfeecb03edaf5660f5e15337381dda6f83102c Mon Sep 17 00:00:00 2001 From: Varun Gupta Date: Tue, 14 Jul 2020 12:09:10 +0530 Subject: [PATCH 050/188] MDEV-22851: Engine independent index statistics are incorrect for large tables on Windows An oveflow was happening on windows because on Windows sizeof(ulong) is 4 bytes while it is 8 bytes on Linux. Switched avg_frequency and avg length for column statistics to ulonglong. Switched avg_frequency for index statistics to ulonglong. --- mysql-test/r/stat_tables_innodb.result | 29 ++++++++++++++++++++++++++ mysql-test/t/stat_tables_innodb.test | 21 +++++++++++++++++++ sql/sql_statistics.cc | 14 ++++++------- sql/sql_statistics.h | 18 +++++++++------- 4 files changed, 67 insertions(+), 15 deletions(-) diff --git a/mysql-test/r/stat_tables_innodb.result b/mysql-test/r/stat_tables_innodb.result index b8bed681465..5f393dde05e 100644 --- a/mysql-test/r/stat_tables_innodb.result +++ b/mysql-test/r/stat_tables_innodb.result @@ -770,4 +770,33 @@ set @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selecti set @save_optimizer_switch=@@optimizer_switch; set use_stat_tables=@save_use_stat_tables; set optimizer_switch=@save_optimizer_switch_for_stat_tables_test; +# +# MDEV-22851: Engine independent index statistics are incorrect for large tables on Windows. +# +CREATE TABLE t1 AS SELECT TABLE_CATALOG FROM INFORMATION_SCHEMA.COLUMNS; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +SET @save_use_stat_tables= @@use_stat_tables; +SET use_stat_tables= preferably; +SELECT count(*) FROM t1; +count(*) +54336 +CREATE INDEX idx ON t1(TABLE_CATALOG); +Warnings: +Warning 1071 Specified key was too long; max key length is 767 bytes +ANALYZE TABLE t1 PERSISTENT FOR COLUMNS (TABLE_CATALOG) INDEXES (idx); +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +SELECT * FROM mysql.index_stats where table_name='t1'; +db_name table_name index_name prefix_arity avg_frequency +test t1 idx 1 NULL +SELECT * FROM mysql.column_stats where table_name='t1'; +db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram +test t1 TABLE_CATALOG def def 0.0000 3.0000 54336.0000 0 NULL NULL +SET use_stat_tables= @save_use_stat_tables; +DROP TABLE t1; SET SESSION STORAGE_ENGINE=DEFAULT; diff --git a/mysql-test/t/stat_tables_innodb.test b/mysql-test/t/stat_tables_innodb.test index 04e81de8f9d..e4a11955aba 100644 --- a/mysql-test/t/stat_tables_innodb.test +++ b/mysql-test/t/stat_tables_innodb.test @@ -9,4 +9,25 @@ set optimizer_switch='extended_keys=on'; set optimizer_switch=@save_optimizer_switch_for_stat_tables_test; +--echo # +--echo # MDEV-22851: Engine independent index statistics are incorrect for large tables on Windows. +--echo # + +CREATE TABLE t1 AS SELECT TABLE_CATALOG FROM INFORMATION_SCHEMA.COLUMNS; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; +INSERT INTO t1 SELECT * FROM t1; + +SET @save_use_stat_tables= @@use_stat_tables; +SET use_stat_tables= preferably; +SELECT count(*) FROM t1; +CREATE INDEX idx ON t1(TABLE_CATALOG); +ANALYZE TABLE t1 PERSISTENT FOR COLUMNS (TABLE_CATALOG) INDEXES (idx); +SELECT * FROM mysql.index_stats where table_name='t1'; +SELECT * FROM mysql.column_stats where table_name='t1'; +SET use_stat_tables= @save_use_stat_tables; +DROP TABLE t1; + SET SESSION STORAGE_ENGINE=DEFAULT; diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc index ae02254c745..c2581fd6105 100644 --- a/sql/sql_statistics.cc +++ b/sql/sql_statistics.cc @@ -2096,8 +2096,8 @@ int alloc_statistics_for_table(THD* thd, TABLE *table) sizeof(Index_statistics) * keys); uint key_parts= table->s->ext_key_parts; - ulong *idx_avg_frequency= (ulong*) alloc_root(&table->mem_root, - sizeof(ulong) * key_parts); + ulonglong *idx_avg_frequency= (ulonglong*) alloc_root(&table->mem_root, + sizeof(ulonglong) * key_parts); uint columns= 0; for (field_ptr= table->field; *field_ptr; field_ptr++) @@ -2142,7 +2142,7 @@ int alloc_statistics_for_table(THD* thd, TABLE *table) } } - memset(idx_avg_frequency, 0, sizeof(ulong) * key_parts); + memset(idx_avg_frequency, 0, sizeof(ulonglong) * key_parts); KEY *key_info, *end; for (key_info= table->key_info, end= key_info + table->s->keys; @@ -2258,14 +2258,14 @@ static int alloc_statistics_for_table_share(THD* thd, TABLE_SHARE *table_share) } uint key_parts= table_share->ext_key_parts; - ulong *idx_avg_frequency= table_stats->idx_avg_frequency; + ulonglong *idx_avg_frequency= table_stats->idx_avg_frequency; if (!idx_avg_frequency) { - idx_avg_frequency= (ulong*) alloc_root(&stats_cb->mem_root, - sizeof(ulong) * key_parts); + idx_avg_frequency= (ulonglong*) alloc_root(&stats_cb->mem_root, + sizeof(ulonglong) * key_parts); if (idx_avg_frequency) { - memset(idx_avg_frequency, 0, sizeof(ulong) * key_parts); + memset(idx_avg_frequency, 0, sizeof(ulonglong) * key_parts); table_stats->idx_avg_frequency= idx_avg_frequency; for (key_info= table_share->key_info, end= key_info + keys; key_info < end; diff --git a/sql/sql_statistics.h b/sql/sql_statistics.h index 151618ca365..903d164ca99 100644 --- a/sql/sql_statistics.h +++ b/sql/sql_statistics.h @@ -279,7 +279,9 @@ public: uchar *min_max_record_buffers; /* Record buffers for min/max values */ Column_statistics *column_stats; /* Array of statistical data for columns */ Index_statistics *index_stats; /* Array of statistical data for indexes */ - ulong *idx_avg_frequency; /* Array of records per key for index prefixes */ + + /* Array of records per key for index prefixes */ + ulonglong *idx_avg_frequency; uchar *histograms; /* Sequence of histograms */ }; @@ -331,7 +333,7 @@ private: CHAR values are stripped of trailing spaces. Flexible values are stripped of their length prefixes. */ - ulong avg_length; + ulonglong avg_length; /* The ratio N/D multiplied by the scale factor Scale_factor_avg_frequency, @@ -339,7 +341,7 @@ private: N is the number of rows with not null value in the column, D the number of distinct values among them */ - ulong avg_frequency; + ulonglong avg_frequency; public: @@ -389,12 +391,12 @@ public: void set_avg_length (double val) { - avg_length= (ulong) (val * Scale_factor_avg_length); + avg_length= (ulonglong) (val * Scale_factor_avg_length); } void set_avg_frequency (double val) { - avg_frequency= (ulong) (val * Scale_factor_avg_frequency); + avg_frequency= (ulonglong) (val * Scale_factor_avg_frequency); } bool min_max_values_are_provided() @@ -433,11 +435,11 @@ private: in the first k components, and D is the number of distinct k-component prefixes among them */ - ulong *avg_frequency; + ulonglong *avg_frequency; public: - void init_avg_frequency(ulong *ptr) { avg_frequency= ptr; } + void init_avg_frequency(ulonglong *ptr) { avg_frequency= ptr; } bool avg_frequency_is_inited() { return avg_frequency != NULL; } @@ -448,7 +450,7 @@ public: void set_avg_frequency(uint i, double val) { - avg_frequency[i]= (ulong) (val * Scale_factor_avg_frequency); + avg_frequency[i]= (ulonglong) (val * Scale_factor_avg_frequency); } }; From 7473e1841c630d86f1873a2a7afacb53955b3f6f Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Tue, 5 May 2020 11:57:20 +1000 Subject: [PATCH 051/188] check_linker_flag: use for linker flags -Wl,-z,relro,-z,now are linker flags and should be checked as such. TODO: perform module, exe shared checks separately rather than a pure linker check. --- CMakeLists.txt | 3 ++- cmake/check_linker_flag.cmake | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 cmake/check_linker_flag.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 05e3c52f1e4..660b3ee46bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -186,6 +186,7 @@ ENDIF() OPTION(NOT_FOR_DISTRIBUTION "Allow linking with GPLv2-incompatible system libraries. Only set it you never plan to distribute the resulting binaries" OFF) INCLUDE(check_compiler_flag) +INCLUDE(check_linker_flag) OPTION(WITH_ASAN "Enable address sanitizer" OFF) IF (WITH_ASAN) @@ -234,7 +235,7 @@ IF(SECURITY_HARDENED) ENDIF() # security-enhancing flags MY_CHECK_AND_SET_COMPILER_FLAG("-pie -fPIC") - MY_CHECK_AND_SET_COMPILER_FLAG("-Wl,-z,relro,-z,now") + MY_CHECK_AND_SET_LINKER_FLAG("-Wl,-z,relro,-z,now") MY_CHECK_AND_SET_COMPILER_FLAG("-fstack-protector --param=ssp-buffer-size=4") MY_CHECK_AND_SET_COMPILER_FLAG("-D_FORTIFY_SOURCE=2" RELEASE RELWITHDEBINFO) ENDIF() diff --git a/cmake/check_linker_flag.cmake b/cmake/check_linker_flag.cmake new file mode 100644 index 00000000000..ff4b91e89f6 --- /dev/null +++ b/cmake/check_linker_flag.cmake @@ -0,0 +1,27 @@ +include(CheckCXXSourceCompiles) + +FUNCTION(MY_CHECK_AND_SET_LINKER_FLAG flag_to_set) + # Let's avoid expensive compiler tests on Windows: + IF(WIN32) + RETURN() + ENDIF() + STRING(REGEX REPLACE "[-,= +]" "_" result "HAVE_LINK_FLAG_${flag_to_set}") + SET(SAVE_CMAKE_REQUIRED_LINK_OPTIONS "${CMAKE_REQUIRED_LINK_OPTIONS}") + STRING(REGEX REPLACE "^-Wno-" "-W" flag_to_check ${flag_to_set}) + SET(CMAKE_REQUIRED_LINK_OPTIONS ${CMAKE_REQUIRED_LINK_OPTIONS} ${flag_to_check}) + CHECK_CXX_SOURCE_COMPILES("int main(void) { return 0; }" ${result}) + SET(CMAKE_REQUIRED_LINK_OPTIONS "${SAVE_CMAKE_REQUIRED_LINK_OPTIONS}") + IF (${result}) + FOREACH(linktype SHARED MODULE EXE) + IF(ARGN) + FOREACH(type ${ARGN}) + SET(CMAKE_${linktype}_LINKER_FLAGS_${type} + "${CMAKE_${linktype}_LINKER_FLAGS_${type}} ${flag_to_set}" PARENT_SCOPE) + ENDFOREACH() + ELSE() + SET(CMAKE_${linktype}_LINKER_FLAGS + "${CMAKE_${linktype}_LINKER_FLAGS} ${flag_to_set}" PARENT_SCOPE) + ENDIF() + ENDFOREACH() + ENDIF() +ENDFUNCTION() From be98036f25ac8cfb34fa5bb5066975d79f595aec Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Tue, 14 Jul 2020 11:06:27 +0400 Subject: [PATCH 052/188] Preparatory changes for MDEV-23162 Improve Protocol performance for numeric data - Renaming this virtual method store() to store_str(): store(const char *str, size_t length, CHARSET_INFO *src_cs, CHARSET_INFO *dst_cs) We'll be adding more variants of store*() soon. This change will help to avoid ambiguities during overloading. - Adding a helper method store_ident(). - Renaming store_str(const LEX_CSTRING &s...) to store_lex_cstring(), to avoid ambiguties during overloading. - Adding a helper method store() for backward compatibility, to avoid a lot of changes in the code now. But eventually we should replace store() to non-ambiguius methods store_str() or store_ident(). - Adding a helper method Protocol::needs_conversion() and reusing it in two places. --- sql/protocol.cc | 49 +++++++++++++++++++++------------------------ sql/protocol.h | 50 +++++++++++++++++++++++++++++++++++----------- sql/sql_prepare.cc | 25 +++++------------------ 3 files changed, 66 insertions(+), 58 deletions(-) diff --git a/sql/protocol.cc b/sql/protocol.cc index 83dc66fa447..07d09ecb4ee 100644 --- a/sql/protocol.cc +++ b/sql/protocol.cc @@ -43,6 +43,12 @@ bool net_send_eof(THD *thd, uint server_status, uint statement_warn_count); static bool write_eof_packet(THD *, NET *, uint, uint); #endif +CHARSET_INFO *Protocol::character_set_results() const +{ + return thd->variables.character_set_results; +} + + #ifndef EMBEDDED_LIBRARY bool Protocol::net_store_data(const uchar *from, size_t length) #else @@ -846,12 +852,13 @@ bool Protocol_text::store_field_metadata(const THD * thd, if (thd->client_capabilities & CLIENT_PROTOCOL_41) { - if (store(STRING_WITH_LEN("def"), cs, thd_charset) || - store_str(field.db_name, cs, thd_charset) || - store_str(field.table_name, cs, thd_charset) || - store_str(field.org_table_name, cs, thd_charset) || - store_str(field.col_name, cs, thd_charset) || - store_str(field.org_col_name, cs, thd_charset)) + const LEX_CSTRING def= {STRING_WITH_LEN("def")}; + if (store_ident(def) || + store_ident(field.db_name) || + store_ident(field.table_name) || + store_ident(field.org_table_name) || + store_ident(field.col_name) || + store_ident(field.org_col_name)) return true; if (thd->client_capabilities & MARIADB_CLIENT_EXTENDED_METADATA) { @@ -861,7 +868,7 @@ bool Protocol_text::store_field_metadata(const THD * thd, Don't apply character set conversion: extended metadata is a binary encoded data. */ - if (store_str(metadata.lex_cstring(), cs, &my_charset_bin)) + if (store_lex_cstring(metadata.lex_cstring(), cs, &my_charset_bin)) return true; } if (packet->realloc(packet->length() + 12)) @@ -894,8 +901,8 @@ bool Protocol_text::store_field_metadata(const THD * thd, } else { - if (store_str(field.table_name, cs, thd_charset) || - store_str(field.col_name, cs, thd_charset) || + if (store_ident(field.table_name) || + store_ident(field.col_name) || packet->realloc(packet->length() + 10)) return true; pos= (char*) packet->end(); @@ -1178,9 +1185,7 @@ bool Protocol::store_string_aux(const char *from, size_t length, CHARSET_INFO *fromcs, CHARSET_INFO *tocs) { /* 'tocs' is set 0 when client issues SET character_set_results=NULL */ - if (tocs && !my_charset_same(fromcs, tocs) && - fromcs != &my_charset_bin && - tocs != &my_charset_bin) + if (needs_conversion(fromcs, tocs)) { /* Store with conversion */ return net_store_data_cs((uchar*) from, length, fromcs, tocs); @@ -1202,8 +1207,8 @@ bool Protocol::store_warning(const char *from, size_t length) } -bool Protocol_text::store(const char *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs) +bool Protocol_text::store_str(const char *from, size_t length, + CHARSET_INFO *fromcs, CHARSET_INFO *tocs) { #ifndef DBUG_OFF DBUG_PRINT("info", ("Protocol_text::store field %u (%u): %.*b", field_pos, @@ -1216,14 +1221,6 @@ bool Protocol_text::store(const char *from, size_t length, } -bool Protocol::store(const char *from, size_t length, - CHARSET_INFO *fromcs) -{ - CHARSET_INFO *tocs= this->thd->variables.character_set_results; - return store(from, length, fromcs, tocs); -} - - bool Protocol_text::store_tiny(longlong from) { #ifndef DBUG_OFF @@ -1451,8 +1448,8 @@ void Protocol_binary::prepare_for_resend() } -bool Protocol_binary::store(const char *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs) +bool Protocol_binary::store_str(const char *from, size_t length, + CHARSET_INFO *fromcs, CHARSET_INFO *tocs) { field_pos++; return store_string_aux(from, length, fromcs, tocs); @@ -1517,8 +1514,8 @@ bool Protocol_binary::store_decimal(const my_decimal *d) #endif StringBuffer str; (void) d->to_string(&str); - return store(str.ptr(), str.length(), str.charset(), - thd->variables.character_set_results); + return store_str(str.ptr(), str.length(), str.charset(), + thd->variables.character_set_results); } bool Protocol_binary::store(float from, uint32 decimals, String *buffer) diff --git a/sql/protocol.h b/sql/protocol.h index 3d4ecb9f4f0..1b3520c4cf6 100644 --- a/sql/protocol.h +++ b/sql/protocol.h @@ -61,6 +61,14 @@ protected: MYSQL_FIELD *next_mysql_field; MEM_ROOT *alloc; #endif + bool needs_conversion(CHARSET_INFO *fromcs, + CHARSET_INFO *tocs) const + { + // 'tocs' is set 0 when client issues SET character_set_results=NULL + return tocs && !my_charset_same(fromcs, tocs) && + fromcs != &my_charset_bin && + tocs != &my_charset_bin; + } /* The following two are low-level functions that are invoked from higher-level store_xxx() funcs. The data is stored into this->packet. @@ -77,6 +85,8 @@ protected: virtual bool send_error(uint sql_errno, const char *err_msg, const char *sql_state); + CHARSET_INFO *character_set_results() const; + public: THD *thd; Protocol(THD *thd_arg) { init(thd_arg); } @@ -120,13 +130,8 @@ public: virtual bool store_long(longlong from)=0; virtual bool store_longlong(longlong from, bool unsigned_flag)=0; virtual bool store_decimal(const my_decimal *)=0; - bool store(const char *from, size_t length, CHARSET_INFO *cs); - virtual bool store(const char *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs)=0; - bool store_str(const LEX_CSTRING &s, CHARSET_INFO *fromcs, CHARSET_INFO *tocs) - { - return store(s.str, (uint) s.length, fromcs, tocs); - } + virtual bool store_str(const char *from, size_t length, + CHARSET_INFO *fromcs, CHARSET_INFO *tocs)=0; virtual bool store(float from, uint32 decimals, String *buffer)=0; virtual bool store(double from, uint32 decimals, String *buffer)=0; virtual bool store(MYSQL_TIME *time, int decimals)=0; @@ -134,6 +139,24 @@ public: virtual bool store_time(MYSQL_TIME *time, int decimals)=0; virtual bool store(Field *field)=0; + // Various useful wrappers for the virtual store*() methods. + // Backward wrapper for store_str() + bool store(const char *from, size_t length, CHARSET_INFO *cs) + { + return store_str(from, length, cs, character_set_results()); + } + bool store_lex_cstring(const LEX_CSTRING &s, + CHARSET_INFO *fromcs, + CHARSET_INFO *tocs) + { + return store_str(s.str, (uint) s.length, fromcs, tocs); + } + bool store_ident(const LEX_CSTRING &s) + { + return store_lex_cstring(s, system_charset_info, character_set_results()); + } + // End of wrappers + virtual bool send_out_parameters(List *sp_params)=0; #ifdef EMBEDDED_LIBRARY bool begin_dataset(); @@ -178,8 +201,8 @@ public: virtual bool store_long(longlong from); virtual bool store_longlong(longlong from, bool unsigned_flag); virtual bool store_decimal(const my_decimal *); - virtual bool store(const char *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs); + virtual bool store_str(const char *from, size_t length, + CHARSET_INFO *fromcs, CHARSET_INFO *tocs); virtual bool store(MYSQL_TIME *time, int decimals); virtual bool store_date(MYSQL_TIME *time); virtual bool store_time(MYSQL_TIME *time, int decimals); @@ -222,8 +245,8 @@ public: virtual bool store_long(longlong from); virtual bool store_longlong(longlong from, bool unsigned_flag); virtual bool store_decimal(const my_decimal *); - virtual bool store(const char *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs); + virtual bool store_str(const char *from, size_t length, + CHARSET_INFO *fromcs, CHARSET_INFO *tocs); virtual bool store(MYSQL_TIME *time, int decimals); virtual bool store_date(MYSQL_TIME *time); virtual bool store_time(MYSQL_TIME *time, int decimals); @@ -270,7 +293,10 @@ public: bool store_long(longlong) { return false; } bool store_longlong(longlong, bool) { return false; } bool store_decimal(const my_decimal *) { return false; } - bool store(const char *, size_t, CHARSET_INFO *, CHARSET_INFO *) { return false; } + bool store_str(const char *, size_t, CHARSET_INFO *, CHARSET_INFO *) + { + return false; + } bool store(MYSQL_TIME *, int) { return false; } bool store_date(MYSQL_TIME *) { return false; } bool store_time(MYSQL_TIME *, int) { return false; } diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 93bef049d28..a616069a0bd 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -262,9 +262,8 @@ protected: virtual bool store_long(longlong from); virtual bool store_longlong(longlong from, bool unsigned_flag); virtual bool store_decimal(const my_decimal *); - virtual bool store(const char *from, size_t length, CHARSET_INFO *cs); - virtual bool store(const char *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs); + virtual bool store_str(const char *from, size_t length, + CHARSET_INFO *fromcs, CHARSET_INFO *tocs); virtual bool store(MYSQL_TIME *time, int decimals); virtual bool store_date(MYSQL_TIME *time); virtual bool store_time(MYSQL_TIME *time, int decimals); @@ -5275,9 +5274,7 @@ Protocol_local::store_string(const char *str, size_t length, /* Store with conversion */ uint error_unused; - if (dst_cs && !my_charset_same(src_cs, dst_cs) && - src_cs != &my_charset_bin && - dst_cs != &my_charset_bin) + if (needs_conversion(src_cs, dst_cs)) { if (unlikely(convert->copy(str, length, src_cs, dst_cs, &error_unused))) return TRUE; @@ -5334,22 +5331,10 @@ bool Protocol_local::store_decimal(const my_decimal *value) } -/** Convert to cs_results and store a string. */ - -bool Protocol_local::store(const char *str, size_t length, - CHARSET_INFO *src_cs) -{ - CHARSET_INFO *dst_cs; - - dst_cs= m_connection->m_thd->variables.character_set_results; - return store_string(str, length, src_cs, dst_cs); -} - - /** Store a string. */ -bool Protocol_local::store(const char *str, size_t length, - CHARSET_INFO *src_cs, CHARSET_INFO *dst_cs) +bool Protocol_local::store_str(const char *str, size_t length, + CHARSET_INFO *src_cs, CHARSET_INFO *dst_cs) { return store_string(str, length, src_cs, dst_cs); } From eb2eaba7fdbd13c9814ab4619cc23d9f140e5485 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Tue, 14 Jul 2020 11:48:13 +0400 Subject: [PATCH 053/188] MDEV-23162 Improve Protocol performance for numeric data Avoid character set conversion for numeric data in this scenario: SET NAMES utf8; CREATE OR REPLACE TABLE t1 (a INT); INSERT INTO t1 VALUES (1); SELECT a FROM t1; --- sql/protocol.cc | 27 ++++++++++++++++++--------- sql/protocol.h | 39 ++++++++++++++++++++++++++++----------- sql/sql_prepare.cc | 20 ++++++++++++++------ 3 files changed, 60 insertions(+), 26 deletions(-) diff --git a/sql/protocol.cc b/sql/protocol.cc index 07d09ecb4ee..a97e0d0997d 100644 --- a/sql/protocol.cc +++ b/sql/protocol.cc @@ -853,7 +853,7 @@ bool Protocol_text::store_field_metadata(const THD * thd, if (thd->client_capabilities & CLIENT_PROTOCOL_41) { const LEX_CSTRING def= {STRING_WITH_LEN("def")}; - if (store_ident(def) || + if (store_ident(def, MY_REPERTOIRE_ASCII) || store_ident(field.db_name) || store_ident(field.table_name) || store_ident(field.org_table_name) || @@ -868,7 +868,8 @@ bool Protocol_text::store_field_metadata(const THD * thd, Don't apply character set conversion: extended metadata is a binary encoded data. */ - if (store_lex_cstring(metadata.lex_cstring(), cs, &my_charset_bin)) + if (store_lex_cstring(metadata.lex_cstring(), cs, + MY_REPERTOIRE_UNICODE30, &my_charset_bin)) return true; } if (packet->realloc(packet->length() + 12)) @@ -1182,10 +1183,12 @@ bool Protocol_text::store_null() */ bool Protocol::store_string_aux(const char *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs) + CHARSET_INFO *fromcs, + my_repertoire_t from_repertoire, + CHARSET_INFO *tocs) { /* 'tocs' is set 0 when client issues SET character_set_results=NULL */ - if (needs_conversion(fromcs, tocs)) + if (needs_conversion(fromcs, from_repertoire, tocs)) { /* Store with conversion */ return net_store_data_cs((uchar*) from, length, fromcs, tocs); @@ -1208,7 +1211,9 @@ bool Protocol::store_warning(const char *from, size_t length) bool Protocol_text::store_str(const char *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs) + CHARSET_INFO *fromcs, + my_repertoire_t from_repertoire, + CHARSET_INFO *tocs) { #ifndef DBUG_OFF DBUG_PRINT("info", ("Protocol_text::store field %u (%u): %.*b", field_pos, @@ -1217,7 +1222,7 @@ bool Protocol_text::store_str(const char *from, size_t length, DBUG_ASSERT(valid_handler(field_pos, PROTOCOL_SEND_STRING)); field_pos++; #endif - return store_string_aux(from, length, fromcs, tocs); + return store_string_aux(from, length, fromcs, from_repertoire, tocs); } @@ -1330,7 +1335,8 @@ bool Protocol_text::store(Field *field) dbug_tmp_restore_column_map(table->read_set, old_map); #endif - return store_string_aux(str.ptr(), str.length(), str.charset(), tocs); + return store_string_aux(str.ptr(), str.length(), str.charset(), + field->dtcollation().repertoire, tocs); } @@ -1449,10 +1455,12 @@ void Protocol_binary::prepare_for_resend() bool Protocol_binary::store_str(const char *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs) + CHARSET_INFO *fromcs, + my_repertoire_t from_repertoire, + CHARSET_INFO *tocs) { field_pos++; - return store_string_aux(from, length, fromcs, tocs); + return store_string_aux(from, length, fromcs, from_repertoire, tocs); } bool Protocol_binary::store_null() @@ -1515,6 +1523,7 @@ bool Protocol_binary::store_decimal(const my_decimal *d) StringBuffer str; (void) d->to_string(&str); return store_str(str.ptr(), str.length(), str.charset(), + MY_REPERTOIRE_ASCII, thd->variables.character_set_results); } diff --git a/sql/protocol.h b/sql/protocol.h index 1b3520c4cf6..08f416fc9bf 100644 --- a/sql/protocol.h +++ b/sql/protocol.h @@ -62,19 +62,25 @@ protected: MEM_ROOT *alloc; #endif bool needs_conversion(CHARSET_INFO *fromcs, + my_repertoire_t from_repertoire, CHARSET_INFO *tocs) const { // 'tocs' is set 0 when client issues SET character_set_results=NULL return tocs && !my_charset_same(fromcs, tocs) && fromcs != &my_charset_bin && - tocs != &my_charset_bin; + tocs != &my_charset_bin && + (from_repertoire != MY_REPERTOIRE_ASCII || + (fromcs->state & MY_CS_NONASCII) || + (tocs->state & MY_CS_NONASCII)); } /* The following two are low-level functions that are invoked from higher-level store_xxx() funcs. The data is stored into this->packet. */ bool store_string_aux(const char *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs); + CHARSET_INFO *fromcs, + my_repertoire_t from_repertoire, + CHARSET_INFO *tocs); virtual bool send_ok(uint server_status, uint statement_warn_count, ulonglong affected_rows, ulonglong last_insert_id, @@ -131,7 +137,9 @@ public: virtual bool store_longlong(longlong from, bool unsigned_flag)=0; virtual bool store_decimal(const my_decimal *)=0; virtual bool store_str(const char *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs)=0; + CHARSET_INFO *fromcs, + my_repertoire_t from_repertoire, + CHARSET_INFO *tocs)=0; virtual bool store(float from, uint32 decimals, String *buffer)=0; virtual bool store(double from, uint32 decimals, String *buffer)=0; virtual bool store(MYSQL_TIME *time, int decimals)=0; @@ -141,19 +149,23 @@ public: // Various useful wrappers for the virtual store*() methods. // Backward wrapper for store_str() - bool store(const char *from, size_t length, CHARSET_INFO *cs) + bool store(const char *from, size_t length, CHARSET_INFO *cs, + my_repertoire_t repertoire= MY_REPERTOIRE_UNICODE30) { - return store_str(from, length, cs, character_set_results()); + return store_str(from, length, cs, repertoire, character_set_results()); } bool store_lex_cstring(const LEX_CSTRING &s, CHARSET_INFO *fromcs, + my_repertoire_t from_repertoire, CHARSET_INFO *tocs) { - return store_str(s.str, (uint) s.length, fromcs, tocs); + return store_str(s.str, (uint) s.length, fromcs, from_repertoire, tocs); } - bool store_ident(const LEX_CSTRING &s) + bool store_ident(const LEX_CSTRING &s, + my_repertoire_t repertoire= MY_REPERTOIRE_UNICODE30) { - return store_lex_cstring(s, system_charset_info, character_set_results()); + return store_lex_cstring(s, system_charset_info, repertoire, + character_set_results()); } // End of wrappers @@ -202,7 +214,9 @@ public: virtual bool store_longlong(longlong from, bool unsigned_flag); virtual bool store_decimal(const my_decimal *); virtual bool store_str(const char *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs); + CHARSET_INFO *fromcs, + my_repertoire_t from_repertoire, + CHARSET_INFO *tocs); virtual bool store(MYSQL_TIME *time, int decimals); virtual bool store_date(MYSQL_TIME *time); virtual bool store_time(MYSQL_TIME *time, int decimals); @@ -246,7 +260,9 @@ public: virtual bool store_longlong(longlong from, bool unsigned_flag); virtual bool store_decimal(const my_decimal *); virtual bool store_str(const char *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs); + CHARSET_INFO *fromcs, + my_repertoire_t from_repertoire, + CHARSET_INFO *tocs); virtual bool store(MYSQL_TIME *time, int decimals); virtual bool store_date(MYSQL_TIME *time); virtual bool store_time(MYSQL_TIME *time, int decimals); @@ -293,7 +309,8 @@ public: bool store_long(longlong) { return false; } bool store_longlong(longlong, bool) { return false; } bool store_decimal(const my_decimal *) { return false; } - bool store_str(const char *, size_t, CHARSET_INFO *, CHARSET_INFO *) + bool store_str(const char *, size_t, CHARSET_INFO *, my_repertoire_t, + CHARSET_INFO *) { return false; } diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index a616069a0bd..913497b097a 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -263,7 +263,9 @@ protected: virtual bool store_longlong(longlong from, bool unsigned_flag); virtual bool store_decimal(const my_decimal *); virtual bool store_str(const char *from, size_t length, - CHARSET_INFO *fromcs, CHARSET_INFO *tocs); + CHARSET_INFO *fromcs, + my_repertoire_t from_repertoire, + CHARSET_INFO *tocs); virtual bool store(MYSQL_TIME *time, int decimals); virtual bool store_date(MYSQL_TIME *time); virtual bool store_time(MYSQL_TIME *time, int decimals); @@ -286,7 +288,9 @@ protected: virtual bool send_error(uint sql_errno, const char *err_msg, const char* sqlstate); private: bool store_string(const char *str, size_t length, - CHARSET_INFO *src_cs, CHARSET_INFO *dst_cs); + CHARSET_INFO *src_cs, + my_repertoire_t src_repertoire, + CHARSET_INFO *dst_cs); bool store_column(const void *data, size_t length); void opt_add_row_to_rset(); @@ -5269,12 +5273,14 @@ bool Protocol_local::store_column(const void *data, size_t length) bool Protocol_local::store_string(const char *str, size_t length, - CHARSET_INFO *src_cs, CHARSET_INFO *dst_cs) + CHARSET_INFO *src_cs, + my_repertoire_t src_repertoire, + CHARSET_INFO *dst_cs) { /* Store with conversion */ uint error_unused; - if (needs_conversion(src_cs, dst_cs)) + if (needs_conversion(src_cs, src_repertoire, dst_cs)) { if (unlikely(convert->copy(str, length, src_cs, dst_cs, &error_unused))) return TRUE; @@ -5334,9 +5340,11 @@ bool Protocol_local::store_decimal(const my_decimal *value) /** Store a string. */ bool Protocol_local::store_str(const char *str, size_t length, - CHARSET_INFO *src_cs, CHARSET_INFO *dst_cs) + CHARSET_INFO *src_cs, + my_repertoire_t from_repertoire, + CHARSET_INFO *dst_cs) { - return store_string(str, length, src_cs, dst_cs); + return store_string(str, length, src_cs, from_repertoire, dst_cs); } From ced3ec4c9ce0853c564532fbe90656cf1c3c2bed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 15 Jul 2020 10:26:31 +0300 Subject: [PATCH 054/188] Revert MDEV-20453 (string_view) In fsp_path_to_space_name(), we would access a byte right before the start of the string, tripping AddressSanitizer. This reverts commit d87006a1c1e775ac75b6cc21c8a243b8b4e61571 and commit a7634281aa64a549d19cd20ead7e80d0267271ee. --- include/string_view.h | 405 ----------------------------- sql/CMakeLists.txt | 2 +- sql/string_view.cc | 30 --- storage/innobase/fil/fil0fil.cc | 47 ++++ storage/innobase/fsp/fsp0file.cc | 25 +- storage/innobase/include/fil0fil.h | 7 + 6 files changed, 56 insertions(+), 460 deletions(-) delete mode 100644 include/string_view.h delete mode 100644 sql/string_view.cc diff --git a/include/string_view.h b/include/string_view.h deleted file mode 100644 index be568d96fa9..00000000000 --- a/include/string_view.h +++ /dev/null @@ -1,405 +0,0 @@ -/***************************************************************************** - -Copyright (c) 2020 MariaDB Corporation. - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA - -*****************************************************************************/ - -#ifndef STRING_VIEW_H -#define STRING_VIEW_H - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "my_attribute.h" - -class string_view -{ -public: - using traits_type= std::char_traits; - using value_type= char; - using pointer= char *; - using const_pointer= const char *; - using reference= char &; - using const_reference= const char &; - using const_iterator= const char *; - using iterator= const_iterator; - using const_reverse_iterator= std::reverse_iterator; - using reverse_iterator= const_reverse_iterator; - using size_type= std::size_t; - using difference_type= std::ptrdiff_t; - - static constexpr size_type npos= size_type(-1); - - constexpr string_view() noexcept : str_(nullptr), size_(0) {} - constexpr string_view(const string_view &rhs) noexcept= default; - constexpr string_view(const char *s, size_type count) : str_(s), size_(count) - { - } - string_view(const char *s) : str_(s), size_(traits_type::length(s)) {} - // In C++20 it's different. - template - constexpr string_view(It first, It last) : str_(&*first), size_(last - first) - { - } - // Add such ctor because we can't add string_view operator to std::string - string_view(const std::string &s) noexcept : str_(s.data()), size_(s.size()) - { - } - - string_view &operator=(const string_view &rhs) - { - str_= rhs.str_; - size_= rhs.size_; - return *this; - } - - constexpr const_iterator begin() const noexcept { return str_; } - constexpr const_iterator cbegin() const noexcept { return str_; } - - constexpr const_iterator end() const noexcept { return str_ + size_; } - constexpr const_iterator cend() const noexcept { return str_ + size_; } - - const_reverse_iterator rbegin() const noexcept - { - return const_reverse_iterator(end()); - } - const_reverse_iterator crbegin() const noexcept - { - return const_reverse_iterator(end()); - } - - const_reverse_iterator rend() const noexcept - { - return const_reverse_iterator(begin()); - } - const_reverse_iterator crend() const noexcept - { - return const_reverse_iterator(begin()); - } - - constexpr const_reference operator[](size_type pos) const noexcept - { - return str_[pos]; - } - - const_reference at(size_type pos) const - { - if (pos >= size()) - throw std::out_of_range("string_view::at()"); - - return str_[pos]; - } - - constexpr const_reference front() const noexcept { return operator[](0); } - constexpr const_reference back() const noexcept - { - return operator[](size() - 1); - } - - constexpr const_pointer data() const noexcept { return str_; } - - constexpr size_type size() const noexcept { return size_; } - constexpr size_type length() const noexcept { return size_; } - - constexpr size_type max_size() const noexcept - { - return std::numeric_limits::max(); - } - - constexpr __attribute__((warn_unused_result)) bool empty() const noexcept - { - return size() == 0; - } - - void remove_prefix(size_type n) - { - assert(n <= size()); - str_+= n; - size_-= n; - } - - void remove_suffix(size_type n) - { - assert(n <= size()); - size_-= n; - } - - void swap(string_view &rhs) noexcept - { - std::swap(str_, rhs.str_); - std::swap(size_, rhs.size_); - } - - size_type copy(char *dest, size_type count, size_type pos= 0) const - { - if (pos > size()) - throw std::out_of_range("string_view::copy()"); - - auto rcount= std::min(size() - pos, count); - traits_type::copy(dest, data() + pos, rcount); - return rcount; - } - - string_view substr(size_type pos= 0, size_type count= npos) const - { - if (pos > size()) - throw std::out_of_range("string_view::substr()"); - - auto rcount= std::min(size() - pos, count); - return {data() + pos, pos + rcount}; - } - - int compare(string_view v) const noexcept - { - auto rlen= std::min(size(), v.size()); - return traits_type::compare(data(), v.data(), rlen); - } - int compare(size_type pos1, size_type count1, string_view v) const - { - return substr(pos1, count1).compare(v); - } - int compare(size_type pos1, size_type count1, string_view v, size_type pos2, - size_type count2) const - { - return substr(pos1, count1).compare(v.substr(pos2, count2)); - } - int compare(const char *s) const { return compare(string_view(s)); } - int compare(size_type pos1, size_type count1, const char *s) const - { - return substr(pos1, count1).compare(string_view(s)); - } - int compare(size_type pos1, size_type count1, const char *s, - size_type count2) const - { - return substr(pos1, count1).compare(string_view(s, count2)); - } - - bool starts_with(string_view sv) const noexcept - { - return substr(0, sv.size()) == sv; - } - constexpr bool starts_with(char c) const noexcept - { - return !empty() && traits_type::eq(front(), c); - } - bool starts_with(const char *s) const { return starts_with(string_view(s)); } - - bool ends_with(string_view sv) const noexcept - { - return size() >= sv.size() && compare(size() - sv.size(), npos, sv) == 0; - } - constexpr bool ends_with(char c) const noexcept - { - return !empty() && traits_type::eq(back(), c); - } - bool ends_with(const char *s) const { return ends_with(string_view(s)); } - - size_type find(string_view v, size_type pos= 0) const noexcept - { - // TODO: optimize with std::strstr() - auto it= std::search(begin() + pos, end(), v.begin(), v.end()); - if (it == end()) - return npos; - return it - begin(); - } - size_type find(char ch, size_type pos= 0) const noexcept - { - return find(string_view(std::addressof(ch), 1)); - } - size_type find(const char *s, size_type pos, size_type count) const - { - return find(string_view(s, count), pos); - } - size_type find(const char *s, size_type pos= 0) const - { - return find(string_view(s), pos); - } - - size_type rfind(string_view v, size_type pos= npos) const noexcept - { - size_type result= npos; - for (;;) - { - auto where= find(v, pos); - if (where == npos) - break; - result= where; - pos= where + v.size(); - } - return result; - } - size_type rfind(char c, size_type pos= npos) const noexcept - { - return rfind(string_view(std::addressof(c), 1), pos); - } - size_type rfind(const char *s, size_type pos, size_type count) const - { - return rfind(string_view(s, count), pos); - } - size_type rfind(const char *s, size_type pos= npos) const - { - return rfind(string_view(s), pos); - } - - size_type find_first_of(string_view v, size_type pos= 0) const noexcept - { - // TODO: optimize with a lookup table. - auto it= std::find_if(begin() + pos, end(), - [v](char c) { return v.find(c) != npos; }); - if (it == end()) - return npos; - return it - begin(); - } - size_type find_first_of(char c, size_type pos= 0) const noexcept - { - return find_first_of(string_view(std::addressof(c), 1), pos); - } - size_type find_first_of(const char *s, size_type pos, size_type count) const - { - return find_first_of(string_view(s, count), pos); - } - size_type find_first_of(const char *s, size_type pos= 0) const - { - return find_first_of(string_view(s), pos); - } - - size_type find_last_of(string_view v, size_type pos= npos) const noexcept - { - // TODO: optimize with a lookup table. - auto it= std::find_if(reverse_iterator(begin() + pos), rend(), - [v](char c) { return v.find(c) != npos; }); - if (it == rend()) - return npos; - return it.base() - begin(); - } - size_type find_last_of(char c, size_type pos= npos) const noexcept - { - return find_last_of(string_view(std::addressof(c), 1), pos); - } - size_type find_last_of(const char *s, size_type pos, size_type count) const - { - return find_last_of(string_view(s, count), pos); - } - size_type find_last_of(const char *s, size_type pos= npos) const - { - return find_last_of(string_view(s), pos); - } - - size_type find_first_not_of(string_view v, size_type pos= 0) const noexcept - { - // TODO: optimize with a lookup table. - auto it= std::find_if(begin() + pos, end(), - [v](char c) { return v.find(c) == npos; }); - if (it == end()) - return npos; - return it - begin(); - } - size_type find_first_not_of(char c, size_type pos= 0) const noexcept - { - return find_first_not_of(string_view(std::addressof(c), 1), pos); - } - size_type find_first_not_of(const char *s, size_type pos, - size_type count) const - { - return find_first_not_of(string_view(s, count), pos); - } - size_type find_first_not_of(const char *s, size_type pos= 0) const - { - return find_first_not_of(string_view(s), pos); - } - - size_type find_last_not_of(string_view v, size_type pos= npos) const noexcept - { - // TODO: optimize with a lookup table. - auto it= std::find_if(reverse_iterator(begin() + pos), rend(), - [v](char c) { return v.find(c) == npos; }); - if (it == rend()) - return npos; - return it.base() - begin(); - } - size_type find_last_not_of(char c, size_type pos= npos) const noexcept - { - return find_last_not_of(string_view(std::addressof(c), 1), pos); - } - size_type find_last_not_of(const char *s, size_type pos, - size_type count) const - { - return find_last_not_of(string_view(s, count), pos); - } - size_type find_last_not_of(const char *s, size_type pos= npos) const - { - return find_last_not_of(string_view(s), pos); - } - - friend bool operator==(string_view lhs, string_view rhs) noexcept - { - return lhs.compare(rhs) == 0; - } - friend bool operator!=(string_view lhs, string_view rhs) noexcept - { - return lhs.compare(rhs) != 0; - } - friend bool operator<(string_view lhs, string_view rhs) noexcept - { - return lhs.compare(rhs) < 0; - } - friend bool operator<=(string_view lhs, string_view rhs) noexcept - { - return lhs.compare(rhs) <= 0; - } - friend bool operator>(string_view lhs, string_view rhs) noexcept - { - return lhs.compare(rhs) > 0; - } - friend bool operator>=(string_view lhs, string_view rhs) noexcept - { - return lhs.compare(rhs) >= 0; - } - -private: - const_pointer str_= nullptr; - size_type size_= 0; -}; - -std::basic_ostream &operator<<(std::basic_ostream &os, - string_view v); - -namespace std -{ - -template <> struct hash -{ - size_t operator()(string_view v) - { - uint32_t hash= 0; - - for (char c : v) - hash= (hash * 2166136261u) ^ static_cast(c); - - return static_cast(hash); - } -}; - -} // namespace std - -#endif diff --git a/sql/CMakeLists.txt b/sql/CMakeLists.txt index bdddb05fd9a..bab8e67fdac 100644 --- a/sql/CMakeLists.txt +++ b/sql/CMakeLists.txt @@ -143,7 +143,7 @@ SET (SQL_SOURCE opt_trace.cc ${WSREP_SOURCES} table_cache.cc encryption.cc temporary_tables.cc - proxy_protocol.cc backup.cc xa.cc string_view.cc + proxy_protocol.cc backup.cc xa.cc ${CMAKE_CURRENT_BINARY_DIR}/sql_builtin.cc ${CMAKE_CURRENT_BINARY_DIR}/sql_yacc.cc ${CMAKE_CURRENT_BINARY_DIR}/sql_yacc_ora.cc diff --git a/sql/string_view.cc b/sql/string_view.cc deleted file mode 100644 index 7d4a512bb63..00000000000 --- a/sql/string_view.cc +++ /dev/null @@ -1,30 +0,0 @@ -/***************************************************************************** - -Copyright (c) 2020 MariaDB Corporation. - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA - -*****************************************************************************/ - -#include "string_view.h" - -#include - -std::basic_ostream &operator<<(std::basic_ostream &os, - string_view v) -{ - // TODO standard requires a much more complicated code here. - auto size= static_cast(v.size()); - os.write(v.data(), size); - return os; -} diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index ae579ce46ba..f076f32e50f 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -3487,6 +3487,53 @@ fil_space_read_name_and_filepath( return(success); } +/** Convert a file name to a tablespace name. +@param[in] filename directory/databasename/tablename.ibd +@return database/tablename string, to be freed with ut_free() */ +char* +fil_path_to_space_name( + const char* filename) +{ + /* Strip the file name prefix and suffix, leaving + only databasename/tablename. */ + ulint filename_len = strlen(filename); + const char* end = filename + filename_len; +#ifdef HAVE_MEMRCHR + const char* tablename = 1 + static_cast( + memrchr(filename, OS_PATH_SEPARATOR, + filename_len)); + const char* dbname = 1 + static_cast( + memrchr(filename, OS_PATH_SEPARATOR, + tablename - filename - 1)); +#else /* HAVE_MEMRCHR */ + const char* tablename = filename; + const char* dbname = NULL; + + while (const char* t = static_cast( + memchr(tablename, OS_PATH_SEPARATOR, + ulint(end - tablename)))) { + dbname = tablename; + tablename = t + 1; + } +#endif /* HAVE_MEMRCHR */ + + ut_ad(dbname != NULL); + ut_ad(tablename > dbname); + ut_ad(tablename < end); + ut_ad(end - tablename > 4); + ut_ad(memcmp(end - 4, DOT_IBD, 4) == 0); + + char* name = mem_strdupl(dbname, ulint(end - dbname) - 4); + + ut_ad(name[tablename - dbname - 1] == OS_PATH_SEPARATOR); +#if OS_PATH_SEPARATOR != '/' + /* space->name uses '/', not OS_PATH_SEPARATOR. */ + name[tablename - dbname - 1] = '/'; +#endif + + return(name); +} + /** Discover the correct IBD file to open given a remote or missing filepath from the REDO log. Administrators can move a crashed database to another location on the same machine and try to recover it. diff --git a/storage/innobase/fsp/fsp0file.cc b/storage/innobase/fsp/fsp0file.cc index 670beac2579..653b74c73be 100644 --- a/storage/innobase/fsp/fsp0file.cc +++ b/storage/innobase/fsp/fsp0file.cc @@ -30,7 +30,6 @@ Created 2013-7-26 by Kevin Lewis #include "page0page.h" #include "srv0start.h" -#include "string_view.h" /** Initialize the name, size and order of this datafile @param[in] name tablespace name, will be copied @param[in] flags tablespace flags */ @@ -259,28 +258,6 @@ Datafile::same_as( #endif /* WIN32 */ } -/** Convert a file name to a tablespace name. -@param[in] filename directory/databasename/tablename.ibd -@return database/tablename string, to be freed with ut_free() */ -static char *fsp_path_to_space_name(string_view filename) -{ - auto last_slash= filename.rfind(OS_PATH_SEPARATOR); - auto prev_last_slash= - filename.substr(0, last_slash).rfind(OS_PATH_SEPARATOR); - filename.remove_prefix(prev_last_slash + 1); - ut_ad(filename.ends_with(DOT_IBD)); - filename.remove_suffix(strlen(DOT_IBD)); - - char *name= mem_strdupl(filename.data(), filename.size()); - -#if OS_PATH_SEPARATOR != '/' - /* space->name uses '/', not OS_PATH_SEPARATOR. */ - name[last_slash - prev_last_slash - 1]= '/'; -#endif - - return name; -} - /** Allocate and set the datafile or tablespace name in m_name. If a name is provided, use it; else extract a file-per-table tablespace name from m_filepath. The value of m_name @@ -294,7 +271,7 @@ Datafile::set_name(const char* name) if (name != NULL) { m_name = mem_strdup(name); } else { - m_name = fsp_path_to_space_name(m_filepath); + m_name = fil_path_to_space_name(m_filepath); } } diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index ecba2db8e06..21f21d95ebc 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -1495,6 +1495,13 @@ fil_space_read_name_and_filepath( char** name, char** filepath); +/** Convert a file name to a tablespace name. +@param[in] filename directory/databasename/tablename.ibd +@return database/tablename string, to be freed with ut_free() */ +char* +fil_path_to_space_name( + const char* filename); + /** Generate redo log for swapping two .ibd files @param[in] old_table old table @param[in] new_table new table From 9c8420fe8c97e0795af566d0e5ce2bcaac15e823 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Wed, 15 Jul 2020 09:49:48 +0200 Subject: [PATCH 055/188] Fix compile warning --- sql/winservice.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sql/winservice.c b/sql/winservice.c index c7883c9f384..371a447c51d 100644 --- a/sql/winservice.c +++ b/sql/winservice.c @@ -125,7 +125,8 @@ static void get_datadir_from_ini(const char *ini, char *service_name, char *data { if (sections[i]) { - GetPrivateProfileStringA(sections[i], "datadir", NULL, datadir, sz, ini); + GetPrivateProfileStringA(sections[i], "datadir", NULL, datadir, + (DWORD) sz, ini); if (*datadir) return; } From 20512a68d8544b37814f66d78d7f83e3646da79f Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Wed, 15 Jul 2020 11:23:19 +1000 Subject: [PATCH 056/188] MDEV-23175: my_timer_milliseconds ftime deprecated - clock_gettime replacement Linux glibc has deprecated ftime resutlting in a compile error on Fedora-32. Per manual clock_gettime is the suggested replacement. Because my_timer_milliseconds is a relative time used by largely the perfomrance schema, CLOCK_MONOTONIC_COARSE is used. This has been available since Linux-2.6.32. The low overhead is shows in the unittest: $ unittest/mysys/my_rdtsc-t 1..11 # ----- Routine --------------- # myt.cycles.routine : 5 # myt.nanoseconds.routine : 11 # myt.microseconds.routine : 13 # myt.milliseconds.routine : 18 # myt.ticks.routine : 17 # ----- Frequency ------------- # myt.cycles.frequency : 3596597014 # myt.nanoseconds.frequency : 1000000000 # myt.microseconds.frequency : 1000000 # myt.milliseconds.frequency : 1039 # myt.ticks.frequency : 103 # ----- Resolution ------------ # myt.cycles.resolution : 1 # myt.nanoseconds.resolution : 1 # myt.microseconds.resolution : 1 # myt.milliseconds.resolution : 1 # myt.ticks.resolution : 1 # ----- Overhead -------------- # myt.cycles.overhead : 118 # myt.nanoseconds.overhead : 234 # myt.microseconds.overhead : 222 # myt.milliseconds.overhead : 30 # myt.ticks.overhead : 4946 ok 1 - my_timer_init() did not crash ok 2 - The cycle timer is strictly increasing ok 3 - The cycle timer is implemented ok 4 - The nanosecond timer is increasing ok 5 - The nanosecond timer is implemented ok 6 - The microsecond timer is increasing ok 7 - The microsecond timer is implemented ok 8 - The millisecond timer is increasing ok 9 - The millisecond timer is implemented ok 10 - The tick timer is increasing ok 11 - The tick timer is implemented --- configure.cmake | 5 ++++- mysys/my_rdtsc.c | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/configure.cmake b/configure.cmake index a7e044b13d2..f3f68775b50 100644 --- a/configure.cmake +++ b/configure.cmake @@ -441,9 +441,12 @@ CHECK_INCLUDE_FILES(ia64intrin.h HAVE_IA64INTRIN_H) CHECK_FUNCTION_EXISTS(times HAVE_TIMES) CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY) CHECK_FUNCTION_EXISTS(read_real_time HAVE_READ_REAL_TIME) -# This should work on AIX. +IF(NOT HAVE_CLOCK_GETTIME) +# This should work on AIX. CHECK_FUNCTION_EXISTS(ftime HAVE_FTIME) +ENDIF() + # This is still a normal call for milliseconds. CHECK_FUNCTION_EXISTS(time HAVE_TIME) diff --git a/mysys/my_rdtsc.c b/mysys/my_rdtsc.c index dce3ca2be3b..514fd4c74ea 100644 --- a/mysys/my_rdtsc.c +++ b/mysys/my_rdtsc.c @@ -75,7 +75,7 @@ #endif #endif -#if defined(HAVE_SYS_TIMEB_H) && defined(HAVE_FTIME) +#if !defined(CLOCK_GETTIME) && defined(HAVE_SYS_TIMEB_H) && defined(HAVE_FTIME) #include /* for ftime */ #endif @@ -175,7 +175,17 @@ ulonglong my_timer_microseconds(void) ulonglong my_timer_milliseconds(void) { -#if defined(HAVE_SYS_TIMEB_H) && defined(HAVE_FTIME) +#if defined(HAVE_CLOCK_GETTIME) + struct timespec tp; +#ifdef CLOCK_MONOTONIC_COARSE + /* Linux */ + clock_gettime(CLOCK_MONOTONIC_COARSE, &tp); +#else + /* POSIX */ + clock_gettime(CLOCK_MONOTONIC, &tp); +#endif + return (ulonglong)tp.tv_sec * 1000 + (ulonglong)tp.tv_nsec / 1000000; +#elif defined(HAVE_SYS_TIMEB_H) && defined(HAVE_FTIME) /* ftime() is obsolete but maybe the platform is old */ struct timeb ft; ftime(&ft); From 38b4c078333205db1381fac66fe9ba7111a3f216 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 15 Jul 2020 19:25:24 +0300 Subject: [PATCH 057/188] MDEV-23183 Infinite loop on page_validate() on corrupted page MDEV-22721 (commit eba2d10ac53d1d2f975027ba2b2ca39d9c9b98ad) inadvertently introduced an infinite loop. page_validate(): Remove the infinite loop. --- storage/innobase/page/page0page.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/storage/innobase/page/page0page.cc b/storage/innobase/page/page0page.cc index d28d2f9a082..db33d13db1c 100644 --- a/storage/innobase/page/page0page.cc +++ b/storage/innobase/page/page0page.cc @@ -2,7 +2,7 @@ Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2017, 2019, MariaDB Corporation. +Copyright (c) 2017, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -2442,7 +2442,9 @@ func_exit2: ib::error() << "Apparent corruption in space " << page_get_space_id(page) << " page " << page_get_page_no(page) << " index " << index->name; + return FALSE; } + if (page_is_comp(page)) { if (UNIV_UNLIKELY(!page_simple_validate_new(page))) { goto func_exit2; From fee11c7727d32351c80174e4e85d700f26984c42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 15 Jul 2020 19:26:20 +0300 Subject: [PATCH 058/188] Make page validation stricter page_simple_validate_old(), page_simple_validate_new(): Require PAGE_N_DIR_SLOTS to be at least 2. --- storage/innobase/page/page0page.cc | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/storage/innobase/page/page0page.cc b/storage/innobase/page/page0page.cc index db33d13db1c..93da608b205 100644 --- a/storage/innobase/page/page0page.cc +++ b/storage/innobase/page/page0page.cc @@ -2020,10 +2020,9 @@ page_simple_validate_old( n_slots = page_dir_get_n_slots(page); - if (UNIV_UNLIKELY(n_slots > UNIV_PAGE_SIZE / 4)) { - ib::error() << "Nonsensical number " << n_slots - << " of page dir slots"; - + if (UNIV_UNLIKELY(n_slots < 2 || n_slots > UNIV_PAGE_SIZE / 4)) { + ib::error() << "Nonsensical number of page dir slots: " + << n_slots; goto func_exit; } @@ -2220,10 +2219,9 @@ page_simple_validate_new( n_slots = page_dir_get_n_slots(page); - if (UNIV_UNLIKELY(n_slots > UNIV_PAGE_SIZE / 4)) { - ib::error() << "Nonsensical number " << n_slots - << " of page dir slots"; - + if (UNIV_UNLIKELY(n_slots < 2 || n_slots > srv_page_size / 4)) { + ib::error() << "Nonsensical number of page dir slots: " + << n_slots; goto func_exit; } From 147d4b1ec0da85cd0f269b05c0e604bf7abc8753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Thu, 16 Jul 2020 06:35:15 +0300 Subject: [PATCH 059/188] MDEV-21347 innodb_log_optimize_ddl=OFF is not crash safe In commit 0f90728bc0f8bc946a61500801b23f8a316e73d5 (MDEV-16809) we introduced the configuration option innodb_log_optimize_ddl for controlling whether native index creation or table-rebuild in InnoDB should avoid writing full redo log. Fungo Wang reported that this option is causing occasional failures. The reason is that pages may be written to data files in an inconsistent state. Applying log records to such inconsistent pages may fail. The solution is to always invoke PageBulk::finish() before page latches may be released, to ensure that the page contents is in a consistent state. Something similar was implemented in MySQL 8.0.13: mysql/mysql-server@d1254b947354e0f5b7223b09c521bd85f22e1e31 buf_block_t::skip_flush_check: Remove. Suppressing consistency checks is a bad idea. PageBulk::needs_finish(): New predicate: Determine whether PageBulk::finish() must fix up the page. PageBulk::init(): Clear PAGE_DIRECTION to ensure that needs_finish() will hold. We change the field from PAGE_NO_DIRECTION to 0 and back without writing redo log. This trick avoids the need to introduce any new data member to PageBulk. PageBulk::insert(): Replace some high-level accessors to bypass debug assertions related to PAGE_HEAP_TOP that we will be violating until finish() has been executed. PageBulk::finish(): Tolerate m_rec_no==0. We must invoke this also on an empty page, to ensure that PAGE_HEAP_TOP is initialized. PageBulk::commit(): Always invoke finish(). PageBulk::release(), BtrBulk::pageSplit(), BtrBulk::storeExt(), BtrBulk::finish(): Invoke PageBulk::finish(). --- storage/innobase/btr/btr0bulk.cc | 119 ++++++++++++++++++---------- storage/innobase/buf/buf0buf.cc | 3 - storage/innobase/buf/buf0dblwr.cc | 4 - storage/innobase/buf/buf0lru.cc | 1 - storage/innobase/include/btr0bulk.h | 5 +- storage/innobase/include/buf0buf.h | 3 - 6 files changed, 80 insertions(+), 55 deletions(-) diff --git a/storage/innobase/btr/btr0bulk.cc b/storage/innobase/btr/btr0bulk.cc index 4118c271326..96ff81c9fab 100644 --- a/storage/innobase/btr/btr0bulk.cc +++ b/storage/innobase/btr/btr0bulk.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2014, 2019, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, 2019, MariaDB Corporation. +Copyright (c) 2017, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -29,6 +29,7 @@ Created 03/11/2014 Shaohua Wang #include "btr0cur.h" #include "btr0pcur.h" #include "ibuf0ibuf.h" +#include "page0page.h" #include "trx0trx.h" /** Innodb B-tree index fill factor for bulk load. */ @@ -143,7 +144,6 @@ PageBulk::init() } m_block = new_block; - m_block->skip_flush_check = true; m_page = new_page; m_page_zip = new_page_zip; m_page_no = new_page_no; @@ -163,7 +163,9 @@ PageBulk::init() UNIV_PAGE_SIZE - dict_index_zip_pad_optimal_page_size(m_index); m_heap_top = page_header_get_ptr(new_page, PAGE_HEAP_TOP); m_rec_no = page_header_get_field(new_page, PAGE_N_RECS); - + ut_ad(page_header_get_field(m_page, PAGE_DIRECTION) + == PAGE_NO_DIRECTION); + page_header_set_field(m_page, NULL, PAGE_DIRECTION, 0); ut_d(m_total_data = 0); /* See page_copy_rec_list_end_to_created_page() */ ut_d(page_header_set_field(m_page, NULL, PAGE_HEAP_TOP, @@ -188,7 +190,7 @@ PageBulk::insert( #ifdef UNIV_DEBUG /* Check whether records are in order. */ - if (!page_rec_is_infimum(m_cur_rec)) { + if (!page_rec_is_infimum_low(page_offset(m_cur_rec))) { rec_t* old_rec = m_cur_rec; rec_offs* old_offsets = rec_get_offsets( old_rec, m_index, NULL, page_rec_is_leaf(old_rec), @@ -206,18 +208,21 @@ PageBulk::insert( rec_offs_make_valid(insert_rec, m_index, offsets); /* 2. Insert the record in the linked list. */ - rec_t* next_rec = page_rec_get_next(m_cur_rec); - - page_rec_set_next(insert_rec, next_rec); - page_rec_set_next(m_cur_rec, insert_rec); - /* 3. Set the n_owned field in the inserted record to zero, and set the heap_no field. */ if (m_is_comp) { + ulint next_offs = rec_get_next_offs(m_cur_rec, TRUE); + rec_set_next_offs_new(insert_rec, next_offs); + rec_set_next_offs_new(m_cur_rec, page_offset(insert_rec)); + rec_set_n_owned_new(insert_rec, NULL, 0); rec_set_heap_no_new(insert_rec, PAGE_HEAP_NO_USER_LOW + m_rec_no); } else { + ulint next_offs = rec_get_next_offs(m_cur_rec, FALSE); + rec_set_next_offs_old(insert_rec, next_offs); + rec_set_next_offs_old(m_cur_rec, page_offset(insert_rec)); + rec_set_n_owned_old(insert_rec, 0); rec_set_heap_no_old(insert_rec, PAGE_HEAP_NO_USER_LOW + m_rec_no); @@ -245,17 +250,54 @@ PageBulk::insert( m_cur_rec = insert_rec; } +inline bool PageBulk::needs_finish() const +{ + ut_ad(page_align(m_cur_rec) == m_block->frame); + ut_ad(m_page == m_block->frame); + ulint n_heap= page_header_get_field(m_page, PAGE_N_HEAP); + if (!n_heap || !page_header_get_field(m_page, PAGE_DIRECTION)) + return true; + ulint heap_no; + if (n_heap & 0x8000) + { + n_heap&= 0x7fff; + heap_no= rec_get_heap_no_new(m_cur_rec); + if (heap_no == PAGE_HEAP_NO_INFIMUM && + page_header_get_field(m_page, PAGE_HEAP_TOP) == PAGE_NEW_SUPREMUM_END) + return false; + } + else + { + heap_no= rec_get_heap_no_old(m_cur_rec); + if (heap_no == PAGE_HEAP_NO_INFIMUM && + page_header_get_field(m_page, PAGE_HEAP_TOP) == PAGE_OLD_SUPREMUM_END) + return false; + } + return heap_no != n_heap - 1; +} + /** Mark end of insertion to the page. Scan all records to set page dirs, and set page header members. Note: we refer to page_copy_rec_list_end_to_created_page. */ void PageBulk::finish() { - ut_ad(m_rec_no > 0); + ut_ad(!dict_index_is_spatial(m_index)); + + if (!needs_finish()) { + return; + } + ut_ad(m_total_data + page_dir_calc_reserved_space(m_rec_no) <= page_get_free_space_of_empty(m_is_comp)); +#ifdef UNIV_DEBUG /* See page_copy_rec_list_end_to_created_page() */ - ut_d(page_dir_set_n_slots(m_page, NULL, srv_page_size / 2)); + if (m_rec_no) { + page_dir_set_n_slots(m_page, NULL, srv_page_size / 2); + } + mach_write_to_2(PAGE_HEADER + PAGE_HEAP_TOP + m_page, + ulint(m_heap_top - m_page)); +#endif ulint count = 0; ulint n_recs = 0; @@ -264,8 +306,7 @@ PageBulk::finish() page_dir_slot_t* slot = NULL; /* Set owner & dir. */ - do { - + while (!page_rec_is_supremum(insert_rec)) { count++; n_recs++; @@ -282,7 +323,7 @@ PageBulk::finish() } insert_rec = page_rec_get_next(insert_rec); - } while (!page_rec_is_supremum(insert_rec)); + } if (slot_index > 0 && (count + 1 + (PAGE_DIR_SLOT_MAX_N_OWNED + 1) / 2 @@ -305,9 +346,10 @@ PageBulk::finish() page_dir_slot_set_rec(slot, page_get_supremum_rec(m_page)); page_dir_slot_set_n_owned(slot, NULL, count + 1); - ut_ad(!dict_index_is_spatial(m_index)); - - if (!m_flush_observer && !m_page_zip) { + if (!m_rec_no) { + page_header_set_field(m_page, NULL, PAGE_DIRECTION, + PAGE_NO_DIRECTION); + } else if (!m_flush_observer && !m_page_zip) { mlog_write_ulint(PAGE_HEADER + PAGE_N_DIR_SLOTS + m_page, 2 + slot_index, MLOG_2BYTES, &m_mtr); mlog_write_ulint(PAGE_HEADER + PAGE_HEAP_TOP + m_page, @@ -344,26 +386,18 @@ PageBulk::finish() mach_write_to_2(PAGE_HEADER + PAGE_N_DIRECTION + m_page, 0); } - m_block->skip_flush_check = false; + ut_ad(!needs_finish()); + ut_ad(page_validate(m_page, m_index)); } /** Commit inserts done to the page @param[in] success Flag whether all inserts succeed. */ -void -PageBulk::commit( - bool success) +void PageBulk::commit(bool success) { - if (success) { - ut_ad(page_validate(m_page, m_index)); - - /* Set no free space left and no buffered changes in ibuf. */ - if (!dict_index_is_clust(m_index) && page_is_leaf(m_page)) { - ibuf_set_bitmap_for_bulk_load( - m_block, innobase_fill_factor == 100); - } - } - - m_mtr.commit(); + finish(); + if (success && !dict_index_is_clust(m_index) && page_is_leaf(m_page)) + ibuf_set_bitmap_for_bulk_load(m_block, innobase_fill_factor == 100); + m_mtr.commit(); } /** Compress a page of compressed table @@ -606,7 +640,9 @@ PageBulk::storeExt( const big_rec_t* big_rec, rec_offs* offsets) { - /* Note: not all fileds are initialized in btr_pcur. */ + finish(); + + /* Note: not all fields are initialized in btr_pcur. */ btr_pcur_t btr_pcur; btr_pcur.pos_state = BTR_PCUR_IS_POSITIONED; btr_pcur.latch_mode = BTR_MODIFY_LEAF; @@ -635,7 +671,7 @@ Note: log_free_check requires holding no lock/latch in current thread. */ void PageBulk::release() { - ut_ad(!dict_index_is_spatial(m_index)); + finish(); /* We fix the block because we will re-pin it soon. */ buf_block_buf_fix_inc(m_block, __FILE__, __LINE__); @@ -693,12 +729,11 @@ BtrBulk::pageSplit( { ut_ad(page_bulk->getPageZip() != NULL); - /* 1. Check if we have only one user record on the page. */ if (page_bulk->getRecNo() <= 1) { return(DB_TOO_BIG_RECORD); } - /* 2. create a new page. */ + /* Initialize a new page */ PageBulk new_page_bulk(m_index, m_trx->id, FIL_NULL, page_bulk->getLevel(), m_flush_observer); dberr_t err = new_page_bulk.init(); @@ -706,19 +741,18 @@ BtrBulk::pageSplit( return(err); } - /* 3. copy the upper half to new page. */ + /* Copy the upper half to the new page. */ rec_t* split_rec = page_bulk->getSplitRec(); new_page_bulk.copyIn(split_rec); page_bulk->copyOut(split_rec); - /* 4. commit the splitted page. */ + /* Commit the pages after split. */ err = pageCommit(page_bulk, &new_page_bulk, true); if (err != DB_SUCCESS) { pageAbort(&new_page_bulk); return(err); } - /* 5. commit the new page. */ err = pageCommit(&new_page_bulk, next_page_bulk, true); if (err != DB_SUCCESS) { pageAbort(&new_page_bulk); @@ -944,11 +978,9 @@ BtrBulk::insert( ut_ad(page_bulk->getLevel() == 0); ut_ad(page_bulk == m_page_bulks.at(0)); - /* Release all latched but leaf node. */ + /* Release all pages above the leaf level */ for (ulint level = 1; level <= m_root_level; level++) { - PageBulk* page_bulk = m_page_bulks.at(level); - - page_bulk->release(); + m_page_bulks.at(level)->release(); } err = page_bulk->storeExt(big_rec, offsets); @@ -1037,6 +1069,7 @@ BtrBulk::finish(dberr_t err) return(err); } root_page_bulk.copyIn(first_rec); + root_page_bulk.finish(); /* Remove last page. */ btr_page_free(m_index, last_block, &mtr); diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 8bd0fa0a885..2456b9aeb5f 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -1508,8 +1508,6 @@ buf_block_init( #ifdef BTR_CUR_HASH_ADAPT block->index = NULL; #endif /* BTR_CUR_HASH_ADAPT */ - block->skip_flush_check = false; - ut_d(block->page.in_page_hash = FALSE); ut_d(block->page.in_zip_hash = FALSE); ut_d(block->page.in_flush_list = FALSE); @@ -3822,7 +3820,6 @@ buf_block_init_low( /*===============*/ buf_block_t* block) /*!< in: block to init */ { - block->skip_flush_check = false; #ifdef BTR_CUR_HASH_ADAPT /* No adaptive hash index entries may point to a previously unused (and now freshly allocated) block. */ diff --git a/storage/innobase/buf/buf0dblwr.cc b/storage/innobase/buf/buf0dblwr.cc index 3ff44129cec..7148a6fbfd0 100644 --- a/storage/innobase/buf/buf0dblwr.cc +++ b/storage/innobase/buf/buf0dblwr.cc @@ -852,10 +852,6 @@ buf_dblwr_check_block( { ut_ad(buf_block_get_state(block) == BUF_BLOCK_FILE_PAGE); - if (block->skip_flush_check) { - return; - } - switch (fil_page_get_type(block->frame)) { case FIL_PAGE_INDEX: case FIL_PAGE_RTREE: diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc index 45dd2f2312e..ff38a744166 100644 --- a/storage/innobase/buf/buf0lru.cc +++ b/storage/innobase/buf/buf0lru.cc @@ -954,7 +954,6 @@ loop: ut_ad(buf_pool_from_block(block) == buf_pool); memset(&block->page.zip, 0, sizeof block->page.zip); - block->skip_flush_check = false; block->page.flush_observer = NULL; return(block); } diff --git a/storage/innobase/include/btr0bulk.h b/storage/innobase/include/btr0bulk.h index 4c21d929848..854414d504d 100644 --- a/storage/innobase/include/btr0bulk.h +++ b/storage/innobase/include/btr0bulk.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2014, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2019, MariaDB Corporation. +Copyright (c) 2019, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -110,6 +110,9 @@ public: dirs, and set page header members. */ void finish(); + /** @return whether finish() actually needs to do something */ + inline bool needs_finish() const; + /** Commit mtr for a page @param[in] success Flag whether all inserts succeed. */ void commit(bool success); diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index fd02279e2b0..5f390d2761d 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -1768,9 +1768,6 @@ struct buf_block_t{ # define assert_block_ahi_empty_on_init(block) /* nothing */ # define assert_block_ahi_valid(block) /* nothing */ #endif /* BTR_CUR_HASH_ADAPT */ - bool skip_flush_check; - /*!< Skip check in buf_dblwr_check_block - during bulk load, protected by lock.*/ # ifdef UNIV_DEBUG /** @name Debug fields */ /* @{ */ From 4412a461a1eb5e061dcbf3bdd935f7eef01bfeb5 Mon Sep 17 00:00:00 2001 From: Julius Goryavsky Date: Tue, 12 May 2020 13:29:17 +0200 Subject: [PATCH 060/188] MDEV-20401: Server incorrectly auto-sets lower_case_file_system value Server auto-sets lower_case_file_system value based on default datadir's behavior instead of instead of using the directory specified by the user through the configuration file or command line options. This patch fixes this problem. --- sql/mysqld.cc | 8 +++++--- sql/sys_vars.cc | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 594f50b72f2..6a5162e2f03 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -4538,8 +4538,10 @@ static int init_common_variables() get corrupted if accesses with names of different case. */ DBUG_PRINT("info", ("lower_case_table_names: %d", lower_case_table_names)); + if(mysql_real_data_home_ptr == NULL || *mysql_real_data_home_ptr == 0) + mysql_real_data_home_ptr= mysql_real_data_home; SYSVAR_AUTOSIZE(lower_case_file_system, - test_if_case_insensitive(mysql_real_data_home)); + test_if_case_insensitive(mysql_real_data_home_ptr)); if (!lower_case_table_names && lower_case_file_system == 1) { if (lower_case_table_names_used) @@ -4556,7 +4558,7 @@ static int init_common_variables() { if (global_system_variables.log_warnings) sql_print_warning("Setting lower_case_table_names=2 because file " - "system for %s is case insensitive", mysql_real_data_home); + "system for %s is case insensitive", mysql_real_data_home_ptr); SYSVAR_AUTOSIZE(lower_case_table_names, 2); } } @@ -4567,7 +4569,7 @@ static int init_common_variables() sql_print_warning("lower_case_table_names was set to 2, even though your " "the file system '%s' is case sensitive. Now setting " "lower_case_table_names to 0 to avoid future problems.", - mysql_real_data_home); + mysql_real_data_home_ptr); SYSVAR_AUTOSIZE(lower_case_table_names, 0); } else diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 7dc1d1ab6e8..52565d696b9 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -818,7 +818,7 @@ static Sys_var_ulong Sys_connect_timeout( static Sys_var_charptr Sys_datadir( "datadir", "Path to the database root directory", - READ_ONLY GLOBAL_VAR(mysql_real_data_home_ptr), + PARSED_EARLY READ_ONLY GLOBAL_VAR(mysql_real_data_home_ptr), CMD_LINE(REQUIRED_ARG, 'h'), IN_FS_CHARSET, DEFAULT(mysql_real_data_home)); #ifndef DBUG_OFF From b3cae9db112d69e8472d4f965805db7c61a6c44c Mon Sep 17 00:00:00 2001 From: Julius Goryavsky Date: Tue, 12 May 2020 13:29:17 +0200 Subject: [PATCH 061/188] MDEV-20401: Server incorrectly auto-sets lower_case_file_system value Server auto-sets lower_case_file_system value based on default datadir's behavior instead of instead of using the directory specified by the user through the configuration file or command line options. This patch fixes this problem. --- sql/mysqld.cc | 8 +++++--- sql/sys_vars.cc | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index afe969b6e8d..44f8558e474 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -4674,8 +4674,10 @@ static int init_common_variables() get corrupted if accesses with names of different case. */ DBUG_PRINT("info", ("lower_case_table_names: %d", lower_case_table_names)); + if(mysql_real_data_home_ptr == NULL || *mysql_real_data_home_ptr == 0) + mysql_real_data_home_ptr= mysql_real_data_home; SYSVAR_AUTOSIZE(lower_case_file_system, - test_if_case_insensitive(mysql_real_data_home)); + test_if_case_insensitive(mysql_real_data_home_ptr)); if (!lower_case_table_names && lower_case_file_system == 1) { if (lower_case_table_names_used) @@ -4692,7 +4694,7 @@ static int init_common_variables() { if (global_system_variables.log_warnings) sql_print_warning("Setting lower_case_table_names=2 because file " - "system for %s is case insensitive", mysql_real_data_home); + "system for %s is case insensitive", mysql_real_data_home_ptr); SYSVAR_AUTOSIZE(lower_case_table_names, 2); } } @@ -4703,7 +4705,7 @@ static int init_common_variables() sql_print_warning("lower_case_table_names was set to 2, even though your " "the file system '%s' is case sensitive. Now setting " "lower_case_table_names to 0 to avoid future problems.", - mysql_real_data_home); + mysql_real_data_home_ptr); SYSVAR_AUTOSIZE(lower_case_table_names, 0); } else diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index af261299496..fa62667b863 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -839,7 +839,7 @@ static Sys_var_ulong Sys_connect_timeout( static Sys_var_charptr Sys_datadir( "datadir", "Path to the database root directory", - READ_ONLY GLOBAL_VAR(mysql_real_data_home_ptr), + PARSED_EARLY READ_ONLY GLOBAL_VAR(mysql_real_data_home_ptr), CMD_LINE(REQUIRED_ARG, 'h'), IN_FS_CHARSET, DEFAULT(mysql_real_data_home)); #ifndef DBUG_OFF From 1ba8df4c60cd0e149c5a37ef88bee96dfd7cd95d Mon Sep 17 00:00:00 2001 From: Julius Goryavsky Date: Thu, 16 Jul 2020 16:31:27 +0200 Subject: [PATCH 062/188] MDEV-20401: revert unnecessary change --- sql/sys_vars.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 52565d696b9..7dc1d1ab6e8 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -818,7 +818,7 @@ static Sys_var_ulong Sys_connect_timeout( static Sys_var_charptr Sys_datadir( "datadir", "Path to the database root directory", - PARSED_EARLY READ_ONLY GLOBAL_VAR(mysql_real_data_home_ptr), + READ_ONLY GLOBAL_VAR(mysql_real_data_home_ptr), CMD_LINE(REQUIRED_ARG, 'h'), IN_FS_CHARSET, DEFAULT(mysql_real_data_home)); #ifndef DBUG_OFF From a1e52e7f32cee7c204078db4c4beb88250d7e1f6 Mon Sep 17 00:00:00 2001 From: Julius Goryavsky Date: Thu, 16 Jul 2020 16:40:37 +0200 Subject: [PATCH 063/188] MDEV-20401: revert unnecessary change --- sql/sys_vars.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index fa62667b863..af261299496 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -839,7 +839,7 @@ static Sys_var_ulong Sys_connect_timeout( static Sys_var_charptr Sys_datadir( "datadir", "Path to the database root directory", - PARSED_EARLY READ_ONLY GLOBAL_VAR(mysql_real_data_home_ptr), + READ_ONLY GLOBAL_VAR(mysql_real_data_home_ptr), CMD_LINE(REQUIRED_ARG, 'h'), IN_FS_CHARSET, DEFAULT(mysql_real_data_home)); #ifndef DBUG_OFF From 2cae58f8918f64c77227cfa07ab2fd24c3580f81 Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Fri, 17 Jul 2020 12:20:23 +0400 Subject: [PATCH 064/188] MDEV-18371 Server crashes in ha_innobase::cmp_ref upon UPDATE with PARTITION clause. m_file[0] not always is a good sample. --- .../main/partition_explicit_prune.result | 18 ++++++++++++++++++ mysql-test/main/partition_explicit_prune.test | 12 ++++++++++++ sql/ha_partition.cc | 7 ++++--- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/mysql-test/main/partition_explicit_prune.result b/mysql-test/main/partition_explicit_prune.result index 951b21db3e1..0c102501a9d 100644 --- a/mysql-test/main/partition_explicit_prune.result +++ b/mysql-test/main/partition_explicit_prune.result @@ -1888,4 +1888,22 @@ ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2; SELECT * FROM t1 PARTITION (p0); i UNLOCK TABLES; +DROP TABLE t1; +# +# MDEV-18371 Server crashes in ha_innobase::cmp_ref upon UPDATE with PARTITION clause. +# +CREATE TABLE t1 (a INT, b INT, KEY (a)) ENGINE=InnoDB PARTITION BY KEY(b) PARTITIONS 4; +INSERT INTO t1 VALUES (3,0),(8,2),(7,8),(3,4),(2,4),(0,7),(4,3),(3,6); +FLUSH TABLES; +UPDATE t1 PARTITION (p3,p1) SET a = 2 WHERE a = 3; +SELECT * FROM t1; +a b +2 0 +7 8 +2 4 +2 4 +0 7 +4 3 +8 2 +2 6 DROP TABLE t1, t2; diff --git a/mysql-test/main/partition_explicit_prune.test b/mysql-test/main/partition_explicit_prune.test index b8b6e480ce9..0be21396148 100644 --- a/mysql-test/main/partition_explicit_prune.test +++ b/mysql-test/main/partition_explicit_prune.test @@ -874,6 +874,18 @@ SELECT * FROM t1 PARTITION (p0); ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2; SELECT * FROM t1 PARTITION (p0); UNLOCK TABLES; +DROP TABLE t1; + +--echo # +--echo # MDEV-18371 Server crashes in ha_innobase::cmp_ref upon UPDATE with PARTITION clause. +--echo # + +CREATE TABLE t1 (a INT, b INT, KEY (a)) ENGINE=InnoDB PARTITION BY KEY(b) PARTITIONS 4; +INSERT INTO t1 VALUES (3,0),(8,2),(7,8),(3,4),(2,4),(0,7),(4,3),(3,6); +FLUSH TABLES; +UPDATE t1 PARTITION (p3,p1) SET a = 2 WHERE a = 3; +SELECT * FROM t1; + # Cleanup DROP TABLE t1, t2; diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index e19f21de006..92f527de3bc 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -5580,8 +5580,9 @@ extern "C" int cmp_key_rowid_part_id(void *ptr, uchar *ref1, uchar *ref2) { return res; } - if ((res= file->m_file[0]->cmp_ref(ref1 + PARTITION_BYTES_IN_POS + file->m_rec_length, - ref2 + PARTITION_BYTES_IN_POS + file->m_rec_length))) + if ((res= file->get_open_file_sample()->cmp_ref(ref1 + + PARTITION_BYTES_IN_POS + file->m_rec_length, + ref2 + PARTITION_BYTES_IN_POS + file->m_rec_length))) { return res; } @@ -9577,7 +9578,7 @@ uint8 ha_partition::table_cache_type() { DBUG_ENTER("ha_partition::table_cache_type"); - DBUG_RETURN(m_file[0]->table_cache_type()); + DBUG_RETURN(get_open_file_sample()->table_cache_type()); } From c400ef2586bd188858ff43f2120fdf17475f2fdb Mon Sep 17 00:00:00 2001 From: Varun Gupta Date: Fri, 17 Jul 2020 22:00:36 +0530 Subject: [PATCH 065/188] Making the stat_tables_innodb test deterministic --- mysql-test/r/stat_tables_innodb.result | 21 ++++++++------------- mysql-test/t/stat_tables_innodb.test | 15 +++++++-------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/mysql-test/r/stat_tables_innodb.result b/mysql-test/r/stat_tables_innodb.result index 5f393dde05e..fd9f337c30d 100644 --- a/mysql-test/r/stat_tables_innodb.result +++ b/mysql-test/r/stat_tables_innodb.result @@ -773,30 +773,25 @@ set optimizer_switch=@save_optimizer_switch_for_stat_tables_test; # # MDEV-22851: Engine independent index statistics are incorrect for large tables on Windows. # -CREATE TABLE t1 AS SELECT TABLE_CATALOG FROM INFORMATION_SCHEMA.COLUMNS; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; +CREATE TABLE t1(a INT) ENGINE=INNODB; +INSERT INTO t1 SELECT 1 FROM seq_1_to_60000; SET @save_use_stat_tables= @@use_stat_tables; SET use_stat_tables= preferably; SELECT count(*) FROM t1; count(*) -54336 -CREATE INDEX idx ON t1(TABLE_CATALOG); -Warnings: -Warning 1071 Specified key was too long; max key length is 767 bytes -ANALYZE TABLE t1 PERSISTENT FOR COLUMNS (TABLE_CATALOG) INDEXES (idx); +60000 +CREATE INDEX idx ON t1(a); +ANALYZE TABLE t1 PERSISTENT FOR COLUMNS (a) INDEXES (idx); Table Op Msg_type Msg_text test.t1 analyze status Engine-independent statistics collected test.t1 analyze status OK SELECT * FROM mysql.index_stats where table_name='t1'; db_name table_name index_name prefix_arity avg_frequency -test t1 idx 1 NULL +test t1 idx 1 60000.0000 SELECT * FROM mysql.column_stats where table_name='t1'; db_name table_name column_name min_value max_value nulls_ratio avg_length avg_frequency hist_size hist_type histogram -test t1 TABLE_CATALOG def def 0.0000 3.0000 54336.0000 0 NULL NULL +test t1 a 1 1 0.0000 4.0000 60000.0000 0 NULL NULL SET use_stat_tables= @save_use_stat_tables; DROP TABLE t1; +# end of 10.1 tests SET SESSION STORAGE_ENGINE=DEFAULT; diff --git a/mysql-test/t/stat_tables_innodb.test b/mysql-test/t/stat_tables_innodb.test index e4a11955aba..008ca6911e9 100644 --- a/mysql-test/t/stat_tables_innodb.test +++ b/mysql-test/t/stat_tables_innodb.test @@ -1,4 +1,5 @@ --source include/have_innodb.inc +--source include/have_sequence.inc SET SESSION STORAGE_ENGINE='InnoDB'; @@ -13,21 +14,19 @@ set optimizer_switch=@save_optimizer_switch_for_stat_tables_test; --echo # MDEV-22851: Engine independent index statistics are incorrect for large tables on Windows. --echo # -CREATE TABLE t1 AS SELECT TABLE_CATALOG FROM INFORMATION_SCHEMA.COLUMNS; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; -INSERT INTO t1 SELECT * FROM t1; +CREATE TABLE t1(a INT) ENGINE=INNODB; +INSERT INTO t1 SELECT 1 FROM seq_1_to_60000; SET @save_use_stat_tables= @@use_stat_tables; SET use_stat_tables= preferably; SELECT count(*) FROM t1; -CREATE INDEX idx ON t1(TABLE_CATALOG); -ANALYZE TABLE t1 PERSISTENT FOR COLUMNS (TABLE_CATALOG) INDEXES (idx); +CREATE INDEX idx ON t1(a); +ANALYZE TABLE t1 PERSISTENT FOR COLUMNS (a) INDEXES (idx); SELECT * FROM mysql.index_stats where table_name='t1'; SELECT * FROM mysql.column_stats where table_name='t1'; SET use_stat_tables= @save_use_stat_tables; DROP TABLE t1; +--echo # end of 10.1 tests + SET SESSION STORAGE_ENGINE=DEFAULT; From 0a7faed75ad49b99bace0882f89e08639c85679b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 20 Jul 2020 14:15:56 +0300 Subject: [PATCH 066/188] MDEV-22771 Instant extension of CHAR column is wrongly allowed commit 854c219a7f0e1878517d5a821992f650342380dd (MDEV-17301) broke a constraint: Fixed-length columns cannot be extended in InnoDB without rebuilding the table. ha_innobase::can_convert_string(): Correct the condition. We must not allow any instantaneous change to the length of CHAR columns measured in characters. For any format other than ROW_FORMAT=REDUNDANT, we can allow the length in bytes to be extended if mbminlen 9115 bytes .../suite/innodb/t/instant_alter_extend.test | 9 ++++ storage/innobase/handler/ha_innodb.cc | 50 ++++++++---------- 4 files changed, 50 insertions(+), 40 deletions(-) diff --git a/mysql-test/suite/innodb/r/instant_alter_extend,utf8.rdiff b/mysql-test/suite/innodb/r/instant_alter_extend,utf8.rdiff index 596dfe43ab8..08f9afa696a 100644 --- a/mysql-test/suite/innodb/r/instant_alter_extend,utf8.rdiff +++ b/mysql-test/suite/innodb/r/instant_alter_extend,utf8.rdiff @@ -1,29 +1,38 @@ --- instant_alter_convert.result +++ instant_alter_convert,utf8.result -@@ -37,7 +37,7 @@ - test.t check status OK +@@ -38,7 +38,7 @@ + best.t check status OK call check_table('t'); name mtype prtype len -a 2 800FE 200 +a 13 2100FE 600 # CHAR enlargement - alter table t modify a char(220), algorithm=instant; - select count(a) from t where a = @bigval; -@@ -51,7 +51,7 @@ - test.t check status OK + alter table t modify a char(220); + affected rows: 2 +@@ -54,7 +54,7 @@ + best.t check status OK call check_table('t'); name mtype prtype len -a 2 800FE 220 +a 13 2100FE 660 + ALTER TABLE t CHANGE COLUMN a a CHAR(230) BINARY; + affected rows: 2 + info: Records: 2 Duplicates: 0 Warnings: 0 +@@ -69,7 +69,7 @@ + best.t check status OK + call check_table('t'); + name mtype prtype len +-a 13 2F00FE 230 ++a 13 5300FE 690 # Convert from VARCHAR to a bigger CHAR - alter table t modify a varchar(200), algorithm=instant; - ERROR 0A000: ALGORITHM=INSTANT is not supported. Reason: Cannot change column type. Try ALGORITHM=COPY -@@ -72,7 +72,7 @@ - test.t check status OK + alter table t modify a varchar(200); + affected rows: 2 +@@ -92,7 +92,7 @@ + best.t check status OK call check_table('t'); name mtype prtype len -a 2 800FE 255 +a 13 2100FE 765 # BINARY/VARBINARY test create or replace table t (a varbinary(300)); - alter table t modify a binary(255), algorithm=instant; + insert into t values(NULL); diff --git a/mysql-test/suite/innodb/r/instant_alter_extend.result b/mysql-test/suite/innodb/r/instant_alter_extend.result index fb03ef9a18299127f66988953cf2ab35fd9b148d..33a5f57c7b64609b71ec4960780c7a545e240e38 100644 GIT binary patch delta 148 zcmaFkJllOkI-7x`Pl#)fLWrZ2kE=q7g0qLCpS!Dqv%gQMub)C95CTPlG>nW5G!>jY z{TzcLC-;jxsGw?cba8>{NK)|h3sG?M3FJjI@@M3j#g;^BY6a% diff --git a/mysql-test/suite/innodb/t/instant_alter_extend.test b/mysql-test/suite/innodb/t/instant_alter_extend.test index 4320d9bae05..7258ba6d238 100644 --- a/mysql-test/suite/innodb/t/instant_alter_extend.test +++ b/mysql-test/suite/innodb/t/instant_alter_extend.test @@ -64,6 +64,15 @@ select a, length(a) from t where a = 'z'; check table t extended; call check_table('t'); +--enable_info +ALTER TABLE t CHANGE COLUMN a a CHAR(230) BINARY; +ALTER TABLE t ADD COLUMN b INT FIRST; +ALTER TABLE t DROP b; +--disable_info + +check table t extended; +call check_table('t'); + --echo # Convert from VARCHAR to a bigger CHAR --enable_info alter table t modify a varchar(200); diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index f85ee3f26fb..6d100576c20 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -20986,43 +20986,35 @@ is_part_of_a_primary_key(const Field* field) && field->part_of_key.is_set(s->primary_key); } -bool -ha_innobase::can_convert_string(const Field_string* field, - const Column_definition& new_type) const +bool ha_innobase::can_convert_string(const Field_string *field, + const Column_definition &new_type) const { - DBUG_ASSERT(!field->compression_method()); - if (new_type.type_handler() != field->type_handler()) { - return false; - } + DBUG_ASSERT(!field->compression_method()); + if (new_type.type_handler() != field->type_handler()) + return false; - if (new_type.char_length < field->char_length()) { - return false; - } + if (new_type.char_length != field->char_length()) + return false; - if (new_type.charset != field->charset()) { - if (new_type.length != field->max_display_length() - && !m_prebuilt->table->not_redundant()) { - return IS_EQUAL_NO; - } + const Charset field_cs(field->charset()); - Charset field_cs(field->charset()); - if (!field_cs.encoding_allows_reinterpret_as( - new_type.charset)) { - return false; - } + if (new_type.length != field->max_display_length() && + (!m_prebuilt->table->not_redundant() || + field_cs.mbminlen() == field_cs.mbmaxlen())) + return false; - if (!field_cs.eq_collation_specific_names(new_type.charset)) { - return !is_part_of_a_primary_key(field); - } + if (new_type.charset != field->charset()) + { + if (!field_cs.encoding_allows_reinterpret_as(new_type.charset)) + return false; - return true; - } + if (!field_cs.eq_collation_specific_names(new_type.charset)) + return !is_part_of_a_primary_key(field); - if (new_type.length != field->max_display_length()) { - return false; - } + return true; + } - return true; + return true; } static bool From 14543afd59d7d42a639b6933c404f971c2cc76a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Thu, 16 Jul 2020 12:33:20 +0300 Subject: [PATCH 067/188] Cleanup: Remove unused AbstractCallback::m_free_limit --- storage/innobase/row/row0import.cc | 9 --------- storage/xtradb/row/row0import.cc | 9 --------- 2 files changed, 18 deletions(-) diff --git a/storage/innobase/row/row0import.cc b/storage/innobase/row/row0import.cc index f5e882f96fe..2121b00d009 100644 --- a/storage/innobase/row/row0import.cc +++ b/storage/innobase/row/row0import.cc @@ -561,14 +561,6 @@ protected: /** Space id of the file being iterated over. */ ulint m_space; - /** Minimum page number for which the free list has not been - initialized: the pages >= this limit are, by definition, free; - note that in a single-table tablespace where size < 64 pages, - this number is 64, i.e., we have initialized the space about - the first extent, but have not physically allocted those pages - to the file. @see FSP_LIMIT. */ - ulint m_free_limit; - /** Current size of the space in pages */ ulint m_size; @@ -647,7 +639,6 @@ AbstractCallback::init( ut_a(m_space == ULINT_UNDEFINED); m_size = mach_read_from_4(page + FSP_SIZE); - m_free_limit = mach_read_from_4(page + FSP_FREE_LIMIT); m_space = mach_read_from_4(page + FSP_HEADER_OFFSET + FSP_SPACE_ID); return set_current_xdes(0, page); diff --git a/storage/xtradb/row/row0import.cc b/storage/xtradb/row/row0import.cc index f5e882f96fe..2121b00d009 100644 --- a/storage/xtradb/row/row0import.cc +++ b/storage/xtradb/row/row0import.cc @@ -561,14 +561,6 @@ protected: /** Space id of the file being iterated over. */ ulint m_space; - /** Minimum page number for which the free list has not been - initialized: the pages >= this limit are, by definition, free; - note that in a single-table tablespace where size < 64 pages, - this number is 64, i.e., we have initialized the space about - the first extent, but have not physically allocted those pages - to the file. @see FSP_LIMIT. */ - ulint m_free_limit; - /** Current size of the space in pages */ ulint m_size; @@ -647,7 +639,6 @@ AbstractCallback::init( ut_a(m_space == ULINT_UNDEFINED); m_size = mach_read_from_4(page + FSP_SIZE); - m_free_limit = mach_read_from_4(page + FSP_FREE_LIMIT); m_space = mach_read_from_4(page + FSP_HEADER_OFFSET + FSP_SPACE_ID); return set_current_xdes(0, page); From 98e2c17e9e20898bc8c1e58c57e0666502ec447e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Thu, 16 Jul 2020 16:31:23 +0300 Subject: [PATCH 068/188] Cleanup: Remove fil_check_adress_in_tablespace() --- storage/innobase/buf/buf0dblwr.cc | 14 ++++++++++---- storage/innobase/fil/fil0fil.cc | 21 +-------------------- storage/innobase/include/fil0fil.h | 12 +----------- storage/xtradb/buf/buf0dblwr.cc | 14 ++++++++++---- storage/xtradb/fil/fil0fil.cc | 21 +-------------------- storage/xtradb/include/fil0fil.h | 12 +----------- 6 files changed, 24 insertions(+), 70 deletions(-) diff --git a/storage/innobase/buf/buf0dblwr.cc b/storage/innobase/buf/buf0dblwr.cc index 32b4399b41d..8afed48b8c1 100644 --- a/storage/innobase/buf/buf0dblwr.cc +++ b/storage/innobase/buf/buf0dblwr.cc @@ -554,12 +554,18 @@ buf_dblwr_process() continue; } - if (!fil_check_adress_in_tablespace(space_id, page_no)) { + if (!space()->size) { + fil_space_get_size(space_id); + } + + if (UNIV_UNLIKELY(space()->size <= page_no)) { ib_logf(IB_LOG_LEVEL_WARN, - "A copy of page " ULINTPF ":" ULINTPF + "A copy of page " ULINTPF " in the doublewrite buffer slot " ULINTPF - " is not within space bounds", - space_id, page_no, page_no_dblwr); + " is beyond the end of the tablespace " + " %s (" ULINTPF " pages)", + page_no, page_no_dblwr, + space()->name, space()->size); continue; } diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 7234a6c4102..ac48db75624 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2019, MariaDB Corporation. +Copyright (c) 2014, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -1775,25 +1775,6 @@ fil_space_get_zip_size( return(flags); } -/*******************************************************************//** -Checks if the pair space, page_no refers to an existing page in a tablespace -file space. The tablespace must be cached in the memory cache. -@return TRUE if the address is meaningful */ -UNIV_INTERN -ibool -fil_check_adress_in_tablespace( -/*===========================*/ - ulint id, /*!< in: space id */ - ulint page_no)/*!< in: page number */ -{ - if (fil_space_get_size(id) > page_no) { - - return(TRUE); - } - - return(FALSE); -} - /****************************************************************//** Initializes the tablespace memory cache. */ UNIV_INTERN diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index 4bd394ff94d..448532e249b 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2019, MariaDB Corporation. +Copyright (c) 2013, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -568,16 +568,6 @@ ulint fil_space_get_zip_size( /*===================*/ ulint id); /*!< in: space id */ -/*******************************************************************//** -Checks if the pair space, page_no refers to an existing page in a tablespace -file space. The tablespace must be cached in the memory cache. -@return TRUE if the address is meaningful */ -UNIV_INTERN -ibool -fil_check_adress_in_tablespace( -/*===========================*/ - ulint id, /*!< in: space id */ - ulint page_no);/*!< in: page number */ /****************************************************************//** Initializes the tablespace memory cache. */ UNIV_INTERN diff --git a/storage/xtradb/buf/buf0dblwr.cc b/storage/xtradb/buf/buf0dblwr.cc index 5df40b5f4e8..776e5ab06a2 100644 --- a/storage/xtradb/buf/buf0dblwr.cc +++ b/storage/xtradb/buf/buf0dblwr.cc @@ -554,12 +554,18 @@ buf_dblwr_process() continue; } - if (!fil_check_adress_in_tablespace(space_id, page_no)) { + if (!space()->size) { + fil_space_get_size(space_id); + } + + if (UNIV_UNLIKELY(space()->size <= page_no)) { ib_logf(IB_LOG_LEVEL_WARN, - "A copy of page " ULINTPF ":" ULINTPF + "A copy of page " ULINTPF " in the doublewrite buffer slot " ULINTPF - " is not within space bounds", - space_id, page_no, page_no_dblwr); + " is beyond the end of the tablespace " + " %s (" ULINTPF " pages)", + page_no, page_no_dblwr, + space()->name, space()->size); continue; } diff --git a/storage/xtradb/fil/fil0fil.cc b/storage/xtradb/fil/fil0fil.cc index 766e9d91cfb..3c00c857a6d 100644 --- a/storage/xtradb/fil/fil0fil.cc +++ b/storage/xtradb/fil/fil0fil.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2014, 2019, MariaDB Corporation. +Copyright (c) 2014, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -1815,25 +1815,6 @@ fil_space_get_zip_size( return(flags); } -/*******************************************************************//** -Checks if the pair space, page_no refers to an existing page in a tablespace -file space. The tablespace must be cached in the memory cache. -@return TRUE if the address is meaningful */ -UNIV_INTERN -ibool -fil_check_adress_in_tablespace( -/*===========================*/ - ulint id, /*!< in: space id */ - ulint page_no)/*!< in: page number */ -{ - if (fil_space_get_size(id) > page_no) { - - return(TRUE); - } - - return(FALSE); -} - /****************************************************************//** Initializes the tablespace memory cache. */ UNIV_INTERN diff --git a/storage/xtradb/include/fil0fil.h b/storage/xtradb/include/fil0fil.h index a4274f4d8a6..8831ea2e8cd 100644 --- a/storage/xtradb/include/fil0fil.h +++ b/storage/xtradb/include/fil0fil.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2019, MariaDB Corporation. +Copyright (c) 2013, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -574,16 +574,6 @@ ulint fil_space_get_zip_size( /*===================*/ ulint id); /*!< in: space id */ -/*******************************************************************//** -Checks if the pair space, page_no refers to an existing page in a tablespace -file space. The tablespace must be cached in the memory cache. -@return TRUE if the address is meaningful */ -UNIV_INTERN -ibool -fil_check_adress_in_tablespace( -/*===========================*/ - ulint id, /*!< in: space id */ - ulint page_no);/*!< in: page number */ /****************************************************************//** Initializes the tablespace memory cache. */ UNIV_INTERN From 57ec42bc321dee796ce8e711a4499cd665513009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 17 Jul 2020 15:55:45 +0300 Subject: [PATCH 069/188] MDEV-23190 InnoDB data file extension is not crash-safe When InnoDB is extending a data file, it is updating the FSP_SIZE field in the first page of the data file. In commit 8451e09073e8b1a300f177d74a9e3a530776640a (MDEV-11556) we removed a work-around for this bug and made recovery stricter, by making it track changes to FSP_SIZE via redo log records, and extend the data files before any changes are being applied to them. It turns out that the function fsp_fill_free_list() is not crash-safe with respect to this when it is initializing the change buffer bitmap page (page 1, or generally, N*innodb_page_size+1). It uses a separate mini-transaction that is committed (and will be written to the redo log file) before the mini-transaction that actually extended the data file. Hence, recovery can observe a reference to a page that is beyond the current end of the data file. fsp_fill_free_list(): Initialize the change buffer bitmap page in the same mini-transaction. The rest of the changes are fixing a bug that the use of the separate mini-transaction was attempting to work around. Namely, we must ensure that no other thread will access the change buffer bitmap page before our mini-transaction has been committed and all page latches have been released. That is, for read-ahead as well as neighbour flushing, we must avoid accessing pages that might not yet be durably part of the tablespace. fil_space_t::committed_size: The size of the tablespace as persisted by mtr_commit(). fil_space_t::max_page_number_for_io(): Limit the highest page number for I/O batches to committed_size. MTR_MEMO_SPACE_X_LOCK: Replaces MTR_MEMO_X_LOCK for fil_space_t::latch. mtr_x_space_lock(): Replaces mtr_x_lock() for fil_space_t::latch. mtr_memo_slot_release_func(): When releasing MTR_MEMO_SPACE_X_LOCK, copy space->size to space->committed_size. In this way, read-ahead or flushing will never be invoked on pages that do not yet exist according to FSP_SIZE. --- storage/innobase/buf/buf0flu.cc | 9 ++- storage/innobase/buf/buf0rea.cc | 68 +++++++++++--------- storage/innobase/fil/fil0fil.cc | 5 +- storage/innobase/fsp/fsp0fsp.cc | 99 +++++++++++++---------------- storage/innobase/ibuf/ibuf0ibuf.cc | 6 +- storage/innobase/include/fil0fil.h | 11 ++++ storage/innobase/include/mtr0mtr.h | 13 +++- storage/innobase/include/mtr0mtr.ic | 15 ++++- storage/innobase/mtr/mtr0mtr.cc | 11 ++++ storage/innobase/srv/srv0start.cc | 10 ++- storage/innobase/trx/trx0rseg.cc | 6 +- storage/innobase/trx/trx0sys.cc | 4 +- storage/xtradb/buf/buf0flu.cc | 9 ++- storage/xtradb/buf/buf0rea.cc | 65 ++++++++++--------- storage/xtradb/fil/fil0fil.cc | 5 +- storage/xtradb/fsp/fsp0fsp.cc | 99 +++++++++++++---------------- storage/xtradb/ibuf/ibuf0ibuf.cc | 6 +- storage/xtradb/include/fil0fil.h | 11 ++++ storage/xtradb/include/mtr0mtr.h | 12 ++++ storage/xtradb/include/mtr0mtr.ic | 15 ++++- storage/xtradb/mtr/mtr0mtr.cc | 11 ++++ storage/xtradb/srv/srv0start.cc | 10 ++- storage/xtradb/trx/trx0rseg.cc | 6 +- storage/xtradb/trx/trx0sys.cc | 4 +- 24 files changed, 313 insertions(+), 197 deletions(-) diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 1325a938dd6..9df58e760e6 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2019, MariaDB Corporation. +Copyright (c) 2013, 2020, MariaDB Corporation. Copyright (c) 2013, 2014, Fusion-io This program is free software; you can redistribute it and/or modify it under @@ -1241,8 +1241,11 @@ buf_flush_try_neighbors( /* fprintf(stderr, "Flush area: low %lu high %lu\n", low, high); */ #endif - if (high > fil_space_get_size(space)) { - high = fil_space_get_size(space); + if (fil_space_t *s = fil_space_acquire_for_io(space)) { + high = s->max_page_number_for_io(high); + fil_space_release_for_io(s); + } else { + return 0; } ulint count = 0; diff --git a/storage/innobase/buf/buf0rea.cc b/storage/innobase/buf/buf0rea.cc index 3b4d21f7507..a22b1523608 100644 --- a/storage/innobase/buf/buf0rea.cc +++ b/storage/innobase/buf/buf0rea.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2013, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, 2017, MariaDB Corporation. +Copyright (c) 2015, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -292,19 +292,22 @@ buf_read_ahead_random( return(0); } - /* Remember the tablespace version before we ask te tablespace size - below: if DISCARD + IMPORT changes the actual .ibd file meanwhile, we - do not try to read outside the bounds of the tablespace! */ + if (fil_space_t *s = fil_space_acquire_for_io(space)) { + /* Remember the tablespace version along with the + tablespace size: if DISCARD + IMPORT changes the + actual .ibd file meanwhile, we do not try to read + outside the bounds of the tablespace! */ + tablespace_version = s->tablespace_version; - tablespace_version = fil_space_get_version(space); + low = (offset / buf_read_ahead_random_area) + * buf_read_ahead_random_area; + high = (offset / buf_read_ahead_random_area + 1) + * buf_read_ahead_random_area; + high = s->max_page_number_for_io(high); - low = (offset / buf_read_ahead_random_area) - * buf_read_ahead_random_area; - high = (offset / buf_read_ahead_random_area + 1) - * buf_read_ahead_random_area; - if (high > fil_space_get_size(space)) { - - high = fil_space_get_size(space); + fil_space_release_for_io(s); + } else { + return 0; } buf_pool_mutex_enter(buf_pool); @@ -435,22 +438,16 @@ buf_read_page( ulint zip_size, ulint offset) { - ib_int64_t tablespace_version; - ulint count; dberr_t err = DB_SUCCESS; - tablespace_version = fil_space_get_version(space_id); - FilSpace space(space_id, true); if (space()) { - - /* We do the i/o in the synchronous aio mode to save thread - switches: hence TRUE */ - count = buf_read_page_low(&err, true, BUF_READ_ANY_PAGE, space_id, - zip_size, FALSE, - tablespace_version, offset); - + ulint count = buf_read_page_low(&err, /*sync=*/true, + BUF_READ_ANY_PAGE, + space_id, zip_size, FALSE, + space()->tablespace_version, + offset); srv_stats.buf_pool_reads.add(count); } @@ -619,21 +616,30 @@ buf_read_ahead_linear( return(0); } - /* Remember the tablespace version before we ask te tablespace size - below: if DISCARD + IMPORT changes the actual .ibd file meanwhile, we - do not try to read outside the bounds of the tablespace! */ + uint32_t space_high_limit = 0; - tablespace_version = fil_space_get_version(space); + if (fil_space_t *s = fil_space_acquire_for_io(space)) { + /* Remember the tablespace version along with the + tablespace size: if DISCARD + IMPORT changes the + actual .ibd file meanwhile, we do not try to read + outside the bounds of the tablespace! */ + tablespace_version = s->tablespace_version; - buf_pool_mutex_enter(buf_pool); + space_high_limit = s->max_page_number_for_io(ULINT_UNDEFINED); - if (high > fil_space_get_size(space)) { - buf_pool_mutex_exit(buf_pool); + fil_space_release_for_io(s); + } else { + return 0; + } + + if (high > space_high_limit) { /* The area is not whole, return */ return(0); } + buf_pool_mutex_enter(buf_pool); + if (buf_pool->n_pend_reads > buf_pool->curr_size / BUF_READ_AHEAD_PEND_LIMIT) { buf_pool_mutex_exit(buf_pool); @@ -754,7 +760,7 @@ buf_read_ahead_linear( return(0); } - if (high > fil_space_get_size(space)) { + if (high > space_high_limit) { /* The area is not whole, return */ return(0); diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index ac48db75624..62fb8deaf72 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -676,7 +676,7 @@ fil_node_open_file( #ifdef UNIV_HOTBACKUP add_size: #endif /* UNIV_HOTBACKUP */ - space->size += node->size; + space->committed_size = space->size += node->size; } ulint atomic_writes = FSP_FLAGS_GET_ATOMIC_WRITES(space->flags); @@ -1151,6 +1151,9 @@ retry: ut_a(success); /* InnoDB data files cannot shrink. */ ut_a(space->size >= size); + if (size > space->committed_size) { + space->committed_size = size; + } /* There could be multiple concurrent I/O requests for this tablespace (multiple threads trying to extend diff --git a/storage/innobase/fsp/fsp0fsp.cc b/storage/innobase/fsp/fsp0fsp.cc index 13ac923eb3f..3796ab6d144 100644 --- a/storage/innobase/fsp/fsp0fsp.cc +++ b/storage/innobase/fsp/fsp0fsp.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, 2018, MariaDB Corporation. +Copyright (c) 2017, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -447,7 +447,7 @@ xdes_get_descriptor_with_space_hdr( page_t* descr_page; ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space, NULL), - MTR_MEMO_X_LOCK)); + MTR_MEMO_SPACE_X_LOCK)); ut_ad(mtr_memo_contains_page(mtr, sp_header, MTR_MEMO_PAGE_X_FIX)); ut_ad(page_offset(sp_header) == FSP_HEADER_OFFSET); /* Read free limit and space size */ @@ -531,7 +531,7 @@ xdes_lst_get_descriptor( ut_ad(mtr); ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space, NULL), - MTR_MEMO_X_LOCK)); + MTR_MEMO_SPACE_X_LOCK)); descr = fut_get_ptr(space, zip_size, lst_node, RW_X_LATCH, mtr) - XDES_FLST_NODE; @@ -687,7 +687,7 @@ fsp_header_init(ulint space_id, ulint size, mtr_t* mtr) ut_ad(mtr); - mtr_x_lock(fil_space_get_latch(space_id, &flags), mtr); + mtr_x_space_lock(fil_space_get_latch(space_id, &flags), mtr); zip_size = fsp_flags_get_zip_size(flags); block = buf_page_create(space_id, 0, zip_size, mtr); @@ -814,7 +814,7 @@ fsp_header_inc_size( ut_ad(mtr); - mtr_x_lock(fil_space_get_latch(space, &flags), mtr); + mtr_x_space_lock(fil_space_get_latch(space, &flags), mtr); header = fsp_get_space_header(space, fsp_flags_get_zip_size(flags), @@ -843,7 +843,7 @@ fsp_header_get_tablespace_size(void) mtr_start(&mtr); - mtr_x_lock(fil_space_get_latch(0, NULL), &mtr); + mtr_x_space_lock(fil_space_get_latch(0, NULL), &mtr); header = fsp_get_space_header(0, 0, &mtr); @@ -1070,7 +1070,6 @@ fsp_fill_free_list( ulint frag_n_used; ulint actual_increase; ulint i; - mtr_t ibuf_mtr; ut_ad(page_offset(header) == FSP_HEADER_OFFSET); @@ -1138,26 +1137,17 @@ fsp_fill_free_list( MLOG_2BYTES, mtr); } - /* Initialize the ibuf bitmap page in a separate - mini-transaction because it is low in the latching - order, and we must be able to release its latch - before returning from the fsp routine */ - - mtr_start(&ibuf_mtr); - block = buf_page_create(space, - i + FSP_IBUF_BITMAP_OFFSET, - zip_size, &ibuf_mtr); + i + FSP_IBUF_BITMAP_OFFSET, + zip_size, mtr); buf_page_get(space, zip_size, i + FSP_IBUF_BITMAP_OFFSET, - RW_X_LATCH, &ibuf_mtr); + RW_X_LATCH, mtr); buf_block_dbg_add_level(block, SYNC_FSP_PAGE); - fsp_init_file_page(block, &ibuf_mtr); + fsp_init_file_page(block, mtr); - ibuf_bitmap_page_init(block, &ibuf_mtr); - - mtr_commit(&ibuf_mtr); + ibuf_bitmap_page_init(block, mtr); } descr = xdes_get_descriptor_with_space_hdr(header, space, i, @@ -2038,7 +2028,7 @@ fseg_create_general( header = byte_offset + buf_block_get_frame(block); } - mtr_x_lock(latch, mtr); + mtr_x_space_lock(latch, mtr); if (!has_done_reservation) { success = fsp_reserve_free_extents(&n_reserved, space, 2, @@ -2185,7 +2175,7 @@ fseg_n_reserved_pages( latch = fil_space_get_latch(space, &flags); zip_size = fsp_flags_get_zip_size(flags); - mtr_x_lock(latch, mtr); + mtr_x_space_lock(latch, mtr); inode = fseg_inode_get(header, space, zip_size, mtr); @@ -2608,7 +2598,7 @@ fseg_alloc_free_page_general( zip_size = fsp_flags_get_zip_size(flags); - mtr_x_lock(latch, mtr); + mtr_x_space_lock(latch, mtr); inode = fseg_inode_get(seg_header, space, zip_size, mtr); @@ -2725,7 +2715,7 @@ fsp_reserve_free_extents( latch = fil_space_get_latch(space, &flags); zip_size = fsp_flags_get_zip_size(flags); - mtr_x_lock(latch, mtr); + mtr_x_space_lock(latch, mtr); space_header = fsp_get_space_header(space, zip_size, mtr); try_again: @@ -2865,7 +2855,7 @@ fsp_get_available_space_in_free_extents( zip_size = fsp_flags_get_zip_size(flags); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); mutex_exit(&dict_sys->mutex); @@ -3155,7 +3145,7 @@ fseg_free_page( latch = fil_space_get_latch(space, &flags); zip_size = fsp_flags_get_zip_size(flags); - mtr_x_lock(latch, mtr); + mtr_x_space_lock(latch, mtr); seg_inode = fseg_inode_get(seg_header, space, zip_size, mtr); @@ -3189,7 +3179,7 @@ fseg_page_is_free( zip_size = dict_tf_get_zip_size(flags); mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); seg_inode = fseg_inode_get(seg_header, space, zip_size, &mtr); @@ -3314,7 +3304,7 @@ fseg_free_step( latch = fil_space_get_latch(space, &flags); zip_size = fsp_flags_get_zip_size(flags); - mtr_x_lock(latch, mtr); + mtr_x_space_lock(latch, mtr); descr = xdes_get_descriptor(space, zip_size, header_page, mtr); @@ -3395,7 +3385,7 @@ fseg_free_step_not_header( latch = fil_space_get_latch(space, &flags); zip_size = fsp_flags_get_zip_size(flags); - mtr_x_lock(latch, mtr); + mtr_x_space_lock(latch, mtr); inode = fseg_inode_get(header, space, zip_size, mtr); @@ -3515,7 +3505,7 @@ fseg_validate_low( ulint zip_size; mtr_start(&mtr); - mtr_x_lock(fil_space_get_latch(space, &flags), &mtr); + mtr_x_space_lock(fil_space_get_latch(space, &flags), &mtr); zip_size = fsp_flags_get_zip_size(flags); descr = xdes_lst_get_descriptor(space, zip_size, @@ -3538,7 +3528,7 @@ fseg_validate_low( ulint zip_size; mtr_start(&mtr); - mtr_x_lock(fil_space_get_latch(space, &flags), &mtr); + mtr_x_space_lock(fil_space_get_latch(space, &flags), &mtr); zip_size = fsp_flags_get_zip_size(flags); descr = xdes_lst_get_descriptor(space, zip_size, @@ -3564,7 +3554,7 @@ fseg_validate_low( ulint zip_size; mtr_start(&mtr); - mtr_x_lock(fil_space_get_latch(space, &flags), &mtr); + mtr_x_space_lock(fil_space_get_latch(space, &flags), &mtr); zip_size = fsp_flags_get_zip_size(flags); descr = xdes_lst_get_descriptor(space, zip_size, @@ -3602,7 +3592,7 @@ fseg_validate( space = page_get_space_id(page_align(header)); - mtr_x_lock(fil_space_get_latch(space, &flags), mtr); + mtr_x_space_lock(fil_space_get_latch(space, &flags), mtr); zip_size = fsp_flags_get_zip_size(flags); inode = fseg_inode_get(header, space, zip_size, mtr); @@ -3678,7 +3668,7 @@ fseg_print( space = page_get_space_id(page_align(header)); - mtr_x_lock(fil_space_get_latch(space, &flags), mtr); + mtr_x_space_lock(fil_space_get_latch(space, &flags), mtr); zip_size = fsp_flags_get_zip_size(flags); inode = fseg_inode_get(header, space, zip_size, mtr); @@ -3727,10 +3717,10 @@ fsp_validate( /* Start first a mini-transaction mtr2 to lock out all other threads from the fsp system */ mtr_start(&mtr2); - mtr_x_lock(latch, &mtr2); + mtr_x_space_lock(latch, &mtr2); mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); @@ -3757,7 +3747,7 @@ fsp_validate( /* Validate FSP_FREE list */ mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); node_addr = flst_get_first(header + FSP_FREE, &mtr); @@ -3766,7 +3756,7 @@ fsp_validate( while (!fil_addr_is_null(node_addr)) { mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); descr_count++; descr = xdes_lst_get_descriptor(space, zip_size, @@ -3781,7 +3771,7 @@ fsp_validate( /* Validate FSP_FREE_FRAG list */ mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); node_addr = flst_get_first(header + FSP_FREE_FRAG, &mtr); @@ -3790,7 +3780,7 @@ fsp_validate( while (!fil_addr_is_null(node_addr)) { mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); descr_count++; descr = xdes_lst_get_descriptor(space, zip_size, @@ -3808,7 +3798,7 @@ fsp_validate( /* Validate FSP_FULL_FRAG list */ mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); node_addr = flst_get_first(header + FSP_FULL_FRAG, &mtr); @@ -3817,7 +3807,7 @@ fsp_validate( while (!fil_addr_is_null(node_addr)) { mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); descr_count++; descr = xdes_lst_get_descriptor(space, zip_size, @@ -3832,7 +3822,7 @@ fsp_validate( /* Validate segments */ mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); @@ -3847,7 +3837,7 @@ fsp_validate( n = 0; do { mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); seg_inode_page = fut_get_ptr( space, zip_size, node_addr, RW_X_LATCH, &mtr) @@ -3876,7 +3866,7 @@ fsp_validate( } mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); @@ -3892,7 +3882,7 @@ fsp_validate( do { mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); seg_inode_page = fut_get_ptr( space, zip_size, node_addr, RW_X_LATCH, &mtr) @@ -3976,11 +3966,11 @@ fsp_print( mtr_start(&mtr2); - mtr_x_lock(latch, &mtr2); + mtr_x_space_lock(latch, &mtr2); mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); @@ -4012,7 +4002,7 @@ fsp_print( /* Print segments */ mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); @@ -4027,7 +4017,7 @@ fsp_print( do { mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); seg_inode_page = fut_get_ptr( space, zip_size, node_addr, RW_X_LATCH, &mtr) @@ -4049,7 +4039,7 @@ fsp_print( } mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); @@ -4064,7 +4054,7 @@ fsp_print( do { mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); seg_inode_page = fut_get_ptr( space, zip_size, node_addr, RW_X_LATCH, &mtr) @@ -4121,7 +4111,8 @@ fsp_page_is_free_func( ut_ad(mtr); - mtr_x_lock_func(fil_space_get_latch(space, &flags), file, line, mtr); + mtr_x_space_lock_func(fil_space_get_latch(space, &flags), file, line, + mtr); ulint zip_size = fsp_flags_get_zip_size(flags); xdes_t* descr = xdes_get_descriptor(space, zip_size, page_no, mtr); diff --git a/storage/innobase/ibuf/ibuf0ibuf.cc b/storage/innobase/ibuf/ibuf0ibuf.cc index 086fb3427c8..9427ade1ce4 100644 --- a/storage/innobase/ibuf/ibuf0ibuf.cc +++ b/storage/innobase/ibuf/ibuf0ibuf.cc @@ -548,7 +548,7 @@ ibuf_init_at_db_start(void) mutex_enter(&ibuf_mutex); - mtr_x_lock(fil_space_get_latch(IBUF_SPACE_ID, NULL), &mtr); + mtr_x_space_lock(fil_space_get_latch(IBUF_SPACE_ID, NULL), &mtr); header_page = ibuf_header_page_get(&mtr); @@ -2098,7 +2098,7 @@ ibuf_add_free_page(void) /* Acquire the fsp latch before the ibuf header, obeying the latching order */ - mtr_x_lock(fil_space_get_latch(IBUF_SPACE_ID, &flags), &mtr); + mtr_x_space_lock(fil_space_get_latch(IBUF_SPACE_ID, &flags), &mtr); zip_size = fsp_flags_get_zip_size(flags); header_page = ibuf_header_page_get(&mtr); @@ -2182,7 +2182,7 @@ ibuf_remove_free_page(void) /* Acquire the fsp latch before the ibuf header, obeying the latching order */ - mtr_x_lock(fil_space_get_latch(IBUF_SPACE_ID, &flags), &mtr); + mtr_x_space_lock(fil_space_get_latch(IBUF_SPACE_ID, &flags), &mtr); zip_size = fsp_flags_get_zip_size(flags); header_page = ibuf_header_page_get(&mtr); diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index 448532e249b..5b11a026cf9 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -306,6 +306,8 @@ struct fil_space_t { /*!< recovered tablespace size in pages; 0 if no size change was read from the redo log, or if the size change was implemented */ + /** the committed size of the tablespace in pages */ + ulint committed_size; ulint flags; /*!< FSP_SPACE_FLAGS and FSP_FLAGS_MEM_ flags; see fsp0fsp.h, fsp_flags_is_valid(), @@ -365,6 +367,15 @@ struct fil_space_t { { return stop_new_ops; } + + /** Clamp a page number for batched I/O, such as read-ahead. + @param offset page number limit + @return offset clamped to the tablespace size */ + ulint max_page_number_for_io(ulint offset) const + { + const ulint limit= committed_size; + return limit > offset ? offset : limit; + } }; /** Value of fil_space_t::magic_n */ diff --git a/storage/innobase/include/mtr0mtr.h b/storage/innobase/include/mtr0mtr.h index 6c0ee2c7ac7..d28c52237b2 100644 --- a/storage/innobase/include/mtr0mtr.h +++ b/storage/innobase/include/mtr0mtr.h @@ -2,7 +2,7 @@ Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. -Copyright (c) 2013, 2016, MariaDB Corporation +Copyright (c) 2013, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -58,6 +58,7 @@ first 3 values must be RW_S_LATCH, RW_X_LATCH, RW_NO_LATCH */ #endif /* UNIV_DEBUG */ #define MTR_MEMO_S_LOCK 55 #define MTR_MEMO_X_LOCK 56 +#define MTR_MEMO_SPACE_X_LOCK 57 /** @name Log item types The log items are declared 'byte' so that the compiler can warn if val @@ -295,6 +296,8 @@ This macro locks an rw-lock in s-mode. */ This macro locks an rw-lock in x-mode. */ #define mtr_x_lock(B, MTR) mtr_x_lock_func((B), __FILE__, __LINE__,\ (MTR)) +#define mtr_x_space_lock(B, MTR) mtr_x_space_lock_func(B, __FILE__, __LINE__,\ + MTR) /*********************************************************************//** NOTE! Use the macro above! Locks a lock in s-mode. */ @@ -317,6 +320,14 @@ mtr_x_lock_func( const char* file, /*!< in: file name */ ulint line, /*!< in: line number */ mtr_t* mtr); /*!< in: mtr */ + +/** Acquire exclusive tablespace latch. +@param lock fil_space_t::latch +@param file source code file name of the caller +@param line source code line number of the caller +@param mtr mini-transaction */ +inline void mtr_x_space_lock_func(rw_lock_t *lock, + const char *file, ulint line, mtr_t *mtr); #endif /* !UNIV_HOTBACKUP */ /***************************************************//** diff --git a/storage/innobase/include/mtr0mtr.ic b/storage/innobase/include/mtr0mtr.ic index 5763c054a8f..a0f4779fb10 100644 --- a/storage/innobase/include/mtr0mtr.ic +++ b/storage/innobase/include/mtr0mtr.ic @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -78,7 +79,7 @@ mtr_memo_push( ut_ad(object); ut_ad(type >= MTR_MEMO_PAGE_S_FIX); - ut_ad(type <= MTR_MEMO_X_LOCK); + ut_ad(type <= MTR_MEMO_SPACE_X_LOCK); ut_ad(mtr); ut_ad(mtr->magic_n == MTR_MAGIC_N); ut_ad(mtr->state == MTR_ACTIVE); @@ -293,4 +294,16 @@ mtr_x_lock_func( mtr_memo_push(mtr, lock, MTR_MEMO_X_LOCK); } + +/** Acquire exclusive tablespace latch. +@param lock fil_space_t::latch +@param file source code file name of the caller +@param line source code line number of the caller +@param mtr mini-transaction */ +inline void mtr_x_space_lock_func(rw_lock_t *lock, + const char *file, ulint line, mtr_t *mtr) +{ + rw_lock_x_lock_inline(lock, 0, file, line); + mtr_memo_push(mtr, lock, MTR_MEMO_SPACE_X_LOCK); +} #endif /* !UNIV_HOTBACKUP */ diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc index 2db6e62cbed..1388da713b0 100644 --- a/storage/innobase/mtr/mtr0mtr.cc +++ b/storage/innobase/mtr/mtr0mtr.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -87,6 +88,16 @@ mtr_memo_slot_release_func( case MTR_MEMO_X_LOCK: rw_lock_x_unlock((rw_lock_t*) object); break; + case MTR_MEMO_SPACE_X_LOCK: + { + fil_space_t* space = reinterpret_cast( + static_cast(object) + - reinterpret_cast( + &static_cast(0)->latch)); + space->committed_size = space->size; + rw_lock_x_unlock(&space->latch); + } + break; #ifdef UNIV_DEBUG default: ut_ad(slot->type == MTR_MEMO_MODIFY); diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index a73e67e9f5b..05f29d60411 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -3,7 +3,7 @@ Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2008, Google Inc. Copyright (c) 2009, Percona Inc. -Copyright (c) 2013, 2019, MariaDB Corporation. +Copyright (c) 2013, 2020, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -1203,6 +1203,10 @@ check_first_page: } } + if (fil_space_t* s = fil_space_get(0)) { + s->committed_size = s->size; + } + return(DB_SUCCESS); } @@ -1371,6 +1375,10 @@ srv_undo_tablespace_open( if (fil_node_create(name, (ulint) n_pages, space, FALSE)) { err = DB_SUCCESS; } + + if (fil_space_t* s = fil_space_get(space)) { + s->committed_size = n_pages; + } } return(err); diff --git a/storage/innobase/trx/trx0rseg.cc b/storage/innobase/trx/trx0rseg.cc index 944e2353de8..e73e20737f6 100644 --- a/storage/innobase/trx/trx0rseg.cc +++ b/storage/innobase/trx/trx0rseg.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -65,7 +65,7 @@ trx_rseg_header_create( ut_ad(mtr); ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space, NULL), - MTR_MEMO_X_LOCK)); + MTR_MEMO_SPACE_X_LOCK)); /* Allocate a new file segment for the rollback segment */ block = fseg_create(space, 0, TRX_RSEG + TRX_RSEG_FSEG_HEADER, mtr); @@ -310,7 +310,7 @@ trx_rseg_create(ulint space) /* To obey the latching order, acquire the file space x-latch before the trx_sys->mutex. */ - mtr_x_lock(fil_space_get_latch(space, NULL), &mtr); + mtr_x_space_lock(fil_space_get_latch(space, NULL), &mtr); slot_no = trx_sysf_rseg_find_free(&mtr); diff --git a/storage/innobase/trx/trx0sys.cc b/storage/innobase/trx/trx0sys.cc index 13fd37f4e50..6f348a2b13e 100644 --- a/storage/innobase/trx/trx0sys.cc +++ b/storage/innobase/trx/trx0sys.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, 2018, MariaDB Corporation. +Copyright (c) 2017, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -550,7 +550,7 @@ trx_sysf_create( then enter the kernel: we must do it in this order to conform to the latching order rules. */ - mtr_x_lock(fil_space_get_latch(TRX_SYS_SPACE, NULL), mtr); + mtr_x_space_lock(fil_space_get_latch(TRX_SYS_SPACE, NULL), mtr); /* Create the trx sys file block in a new allocated file segment */ block = fseg_create(TRX_SYS_SPACE, 0, TRX_SYS + TRX_SYS_FSEG_HEADER, diff --git a/storage/xtradb/buf/buf0flu.cc b/storage/xtradb/buf/buf0flu.cc index eccc7c281c1..4993654952b 100644 --- a/storage/xtradb/buf/buf0flu.cc +++ b/storage/xtradb/buf/buf0flu.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2019, MariaDB Corporation. +Copyright (c) 2013, 2020, MariaDB Corporation. Copyright (c) 2013, 2014, Fusion-io This program is free software; you can redistribute it and/or modify it under @@ -1297,8 +1297,11 @@ buf_flush_try_neighbors( /* fprintf(stderr, "Flush area: low %lu high %lu\n", low, high); */ - if (high > fil_space_get_size(space)) { - high = fil_space_get_size(space); + if (fil_space_t *s = fil_space_acquire_for_io(space)) { + high = s->max_page_number_for_io(high); + fil_space_release_for_io(s); + } else { + return 0; } ulint count = 0; diff --git a/storage/xtradb/buf/buf0rea.cc b/storage/xtradb/buf/buf0rea.cc index 1ef9162cab9..a962b94c0c2 100644 --- a/storage/xtradb/buf/buf0rea.cc +++ b/storage/xtradb/buf/buf0rea.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2013, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2013, 2018, MariaDB Corporation. +Copyright (c) 2013, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -344,19 +344,22 @@ buf_read_ahead_random( return(0); } - /* Remember the tablespace version before we ask te tablespace size - below: if DISCARD + IMPORT changes the actual .ibd file meanwhile, we - do not try to read outside the bounds of the tablespace! */ + if (fil_space_t *s = fil_space_acquire_for_io(space)) { + /* Remember the tablespace version along with the + tablespace size: if DISCARD + IMPORT changes the + actual .ibd file meanwhile, we do not try to read + outside the bounds of the tablespace! */ + tablespace_version = s->tablespace_version; - tablespace_version = fil_space_get_version(space); + low = (offset / buf_read_ahead_random_area) + * buf_read_ahead_random_area; + high = (offset / buf_read_ahead_random_area + 1) + * buf_read_ahead_random_area; + high = s->max_page_number_for_io(high); - low = (offset / buf_read_ahead_random_area) - * buf_read_ahead_random_area; - high = (offset / buf_read_ahead_random_area + 1) - * buf_read_ahead_random_area; - if (high > fil_space_get_size(space)) { - - high = fil_space_get_size(space); + fil_space_release_for_io(s); + } else { + return 0; } if (buf_pool->n_pend_reads @@ -495,22 +498,16 @@ buf_read_page( ulint offset, trx_t* trx) { - ib_int64_t tablespace_version; - ulint count; dberr_t err = DB_SUCCESS; - tablespace_version = fil_space_get_version(space_id); - FilSpace space(space_id, true); if (space()) { - - /* We do the i/o in the synchronous aio mode to save thread - switches: hence TRUE */ - count = buf_read_page_low(&err, true, BUF_READ_ANY_PAGE, space_id, - zip_size, FALSE, - tablespace_version, offset, trx); - + ulint count = buf_read_page_low(&err, /*sync=*/true, + BUF_READ_ANY_PAGE, + space_id, zip_size, FALSE, + space()->tablespace_version, + offset, trx); srv_stats.buf_pool_reads.add(count); } @@ -683,13 +680,23 @@ buf_read_ahead_linear( return(0); } - /* Remember the tablespace version before we ask te tablespace size - below: if DISCARD + IMPORT changes the actual .ibd file meanwhile, we - do not try to read outside the bounds of the tablespace! */ + uint32_t space_high_limit = 0; - tablespace_version = fil_space_get_version(space); + if (fil_space_t *s = fil_space_acquire_for_io(space)) { + /* Remember the tablespace version along with the + tablespace size: if DISCARD + IMPORT changes the + actual .ibd file meanwhile, we do not try to read + outside the bounds of the tablespace! */ + tablespace_version = s->tablespace_version; - if (high > fil_space_get_size(space)) { + space_high_limit = s->max_page_number_for_io(ULINT_UNDEFINED); + + fil_space_release_for_io(s); + } else { + return 0; + } + + if (high > space_high_limit) { /* The area is not whole, return */ return(0); @@ -825,7 +832,7 @@ buf_read_ahead_linear( return(0); } - if (high > fil_space_get_size(space)) { + if (high > space_high_limit) { /* The area is not whole, return */ return(0); diff --git a/storage/xtradb/fil/fil0fil.cc b/storage/xtradb/fil/fil0fil.cc index 3c00c857a6d..b5ccb533af8 100644 --- a/storage/xtradb/fil/fil0fil.cc +++ b/storage/xtradb/fil/fil0fil.cc @@ -684,7 +684,7 @@ fil_node_open_file( #ifdef UNIV_HOTBACKUP add_size: #endif /* UNIV_HOTBACKUP */ - space->size += node->size; + space->committed_size = space->size += node->size; } ulint atomic_writes = FSP_FLAGS_GET_ATOMIC_WRITES(space->flags); @@ -1158,6 +1158,9 @@ retry: ut_a(success); /* InnoDB data files cannot shrink. */ ut_a(space->size >= size); + if (size > space->committed_size) { + space->committed_size = size; + } /* There could be multiple concurrent I/O requests for this tablespace (multiple threads trying to extend diff --git a/storage/xtradb/fsp/fsp0fsp.cc b/storage/xtradb/fsp/fsp0fsp.cc index fc2e192a3b1..e2e9709d5f2 100644 --- a/storage/xtradb/fsp/fsp0fsp.cc +++ b/storage/xtradb/fsp/fsp0fsp.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, 2018, MariaDB Corporation. +Copyright (c) 2017, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -450,7 +450,7 @@ xdes_get_descriptor_with_space_hdr( page_t* descr_page; ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space, NULL), - MTR_MEMO_X_LOCK)); + MTR_MEMO_SPACE_X_LOCK)); ut_ad(mtr_memo_contains_page(mtr, sp_header, MTR_MEMO_PAGE_X_FIX)); ut_ad(page_offset(sp_header) == FSP_HEADER_OFFSET); /* Read free limit and space size */ @@ -534,7 +534,7 @@ xdes_lst_get_descriptor( ut_ad(mtr); ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space, NULL), - MTR_MEMO_X_LOCK)); + MTR_MEMO_SPACE_X_LOCK)); descr = fut_get_ptr(space, zip_size, lst_node, RW_X_LATCH, mtr) - XDES_FLST_NODE; @@ -690,7 +690,7 @@ fsp_header_init(ulint space_id, ulint size, mtr_t* mtr) ut_ad(mtr); - mtr_x_lock(fil_space_get_latch(space_id, &flags), mtr); + mtr_x_space_lock(fil_space_get_latch(space_id, &flags), mtr); zip_size = fsp_flags_get_zip_size(flags); block = buf_page_create(space_id, 0, zip_size, mtr); @@ -817,7 +817,7 @@ fsp_header_inc_size( ut_ad(mtr); - mtr_x_lock(fil_space_get_latch(space, &flags), mtr); + mtr_x_space_lock(fil_space_get_latch(space, &flags), mtr); header = fsp_get_space_header(space, fsp_flags_get_zip_size(flags), @@ -846,7 +846,7 @@ fsp_header_get_tablespace_size(void) mtr_start(&mtr); - mtr_x_lock(fil_space_get_latch(0, NULL), &mtr); + mtr_x_space_lock(fil_space_get_latch(0, NULL), &mtr); header = fsp_get_space_header(0, 0, &mtr); @@ -1073,7 +1073,6 @@ fsp_fill_free_list( ulint frag_n_used; ulint actual_increase; ulint i; - mtr_t ibuf_mtr; ut_ad(page_offset(header) == FSP_HEADER_OFFSET); @@ -1141,26 +1140,17 @@ fsp_fill_free_list( MLOG_2BYTES, mtr); } - /* Initialize the ibuf bitmap page in a separate - mini-transaction because it is low in the latching - order, and we must be able to release its latch - before returning from the fsp routine */ - - mtr_start(&ibuf_mtr); - block = buf_page_create(space, - i + FSP_IBUF_BITMAP_OFFSET, - zip_size, &ibuf_mtr); + i + FSP_IBUF_BITMAP_OFFSET, + zip_size, mtr); buf_page_get(space, zip_size, i + FSP_IBUF_BITMAP_OFFSET, - RW_X_LATCH, &ibuf_mtr); + RW_X_LATCH, mtr); buf_block_dbg_add_level(block, SYNC_FSP_PAGE); - fsp_init_file_page(block, &ibuf_mtr); + fsp_init_file_page(block, mtr); - ibuf_bitmap_page_init(block, &ibuf_mtr); - - mtr_commit(&ibuf_mtr); + ibuf_bitmap_page_init(block, mtr); } descr = xdes_get_descriptor_with_space_hdr(header, space, i, @@ -2047,7 +2037,7 @@ fseg_create_general( header = byte_offset + buf_block_get_frame(block); } - mtr_x_lock(latch, mtr); + mtr_x_space_lock(latch, mtr); if (!has_done_reservation) { success = fsp_reserve_free_extents(&n_reserved, space, 2, @@ -2194,7 +2184,7 @@ fseg_n_reserved_pages( latch = fil_space_get_latch(space, &flags); zip_size = fsp_flags_get_zip_size(flags); - mtr_x_lock(latch, mtr); + mtr_x_space_lock(latch, mtr); inode = fseg_inode_get(header, space, zip_size, mtr); @@ -2617,7 +2607,7 @@ fseg_alloc_free_page_general( zip_size = fsp_flags_get_zip_size(flags); - mtr_x_lock(latch, mtr); + mtr_x_space_lock(latch, mtr); inode = fseg_inode_get(seg_header, space, zip_size, mtr); @@ -2734,7 +2724,7 @@ fsp_reserve_free_extents( latch = fil_space_get_latch(space, &flags); zip_size = fsp_flags_get_zip_size(flags); - mtr_x_lock(latch, mtr); + mtr_x_space_lock(latch, mtr); space_header = fsp_get_space_header(space, zip_size, mtr); try_again: @@ -2873,7 +2863,7 @@ fsp_get_available_space_in_free_extents( zip_size = fsp_flags_get_zip_size(flags); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); mutex_exit(&dict_sys->mutex); @@ -3169,7 +3159,7 @@ fseg_free_page( latch = fil_space_get_latch(space, &flags); zip_size = fsp_flags_get_zip_size(flags); - mtr_x_lock(latch, mtr); + mtr_x_space_lock(latch, mtr); seg_inode = fseg_inode_get(seg_header, space, zip_size, mtr); @@ -3203,7 +3193,7 @@ fseg_page_is_free( zip_size = dict_tf_get_zip_size(flags); mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); seg_inode = fseg_inode_get(seg_header, space, zip_size, &mtr); @@ -3328,7 +3318,7 @@ fseg_free_step( latch = fil_space_get_latch(space, &flags); zip_size = fsp_flags_get_zip_size(flags); - mtr_x_lock(latch, mtr); + mtr_x_space_lock(latch, mtr); descr = xdes_get_descriptor(space, zip_size, header_page, mtr); @@ -3415,7 +3405,7 @@ fseg_free_step_not_header( latch = fil_space_get_latch(space, &flags); zip_size = fsp_flags_get_zip_size(flags); - mtr_x_lock(latch, mtr); + mtr_x_space_lock(latch, mtr); inode = fseg_inode_get(header, space, zip_size, mtr); @@ -3541,7 +3531,7 @@ fseg_validate_low( ulint zip_size; mtr_start(&mtr); - mtr_x_lock(fil_space_get_latch(space, &flags), &mtr); + mtr_x_space_lock(fil_space_get_latch(space, &flags), &mtr); zip_size = fsp_flags_get_zip_size(flags); descr = xdes_lst_get_descriptor(space, zip_size, @@ -3564,7 +3554,7 @@ fseg_validate_low( ulint zip_size; mtr_start(&mtr); - mtr_x_lock(fil_space_get_latch(space, &flags), &mtr); + mtr_x_space_lock(fil_space_get_latch(space, &flags), &mtr); zip_size = fsp_flags_get_zip_size(flags); descr = xdes_lst_get_descriptor(space, zip_size, @@ -3590,7 +3580,7 @@ fseg_validate_low( ulint zip_size; mtr_start(&mtr); - mtr_x_lock(fil_space_get_latch(space, &flags), &mtr); + mtr_x_space_lock(fil_space_get_latch(space, &flags), &mtr); zip_size = fsp_flags_get_zip_size(flags); descr = xdes_lst_get_descriptor(space, zip_size, @@ -3628,7 +3618,7 @@ fseg_validate( space = page_get_space_id(page_align(header)); - mtr_x_lock(fil_space_get_latch(space, &flags), mtr); + mtr_x_space_lock(fil_space_get_latch(space, &flags), mtr); zip_size = fsp_flags_get_zip_size(flags); inode = fseg_inode_get(header, space, zip_size, mtr); @@ -3704,7 +3694,7 @@ fseg_print( space = page_get_space_id(page_align(header)); - mtr_x_lock(fil_space_get_latch(space, &flags), mtr); + mtr_x_space_lock(fil_space_get_latch(space, &flags), mtr); zip_size = fsp_flags_get_zip_size(flags); inode = fseg_inode_get(header, space, zip_size, mtr); @@ -3753,10 +3743,10 @@ fsp_validate( /* Start first a mini-transaction mtr2 to lock out all other threads from the fsp system */ mtr_start(&mtr2); - mtr_x_lock(latch, &mtr2); + mtr_x_space_lock(latch, &mtr2); mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); @@ -3783,7 +3773,7 @@ fsp_validate( /* Validate FSP_FREE list */ mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); node_addr = flst_get_first(header + FSP_FREE, &mtr); @@ -3792,7 +3782,7 @@ fsp_validate( while (!fil_addr_is_null(node_addr)) { mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); descr_count++; descr = xdes_lst_get_descriptor(space, zip_size, @@ -3807,7 +3797,7 @@ fsp_validate( /* Validate FSP_FREE_FRAG list */ mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); node_addr = flst_get_first(header + FSP_FREE_FRAG, &mtr); @@ -3816,7 +3806,7 @@ fsp_validate( while (!fil_addr_is_null(node_addr)) { mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); descr_count++; descr = xdes_lst_get_descriptor(space, zip_size, @@ -3834,7 +3824,7 @@ fsp_validate( /* Validate FSP_FULL_FRAG list */ mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); node_addr = flst_get_first(header + FSP_FULL_FRAG, &mtr); @@ -3843,7 +3833,7 @@ fsp_validate( while (!fil_addr_is_null(node_addr)) { mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); descr_count++; descr = xdes_lst_get_descriptor(space, zip_size, @@ -3858,7 +3848,7 @@ fsp_validate( /* Validate segments */ mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); @@ -3873,7 +3863,7 @@ fsp_validate( n = 0; do { mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); seg_inode_page = fut_get_ptr( space, zip_size, node_addr, RW_X_LATCH, &mtr) @@ -3902,7 +3892,7 @@ fsp_validate( } mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); @@ -3918,7 +3908,7 @@ fsp_validate( do { mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); seg_inode_page = fut_get_ptr( space, zip_size, node_addr, RW_X_LATCH, &mtr) @@ -4002,11 +3992,11 @@ fsp_print( mtr_start(&mtr2); - mtr_x_lock(latch, &mtr2); + mtr_x_space_lock(latch, &mtr2); mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); @@ -4038,7 +4028,7 @@ fsp_print( /* Print segments */ mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); @@ -4053,7 +4043,7 @@ fsp_print( do { mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); seg_inode_page = fut_get_ptr( space, zip_size, node_addr, RW_X_LATCH, &mtr) @@ -4075,7 +4065,7 @@ fsp_print( } mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); header = fsp_get_space_header(space, zip_size, &mtr); @@ -4090,7 +4080,7 @@ fsp_print( do { mtr_start(&mtr); - mtr_x_lock(latch, &mtr); + mtr_x_space_lock(latch, &mtr); seg_inode_page = fut_get_ptr( space, zip_size, node_addr, RW_X_LATCH, &mtr) @@ -4147,7 +4137,8 @@ fsp_page_is_free_func( ut_ad(mtr); - mtr_x_lock_func(fil_space_get_latch(space, &flags), file, line, mtr); + mtr_x_space_lock_func(fil_space_get_latch(space, &flags), file, line, + mtr); ulint zip_size = fsp_flags_get_zip_size(flags); xdes_t* descr = xdes_get_descriptor(space, zip_size, page_no, mtr); diff --git a/storage/xtradb/ibuf/ibuf0ibuf.cc b/storage/xtradb/ibuf/ibuf0ibuf.cc index cd65ea15729..6f11daa7363 100644 --- a/storage/xtradb/ibuf/ibuf0ibuf.cc +++ b/storage/xtradb/ibuf/ibuf0ibuf.cc @@ -588,7 +588,7 @@ ibuf_init_at_db_start(void) mutex_enter(&ibuf_mutex); - mtr_x_lock(fil_space_get_latch(IBUF_SPACE_ID, NULL), &mtr); + mtr_x_space_lock(fil_space_get_latch(IBUF_SPACE_ID, NULL), &mtr); header_page = ibuf_header_page_get(&mtr); @@ -2139,7 +2139,7 @@ ibuf_add_free_page(void) /* Acquire the fsp latch before the ibuf header, obeying the latching order */ - mtr_x_lock(fil_space_get_latch(IBUF_SPACE_ID, &flags), &mtr); + mtr_x_space_lock(fil_space_get_latch(IBUF_SPACE_ID, &flags), &mtr); zip_size = fsp_flags_get_zip_size(flags); header_page = ibuf_header_page_get(&mtr); @@ -2223,7 +2223,7 @@ ibuf_remove_free_page(void) /* Acquire the fsp latch before the ibuf header, obeying the latching order */ - mtr_x_lock(fil_space_get_latch(IBUF_SPACE_ID, &flags), &mtr); + mtr_x_space_lock(fil_space_get_latch(IBUF_SPACE_ID, &flags), &mtr); zip_size = fsp_flags_get_zip_size(flags); header_page = ibuf_header_page_get(&mtr); diff --git a/storage/xtradb/include/fil0fil.h b/storage/xtradb/include/fil0fil.h index 8831ea2e8cd..6a823e131ac 100644 --- a/storage/xtradb/include/fil0fil.h +++ b/storage/xtradb/include/fil0fil.h @@ -300,6 +300,8 @@ struct fil_space_t { /*!< recovered tablespace size in pages; 0 if no size change was read from the redo log, or if the size change was implemented */ + /** the committed size of the tablespace in pages */ + ulint committed_size; ulint flags; /*!< FSP_SPACE_FLAGS and FSP_FLAGS_MEM_ flags; see fsp0fsp.h, fsp_flags_is_valid(), @@ -364,6 +366,15 @@ struct fil_space_t { { return stop_new_ops; } + + /** Clamp a page number for batched I/O, such as read-ahead. + @param offset page number limit + @return offset clamped to the tablespace size */ + ulint max_page_number_for_io(ulint offset) const + { + const ulint limit= committed_size; + return limit > offset ? offset : limit; + } }; /** Value of fil_space_t::magic_n */ diff --git a/storage/xtradb/include/mtr0mtr.h b/storage/xtradb/include/mtr0mtr.h index 2d3da4d2a25..7d115eed5fd 100644 --- a/storage/xtradb/include/mtr0mtr.h +++ b/storage/xtradb/include/mtr0mtr.h @@ -2,6 +2,7 @@ Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 2012, Facebook Inc. +Copyright (c) 2013, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -57,6 +58,7 @@ first 3 values must be RW_S_LATCH, RW_X_LATCH, RW_NO_LATCH */ #endif /* UNIV_DEBUG */ #define MTR_MEMO_S_LOCK 55 #define MTR_MEMO_X_LOCK 56 +#define MTR_MEMO_SPACE_X_LOCK 57 /** @name Log item types The log items are declared 'byte' so that the compiler can warn if val @@ -293,6 +295,8 @@ This macro locks an rw-lock in s-mode. */ This macro locks an rw-lock in x-mode. */ #define mtr_x_lock(B, MTR) mtr_x_lock_func((B), __FILE__, __LINE__,\ (MTR)) +#define mtr_x_space_lock(B, MTR) mtr_x_space_lock_func(B, __FILE__, __LINE__,\ + MTR) /*********************************************************************//** NOTE! Use the macro above! Locks a lock in s-mode. */ @@ -315,6 +319,14 @@ mtr_x_lock_func( const char* file, /*!< in: file name */ ulint line, /*!< in: line number */ mtr_t* mtr); /*!< in: mtr */ + +/** Acquire exclusive tablespace latch. +@param lock fil_space_t::latch +@param file source code file name of the caller +@param line source code line number of the caller +@param mtr mini-transaction */ +inline void mtr_x_space_lock_func(prio_rw_lock_t *lock, + const char *file, ulint line, mtr_t *mtr); #endif /* !UNIV_HOTBACKUP */ /***************************************************//** diff --git a/storage/xtradb/include/mtr0mtr.ic b/storage/xtradb/include/mtr0mtr.ic index a44728463ae..0aea0994267 100644 --- a/storage/xtradb/include/mtr0mtr.ic +++ b/storage/xtradb/include/mtr0mtr.ic @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -78,7 +79,7 @@ mtr_memo_push( ut_ad(object); ut_ad(type >= MTR_MEMO_PAGE_S_FIX); - ut_ad(type <= MTR_MEMO_X_LOCK); + ut_ad(type <= MTR_MEMO_SPACE_X_LOCK); ut_ad(mtr); ut_ad(mtr->magic_n == MTR_MAGIC_N); ut_ad(mtr->state == MTR_ACTIVE); @@ -293,4 +294,16 @@ mtr_x_lock_func( mtr_memo_push(mtr, lock, MTR_MEMO_X_LOCK); } + +/** Acquire exclusive tablespace latch. +@param lock fil_space_t::latch +@param file source code file name of the caller +@param line source code line number of the caller +@param mtr mini-transaction */ +inline void mtr_x_space_lock_func(prio_rw_lock_t *lock, + const char *file, ulint line, mtr_t *mtr) +{ + rw_lock_x_lock_inline(lock, 0, file, line); + mtr_memo_push(mtr, lock, MTR_MEMO_SPACE_X_LOCK); +} #endif /* !UNIV_HOTBACKUP */ diff --git a/storage/xtradb/mtr/mtr0mtr.cc b/storage/xtradb/mtr/mtr0mtr.cc index 77af6e9eb60..a04f9cc84a3 100644 --- a/storage/xtradb/mtr/mtr0mtr.cc +++ b/storage/xtradb/mtr/mtr0mtr.cc @@ -1,6 +1,7 @@ /***************************************************************************** Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. +Copyright (c) 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -88,6 +89,16 @@ mtr_memo_slot_release_func( case MTR_MEMO_X_LOCK: rw_lock_x_unlock((prio_rw_lock_t*) object); break; + case MTR_MEMO_SPACE_X_LOCK: + { + fil_space_t* space = reinterpret_cast( + static_cast(object) + - reinterpret_cast( + &static_cast(0)->latch)); + space->committed_size = space->size; + rw_lock_x_unlock(&space->latch); + } + break; #ifdef UNIV_DEBUG default: ut_ad(slot->type == MTR_MEMO_MODIFY); diff --git a/storage/xtradb/srv/srv0start.cc b/storage/xtradb/srv/srv0start.cc index 153599391dc..b61a8349b07 100644 --- a/storage/xtradb/srv/srv0start.cc +++ b/storage/xtradb/srv/srv0start.cc @@ -3,7 +3,7 @@ Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. Copyright (c) 2008, Google Inc. Copyright (c) 2009, Percona Inc. -Copyright (c) 2013, 2019, MariaDB Corporation. +Copyright (c) 2013, 2020, MariaDB Corporation. Portions of this file contain modifications contributed and copyrighted by Google, Inc. Those modifications are gratefully acknowledged and are described @@ -1240,6 +1240,10 @@ check_first_page: } } + if (fil_space_t* s = fil_space_get(0)) { + s->committed_size = s->size; + } + return(DB_SUCCESS); } @@ -1408,6 +1412,10 @@ srv_undo_tablespace_open( if (fil_node_create(name, (ulint) n_pages, space, FALSE)) { err = DB_SUCCESS; } + + if (fil_space_t* s = fil_space_get(space)) { + s->committed_size = n_pages; + } } return(err); diff --git a/storage/xtradb/trx/trx0rseg.cc b/storage/xtradb/trx/trx0rseg.cc index 1d0eb6d29fd..8ce6fb6729f 100644 --- a/storage/xtradb/trx/trx0rseg.cc +++ b/storage/xtradb/trx/trx0rseg.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, MariaDB Corporation. +Copyright (c) 2017, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -65,7 +65,7 @@ trx_rseg_header_create( ut_ad(mtr); ut_ad(mtr_memo_contains(mtr, fil_space_get_latch(space, NULL), - MTR_MEMO_X_LOCK)); + MTR_MEMO_SPACE_X_LOCK)); /* Allocate a new file segment for the rollback segment */ block = fseg_create(space, 0, TRX_RSEG + TRX_RSEG_FSEG_HEADER, mtr); @@ -312,7 +312,7 @@ trx_rseg_create(ulint space) /* To obey the latching order, acquire the file space x-latch before the trx_sys->mutex. */ - mtr_x_lock(fil_space_get_latch(space, NULL), &mtr); + mtr_x_space_lock(fil_space_get_latch(space, NULL), &mtr); slot_no = trx_sysf_rseg_find_free(&mtr); diff --git a/storage/xtradb/trx/trx0sys.cc b/storage/xtradb/trx/trx0sys.cc index fcdce291cf0..94a79a1f944 100644 --- a/storage/xtradb/trx/trx0sys.cc +++ b/storage/xtradb/trx/trx0sys.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, 2018, MariaDB Corporation. +Copyright (c) 2017, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -554,7 +554,7 @@ trx_sysf_create( then enter the kernel: we must do it in this order to conform to the latching order rules. */ - mtr_x_lock(fil_space_get_latch(TRX_SYS_SPACE, NULL), mtr); + mtr_x_space_lock(fil_space_get_latch(TRX_SYS_SPACE, NULL), mtr); /* Create the trx sys file block in a new allocated file segment */ block = fseg_create(TRX_SYS_SPACE, 0, TRX_SYS + TRX_SYS_FSEG_HEADER, From c89366866bca2df46b0592719a1f6b6dabf470cb Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Fri, 17 Jul 2020 19:56:33 +0530 Subject: [PATCH 070/188] MDEV-22970 Possible corruption of page_compressed tables, or when scrubbing is enabled buf_read_recv_pages(): Ignore the page to read if it is already present in the freed ranges. store_freed_or_init_rec(): Store the ranges only if scrubbing is enabled or page compressed tablespace. recv_init_crash_recovery_space(): Add the freed range only when scrubbing or page compressed tablespace. range_set::contains(): Search the value is present in ranges. range_set::remove_if_exists(): Remove the value if exist in ranges. mtr_t::init(): Handles the scenario that mini-transaction may allocate a page that had just been freed. recv_sys_t::parse(): Note down the FREE and INIT redo log irrespective of STORE value. Removed innodb_tablespaces_scrubbing from test case --- .../information_schema_all_engines-master.opt | 1 - mysql-test/suite/innodb/disabled.def | 1 - .../innodb/t/innodb_skip_innodb_is_tables.opt | 2 -- storage/innobase/buf/buf0buf.cc | 5 --- storage/innobase/buf/buf0rea.cc | 7 ++++ storage/innobase/handler/i_s.h | 1 - storage/innobase/include/fil0fil.h | 32 ++++++++++++++++++- storage/innobase/include/mtr0log.h | 12 ++++++- storage/innobase/log/log0recv.cc | 16 ++++++---- 9 files changed, 58 insertions(+), 19 deletions(-) diff --git a/mysql-test/main/information_schema_all_engines-master.opt b/mysql-test/main/information_schema_all_engines-master.opt index 43411c5033a..7ba5aa5b8b3 100644 --- a/mysql-test/main/information_schema_all_engines-master.opt +++ b/mysql-test/main/information_schema_all_engines-master.opt @@ -15,4 +15,3 @@ --loose-innodb-sys-tablestats --loose-innodb-mutexes --loose-innodb-tablespaces-encryption ---loose-innodb-tablespaces-scrubbing diff --git a/mysql-test/suite/innodb/disabled.def b/mysql-test/suite/innodb/disabled.def index fd5a8ab6d39..4484417afce 100644 --- a/mysql-test/suite/innodb/disabled.def +++ b/mysql-test/suite/innodb/disabled.def @@ -12,4 +12,3 @@ create-index-debug : MDEV-13680 InnoDB may crash when btr_page_alloc() fails innodb_force_recovery_rollback : MDEV-22889 InnoDB occasionally breaks ACID -innodb_scrub : MDEV-8139/MDEV-22970 Fix scrubbing diff --git a/mysql-test/suite/innodb/t/innodb_skip_innodb_is_tables.opt b/mysql-test/suite/innodb/t/innodb_skip_innodb_is_tables.opt index c8a96d2fe93..513791a0a88 100644 --- a/mysql-test/suite/innodb/t/innodb_skip_innodb_is_tables.opt +++ b/mysql-test/suite/innodb/t/innodb_skip_innodb_is_tables.opt @@ -59,9 +59,7 @@ --loose-innodb_sys_datafiles --loose-innodb_changed_pages --loose-innodb_tablespaces_encryption ---loose-innodb_tablespaces_scrubbing --loose-innodb_mutexes --loose-innodb_sys_semaphore_waits ---loose-innodb_tablespaces_scrubbing --loose-innodb_mutexes --loose-innodb_sys_semaphore_waits diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index cf18f492634..d55c9e996f2 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -2656,14 +2656,9 @@ void buf_page_free(const page_id_t page_id, buf_block_t *block= reinterpret_cast (buf_pool.page_hash_get_low(page_id, fold)); -#if 0 /* FIXME: MDEV-22970 Potential corruption */ - /* TODO: Find out how and when a freed page can be marked - allocated in the same mini-transaction. At least it seems to - happen during a pessimistic insert operation. */ /* TODO: try to all this part of mtr_t::free() */ if (srv_immediate_scrub_data_uncompressed || mtr->is_page_compressed()) mtr->add_freed_offset(page_id); -#endif if (!block || block->page.state() != BUF_BLOCK_FILE_PAGE) { diff --git a/storage/innobase/buf/buf0rea.cc b/storage/innobase/buf/buf0rea.cc index 19f99333b75..ed36873837e 100644 --- a/storage/innobase/buf/buf0rea.cc +++ b/storage/innobase/buf/buf0rea.cc @@ -746,6 +746,13 @@ buf_read_recv_pages( const ulint zip_size = space->zip_size(); for (ulint i = 0; i < n_stored; i++) { + + /* Ignore if the page already present in freed ranges. */ + if (space->freed_ranges.contains( + static_cast(page_nos[i]))) { + continue; + } + const page_id_t cur_page_id(space_id, page_nos[i]); ulint limit = 0; diff --git a/storage/innobase/handler/i_s.h b/storage/innobase/handler/i_s.h index 781041bdfd4..385c249d9d5 100644 --- a/storage/innobase/handler/i_s.h +++ b/storage/innobase/handler/i_s.h @@ -63,7 +63,6 @@ extern struct st_maria_plugin i_s_innodb_sys_datafiles; extern struct st_maria_plugin i_s_innodb_mutexes; extern struct st_maria_plugin i_s_innodb_sys_virtual; extern struct st_maria_plugin i_s_innodb_tablespaces_encryption; -extern struct st_maria_plugin i_s_innodb_tablespaces_scrubbing; extern struct st_maria_plugin i_s_innodb_sys_semaphore_waits; /** The latest successfully looked up innodb_fts_aux_table */ diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index 24d587519eb..a29f1e9fe4c 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -132,6 +132,20 @@ class range_set { private: range_set_t ranges; + + range_set_t::iterator find(uint32_t value) const + { + auto r_offset= ranges.lower_bound({value, value}); + const auto r_end= ranges.end(); + if (r_offset != r_end); + else if (empty()) + return r_end; + else + r_offset= std::prev(r_end); + if (r_offset->first <= value && r_offset->last >= value) + return r_offset; + return r_end; + } public: /** Merge the current range with previous range. @param[in] range range to be merged @@ -194,7 +208,7 @@ public: @param[in] value Value to be removed. */ void remove_value(uint32_t value) { - if (ranges.empty()) + if (empty()) return; range_t new_range {value, value}; range_set_t::iterator range= ranges.lower_bound(new_range); @@ -273,6 +287,22 @@ new_range: add_range(new_range); } + bool remove_if_exists(uint32_t value) + { + auto r_offset= find(value); + if (r_offset != ranges.end()) + { + remove_within_range(r_offset, value); + return true; + } + return false; + } + + bool contains(uint32_t value) const + { + return find(value) != ranges.end(); + } + ulint size() { return ranges.size(); } void clear() { ranges.clear(); } bool empty() const { return ranges.empty(); } diff --git a/storage/innobase/include/mtr0log.h b/storage/innobase/include/mtr0log.h index 926411a6f97..ee611f6f2ee 100644 --- a/storage/innobase/include/mtr0log.h +++ b/storage/innobase/include/mtr0log.h @@ -511,7 +511,17 @@ inline void mtr_t::memcpy(const buf_block_t &b, void *dest, const void *str, @param[in,out] b buffer page */ inline void mtr_t::init(buf_block_t *b) { - ut_ad(!m_freed_pages); + if (UNIV_LIKELY_NULL(m_freed_pages)) + { + ut_ad(m_user_space->id == b->page.id().space()); + if (m_freed_pages->remove_if_exists(b->page.id().page_no()) && + m_freed_pages->empty()) + { + delete m_freed_pages; + m_freed_pages= nullptr; + } + } + b->page.status= buf_page_t::INIT_ON_FLUSH; if (m_log_mode != MTR_LOG_ALL) diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index 7afac5c7d54..388f80cf6e2 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -1779,7 +1779,6 @@ append: log_phys_t(start_lsn, lsn, l, len)); } -#if 0 /* FIXME: MDEV-22970 Potential corruption */ /** Store/remove the freed pages in fil_name_t of recv_spaces. @param[in] page_id freed or init page_id @param[in] freed TRUE if page is freed */ @@ -1789,6 +1788,8 @@ static void store_freed_or_init_rec(page_id_t page_id, bool freed) uint32_t page_no= page_id.page_no(); if (is_predefined_tablespace(space_id)) { + if (!srv_immediate_scrub_data_uncompressed) + return; fil_space_t *space; if (space_id == TRX_SYS_SPACE) space= fil_system.sys_space; @@ -1808,7 +1809,6 @@ static void store_freed_or_init_rec(page_id_t page_id, bool freed) i->second.remove_freed_page(page_no); } } -#endif /** Parse and register one mini-transaction in log_t::FORMAT_10_5. @param checkpoint_lsn the log sequence number of the latest checkpoint @@ -2008,9 +2008,7 @@ same_page: case INIT_PAGE: last_offset= FIL_PAGE_TYPE; free_or_init_page: -#if 0 /* FIXME: MDEV-22970 Potential corruption */ store_freed_or_init_rec(id, (b & 0x70) == FREE_PAGE); -#endif if (UNIV_UNLIKELY(rlen != 0)) goto record_corrupted; break; @@ -2135,12 +2133,12 @@ same_page: case STORE_NO: if (!is_init) continue; + mlog_init.add(id, start_lsn); map::iterator i= pages.find(id); if (i == pages.end()) continue; i->second.log.clear(); pages.erase(i); - mlog_init.add(id, start_lsn); } } #if 1 /* MDEV-14425 FIXME: this must be in the checkpoint file only! */ @@ -3291,9 +3289,13 @@ recv_init_crash_recovery_spaces(bool rescan, bool& missing_tablespace) /* Add the freed page ranges in the respective tablespace */ - if (!rs.second.freed_ranges.empty()) - rs.second.space->add_free_ranges( + if (!rs.second.freed_ranges.empty() + && (srv_immediate_scrub_data_uncompressed + || rs.second.space->is_compressed())) { + + rs.second.space->add_free_ranges( std::move(rs.second.freed_ranges)); + } } else if (rs.second.name == "") { ib::error() << "Missing FILE_CREATE, FILE_DELETE" " or FILE_MODIFY before FILE_CHECKPOINT" From af57c658090cc52aa20e8cde7d24a563d73ff886 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Mon, 20 Jul 2020 18:28:07 +0300 Subject: [PATCH 071/188] MDEV-22061 InnoDB: Assertion of missing row in sec index row_start upon REPLACE on a system-versioned table make_versioned_helper() appended new update field unconditionally while it should check if this field already exists in update vector. Misc renames to conform versioning prefix. vers_update_fields() name conforms with sql layer TABLE::vers_update_fields(). --- mysql-test/suite/versioning/r/update.result | 16 ++++++++ mysql-test/suite/versioning/t/update.test | 20 ++++++++++ storage/innobase/include/row0upd.h | 18 ++++----- storage/innobase/row/row0mysql.cc | 16 ++++---- storage/innobase/row/row0upd.cc | 41 ++++++++++++++------- 5 files changed, 80 insertions(+), 31 deletions(-) diff --git a/mysql-test/suite/versioning/r/update.result b/mysql-test/suite/versioning/r/update.result index f7901d11d2a..512e39355e2 100644 --- a/mysql-test/suite/versioning/r/update.result +++ b/mysql-test/suite/versioning/r/update.result @@ -319,3 +319,19 @@ create or replace table t1 (f point, key(f)) with system versioning engine=myisa update t1 set f = null where f = 'foo'; ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field drop table t1; +# +# MDEV-22061 InnoDB: Assertion of missing row in sec index row_start upon REPLACE on a system-versioned table +# +create or replace table t1 ( +a int, +b int, +row_start bigint(20) unsigned generated always as row start, +row_end bigint(20) unsigned generated always as row end, +unique key (b,row_end), +key (row_start), +period for system_time (row_start,row_end) +) engine=innodb with system versioning; +insert into t1 (a, b) values (1, 2); +replace into t1 (a, b) values (3, 2); +replace into t1 (a, b) values (4, 2); +drop table t1; diff --git a/mysql-test/suite/versioning/t/update.test b/mysql-test/suite/versioning/t/update.test index 5b0a9eb5c42..d2af2cac80c 100644 --- a/mysql-test/suite/versioning/t/update.test +++ b/mysql-test/suite/versioning/t/update.test @@ -245,4 +245,24 @@ update t1 set f = null where f = 'foo'; # cleanup drop table t1; +--echo # +--echo # MDEV-22061 InnoDB: Assertion of missing row in sec index row_start upon REPLACE on a system-versioned table +--echo # +create or replace table t1 ( + a int, + b int, + row_start bigint(20) unsigned generated always as row start, + row_end bigint(20) unsigned generated always as row end, + unique key (b,row_end), + key (row_start), + period for system_time (row_start,row_end) +) engine=innodb with system versioning; + +insert into t1 (a, b) values (1, 2); +replace into t1 (a, b) values (3, 2); +replace into t1 (a, b) values (4, 2); + +# cleanup +drop table t1; + source suite/versioning/common_finish.inc; diff --git a/storage/innobase/include/row0upd.h b/storage/innobase/include/row0upd.h index b34acfd8dc1..de97b379d9e 100644 --- a/storage/innobase/include/row0upd.h +++ b/storage/innobase/include/row0upd.h @@ -587,25 +587,25 @@ private: make_versioned_delete(). @param[in] trx transaction @param[in] vers_sys_idx table->row_start or table->row_end */ - void make_versioned_helper(const trx_t* trx, ulint idx); + void vers_update_fields(const trx_t *trx, ulint idx); public: /** Also set row_start = CURRENT_TIMESTAMP/trx->id @param[in] trx transaction */ - void make_versioned_update(const trx_t* trx) - { - make_versioned_helper(trx, table->vers_start); - } + void vers_make_update(const trx_t *trx) + { + vers_update_fields(trx, table->vers_start); + } /** Only set row_end = CURRENT_TIMESTAMP/trx->id. Do not touch other fields at all. @param[in] trx transaction */ - void make_versioned_delete(const trx_t* trx) - { + void vers_make_delete(const trx_t *trx) + { update->n_fields = 0; is_delete = VERSIONED_DELETE; - make_versioned_helper(trx, table->vers_end); - } + vers_update_fields(trx, table->vers_end); + } }; #define UPD_NODE_MAGIC_N 1579975 diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index b2256e9905d..d2fc63a5f38 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -1871,10 +1871,10 @@ row_update_for_mysql(row_prebuilt_t* prebuilt) if (prebuilt->versioned_write) { if (node->is_delete == VERSIONED_DELETE) { - node->make_versioned_delete(trx); - } else if (node->update->affects_versioned()) { - node->make_versioned_update(trx); - } + node->vers_make_delete(trx); + } else if (node->update->affects_versioned()) { + node->vers_make_update(trx); + } } for (;;) { @@ -2239,14 +2239,14 @@ row_update_cascade_for_mysql( if (table->versioned()) { if (node->is_delete == PLAIN_DELETE) { - node->make_versioned_delete(trx); - } else if (node->update->affects_versioned()) { + node->vers_make_delete(trx); + } else if (node->update->affects_versioned()) { dberr_t err = row_update_vers_insert(thr, node); if (err != DB_SUCCESS) { return err; } - node->make_versioned_update(trx); - } + node->vers_make_update(trx); + } } for (;;) { diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index 0f700c77c36..8ce47e74a1c 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.cc @@ -3486,32 +3486,45 @@ Supposed to be called only by make_versioned_update() and make_versioned_delete(). @param[in] trx transaction @param[in] vers_sys_idx table->row_start or table->row_end */ -void upd_node_t::make_versioned_helper(const trx_t* trx, ulint idx) +void upd_node_t::vers_update_fields(const trx_t *trx, ulint idx) { ut_ad(in_mysql_interface); // otherwise needs to recalculate // node->cmpl_info ut_ad(idx == table->vers_start || idx == table->vers_end); dict_index_t* clust_index = dict_table_get_first_index(table); + const dict_col_t *col= dict_table_get_nth_col(table, idx); + ulint field_no= dict_col_get_clust_pos(col, clust_index); + upd_field_t *ufield; - /* row_create_update_node_for_mysql() pre-allocated this much. + for (ulint i= 0; i < update->n_fields; ++i) + { + if (update->fields[i].field_no == field_no) + { + ufield= &update->fields[i]; + goto skip_append; + } + } + + /* row_create_update_node_for_mysql() pre-allocated this much. At least one PK column always remains unchanged. */ ut_ad(update->n_fields < ulint(table->n_cols + table->n_v_cols)); update->n_fields++; - upd_field_t* ufield = upd_get_nth_field(update, update->n_fields - 1); - const dict_col_t* col = dict_table_get_nth_col(table, idx); + ufield= upd_get_nth_field(update, update->n_fields - 1); + upd_field_set_field_no(ufield, field_no, clust_index); - upd_field_set_field_no(ufield, dict_col_get_clust_pos(col, clust_index), - clust_index); +skip_append: + char *where= reinterpret_cast(update->vers_sys_value); + if (col->vers_native()) + { + mach_write_to_8(where, trx->id); + } + else + { + thd_get_query_start_data(trx->mysql_thd, where); + } - char* where = reinterpret_cast(update->vers_sys_value); - if (col->vers_native()) { - mach_write_to_8(where, trx->id); - } else { - thd_get_query_start_data(trx->mysql_thd, where); - } - - dfield_set_data(&ufield->new_val, update->vers_sys_value, col->len); + dfield_set_data(&ufield->new_val, update->vers_sys_value, col->len); } From af83ed9f0ed10496c11bea6b054f4d86562e2349 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Mon, 20 Jul 2020 18:28:08 +0300 Subject: [PATCH 072/188] MDEV-20661 Virtual fields are not recalculated on system fields value assignment Fix stale virtual field value in 4 cases: when virtual field depends on row_start/row_end in timestamp/trx_id versioned table. row_start dep is recalculated in vers_update_fields() (SQL and InnoDB layer). row_end dep is recalculated on history row insert. --- mysql-test/suite/versioning/r/update.result | 15 +++++ mysql-test/suite/versioning/t/update.test | 21 +++++++ sql/sql_insert.cc | 4 ++ sql/table.cc | 25 +++----- storage/innobase/handler/ha_innodb.cc | 67 +++++++++++++++++++++ storage/innobase/include/row0ins.h | 3 + storage/innobase/include/row0upd.h | 27 ++++++++- storage/innobase/row/row0mysql.cc | 42 +------------ storage/innobase/row/row0upd.cc | 22 ++++++- 9 files changed, 169 insertions(+), 57 deletions(-) diff --git a/mysql-test/suite/versioning/r/update.result b/mysql-test/suite/versioning/r/update.result index 512e39355e2..cd26c341113 100644 --- a/mysql-test/suite/versioning/r/update.result +++ b/mysql-test/suite/versioning/r/update.result @@ -335,3 +335,18 @@ insert into t1 (a, b) values (1, 2); replace into t1 (a, b) values (3, 2); replace into t1 (a, b) values (4, 2); drop table t1; +# +# MDEV-20661 Virtual fields are not recalculated on system fields value assignment +# +create table t1 ( +a int, +row_start SYS_DATATYPE as row start invisible, +row_end SYS_DATATYPE as row end invisible, +period for system_time (row_start, row_end), +v1 bigint unsigned as (a ^ row_start) unique, +v2 bigint unsigned as (a ^ row_end) unique +) engine=innodb with system versioning; +insert into t1 (a) values (1), (2); +update ignore t1 set a= 3; +delete history from t1; +drop table t1; diff --git a/mysql-test/suite/versioning/t/update.test b/mysql-test/suite/versioning/t/update.test index d2af2cac80c..06f81ea9064 100644 --- a/mysql-test/suite/versioning/t/update.test +++ b/mysql-test/suite/versioning/t/update.test @@ -265,4 +265,25 @@ replace into t1 (a, b) values (4, 2); # cleanup drop table t1; +--echo # +--echo # MDEV-20661 Virtual fields are not recalculated on system fields value assignment +--echo # + +replace_result $sys_datatype_expl SYS_DATATYPE; +eval create table t1 ( + a int, + row_start $sys_datatype_expl as row start invisible, + row_end $sys_datatype_expl as row end invisible, + period for system_time (row_start, row_end), + v1 bigint unsigned as (a ^ row_start) unique, + v2 bigint unsigned as (a ^ row_end) unique +) engine=innodb with system versioning; + +insert into t1 (a) values (1), (2); +update ignore t1 set a= 3; +delete history from t1; + +# cleanup +drop table t1; + source suite/versioning/common_finish.inc; diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index bbd639b91d3..a24cb61449b 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -1658,6 +1658,10 @@ int vers_insert_history_row(TABLE *table) if (row_start->cmp(row_start->ptr, row_end->ptr) >= 0) return 0; + if (table->vfield && + table->update_virtual_fields(table->file, VCOL_UPDATE_FOR_READ)) + return HA_ERR_GENERIC; + return table->file->ha_write_row(table->record[0]); } diff --git a/sql/table.cc b/sql/table.cc index 7aa7abfa006..84c827ec70b 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -8078,29 +8078,24 @@ void TABLE::vers_update_fields() bitmap_set_bit(write_set, vers_start_field()->field_index); bitmap_set_bit(write_set, vers_end_field()->field_index); - if (versioned(VERS_TIMESTAMP)) + if (!vers_write) { - if (!vers_write) - { - file->column_bitmaps_signal(); - return; - } - if (vers_start_field()->store_timestamp(in_use->query_start(), - in_use->query_start_sec_part())) - DBUG_ASSERT(0); + file->column_bitmaps_signal(); + return; } - else + + if (versioned(VERS_TIMESTAMP) && + vers_start_field()->store_timestamp(in_use->query_start(), + in_use->query_start_sec_part())) { - if (!vers_write) - { - file->column_bitmaps_signal(); - return; - } + DBUG_ASSERT(0); } vers_end_field()->set_max(); bitmap_set_bit(read_set, vers_end_field()->field_index); file->column_bitmaps_signal(); + if (vfield) + update_virtual_fields(file, VCOL_UPDATE_FOR_READ); } diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 7234e73f28c..055d311a119 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -21814,3 +21814,70 @@ ib_push_frm_error( break; } } + +/** Writes 8 bytes to nth tuple field +@param[in] tuple where to write +@param[in] nth index in tuple +@param[in] data what to write +@param[in] buf field data buffer */ +static void set_tuple_col_8(dtuple_t *tuple, int col, uint64_t data, byte *buf) +{ + dfield_t *dfield= dtuple_get_nth_field(tuple, col); + ut_ad(dfield->type.len == 8); + if (dfield->len == UNIV_SQL_NULL) + { + dfield_set_data(dfield, buf, 8); + } + ut_ad(dfield->len == dfield->type.len && dfield->data); + mach_write_to_8(dfield->data, data); +} + +void ins_node_t::vers_update_end(row_prebuilt_t *prebuilt, bool history_row) +{ + ut_ad(prebuilt->ins_node == this); + trx_t *trx= prebuilt->trx; +#ifndef DBUG_OFF + ut_ad(table->vers_start != table->vers_end); + const mysql_row_templ_t *t= prebuilt->get_template_by_col(table->vers_end); + ut_ad(t); + ut_ad(t->mysql_col_len == 8); +#endif + + if (history_row) + { + set_tuple_col_8(row, table->vers_end, trx->id, vers_end_buf); + } + else /* ROW_INS_VERSIONED */ + { + set_tuple_col_8(row, table->vers_end, TRX_ID_MAX, vers_end_buf); +#ifndef DBUG_OFF + t= prebuilt->get_template_by_col(table->vers_start); + ut_ad(t); + ut_ad(t->mysql_col_len == 8); +#endif + set_tuple_col_8(row, table->vers_start, trx->id, vers_start_buf); + } + dict_index_t *clust_index= dict_table_get_first_index(table); + THD *thd= trx->mysql_thd; + TABLE *mysql_table= prebuilt->m_mysql_table; + mem_heap_t *local_heap= NULL; + for (ulint col_no= 0; col_no < dict_table_get_n_v_cols(table); col_no++) + { + + const dict_v_col_t *v_col= dict_table_get_nth_v_col(table, col_no); + for (ulint i= 0; i < unsigned(v_col->num_base); i++) + { + dict_col_t *base_col= v_col->base_col[i]; + if (base_col->ind == table->vers_end) + { + innobase_get_computed_value(row, v_col, clust_index, &local_heap, + table->heap, NULL, thd, mysql_table, + mysql_table->record[0], NULL, NULL, NULL); + } + } + } + if (local_heap) + { + mem_heap_free(local_heap); + } +} diff --git a/storage/innobase/include/row0ins.h b/storage/innobase/include/row0ins.h index 95f4388902d..34427dc6dc7 100644 --- a/storage/innobase/include/row0ins.h +++ b/storage/innobase/include/row0ins.h @@ -163,6 +163,8 @@ row_ins_step( #define INS_NODE_INSERT_ENTRIES 3 /* index entries should be built and inserted */ +struct row_prebuilt_t; + /** Insert node structure */ struct ins_node_t { @@ -203,6 +205,7 @@ struct ins_node_t entry_list and sys fields are stored here; if this is NULL, entry list should be created and buffers for sys fields in row allocated */ + void vers_update_end(row_prebuilt_t *prebuilt, bool history_row); }; /** Create an insert object. diff --git a/storage/innobase/include/row0upd.h b/storage/innobase/include/row0upd.h index de97b379d9e..ea9c2db9de0 100644 --- a/storage/innobase/include/row0upd.h +++ b/storage/innobase/include/row0upd.h @@ -454,7 +454,32 @@ struct upd_t{ fields[n_fields++] = field; } - /** Determine if the given field_no is modified. + void remove_element(ulint i) + { + ut_ad(n_fields > 0); + ut_ad(i < n_fields); + while (i < n_fields - 1) + { + fields[i]= fields[i + 1]; + i++; + } + n_fields--; + } + + bool remove(const ulint field_no) + { + for (ulint i= 0; i < n_fields; ++i) + { + if (field_no == fields[i].field_no) + { + remove_element(i); + return true; + } + } + return false; + } + + /** Determine if the given field_no is modified. @return true if modified, false otherwise. */ bool is_modified(const ulint field_no) const { diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index d2fc63a5f38..15538ff9922 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -1331,23 +1331,6 @@ row_mysql_get_table_status( return(err); } -/** Writes 8 bytes to nth tuple field -@param[in] tuple where to write -@param[in] nth index in tuple -@param[in] data what to write -@param[in] buf field data buffer */ -static -void -set_tuple_col_8(dtuple_t* tuple, int col, uint64_t data, byte* buf) { - dfield_t* dfield = dtuple_get_nth_field(tuple, col); - ut_ad(dfield->type.len == 8); - if (dfield->len == UNIV_SQL_NULL) { - dfield_set_data(dfield, buf, 8); - } - ut_ad(dfield->len == dfield->type.len && dfield->data); - mach_write_to_8(dfield->data, data); -} - /** Does an insert for MySQL. @param[in] mysql_rec row in the MySQL format @param[in,out] prebuilt prebuilt struct in MySQL handle @@ -1415,29 +1398,8 @@ row_insert_for_mysql( &blob_heap); if (ins_mode != ROW_INS_NORMAL) { -#ifndef DBUG_OFF - ut_ad(table->vers_start != table->vers_end); - const mysql_row_templ_t* t - = prebuilt->get_template_by_col(table->vers_end); - ut_ad(t); - ut_ad(t->mysql_col_len == 8); -#endif - - if (ins_mode == ROW_INS_HISTORICAL) { - set_tuple_col_8(node->row, table->vers_end, trx->id, - node->vers_end_buf); - } else /* ROW_INS_VERSIONED */ { - set_tuple_col_8(node->row, table->vers_end, TRX_ID_MAX, - node->vers_end_buf); -#ifndef DBUG_OFF - t = prebuilt->get_template_by_col(table->vers_start); - ut_ad(t); - ut_ad(t->mysql_col_len == 8); -#endif - set_tuple_col_8(node->row, table->vers_start, trx->id, - node->vers_start_buf); - } - } + node->vers_update_end(prebuilt, ins_mode == ROW_INS_HISTORICAL); + } savept = trx_savept_take(trx); diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index 8ce47e74a1c..f2eaef1fd0a 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.cc @@ -3526,5 +3526,25 @@ skip_append: } dfield_set_data(&ufield->new_val, update->vers_sys_value, col->len); -} + for (ulint col_no= 0; col_no < dict_table_get_n_v_cols(table); col_no++) + { + + const dict_v_col_t *v_col= dict_table_get_nth_v_col(table, col_no); + if (!v_col->m_col.ord_part) + continue; + for (ulint i= 0; i < unsigned(v_col->num_base); i++) + { + dict_col_t *base_col= v_col->base_col[i]; + if (base_col->ind == col->ind) + { + /* Virtual column depends on system field value + which we updated above. Remove it from update + vector, so it is recalculated in + row_upd_store_v_row() (see !update branch). */ + update->remove(v_col->v_pos); + break; + } + } + } +} From c4d5b6b157b06fe22fd7e01967d7a0194c3686a2 Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Mon, 20 Jul 2020 13:10:22 +0300 Subject: [PATCH 073/188] MDEV-22899 Assertion `field->col->is_binary() || field->prefix_len % field->col->mbmaxlen == 0' failed in dict_index_add_to_cache is_part_of_a_key(): detect is TEXT field is a part of some key ha_innobase::can_convert_blob(): now correctly detect whether our blob is a part of some key. Previously the check didn't work in some cases. --- .../innodb/r/instant_alter_charset.result | 63 ++++++++++++++++ .../suite/innodb/t/instant_alter_charset.test | 73 +++++++++++++++++++ storage/innobase/handler/ha_innodb.cc | 62 +++++++++------- 3 files changed, 172 insertions(+), 26 deletions(-) diff --git a/mysql-test/suite/innodb/r/instant_alter_charset.result b/mysql-test/suite/innodb/r/instant_alter_charset.result index cbb49819bfe..9e7dab8f7b4 100644 --- a/mysql-test/suite/innodb/r/instant_alter_charset.result +++ b/mysql-test/suite/innodb/r/instant_alter_charset.result @@ -1929,3 +1929,66 @@ KEY a_idx(a(1)) INSERT INTO t VALUES (1, 'something in the air'); ALTER TABLE t MODIFY a text CHARSET utf8mb4; DROP TABLE t; +# +# MDEV-22899: Assertion `field->col->is_binary() || field->prefix_len % field->col->mbmaxlen == 0' failed in dict_index_add_to_cache +# +CREATE TABLE t1 ( +a text CHARACTER SET utf8 DEFAULT NULL, +KEY a_key (a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; +CREATE TABLE t1 ( +a text CHARACTER SET utf8 DEFAULT NULL, +b int, +KEY a_key (b, a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; +CREATE TABLE t1 ( +a char(200) CHARACTER SET utf8 DEFAULT NULL, +KEY a_key (a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; +CREATE TABLE t1 ( +a char(200) CHARACTER SET utf8 DEFAULT NULL, +b int, +KEY a_key (b, a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; +CREATE TABLE t1 ( +a varchar(200) CHARACTER SET utf8 DEFAULT NULL, +KEY a_key (a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; +CREATE TABLE t1 ( +a varchar(200) CHARACTER SET utf8 DEFAULT NULL, +b int, +KEY a_key (b, a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; +CREATE TABLE t1 ( +a varchar(2000) CHARACTER SET utf8 DEFAULT NULL, +KEY a_key (a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; +CREATE TABLE t1 ( +a varchar(2000) CHARACTER SET utf8 DEFAULT NULL, +b int, +KEY a_key (b, a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/instant_alter_charset.test b/mysql-test/suite/innodb/t/instant_alter_charset.test index 270db2d6462..b14c7861c25 100644 --- a/mysql-test/suite/innodb/t/instant_alter_charset.test +++ b/mysql-test/suite/innodb/t/instant_alter_charset.test @@ -730,3 +730,76 @@ INSERT INTO t VALUES (1, 'something in the air'); ALTER TABLE t MODIFY a text CHARSET utf8mb4; DROP TABLE t; + + +--echo # +--echo # MDEV-22899: Assertion `field->col->is_binary() || field->prefix_len % field->col->mbmaxlen == 0' failed in dict_index_add_to_cache +--echo # + +CREATE TABLE t1 ( + a text CHARACTER SET utf8 DEFAULT NULL, + KEY a_key (a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; + +CREATE TABLE t1 ( + a text CHARACTER SET utf8 DEFAULT NULL, + b int, + KEY a_key (b, a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; + +CREATE TABLE t1 ( + a char(200) CHARACTER SET utf8 DEFAULT NULL, + KEY a_key (a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; + +CREATE TABLE t1 ( + a char(200) CHARACTER SET utf8 DEFAULT NULL, + b int, + KEY a_key (b, a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; + +CREATE TABLE t1 ( + a varchar(200) CHARACTER SET utf8 DEFAULT NULL, + KEY a_key (a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; + +CREATE TABLE t1 ( + a varchar(200) CHARACTER SET utf8 DEFAULT NULL, + b int, + KEY a_key (b, a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; + +CREATE TABLE t1 ( + a varchar(2000) CHARACTER SET utf8 DEFAULT NULL, + KEY a_key (a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; + +CREATE TABLE t1 ( + a varchar(2000) CHARACTER SET utf8 DEFAULT NULL, + b int, + KEY a_key (b, a(1)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +INSERT INTO t1 VALUES (); +ALTER TABLE t1 MODIFY a text DEFAULT NULL; +DROP TABLE t1; diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 6d100576c20..1b3237459ba 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -21074,39 +21074,49 @@ ha_innobase::can_convert_varstring(const Field_varstring* field, return true; } -bool -ha_innobase::can_convert_blob(const Field_blob* field, - const Column_definition& new_type) const +static bool is_part_of_a_key(const Field_blob *field) { - if (new_type.type_handler() != field->type_handler()) { - return false; - } + const TABLE_SHARE *s= field->table->s; - if (!new_type.compression_method() != !field->compression_method()) { - return false; - } + for (uint i= 0; i < s->keys; i++) + { + const KEY &key= s->key_info[i]; + for (uint j= 0; j < key.user_defined_key_parts; j++) + { + const KEY_PART_INFO &info= key.key_part[j]; + if (info.field->field_index == field->field_index) + return true; + } + } - if (new_type.pack_length != field->pack_length()) { - return false; - } + return false; +} - if (new_type.charset != field->charset()) { - Charset field_cs(field->charset()); - if (!field_cs.encoding_allows_reinterpret_as( - new_type.charset)) { - return false; - } +bool ha_innobase::can_convert_blob(const Field_blob *field, + const Column_definition &new_type) const +{ + if (new_type.type_handler() != field->type_handler()) + return false; - if (!field_cs.eq_collation_specific_names(new_type.charset)) { - bool is_part_of_a_key - = !field->part_of_key.is_clear_all(); - return !is_part_of_a_key; - } + if (!new_type.compression_method() != !field->compression_method()) + return false; - return true; - } + if (new_type.pack_length != field->pack_length()) + return false; - return true; + if (new_type.charset != field->charset()) + { + Charset field_cs(field->charset()); + if (!field_cs.encoding_allows_reinterpret_as(new_type.charset)) + return false; + + if (!field_cs.eq_collation_specific_names(new_type.charset)) + return !is_part_of_a_key(field); + + return true; + } + + return true; } Compare_keys ha_innobase::compare_key_parts( From 5acd391e8b2d4d760ae7f96a59413c9ea247e9b1 Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Wed, 4 Sep 2019 04:29:03 +1000 Subject: [PATCH 074/188] MDEV-16039 Crash when selecting virtual columns generated using functions with DAYNAME() * Allocate items on thd->mem_root while refixing vcol exprs * Make vcol tree changes register and roll them back after the statement is executed. Explanation: Due to collation implementation specifics an Item tree could change while fixing. The tricky thing here is to make it on a proper arena. It's usually not a problem when a field is deterministic, however, makes a pain vice-versa, during allocation allocating. A non-deterministic field should be refixed on each statement, since it depends on the environment state. Changing the tree will be temporary and therefore it should be reverted after the statement execution. --- mysql-test/suite/gcol/r/gcol_bugfixes.result | 66 ++++++++++++++++++ mysql-test/suite/gcol/t/gcol_bugfixes.test | 70 ++++++++++++++++++++ sql/item.cc | 27 +------- sql/sql_base.cc | 43 +++++++----- sql/sql_class.cc | 4 +- sql/sql_class.h | 13 +++- sql/sql_parse.cc | 2 +- sql/sql_prepare.cc | 4 +- sql/table.cc | 16 ++++- sql/table.h | 1 + 10 files changed, 195 insertions(+), 51 deletions(-) diff --git a/mysql-test/suite/gcol/r/gcol_bugfixes.result b/mysql-test/suite/gcol/r/gcol_bugfixes.result index 9aff30aabc9..8eb7a9372b5 100644 --- a/mysql-test/suite/gcol/r/gcol_bugfixes.result +++ b/mysql-test/suite/gcol/r/gcol_bugfixes.result @@ -603,3 +603,69 @@ test gcol_t1 sidea NEVER NULL test gcol_t1 sideb NEVER NULL test gcol_t1 sidec VIRTUAL GENERATED ALWAYS sqrt(`sidea` * `sidea` + `sideb` * `sideb`) DROP TABLE gcol_t1; +# +# MDEV-16039 Crash when selecting virtual columns +# generated using functions with DAYNAME() +# +CREATE TABLE t1 ( +suppliersenttoday INT NOT NULL, +suppliercaptoday CHAR(10) AS (CONCAT('',DAYNAME('2020-02-05'))) +) COLLATE utf8_bin; +INSERT INTO t1 (suppliersenttoday) VALUES (0); +INSERT INTO t1 (suppliersenttoday) VALUES (0); +SELECT * FROM t1; +suppliersenttoday suppliercaptoday +0 Wednesday +0 Wednesday +PREPARE STMT FROM 'INSERT INTO t1 (suppliersenttoday) VALUES (1)'; +CREATE OR REPLACE TABLE t1 ( +suppliersenttoday INT NOT NULL, +suppliercaptoday CHAR(10) AS (CONCAT('',DAYNAME('2020-02-05'))) +) COLLATE utf8_bin; +EXECUTE STMT; +EXECUTE STMT; +SELECT * FROM t1; +suppliersenttoday suppliercaptoday +1 Wednesday +1 Wednesday +DROP TABLE t1; +# (duplicate) MDEV-20380 Server crash during update +CREATE TABLE gafld ( +nuigafld INTEGER NOT NULL, +ucrgafld VARCHAR(30) COLLATE UTF8_BIN NOT NULL +DEFAULT SUBSTRING_INDEX(USER(),'@',1) +); +EXPLAIN UPDATE gafld SET nuigafld = 0 WHERE nuigafld = 10; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE gafld ALL NULL NULL NULL NULL 1 Using where +EXPLAIN UPDATE gafld SET nuigafld = 0 WHERE nuigafld = 10; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE gafld ALL NULL NULL NULL NULL 1 Using where +DROP TABLE gafld; +# (duplicate) MDEV-17653 replace into generated columns is unstable +# Some columns are snipped from the MDEV test +CREATE TABLE t ( +c0 TIMESTAMP NOT NULL DEFAULT current_timestamp() +ON UPDATE current_timestamp(), +c1 DECIMAL(27,25) GENERATED ALWAYS AS (DAYOFMONTH('2020-02-05')), +c4 TIME NOT NULL, +c8 SMALLINT(6) GENERATED ALWAYS AS +(CONCAT_WS(CONVERT(C1 USING CP932), +'900') <> (c4 = 1)), +PRIMARY KEY (c4) +) DEFAULT CHARSET=latin1; +REPLACE INTO t SET c0 = '2018-06-03 10:31:43', c4 = '02:58:55'; +REPLACE INTO t SET c0 = '2018-06-03 10:31:44', c4 = '02:58:55'; +REPLACE INTO t SET c0 = '2018-06-03 10:31:45', c4 = '02:58:55'; +DROP TABLE t; +# (duplicate) MDEV-17986 crash when I insert on a table +CREATE OR REPLACE TABLE t2 ( +number BIGINT(20) NOT NULL, +lrn BIGINT(20) NOT NULL DEFAULT 0, +source VARCHAR(15) NOT NULL +DEFAULT (REVERSE(SUBSTRING_INDEX(REVERSE(user()), '@', 1))), +PRIMARY KEY (number) +); +REPLACE t2(number) VALUES('1'); +REPLACE t2(number) VALUES('1'); +DROP TABLE t2; diff --git a/mysql-test/suite/gcol/t/gcol_bugfixes.test b/mysql-test/suite/gcol/t/gcol_bugfixes.test index 5563347a02a..033c430853d 100644 --- a/mysql-test/suite/gcol/t/gcol_bugfixes.test +++ b/mysql-test/suite/gcol/t/gcol_bugfixes.test @@ -564,3 +564,73 @@ SELECT table_schema,table_name,column_name,extra,is_generated,generation_express FROM information_schema.columns WHERE table_name='gcol_t1'; DROP TABLE gcol_t1; + +--echo # +--echo # MDEV-16039 Crash when selecting virtual columns +--echo # generated using functions with DAYNAME() +--echo # + +CREATE TABLE t1 ( + suppliersenttoday INT NOT NULL, + suppliercaptoday CHAR(10) AS (CONCAT('',DAYNAME('2020-02-05'))) +) COLLATE utf8_bin; + +INSERT INTO t1 (suppliersenttoday) VALUES (0); +INSERT INTO t1 (suppliersenttoday) VALUES (0); +SELECT * FROM t1; + +PREPARE STMT FROM 'INSERT INTO t1 (suppliersenttoday) VALUES (1)'; + +CREATE OR REPLACE TABLE t1 ( + suppliersenttoday INT NOT NULL, + suppliercaptoday CHAR(10) AS (CONCAT('',DAYNAME('2020-02-05'))) +) COLLATE utf8_bin; + +EXECUTE STMT; +EXECUTE STMT; +SELECT * FROM t1; + +DROP TABLE t1; + +--echo # (duplicate) MDEV-20380 Server crash during update +CREATE TABLE gafld ( + nuigafld INTEGER NOT NULL, + ucrgafld VARCHAR(30) COLLATE UTF8_BIN NOT NULL + DEFAULT SUBSTRING_INDEX(USER(),'@',1) +); +EXPLAIN UPDATE gafld SET nuigafld = 0 WHERE nuigafld = 10; +EXPLAIN UPDATE gafld SET nuigafld = 0 WHERE nuigafld = 10; +DROP TABLE gafld; + +--echo # (duplicate) MDEV-17653 replace into generated columns is unstable +--echo # Some columns are snipped from the MDEV test +CREATE TABLE t ( + c0 TIMESTAMP NOT NULL DEFAULT current_timestamp() + ON UPDATE current_timestamp(), + c1 DECIMAL(27,25) GENERATED ALWAYS AS (DAYOFMONTH('2020-02-05')), + c4 TIME NOT NULL, + c8 SMALLINT(6) GENERATED ALWAYS AS + (CONCAT_WS(CONVERT(C1 USING CP932), + '900') <> (c4 = 1)), + PRIMARY KEY (c4) +) DEFAULT CHARSET=latin1; + +REPLACE INTO t SET c0 = '2018-06-03 10:31:43', c4 = '02:58:55'; +REPLACE INTO t SET c0 = '2018-06-03 10:31:44', c4 = '02:58:55'; +REPLACE INTO t SET c0 = '2018-06-03 10:31:45', c4 = '02:58:55'; + +DROP TABLE t; + +--echo # (duplicate) MDEV-17986 crash when I insert on a table +CREATE OR REPLACE TABLE t2 ( + number BIGINT(20) NOT NULL, + lrn BIGINT(20) NOT NULL DEFAULT 0, + source VARCHAR(15) NOT NULL + DEFAULT (REVERSE(SUBSTRING_INDEX(REVERSE(user()), '@', 1))), + PRIMARY KEY (number) +); + +REPLACE t2(number) VALUES('1'); +REPLACE t2(number) VALUES('1'); + +DROP TABLE t2; diff --git a/sql/item.cc b/sql/item.cc index 9451d4203ca..644bef7524a 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -2325,14 +2325,7 @@ bool Item_func_or_sum::agg_item_set_converter(const DTCollation &coll, bool res= FALSE; uint i; - /* - In case we're in statement prepare, create conversion item - in its memory: it will be reused on each execute. - */ - Query_arena backup; - Query_arena *arena= thd->stmt_arena->is_stmt_prepare() ? - thd->activate_stmt_arena_if_needed(&backup) : - NULL; + DBUG_ASSERT(!thd->stmt_arena->is_stmt_prepare()); for (i= 0, arg= args; i < nargs; i++, arg+= item_sep) { @@ -2354,20 +2347,8 @@ bool Item_func_or_sum::agg_item_set_converter(const DTCollation &coll, res= TRUE; break; // we cannot return here, we need to restore "arena". } - /* - If in statement prepare, then we create a converter for two - constant items, do it once and then reuse it. - If we're in execution of a prepared statement, arena is NULL, - and the conv was created in runtime memory. This can be - the case only if the argument is a parameter marker ('?'), - because for all true constants the charset converter has already - been created in prepare. In this case register the change for - rollback. - */ - if (thd->stmt_arena->is_stmt_prepare()) - *arg= conv; - else - thd->change_item_tree(arg, conv); + + thd->change_item_tree(arg, conv); if (conv->fix_fields(thd, arg)) { @@ -2375,8 +2356,6 @@ bool Item_func_or_sum::agg_item_set_converter(const DTCollation &coll, break; // we cannot return here, we need to restore "arena". } } - if (arena) - thd->restore_active_arena(arena, &backup); return res; } diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 436f753557e..674f6db8358 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -4961,6 +4961,24 @@ static void mark_real_tables_as_free_for_reuse(TABLE_LIST *table_list) } } +int TABLE::fix_vcol_exprs(THD *thd) +{ + for (Field **vf= vfield; vf && *vf; vf++) + if (fix_session_vcol_expr(thd, (*vf)->vcol_info)) + return 1; + + for (Field **df= default_field; df && *df; df++) + if ((*df)->default_value && + fix_session_vcol_expr(thd, (*df)->default_value)) + return 1; + + for (Virtual_column_info **cc= check_constraints; cc && *cc; cc++) + if (fix_session_vcol_expr(thd, (*cc))) + return 1; + + return 0; +} + static bool fix_all_session_vcol_exprs(THD *thd, TABLE_LIST *tables) { @@ -4968,36 +4986,27 @@ static bool fix_all_session_vcol_exprs(THD *thd, TABLE_LIST *tables) TABLE_LIST *first_not_own= thd->lex->first_not_own_table(); DBUG_ENTER("fix_session_vcol_expr"); - for (TABLE_LIST *table= tables; table && table != first_not_own; + int error= 0; + for (TABLE_LIST *table= tables; table && table != first_not_own && !error; table= table->next_global) { TABLE *t= table->table; if (!table->placeholder() && t->s->vcols_need_refixing && table->lock_type >= TL_WRITE_ALLOW_WRITE) { + Query_arena *stmt_backup= thd->stmt_arena; + if (thd->stmt_arena->is_conventional()) + thd->stmt_arena= t->expr_arena; if (table->security_ctx) thd->security_ctx= table->security_ctx; - for (Field **vf= t->vfield; vf && *vf; vf++) - if (fix_session_vcol_expr(thd, (*vf)->vcol_info)) - goto err; - - for (Field **df= t->default_field; df && *df; df++) - if ((*df)->default_value && - fix_session_vcol_expr(thd, (*df)->default_value)) - goto err; - - for (Virtual_column_info **cc= t->check_constraints; cc && *cc; cc++) - if (fix_session_vcol_expr(thd, (*cc))) - goto err; + error= t->fix_vcol_exprs(thd); thd->security_ctx= save_security_ctx; + thd->stmt_arena= stmt_backup; } } - DBUG_RETURN(0); -err: - thd->security_ctx= save_security_ctx; - DBUG_RETURN(1); + DBUG_RETURN(error); } diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 655824d93fe..69bfbac6920 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -3482,7 +3482,7 @@ void select_dumpvar::cleanup() Query_arena::Type Query_arena::type() const { DBUG_ASSERT(0); /* Should never be called */ - return STATEMENT; + return Type::STATEMENT; } @@ -3535,7 +3535,7 @@ Statement::Statement(LEX *lex_arg, MEM_ROOT *mem_root_arg, Query_arena::Type Statement::type() const { - return STATEMENT; + return Type::STATEMENT; } diff --git a/sql/sql_class.h b/sql/sql_class.h index 838998af94f..c606e3ddca0 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -951,9 +951,9 @@ public: enum_state state; /* We build without RTTI, so dynamic_cast can't be used. */ - enum Type + enum class Type { - STATEMENT, PREPARED_STATEMENT, STORED_PROCEDURE + STATEMENT, PREPARED_STATEMENT, STORED_PROCEDURE, TABLE }; Query_arena(MEM_ROOT *mem_root_arg, enum enum_state state_arg) : @@ -3654,13 +3654,20 @@ public: return 0; } + + bool is_item_tree_change_register_required() + { + return !stmt_arena->is_conventional() + || stmt_arena->type() == Query_arena::Type::TABLE; + } + void change_item_tree(Item **place, Item *new_value) { DBUG_ENTER("THD::change_item_tree"); DBUG_PRINT("enter", ("Register: %p (%p) <- %p", *place, place, new_value)); /* TODO: check for OOM condition here */ - if (!stmt_arena->is_conventional()) + if (is_item_tree_change_register_required()) nocheck_register_item_tree_change(place, *place, mem_root); *place= new_value; DBUG_VOID_RETURN; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 2879e394877..543c877b7f1 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -7751,8 +7751,8 @@ void mysql_parse(THD *thd, char *rawbuf, uint length, sp_cache_enforce_limit(thd->sp_proc_cache, stored_program_cache_size); sp_cache_enforce_limit(thd->sp_func_cache, stored_program_cache_size); thd->end_statement(); + thd->Item_change_list::rollback_item_tree_changes(); thd->cleanup_after_query(); - DBUG_ASSERT(thd->Item_change_list::is_empty()); } else { diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index f0c9f818f87..b2ee5abd8b6 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -338,7 +338,7 @@ find_prepared_statement(THD *thd, ulong id) thd->last_stmt : thd->stmt_map.find(id)); - if (stmt == 0 || stmt->type() != Query_arena::PREPARED_STATEMENT) + if (stmt == 0 || stmt->type() != Query_arena::Type::PREPARED_STATEMENT) return NULL; return (Prepared_statement *) stmt; @@ -3893,7 +3893,7 @@ Prepared_statement::~Prepared_statement() Query_arena::Type Prepared_statement::type() const { - return PREPARED_STATEMENT; + return Type::PREPARED_STATEMENT; } diff --git a/sql/table.cc b/sql/table.cc index 5ba996b746d..6e8c9aab12e 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -47,6 +47,17 @@ #define MYSQL57_GENERATED_FIELD 128 #define MYSQL57_GCOL_HEADER_SIZE 4 +class Table_arena: public Query_arena +{ +public: + Table_arena(MEM_ROOT *mem_root, enum enum_state state_arg) : + Query_arena(mem_root, state_arg){} + virtual Type type() const + { + return Type::TABLE; + } +}; + static Virtual_column_info * unpack_vcol_info_from_frm(THD *, MEM_ROOT *, TABLE *, String *, Virtual_column_info **, bool *); static bool check_vcol_forward_refs(Field *, Virtual_column_info *); @@ -1020,8 +1031,9 @@ bool parse_vcol_defs(THD *thd, MEM_ROOT *mem_root, TABLE *table, We need to use CONVENTIONAL_EXECUTION here to ensure that any new items created by fix_fields() are not reverted. */ - table->expr_arena= new (alloc_root(mem_root, sizeof(Query_arena))) - Query_arena(mem_root, Query_arena::STMT_CONVENTIONAL_EXECUTION); + table->expr_arena= new (alloc_root(mem_root, sizeof(Table_arena))) + Table_arena(mem_root, + Query_arena::STMT_CONVENTIONAL_EXECUTION); if (!table->expr_arena) DBUG_RETURN(1); diff --git a/sql/table.h b/sql/table.h index 90a85b9b07e..f3a7f278604 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1559,6 +1559,7 @@ public: TABLE *tmp_table, TMP_TABLE_PARAM *tmp_table_param, bool with_cleanup); + int fix_vcol_exprs(THD *thd); }; From fc48c8ff4c6cb9aa7a0fd27e724e6e3acd555b0e Mon Sep 17 00:00:00 2001 From: Monty Date: Mon, 20 Jul 2020 15:19:25 +0300 Subject: [PATCH 075/188] MDEV-21953 deadlock between BACKUP STAGE BLOCK_COMMIT and parallel repl. The issue was: T1, a parallel slave worker thread, is waiting for another worker thread to commit. While waiting, it has the MDL_BACKUP_COMMIT lock. T2, working for mariabackup, is doing BACKUP STAGE BLOCK_COMMIT and blocks all commits. This causes a deadlock as the thread T1 is waiting for can't commit. Fixed by moving locking of MDL_BACKUP_COMMIT from ha_commit_trans() to commit_one_phase_2() Other things: - Added a new argument to ha_comit_one_phase() to signal if the transaction was a write transaction. - Ensured that ha_maria::implicit_commit() is always called under MDL_BACKUP_COMMIT. This code is not needed in 10.5 - Ensure that MDL_Request values 'type' and 'ticket' are always initialized. This makes it easier to check the state of the MDL_Request. - Moved thd->store_globals() earlier in handle_rpl_parallel_thread() as thd->init_for_queries() could use a MDL that could crash if store_globals where not called. - Don't call ha_enable_transactions() in THD::init_for_queries() as this is both slow (uses MDL locks) and not needed. --- mysql-test/suite/rpl/r/parallel_backup.result | 40 ++++++ mysql-test/suite/rpl/t/parallel_backup.test | 75 +++++++++++ sql/handler.cc | 117 +++++++++++------- sql/handler.h | 8 +- sql/mdl.h | 5 +- sql/rpl_parallel.cc | 2 +- sql/sql_class.cc | 7 +- sql/sql_parse.cc | 8 +- sql/xa.cc | 2 +- storage/maria/ha_maria.cc | 4 + storage/maria/ha_maria.h | 1 + 11 files changed, 210 insertions(+), 59 deletions(-) create mode 100644 mysql-test/suite/rpl/r/parallel_backup.result create mode 100644 mysql-test/suite/rpl/t/parallel_backup.test diff --git a/mysql-test/suite/rpl/r/parallel_backup.result b/mysql-test/suite/rpl/r/parallel_backup.result new file mode 100644 index 00000000000..d87c61f2d0f --- /dev/null +++ b/mysql-test/suite/rpl/r/parallel_backup.result @@ -0,0 +1,40 @@ +include/master-slave.inc +[connection master] +# +# MDEV-21953: deadlock between BACKUP STAGE BLOCK_COMMIT and parallel +# replication +# +connection master; +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE = innodb; +connection slave; +include/stop_slave.inc +SET @old_parallel_threads= @@GLOBAL.slave_parallel_threads; +SET @old_parallel_mode = @@GLOBAL.slave_parallel_mode; +SET @@global.slave_parallel_threads= 2; +SET @@global.slave_parallel_mode = 'optimistic'; +connection master; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +connect aux_slave,127.0.0.1,root,,test,$SLAVE_MYPORT,; +BEGIN; +INSERT INTO t1 VALUES (1); +connection slave; +include/start_slave.inc +connection aux_slave; +connect backup_slave,127.0.0.1,root,,test,$SLAVE_MYPORT,; +BACKUP STAGE START; +BACKUP STAGE BLOCK_COMMIT; +connection aux_slave; +ROLLBACK; +connection backup_slave; +BACKUP STAGE END; +connection slave; +include/diff_tables.inc [master:t1,slave:t1] +connection slave; +include/stop_slave.inc +SET @@global.slave_parallel_threads= @old_parallel_threads; +SET @@global.slave_parallel_mode = @old_parallel_mode; +include/start_slave.inc +connection server_1; +DROP TABLE t1; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/parallel_backup.test b/mysql-test/suite/rpl/t/parallel_backup.test new file mode 100644 index 00000000000..6ed182c024b --- /dev/null +++ b/mysql-test/suite/rpl/t/parallel_backup.test @@ -0,0 +1,75 @@ +--source include/have_innodb.inc +# The test is not format specific, MIXED is required to optimize testing time +--source include/have_binlog_format_mixed.inc +--source include/master-slave.inc + +--echo # +--echo # MDEV-21953: deadlock between BACKUP STAGE BLOCK_COMMIT and parallel +--echo # replication +--echo # + +--connection master +CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE = innodb; + +--sync_slave_with_master +--source include/stop_slave.inc +SET @old_parallel_threads= @@GLOBAL.slave_parallel_threads; +SET @old_parallel_mode = @@GLOBAL.slave_parallel_mode; +SET @@global.slave_parallel_threads= 2; +SET @@global.slave_parallel_mode = 'optimistic'; + +--connection master +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +--save_master_pos + +# The plot: +# Block the 1st of two workers and, at waiting-for-prior-commit by the 2nd, +# issue BACKUP commands. +# BLOCK_COMMIT may hang so it is --send. +# Release the 1st worker to observe a deadlock unless its fixed. + +--connect (aux_slave,127.0.0.1,root,,test,$SLAVE_MYPORT,) +BEGIN; +# block the 1st worker and wait for the 2nd ready to commit +INSERT INTO t1 VALUES (1); + +--connection slave +--source include/start_slave.inc + +--connection aux_slave +--let $wait_condition= SELECT COUNT(*) > 0 FROM information_schema.processlist WHERE state = "Waiting for prior transaction to commit" +--source include/wait_condition.inc + +# While the 1st worker is locked out run backup +--connect (backup_slave,127.0.0.1,root,,test,$SLAVE_MYPORT,) +BACKUP STAGE START; +--send BACKUP STAGE BLOCK_COMMIT + +# release the 1st work +--connection aux_slave +--sleep 1 +ROLLBACK; + +--connection backup_slave +--reap +BACKUP STAGE END; + +--connection slave +--sync_with_master + +--let $diff_tables= master:t1,slave:t1 +--source include/diff_tables.inc + + +# Clean up. +--connection slave +--source include/stop_slave.inc +SET @@global.slave_parallel_threads= @old_parallel_threads; +SET @@global.slave_parallel_mode = @old_parallel_mode; +--source include/start_slave.inc + +--connection server_1 +DROP TABLE t1; + +--source include/rpl_end.inc diff --git a/sql/handler.cc b/sql/handler.cc index cc7eedd18f2..5f94f9e893b 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -114,7 +114,7 @@ static TYPELIB known_extensions= {0,"known_exts", NULL, NULL}; uint known_extensions_id= 0; static int commit_one_phase_2(THD *thd, bool all, THD_TRANS *trans, - bool is_real_trans); + bool is_real_trans, bool rw_trans); static plugin_ref ha_default_plugin(THD *thd) @@ -133,6 +133,23 @@ static plugin_ref ha_default_tmp_plugin(THD *thd) return ha_default_plugin(thd); } +#if defined(WITH_ARIA_STORAGE_ENGINE) && MYSQL_VERSION_ID < 100500 +void ha_maria_implicit_commit(THD *thd, bool new_trn) +{ + if (ha_maria::has_active_transaction(thd)) + { + int error; + MDL_request mdl_request; + mdl_request.init(MDL_key::BACKUP, "", "", MDL_BACKUP_COMMIT, MDL_EXPLICIT); + error= thd->mdl_context.acquire_lock(&mdl_request, + thd->variables.lock_wait_timeout); + ha_maria::implicit_commit(thd, new_trn); + if (!error) + thd->mdl_context.release_lock(mdl_request.ticket); + } +} +#endif + /** @brief Return the default storage engine handlerton for thread @@ -1445,10 +1462,6 @@ int ha_commit_trans(THD *thd, bool all) DBUG_RETURN(2); } -#ifdef WITH_ARIA_STORAGE_ENGINE - ha_maria::implicit_commit(thd, TRUE); -#endif - if (!ha_info) { /* @@ -1462,7 +1475,9 @@ int ha_commit_trans(THD *thd, bool all) wsrep_commit_empty(thd, all); } #endif /* WITH_WSREP */ - DBUG_RETURN(0); + + ha_maria_implicit_commit(thd, TRUE); + DBUG_RETURN(error); } DBUG_EXECUTE_IF("crash_commit_before", DBUG_SUICIDE();); @@ -1475,33 +1490,9 @@ int ha_commit_trans(THD *thd, bool all) /* rw_trans is TRUE when we in a transaction changing data */ bool rw_trans= is_real_trans && (rw_ha_count > (thd->is_current_stmt_binlog_disabled()?0U:1U)); - MDL_request mdl_request; DBUG_PRINT("info", ("is_real_trans: %d rw_trans: %d rw_ha_count: %d", is_real_trans, rw_trans, rw_ha_count)); - if (rw_trans) - { - /* - Acquire a metadata lock which will ensure that COMMIT is blocked - by an active FLUSH TABLES WITH READ LOCK (and vice versa: - COMMIT in progress blocks FTWRL). - - We allow the owner of FTWRL to COMMIT; we assume that it knows - what it does. - */ - mdl_request.init(MDL_key::BACKUP, "", "", MDL_BACKUP_COMMIT, MDL_EXPLICIT); - - if (!WSREP(thd) && - thd->mdl_context.acquire_lock(&mdl_request, - thd->variables.lock_wait_timeout)) - { - ha_rollback_trans(thd, all); - DBUG_RETURN(1); - } - - DEBUG_SYNC(thd, "ha_commit_trans_after_acquire_commit_lock"); - } - if (rw_trans && opt_readonly && !(thd->security_ctx->master_access & SUPER_ACL) && @@ -1541,7 +1532,7 @@ int ha_commit_trans(THD *thd, bool all) // Here, the call will not commit inside InnoDB. It is only working // around closing thd->transaction.stmt open by TR_table::open(). if (all) - commit_one_phase_2(thd, false, &thd->transaction.stmt, false); + commit_one_phase_2(thd, false, &thd->transaction.stmt, false, false); } } #endif @@ -1561,7 +1552,7 @@ int ha_commit_trans(THD *thd, bool all) goto wsrep_err; } #endif /* WITH_WSREP */ - error= ha_commit_one_phase(thd, all); + error= ha_commit_one_phase(thd, all, rw_trans); #ifdef WITH_WSREP if (run_wsrep_hooks) error= error || wsrep_after_commit(thd, all); @@ -1613,7 +1604,7 @@ int ha_commit_trans(THD *thd, bool all) if (!is_real_trans) { - error= commit_one_phase_2(thd, all, trans, is_real_trans); + error= commit_one_phase_2(thd, all, trans, is_real_trans, rw_trans); goto done; } #ifdef WITH_WSREP @@ -1631,7 +1622,7 @@ int ha_commit_trans(THD *thd, bool all) DEBUG_SYNC(thd, "ha_commit_trans_after_log_and_order"); DBUG_EXECUTE_IF("crash_commit_after_log", DBUG_SUICIDE();); - error= commit_one_phase_2(thd, all, trans, is_real_trans) ? 2 : 0; + error= commit_one_phase_2(thd, all, trans, is_real_trans, rw_trans) ? 2 : 0; #ifdef WITH_WSREP if (run_wsrep_hooks && (error || (error = wsrep_after_commit(thd, all)))) { @@ -1694,16 +1685,6 @@ err: thd->rgi_slave->is_parallel_exec); } end: - if (rw_trans && mdl_request.ticket) - { - /* - We do not always immediately release transactional locks - after ha_commit_trans() (see uses of ha_enable_transaction()), - thus we release the commit blocker lock as soon as it's - not needed. - */ - thd->mdl_context.release_lock(mdl_request.ticket); - } #ifdef WITH_WSREP if (wsrep_is_active(thd) && is_real_trans && !error && (rw_ha_count == 0 || all) && @@ -1719,6 +1700,7 @@ end: /** @note This function does not care about global read lock. A caller should. + However backup locks are handled in commit_one_phase_2. @param[in] all Is set in case of explicit commit (COMMIT statement), or implicit commit @@ -1727,7 +1709,7 @@ end: autocommit=1. */ -int ha_commit_one_phase(THD *thd, bool all) +int ha_commit_one_phase(THD *thd, bool all, bool rw_trans) { THD_TRANS *trans=all ? &thd->transaction.all : &thd->transaction.stmt; /* @@ -1753,20 +1735,50 @@ int ha_commit_one_phase(THD *thd, bool all) if ((res= thd->wait_for_prior_commit())) DBUG_RETURN(res); } - res= commit_one_phase_2(thd, all, trans, is_real_trans); + res= commit_one_phase_2(thd, all, trans, is_real_trans, rw_trans); DBUG_RETURN(res); } static int -commit_one_phase_2(THD *thd, bool all, THD_TRANS *trans, bool is_real_trans) +commit_one_phase_2(THD *thd, bool all, THD_TRANS *trans, bool is_real_trans, + bool rw_trans) { int error= 0; uint count= 0; Ha_trx_info *ha_info= trans->ha_list, *ha_info_next; + MDL_request mdl_request; DBUG_ENTER("commit_one_phase_2"); if (is_real_trans) DEBUG_SYNC(thd, "commit_one_phase_2"); + + if (rw_trans) + { + /* + Acquire a metadata lock which will ensure that COMMIT is blocked + by an active FLUSH TABLES WITH READ LOCK (and vice versa: + COMMIT in progress blocks FTWRL). + + We allow the owner of FTWRL to COMMIT; we assume that it knows + what it does. + */ + mdl_request.init(MDL_key::BACKUP, "", "", MDL_BACKUP_COMMIT, MDL_EXPLICIT); + + if (!WSREP(thd) && + thd->mdl_context.acquire_lock(&mdl_request, + thd->variables.lock_wait_timeout)) + { + my_error(ER_ERROR_DURING_COMMIT, MYF(0), 1); + ha_rollback_trans(thd, all); + DBUG_RETURN(1); + } + DEBUG_SYNC(thd, "ha_commit_trans_after_acquire_commit_lock"); + } + +#if defined(WITH_ARIA_STORAGE_ENGINE) && MYSQL_VERSION_ID < 100500 + ha_maria::implicit_commit(thd, TRUE); +#endif + if (ha_info) { for (; ha_info; ha_info= ha_info_next) @@ -1795,6 +1807,17 @@ commit_one_phase_2(THD *thd, bool all, THD_TRANS *trans, bool is_real_trans) #endif } } + if (mdl_request.ticket) + { + /* + We do not always immediately release transactional locks + after ha_commit_trans() (see uses of ha_enable_transaction()), + thus we release the commit blocker lock as soon as it's + not needed. + */ + thd->mdl_context.release_lock(mdl_request.ticket); + } + /* Free resources and perform other cleanup even for 'empty' transactions. */ if (is_real_trans) { diff --git a/sql/handler.h b/sql/handler.h index e514fcfd60c..3757a3ab2f9 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -5021,7 +5021,7 @@ int ha_change_key_cache(KEY_CACHE *old_key_cache, KEY_CACHE *new_key_cache); /* transactions: interface to handlerton functions */ int ha_start_consistent_snapshot(THD *thd); int ha_commit_or_rollback_by_xid(XID *xid, bool commit); -int ha_commit_one_phase(THD *thd, bool all); +int ha_commit_one_phase(THD *thd, bool all, bool rw_trans); int ha_commit_trans(THD *thd, bool all); int ha_rollback_trans(THD *thd, bool all); int ha_prepare(THD *thd); @@ -5093,4 +5093,10 @@ int del_global_table_stat(THD *thd, const LEX_CSTRING *db, const LEX_CSTRING *t @note This does not need to be multi-byte safe or anything */ char *xid_to_str(char *buf, const XID &xid); #endif // !DBUG_OFF + +#if defined(WITH_ARIA_STORAGE_ENGINE) && MYSQL_VERSION_ID < 100500 +extern void ha_maria_implicit_commit(THD *thd, bool new_trans); +#else +#define ha_maria_implicit_commit(A, B) while(0) +#endif #endif /* HANDLER_INCLUDED */ diff --git a/sql/mdl.h b/sql/mdl.h index b084670e5c6..123ffbcade6 100644 --- a/sql/mdl.h +++ b/sql/mdl.h @@ -122,6 +122,8 @@ public: */ enum enum_mdl_type { + /* This means that the MDL_request is not initialized */ + MDL_NOT_INITIALIZED= -1, /* An intention exclusive metadata lock (IX). Used only for scoped locks. Owner of this type of lock can acquire upgradable exclusive locks on @@ -592,12 +594,13 @@ public: */ MDL_request& operator=(const MDL_request &) { + type= MDL_NOT_INITIALIZED; ticket= NULL; /* Do nothing, in particular, don't try to copy the key. */ return *this; } /* Another piece of ugliness for TABLE_LIST constructor */ - MDL_request() {} + MDL_request(): type(MDL_NOT_INITIALIZED), ticket(NULL) {} MDL_request(const MDL_request *rhs) :type(rhs->type), diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc index 7c0e96bc8ed..eef6f734f1f 100644 --- a/sql/rpl_parallel.cc +++ b/sql/rpl_parallel.cc @@ -1051,10 +1051,10 @@ handle_rpl_parallel_thread(void *arg) server_threads.insert(thd); set_current_thd(thd); pthread_detach_this_thread(); + thd->store_globals(); thd->init_for_queries(); thd->variables.binlog_annotate_row_events= 0; init_thr_lock(); - thd->store_globals(); thd->system_thread= SYSTEM_THREAD_SLAVE_SQL; thd->security_ctx->skip_grants(); thd->variables.max_allowed_packet= slave_max_allowed_packet; diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 40e606425c5..15088148e02 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -1383,7 +1383,11 @@ void THD::update_all_stats() void THD::init_for_queries() { set_time(); - ha_enable_transaction(this,TRUE); + /* + We don't need to call ha_enable_transaction() as we can't have + any active transactions that has to be commited + */ + transaction.on= TRUE; reset_root_defaults(mem_root, variables.query_alloc_block_size, variables.query_prealloc_size); @@ -7309,7 +7313,6 @@ wait_for_commit::~wait_for_commit() mysql_cond_destroy(&COND_wait_commit); } - void wait_for_commit::wakeup(int wakeup_error) { diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 935e054e163..3c5c52e2aa1 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1841,9 +1841,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, */ char *beginning_of_next_stmt= (char*) parser_state.m_lip.found_semicolon; -#ifdef WITH_ARIA_STORAGE_ENGINE - ha_maria::implicit_commit(thd, FALSE); -#endif + ha_maria_implicit_commit(thd, FALSE); /* Finalize server status flags after executing a statement. */ thd->update_server_status(); @@ -6157,9 +6155,7 @@ finish: trans_commit_stmt(thd); thd->get_stmt_da()->set_overwrite_status(false); } -#ifdef WITH_ARIA_STORAGE_ENGINE - ha_maria::implicit_commit(thd, FALSE); -#endif + ha_maria_implicit_commit(thd, FALSE); } /* Free tables. Set stage 'closing tables' */ diff --git a/sql/xa.cc b/sql/xa.cc index b08ab973cc5..15116ba9366 100644 --- a/sql/xa.cc +++ b/sql/xa.cc @@ -582,7 +582,7 @@ bool trans_xa_commit(THD *thd) { DEBUG_SYNC(thd, "trans_xa_commit_after_acquire_commit_lock"); - res= MY_TEST(ha_commit_one_phase(thd, 1)); + res= MY_TEST(ha_commit_one_phase(thd, 1, 1)); if (res) my_error(ER_XAER_RMERR, MYF(0)); } diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index 35edfc31914..013c740582b 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -2890,6 +2890,10 @@ static void reset_thd_trn(THD *thd, MARIA_HA *first_table) DBUG_VOID_RETURN; } +bool ha_maria::has_active_transaction(THD *thd) +{ + return (maria_hton && THD_TRN); +} /** Performs an implicit commit of the Maria transaction and creates a new diff --git a/storage/maria/ha_maria.h b/storage/maria/ha_maria.h index f6b00420c9c..73f3576a34e 100644 --- a/storage/maria/ha_maria.h +++ b/storage/maria/ha_maria.h @@ -165,6 +165,7 @@ public: { return file; } + static bool has_active_transaction(THD *thd); static int implicit_commit(THD *thd, bool new_trn); /** * Multi Range Read interface From e26c822aa0a73e62d7a3e4a0915c7bf6cd734978 Mon Sep 17 00:00:00 2001 From: Monty Date: Tue, 21 Jul 2020 15:12:53 +0300 Subject: [PATCH 076/188] MDEV-16929 Assertion ... in close_thread_tables upon killing connection Problem was that the code didn't handle a transaction created in innodb as part of a failed mysql_lock_tables() --- mysql-test/suite/sql_sequence/kill.result | 12 ++++++++++++ mysql-test/suite/sql_sequence/kill.test | 20 ++++++++++++++++++++ sql/sql_sequence.cc | 4 ++++ 3 files changed, 36 insertions(+) create mode 100644 mysql-test/suite/sql_sequence/kill.result create mode 100644 mysql-test/suite/sql_sequence/kill.test diff --git a/mysql-test/suite/sql_sequence/kill.result b/mysql-test/suite/sql_sequence/kill.result new file mode 100644 index 00000000000..6d966254de3 --- /dev/null +++ b/mysql-test/suite/sql_sequence/kill.result @@ -0,0 +1,12 @@ +# +# MDEV-16929 Assertion ... in close_thread_tables upon killing connection +# running SHOW on sequence +# +CREATE SEQUENCE s ENGINE=InnoDB; +RENAME TABLE s TO s1; +connect con1,localhost,root,,test; +SHOW CREATE SEQUENCE s1; +connection default; +KILL thread_id; +connection default; +drop sequence s1; diff --git a/mysql-test/suite/sql_sequence/kill.test b/mysql-test/suite/sql_sequence/kill.test new file mode 100644 index 00000000000..9caebc57f12 --- /dev/null +++ b/mysql-test/suite/sql_sequence/kill.test @@ -0,0 +1,20 @@ +--source include/have_innodb.inc + +--echo # +--echo # MDEV-16929 Assertion ... in close_thread_tables upon killing connection +--echo # running SHOW on sequence +--echo # + +CREATE SEQUENCE s ENGINE=InnoDB; +RENAME TABLE s TO s1; +--connect (con1,localhost,root,,test) +--let $conid= `SELECT CONNECTION_ID()` +--send + SHOW CREATE SEQUENCE s1; +--connection default +--replace_result $conid thread_id +--eval KILL $conid + +# Cleanup +--connection default +drop sequence s1; diff --git a/sql/sql_sequence.cc b/sql/sql_sequence.cc index 939963de682..ffdb4b54c16 100644 --- a/sql/sql_sequence.cc +++ b/sql/sql_sequence.cc @@ -485,6 +485,10 @@ int SEQUENCE::read_initial_values(TABLE *table) if (mdl_lock_used) thd->mdl_context.release_lock(mdl_request.ticket); write_unlock(table); + + if (!has_active_transaction && !thd->transaction.stmt.is_empty() && + !thd->in_sub_stmt) + trans_commit_stmt(thd); DBUG_RETURN(HA_ERR_LOCK_WAIT_TIMEOUT); } DBUG_ASSERT(table->reginfo.lock_type == TL_READ); From b75563cdfd161e373480949ffa498bd4a8087b12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 21 Jul 2020 15:59:45 +0300 Subject: [PATCH 077/188] MDEV-15880: ASAN heap-use-after-free with innodb_evict_tables_on_commit_debug trx_update_mod_tables_timestamp(): When implementing innodb_evict_tables_on_commit_debug, do not evict tables on which transactional locks exist. This debug variable was broken since its introduction in commit 947b0b5722117350c83656ee0b23502be59b7d2b. --- storage/innobase/trx/trx0trx.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index e0d8d44a86e..1d4202b3033 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -1295,7 +1295,8 @@ trx_update_mod_tables_timestamp( dict_table_t* table = it->first; table->update_time = now; #ifdef UNIV_DEBUG - if (preserve_tables || table->get_ref_count()) { + if (preserve_tables || table->get_ref_count() + || UT_LIST_GET_LEN(table->locks)) { /* do not evict when committing DDL operations or if some other transaction is holding the table handle */ @@ -1304,7 +1305,11 @@ trx_update_mod_tables_timestamp( /* recheck while holding the mutex that blocks table->acquire() */ mutex_enter(&dict_sys_mutex); - if (!table->get_ref_count()) { + mutex_enter(&lock_sys.mutex); + const bool do_evict = !table->get_ref_count() + && !UT_LIST_GET_LEN(table->locks); + mutex_exit(&lock_sys.mutex); + if (do_evict) { # if MYSQL_VERSION_ID >= 100405 dict_sys.remove(table, true); # else From ebca70ead3604df9f64480941ac63119a90bd270 Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Tue, 21 Jul 2020 23:12:32 +1000 Subject: [PATCH 078/188] fix c++98 build --- sql/sql_class.cc | 4 ++-- sql/sql_class.h | 6 +++--- sql/sql_prepare.cc | 4 ++-- sql/table.cc | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 69bfbac6920..655824d93fe 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -3482,7 +3482,7 @@ void select_dumpvar::cleanup() Query_arena::Type Query_arena::type() const { DBUG_ASSERT(0); /* Should never be called */ - return Type::STATEMENT; + return STATEMENT; } @@ -3535,7 +3535,7 @@ Statement::Statement(LEX *lex_arg, MEM_ROOT *mem_root_arg, Query_arena::Type Statement::type() const { - return Type::STATEMENT; + return STATEMENT; } diff --git a/sql/sql_class.h b/sql/sql_class.h index c606e3ddca0..8d8ab779d56 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -951,9 +951,9 @@ public: enum_state state; /* We build without RTTI, so dynamic_cast can't be used. */ - enum class Type + enum Type { - STATEMENT, PREPARED_STATEMENT, STORED_PROCEDURE, TABLE + STATEMENT, PREPARED_STATEMENT, STORED_PROCEDURE, TABLE_ARENA }; Query_arena(MEM_ROOT *mem_root_arg, enum enum_state state_arg) : @@ -3658,7 +3658,7 @@ public: bool is_item_tree_change_register_required() { return !stmt_arena->is_conventional() - || stmt_arena->type() == Query_arena::Type::TABLE; + || stmt_arena->type() == Query_arena::TABLE_ARENA; } void change_item_tree(Item **place, Item *new_value) diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index b2ee5abd8b6..f0c9f818f87 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -338,7 +338,7 @@ find_prepared_statement(THD *thd, ulong id) thd->last_stmt : thd->stmt_map.find(id)); - if (stmt == 0 || stmt->type() != Query_arena::Type::PREPARED_STATEMENT) + if (stmt == 0 || stmt->type() != Query_arena::PREPARED_STATEMENT) return NULL; return (Prepared_statement *) stmt; @@ -3893,7 +3893,7 @@ Prepared_statement::~Prepared_statement() Query_arena::Type Prepared_statement::type() const { - return Type::PREPARED_STATEMENT; + return PREPARED_STATEMENT; } diff --git a/sql/table.cc b/sql/table.cc index 6e8c9aab12e..e4492f21a30 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -54,7 +54,7 @@ public: Query_arena(mem_root, state_arg){} virtual Type type() const { - return Type::TABLE; + return TABLE_ARENA; } }; From 6898eae7f8ef3f0b773687c0308520f072da0bc9 Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Wed, 22 Jul 2020 11:17:43 +1000 Subject: [PATCH 079/188] fix assertion --- sql/sql_class.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 655824d93fe..0a8c136e556 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -3481,7 +3481,6 @@ void select_dumpvar::cleanup() Query_arena::Type Query_arena::type() const { - DBUG_ASSERT(0); /* Should never be called */ return STATEMENT; } From 7bffe468b239645d2f27d1d5625cb9c914ae994d Mon Sep 17 00:00:00 2001 From: sjaakola Date: Tue, 19 May 2020 11:12:26 +0300 Subject: [PATCH 080/188] MDEV-21910 Deadlock between BF abort and manual KILL command When high priority replication slave applier encounters lock conflict in innodb, it will force the conflicting lock holder transaction (victim) to rollback. This is a must in multi-master sychronous replication model to avoid cluster lock-up. This high priority victim abort (aka "brute force" (BF) abort), is started from innodb lock manager while holding the victim's transaction's (trx) mutex. Depending on the execution state of the victim transaction, it may happen that the BF abort will call for THD::awake() to wake up the victim transaction for the rollback. Now, if BF abort requires THD::awake() to be called, then the applier thread executed locking protocol of: victim trx mutex -> victim THD::LOCK_thd_data If, at the same time another DBMS super user issues KILL command to abort the same victim, it will execute locking protocol of: victim THD::LOCK_thd_data -> victim trx mutex. These two locking protocol acquire mutexes in opposite order, hence unresolvable mutex locking deadlock may occur. The fix in this commit adds THD::wsrep_aborter flag to synchronize who can kill the victim This flag is set both when BF is called for from innodb and by KILL command. Either path of victim killing will bail out if victim's wsrep_killed is already set to avoid mutex conflicts with the other aborter execution. THD::wsrep_aborter records the aborter THD's ID. This is needed to preserve the right to kill the victim from different locations for the same aborter thread. It is also good error logging, to see who is reponsible for the abort. A new test case was added in galera.galera_bf_kill_debug.test for scenario where wsrep applier thread and manual KILL command try to kill same idle victim --- include/mysql/service_wsrep.h | 5 + .../suite/galera/r/galera_bf_kill.result | 18 +- .../galera/r/galera_bf_kill_debug.result | 54 ++++ .../suite/galera/r/galera_bf_lock_wait.result | 2 + mysql-test/suite/galera/t/galera_bf_kill.test | 51 +-- .../suite/galera/t/galera_bf_kill_debug.cnf | 7 + .../suite/galera/t/galera_bf_kill_debug.test | 140 +++++++++ .../suite/galera/t/galera_bf_lock_wait.test | 4 +- mysql-test/suite/perfschema/r/nesting.result | 295 +++++++++--------- sql/service_wsrep.cc | 34 ++ sql/sql_class.cc | 10 + sql/sql_class.h | 3 +- sql/sql_parse.cc | 22 +- sql/sql_plugin_services.ic | 3 +- sql/wsrep_dummy.cc | 2 + storage/innobase/handler/ha_innodb.cc | 7 + 16 files changed, 441 insertions(+), 216 deletions(-) create mode 100644 mysql-test/suite/galera/r/galera_bf_kill_debug.result create mode 100644 mysql-test/suite/galera/t/galera_bf_kill_debug.cnf create mode 100644 mysql-test/suite/galera/t/galera_bf_kill_debug.test diff --git a/include/mysql/service_wsrep.h b/include/mysql/service_wsrep.h index 5ffa476fdfb..1b1d54c036b 100644 --- a/include/mysql/service_wsrep.h +++ b/include/mysql/service_wsrep.h @@ -87,6 +87,7 @@ extern struct wsrep_service_st { ulong (*wsrep_OSU_method_get_func)(const MYSQL_THD thd); my_bool (*wsrep_thd_has_ignored_error_func)(const MYSQL_THD thd); void (*wsrep_thd_set_ignored_error_func)(MYSQL_THD thd, my_bool val); + bool (*wsrep_thd_set_wsrep_aborter_func)(MYSQL_THD bf_thd, MYSQL_THD thd); } *wsrep_service; #define MYSQL_SERVICE_WSREP_INCLUDED @@ -130,6 +131,7 @@ extern struct wsrep_service_st { #define wsrep_OSU_method_get(T) wsrep_service->wsrep_OSU_method_get_func(T) #define wsrep_thd_has_ignored_error(T) wsrep_service->wsrep_thd_has_ignored_error_func(T) #define wsrep_thd_set_ignored_error(T,V) wsrep_service->wsrep_thd_set_ignored_error_func(T,V) +#define wsrep_thd_set_wsrep_aborter(T) wsrep_service->wsrep_thd_set_wsrep_aborter_func(T1, T2) #else #define MYSQL_SERVICE_WSREP_STATIC_INCLUDED @@ -181,6 +183,8 @@ extern "C" my_bool wsrep_thd_is_local(const MYSQL_THD thd); /* Return true if thd is in high priority mode */ /* todo: rename to is_high_priority() */ extern "C" my_bool wsrep_thd_is_applying(const MYSQL_THD thd); +/* set wsrep_aborter for the target THD */ +extern "C" bool wsrep_thd_set_wsrep_aborter(MYSQL_THD bf_thd, MYSQL_THD victim_thd); /* Return true if thd is in TOI mode */ extern "C" my_bool wsrep_thd_is_toi(const MYSQL_THD thd); /* Return true if thd is in replicating TOI mode */ @@ -224,5 +228,6 @@ extern "C" my_bool wsrep_thd_is_applying(const MYSQL_THD thd); extern "C" ulong wsrep_OSU_method_get(const MYSQL_THD thd); extern "C" my_bool wsrep_thd_has_ignored_error(const MYSQL_THD thd); extern "C" void wsrep_thd_set_ignored_error(MYSQL_THD thd, my_bool val); +extern "C" bool wsrep_thd_set_wsrep_aborter(MYSQL_THD bf_thd, MYSQL_THD victim_thd); #endif #endif /* MYSQL_SERVICE_WSREP_INCLUDED */ diff --git a/mysql-test/suite/galera/r/galera_bf_kill.result b/mysql-test/suite/galera/r/galera_bf_kill.result index 2a7bc9eac29..3738e8c9684 100644 --- a/mysql-test/suite/galera/r/galera_bf_kill.result +++ b/mysql-test/suite/galera/r/galera_bf_kill.result @@ -69,21 +69,5 @@ select * from t1; a b 2 1 disconnect node_2a; -drop table t1; -connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; -connection node_2a; -CREATE TABLE t1 (i int primary key); -SET DEBUG_SYNC = "before_wsrep_ordered_commit SIGNAL bwoc_reached WAIT_FOR bwoc_continue"; -INSERT INTO t1 VALUES (1); -connection node_2; -SET DEBUG_SYNC = "now WAIT_FOR bwoc_reached"; -SET DEBUG_SYNC = "now SIGNAL bwoc_continue"; -SET DEBUG_SYNC='RESET'; -connection node_2a; -connection node_2; -select * from t1; -i -1 -disconnect node_2a; -connection node_2; +connection node_1; drop table t1; diff --git a/mysql-test/suite/galera/r/galera_bf_kill_debug.result b/mysql-test/suite/galera/r/galera_bf_kill_debug.result new file mode 100644 index 00000000000..c3eae243f47 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_bf_kill_debug.result @@ -0,0 +1,54 @@ +connection node_2; +connection node_1; +connection node_2; +CREATE TABLE t1(a int not null primary key auto_increment,b int) engine=InnoDB; +insert into t1 values (NULL,1); +connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connection node_2a; +truncate t1; +insert into t1 values (1,0); +begin; +update t1 set b=2 where a=1; +connection node_2; +set session wsrep_sync_wait=0; +connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connection node_2b; +SET GLOBAL debug_dbug = "d,sync.before_wsrep_thd_abort"; +connection node_1; +select * from t1; +a b +1 0 +update t1 set b= 1 where a=1; +connection node_2b; +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.before_wsrep_thd_abort_reached"; +connection node_2; +SET DEBUG_SYNC= 'before_awake_no_mutex SIGNAL awake_reached WAIT_FOR continue_kill'; +connection node_2b; +SET DEBUG_SYNC='now WAIT_FOR awake_reached'; +SET GLOBAL debug_dbug = ""; +SET DEBUG_SYNC = "now SIGNAL signal.before_wsrep_thd_abort"; +SET DEBUG_SYNC = "now SIGNAL continue_kill"; +connection node_2; +connection node_2a; +select * from t1; +connection node_2; +SET DEBUG_SYNC = "RESET"; +drop table t1; +disconnect node_2a; +connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; +connection node_2a; +CREATE TABLE t1 (i int primary key); +SET DEBUG_SYNC = "before_wsrep_ordered_commit SIGNAL bwoc_reached WAIT_FOR bwoc_continue"; +INSERT INTO t1 VALUES (1); +connection node_2; +SET DEBUG_SYNC = "now WAIT_FOR bwoc_reached"; +SET DEBUG_SYNC = "now SIGNAL bwoc_continue"; +SET DEBUG_SYNC='RESET'; +connection node_2a; +connection node_2; +select * from t1; +i +1 +disconnect node_2a; +connection node_1; +drop table t1; diff --git a/mysql-test/suite/galera/r/galera_bf_lock_wait.result b/mysql-test/suite/galera/r/galera_bf_lock_wait.result index 71627d11a4e..723f3e37282 100644 --- a/mysql-test/suite/galera/r/galera_bf_lock_wait.result +++ b/mysql-test/suite/galera/r/galera_bf_lock_wait.result @@ -1,5 +1,7 @@ connection node_2; connection node_1; +connection node_2; +call mtr.add_suppression("WSREP: Trying to continue unpaused monitor"); connection node_1; call mtr.add_suppression("WSREP: Trying to continue unpaused monitor"); CREATE TABLE t1 ENGINE=InnoDB select 1 as a, 1 as b union select 2, 2; diff --git a/mysql-test/suite/galera/t/galera_bf_kill.test b/mysql-test/suite/galera/t/galera_bf_kill.test index 3eb3ddc32b5..c8564bc9219 100644 --- a/mysql-test/suite/galera/t/galera_bf_kill.test +++ b/mysql-test/suite/galera/t/galera_bf_kill.test @@ -1,7 +1,5 @@ --source include/galera_cluster.inc --source include/have_innodb.inc ---source include/have_debug.inc ---source include/have_debug_sync.inc # # Test case 1: Start a transaction on node_2a and kill it @@ -135,56 +133,9 @@ update t1 set a =5, b=2; --eval KILL $k_thread --enable_query_log - select * from t1; --disconnect node_2a +--connection node_1 drop table t1; - - -# -# Test case 7: -# run a transaction in node 2, and set a sync point to pause the transaction -# in commit phase. -# Through another connection to node 2, kill the committing transaction by -# KILL QUERY command -# - ---connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 ---connection node_2a ---let $connection_id = `SELECT CONNECTION_ID()` - -CREATE TABLE t1 (i int primary key); - -# Set up sync point -SET DEBUG_SYNC = "before_wsrep_ordered_commit SIGNAL bwoc_reached WAIT_FOR bwoc_continue"; - -# Send insert which will block in the sync point above ---send INSERT INTO t1 VALUES (1) - ---connection node_2 -SET DEBUG_SYNC = "now WAIT_FOR bwoc_reached"; - ---disable_query_log ---disable_result_log -# victim has passed the point of no return, kill is not possible anymore ---eval KILL QUERY $connection_id ---enable_result_log ---enable_query_log - -SET DEBUG_SYNC = "now SIGNAL bwoc_continue"; -SET DEBUG_SYNC='RESET'; ---connection node_2a ---error 0,1213 ---reap - ---connection node_2 -# victim was able to complete the INSERT -select * from t1; - ---disconnect node_2a - ---connection node_2 -drop table t1; - diff --git a/mysql-test/suite/galera/t/galera_bf_kill_debug.cnf b/mysql-test/suite/galera/t/galera_bf_kill_debug.cnf new file mode 100644 index 00000000000..e68f891792c --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_kill_debug.cnf @@ -0,0 +1,7 @@ +!include ../galera_2nodes.cnf + +[mysqld.1] +wsrep-debug=SERVER + +[mysqld.2] +wsrep-debug=SERVER diff --git a/mysql-test/suite/galera/t/galera_bf_kill_debug.test b/mysql-test/suite/galera/t/galera_bf_kill_debug.test new file mode 100644 index 00000000000..b687a5a6a67 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_bf_kill_debug.test @@ -0,0 +1,140 @@ +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +# +# Test case 7: +# 1. Start a transaction on node_2, +# and leave it pending while holding a row locked +# 2. set sync point pause applier +# 3. send a conflicting write on node_1, it will pause +# at the sync point +# 4. though another connection to node_2, kill the local +# transaction +# + +--connection node_2 +CREATE TABLE t1(a int not null primary key auto_increment,b int) engine=InnoDB; +insert into t1 values (NULL,1); + +# +# connection node_2a runs a local transaction, that is victim of BF abort +# and victim of KILL command by connection node_2 +# +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +truncate t1; +insert into t1 values (1,0); + +# start a transaction that will conflict with later applier +begin; +update t1 set b=2 where a=1; + +--connection node_2 +set session wsrep_sync_wait=0; +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1 +--source include/wait_condition.inc + +--let $k_thread = `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = 'root' AND COMMAND = 'Sleep' LIMIT 1` + +# connection node_2b is for controlling debug syn points +# first set a sync point for applier, to pause during BF aborting +# and before THD::awake would be called +# +--connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2b +SET GLOBAL debug_dbug = "d,sync.before_wsrep_thd_abort"; + +# +# replicate an update, which will BF abort the victim node_2a +# however, while applier in node 2 is handling the abort, +# it will pause in sync point set by node_2b +# +--connection node_1 +select * from t1; +update t1 set b= 1 where a=1; + +# +# wait until the applying of above update has reached the sync point +# in node 2 +# +--connection node_2b +SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.before_wsrep_thd_abort_reached"; + +--connection node_2 +# +# pause KILL execution before awake +# +SET DEBUG_SYNC= 'before_awake_no_mutex SIGNAL awake_reached WAIT_FOR continue_kill'; +--disable_query_log +--send_eval KILL $k_thread +--enable_query_log + + +--connection node_2b +SET DEBUG_SYNC='now WAIT_FOR awake_reached'; + +# release applier and KILL operator +SET GLOBAL debug_dbug = ""; +SET DEBUG_SYNC = "now SIGNAL signal.before_wsrep_thd_abort"; +SET DEBUG_SYNC = "now SIGNAL continue_kill"; + +--connection node_2 +--reap + +--connection node_2a +--error 0,1213 +select * from t1; + +--connection node_2 +SET DEBUG_SYNC = "RESET"; + +drop table t1; + +--disconnect node_2a +# +# Test case 7: +# run a transaction in node 2, and set a sync point to pause the transaction +# in commit phase. +# Through another connection to node 2, kill the committing transaction by +# KILL QUERY command +# + +--connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 +--connection node_2a +--let $connection_id = `SELECT CONNECTION_ID()` + +CREATE TABLE t1 (i int primary key); + +# Set up sync point +SET DEBUG_SYNC = "before_wsrep_ordered_commit SIGNAL bwoc_reached WAIT_FOR bwoc_continue"; + +# Send insert which will block in the sync point above +--send INSERT INTO t1 VALUES (1) + +--connection node_2 +SET DEBUG_SYNC = "now WAIT_FOR bwoc_reached"; + +--disable_query_log +--disable_result_log +# victim has passed the point of no return, kill is not possible anymore +--eval KILL QUERY $connection_id +--enable_result_log +--enable_query_log + +SET DEBUG_SYNC = "now SIGNAL bwoc_continue"; +SET DEBUG_SYNC='RESET'; +--connection node_2a +--error 0,1213 +--reap + +--connection node_2 +# victim was able to complete the INSERT +select * from t1; + +--disconnect node_2a + +--connection node_1 +drop table t1; + diff --git a/mysql-test/suite/galera/t/galera_bf_lock_wait.test b/mysql-test/suite/galera/t/galera_bf_lock_wait.test index 97d3b8e0710..a78a94eb1db 100644 --- a/mysql-test/suite/galera/t/galera_bf_lock_wait.test +++ b/mysql-test/suite/galera/t/galera_bf_lock_wait.test @@ -2,8 +2,10 @@ --source include/have_innodb.inc --source include/big_test.inc ---connection node_1 +--connection node_2 +call mtr.add_suppression("WSREP: Trying to continue unpaused monitor"); +--connection node_1 call mtr.add_suppression("WSREP: Trying to continue unpaused monitor"); CREATE TABLE t1 ENGINE=InnoDB select 1 as a, 1 as b union select 2, 2; diff --git a/mysql-test/suite/perfschema/r/nesting.result b/mysql-test/suite/perfschema/r/nesting.result index e3137d634a6..ba655d3c329 100644 --- a/mysql-test/suite/perfschema/r/nesting.result +++ b/mysql-test/suite/perfschema/r/nesting.result @@ -114,152 +114,161 @@ and (end_event_id <= @marker_end) ) all_events order by relative_event_id asc; relative_event_id relative_end_event_id event_name comment nesting_event_type relative_nesting_event_id -0 20 statement/sql/select select "MARKER_BEGIN" as marker NULL NULL -1 4 stage/sql/starting (stage) STATEMENT 0 +0 21 statement/sql/select select "MARKER_BEGIN" as marker NULL NULL +1 5 stage/sql/starting (stage) STATEMENT 0 2 2 wait/io/socket/sql/client_connection recv STAGE 1 3 3 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 1 -4 4 wait/io/file/sql/query_log write STAGE 1 -5 5 stage/sql/checking permissions (stage) STATEMENT 0 -6 6 stage/sql/Opening tables (stage) STATEMENT 0 -7 7 stage/sql/After opening tables (stage) STATEMENT 0 -8 8 stage/sql/init (stage) STATEMENT 0 -9 9 stage/sql/Optimizing (stage) STATEMENT 0 -10 10 stage/sql/Executing (stage) STATEMENT 0 -11 11 stage/sql/End of update loop (stage) STATEMENT 0 -12 12 stage/sql/Query end (stage) STATEMENT 0 -13 13 stage/sql/Commit (stage) STATEMENT 0 -14 14 stage/sql/closing tables (stage) STATEMENT 0 -15 15 stage/sql/Starting cleanup (stage) STATEMENT 0 -16 16 stage/sql/Freeing items (stage) STATEMENT 0 -17 17 wait/io/socket/sql/client_connection send STATEMENT 0 -18 18 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 0 -19 20 stage/sql/Reset for next command (stage) STATEMENT 0 -20 20 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 19 -21 21 idle idle NULL NULL -22 42 statement/sql/select select "This is simple statement one" as payload NULL NULL -23 26 stage/sql/starting (stage) STATEMENT 22 -24 24 wait/io/socket/sql/client_connection recv STAGE 23 -25 25 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 23 -26 26 wait/io/file/sql/query_log write STAGE 23 -27 27 stage/sql/checking permissions (stage) STATEMENT 22 -28 28 stage/sql/Opening tables (stage) STATEMENT 22 -29 29 stage/sql/After opening tables (stage) STATEMENT 22 -30 30 stage/sql/init (stage) STATEMENT 22 -31 31 stage/sql/Optimizing (stage) STATEMENT 22 -32 32 stage/sql/Executing (stage) STATEMENT 22 -33 33 stage/sql/End of update loop (stage) STATEMENT 22 -34 34 stage/sql/Query end (stage) STATEMENT 22 -35 35 stage/sql/Commit (stage) STATEMENT 22 -36 36 stage/sql/closing tables (stage) STATEMENT 22 -37 37 stage/sql/Starting cleanup (stage) STATEMENT 22 -38 38 stage/sql/Freeing items (stage) STATEMENT 22 -39 39 wait/io/socket/sql/client_connection send STATEMENT 22 -40 40 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 22 -41 42 stage/sql/Reset for next command (stage) STATEMENT 22 -42 42 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 41 -43 43 idle idle NULL NULL -44 64 statement/sql/select select "This is simple statement two" as payload NULL NULL -45 48 stage/sql/starting (stage) STATEMENT 44 -46 46 wait/io/socket/sql/client_connection recv STAGE 45 -47 47 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 45 -48 48 wait/io/file/sql/query_log write STAGE 45 -49 49 stage/sql/checking permissions (stage) STATEMENT 44 -50 50 stage/sql/Opening tables (stage) STATEMENT 44 -51 51 stage/sql/After opening tables (stage) STATEMENT 44 -52 52 stage/sql/init (stage) STATEMENT 44 -53 53 stage/sql/Optimizing (stage) STATEMENT 44 -54 54 stage/sql/Executing (stage) STATEMENT 44 -55 55 stage/sql/End of update loop (stage) STATEMENT 44 -56 56 stage/sql/Query end (stage) STATEMENT 44 -57 57 stage/sql/Commit (stage) STATEMENT 44 -58 58 stage/sql/closing tables (stage) STATEMENT 44 -59 59 stage/sql/Starting cleanup (stage) STATEMENT 44 -60 60 stage/sql/Freeing items (stage) STATEMENT 44 -61 61 wait/io/socket/sql/client_connection send STATEMENT 44 -62 62 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 44 -63 64 stage/sql/Reset for next command (stage) STATEMENT 44 -64 64 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 63 -65 65 idle idle NULL NULL -66 85 statement/sql/select select "This is the first part of a multi query" as payload; +4 4 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 1 +5 5 wait/io/file/sql/query_log write STAGE 1 +6 6 stage/sql/checking permissions (stage) STATEMENT 0 +7 7 stage/sql/Opening tables (stage) STATEMENT 0 +8 8 stage/sql/After opening tables (stage) STATEMENT 0 +9 9 stage/sql/init (stage) STATEMENT 0 +10 10 stage/sql/Optimizing (stage) STATEMENT 0 +11 11 stage/sql/Executing (stage) STATEMENT 0 +12 12 stage/sql/End of update loop (stage) STATEMENT 0 +13 13 stage/sql/Query end (stage) STATEMENT 0 +14 14 stage/sql/Commit (stage) STATEMENT 0 +15 15 stage/sql/closing tables (stage) STATEMENT 0 +16 16 stage/sql/Starting cleanup (stage) STATEMENT 0 +17 17 stage/sql/Freeing items (stage) STATEMENT 0 +18 18 wait/io/socket/sql/client_connection send STATEMENT 0 +19 19 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 0 +20 21 stage/sql/Reset for next command (stage) STATEMENT 0 +21 21 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 20 +22 22 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 0 +23 23 idle idle NULL NULL +24 45 statement/sql/select select "This is simple statement one" as payload NULL NULL +25 29 stage/sql/starting (stage) STATEMENT 24 +26 26 wait/io/socket/sql/client_connection recv STAGE 25 +27 27 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 25 +28 28 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 25 +29 29 wait/io/file/sql/query_log write STAGE 25 +30 30 stage/sql/checking permissions (stage) STATEMENT 24 +31 31 stage/sql/Opening tables (stage) STATEMENT 24 +32 32 stage/sql/After opening tables (stage) STATEMENT 24 +33 33 stage/sql/init (stage) STATEMENT 24 +34 34 stage/sql/Optimizing (stage) STATEMENT 24 +35 35 stage/sql/Executing (stage) STATEMENT 24 +36 36 stage/sql/End of update loop (stage) STATEMENT 24 +37 37 stage/sql/Query end (stage) STATEMENT 24 +38 38 stage/sql/Commit (stage) STATEMENT 24 +39 39 stage/sql/closing tables (stage) STATEMENT 24 +40 40 stage/sql/Starting cleanup (stage) STATEMENT 24 +41 41 stage/sql/Freeing items (stage) STATEMENT 24 +42 42 wait/io/socket/sql/client_connection send STATEMENT 24 +43 43 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 24 +44 45 stage/sql/Reset for next command (stage) STATEMENT 24 +45 45 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 44 +46 46 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 24 +47 47 idle idle NULL NULL +48 69 statement/sql/select select "This is simple statement two" as payload NULL NULL +49 53 stage/sql/starting (stage) STATEMENT 48 +50 50 wait/io/socket/sql/client_connection recv STAGE 49 +51 51 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 49 +52 52 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 49 +53 53 wait/io/file/sql/query_log write STAGE 49 +54 54 stage/sql/checking permissions (stage) STATEMENT 48 +55 55 stage/sql/Opening tables (stage) STATEMENT 48 +56 56 stage/sql/After opening tables (stage) STATEMENT 48 +57 57 stage/sql/init (stage) STATEMENT 48 +58 58 stage/sql/Optimizing (stage) STATEMENT 48 +59 59 stage/sql/Executing (stage) STATEMENT 48 +60 60 stage/sql/End of update loop (stage) STATEMENT 48 +61 61 stage/sql/Query end (stage) STATEMENT 48 +62 62 stage/sql/Commit (stage) STATEMENT 48 +63 63 stage/sql/closing tables (stage) STATEMENT 48 +64 64 stage/sql/Starting cleanup (stage) STATEMENT 48 +65 65 stage/sql/Freeing items (stage) STATEMENT 48 +66 66 wait/io/socket/sql/client_connection send STATEMENT 48 +67 67 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 48 +68 69 stage/sql/Reset for next command (stage) STATEMENT 48 +69 69 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 68 +70 70 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 48 +71 71 idle idle NULL NULL +72 92 statement/sql/select select "This is the first part of a multi query" as payload; select "And this is the second part of a multi query" as payload; select "With a third part to make things complete" as payload NULL NULL -67 71 stage/sql/starting (stage) STATEMENT 66 -68 68 wait/io/socket/sql/client_connection recv STAGE 67 -69 69 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 67 -70 70 wait/io/file/sql/query_log write STAGE 67 -71 71 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 67 -72 72 stage/sql/checking permissions (stage) STATEMENT 66 -73 73 stage/sql/Opening tables (stage) STATEMENT 66 -74 74 stage/sql/After opening tables (stage) STATEMENT 66 -75 75 stage/sql/init (stage) STATEMENT 66 -76 76 stage/sql/Optimizing (stage) STATEMENT 66 -77 77 stage/sql/Executing (stage) STATEMENT 66 -78 78 stage/sql/End of update loop (stage) STATEMENT 66 -79 79 stage/sql/Query end (stage) STATEMENT 66 -80 80 stage/sql/Commit (stage) STATEMENT 66 -81 81 stage/sql/closing tables (stage) STATEMENT 66 -82 82 stage/sql/Starting cleanup (stage) STATEMENT 66 -83 85 stage/sql/Freeing items (stage) STATEMENT 66 -84 84 wait/io/socket/sql/client_connection send STAGE 83 -85 85 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 83 -86 103 statement/sql/select select "And this is the second part of a multi query" as payload; +73 78 stage/sql/starting (stage) STATEMENT 72 +74 74 wait/io/socket/sql/client_connection recv STAGE 73 +75 75 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 73 +76 76 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 73 +77 77 wait/io/file/sql/query_log write STAGE 73 +78 78 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 73 +79 79 stage/sql/checking permissions (stage) STATEMENT 72 +80 80 stage/sql/Opening tables (stage) STATEMENT 72 +81 81 stage/sql/After opening tables (stage) STATEMENT 72 +82 82 stage/sql/init (stage) STATEMENT 72 +83 83 stage/sql/Optimizing (stage) STATEMENT 72 +84 84 stage/sql/Executing (stage) STATEMENT 72 +85 85 stage/sql/End of update loop (stage) STATEMENT 72 +86 86 stage/sql/Query end (stage) STATEMENT 72 +87 87 stage/sql/Commit (stage) STATEMENT 72 +88 88 stage/sql/closing tables (stage) STATEMENT 72 +89 89 stage/sql/Starting cleanup (stage) STATEMENT 72 +90 92 stage/sql/Freeing items (stage) STATEMENT 72 +91 91 wait/io/socket/sql/client_connection send STAGE 90 +92 92 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 90 +93 110 statement/sql/select select "And this is the second part of a multi query" as payload; select "With a third part to make things complete" as payload NULL NULL -87 89 stage/sql/starting (stage) STATEMENT 86 -88 88 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 87 -89 89 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 87 -90 90 stage/sql/checking permissions (stage) STATEMENT 86 -91 91 stage/sql/Opening tables (stage) STATEMENT 86 -92 92 stage/sql/After opening tables (stage) STATEMENT 86 -93 93 stage/sql/init (stage) STATEMENT 86 -94 94 stage/sql/Optimizing (stage) STATEMENT 86 -95 95 stage/sql/Executing (stage) STATEMENT 86 -96 96 stage/sql/End of update loop (stage) STATEMENT 86 -97 97 stage/sql/Query end (stage) STATEMENT 86 -98 98 stage/sql/Commit (stage) STATEMENT 86 -99 99 stage/sql/closing tables (stage) STATEMENT 86 -100 100 stage/sql/Starting cleanup (stage) STATEMENT 86 -101 103 stage/sql/Freeing items (stage) STATEMENT 86 -102 102 wait/io/socket/sql/client_connection send STAGE 101 -103 103 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 101 -104 122 statement/sql/select select "With a third part to make things complete" as payload NULL NULL -105 106 stage/sql/starting (stage) STATEMENT 104 -106 106 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 105 -107 107 stage/sql/checking permissions (stage) STATEMENT 104 -108 108 stage/sql/Opening tables (stage) STATEMENT 104 -109 109 stage/sql/After opening tables (stage) STATEMENT 104 -110 110 stage/sql/init (stage) STATEMENT 104 -111 111 stage/sql/Optimizing (stage) STATEMENT 104 -112 112 stage/sql/Executing (stage) STATEMENT 104 -113 113 stage/sql/End of update loop (stage) STATEMENT 104 -114 114 stage/sql/Query end (stage) STATEMENT 104 -115 115 stage/sql/Commit (stage) STATEMENT 104 -116 116 stage/sql/closing tables (stage) STATEMENT 104 -117 117 stage/sql/Starting cleanup (stage) STATEMENT 104 -118 118 stage/sql/Freeing items (stage) STATEMENT 104 -119 119 wait/io/socket/sql/client_connection send STATEMENT 104 -120 120 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 104 -121 122 stage/sql/Reset for next command (stage) STATEMENT 104 -122 122 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 121 -123 123 idle idle NULL NULL -124 144 statement/sql/select select "MARKER_END" as marker NULL NULL -125 128 stage/sql/starting (stage) STATEMENT 124 -126 126 wait/io/socket/sql/client_connection recv STAGE 125 -127 127 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 125 -128 128 wait/io/file/sql/query_log write STAGE 125 -129 129 stage/sql/checking permissions (stage) STATEMENT 124 -130 130 stage/sql/Opening tables (stage) STATEMENT 124 -131 131 stage/sql/After opening tables (stage) STATEMENT 124 -132 132 stage/sql/init (stage) STATEMENT 124 -133 133 stage/sql/Optimizing (stage) STATEMENT 124 -134 134 stage/sql/Executing (stage) STATEMENT 124 -135 135 stage/sql/End of update loop (stage) STATEMENT 124 -136 136 stage/sql/Query end (stage) STATEMENT 124 -137 137 stage/sql/Commit (stage) STATEMENT 124 -138 138 stage/sql/closing tables (stage) STATEMENT 124 -139 139 stage/sql/Starting cleanup (stage) STATEMENT 124 -140 140 stage/sql/Freeing items (stage) STATEMENT 124 -141 141 wait/io/socket/sql/client_connection send STATEMENT 124 -142 142 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 124 -143 144 stage/sql/Reset for next command (stage) STATEMENT 124 -144 144 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 143 +94 96 stage/sql/starting (stage) STATEMENT 93 +95 95 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 94 +96 96 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 94 +97 97 stage/sql/checking permissions (stage) STATEMENT 93 +98 98 stage/sql/Opening tables (stage) STATEMENT 93 +99 99 stage/sql/After opening tables (stage) STATEMENT 93 +100 100 stage/sql/init (stage) STATEMENT 93 +101 101 stage/sql/Optimizing (stage) STATEMENT 93 +102 102 stage/sql/Executing (stage) STATEMENT 93 +103 103 stage/sql/End of update loop (stage) STATEMENT 93 +104 104 stage/sql/Query end (stage) STATEMENT 93 +105 105 stage/sql/Commit (stage) STATEMENT 93 +106 106 stage/sql/closing tables (stage) STATEMENT 93 +107 107 stage/sql/Starting cleanup (stage) STATEMENT 93 +108 110 stage/sql/Freeing items (stage) STATEMENT 93 +109 109 wait/io/socket/sql/client_connection send STAGE 108 +110 110 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STAGE 108 +111 129 statement/sql/select select "With a third part to make things complete" as payload NULL NULL +112 113 stage/sql/starting (stage) STATEMENT 111 +113 113 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 112 +114 114 stage/sql/checking permissions (stage) STATEMENT 111 +115 115 stage/sql/Opening tables (stage) STATEMENT 111 +116 116 stage/sql/After opening tables (stage) STATEMENT 111 +117 117 stage/sql/init (stage) STATEMENT 111 +118 118 stage/sql/Optimizing (stage) STATEMENT 111 +119 119 stage/sql/Executing (stage) STATEMENT 111 +120 120 stage/sql/End of update loop (stage) STATEMENT 111 +121 121 stage/sql/Query end (stage) STATEMENT 111 +122 122 stage/sql/Commit (stage) STATEMENT 111 +123 123 stage/sql/closing tables (stage) STATEMENT 111 +124 124 stage/sql/Starting cleanup (stage) STATEMENT 111 +125 125 stage/sql/Freeing items (stage) STATEMENT 111 +126 126 wait/io/socket/sql/client_connection send STATEMENT 111 +127 127 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 111 +128 129 stage/sql/Reset for next command (stage) STATEMENT 111 +129 129 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 128 +130 130 wait/synch/mutex/sql/THD::LOCK_thd_data lock STATEMENT 111 +131 131 idle idle NULL NULL +132 153 statement/sql/select select "MARKER_END" as marker NULL NULL +133 137 stage/sql/starting (stage) STATEMENT 132 +134 134 wait/io/socket/sql/client_connection recv STAGE 133 +135 135 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 133 +136 136 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 133 +137 137 wait/io/file/sql/query_log write STAGE 133 +138 138 stage/sql/checking permissions (stage) STATEMENT 132 +139 139 stage/sql/Opening tables (stage) STATEMENT 132 +140 140 stage/sql/After opening tables (stage) STATEMENT 132 +141 141 stage/sql/init (stage) STATEMENT 132 +142 142 stage/sql/Optimizing (stage) STATEMENT 132 +143 143 stage/sql/Executing (stage) STATEMENT 132 +144 144 stage/sql/End of update loop (stage) STATEMENT 132 +145 145 stage/sql/Query end (stage) STATEMENT 132 +146 146 stage/sql/Commit (stage) STATEMENT 132 +147 147 stage/sql/closing tables (stage) STATEMENT 132 +148 148 stage/sql/Starting cleanup (stage) STATEMENT 132 +149 149 stage/sql/Freeing items (stage) STATEMENT 132 +150 150 wait/io/socket/sql/client_connection send STATEMENT 132 +151 151 wait/synch/mutex/sql/THD::LOCK_thd_kill lock STATEMENT 132 +152 153 stage/sql/Reset for next command (stage) STATEMENT 132 +153 153 wait/synch/mutex/sql/THD::LOCK_thd_data lock STAGE 152 disconnect con1; diff --git a/sql/service_wsrep.cc b/sql/service_wsrep.cc index 6b06bddd773..f61db1e80e8 100644 --- a/sql/service_wsrep.cc +++ b/sql/service_wsrep.cc @@ -199,6 +199,16 @@ extern "C" void wsrep_handle_SR_rollback(THD *bf_thd, extern "C" my_bool wsrep_thd_bf_abort(THD *bf_thd, THD *victim_thd, my_bool signal) { + DBUG_EXECUTE_IF("sync.before_wsrep_thd_abort", + { + const char act[]= + "now " + "SIGNAL sync.before_wsrep_thd_abort_reached " + "WAIT_FOR signal.before_wsrep_thd_abort"; + DBUG_ASSERT(!debug_sync_set_action(bf_thd, + STRING_WITH_LEN(act))); + };); + my_bool ret= wsrep_bf_abort(bf_thd, victim_thd); /* Send awake signal if victim was BF aborted or does not @@ -210,10 +220,22 @@ extern "C" my_bool wsrep_thd_bf_abort(THD *bf_thd, THD *victim_thd, mysql_mutex_assert_not_owner(&victim_thd->LOCK_thd_data); mysql_mutex_assert_not_owner(&victim_thd->LOCK_thd_kill); mysql_mutex_lock(&victim_thd->LOCK_thd_data); + + if (victim_thd->wsrep_aborter && victim_thd->wsrep_aborter != bf_thd->thread_id) + { + WSREP_DEBUG("victim is killed already by %llu, skipping awake", + victim_thd->wsrep_aborter); + mysql_mutex_unlock(&victim_thd->LOCK_thd_data); + return false; + } + mysql_mutex_lock(&victim_thd->LOCK_thd_kill); + victim_thd->wsrep_aborter= bf_thd->thread_id; victim_thd->awake_no_mutex(KILL_QUERY); mysql_mutex_unlock(&victim_thd->LOCK_thd_kill); mysql_mutex_unlock(&victim_thd->LOCK_thd_data); + } else { + WSREP_DEBUG("wsrep_thd_bf_abort skipped awake"); } return ret; } @@ -339,3 +361,15 @@ extern "C" ulong wsrep_OSU_method_get(const MYSQL_THD thd) else return(global_system_variables.wsrep_OSU_method); } + +extern "C" bool wsrep_thd_set_wsrep_aborter(THD *bf_thd, THD *victim_thd) +{ + WSREP_DEBUG("wsrep_thd_set_wsrep_aborter called"); + mysql_mutex_assert_owner(&victim_thd->LOCK_thd_data); + if (victim_thd->wsrep_aborter && victim_thd->wsrep_aborter != bf_thd->thread_id) + { + return true; + } + victim_thd->wsrep_aborter = bf_thd->thread_id; + return false; +} \ No newline at end of file diff --git a/sql/sql_class.cc b/sql/sql_class.cc index d6a86fc1e4a..484c90d706b 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -706,6 +706,7 @@ THD::THD(my_thread_id id, bool is_wsrep_applier) wsrep_affected_rows(0), wsrep_has_ignored_error(false), wsrep_ignore_table(false), + wsrep_aborter(0), /* wsrep-lib */ m_wsrep_next_trx_id(WSREP_UNDEFINED_TRX_ID), @@ -1308,6 +1309,7 @@ void THD::init() wsrep_rbr_buf = NULL; wsrep_affected_rows = 0; m_wsrep_next_trx_id = WSREP_UNDEFINED_TRX_ID; + wsrep_aborter = 0; #endif /* WITH_WSREP */ if (variables.sql_log_bin) @@ -2139,11 +2141,19 @@ void THD::reset_killed() DBUG_ENTER("reset_killed"); if (killed != NOT_KILLED) { + mysql_mutex_assert_not_owner(&LOCK_thd_kill); mysql_mutex_lock(&LOCK_thd_kill); killed= NOT_KILLED; killed_err= 0; mysql_mutex_unlock(&LOCK_thd_kill); } +#ifdef WITH_WSREP + mysql_mutex_assert_not_owner(&LOCK_thd_data); + mysql_mutex_lock(&LOCK_thd_data); + wsrep_aborter= 0; + mysql_mutex_unlock(&LOCK_thd_data); +#endif /* WITH_WSREP */ + DBUG_VOID_RETURN; } diff --git a/sql/sql_class.h b/sql/sql_class.h index 7eba953d241..2e388ef7d72 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -5013,7 +5013,8 @@ public: table updates from being replicated to other nodes via galera replication. */ bool wsrep_ignore_table; - + /* thread who has started kill for this THD protected by LOCK_thd_data*/ + my_thread_id wsrep_aborter; /* Transaction id: diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index c839274e3ca..d3c7b27cbd3 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -9149,7 +9149,6 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ uint error= (type == KILL_TYPE_QUERY ? ER_NO_SUCH_QUERY : ER_NO_SUCH_THREAD); DBUG_ENTER("kill_one_thread"); DBUG_PRINT("enter", ("id: %lld signal: %u", id, (uint) kill_signal)); - WSREP_DEBUG("kill_one_thread %llu", thd->thread_id); if (id && (tmp= find_thread_by_id(id, type == KILL_TYPE_QUERY))) { /* @@ -9182,12 +9181,29 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ thd->security_ctx->user_matches(tmp->security_ctx)) #endif /* WITH_WSREP */ { - tmp->awake_no_mutex(kill_signal); - error=0; +#ifdef WITH_WSREP + DEBUG_SYNC(thd, "before_awake_no_mutex"); + if (tmp->wsrep_aborter && tmp->wsrep_aborter != thd->thread_id) + { + /* victim is in hit list already, bail out */ + WSREP_DEBUG("victim has wsrep aborter: %lu, skipping awake()", + tmp->wsrep_aborter); + error= 0; + } + else +#endif /* WITH_WSREP */ + { + WSREP_DEBUG("kill_one_thread %llu, victim: %llu wsrep_aborter %llu by signal %d", + thd->thread_id, id, tmp->wsrep_aborter, kill_signal); + tmp->awake_no_mutex(kill_signal); + WSREP_DEBUG("victim: %llu taken care of", id); + error= 0; + } } else error= (type == KILL_TYPE_QUERY ? ER_KILL_QUERY_DENIED_ERROR : ER_KILL_DENIED_ERROR); + if (WSREP(tmp)) mysql_mutex_unlock(&tmp->LOCK_thd_data); mysql_mutex_unlock(&tmp->LOCK_thd_kill); } diff --git a/sql/sql_plugin_services.ic b/sql/sql_plugin_services.ic index 2db426e7b57..e4f9f3c0d13 100644 --- a/sql/sql_plugin_services.ic +++ b/sql/sql_plugin_services.ic @@ -177,7 +177,8 @@ static struct wsrep_service_st wsrep_handler = { wsrep_thd_is_applying, wsrep_OSU_method_get, wsrep_thd_has_ignored_error, - wsrep_thd_set_ignored_error + wsrep_thd_set_ignored_error, + wsrep_thd_set_wsrep_aborter }; static struct thd_specifics_service_st thd_specifics_handler= diff --git a/sql/wsrep_dummy.cc b/sql/wsrep_dummy.cc index 6405a5d2cb7..139cd5cd7ae 100644 --- a/sql/wsrep_dummy.cc +++ b/sql/wsrep_dummy.cc @@ -149,4 +149,6 @@ my_bool wsrep_thd_has_ignored_error(const THD*) void wsrep_thd_set_ignored_error(THD*, my_bool) { } ulong wsrep_OSU_method_get(const THD*) +{ return 0;} +bool wsrep_thd_set_wsrep_aborter(THD*, THD*) { return 0;} \ No newline at end of file diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 04645ba025b..40b38814a85 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -19020,10 +19020,17 @@ wsrep_innobase_kill_one_trx(THD* bf_thd, trx_t *victim_trx, /* Mark transaction as a victim for Galera abort */ victim_trx->lock.was_chosen_as_wsrep_victim= true; + if (wsrep_thd_set_wsrep_aborter(bf_thd, thd)) + { + WSREP_DEBUG("innodb kill transaction skipped due to wsrep_aborter set"); + wsrep_thd_UNLOCK(thd); + DBUG_RETURN(0); + } /* Note that we need to release this as it will be acquired below in wsrep-lib */ wsrep_thd_UNLOCK(thd); + DEBUG_SYNC(bf_thd, "before_wsrep_thd_abort"); if (wsrep_thd_bf_abort(bf_thd, thd, signal)) { From 8c7f7bae47922b44ddae1db587afc7ee029c8b17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Wed, 22 Jul 2020 08:48:14 +0300 Subject: [PATCH 081/188] Fix regex on test. --- mysql-test/suite/galera/t/galera_var_cluster_conf_id.test | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/suite/galera/t/galera_var_cluster_conf_id.test b/mysql-test/suite/galera/t/galera_var_cluster_conf_id.test index dd4a630035d..668ace297a8 100644 --- a/mysql-test/suite/galera/t/galera_var_cluster_conf_id.test +++ b/mysql-test/suite/galera/t/galera_var_cluster_conf_id.test @@ -1,9 +1,9 @@ --source include/galera_cluster.inc --connection node_1 ---replace_regex /18446744073709551/ERROR/ /[0-9+]/#/ +--replace_regex /18446744073709551/ERROR/ /[0-9]+/#/ show status like 'wsrep_cluster_conf_id'; --connection node_2 ---replace_regex /18446744073709551/ERROR/ /[0-9+]/#/ +--replace_regex /18446744073709551/ERROR/ /[0-9]+/#/ show status like 'wsrep_cluster_conf_id'; From c86accc7ac9ea503dc7988e7921e58a9bf7b2f80 Mon Sep 17 00:00:00 2001 From: Sujatha Date: Mon, 20 Jul 2020 17:57:39 +0530 Subject: [PATCH 082/188] MDEV-23108: Point in time recovery of binary log fails when sql_mode=ORACLE Problem: ======== During point in time recovery of binary log syntax error is reported for BEGIN statement and recovery fails. Analysis: ========= In MariaDB 10.3 and later, setting the sql_mode system variable to Oracle allows the server to understand a subset of Oracle's PL/SQL language. When sql_mode=ORACLE is set, it switches the parser from the MariaDB parser to Oracle compatible parser. With this change 'BEGIN' is not considered as 'START TRANSACTION'. Hence the syntax error is reported. Fix: === At preset 'BEGIN' query is generated from 'Gtid_log_event::print'. The current session specific 'sql_mode' information is not present as part of 'Gtid_log_event'. If it was available then, mysqlbinlog tool can make use of 'sql_mode == ORACLE' and can output "START TRANSACTION" in this particular mode and for other sql_modes it will write "BEGIN" as part of output. Since it is not available 'mysqlbinlog' tool will output all 'BEGIN' statements as 'START TRANSACTION' irrespective of 'sql_mode'. --- .../binlog_parallel_replication_marks.test | 2 +- mysql-test/main/mysqlbinlog-innodb.result | 8 +- mysql-test/main/mysqlbinlog.result | 74 ++-- .../main/mysqlbinlog_row_compressed.result | 16 +- .../main/mysqlbinlog_row_minimal.result | 18 +- .../main/mysqlbinlog_stmt_compressed.result | 16 +- mysql-test/main/user_var-binlog.result | 4 +- .../suite/binlog/r/binlog_mysqlbinlog2.result | 206 +++++----- .../binlog/r/binlog_mysqlbinlog_row.result | 358 +++++++++--------- .../r/binlog_mysqlbinlog_row_innodb.result | 40 +- .../r/binlog_mysqlbinlog_row_myisam.result | 40 +- .../r/binlog_mysqlbinlog_row_trans.result | 16 +- ...nlog_parallel_replication_marks_row.result | 18 +- ..._parallel_replication_marks_stm_mix.result | 18 +- .../suite/binlog/r/binlog_row_annotate.result | 72 ++-- .../binlog/r/binlog_row_ctype_ucs.result | 14 +- .../r/binlog_row_mysqlbinlog_options.result | 28 +- .../binlog/r/binlog_stm_ctype_ucs.result | 14 +- mysql-test/suite/binlog/r/flashback.result | 20 +- .../binlog_row_annotate.result | 36 +- .../oracle/r/binlog_ptr_mysqlbinlog.result | 100 +++++ .../t/binlog_ptr_mysqlbinlog-master.opt | 1 + .../oracle/t/binlog_ptr_mysqlbinlog.test | 117 ++++++ .../rpl/r/rpl_blackhole_row_annotate.result | 22 +- mysql-test/suite/rpl/r/rpl_hrtime.result | 10 +- mysql-test/suite/rpl/r/rpl_mdev382.result | 10 +- mysql-test/suite/rpl/r/rpl_sp.result | 52 +-- sql/log_event.cc | 8 +- 28 files changed, 778 insertions(+), 560 deletions(-) create mode 100644 mysql-test/suite/compat/oracle/r/binlog_ptr_mysqlbinlog.result create mode 100644 mysql-test/suite/compat/oracle/t/binlog_ptr_mysqlbinlog-master.opt create mode 100644 mysql-test/suite/compat/oracle/t/binlog_ptr_mysqlbinlog.test diff --git a/mysql-test/include/binlog_parallel_replication_marks.test b/mysql-test/include/binlog_parallel_replication_marks.test index 3976088ca43..29e86d64d3e 100644 --- a/mysql-test/include/binlog_parallel_replication_marks.test +++ b/mysql-test/include/binlog_parallel_replication_marks.test @@ -80,7 +80,7 @@ while () { s/table id \d+/table id #/; s/mapped to number \d+/mapped to number #/; s/CRC32 0x[0-9a-f]+/CRC32 0x########/; - print if /\b(GTID|BEGIN|COMMIT|Table_map|Write_rows|Update_rows|Delete_rows|generated by server|40005 TEMPORARY)\b/; + print if /\b(GTID|START TRANSACTION|COMMIT|Table_map|Write_rows|Update_rows|Delete_rows|generated by server|40005 TEMPORARY)\b/; } close F; EOF diff --git a/mysql-test/main/mysqlbinlog-innodb.result b/mysql-test/main/mysqlbinlog-innodb.result index f9f48299f41..9d3bcc7c776 100644 --- a/mysql-test/main/mysqlbinlog-innodb.result +++ b/mysql-test/main/mysqlbinlog-innodb.result @@ -24,7 +24,7 @@ FLUSH LOGS; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; use `test`/*!*/; SET TIMESTAMP=1000000000/*!*/; @@ -39,7 +39,7 @@ SET @@session.collation_database=DEFAULT/*!*/; INSERT INTO t1 VALUES (1) /*!*/; COMMIT/*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; INSERT INTO t1 VALUES (2) @@ -55,7 +55,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; use `foo`/*!*/; SET TIMESTAMP=1000000000/*!*/; @@ -70,7 +70,7 @@ SET @@session.collation_database=DEFAULT/*!*/; INSERT INTO t1 VALUES (1) /*!*/; COMMIT/*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; INSERT INTO t1 VALUES (2) diff --git a/mysql-test/main/mysqlbinlog.result b/mysql-test/main/mysqlbinlog.result index decd095bbdf..4c82563e0f6 100644 --- a/mysql-test/main/mysqlbinlog.result +++ b/mysql-test/main/mysqlbinlog.result @@ -37,7 +37,7 @@ create table t1 (word varchar(20)) SET TIMESTAMP=1000000000/*!*/; create table t2 (id int auto_increment not null primary key) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; insert into t1 values ("abirvalg") @@ -45,7 +45,7 @@ insert into t1 values ("abirvalg") SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1000000000/*!*/; @@ -54,7 +54,7 @@ insert into t2 values () SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`word`) @@ -62,7 +62,7 @@ LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FI SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`word`) @@ -70,7 +70,7 @@ LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FI SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`word`) @@ -78,7 +78,7 @@ LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FI SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`word`) @@ -97,7 +97,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; use `test`/*!*/; SET TIMESTAMP=1000000000/*!*/; @@ -114,7 +114,7 @@ LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FI SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; insert into t1 values ("Alas") @@ -134,7 +134,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; SET @@session.pseudo_thread_id=999999999/*!*/; @@ -147,28 +147,28 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; COMMIT @@ -184,7 +184,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; use `test`/*!*/; SET TIMESTAMP=1000000000/*!*/; @@ -231,7 +231,7 @@ create table t1 (word varchar(20)) SET TIMESTAMP=1000000000/*!*/; create table t2 (id int auto_increment not null primary key) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; insert into t1 values ("abirvalg") @@ -239,7 +239,7 @@ insert into t1 values ("abirvalg") SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1000000000/*!*/; @@ -248,7 +248,7 @@ insert into t2 values () SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`word`) @@ -256,7 +256,7 @@ LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FI SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`word`) @@ -264,7 +264,7 @@ LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FI SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`word`) @@ -272,7 +272,7 @@ LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FI SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`word`) @@ -291,7 +291,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; use `test`/*!*/; SET TIMESTAMP=1000000000/*!*/; @@ -308,7 +308,7 @@ LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FI SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; insert into t1 values ("Alas") @@ -328,7 +328,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; SET @@session.pseudo_thread_id=999999999/*!*/; @@ -341,28 +341,28 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; COMMIT @@ -378,7 +378,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; use `test`/*!*/; SET TIMESTAMP=1000000000/*!*/; @@ -553,7 +553,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a varchar(64) character set utf8) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`) @@ -561,7 +561,7 @@ LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FI SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; SET @@session.collation_database=7/*!*/; @@ -570,7 +570,7 @@ LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FI SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; SET @@session.collation_database=DEFAULT/*!*/; @@ -579,7 +579,7 @@ LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FI SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`) @@ -587,7 +587,7 @@ LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FI SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; SET @@session.collation_database=7/*!*/; @@ -596,7 +596,7 @@ LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FI SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; SET @@session.collation_database=DEFAULT/*!*/; @@ -605,7 +605,7 @@ LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` FI SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; LOAD DATA LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/SQL_LOAD_MB-#-#' INTO TABLE `t1` CHARACTER SET koi8r FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a`) diff --git a/mysql-test/main/mysqlbinlog_row_compressed.result b/mysql-test/main/mysqlbinlog_row_compressed.result index 94125352654..cb8d60704f9 100644 --- a/mysql-test/main/mysqlbinlog_row_compressed.result +++ b/mysql-test/main/mysqlbinlog_row_compressed.result @@ -53,7 +53,7 @@ CREATE TABLE t2 (pk INT PRIMARY KEY, f1 INT, f2 INT, f3 INT, f4 INT, f5 MEDIUMIN # at 727 # server id 1 end_log_pos 769 CRC32 XXX GTID 0-1-3 /*!100001 SET @@session.gtid_seq_no=3*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 769 # at 843 @@ -82,7 +82,7 @@ COMMIT # at 1040 # server id 1 end_log_pos 1082 CRC32 XXX GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 1082 # at 1158 @@ -111,7 +111,7 @@ COMMIT # at 1354 # server id 1 end_log_pos 1396 CRC32 XXX GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 1396 # at 1474 @@ -140,7 +140,7 @@ COMMIT # at 1669 # server id 1 end_log_pos 1711 CRC32 XXX GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 1711 # at 1786 @@ -169,7 +169,7 @@ COMMIT # at 1982 # server id 1 end_log_pos 2024 CRC32 XXX GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 2024 # at 2078 @@ -231,7 +231,7 @@ COMMIT # at 2298 # server id 1 end_log_pos 2340 CRC32 XXX GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 2340 # at 2406 @@ -312,7 +312,7 @@ COMMIT # at 2634 # server id 1 end_log_pos 2676 CRC32 XXX GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 2676 # at 2713 @@ -374,7 +374,7 @@ COMMIT # at 2934 # server id 1 end_log_pos 2976 CRC32 XXX GTID 0-1-10 /*!100001 SET @@session.gtid_seq_no=10*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 2976 # at 3013 diff --git a/mysql-test/main/mysqlbinlog_row_minimal.result b/mysql-test/main/mysqlbinlog_row_minimal.result index 6f3dbab55a8..933457edc25 100644 --- a/mysql-test/main/mysqlbinlog_row_minimal.result +++ b/mysql-test/main/mysqlbinlog_row_minimal.result @@ -51,7 +51,7 @@ CREATE TABLE t2 (pk INT PRIMARY KEY, f1 INT, f2 INT, f3 INT, f4 INT, f5 MEDIUMIN # at 774 # server id 1 end_log_pos 816 CRC32 XXX GTID 0-1-3 /*!100001 SET @@session.gtid_seq_no=3*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 816 # at 890 @@ -80,7 +80,7 @@ COMMIT # at 1088 # server id 1 end_log_pos 1130 CRC32 XXX GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 1130 # at 1206 @@ -109,7 +109,7 @@ COMMIT # at 1403 # server id 1 end_log_pos 1445 CRC32 XXX GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 1445 # at 1523 @@ -138,7 +138,7 @@ COMMIT # at 1719 # server id 1 end_log_pos 1761 CRC32 XXX GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 1761 # at 1836 @@ -167,7 +167,7 @@ COMMIT # at 2035 # server id 1 end_log_pos 2077 CRC32 XXX GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 2077 # at 2131 @@ -229,7 +229,7 @@ COMMIT # at 2427 # server id 1 end_log_pos 2469 CRC32 XXX GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 2469 # at 2535 @@ -262,7 +262,7 @@ COMMIT # at 2730 # server id 1 end_log_pos 2772 CRC32 XXX GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 2772 # at 2809 @@ -292,7 +292,7 @@ COMMIT # at 2992 # server id 1 end_log_pos 3034 CRC32 XXX GTID 0-1-10 /*!100001 SET @@session.gtid_seq_no=10*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 3034 # at 3071 @@ -357,7 +357,7 @@ DELIMITER /*!*/; /*!100001 SET @@session.gtid_domain_id=0*//*!*/; /*!100001 SET @@session.server_id=1*//*!*/; /*!100001 SET @@session.gtid_seq_no=16*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 429 # at 543 diff --git a/mysql-test/main/mysqlbinlog_stmt_compressed.result b/mysql-test/main/mysqlbinlog_stmt_compressed.result index 42717bccd01..654dff9e90d 100644 --- a/mysql-test/main/mysqlbinlog_stmt_compressed.result +++ b/mysql-test/main/mysqlbinlog_stmt_compressed.result @@ -53,7 +53,7 @@ CREATE TABLE t2 (pk INT PRIMARY KEY, f1 INT, f2 INT, f3 INT, f4 INT, f5 MEDIUMIN # at 727 # server id 1 end_log_pos 769 CRC32 XXX GTID 0-1-3 /*!100001 SET @@session.gtid_seq_no=3*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 769 # server id 1 end_log_pos 897 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 @@ -68,7 +68,7 @@ COMMIT # at 970 # server id 1 end_log_pos 1012 CRC32 XXX GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 1012 # server id 1 end_log_pos 1140 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 @@ -83,7 +83,7 @@ COMMIT # at 1213 # server id 1 end_log_pos 1255 CRC32 XXX GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 1255 # server id 1 end_log_pos 1385 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 @@ -98,7 +98,7 @@ COMMIT # at 1458 # server id 1 end_log_pos 1500 CRC32 XXX GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 1500 # server id 1 end_log_pos 1627 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 @@ -113,7 +113,7 @@ COMMIT # at 1700 # server id 1 end_log_pos 1742 CRC32 XXX GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 1742 # server id 1 end_log_pos 1850 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 @@ -128,7 +128,7 @@ COMMIT # at 1923 # server id 1 end_log_pos 1965 CRC32 XXX GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 1965 # server id 1 end_log_pos 2082 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 @@ -143,7 +143,7 @@ COMMIT # at 2155 # server id 1 end_log_pos 2197 CRC32 XXX GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 2197 # server id 1 end_log_pos 2288 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 @@ -158,7 +158,7 @@ COMMIT # at 2361 # server id 1 end_log_pos 2403 CRC32 XXX GTID 0-1-10 /*!100001 SET @@session.gtid_seq_no=10*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at 2403 # server id 1 end_log_pos 2494 CRC32 XXX Query_compressed thread_id=5 exec_time=x error_code=0 diff --git a/mysql-test/main/user_var-binlog.result b/mysql-test/main/user_var-binlog.result index 0d8732399c7..0a9fe956aee 100644 --- a/mysql-test/main/user_var-binlog.result +++ b/mysql-test/main/user_var-binlog.result @@ -23,7 +23,7 @@ flush logs; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET @`a b`:=_latin1 X'68656C6C6F' COLLATE `latin1_swedish_ci`/*!*/; use `test`/*!*/; @@ -41,7 +41,7 @@ INSERT INTO t1 VALUES(@`a b`) SET TIMESTAMP=10000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET @`var1`:=_latin1 X'273B616161' COLLATE `latin1_swedish_ci`/*!*/; SET @`var2`:=_binary X'61' COLLATE `binary`/*!*/; diff --git a/mysql-test/suite/binlog/r/binlog_mysqlbinlog2.result b/mysql-test/suite/binlog/r/binlog_mysqlbinlog2.result index 8ecd4d37b1f..2a0e1d3c810 100644 --- a/mysql-test/suite/binlog/r/binlog_mysqlbinlog2.result +++ b/mysql-test/suite/binlog/r/binlog_mysqlbinlog2.result @@ -34,7 +34,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a int auto_increment not null primary key, b char(3)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -43,7 +43,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -52,7 +52,7 @@ insert into t1 values(null, "b") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; SET TIMESTAMP=1773144/*!*/; @@ -61,7 +61,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -70,7 +70,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -91,7 +91,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; use `test`/*!*/; @@ -109,7 +109,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -118,7 +118,7 @@ insert into t1 values(null, "b") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; SET TIMESTAMP=1773144/*!*/; @@ -127,7 +127,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -136,7 +136,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -157,7 +157,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; use `test`/*!*/; @@ -175,7 +175,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -184,7 +184,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -217,7 +217,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a int auto_increment not null primary key, b char(3)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -226,7 +226,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -247,7 +247,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; use `test`/*!*/; @@ -274,7 +274,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; use `test`/*!*/; @@ -292,7 +292,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -301,7 +301,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -334,7 +334,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a int auto_increment not null primary key, b char(3)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -343,7 +343,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -377,7 +377,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a int auto_increment not null primary key, b char(3)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -386,7 +386,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -395,7 +395,7 @@ insert into t1 values(null, "b") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; SET TIMESTAMP=1773144/*!*/; @@ -404,7 +404,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -413,7 +413,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -424,7 +424,7 @@ COMMIT /*!*/; DELIMITER ; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=6/*!*/; use `test`/*!*/; @@ -454,7 +454,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; use `test`/*!*/; @@ -472,7 +472,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -481,7 +481,7 @@ insert into t1 values(null, "b") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; SET TIMESTAMP=1773144/*!*/; @@ -490,7 +490,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -499,7 +499,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -510,7 +510,7 @@ COMMIT /*!*/; DELIMITER ; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=6/*!*/; use `test`/*!*/; @@ -540,7 +540,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; use `test`/*!*/; @@ -558,7 +558,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -567,7 +567,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -578,7 +578,7 @@ COMMIT /*!*/; DELIMITER ; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=6/*!*/; use `test`/*!*/; @@ -620,7 +620,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a int auto_increment not null primary key, b char(3)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -629,7 +629,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -638,7 +638,7 @@ insert into t1 values(null, "b") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; SET TIMESTAMP=1773144/*!*/; @@ -647,7 +647,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -656,7 +656,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -667,7 +667,7 @@ COMMIT /*!*/; DELIMITER ; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; DELIMITER ; # End of log file @@ -681,7 +681,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; use `test`/*!*/; @@ -699,7 +699,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -708,7 +708,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -719,7 +719,7 @@ COMMIT /*!*/; DELIMITER ; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=6/*!*/; use `test`/*!*/; @@ -761,7 +761,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a int auto_increment not null primary key, b char(3)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -770,7 +770,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -803,7 +803,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a int auto_increment not null primary key, b char(3)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -812,7 +812,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -821,7 +821,7 @@ insert into t1 values(null, "b") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; SET TIMESTAMP=1773144/*!*/; @@ -830,7 +830,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -839,7 +839,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -860,7 +860,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; use `test`/*!*/; @@ -878,7 +878,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -887,7 +887,7 @@ insert into t1 values(null, "b") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; SET TIMESTAMP=1773144/*!*/; @@ -896,7 +896,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -905,7 +905,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -925,7 +925,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; use `test`/*!*/; @@ -943,7 +943,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -952,7 +952,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -985,7 +985,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a int auto_increment not null primary key, b char(3)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -994,7 +994,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -1014,7 +1014,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; use `test`/*!*/; @@ -1041,7 +1041,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; use `test`/*!*/; @@ -1059,7 +1059,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -1068,7 +1068,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -1101,7 +1101,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a int auto_increment not null primary key, b char(3)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -1110,7 +1110,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -1143,7 +1143,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a int auto_increment not null primary key, b char(3)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -1152,7 +1152,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -1161,7 +1161,7 @@ insert into t1 values(null, "b") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; SET TIMESTAMP=1773144/*!*/; @@ -1170,7 +1170,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -1179,7 +1179,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -1190,7 +1190,7 @@ COMMIT /*!*/; DELIMITER ; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=6/*!*/; use `test`/*!*/; @@ -1220,7 +1220,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; use `test`/*!*/; @@ -1238,7 +1238,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -1247,7 +1247,7 @@ insert into t1 values(null, "b") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; SET TIMESTAMP=1773144/*!*/; @@ -1256,7 +1256,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -1265,7 +1265,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -1276,7 +1276,7 @@ COMMIT /*!*/; DELIMITER ; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=6/*!*/; use `test`/*!*/; @@ -1305,7 +1305,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; use `test`/*!*/; @@ -1323,7 +1323,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -1332,7 +1332,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -1343,7 +1343,7 @@ COMMIT /*!*/; DELIMITER ; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=6/*!*/; use `test`/*!*/; @@ -1385,7 +1385,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a int auto_increment not null primary key, b char(3)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -1394,7 +1394,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -1403,7 +1403,7 @@ insert into t1 values(null, "b") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; SET TIMESTAMP=1773144/*!*/; @@ -1412,7 +1412,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -1421,7 +1421,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -1444,7 +1444,7 @@ ROLLBACK /* added by mysqlbinlog */; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; use `test`/*!*/; @@ -1462,7 +1462,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -1471,7 +1471,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -1482,7 +1482,7 @@ COMMIT /*!*/; DELIMITER ; DELIMITER /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=6/*!*/; use `test`/*!*/; @@ -1524,7 +1524,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a int auto_increment not null primary key, b char(3)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -1533,7 +1533,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -1566,7 +1566,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a int auto_increment not null primary key, b char(3)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=1/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -1575,7 +1575,7 @@ insert into t1 values(null, "a") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=2/*!*/; SET TIMESTAMP=1773142/*!*/; @@ -1584,7 +1584,7 @@ insert into t1 values(null, "b") SET TIMESTAMP=1773142/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=3/*!*/; SET TIMESTAMP=1773144/*!*/; @@ -1593,7 +1593,7 @@ insert into t1 values(null, "c") SET TIMESTAMP=1773144/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=4/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -1602,7 +1602,7 @@ insert into t1 values(null, "d") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=5/*!*/; SET TIMESTAMP=1773146/*!*/; @@ -1611,7 +1611,7 @@ insert into t1 values(null, "e") SET TIMESTAMP=1773146/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET INSERT_ID=6/*!*/; SET TIMESTAMP=1773143/*!*/; diff --git a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row.result b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row.result index 0cc1805eadc..469eb97badc 100644 --- a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row.result +++ b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row.result @@ -383,7 +383,7 @@ CREATE TABLE t1 (c01 BIT) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 /*!100001 SET @@session.gtid_seq_no=2*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -404,7 +404,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 /*!100001 SET @@session.gtid_seq_no=3*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -441,7 +441,7 @@ CREATE TABLE t1 (c01 BIT(7)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -462,7 +462,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -483,7 +483,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -504,7 +504,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -525,7 +525,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-10 /*!100001 SET @@session.gtid_seq_no=10*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -546,7 +546,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-11 /*!100001 SET @@session.gtid_seq_no=11*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -567,7 +567,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-12 /*!100001 SET @@session.gtid_seq_no=12*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -588,7 +588,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-13 /*!100001 SET @@session.gtid_seq_no=13*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -609,7 +609,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-14 /*!100001 SET @@session.gtid_seq_no=14*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -630,7 +630,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-15 /*!100001 SET @@session.gtid_seq_no=15*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -669,7 +669,7 @@ CREATE TABLE t1 (a BIT(20), b CHAR(2)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-18 /*!100001 SET @@session.gtid_seq_no=18*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -707,7 +707,7 @@ CREATE TABLE t1 (c02 BIT(64)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-21 /*!100001 SET @@session.gtid_seq_no=21*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -728,7 +728,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-22 /*!100001 SET @@session.gtid_seq_no=22*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -749,7 +749,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-23 /*!100001 SET @@session.gtid_seq_no=23*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -770,7 +770,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-24 /*!100001 SET @@session.gtid_seq_no=24*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -807,7 +807,7 @@ CREATE TABLE t1 (c03 TINYINT) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-27 /*!100001 SET @@session.gtid_seq_no=27*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -834,7 +834,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-28 /*!100001 SET @@session.gtid_seq_no=28*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -855,7 +855,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-29 /*!100001 SET @@session.gtid_seq_no=29*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -878,7 +878,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-30 /*!100001 SET @@session.gtid_seq_no=30*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -915,7 +915,7 @@ CREATE TABLE t1 (c04 TINYINT UNSIGNED) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-33 /*!100001 SET @@session.gtid_seq_no=33*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -939,7 +939,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-34 /*!100001 SET @@session.gtid_seq_no=34*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -976,7 +976,7 @@ CREATE TABLE t1 (c06 BOOL) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-37 /*!100001 SET @@session.gtid_seq_no=37*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -997,7 +997,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-38 /*!100001 SET @@session.gtid_seq_no=38*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1034,7 +1034,7 @@ CREATE TABLE t1 (c07 SMALLINT) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-41 /*!100001 SET @@session.gtid_seq_no=41*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1055,7 +1055,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-42 /*!100001 SET @@session.gtid_seq_no=42*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1092,7 +1092,7 @@ CREATE TABLE t1 (c08 SMALLINT UNSIGNED) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-45 /*!100001 SET @@session.gtid_seq_no=45*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1116,7 +1116,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-46 /*!100001 SET @@session.gtid_seq_no=46*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1139,7 +1139,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-47 /*!100001 SET @@session.gtid_seq_no=47*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1176,7 +1176,7 @@ CREATE TABLE t1 (c10 MEDIUMINT) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-50 /*!100001 SET @@session.gtid_seq_no=50*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1197,7 +1197,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-51 /*!100001 SET @@session.gtid_seq_no=51*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1234,7 +1234,7 @@ CREATE TABLE t1 (c11 MEDIUMINT UNSIGNED) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-54 /*!100001 SET @@session.gtid_seq_no=54*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1258,7 +1258,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-55 /*!100001 SET @@session.gtid_seq_no=55*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1281,7 +1281,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-56 /*!100001 SET @@session.gtid_seq_no=56*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1318,7 +1318,7 @@ CREATE TABLE t1 (c13 INT) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-59 /*!100001 SET @@session.gtid_seq_no=59*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1339,7 +1339,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-60 /*!100001 SET @@session.gtid_seq_no=60*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1376,7 +1376,7 @@ CREATE TABLE t1 (c14 INT UNSIGNED) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-63 /*!100001 SET @@session.gtid_seq_no=63*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1400,7 +1400,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-64 /*!100001 SET @@session.gtid_seq_no=64*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1423,7 +1423,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-65 /*!100001 SET @@session.gtid_seq_no=65*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1460,7 +1460,7 @@ CREATE TABLE t1 (c16 BIGINT) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-68 /*!100001 SET @@session.gtid_seq_no=68*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1481,7 +1481,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-69 /*!100001 SET @@session.gtid_seq_no=69*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1518,7 +1518,7 @@ CREATE TABLE t1 (c17 BIGINT UNSIGNED) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-72 /*!100001 SET @@session.gtid_seq_no=72*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1542,7 +1542,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-73 /*!100001 SET @@session.gtid_seq_no=73*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1565,7 +1565,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-74 /*!100001 SET @@session.gtid_seq_no=74*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1602,7 +1602,7 @@ CREATE TABLE t1 (c19 FLOAT) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-77 /*!100001 SET @@session.gtid_seq_no=77*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1623,7 +1623,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-78 /*!100001 SET @@session.gtid_seq_no=78*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1660,7 +1660,7 @@ CREATE TABLE t1 (c22 DOUBLE) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-81 /*!100001 SET @@session.gtid_seq_no=81*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1681,7 +1681,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-82 /*!100001 SET @@session.gtid_seq_no=82*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1718,7 +1718,7 @@ CREATE TABLE t1 (c25 DECIMAL(10,5)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-85 /*!100001 SET @@session.gtid_seq_no=85*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1739,7 +1739,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-86 /*!100001 SET @@session.gtid_seq_no=86*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1760,7 +1760,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-87 /*!100001 SET @@session.gtid_seq_no=87*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1797,7 +1797,7 @@ CREATE TABLE t1 (c28 DATE) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-90 /*!100001 SET @@session.gtid_seq_no=90*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1818,7 +1818,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-91 /*!100001 SET @@session.gtid_seq_no=91*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1855,7 +1855,7 @@ CREATE TABLE t1 (c29 DATETIME) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-94 /*!100001 SET @@session.gtid_seq_no=94*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1876,7 +1876,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-95 /*!100001 SET @@session.gtid_seq_no=95*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1913,7 +1913,7 @@ CREATE TABLE t1 (c30 TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURR # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-98 /*!100001 SET @@session.gtid_seq_no=98*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1935,7 +1935,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-99 /*!100001 SET @@session.gtid_seq_no=99*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1972,7 +1972,7 @@ CREATE TABLE t1 (c31 TIME) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-102 /*!100001 SET @@session.gtid_seq_no=102*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1993,7 +1993,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-103 /*!100001 SET @@session.gtid_seq_no=103*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2030,7 +2030,7 @@ CREATE TABLE t1 (c32 YEAR) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-106 /*!100001 SET @@session.gtid_seq_no=106*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2051,7 +2051,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-107 /*!100001 SET @@session.gtid_seq_no=107*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2088,7 +2088,7 @@ CREATE TABLE t1 (c33 CHAR) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-110 /*!100001 SET @@session.gtid_seq_no=110*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2109,7 +2109,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-111 /*!100001 SET @@session.gtid_seq_no=111*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2146,7 +2146,7 @@ CREATE TABLE t1 (c34 CHAR(0)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-114 /*!100001 SET @@session.gtid_seq_no=114*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2167,7 +2167,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-115 /*!100001 SET @@session.gtid_seq_no=115*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2204,7 +2204,7 @@ CREATE TABLE t1 (c35 CHAR(1)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-118 /*!100001 SET @@session.gtid_seq_no=118*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2225,7 +2225,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-119 /*!100001 SET @@session.gtid_seq_no=119*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2262,7 +2262,7 @@ CREATE TABLE t1 (c36 CHAR(255)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-122 /*!100001 SET @@session.gtid_seq_no=122*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2283,7 +2283,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-123 /*!100001 SET @@session.gtid_seq_no=123*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2320,7 +2320,7 @@ CREATE TABLE t1 (c37 NATIONAL CHAR) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-126 /*!100001 SET @@session.gtid_seq_no=126*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2341,7 +2341,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-127 /*!100001 SET @@session.gtid_seq_no=127*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2378,7 +2378,7 @@ CREATE TABLE t1 (c38 NATIONAL CHAR(0)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-130 /*!100001 SET @@session.gtid_seq_no=130*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2399,7 +2399,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-131 /*!100001 SET @@session.gtid_seq_no=131*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2436,7 +2436,7 @@ CREATE TABLE t1 (c39 NATIONAL CHAR(1)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-134 /*!100001 SET @@session.gtid_seq_no=134*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2457,7 +2457,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-135 /*!100001 SET @@session.gtid_seq_no=135*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2494,7 +2494,7 @@ CREATE TABLE t1 (c40 NATIONAL CHAR(255)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-138 /*!100001 SET @@session.gtid_seq_no=138*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2515,7 +2515,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-139 /*!100001 SET @@session.gtid_seq_no=139*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2536,7 +2536,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-140 /*!100001 SET @@session.gtid_seq_no=140*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2576,7 +2576,7 @@ CREATE TABLE t1 (c41 CHAR CHARACTER SET UCS2) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-143 /*!100001 SET @@session.gtid_seq_no=143*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2597,7 +2597,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-144 /*!100001 SET @@session.gtid_seq_no=144*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2634,7 +2634,7 @@ CREATE TABLE t1 (c42 CHAR(0) CHARACTER SET UCS2) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-147 /*!100001 SET @@session.gtid_seq_no=147*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2655,7 +2655,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-148 /*!100001 SET @@session.gtid_seq_no=148*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2692,7 +2692,7 @@ CREATE TABLE t1 (c43 CHAR(1) CHARACTER SET UCS2) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-151 /*!100001 SET @@session.gtid_seq_no=151*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2713,7 +2713,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-152 /*!100001 SET @@session.gtid_seq_no=152*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2750,7 +2750,7 @@ CREATE TABLE t1 (c44 CHAR(255) CHARACTER SET UCS2) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-155 /*!100001 SET @@session.gtid_seq_no=155*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2771,7 +2771,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-156 /*!100001 SET @@session.gtid_seq_no=156*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2792,7 +2792,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-157 /*!100001 SET @@session.gtid_seq_no=157*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2832,7 +2832,7 @@ CREATE TABLE t1 (c45 VARCHAR(0)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-160 /*!100001 SET @@session.gtid_seq_no=160*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2853,7 +2853,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-161 /*!100001 SET @@session.gtid_seq_no=161*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2890,7 +2890,7 @@ CREATE TABLE t1 (c46 VARCHAR(1)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-164 /*!100001 SET @@session.gtid_seq_no=164*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2911,7 +2911,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-165 /*!100001 SET @@session.gtid_seq_no=165*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2948,7 +2948,7 @@ CREATE TABLE t1 (c47 VARCHAR(255)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-168 /*!100001 SET @@session.gtid_seq_no=168*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2969,7 +2969,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-169 /*!100001 SET @@session.gtid_seq_no=169*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3006,7 +3006,7 @@ CREATE TABLE t1 (c48 VARCHAR(261)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-172 /*!100001 SET @@session.gtid_seq_no=172*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3027,7 +3027,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-173 /*!100001 SET @@session.gtid_seq_no=173*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3064,7 +3064,7 @@ CREATE TABLE t1 (c49 NATIONAL VARCHAR(0)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-176 /*!100001 SET @@session.gtid_seq_no=176*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3085,7 +3085,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-177 /*!100001 SET @@session.gtid_seq_no=177*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3122,7 +3122,7 @@ CREATE TABLE t1 (c50 NATIONAL VARCHAR(1)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-180 /*!100001 SET @@session.gtid_seq_no=180*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3143,7 +3143,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-181 /*!100001 SET @@session.gtid_seq_no=181*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3180,7 +3180,7 @@ CREATE TABLE t1 (c51 NATIONAL VARCHAR(255)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-184 /*!100001 SET @@session.gtid_seq_no=184*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3201,7 +3201,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-185 /*!100001 SET @@session.gtid_seq_no=185*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3222,7 +3222,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-186 /*!100001 SET @@session.gtid_seq_no=186*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3262,7 +3262,7 @@ CREATE TABLE t1 (c52 NATIONAL VARCHAR(261)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-189 /*!100001 SET @@session.gtid_seq_no=189*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3283,7 +3283,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-190 /*!100001 SET @@session.gtid_seq_no=190*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3304,7 +3304,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-191 /*!100001 SET @@session.gtid_seq_no=191*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3344,7 +3344,7 @@ CREATE TABLE t1 (c53 VARCHAR(0) CHARACTER SET ucs2) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-194 /*!100001 SET @@session.gtid_seq_no=194*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3365,7 +3365,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-195 /*!100001 SET @@session.gtid_seq_no=195*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3402,7 +3402,7 @@ CREATE TABLE t1 (c54 VARCHAR(1) CHARACTER SET ucs2) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-198 /*!100001 SET @@session.gtid_seq_no=198*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3423,7 +3423,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-199 /*!100001 SET @@session.gtid_seq_no=199*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3460,7 +3460,7 @@ CREATE TABLE t1 (c55 VARCHAR(255) CHARACTER SET ucs2) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-202 /*!100001 SET @@session.gtid_seq_no=202*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3481,7 +3481,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-203 /*!100001 SET @@session.gtid_seq_no=203*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3518,7 +3518,7 @@ CREATE TABLE t1 (c56 VARCHAR(261) CHARACTER SET ucs2) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-206 /*!100001 SET @@session.gtid_seq_no=206*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3539,7 +3539,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-207 /*!100001 SET @@session.gtid_seq_no=207*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3576,7 +3576,7 @@ CREATE TABLE t1 (c57 BINARY) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-210 /*!100001 SET @@session.gtid_seq_no=210*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3597,7 +3597,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-211 /*!100001 SET @@session.gtid_seq_no=211*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3618,7 +3618,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-212 /*!100001 SET @@session.gtid_seq_no=212*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3639,7 +3639,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-213 /*!100001 SET @@session.gtid_seq_no=213*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3676,7 +3676,7 @@ CREATE TABLE t1 (c58 BINARY(0)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-216 /*!100001 SET @@session.gtid_seq_no=216*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3697,7 +3697,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-217 /*!100001 SET @@session.gtid_seq_no=217*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3734,7 +3734,7 @@ CREATE TABLE t1 (c59 BINARY(1)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-220 /*!100001 SET @@session.gtid_seq_no=220*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3755,7 +3755,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-221 /*!100001 SET @@session.gtid_seq_no=221*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3776,7 +3776,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-222 /*!100001 SET @@session.gtid_seq_no=222*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3797,7 +3797,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-223 /*!100001 SET @@session.gtid_seq_no=223*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3834,7 +3834,7 @@ CREATE TABLE t1 (c60 BINARY(255)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-226 /*!100001 SET @@session.gtid_seq_no=226*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3855,7 +3855,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-227 /*!100001 SET @@session.gtid_seq_no=227*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3876,7 +3876,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-228 /*!100001 SET @@session.gtid_seq_no=228*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3897,7 +3897,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-229 /*!100001 SET @@session.gtid_seq_no=229*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3934,7 +3934,7 @@ CREATE TABLE t1 (c61 VARBINARY(0)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-232 /*!100001 SET @@session.gtid_seq_no=232*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3955,7 +3955,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-233 /*!100001 SET @@session.gtid_seq_no=233*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3992,7 +3992,7 @@ CREATE TABLE t1 (c62 VARBINARY(1)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-236 /*!100001 SET @@session.gtid_seq_no=236*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4013,7 +4013,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-237 /*!100001 SET @@session.gtid_seq_no=237*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4034,7 +4034,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-238 /*!100001 SET @@session.gtid_seq_no=238*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4055,7 +4055,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-239 /*!100001 SET @@session.gtid_seq_no=239*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4092,7 +4092,7 @@ CREATE TABLE t1 (c63 VARBINARY(255)) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-242 /*!100001 SET @@session.gtid_seq_no=242*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4113,7 +4113,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-243 /*!100001 SET @@session.gtid_seq_no=243*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4134,7 +4134,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-244 /*!100001 SET @@session.gtid_seq_no=244*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4155,7 +4155,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-245 /*!100001 SET @@session.gtid_seq_no=245*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4192,7 +4192,7 @@ CREATE TABLE t1 (c65 TINYBLOB) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-248 /*!100001 SET @@session.gtid_seq_no=248*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4213,7 +4213,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-249 /*!100001 SET @@session.gtid_seq_no=249*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4250,7 +4250,7 @@ CREATE TABLE t1 (c68 BLOB) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-252 /*!100001 SET @@session.gtid_seq_no=252*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4271,7 +4271,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-253 /*!100001 SET @@session.gtid_seq_no=253*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4308,7 +4308,7 @@ CREATE TABLE t1 (c71 MEDIUMBLOB) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-256 /*!100001 SET @@session.gtid_seq_no=256*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4329,7 +4329,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-257 /*!100001 SET @@session.gtid_seq_no=257*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4366,7 +4366,7 @@ CREATE TABLE t1 (c74 LONGBLOB) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-260 /*!100001 SET @@session.gtid_seq_no=260*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4387,7 +4387,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-261 /*!100001 SET @@session.gtid_seq_no=261*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4424,7 +4424,7 @@ CREATE TABLE t1 (c66 TINYTEXT) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-264 /*!100001 SET @@session.gtid_seq_no=264*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4445,7 +4445,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-265 /*!100001 SET @@session.gtid_seq_no=265*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4482,7 +4482,7 @@ CREATE TABLE t1 (c69 TEXT) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-268 /*!100001 SET @@session.gtid_seq_no=268*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4503,7 +4503,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-269 /*!100001 SET @@session.gtid_seq_no=269*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4540,7 +4540,7 @@ CREATE TABLE t1 (c72 MEDIUMTEXT) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-272 /*!100001 SET @@session.gtid_seq_no=272*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4561,7 +4561,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-273 /*!100001 SET @@session.gtid_seq_no=273*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4598,7 +4598,7 @@ CREATE TABLE t1 (c75 LONGTEXT) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-276 /*!100001 SET @@session.gtid_seq_no=276*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4619,7 +4619,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-277 /*!100001 SET @@session.gtid_seq_no=277*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4656,7 +4656,7 @@ CREATE TABLE t1 (c67 TINYTEXT CHARACTER SET UCS2) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-280 /*!100001 SET @@session.gtid_seq_no=280*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4677,7 +4677,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-281 /*!100001 SET @@session.gtid_seq_no=281*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4714,7 +4714,7 @@ CREATE TABLE t1 (c70 TEXT CHARACTER SET UCS2) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-284 /*!100001 SET @@session.gtid_seq_no=284*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4735,7 +4735,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-285 /*!100001 SET @@session.gtid_seq_no=285*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4772,7 +4772,7 @@ CREATE TABLE t1 (c73 MEDIUMTEXT CHARACTER SET UCS2) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-288 /*!100001 SET @@session.gtid_seq_no=288*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4793,7 +4793,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-289 /*!100001 SET @@session.gtid_seq_no=289*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4830,7 +4830,7 @@ CREATE TABLE t1 (c76 LONGTEXT CHARACTER SET UCS2) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-292 /*!100001 SET @@session.gtid_seq_no=292*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4851,7 +4851,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-293 /*!100001 SET @@session.gtid_seq_no=293*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4888,7 +4888,7 @@ CREATE TABLE t1 (c77 ENUM('a','b','c')) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-296 /*!100001 SET @@session.gtid_seq_no=296*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4909,7 +4909,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-297 /*!100001 SET @@session.gtid_seq_no=297*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4946,7 +4946,7 @@ CREATE TABLE t1 (c78 SET('a','b','c','d','e','f')) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-300 /*!100001 SET @@session.gtid_seq_no=300*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4967,7 +4967,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-301 /*!100001 SET @@session.gtid_seq_no=301*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4988,7 +4988,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-302 /*!100001 SET @@session.gtid_seq_no=302*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5009,7 +5009,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-303 /*!100001 SET @@session.gtid_seq_no=303*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5030,7 +5030,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-304 /*!100001 SET @@session.gtid_seq_no=304*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5051,7 +5051,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-305 /*!100001 SET @@session.gtid_seq_no=305*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5072,7 +5072,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-306 /*!100001 SET @@session.gtid_seq_no=306*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5093,7 +5093,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-307 /*!100001 SET @@session.gtid_seq_no=307*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5138,7 +5138,7 @@ CREATE TABLE t2 (a int NOT NULL DEFAULT 0, b int NOT NULL DEFAULT 0) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-311 /*!100001 SET @@session.gtid_seq_no=311*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5160,7 +5160,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-312 /*!100001 SET @@session.gtid_seq_no=312*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5182,7 +5182,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-313 /*!100001 SET @@session.gtid_seq_no=313*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5204,7 +5204,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-314 /*!100001 SET @@session.gtid_seq_no=314*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5226,7 +5226,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-315 /*!100001 SET @@session.gtid_seq_no=315*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5294,7 +5294,7 @@ c_text_utf8 blob ) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-318 /*!100001 SET @@session.gtid_seq_no=318*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5347,7 +5347,7 @@ DELIMITER /*!*/; /*!100001 SET @@session.gtid_domain_id=0*//*!*/; /*!100001 SET @@session.server_id=1*//*!*/; /*!100001 SET @@session.gtid_seq_no=320*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # diff --git a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_innodb.result b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_innodb.result index 22309e964be..d8a5864ba3d 100644 --- a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_innodb.result +++ b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_innodb.result @@ -2368,7 +2368,7 @@ crn INT -- row number # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 trans /*!100001 SET @@session.gtid_seq_no=2*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2550,7 +2550,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 trans /*!100001 SET @@session.gtid_seq_no=3*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2732,7 +2732,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 trans /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3080,7 +3080,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-5 trans /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3420,7 +3420,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-6 trans /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3765,7 +3765,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-7 trans /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4108,7 +4108,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-8 trans /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4454,7 +4454,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-9 trans /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4634,7 +4634,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-10 trans /*!100001 SET @@session.gtid_seq_no=10*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4811,7 +4811,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-11 trans /*!100001 SET @@session.gtid_seq_no=11*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4991,7 +4991,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-12 trans /*!100001 SET @@session.gtid_seq_no=12*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5293,7 +5293,7 @@ crn INT -- row number # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 trans /*!100001 SET @@session.gtid_seq_no=2*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5363,7 +5363,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 trans /*!100001 SET @@session.gtid_seq_no=3*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5442,7 +5442,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 trans /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5717,7 +5717,7 @@ c_3_n INT -- row number # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 trans /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5787,7 +5787,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-5 trans /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5857,7 +5857,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-6 trans /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5927,7 +5927,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-7 trans /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -6117,7 +6117,7 @@ COMMIT/*!*/; # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-8 trans /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -6331,7 +6331,7 @@ c3 VARCHAR(60) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 trans /*!100001 SET @@session.gtid_seq_no=2*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # diff --git a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_myisam.result b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_myisam.result index 8091242dab7..a75593055d7 100644 --- a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_myisam.result +++ b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_myisam.result @@ -2368,7 +2368,7 @@ crn INT -- row number # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 /*!100001 SET @@session.gtid_seq_no=2*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2553,7 +2553,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 /*!100001 SET @@session.gtid_seq_no=3*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -2737,7 +2737,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3087,7 +3087,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3429,7 +3429,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -3776,7 +3776,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4121,7 +4121,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4469,7 +4469,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4651,7 +4651,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-10 /*!100001 SET @@session.gtid_seq_no=10*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -4830,7 +4830,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-11 /*!100001 SET @@session.gtid_seq_no=11*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5012,7 +5012,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-12 /*!100001 SET @@session.gtid_seq_no=12*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5316,7 +5316,7 @@ crn INT -- row number # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 /*!100001 SET @@session.gtid_seq_no=2*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5388,7 +5388,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 /*!100001 SET @@session.gtid_seq_no=3*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5469,7 +5469,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5746,7 +5746,7 @@ c_3_n INT -- row number # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5818,7 +5818,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5890,7 +5890,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -5962,7 +5962,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -6154,7 +6154,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -6370,7 +6370,7 @@ c3 VARCHAR(60) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 /*!100001 SET @@session.gtid_seq_no=2*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # diff --git a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_trans.result b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_trans.result index 28070fab374..545cb8f7857 100644 --- a/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_trans.result +++ b/mysql-test/suite/binlog/r/binlog_mysqlbinlog_row_trans.result @@ -172,7 +172,7 @@ c2 VARCHAR(20) # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 trans /*!100001 SET @@session.gtid_seq_no=3*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -257,7 +257,7 @@ TRUNCATE TABLE t1 # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -287,7 +287,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -326,7 +326,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -348,7 +348,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-9 trans /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -433,7 +433,7 @@ TRUNCATE TABLE t2 # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-12 /*!100001 SET @@session.gtid_seq_no=12*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -463,7 +463,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-13 /*!100001 SET @@session.gtid_seq_no=13*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -502,7 +502,7 @@ COMMIT # at # #010909 4:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-14 /*!100001 SET @@session.gtid_seq_no=14*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # diff --git a/mysql-test/suite/binlog/r/binlog_parallel_replication_marks_row.result b/mysql-test/suite/binlog/r/binlog_parallel_replication_marks_row.result index c4a1ba9b83b..bca96dd5fd0 100644 --- a/mysql-test/suite/binlog/r/binlog_parallel_replication_marks_row.result +++ b/mysql-test/suite/binlog/r/binlog_parallel_replication_marks_row.result @@ -38,13 +38,13 @@ disconnect tmp_con; connection default; FLUSH LOGS; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION #Q> /* GTID */ INSERT INTO t1 VALUES (1,0) # server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # # server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION #Q> /* GTID */ INSERT INTO t1 VALUES (2,0) # server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # # server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F @@ -52,13 +52,13 @@ COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl /* GTID */ ALTER TABLE t1 ADD c INT # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION #Q> /* GTID */ INSERT INTO t1 VALUES (3,0,0) # server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # # server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION #Q> /* GTID */ UPDATE t1 SET b=1, c=1 WHERE a=2 # server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # # server id 1 end_log_pos # CRC32 0x######## Update_rows: table id # flags: STMT_END_F @@ -70,7 +70,7 @@ BEGIN # server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION #Q> /* GTID */ DELETE FROM t1 WHERE a=5 # server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # # server id 1 end_log_pos # CRC32 0x######## Delete_rows: table id # flags: STMT_END_F @@ -82,25 +82,25 @@ BEGIN # server id 1 end_log_pos # CRC32 0x######## Update_rows: table id # flags: STMT_END_F COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION #Q> /* GTID */ INSERT INTO t1 VALUES (8, 5, 0) # server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # # server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION #Q> /* GTID */ INSERT INTO t1 VALUES (9, 5, 1) # server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # # server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION #Q> /* GTID */ INSERT INTO t1 VALUES (10, 6, 0) # server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # # server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION #Q> /* GTID */ INSERT INTO t1 VALUES (11, 7, 0) # server id 1 end_log_pos # CRC32 0x######## Table_map: `test`.`t1` mapped to number # # server id 1 end_log_pos # CRC32 0x######## Write_rows: table id # flags: STMT_END_F diff --git a/mysql-test/suite/binlog/r/binlog_parallel_replication_marks_stm_mix.result b/mysql-test/suite/binlog/r/binlog_parallel_replication_marks_stm_mix.result index c56dff9c8a0..4a6cd6f4ac0 100644 --- a/mysql-test/suite/binlog/r/binlog_parallel_replication_marks_stm_mix.result +++ b/mysql-test/suite/binlog/r/binlog_parallel_replication_marks_stm_mix.result @@ -38,21 +38,21 @@ disconnect tmp_con; connection default; FLUSH LOGS; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION /* GTID */ INSERT INTO t1 VALUES (1,0) COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION /* GTID */ INSERT INTO t1 VALUES (2,0) COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl /* GTID */ ALTER TABLE t1 ADD c INT # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION /* GTID */ INSERT INTO t1 VALUES (3,0,0) COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl -BEGIN +START TRANSACTION /* GTID */ UPDATE t1 SET b=1, c=1 WHERE a=2 /* GTID */ CREATE TEMPORARY TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB /* GTID */ INSERT INTO t2 VALUES (4,10), (5,20) @@ -63,7 +63,7 @@ COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl /* GTID */ CREATE TEMPORARY TABLE t3 (a INT PRIMARY KEY) ENGINE=InnoDB # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl -BEGIN +START TRANSACTION /* GTID */ DELETE FROM t1 WHERE a=5 /* GTID */ INSERT INTO t3 VALUES (7) /* GTID */ INSERT INTO t1 SELECT a, 4, 0 FROM t3 @@ -73,21 +73,21 @@ COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl /* GTID */ CREATE TEMPORARY TABLE t4 (a INT PRIMARY KEY) ENGINE=InnoDB # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION /* GTID */ INSERT INTO t1 VALUES (8, 5, 0) COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl /* GTID */ ALTER TABLE t4 ADD b INT # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION /* GTID */ INSERT INTO t1 VALUES (9, 5, 1) COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# trans -BEGIN +START TRANSACTION /* GTID */ INSERT INTO t1 VALUES (10, 6, 0) COMMIT/*!*/; # server id 1 end_log_pos # CRC32 0x######## GTID #-#-# ddl -BEGIN +START TRANSACTION /* GTID */ CREATE TEMPORARY TABLE t5 (a INT PRIMARY KEY) ENGINE=InnoDB /* GTID */ INSERT INTO t1 VALUES (11, 7, 0) COMMIT/*!*/; diff --git a/mysql-test/suite/binlog/r/binlog_row_annotate.result b/mysql-test/suite/binlog/r/binlog_row_annotate.result index bbdfe547b18..e65569853aa 100644 --- a/mysql-test/suite/binlog/r/binlog_row_annotate.result +++ b/mysql-test/suite/binlog/r/binlog_row_annotate.result @@ -144,7 +144,7 @@ CREATE DATABASE test3 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -171,7 +171,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -198,7 +198,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -225,7 +225,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -267,7 +267,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -294,7 +294,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -374,7 +374,7 @@ CREATE DATABASE test1 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -401,7 +401,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -414,7 +414,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -427,7 +427,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -458,7 +458,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -471,7 +471,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -542,7 +542,7 @@ CREATE DATABASE test3 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -567,7 +567,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -592,7 +592,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -617,7 +617,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -655,7 +655,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -680,7 +680,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -768,7 +768,7 @@ CREATE DATABASE test3 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -795,7 +795,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -822,7 +822,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -849,7 +849,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -891,7 +891,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -918,7 +918,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -998,7 +998,7 @@ CREATE DATABASE test1 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1025,7 +1025,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1038,7 +1038,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1051,7 +1051,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1082,7 +1082,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1095,7 +1095,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -1166,7 +1166,7 @@ CREATE DATABASE test3 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test1`.`t1` mapped to number # @@ -1190,7 +1190,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test2`.`t2` mapped to number # @@ -1214,7 +1214,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test3`.`t3` mapped to number # @@ -1238,7 +1238,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test1`.`t1` mapped to number # @@ -1275,7 +1275,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test2`.`t2` mapped to number # @@ -1299,7 +1299,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test2`.`t2` mapped to number # diff --git a/mysql-test/suite/binlog/r/binlog_row_ctype_ucs.result b/mysql-test/suite/binlog/r/binlog_row_ctype_ucs.result index 9e95f0a365e..0fe726766d2 100644 --- a/mysql-test/suite/binlog/r/binlog_row_ctype_ucs.result +++ b/mysql-test/suite/binlog/r/binlog_row_ctype_ucs.result @@ -16,7 +16,7 @@ flush logs; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; # Annotate_rows: #Q> insert into t2 values (@v) @@ -104,7 +104,7 @@ CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET utf8) # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# /*!100001 SET @@session.gtid_seq_no=#*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -125,7 +125,7 @@ COMMIT # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# /*!100001 SET @@session.gtid_seq_no=#*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -146,7 +146,7 @@ COMMIT # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# /*!100001 SET @@session.gtid_seq_no=#*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -167,7 +167,7 @@ COMMIT # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# /*!100001 SET @@session.gtid_seq_no=#*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -188,7 +188,7 @@ COMMIT # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# /*!100001 SET @@session.gtid_seq_no=#*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -209,7 +209,7 @@ COMMIT # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# /*!100001 SET @@session.gtid_seq_no=#*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # diff --git a/mysql-test/suite/binlog/r/binlog_row_mysqlbinlog_options.result b/mysql-test/suite/binlog/r/binlog_row_mysqlbinlog_options.result index 8b138c461ab..0232443573a 100644 --- a/mysql-test/suite/binlog/r/binlog_row_mysqlbinlog_options.result +++ b/mysql-test/suite/binlog/r/binlog_row_mysqlbinlog_options.result @@ -62,7 +62,7 @@ CREATE TABLE t1 (a INT, b INT) # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-2 /*!100001 SET @@session.gtid_seq_no=2*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -97,7 +97,7 @@ CREATE TABLE t2 (a INT) # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -121,7 +121,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -152,7 +152,7 @@ CREATE TABLE t3 (a INT) # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -176,7 +176,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -198,7 +198,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -237,7 +237,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-10 /*!100001 SET @@session.gtid_seq_no=10*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -303,7 +303,7 @@ CREATE TABLE t1 (a INT, b INT) # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-2 /*!100001 SET @@session.gtid_seq_no=2*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -338,7 +338,7 @@ CREATE TABLE t2 (a INT) # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -362,7 +362,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -393,7 +393,7 @@ CREATE TABLE t3 (a INT) # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -417,7 +417,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -439,7 +439,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -478,7 +478,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-10 /*!100001 SET @@session.gtid_seq_no=10*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # diff --git a/mysql-test/suite/binlog/r/binlog_stm_ctype_ucs.result b/mysql-test/suite/binlog/r/binlog_stm_ctype_ucs.result index 00f7ce6ead0..05b1520724a 100644 --- a/mysql-test/suite/binlog/r/binlog_stm_ctype_ucs.result +++ b/mysql-test/suite/binlog/r/binlog_stm_ctype_ucs.result @@ -15,7 +15,7 @@ flush logs; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; SET @`v`:=_ucs2 X'006100620063' COLLATE `ucs2_general_ci`/*!*/; use `test`/*!*/; @@ -106,7 +106,7 @@ CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET utf8) # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# /*!100001 SET @@session.gtid_seq_no=#*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 @@ -121,7 +121,7 @@ COMMIT # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# /*!100001 SET @@session.gtid_seq_no=#*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 @@ -136,7 +136,7 @@ COMMIT # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# /*!100001 SET @@session.gtid_seq_no=#*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 @@ -151,7 +151,7 @@ COMMIT # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# /*!100001 SET @@session.gtid_seq_no=#*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 @@ -166,7 +166,7 @@ COMMIT # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# /*!100001 SET @@session.gtid_seq_no=#*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 @@ -181,7 +181,7 @@ COMMIT # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX GTID #-#-# /*!100001 SET @@session.gtid_seq_no=#*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #YYMMDD HH:MM:SS server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 diff --git a/mysql-test/suite/binlog/r/flashback.result b/mysql-test/suite/binlog/r/flashback.result index bdffaabd673..eaced02b7a9 100644 --- a/mysql-test/suite/binlog/r/flashback.result +++ b/mysql-test/suite/binlog/r/flashback.result @@ -81,7 +81,7 @@ c08 TEXT # at # #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-2 trans /*!100001 SET @@session.gtid_seq_no=2*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -107,7 +107,7 @@ COMMIT/*!*/; # at # #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-3 trans /*!100001 SET @@session.gtid_seq_no=3*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -133,7 +133,7 @@ COMMIT/*!*/; # at # #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-4 trans /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -159,7 +159,7 @@ COMMIT/*!*/; # at # #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-5 trans /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -213,7 +213,7 @@ COMMIT/*!*/; # at # #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX GTID 0-1-6 trans /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -296,7 +296,7 @@ ROLLBACK/*!*/; # Number of rows: 3 #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX Rotate to master-bin.000002 pos: 4 #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX Xid = # -BEGIN/*!*/; +START TRANSACTION/*!*/; #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX Write_rows: table id # flags: STMT_END_F ### INSERT INTO `test`.`t1` ### SET @@ -331,7 +331,7 @@ BEGIN/*!*/; COMMIT /*!*/; #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX Xid = # -BEGIN/*!*/; +START TRANSACTION/*!*/; #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX Update_rows: table id # flags: STMT_END_F ### UPDATE `test`.`t1` ### WHERE @@ -374,7 +374,7 @@ BEGIN/*!*/; COMMIT /*!*/; #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX Xid = # -BEGIN/*!*/; +START TRANSACTION/*!*/; #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX Delete_rows: table id # flags: STMT_END_F ### DELETE FROM `test`.`t1` ### WHERE @@ -389,7 +389,7 @@ BEGIN/*!*/; COMMIT /*!*/; #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX Xid = # -BEGIN/*!*/; +START TRANSACTION/*!*/; #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX Delete_rows: table id # flags: STMT_END_F ### DELETE FROM `test`.`t1` ### WHERE @@ -404,7 +404,7 @@ BEGIN/*!*/; COMMIT /*!*/; #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX Xid = # -BEGIN/*!*/; +START TRANSACTION/*!*/; #010909 9:46:40 server id 1 end_log_pos # CRC32 XXX Delete_rows: table id # flags: STMT_END_F ### DELETE FROM `test`.`t1` ### WHERE diff --git a/mysql-test/suite/binlog_encryption/binlog_row_annotate.result b/mysql-test/suite/binlog_encryption/binlog_row_annotate.result index b783488b07a..004f163f192 100644 --- a/mysql-test/suite/binlog_encryption/binlog_row_annotate.result +++ b/mysql-test/suite/binlog_encryption/binlog_row_annotate.result @@ -148,7 +148,7 @@ CREATE DATABASE test3 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -175,7 +175,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -202,7 +202,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -229,7 +229,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -271,7 +271,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -298,7 +298,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -381,7 +381,7 @@ CREATE DATABASE test1 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -408,7 +408,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -421,7 +421,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -434,7 +434,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -465,7 +465,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -478,7 +478,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -552,7 +552,7 @@ CREATE DATABASE test3 # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-4 /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test1`.`t1` mapped to number # @@ -576,7 +576,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-5 /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test2`.`t2` mapped to number # @@ -600,7 +600,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-6 /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test3`.`t3` mapped to number # @@ -624,7 +624,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-7 /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test1`.`t1` mapped to number # @@ -661,7 +661,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-8 /*!100001 SET @@session.gtid_seq_no=8*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test2`.`t2` mapped to number # @@ -685,7 +685,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # GTID 0-1-9 /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # #010909 4:46:40 server id # end_log_pos # Table_map: `test2`.`t2` mapped to number # diff --git a/mysql-test/suite/compat/oracle/r/binlog_ptr_mysqlbinlog.result b/mysql-test/suite/compat/oracle/r/binlog_ptr_mysqlbinlog.result new file mode 100644 index 00000000000..0656a685976 --- /dev/null +++ b/mysql-test/suite/compat/oracle/r/binlog_ptr_mysqlbinlog.result @@ -0,0 +1,100 @@ +SET @@SQL_MODE = 'ORACLE'; +########################################################################## +# Test verifies Gtid_log_event/Xid_log_event specific print # +########################################################################## +CREATE TABLE tm (f INT) ENGINE=MYISAM; +INSERT INTO tm VALUES (10); +CREATE TABLE t(f INT) ENGINE=INNODB; +INSERT INTO t VALUES (10); +CREATE OR REPLACE PROCEDURE simpleproc (param1 OUT INT) AS +BEGIN +SELECT COUNT(*) INTO param1 FROM t; +END; +/ +CREATE FUNCTION f1 RETURN INT +AS +BEGIN +RETURN 10; +END; +/ +FLUSH LOGS; +########################################################################## +# Delete data from master so that it can be restored from binlog # +########################################################################## +DROP FUNCTION f1; +DROP PROCEDURE simpleproc; +DROP TABLE tm; +DROP TABLE t; +########################################################################## +# Post recovery using mysqlbinlog # +########################################################################## +SHOW TABLES; +Tables_in_test +t +tm +SELECT * FROM tm; +f +10 +SELECT * FROM t; +f +10 +SELECT f1(); +f1() +10 +CALL simpleproc(@a); +SELECT @a; +@a +1 +"***** Clean Up *****" +DROP TABLE t,tm; +DROP PROCEDURE simpleproc; +DROP FUNCTION f1; +RESET MASTER; +########################################################################## +# Test verifies Gtid_log_event/Xid_log_event/Qery_log_event # +# specific print along with flashback option # +########################################################################## +CREATE TABLE tm(f INT) ENGINE=MYISAM; +INSERT INTO tm VALUES (10); +INSERT INTO tm VALUES (20); +CREATE TABLE t(f INT) ENGINE=INNODB; +INSERT INTO t VALUES (10); +INSERT INTO t VALUES (20); +########################################################################## +# Initial data # +########################################################################## +SELECT * FROM tm; +f +10 +20 +SELECT * FROM t; +f +10 +20 +FLUSH LOGS; +DELETE FROM tm WHERE f=20; +DELETE FROM t WHERE f=20; +FLUSH LOGS; +########################################################################## +# Data after deletion # +########################################################################## +SELECT * FROM tm; +f +10 +SELECT * FROM t; +f +10 +FOUND 2 /START TRANSACTION/ in test.sql +########################################################################## +# Data after recovery using flashback # +########################################################################## +SELECT * FROM tm; +f +10 +20 +SELECT * FROM t; +f +10 +20 +"***** Clean Up *****" +DROP TABLE t,tm; diff --git a/mysql-test/suite/compat/oracle/t/binlog_ptr_mysqlbinlog-master.opt b/mysql-test/suite/compat/oracle/t/binlog_ptr_mysqlbinlog-master.opt new file mode 100644 index 00000000000..8f0cc182f51 --- /dev/null +++ b/mysql-test/suite/compat/oracle/t/binlog_ptr_mysqlbinlog-master.opt @@ -0,0 +1 @@ +--flashback diff --git a/mysql-test/suite/compat/oracle/t/binlog_ptr_mysqlbinlog.test b/mysql-test/suite/compat/oracle/t/binlog_ptr_mysqlbinlog.test new file mode 100644 index 00000000000..bda32af5d4e --- /dev/null +++ b/mysql-test/suite/compat/oracle/t/binlog_ptr_mysqlbinlog.test @@ -0,0 +1,117 @@ +# ==== Purpose ==== +# +# Test verifies that point in time recovery of binary log works when +# sql_mode='ORACLE'. +# +# BEGIN statement is printed in three places +# 1) "Gtid_log_event::print" +# 2) "Xid_log_event::print" if flashback is enabled +# 3) "Query_log_event::print" if flashback is enabled and engine is +# non-transacional. +# +# Test verifies all these cases. +# +# ==== References ==== +# +# MDEV-23108: Point in time recovery of binary log fails when sql_mode=ORACLE +# +--source include/have_log_bin.inc +--source include/have_innodb.inc + +let $MYSQLD_DATADIR= `select @@datadir`; +SET @@SQL_MODE = 'ORACLE'; + +--echo ########################################################################## +--echo # Test verifies Gtid_log_event/Xid_log_event specific print # +--echo ########################################################################## +CREATE TABLE tm (f INT) ENGINE=MYISAM; +INSERT INTO tm VALUES (10); + +CREATE TABLE t(f INT) ENGINE=INNODB; +INSERT INTO t VALUES (10); + +DELIMITER /; +CREATE OR REPLACE PROCEDURE simpleproc (param1 OUT INT) AS + BEGIN + SELECT COUNT(*) INTO param1 FROM t; + END; +/ +CREATE FUNCTION f1 RETURN INT +AS +BEGIN + RETURN 10; +END; +/ +DELIMITER ;/ + +FLUSH LOGS; +--echo ########################################################################## +--echo # Delete data from master so that it can be restored from binlog # +--echo ########################################################################## +DROP FUNCTION f1; +DROP PROCEDURE simpleproc; +DROP TABLE tm; +DROP TABLE t; + +--exec $MYSQL_BINLOG $MYSQLD_DATADIR/master-bin.000001 > $MYSQLTEST_VARDIR/tmp/test.sql +--exec $MYSQL < $MYSQLTEST_VARDIR/tmp/test.sql + +--echo ########################################################################## +--echo # Post recovery using mysqlbinlog # +--echo ########################################################################## +SHOW TABLES; +SELECT * FROM tm; +SELECT * FROM t; +--horizontal_results +SELECT f1(); +CALL simpleproc(@a); +SELECT @a; + +--echo "***** Clean Up *****" +DROP TABLE t,tm; +DROP PROCEDURE simpleproc; +DROP FUNCTION f1; +--remove_file $MYSQLTEST_VARDIR/tmp/test.sql +RESET MASTER; + +--echo ########################################################################## +--echo # Test verifies Gtid_log_event/Xid_log_event/Qery_log_event # +--echo # specific print along with flashback option # +--echo ########################################################################## +CREATE TABLE tm(f INT) ENGINE=MYISAM; +INSERT INTO tm VALUES (10); +INSERT INTO tm VALUES (20); +CREATE TABLE t(f INT) ENGINE=INNODB; +INSERT INTO t VALUES (10); +INSERT INTO t VALUES (20); +--echo ########################################################################## +--echo # Initial data # +--echo ########################################################################## +SELECT * FROM tm; +SELECT * FROM t; +FLUSH LOGS; +DELETE FROM tm WHERE f=20; +DELETE FROM t WHERE f=20; +FLUSH LOGS; + +--echo ########################################################################## +--echo # Data after deletion # +--echo ########################################################################## +SELECT * FROM tm; +SELECT * FROM t; +--exec $MYSQL_BINLOG --flashback $MYSQLD_DATADIR/master-bin.000002 > $MYSQLTEST_VARDIR/tmp/test.sql + +--let SEARCH_FILE=$MYSQLTEST_VARDIR/tmp/test.sql +--let SEARCH_PATTERN=START TRANSACTION +--source include/search_pattern_in_file.inc +--exec $MYSQL < $MYSQLTEST_VARDIR/tmp/test.sql + +--echo ########################################################################## +--echo # Data after recovery using flashback # +--echo ########################################################################## +SELECT * FROM tm; +SELECT * FROM t; + +--echo "***** Clean Up *****" +DROP TABLE t,tm; +--remove_file $MYSQLTEST_VARDIR/tmp/test.sql diff --git a/mysql-test/suite/rpl/r/rpl_blackhole_row_annotate.result b/mysql-test/suite/rpl/r/rpl_blackhole_row_annotate.result index 3c5711855d8..2e75080810b 100644 --- a/mysql-test/suite/rpl/r/rpl_blackhole_row_annotate.result +++ b/mysql-test/suite/rpl/r/rpl_blackhole_row_annotate.result @@ -230,7 +230,7 @@ ALTER TABLE t1 ENGINE=BLACKHOLE #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-3 trans /*!100001 SET @@session.server_id=1*//*!*/; /*!100001 SET @@session.gtid_seq_no=3*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -248,7 +248,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-4 trans /*!100001 SET @@session.gtid_seq_no=4*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -266,7 +266,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-5 trans /*!100001 SET @@session.gtid_seq_no=5*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -284,7 +284,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-6 trans /*!100001 SET @@session.gtid_seq_no=6*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -302,7 +302,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-7 trans /*!100001 SET @@session.gtid_seq_no=7*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -328,7 +328,7 @@ ALTER TABLE t1 ADD PRIMARY KEY pk_t1 (a,b) # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-9 trans /*!100001 SET @@session.gtid_seq_no=9*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -346,7 +346,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-10 trans /*!100001 SET @@session.gtid_seq_no=10*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -364,7 +364,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-11 trans /*!100001 SET @@session.gtid_seq_no=11*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -390,7 +390,7 @@ ALTER TABLE t1 DROP PRIMARY KEY, ADD KEY key_t1 (a) # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-13 trans /*!100001 SET @@session.gtid_seq_no=13*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -408,7 +408,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-14 trans /*!100001 SET @@session.gtid_seq_no=14*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # @@ -426,7 +426,7 @@ COMMIT # at # #010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-15 trans /*!100001 SET @@session.gtid_seq_no=15*//*!*/; -BEGIN +START TRANSACTION /*!*/; # at # # at # diff --git a/mysql-test/suite/rpl/r/rpl_hrtime.result b/mysql-test/suite/rpl/r/rpl_hrtime.result index 7717dcf6700..d878a8d9df9 100644 --- a/mysql-test/suite/rpl/r/rpl_hrtime.result +++ b/mysql-test/suite/rpl/r/rpl_hrtime.result @@ -46,7 +46,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; create table t1 (a timestamp(4) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, b varchar(100), c datetime(2)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1293832861.123456/*!*/; SET @@session.time_zone='+03:00'/*!*/; @@ -55,7 +55,7 @@ insert t1 (b,c) values (now(6), now(6)) SET TIMESTAMP=1293832861.123456/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1293832861/*!*/; insert t1 values ('2010-10-10 10:10:10.101010','2010-10-10 10:10:10.101010','2010-10-10 10:10:10.101010') @@ -63,7 +63,7 @@ insert t1 values ('2010-10-10 10:10:10.101010','2010-10-10 10:10:10.101010','201 SET TIMESTAMP=1293832861/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1643756522.654321/*!*/; insert t1 (b,c) values (now(), now()) @@ -71,7 +71,7 @@ insert t1 (b,c) values (now(), now()) SET TIMESTAMP=1643756522.654321/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1643756522.654321/*!*/; insert t1 (b,c) values (0,0) @@ -79,7 +79,7 @@ insert t1 (b,c) values (0,0) SET TIMESTAMP=1643756522.654321/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1643756522.654321/*!*/; insert t1 (a,b,c) values (0,0,now(6)) diff --git a/mysql-test/suite/rpl/r/rpl_mdev382.result b/mysql-test/suite/rpl/r/rpl_mdev382.result index ee9377906ad..7e26e82d8c9 100644 --- a/mysql-test/suite/rpl/r/rpl_mdev382.result +++ b/mysql-test/suite/rpl/r/rpl_mdev382.result @@ -189,7 +189,7 @@ SET @@session.collation_database=DEFAULT/*!*/; CREATE TABLE `t``1` (`a``1` VARCHAR(4) PRIMARY KEY, `b``2` VARCHAR(3), `c``3` VARCHAR(7)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; LOAD DATA LOCAL INFILE '' INTO TABLE `t``1` FIELDS TERMINATED BY ',' ENCLOSED BY '\'' ESCAPED BY '\\' LINES TERMINATED BY '\n' (`a``1`, @`b```) SET `b``2`= @`b```, `c``3`= concat('|', "b""a'z", "!") @@ -200,7 +200,7 @@ COMMIT SET TIMESTAMP=1000000000/*!*/; truncate `t``1` /*!*/; -BEGIN +START TRANSACTION /*!*/; use `test`/*!*/; SET TIMESTAMP=1000000000/*!*/; @@ -288,7 +288,7 @@ SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; CREATE TABLE t1 (a1 BIGINT PRIMARY KEY, a2 BIGINT, a3 BIGINT, a4 BIGINT UNSIGNED, b DOUBLE, c DECIMAL(65,10), d VARCHAR(100)) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=1000000000/*!*/; INSERT INTO t1 VALUES (-9223372036854775808,42,9223372036854775807,18446744073709551615,-1234560123456789e110, -1234501234567890123456789012345678901234567890123456789.0123456789, REPEAT("x", 100)) @@ -296,7 +296,7 @@ INSERT INTO t1 VALUES (-9223372036854775808,42,9223372036854775807,1844674407370 SET TIMESTAMP=1000000000/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET @`a``1`:=-9223372036854775808/*!*/; SET @`a``2`:=42/*!*/; @@ -383,7 +383,7 @@ master-bin.000002 # Query 1 # COMMIT /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; ROLLBACK/*!*/; -BEGIN +START TRANSACTION /*!*/; use `ts``et`/*!*/; SET TIMESTAMP=1000000000/*!*/; diff --git a/mysql-test/suite/rpl/r/rpl_sp.result b/mysql-test/suite/rpl/r/rpl_sp.result index 97cc4dad8ad..686380427b5 100644 --- a/mysql-test/suite/rpl/r/rpl_sp.result +++ b/mysql-test/suite/rpl/r/rpl_sp.result @@ -810,7 +810,7 @@ insert into t1 values (b); insert into t1 values (unix_timestamp()); end /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; insert into t1 values ( NAME_CONST('b',8)) @@ -818,7 +818,7 @@ insert into t1 values ( NAME_CONST('b',8)) SET TIMESTAMP=t/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; insert into t1 values (unix_timestamp()) @@ -826,7 +826,7 @@ insert into t1 values (unix_timestamp()) SET TIMESTAMP=t/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; delete from t1 @@ -872,7 +872,7 @@ insert into t2 values(3); insert into t1 values (5); end /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; insert into t2 values(3) @@ -880,7 +880,7 @@ insert into t2 values(3) SET TIMESTAMP=t/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; insert into t1 values (15) @@ -888,7 +888,7 @@ insert into t1 values (15) SET TIMESTAMP=t/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; insert into t2 values(3) @@ -899,7 +899,7 @@ COMMIT SET TIMESTAMP=t/*!*/; alter procedure foo4 sql security invoker /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; insert into t2 values(3) @@ -907,7 +907,7 @@ insert into t2 values(3) SET TIMESTAMP=t/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; insert into t1 values (5) @@ -915,7 +915,7 @@ insert into t1 values (5) SET TIMESTAMP=t/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; delete from t2 @@ -936,7 +936,7 @@ begin insert into t2 values(20),(20); end /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; insert into t2 values(20),(20) @@ -964,7 +964,7 @@ insert into t1 values (x); return x+2; end /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; delete t1,t2 from t1,t2 @@ -972,7 +972,7 @@ delete t1,t2 from t1,t2 SET TIMESTAMP=t/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; SELECT `mysqltest1`.`fn1`(20) @@ -980,7 +980,7 @@ SELECT `mysqltest1`.`fn1`(20) SET TIMESTAMP=t/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; insert into t2 values(fn1(21)) @@ -998,7 +998,7 @@ begin return unix_timestamp(); end /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; delete from t1 @@ -1006,7 +1006,7 @@ delete from t1 SET TIMESTAMP=t/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; insert into t1 values(fn1()) @@ -1028,7 +1028,7 @@ begin return 0; end /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; delete from t2 @@ -1049,7 +1049,7 @@ insert into t2 values(x),(x); return 10; end /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; SELECT `mysqltest1`.`fn1`(100) @@ -1057,7 +1057,7 @@ SELECT `mysqltest1`.`fn1`(100) SET TIMESTAMP=t/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; SELECT `mysqltest1`.`fn1`(20) @@ -1065,7 +1065,7 @@ SELECT `mysqltest1`.`fn1`(20) SET TIMESTAMP=t/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; delete from t1 @@ -1076,7 +1076,7 @@ COMMIT SET TIMESTAMP=t/*!*/; CREATE DEFINER=`root`@`localhost` trigger trg before insert on t1 for each row set new.a= 10 /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; insert into t1 values (1) @@ -1084,7 +1084,7 @@ insert into t1 values (1) SET TIMESTAMP=t/*!*/; COMMIT /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; delete from t1 @@ -1095,7 +1095,7 @@ COMMIT SET TIMESTAMP=t/*!*/; drop trigger trg /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; insert into t1 values (1) @@ -1142,7 +1142,7 @@ CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW SET TIMESTAMP=t/*!*/; create table t1 (a int) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; insert into t1 (a) values (f1()) @@ -1169,7 +1169,7 @@ SET TIMESTAMP=t/*!*/; CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`(arg VARCHAR(10)) INSERT INTO t1 VALUES(arg) /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; INSERT INTO t1 VALUES( NAME_CONST('arg',_latin1'test' COLLATE 'latin1_swedish_ci')) @@ -1223,7 +1223,7 @@ SET TIMESTAMP=t/*!*/; CREATE DEFINER=`root`@`localhost` PROCEDURE `mysqltest`.`test`() begin end /*!*/; -BEGIN +START TRANSACTION /*!*/; SET TIMESTAMP=t/*!*/; insert into t values ( 1 ) @@ -1238,7 +1238,7 @@ insert into t values (1); return 0; end /*!*/; -BEGIN +START TRANSACTION /*!*/; use `mysqltest`/*!*/; SET TIMESTAMP=t/*!*/; diff --git a/sql/log_event.cc b/sql/log_event.cc index 57a39085e86..964f451a766 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -5358,8 +5358,7 @@ bool Query_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info) } else if (strcmp("COMMIT", query) == 0) { - if (my_b_write(&cache, (uchar*) "BEGIN", 5) || - my_b_printf(&cache, "\n%s\n", print_event_info->delimiter)) + if (my_b_printf(&cache, "START TRANSACTION\n%s\n", print_event_info->delimiter)) goto err; } } @@ -8254,7 +8253,8 @@ Gtid_log_event::print(FILE *file, PRINT_EVENT_INFO *print_event_info) goto err; } if (!(flags2 & FL_STANDALONE)) - if (my_b_printf(&cache, is_flashback ? "COMMIT\n%s\n" : "BEGIN\n%s\n", print_event_info->delimiter)) + if (my_b_printf(&cache, is_flashback ? "COMMIT\n%s\n" : + "START TRANSACTION\n%s\n", print_event_info->delimiter)) goto err; return cache.flush_data(); @@ -8937,7 +8937,7 @@ bool Xid_log_event::print(FILE* file, PRINT_EVENT_INFO* print_event_info) my_b_printf(&cache, "\tXid = %s\n", buf)) goto err; } - if (my_b_printf(&cache, is_flashback ? "BEGIN%s\n" : "COMMIT%s\n", + if (my_b_printf(&cache, is_flashback ? "START TRANSACTION%s\n" : "COMMIT%s\n", print_event_info->delimiter)) goto err; From 1ca52b969aeb704337747432e33e3a942146b6dd Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Wed, 22 Jul 2020 14:40:56 +0530 Subject: [PATCH 083/188] MDEV-23254 Replace FSP_FLAGS_HAS_PAGE_COMPRESSION with fil_space_t::is_compressed InnoDB should replace FSP_FLAGS_HAS_PAGE_COMPRESSION check with fil_space_t::is_compressed(). fil_space_t::is_compressed() checks for both non full crc32 and crc32 format. --- storage/innobase/fil/fil0fil.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index af7cbe7a284..57303a25300 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -817,7 +817,7 @@ fil_space_extend_must_retry( os_offset_t(FIL_IBD_FILE_INITIAL_SIZE << srv_page_size_shift)); *success = os_file_set_size(node->name, node->handle, new_size, - FSP_FLAGS_HAS_PAGE_COMPRESSION(space->flags)); + space->is_compressed()); os_has_said_disk_full = *success; if (*success) { @@ -2910,7 +2910,7 @@ fil_ibd_create( return NULL; } - const bool is_compressed = FSP_FLAGS_HAS_PAGE_COMPRESSION(flags); + const bool is_compressed = fil_space_t::is_compressed(flags); bool punch_hole = is_compressed; #ifdef _WIN32 @@ -3740,7 +3740,7 @@ fil_ibd_load( /* Adjust the memory-based flags that would normally be set by dict_tf_to_fsp_flags(). In recovery, we have no data dictionary. */ ulint flags = file.flags(); - if (FSP_FLAGS_HAS_PAGE_COMPRESSION(flags)) { + if (fil_space_t::is_compressed(flags)) { flags |= page_zip_level << FSP_FLAGS_MEM_COMPRESSION_LEVEL; } From 3d01576af2ae0b9868105a06a1456dbedb4b9612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Wed, 22 Jul 2020 08:48:14 +0300 Subject: [PATCH 084/188] Fix regex on test. --- mysql-test/suite/galera/t/galera_var_cluster_conf_id.test | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mysql-test/suite/galera/t/galera_var_cluster_conf_id.test b/mysql-test/suite/galera/t/galera_var_cluster_conf_id.test index dd4a630035d..668ace297a8 100644 --- a/mysql-test/suite/galera/t/galera_var_cluster_conf_id.test +++ b/mysql-test/suite/galera/t/galera_var_cluster_conf_id.test @@ -1,9 +1,9 @@ --source include/galera_cluster.inc --connection node_1 ---replace_regex /18446744073709551/ERROR/ /[0-9+]/#/ +--replace_regex /18446744073709551/ERROR/ /[0-9]+/#/ show status like 'wsrep_cluster_conf_id'; --connection node_2 ---replace_regex /18446744073709551/ERROR/ /[0-9+]/#/ +--replace_regex /18446744073709551/ERROR/ /[0-9]+/#/ show status like 'wsrep_cluster_conf_id'; From d96027c84af4a80630dd05d7f86910ae8b741181 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Wed, 22 Jul 2020 14:40:56 +0530 Subject: [PATCH 085/188] MDEV-23254 Replace FSP_FLAGS_HAS_PAGE_COMPRESSION with fil_space_t::is_compressed InnoDB should replace FSP_FLAGS_HAS_PAGE_COMPRESSION check with fil_space_t::is_compressed(). fil_space_t::is_compressed() checks for both non full crc32 and crc32 format. --- storage/innobase/fil/fil0fil.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index aaca87be52e..c813bbad39f 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -723,7 +723,7 @@ fil_space_extend_must_retry( os_offset_t(FIL_IBD_FILE_INITIAL_SIZE << srv_page_size_shift)); *success = os_file_set_size(node->name, node->handle, new_size, - FSP_FLAGS_HAS_PAGE_COMPRESSION(space->flags)); + space->is_compressed()); os_has_said_disk_full = *success; if (*success) { @@ -2653,7 +2653,7 @@ fil_ibd_create( return NULL; } - const bool is_compressed = FSP_FLAGS_HAS_PAGE_COMPRESSION(flags); + const bool is_compressed = fil_space_t::is_compressed(flags); bool punch_hole = is_compressed; #ifdef _WIN32 @@ -3478,7 +3478,7 @@ fil_ibd_load( /* Adjust the memory-based flags that would normally be set by dict_tf_to_fsp_flags(). In recovery, we have no data dictionary. */ ulint flags = file.flags(); - if (FSP_FLAGS_HAS_PAGE_COMPRESSION(flags)) { + if (fil_space_t::is_compressed(flags)) { flags |= page_zip_level << FSP_FLAGS_MEM_COMPRESSION_LEVEL; } From 92014bd1c611fd27c487bcc47a7521baa435214c Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Wed, 22 Jul 2020 16:09:58 +0530 Subject: [PATCH 086/188] MDEV-23252 Assertion failure 'req_type.is_dblwr_recover() || err == DB_SUCCESS' for page_compressed tables - This issue is caused by a5584b13d1e04f38b843602413669591aa65c359 (MDEV-15528). os_file_punch_hole() is added to fil_io() in MDEV-15528. But it fails to handle failure of os_file_punch_hole(). InnoDB should handle the DB_IO_NO_PUNCH_HOLE error and silently transform to DB_SUCCESS. InnoDB should set the punch hole flag correctly when tablespace is loaded fil_node_t::read_page0(): Set the punch hole flag when tablespace is loaded fil_io(): Handle the DB_IO_NO_PUNCH_HOLE error buf_flush_free_pages(): Checks the punch hole condition earlier using tablespace punch hole flag --- storage/innobase/buf/buf0flu.cc | 8 ++------ storage/innobase/fil/fil0fil.cc | 6 ++++++ storage/innobase/os/os0file.cc | 1 + 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 13f120414f3..a8de0ef5085 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -1308,7 +1308,8 @@ innodb_immediate_scrub_data_uncompressed from the freed ranges. static void buf_flush_freed_pages(fil_space_t *space) { ut_ad(space != NULL); - if (!srv_immediate_scrub_data_uncompressed && !space->is_compressed()) + const bool punch_hole= space->punch_hole; + if (!srv_immediate_scrub_data_uncompressed && !punch_hole) return; lsn_t flush_to_disk_lsn= log_sys.get_flushed_lsn(); @@ -1322,11 +1323,6 @@ static void buf_flush_freed_pages(fil_space_t *space) range_set freed_ranges= std::move(space->freed_ranges); freed_lock.unlock(); - const bool punch_hole= -#if defined(HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE) || defined(_WIN32) - space->is_compressed() || -#endif - false; for (const auto &range : freed_ranges) { diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index c813bbad39f..cca2d0b93b7 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -3903,6 +3903,12 @@ fil_io( if (punch_hole) { /* Punch the hole to the file */ err = os_file_punch_hole(node->handle, offset, len); + /* Punch hole is not supported, make space not to + support punch hole */ + if (UNIV_UNLIKELY(err == DB_IO_NO_PUNCH_HOLE)) { + node->space->punch_hole = false; + err = DB_SUCCESS; + } } else { /* Queue the aio request */ err = os_aio( diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index f30e42adeae..8c7eaf24e7e 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -4568,6 +4568,7 @@ invalid: space->flags = (space->flags & FSP_FLAGS_MEM_MASK) | flags; + space->punch_hole = space->is_compressed(); this->size = ulint(size_bytes / psize); space->committed_size = space->size += this->size; } else if (space->id != TRX_SYS_SPACE || space->size_in_header) { From 2a3bc0b9cdd7f4bd3ed57ddec6cc1fd7ca5b35d9 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Tue, 21 Jul 2020 12:49:27 +0530 Subject: [PATCH 087/188] MDEV-13830 Assertion failed: recv_sys->mlog_checkpoint_lsn <= recv_sys->recovered_lsn There can be multiple MLOG_CHECKPOINT record for the same checkpoint. During recovery, InnoDB could encounter the previous MLOG_CHECKPOINT for the checkpoint lsn. So the assertion mlog_checkpoint_lsn <= recovered_lsn is wrong. --- storage/innobase/log/log0recv.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index 16980582c14..c2eb1fe7659 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -2917,8 +2917,9 @@ loop: if (lsn == checkpoint_lsn) { if (recv_sys->mlog_checkpoint_lsn) { - ut_ad(recv_sys->mlog_checkpoint_lsn - <= recv_sys->recovered_lsn); + /* There can be multiple + MLOG_CHECKPOINT lsn for the + same checkpoint. */ break; } recv_sys->mlog_checkpoint_lsn From 3a8943ae7317ad48127387855ab5258a9bb2147a Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Tue, 21 Jul 2020 13:17:53 +0530 Subject: [PATCH 088/188] MDEV-17481 mariadb service won't shutdown when it's running and the OS datetime updated backwards __pthread_cond_timedwait() in page cleaner hangs if os time moved backwards.Workaround could be waking up the page cleaner thread in logs_empty_and_mark_files_at_shutdown(). But there is possibility that server could hang when server is running. So InnoDB should wake up page cleaner thread periodically in srv_master_do_idle_tasks(). --- storage/innobase/log/log0log.cc | 3 +++ storage/innobase/srv/srv0srv.cc | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc index ea657e49d07..972bbe7c6c0 100644 --- a/storage/innobase/log/log0log.cc +++ b/storage/innobase/log/log0log.cc @@ -1936,6 +1936,9 @@ wait_suspend_loop: "Waiting for page cleaner"); ib::info() << "Waiting for page_cleaner to " "finish flushing of buffer pool"; + /* This is a workaround to avoid the InnoDB hang + when OS datetime changed backwards */ + os_event_set(buf_flush_event); count = 0; } } diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index 6388f84cdea..f1216dcd51e 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -2365,6 +2365,10 @@ srv_master_do_idle_tasks(void) log_checkpoint(true); MONITOR_INC_TIME_IN_MICRO_SECS(MONITOR_SRV_CHECKPOINT_MICROSECOND, counter_time); + + /* This is a workaround to avoid the InnoDB hang when OS datetime + changed backwards.*/ + os_event_set(buf_flush_event); } /** Perform shutdown tasks. From ddb8309e8c1bac8d419fe5c224665c6dca1e2878 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Tue, 21 Jul 2020 10:31:10 +0200 Subject: [PATCH 089/188] MDEV-21997 Server crashes in LEX::create_item_ident_sp upon use of unknown identifier If there is no current_select and variable is not found among SP variables it can be only an error. --- mysql-test/main/parser.result | 55 +++++++++++++++++++++++++++++ mysql-test/main/parser.test | 66 +++++++++++++++++++++++++++++++++++ sql/sql_lex.cc | 7 ++++ 3 files changed, 128 insertions(+) diff --git a/mysql-test/main/parser.result b/mysql-test/main/parser.result index 42fdc01617b..ad22cd886f7 100644 --- a/mysql-test/main/parser.result +++ b/mysql-test/main/parser.result @@ -1838,4 +1838,59 @@ ERROR 42S02: Table 'test.t1' doesn't exist SET STATEMENT max_statement_time=180 FOR BACKUP LOCK test.t1; SET STATEMENT max_statement_time=180 FOR BACKUP UNLOCK; set SQL_MODE=@save_sql_mode; +# +# MDEV-21997: Server crashes in LEX::create_item_ident_sp +# upon use of unknown identifier +# +/*! IF 1 IN ( SELECT 2 ) OR foo = 3 THEN */ SELECT 4; +ERROR 42000: Undeclared variable: foo +BEGIN NOT ATOMIC +IF (SELECT 2) OR foo = 3 THEN +SELECT 4; +END IF ; +END; +$$ +ERROR 42000: Undeclared variable: foo +# ... but if declare it then it still work +BEGIN NOT ATOMIC +DECLARE foo int; +IF (SELECT 2) OR foo = 3 THEN +SELECT 4; +END IF ; +END; +$$ +4 +4 +CASE (SELECT 2) OR foo +WHEN 1 THEN +SET @x=10; +$$ +ERROR 42000: Undeclared variable: foo +/*! WHILE (SELECT 2) OR foo */ +SET @x=10; +END WHILE; +$$ +ERROR 42000: Undeclared variable: foo +REPEAT +SET @x=10; +UNTIL (SELECT 2) OR foo +END REPEAT; +$$ +ERROR 42000: Undeclared variable: foo +FOR i IN 1..(SELECT 2) OR foo +DO +SET @x=10; +END FOR; +$$ +ERROR 42000: Undeclared variable: foo +# ... but automatic FOR variable still work +FOR i IN 1..2 +DO +SELECT i; +END FOR; +$$ +i +1 +i +2 # End of 10.4 tests diff --git a/mysql-test/main/parser.test b/mysql-test/main/parser.test index 8aa2fb528ea..09fe73b7dbe 100644 --- a/mysql-test/main/parser.test +++ b/mysql-test/main/parser.test @@ -1613,4 +1613,70 @@ SET STATEMENT max_statement_time=180 FOR BACKUP LOCK test.t1; SET STATEMENT max_statement_time=180 FOR BACKUP UNLOCK; set SQL_MODE=@save_sql_mode; + +--echo # +--echo # MDEV-21997: Server crashes in LEX::create_item_ident_sp +--echo # upon use of unknown identifier +--echo # + +--error ER_SP_UNDECLARED_VAR +/*! IF 1 IN ( SELECT 2 ) OR foo = 3 THEN */ SELECT 4; + + +DELIMITER $$; + +--error ER_SP_UNDECLARED_VAR +BEGIN NOT ATOMIC + IF (SELECT 2) OR foo = 3 THEN + SELECT 4; + END IF ; +END; +$$ + +--echo # ... but if declare it then it still work +BEGIN NOT ATOMIC + DECLARE foo int; + IF (SELECT 2) OR foo = 3 THEN + SELECT 4; + END IF ; +END; +$$ + +--error ER_SP_UNDECLARED_VAR +CASE (SELECT 2) OR foo +WHEN 1 THEN + SET @x=10; +$$ + +--error ER_SP_UNDECLARED_VAR +/*! WHILE (SELECT 2) OR foo */ + SET @x=10; +END WHILE; +$$ + +--error ER_SP_UNDECLARED_VAR +REPEAT + SET @x=10; +UNTIL (SELECT 2) OR foo +END REPEAT; +$$ + +--error ER_SP_UNDECLARED_VAR +FOR i IN 1..(SELECT 2) OR foo +DO + SET @x=10; +END FOR; +$$ + +--echo # ... but automatic FOR variable still work +FOR i IN 1..2 +DO + SELECT i; +END FOR; +$$ + +DELIMITER ;$$ + + + --echo # End of 10.4 tests diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index eb22534f4fb..c21a5dee088 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -7598,6 +7598,13 @@ Item *LEX::create_item_ident_sp(THD *thd, Lex_ident_sys_st *name, return new (thd->mem_root) Item_func_sqlerrm(thd); } + if (!current_select) + { + // we are out of SELECT or FOR so it is syntax error + my_error(ER_SP_UNDECLARED_VAR, MYF(0), name->str); + return NULL; + } + if (current_select->parsing_place == FOR_LOOP_BOUND) return create_item_for_loop_bound(thd, &null_clex_str, &null_clex_str, name); From 5f2628d1eea21d9732f582b77782b072e5e04014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 22 Jul 2020 16:17:53 +0300 Subject: [PATCH 090/188] MDEV-22778 Slow InnoDB shutdown on large instance Starting with MDEV-17441 we would no longer have os_once, and we would always initialize zip_pad_info_t::mutex and dict_table_t::autoinc_mutex, even for tables are not in ROW_FORMAT=COMPRESSED nor include any AUTO_INCREMENT column. mutex_free() on those unnecessary objects would make shutdown very slow compared to older versions. Let us use std::mutex for those two mutexes, to reduce the overhead. The critical sections protected by these mutexes is very small, and therefore contention or the need for any instrumentation should be unlikely. --- storage/innobase/dict/dict0dict.cc | 14 ++++---- storage/innobase/dict/dict0mem.cc | 4 +-- storage/innobase/handler/ha_innodb.cc | 49 ++++++++++++--------------- storage/innobase/include/dict0dict.h | 4 --- storage/innobase/include/dict0mem.h | 7 ++-- storage/innobase/include/sync0sync.h | 2 -- storage/innobase/include/sync0types.h | 3 -- storage/innobase/page/page0zip.cc | 2 +- storage/innobase/sync/sync0debug.cc | 6 ---- storage/innobase/sync/sync0sync.cc | 3 -- 10 files changed, 36 insertions(+), 58 deletions(-) diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc index 07fcd4f57c1..3bf701b556a 100644 --- a/storage/innobase/dict/dict0dict.cc +++ b/storage/innobase/dict/dict0dict.cc @@ -985,7 +985,7 @@ inline void dict_sys_t::add(dict_table_t* table) ulint fold = ut_fold_string(table->name.m_name); - mutex_create(LATCH_ID_AUTOINC, &table->autoinc_mutex); + new (&table->autoinc_mutex) std::mutex(); /* Look for a table with the same name: error if such exists */ { @@ -1115,7 +1115,7 @@ dict_index_t *dict_index_t::clone() const (mem_heap_zalloc(heap, n_uniq * sizeof *stat_n_sample_sizes)); index->stat_n_non_null_key_vals= static_cast (mem_heap_zalloc(heap, n_uniq * sizeof *stat_n_non_null_key_vals)); - mutex_create(LATCH_ID_ZIP_PAD_MUTEX, &index->zip_pad.mutex); + new (&index->zip_pad.mutex) std::mutex(); return index; } @@ -1777,7 +1777,7 @@ void dict_sys_t::remove(dict_table_t* table, bool lru, bool keep) UT_DELETE(table->vc_templ); } - mutex_free(&table->autoinc_mutex); + table->autoinc_mutex.~mutex(); if (keep) { return; @@ -6200,10 +6200,10 @@ dict_index_zip_success( return; } - mutex_enter(&index->zip_pad.mutex); + index->zip_pad.mutex.lock(); ++index->zip_pad.success; dict_index_zip_pad_update(&index->zip_pad, zip_threshold); - mutex_exit(&index->zip_pad.mutex); + index->zip_pad.mutex.unlock(); } /*********************************************************************//** @@ -6220,10 +6220,10 @@ dict_index_zip_failure( return; } - mutex_enter(&index->zip_pad.mutex); + index->zip_pad.mutex.lock(); ++index->zip_pad.failure; dict_index_zip_pad_update(&index->zip_pad, zip_threshold); - mutex_exit(&index->zip_pad.mutex); + index->zip_pad.mutex.unlock(); } /*********************************************************************//** diff --git a/storage/innobase/dict/dict0mem.cc b/storage/innobase/dict/dict0mem.cc index bbc5535668c..e9e0d33bf9f 100644 --- a/storage/innobase/dict/dict0mem.cc +++ b/storage/innobase/dict/dict0mem.cc @@ -789,7 +789,7 @@ dict_mem_index_create( dict_mem_fill_index_struct(index, heap, index_name, type, n_fields); - mutex_create(LATCH_ID_ZIP_PAD_MUTEX, &index->zip_pad.mutex); + new (&index->zip_pad.mutex) std::mutex(); if (type & DICT_SPATIAL) { index->rtr_track = new @@ -1098,7 +1098,7 @@ dict_mem_index_free( ut_ad(index); ut_ad(index->magic_n == DICT_INDEX_MAGIC_N); - mutex_free(&index->zip_pad.mutex); + index->zip_pad.mutex.~mutex(); if (dict_index_is_spatial(index)) { for (auto& rtr_info : index->rtr_track->rtr_active) { diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index aaadcb94946..9678c466cb4 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -582,7 +582,6 @@ static PSI_cond_info all_innodb_conds[] = { performance schema instrumented if "UNIV_PFS_MUTEX" is defined */ static PSI_mutex_info all_innodb_mutexes[] = { - PSI_KEY(autoinc_mutex), # ifndef PFS_SKIP_BUFFER_MUTEX_RWLOCK PSI_KEY(buffer_block_mutex), # endif /* !PFS_SKIP_BUFFER_MUTEX_RWLOCK */ @@ -635,7 +634,6 @@ static PSI_mutex_info all_innodb_mutexes[] = { PSI_KEY(rtr_match_mutex), PSI_KEY(rtr_path_mutex), PSI_KEY(trx_sys_mutex), - PSI_KEY(zip_pad_mutex) }; # endif /* UNIV_PFS_MUTEX */ @@ -2587,7 +2585,7 @@ ha_innobase::innobase_reset_autoinc( if (error == DB_SUCCESS) { dict_table_autoinc_initialize(m_prebuilt->table, autoinc); - mutex_exit(&m_prebuilt->table->autoinc_mutex); + m_prebuilt->table->autoinc_mutex.unlock(); } return(error); @@ -6016,7 +6014,7 @@ initialize_auto_increment(dict_table_t* table, const Field* field) const unsigned col_no = innodb_col_no(field); - mutex_enter(&table->autoinc_mutex); + table->autoinc_mutex.lock(); table->persistent_autoinc = 1 + dict_table_get_nth_col_pos(table, col_no, NULL); @@ -6046,7 +6044,7 @@ initialize_auto_increment(dict_table_t* table, const Field* field) innobase_get_int_col_max_value(field)); } - mutex_exit(&table->autoinc_mutex); + table->autoinc_mutex.unlock(); } /** Open an InnoDB table @@ -7867,7 +7865,7 @@ ha_innobase::innobase_lock_autoinc(void) switch (innobase_autoinc_lock_mode) { case AUTOINC_NO_LOCKING: /* Acquire only the AUTOINC mutex. */ - mutex_enter(&m_prebuilt->table->autoinc_mutex); + m_prebuilt->table->autoinc_mutex.lock(); break; case AUTOINC_NEW_STYLE_LOCKING: @@ -7876,24 +7874,19 @@ ha_innobase::innobase_lock_autoinc(void) transaction has already acquired the AUTOINC lock on behalf of a LOAD FILE or INSERT ... SELECT etc. type of statement. */ - if (thd_sql_command(m_user_thd) == SQLCOM_INSERT - || thd_sql_command(m_user_thd) == SQLCOM_REPLACE - || thd_sql_command(m_user_thd) == SQLCOM_END // RBR event - ) { - + switch (thd_sql_command(m_user_thd)) { + case SQLCOM_INSERT: + case SQLCOM_REPLACE: + case SQLCOM_END: // RBR event /* Acquire the AUTOINC mutex. */ - mutex_enter(&m_prebuilt->table->autoinc_mutex); - + m_prebuilt->table->autoinc_mutex.lock(); /* We need to check that another transaction isn't already holding the AUTOINC lock on the table. */ - if (m_prebuilt->table->n_waiting_or_granted_auto_inc_locks) { - /* Release the mutex to avoid deadlocks and - fall back to old style locking. */ - mutex_exit(&m_prebuilt->table->autoinc_mutex); - } else { + if (!m_prebuilt->table->n_waiting_or_granted_auto_inc_locks) { /* Do not fall back to old style locking. */ - break; + DBUG_RETURN(error); } + m_prebuilt->table->autoinc_mutex.unlock(); } /* Use old style locking. */ /* fall through */ @@ -7905,7 +7898,7 @@ ha_innobase::innobase_lock_autoinc(void) if (error == DB_SUCCESS) { /* Acquire the AUTOINC mutex. */ - mutex_enter(&m_prebuilt->table->autoinc_mutex); + m_prebuilt->table->autoinc_mutex.lock(); } break; @@ -7933,7 +7926,7 @@ ha_innobase::innobase_set_max_autoinc( if (error == DB_SUCCESS) { dict_table_autoinc_update_if_greater(m_prebuilt->table, auto_inc); - mutex_exit(&m_prebuilt->table->autoinc_mutex); + m_prebuilt->table->autoinc_mutex.unlock(); } return(error); @@ -12782,7 +12775,7 @@ create_table_info_t::create_table_update_dict() autoinc = 1; } - mutex_enter(&innobase_table->autoinc_mutex); + innobase_table->autoinc_mutex.lock(); dict_table_autoinc_initialize(innobase_table, autoinc); if (innobase_table->is_temporary()) { @@ -12807,7 +12800,7 @@ create_table_info_t::create_table_update_dict() } } - mutex_exit(&innobase_table->autoinc_mutex); + innobase_table->autoinc_mutex.unlock(); } innobase_parse_hint_from_comment(m_thd, innobase_table, m_form->s); @@ -16497,7 +16490,7 @@ ha_innobase::innobase_get_autoinc( /* It should have been initialized during open. */ if (*value == 0) { m_prebuilt->autoinc_error = DB_UNSUPPORTED; - mutex_exit(&m_prebuilt->table->autoinc_mutex); + m_prebuilt->table->autoinc_mutex.unlock(); } } @@ -16521,7 +16514,7 @@ ha_innobase::innobase_peek_autoinc(void) innodb_table = m_prebuilt->table; - mutex_enter(&innodb_table->autoinc_mutex); + innodb_table->autoinc_mutex.lock(); auto_inc = dict_table_autoinc_read(innodb_table); @@ -16530,7 +16523,7 @@ ha_innobase::innobase_peek_autoinc(void) " '" << innodb_table->name << "'"; } - mutex_exit(&innodb_table->autoinc_mutex); + innodb_table->autoinc_mutex.unlock(); return(auto_inc); } @@ -16637,7 +16630,7 @@ ha_innobase::get_auto_increment( /* Out of range number. Let handler::update_auto_increment() take care of this */ m_prebuilt->autoinc_last_value = 0; - mutex_exit(&m_prebuilt->table->autoinc_mutex); + m_prebuilt->table->autoinc_mutex.unlock(); *nb_reserved_values= 0; return; } @@ -16680,7 +16673,7 @@ ha_innobase::get_auto_increment( m_prebuilt->autoinc_offset = offset; m_prebuilt->autoinc_increment = increment; - mutex_exit(&m_prebuilt->table->autoinc_mutex); + m_prebuilt->table->autoinc_mutex.unlock(); } /*******************************************************************//** diff --git a/storage/innobase/include/dict0dict.h b/storage/innobase/include/dict0dict.h index 35309fc1b54..c5f1ef96ea6 100644 --- a/storage/innobase/include/dict0dict.h +++ b/storage/innobase/include/dict0dict.h @@ -291,7 +291,6 @@ UNIV_INLINE void dict_table_autoinc_initialize(dict_table_t* table, ib_uint64_t value) { - ut_ad(mutex_own(&table->autoinc_mutex)); table->autoinc = value; } @@ -304,7 +303,6 @@ UNIV_INLINE ib_uint64_t dict_table_autoinc_read(const dict_table_t* table) { - ut_ad(mutex_own(&table->autoinc_mutex)); return(table->autoinc); } @@ -318,8 +316,6 @@ UNIV_INLINE bool dict_table_autoinc_update_if_greater(dict_table_t* table, ib_uint64_t value) { - ut_ad(mutex_own(&table->autoinc_mutex)); - if (value > table->autoinc) { table->autoinc = value; diff --git a/storage/innobase/include/dict0mem.h b/storage/innobase/include/dict0mem.h index 259da23fcd9..ed392df3c05 100644 --- a/storage/innobase/include/dict0mem.h +++ b/storage/innobase/include/dict0mem.h @@ -51,6 +51,7 @@ Created 1/8/1996 Heikki Tuuri #include #include #include +#include /* Forward declaration. */ struct ib_rbt_t; @@ -932,7 +933,9 @@ extern ulong zip_pad_max; an uncompressed page should be left as padding to avoid compression failures. This estimate is based on a self-adapting heuristic. */ struct zip_pad_info_t { - SysMutex mutex; /*!< mutex protecting the info */ + /** Dummy assignment operator for dict_index_t::clone() */ + zip_pad_info_t &operator=(const zip_pad_info_t&) { return *this; } + std::mutex mutex; /*!< mutex protecting the info */ Atomic_relaxed pad; /*!< number of bytes used as pad */ ulint success;/*!< successful compression ops during @@ -2240,7 +2243,7 @@ public: lock_t* autoinc_lock; /** Mutex protecting the autoincrement counter. */ - ib_mutex_t autoinc_mutex; + std::mutex autoinc_mutex; /** Autoinc counter value to give to the next inserted row. */ ib_uint64_t autoinc; diff --git a/storage/innobase/include/sync0sync.h b/storage/innobase/include/sync0sync.h index ddbfa451d22..28d954df8c1 100644 --- a/storage/innobase/include/sync0sync.h +++ b/storage/innobase/include/sync0sync.h @@ -50,7 +50,6 @@ instrumentation due to their large number of instances. */ #ifdef UNIV_PFS_MUTEX /* Key defines to register InnoDB mutexes with performance schema */ -extern mysql_pfs_key_t autoinc_mutex_key; extern mysql_pfs_key_t buffer_block_mutex_key; extern mysql_pfs_key_t buf_pool_mutex_key; extern mysql_pfs_key_t buf_pool_zip_mutex_key; @@ -105,7 +104,6 @@ extern mysql_pfs_key_t event_mutex_key; extern mysql_pfs_key_t event_manager_mutex_key; extern mysql_pfs_key_t sync_array_mutex_key; extern mysql_pfs_key_t thread_mutex_key; -extern mysql_pfs_key_t zip_pad_mutex_key; extern mysql_pfs_key_t row_drop_list_mutex_key; extern mysql_pfs_key_t rw_trx_hash_element_mutex_key; #endif /* UNIV_PFS_MUTEX */ diff --git a/storage/innobase/include/sync0types.h b/storage/innobase/include/sync0types.h index 4d2a7c8ff28..32fdc89d6e4 100644 --- a/storage/innobase/include/sync0types.h +++ b/storage/innobase/include/sync0types.h @@ -253,7 +253,6 @@ enum latch_level_t { SYNC_IBUF_HEADER, SYNC_DICT_HEADER, SYNC_STATS_AUTO_RECALC, - SYNC_DICT_AUTOINC_MUTEX, SYNC_DICT, SYNC_FTS_CACHE, @@ -282,7 +281,6 @@ enum latch_level_t { up its meta-data. See sync0debug.c. */ enum latch_id_t { LATCH_ID_NONE = 0, - LATCH_ID_AUTOINC, LATCH_ID_BUF_BLOCK_MUTEX, LATCH_ID_BUF_POOL, LATCH_ID_BUF_POOL_ZIP, @@ -335,7 +333,6 @@ enum latch_id_t { LATCH_ID_EVENT_MANAGER, LATCH_ID_EVENT_MUTEX, LATCH_ID_SYNC_ARRAY_MUTEX, - LATCH_ID_ZIP_PAD_MUTEX, LATCH_ID_OS_AIO_READ_MUTEX, LATCH_ID_OS_AIO_WRITE_MUTEX, LATCH_ID_OS_AIO_LOG_MUTEX, diff --git a/storage/innobase/page/page0zip.cc b/storage/innobase/page/page0zip.cc index 95832e3e147..eb94aad207c 100644 --- a/storage/innobase/page/page0zip.cc +++ b/storage/innobase/page/page0zip.cc @@ -1607,7 +1607,7 @@ page_zip_fields_free( { if (index) { dict_table_t* table = index->table; - mutex_free(&index->zip_pad.mutex); + index->zip_pad.mutex.~mutex(); mem_heap_free(index->heap); dict_mem_table_free(table); diff --git a/storage/innobase/sync/sync0debug.cc b/storage/innobase/sync/sync0debug.cc index d1ebcd52df3..485e867dfe6 100644 --- a/storage/innobase/sync/sync0debug.cc +++ b/storage/innobase/sync/sync0debug.cc @@ -505,7 +505,6 @@ LatchDebug::LatchDebug() LEVEL_MAP_INSERT(SYNC_IBUF_HEADER); LEVEL_MAP_INSERT(SYNC_DICT_HEADER); LEVEL_MAP_INSERT(SYNC_STATS_AUTO_RECALC); - LEVEL_MAP_INSERT(SYNC_DICT_AUTOINC_MUTEX); LEVEL_MAP_INSERT(SYNC_DICT); LEVEL_MAP_INSERT(SYNC_FTS_CACHE); LEVEL_MAP_INSERT(SYNC_DICT_OPERATION); @@ -765,7 +764,6 @@ LatchDebug::check_order( case SYNC_NOREDO_RSEG: case SYNC_PURGE_LATCH: case SYNC_PURGE_QUEUE: - case SYNC_DICT_AUTOINC_MUTEX: case SYNC_DICT_OPERATION: case SYNC_DICT_HEADER: case SYNC_TRX_I_S_RWLOCK: @@ -1276,8 +1274,6 @@ sync_latch_meta_init() /* The latches should be ordered on latch_id_t. So that we can index directly into the vector to update and fetch meta-data. */ - LATCH_ADD_MUTEX(AUTOINC, SYNC_DICT_AUTOINC_MUTEX, autoinc_mutex_key); - #if defined PFS_SKIP_BUFFER_MUTEX_RWLOCK || defined PFS_GROUP_BUFFER_SYNC LATCH_ADD_MUTEX(BUF_BLOCK_MUTEX, SYNC_BUF_BLOCK, PFS_NOT_INSTRUMENTED); #else @@ -1417,8 +1413,6 @@ sync_latch_meta_init() LATCH_ADD_MUTEX(SYNC_ARRAY_MUTEX, SYNC_NO_ORDER_CHECK, sync_array_mutex_key); - LATCH_ADD_MUTEX(ZIP_PAD_MUTEX, SYNC_NO_ORDER_CHECK, zip_pad_mutex_key); - LATCH_ADD_MUTEX(OS_AIO_READ_MUTEX, SYNC_NO_ORDER_CHECK, PFS_NOT_INSTRUMENTED); diff --git a/storage/innobase/sync/sync0sync.cc b/storage/innobase/sync/sync0sync.cc index c52064c7bb9..6b365b86ace 100644 --- a/storage/innobase/sync/sync0sync.cc +++ b/storage/innobase/sync/sync0sync.cc @@ -35,8 +35,6 @@ Created 9/5/1995 Heikki Tuuri #include "sync0sync.h" #ifdef UNIV_PFS_MUTEX -/* Key to register autoinc_mutex with performance schema */ -mysql_pfs_key_t autoinc_mutex_key; mysql_pfs_key_t buffer_block_mutex_key; mysql_pfs_key_t buf_pool_mutex_key; mysql_pfs_key_t buf_pool_zip_mutex_key; @@ -91,7 +89,6 @@ mysql_pfs_key_t event_mutex_key; mysql_pfs_key_t event_manager_mutex_key; mysql_pfs_key_t sync_array_mutex_key; mysql_pfs_key_t thread_mutex_key; -mysql_pfs_key_t zip_pad_mutex_key; mysql_pfs_key_t row_drop_list_mutex_key; mysql_pfs_key_t rw_trx_hash_element_mutex_key; #endif /* UNIV_PFS_MUTEX */ From b3dd95e035c10ad30c52f582ce519b1713c37262 Mon Sep 17 00:00:00 2001 From: Sujatha Date: Thu, 23 Jul 2020 12:54:13 +0530 Subject: [PATCH 091/188] MDEV-14203: rpl.rpl_extra_col_master_myisam, rpl.rpl_slave_load_tmpdir_not_exist failed in buildbot with a warning Problem: ======= rpl.rpl_slave_load_tmpdir_not_exist 'stmt' w3 [ fail ] Found warnings/errors in server log file! Test ended at 2017-09-27 20:34:55 [Warning] Master is configured to log replication events with checksum, but will not send such events to slaves that cannot process them ^ Found warnings in /mnt/buildbot/build/mariadb-10.2.10/mysql-test/var/3/log/mysqld.1.err ok Analysis: ======== When slave tries to connect to master 'get_master_version_and_clock' function is invoked to perform elaborated slave-master handshake. During this process slave server queries master server, to know if it is checksum aware and at the same time master is notified about its CRC-awareness. The master's side instant value of @@global.binlog_checksum is stored in the dump thread's uservar area as well as cached locally to become known in consensus by master and slave. Post hand-shake slave requests master for binlog dump. It sends 'COM_BINLOG_DUMP'. This command is sent to master by 'cli_advanced_command' call. If there is some temporary network failure during this request_dump call, 'end_server' is invoked to close the current connection between master and slave. Upon connection close the dump thread on the master gets terminated and it clears the 'uservar' data it got through master-slave handshake. The 'COM_BINLOG_DUMP' command is sent once again without master-slave handshake. Since the checksum data is not available with new dump thread a warning gets reported. Fix: === Upon network write error donot attempt reconnect, proceed to master-slave handshake. This ensures that master is aware of slave's capability to use checksums. --- .../r/rpl_dump_request_retry_warning.result | 22 +++++++ .../rpl/t/rpl_dump_request_retry_warning.test | 60 +++++++++++++++++++ sql-common/client.c | 2 + sql/net_serv.cc | 12 ++++ sql/slave.cc | 3 +- 5 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 mysql-test/suite/rpl/r/rpl_dump_request_retry_warning.result create mode 100644 mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test diff --git a/mysql-test/suite/rpl/r/rpl_dump_request_retry_warning.result b/mysql-test/suite/rpl/r/rpl_dump_request_retry_warning.result new file mode 100644 index 00000000000..3a80d5b5f31 --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_dump_request_retry_warning.result @@ -0,0 +1,22 @@ +include/master-slave.inc +[connection master] +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES(1); +connection slave; +SET @saved_dbug = @@GLOBAL.debug_dbug; +SET @@global.debug_dbug= 'd,simulate_error_on_packet_write'; +START SLAVE; +SET DEBUG_SYNC= 'now WAIT_FOR parked'; +SET @@GLOBAL.debug_dbug = @saved_dbug; +SET DEBUG_SYNC= 'now SIGNAL continue'; +SET DEBUG_SYNC= 'RESET'; +include/wait_for_slave_io_to_start.inc +include/wait_for_slave_sql_to_start.inc +connection master; +include/sync_slave_sql_with_master.inc +SELECT * FROM t1; +a +1 +connection master; +DROP TABLE t1; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test b/mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test new file mode 100644 index 00000000000..d750d44ae71 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_dump_request_retry_warning.test @@ -0,0 +1,60 @@ +# ==== Purpose ==== +# +# Test verifies that, due to a temporary network error, if request dump +# command specific packet write operation fails then the write error gets +# handled appropriately. Further retry will be initiated with appropriate +# slave registration on master. This will ensure that master has all the +# details of slave and no warnings are reported on the master side. +# +# ==== Implementation ==== +# +# Steps: +# 0 - Skip the slave start. +# 1 - Enable debug simulation which will simulate packet write error during +# dump request command execution. +# 2 - Start the slave. Observe that slave is able to reconnect post +# temporary network write error. +# +# ==== References ==== +# +# MDEV-14203: rpl.rpl_extra_col_master_myisam, +# rpl.rpl_slave_load_tmpdir_not_exist failed in buildbot with a +# warning +# +# MDEV-13258: rpl.rpl_skip_replication, rpl.rpl_set_statement_default_master +# failed in buildbot +# + +--source include/have_debug.inc +--source include/have_debug_sync.inc +--let $rpl_skip_start_slave=1 +--source include/master-slave.inc + +# Do an insert on master +CREATE TABLE t1(a int); +INSERT INTO t1 VALUES(1); + +# Add a debug point and start the slave so that dump request fails. +connection slave; +SET @saved_dbug = @@GLOBAL.debug_dbug; +SET @@global.debug_dbug= 'd,simulate_error_on_packet_write'; + +START SLAVE; +SET DEBUG_SYNC= 'now WAIT_FOR parked'; +SET @@GLOBAL.debug_dbug = @saved_dbug; +SET DEBUG_SYNC= 'now SIGNAL continue'; +SET DEBUG_SYNC= 'RESET'; + +--source include/wait_for_slave_io_to_start.inc +--source include/wait_for_slave_sql_to_start.inc + +# Sync the slave and verify that slave has caught up with the master. +connection master; +--source include/sync_slave_sql_with_master.inc +SELECT * FROM t1; + +# Cleanup +connection master; +DROP TABLE t1; + +--source include/rpl_end.inc diff --git a/sql-common/client.c b/sql-common/client.c index 227759f4163..b66eee2a508 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -721,6 +721,8 @@ cli_advanced_command(MYSQL *mysql, enum enum_server_command command, set_mysql_error(mysql, CR_NET_PACKET_TOO_LARGE, unknown_sqlstate); goto end; } + if (net->last_errno == ER_NET_ERROR_ON_WRITE && command == COM_BINLOG_DUMP) + goto end; end_server(mysql); if (mysql_reconnect(mysql) || stmt_skip) goto end; diff --git a/sql/net_serv.cc b/sql/net_serv.cc index f39eaaadf46..dc24360851e 100644 --- a/sql/net_serv.cc +++ b/sql/net_serv.cc @@ -45,6 +45,7 @@ #include #include #include "probes_mysql.h" +#include #ifdef EMBEDDED_LIBRARY #undef MYSQL_SERVER @@ -486,6 +487,17 @@ net_write_command(NET *net,uchar command, DBUG_ENTER("net_write_command"); DBUG_PRINT("enter",("length: %lu", (ulong) len)); + DBUG_EXECUTE_IF("simulate_error_on_packet_write", + { + if (command == COM_BINLOG_DUMP) + { + net->last_errno = ER_NET_ERROR_ON_WRITE; + DBUG_ASSERT(!debug_sync_set_action( + (THD *)net->thd, + STRING_WITH_LEN("now SIGNAL parked WAIT_FOR continue"))); + DBUG_RETURN(true); + } + };); MYSQL_NET_WRITE_START(length); buff[4]=command; /* For first packet */ diff --git a/sql/slave.cc b/sql/slave.cc index 1bf83aa9652..87eacfcfd0a 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -3297,7 +3297,8 @@ static int request_dump(THD *thd, MYSQL* mysql, Master_info* mi, in the future, we should do a better error analysis, but for now we just fill up the error log :-) */ - if (mysql_errno(mysql) == ER_NET_READ_INTERRUPTED) + if (mysql_errno(mysql) == ER_NET_READ_INTERRUPTED || + mysql_errno(mysql) == ER_NET_ERROR_ON_WRITE) *suppress_warnings= TRUE; // Suppress reconnect warning else sql_print_error("Error on COM_BINLOG_DUMP: %d %s, will retry in %d secs", From 0ec641ea1ef1ef23183d8c1b4e6d9e4a9810eba2 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Tue, 21 Jul 2020 14:56:47 +0200 Subject: [PATCH 092/188] MDEV-22134: handle_fatal_signal (sig=11) in __strlen_avx2 on START SLAVE | Assertion `global_system_variables.session_track_system_variables' failed in Session_sysvars_tracker::init | *** buffer overflow detected *** (on optimized builds) Prohibit assigning NULL as for other system variables. --- mysql-test/main/mysqltest_tracking_info.result | 12 ++++++++++++ mysql-test/main/mysqltest_tracking_info.test | 15 +++++++++++++++ .../r/session_track_system_variables_basic.result | 10 ++-------- .../t/session_track_system_variables_basic.test | 7 ++----- sql/session_tracker.cc | 8 +++++++- 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/mysql-test/main/mysqltest_tracking_info.result b/mysql-test/main/mysqltest_tracking_info.result index bbbb2be9e01..7947a86d386 100644 --- a/mysql-test/main/mysqltest_tracking_info.result +++ b/mysql-test/main/mysqltest_tracking_info.result @@ -45,3 +45,15 @@ Warning 1681 'engine_condition_pushdown=on' is deprecated and will be removed in set @@optimizer_switch=@save_optimizer_switch; SET @@session.session_track_system_variables= @save_session_track_system_variables; # End of 10.2 tests +# +# MDEV-22134 handle_fatal_signal (sig=11) in __strlen_avx2 on START +# SLAVE | Assertion +# `global_system_variables.session_track_system_variables' failed in +# Session_sysvars_tracker::init | *** buffer overflow detected *** +# (on optimized builds) +# +SET @@GLOBAL.session_track_system_variables=NULL; +ERROR 42000: Variable 'session_track_system_variables' can't be set to the value of 'NULL' +SET SESSION session_track_system_variables=NULL; +ERROR 42000: Variable 'session_track_system_variables' can't be set to the value of 'NULL' +# End of 10.3 tests diff --git a/mysql-test/main/mysqltest_tracking_info.test b/mysql-test/main/mysqltest_tracking_info.test index dc51167137a..ae52571b2b9 100644 --- a/mysql-test/main/mysqltest_tracking_info.test +++ b/mysql-test/main/mysqltest_tracking_info.test @@ -45,3 +45,18 @@ set @@optimizer_switch=@save_optimizer_switch; SET @@session.session_track_system_variables= @save_session_track_system_variables; --echo # End of 10.2 tests + +--echo # +--echo # MDEV-22134 handle_fatal_signal (sig=11) in __strlen_avx2 on START +--echo # SLAVE | Assertion +--echo # `global_system_variables.session_track_system_variables' failed in +--echo # Session_sysvars_tracker::init | *** buffer overflow detected *** +--echo # (on optimized builds) +--echo # + +--error ER_WRONG_VALUE_FOR_VAR +SET @@GLOBAL.session_track_system_variables=NULL; +--error ER_WRONG_VALUE_FOR_VAR +SET SESSION session_track_system_variables=NULL; + +--echo # End of 10.3 tests diff --git a/mysql-test/suite/sys_vars/r/session_track_system_variables_basic.result b/mysql-test/suite/sys_vars/r/session_track_system_variables_basic.result index 78ca8ca4ad1..90d2fec3d0a 100644 --- a/mysql-test/suite/sys_vars/r/session_track_system_variables_basic.result +++ b/mysql-test/suite/sys_vars/r/session_track_system_variables_basic.result @@ -110,15 +110,9 @@ autocommit,character_set_client,character_set_connection,character_set_results,t connection default; # Testing NULL SET @@global.session_track_system_variables = NULL; +ERROR 42000: Variable 'session_track_system_variables' can't be set to the value of 'NULL' SET @@session.session_track_system_variables = NULL; -# Global - expect "" instead of NULL -SELECT @@global.session_track_system_variables; -@@global.session_track_system_variables -NULL -# Session - expect "" instead of NULL -SELECT @@session.session_track_system_variables; -@@session.session_track_system_variables - +ERROR 42000: Variable 'session_track_system_variables' can't be set to the value of 'NULL' # testing with duplicate entries. SET @@global.session_track_system_variables= "time_zone"; SET @@session.session_track_system_variables= "time_zone"; diff --git a/mysql-test/suite/sys_vars/t/session_track_system_variables_basic.test b/mysql-test/suite/sys_vars/t/session_track_system_variables_basic.test index 90e6052947c..2cb51e3e968 100644 --- a/mysql-test/suite/sys_vars/t/session_track_system_variables_basic.test +++ b/mysql-test/suite/sys_vars/t/session_track_system_variables_basic.test @@ -85,14 +85,11 @@ SELECT @@session.session_track_system_variables; connection default; --echo # Testing NULL +--error ER_WRONG_VALUE_FOR_VAR SET @@global.session_track_system_variables = NULL; +--error ER_WRONG_VALUE_FOR_VAR SET @@session.session_track_system_variables = NULL; ---echo # Global - expect "" instead of NULL -SELECT @@global.session_track_system_variables; ---echo # Session - expect "" instead of NULL -SELECT @@session.session_track_system_variables; - --echo # testing with duplicate entries. # Lets first set it to some valid value. SET @@global.session_track_system_variables= "time_zone"; diff --git a/sql/session_tracker.cc b/sql/session_tracker.cc index 7133e45ab11..35cd55394a9 100644 --- a/sql/session_tracker.cc +++ b/sql/session_tracker.cc @@ -189,7 +189,13 @@ bool sysvartrack_validate_value(THD *thd, const char *str, size_t len) char *token, *lasts= NULL; size_t rest= var_list.length; - if (!var_list.str || var_list.length == 0 || + if (!var_list.str) + { + my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), + "session_track_system_variables", "NULL"); + return false; + } + if (var_list.length == 0 || !strcmp(var_list.str, "*")) { return false; From f7adc4a11d36d7a75ba82d658121cb263f5b78c7 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Wed, 22 Jul 2020 10:30:00 +0200 Subject: [PATCH 093/188] A bit more safety --- sql/sys_vars.ic | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/sql/sys_vars.ic b/sql/sys_vars.ic index ec8d9ef201a..860502c40e3 100644 --- a/sql/sys_vars.ic +++ b/sql/sys_vars.ic @@ -501,7 +501,10 @@ public: String str2(buff2, sizeof(buff2), charset), *res; if (!(res=var->value->val_str(&str))) + { var->save_result.string_value.str= 0; + var->save_result.string_value.length= 0; // safety + } else { uint32 unused; @@ -895,9 +898,16 @@ public: String str(buff, sizeof(buff), system_charset_info), *res; if (!(res=var->value->val_str(&str))) + { var->save_result.string_value.str= const_cast(""); + var->save_result.string_value.length= 0; + } else - var->save_result.string_value.str= thd->strmake(res->ptr(), res->length()); + { + size_t len= res->length(); + var->save_result.string_value.str= thd->strmake(res->ptr(), len); + var->save_result.string_value.length= len; + } return false; } bool session_update(THD *thd, set_var *var) @@ -921,6 +931,7 @@ public: { char *ptr= (char*)(intptr)option.def_value; var->save_result.string_value.str= ptr; + var->save_result.string_value.length= safe_strlen(ptr); } uchar *session_value_ptr(THD *thd, const LEX_CSTRING *base) { From c89e927a5675bd1e84a9c5dd02f5d649e829453e Mon Sep 17 00:00:00 2001 From: Monty Date: Thu, 16 Jul 2020 12:23:37 +0300 Subject: [PATCH 094/188] Clean up Item_uint() & Item_int() - Removed val_str() and print() as these are handled by Item_int() - Use local StringBuffer for Item_int::print() to avoid mallocs --- include/my_global.h | 2 ++ sql/item.cc | 20 +++----------------- sql/item.h | 2 -- 3 files changed, 5 insertions(+), 19 deletions(-) diff --git a/include/my_global.h b/include/my_global.h index 5d80b3881d4..86ef5f882f6 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -796,6 +796,8 @@ inline unsigned long long my_double2ulonglong(double d) #define LONGLONG_MIN ((long long) 0x8000000000000000LL) #define LONGLONG_MAX ((long long) 0x7FFFFFFFFFFFFFFFLL) #endif +/* Max length needed for a buffer to hold a longlong or ulonglong + end \0 */ +#define LONGLONG_BUFFER_SIZE 21 #if defined(HAVE_LONG_LONG) && !defined(ULONGLONG_MAX) /* First check for ANSI C99 definition: */ diff --git a/sql/item.cc b/sql/item.cc index 6f34c93e21c..ca23fddff34 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -3626,9 +3626,10 @@ String *Item_int::val_str(String *str) void Item_int::print(String *str, enum_query_type query_type) { + StringBuffer buf; // my_charset_bin is good enough for numbers - str_value.set_int(value, unsigned_flag, &my_charset_bin); - str->append(str_value); + buf.set_int(value, unsigned_flag, &my_charset_bin); + str->append(buf); } @@ -3654,21 +3655,6 @@ Item_uint::Item_uint(THD *thd, const char *str_arg, longlong i, uint length): } -String *Item_uint::val_str(String *str) -{ - str->set((ulonglong) value, collation.collation); - return str; -} - - -void Item_uint::print(String *str, enum_query_type query_type) -{ - // latin1 is good enough for numbers - str_value.set((ulonglong) value, default_charset()); - str->append(str_value); -} - - Item_decimal::Item_decimal(THD *thd, const char *str_arg, size_t length, CHARSET_INFO *charset): Item_num(thd) diff --git a/sql/item.h b/sql/item.h index 20dc1474bf9..71d7549f72f 100644 --- a/sql/item.h +++ b/sql/item.h @@ -4238,9 +4238,7 @@ public: Item_uint(THD *thd, ulonglong i): Item_int(thd, i, 10) {} Item_uint(THD *thd, const char *str_arg, longlong i, uint length); double val_real() { return ulonglong2double((ulonglong)value); } - String *val_str(String*); Item *clone_item(THD *thd); - virtual void print(String *str, enum_query_type query_type); Item *neg(THD *thd); uint decimal_precision() const { return max_length; } Item *get_copy(THD *thd) From 26824581281fcb2b2251585d8081de38d561ca93 Mon Sep 17 00:00:00 2001 From: Monty Date: Thu, 16 Jul 2020 12:45:30 +0300 Subject: [PATCH 095/188] Use larger buffer when reading binary and relay logs - Should speed up replication --- sql/log.cc | 4 +++- sql/log.h | 6 ++++++ sql/rpl_rli.cc | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/sql/log.cc b/sql/log.cc index 5f4fd6bbcab..0bfe7d7ee8b 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -2828,7 +2828,9 @@ bool MYSQL_LOG::open( else if ((seek_offset= mysql_file_tell(file, MYF(MY_WME)))) goto err; - if (init_io_cache(&log_file, file, IO_SIZE, io_cache_type, seek_offset, 0, + if (init_io_cache(&log_file, file, (log_type == LOG_NORMAL ? IO_SIZE : + LOG_BIN_IO_SIZE), + io_cache_type, seek_offset, 0, MYF(MY_WME | MY_NABP | ((log_type == LOG_BIN) ? MY_WAIT_IF_FULL : 0)))) goto err; diff --git a/sql/log.h b/sql/log.h index 063513fe908..58e681985eb 100644 --- a/sql/log.h +++ b/sql/log.h @@ -294,6 +294,12 @@ class Rows_log_event; enum enum_log_type { LOG_UNKNOWN, LOG_NORMAL, LOG_BIN }; enum enum_log_state { LOG_OPENED, LOG_CLOSED, LOG_TO_BE_OPENED }; +/* + Use larger buffers when reading from and to binary log + We make it one step smaller than 64K to account for malloc overhead. +*/ +#define LOG_BIN_IO_SIZE MY_ALIGN_DOWN(65536-1, IO_SIZE) + /* TODO use mmap instead of IO_CACHE for binlog (mmap+fsync is two times faster than write+fsync) diff --git a/sql/rpl_rli.cc b/sql/rpl_rli.cc index 11eccefdde9..941616a26d5 100644 --- a/sql/rpl_rli.cc +++ b/sql/rpl_rli.cc @@ -268,7 +268,7 @@ a file name for --relay-log-index option", opt_relaylog_index_name); msg= current_thd->get_stmt_da()->message(); goto err; } - if (init_io_cache(&info_file, info_fd, IO_SIZE*2, READ_CACHE, 0L,0, + if (init_io_cache(&info_file, info_fd, LOG_BIN_IO_SIZE, READ_CACHE, 0L,0, MYF(MY_WME))) { sql_print_error("Failed to create a cache on relay log info file '%s'", @@ -303,7 +303,7 @@ Failed to open the existing relay log info file '%s' (errno %d)", error= 1; } else if (init_io_cache(&info_file, info_fd, - IO_SIZE*2, READ_CACHE, 0L, 0, MYF(MY_WME))) + LOG_BIN_IO_SIZE, READ_CACHE, 0L, 0, MYF(MY_WME))) { sql_print_error("Failed to create a cache on relay log info file '%s'", fname); From 61c15ebe323d4d6f02fab86c405b2613e5784961 Mon Sep 17 00:00:00 2001 From: Monty Date: Thu, 16 Jul 2020 16:30:06 +0300 Subject: [PATCH 096/188] Remove String::lex_string() and String::lex_cstring() - Better to use 'String *' directly. - Added String::get_value(LEX_STRING*) for the few cases where we want to convert a String to LEX_CSTRING. Other things: - Use StringBuffer for some functions to avoid mallocs --- sql/field.cc | 9 ++++----- sql/filesort.cc | 16 +++++++--------- sql/item.cc | 9 +++++---- sql/item.h | 6 +++++- sql/item_strfunc.cc | 4 ++-- sql/item_timefunc.cc | 7 ++++--- sql/protocol.cc | 5 +++-- sql/protocol.h | 19 +++++++++++++------ sql/sp.cc | 6 +++--- sql/sql_class.h | 3 +-- sql/sql_show.cc | 6 +++--- sql/sql_string.h | 24 +++++++++--------------- sql/sql_type.cc | 4 ++-- sql/sql_yacc.yy | 4 +++- sql/unireg.cc | 19 +++++++++++++------ sql/wsrep_mysqld.cc | 2 +- sql/wsrep_schema.cc | 11 +++++------ storage/spider/spd_malloc.cc | 3 ++- 18 files changed, 85 insertions(+), 72 deletions(-) diff --git a/sql/field.cc b/sql/field.cc index a067baee460..c5d72abc526 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -1078,17 +1078,16 @@ Field_longstr::make_packed_sort_key_part(uchar *buff, *buff++=1; } uchar *end= pack_sort_string(buff, sort_field); - return static_cast(end-buff); + return (uint) (end-buff); } uchar* Field_longstr::pack_sort_string(uchar *to, const SORT_FIELD_ATTR *sort_field) { - String buf; + StringBuffer buf; val_str(&buf, &buf); - return to + sort_field->pack_sort_string(to, buf.lex_cstring(), - field_charset()); + return to + sort_field->pack_sort_string(to, &buf); } @@ -2106,7 +2105,7 @@ void Field::make_send_field(Send_field *field) field->org_table_name= field->db_name= empty_clex_str; if (orig_table && orig_table->alias.ptr()) { - field->table_name= orig_table->alias.lex_cstring(); + orig_table->alias.get_value(&field->table_name); field->org_col_name= field_name; } else diff --git a/sql/filesort.cc b/sql/filesort.cc index 7a3f16e0ee4..3f99bebd0cc 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -2546,7 +2546,6 @@ Type_handler_string_result::make_packed_sort_key_part(uchar *to, Item *item, const SORT_FIELD_ATTR *sort_field, Sort_param *param) const { - CHARSET_INFO *cs= item->collation.collation; bool maybe_null= item->maybe_null; if (maybe_null) @@ -2576,7 +2575,7 @@ Type_handler_string_result::make_packed_sort_key_part(uchar *to, Item *item, return sort_field->original_length; } } - return sort_field->pack_sort_string(to, res->lex_cstring(), cs); + return sort_field->pack_sort_string(to, res); } @@ -2932,13 +2931,12 @@ int compare_packed_sort_keys(void *sort_param, */ uint -SORT_FIELD_ATTR::pack_sort_string(uchar *to, const LEX_CSTRING &str, - CHARSET_INFO *cs) const +SORT_FIELD_ATTR::pack_sort_string(uchar *to, String *str) const { uchar *orig_to= to; uint32 length, data_length; - DBUG_ASSERT(str.length <= UINT32_MAX); - length= (uint32)str.length; + DBUG_ASSERT(str->length() <= UINT32_MAX); + length= (uint32) str->length(); if (length + suffix_length <= original_length) data_length= length; @@ -2949,13 +2947,13 @@ SORT_FIELD_ATTR::pack_sort_string(uchar *to, const LEX_CSTRING &str, store_key_part_length(data_length + suffix_length, to, length_bytes); to+= length_bytes; // copying data length bytes to the buffer - memcpy(to, (uchar*)str.str, data_length); + memcpy(to, (uchar*)str->ptr(), data_length); to+= data_length; - if (cs == &my_charset_bin && suffix_length) + if (str->charset() == &my_charset_bin && suffix_length) { // suffix length stored in bigendian form - store_bigendian(str.length, to, suffix_length); + store_bigendian(length, to, suffix_length); to+= suffix_length; } return static_cast(to - orig_to); diff --git a/sql/item.cc b/sql/item.cc index ca23fddff34..5c662e5e6ff 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1394,7 +1394,7 @@ bool Item::get_date_from_real(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate bool Item::get_date_from_string(THD *thd, MYSQL_TIME *to, date_mode_t mode) { - StringBuffer<40> tmp; + StringBuffer tmp; Temporal::Warn_push warn(thd, field_table_or_null(), field_name_or_null(), to, mode); Temporal_hybrid *t= new(to) Temporal_hybrid(thd, &warn, val_str(&tmp), mode); @@ -2076,7 +2076,7 @@ Item_name_const::Item_name_const(THD *thd, Item *name_arg, Item *val): Item::maybe_null= TRUE; if (name_item->basic_const_item() && (name_str= name_item->val_str(&name_buffer))) // Can't have a NULL name - set_name(thd, name_str->lex_cstring(), name_str->charset()); + set_name(thd, name_str); } @@ -6674,8 +6674,9 @@ int Item_string::save_in_field(Field *field, bool no_conversions) Item *Item_string::clone_item(THD *thd) { - return new (thd->mem_root) - Item_string(thd, name, str_value.lex_cstring(), collation.collation); + LEX_CSTRING val; + str_value.get_value(&val); + return new (thd->mem_root) Item_string(thd, name, val, collation.collation); } diff --git a/sql/item.h b/sql/item.h index 71d7549f72f..150d9cd215e 100644 --- a/sql/item.h +++ b/sql/item.h @@ -962,6 +962,10 @@ public: #endif } /*lint -e1509 */ void set_name(THD *thd, const char *str, size_t length, CHARSET_INFO *cs); + void set_name(THD *thd, String *str) + { + set_name(thd, str->ptr(), str->length(), str->charset()); + } void set_name(THD *thd, const LEX_CSTRING &str, CHARSET_INFO *cs= system_charset_info) { @@ -4377,7 +4381,7 @@ protected: const Metadata metadata) { fix_from_value(dv, metadata); - set_name(thd, str_value.lex_cstring(), str_value.charset()); + set_name(thd, &str_value); } protected: /* Just create an item and do not fill string representation */ diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index bcc041ae9c6..7f853a73c71 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1391,8 +1391,8 @@ String *Item_func_regexp_replace::val_str(String *str) !(replace= re.convert_if_needed(replace, &re.replace_converter))) goto err; - src= source->lex_cstring(); - rpl= replace->lex_cstring(); + source->get_value(&src); + replace->get_value(&rpl); str->length(0); str->set_charset(collation.collation); diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 3425b293193..53fc7efac06 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -473,7 +473,7 @@ err: Create a formated date/time value in a string. */ -static bool make_date_time(const LEX_CSTRING &format, MYSQL_TIME *l_time, +static bool make_date_time(String *format, MYSQL_TIME *l_time, timestamp_type type, const MY_LOCALE *locale, String *str) { @@ -488,7 +488,7 @@ static bool make_date_time(const LEX_CSTRING &format, MYSQL_TIME *l_time, if (l_time->neg) str->append('-'); - end= (ptr= format.str) + format.length; + end= (ptr= format->ptr()) + format->length(); for (; ptr != end ; ptr++) { if (*ptr != '%' || ptr+1 == end) @@ -1877,6 +1877,7 @@ String *Item_func_date_format::val_str(String *str) DBUG_ASSERT(fixed == 1); date_conv_mode_t mode= is_time_format ? TIME_TIME_ONLY : TIME_CONV_NONE; THD *thd= current_thd; + if ((null_value= args[0]->get_date(thd, &l_time, Temporal::Options(mode, thd)))) return 0; @@ -1901,7 +1902,7 @@ String *Item_func_date_format::val_str(String *str) /* Create the result string */ str->set_charset(collation.collation); - if (!make_date_time(format->lex_cstring(), &l_time, + if (!make_date_time(format, &l_time, is_time_format ? MYSQL_TIMESTAMP_TIME : MYSQL_TIMESTAMP_DATE, lc, str)) diff --git a/sql/protocol.cc b/sql/protocol.cc index a97e0d0997d..55373bcd2b5 100644 --- a/sql/protocol.cc +++ b/sql/protocol.cc @@ -864,12 +864,13 @@ bool Protocol_text::store_field_metadata(const THD * thd, { Send_field_packed_extended_metadata metadata; metadata.pack(field); + /* Don't apply character set conversion: extended metadata is a binary encoded data. */ - if (store_lex_cstring(metadata.lex_cstring(), cs, - MY_REPERTOIRE_UNICODE30, &my_charset_bin)) + if (store_binary_string(&metadata, cs, + MY_REPERTOIRE_UNICODE30)) return true; } if (packet->realloc(packet->length() + 12)) diff --git a/sql/protocol.h b/sql/protocol.h index 08f416fc9bf..18a01255708 100644 --- a/sql/protocol.h +++ b/sql/protocol.h @@ -149,18 +149,25 @@ public: // Various useful wrappers for the virtual store*() methods. // Backward wrapper for store_str() - bool store(const char *from, size_t length, CHARSET_INFO *cs, - my_repertoire_t repertoire= MY_REPERTOIRE_UNICODE30) + inline bool store(const char *from, size_t length, CHARSET_INFO *cs, + my_repertoire_t repertoire= MY_REPERTOIRE_UNICODE30) { return store_str(from, length, cs, repertoire, character_set_results()); } - bool store_lex_cstring(const LEX_CSTRING &s, - CHARSET_INFO *fromcs, - my_repertoire_t from_repertoire, - CHARSET_INFO *tocs) + inline bool store_lex_cstring(const LEX_CSTRING &s, + CHARSET_INFO *fromcs, + my_repertoire_t from_repertoire, + CHARSET_INFO *tocs) { return store_str(s.str, (uint) s.length, fromcs, from_repertoire, tocs); } + inline bool store_binary_string(Binary_string *str, + CHARSET_INFO *fromcs, + my_repertoire_t from_repertoire) + { + return store_str(str->ptr(), (uint) str->length(), fromcs, from_repertoire, + &my_charset_bin); + } bool store_ident(const LEX_CSTRING &s, my_repertoire_t repertoire= MY_REPERTOIRE_UNICODE30) { diff --git a/sql/sp.cc b/sql/sp.cc index 187e4b52394..3737bd11740 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -1286,7 +1286,7 @@ Sp_handler::sp_create_routine(THD *thd, const sp_head *sp) const if (type() == SP_TYPE_FUNCTION) { sp_returns_type(thd, retstr, sp); - returns= retstr.lex_cstring(); + retstr.get_value(&returns); } goto log; } @@ -1369,7 +1369,7 @@ Sp_handler::sp_create_routine(THD *thd, const sp_head *sp) const if (type() == SP_TYPE_FUNCTION) { sp_returns_type(thd, retstr, sp); - returns= retstr.lex_cstring(); + retstr.get_value(&returns); store_failed= store_failed || table->field[MYSQL_PROC_FIELD_RETURNS]-> @@ -2061,7 +2061,7 @@ Sp_handler::sp_clone_and_link_routine(THD *thd, if (type() == SP_TYPE_FUNCTION) { sp_returns_type(thd, retstr, sp); - returns= retstr.lex_cstring(); + retstr.get_value(&returns); } if (sp->m_parent) diff --git a/sql/sql_class.h b/sql/sql_class.h index 2e388ef7d72..36f98ce1a66 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -6447,8 +6447,7 @@ struct SORT_FIELD_ATTR */ bool maybe_null; CHARSET_INFO *cs; - uint pack_sort_string(uchar *to, const LEX_CSTRING &str, - CHARSET_INFO *cs) const; + uint pack_sort_string(uchar *to, String *str) const; int compare_packed_fixed_size_vals(uchar *a, size_t *a_len, uchar *b, size_t *b_len); int compare_packed_varstrings(uchar *a, size_t *a_len, diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 64076197cf8..f72aa23a381 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -8215,7 +8215,7 @@ int make_schemata_old_format(THD *thd, ST_SCHEMA_TABLE *schema_table) buffer.append(lex->wild->ptr()); buffer.append(')'); } - field->set_name(thd, buffer.lex_cstring()); + field->set_name(thd, &buffer); } return 0; } @@ -8224,7 +8224,7 @@ int make_schemata_old_format(THD *thd, ST_SCHEMA_TABLE *schema_table) int make_table_names_old_format(THD *thd, ST_SCHEMA_TABLE *schema_table) { char tmp[128]; - String buffer(tmp,sizeof(tmp), thd->charset()); + String buffer(tmp, sizeof(tmp), system_charset_info); LEX *lex= thd->lex; Name_resolution_context *context= &lex->first_select_lex()->context; ST_FIELD_INFO *field_info= &schema_table->fields_info[2]; @@ -8242,7 +8242,7 @@ int make_table_names_old_format(THD *thd, ST_SCHEMA_TABLE *schema_table) Item_field *field= new (thd->mem_root) Item_field(thd, context, field_name); if (add_item_to_list(thd, field)) return 1; - field->set_name(thd, buffer.lex_cstring()); + field->set_name(thd, &buffer); if (thd->lex->verbose) { field_info= &schema_table->fields_info[3]; diff --git a/sql/sql_string.h b/sql/sql_string.h index 2d38f6d5d13..274b1d9a5df 100644 --- a/sql/sql_string.h +++ b/sql/sql_string.h @@ -222,18 +222,6 @@ public: inline bool is_empty() const { return (str_length == 0); } inline const char *ptr() const { return Ptr; } inline const char *end() const { return Ptr + str_length; } - - LEX_STRING lex_string() const - { - LEX_STRING str = { (char*) ptr(), length() }; - return str; - } - LEX_CSTRING lex_cstring() const - { - LEX_CSTRING skr = { ptr(), length() }; - return skr; - } - bool has_8bit_bytes() const { for (const char *c= ptr(), *c_end= end(); c < c_end; c++) @@ -488,6 +476,12 @@ public: if (str.Alloced_length) Alloced_length= (uint32) (str.Alloced_length - offset); } + inline LEX_CSTRING *get_value(LEX_CSTRING *res) + { + res->str= Ptr; + res->length= str_length; + return res; + } /* Take over handling of buffer from some other object */ void reset(char *ptr_arg, size_t length_arg, size_t alloced_length_arg) @@ -888,13 +882,13 @@ public: { return Binary_string::append_hex((const char*)src, srclen); } - bool append_introducer_and_hex(CHARSET_INFO *cs, const LEX_CSTRING &str) + bool append_introducer_and_hex(String *str) { return append(STRING_WITH_LEN("_")) || - append(cs->csname) || + append(str->charset()->csname) || append(STRING_WITH_LEN(" 0x")) || - append_hex(str.str, (uint32) str.length); + append_hex(str->ptr(), (uint32) str->length()); } bool append(IO_CACHE* file, uint32 arg_length) { diff --git a/sql/sql_type.cc b/sql/sql_type.cc index aee9b4c165c..7345b1fb529 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -8981,8 +8981,8 @@ bool Type_handler::partition_field_append_value( uint cnverr2= 0; buf2.copy(res->ptr(), res->length(), res->charset(), field_cs, &cnverr2); if (!cnverr2) - return str->append_introducer_and_hex(buf2.charset(), buf2.lex_cstring()); - return str->append_introducer_and_hex(res->charset(), res->lex_cstring()); + return str->append_introducer_and_hex(&buf2); + return str->append_introducer_and_hex(res); } StringBuffer<64> val(system_charset_info); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index d8ad3aef7c3..b42d68c26e1 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -14698,13 +14698,15 @@ literal: | UNDERSCORE_CHARSET hex_or_bin_String { Item_string_with_introducer *item_str; + LEX_CSTRING tmp; + $2->get_value(&tmp); /* Pass NULL as name. Name will be set in the "select_item" rule and will include the introducer and the original hex/bin notation. */ item_str= new (thd->mem_root) Item_string_with_introducer(thd, null_clex_str, - $2->lex_cstring(), $1); + tmp, $1); if (unlikely(!item_str || !item_str->check_well_formed_result(true))) MYSQL_YYABORT; diff --git a/sql/unireg.cc b/sql/unireg.cc index 525e7a8a56a..ae860f0143b 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -86,6 +86,13 @@ static uchar* extra2_write_str(uchar *pos, const LEX_CSTRING &str) return pos + str.length; } +static uchar* extra2_write_str(uchar *pos, Binary_string *str) +{ + pos= extra2_write_len(pos, str->length()); + memcpy(pos, str->ptr(), str->length()); + return pos + str->length(); +} + static uchar *extra2_write(uchar *pos, enum extra2_frm_value_type type, const LEX_CSTRING &str) { @@ -178,11 +185,11 @@ class Field_data_type_info_image: public BinaryStringBuffer<512> { return net_store_length(pos, length); } - static uchar *store_string(uchar *pos, const LEX_CSTRING &str) + static uchar *store_string(uchar *pos, Binary_string *str) { - pos= store_length(pos, str.length); - memcpy(pos, str.str, str.length); - return pos + str.length; + pos= store_length(pos, str->length()); + memcpy(pos, str->ptr(), str->length()); + return pos + str->length(); } static uint store_length_required_length(ulonglong length) { @@ -206,7 +213,7 @@ public: return true; // Error uchar *pos= (uchar *) end(); pos= store_length(pos, fieldnr); - pos= store_string(pos, type_info.lex_cstring()); + pos= store_string(pos, &type_info); size_t new_length= (const char *) pos - ptr(); DBUG_ASSERT(new_length < alloced_length()); length((uint32) new_length); @@ -471,7 +478,7 @@ LEX_CUSTRING build_frm_image(THD *thd, const LEX_CSTRING &table, goto err; } *pos= EXTRA2_FIELD_DATA_TYPE_INFO; - pos= extra2_write_str(pos + 1, field_data_type_info_image.lex_cstring()); + pos= extra2_write_str(pos + 1, &field_data_type_info_image); } // PERIOD diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 0c31631d19b..9a2d5e635a5 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1968,7 +1968,7 @@ static int wsrep_create_sp(THD *thd, uchar** buf, size_t* buf_len) if (sp->m_handler->type() == SP_TYPE_FUNCTION) { sp_returns_type(thd, retstr, sp); - returns= retstr.lex_cstring(); + retstr.get_value(&returns); } if (sp->m_handler-> show_create_sp(thd, &log_query, diff --git a/sql/wsrep_schema.cc b/sql/wsrep_schema.cc index 80bc53b1790..7a3519d51f3 100644 --- a/sql/wsrep_schema.cc +++ b/sql/wsrep_schema.cc @@ -492,12 +492,11 @@ static int scan(TABLE* table, uint field, INTTYPE& val) static int scan(TABLE* table, uint field, char* strbuf, uint strbuf_len) { - String str; - (void)table->field[field]->val_str(&str); - LEX_CSTRING tmp= str.lex_cstring(); - uint len = tmp.length; - strncpy(strbuf, tmp.str, std::min(len, strbuf_len)); - strbuf[strbuf_len - 1]= '\0'; + uint len; + StringBuffer str; + (void) table->field[field]->val_str(&str); + len= str.length(); + strmake(strbuf, str.ptr(), MY_MIN(len, strbuf_len-1)); return 0; } diff --git a/storage/spider/spd_malloc.cc b/storage/spider/spd_malloc.cc index 9f4203ae33d..a9438f2ac58 100644 --- a/storage/spider/spd_malloc.cc +++ b/storage/spider/spd_malloc.cc @@ -476,9 +476,10 @@ char *spider_string::c_ptr_safe() LEX_STRING spider_string::lex_string() const { + LEX_STRING res= { (char*) str.ptr(), str.length() }; DBUG_ENTER("spider_string::lex_string"); DBUG_PRINT("info",("spider this=%p", this)); - DBUG_RETURN(str.lex_string()); + DBUG_RETURN(res); } void spider_string::set( From 747479aba26dd5502565ec0ccf4c2f58dd70ee05 Mon Sep 17 00:00:00 2001 From: Monty Date: Fri, 17 Jul 2020 17:56:17 +0300 Subject: [PATCH 097/188] Fixed removed warning from valgrind in Protocol::store_str The problem was that field_count is not initialized for the Protocol variable used when printing metadata. --- sql/protocol.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sql/protocol.cc b/sql/protocol.cc index 55373bcd2b5..5c287cff9e9 100644 --- a/sql/protocol.cc +++ b/sql/protocol.cc @@ -774,6 +774,7 @@ void Protocol::init(THD *thd_arg) convert= &thd->convert_buffer; #ifndef DBUG_OFF field_handlers= 0; + field_pos= 0; #endif } @@ -1217,8 +1218,8 @@ bool Protocol_text::store_str(const char *from, size_t length, CHARSET_INFO *tocs) { #ifndef DBUG_OFF - DBUG_PRINT("info", ("Protocol_text::store field %u (%u): %.*b", field_pos, - field_count, (int) length, (length == 0 ? "" : from))); + DBUG_PRINT("info", ("Protocol_text::store field %u : %.*b", field_pos, + (int) length, (length == 0 ? "" : from))); DBUG_ASSERT(field_handlers == 0 || field_pos < field_count); DBUG_ASSERT(valid_handler(field_pos, PROTOCOL_SEND_STRING)); field_pos++; From d55f8a249eb9f2687a74f95f04ffd125998358da Mon Sep 17 00:00:00 2001 From: Monty Date: Mon, 20 Jul 2020 14:15:25 +0300 Subject: [PATCH 098/188] Disable maria.max_length when using valgrind (too slow) --- mysql-test/suite/maria/max_length.test | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mysql-test/suite/maria/max_length.test b/mysql-test/suite/maria/max_length.test index 4ebe48b4979..a5bfb0b8fd6 100644 --- a/mysql-test/suite/maria/max_length.test +++ b/mysql-test/suite/maria/max_length.test @@ -4,6 +4,8 @@ --source include/have_maria.inc --source include/have_sequence.inc --source include/big_test.inc +# This test is too slow for valgrind +--source include/not_valgrind.inc drop table if exists t1,t2; From 46ffd47f422147cd748119eba19ad248bd7356db Mon Sep 17 00:00:00 2001 From: Monty Date: Mon, 20 Jul 2020 19:26:58 +0300 Subject: [PATCH 099/188] Fixed wrong free in comp_err --- extra/comp_err.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/extra/comp_err.c b/extra/comp_err.c index 6fe26c4e4be..5e1e042f6ed 100644 --- a/extra/comp_err.c +++ b/extra/comp_err.c @@ -66,6 +66,7 @@ const char *empty_string= ""; /* For empty states */ */ const char *default_language= "eng"; +my_bool default_language_changed= 0; uint er_offset= 1000; my_bool info_flag= 0; @@ -440,7 +441,8 @@ static void clean_up(struct languages *lang_head, struct errors *error_head) struct errors *tmp_error, *next_error; uint count, i; - my_free((void*) default_language); + if (default_language_changed) + my_free((void*) default_language); for (tmp_lang= lang_head; tmp_lang; tmp_lang= next_language) { @@ -562,6 +564,7 @@ static uint parse_input_file(const char *file_name, struct errors **top_error, "Failed to parse the default language line. Aborting\n"); DBUG_RETURN(0); } + default_language_changed= 1; continue; } From dbcd3384e0799ee99a966edaff2c0f135ef51a29 Mon Sep 17 00:00:00 2001 From: Monty Date: Mon, 20 Jul 2020 19:26:31 +0300 Subject: [PATCH 100/188] MDEV-7947 strcmp() takes 0.37% in OLTP RO This patch ensures that all identical character sets shares the same cs->csname. This allows us to replace strcmp() in my_charset_same() with comparisons of pointers. This fixes a long standing performance issue that could cause as strcmp() for every item sent trough the protocol class to the end user. One consequence of this patch is that we don't allow one to add a character definition in the Index.xml file that changes the csname of an existing character set. This is by design as changing character set names of existing ones is extremely dangerous, especially as some storage engines just records character set numbers. As we now have a hash over character set's csname, we can in the future use that for faster access to a specific character set. This could be done by changing the hash to non unique and use the hash to find the next character set with same csname. --- include/my_sys.h | 6 +- include/mysys_err.h | 3 +- mysql-test/main/ctype_ldml.result | 12 +- mysql-test/main/ctype_ldml.test | 13 + mysql-test/std_data/ldml/Index.xml | 9 +- .../suite/innodb/r/innodb_ctype_ldml.result | 5 +- .../suite/innodb/t/innodb_ctype_ldml.test | 1 + mysys/charset-def.c | 2 +- mysys/charset.c | 100 +++++- mysys/errors.c | 4 +- mysys/my_static.c | 1 + mysys/mysys_priv.h | 1 + strings/ctype-big5.c | 10 +- strings/ctype-bin.c | 4 +- strings/ctype-cp932.c | 13 +- strings/ctype-czech.c | 2 +- strings/ctype-euc_kr.c | 9 +- strings/ctype-eucjpms.c | 10 +- strings/ctype-gb2312.c | 10 +- strings/ctype-gbk.c | 9 +- strings/ctype-latin1.c | 12 +- strings/ctype-sjis.c | 9 +- strings/ctype-tis620.c | 10 +- strings/ctype-uca.c | 293 +++++++++--------- strings/ctype-ucs2.c | 36 +-- strings/ctype-ujis.c | 9 +- strings/ctype-utf8.c | 20 +- strings/ctype-win1250ch.c | 3 +- strings/ctype.c | 6 + strings/strings_def.h | 9 + 30 files changed, 386 insertions(+), 245 deletions(-) diff --git a/include/my_sys.h b/include/my_sys.h index 29d019d96b8..3acc1487f95 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -1049,9 +1049,13 @@ extern my_bool resolve_collation(const char *cl_name, CHARSET_INFO **cl); extern void free_charsets(void); extern char *get_charsets_dir(char *buf); -extern my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2); +static inline my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2) +{ + return (cs1->csname == cs2->csname); +} extern my_bool init_compiled_charsets(myf flags); extern void add_compiled_collation(struct charset_info_st *cs); +extern void add_compiled_extra_collation(struct charset_info_st *cs); extern size_t escape_string_for_mysql(CHARSET_INFO *charset_info, char *to, size_t to_length, const char *from, size_t length); diff --git a/include/mysys_err.h b/include/mysys_err.h index 08463c9fedb..e0e97d0284a 100644 --- a/include/mysys_err.h +++ b/include/mysys_err.h @@ -72,7 +72,8 @@ extern const char *globerrs[]; /* my_error_messages is here */ #define EE_BADMEMORYRELEASE 36 #define EE_PERM_LOCK_MEMORY 37 #define EE_MEMCNTL 38 -#define EE_ERROR_LAST 38 /* Copy last error nr */ +#define EE_DUPLICATE_CHARSET 39 +#define EE_ERROR_LAST 39 /* Copy last error nr */ /* Add error numbers before EE_ERROR_LAST and change it accordingly. */ diff --git a/mysql-test/main/ctype_ldml.result b/mysql-test/main/ctype_ldml.result index 3ce50331ed0..22b7a316111 100644 --- a/mysql-test/main/ctype_ldml.result +++ b/mysql-test/main/ctype_ldml.result @@ -447,7 +447,7 @@ Bug#46448 trailing spaces are not ignored when user collation maps space != 0x20 set names latin1; show collation like 'latin1_test'; Collation Charset Id Default Compiled Sortlen -latin1_test latin1 99 Yes 1 +latin1_test latin1 331 1 select "foo" = "foo " collate latin1_test; "foo" = "foo " collate latin1_test 1 @@ -466,6 +466,7 @@ utf8mb4_test_ci utf8mb4 326 8 utf16_test_ci utf16 327 8 utf8mb4_test_400_ci utf8mb4 328 8 utf8mb4_test_520_nopad_ci utf8mb4 329 8 +latin1_test latin1 331 1 latin1_test2 latin1 332 1 latin1_test2_cs latin1 333 1 latin1_swedish_nopad2_ci latin1 334 1 @@ -490,7 +491,7 @@ utf32_test_ci utf32 391 8 utf8_maxuserid_ci utf8 2047 8 show collation like '%test%'; Collation Charset Id Default Compiled Sortlen -latin1_test latin1 99 Yes 1 +latin1_test latin1 331 1 latin1_test2 latin1 332 1 latin1_test2_cs latin1 333 1 utf8_test_ci utf8 353 8 @@ -3034,3 +3035,10 @@ SELECT 'chž'< 'i'; 1 SELECT 'a' COLLATE utf8_czech_test_bad_w2; ERROR HY000: Unknown collation: 'utf8_czech_test_bad_w2' +# +# MDEV-7947 my_charset_same: strcmp() takes 0.37% in OLTP RO +# +SHOW COLLATION LIKE 'latin1_test_replace'; +Collation Charset Id Default Compiled Sortlen +SELECT 'foo' = 'foo ' COLLATE latin1_test_replace; +ERROR HY000: Unknown collation: 'latin1_test_replace' diff --git a/mysql-test/main/ctype_ldml.test b/mysql-test/main/ctype_ldml.test index a6cba4b9780..8baabdf2bcb 100644 --- a/mysql-test/main/ctype_ldml.test +++ b/mysql-test/main/ctype_ldml.test @@ -3,6 +3,10 @@ --source include/have_utf16.inc --source include/have_utf32.inc +--disable_query_log +call mtr.add_suppression("Charset id.*trying to replace"); +--enable_query_log + --disable_warnings drop table if exists t1; --enable_warnings @@ -602,3 +606,12 @@ SELECT 'chž'< 'i'; --error ER_UNKNOWN_COLLATION SELECT 'a' COLLATE utf8_czech_test_bad_w2; + + +--echo # +--echo # MDEV-7947 my_charset_same: strcmp() takes 0.37% in OLTP RO +--echo # + +SHOW COLLATION LIKE 'latin1_test_replace'; +--error ER_UNKNOWN_COLLATION +SELECT 'foo' = 'foo ' COLLATE latin1_test_replace; diff --git a/mysql-test/std_data/ldml/Index.xml b/mysql-test/std_data/ldml/Index.xml index 0435b2ab689..c4b91535af6 100644 --- a/mysql-test/std_data/ldml/Index.xml +++ b/mysql-test/std_data/ldml/Index.xml @@ -362,7 +362,14 @@ iso_8859-1:1987 l1 latin1 - + + + diff --git a/mysql-test/suite/innodb/r/innodb_ctype_ldml.result b/mysql-test/suite/innodb/r/innodb_ctype_ldml.result index 1f3b271941d..502f57156c3 100644 --- a/mysql-test/suite/innodb/r/innodb_ctype_ldml.result +++ b/mysql-test/suite/innodb/r/innodb_ctype_ldml.result @@ -383,7 +383,7 @@ Bug#46448 trailing spaces are not ignored when user collation maps space != 0x20 set names latin1; show collation like 'latin1_test'; Collation Charset Id Default Compiled Sortlen -latin1_test latin1 99 Yes 1 +latin1_test latin1 331 1 select "foo" = "foo " collate latin1_test; "foo" = "foo " collate latin1_test 1 @@ -402,6 +402,7 @@ utf8mb4_test_ci utf8mb4 326 8 utf16_test_ci utf16 327 8 utf8mb4_test_400_ci utf8mb4 328 8 utf8mb4_test_520_nopad_ci utf8mb4 329 8 +latin1_test latin1 331 1 latin1_test2 latin1 332 1 latin1_test2_cs latin1 333 1 latin1_swedish_nopad2_ci latin1 334 1 @@ -426,7 +427,7 @@ utf32_test_ci utf32 391 8 utf8_maxuserid_ci utf8 2047 8 show collation like '%test%'; Collation Charset Id Default Compiled Sortlen -latin1_test latin1 99 Yes 1 +latin1_test latin1 331 1 latin1_test2 latin1 332 1 latin1_test2_cs latin1 333 1 utf8_test_ci utf8 353 8 diff --git a/mysql-test/suite/innodb/t/innodb_ctype_ldml.test b/mysql-test/suite/innodb/t/innodb_ctype_ldml.test index 26af717b15a..f065c51505b 100644 --- a/mysql-test/suite/innodb/t/innodb_ctype_ldml.test +++ b/mysql-test/suite/innodb/t/innodb_ctype_ldml.test @@ -13,6 +13,7 @@ drop table if exists t1; --disable_query_log call mtr.add_suppression("Syntax error at '\\[strength tertiary\\]'"); call mtr.add_suppression("Can't reset before a primary ignorable character U\\+A48C"); +call mtr.add_suppression("Charset id.*trying to replace"); --enable_query_log --echo In the following tests we change the order of letter "b" diff --git a/mysys/charset-def.c b/mysys/charset-def.c index 249fb1b5e4d..259b7af9a60 100644 --- a/mysys/charset-def.c +++ b/mysys/charset-def.c @@ -469,7 +469,7 @@ my_bool init_compiled_charsets(myf flags __attribute__((unused))) /* Copy compiled charsets */ for (cs=compiled_charsets; cs->name; cs++) - add_compiled_collation((struct charset_info_st *) cs); + add_compiled_extra_collation((struct charset_info_st *) cs); return FALSE; } diff --git a/mysys/charset.c b/mysys/charset.c index 5e999c8435d..32cfeb56e2d 100644 --- a/mysys/charset.c +++ b/mysys/charset.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #ifdef HAVE_LANGINFO_H #include @@ -28,6 +29,8 @@ #include #endif +extern HASH charset_name_hash; + /* The code below implements this functionality: @@ -38,15 +41,10 @@ - Setting server default character set */ -my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2) -{ - return ((cs1 == cs2) || !strcmp(cs1->csname,cs2->csname)); -} - - static uint get_collation_number_internal(const char *name) { + CHARSET_INFO **cs; for (cs= all_charsets; cs < all_charsets + array_elements(all_charsets); @@ -72,11 +70,10 @@ static my_bool init_state_maps(struct charset_info_st *cs) uchar *state_map; uchar *ident_map; - if (!(cs->state_map= state_map= (uchar*) my_once_alloc(256, MYF(MY_WME)))) + if (!(cs->state_map= state_map= (uchar*) my_once_alloc(256*2, MYF(MY_WME)))) return 1; - if (!(cs->ident_map= ident_map= (uchar*) my_once_alloc(256, MYF(MY_WME)))) - return 1; + cs->ident_map= ident_map= state_map + 256; /* Fill state_map with states to get a faster parser */ for (i=0; i < 256 ; i++) @@ -153,7 +150,8 @@ static int cs_copy_data(struct charset_info_st *to, CHARSET_INFO *from) { to->number= from->number ? from->number : to->number; - if (from->csname) + /* Don't replace csname if already set */ + if (from->csname && !to->csname) if (!(to->csname= my_once_strdup(from->csname,MYF(MY_WME)))) goto err; @@ -322,7 +320,21 @@ static int add_collation(struct charset_info_st *cs) return MY_XML_ERROR; bzero(newcs,sizeof(CHARSET_INFO)); } - + else + { + /* Don't allow change of csname */ + if (newcs->csname && strcmp(newcs->csname, cs->csname)) + { + my_error(EE_DUPLICATE_CHARSET, MYF(ME_WARNING), + cs->number, cs->csname, newcs->csname); + /* + Continue parsing rest of Index.xml. We got an warning in the log + so the user can fix the wrong character set definition. + */ + return MY_XML_OK; + } + } + if (cs->primary_number == cs->number) cs->state |= MY_CS_PRIMARY; @@ -402,8 +414,8 @@ static int add_collation(struct charset_info_st *cs) { newcs->state |= MY_CS_LOADED; } - newcs->state|= MY_CS_AVAILABLE; } + add_compiled_extra_collation(newcs); } else { @@ -420,7 +432,7 @@ static int add_collation(struct charset_info_st *cs) if (cs->comment) if (!(newcs->comment= my_once_strdup(cs->comment,MYF(MY_WME)))) return MY_XML_ERROR; - if (cs->csname) + if (cs->csname && ! newcs->csname) if (!(newcs->csname= my_once_strdup(cs->csname,MYF(MY_WME)))) return MY_XML_ERROR; if (cs->name) @@ -557,14 +569,55 @@ char *get_charsets_dir(char *buf) CHARSET_INFO *all_charsets[MY_ALL_CHARSETS_SIZE]={NULL}; CHARSET_INFO *default_charset_info = &my_charset_latin1; + +/* + Add standard character set compiled into the application + All related character sets should share same cname +*/ + void add_compiled_collation(struct charset_info_st *cs) { DBUG_ASSERT(cs->number < array_elements(all_charsets)); all_charsets[cs->number]= cs; cs->state|= MY_CS_AVAILABLE; + if ((my_hash_insert(&charset_name_hash, (uchar*) cs))) + { +#ifndef DBUG_OFF + CHARSET_INFO *org= (CHARSET_INFO*) my_hash_search(&charset_name_hash, + (uchar*) cs->csname, + strlen(cs->csname)); + DBUG_ASSERT(org); + DBUG_ASSERT(org->csname == cs->csname); +#endif + } } +/* + Add optional characters sets from ctype-extra.c + + If cname is already in use, replace csname in new object with a pointer to + the already used csname to ensure that all csname's points to the same string + for the same character set. +*/ + + +void add_compiled_extra_collation(struct charset_info_st *cs) +{ + DBUG_ASSERT(cs->number < array_elements(all_charsets)); + all_charsets[cs->number]= cs; + cs->state|= MY_CS_AVAILABLE; + if ((my_hash_insert(&charset_name_hash, (uchar*) cs))) + { + CHARSET_INFO *org= (CHARSET_INFO*) my_hash_search(&charset_name_hash, + (uchar*) cs->csname, + strlen(cs->csname)); + cs->csname= org->csname; + } +} + + + static my_pthread_once_t charsets_initialized= MY_PTHREAD_ONCE_INIT; static my_pthread_once_t charsets_template= MY_PTHREAD_ONCE_INIT; @@ -612,14 +665,31 @@ const char *my_collation_get_tailoring(uint id) } +HASH charset_name_hash; + +static uchar *get_charset_key(const uchar *object, + size_t *size, + my_bool not_used __attribute__((unused))) +{ + CHARSET_INFO *cs= (CHARSET_INFO*) object; + *size= strlen(cs->csname); + return (uchar*) cs->csname; +} + static void init_available_charsets(void) { char fname[FN_REFLEN + sizeof(MY_CHARSET_INDEX)]; struct charset_info_st **cs; MY_CHARSET_LOADER loader; + DBUG_ENTER("init_available_charsets"); bzero((char*) &all_charsets,sizeof(all_charsets)); bzero((char*) &my_collation_statistics, sizeof(my_collation_statistics)); + + my_hash_init2(key_memory_charsets, &charset_name_hash, 16, + &my_charset_latin1, 64, 0, 0, get_charset_key, + 0, 0, HASH_UNIQUE); + init_compiled_charsets(MYF(0)); /* Copy compiled charsets */ @@ -640,12 +710,14 @@ static void init_available_charsets(void) my_charset_loader_init_mysys(&loader); strmov(get_charsets_dir(fname), MY_CHARSET_INDEX); my_read_charset_file(&loader, fname, MYF(0)); + DBUG_VOID_RETURN; } void free_charsets(void) { charsets_initialized= charsets_template; + my_hash_free(&charset_name_hash); } @@ -1431,4 +1503,4 @@ const char* my_default_csname() csname = my_os_charset_to_mysql_charset(csname); #endif return csname ? csname : MYSQL_DEFAULT_CHARSET_NAME; -} \ No newline at end of file +} diff --git a/mysys/errors.c b/mysys/errors.c index a7ccf752c0c..d88540fe277 100644 --- a/mysys/errors.c +++ b/mysys/errors.c @@ -58,7 +58,8 @@ const char *globerrs[GLOBERRS]= "Warning: Can't copy ownership for file '%s' (Errcode: %M)", "Failed to release memory pointer %p, %zu bytes (Errcode: %M)", "Lock Pages in memory access rights required", - "Memcntl %s cmd %s error" + "Memcntl %s cmd %s error", + "Warning: Charset id '%d' csname '%s' trying to replace existing csname '%s'", }; void init_glob_errs(void) @@ -107,6 +108,7 @@ void init_glob_errs() EE(EE_BADMEMORYRELEASE)= "Failed to release memory pointer %p, %zu bytes (Errcode: %M)"; EE(EE_PERM_LOCK_MEMORY)= "Lock Pages in memory access rights required"; EE(EE_MEMCNTL) = "Memcntl %s cmd %s error"; + EE(EE_DUPLICATE_CHARSET)= "Warning: Charset id %d trying to replace csname %s with %s"; } #endif diff --git a/mysys/my_static.c b/mysys/my_static.c index cb0465929ab..6c09ab8d94b 100644 --- a/mysys/my_static.c +++ b/mysys/my_static.c @@ -47,6 +47,7 @@ PSI_memory_key key_memory_my_compress_alloc; PSI_memory_key key_memory_my_err_head; PSI_memory_key key_memory_my_file_info; PSI_memory_key key_memory_pack_frm; +PSI_memory_key key_memory_charsets; #ifdef _WIN32 PSI_memory_key key_memory_win_SECURITY_ATTRIBUTES; diff --git a/mysys/mysys_priv.h b/mysys/mysys_priv.h index 5115e0452d5..adf2d39046a 100644 --- a/mysys/mysys_priv.h +++ b/mysys/mysys_priv.h @@ -87,6 +87,7 @@ extern PSI_memory_key key_memory_my_compress_alloc; extern PSI_memory_key key_memory_my_err_head; extern PSI_memory_key key_memory_my_file_info; extern PSI_memory_key key_memory_pack_frm; +extern PSI_memory_key key_memory_charsets; #ifdef _WIN32 extern PSI_memory_key key_memory_win_SECURITY_ATTRIBUTES; diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index 945bbdfdc62..f5dd92f736e 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -32,6 +32,8 @@ #ifdef HAVE_CHARSET_big5 +const char charset_name_big5[]= "big5"; + /* Support for Chinese(BIG5) characters, by jou@nematic.ieo.nctu.edu.tw CP950 and HKSCS additional characters are also accepted. @@ -6807,7 +6809,7 @@ struct charset_info_st my_charset_big5_chinese_ci= { 1,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM, /* state */ - "big5", /* cs name */ + charset_name_big5, /* cs name */ "big5_chinese_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -6840,7 +6842,7 @@ struct charset_info_st my_charset_big5_bin= { 84,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT, /* state */ - "big5", /* cs name */ + charset_name_big5, /* cs name */ "big5_bin", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -6873,7 +6875,7 @@ struct charset_info_st my_charset_big5_chinese_nopad_ci= { MY_NOPAD_ID(1),0,0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_NOPAD, /* state */ - "big5", /* cs name */ + charset_name_big5, /* cs name */ "big5_chinese_nopad_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -6906,7 +6908,7 @@ struct charset_info_st my_charset_big5_nopad_bin= { MY_NOPAD_ID(84),0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_NOPAD, /* state */ - "big5", /* cs name */ + charset_name_big5, /* cs name */ "big5_nopad_bin", /* name */ "", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype-bin.c b/strings/ctype-bin.c index fe28752a3f7..84e5c85697b 100644 --- a/strings/ctype-bin.c +++ b/strings/ctype-bin.c @@ -23,6 +23,8 @@ #include "strings_def.h" #include +const char charset_name_binary[]= "binary"; + static const uchar ctype_bin[]= { 0, @@ -568,7 +570,7 @@ struct charset_info_st my_charset_bin = { 63,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_PRIMARY|MY_CS_NOPAD,/* state */ - "binary", /* cs name */ + charset_name_binary, /* cs name */ "binary", /* name */ "", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype-cp932.c b/strings/ctype-cp932.c index 45b5bde9510..28fea965bf3 100644 --- a/strings/ctype-cp932.c +++ b/strings/ctype-cp932.c @@ -22,6 +22,7 @@ #ifdef HAVE_CHARSET_cp932 +const char charset_name_cp932[]= "cp932"; /* * This comment is parsed by configure to create ctype.c, @@ -34764,8 +34765,8 @@ struct charset_info_st my_charset_cp932_japanese_ci= { 95,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM, /* state */ - "cp932", /* cs name */ - "cp932_japanese_ci", /* name */ + charset_name_cp932, /* cs name */ + "cp932_japanese_ci", /* name */ "", /* comment */ NULL, /* tailoring */ ctype_cp932, @@ -34796,8 +34797,8 @@ struct charset_info_st my_charset_cp932_bin= { 96,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT, /* state */ - "cp932", /* cs name */ - "cp932_bin", /* name */ + charset_name_cp932, /* cs name */ + "cp932_bin", /* name */ "", /* comment */ NULL, /* tailoring */ ctype_cp932, @@ -34829,7 +34830,7 @@ struct charset_info_st my_charset_cp932_japanese_nopad_ci= { MY_NOPAD_ID(95),0,0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_NOPAD, /* state */ - "cp932", /* cs name */ + charset_name_cp932, /* cs name */ "cp932_japanese_nopad_ci",/* name */ "", /* comment */ NULL, /* tailoring */ @@ -34861,7 +34862,7 @@ struct charset_info_st my_charset_cp932_nopad_bin= { MY_NOPAD_ID(96),0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_NOPAD, /* state */ - "cp932", /* cs name */ + charset_name_cp932, /* cs name */ "cp932_nopad_bin", /* name */ "", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype-czech.c b/strings/ctype-czech.c index 17c4c98c24e..b80fe1ae8ed 100644 --- a/strings/ctype-czech.c +++ b/strings/ctype-czech.c @@ -625,7 +625,7 @@ struct charset_info_st my_charset_latin2_czech_ci = 2,0,0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_CSSORT| MY_CS_STRNXFRM_BAD_NWEIGHTS|MY_CS_NON1TO1, /* state */ - "latin2", /* cs name */ + charset_name_latin2, /* cs name */ "latin2_czech_cs", /* name */ "", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index 0362f799fc6..61c64dbcc18 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -31,6 +31,7 @@ #ifdef HAVE_CHARSET_euckr +const char charset_name_euckr[]= "euckr"; static const uchar ctype_euc_kr[257] = { @@ -10054,7 +10055,7 @@ struct charset_info_st my_charset_euckr_korean_ci= { 19,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY, /* state */ - "euckr", /* cs name */ + charset_name_euckr, /* cs name */ "euckr_korean_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -10087,7 +10088,7 @@ struct charset_info_st my_charset_euckr_bin= { 85,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT, /* state */ - "euckr", /* cs name */ + charset_name_euckr, /* cs name */ "euckr_bin", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -10120,7 +10121,7 @@ struct charset_info_st my_charset_euckr_korean_nopad_ci= { MY_NOPAD_ID(19),0,0,/* number */ MY_CS_COMPILED|MY_CS_NOPAD, /* state */ - "euckr", /* cs name */ + charset_name_euckr, /* cs name */ "euckr_korean_nopad_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -10153,7 +10154,7 @@ struct charset_info_st my_charset_euckr_nopad_bin= { MY_NOPAD_ID(85),0,0,/* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_NOPAD, /* state */ - "euckr", /* cs name */ + charset_name_euckr, /* cs name */ "euckr_nopad_bin", /* name */ "", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype-eucjpms.c b/strings/ctype-eucjpms.c index 1dd179fed57..2c24bc5ffda 100644 --- a/strings/ctype-eucjpms.c +++ b/strings/ctype-eucjpms.c @@ -33,6 +33,8 @@ ctype-ujis.c file. #ifdef HAVE_CHARSET_eucjpms +const char charset_name_eucjpms[]= "eucjpms"; + static const uchar ctype_eucjpms[257] = { @@ -67593,7 +67595,7 @@ struct charset_info_st my_charset_eucjpms_japanese_ci= { 97,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY, /* state */ - "eucjpms", /* cs name */ + charset_name_eucjpms, /* cs name */ "eucjpms_japanese_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -67626,7 +67628,7 @@ struct charset_info_st my_charset_eucjpms_bin= { 98,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT, /* state */ - "eucjpms", /* cs name */ + charset_name_eucjpms, /* cs name */ "eucjpms_bin", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -67659,7 +67661,7 @@ struct charset_info_st my_charset_eucjpms_japanese_nopad_ci= { MY_NOPAD_ID(97),0,0, /* number */ MY_CS_COMPILED|MY_CS_NOPAD,/* state */ - "eucjpms", /* cs name */ + charset_name_eucjpms, /* cs name */ "eucjpms_japanese_nopad_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -67692,7 +67694,7 @@ struct charset_info_st my_charset_eucjpms_nopad_bin= { MY_NOPAD_ID(98),0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_NOPAD, /* state */ - "eucjpms", /* cs name */ + charset_name_eucjpms, /* cs name */ "eucjpms_nopad_bin", /* name */ "", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index 266799f32a3..91ee2504b65 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -29,6 +29,8 @@ #ifdef HAVE_CHARSET_gb2312 +const char charset_name_gb2312[]= "gb2312"; + static const uchar ctype_gb2312[257] = { 0, /* For standard library */ @@ -6459,7 +6461,7 @@ struct charset_info_st my_charset_gb2312_chinese_ci= { 24,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY, /* state */ - "gb2312", /* cs name */ + charset_name_gb2312, /* cs name */ "gb2312_chinese_ci",/* name */ "", /* comment */ NULL, /* tailoring */ @@ -6492,7 +6494,7 @@ struct charset_info_st my_charset_gb2312_bin= { 86,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT, /* state */ - "gb2312", /* cs name */ + charset_name_gb2312, /* cs name */ "gb2312_bin", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -6525,7 +6527,7 @@ struct charset_info_st my_charset_gb2312_chinese_nopad_ci= { MY_NOPAD_ID(24),0,0,/* number */ MY_CS_COMPILED|MY_CS_NOPAD, /* state */ - "gb2312", /* cs name */ + charset_name_gb2312, /* cs name */ "gb2312_chinese_nopad_ci",/* name */ "", /* comment */ NULL, /* tailoring */ @@ -6558,7 +6560,7 @@ struct charset_info_st my_charset_gb2312_nopad_bin= { MY_NOPAD_ID(86),0,0,/* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_NOPAD, /* state */ - "gb2312", /* cs name */ + charset_name_gb2312, /* cs name */ "gb2312_nopad_bin", /* name */ "", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index fa6dba9bfb5..041fe318eed 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -31,6 +31,7 @@ #ifdef HAVE_CHARSET_gbk +const char charset_name_gbk[]= "gbk"; /* Support for Chinese(GBK) characters, by hewei@mail.ied.ac.cn */ @@ -10741,7 +10742,7 @@ struct charset_info_st my_charset_gbk_chinese_ci= { 28,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM, /* state */ - "gbk", /* cs name */ + charset_name_gbk, /* cs name */ "gbk_chinese_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -10773,7 +10774,7 @@ struct charset_info_st my_charset_gbk_bin= { 87,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT, /* state */ - "gbk", /* cs name */ + charset_name_gbk, /* cs name */ "gbk_bin", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -10806,7 +10807,7 @@ struct charset_info_st my_charset_gbk_chinese_nopad_ci= { MY_NOPAD_ID(28),0,0,/* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_NOPAD, /* state */ - "gbk", /* cs name */ + charset_name_gbk, /* cs name */ "gbk_chinese_nopad_ci",/* name */ "", /* comment */ NULL, /* tailoring */ @@ -10838,7 +10839,7 @@ struct charset_info_st my_charset_gbk_nopad_bin= { MY_NOPAD_ID(87),0,0,/* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_NOPAD, /* state */ - "gbk", /* cs name */ + charset_name_gbk, /* cs name */ "gbk_nopad_bin", /* name */ "", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype-latin1.c b/strings/ctype-latin1.c index 53ce27e491e..4753ca737a6 100644 --- a/strings/ctype-latin1.c +++ b/strings/ctype-latin1.c @@ -18,6 +18,8 @@ #include "strings_def.h" #include +const char charset_name_latin1[]= "latin1"; + static const uchar ctype_latin1[] = { 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 40, 40, 40, 40, 40, 32, 32, @@ -431,7 +433,7 @@ struct charset_info_st my_charset_latin1= { 8,0,0, /* number */ MY_CS_COMPILED | MY_CS_PRIMARY, /* state */ - "latin1", /* cs name */ + charset_name_latin1, /* cs name */ "latin1_swedish_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -464,7 +466,7 @@ struct charset_info_st my_charset_latin1_nopad= { MY_NOPAD_ID(8),0,0, /* number */ MY_CS_COMPILED | MY_CS_NOPAD, /* state */ - "latin1", /* cs name */ + charset_name_latin1, /* cs name */ "latin1_swedish_nopad_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -742,7 +744,7 @@ struct charset_info_st my_charset_latin1_german2_ci= { 31,0,0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_NON1TO1, /* state */ - "latin1", /* cs name */ + charset_name_latin1, /* cs name */ "latin1_german2_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -775,7 +777,7 @@ struct charset_info_st my_charset_latin1_bin= { 47,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT, /* state */ - "latin1", /* cs name */ + charset_name_latin1, /* cs name */ "latin1_bin", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -808,7 +810,7 @@ struct charset_info_st my_charset_latin1_nopad_bin= { MY_NOPAD_ID(47),0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_NOPAD,/* state */ - "latin1", /* cs name */ + charset_name_latin1, /* cs name */ "latin1_nopad_bin", /* name */ "", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index e1c6a871772..57458ca3a48 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -22,6 +22,7 @@ #ifdef HAVE_CHARSET_sjis +const char charset_name_sjis[]= "sjis"; /* * This comment is parsed by configure to create ctype.c, @@ -34152,7 +34153,7 @@ struct charset_info_st my_charset_sjis_japanese_ci= { 13,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_NONASCII, /* state */ - "sjis", /* cs name */ + charset_name_sjis, /* cs name */ "sjis_japanese_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -34184,7 +34185,7 @@ struct charset_info_st my_charset_sjis_bin= { 88,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_NONASCII, /* state */ - "sjis", /* cs name */ + charset_name_sjis, /* cs name */ "sjis_bin", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -34217,7 +34218,7 @@ struct charset_info_st my_charset_sjis_japanese_nopad_ci= { MY_NOPAD_ID(13),0,0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_NONASCII|MY_CS_NOPAD, /* state */ - "sjis", /* cs name */ + charset_name_sjis, /* cs name */ "sjis_japanese_nopad_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -34249,7 +34250,7 @@ struct charset_info_st my_charset_sjis_nopad_bin= { MY_NOPAD_ID(88),0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_NONASCII|MY_CS_NOPAD, /* state */ - "sjis", /* cs name */ + charset_name_sjis, /* cs name */ "sjis_nopad_bin", /* name */ "", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index 772294fb5c0..90773a0dabc 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -40,6 +40,8 @@ #ifdef HAVE_CHARSET_tis620 +const char charset_name_tis620[]= "tis620"; + #define M L_MIDDLE #define U L_UPPER #define L L_LOWER @@ -914,7 +916,7 @@ struct charset_info_st my_charset_tis620_thai_ci= { 18,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_NON1TO1, /* state */ - "tis620", /* cs name */ + charset_name_tis620, /* cs name */ "tis620_thai_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -946,7 +948,7 @@ struct charset_info_st my_charset_tis620_bin= { 89,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT, /* state */ - "tis620", /* cs name */ + charset_name_tis620, /* cs name */ "tis620_bin", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -979,7 +981,7 @@ struct charset_info_st my_charset_tis620_thai_nopad_ci= { MY_NOPAD_ID(18),0,0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_NON1TO1|MY_CS_NOPAD, /* state */ - "tis620", /* cs name */ + charset_name_tis620, /* cs name */ "tis620_thai_nopad_ci",/* name */ "", /* comment */ NULL, /* tailoring */ @@ -1012,7 +1014,7 @@ struct charset_info_st my_charset_tis620_nopad_bin= { MY_NOPAD_ID(89),0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_NOPAD, /* state */ - "tis620", /* cs name */ + charset_name_tis620, /* cs name */ "tis620_nopad_bin", /* name */ "", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype-uca.c b/strings/ctype-uca.c index 94b73335a4f..2d1fa5ef496 100644 --- a/strings/ctype-uca.c +++ b/strings/ctype-uca.c @@ -33884,7 +33884,6 @@ ex: #define MY_UCA_COLL_INIT my_coll_init_uca #include "ctype-uca.ic" - #define MY_CS_UCS2_UCA_FLAGS (MY_CS_COMMON_UCA_FLAGS|MY_CS_NONASCII) #define MY_CS_UCS2_UCA_NOPAD_FLAGS (MY_CS_UCS2_UCA_FLAGS|MY_CS_NOPAD) @@ -33892,7 +33891,7 @@ struct charset_info_st my_charset_ucs2_unicode_ci= { 128,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_unicode_ci", /* name */ "", /* comment */ "", /* tailoring */ @@ -33924,7 +33923,7 @@ struct charset_info_st my_charset_ucs2_icelandic_uca_ci= { 129,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_icelandic_ci",/* name */ "", /* comment */ icelandic, /* tailoring */ @@ -33956,7 +33955,7 @@ struct charset_info_st my_charset_ucs2_latvian_uca_ci= { 130,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_latvian_ci", /* name */ "", /* comment */ latvian, /* tailoring */ @@ -33988,7 +33987,7 @@ struct charset_info_st my_charset_ucs2_romanian_uca_ci= { 131,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_romanian_ci", /* name */ "", /* comment */ romanian, /* tailoring */ @@ -34020,7 +34019,7 @@ struct charset_info_st my_charset_ucs2_slovenian_uca_ci= { 132,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_slovenian_ci",/* name */ "", /* comment */ slovenian, /* tailoring */ @@ -34052,7 +34051,7 @@ struct charset_info_st my_charset_ucs2_polish_uca_ci= { 133,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_polish_ci", /* name */ "", /* comment */ polish, /* tailoring */ @@ -34084,7 +34083,7 @@ struct charset_info_st my_charset_ucs2_estonian_uca_ci= { 134,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_estonian_ci", /* name */ "", /* comment */ estonian, /* tailoring */ @@ -34116,7 +34115,7 @@ struct charset_info_st my_charset_ucs2_spanish_uca_ci= { 135,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_spanish_ci", /* name */ "", /* comment */ spanish, /* tailoring */ @@ -34148,7 +34147,7 @@ struct charset_info_st my_charset_ucs2_swedish_uca_ci= { 136,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_swedish_ci", /* name */ "", /* comment */ swedish, /* tailoring */ @@ -34180,7 +34179,7 @@ struct charset_info_st my_charset_ucs2_turkish_uca_ci= { 137,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_turkish_ci", /* name */ "", /* comment */ turkish, /* tailoring */ @@ -34212,7 +34211,7 @@ struct charset_info_st my_charset_ucs2_czech_uca_ci= { 138,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_czech_ci", /* name */ "", /* comment */ czech, /* tailoring */ @@ -34245,7 +34244,7 @@ struct charset_info_st my_charset_ucs2_danish_uca_ci= { 139,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_danish_ci", /* name */ "", /* comment */ danish, /* tailoring */ @@ -34277,7 +34276,7 @@ struct charset_info_st my_charset_ucs2_lithuanian_uca_ci= { 140,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_lithuanian_ci",/* name */ "", /* comment */ lithuanian, /* tailoring */ @@ -34309,7 +34308,7 @@ struct charset_info_st my_charset_ucs2_slovak_uca_ci= { 141,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_slovak_ci", /* name */ "", /* comment */ slovak, /* tailoring */ @@ -34341,7 +34340,7 @@ struct charset_info_st my_charset_ucs2_spanish2_uca_ci= { 142,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_spanish2_ci", /* name */ "", /* comment */ spanish2, /* tailoring */ @@ -34374,7 +34373,7 @@ struct charset_info_st my_charset_ucs2_roman_uca_ci= { 143,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_roman_ci", /* name */ "", /* comment */ roman, /* tailoring */ @@ -34407,7 +34406,7 @@ struct charset_info_st my_charset_ucs2_persian_uca_ci= { 144,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_persian_ci", /* name */ "", /* comment */ persian, /* tailoring */ @@ -34440,7 +34439,7 @@ struct charset_info_st my_charset_ucs2_esperanto_uca_ci= { 145,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_esperanto_ci",/* name */ "", /* comment */ esperanto, /* tailoring */ @@ -34473,7 +34472,7 @@ struct charset_info_st my_charset_ucs2_hungarian_uca_ci= { 146,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_hungarian_ci",/* name */ "", /* comment */ hungarian, /* tailoring */ @@ -34505,7 +34504,7 @@ struct charset_info_st my_charset_ucs2_sinhala_uca_ci= { 147,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* csname */ + charset_name_ucs2, /* csname */ "ucs2_sinhala_ci", /* name */ "", /* comment */ sinhala, /* tailoring */ @@ -34539,7 +34538,7 @@ struct charset_info_st my_charset_ucs2_german2_uca_ci= { 148,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* csname */ + charset_name_ucs2, /* csname */ "ucs2_german2_ci", /* name */ "", /* comment */ german2, /* tailoring */ @@ -34571,7 +34570,7 @@ struct charset_info_st my_charset_ucs2_croatian_mysql561_uca_ci= { 149,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_croatian_mysql561_ci",/* name */ "", /* comment */ croatian_mysql561, /* tailoring */ @@ -34604,7 +34603,7 @@ struct charset_info_st my_charset_ucs2_croatian_uca_ci= { MY_PAGE2_COLLATION_ID_UCS2,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_croatian_ci", /* name */ "", /* comment */ croatian_mariadb, /* tailoring */ @@ -34637,7 +34636,7 @@ struct charset_info_st my_charset_ucs2_myanmar_uca_ci= { MY_PAGE2_COLLATION_ID_UCS2+1,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_myanmar_ci", /* name */ "", /* comment */ myanmar, /* tailoring */ @@ -34670,7 +34669,7 @@ struct charset_info_st my_charset_ucs2_thai_520_w2= { MY_PAGE2_COLLATION_ID_UCS2+2,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* flags */ - "ucs2", /* csname */ + charset_name_ucs2, /* csname */ "ucs2_thai_520_w2", /* name */ "", /* comment */ "[strength 2]", /* tailoring */ @@ -34702,7 +34701,7 @@ struct charset_info_st my_charset_ucs2_unicode_520_ci= { 150,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_unicode_520_ci",/* name */ "", /* comment */ "", /* tailoring */ @@ -34735,7 +34734,7 @@ struct charset_info_st my_charset_ucs2_vietnamese_ci= { 151,0,0, /* number */ MY_CS_UCS2_UCA_FLAGS,/* state */ - "ucs2", /* csname */ + charset_name_ucs2, /* csname */ "ucs2_vietnamese_ci",/* name */ "", /* comment */ vietnamese, /* tailoring */ @@ -34768,7 +34767,7 @@ struct charset_info_st my_charset_ucs2_unicode_nopad_ci= { MY_NOPAD_ID(128),0,0, /* number */ MY_CS_UCS2_UCA_NOPAD_FLAGS,/* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_unicode_nopad_ci", /* name */ "", /* comment */ "", /* tailoring */ @@ -34801,7 +34800,7 @@ struct charset_info_st my_charset_ucs2_unicode_520_nopad_ci= { MY_NOPAD_ID(150),0,0, /* number */ MY_CS_UCS2_UCA_NOPAD_FLAGS, /* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_unicode_520_nopad_ci",/* name */ "", /* comment */ "", /* tailoring */ @@ -34903,7 +34902,7 @@ struct charset_info_st my_charset_utf8mb3_unicode_ci= { 192,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_unicode_ci", /* name */ "", /* comment */ "", /* tailoring */ @@ -34936,7 +34935,7 @@ struct charset_info_st my_charset_utf8mb3_icelandic_uca_ci= { 193,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_icelandic_ci",/* name */ "", /* comment */ icelandic, /* tailoring */ @@ -34968,7 +34967,7 @@ struct charset_info_st my_charset_utf8mb3_latvian_uca_ci= { 194,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_latvian_ci",/* name */ "", /* comment */ latvian, /* tailoring */ @@ -35000,7 +34999,7 @@ struct charset_info_st my_charset_utf8mb3_romanian_uca_ci= { 195,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_romanian_ci", /* name */ "", /* comment */ romanian, /* tailoring */ @@ -35032,7 +35031,7 @@ struct charset_info_st my_charset_utf8mb3_slovenian_uca_ci= { 196,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_slovenian_ci",/* name */ "", /* comment */ slovenian, /* tailoring */ @@ -35064,7 +35063,7 @@ struct charset_info_st my_charset_utf8mb3_polish_uca_ci= { 197,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_polish_ci",/* name */ "", /* comment */ polish, /* tailoring */ @@ -35096,7 +35095,7 @@ struct charset_info_st my_charset_utf8mb3_estonian_uca_ci= { 198,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_estonian_ci",/* name */ "", /* comment */ estonian, /* tailoring */ @@ -35128,7 +35127,7 @@ struct charset_info_st my_charset_utf8mb3_spanish_uca_ci= { 199,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_spanish_ci", /* name */ "", /* comment */ spanish, /* tailoring */ @@ -35160,7 +35159,7 @@ struct charset_info_st my_charset_utf8mb3_swedish_uca_ci= { 200,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_swedish_ci", /* name */ "", /* comment */ swedish, /* tailoring */ @@ -35192,7 +35191,7 @@ struct charset_info_st my_charset_utf8mb3_turkish_uca_ci= { 201,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_turkish_ci", /* name */ "", /* comment */ turkish, /* tailoring */ @@ -35224,7 +35223,7 @@ struct charset_info_st my_charset_utf8mb3_czech_uca_ci= { 202,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_czech_ci", /* name */ "", /* comment */ czech, /* tailoring */ @@ -35257,7 +35256,7 @@ struct charset_info_st my_charset_utf8mb3_danish_uca_ci= { 203,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_danish_ci", /* name */ "", /* comment */ danish, /* tailoring */ @@ -35289,7 +35288,7 @@ struct charset_info_st my_charset_utf8mb3_lithuanian_uca_ci= { 204,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_lithuanian_ci",/* name */ "", /* comment */ lithuanian, /* tailoring */ @@ -35321,7 +35320,7 @@ struct charset_info_st my_charset_utf8mb3_slovak_uca_ci= { 205,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_slovak_ci",/* name */ "", /* comment */ slovak, /* tailoring */ @@ -35353,7 +35352,7 @@ struct charset_info_st my_charset_utf8mb3_spanish2_uca_ci= { 206,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_spanish2_ci",/* name */ "", /* comment */ spanish2, /* tailoring */ @@ -35385,7 +35384,7 @@ struct charset_info_st my_charset_utf8mb3_roman_uca_ci= { 207,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_roman_ci",/* name */ "", /* comment */ roman, /* tailoring */ @@ -35417,7 +35416,7 @@ struct charset_info_st my_charset_utf8mb3_persian_uca_ci= { 208,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_persian_ci",/* name */ "", /* comment */ persian, /* tailoring */ @@ -35449,7 +35448,7 @@ struct charset_info_st my_charset_utf8mb3_esperanto_uca_ci= { 209,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_esperanto_ci",/* name */ "", /* comment */ esperanto, /* tailoring */ @@ -35481,7 +35480,7 @@ struct charset_info_st my_charset_utf8mb3_hungarian_uca_ci= { 210,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_hungarian_ci",/* name */ "", /* comment */ hungarian, /* tailoring */ @@ -35513,7 +35512,7 @@ struct charset_info_st my_charset_utf8mb3_sinhala_uca_ci= { 211,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_sinhala_ci", /* name */ "", /* comment */ sinhala, /* tailoring */ @@ -35546,7 +35545,7 @@ struct charset_info_st my_charset_utf8mb3_german2_uca_ci= { 212,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_german2_ci",/* name */ "", /* comment */ german2, /* tailoring */ @@ -35578,7 +35577,7 @@ struct charset_info_st my_charset_utf8mb3_croatian_mysql561_uca_ci= { 213,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_croatian_mysql561_ci",/* name */ "", /* comment */ croatian_mysql561, /* tailoring */ @@ -35611,7 +35610,7 @@ struct charset_info_st my_charset_utf8mb3_croatian_uca_ci= { MY_PAGE2_COLLATION_ID_UTF8,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_croatian_ci",/* name */ "", /* comment */ croatian_mariadb, /* tailoring */ @@ -35644,7 +35643,7 @@ struct charset_info_st my_charset_utf8mb3_myanmar_uca_ci= { MY_PAGE2_COLLATION_ID_UTF8+1,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_myanmar_ci",/* name */ "", /* comment */ myanmar, /* tailoring */ @@ -35677,7 +35676,7 @@ struct charset_info_st my_charset_utf8mb3_unicode_520_ci= { 214,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* csname */ + charset_name_utf8, /* csname */ MY_UTF8MB3 "_unicode_520_ci",/* name */ "", /* comment */ "", /* tailoring */ @@ -35709,7 +35708,7 @@ struct charset_info_st my_charset_utf8mb3_thai_520_w2= { MY_PAGE2_COLLATION_ID_UTF8+2,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* csname */ + charset_name_utf8, /* csname */ MY_UTF8MB3 "_thai_520_w2",/* name */ "", /* comment */ "[strength 2]", /* tailoring */ @@ -35741,7 +35740,7 @@ struct charset_info_st my_charset_utf8mb3_vietnamese_ci= { 215,0,0, /* number */ MY_CS_UTF8MB3_UCA_FLAGS,/* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_vietnamese_ci",/* name */ "", /* comment */ vietnamese, /* tailoring */ @@ -35774,7 +35773,7 @@ struct charset_info_st my_charset_utf8mb3_unicode_nopad_ci= { MY_NOPAD_ID(192),0,0, /* number */ MY_CS_UTF8MB3_UCA_NOPAD_FLAGS, /* flags */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_unicode_nopad_ci",/* name */ "", /* comment */ "", /* tailoring */ @@ -35807,7 +35806,7 @@ struct charset_info_st my_charset_utf8mb3_unicode_520_nopad_ci= { MY_NOPAD_ID(214),0,0, /* number */ MY_CS_UTF8MB3_UCA_NOPAD_FLAGS, /* flags */ - MY_UTF8MB3, /* csname */ + charset_name_utf8, /* csname */ MY_UTF8MB3 "_unicode_520_nopad_ci", /* name */ "", /* comment */ "", /* tailoring */ @@ -35882,7 +35881,7 @@ struct charset_info_st my_charset_utf8mb4_unicode_ci= { 224,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_unicode_ci",/* name */ "", /* comment */ "", /* tailoring */ @@ -35915,7 +35914,7 @@ struct charset_info_st my_charset_utf8mb4_icelandic_uca_ci= { 225,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_icelandic_ci",/* name */ "", /* comment */ icelandic, /* tailoring */ @@ -35947,7 +35946,7 @@ struct charset_info_st my_charset_utf8mb4_latvian_uca_ci= { 226,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_latvian_ci", /* name */ "", /* comment */ latvian, /* tailoring */ @@ -35979,7 +35978,7 @@ struct charset_info_st my_charset_utf8mb4_romanian_uca_ci= { 227,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_romanian_ci", /* name */ "", /* comment */ romanian, /* tailoring */ @@ -36011,7 +36010,7 @@ struct charset_info_st my_charset_utf8mb4_slovenian_uca_ci= { 228,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_slovenian_ci",/* name */ "", /* comment */ slovenian, /* tailoring */ @@ -36043,7 +36042,7 @@ struct charset_info_st my_charset_utf8mb4_polish_uca_ci= { 229,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_polish_ci", /* name */ "", /* comment */ polish, /* tailoring */ @@ -36075,7 +36074,7 @@ struct charset_info_st my_charset_utf8mb4_estonian_uca_ci= { 230,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_estonian_ci", /* name */ "", /* comment */ estonian, /* tailoring */ @@ -36107,7 +36106,7 @@ struct charset_info_st my_charset_utf8mb4_spanish_uca_ci= { 231,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_spanish_ci", /* name */ "", /* comment */ spanish, /* tailoring */ @@ -36139,7 +36138,7 @@ struct charset_info_st my_charset_utf8mb4_swedish_uca_ci= { 232,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_swedish_ci", /* name */ "", /* comment */ swedish, /* tailoring */ @@ -36171,7 +36170,7 @@ struct charset_info_st my_charset_utf8mb4_turkish_uca_ci= { 233,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_turkish_ci", /* name */ "", /* comment */ turkish, /* tailoring */ @@ -36203,7 +36202,7 @@ struct charset_info_st my_charset_utf8mb4_czech_uca_ci= { 234,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_czech_ci", /* name */ "", /* comment */ czech, /* tailoring */ @@ -36236,7 +36235,7 @@ struct charset_info_st my_charset_utf8mb4_danish_uca_ci= { 235,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_danish_ci", /* name */ "", /* comment */ danish, /* tailoring */ @@ -36268,7 +36267,7 @@ struct charset_info_st my_charset_utf8mb4_lithuanian_uca_ci= { 236,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_lithuanian_ci",/* name */ "", /* comment */ lithuanian, /* tailoring */ @@ -36300,7 +36299,7 @@ struct charset_info_st my_charset_utf8mb4_slovak_uca_ci= { 237,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_slovak_ci", /* name */ "", /* comment */ slovak, /* tailoring */ @@ -36332,7 +36331,7 @@ struct charset_info_st my_charset_utf8mb4_spanish2_uca_ci= { 238,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_spanish2_ci", /* name */ "", /* comment */ spanish2, /* tailoring */ @@ -36364,7 +36363,7 @@ struct charset_info_st my_charset_utf8mb4_roman_uca_ci= { 239,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_roman_ci", /* name */ "", /* comment */ roman, /* tailoring */ @@ -36396,7 +36395,7 @@ struct charset_info_st my_charset_utf8mb4_persian_uca_ci= { 240,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_persian_ci", /* name */ "", /* comment */ persian, /* tailoring */ @@ -36428,7 +36427,7 @@ struct charset_info_st my_charset_utf8mb4_esperanto_uca_ci= { 241,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_esperanto_ci",/* name */ "", /* comment */ esperanto, /* tailoring */ @@ -36460,7 +36459,7 @@ struct charset_info_st my_charset_utf8mb4_hungarian_uca_ci= { 242,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_hungarian_ci",/* name */ "", /* comment */ hungarian, /* tailoring */ @@ -36492,7 +36491,7 @@ struct charset_info_st my_charset_utf8mb4_sinhala_uca_ci= { 243,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_sinhala_ci",/* name */ "", /* comment */ sinhala, /* tailoring */ @@ -36524,7 +36523,7 @@ struct charset_info_st my_charset_utf8mb4_german2_uca_ci= { 244,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_german2_ci",/* name */ "", /* comment */ german2, /* tailoring */ @@ -36556,7 +36555,7 @@ struct charset_info_st my_charset_utf8mb4_croatian_mysql561_uca_ci= { 245,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_croatian_mysql561_ci",/* name */ "", /* comment */ croatian_mysql561, /* tailoring */ @@ -36589,7 +36588,7 @@ struct charset_info_st my_charset_utf8mb4_croatian_uca_ci= { MY_PAGE2_COLLATION_ID_UTF8MB4,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_croatian_ci",/* name */ "", /* comment */ croatian_mariadb, /* tailoring */ @@ -36622,7 +36621,7 @@ struct charset_info_st my_charset_utf8mb4_myanmar_uca_ci= { MY_PAGE2_COLLATION_ID_UTF8MB4+1,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_myanmar_ci",/* name */ "", /* comment */ myanmar, /* tailoring */ @@ -36654,7 +36653,7 @@ struct charset_info_st my_charset_utf8mb4_thai_520_w2= { MY_PAGE2_COLLATION_ID_UTF8MB4+2,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* flags */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_thai_520_w2", /* name */ "", /* comment */ "[strength 2]", /* tailoring */ @@ -36686,7 +36685,7 @@ struct charset_info_st my_charset_utf8mb4_unicode_520_ci= { 246,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* flags */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_unicode_520_ci",/* name */ "", /* comment */ "", /* tailoring */ @@ -36719,7 +36718,7 @@ struct charset_info_st my_charset_utf8mb4_vietnamese_ci= { 247,0,0, /* number */ MY_CS_UTF8MB4_UCA_FLAGS,/* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_vietnamese_ci",/* name */ "", /* comment */ vietnamese, /* tailoring */ @@ -36752,7 +36751,7 @@ struct charset_info_st my_charset_utf8mb4_unicode_nopad_ci= { MY_NOPAD_ID(224),0,0, /* number */ MY_CS_UTF8MB4_UCA_NOPAD_FLAGS, /* state */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_unicode_nopad_ci", /* name */ "", /* comment */ "", /* tailoring */ @@ -36785,7 +36784,7 @@ struct charset_info_st my_charset_utf8mb4_unicode_520_nopad_ci= { MY_NOPAD_ID(246),0,0, /* number */ MY_CS_UTF8MB4_UCA_NOPAD_FLAGS, /* flags */ - MY_UTF8MB4, /* csname */ + charset_name_utf8mb4, /* csname */ MY_UTF8MB4 "_unicode_520_nopad_ci", /* name */ "", /* comment */ "", /* tailoring */ @@ -36828,7 +36827,6 @@ struct charset_info_st my_charset_utf8mb4_unicode_520_nopad_ci= #define MY_UCA_COLL_INIT my_coll_init_uca #include "ctype-uca.ic" - extern MY_CHARSET_HANDLER my_charset_utf32_handler; #define MY_CS_UTF32_UCA_FLAGS (MY_CS_COMMON_UCA_FLAGS|MY_CS_NONASCII) @@ -36838,7 +36836,7 @@ struct charset_info_st my_charset_utf32_unicode_ci= { 160,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_unicode_ci", /* name */ "", /* comment */ "", /* tailoring */ @@ -36871,7 +36869,7 @@ struct charset_info_st my_charset_utf32_icelandic_uca_ci= { 161,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_icelandic_ci",/* name */ "", /* comment */ icelandic, /* tailoring */ @@ -36903,7 +36901,7 @@ struct charset_info_st my_charset_utf32_latvian_uca_ci= { 162,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_latvian_ci", /* name */ "", /* comment */ latvian, /* tailoring */ @@ -36935,7 +36933,7 @@ struct charset_info_st my_charset_utf32_romanian_uca_ci= { 163,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_romanian_ci", /* name */ "", /* comment */ romanian, /* tailoring */ @@ -36967,7 +36965,7 @@ struct charset_info_st my_charset_utf32_slovenian_uca_ci= { 164,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_slovenian_ci",/* name */ "", /* comment */ slovenian, /* tailoring */ @@ -36999,7 +36997,7 @@ struct charset_info_st my_charset_utf32_polish_uca_ci= { 165,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_polish_ci", /* name */ "", /* comment */ polish, /* tailoring */ @@ -37031,7 +37029,7 @@ struct charset_info_st my_charset_utf32_estonian_uca_ci= { 166,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_estonian_ci", /* name */ "", /* comment */ estonian, /* tailoring */ @@ -37063,7 +37061,7 @@ struct charset_info_st my_charset_utf32_spanish_uca_ci= { 167,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_spanish_ci", /* name */ "", /* comment */ spanish, /* tailoring */ @@ -37095,7 +37093,7 @@ struct charset_info_st my_charset_utf32_swedish_uca_ci= { 168,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_swedish_ci", /* name */ "", /* comment */ swedish, /* tailoring */ @@ -37127,7 +37125,7 @@ struct charset_info_st my_charset_utf32_turkish_uca_ci= { 169,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_turkish_ci", /* name */ "", /* comment */ turkish, /* tailoring */ @@ -37159,7 +37157,7 @@ struct charset_info_st my_charset_utf32_czech_uca_ci= { 170,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_czech_ci", /* name */ "", /* comment */ czech, /* tailoring */ @@ -37192,7 +37190,7 @@ struct charset_info_st my_charset_utf32_danish_uca_ci= { 171,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_danish_ci", /* name */ "", /* comment */ danish, /* tailoring */ @@ -37224,7 +37222,7 @@ struct charset_info_st my_charset_utf32_lithuanian_uca_ci= { 172,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_lithuanian_ci",/* name */ "", /* comment */ lithuanian, /* tailoring */ @@ -37256,7 +37254,7 @@ struct charset_info_st my_charset_utf32_slovak_uca_ci= { 173,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_slovak_ci", /* name */ "", /* comment */ slovak, /* tailoring */ @@ -37288,7 +37286,7 @@ struct charset_info_st my_charset_utf32_spanish2_uca_ci= { 174,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_spanish2_ci", /* name */ "", /* comment */ spanish2, /* tailoring */ @@ -37320,7 +37318,7 @@ struct charset_info_st my_charset_utf32_roman_uca_ci= { 175,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_roman_ci", /* name */ "", /* comment */ roman, /* tailoring */ @@ -37352,7 +37350,7 @@ struct charset_info_st my_charset_utf32_persian_uca_ci= { 176,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_persian_ci", /* name */ "", /* comment */ persian, /* tailoring */ @@ -37384,7 +37382,7 @@ struct charset_info_st my_charset_utf32_esperanto_uca_ci= { 177,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_esperanto_ci",/* name */ "", /* comment */ esperanto, /* tailoring */ @@ -37416,7 +37414,7 @@ struct charset_info_st my_charset_utf32_hungarian_uca_ci= { 178,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_hungarian_ci",/* name */ "", /* comment */ hungarian, /* tailoring */ @@ -37448,7 +37446,7 @@ struct charset_info_st my_charset_utf32_sinhala_uca_ci= { 179,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_sinhala_ci", /* name */ "", /* comment */ sinhala, /* tailoring */ @@ -37480,7 +37478,7 @@ struct charset_info_st my_charset_utf32_german2_uca_ci= { 180,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_german2_ci", /* name */ "", /* comment */ german2, /* tailoring */ @@ -37512,7 +37510,7 @@ struct charset_info_st my_charset_utf32_croatian_mysql561_uca_ci= { 181,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_croatian_mysql561_ci", /* name */ "", /* comment */ croatian_mysql561, /* tailoring */ @@ -37544,7 +37542,7 @@ struct charset_info_st my_charset_utf32_croatian_uca_ci= { MY_PAGE2_COLLATION_ID_UTF32,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_croatian_ci", /* name */ "", /* comment */ croatian_mariadb, /* tailoring */ @@ -37577,7 +37575,7 @@ struct charset_info_st my_charset_utf32_myanmar_uca_ci= { MY_PAGE2_COLLATION_ID_UTF32+1,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_myanmar_ci", /* name */ "", /* comment */ myanmar, /* tailoring */ @@ -37610,7 +37608,7 @@ struct charset_info_st my_charset_utf32_thai_520_w2= { MY_PAGE2_COLLATION_ID_UTF32+2,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_thai_520_w2",/* name */ "", /* comment */ "[strength 2]", /* tailoring */ @@ -37643,7 +37641,7 @@ struct charset_info_st my_charset_utf32_unicode_520_ci= { 182,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* stat e */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_unicode_520_ci",/* name */ "", /* comment */ "", /* tailoring */ @@ -37676,7 +37674,7 @@ struct charset_info_st my_charset_utf32_vietnamese_ci= { 183,0,0, /* number */ MY_CS_UTF32_UCA_FLAGS,/* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_vietnamese_ci",/* name */ "", /* comment */ vietnamese, /* tailoring */ @@ -37709,7 +37707,7 @@ struct charset_info_st my_charset_utf32_unicode_nopad_ci= { MY_NOPAD_ID(160),0,0, /* number */ MY_CS_UTF32_UCA_NOPAD_FLAGS, /* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_unicode_nopad_ci", /* name */ "", /* comment */ "", /* tailoring */ @@ -37742,7 +37740,7 @@ struct charset_info_st my_charset_utf32_unicode_520_nopad_ci= { MY_NOPAD_ID(182),0,0, /* number */ MY_CS_UTF32_UCA_NOPAD_FLAGS, /* state */ - "utf32", /* csname */ + charset_name_utf32, /* csname */ "utf32_unicode_520_nopad_ci",/* name */ "", /* comment */ "", /* tailoring */ @@ -37786,7 +37784,6 @@ struct charset_info_st my_charset_utf32_unicode_520_nopad_ci= #define MY_UCA_COLL_INIT my_coll_init_uca #include "ctype-uca.ic" - extern MY_CHARSET_HANDLER my_charset_utf16_handler; #define MY_CS_UTF16_UCA_FLAGS (MY_CS_COMMON_UCA_FLAGS|MY_CS_NONASCII) @@ -37796,7 +37793,7 @@ struct charset_info_st my_charset_utf16_unicode_ci= { 101,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* csname */ + charset_name_utf16, /* csname */ "utf16_unicode_ci", /* name */ "", /* comment */ "", /* tailoring */ @@ -37829,7 +37826,7 @@ struct charset_info_st my_charset_utf16_icelandic_uca_ci= { 102,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* csname */ + charset_name_utf16, /* csname */ "utf16_icelandic_ci",/* name */ "", /* comment */ icelandic, /* tailoring */ @@ -37861,7 +37858,7 @@ struct charset_info_st my_charset_utf16_latvian_uca_ci= { 103,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_latvian_ci", /* name */ "", /* comment */ latvian, /* tailoring */ @@ -37893,7 +37890,7 @@ struct charset_info_st my_charset_utf16_romanian_uca_ci= { 104,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_romanian_ci", /* name */ "", /* comment */ romanian, /* tailoring */ @@ -37925,7 +37922,7 @@ struct charset_info_st my_charset_utf16_slovenian_uca_ci= { 105,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_slovenian_ci",/* name */ "", /* comment */ slovenian, /* tailoring */ @@ -37957,7 +37954,7 @@ struct charset_info_st my_charset_utf16_polish_uca_ci= { 106,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_polish_ci", /* name */ "", /* comment */ polish, /* tailoring */ @@ -37989,7 +37986,7 @@ struct charset_info_st my_charset_utf16_estonian_uca_ci= { 107,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_estonian_ci", /* name */ "", /* comment */ estonian, /* tailoring */ @@ -38021,7 +38018,7 @@ struct charset_info_st my_charset_utf16_spanish_uca_ci= { 108,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_spanish_ci", /* name */ "", /* comment */ spanish, /* tailoring */ @@ -38053,7 +38050,7 @@ struct charset_info_st my_charset_utf16_swedish_uca_ci= { 109,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_swedish_ci", /* name */ "", /* comment */ swedish, /* tailoring */ @@ -38085,7 +38082,7 @@ struct charset_info_st my_charset_utf16_turkish_uca_ci= { 110,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_turkish_ci", /* name */ "", /* comment */ turkish, /* tailoring */ @@ -38117,7 +38114,7 @@ struct charset_info_st my_charset_utf16_czech_uca_ci= { 111,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_czech_ci", /* name */ "", /* comment */ czech, /* tailoring */ @@ -38150,7 +38147,7 @@ struct charset_info_st my_charset_utf16_danish_uca_ci= { 112,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_danish_ci", /* name */ "", /* comment */ danish, /* tailoring */ @@ -38182,7 +38179,7 @@ struct charset_info_st my_charset_utf16_lithuanian_uca_ci= { 113,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_lithuanian_ci",/* name */ "", /* comment */ lithuanian, /* tailoring */ @@ -38214,7 +38211,7 @@ struct charset_info_st my_charset_utf16_slovak_uca_ci= { 114,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_slovak_ci", /* name */ "", /* comment */ slovak, /* tailoring */ @@ -38246,7 +38243,7 @@ struct charset_info_st my_charset_utf16_spanish2_uca_ci= { 115,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_spanish2_ci",/* name */ "", /* comment */ spanish2, /* tailoring */ @@ -38278,7 +38275,7 @@ struct charset_info_st my_charset_utf16_roman_uca_ci= { 116,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_roman_ci", /* name */ "", /* comment */ roman, /* tailoring */ @@ -38310,7 +38307,7 @@ struct charset_info_st my_charset_utf16_persian_uca_ci= { 117,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_persian_ci", /* name */ "", /* comment */ persian, /* tailoring */ @@ -38342,7 +38339,7 @@ struct charset_info_st my_charset_utf16_esperanto_uca_ci= { 118,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_esperanto_ci",/* name */ "", /* comment */ esperanto, /* tailoring */ @@ -38374,7 +38371,7 @@ struct charset_info_st my_charset_utf16_hungarian_uca_ci= { 119,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_hungarian_ci",/* name */ "", /* comment */ hungarian, /* tailoring */ @@ -38406,7 +38403,7 @@ struct charset_info_st my_charset_utf16_sinhala_uca_ci= { 120,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_sinhala_ci",/* name */ "", /* comment */ sinhala, /* tailoring */ @@ -38438,7 +38435,7 @@ struct charset_info_st my_charset_utf16_german2_uca_ci= { 121,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_german2_ci",/* name */ "", /* comment */ german2, /* tailoring */ @@ -38471,7 +38468,7 @@ struct charset_info_st my_charset_utf16_croatian_mysql561_uca_ci= { 122,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_croatian_mysql561_ci",/* name */ "", /* comment */ croatian_mysql561, /* tailoring */ @@ -38504,7 +38501,7 @@ struct charset_info_st my_charset_utf16_croatian_uca_ci= { MY_PAGE2_COLLATION_ID_UTF16,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_croatian_ci",/* name */ "", /* comment */ croatian_mariadb, /* tailoring */ @@ -38537,7 +38534,7 @@ struct charset_info_st my_charset_utf16_myanmar_uca_ci= { MY_PAGE2_COLLATION_ID_UTF16+1,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_myanmar_ci",/* name */ "", /* comment */ myanmar, /* tailoring */ @@ -38570,7 +38567,7 @@ struct charset_info_st my_charset_utf16_thai_520_w2= { MY_PAGE2_COLLATION_ID_UTF16+2,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_thai_520_w2",/* name */ "", /* comment */ "[strength 2]", /* tailoring */ @@ -38603,7 +38600,7 @@ struct charset_info_st my_charset_utf16_unicode_520_ci= { 123,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* csname */ + charset_name_utf16, /* csname */ "utf16_unicode_520_ci",/* name */ "", /* comment */ "", /* tailoring */ @@ -38636,7 +38633,7 @@ struct charset_info_st my_charset_utf16_vietnamese_ci= { 124,0,0, /* number */ MY_CS_UTF16_UCA_FLAGS,/* state */ - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_vietnamese_ci",/* name */ "", /* comment */ vietnamese, /* tailoring */ @@ -38669,7 +38666,7 @@ struct charset_info_st my_charset_utf16_unicode_nopad_ci= { MY_NOPAD_ID(101),0,0, /* number */ MY_CS_UTF16_UCA_NOPAD_FLAGS, /* state */ - "utf16", /* csname */ + charset_name_utf16, /* csname */ "utf16_unicode_nopad_ci", /* name */ "", /* comment */ "", /* tailoring */ @@ -38702,7 +38699,7 @@ struct charset_info_st my_charset_utf16_unicode_520_nopad_ci= { MY_NOPAD_ID(123),0,0, /* number */ MY_CS_UTF16_UCA_NOPAD_FLAGS, /* state */ - "utf16", /* csname */ + charset_name_utf16, /* csname */ "utf16_unicode_520_nopad_ci",/* name */ "", /* comment */ "", /* tailoring */ diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c index d764849c01e..c72fc9b6d00 100644 --- a/strings/ctype-ucs2.c +++ b/strings/ctype-ucs2.c @@ -35,7 +35,6 @@ #define HAVE_CHARSET_mb2_or_mb4 #endif - #ifndef EILSEQ #define EILSEQ ENOENT #endif @@ -1278,6 +1277,7 @@ my_uni_utf16(CHARSET_INFO *cs __attribute__((unused)), #ifdef HAVE_CHARSET_utf16 +const char charset_name_utf16le[]= "utf16le"; static inline void my_tolower_utf16(MY_UNICASE_INFO *uni_plane, my_wc_t *wc) @@ -1599,7 +1599,7 @@ struct charset_info_st my_charset_utf16_general_ci= { 54,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_general_ci", /* name */ "UTF-16 Unicode", /* comment */ NULL, /* tailoring */ @@ -1632,7 +1632,7 @@ struct charset_info_st my_charset_utf16_bin= { 55,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_bin", /* name */ "UTF-16 Unicode", /* comment */ NULL, /* tailoring */ @@ -1665,7 +1665,7 @@ struct charset_info_st my_charset_utf16_general_nopad_ci= { MY_NOPAD_ID(54),0,0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII|MY_CS_NOPAD, - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_general_nopad_ci", /* name */ "UTF-16 Unicode", /* comment */ NULL, /* tailoring */ @@ -1699,7 +1699,7 @@ struct charset_info_st my_charset_utf16_nopad_bin= MY_NOPAD_ID(55),0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII| MY_CS_NOPAD, - "utf16", /* cs name */ + charset_name_utf16, /* cs name */ "utf16_nopad_bin", /* name */ "UTF-16 Unicode", /* comment */ NULL, /* tailoring */ @@ -1940,7 +1940,7 @@ struct charset_info_st my_charset_utf16le_general_ci= { 56,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, - "utf16le", /* cs name */ + charset_name_utf16le, /* cs name */ "utf16le_general_ci",/* name */ "UTF-16LE Unicode", /* comment */ NULL, /* tailoring */ @@ -1973,7 +1973,7 @@ struct charset_info_st my_charset_utf16le_bin= { 62,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, - "utf16le", /* cs name */ + charset_name_utf16le, /* cs name */ "utf16le_bin", /* name */ "UTF-16LE Unicode", /* comment */ NULL, /* tailoring */ @@ -2006,7 +2006,7 @@ struct charset_info_st my_charset_utf16le_general_nopad_ci= { MY_NOPAD_ID(56),0,0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII|MY_CS_NOPAD, - "utf16le", /* cs name */ + charset_name_utf16le, /* cs name */ "utf16le_general_nopad_ci",/* name */ "UTF-16LE Unicode", /* comment */ NULL, /* tailoring */ @@ -2040,7 +2040,7 @@ struct charset_info_st my_charset_utf16le_nopad_bin= MY_NOPAD_ID(62),0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII| MY_CS_NOPAD, - "utf16le", /* cs name */ + charset_name_utf16le, /* cs name */ "utf16le_nopad_bin", /* name */ "UTF-16LE Unicode", /* comment */ NULL, /* tailoring */ @@ -2763,7 +2763,7 @@ struct charset_info_st my_charset_utf32_general_ci= { 60,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, - "utf32", /* cs name */ + charset_name_utf32, /* cs name */ "utf32_general_ci", /* name */ "UTF-32 Unicode", /* comment */ NULL, /* tailoring */ @@ -2796,7 +2796,7 @@ struct charset_info_st my_charset_utf32_bin= { 61,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, - "utf32", /* cs name */ + charset_name_utf32, /* cs name */ "utf32_bin", /* name */ "UTF-32 Unicode", /* comment */ NULL, /* tailoring */ @@ -2829,7 +2829,7 @@ struct charset_info_st my_charset_utf32_general_nopad_ci= { MY_NOPAD_ID(60),0,0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII|MY_CS_NOPAD, - "utf32", /* cs name */ + charset_name_utf32, /* cs name */ "utf32_general_nopad_ci", /* name */ "UTF-32 Unicode", /* comment */ NULL, /* tailoring */ @@ -2863,7 +2863,7 @@ struct charset_info_st my_charset_utf32_nopad_bin= MY_NOPAD_ID(61),0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII| MY_CS_NOPAD, - "utf32", /* cs name */ + charset_name_utf32, /* cs name */ "utf32_nopad_bin", /* name */ "UTF-32 Unicode", /* comment */ NULL, /* tailoring */ @@ -3354,7 +3354,7 @@ struct charset_info_st my_charset_ucs2_general_ci= { 35,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_general_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -3387,7 +3387,7 @@ struct charset_info_st my_charset_ucs2_general_mysql500_ci= { 159, 0, 0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII, /* state */ - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_general_mysql500_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -3420,7 +3420,7 @@ struct charset_info_st my_charset_ucs2_bin= { 90,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_UNICODE|MY_CS_NONASCII, - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_bin", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -3453,7 +3453,7 @@ struct charset_info_st my_charset_ucs2_general_nopad_ci= { MY_NOPAD_ID(35),0,0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NONASCII|MY_CS_NOPAD, - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_general_nopad_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -3486,7 +3486,7 @@ struct charset_info_st my_charset_ucs2_nopad_bin= { MY_NOPAD_ID(90),0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_UNICODE|MY_CS_NONASCII|MY_CS_NOPAD, - "ucs2", /* cs name */ + charset_name_ucs2, /* cs name */ "ucs2_nopad_bin", /* name */ "", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index 9ec3b578549..b90b3ef3a6a 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -32,6 +32,7 @@ #ifdef HAVE_CHARSET_ujis +const char charset_name_ujis[]= "ujis"; static const uchar ctype_ujis[257] = { @@ -67337,7 +67338,7 @@ struct charset_info_st my_charset_ujis_japanese_ci= { 12,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY, /* state */ - "ujis", /* cs name */ + charset_name_ujis, /* cs name */ "ujis_japanese_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -67370,7 +67371,7 @@ struct charset_info_st my_charset_ujis_bin= { 91,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT, /* state */ - "ujis", /* cs name */ + charset_name_ujis, /* cs name */ "ujis_bin", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -67403,7 +67404,7 @@ struct charset_info_st my_charset_ujis_japanese_nopad_ci= { MY_NOPAD_ID(12),0,0,/* number */ MY_CS_COMPILED|MY_CS_NOPAD, /* state */ - "ujis", /* cs name */ + charset_name_ujis, /* cs name */ "ujis_japanese_nopad_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -67436,7 +67437,7 @@ struct charset_info_st my_charset_ujis_nopad_bin= { MY_NOPAD_ID(91),0,0,/* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_NOPAD, /* state */ - "ujis", /* cs name */ + charset_name_ujis, /* cs name */ "ujis_nopad_bin", /* name */ "", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 7434f968383..cdf89aa03ff 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -5473,7 +5473,7 @@ struct charset_info_st my_charset_utf8mb3_general_ci= { 33,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE, /* state */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_general_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -5506,7 +5506,7 @@ struct charset_info_st my_charset_utf8mb3_general_mysql500_ci= { 223,0,0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE, /* state */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_general_mysql500_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -5539,7 +5539,7 @@ struct charset_info_st my_charset_utf8mb3_bin= { 83,0,0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_BINSORT|MY_CS_UNICODE, /* state */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_bin", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -5572,7 +5572,7 @@ struct charset_info_st my_charset_utf8mb3_general_nopad_ci= { MY_NOPAD_ID(33),0,0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_NOPAD, /* state */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_general_nopad_ci", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -5605,7 +5605,7 @@ struct charset_info_st my_charset_utf8mb3_nopad_bin= { MY_NOPAD_ID(83),0,0,/* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_BINSORT|MY_CS_UNICODE|MY_CS_NOPAD, - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_nopad_bin", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -5767,7 +5767,7 @@ struct charset_info_st my_charset_utf8mb3_general_cs= { 254,0,0, /* number */ MY_CS_COMPILED|MY_CS_UNICODE, /* state */ - MY_UTF8MB3, /* cs name */ + charset_name_utf8, /* cs name */ MY_UTF8MB3 "_general_cs", /* name */ "", /* comment */ NULL, /* tailoring */ @@ -7809,7 +7809,7 @@ struct charset_info_st my_charset_utf8mb4_general_ci= { 45,0,0, /* number */ MY_CS_COMPILED|MY_CS_PRIMARY|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_UNICODE_SUPPLEMENT, /* state */ - MY_UTF8MB4, /* cs name */ + charset_name_utf8mb4, /* cs name */ MY_UTF8MB4_GENERAL_CI,/* name */ "UTF-8 Unicode", /* comment */ NULL, /* tailoring */ @@ -7843,7 +7843,7 @@ struct charset_info_st my_charset_utf8mb4_bin= 46,0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_STRNXFRM|MY_CS_UNICODE| MY_CS_UNICODE_SUPPLEMENT, /* state */ - MY_UTF8MB4, /* cs name */ + charset_name_utf8mb4, /* cs name */ MY_UTF8MB4_BIN, /* name */ "UTF-8 Unicode", /* comment */ NULL, /* tailoring */ @@ -7877,7 +7877,7 @@ struct charset_info_st my_charset_utf8mb4_general_nopad_ci= MY_NOPAD_ID(45),0,0,/* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_UNICODE|MY_CS_UNICODE_SUPPLEMENT| MY_CS_NOPAD, /* state */ - MY_UTF8MB4, /* cs name */ + charset_name_utf8mb4, /* cs name */ MY_UTF8MB4_GENERAL_NOPAD_CI,/* name */ "UTF-8 Unicode", /* comment */ NULL, /* tailoring */ @@ -7911,7 +7911,7 @@ struct charset_info_st my_charset_utf8mb4_nopad_bin= MY_NOPAD_ID(46),0,0, /* number */ MY_CS_COMPILED|MY_CS_BINSORT|MY_CS_STRNXFRM|MY_CS_UNICODE| MY_CS_UNICODE_SUPPLEMENT|MY_CS_NOPAD, /* state */ - MY_UTF8MB4, /* cs name */ + charset_name_utf8mb4, /* cs name */ MY_UTF8MB4_NOPAD_BIN, /* name */ "UTF-8 Unicode", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype-win1250ch.c b/strings/ctype-win1250ch.c index f33a83294d6..643c7a2a583 100644 --- a/strings/ctype-win1250ch.c +++ b/strings/ctype-win1250ch.c @@ -52,6 +52,7 @@ #ifdef HAVE_CHARSET_cp1250 +const char charset_name_cp1250[]= "cp1250"; static const uint16 tab_cp1250_uni[256]={ 0,0x0001,0x0002,0x0003,0x0004,0x0005,0x0006,0x0007, @@ -690,7 +691,7 @@ struct charset_info_st my_charset_cp1250_czech_ci = 34,0,0, /* number */ MY_CS_COMPILED|MY_CS_STRNXFRM|MY_CS_CSSORT| MY_CS_STRNXFRM_BAD_NWEIGHTS|MY_CS_NON1TO1, /* state */ - "cp1250", /* cs name */ + charset_name_cp1250, /* cs name */ "cp1250_czech_cs", /* name */ "", /* comment */ NULL, /* tailoring */ diff --git a/strings/ctype.c b/strings/ctype.c index 4df9b9c2f09..c9977824176 100644 --- a/strings/ctype.c +++ b/strings/ctype.c @@ -36,6 +36,12 @@ */ +const char charset_name_latin2[]= "latin2"; +const char charset_name_utf8[]= "utf8"; +const char charset_name_utf16[]= "utf16"; +const char charset_name_utf32[]= "utf32"; +const char charset_name_ucs2[]= "ucs2"; +const char charset_name_utf8mb4[]= "utf8mb4"; /* Avoid using my_snprintf diff --git a/strings/strings_def.h b/strings/strings_def.h index d4f51bcd0a5..111942a9a1a 100644 --- a/strings/strings_def.h +++ b/strings/strings_def.h @@ -130,4 +130,13 @@ int my_wc_to_printable_generic(CHARSET_INFO *cs, my_wc_t wc, int my_wc_to_printable_8bit(CHARSET_INFO *cs, my_wc_t wc, uchar *s, uchar *e); +/* Some common character set names */ +extern const char charset_name_latin2[]; +extern const char charset_name_utf8[]; +extern const char charset_name_utf16[]; +extern const char charset_name_utf32[]; +extern const char charset_name_ucs2[]; +extern const char charset_name_ucs2[]; +extern const char charset_name_utf8mb4[]; + #endif /*STRINGS_DEF_INCLUDED */ From ce699df9050cb5c906f9382b57ea1dc928b4e6fd Mon Sep 17 00:00:00 2001 From: Monty Date: Wed, 22 Jul 2020 17:57:07 +0300 Subject: [PATCH 101/188] thd->m_transaction_psi was not properly cleared for new connections This happend when using XA transactions. I also added some extra asserts to ensure that m_transactions are properly cleared. Other things: - Removed set_time() from THD::init_for_queries() as dispatch_command() is already doing that. - Removed duplicate init_for_queries() from prepare_new_connection_state(). The init_for_queries() functions should only be called once per connection. --- sql/handler.cc | 4 ++++ sql/sql_class.cc | 9 +++++++-- sql/sql_connect.cc | 1 - sql/xa.cc | 1 + 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/sql/handler.cc b/sql/handler.cc index 48bae864125..58f1c60edf9 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1818,6 +1818,10 @@ err: ha_rollback_trans(thd, all); else { + /* + We are not really doing a rollback here, but the code in trans_commit() + requres that m_transaction_psi is 0 when we return from this function. + */ MYSQL_ROLLBACK_TRANSACTION(thd->m_transaction_psi); thd->m_transaction_psi= NULL; WSREP_DEBUG("rollback skipped %p %d",thd->rgi_slave, diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 484c90d706b..a900e485cd7 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -1396,9 +1396,11 @@ void THD::update_all_stats() void THD::init_for_queries() { - set_time(); - ha_enable_transaction(this,TRUE); + DBUG_ASSERT(transaction->on); + DBUG_ASSERT(m_transaction_psi == NULL); + /* Set time for --init-file queries */ + set_time(); reset_root_defaults(mem_root, variables.query_alloc_block_size, variables.query_prealloc_size); reset_root_defaults(&transaction->mem_root, @@ -1550,6 +1552,8 @@ void THD::cleanup(void) trans_rollback(this); DBUG_ASSERT(open_tables == NULL); + DBUG_ASSERT(m_transaction_psi == NULL); + /* If the thread was in the middle of an ongoing transaction (rolled back a few lines above) or under LOCK TABLES (unlocked the tables @@ -1650,6 +1654,7 @@ void THD::reset_for_reuse() abort_on_warning= 0; free_connection_done= 0; m_command= COM_CONNECT; + transaction->on= 1; #if defined(ENABLED_PROFILING) profiling.reset(); #endif diff --git a/sql/sql_connect.cc b/sql/sql_connect.cc index 420a054a1b2..83f4de1b5df 100644 --- a/sql/sql_connect.cc +++ b/sql/sql_connect.cc @@ -1279,7 +1279,6 @@ void prepare_new_connection_state(THD* thd) } thd->proc_info=0; - thd->init_for_queries(); } } diff --git a/sql/xa.cc b/sql/xa.cc index 7d6d7187bce..e8e6dc43c56 100644 --- a/sql/xa.cc +++ b/sql/xa.cc @@ -843,6 +843,7 @@ bool trans_xa_detach(THD *thd) thd->transaction->all.ha_list= 0; thd->transaction->all.no_2pc= 0; + thd->m_transaction_psi= 0; return false; } From a8d5f57e9a362aa7db4c4f178a2e3d4590a6b3d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Thu, 23 Jul 2020 11:34:01 +0300 Subject: [PATCH 102/188] Fix test cases Changes to be committed: modified: mysql-test/suite/galera_3nodes/t/GCF-354.test modified: mysql-test/suite/galera_3nodes/t/inconsistency_shutdown.test --- mysql-test/suite/galera_3nodes/t/GCF-354.test | 9 +++++++++ .../suite/galera_3nodes/t/inconsistency_shutdown.test | 3 +++ 2 files changed, 12 insertions(+) diff --git a/mysql-test/suite/galera_3nodes/t/GCF-354.test b/mysql-test/suite/galera_3nodes/t/GCF-354.test index f48d9fbc72a..c428aee7732 100644 --- a/mysql-test/suite/galera_3nodes/t/GCF-354.test +++ b/mysql-test/suite/galera_3nodes/t/GCF-354.test @@ -9,6 +9,13 @@ DROP SCHEMA test; --connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 --connection node_3 + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--let $node_3=node_3 +--source ../galera/include/auto_increment_offset_save.inc + SET wsrep_on=OFF; CREATE TABLE test.t1 (f1 INTEGER); # @@ -90,3 +97,5 @@ CALL mtr.add_suppression("Query apply failed"); CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on .*"); CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown"); +--source ../galera/include/auto_increment_offset_restore.inc + diff --git a/mysql-test/suite/galera_3nodes/t/inconsistency_shutdown.test b/mysql-test/suite/galera_3nodes/t/inconsistency_shutdown.test index 4ce485308a3..7add9f48cfc 100644 --- a/mysql-test/suite/galera_3nodes/t/inconsistency_shutdown.test +++ b/mysql-test/suite/galera_3nodes/t/inconsistency_shutdown.test @@ -5,6 +5,9 @@ --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source ../galera/include/galera_have_debug_sync.inc # Save original auto_increment_offset values. --let $node_1=node_1 From a18639f1a913b446f32d7fbe531aa0d5782cf720 Mon Sep 17 00:00:00 2001 From: Varun Gupta Date: Thu, 23 Jul 2020 15:30:29 +0530 Subject: [PATCH 103/188] MDEV-23216: LONGTEXT column with collation doesn't sort An overflow was happening with LONGTEXT columns, when the length was converted to the length in the strxfrm form (mem-comparable keys). Introduced a function to truncate the length to the max_sort_length before calculating the length of the strxfrm form. --- mysql-test/main/order_by.result | 18 ++++++++++++++++++ mysql-test/main/order_by.test | 10 ++++++++++ sql/filesort.cc | 16 +++++++++++----- sql/sql_class.h | 1 + 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/mysql-test/main/order_by.result b/mysql-test/main/order_by.result index dd04ae42e5a..f1a6cb086b8 100644 --- a/mysql-test/main/order_by.result +++ b/mysql-test/main/order_by.result @@ -4079,4 +4079,22 @@ COUNT(DISTINCT a) 34 SET @@tmp_memory_table_size= @save_tmp_memory_table_size; DROP TABLE t1; +# +# MDEV-23216: LONGTEXT column with collation doesn't sort +# +CREATE TABLE t1 (a LONGTEXT COLLATE utf8mb4_swedish_ci); +INSERT INTO t1 VALUES ('A'),('Z'),('B'),('Y'); +SELECT * FROM t1 ORDER BY a; +a +A +B +Y +Z +SELECT * FROM t1 ORDER BY a DESC; +a +Z +Y +B +A +DROP TABLE t1; # End of 10.5 tests diff --git a/mysql-test/main/order_by.test b/mysql-test/main/order_by.test index 8398246cae9..e27822006b5 100644 --- a/mysql-test/main/order_by.test +++ b/mysql-test/main/order_by.test @@ -2522,5 +2522,15 @@ SELECT COUNT(DISTINCT a) FROM t1; SET @@tmp_memory_table_size= @save_tmp_memory_table_size; DROP TABLE t1; +--echo # +--echo # MDEV-23216: LONGTEXT column with collation doesn't sort +--echo # + +CREATE TABLE t1 (a LONGTEXT COLLATE utf8mb4_swedish_ci); +INSERT INTO t1 VALUES ('A'),('Z'),('B'),('Y'); +SELECT * FROM t1 ORDER BY a; +SELECT * FROM t1 ORDER BY a DESC; + +DROP TABLE t1; --echo # End of 10.5 tests diff --git a/sql/filesort.cc b/sql/filesort.cc index 3f99bebd0cc..5a07b8596bd 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -2102,9 +2102,7 @@ Type_handler_string_result::sort_length(THD *thd, SORT_FIELD_ATTR *sortorder) const { CHARSET_INFO *cs; - sortorder->length= item->max_length; - set_if_smaller(sortorder->length, thd->variables.max_sort_length); - sortorder->original_length= item->max_length; + sortorder->set_length_and_original_length(thd, item->max_length); if (use_strnxfrm((cs= item->collation.collation))) { @@ -2211,9 +2209,9 @@ sortlength(THD *thd, Sort_keys *sort_keys, bool *allow_packing_for_sortkeys) { Field *field= sortorder->field; CHARSET_INFO *cs= sortorder->field->sort_charset(); - sortorder->length= sortorder->field->sort_length(); + sortorder->set_length_and_original_length(thd, field->sort_length()); + sortorder->suffix_length= sortorder->field->sort_suffix_length(); - sortorder->original_length= sortorder->length; sortorder->type= field->is_packable() ? SORT_FIELD_ATTR::VARIABLE_SIZE : SORT_FIELD_ATTR::FIXED_SIZE; @@ -2748,6 +2746,14 @@ bool SORT_FIELD_ATTR::check_if_packing_possible(THD *thd) const } +void SORT_FIELD_ATTR::set_length_and_original_length(THD *thd, uint length_arg) +{ + length= length_arg; + set_if_smaller(length, thd->variables.max_sort_length); + original_length= length_arg; +} + + /* Compare function used for packing sort keys */ diff --git a/sql/sql_class.h b/sql/sql_class.h index 36f98ce1a66..08e5af289f3 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -6454,6 +6454,7 @@ struct SORT_FIELD_ATTR uchar *b, size_t *b_len); bool check_if_packing_possible(THD *thd) const; bool is_variable_sized() { return type == VARIABLE_SIZE; } + void set_length_and_original_length(THD *thd, uint length_arg); }; From fe39d02f51b96536dccca7ff89faf05e13548877 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Thu, 23 Jul 2020 16:23:20 +0530 Subject: [PATCH 104/188] MDEV-20638 Remove the deadcode from srv_master_thread() and srv_active_wake_master_thread_low() - Due to commit fe95cb2e40d73adbbe88efa0e7f48c055ccd042f (MDEV-16125), InnoDB master thread does not need to call srv_resume_thread() and therefore there is no need to wake up the thread. Due to the above patch, InnoDB should remove the following dead code. srv_check_activity(): Makes the parameter as in,out and returns the recent activity value innobase_active_small(): Removed srv_active_wake_master_thread(): Removed srv_wake_master_thread(): Removed srv_active_wake_master_thread_low(): Removed Simplify srv_master_thread() and remove switch cases, added the assert. Replace srv_wake_master_thread() with srv_inc_activity_count() INNOBASE_WAKE_INTERVAL: Removed --- extra/mariabackup/xtrabackup.cc | 6 -- storage/innobase/buf/buf0flu.cc | 4 +- storage/innobase/handler/ha_innodb.cc | 48 ----------- storage/innobase/handler/handler0alter.cc | 5 -- storage/innobase/include/srv0srv.h | 25 ++---- storage/innobase/row/row0mysql.cc | 2 +- storage/innobase/row/row0trunc.cc | 2 +- storage/innobase/srv/srv0srv.cc | 100 +++++----------------- storage/innobase/srv/srv0start.cc | 4 +- storage/innobase/trx/trx0roll.cc | 3 - storage/innobase/trx/trx0trx.cc | 6 -- 11 files changed, 35 insertions(+), 170 deletions(-) diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index b1120ba29f7..02d232b59d6 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -254,12 +254,6 @@ my_bool innobase_locks_unsafe_for_binlog; my_bool innobase_rollback_on_timeout; my_bool innobase_create_status_file; -/* The following counter is used to convey information to InnoDB -about server activity: in selects it is not sensible to call -srv_active_wake_master_thread after each fetch or search, we only do -it every INNOBASE_WAKE_INTERVAL'th step. */ - -#define INNOBASE_WAKE_INTERVAL 32 ulong innobase_active_counter = 0; diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 26610337d0d..84f95f4b5ec 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -3141,7 +3141,7 @@ DECLARE_THREAD(buf_flush_page_cleaner_coordinator)(void*) /* The page_cleaner skips sleep if the server is idle and there are no pending IOs in the buffer pool and there is work to do. */ - if (srv_check_activity(last_activity) + if (srv_check_activity(&last_activity) || buf_get_n_pending_read_ios() || n_flushed == 0) { @@ -3233,7 +3233,7 @@ DECLARE_THREAD(buf_flush_page_cleaner_coordinator)(void*) n_flushed = n_flushed_lru + n_flushed_list; - } else if (srv_check_activity(last_activity)) { + } else if (srv_check_activity(&last_activity)) { ulint n_to_flush; lsn_t lsn_limit = 0; diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index bb648d99777..3d303889a53 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -446,14 +446,6 @@ static TYPELIB innodb_lock_schedule_algorithm_typelib = { NULL }; -/* The following counter is used to convey information to InnoDB -about server activity: in case of normal DML ops it is not -sensible to call srv_active_wake_master_thread after each -operation, we only do it every INNOBASE_WAKE_INTERVAL'th step. */ - -#define INNOBASE_WAKE_INTERVAL 32 -static ulong innobase_active_counter = 0; - /** Allowed values of innodb_change_buffering */ static const char* innobase_change_buffering_values[IBUF_USE_COUNT] = { "none", /* IBUF_USE_NONE */ @@ -1893,23 +1885,6 @@ thd_to_trx_id( } #endif /* WITH_WSREP */ -/********************************************************************//** -Increments innobase_active_counter and every INNOBASE_WAKE_INTERVALth -time calls srv_active_wake_master_thread. This function should be used -when a single database operation may introduce a small need for -server utility activity, like checkpointing. */ -inline -void -innobase_active_small(void) -/*=======================*/ -{ - innobase_active_counter++; - - if ((innobase_active_counter % INNOBASE_WAKE_INTERVAL) == 0) { - srv_active_wake_master_thread(); - } -} - /********************************************************************//** Converts an InnoDB error code to a MySQL error code and also tells to MySQL about a possible transaction rollback inside InnoDB caused by a lock wait @@ -6655,11 +6630,6 @@ ha_innobase::close() MONITOR_INC(MONITOR_TABLE_CLOSE); - /* Tell InnoDB server that there might be work for - utility threads: */ - - srv_active_wake_master_thread(); - DBUG_RETURN(0); } @@ -8374,8 +8344,6 @@ report_error: } func_exit: - innobase_active_small(); - DBUG_RETURN(error_result); } @@ -9046,11 +9014,6 @@ func_exit: error, m_prebuilt->table->flags, m_user_thd); } - /* Tell InnoDB server that there might be work for - utility threads: */ - - innobase_active_small(); - #ifdef WITH_WSREP if (error == DB_SUCCESS && trx->is_wsrep() && wsrep_thd_exec_mode(m_user_thd) == LOCAL_STATE && @@ -9106,11 +9069,6 @@ ha_innobase::delete_row( innobase_srv_conc_exit_innodb(m_prebuilt); - /* Tell the InnoDB server that there might be work for - utility threads: */ - - innobase_active_small(); - #ifdef WITH_WSREP if (error == DB_SUCCESS && trx->is_wsrep() && wsrep_thd_exec_mode(m_user_thd) == LOCAL_STATE @@ -12998,7 +12956,6 @@ create_table_info_t::create_table_update_dict() if (m_flags2 & DICT_TF2_FTS) { if (!innobase_fts_load_stopword(innobase_table, NULL, m_thd)) { dict_table_close(innobase_table, FALSE, FALSE); - srv_active_wake_master_thread(); trx_free_for_mysql(m_trx); DBUG_RETURN(-1); } @@ -13144,11 +13101,6 @@ ha_innobase::create( error = info.create_table_update_dict(); - /* Tell the InnoDB server that there might be work for - utility threads: */ - - srv_active_wake_master_thread(); - DBUG_RETURN(error); } diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index db161ba50d8..782b0d9efb2 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -8637,11 +8637,6 @@ foreign_fail: log_append_on_checkpoint(NULL); - /* Tell the InnoDB server that there might be work for - utility threads: */ - - srv_active_wake_master_thread(); - if (fail) { for (inplace_alter_handler_ctx** pctx = ctx_array; *pctx; pctx++) { diff --git a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h index 5214953f308..20130541d60 100644 --- a/storage/innobase/include/srv0srv.h +++ b/storage/innobase/include/srv0srv.h @@ -809,19 +809,6 @@ srv_reset_io_thread_op_info(); /** Wake up the purge threads if there is work to do. */ void srv_wake_purge_thread_if_not_active(); -/** Wake up the InnoDB master thread if it was suspended (not sleeping). */ -void -srv_active_wake_master_thread_low(); - -#define srv_active_wake_master_thread() \ - do { \ - if (!srv_read_only_mode) { \ - srv_active_wake_master_thread_low(); \ - } \ - } while (0) -/** Wake up the master thread if it is suspended or being suspended. */ -void -srv_wake_master_thread(); /******************************************************************//** Outputs to a file the output of the InnoDB Monitor. @@ -850,13 +837,13 @@ reading this value as it is only used in heuristics. ulint srv_get_activity_count(void); /*========================*/ -/*******************************************************************//** -Check if there has been any activity. + +/** Check if there has been any activity. +@param[in,out] activity_count recent activity count to be returned +if there is a change @return FALSE if no change in activity counter. */ -ibool -srv_check_activity( -/*===============*/ - ulint old_activity_count); /*!< old activity count */ +bool srv_check_activity(ulint *activity_count); + /******************************************************************//** Increment the server activity counter. */ void diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index b304c03f7ed..7c61ad9b45b 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -3820,7 +3820,7 @@ funct_exit: trx->op_info = ""; - srv_wake_master_thread(); + srv_inc_activity_count(); DBUG_RETURN(err); } diff --git a/storage/innobase/row/row0trunc.cc b/storage/innobase/row/row0trunc.cc index 618e161bee4..209767d0fe1 100644 --- a/storage/innobase/row/row0trunc.cc +++ b/storage/innobase/row/row0trunc.cc @@ -1249,7 +1249,7 @@ row_truncate_complete( ut_ad(!trx_is_started(trx)); - srv_wake_master_thread(); + srv_inc_activity_count(); DBUG_EXECUTE_IF("ib_trunc_crash_after_truncate_done", DBUG_SUICIDE();); diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index f1216dcd51e..6bf8e3dd8f6 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -1982,33 +1982,6 @@ srv_get_active_thread_type(void) return(ret); } -/** Wake up the InnoDB master thread if it was suspended (not sleeping). */ -void -srv_active_wake_master_thread_low() -{ - ut_ad(!srv_read_only_mode); - ut_ad(!srv_sys_mutex_own()); - - srv_inc_activity_count(); - - if (my_atomic_loadlint(&srv_sys.n_threads_active[SRV_MASTER]) == 0) { - srv_slot_t* slot; - - srv_sys_mutex_enter(); - - slot = &srv_sys.sys_threads[SRV_MASTER_SLOT]; - - /* Only if the master thread has been started. */ - - if (slot->in_use) { - ut_a(srv_slot_get_type(slot) == SRV_MASTER); - os_event_set(slot->event); - } - - srv_sys_mutex_exit(); - } -} - /** Wake up the purge threads if there is work to do. */ void srv_wake_purge_thread_if_not_active() @@ -2023,14 +1996,6 @@ srv_wake_purge_thread_if_not_active() } } -/** Wake up the master thread if it is suspended or being suspended. */ -void -srv_wake_master_thread() -{ - srv_inc_activity_count(); - srv_release_threads(SRV_MASTER, 1); -} - /*******************************************************************//** Get current server activity count. We don't hold srv_sys::mutex while reading this value as it is only used in heuristics. @@ -2042,15 +2007,20 @@ srv_get_activity_count(void) return(srv_sys.activity_count); } -/*******************************************************************//** -Check if there has been any activity. +/** Check if there has been any activity. +@param[in,out] activity_count recent activity count to be returned +if there is a change @return FALSE if no change in activity counter. */ -ibool -srv_check_activity( -/*===============*/ - ulint old_activity_count) /*!< in: old activity count */ +bool srv_check_activity(ulint *activity_count) { - return(srv_sys.activity_count != old_activity_count); + ulint new_activity_count= srv_sys.activity_count; + if (new_activity_count != *activity_count) + { + *activity_count= new_activity_count; + return true; + } + + return false; } /********************************************************************//** @@ -2457,52 +2427,30 @@ DECLARE_THREAD(srv_master_thread)( slot = srv_reserve_slot(SRV_MASTER); ut_a(slot == srv_sys.sys_threads); -loop: while (srv_shutdown_state <= SRV_SHUTDOWN_INITIATED) { srv_master_sleep(); MONITOR_INC(MONITOR_MASTER_THREAD_SLEEP); - if (srv_check_activity(old_activity_count)) { - old_activity_count = srv_get_activity_count(); + if (srv_check_activity(&old_activity_count)) { srv_master_do_active_tasks(); } else { srv_master_do_idle_tasks(); } } - switch (srv_shutdown_state) { - case SRV_SHUTDOWN_NONE: - case SRV_SHUTDOWN_INITIATED: - break; - case SRV_SHUTDOWN_FLUSH_PHASE: - case SRV_SHUTDOWN_LAST_PHASE: - ut_ad(0); - /* fall through */ - case SRV_SHUTDOWN_EXIT_THREADS: - /* srv_init_abort() must have been invoked */ - case SRV_SHUTDOWN_CLEANUP: - if (srv_shutdown_state == SRV_SHUTDOWN_CLEANUP - && srv_fast_shutdown < 2) { - srv_shutdown(srv_fast_shutdown == 0); - } - srv_suspend_thread(slot); - my_thread_end(); - os_thread_exit(); + ut_ad(srv_shutdown_state == SRV_SHUTDOWN_EXIT_THREADS + || srv_shutdown_state == SRV_SHUTDOWN_CLEANUP); + + if (srv_shutdown_state == SRV_SHUTDOWN_CLEANUP + && srv_fast_shutdown < 2) { + srv_shutdown(srv_fast_shutdown == 0); } - srv_main_thread_op_info = "suspending"; - srv_suspend_thread(slot); - - /* DO NOT CHANGE THIS STRING. innobase_start_or_create_for_mysql() - waits for database activity to die down when converting < 4.1.x - databases, and relies on this string being exactly as it is. InnoDB - manual also mentions this string in several places. */ - srv_main_thread_op_info = "waiting for server activity"; - - srv_resume_thread(slot); - goto loop; + my_thread_end(); + os_thread_exit(); + OS_THREAD_DUMMY_RETURN; } /** Check if purge should stop. @@ -2699,15 +2647,13 @@ srv_do_purge(ulint* n_total_purged ++n_use_threads; } - } else if (srv_check_activity(old_activity_count) + } else if (srv_check_activity(&old_activity_count) && n_use_threads > 1) { /* History length same or smaller since last snapshot, use fewer threads. */ --n_use_threads; - - old_activity_count = srv_get_activity_count(); } /* Ensure that the purge threads are less than what diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index 0d8ebbe98cd..a8f2b78d0a8 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -1238,7 +1238,7 @@ srv_shutdown_all_bg_threads() if (srv_start_state_is_set(SRV_START_STATE_MASTER)) { /* c. We wake the master thread so that it exits */ - srv_wake_master_thread(); + srv_inc_activity_count(); } if (srv_start_state_is_set(SRV_START_STATE_PURGE)) { @@ -2762,7 +2762,7 @@ srv_shutdown_bg_undo_sources() fts_optimize_shutdown(); dict_stats_shutdown(); while (row_get_background_drop_list_len_low()) { - srv_wake_master_thread(); + srv_inc_activity_count(); os_thread_yield(); } srv_undo_sources = false; diff --git a/storage/innobase/trx/trx0roll.cc b/storage/innobase/trx/trx0roll.cc index 127cfc9b07d..de749f993e7 100644 --- a/storage/innobase/trx/trx0roll.cc +++ b/storage/innobase/trx/trx0roll.cc @@ -124,9 +124,6 @@ trx_rollback_to_savepoint_low( mem_heap_free(heap); - /* There might be work for utility threads.*/ - srv_active_wake_master_thread(); - MONITOR_DEC(MONITOR_TRX_ACTIVE); } diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index d4cd020b321..0dbd985b6c3 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -1804,12 +1804,6 @@ trx_commit_in_memory( } trx->commit_lsn = lsn; - - /* Tell server some activity has happened, since the trx - does changes something. Background utility threads like - master thread, purge thread or page_cleaner thread might - have some work to do. */ - srv_active_wake_master_thread(); } ut_ad(!trx->rsegs.m_noredo.undo); From c76b45a5242f50d00c16f0bbf1dbecd4e359e02c Mon Sep 17 00:00:00 2001 From: Tzachi Zidenberg Date: Mon, 6 Jul 2020 13:43:30 +0300 Subject: [PATCH 105/188] MDEV-23249: Support aarch64 architecture timer aarch64 timer is available to userspace via arch register. clang's __builtin_readcyclecounter is wrong for aarch64 (reads the PMU cycle counter instead of the archi-timer register), so we don't use it. my_rdtsc unit-test on AWS m6g shows: frequency: 121830845 resolution: 1 overhead: 1 This counter is not strictly increasing, but it is non-decreasing. --- include/my_rdtsc.h | 14 ++++++++++++-- mysys/my_rdtsc.c | 2 ++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/include/my_rdtsc.h b/include/my_rdtsc.h index a2e5afcb79f..33d722764d4 100644 --- a/include/my_rdtsc.h +++ b/include/my_rdtsc.h @@ -77,7 +77,7 @@ C_MODE_START /** A cycle timer. - On clang, we use __builtin_readcyclecounter(). + On clang we use __builtin_readcyclecounter(), except for AARCH64. On other compilers: On IA-32 and AMD64, we use the RDTSC instruction. @@ -88,6 +88,9 @@ C_MODE_START On IBM S/390 System z we use the STCK instruction. On ARM, we probably should use the Generic Timer, but should figure out how to ensure that it can be accessed. + On AARCH64, we use the generic timer base register. We override clang + implementation for aarch64 as it access a PMU register which is not + guarenteed to be active. Sadly, we have nothing for the Digital Alpha, MIPS, Motorola m68k, HP PA-RISC or other non-mainstream (or obsolete) processors. @@ -125,7 +128,7 @@ C_MODE_START */ static inline ulonglong my_timer_cycles(void) { -# if __has_builtin(__builtin_readcyclecounter) +# if __has_builtin(__builtin_readcyclecounter) && !defined (__aarch64__) return __builtin_readcyclecounter(); # elif defined _WIN32 || defined __i386__ || defined __x86_64__ return __rdtsc(); @@ -164,6 +167,12 @@ static inline ulonglong my_timer_cycles(void) __asm__ __volatile__ ("stck %0" : "=Q" (result) : : "cc"); return result; } +#elif defined(__GNUC__) && defined (__aarch64__) + { + ulonglong result; + __asm __volatile("mrs %0, CNTVCT_EL0" : "=&r" (result)); + return result; + } #elif defined(HAVE_SYS_TIMES_H) && defined(HAVE_GETHRTIME) /* gethrtime may appear as either cycle or nanosecond counter */ return (ulonglong) gethrtime(); @@ -221,6 +230,7 @@ C_MODE_END #define MY_TIMER_ROUTINE_MACH_ABSOLUTE_TIME 25 #define MY_TIMER_ROUTINE_GETSYSTEMTIMEASFILETIME 26 #define MY_TIMER_ROUTINE_ASM_S390 28 +#define MY_TIMER_ROUTINE_AARCH64 29 #endif diff --git a/mysys/my_rdtsc.c b/mysys/my_rdtsc.c index dce3ca2be3b..2d93239f7dd 100644 --- a/mysys/my_rdtsc.c +++ b/mysys/my_rdtsc.c @@ -362,6 +362,8 @@ void my_timer_init(MY_TIMER_INFO *mti) mti->cycles.routine= MY_TIMER_ROUTINE_ASM_GCC_SPARC32; #elif defined(__GNUC__) && defined(__s390__) mti->cycles.routine= MY_TIMER_ROUTINE_ASM_S390; +#elif defined(__GNUC__) && defined (__aarch64__) + mti->cycles.routine= MY_TIMER_ROUTINE_AARCH64; #elif defined(HAVE_SYS_TIMES_H) && defined(HAVE_GETHRTIME) mti->cycles.routine= MY_TIMER_ROUTINE_GETHRTIME; #else From f843e215f3f640de377d8fd60e85bb372fb138fd Mon Sep 17 00:00:00 2001 From: Tzachi Zidenberg Date: Sun, 5 Jul 2020 15:21:43 +0300 Subject: [PATCH 106/188] aarch64: use compiler flag outline-atomics if available outline-atomics compilation flag changes behaviour of builtin_atomics, by adding runtime detection of LSE atomics. If these are supported, they will be used. This gains LSE atomics use without hurting compatibility with older aarch64 machines. --- configure.cmake | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/configure.cmake b/configure.cmake index 43c32fda0ee..5dd45a6b05d 100644 --- a/configure.cmake +++ b/configure.cmake @@ -69,6 +69,11 @@ IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686" AND CMAKE_COMPILER_IS_GNUCC AND SET(PLUGIN_QUERY_RESPONSE_TIME NO CACHE BOOL "Disabled, gcc is too old") ENDIF() +# use runtime atomic-support detection in aarch64 +IF(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") + MY_CHECK_AND_SET_COMPILER_FLAG("-moutline-atomics") +ENDIF() + IF(WITHOUT_DYNAMIC_PLUGINS) MESSAGE("Dynamic plugins are disabled.") ENDIF(WITHOUT_DYNAMIC_PLUGINS) From 1656ea28e8e49318b34e98ffa408d891a451c3f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Thu, 23 Jul 2020 17:41:44 +0300 Subject: [PATCH 107/188] =?UTF-8?q?MDEV-23244=20ALTER=20TABLE=E2=80=A6ADD?= =?UTF-8?q?=20PRIMARY=20KEY=20fails=20to=20flag=20duplicates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The fix of MDEV-13654 (commit ff81faf670e083e1da4f3e7bce33fe9104410b2c) wrongly caused ADD PRIMARY KEY to ignore duplicate PRIMARY KEY values caused by concurrent DML transactions that had been started before the ALTER TABLE operation (but did not access the table before the ALTER TABLE started). row_ins_duplicate_online(): Always report a duplicate key error if DB_TRX_ID had been reset (it belongs to a transaction that had started before the ALTER TABLE operation). --- .../suite/innodb/r/alter_primary_key.result | 26 ++++++++++++++ .../suite/innodb/t/alter_primary_key.test | 34 +++++++++++++++++++ storage/innobase/row/row0ins.cc | 10 ++++-- 3 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 mysql-test/suite/innodb/r/alter_primary_key.result create mode 100644 mysql-test/suite/innodb/t/alter_primary_key.test diff --git a/mysql-test/suite/innodb/r/alter_primary_key.result b/mysql-test/suite/innodb/r/alter_primary_key.result new file mode 100644 index 00000000000..afe687871f3 --- /dev/null +++ b/mysql-test/suite/innodb/r/alter_primary_key.result @@ -0,0 +1,26 @@ +# +# MDEV-23244 ALTER TABLE…ADD PRIMARY KEY fails to flag +# duplicate key error from concurrent DML +# +CREATE TABLE t0 (pk INT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t1 (c CHAR(2) NOT NULL) ENGINE=InnoDB; +connect con1,localhost,root,,; +BEGIN; +INSERT INTO t0 VALUES(1); +connection default; +SET DEBUG_SYNC='row_log_table_apply1_before SIGNAL dml WAIT_FOR dml_done'; +ALTER TABLE t1 ADD PRIMARY KEY(c(1)); +connection con1; +SET DEBUG_SYNC='now WAIT_FOR dml'; +INSERT INTO t1 VALUES ('ab'),('ac'); +COMMIT; +SET DEBUG_SYNC='now SIGNAL dml_done'; +disconnect con1; +connection default; +ERROR 23000: Duplicate entry 'a' for key 'PRIMARY' +SET DEBUG_SYNC='RESET'; +SELECT * FROM t1; +c +ab +ac +DROP TABLE t0,t1; diff --git a/mysql-test/suite/innodb/t/alter_primary_key.test b/mysql-test/suite/innodb/t/alter_primary_key.test new file mode 100644 index 00000000000..4edc0cc023e --- /dev/null +++ b/mysql-test/suite/innodb/t/alter_primary_key.test @@ -0,0 +1,34 @@ +--source innodb_default_row_format.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +--echo # +--echo # MDEV-23244 ALTER TABLE…ADD PRIMARY KEY fails to flag +--echo # duplicate key error from concurrent DML +--echo # + +CREATE TABLE t0 (pk INT PRIMARY KEY) ENGINE=InnoDB; +CREATE TABLE t1 (c CHAR(2) NOT NULL) ENGINE=InnoDB; + +connect (con1,localhost,root,,); +BEGIN; +INSERT INTO t0 VALUES(1); + +connection default; +SET DEBUG_SYNC='row_log_table_apply1_before SIGNAL dml WAIT_FOR dml_done'; +send ALTER TABLE t1 ADD PRIMARY KEY(c(1)); + +connection con1; +SET DEBUG_SYNC='now WAIT_FOR dml'; +INSERT INTO t1 VALUES ('ab'),('ac'); +COMMIT; +SET DEBUG_SYNC='now SIGNAL dml_done'; +disconnect con1; + +connection default; +--error ER_DUP_ENTRY +reap; +SET DEBUG_SYNC='RESET'; + +SELECT * FROM t1; +DROP TABLE t0,t1; diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index d6596d586ab..13649777419 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -2241,8 +2241,14 @@ row_ins_duplicate_online( return(DB_SUCCESS); } - if (fields == n_uniq + 2) { - /* rec is an exact match of entry. */ + ulint trx_id_len; + + if (fields == n_uniq + 2 + && memcmp(rec_get_nth_field(rec, offsets, n_uniq, &trx_id_len), + reset_trx_id, DATA_TRX_ID_LEN + DATA_ROLL_PTR_LEN)) { + ut_ad(trx_id_len == DATA_TRX_ID_LEN); + /* rec is an exact match of entry, and DB_TRX_ID belongs + to a transaction that started after our ALTER TABLE. */ return(DB_SUCCESS_LOCKED_REC); } From b3b1c51e4de0866bd1baae888eacb86c2d3b3698 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Thu, 23 Jul 2020 20:43:09 +0530 Subject: [PATCH 108/188] MDEV-23134 SEGV in dict_load_table_one during restart after server crash Problem: ======== dict_load_table_one() doesn't handle the scenario where clustered index page is FIL_NULL when DICT_ERR_IGNORE_INDEX_ROOT mode is set. Fix: ==== InnoDB should set the file_unreadable when it can't find the clustered index root page. --- storage/innobase/dict/dict0dict.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/storage/innobase/dict/dict0dict.cc b/storage/innobase/dict/dict0dict.cc index 5fb6f676e80..84478d7528b 100644 --- a/storage/innobase/dict/dict0dict.cc +++ b/storage/innobase/dict/dict0dict.cc @@ -5804,6 +5804,7 @@ dict_set_corrupted_index_cache_only( is corrupted */ if (dict_index_is_clust(index)) { index->table->corrupted = TRUE; + index->table->file_unreadable = true; } index->type |= DICT_CORRUPT; From ba23e6d76fde4abdb6666e8d78af98ce6d2414e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Thu, 23 Jul 2020 08:59:18 +0300 Subject: [PATCH 109/188] MDEV-18177 : Galera test failure on galera_autoinc_sst_mariabackup Add wait_condition --- mysql-test/suite/galera/include/galera_st_clean_slave.inc | 6 ++++++ .../suite/galera/include/galera_st_disconnect_slave.inc | 6 ++++++ mysql-test/suite/galera/include/galera_st_kill_slave.inc | 6 ++++++ .../suite/galera/include/galera_st_kill_slave_ddl.inc | 5 +++++ .../suite/galera/include/galera_st_shutdown_slave.inc | 6 ++++++ 5 files changed, 29 insertions(+) diff --git a/mysql-test/suite/galera/include/galera_st_clean_slave.inc b/mysql-test/suite/galera/include/galera_st_clean_slave.inc index 3a49f4f6ad2..44cbf67fd12 100644 --- a/mysql-test/suite/galera/include/galera_st_clean_slave.inc +++ b/mysql-test/suite/galera/include/galera_st_clean_slave.inc @@ -102,12 +102,18 @@ INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); ROLLBACK; +--let $wait_condition = SELECT COUNT(*)=35 FROM t1 +--source include/wait_condition.inc + SELECT COUNT(*) = 35 FROM t1; SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; COMMIT; SET AUTOCOMMIT=ON; --connection node_1 +--let $wait_condition = SELECT COUNT(*)=35 FROM t1 +--source include/wait_condition.inc + SELECT COUNT(*) = 35 FROM t1; SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; DROP TABLE t1; diff --git a/mysql-test/suite/galera/include/galera_st_disconnect_slave.inc b/mysql-test/suite/galera/include/galera_st_disconnect_slave.inc index c8869746bd1..4674fc7867f 100644 --- a/mysql-test/suite/galera/include/galera_st_disconnect_slave.inc +++ b/mysql-test/suite/galera/include/galera_st_disconnect_slave.inc @@ -92,12 +92,18 @@ INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); ROLLBACK; +--let $wait_condition = SELECT COUNT(*)=35 FROM t1 +--source include/wait_condition.inc + SELECT COUNT(*) = 35 FROM t1; SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; COMMIT; SET AUTOCOMMIT=ON; --connection node_1 +--let $wait_condition = SELECT COUNT(*)=35 FROM t1 +--source include/wait_condition.inc + SELECT COUNT(*) = 35 FROM t1; SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; DROP TABLE t1; diff --git a/mysql-test/suite/galera/include/galera_st_kill_slave.inc b/mysql-test/suite/galera/include/galera_st_kill_slave.inc index 0b96de55a32..a4d9e91e8be 100644 --- a/mysql-test/suite/galera/include/galera_st_kill_slave.inc +++ b/mysql-test/suite/galera/include/galera_st_kill_slave.inc @@ -96,12 +96,18 @@ INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); ROLLBACK; +--let $wait_condition = SELECT COUNT(*)=35 FROM t1 +--source include/wait_condition.inc + SELECT COUNT(*) = 35 FROM t1; SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; COMMIT; SET AUTOCOMMIT=ON; --connection node_1 +--let $wait_condition = SELECT COUNT(*)=35 FROM t1 +--source include/wait_condition.inc + SELECT COUNT(*) = 35 FROM t1; SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; DROP TABLE t1; diff --git a/mysql-test/suite/galera/include/galera_st_kill_slave_ddl.inc b/mysql-test/suite/galera/include/galera_st_kill_slave_ddl.inc index 44a1513fa6e..bb8c68bd181 100644 --- a/mysql-test/suite/galera/include/galera_st_kill_slave_ddl.inc +++ b/mysql-test/suite/galera/include/galera_st_kill_slave_ddl.inc @@ -110,6 +110,9 @@ INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); INSERT INTO t1 (f1) VALUES ('node1_to_be_rollbacked_after'); ROLLBACK; +--let $wait_condition = SELECT COUNT(*)=35 FROM t1 +--source include/wait_condition.inc + SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; SELECT COUNT(*) = 35 FROM t1; SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; @@ -117,6 +120,8 @@ COMMIT; SET AUTOCOMMIT=ON; --connection node_1 +--let $wait_condition = SELECT COUNT(*)=35 FROM t1 +--source include/wait_condition.inc SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; SELECT COUNT(*) = 35 FROM t1; SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; diff --git a/mysql-test/suite/galera/include/galera_st_shutdown_slave.inc b/mysql-test/suite/galera/include/galera_st_shutdown_slave.inc index 207282c8237..eeb6a15e0a3 100644 --- a/mysql-test/suite/galera/include/galera_st_shutdown_slave.inc +++ b/mysql-test/suite/galera/include/galera_st_shutdown_slave.inc @@ -97,12 +97,18 @@ INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); INSERT INTO t1 VALUES ('node1_to_be_rollbacked_after'); ROLLBACK; +--let $wait_condition = SELECT COUNT(*)=35 FROM t1 +--source include/wait_condition.inc + SELECT COUNT(*) = 35 FROM t1; SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; COMMIT; SET AUTOCOMMIT=ON; --connection node_1 +--let $wait_condition = SELECT COUNT(*)=35 FROM t1 +--source include/wait_condition.inc + SELECT COUNT(*) = 35 FROM t1; SELECT COUNT(*) = 0 FROM (SELECT COUNT(*) AS c, f1 FROM t1 GROUP BY f1 HAVING c NOT IN (5, 10)) AS a1; DROP TABLE t1; From 6b8b7b1e8cd876f798df10015c9853da8adb00f8 Mon Sep 17 00:00:00 2001 From: mkaruza Date: Wed, 24 Jun 2020 21:56:55 +0200 Subject: [PATCH 110/188] MDEV-21905: Galera test galera_var_notify_cmd causes hang Fixed wsrep_notify.sh script so it only reports status changes on 'joined', 'synced', 'donor'. --- mysql-test/std_data/wsrep_notify.sh | 18 +++++++++--------- mysql-test/suite/galera/disabled.def | 1 - .../galera/r/galera_var_notify_cmd.result | 2 ++ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/mysql-test/std_data/wsrep_notify.sh b/mysql-test/std_data/wsrep_notify.sh index 7036f603c84..48edad4306f 100755 --- a/mysql-test/std_data/wsrep_notify.sh +++ b/mysql-test/std_data/wsrep_notify.sh @@ -56,7 +56,7 @@ configuration_change() status_update() { - echo "SET wsrep_on=0; BEGIN; UPDATE $STATUS_TABLE SET status='$STATUS'; COMMIT;" + echo "$BEGIN; UPDATE $STATUS_TABLE SET status='$STATUS'; $END;" } COM=status_update # not a configuration change by default @@ -89,11 +89,11 @@ do shift done -# Undefined means node is shutting down -if [ "$STATUS" != "Undefined" ] -then - $COM | mysql -B -u$USER -h$HOST -P$PORT -fi - -exit 0 -# +case $STATUS in + "joined" | "donor" | "synced") + $COM | mysql -B -u$USER -h$HOST -P$PORT + ;; + *) + exit 0 + ;; +esac diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index e4244c63297..36b0726609e 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -39,7 +39,6 @@ galera_sst_mariabackup_encrypt_with_key : MDEV-21484 galera_sst_mariabackup_encr galera_toi_ddl_nonconflicting : MDEV-21518 galera.galera_toi_ddl_nonconflicting galera_toi_truncate : MDEV-22996 Hang on galera_toi_truncate test case galera_var_node_address : MDEV-20485 Galera test failure -galera_var_notify_cmd : MDEV-21905 Galera test galera_var_notify_cmd causes hang galera_var_reject_queries : assertion in inline_mysql_socket_send galera_var_retry_autocommit: MDEV-18181 Galera test failure on galera.galera_var_retry_autocommit galera_wan : MDEV-17259 Test failure on galera.galera_wan diff --git a/mysql-test/suite/galera/r/galera_var_notify_cmd.result b/mysql-test/suite/galera/r/galera_var_notify_cmd.result index 823407fbba7..432d6c0adbd 100644 --- a/mysql-test/suite/galera/r/galera_var_notify_cmd.result +++ b/mysql-test/suite/galera/r/galera_var_notify_cmd.result @@ -1,3 +1,5 @@ +connection node_2; +connection node_1; connection node_1; SELECT COUNT(DISTINCT uuid) AS EXPECT_2 FROM mtr_wsrep_notify.membership; EXPECT_2 From 4b4372af6a6e2e3c37220487bdb671054357698e Mon Sep 17 00:00:00 2001 From: mkaruza Date: Tue, 2 Jun 2020 09:18:59 +0200 Subject: [PATCH 111/188] MDEV-22458: Server with WSREP hangs after INSERT, wrong usage of mutex 'LOCK_thd_data' and 'share->intern_lock' / 'lock->mutex' Add `find_thread_by_id_with_thd_data_lock` which will be used only when killing thread. This version needs to take `thd->LOCK_thd_data` lock. --- mysql-test/suite/galera/r/MDEV-22458.result | 10 ++++++++ mysql-test/suite/galera/t/MDEV-22458.test | 21 ++++++++++++++++ sql/sql_parse.cc | 28 +++++++++++++++++++-- 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 mysql-test/suite/galera/r/MDEV-22458.result create mode 100644 mysql-test/suite/galera/t/MDEV-22458.test diff --git a/mysql-test/suite/galera/r/MDEV-22458.result b/mysql-test/suite/galera/r/MDEV-22458.result new file mode 100644 index 00000000000..d1f9d94bd1c --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-22458.result @@ -0,0 +1,10 @@ +connection node_2; +connection node_1; +CREATE TABLE t1 (a INT); +connect con1,localhost,root,,test; +INSERT INTO t1 VALUES (1),(2),(3),(4); +SHOW EXPLAIN FOR $con1; +ERROR HY000: Target is not running an EXPLAINable command +connection con1; +INSERT INTO t1 VALUES (5),(6),(7),(8); +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-22458.test b/mysql-test/suite/galera/t/MDEV-22458.test new file mode 100644 index 00000000000..8f9ba1bb107 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-22458.test @@ -0,0 +1,21 @@ +# MDEV-22458 +# +# When running SHOW command, thread lock `LOCK_thd_data` should not be taken. +# Lock will be taken only when we are killing thread +# + +--source include/galera_cluster.inc +CREATE TABLE t1 (a INT); + +--connect (con1,localhost,root,,test) +--let $con1 = `SELECT CONNECTION_ID()` + +INSERT INTO t1 VALUES (1),(2),(3),(4); + +--error ER_TARGET_NOT_EXPLAINABLE +EVALP SHOW EXPLAIN FOR $con1; + +--connection con1 +INSERT INTO t1 VALUES (5),(6),(7),(8); + +DROP TABLE t1; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 3c5c52e2aa1..4596915b096 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -9019,7 +9019,6 @@ my_bool find_thread_callback(THD *thd, find_thread_callback_arg *arg) if (thd->get_command() != COM_DAEMON && arg->id == (arg->query_id ? thd->query_id : (longlong) thd->thread_id)) { - if (WSREP(thd)) mysql_mutex_lock(&thd->LOCK_thd_data); mysql_mutex_lock(&thd->LOCK_thd_kill); // Lock from delete arg->thd= thd; return 1; @@ -9035,6 +9034,26 @@ THD *find_thread_by_id(longlong id, bool query_id) return arg.thd; } +#ifdef WITH_WSREP +my_bool find_thread_with_thd_data_lock_callback(THD *thd, find_thread_callback_arg *arg) +{ + if (thd->get_command() != COM_DAEMON && + arg->id == (arg->query_id ? thd->query_id : (longlong) thd->thread_id)) + { + if (WSREP(thd)) mysql_mutex_lock(&thd->LOCK_thd_data); + mysql_mutex_lock(&thd->LOCK_thd_kill); // Lock from delete + arg->thd= thd; + return 1; + } + return 0; +} +THD *find_thread_by_id_with_thd_data_lock(longlong id, bool query_id) +{ + find_thread_callback_arg arg(id, query_id); + server_threads.iterate(find_thread_with_thd_data_lock_callback, &arg); + return arg.thd; +} +#endif /** kill one thread. @@ -9052,7 +9071,11 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ uint error= (type == KILL_TYPE_QUERY ? ER_NO_SUCH_QUERY : ER_NO_SUCH_THREAD); DBUG_ENTER("kill_one_thread"); DBUG_PRINT("enter", ("id: %lld signal: %u", id, (uint) kill_signal)); +#ifdef WITH_WSREP + if (id && (tmp= find_thread_by_id_with_thd_data_lock(id, type == KILL_TYPE_QUERY))) +#else if (id && (tmp= find_thread_by_id(id, type == KILL_TYPE_QUERY))) +#endif { /* If we're SUPER, we can KILL anything, including system-threads. @@ -9106,8 +9129,9 @@ kill_one_thread(THD *thd, longlong id, killed_state kill_signal, killed_type typ else error= (type == KILL_TYPE_QUERY ? ER_KILL_QUERY_DENIED_ERROR : ER_KILL_DENIED_ERROR); - +#ifdef WITH_WSREP if (WSREP(tmp)) mysql_mutex_unlock(&tmp->LOCK_thd_data); +#endif mysql_mutex_unlock(&tmp->LOCK_thd_kill); } DBUG_PRINT("exit", ("%d", error)); From 95132ade6d83232236e48e4aff1097deeef1dada Mon Sep 17 00:00:00 2001 From: sjaakola Date: Tue, 23 Jun 2020 10:23:40 +0300 Subject: [PATCH 112/188] MDEV-20928 mtr test galera.galera_var_innodb_disallow_writes test failure The sporadic test hangs happen because of mutex dealock between innodb background threads and two test connection executions. The test sets variable innodb_disallow_writes, which blocks all writes to filesyste. The test logic is to execute an INSERT, which should hang because of filesytstem writes are blocked, and through another session verify by SELECT that this hanging happens. The SELECT session will then release innodb_disallow_writes blocking. However, filesystem write blocking affects also innodb background threads and they may hang while keeping some other resources locked. As an example, in one test hang situation, buffer pool access was blocked. And, if buffer pool is blocked, the test connections will be blocked as well, and the SELECT session will not be able to continue to release the innodb_disallow_writes. The fix in this commit is refactoring of the test logic. The test will now set first innodb_disallow_writes blocking, and then record a hash of data directory's filesystem contents. This works as checksum of the state of data on the datadirectory. Then some SQL load is tried on both nodes, these sessions will be blocking due to frozen file system state. The test will have a short sleep to allow innodb background threads to loop and possibly encounter innodb_disallow_writes blocking as well. After the sleep, the test will record file system checksun for the second time, and then release the innodb_disallow-writes blocking. Finally, the two checksums are compared, they should be identical to verify that nothing was written on datadirectory during the test execution. The checksum is implemented by md5sum hash over all files found in datadirectory by find command. all these file hashes are hashed together by one more md5sum. The test therefore depends on md5sum and find. find may work differently with some OS distributions, e.g. freebsd may be problematic. --- .../galera_var_innodb_disallow_writes.result | 33 ++++++------ .../t/galera_var_innodb_disallow_writes.test | 50 +++++++++++++------ storage/innobase/srv/srv0srv.cc | 1 - 3 files changed, 54 insertions(+), 30 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_var_innodb_disallow_writes.result b/mysql-test/suite/galera/r/galera_var_innodb_disallow_writes.result index 3eb56d1a48d..758c34ee62e 100644 --- a/mysql-test/suite/galera/r/galera_var_innodb_disallow_writes.result +++ b/mysql-test/suite/galera/r/galera_var_innodb_disallow_writes.result @@ -1,27 +1,30 @@ connection node_2; connection node_1; -connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; connection node_1a; SET SESSION wsrep_sync_wait = 0; connection node_1; -CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; +CREATE TABLE t1 (f1 INTEGER, f2 varchar(1024)) Engine=InnoDB; +CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); SET GLOBAL innodb_disallow_writes=ON; -INSERT INTO t1 VALUES (1);; +INSERT INTO t1 (f2) SELECT 'abcde ' FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4;; +connection node_2; +INSERT INTO t1 (f2) SELECT 'fghij ' FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; +SELECT COUNT(*) AS EXPECT_10000 FROM t1; +EXPECT_10000 +10000 connection node_1a; -SELECT COUNT(*) AS EXPECT_0 FROM t1; -EXPECT_0 -0 -SELECT COUNT(*) AS EXPECT_0 FROM t1; -EXPECT_0 -0 SET GLOBAL innodb_disallow_writes=OFF; connection node_1; -SELECT COUNT(*) AS EXPECT_1 FROM t1; -EXPECT_1 -1 +SELECT COUNT(*) AS EXPECT_20000 FROM t1; +EXPECT_20000 +20000 +connection node_2; +SELECT COUNT(*) AS EXPECT_20000 FROM t1; +EXPECT_20000 +20000 +connection node_1; connection node_2; -SELECT COUNT(*) AS EXPECT_1 FROM t1; -EXPECT_1 -1 DROP TABLE t1; +DROP TABLE ten; disconnect node_1a; diff --git a/mysql-test/suite/galera/t/galera_var_innodb_disallow_writes.test b/mysql-test/suite/galera/t/galera_var_innodb_disallow_writes.test index 37469d8a5fb..10f3815e135 100644 --- a/mysql-test/suite/galera/t/galera_var_innodb_disallow_writes.test +++ b/mysql-test/suite/galera/t/galera_var_innodb_disallow_writes.test @@ -11,40 +11,62 @@ # --source include/galera_cluster.inc +--source include/have_innodb.inc --source include/have_log_bin.inc +--let $datadir= `SELECT @@datadir` + + # Open a separate connection to be used to run SHOW PROCESSLIST ---connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc --connection node_1a SET SESSION wsrep_sync_wait = 0; --connection node_1 -CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; +CREATE TABLE t1 (f1 INTEGER, f2 varchar(1024)) Engine=InnoDB; +CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + SET GLOBAL innodb_disallow_writes=ON; ---send INSERT INTO t1 VALUES (1); +--exec find $datadir -type f-exec md5sum {} \; | md5sum >$MYSQLTEST_VARDIR/tmp/innodb_before + +# +# This insert has no effect before innodb_disallow_writes is OFF +# +--send INSERT INTO t1 (f2) SELECT 'abcde ' FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; + +--connection node_2 +INSERT INTO t1 (f2) SELECT 'fghij ' FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; +SELECT COUNT(*) AS EXPECT_10000 FROM t1; --connection node_1a ---let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t1'; ---source include/wait_condition.inc -SELECT COUNT(*) AS EXPECT_0 FROM t1; -let $wait_condition = SELECT 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO = 'INSERT INTO t1 VALUES (1)'; ---source include/wait_condition.inc -SELECT COUNT(*) AS EXPECT_0 FROM t1; +--sleep 5 + +--exec find $datadir -type f-exec md5sum {} \; | md5sum >$MYSQLTEST_VARDIR/tmp/innodb_after SET GLOBAL innodb_disallow_writes=OFF; --connection node_1 --reap -SELECT COUNT(*) AS EXPECT_1 FROM t1; +--let $wait_condition = SELECT COUNT(*) = 20000 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_20000 FROM t1; --connection node_2 ---let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t1'; +--let $wait_condition = SELECT COUNT(*) = 20000 FROM t1; --source include/wait_condition.inc ---let $wait_condition = SELECT COUNT(*) = 1 FROM t1; ---source include/wait_condition.inc -SELECT COUNT(*) AS EXPECT_1 FROM t1; +SELECT COUNT(*) AS EXPECT_20000 FROM t1; + +--connection node_1 +--diff_files $MYSQLTEST_VARDIR/tmp/innodb_before $MYSQLTEST_VARDIR/tmp/innodb_after + +--connection node_2 DROP TABLE t1; +DROP TABLE ten; --disconnect node_1a diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index f9d5ede3794..ab47157ee9b 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -75,7 +75,6 @@ Created 10/8/1995 Heikki Tuuri #include "btr0scrub.h" #include - /* The following is the maximum allowed duration of a lock wait. */ UNIV_INTERN ulong srv_fatal_semaphore_wait_threshold = DEFAULT_SRV_FATAL_SEMAPHORE_TIMEOUT; From 8f3423fb5a0020863e04189e33f69c83bdcf2699 Mon Sep 17 00:00:00 2001 From: Alexey Yurchenko Date: Mon, 13 Jul 2020 23:02:05 +0300 Subject: [PATCH 113/188] Update wsrep-lib version: improved error logging and diagnostics --- wsrep-lib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wsrep-lib b/wsrep-lib index d0255569b01..8ba574f7bf1 160000 --- a/wsrep-lib +++ b/wsrep-lib @@ -1 +1 @@ -Subproject commit d0255569b0154e23c5461ed13928f9b0a18008e4 +Subproject commit 8ba574f7bf19bdc0de18e2225068c5a3f2dcdea4 From 134a6a8d2f953a5634897b420b1302d32b0e53a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Fri, 24 Jul 2020 11:56:01 +0300 Subject: [PATCH 114/188] Silence unnecessary warning. --- mysql-test/suite/galera/r/MW-328A.result | 3 +++ mysql-test/suite/galera/t/MW-328A.test | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/mysql-test/suite/galera/r/MW-328A.result b/mysql-test/suite/galera/r/MW-328A.result index 448e927f09d..f256558644e 100644 --- a/mysql-test/suite/galera/r/MW-328A.result +++ b/mysql-test/suite/galera/r/MW-328A.result @@ -14,7 +14,10 @@ END| connect node_1X, 127.0.0.1, root, , test, $NODE_MYPORT_1; connection node_1X; CALL proc_update();; +connection node_1; +call mtr.add_suppression("WSREP: Wait for gtid returned error 3 while waiting for prior transactions to commit before setting position"); connection node_2; +call mtr.add_suppression("WSREP: Wait for gtid returned error 3 while waiting for prior transactions to commit before setting position"); SET SESSION wsrep_retry_autocommit = 0; connection node_1; connection node_1X; diff --git a/mysql-test/suite/galera/t/MW-328A.test b/mysql-test/suite/galera/t/MW-328A.test index a547823ced0..2435a9e2c2e 100644 --- a/mysql-test/suite/galera/t/MW-328A.test +++ b/mysql-test/suite/galera/t/MW-328A.test @@ -16,7 +16,11 @@ --source include/force_restart.inc --source suite/galera/t/MW-328-header.inc +--connection node_1 +call mtr.add_suppression("WSREP: Wait for gtid returned error 3 while waiting for prior transactions to commit before setting position"); + --connection node_2 +call mtr.add_suppression("WSREP: Wait for gtid returned error 3 while waiting for prior transactions to commit before setting position"); --let $count = 100 --let $successes = 0 --let $deadlocks = 0 From c9928cc0fb1ddbe9253105f8cd2db0104e739ede Mon Sep 17 00:00:00 2001 From: sjaakola Date: Tue, 23 Jun 2020 10:23:40 +0300 Subject: [PATCH 115/188] MDEV-20928 mtr test galera.galera_var_innodb_disallow_writes test failure The sporadic test hangs happen because of mutex dealock between innodb background threads and two test connection executions. The test sets variable innodb_disallow_writes, which blocks all writes to filesyste. The test logic is to execute an INSERT, which should hang because of filesytstem writes are blocked, and through another session verify by SELECT that this hanging happens. The SELECT session will then release innodb_disallow_writes blocking. However, filesystem write blocking affects also innodb background threads and they may hang while keeping some other resources locked. As an example, in one test hang situation, buffer pool access was blocked. And, if buffer pool is blocked, the test connections will be blocked as well, and the SELECT session will not be able to continue to release the innodb_disallow_writes. The fix in this commit is refactoring of the test logic. The test will now set first innodb_disallow_writes blocking, and then record a hash of data directory's filesystem contents. This works as checksum of the state of data on the datadirectory. Then some SQL load is tried on both nodes, these sessions will be blocking due to frozen file system state. The test will have a short sleep to allow innodb background threads to loop and possibly encounter innodb_disallow_writes blocking as well. After the sleep, the test will record file system checksun for the second time, and then release the innodb_disallow-writes blocking. Finally, the two checksums are compared, they should be identical to verify that nothing was written on datadirectory during the test execution. The checksum is implemented by md5sum hash over all files found in datadirectory by find command. all these file hashes are hashed together by one more md5sum. The test therefore depends on md5sum and find. find may work differently with some OS distributions, e.g. freebsd may be problematic. --- .../galera_var_innodb_disallow_writes.result | 33 ++++++----- .../t/galera_var_innodb_disallow_writes.test | 58 ++++++++++++++----- 2 files changed, 62 insertions(+), 29 deletions(-) diff --git a/mysql-test/suite/galera/r/galera_var_innodb_disallow_writes.result b/mysql-test/suite/galera/r/galera_var_innodb_disallow_writes.result index 54cebbee40c..8750651612d 100644 --- a/mysql-test/suite/galera/r/galera_var_innodb_disallow_writes.result +++ b/mysql-test/suite/galera/r/galera_var_innodb_disallow_writes.result @@ -1,25 +1,28 @@ -connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1; connection node_1a; SET SESSION wsrep_sync_wait = 0; connection node_1; -CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; +CREATE TABLE t1 (f1 INTEGER, f2 varchar(1024)) Engine=InnoDB; +CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); SET GLOBAL innodb_disallow_writes=ON; -INSERT INTO t1 VALUES (1);; +INSERT INTO t1 (f2) SELECT 'abcde ' FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4;; +connection node_2; +INSERT INTO t1 (f2) SELECT 'fghij ' FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; +SELECT COUNT(*) AS EXPECT_10000 FROM t1; +EXPECT_10000 +10000 connection node_1a; -SELECT COUNT(*) AS EXPECT_0 FROM t1; -EXPECT_0 -0 -SELECT COUNT(*) AS EXPECT_0 FROM t1; -EXPECT_0 -0 SET GLOBAL innodb_disallow_writes=OFF; connection node_1; -SELECT COUNT(*) AS EXPECT_1 FROM t1; -EXPECT_1 -1 +SELECT COUNT(*) AS EXPECT_20000 FROM t1; +EXPECT_20000 +20000 +connection node_2; +SELECT COUNT(*) AS EXPECT_20000 FROM t1; +EXPECT_20000 +20000 +connection node_1; connection node_2; -SELECT COUNT(*) AS EXPECT_1 FROM t1; -EXPECT_1 -1 DROP TABLE t1; +DROP TABLE ten; disconnect node_1a; diff --git a/mysql-test/suite/galera/t/galera_var_innodb_disallow_writes.test b/mysql-test/suite/galera/t/galera_var_innodb_disallow_writes.test index 3754cff0123..0d2a6effd92 100644 --- a/mysql-test/suite/galera/t/galera_var_innodb_disallow_writes.test +++ b/mysql-test/suite/galera/t/galera_var_innodb_disallow_writes.test @@ -1,41 +1,71 @@ # # This test checks that innodb_disallow_writes works as expected # +# Note that we need to enable binlog for this test: If the commit +# to InnoDB is done in one phase, the transaction is committed in +# memory before it is persisted to disk. This means that the +# innodb_disallow_writes=ON may not prevent transaction to +# become visible to other readers. On the other hand, if the +# commit is two phase (as it is with binlog), the transaction +# will be blocked in prepare phase. +# --source include/galera_cluster.inc +--source include/have_innodb.inc + +--let $datadir= `SELECT @@datadir` + # Open a separate connection to be used to run SHOW PROCESSLIST ---connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 +--let $galera_connection_name = node_1a +--let $galera_server_number = 1 +--source include/galera_connect.inc --connection node_1a SET SESSION wsrep_sync_wait = 0; --connection node_1 -CREATE TABLE t1 (f1 INTEGER) Engine=InnoDB; +CREATE TABLE t1 (f1 INTEGER, f2 varchar(1024)) Engine=InnoDB; +CREATE TABLE ten (f1 INTEGER) ENGINE=InnoDB; +INSERT INTO ten VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); + SET GLOBAL innodb_disallow_writes=ON; ---send INSERT INTO t1 VALUES (1); +--exec find $datadir -type f-exec md5sum {} \; | md5sum >$MYSQLTEST_VARDIR/tmp/innodb_before + +# +# This insert has no effect before innodb_disallow_writes is OFF +# +--send INSERT INTO t1 (f2) SELECT 'abcde ' FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; + +--connection node_2 +INSERT INTO t1 (f2) SELECT 'fghij ' FROM ten AS a1, ten AS a2, ten AS a3, ten AS a4; +SELECT COUNT(*) AS EXPECT_10000 FROM t1; --connection node_1a ---let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t1'; ---source include/wait_condition.inc -SELECT COUNT(*) AS EXPECT_0 FROM t1; -let $wait_condition = SELECT 1 FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO = 'INSERT INTO t1 VALUES (1)'; ---source include/wait_condition.inc -SELECT COUNT(*) AS EXPECT_0 FROM t1; +--sleep 5 + +--exec find $datadir -type f-exec md5sum {} \; | md5sum >$MYSQLTEST_VARDIR/tmp/innodb_after SET GLOBAL innodb_disallow_writes=OFF; --connection node_1 --reap -SELECT COUNT(*) AS EXPECT_1 FROM t1; +--let $wait_condition = SELECT COUNT(*) = 20000 FROM t1; +--source include/wait_condition.inc + +SELECT COUNT(*) AS EXPECT_20000 FROM t1; --connection node_2 ---let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE 'test/t1'; +--let $wait_condition = SELECT COUNT(*) = 20000 FROM t1; --source include/wait_condition.inc ---let $wait_condition = SELECT COUNT(*) = 1 FROM t1; ---source include/wait_condition.inc -SELECT COUNT(*) AS EXPECT_1 FROM t1; +SELECT COUNT(*) AS EXPECT_20000 FROM t1; + +--connection node_1 +--diff_files $MYSQLTEST_VARDIR/tmp/innodb_before $MYSQLTEST_VARDIR/tmp/innodb_after + +--connection node_2 DROP TABLE t1; +DROP TABLE ten; --disconnect node_1a From a3a249c72f07bf3270c059f60f68df030179f104 Mon Sep 17 00:00:00 2001 From: mkaruza Date: Mon, 20 Jul 2020 14:16:19 +0200 Subject: [PATCH 116/188] MDEV-15236: galera_ist_progress fails when trying to read transfer status Fixed by new recording test recording --- mysql-test/suite/galera/disabled.def | 1 - mysql-test/suite/galera/r/galera_ist_progress.result | 9 +++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 125ea03474f..331260ef84e 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -17,7 +17,6 @@ galera_as_slave_replication_bundle : MDEV-15785 OPTION_GTID_BEGIN is set in Gtid galera_autoinc_sst_mariabackup : Known issue, may require porting MDEV-17458 from later versions galera_binlog_stmt_autoinc : MDEV-19959 Galera test failure on galera_binlog_stmt_autoinc galera_gcache_recover_manytrx : MDEV-18834 Galera test failure -galera_ist_progress : MDEV-15236 fails when trying to read transfer status galera_load_data : MDEV-19968 galera.galera_load_data galera_parallel_simple : MDEV-20318 galera.galera_parallel_simple fails galera_shutdown_nonprim : MDEV-21493 galera.galera_shutdown_nonprim diff --git a/mysql-test/suite/galera/r/galera_ist_progress.result b/mysql-test/suite/galera/r/galera_ist_progress.result index 9fc7febbea5..ed36a217624 100644 --- a/mysql-test/suite/galera/r/galera_ist_progress.result +++ b/mysql-test/suite/galera/r/galera_ist_progress.result @@ -1,6 +1,10 @@ +connection node_2; SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; +connection node_1; +connection node_2; SET SESSION wsrep_on = OFF; SET SESSION wsrep_on = ON; +connection node_1; CREATE TABLE t1 (f1 INTEGER) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (2); @@ -12,8 +16,13 @@ INSERT INTO t1 VALUES (7); INSERT INTO t1 VALUES (8); INSERT INTO t1 VALUES (9); INSERT INTO t1 VALUES (10); +connection node_2; SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 0'; +connection node_1; +connection node_2; +connection node_1; include/assert_grep.inc [Receiving IST: 11 writesets, seqnos] include/assert_grep.inc [Receiving IST\.\.\. 0\.0% \( 0/11 events\) complete] include/assert_grep.inc [Receiving IST\.\.\.100\.0% \(11/11 events\) complete] +connection node_1; DROP TABLE t1; From 1e2a4ed7ed41f3f6900e164dfad38c95d2af8b7b Mon Sep 17 00:00:00 2001 From: Teemu Ollakka Date: Thu, 23 Jul 2020 23:05:47 +0300 Subject: [PATCH 117/188] MDEV-21718 Assertion in wsrep::client_state::before_command(). An assertion `server_state_.rollback_mode() == wsrep::server_state::rm_async` fired in before_command() when - thread-handling was set to pool-of-threads and - a BF abort happened between client session calls to wait_rollback_complete_and_acquire_ownership() and before_command(). This commit introduces a test case to reproduce the crash and updates wsrep-lib submodule to fixed version. --- mysql-test/suite/galera/r/mdev_21718.result | 16 ++++++++++ mysql-test/suite/galera/t/mdev_21718.cnf | 4 +++ mysql-test/suite/galera/t/mdev_21718.test | 33 +++++++++++++++++++++ sql/sql_parse.cc | 1 + wsrep-lib | 2 +- 5 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 mysql-test/suite/galera/r/mdev_21718.result create mode 100644 mysql-test/suite/galera/t/mdev_21718.cnf create mode 100644 mysql-test/suite/galera/t/mdev_21718.test diff --git a/mysql-test/suite/galera/r/mdev_21718.result b/mysql-test/suite/galera/r/mdev_21718.result new file mode 100644 index 00000000000..ce938614854 --- /dev/null +++ b/mysql-test/suite/galera/r/mdev_21718.result @@ -0,0 +1,16 @@ +connection node_2; +connection node_1; +CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; +connection node_1; +START TRANSACTION; +INSERT INTO t1 VALUES (1); +SET DEBUG_SYNC = "wsrep_before_before_command SIGNAL reached WAIT_FOR continue"; +COMMIT; +connection node_1_ctrl; +SET DEBUG_SYNC = "now WAIT_FOR reached"; +connection node_2; +INSERT INTO t1 VALUES (1); +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +DROP TABLE t1; +SET DEBUG_SYNC = "RESET"; diff --git a/mysql-test/suite/galera/t/mdev_21718.cnf b/mysql-test/suite/galera/t/mdev_21718.cnf new file mode 100644 index 00000000000..9e066597a13 --- /dev/null +++ b/mysql-test/suite/galera/t/mdev_21718.cnf @@ -0,0 +1,4 @@ +!include ../galera_2nodes.cnf + +[mysqld] +thread-handling=pool-of-threads diff --git a/mysql-test/suite/galera/t/mdev_21718.test b/mysql-test/suite/galera/t/mdev_21718.test new file mode 100644 index 00000000000..413e9da0e83 --- /dev/null +++ b/mysql-test/suite/galera/t/mdev_21718.test @@ -0,0 +1,33 @@ +# +# MDEV-21718 Reproduce a case where BF abort after +# client session acquires the ownership but before calls +# before_command() causes an assertion in wsrep-lib. +# +--source include/galera_cluster.inc +--source include/have_innodb.inc + +CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; + +--let $galera_connection_name = node_1_ctrl +--let $galera_server_number = 1 +--source include/galera_connect.inc + +--connection node_1 +START TRANSACTION; +INSERT INTO t1 VALUES (1); +SET DEBUG_SYNC = "wsrep_before_before_command SIGNAL reached WAIT_FOR continue"; +--send COMMIT + +--connection node_1_ctrl +SET DEBUG_SYNC = "now WAIT_FOR reached"; + +--connection node_2 +INSERT INTO t1 VALUES (1); + +# BF abort wakes up node_1 from sync wait. +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +DROP TABLE t1; +SET DEBUG_SYNC = "RESET"; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 4596915b096..9f7cf514ac3 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1280,6 +1280,7 @@ bool do_command(THD *thd) command= fetch_command(thd, packet); #ifdef WITH_WSREP + DEBUG_SYNC(thd, "wsrep_before_before_command"); /* Aborted by background rollbacker thread. Handle error here and jump straight to out diff --git a/wsrep-lib b/wsrep-lib index 8ba574f7bf1..3e5a28df32c 160000 --- a/wsrep-lib +++ b/wsrep-lib @@ -1 +1 @@ -Subproject commit 8ba574f7bf19bdc0de18e2225068c5a3f2dcdea4 +Subproject commit 3e5a28df32c85c7768dd84d1731ad4661bf90022 From bec81db1c28388337e5abe67726b9c540ebf0a74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Fri, 24 Jul 2020 15:17:35 +0300 Subject: [PATCH 118/188] Update Galera global warning ignore list. --- mysql-test/suite/galera/suite.pm | 1 + mysql-test/suite/galera_3nodes/suite.pm | 7 +++++++ mysql-test/suite/galera_sr/suite.pm | 3 +++ 3 files changed, 11 insertions(+) diff --git a/mysql-test/suite/galera/suite.pm b/mysql-test/suite/galera/suite.pm index 671fd1688c9..c0b2da5f349 100644 --- a/mysql-test/suite/galera/suite.pm +++ b/mysql-test/suite/galera/suite.pm @@ -64,6 +64,7 @@ push @::global_suppressions, qr(WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to .*), qr|WSREP: Sending JOIN failed: -107 \(Transport endpoint is not connected\). Will retry in new primary component.|, qr|WSREP: Trying to continue unpaused monitor|, + qr|WSREP: Wait for gtid returned error 3 while waiting for prior transactions to commit before setting position|, ); sub skip_combinations { diff --git a/mysql-test/suite/galera_3nodes/suite.pm b/mysql-test/suite/galera_3nodes/suite.pm index b808db6a50a..da02d4a9020 100644 --- a/mysql-test/suite/galera_3nodes/suite.pm +++ b/mysql-test/suite/galera_3nodes/suite.pm @@ -39,6 +39,13 @@ push @::global_suppressions, qr(WSREP: Action message in non-primary configuration from member [0-9]*), qr(WSREP: --wsrep-causal-reads=ON takes precedence over --wsrep-sync-wait=0. WSREP_SYNC_WAIT_BEFORE_READ is on), qr(WSREP: JOIN message from member .* in non-primary configuration. Ignored.), + qr|Query apply failed:*|, + qr(WSREP: Ignoring error*), + qr(WSREP: Failed to remove page file .*), + qr(WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to .*), + qr|WSREP: Sending JOIN failed: -107 \(Transport endpoint is not connected\). Will retry in new primary component.|, + qr|WSREP: Trying to continue unpaused monitor|, + qr|WSREP: Wait for gtid returned error 3 while waiting for prior transactions to commit before setting position|, ); bless { }; diff --git a/mysql-test/suite/galera_sr/suite.pm b/mysql-test/suite/galera_sr/suite.pm index cc13421d66d..a9665b5252c 100644 --- a/mysql-test/suite/galera_sr/suite.pm +++ b/mysql-test/suite/galera_sr/suite.pm @@ -62,6 +62,9 @@ push @::global_suppressions, qr(WSREP: Ignoring error*), qr(WSREP: Failed to remove page file .*), qr(WSREP: wsrep_sst_method is set to 'mysqldump' yet mysqld bind_address is set to .*), + qr|WSREP: Sending JOIN failed: -107 \(Transport endpoint is not connected\). Will retry in new primary component.|, + qr|WSREP: Trying to continue unpaused monitor|, + qr|WSREP: Wait for gtid returned error 3 while waiting for prior transactions to commit before setting position|, ); bless { }; From 744919552cc6a2b1229dbaa59f65d798122c6adb Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Fri, 24 Jul 2020 20:17:43 +0530 Subject: [PATCH 119/188] MDEV-23229 Read of Uninitialized memory during buffer pool resizing commit b1ab211dee599eabd9a5b886fafa3adea29ae041 (MDEV-15053) introduced the code to unfix the block earlier in buf_block_t::unfix(). After unfixing the block, InnoDB can withdraw the block from the buffer pool and deallocate it while doing buffer pool resizing. So subsequent assert could leads to uninitialized memory access of block. buf_block_t::unfix(): Unfix the block after checking the assert. --- storage/innobase/include/buf0buf.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index 0591d6ac19c..2677d4228fa 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -1198,12 +1198,11 @@ struct buf_block_t{ void fix() { page.fix(); } uint32_t unfix() { - uint32_t fix_count= page.unfix(); - ut_ad(fix_count || page.io_fix() != BUF_IO_NONE || + ut_ad(page.buf_fix_count() || page.io_fix() != BUF_IO_NONE || page.state() == BUF_BLOCK_ZIP_PAGE || !rw_lock_own_flagged(&lock, RW_LOCK_FLAG_X | RW_LOCK_FLAG_S | RW_LOCK_FLAG_SX)); - return fix_count; + return page.unfix(); } /** @return the physical size, in bytes */ From 5f1ec5cbb78a427ff260888bef5e19daa36b10e2 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Thu, 23 Jul 2020 16:59:30 +0530 Subject: [PATCH 120/188] MDEV-14711 Assertion `mode == 16 || mode == 12 || !fix_block->page.file_page_was_freed' failed in buf_page_get_gen (rollback requesting a freed undo page) Problem: ======= In buf_cur_optimistic_latch_leaves(), requesting a left block with BTR_GET after releasing current block. But there is no guarantee that left block could be still available. Fix: ==== (1) In btr_cur_optimistic_latch_leaves(), replace the BUF_GET with BUF_GET_POSSIBLY_FREED for fetching left block. (2) Once InnoDB acquires left block, it should check FIL_PAGE_NEXT with current block page number. If not, release cursor->left_block and return false. --- storage/innobase/btr/btr0cur.cc | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index 35e578e1a5c..bacc05686e9 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -415,6 +415,7 @@ btr_cur_optimistic_latch_leaves( { ulint mode; ulint left_page_no; + ulint curr_page_no; switch (*latch_mode) { case BTR_SEARCH_LEAF: @@ -441,6 +442,8 @@ btr_cur_optimistic_latch_leaves( goto unpin_failed; } + + curr_page_no = block->page.id.page_no(); left_page_no = btr_page_get_prev( buf_block_get_frame(block)); rw_lock_s_unlock(&block->lock); @@ -449,11 +452,26 @@ btr_cur_optimistic_latch_leaves( const page_id_t page_id( dict_index_get_space(cursor->index), left_page_no); + dberr_t err = DB_SUCCESS; - cursor->left_block = btr_block_get( + cursor->left_block = buf_page_get_gen( page_id, dict_table_page_size(cursor->index->table), - mode, cursor->index, mtr); + mode, NULL, BUF_GET_POSSIBLY_FREED, + __FILE__, __LINE__, mtr, &err); + + if (err == DB_DECRYPTION_FAILED) { + cursor->index->table->file_unreadable = true; + } + + if (btr_page_get_next(buf_block_get_frame( + cursor->left_block)) + != curr_page_no) { + /* release the left block */ + btr_leaf_page_release( + cursor->left_block, mode, mtr); + return false; + } } else { cursor->left_block = NULL; } From 468e56bfdeea4cac7a4f7eebab69606f41edc07c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Fri, 24 Jul 2020 19:25:32 +0300 Subject: [PATCH 121/188] Add missing includes. --- mysql-test/suite/galera/t/mdev_21718.test | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mysql-test/suite/galera/t/mdev_21718.test b/mysql-test/suite/galera/t/mdev_21718.test index 413e9da0e83..3fbc4e773d5 100644 --- a/mysql-test/suite/galera/t/mdev_21718.test +++ b/mysql-test/suite/galera/t/mdev_21718.test @@ -5,6 +5,8 @@ # --source include/galera_cluster.inc --source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc CREATE TABLE t1 (f1 INT PRIMARY KEY) ENGINE=InnoDB; From 3d76af0814a5dc7123d899e8357ff4948e8c531e Mon Sep 17 00:00:00 2001 From: Teemu Ollakka Date: Fri, 24 Jul 2020 15:17:59 +0300 Subject: [PATCH 122/188] MDEV-22998 Free thd->mem_root at applier commit or rollback. --- sql/wsrep_high_priority_service.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sql/wsrep_high_priority_service.cc b/sql/wsrep_high_priority_service.cc index 9f6cbf30e68..ec195bb57cf 100644 --- a/sql/wsrep_high_priority_service.cc +++ b/sql/wsrep_high_priority_service.cc @@ -276,6 +276,8 @@ int Wsrep_high_priority_service::append_fragment_and_commit( m_thd->wsrep_cs().after_applying(); m_thd->mdl_context.release_transactional_locks(); + free_root(m_thd->mem_root, MYF(MY_KEEP_PREALLOC)); + thd_proc_info(m_thd, "wsrep applier committed"); DBUG_RETURN(ret); @@ -334,6 +336,8 @@ int Wsrep_high_priority_service::commit(const wsrep::ws_handle& ws_handle, thd->lex->sql_command= SQLCOM_END; + free_root(thd->mem_root, MYF(MY_KEEP_PREALLOC)); + must_exit_= check_exit_status(); DBUG_RETURN(ret); } @@ -346,6 +350,9 @@ int Wsrep_high_priority_service::rollback(const wsrep::ws_handle& ws_handle, int ret= (trans_rollback_stmt(m_thd) || trans_rollback(m_thd)); m_thd->mdl_context.release_transactional_locks(); m_thd->mdl_context.release_explicit_locks(); + + free_root(m_thd->mem_root, MYF(MY_KEEP_PREALLOC)); + DBUG_RETURN(ret); } From 05d62518fb81b884685199a3cf269f24c01e3e99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 24 Jul 2020 19:34:17 +0300 Subject: [PATCH 123/188] MDEV-22651: Bogus assertion in dict_table_t::init_instant() In commit 0e5a4ac2532c64a545796c787354dc41d61d0e62 (MDEV-15562) we introduced a bogus debug assertion, demanding that dict_col_t::len never exceed some maximum value. The intention was to match what dict_index_add_col() is doing. But, the assignment field->fixed_len = 0 applies to dict_field_t::fixed_len, not dict_col_t::len! --- mysql-test/suite/innodb/r/instant_alter_bugs.result | 8 ++++++++ mysql-test/suite/innodb/t/instant_alter_bugs.test | 10 ++++++++++ storage/innobase/handler/handler0alter.cc | 2 -- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/mysql-test/suite/innodb/r/instant_alter_bugs.result b/mysql-test/suite/innodb/r/instant_alter_bugs.result index 871d296776c..81d4db79be0 100644 --- a/mysql-test/suite/innodb/r/instant_alter_bugs.result +++ b/mysql-test/suite/innodb/r/instant_alter_bugs.result @@ -399,4 +399,12 @@ INSERT INTO t1 SET a=1, b=NULL; ALTER TABLE t1 MODIFY COLUMN b INT FIRST; ALTER TABLE t1 ADD UNIQUE INDEX (va); DROP TABLE t1; +# +# MDEV-22651 Assertion dict_col_get_fixed_size... +# in dict_table_t::init_instant() +# +CREATE TABLE t (i INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t SET i=1; +ALTER TABLE t ADD e CHAR(255) CHARACTER SET UTF32 FIRST, ALGORITHM=INSTANT; +DROP TABLE t; SET GLOBAL innodb_purge_rseg_truncate_frequency=@save_frequency; diff --git a/mysql-test/suite/innodb/t/instant_alter_bugs.test b/mysql-test/suite/innodb/t/instant_alter_bugs.test index 2ee203d998e..b6a3aecd7da 100644 --- a/mysql-test/suite/innodb/t/instant_alter_bugs.test +++ b/mysql-test/suite/innodb/t/instant_alter_bugs.test @@ -419,4 +419,14 @@ ALTER TABLE t1 MODIFY COLUMN b INT FIRST; ALTER TABLE t1 ADD UNIQUE INDEX (va); DROP TABLE t1; +--echo # +--echo # MDEV-22651 Assertion dict_col_get_fixed_size... +--echo # in dict_table_t::init_instant() +--echo # +--source include/have_innodb.inc +CREATE TABLE t (i INT PRIMARY KEY) ENGINE=InnoDB; +INSERT INTO t SET i=1; +ALTER TABLE t ADD e CHAR(255) CHARACTER SET UTF32 FIRST, ALGORITHM=INSTANT; +DROP TABLE t; + SET GLOBAL innodb_purge_rseg_truncate_frequency=@save_frequency; diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index a217a6cfcac..203c232ed41 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -194,8 +194,6 @@ inline void dict_table_t::init_instant(const dict_table_t& table) ut_d(unsigned n_nullable = 0); for (unsigned i = u; i < index.n_fields; i++) { auto& f = index.fields[i]; - DBUG_ASSERT(dict_col_get_fixed_size(f.col, not_redundant()) - <= DICT_MAX_FIXED_COL_LEN); ut_d(n_nullable += f.col->is_nullable()); if (!f.col->is_dropped()) { From 4968fdbcef1c2d62ed525dffac153cf9f8eb1913 Mon Sep 17 00:00:00 2001 From: Alexey Botchkov Date: Sun, 26 Jul 2020 18:01:12 +0400 Subject: [PATCH 124/188] MDEV-19918 Server hangs or crashes while trying to lock mutex when the mutex was already locked upon startup with server_audit and orphan records in mysql.plugin. Preaquire auditing plugins before LOCK_plugin to awoid double locking. --- sql/sql_plugin.cc | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index 893c67677dc..2afd82b2b46 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -1801,6 +1801,8 @@ static void plugin_load(MEM_ROOT *tmp_root) int error; THD *new_thd= new THD(0); bool result; + unsigned long event_class_mask[MYSQL_AUDIT_CLASS_MASK_SIZE] = + { MYSQL_AUDIT_GENERAL_CLASSMASK }; DBUG_ENTER("plugin_load"); if (global_system_variables.log_warnings >= 9) @@ -1849,6 +1851,31 @@ static void plugin_load(MEM_ROOT *tmp_root) if (!name.length || !dl.length) continue; + /* + Pre-acquire audit plugins for events that may potentially occur + during [UN]INSTALL PLUGIN. + + When audit event is triggered, audit subsystem acquires interested + plugins by walking through plugin list. Evidently plugin list + iterator protects plugin list by acquiring LOCK_plugin, see + plugin_foreach_with_mask(). + + On the other hand plugin_load is acquiring LOCK_plugin + rather for a long time. + + When audit event is triggered during plugin_load plugin + list iterator acquires the same lock (within the same thread) + second time. + + This hack should be removed when LOCK_plugin is fixed so it + protects only what it supposed to protect. + + See also mysql_install_plugin(), mysql_uninstall_plugin() and + initialize_audit_plugin() + */ + if (mysql_audit_general_enabled()) + mysql_audit_acquire_plugins(new_thd, event_class_mask); + /* there're no other threads running yet, so we don't need a mutex. but plugin_add() before is designed to work in multi-threaded From a6410deba99d5060a8c3fc0d5f267100125dc6ac Mon Sep 17 00:00:00 2001 From: Varun Gupta Date: Mon, 27 Jul 2020 13:53:33 +0530 Subject: [PATCH 125/188] MDEV-18916: crash in Window_spec::print_partition() with decimals Removed an unnecessary ifndef which was printing the window name for a named window only in the case of debug build. The print() for the window function should behave in the same way on both release and debug builds. --- mysql-test/r/win.result | 7 +++++++ mysql-test/t/win.test | 9 +++++++++ sql/item_windowfunc.cc | 6 ++---- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/win.result b/mysql-test/r/win.result index 019cfd6115d..081aaedd323 100644 --- a/mysql-test/r/win.result +++ b/mysql-test/r/win.result @@ -3843,5 +3843,12 @@ ROW_NUMBER() OVER w2 5 DROP TABLE t1; # +# MDEV-18916: crash in Window_spec::print_partition() with decimals +# +SELECT cast((rank() over w1) as decimal (53,56)); +ERROR 42000: Too big scale 56 specified for 'rank() over w1'. Maximum is 38 +SELECT cast((rank() over w1) as decimal (53,30)); +ERROR HY000: Window specification with name 'w1' is not defined +# # End of 10.2 tests # diff --git a/mysql-test/t/win.test b/mysql-test/t/win.test index deed7de2d23..b749b235082 100644 --- a/mysql-test/t/win.test +++ b/mysql-test/t/win.test @@ -2497,6 +2497,15 @@ SELECT a,b FROM t1 WINDOW w2 AS (PARTITION BY -1,1,0,2,3,4); SELECT ROW_NUMBER() OVER w2 FROM t1 WINDOW w2 AS (PARTITION BY -1,0,1,2,3,4,5,6); DROP TABLE t1; +--echo # +--echo # MDEV-18916: crash in Window_spec::print_partition() with decimals +--echo # + +--error ER_TOO_BIG_SCALE +SELECT cast((rank() over w1) as decimal (53,56)); +--error ER_WRONG_WINDOW_SPEC_NAME +SELECT cast((rank() over w1) as decimal (53,30)); + --echo # --echo # End of 10.2 tests --echo # diff --git a/sql/item_windowfunc.cc b/sql/item_windowfunc.cc index a3edacd880e..87dddbfb439 100644 --- a/sql/item_windowfunc.cc +++ b/sql/item_windowfunc.cc @@ -443,10 +443,8 @@ void Item_window_func::print(String *str, enum_query_type query_type) { window_func()->print(str, query_type); str->append(" over "); -#ifndef DBUG_OFF - if (!window_spec) // one can call dbug_print_item() anytime in gdb + if (!window_spec) str->append(window_name); else -#endif - window_spec->print(str, query_type); + window_spec->print(str, query_type); } From b4c742108f8cd2d2ebe70a98d8c621a34a8b891a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Mon, 27 Jul 2020 14:34:24 +0300 Subject: [PATCH 126/188] Enable fixed test case. --- mysql-test/suite/galera/disabled.def | 1 - 1 file changed, 1 deletion(-) diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 331260ef84e..453bbb139f5 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -14,7 +14,6 @@ MW-286 : MDEV-18464 Killing thread can cause mutex deadlock if done concurrently MW-329 : MDEV-19962 Galera test failure on MW-329 galera.galera_defaults : MDEV-21494 Galera test sporadic failure on galera.galera_defaults galera_as_slave_replication_bundle : MDEV-15785 OPTION_GTID_BEGIN is set in Gtid_log_event::do_apply_event() -galera_autoinc_sst_mariabackup : Known issue, may require porting MDEV-17458 from later versions galera_binlog_stmt_autoinc : MDEV-19959 Galera test failure on galera_binlog_stmt_autoinc galera_gcache_recover_manytrx : MDEV-18834 Galera test failure galera_load_data : MDEV-19968 galera.galera_load_data From fd9ca2a742abe2e91b2b77e70915dec7bd3cd7e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 27 Jul 2020 15:04:04 +0300 Subject: [PATCH 127/188] MDEV-23295 ROW_FORMAT mismatch in instant ALTER TABLE An instant ADD/DROP/reorder column could create a dummy table object with the wrong ROW_FORMAT when innodb_default_row_format was changed between CREATE TABLE and ALTER TABLE. prepare_inplace_alter_table_dict(): If we had promised that ALGORITHM=INPLACE is supported, we must preserve the ROW_FORMAT. dict_table_t::prepare_instant(): Add debug assertions to catch ROW_FORMAT mismatch. The rest of the changes are related to adding Alter_inplace_info::inplace_supported to cache the return value of handler::check_if_supported_inplace_alter(). --- .../r/default_row_format_alter,compact.rdiff | 10 ++++++++++ .../r/default_row_format_alter,redundant.rdiff | 10 ++++++++++ .../innodb/r/default_row_format_alter.result | 11 +++++++++++ .../suite/innodb/t/default_row_format_alter.test | 11 +++++++++++ sql/handler.h | 3 +++ sql/sql_alter.cc | 10 +++++----- sql/sql_alter.h | 9 +++------ sql/sql_table.cc | 16 ++++++++-------- storage/innobase/handler/handler0alter.cc | 12 ++++++++++++ 9 files changed, 73 insertions(+), 19 deletions(-) create mode 100644 mysql-test/suite/innodb/r/default_row_format_alter,compact.rdiff create mode 100644 mysql-test/suite/innodb/r/default_row_format_alter,redundant.rdiff diff --git a/mysql-test/suite/innodb/r/default_row_format_alter,compact.rdiff b/mysql-test/suite/innodb/r/default_row_format_alter,compact.rdiff new file mode 100644 index 00000000000..09095c90e29 --- /dev/null +++ b/mysql-test/suite/innodb/r/default_row_format_alter,compact.rdiff @@ -0,0 +1,10 @@ +--- default_row_format_alter.result ++++ default_row_format_alter,compact.reject +@@ -91,6 +91,6 @@ + ALTER TABLE t1 ADD b INT; + SELECT ROW_FORMAT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1'; + ROW_FORMAT +-Dynamic ++Compact + DROP TABLE t1; + SET GLOBAL innodb_default_row_format = @row_format; diff --git a/mysql-test/suite/innodb/r/default_row_format_alter,redundant.rdiff b/mysql-test/suite/innodb/r/default_row_format_alter,redundant.rdiff new file mode 100644 index 00000000000..972ee9bdac8 --- /dev/null +++ b/mysql-test/suite/innodb/r/default_row_format_alter,redundant.rdiff @@ -0,0 +1,10 @@ +--- default_row_format_alter.result ++++ default_row_format_alter,compact.reject +@@ -91,6 +91,6 @@ + ALTER TABLE t1 ADD b INT; + SELECT ROW_FORMAT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1'; + ROW_FORMAT +-Dynamic ++Redundant + DROP TABLE t1; + SET GLOBAL innodb_default_row_format = @row_format; diff --git a/mysql-test/suite/innodb/r/default_row_format_alter.result b/mysql-test/suite/innodb/r/default_row_format_alter.result index 1f349e6e2f6..42d006a2dd3 100644 --- a/mysql-test/suite/innodb/r/default_row_format_alter.result +++ b/mysql-test/suite/innodb/r/default_row_format_alter.result @@ -82,4 +82,15 @@ SHOW TABLE STATUS LIKE 't1'; Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary t1 InnoDB # Compact # # # # # # NULL # # NULL latin1_swedish_ci NULL 0 N DROP TABLE t1; +# +# MDEV-23295 Assertion fields[i].same(instant.fields[i]) failed +# +SET GLOBAL innodb_default_row_format = @row_format; +CREATE TABLE t1 (a char(8)) ENGINE=InnoDB DEFAULT CHARSET utf8; +SET GLOBAL innodb_default_row_format= COMPACT; +ALTER TABLE t1 ADD b INT; +SELECT ROW_FORMAT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1'; +ROW_FORMAT +Dynamic +DROP TABLE t1; SET GLOBAL innodb_default_row_format = @row_format; diff --git a/mysql-test/suite/innodb/t/default_row_format_alter.test b/mysql-test/suite/innodb/t/default_row_format_alter.test index 8f7217bcf0c..6690bc5bddf 100644 --- a/mysql-test/suite/innodb/t/default_row_format_alter.test +++ b/mysql-test/suite/innodb/t/default_row_format_alter.test @@ -1,4 +1,5 @@ --source include/have_innodb.inc +--source include/innodb_row_format.inc SET @row_format = @@GLOBAL.innodb_default_row_format; @@ -95,4 +96,14 @@ ALTER TABLE t1 DROP INDEX k1; SHOW TABLE STATUS LIKE 't1'; DROP TABLE t1; +--echo # +--echo # MDEV-23295 Assertion fields[i].same(instant.fields[i]) failed +--echo # +SET GLOBAL innodb_default_row_format = @row_format; +CREATE TABLE t1 (a char(8)) ENGINE=InnoDB DEFAULT CHARSET utf8; +SET GLOBAL innodb_default_row_format= COMPACT; +ALTER TABLE t1 ADD b INT; +SELECT ROW_FORMAT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='t1'; +DROP TABLE t1; + SET GLOBAL innodb_default_row_format = @row_format; diff --git a/sql/handler.h b/sql/handler.h index 3757a3ab2f9..f4399ef0f5d 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -2440,6 +2440,9 @@ public: /** true for online operation (LOCK=NONE) */ bool online; + /** which ALGORITHM and LOCK are supported by the storage engine */ + enum_alter_inplace_result inplace_supported; + /** Can be set by handler to describe why a given operation cannot be done in-place (HA_ALTER_INPLACE_NOT_SUPPORTED) or why it cannot be done diff --git a/sql/sql_alter.cc b/sql/sql_alter.cc index 5ea835f1737..21c79a046a5 100644 --- a/sql/sql_alter.cc +++ b/sql/sql_alter.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. - Copyright (c) 2016, 2018, MariaDB Corporation + Copyright (c) 2016, 2020, MariaDB Corporation This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -127,10 +127,10 @@ const char* Alter_info::lock() const } -bool Alter_info::supports_algorithm(THD *thd, enum_alter_inplace_result result, +bool Alter_info::supports_algorithm(THD *thd, const Alter_inplace_info *ha_alter_info) { - switch (result) { + switch (ha_alter_info->inplace_supported) { case HA_ALTER_INPLACE_EXCLUSIVE_LOCK: case HA_ALTER_INPLACE_SHARED_LOCK: case HA_ALTER_INPLACE_NO_LOCK: @@ -171,10 +171,10 @@ bool Alter_info::supports_algorithm(THD *thd, enum_alter_inplace_result result, } -bool Alter_info::supports_lock(THD *thd, enum_alter_inplace_result result, +bool Alter_info::supports_lock(THD *thd, const Alter_inplace_info *ha_alter_info) { - switch (result) { + switch (ha_alter_info->inplace_supported) { case HA_ALTER_INPLACE_EXCLUSIVE_LOCK: // If SHARED lock and no particular algorithm was requested, use COPY. if (requested_lock == Alter_info::ALTER_TABLE_LOCK_SHARED && diff --git a/sql/sql_alter.h b/sql/sql_alter.h index 53d0c8438f8..71920b84792 100644 --- a/sql/sql_alter.h +++ b/sql/sql_alter.h @@ -1,5 +1,5 @@ /* Copyright (c) 2010, 2014, Oracle and/or its affiliates. - Copyright (c) 2013, 2018, MariaDB Corporation. + Copyright (c) 2013, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -204,29 +204,26 @@ public: with the specified user alter algorithm. @param thd Thread handle - @param result Operation supported for inplace alter @param ha_alter_info Structure describing changes to be done by ALTER TABLE and holding data during in-place alter @retval false Supported operation @retval true Not supported value */ - bool supports_algorithm(THD *thd, enum_alter_inplace_result result, + bool supports_algorithm(THD *thd, const Alter_inplace_info *ha_alter_info); /** Check whether the given result can be supported with the specified user lock type. - @param result Operation supported for inplace alter @param ha_alter_info Structure describing changes to be done by ALTER TABLE and holding data during in-place alter @retval false Supported lock type @retval true Not supported value */ - bool supports_lock(THD *thd, enum_alter_inplace_result result, - const Alter_inplace_info *ha_alter_info); + bool supports_lock(THD *thd, const Alter_inplace_info *ha_alter_info); /** Return user requested algorithm. If user does not specify diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 949f86297a4..2a3cdedd717 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -7560,7 +7560,6 @@ static bool is_inplace_alter_impossible(TABLE *table, @param ha_alter_info Structure describing ALTER TABLE to be carried out and serving as a storage place for data used during different phases. - @param inplace_supported Enum describing the locking requirements. @param target_mdl_request Metadata request/lock on the target table name. @param alter_ctx ALTER TABLE runtime context. @@ -7585,7 +7584,6 @@ static bool mysql_inplace_alter_table(THD *thd, TABLE *table, TABLE *altered_table, Alter_inplace_info *ha_alter_info, - enum_alter_inplace_result inplace_supported, MDL_request *target_mdl_request, Alter_table_ctx *alter_ctx) { @@ -7595,6 +7593,8 @@ static bool mysql_inplace_alter_table(THD *thd, Alter_info *alter_info= ha_alter_info->alter_info; bool reopen_tables= false; bool res; + const enum_alter_inplace_result inplace_supported= + ha_alter_info->inplace_supported; DBUG_ENTER("mysql_inplace_alter_table"); @@ -10121,19 +10121,19 @@ do_continue:; if (alter_info->requested_lock == Alter_info::ALTER_TABLE_LOCK_NONE) ha_alter_info.online= true; // Ask storage engine whether to use copy or in-place - enum_alter_inplace_result inplace_supported= + ha_alter_info.inplace_supported= table->file->check_if_supported_inplace_alter(&altered_table, &ha_alter_info); - if (alter_info->supports_algorithm(thd, inplace_supported, &ha_alter_info) || - alter_info->supports_lock(thd, inplace_supported, &ha_alter_info)) + if (alter_info->supports_algorithm(thd, &ha_alter_info) || + alter_info->supports_lock(thd, &ha_alter_info)) { cleanup_table_after_inplace_alter(&altered_table); goto err_new_table_cleanup; } // If SHARED lock and no particular algorithm was requested, use COPY. - if (inplace_supported == HA_ALTER_INPLACE_EXCLUSIVE_LOCK && + if (ha_alter_info.inplace_supported == HA_ALTER_INPLACE_EXCLUSIVE_LOCK && alter_info->requested_lock == Alter_info::ALTER_TABLE_LOCK_SHARED && alter_info->algorithm(thd) == Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT && @@ -10141,7 +10141,7 @@ do_continue:; Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT) use_inplace= false; - if (inplace_supported == HA_ALTER_INPLACE_NOT_SUPPORTED) + if (ha_alter_info.inplace_supported == HA_ALTER_INPLACE_NOT_SUPPORTED) use_inplace= false; if (use_inplace) @@ -10154,7 +10154,7 @@ do_continue:; */ thd->count_cuted_fields = CHECK_FIELD_WARN; int res= mysql_inplace_alter_table(thd, table_list, table, &altered_table, - &ha_alter_info, inplace_supported, + &ha_alter_info, &target_mdl_request, &alter_ctx); thd->count_cuted_fields= save_count_cuted_fields; my_free(const_cast(frm.str)); diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 203c232ed41..840d8c2d062 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -238,6 +238,9 @@ inline void dict_table_t::prepare_instant(const dict_table_t& old, DBUG_ASSERT(old.n_cols == old.n_def); DBUG_ASSERT(n_cols == n_def); DBUG_ASSERT(old.supports_instant()); + DBUG_ASSERT(not_redundant() == old.not_redundant()); + DBUG_ASSERT(DICT_TF_HAS_ATOMIC_BLOBS(flags) + == DICT_TF_HAS_ATOMIC_BLOBS(old.flags)); DBUG_ASSERT(!persistent_autoinc || persistent_autoinc == old.persistent_autoinc); /* supports_instant() does not necessarily hold here, @@ -6206,6 +6209,15 @@ prepare_inplace_alter_table_dict( user_table = ctx->new_table; + if (ha_alter_info->inplace_supported == HA_ALTER_INPLACE_INSTANT) { + /* If we promised ALGORITHM=INSTANT capability, we must + retain the original ROW_FORMAT of the table. */ + flags = (user_table->flags & (DICT_TF_MASK_COMPACT + | DICT_TF_MASK_ATOMIC_BLOBS)) + | (flags & ~(DICT_TF_MASK_COMPACT + | DICT_TF_MASK_ATOMIC_BLOBS)); + } + trx_start_if_not_started_xa(ctx->prebuilt->trx, true); if (ha_alter_info->handler_flags From a1f899a8abb6bb0b046db28d6da9dd4b7fc3c8c4 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Fri, 24 Jul 2020 16:52:42 +0530 Subject: [PATCH 128/188] MDEV-23233: Race condition for btr_search_drop_page_hash_index() in buf_page_create() commit ad6171b91cac33e70bb28fa6865488b2c65e858c (MDEV-22456) introduced code to buf_page_create() that would lazily drop adaptive hash index entries for an index that has been evicted from the data dictionary cache. Unfortunately, that call was missing adequate protection. While the btr_search_drop_page_hash_index(block) was executing, the block could be reused for something else. buf_page_create(): If btr_search_drop_page_hash_index() must be invoked, pin the block before releasing the buf_pool->page_hash lock, so that the block cannot be grabbed by other threads. --- storage/innobase/buf/buf0buf.cc | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 2456b9aeb5f..ad53a11ea66 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -5584,15 +5584,30 @@ buf_page_create( && !buf_pool_watch_is_sentinel(buf_pool, &block->page)) { ut_d(block->page.file_page_was_freed = FALSE); +#ifdef BTR_CUR_HASH_ADAPT + bool drop_hash_entry = + (block->page.state == BUF_BLOCK_FILE_PAGE + && block->index); + + if (drop_hash_entry) { + mutex_enter(&block->mutex); + buf_page_set_sticky(&block->page); + mutex_exit(&block->mutex); + } +#endif /* Page can be found in buf_pool */ buf_pool_mutex_exit(buf_pool); rw_lock_x_unlock(hash_lock); buf_block_free(free_block); #ifdef BTR_CUR_HASH_ADAPT - if (block->page.state == BUF_BLOCK_FILE_PAGE - && UNIV_LIKELY_NULL(block->index)) { + if (drop_hash_entry) { btr_search_drop_page_hash_index(block); + buf_pool_mutex_enter(buf_pool); + mutex_enter(&block->mutex); + buf_page_unset_sticky(&block->page); + mutex_exit(&block->mutex); + buf_pool_mutex_exit(buf_pool); } #endif /* BTR_CUR_HASH_ADAPT */ From 186d9d0d7210a74d24a7d7c7651ab1bdf364dcca Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Mon, 22 Jun 2020 14:24:31 +1000 Subject: [PATCH 129/188] MDEV-12474: rocksdb: mtr - rocksdb.concurrent_alter use sh FreeBSD doesn't have bash installed by default and sh has sufficient job control for this test. $ mysql-test/mtr --mem --max-test-fail=30 --force --parallel=1 rocksdb.concurrent_alter Logging: /home/dan/mariadb-server-10.5/mysql-test/mysql-test-run.pl --mem --max-test-fail=30 --force --parallel=1 rocksdb.concurrent_alter vardir: /usr/home/dan/build-mariadb-server-10.5/mysql-test/var Checking leftover processes... Removing old var directory... Creating var directory '/usr/home/dan/build-mariadb-server-10.5/mysql-test/var'... - symlinking 'var' to '/tmp/var_auto_P81m' Checking supported features... MariaDB Version 10.5.4-MariaDB - SSL connections supported - binaries built with wsrep patch Collecting tests... Installing system database... ============================================================================== TEST RESULT TIME (ms) or COMMENT -------------------------------------------------------------------------- worker[1] Using MTR_BUILD_THREAD 300, with reserved ports 16000..16019 rocksdb.concurrent_alter 'write_committed' [ pass ] 16348 rocksdb.concurrent_alter 'write_prepared' [ pass ] 16771 -------------------------------------------------------------------------- The servers were restarted 1 times Spent 33.119 of 41 seconds executing testcases Completed: All 2 tests were successful. $ uname -a FreeBSD freebsd 12.1-RELEASE-p6 FreeBSD 12.1-RELEASE-p6 GENERIC amd64 --- storage/rocksdb/mysql-test/rocksdb/t/concurrent_alter.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/rocksdb/mysql-test/rocksdb/t/concurrent_alter.test b/storage/rocksdb/mysql-test/rocksdb/t/concurrent_alter.test index 3ebdd67a1a6..aee653830e2 100644 --- a/storage/rocksdb/mysql-test/rocksdb/t/concurrent_alter.test +++ b/storage/rocksdb/mysql-test/rocksdb/t/concurrent_alter.test @@ -30,7 +30,7 @@ $MYSQL_SLAP --silent --delimiter=";" --query="select * from a1 where b=1" --conc wait EOF ---exec bash $MYSQL_TMP_DIR/concurrent_alter.sh +--exec sh $MYSQL_TMP_DIR/concurrent_alter.sh let $server_charset=`select @@character_set_server`; --replace_result $server_charset DEFAULT_CHARSET From d88ea260882ca414e940cd6af225617f00503f71 Mon Sep 17 00:00:00 2001 From: Krunal Bauskar Date: Mon, 27 Jul 2020 18:38:10 +0800 Subject: [PATCH 130/188] MDEV-23137: RocksDB: undefined reference to crc32c_arm64 RocksDB fails to build on arm64: undefined reference to `crc32c_arm64(unsigned int, unsigned char const*, unsigned int)' MariaDB uses storage/rocksdb/build_rocksdb.cmake to compile RocksDB. Said cmake missed adding crc32c_arm64 compilation target so if machine native architecture supported crc32 then complier would enable usage of function defined in crc32c_arm64 causing the listed error. Added crc32c_arm64 complition target. closes #1642 --- storage/rocksdb/build_rocksdb.cmake | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/storage/rocksdb/build_rocksdb.cmake b/storage/rocksdb/build_rocksdb.cmake index 3f3dca7e990..7d2252c5f77 100644 --- a/storage/rocksdb/build_rocksdb.cmake +++ b/storage/rocksdb/build_rocksdb.cmake @@ -442,6 +442,16 @@ else() util/crc32c_ppc.c util/crc32c_ppc_asm.S) endif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64") + # aarch + if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64") + CHECK_CXX_COMPILER_FLAG("-march=armv8-a+crc+crypto" HAS_ARMV8_CRC) + if(HAS_ARMV8_CRC) + message(STATUS " HAS_ARMV8_CRC yes") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a+crc+crypto -Wno-unused-function") + list(APPEND ROCKSDB_SOURCES + util/crc32c_arm64.cc) + endif(HAS_ARMV8_CRC) + endif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64") endif() SET(SOURCES) FOREACH(s ${ROCKSDB_SOURCES}) From 715beee46abb4c29bffd6f9c5fd5ee95da55bf4f Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Thu, 2 Jul 2020 09:39:13 +1000 Subject: [PATCH 131/188] MDEV-23051: riscv64 fails build (atomics) riscv64 fails to build because the use of #include needs to link with -latomic. per https://github.com/riscv/riscv-gnu-toolchain/issues/183#issuecomment-253721765 --- storage/rocksdb/CMakeLists.txt | 7 +++++++ storage/rocksdb/build_rocksdb.cmake | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/storage/rocksdb/CMakeLists.txt b/storage/rocksdb/CMakeLists.txt index cef5a8b2517..506dead7a6e 100644 --- a/storage/rocksdb/CMakeLists.txt +++ b/storage/rocksdb/CMakeLists.txt @@ -108,9 +108,15 @@ SET(ROCKSDB_SE_SOURCES # This is a strong requirement coming from RocksDB. No conditional checks here. #ADD_DEFINITIONS(-DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX #) +if(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") + SET(ATOMIC_EXTRA_LIBS -latomic) +else() + SET(ATOMIC_EXTRA_LIBS) +endif() MYSQL_ADD_PLUGIN(rocksdb ${ROCKSDB_SE_SOURCES} MODULE_ONLY STORAGE_ENGINE MODULE_OUTPUT_NAME ha_rocksdb + LINK_LIBRARIES ${ATOMIC_EXTRA_LIBS} COMPONENT rocksdb-engine) IF(NOT TARGET rocksdb) @@ -161,6 +167,7 @@ TARGET_LINK_LIBRARIES(rocksdb_aux_lib rocksdblib ${ZLIB_LIBRARY}) if (UNIX AND NOT APPLE) TARGET_LINK_LIBRARIES(rocksdb_aux_lib -lrt) endif() +TARGET_LINK_LIBRARIES(rocksdb_aux_lib ${ATOMIC_EXTRA_LIBS}) # IF (WITH_JEMALLOC) # FIND_LIBRARY(JEMALLOC_LIBRARY diff --git a/storage/rocksdb/build_rocksdb.cmake b/storage/rocksdb/build_rocksdb.cmake index 7d2252c5f77..adad1314594 100644 --- a/storage/rocksdb/build_rocksdb.cmake +++ b/storage/rocksdb/build_rocksdb.cmake @@ -132,6 +132,10 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64") ADD_DEFINITIONS(-DHAVE_POWER8 -DHAS_ALTIVEC) endif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64") +if(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64") + set(SYSTEM_LIBS ${SYSTEM_LIBS} -latomic) +endif() + option(WITH_FALLOCATE "build with fallocate" ON) if(WITH_FALLOCATE AND UNIX) From fecc6caa27971bd9c049671ddedef8c334e71062 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Mon, 22 Jun 2020 13:31:59 +1000 Subject: [PATCH 132/188] MDEV-22621: perfschema add FreeBSD include header for pthread_getthreadid_np --- storage/perfschema/my_thread.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/storage/perfschema/my_thread.h b/storage/perfschema/my_thread.h index 542035bda0f..12e01a510ed 100644 --- a/storage/perfschema/my_thread.h +++ b/storage/perfschema/my_thread.h @@ -10,6 +10,10 @@ #include #endif +#ifdef HAVE_PTHREAD_GETTHREADID_NP +#include +#endif + typedef pthread_key_t thread_local_key_t; typedef pthread_t my_thread_handle; typedef pthread_attr_t my_thread_attr_t; From ba191f7e43962b8f36699c087786cb7ae9ff1fe5 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Wed, 29 Apr 2020 18:23:17 +1000 Subject: [PATCH 133/188] mtr: mysqld--help-aria test on OSX fail Previous test failure: --- /Users/travis/build/grooverdan/mariadb-server/mysql-test/main/mysqld--help-aria.result 2020-04-29 03:44:40.000000000 +0000 +++ /Users/travis/build/grooverdan/mariadb-server/mysql-test/main/mysqld--help-aria.reject 2020-04-29 04:19:13.000000000 +0000 @@ -1,3 +1,4 @@ +[Warning] Setting lower_case_table_names=2 because file system for /Users/travis/build/grooverdan/mariadb-server/mysql-test/var/4/mariadbd.1/data/ is case insensitive [ERROR] mariadbd: Can't lock aria aria_log_control for exclusive use, error: #. Will retry for 0 seconds [ERROR] Plugin 'Aria' init function returned error. [ERROR] Plugin 'Aria' registration as a STORAGE ENGINE failed. @@ -9,4 +10,5 @@ # # Check with existing directory # +[Warning] Setting lower_case_table_names=2 because file system for /Users/travis/build/grooverdan/mariadb-server/mysql-test/var/tmp/4/help/ is case insensitive [Warning] Could not open mysql.plugin table: "Table 'mysql.plugin' doesn't exist". Some options may be missing from the help text --- mysql-test/main/mysqld--help-aria.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mysql-test/main/mysqld--help-aria.test b/mysql-test/main/mysqld--help-aria.test index 4082951b10a..253a46492f0 100644 --- a/mysql-test/main/mysqld--help-aria.test +++ b/mysql-test/main/mysqld--help-aria.test @@ -7,7 +7,7 @@ --source include/not_windows.inc ---let $args=--table-cache=5 --max-connections=10 --log-warnings=1 --silent-startup --help --verbose +--let $args=--table-cache=5 --max-connections=10 --log-warnings=1 --silent-startup --lower-case-table-names=1 --help --verbose --exec $MYSQLD_CMD $args > $MYSQL_TMP_DIR/mysqld--help2.txt 2> $MYSQL_TMP_DIR/mysqld--help2.err --replace_regex /mysqld/mariadbd/ /\d\d\d\d-\d*-\d* *\d*:\d*:\d* \d* // /control file '.*aria_log_control'/aria_log_control/ /error: \d+/error: #/ From cae4b3f8113f266b7b6636e222e9cd9df6080327 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Mon, 22 Jun 2020 14:39:15 +1000 Subject: [PATCH 134/188] rocksdb: FreeBSD disable jemalloc search FreeBSD's inbuilt default jemalloc means its pointless to do a package search on it. The paths are already set by the system defaults. --- storage/rocksdb/build_rocksdb.cmake | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/storage/rocksdb/build_rocksdb.cmake b/storage/rocksdb/build_rocksdb.cmake index adad1314594..6911b636996 100644 --- a/storage/rocksdb/build_rocksdb.cmake +++ b/storage/rocksdb/build_rocksdb.cmake @@ -18,17 +18,16 @@ if(WIN32) # include(${ROCKSDB_SOURCE_DIR}/thirdparty.inc) else() option(WITH_ROCKSDB_JEMALLOC "build RocksDB with JeMalloc" OFF) - if(WITH_ROCKSDB_JEMALLOC) - find_package(JeMalloc REQUIRED) - add_definitions(-DROCKSDB_JEMALLOC) - ADD_DEFINITIONS(-DROCKSDB_MALLOC_USABLE_SIZE) - include_directories(${JEMALLOC_INCLUDE_DIR}) - endif() if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") # FreeBSD has jemaloc as default malloc add_definitions(-DROCKSDB_JEMALLOC) ADD_DEFINITIONS(-DROCKSDB_MALLOC_USABLE_SIZE) set(WITH_JEMALLOC ON) + elseif(WITH_ROCKSDB_JEMALLOC) + find_package(JeMalloc REQUIRED) + add_definitions(-DROCKSDB_JEMALLOC) + ADD_DEFINITIONS(-DROCKSDB_MALLOC_USABLE_SIZE) + include_directories(${JEMALLOC_INCLUDE_DIR}) endif() endif() From 3cb9131ac24546a15bc7eb4b68fedc76906a344f Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Wed, 15 Jul 2020 11:23:19 +1000 Subject: [PATCH 135/188] MDEV-23175: my_timer_milliseconds clock_gettime for multiple platfomrs Small postfix to MDEV-23175 to ensure faster option on FreeBSD and compatibility to Solaris that isn't high resolution. ftime is left as a backup in case an implementation doesn't contain any of these clocks. FreeBSD $ ./unittest/mysys/my_rdtsc-t 1..11 # ----- Routine --------------- # myt.cycles.routine : 5 # myt.nanoseconds.routine : 11 # myt.microseconds.routine : 13 # myt.milliseconds.routine : 11 # myt.ticks.routine : 17 # ----- Frequency ------------- # myt.cycles.frequency : 3610295566 # myt.nanoseconds.frequency : 1000000000 # myt.microseconds.frequency : 1000000 # myt.milliseconds.frequency : 899 # myt.ticks.frequency : 136 # ----- Resolution ------------ # myt.cycles.resolution : 1 # myt.nanoseconds.resolution : 1 # myt.microseconds.resolution : 1 # myt.milliseconds.resolution : 7 # myt.ticks.resolution : 1 # ----- Overhead -------------- # myt.cycles.overhead : 26 # myt.nanoseconds.overhead : 19140 # myt.microseconds.overhead : 19036 # myt.milliseconds.overhead : 578 # myt.ticks.overhead : 21544 ok 1 - my_timer_init() did not crash ok 2 - The cycle timer is strictly increasing ok 3 - The cycle timer is implemented ok 4 - The nanosecond timer is increasing ok 5 - The nanosecond timer is implemented ok 6 - The microsecond timer is increasing ok 7 - The microsecond timer is implemented ok 8 - The millisecond timer is increasing ok 9 - The millisecond timer is implemented ok 10 - The tick timer is increasing ok 11 - The tick timer is implemented --- configure.cmake | 5 +---- mysys/my_rdtsc.c | 32 ++++++++++++++++++++++---------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/configure.cmake b/configure.cmake index f3f68775b50..a7e044b13d2 100644 --- a/configure.cmake +++ b/configure.cmake @@ -441,12 +441,9 @@ CHECK_INCLUDE_FILES(ia64intrin.h HAVE_IA64INTRIN_H) CHECK_FUNCTION_EXISTS(times HAVE_TIMES) CHECK_FUNCTION_EXISTS(gettimeofday HAVE_GETTIMEOFDAY) CHECK_FUNCTION_EXISTS(read_real_time HAVE_READ_REAL_TIME) - -IF(NOT HAVE_CLOCK_GETTIME) # This should work on AIX. -CHECK_FUNCTION_EXISTS(ftime HAVE_FTIME) -ENDIF() +CHECK_FUNCTION_EXISTS(ftime HAVE_FTIME) # This is still a normal call for milliseconds. CHECK_FUNCTION_EXISTS(time HAVE_TIME) diff --git a/mysys/my_rdtsc.c b/mysys/my_rdtsc.c index 514fd4c74ea..40b78986985 100644 --- a/mysys/my_rdtsc.c +++ b/mysys/my_rdtsc.c @@ -75,7 +75,7 @@ #endif #endif -#if !defined(CLOCK_GETTIME) && defined(HAVE_SYS_TIMEB_H) && defined(HAVE_FTIME) +#if defined(HAVE_SYS_TIMEB_H) && defined(HAVE_FTIME) #include /* for ftime */ #endif @@ -173,17 +173,27 @@ ulonglong my_timer_microseconds(void) milliseconds. */ +#if defined(HAVE_CLOCK_GETTIME) +#if defined(CLOCK_MONOTONIC_FAST) +/* FreeBSD */ +#define MY_CLOCK_ID CLOCK_MONOTONIC_FAST +#elif defined(CLOCK_MONOTONIC_COARSE) +/* Linux */ +#define MY_CLOCK_ID CLOCK_MONOTONIC_COARSE +#elif defined(CLOCK_MONOTONIC) +/* POSIX (includes OSX) */ +#define MY_CLOCK_ID CLOCK_MONOTONIC +#elif defined(CLOCK_REALTIME) +/* Solaris (which doesn't seem to have MONOTONIC) */ +#define MY_CLOCK_ID CLOCK_REALTIME +#endif +#endif + ulonglong my_timer_milliseconds(void) { -#if defined(HAVE_CLOCK_GETTIME) +#if defined(MY_CLOCK_ID) struct timespec tp; -#ifdef CLOCK_MONOTONIC_COARSE - /* Linux */ - clock_gettime(CLOCK_MONOTONIC_COARSE, &tp); -#else - /* POSIX */ - clock_gettime(CLOCK_MONOTONIC, &tp); -#endif + clock_gettime(MY_CLOCK_ID, &tp); return (ulonglong)tp.tv_sec * 1000 + (ulonglong)tp.tv_nsec / 1000000; #elif defined(HAVE_SYS_TIMEB_H) && defined(HAVE_FTIME) /* ftime() is obsolete but maybe the platform is old */ @@ -436,7 +446,9 @@ void my_timer_init(MY_TIMER_INFO *mti) /* milliseconds */ mti->milliseconds.frequency= 1000; /* initial assumption */ -#if defined(HAVE_SYS_TIMEB_H) && defined(HAVE_FTIME) +#ifdef MY_CLOCK_ID + mti->milliseconds.routine= MY_TIMER_ROUTINE_CLOCK_GETTIME; +#elif defined(HAVE_SYS_TIMEB_H) && defined(HAVE_FTIME) mti->milliseconds.routine= MY_TIMER_ROUTINE_FTIME; #elif defined(_WIN32) mti->milliseconds.routine= MY_TIMER_ROUTINE_GETSYSTEMTIMEASFILETIME; From 459b87f6b4ae9633f831e245e6a345bbab55cf27 Mon Sep 17 00:00:00 2001 From: Dan Solodko Date: Thu, 18 Jun 2020 11:02:19 +0300 Subject: [PATCH 136/188] MDEV-9911: NTILE must return an error when parameter is not stable --- mysql-test/r/win_ntile.result | 78 +++++++++++++++++++++++++++++++++++ mysql-test/t/win_ntile.test | 43 +++++++++++++++++++ sql/item_windowfunc.h | 11 +++-- 3 files changed, 129 insertions(+), 3 deletions(-) diff --git a/mysql-test/r/win_ntile.result b/mysql-test/r/win_ntile.result index 41cb1a594bf..4d02a230e13 100644 --- a/mysql-test/r/win_ntile.result +++ b/mysql-test/r/win_ntile.result @@ -433,3 +433,81 @@ ntile((select a from t1)) over (partition by b order by pk) from t1; ERROR 21000: Subquery returns more than 1 row drop table t1; +# +# MDEV-9911 NTILE must return an error when parameter is not stable +# +create table t1 ( +pk int primary key, +c1 nvarchar(10), +c2 nvarchar(10), +c3 int +); +insert into t1 values +(1, 'Mark', 'Male', 5), +(2, 'John', 'Male', 5), +(3, 'Pam', 'Female', 6), +(4, 'Sara', 'Female', 6), +(5, 'Todd', 'Male', 5), +(6, 'Mary', 'Female', 6), +(7, 'Ben', 'Male', 5), +(8, 'Jodi', 'Female', 6), +(9, 'Tom', 'Male', 5), +(10, 'Lucky', 'Male', 5), +(11, 'Mark', 'Male', 5), +(12, 'John', 'Male', 5), +(13, 'Pam', 'Female', 6), +(14, 'Sara', 'Female', 6), +(15, 'Todd', 'Male', 5), +(16, 'Mary', 'Female', 6), +(17, 'Ben', 'Male', 5), +(18, 'Jodi', 'Female', 6), +(19, 'Tom', 'Male', 5), +(20, 'Lucky', 'Male', 5); +select c1, c2, c3, ntile(6) over (partition by c2 order by pk) from t1; +c1 c2 c3 ntile(6) over (partition by c2 order by pk) +Pam Female 6 1 +Sara Female 6 1 +Mary Female 6 2 +Jodi Female 6 2 +Pam Female 6 3 +Sara Female 6 4 +Mary Female 6 5 +Jodi Female 6 6 +Mark Male 5 1 +John Male 5 1 +Todd Male 5 2 +Ben Male 5 2 +Tom Male 5 3 +Lucky Male 5 3 +Mark Male 5 4 +John Male 5 4 +Todd Male 5 5 +Ben Male 5 5 +Tom Male 5 6 +Lucky Male 5 6 +select c1, c2, c3, ntile(c3) over (partition by c2 order by pk) from t1; +c1 c2 c3 ntile(c3) over (partition by c2 order by pk) +Pam Female 6 1 +Sara Female 6 1 +Mary Female 6 2 +Jodi Female 6 2 +Pam Female 6 3 +Sara Female 6 4 +Mary Female 6 5 +Jodi Female 6 6 +Mark Male 5 1 +John Male 5 1 +Todd Male 5 1 +Ben Male 5 2 +Tom Male 5 2 +Lucky Male 5 2 +Mark Male 5 3 +John Male 5 3 +Todd Male 5 4 +Ben Male 5 4 +Tom Male 5 5 +Lucky Male 5 5 +update t1 set c3= 1 where pk = 1; +select c1, c2, c3, ntile(c3) over (partition by c2 order by pk) from t1; +ERROR HY000: Argument of NTILE must be greater than 0 +drop table t1; diff --git a/mysql-test/t/win_ntile.test b/mysql-test/t/win_ntile.test index 6f12e1f4005..c65ba7e1521 100644 --- a/mysql-test/t/win_ntile.test +++ b/mysql-test/t/win_ntile.test @@ -168,4 +168,47 @@ select pk, a, b, from t1; +drop table t1; + +--echo # +--echo # MDEV-9911 NTILE must return an error when parameter is not stable +--echo # + +create table t1 ( + pk int primary key, + c1 nvarchar(10), + c2 nvarchar(10), + c3 int +); + +insert into t1 values + (1, 'Mark', 'Male', 5), + (2, 'John', 'Male', 5), + (3, 'Pam', 'Female', 6), + (4, 'Sara', 'Female', 6), + (5, 'Todd', 'Male', 5), + (6, 'Mary', 'Female', 6), + (7, 'Ben', 'Male', 5), + (8, 'Jodi', 'Female', 6), + (9, 'Tom', 'Male', 5), + (10, 'Lucky', 'Male', 5), + (11, 'Mark', 'Male', 5), + (12, 'John', 'Male', 5), + (13, 'Pam', 'Female', 6), + (14, 'Sara', 'Female', 6), + (15, 'Todd', 'Male', 5), + (16, 'Mary', 'Female', 6), + (17, 'Ben', 'Male', 5), + (18, 'Jodi', 'Female', 6), + (19, 'Tom', 'Male', 5), + (20, 'Lucky', 'Male', 5); +# Correct usage of NTILE with a fix argument NTILE(6). +select c1, c2, c3, ntile(6) over (partition by c2 order by pk) from t1; +# Correct usage - constant NTILE (argument) in each partition. +select c1, c2, c3, ntile(c3) over (partition by c2 order by pk) from t1; + +update t1 set c3= 1 where pk = 1; +--error ER_INVALID_NTILE_ARGUMENT +select c1, c2, c3, ntile(c3) over (partition by c2 order by pk) from t1; + drop table t1; diff --git a/sql/item_windowfunc.h b/sql/item_windowfunc.h index 85957949053..36b0d087f12 100644 --- a/sql/item_windowfunc.h +++ b/sql/item_windowfunc.h @@ -618,7 +618,8 @@ class Item_sum_ntile : public Item_sum_window_with_row_count public: Item_sum_ntile(THD* thd, Item* num_quantiles_expr) : Item_sum_window_with_row_count(thd, num_quantiles_expr), - current_row_count_(0) {}; + current_row_count_(0), + n_old_val_(0) {}; double val_real() { @@ -635,11 +636,13 @@ class Item_sum_ntile : public Item_sum_window_with_row_count longlong num_quantiles= get_num_quantiles(); - if (num_quantiles <= 0) { + if (num_quantiles <= 0 || + (static_cast(num_quantiles) != n_old_val_ && n_old_val_ > 0)) + { my_error(ER_INVALID_NTILE_ARGUMENT, MYF(0)); return true; } - + n_old_val_= static_cast(num_quantiles); null_value= false; ulonglong quantile_size = get_row_count() / num_quantiles; ulonglong extra_rows = get_row_count() - quantile_size * num_quantiles; @@ -665,6 +668,7 @@ class Item_sum_ntile : public Item_sum_window_with_row_count { current_row_count_= 0; set_row_count(0); + n_old_val_= 0; } const char*func_name() const @@ -683,6 +687,7 @@ class Item_sum_ntile : public Item_sum_window_with_row_count private: longlong get_num_quantiles() { return args[0]->val_int(); } ulong current_row_count_; + ulonglong n_old_val_; }; From c6eb21cd878f8762b3abb12813403ed8e04fee0c Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Fri, 24 Jul 2020 09:59:38 +0200 Subject: [PATCH 137/188] MDEV-21998: Server crashes in st_select_lex::add_table_to_list upon mix of KILL and sequences Continue support the hack of current select equal builtin select if selects stack is empty even after subselects. --- mysql-test/main/parser.result | 8 ++++++++ mysql-test/main/parser.test | 8 ++++++++ mysql-test/main/signal.result | 6 +++--- mysql-test/main/signal.test | 6 +++--- mysql-test/main/sp-error.result | 4 ++-- mysql-test/main/sp-error.test | 4 ++-- mysql-test/main/sp.result | 18 +++++++++--------- mysql-test/main/sp.test | 18 +++++++++--------- .../compat/oracle/r/sp-cursor-rowtype.result | 2 +- mysql-test/suite/compat/oracle/r/sp.result | 8 ++++---- .../compat/oracle/t/sp-cursor-rowtype.test | 2 +- mysql-test/suite/compat/oracle/t/sp.test | 8 ++++---- sql/sql_lex.cc | 14 ++++++++++---- sql/sql_lex.h | 5 +++-- 14 files changed, 67 insertions(+), 44 deletions(-) diff --git a/mysql-test/main/parser.result b/mysql-test/main/parser.result index ad22cd886f7..37f510c8ce3 100644 --- a/mysql-test/main/parser.result +++ b/mysql-test/main/parser.result @@ -1893,4 +1893,12 @@ i 1 i 2 +# +# MDEV-21998: Server crashes in st_select_lex::add_table_to_list +# upon mix of KILL and sequences +# +KILL ( SELECT 1 ) + LASTVAL(s); +ERROR 42000: KILL does not support subqueries or stored functions +KILL LASTVAL(s); +ERROR 42000: KILL does not support subqueries or stored functions # End of 10.4 tests diff --git a/mysql-test/main/parser.test b/mysql-test/main/parser.test index 09fe73b7dbe..b8ea7bd22e4 100644 --- a/mysql-test/main/parser.test +++ b/mysql-test/main/parser.test @@ -1677,6 +1677,14 @@ $$ DELIMITER ;$$ +--echo # +--echo # MDEV-21998: Server crashes in st_select_lex::add_table_to_list +--echo # upon mix of KILL and sequences +--echo # +--error ER_SUBQUERIES_NOT_SUPPORTED +KILL ( SELECT 1 ) + LASTVAL(s); +--error ER_SUBQUERIES_NOT_SUPPORTED +KILL LASTVAL(s); --echo # End of 10.4 tests diff --git a/mysql-test/main/signal.result b/mysql-test/main/signal.result index 40b1609fc26..b5b479db017 100644 --- a/mysql-test/main/signal.result +++ b/mysql-test/main/signal.result @@ -2285,13 +2285,13 @@ begin DECLARE foo CONDITION FOR SQLSTATE '12345'; SIGNAL foo SET MYSQL_ERRNO = `65`; /* illegal */ end $$ -ERROR 42S22: Unknown column '65' in 'field list' +ERROR 42000: Undeclared variable: 65 create procedure test_signal() begin DECLARE foo CONDITION FOR SQLSTATE '12345'; SIGNAL foo SET MYSQL_ERRNO = `A`; /* illegal */ end $$ -ERROR 42S22: Unknown column 'A' in 'field list' +ERROR 42000: Undeclared variable: A create procedure test_signal() begin DECLARE foo CONDITION FOR SQLSTATE '12345'; @@ -2342,7 +2342,7 @@ DECLARE foo CONDITION FOR SQLSTATE '12345'; SIGNAL foo SET MYSQL_ERRNO = 1000, MESSAGE_TEXT = `Hello`; end $$ -ERROR 42S22: Unknown column 'Hello' in 'field list' +ERROR 42000: Undeclared variable: Hello create procedure test_signal() begin DECLARE foo CONDITION FOR SQLSTATE '12345'; diff --git a/mysql-test/main/signal.test b/mysql-test/main/signal.test index 5b40863b0e6..22cfc080895 100644 --- a/mysql-test/main/signal.test +++ b/mysql-test/main/signal.test @@ -2546,7 +2546,7 @@ end $$ call test_signal $$ drop procedure test_signal $$ --- error ER_BAD_FIELD_ERROR +-- error ER_SP_UNDECLARED_VAR create procedure test_signal() begin DECLARE foo CONDITION FOR SQLSTATE '12345'; @@ -2554,7 +2554,7 @@ begin end $$ --- error ER_BAD_FIELD_ERROR +-- error ER_SP_UNDECLARED_VAR create procedure test_signal() begin DECLARE foo CONDITION FOR SQLSTATE '12345'; @@ -2616,7 +2616,7 @@ end $$ call test_signal $$ drop procedure test_signal $$ --- error ER_BAD_FIELD_ERROR +-- error ER_SP_UNDECLARED_VAR create procedure test_signal() begin DECLARE foo CONDITION FOR SQLSTATE '12345'; diff --git a/mysql-test/main/sp-error.result b/mysql-test/main/sp-error.result index d77928fcf5e..1fe5bd6b77b 100644 --- a/mysql-test/main/sp-error.result +++ b/mysql-test/main/sp-error.result @@ -454,7 +454,7 @@ else set b = a; end if; end| -ERROR 42S22: Unknown column 'aa' in 'field list' +ERROR 42000: Undeclared variable: aa create procedure bug4344() drop procedure bug4344| ERROR HY000: Can't drop or alter a PROCEDURE from within another stored routine create procedure bug4344() drop function bug4344| @@ -1069,7 +1069,7 @@ IF bug13037_foo THEN SELECT 1; END IF; END| -ERROR 42S22: Unknown column 'bug13037_foo' in 'field list' +ERROR 42000: Undeclared variable: bug13037_foo CREATE PROCEDURE bug13037_p2() BEGIN SET @bug13037_foo = bug13037_bar; diff --git a/mysql-test/main/sp-error.test b/mysql-test/main/sp-error.test index 4b2169aad94..45a54fddad4 100644 --- a/mysql-test/main/sp-error.test +++ b/mysql-test/main/sp-error.test @@ -615,7 +615,7 @@ call bug2653_1(1, @b)| drop procedure bug2653_1| ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR create procedure bug2653_2(a int, out b int) begin if aa < 0 then @@ -1508,7 +1508,7 @@ DROP PROCEDURE IF EXISTS bug13037_p3; delimiter |; ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR CREATE PROCEDURE bug13037_p1() BEGIN IF bug13037_foo THEN diff --git a/mysql-test/main/sp.result b/mysql-test/main/sp.result index 376f44e3b01..d40516da88e 100644 --- a/mysql-test/main/sp.result +++ b/mysql-test/main/sp.result @@ -4186,7 +4186,7 @@ select v, isnull(v); end if; end; end| -ERROR 42S22: Unknown column 'undefined_var' in 'field list' +ERROR 42000: Undeclared variable: undefined_var create procedure bug14643_2() begin declare continue handler for sqlexception select 'boo' as 'Handler'; @@ -4198,7 +4198,7 @@ select 2; end case; select undefined_var; end| -ERROR 42S22: Unknown column 'undefined_var' in 'field list' +ERROR 42000: Undeclared variable: undefined_var drop procedure if exists bug14304| drop table if exists t3, t4| create table t3(a int primary key auto_increment)| @@ -4228,7 +4228,7 @@ create procedure bug14376() begin declare x int default x; end| -ERROR 42S22: Unknown column 'x' in 'field list' +ERROR 42000: Undeclared variable: x create procedure bug14376() begin declare x int default 42; @@ -4483,7 +4483,7 @@ select 'no' as 'v'; end if; select 'done' as 'End'; end| -ERROR 42S22: Unknown column 'v' in 'field list' +ERROR 42000: Undeclared variable: v create procedure bug14498_2() begin declare continue handler for sqlexception select 'error' as 'Handler'; @@ -4492,7 +4492,7 @@ select 'yes' as 'v'; end while; select 'done' as 'End'; end| -ERROR 42S22: Unknown column 'v' in 'field list' +ERROR 42000: Undeclared variable: v create procedure bug14498_3() begin declare continue handler for sqlexception select 'error' as 'Handler'; @@ -4501,7 +4501,7 @@ select 'maybe' as 'v'; until v end repeat; select 'done' as 'End'; end| -ERROR 42S22: Unknown column 'v' in 'field list' +ERROR 42000: Undeclared variable: v create procedure bug14498_4() begin declare continue handler for sqlexception select 'error' as 'Handler'; @@ -4515,7 +4515,7 @@ select '?' as 'v'; end case; select 'done' as 'End'; end| -ERROR 42S22: Unknown column 'v' in 'field list' +ERROR 42000: Undeclared variable: v create procedure bug14498_5() begin declare continue handler for sqlexception select 'error' as 'Handler'; @@ -4529,7 +4529,7 @@ select '?' as 'v'; end case; select 'done' as 'End'; end| -ERROR 42S22: Unknown column 'v' in 'field list' +ERROR 42000: Undeclared variable: v drop table if exists t3| drop procedure if exists bug15231_1| drop procedure if exists bug15231_2| @@ -8403,7 +8403,7 @@ DECLARE name VARCHAR(10); SET name="hello"; call p1(name2); END| -ERROR 42S22: Unknown column 'name2' in 'field list' +ERROR 42000: Undeclared variable: name2 call p2(); a hello diff --git a/mysql-test/main/sp.test b/mysql-test/main/sp.test index 7d1e8e2a8f9..bddd07bdb6c 100644 --- a/mysql-test/main/sp.test +++ b/mysql-test/main/sp.test @@ -5046,7 +5046,7 @@ drop procedure if exists bug14643_1| drop procedure if exists bug14643_2| --enable_warnings ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR create procedure bug14643_1() begin declare continue handler for sqlexception select 'boo' as 'Handler'; @@ -5062,7 +5062,7 @@ begin end; end| ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR create procedure bug14643_2() begin declare continue handler for sqlexception select 'boo' as 'Handler'; @@ -5117,7 +5117,7 @@ drop table t3, t4| drop procedure if exists bug14376| --enable_warnings ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR create procedure bug14376() begin declare x int default x; @@ -5344,7 +5344,7 @@ drop procedure if exists bug14498_4| drop procedure if exists bug14498_5| --enable_warnings ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR create procedure bug14498_1() begin declare continue handler for sqlexception select 'error' as 'Handler'; @@ -5357,7 +5357,7 @@ begin select 'done' as 'End'; end| ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR create procedure bug14498_2() begin declare continue handler for sqlexception select 'error' as 'Handler'; @@ -5368,7 +5368,7 @@ begin select 'done' as 'End'; end| ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR create procedure bug14498_3() begin declare continue handler for sqlexception select 'error' as 'Handler'; @@ -5379,7 +5379,7 @@ begin select 'done' as 'End'; end| ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR create procedure bug14498_4() begin declare continue handler for sqlexception select 'error' as 'Handler'; @@ -5395,7 +5395,7 @@ begin select 'done' as 'End'; end| ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR create procedure bug14498_5() begin declare continue handler for sqlexception select 'error' as 'Handler'; @@ -9931,7 +9931,7 @@ BEGIN call p1(name); END| ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR CREATE OR REPLACE PROCEDURE p3 () BEGIN DECLARE name VARCHAR(10); diff --git a/mysql-test/suite/compat/oracle/r/sp-cursor-rowtype.result b/mysql-test/suite/compat/oracle/r/sp-cursor-rowtype.result index a60bbc38883..31d794c9f61 100644 --- a/mysql-test/suite/compat/oracle/r/sp-cursor-rowtype.result +++ b/mysql-test/suite/compat/oracle/r/sp-cursor-rowtype.result @@ -1045,7 +1045,7 @@ NULL; END LOOP; END; $$ -ERROR 42000: Undefined CURSOR: c2 +ERROR 42000: Undeclared variable: c2 # Make sure "rec" shadows other declarations outside the loop CREATE TABLE t1 (a INT, b VARCHAR(10)); INSERT INTO t1 VALUES (10, 'b0'); diff --git a/mysql-test/suite/compat/oracle/r/sp.result b/mysql-test/suite/compat/oracle/r/sp.result index 6bcdf520edb..4b360241c01 100644 --- a/mysql-test/suite/compat/oracle/r/sp.result +++ b/mysql-test/suite/compat/oracle/r/sp.result @@ -1019,7 +1019,7 @@ LOOP EXIT WHEN unknown_ident IS NULL; END LOOP; END$$ -ERROR 42S22: Unknown column 'unknown_ident' in 'field list' +ERROR 42000: Undeclared variable: unknown_ident CREATE PROCEDURE p1 AS BEGIN @@ -1028,7 +1028,7 @@ LOOP EXIT label WHEN unknown_ident IS NULL; END LOOP; END$$ -ERROR 42S22: Unknown column 'unknown_ident' in 'field list' +ERROR 42000: Undeclared variable: unknown_ident CREATE PROCEDURE p1 AS BEGIN @@ -1036,7 +1036,7 @@ LOOP CONTINUE WHEN unknown_ident IS NULL; END LOOP; END$$ -ERROR 42S22: Unknown column 'unknown_ident' in 'field list' +ERROR 42000: Undeclared variable: unknown_ident CREATE PROCEDURE p1 AS BEGIN @@ -1045,7 +1045,7 @@ LOOP CONTINUE label WHEN unknown_ident IS NULL; END LOOP; END$$ -ERROR 42S22: Unknown column 'unknown_ident' in 'field list' +ERROR 42000: Undeclared variable: unknown_ident # # MDEV-10583 sql_mode=ORACLE: SQL%ROWCOUNT # diff --git a/mysql-test/suite/compat/oracle/t/sp-cursor-rowtype.test b/mysql-test/suite/compat/oracle/t/sp-cursor-rowtype.test index ba0ca9b6a60..78a38c5f4c6 100644 --- a/mysql-test/suite/compat/oracle/t/sp-cursor-rowtype.test +++ b/mysql-test/suite/compat/oracle/t/sp-cursor-rowtype.test @@ -1128,7 +1128,7 @@ DELIMITER ;$$ --echo # IN followed by an unknown cursor name DELIMITER $$; ---error ER_SP_CURSOR_MISMATCH +--error ER_SP_UNDECLARED_VAR CREATE PROCEDURE p1 AS CURSOR c1 IS SELECT 'test' AS a FROM DUAL; BEGIN diff --git a/mysql-test/suite/compat/oracle/t/sp.test b/mysql-test/suite/compat/oracle/t/sp.test index 4fae03b7721..04b9f1be1e2 100644 --- a/mysql-test/suite/compat/oracle/t/sp.test +++ b/mysql-test/suite/compat/oracle/t/sp.test @@ -1094,7 +1094,7 @@ DROP FUNCTION f1; --echo # DELIMITER $$; ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR CREATE PROCEDURE p1 AS BEGIN @@ -1106,7 +1106,7 @@ DELIMITER ;$$ DELIMITER $$; ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR CREATE PROCEDURE p1 AS BEGIN @@ -1119,7 +1119,7 @@ DELIMITER ;$$ DELIMITER $$; ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR CREATE PROCEDURE p1 AS BEGIN @@ -1131,7 +1131,7 @@ DELIMITER ;$$ DELIMITER $$; ---error ER_BAD_FIELD_ERROR +--error ER_SP_UNDECLARED_VAR CREATE PROCEDURE p1 AS BEGIN diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index c21a5dee088..53e4b020ff6 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -7560,6 +7560,7 @@ Item *LEX::create_item_ident_sp(THD *thd, Lex_ident_sys_st *name, const Sp_rcontext_handler *rh; sp_variable *spv; + uint unused_off; DBUG_ASSERT(spcont); DBUG_ASSERT(sphead); if ((spv= find_variable(name, &rh))) @@ -7598,7 +7599,9 @@ Item *LEX::create_item_ident_sp(THD *thd, Lex_ident_sys_st *name, return new (thd->mem_root) Item_func_sqlerrm(thd); } - if (!current_select) + if (!select_stack_head() && + (current_select->parsing_place != FOR_LOOP_BOUND || + spcont->find_cursor(name, &unused_off, false) == NULL)) { // we are out of SELECT or FOR so it is syntax error my_error(ER_SP_UNDECLARED_VAR, MYF(0), name->str); @@ -9083,7 +9086,8 @@ Item *LEX::create_item_query_expression(THD *thd, // Add the subtree of subquery to the current SELECT_LEX SELECT_LEX *curr_sel= select_stack_head(); - DBUG_ASSERT(current_select == curr_sel); + DBUG_ASSERT(current_select == curr_sel || + (curr_sel == NULL && current_select == &builtin_select)); if (!curr_sel) { curr_sel= &builtin_select; @@ -9315,7 +9319,8 @@ SELECT_LEX *LEX::parsed_subselect(SELECT_LEX_UNIT *unit) // Add the subtree of subquery to the current SELECT_LEX SELECT_LEX *curr_sel= select_stack_head(); - DBUG_ASSERT(current_select == curr_sel); + DBUG_ASSERT(current_select == curr_sel || + (curr_sel == NULL && current_select == &builtin_select)); if (curr_sel) { curr_sel->register_unit(unit, &curr_sel->context); @@ -9391,7 +9396,8 @@ TABLE_LIST *LEX::parsed_derived_table(SELECT_LEX_UNIT *unit, // Add the subtree of subquery to the current SELECT_LEX SELECT_LEX *curr_sel= select_stack_head(); - DBUG_ASSERT(current_select == curr_sel); + DBUG_ASSERT(current_select == curr_sel || + (curr_sel == NULL && current_select == &builtin_select)); Table_ident *ti= new (thd->mem_root) Table_ident(unit); if (ti == NULL) diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 3d8505e5942..d0a18d4c578 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -3632,8 +3632,9 @@ public: if (unlikely(!select_stack_top)) { - current_select= NULL; - DBUG_PRINT("info", ("Top Select is empty")); + current_select= &builtin_select; + DBUG_PRINT("info", ("Top Select is empty -> sel builtin: %p", + current_select)); } else current_select= select_stack[select_stack_top - 1]; From e08f87d527731e59931501a33fb73f5689fb6658 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Mon, 27 Jul 2020 13:00:53 +0200 Subject: [PATCH 138/188] fix obvious bugs hidden by current_select assigned to builtin select --- sql/sql_lex.cc | 9 +++++---- sql/sql_lex.h | 2 +- sql/sql_yacc.yy | 23 ++++++++++++++--------- sql/sql_yacc_ora.yy | 30 ++++++++++++++++++------------ 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 53e4b020ff6..f8b93abd4ae 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -6182,6 +6182,7 @@ bool LEX::sp_for_loop_cursor_declarations(THD *thd, LEX_CSTRING name; uint coffs, param_count= 0; const sp_pcursor *pcursor; + DBUG_ENTER("LEX::sp_for_loop_cursor_declarations"); if ((item_splocal= item->get_item_splocal())) name= item_splocal->m_name; @@ -6213,23 +6214,23 @@ bool LEX::sp_for_loop_cursor_declarations(THD *thd, else { thd->parse_error(); - return true; + DBUG_RETURN(true); } if (unlikely(!(pcursor= spcont->find_cursor_with_error(&name, &coffs, false)) || pcursor->check_param_count_with_error(param_count))) - return true; + DBUG_RETURN(true); if (!(loop->m_index= sp_add_for_loop_cursor_variable(thd, index, pcursor, coffs, bounds.m_index, item_func_sp))) - return true; + DBUG_RETURN(true); loop->m_target_bound= NULL; loop->m_direction= bounds.m_direction; loop->m_cursor_offset= coffs; loop->m_implicit_cursor= bounds.m_implicit_cursor; - return false; + DBUG_RETURN(false); } diff --git a/sql/sql_lex.h b/sql/sql_lex.h index d0a18d4c578..8e8a62e7a4f 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -4812,7 +4812,7 @@ Virtual_column_info *add_virtual_expression(THD *thd, Item *expr); Item* handle_sql2003_note184_exception(THD *thd, Item* left, bool equal, Item *expr); -void sp_create_assignment_lex(THD *thd, bool no_lookahead); +bool sp_create_assignment_lex(THD *thd, bool no_lookahead); bool sp_create_assignment_instr(THD *thd, bool no_lookahead); void mark_or_conds_to_avoid_pushdown(Item *cond); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 6ae6c22559a..88d3669e008 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -509,7 +509,7 @@ Item* handle_sql2003_note184_exception(THD *thd, Item* left, bool equal, @param no_lookahead True if the parser has no lookahead */ -void sp_create_assignment_lex(THD *thd, bool no_lookahead) +bool sp_create_assignment_lex(THD *thd, bool no_lookahead) { LEX *lex= thd->lex; @@ -522,6 +522,8 @@ void sp_create_assignment_lex(THD *thd, bool no_lookahead) /* Set new LEX as if we at start of set rule. */ lex->sql_command= SQLCOM_SET_OPTION; + if (lex->main_select_push()) + return true; mysql_init_select(lex); lex->var_list.empty(); lex->autocommit= 0; @@ -532,8 +534,8 @@ void sp_create_assignment_lex(THD *thd, bool no_lookahead) lex->sphead->m_tmp_query= lip->get_tok_end(); /* Inherit from outer lex. */ lex->option_type= old_lex->option_type; - lex->main_select_push(); } + return false; } @@ -16453,7 +16455,8 @@ set: MYSQL_YYABORT; lex->set_stmt_init(); lex->var_list.empty(); - sp_create_assignment_lex(thd, yychar == YYEMPTY); + if (sp_create_assignment_lex(thd, yychar == YYEMPTY)) + MYSQL_YYABORT; } start_option_value_list { @@ -16541,7 +16544,8 @@ option_value_list_continued: /* Repeating list of option values after first option value. */ option_value_list: { - sp_create_assignment_lex(thd, yychar == YYEMPTY); + if (sp_create_assignment_lex(thd, yychar == YYEMPTY)) + MYSQL_YYABORT; } option_value { @@ -16550,7 +16554,8 @@ option_value_list: } | option_value_list ',' { - sp_create_assignment_lex(thd, yychar == YYEMPTY); + if (sp_create_assignment_lex(thd, yychar == YYEMPTY)) + MYSQL_YYABORT; } option_value { @@ -17346,7 +17351,7 @@ grant_ident: '*' { LEX *lex= Lex; - if (unlikely(lex->copy_db_to(&lex->current_select->db))) + if (unlikely(lex->copy_db_to(&lex->first_select_lex()->db))) MYSQL_YYABORT; if (lex->grant == GLOBAL_ACLS) lex->grant = DB_ACLS & ~GRANT_ACL; @@ -17356,7 +17361,7 @@ grant_ident: | ident '.' '*' { LEX *lex= Lex; - lex->current_select->db= $1; + lex->first_select_lex()->db= $1; if (lex->grant == GLOBAL_ACLS) lex->grant = DB_ACLS & ~GRANT_ACL; else if (unlikely(lex->columns.elements)) @@ -17365,7 +17370,7 @@ grant_ident: | '*' '.' '*' { LEX *lex= Lex; - lex->current_select->db= null_clex_str; + lex->first_select_lex()->db= null_clex_str; if (lex->grant == GLOBAL_ACLS) lex->grant= GLOBAL_ACLS & ~GRANT_ACL; else if (unlikely(lex->columns.elements)) @@ -17374,7 +17379,7 @@ grant_ident: | table_ident { LEX *lex=Lex; - if (unlikely(!lex->current_select-> + if (unlikely(!lex->first_select_lex()-> add_table_to_list(thd, $1,NULL, TL_OPTION_UPDATING))) MYSQL_YYABORT; diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index c42c8e68e96..9d5e42355b9 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -9253,8 +9253,8 @@ adm_partition: cache_keys_spec: { Lex->first_select_lex()->alloc_index_hints(thd); - Select->set_index_hint_type(INDEX_HINT_USE, - INDEX_HINT_MASK_ALL); + Lex->first_select_lex()->set_index_hint_type(INDEX_HINT_USE, + INDEX_HINT_MASK_ALL); } cache_key_list_or_empty ; @@ -16622,7 +16622,8 @@ set: MYSQL_YYABORT; lex->set_stmt_init(); lex->var_list.empty(); - sp_create_assignment_lex(thd, yychar == YYEMPTY); + if (sp_create_assignment_lex(thd, yychar == YYEMPTY)) + MYSQL_YYABORT; } start_option_value_list { @@ -16657,7 +16658,8 @@ set_assign: LEX *lex=Lex; lex->set_stmt_init(); lex->var_list.empty(); - sp_create_assignment_lex(thd, yychar == YYEMPTY); + if(sp_create_assignment_lex(thd, yychar == YYEMPTY)) + MYSQL_YYABORT; } set_expr_or_default { @@ -16670,7 +16672,8 @@ set_assign: LEX *lex=Lex; lex->set_stmt_init(); lex->var_list.empty(); - sp_create_assignment_lex(thd, yychar == YYEMPTY); + if (sp_create_assignment_lex(thd, yychar == YYEMPTY)) + MYSQL_YYABORT; } set_expr_or_default { @@ -16690,7 +16693,8 @@ set_assign: } lex->set_stmt_init(); lex->var_list.empty(); - sp_create_assignment_lex(thd, yychar == YYEMPTY); + if (sp_create_assignment_lex(thd, yychar == YYEMPTY)) + MYSQL_YYABORT; } set_expr_or_default { @@ -16760,7 +16764,8 @@ option_value_list_continued: /* Repeating list of option values after first option value. */ option_value_list: { - sp_create_assignment_lex(thd, yychar == YYEMPTY); + if (sp_create_assignment_lex(thd, yychar == YYEMPTY)) + MYSQL_YYABORT; } option_value { @@ -16769,7 +16774,8 @@ option_value_list: } | option_value_list ',' { - sp_create_assignment_lex(thd, yychar == YYEMPTY); + if (sp_create_assignment_lex(thd, yychar == YYEMPTY)) + MYSQL_YYABORT; } option_value { @@ -17565,7 +17571,7 @@ grant_ident: '*' { LEX *lex= Lex; - if (unlikely(lex->copy_db_to(&lex->current_select->db))) + if (unlikely(lex->copy_db_to(&lex->first_select_lex()->db))) MYSQL_YYABORT; if (lex->grant == GLOBAL_ACLS) lex->grant = DB_ACLS & ~GRANT_ACL; @@ -17575,7 +17581,7 @@ grant_ident: | ident '.' '*' { LEX *lex= Lex; - lex->current_select->db= $1; + lex->first_select_lex()->db= $1; if (lex->grant == GLOBAL_ACLS) lex->grant = DB_ACLS & ~GRANT_ACL; else if (unlikely(lex->columns.elements)) @@ -17584,7 +17590,7 @@ grant_ident: | '*' '.' '*' { LEX *lex= Lex; - lex->current_select->db= null_clex_str; + lex->first_select_lex()->db= null_clex_str; if (lex->grant == GLOBAL_ACLS) lex->grant= GLOBAL_ACLS & ~GRANT_ACL; else if (unlikely(lex->columns.elements)) @@ -17593,7 +17599,7 @@ grant_ident: | table_ident { LEX *lex=Lex; - if (unlikely(!lex->current_select-> + if (unlikely(!lex->first_select_lex()-> add_table_to_list(thd, $1,NULL, TL_OPTION_UPDATING))) MYSQL_YYABORT; From 6a70398c7ae396283f1342dee1fa4de7eb2e441d Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Thu, 16 Jul 2020 13:01:15 +1000 Subject: [PATCH 139/188] MDEV-23176: s3 curl library path fix On FreeBSD (and possibly elsewhere) the FindPackage(curl) may have found the curl library in a non-standard directory. We use the exposed path as a library path to correct linking. --- storage/maria/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/storage/maria/CMakeLists.txt b/storage/maria/CMakeLists.txt index 34af45d07fa..d2c498e84be 100644 --- a/storage/maria/CMakeLists.txt +++ b/storage/maria/CMakeLists.txt @@ -116,6 +116,7 @@ IF(NOT PLUGIN_S3 STREQUAL NO) ENDIF() IF (CURL_FOUND) + LINK_DIRECTORIES(${PC_CURL_LIBDIR}) MYSQL_ADD_PLUGIN(s3 ha_s3.cc ${S3_SOURCES} COMPONENT s3-engine LINK_LIBRARIES curl STORAGE_ENGINE NOT_EMBEDDED CONFIG s3.cnf) ENDIF() From 2c5831b2c5348edf19a4c3c91ebed21c6e8412b9 Mon Sep 17 00:00:00 2001 From: Roman Nozdrin Date: Mon, 13 Jul 2020 14:50:43 +0000 Subject: [PATCH 140/188] MCOL-4166 The solution to the minor upgrade issue DEB package doesn't need expect and libreadline as dependencies RPM packages now depends on jemalloc again --- debian/control | 2 -- debian/mariadb-plugin-columnstore.postinst | 2 +- storage/columnstore/CMakeLists.txt | 2 +- storage/columnstore/columnstore | 2 +- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/debian/control b/debian/control index a3bc3b91c6e..75a50a9b133 100644 --- a/debian/control +++ b/debian/control @@ -31,7 +31,6 @@ Build-Depends: bison, libnuma-dev [!armhf], libpam0g-dev, libpcre2-dev, - libreadline-gplv2-dev [i386 amd64], libsnappy-dev, libssl-dev | libssl1.0-dev, libsystemd-dev [linux-any], @@ -662,7 +661,6 @@ Description: RocksDB storage engine for MariaDB Package: mariadb-plugin-columnstore Architecture: amd64 i386 Depends: binutils, - expect, libjemalloc1 | libjemalloc2, libsnappy1 | libsnappy1v5, mariadb-server-10.5 (= ${binary:Version}), diff --git a/debian/mariadb-plugin-columnstore.postinst b/debian/mariadb-plugin-columnstore.postinst index 07da2b9ee46..97a1bba22c8 100644 --- a/debian/mariadb-plugin-columnstore.postinst +++ b/debian/mariadb-plugin-columnstore.postinst @@ -3,6 +3,6 @@ set -e # Install ColumnStore -columnstore-post-install --rpmmode=install +columnstore-post-install install #DEBHELPER# diff --git a/storage/columnstore/CMakeLists.txt b/storage/columnstore/CMakeLists.txt index 34a4255b2c5..f71cce38bd8 100644 --- a/storage/columnstore/CMakeLists.txt +++ b/storage/columnstore/CMakeLists.txt @@ -22,7 +22,7 @@ CMAKE_SYSTEM_PROCESSOR STREQUAL "i686") # Needed to bump the component changes up to the main scope APPEND_FOR_CPACK(CPACK_COMPONENTS_ALL) IF (RPM) - APPEND_FOR_CPACK(CPACK_RPM_columnstore-engine_PACKAGE_REQUIRES " binutils net-tools python3") + APPEND_FOR_CPACK(CPACK_RPM_columnstore-engine_PACKAGE_REQUIRES " binutils jemalloc net-tools python3") APPEND_FOR_CPACK(CPACK_RPM_columnstore-engine_USER_FILELIST ";%ignore /var/lib;%ignore /var") APPEND_FOR_CPACK(CPACK_RPM_columnstore-engine_PACKAGE_CONFLICTS " thrift MariaDB-columnstore-platform MariaDB-columnstore-libs") # these three don't have the list semantics, so no append here diff --git a/storage/columnstore/columnstore b/storage/columnstore/columnstore index cba638b3a52..bca0d90d553 160000 --- a/storage/columnstore/columnstore +++ b/storage/columnstore/columnstore @@ -1 +1 @@ -Subproject commit cba638b3a52ca79a6bdbe187a6be46abb1806594 +Subproject commit bca0d90d5537050951a6c2282411d955569a8c58 From 940668f5cb2ebe411d795927e05038f3d9936aea Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Tue, 28 Jul 2020 19:53:19 +1000 Subject: [PATCH 141/188] MDEV-23137: aarch64, postfix - cmake include --- storage/rocksdb/build_rocksdb.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/storage/rocksdb/build_rocksdb.cmake b/storage/rocksdb/build_rocksdb.cmake index 6911b636996..883ee15f74c 100644 --- a/storage/rocksdb/build_rocksdb.cmake +++ b/storage/rocksdb/build_rocksdb.cmake @@ -447,6 +447,7 @@ else() endif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64") # aarch if(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64") + INCLUDE(CheckCXXCompilerFlag) CHECK_CXX_COMPILER_FLAG("-march=armv8-a+crc+crypto" HAS_ARMV8_CRC) if(HAS_ARMV8_CRC) message(STATUS " HAS_ARMV8_CRC yes") From 6307b17aa11fb6179ed04f16abfa7ed9d5228e99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 28 Jul 2020 11:17:20 +0300 Subject: [PATCH 142/188] MDEV-20142 encryption.innodb_encrypt_temporary_tables failed in buildbot with wrong result Let us read both encrypted temporary tables to increase the changes of page flushing and eviction. --- .../suite/encryption/r/innodb_encrypt_temporary_tables.result | 3 +++ .../suite/encryption/t/innodb_encrypt_temporary_tables.test | 2 ++ 2 files changed, 5 insertions(+) diff --git a/mysql-test/suite/encryption/r/innodb_encrypt_temporary_tables.result b/mysql-test/suite/encryption/r/innodb_encrypt_temporary_tables.result index 9a291ae1354..541680ae862 100644 --- a/mysql-test/suite/encryption/r/innodb_encrypt_temporary_tables.result +++ b/mysql-test/suite/encryption/r/innodb_encrypt_temporary_tables.result @@ -9,6 +9,9 @@ INSERT INTO t2 (f1,f2,f3) SELECT '', '', '' FROM seq_1_to_8192; SELECT COUNT(*) FROM t1; COUNT(*) 8192 +SELECT COUNT(*) FROM t2; +COUNT(*) +8192 SELECT variable_value > @old_encrypted FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_temp_blocks_encrypted'; variable_value > @old_encrypted diff --git a/mysql-test/suite/encryption/t/innodb_encrypt_temporary_tables.test b/mysql-test/suite/encryption/t/innodb_encrypt_temporary_tables.test index 6c16afa28f4..c1a6ad38456 100644 --- a/mysql-test/suite/encryption/t/innodb_encrypt_temporary_tables.test +++ b/mysql-test/suite/encryption/t/innodb_encrypt_temporary_tables.test @@ -15,6 +15,8 @@ CREATE TEMPORARY TABLE t2(f1 CHAR(100), f2 CHAR(200), f3 CHAR(200))ENGINE=InnoDB INSERT INTO t2 (f1,f2,f3) SELECT '', '', '' FROM seq_1_to_8192; SELECT COUNT(*) FROM t1; +SELECT COUNT(*) FROM t2; + SELECT variable_value > @old_encrypted FROM information_schema.global_status WHERE variable_name = 'innodb_encryption_n_temp_blocks_encrypted'; From 3c3f172f17de217389bc51053c555a5d7e91ddff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 28 Jul 2020 11:24:07 +0300 Subject: [PATCH 143/188] MDEV-23308 CHECK TABLE attempts to access parent_right_page_no=FIL_NULL mysql/mysql-server@e00ad49edc8b07317b52c9efd0810f2cbc57877a which introduced WL#6326 to MySQL 5.7.2 added a buffer page acquisition to CHECK TABLE code (solely for the purpose of obeying the changed latching order), but failed to check that a parent page actually exists. It would not necessarily exist in a corrupted index where a parent page is missing pointer records to child pages. --- storage/innobase/btr/btr0btr.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/storage/innobase/btr/btr0btr.cc b/storage/innobase/btr/btr0btr.cc index 5f38e623985..313790f1db3 100644 --- a/storage/innobase/btr/btr0btr.cc +++ b/storage/innobase/btr/btr0btr.cc @@ -5028,11 +5028,13 @@ loop: mtr_release_block_at_savepoint( &mtr, savepoint, right_block); - btr_block_get( - page_id_t(index->space, - parent_right_page_no), - table_page_size, - RW_SX_LATCH, index, &mtr); + if (parent_right_page_no != FIL_NULL) { + btr_block_get( + page_id_t(index->space, + parent_right_page_no), + table_page_size, + RW_SX_LATCH, index, &mtr); + } right_block = btr_block_get( page_id_t(index->space, From cf3c3cce1d1078d6ac2c0d74a3cd0ff444c63db9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 27 Jul 2020 19:33:21 +0300 Subject: [PATCH 144/188] MDEV-23304 Insert into TEMPORARY TABLE fails to invoke mtr_t::set_modified() In MDEV-21724 or possibly already in MDEV-12353 a bug was introduced to the handling of temporary tables. Whether or not redo log will be written, mtr_t::set_modified() must be invoked to register any changes to a page. page_cur_insert_rec_low(): Invoke mtr_t::set_modified() also when skipping the redo log write. --- storage/innobase/page/page0cur.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/storage/innobase/page/page0cur.cc b/storage/innobase/page/page0cur.cc index 36fdde82cb3..5f42deaaf8e 100644 --- a/storage/innobase/page/page0cur.cc +++ b/storage/innobase/page/page0cur.cc @@ -1493,7 +1493,10 @@ inc_dir: rec_set_bit_field_1(next_rec, n_owned + 1, REC_NEW_N_OWNED, REC_N_OWNED_MASK, REC_N_OWNED_SHIFT); if (mtr->get_log_mode() != MTR_LOG_ALL) + { + mtr->set_modified(*block); goto copied; + } const byte * const c_start= cur->rec - extra_size; if (extra_size > REC_N_NEW_EXTRA_BYTES && @@ -1532,7 +1535,10 @@ inc_dir: rec_set_bit_field_1(next_rec, n_owned + 1, REC_OLD_N_OWNED, REC_N_OWNED_MASK, REC_N_OWNED_SHIFT); if (mtr->get_log_mode() != MTR_LOG_ALL) + { + mtr->set_modified(*block); goto copied; + } ut_ad(extra_size > REC_N_OLD_EXTRA_BYTES); const byte * const c_start= cur->rec - extra_size; From 05fa4558e0e82302ece981deabce764491464eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Mon, 13 Jul 2020 20:23:37 +0300 Subject: [PATCH 145/188] MDEV-22110 InnoDB unnecessarily writes unmodified pages At least since commit 6a7be48b1b0b4107bf6991240ae69fcec0b7189a InnoDB appears to be invoking buf_flush_note_modification() on pages that were exclusively latched but not modified in a mini-transaction. MTR_MEMO_MODIFY, mtr_t::modify(): Define not only in debug code, but also in release code. We will set the MTR_MEMO_MODIFY flag on the earliest mtr_t::m_memo entry that we find. MTR_LOG_NONE: Only use this mode in cases where the previous mode will be restored before anything is modified in the mini-transaction. MTR_MEMO_PAGE_X_MODIFY, MTR_MEMO_PAGE_SX_MODIFY: The allowed flag combinations that include MTR_MEMO_MODIFY. ReleaseBlocks: Only invoke buf_flush_note_modification() on those buffer pool blocks on which mtr_t::set_modified() and mtr_t::modify() were invoked. --- storage/innobase/btr/btr0btr.cc | 2 +- storage/innobase/include/ibuf0ibuf.ic | 2 +- storage/innobase/include/mtr0mtr.h | 21 ++- storage/innobase/include/mtr0mtr.ic | 36 ----- storage/innobase/include/mtr0types.h | 8 +- storage/innobase/log/log0recv.cc | 6 +- storage/innobase/mtr/mtr0mtr.cc | 196 ++++++++++++++------------ storage/innobase/row/row0import.cc | 2 +- 8 files changed, 123 insertions(+), 150 deletions(-) diff --git a/storage/innobase/btr/btr0btr.cc b/storage/innobase/btr/btr0btr.cc index d2a9d9c5df7..fab849b81f0 100644 --- a/storage/innobase/btr/btr0btr.cc +++ b/storage/innobase/btr/btr0btr.cc @@ -1344,7 +1344,7 @@ btr_write_autoinc(dict_index_t* index, ib_uint64_t autoinc, bool reset) static void btr_page_reorganize_low(page_cur_t *cursor, dict_index_t *index, mtr_t *mtr) { - const mtr_log_t log_mode= mtr->set_log_mode(MTR_LOG_NONE); + const mtr_log_t log_mode= mtr->set_log_mode(MTR_LOG_NO_REDO); buf_block_t *const block= cursor->block; diff --git a/storage/innobase/include/ibuf0ibuf.ic b/storage/innobase/include/ibuf0ibuf.ic index ba772359630..2c2620511c7 100644 --- a/storage/innobase/include/ibuf0ibuf.ic +++ b/storage/innobase/include/ibuf0ibuf.ic @@ -46,7 +46,7 @@ ibuf_mtr_start( mtr->enter_ibuf(); if (high_level_read_only || srv_read_only_mode) { - mtr_set_log_mode(mtr, MTR_LOG_NONE); + mtr_set_log_mode(mtr, MTR_LOG_NO_REDO); } } diff --git a/storage/innobase/include/mtr0mtr.h b/storage/innobase/include/mtr0mtr.h index f1e517adfbc..599da234904 100644 --- a/storage/innobase/include/mtr0mtr.h +++ b/storage/innobase/include/mtr0mtr.h @@ -141,10 +141,15 @@ struct mtr_t { return static_cast(m_log_mode); } - /** Change the logging mode. - @param mode logging mode - @return old mode */ - inline mtr_log_t set_log_mode(mtr_log_t mode); + /** Change the logging mode. + @param mode logging mode + @return old mode */ + mtr_log_t set_log_mode(mtr_log_t mode) + { + const mtr_log_t old_mode= get_log_mode(); + m_log_mode= mode & 3; + return old_mode; + } /** Copy the tablespaces associated with the mini-transaction (needed for generating FILE_MODIFY records) @@ -281,19 +286,13 @@ struct mtr_t { private: /** Note that the mini-transaction will modify data. */ void flag_modified() { m_modifications = true; } -#ifdef UNIV_DEBUG /** Mark the given latched page as modified. @param block page that will be modified */ void modify(const buf_block_t& block); public: /** Note that the mini-transaction will modify a block. */ void set_modified(const buf_block_t &block) - { flag_modified(); if (m_log_mode == MTR_LOG_ALL) modify(block); } -#else /* UNIV_DEBUG */ -public: - /** Note that the mini-transaction will modify a block. */ - void set_modified(const buf_block_t &) { flag_modified(); } -#endif /* UNIV_DEBUG */ + { flag_modified(); if (m_log_mode != MTR_LOG_NONE) modify(block); } /** Set the state to not-modified. This will not log the changes. This is only used during redo log apply, to avoid logging the changes. */ diff --git a/storage/innobase/include/mtr0mtr.ic b/storage/innobase/include/mtr0mtr.ic index 940d9952d84..9540290fd19 100644 --- a/storage/innobase/include/mtr0mtr.ic +++ b/storage/innobase/include/mtr0mtr.ic @@ -171,39 +171,3 @@ mtr_t::release_block_at_savepoint( slot->object = NULL; } - -/** -Changes the logging mode of a mini-transaction. -@return old mode */ - -mtr_log_t -mtr_t::set_log_mode(mtr_log_t mode) -{ - ut_ad(mode >= MTR_LOG_ALL); - ut_ad(mode <= MTR_LOG_NO_REDO); - - const mtr_log_t old_mode = get_log_mode(); - - switch (old_mode) { - case MTR_LOG_NO_REDO: - /* Once this mode is set, it must not be changed. */ - ut_ad(mode == MTR_LOG_NO_REDO || mode == MTR_LOG_NONE); - return(old_mode); - case MTR_LOG_NONE: - if (mode == old_mode) { - /* Keep MTR_LOG_NONE. */ - return(old_mode); - } - ut_ad(mode == MTR_LOG_ALL); - /* fall through */ - case MTR_LOG_ALL: - /* MTR_LOG_NO_REDO can only be set before generating - any redo log records. */ - ut_ad(mode != MTR_LOG_NO_REDO || m_log.empty()); - m_log_mode = mode & 3; - return(old_mode); - } - - ut_ad(0); - return(old_mode); -} diff --git a/storage/innobase/include/mtr0types.h b/storage/innobase/include/mtr0types.h index fe259c43e9f..d1b6784ae86 100644 --- a/storage/innobase/include/mtr0types.h +++ b/storage/innobase/include/mtr0types.h @@ -41,8 +41,7 @@ enum mtr_log_t { MTR_LOG_ALL = 0, /** Log no operations and dirty pages are not added to the flush list. - Set when applying log in crash recovery or when a modification of a - ROW_FORMAT=COMPRESSED page is attempted. */ + Set for attempting modification of a ROW_FORMAT=COMPRESSED page. */ MTR_LOG_NONE, /** Don't generate REDO log but add dirty pages to flush list */ @@ -329,9 +328,10 @@ enum mtr_memo_type_t { MTR_MEMO_BUF_FIX = RW_NO_LATCH, -#ifdef UNIV_DEBUG MTR_MEMO_MODIFY = 16, -#endif /* UNIV_DEBUG */ + + MTR_MEMO_PAGE_X_MODIFY = MTR_MEMO_PAGE_X_FIX | MTR_MEMO_MODIFY, + MTR_MEMO_PAGE_SX_MODIFY = MTR_MEMO_PAGE_SX_FIX | MTR_MEMO_MODIFY, MTR_MEMO_S_LOCK = RW_S_LATCH << 5, diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index 388f80cf6e2..50a225ab2cd 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -2492,7 +2492,7 @@ void recv_recover_page(fil_space_t* space, buf_page_t* bpage) { mtr_t mtr; mtr.start(); - mtr.set_log_mode(MTR_LOG_NONE); + mtr.set_log_mode(MTR_LOG_NO_REDO); ut_ad(bpage->state() == BUF_BLOCK_FILE_PAGE); buf_block_t* block = reinterpret_cast(bpage); @@ -2576,7 +2576,7 @@ inline buf_block_t *recv_sys_t::recover_low(const page_id_t page_id, else if (fil_space_t *space= fil_space_acquire_for_io(page_id.space())) { mtr.start(); - mtr.set_log_mode(MTR_LOG_NONE); + mtr.set_log_mode(MTR_LOG_NO_REDO); block= buf_page_create(space, page_id.page_no(), space->zip_size(), &mtr); p= recv_sys.pages.find(page_id); if (p == recv_sys.pages.end()) @@ -2693,7 +2693,7 @@ void recv_sys_t::apply(bool last_batch) continue; case page_recv_t::RECV_NOT_PROCESSED: mtr.start(); - mtr.set_log_mode(MTR_LOG_NONE); + mtr.set_log_mode(MTR_LOG_NO_REDO); if (buf_block_t *block= buf_page_get_low(page_id, 0, RW_X_LATCH, nullptr, BUF_GET_IF_IN_POOL, __FILE__, __LINE__, diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc index 8a542a9f842..94a88bd3f83 100644 --- a/storage/innobase/mtr/mtr0mtr.cc +++ b/storage/innobase/mtr/mtr0mtr.cc @@ -205,13 +205,6 @@ private: static void memo_slot_release(mtr_memo_slot_t *slot) { switch (slot->type) { -#ifdef UNIV_DEBUG - default: - ut_ad("invalid type" == 0); - break; - case MTR_MEMO_MODIFY: - break; -#endif /* UNIV_DEBUG */ case MTR_MEMO_S_LOCK: rw_lock_s_unlock(reinterpret_cast(slot->object)); break; @@ -228,12 +221,21 @@ static void memo_slot_release(mtr_memo_slot_t *slot) case MTR_MEMO_X_LOCK: rw_lock_x_unlock(reinterpret_cast(slot->object)); break; - case MTR_MEMO_BUF_FIX: - case MTR_MEMO_PAGE_S_FIX: - case MTR_MEMO_PAGE_SX_FIX: - case MTR_MEMO_PAGE_X_FIX: + default: +#ifdef UNIV_DEBUG + switch (slot->type & ~MTR_MEMO_MODIFY) { + case MTR_MEMO_BUF_FIX: + case MTR_MEMO_PAGE_S_FIX: + case MTR_MEMO_PAGE_SX_FIX: + case MTR_MEMO_PAGE_X_FIX: + break; + default: + ut_ad("invalid type" == 0); + break; + } +#endif /* UNIV_DEBUG */ buf_block_t *block= reinterpret_cast(slot->object); - buf_page_release_latch(block, slot->type); + buf_page_release_latch(block, slot->type & ~MTR_MEMO_MODIFY); block->unfix(); break; } @@ -248,13 +250,6 @@ struct ReleaseLatches { if (!slot->object) return true; switch (slot->type) { -#ifdef UNIV_DEBUG - default: - ut_ad("invalid type" == 0); - break; - case MTR_MEMO_MODIFY: - break; -#endif /* UNIV_DEBUG */ case MTR_MEMO_S_LOCK: rw_lock_s_unlock(reinterpret_cast(slot->object)); break; @@ -271,12 +266,21 @@ struct ReleaseLatches { case MTR_MEMO_SX_LOCK: rw_lock_sx_unlock(reinterpret_cast(slot->object)); break; - case MTR_MEMO_BUF_FIX: - case MTR_MEMO_PAGE_S_FIX: - case MTR_MEMO_PAGE_SX_FIX: - case MTR_MEMO_PAGE_X_FIX: + default: +#ifdef UNIV_DEBUG + switch (slot->type & ~MTR_MEMO_MODIFY) { + case MTR_MEMO_BUF_FIX: + case MTR_MEMO_PAGE_S_FIX: + case MTR_MEMO_PAGE_SX_FIX: + case MTR_MEMO_PAGE_X_FIX: + break; + default: + ut_ad("invalid type" == 0); + break; + } +#endif /* UNIV_DEBUG */ buf_block_t *block= reinterpret_cast(slot->object); - buf_page_release_latch(block, slot->type); + buf_page_release_latch(block, slot->type & ~MTR_MEMO_MODIFY); block->unfix(); break; } @@ -308,50 +312,42 @@ struct DebugCheck { }; #endif -/** Release a resource acquired by the mini-transaction. */ -struct ReleaseBlocks { - /** Release specific object */ - ReleaseBlocks(lsn_t start_lsn, lsn_t end_lsn) - : - m_end_lsn(end_lsn), - m_start_lsn(start_lsn) - { - /* Do nothing */ - } +/** Release page latches held by the mini-transaction. */ +struct ReleaseBlocks +{ + const lsn_t start, end; +#ifdef UNIV_DEBUG + const mtr_buf_t &memo; - /** Add the modified page to the buffer flush list. */ - void add_dirty_page_to_flush_list(mtr_memo_slot_t* slot) const - { - ut_ad(m_end_lsn > 0); - ut_ad(m_start_lsn > 0); + ReleaseBlocks(lsn_t start, lsn_t end, const mtr_buf_t &memo) : + start(start), end(end), memo(memo) +#else /* UNIV_DEBUG */ + ReleaseBlocks(lsn_t start, lsn_t end, const mtr_buf_t&) : + start(start), end(end) +#endif /* UNIV_DEBUG */ + { + ut_ad(start); + ut_ad(end); + } - buf_block_t* block; + /** @return true always */ + bool operator()(mtr_memo_slot_t* slot) const + { + if (!slot->object) + return true; + switch (slot->type) { + case MTR_MEMO_PAGE_X_MODIFY: + case MTR_MEMO_PAGE_SX_MODIFY: + break; + default: + ut_ad(!(slot->type & MTR_MEMO_MODIFY)); + return true; + } - block = reinterpret_cast(slot->object); - - buf_flush_note_modification(block, m_start_lsn, m_end_lsn); - } - - /** @return true always. */ - bool operator()(mtr_memo_slot_t* slot) const - { - if (slot->object != NULL) { - - if (slot->type == MTR_MEMO_PAGE_X_FIX - || slot->type == MTR_MEMO_PAGE_SX_FIX) { - - add_dirty_page_to_flush_list(slot); - } - } - - return(true); - } - - /** Mini-transaction REDO start LSN */ - lsn_t m_end_lsn; - - /** Mini-transaction REDO end LSN */ - lsn_t m_start_lsn; + buf_flush_note_modification(static_cast(slot->object), + start, end); + return true; + } }; /** Write the block contents to the REDO log */ @@ -457,7 +453,8 @@ void mtr_t::commit() } m_memo.for_each_block_in_reverse(CIterate - (ReleaseBlocks(start_lsn, m_commit_lsn))); + (ReleaseBlocks(start_lsn, m_commit_lsn, + m_memo))); if (m_made_dirty) log_flush_order_mutex_exit(); @@ -834,33 +831,6 @@ mtr_t::memo_contains_page_flagged( ? NULL : iteration.functor.get_block(); } -/** Find a block, preferrably in MTR_MEMO_MODIFY state */ -struct FindModified -{ - const mtr_memo_slot_t *found= nullptr; - const buf_block_t& block; - - FindModified(const buf_block_t &block) : block(block) {} - bool operator()(const mtr_memo_slot_t* slot) - { - if (slot->object != &block) - return true; - found= slot; - return slot->type != MTR_MEMO_MODIFY; - } -}; - -/** Mark the given latched page as modified. -@param block page that will be modified */ -void mtr_t::modify(const buf_block_t &block) -{ - Iterate iteration(block); - m_memo.for_each_block_in_reverse(iteration); - ut_ad(iteration.functor.found); - if (iteration.functor.found->type != MTR_MEMO_MODIFY) - memo_push(const_cast(&block), MTR_MEMO_MODIFY); -} - /** Print info of an mtr handle. */ void mtr_t::print() const @@ -871,3 +841,43 @@ mtr_t::print() const } #endif /* UNIV_DEBUG */ + + +/** Find a block, preferrably in MTR_MEMO_MODIFY state */ +struct FindModified +{ + mtr_memo_slot_t *found= nullptr; + const buf_block_t& block; + + FindModified(const buf_block_t &block) : block(block) {} + bool operator()(mtr_memo_slot_t *slot) + { + if (slot->object != &block) + return true; + found= slot; + return !(slot->type & (MTR_MEMO_MODIFY | + MTR_MEMO_PAGE_X_FIX | MTR_MEMO_PAGE_SX_FIX)); + } +}; + +/** Mark the given latched page as modified. +@param block page that will be modified */ +void mtr_t::modify(const buf_block_t &block) +{ + if (UNIV_UNLIKELY(m_memo.empty())) + { + /* This must be PageConverter::update_page() in IMPORT TABLESPACE. */ + ut_ad(!block.page.in_LRU_list); + ut_ad(!buf_pool.is_uncompressed(&block)); + return; + } + + Iterate iteration((FindModified(block))); + if (UNIV_UNLIKELY(m_memo.for_each_block(iteration))) + { + ut_ad("modifying an unlatched page" == 0); + return; + } + iteration.functor.found->type= static_cast + (iteration.functor.found->type | MTR_MEMO_MODIFY); +} diff --git a/storage/innobase/row/row0import.cc b/storage/innobase/row/row0import.cc index 6f46479291b..9fc7425957a 100644 --- a/storage/innobase/row/row0import.cc +++ b/storage/innobase/row/row0import.cc @@ -234,7 +234,7 @@ public: memset(&m_cur, 0x0, sizeof(m_cur)); /* Make page_cur_delete_rec() happy. */ m_mtr.start(); - m_mtr.set_log_mode(MTR_LOG_NONE); + m_mtr.set_log_mode(MTR_LOG_NO_REDO); } /** Position the cursor on the first user record. */ From 69cf6302f30e9bca7d2b0903c29fc1b26b09bcc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Tue, 28 Jul 2020 14:22:45 +0300 Subject: [PATCH 146/188] galera_var_notify_cmd still hangs. --- mysql-test/suite/galera/disabled.def | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 36b0726609e..fb06cde5294 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -39,11 +39,12 @@ galera_sst_mariabackup_encrypt_with_key : MDEV-21484 galera_sst_mariabackup_encr galera_toi_ddl_nonconflicting : MDEV-21518 galera.galera_toi_ddl_nonconflicting galera_toi_truncate : MDEV-22996 Hang on galera_toi_truncate test case galera_var_node_address : MDEV-20485 Galera test failure +galera_var_notify_cmd : MDEV-21905 Galera test galera_var_notify_cmd causes hang galera_var_reject_queries : assertion in inline_mysql_socket_send galera_var_retry_autocommit: MDEV-18181 Galera test failure on galera.galera_var_retry_autocommit galera_wan : MDEV-17259 Test failure on galera.galera_wan -mysql-wsrep#198 : MDEV-18935 Galera test mysql-wsrep#198 sporaric assertion transaction.cpp:362: int wsrep::transaction::before_commit(): Assertion `state() == s_executing || state() == s_committing || state() == s_must_abort || state() == s_replaying' failed. lp1376747-4 : MDEV-21911 Galera test failure on lp1376747-4 +mysql-wsrep#198 : MDEV-18935 Galera test mysql-wsrep#198 sporaric assertion transaction.cpp:362: int wsrep::transaction::before_commit(): Assertion `state() == s_executing || state() == s_committing || state() == s_must_abort || state() == s_replaying' failed. partition : MDEV-19958 Galera test failure on galera.partition query_cache: MDEV-15805 Test failure on galera.query_cache sql_log_bin : MDEV-21491 galera.sql_log_bin From 5b3b53ce36b9a05832af3a19ae8d846b6669a1f5 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Tue, 28 Jul 2020 17:32:19 +0400 Subject: [PATCH 147/188] MDEV-23311 CEILING() and FLOOR() convert temporal input to numbers, unlike ROUND() and TRUNCATE() Fixing functions CEILING and FLOOR to return - TIME for TIME input - DATETIME for DATETIME and TIMESTAMP input --- include/my_time.h | 7 + mysql-test/main/type_datetime_hires.result | 165 ++++++++++++++ mysql-test/main/type_datetime_hires.test | 98 ++++++++ mysql-test/main/type_time_hires.result | 237 ++++++++++++++++++++ mysql-test/main/type_time_hires.test | 123 ++++++++++ mysql-test/main/type_timestamp_hires.result | 12 + mysql-test/main/type_timestamp_hires.test | 10 + sql/item_func.cc | 51 ++++- sql/item_func.h | 27 ++- sql/item_timefunc.cc | 2 +- sql/protocol.cc | 2 +- sql/sql_prepare.cc | 2 +- sql/sql_type.cc | 42 +++- sql/sql_type.h | 61 ++++- 14 files changed, 827 insertions(+), 12 deletions(-) diff --git a/include/my_time.h b/include/my_time.h index bad2b8bf4b0..b7b54db5586 100644 --- a/include/my_time.h +++ b/include/my_time.h @@ -233,9 +233,16 @@ static inline long my_time_fraction_remainder(long nr, uint decimals) DBUG_ASSERT(decimals <= TIME_SECOND_PART_DIGITS); return nr % (long) log_10_int[TIME_SECOND_PART_DIGITS - decimals]; } +static inline void my_datetime_trunc(MYSQL_TIME *ltime, uint decimals) +{ + ltime->second_part-= my_time_fraction_remainder(ltime->second_part, decimals); +} static inline void my_time_trunc(MYSQL_TIME *ltime, uint decimals) { ltime->second_part-= my_time_fraction_remainder(ltime->second_part, decimals); + if (!ltime->second_part && ltime->neg && + !ltime->hour && !ltime->minute && !ltime->second) + ltime->neg= FALSE; } static inline void my_timeval_trunc(struct timeval *tv, uint decimals) { diff --git a/mysql-test/main/type_datetime_hires.result b/mysql-test/main/type_datetime_hires.result index 5211515ea77..02adadd16c5 100644 --- a/mysql-test/main/type_datetime_hires.result +++ b/mysql-test/main/type_datetime_hires.result @@ -900,5 +900,170 @@ f NULL DROP TABLE t1; # +# MDEV-23311 CEILING() and FLOOR() convert temporal input to numbers, unlike ROUND() and TRUNCATE() +# +CREATE TABLE t1 AS SELECT +FLOOR(TIMESTAMP'2001-01-01 00:00:00.999999'), +CEILING(TIMESTAMP'2001-01-01 00:00:00.999999'); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `FLOOR(TIMESTAMP'2001-01-01 00:00:00.999999')` datetime DEFAULT NULL, + `CEILING(TIMESTAMP'2001-01-01 00:00:00.999999')` datetime DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t1; +CREATE TABLE t1 (a DATETIME(6)); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.999999'); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.99999'); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.9999'); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.999'); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.99'); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.9'); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.1'); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.0'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.999999'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.99999'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.9999'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.999'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.99'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.9'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.1'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.0'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.999999'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.99999'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.9999'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.999'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.99'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.9'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.1'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.0'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.999999'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.99999'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.9999'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.999'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.99'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.9'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.1'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.0'); +CREATE FUNCTION FLOOR_SP(a DATETIME(6)) RETURNS DATETIME +BEGIN +RETURN +CASE +WHEN EXTRACT(MICROSECOND FROM a)=0 THEN a +ELSE TRUNCATE(a,0) +END; +END; +$$ +CREATE FUNCTION CEILING_SP(a DATETIME(6)) RETURNS DATETIME +BEGIN +RETURN +CASE +WHEN TRUNCATE(a,0)=TIMESTAMP'9999-12-31 23:59:59' THEN a +WHEN EXTRACT(MICROSECOND FROM a)=0 THEN a +ELSE TRUNCATE(a,0)+INTERVAL 1 SECOND +END; +END; +$$ +SELECT a, FLOOR(a), FLOOR_SP(a), FLOOR(a)=FLOOR_SP(a) FROM t1 ORDER BY a; +a FLOOR(a) FLOOR_SP(a) FLOOR(a)=FLOOR_SP(a) +0001-12-31 23:59:59.000000 0001-12-31 23:59:59 0001-12-31 23:59:59 1 +0001-12-31 23:59:59.100000 0001-12-31 23:59:59 0001-12-31 23:59:59 1 +0001-12-31 23:59:59.900000 0001-12-31 23:59:59 0001-12-31 23:59:59 1 +0001-12-31 23:59:59.990000 0001-12-31 23:59:59 0001-12-31 23:59:59 1 +0001-12-31 23:59:59.999000 0001-12-31 23:59:59 0001-12-31 23:59:59 1 +0001-12-31 23:59:59.999900 0001-12-31 23:59:59 0001-12-31 23:59:59 1 +0001-12-31 23:59:59.999990 0001-12-31 23:59:59 0001-12-31 23:59:59 1 +0001-12-31 23:59:59.999999 0001-12-31 23:59:59 0001-12-31 23:59:59 1 +0999-12-31 23:59:59.000000 0999-12-31 23:59:59 0999-12-31 23:59:59 1 +0999-12-31 23:59:59.100000 0999-12-31 23:59:59 0999-12-31 23:59:59 1 +0999-12-31 23:59:59.900000 0999-12-31 23:59:59 0999-12-31 23:59:59 1 +0999-12-31 23:59:59.990000 0999-12-31 23:59:59 0999-12-31 23:59:59 1 +0999-12-31 23:59:59.999000 0999-12-31 23:59:59 0999-12-31 23:59:59 1 +0999-12-31 23:59:59.999900 0999-12-31 23:59:59 0999-12-31 23:59:59 1 +0999-12-31 23:59:59.999990 0999-12-31 23:59:59 0999-12-31 23:59:59 1 +0999-12-31 23:59:59.999999 0999-12-31 23:59:59 0999-12-31 23:59:59 1 +9999-12-30 23:59:59.000000 9999-12-30 23:59:59 9999-12-30 23:59:59 1 +9999-12-30 23:59:59.100000 9999-12-30 23:59:59 9999-12-30 23:59:59 1 +9999-12-30 23:59:59.900000 9999-12-30 23:59:59 9999-12-30 23:59:59 1 +9999-12-30 23:59:59.990000 9999-12-30 23:59:59 9999-12-30 23:59:59 1 +9999-12-30 23:59:59.999000 9999-12-30 23:59:59 9999-12-30 23:59:59 1 +9999-12-30 23:59:59.999900 9999-12-30 23:59:59 9999-12-30 23:59:59 1 +9999-12-30 23:59:59.999990 9999-12-30 23:59:59 9999-12-30 23:59:59 1 +9999-12-30 23:59:59.999999 9999-12-30 23:59:59 9999-12-30 23:59:59 1 +9999-12-31 23:59:59.000000 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +9999-12-31 23:59:59.100000 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +9999-12-31 23:59:59.900000 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +9999-12-31 23:59:59.990000 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +9999-12-31 23:59:59.999000 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +9999-12-31 23:59:59.999900 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +9999-12-31 23:59:59.999990 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +9999-12-31 23:59:59.999999 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +SELECT a, CEILING(a), CEILING_SP(a), CEILING(a)=CEILING_SP(a) FROM t1 ORDER BY a; +a CEILING(a) CEILING_SP(a) CEILING(a)=CEILING_SP(a) +0001-12-31 23:59:59.000000 0001-12-31 23:59:59 0001-12-31 23:59:59 1 +0001-12-31 23:59:59.100000 0002-01-01 00:00:00 0002-01-01 00:00:00 1 +0001-12-31 23:59:59.900000 0002-01-01 00:00:00 0002-01-01 00:00:00 1 +0001-12-31 23:59:59.990000 0002-01-01 00:00:00 0002-01-01 00:00:00 1 +0001-12-31 23:59:59.999000 0002-01-01 00:00:00 0002-01-01 00:00:00 1 +0001-12-31 23:59:59.999900 0002-01-01 00:00:00 0002-01-01 00:00:00 1 +0001-12-31 23:59:59.999990 0002-01-01 00:00:00 0002-01-01 00:00:00 1 +0001-12-31 23:59:59.999999 0002-01-01 00:00:00 0002-01-01 00:00:00 1 +0999-12-31 23:59:59.000000 0999-12-31 23:59:59 0999-12-31 23:59:59 1 +0999-12-31 23:59:59.100000 1000-01-01 00:00:00 1000-01-01 00:00:00 1 +0999-12-31 23:59:59.900000 1000-01-01 00:00:00 1000-01-01 00:00:00 1 +0999-12-31 23:59:59.990000 1000-01-01 00:00:00 1000-01-01 00:00:00 1 +0999-12-31 23:59:59.999000 1000-01-01 00:00:00 1000-01-01 00:00:00 1 +0999-12-31 23:59:59.999900 1000-01-01 00:00:00 1000-01-01 00:00:00 1 +0999-12-31 23:59:59.999990 1000-01-01 00:00:00 1000-01-01 00:00:00 1 +0999-12-31 23:59:59.999999 1000-01-01 00:00:00 1000-01-01 00:00:00 1 +9999-12-30 23:59:59.000000 9999-12-30 23:59:59 9999-12-30 23:59:59 1 +9999-12-30 23:59:59.100000 9999-12-31 00:00:00 9999-12-31 00:00:00 1 +9999-12-30 23:59:59.900000 9999-12-31 00:00:00 9999-12-31 00:00:00 1 +9999-12-30 23:59:59.990000 9999-12-31 00:00:00 9999-12-31 00:00:00 1 +9999-12-30 23:59:59.999000 9999-12-31 00:00:00 9999-12-31 00:00:00 1 +9999-12-30 23:59:59.999900 9999-12-31 00:00:00 9999-12-31 00:00:00 1 +9999-12-30 23:59:59.999990 9999-12-31 00:00:00 9999-12-31 00:00:00 1 +9999-12-30 23:59:59.999999 9999-12-31 00:00:00 9999-12-31 00:00:00 1 +9999-12-31 23:59:59.000000 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +9999-12-31 23:59:59.100000 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +9999-12-31 23:59:59.900000 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +9999-12-31 23:59:59.990000 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +9999-12-31 23:59:59.999000 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +9999-12-31 23:59:59.999900 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +9999-12-31 23:59:59.999990 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +9999-12-31 23:59:59.999999 9999-12-31 23:59:59 9999-12-31 23:59:59 1 +DROP FUNCTION FLOOR_SP; +DROP FUNCTION CEILING_SP; +DROP TABLE t1; +CREATE TABLE t1 (a DATETIME(6)); +INSERT INTO t1 VALUES ('0000-00-00 23:59:59.999999'); +INSERT INTO t1 VALUES ('0000-00-01 23:59:59.999999'); +INSERT INTO t1 VALUES ('0000-01-01 23:59:59.999999'); +INSERT INTO t1 VALUES ('0001-00-00 23:59:59.999999'); +SELECT a, FLOOR(a), CEILING(a) FROM t1; +a FLOOR(a) CEILING(a) +0000-00-00 23:59:59.999999 0000-00-00 23:59:59 NULL +0000-00-01 23:59:59.999999 0000-00-01 23:59:59 NULL +0000-01-01 23:59:59.999999 0000-01-01 23:59:59 NULL +0001-00-00 23:59:59.999999 0001-00-00 23:59:59 NULL +Warnings: +Warning 1411 Incorrect date value: '0000-00-00' for function round(datetime) +Warning 1411 Incorrect date value: '0000-00-01' for function round(datetime) +Warning 1411 Incorrect date value: '0000-01-01' for function round(datetime) +Warning 1411 Incorrect date value: '0001-00-00' for function round(datetime) +DROP TABLE t1; +SET sql_mode=ALLOW_INVALID_DATES; +CREATE TABLE t1 (a DATETIME(6)); +INSERT INTO t1 VALUES ('2001-02-28 23:59:59.999999'); +INSERT INTO t1 VALUES ('2001-02-29 23:59:59.999999'); +SELECT a, FLOOR(a), CEILING(a) FROM t1; +a FLOOR(a) CEILING(a) +2001-02-28 23:59:59.999999 2001-02-28 23:59:59 2001-03-01 00:00:00 +2001-02-29 23:59:59.999999 2001-02-29 23:59:59 NULL +Warnings: +Warning 1411 Incorrect date value: '2001-02-29' for function round(datetime) +DROP TABLE t1; +SET sql_mode=DEFAULT; +# # End of 10.4 tests # diff --git a/mysql-test/main/type_datetime_hires.test b/mysql-test/main/type_datetime_hires.test index 7b3b37560a3..6476d7fb182 100644 --- a/mysql-test/main/type_datetime_hires.test +++ b/mysql-test/main/type_datetime_hires.test @@ -156,6 +156,104 @@ SELECT ROUND(a) AS f FROM t1 GROUP BY a WITH ROLLUP; DROP TABLE t1; +--echo # +--echo # MDEV-23311 CEILING() and FLOOR() convert temporal input to numbers, unlike ROUND() and TRUNCATE() +--echo # + +CREATE TABLE t1 AS SELECT + FLOOR(TIMESTAMP'2001-01-01 00:00:00.999999'), + CEILING(TIMESTAMP'2001-01-01 00:00:00.999999'); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 (a DATETIME(6)); + +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.999999'); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.99999'); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.9999'); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.999'); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.99'); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.9'); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.1'); +INSERT INTO t1 VALUES ('9999-12-31 23:59:59.0'); + +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.999999'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.99999'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.9999'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.999'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.99'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.9'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.1'); +INSERT INTO t1 VALUES ('9999-12-30 23:59:59.0'); + +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.999999'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.99999'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.9999'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.999'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.99'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.9'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.1'); +INSERT INTO t1 VALUES ('0999-12-31 23:59:59.0'); + +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.999999'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.99999'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.9999'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.999'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.99'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.9'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.1'); +INSERT INTO t1 VALUES ('0001-12-31 23:59:59.0'); + + +DELIMITER $$; +CREATE FUNCTION FLOOR_SP(a DATETIME(6)) RETURNS DATETIME +BEGIN + RETURN + CASE + WHEN EXTRACT(MICROSECOND FROM a)=0 THEN a + ELSE TRUNCATE(a,0) + END; +END; +$$ +DELIMITER ;$$ + +DELIMITER $$; +CREATE FUNCTION CEILING_SP(a DATETIME(6)) RETURNS DATETIME +BEGIN + RETURN + CASE + WHEN TRUNCATE(a,0)=TIMESTAMP'9999-12-31 23:59:59' THEN a + WHEN EXTRACT(MICROSECOND FROM a)=0 THEN a + ELSE TRUNCATE(a,0)+INTERVAL 1 SECOND + END; +END; +$$ +DELIMITER ;$$ + +SELECT a, FLOOR(a), FLOOR_SP(a), FLOOR(a)=FLOOR_SP(a) FROM t1 ORDER BY a; +SELECT a, CEILING(a), CEILING_SP(a), CEILING(a)=CEILING_SP(a) FROM t1 ORDER BY a; + +DROP FUNCTION FLOOR_SP; +DROP FUNCTION CEILING_SP; + +DROP TABLE t1; + +CREATE TABLE t1 (a DATETIME(6)); +INSERT INTO t1 VALUES ('0000-00-00 23:59:59.999999'); +INSERT INTO t1 VALUES ('0000-00-01 23:59:59.999999'); +INSERT INTO t1 VALUES ('0000-01-01 23:59:59.999999'); +INSERT INTO t1 VALUES ('0001-00-00 23:59:59.999999'); +SELECT a, FLOOR(a), CEILING(a) FROM t1; +DROP TABLE t1; + +SET sql_mode=ALLOW_INVALID_DATES; +CREATE TABLE t1 (a DATETIME(6)); +INSERT INTO t1 VALUES ('2001-02-28 23:59:59.999999'); +INSERT INTO t1 VALUES ('2001-02-29 23:59:59.999999'); +SELECT a, FLOOR(a), CEILING(a) FROM t1; +DROP TABLE t1; +SET sql_mode=DEFAULT; + --echo # --echo # End of 10.4 tests --echo # diff --git a/mysql-test/main/type_time_hires.result b/mysql-test/main/type_time_hires.result index 6122afcfc47..c7fecbef76b 100644 --- a/mysql-test/main/type_time_hires.result +++ b/mysql-test/main/type_time_hires.result @@ -670,3 +670,240 @@ a ROUND(a,-6) 838:59:59.999999 838:59:59 DROP TABLE t1; SET time_zone=DEFAULT; +# +# MDEV-23311 CEILING() and FLOOR() convert temporal input to numbers, unlike ROUND() and TRUNCATE() +# +CREATE TABLE t1 AS SELECT +FLOOR(TIME'00:00:00.999999'), +CEILING(TIME'00:00:00.999999'); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `FLOOR(TIME'00:00:00.999999')` time NOT NULL, + `CEILING(TIME'00:00:00.999999')` time NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t1; +CREATE TABLE t1 (a TIME(6)); +INSERT INTO t1 VALUES ('838:59:59.999999'); +INSERT INTO t1 VALUES ('838:59:59.99999'); +INSERT INTO t1 VALUES ('838:59:59.9999'); +INSERT INTO t1 VALUES ('838:59:59.999'); +INSERT INTO t1 VALUES ('838:59:59.99'); +INSERT INTO t1 VALUES ('838:59:59.9'); +INSERT INTO t1 VALUES ('838:59:59.1'); +INSERT INTO t1 VALUES ('838:59:59.0'); +INSERT INTO t1 VALUES ('837:59:59.999999'); +INSERT INTO t1 VALUES ('837:59:59.99999'); +INSERT INTO t1 VALUES ('837:59:59.9999'); +INSERT INTO t1 VALUES ('837:59:59.999'); +INSERT INTO t1 VALUES ('837:59:59.99'); +INSERT INTO t1 VALUES ('837:59:59.9'); +INSERT INTO t1 VALUES ('837:59:59.1'); +INSERT INTO t1 VALUES ('837:59:59.0'); +INSERT INTO t1 VALUES ('23:59:59.999999'); +INSERT INTO t1 VALUES ('23:59:59.99999'); +INSERT INTO t1 VALUES ('23:59:59.9999'); +INSERT INTO t1 VALUES ('23:59:59.999'); +INSERT INTO t1 VALUES ('23:59:59.99'); +INSERT INTO t1 VALUES ('23:59:59.9'); +INSERT INTO t1 VALUES ('23:59:59.1'); +INSERT INTO t1 VALUES ('23:59:59.0'); +INSERT INTO t1 VALUES ('00:00:00.999999'); +INSERT INTO t1 VALUES ('00:00:00.99999'); +INSERT INTO t1 VALUES ('00:00:00.9999'); +INSERT INTO t1 VALUES ('00:00:00.999'); +INSERT INTO t1 VALUES ('00:00:00.99'); +INSERT INTO t1 VALUES ('00:00:00.9'); +INSERT INTO t1 VALUES ('00:00:00.1'); +INSERT INTO t1 VALUES ('00:00:00.0'); +INSERT INTO t1 VALUES ('-00:00:00.999999'); +INSERT INTO t1 VALUES ('-00:00:00.99999'); +INSERT INTO t1 VALUES ('-00:00:00.9999'); +INSERT INTO t1 VALUES ('-00:00:00.999'); +INSERT INTO t1 VALUES ('-00:00:00.99'); +INSERT INTO t1 VALUES ('-00:00:00.9'); +INSERT INTO t1 VALUES ('-00:00:00.1'); +INSERT INTO t1 VALUES ('-00:00:00.0'); +INSERT INTO t1 VALUES ('-23:59:59.999999'); +INSERT INTO t1 VALUES ('-23:59:59.99999'); +INSERT INTO t1 VALUES ('-23:59:59.9999'); +INSERT INTO t1 VALUES ('-23:59:59.999'); +INSERT INTO t1 VALUES ('-23:59:59.99'); +INSERT INTO t1 VALUES ('-23:59:59.9'); +INSERT INTO t1 VALUES ('-23:59:59.1'); +INSERT INTO t1 VALUES ('-23:59:59.0'); +INSERT INTO t1 VALUES ('-837:59:59.999999'); +INSERT INTO t1 VALUES ('-837:59:59.99999'); +INSERT INTO t1 VALUES ('-837:59:59.9999'); +INSERT INTO t1 VALUES ('-837:59:59.999'); +INSERT INTO t1 VALUES ('-837:59:59.99'); +INSERT INTO t1 VALUES ('-837:59:59.9'); +INSERT INTO t1 VALUES ('-837:59:59.1'); +INSERT INTO t1 VALUES ('-837:59:59.0'); +INSERT INTO t1 VALUES ('-838:59:59.999999'); +INSERT INTO t1 VALUES ('-838:59:59.99999'); +INSERT INTO t1 VALUES ('-838:59:59.9999'); +INSERT INTO t1 VALUES ('-838:59:59.999'); +INSERT INTO t1 VALUES ('-838:59:59.99'); +INSERT INTO t1 VALUES ('-838:59:59.9'); +INSERT INTO t1 VALUES ('-838:59:59.1'); +INSERT INTO t1 VALUES ('-838:59:59.0'); +CREATE FUNCTION FLOOR_SP(a TIME(6)) RETURNS TIME +BEGIN +RETURN +CASE +WHEN TRUNCATE(a,0)=TIME'838:59:59' THEN a +WHEN TRUNCATE(a,0)=TIME'-838:59:59' THEN a +WHEN a=TRUNCATE(a,0) THEN a -- no fractional digits +WHEN a<0 THEN TRUNCATE(a,0)-INTERVAL 1 SECOND -- negative values +WHEN a>0 THEN TRUNCATE(a,0) -- positive values +END; +END; +$$ +CREATE FUNCTION CEILING_SP(a TIME(6)) RETURNS TIME +BEGIN +RETURN +CASE +WHEN TRUNCATE(a,0)=TIME'838:59:59' THEN a +WHEN TRUNCATE(a,0)=TIME'-838:59:59' THEN a +WHEN a=TRUNCATE(a,0) THEN a -- no fractional digits +WHEN a<0 THEN TRUNCATE(a,0) -- negative values +WHEN a>0 THEN TRUNCATE(a,0)+INTERVAL 1 SECOND -- positive values +END; +END; +$$ +SELECT a, FLOOR(a), FLOOR_SP(a), FLOOR(a)=FLOOR_SP(a) FROM t1 ORDER BY a; +a FLOOR(a) FLOOR_SP(a) FLOOR(a)=FLOOR_SP(a) +-838:59:59.999999 -838:59:59 -838:59:59 1 +-838:59:59.999990 -838:59:59 -838:59:59 1 +-838:59:59.999900 -838:59:59 -838:59:59 1 +-838:59:59.999000 -838:59:59 -838:59:59 1 +-838:59:59.990000 -838:59:59 -838:59:59 1 +-838:59:59.900000 -838:59:59 -838:59:59 1 +-838:59:59.100000 -838:59:59 -838:59:59 1 +-838:59:59.000000 -838:59:59 -838:59:59 1 +-837:59:59.999999 -838:00:00 -838:00:00 1 +-837:59:59.999990 -838:00:00 -838:00:00 1 +-837:59:59.999900 -838:00:00 -838:00:00 1 +-837:59:59.999000 -838:00:00 -838:00:00 1 +-837:59:59.990000 -838:00:00 -838:00:00 1 +-837:59:59.900000 -838:00:00 -838:00:00 1 +-837:59:59.100000 -838:00:00 -838:00:00 1 +-837:59:59.000000 -837:59:59 -837:59:59 1 +-23:59:59.999999 -24:00:00 -24:00:00 1 +-23:59:59.999990 -24:00:00 -24:00:00 1 +-23:59:59.999900 -24:00:00 -24:00:00 1 +-23:59:59.999000 -24:00:00 -24:00:00 1 +-23:59:59.990000 -24:00:00 -24:00:00 1 +-23:59:59.900000 -24:00:00 -24:00:00 1 +-23:59:59.100000 -24:00:00 -24:00:00 1 +-23:59:59.000000 -23:59:59 -23:59:59 1 +-00:00:00.999999 -00:00:01 -00:00:01 1 +-00:00:00.999990 -00:00:01 -00:00:01 1 +-00:00:00.999900 -00:00:01 -00:00:01 1 +-00:00:00.999000 -00:00:01 -00:00:01 1 +-00:00:00.990000 -00:00:01 -00:00:01 1 +-00:00:00.900000 -00:00:01 -00:00:01 1 +-00:00:00.100000 -00:00:01 -00:00:01 1 +00:00:00.000000 00:00:00 00:00:00 1 +00:00:00.000000 00:00:00 00:00:00 1 +00:00:00.100000 00:00:00 00:00:00 1 +00:00:00.900000 00:00:00 00:00:00 1 +00:00:00.990000 00:00:00 00:00:00 1 +00:00:00.999000 00:00:00 00:00:00 1 +00:00:00.999900 00:00:00 00:00:00 1 +00:00:00.999990 00:00:00 00:00:00 1 +00:00:00.999999 00:00:00 00:00:00 1 +23:59:59.000000 23:59:59 23:59:59 1 +23:59:59.100000 23:59:59 23:59:59 1 +23:59:59.900000 23:59:59 23:59:59 1 +23:59:59.990000 23:59:59 23:59:59 1 +23:59:59.999000 23:59:59 23:59:59 1 +23:59:59.999900 23:59:59 23:59:59 1 +23:59:59.999990 23:59:59 23:59:59 1 +23:59:59.999999 23:59:59 23:59:59 1 +837:59:59.000000 837:59:59 837:59:59 1 +837:59:59.100000 837:59:59 837:59:59 1 +837:59:59.900000 837:59:59 837:59:59 1 +837:59:59.990000 837:59:59 837:59:59 1 +837:59:59.999000 837:59:59 837:59:59 1 +837:59:59.999900 837:59:59 837:59:59 1 +837:59:59.999990 837:59:59 837:59:59 1 +837:59:59.999999 837:59:59 837:59:59 1 +838:59:59.000000 838:59:59 838:59:59 1 +838:59:59.100000 838:59:59 838:59:59 1 +838:59:59.900000 838:59:59 838:59:59 1 +838:59:59.990000 838:59:59 838:59:59 1 +838:59:59.999000 838:59:59 838:59:59 1 +838:59:59.999900 838:59:59 838:59:59 1 +838:59:59.999990 838:59:59 838:59:59 1 +838:59:59.999999 838:59:59 838:59:59 1 +SELECT a, CEILING(a), CEILING_SP(a), CEILING(a)=CEILING_SP(a) FROM t1 ORDER BY a; +a CEILING(a) CEILING_SP(a) CEILING(a)=CEILING_SP(a) +-838:59:59.999999 -838:59:59 -838:59:59 1 +-838:59:59.999990 -838:59:59 -838:59:59 1 +-838:59:59.999900 -838:59:59 -838:59:59 1 +-838:59:59.999000 -838:59:59 -838:59:59 1 +-838:59:59.990000 -838:59:59 -838:59:59 1 +-838:59:59.900000 -838:59:59 -838:59:59 1 +-838:59:59.100000 -838:59:59 -838:59:59 1 +-838:59:59.000000 -838:59:59 -838:59:59 1 +-837:59:59.999999 -837:59:59 -837:59:59 1 +-837:59:59.999990 -837:59:59 -837:59:59 1 +-837:59:59.999900 -837:59:59 -837:59:59 1 +-837:59:59.999000 -837:59:59 -837:59:59 1 +-837:59:59.990000 -837:59:59 -837:59:59 1 +-837:59:59.900000 -837:59:59 -837:59:59 1 +-837:59:59.100000 -837:59:59 -837:59:59 1 +-837:59:59.000000 -837:59:59 -837:59:59 1 +-23:59:59.999999 -23:59:59 -23:59:59 1 +-23:59:59.999990 -23:59:59 -23:59:59 1 +-23:59:59.999900 -23:59:59 -23:59:59 1 +-23:59:59.999000 -23:59:59 -23:59:59 1 +-23:59:59.990000 -23:59:59 -23:59:59 1 +-23:59:59.900000 -23:59:59 -23:59:59 1 +-23:59:59.100000 -23:59:59 -23:59:59 1 +-23:59:59.000000 -23:59:59 -23:59:59 1 +-00:00:00.999999 00:00:00 00:00:00 1 +-00:00:00.999990 00:00:00 00:00:00 1 +-00:00:00.999900 00:00:00 00:00:00 1 +-00:00:00.999000 00:00:00 00:00:00 1 +-00:00:00.990000 00:00:00 00:00:00 1 +-00:00:00.900000 00:00:00 00:00:00 1 +-00:00:00.100000 00:00:00 00:00:00 1 +00:00:00.000000 00:00:00 00:00:00 1 +00:00:00.000000 00:00:00 00:00:00 1 +00:00:00.100000 00:00:01 00:00:01 1 +00:00:00.900000 00:00:01 00:00:01 1 +00:00:00.990000 00:00:01 00:00:01 1 +00:00:00.999000 00:00:01 00:00:01 1 +00:00:00.999900 00:00:01 00:00:01 1 +00:00:00.999990 00:00:01 00:00:01 1 +00:00:00.999999 00:00:01 00:00:01 1 +23:59:59.000000 23:59:59 23:59:59 1 +23:59:59.100000 24:00:00 24:00:00 1 +23:59:59.900000 24:00:00 24:00:00 1 +23:59:59.990000 24:00:00 24:00:00 1 +23:59:59.999000 24:00:00 24:00:00 1 +23:59:59.999900 24:00:00 24:00:00 1 +23:59:59.999990 24:00:00 24:00:00 1 +23:59:59.999999 24:00:00 24:00:00 1 +837:59:59.000000 837:59:59 837:59:59 1 +837:59:59.100000 838:00:00 838:00:00 1 +837:59:59.900000 838:00:00 838:00:00 1 +837:59:59.990000 838:00:00 838:00:00 1 +837:59:59.999000 838:00:00 838:00:00 1 +837:59:59.999900 838:00:00 838:00:00 1 +837:59:59.999990 838:00:00 838:00:00 1 +837:59:59.999999 838:00:00 838:00:00 1 +838:59:59.000000 838:59:59 838:59:59 1 +838:59:59.100000 838:59:59 838:59:59 1 +838:59:59.900000 838:59:59 838:59:59 1 +838:59:59.990000 838:59:59 838:59:59 1 +838:59:59.999000 838:59:59 838:59:59 1 +838:59:59.999900 838:59:59 838:59:59 1 +838:59:59.999990 838:59:59 838:59:59 1 +838:59:59.999999 838:59:59 838:59:59 1 +DROP FUNCTION FLOOR_SP; +DROP FUNCTION CEILING_SP; +DROP TABLE t1; diff --git a/mysql-test/main/type_time_hires.test b/mysql-test/main/type_time_hires.test index 0949738e949..f9b4a5a9f27 100644 --- a/mysql-test/main/type_time_hires.test +++ b/mysql-test/main/type_time_hires.test @@ -73,3 +73,126 @@ SELECT a, ROUND(a,-6) FROM t1; DROP TABLE t1; SET time_zone=DEFAULT; + + +--echo # +--echo # MDEV-23311 CEILING() and FLOOR() convert temporal input to numbers, unlike ROUND() and TRUNCATE() +--echo # + +CREATE TABLE t1 AS SELECT + FLOOR(TIME'00:00:00.999999'), + CEILING(TIME'00:00:00.999999'); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 (a TIME(6)); + +INSERT INTO t1 VALUES ('838:59:59.999999'); +INSERT INTO t1 VALUES ('838:59:59.99999'); +INSERT INTO t1 VALUES ('838:59:59.9999'); +INSERT INTO t1 VALUES ('838:59:59.999'); +INSERT INTO t1 VALUES ('838:59:59.99'); +INSERT INTO t1 VALUES ('838:59:59.9'); +INSERT INTO t1 VALUES ('838:59:59.1'); +INSERT INTO t1 VALUES ('838:59:59.0'); + +INSERT INTO t1 VALUES ('837:59:59.999999'); +INSERT INTO t1 VALUES ('837:59:59.99999'); +INSERT INTO t1 VALUES ('837:59:59.9999'); +INSERT INTO t1 VALUES ('837:59:59.999'); +INSERT INTO t1 VALUES ('837:59:59.99'); +INSERT INTO t1 VALUES ('837:59:59.9'); +INSERT INTO t1 VALUES ('837:59:59.1'); +INSERT INTO t1 VALUES ('837:59:59.0'); + +INSERT INTO t1 VALUES ('23:59:59.999999'); +INSERT INTO t1 VALUES ('23:59:59.99999'); +INSERT INTO t1 VALUES ('23:59:59.9999'); +INSERT INTO t1 VALUES ('23:59:59.999'); +INSERT INTO t1 VALUES ('23:59:59.99'); +INSERT INTO t1 VALUES ('23:59:59.9'); +INSERT INTO t1 VALUES ('23:59:59.1'); +INSERT INTO t1 VALUES ('23:59:59.0'); + +INSERT INTO t1 VALUES ('00:00:00.999999'); +INSERT INTO t1 VALUES ('00:00:00.99999'); +INSERT INTO t1 VALUES ('00:00:00.9999'); +INSERT INTO t1 VALUES ('00:00:00.999'); +INSERT INTO t1 VALUES ('00:00:00.99'); +INSERT INTO t1 VALUES ('00:00:00.9'); +INSERT INTO t1 VALUES ('00:00:00.1'); +INSERT INTO t1 VALUES ('00:00:00.0'); + +INSERT INTO t1 VALUES ('-00:00:00.999999'); +INSERT INTO t1 VALUES ('-00:00:00.99999'); +INSERT INTO t1 VALUES ('-00:00:00.9999'); +INSERT INTO t1 VALUES ('-00:00:00.999'); +INSERT INTO t1 VALUES ('-00:00:00.99'); +INSERT INTO t1 VALUES ('-00:00:00.9'); +INSERT INTO t1 VALUES ('-00:00:00.1'); +INSERT INTO t1 VALUES ('-00:00:00.0'); + +INSERT INTO t1 VALUES ('-23:59:59.999999'); +INSERT INTO t1 VALUES ('-23:59:59.99999'); +INSERT INTO t1 VALUES ('-23:59:59.9999'); +INSERT INTO t1 VALUES ('-23:59:59.999'); +INSERT INTO t1 VALUES ('-23:59:59.99'); +INSERT INTO t1 VALUES ('-23:59:59.9'); +INSERT INTO t1 VALUES ('-23:59:59.1'); +INSERT INTO t1 VALUES ('-23:59:59.0'); + +INSERT INTO t1 VALUES ('-837:59:59.999999'); +INSERT INTO t1 VALUES ('-837:59:59.99999'); +INSERT INTO t1 VALUES ('-837:59:59.9999'); +INSERT INTO t1 VALUES ('-837:59:59.999'); +INSERT INTO t1 VALUES ('-837:59:59.99'); +INSERT INTO t1 VALUES ('-837:59:59.9'); +INSERT INTO t1 VALUES ('-837:59:59.1'); +INSERT INTO t1 VALUES ('-837:59:59.0'); + +INSERT INTO t1 VALUES ('-838:59:59.999999'); +INSERT INTO t1 VALUES ('-838:59:59.99999'); +INSERT INTO t1 VALUES ('-838:59:59.9999'); +INSERT INTO t1 VALUES ('-838:59:59.999'); +INSERT INTO t1 VALUES ('-838:59:59.99'); +INSERT INTO t1 VALUES ('-838:59:59.9'); +INSERT INTO t1 VALUES ('-838:59:59.1'); +INSERT INTO t1 VALUES ('-838:59:59.0'); + +DELIMITER $$; +CREATE FUNCTION FLOOR_SP(a TIME(6)) RETURNS TIME +BEGIN + RETURN + CASE + WHEN TRUNCATE(a,0)=TIME'838:59:59' THEN a + WHEN TRUNCATE(a,0)=TIME'-838:59:59' THEN a + WHEN a=TRUNCATE(a,0) THEN a -- no fractional digits + WHEN a<0 THEN TRUNCATE(a,0)-INTERVAL 1 SECOND -- negative values + WHEN a>0 THEN TRUNCATE(a,0) -- positive values + END; +END; +$$ +DELIMITER ;$$ + +DELIMITER $$; +CREATE FUNCTION CEILING_SP(a TIME(6)) RETURNS TIME +BEGIN + RETURN + CASE + WHEN TRUNCATE(a,0)=TIME'838:59:59' THEN a + WHEN TRUNCATE(a,0)=TIME'-838:59:59' THEN a + WHEN a=TRUNCATE(a,0) THEN a -- no fractional digits + WHEN a<0 THEN TRUNCATE(a,0) -- negative values + WHEN a>0 THEN TRUNCATE(a,0)+INTERVAL 1 SECOND -- positive values + END; +END; +$$ +DELIMITER ;$$ + +SELECT a, FLOOR(a), FLOOR_SP(a), FLOOR(a)=FLOOR_SP(a) FROM t1 ORDER BY a; +SELECT a, CEILING(a), CEILING_SP(a), CEILING(a)=CEILING_SP(a) FROM t1 ORDER BY a; + +DROP FUNCTION FLOOR_SP; +DROP FUNCTION CEILING_SP; + +DROP TABLE t1; diff --git a/mysql-test/main/type_timestamp_hires.result b/mysql-test/main/type_timestamp_hires.result index dc69aa36b0f..64675ff9973 100644 --- a/mysql-test/main/type_timestamp_hires.result +++ b/mysql-test/main/type_timestamp_hires.result @@ -626,5 +626,17 @@ a ROUND(a,-6) DROP TABLE t1; SET time_zone=DEFAULT; # +# MDEV-23311 CEILING() and FLOOR() convert temporal input to numbers, unlike ROUND() and TRUNCATE() +# +CREATE TABLE t1 (a TIMESTAMP NOT NULL); +CREATE TABLE t2 AS SELECT FLOOR(a), CEILING(a) FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `FLOOR(a)` datetime DEFAULT NULL, + `CEILING(a)` datetime DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t1, t2; +# # End of 10.4 tests # diff --git a/mysql-test/main/type_timestamp_hires.test b/mysql-test/main/type_timestamp_hires.test index f2e765d09fe..27aed16d6be 100644 --- a/mysql-test/main/type_timestamp_hires.test +++ b/mysql-test/main/type_timestamp_hires.test @@ -107,6 +107,16 @@ DROP TABLE t1; SET time_zone=DEFAULT; + +--echo # +--echo # MDEV-23311 CEILING() and FLOOR() convert temporal input to numbers, unlike ROUND() and TRUNCATE() +--echo # + +CREATE TABLE t1 (a TIMESTAMP NOT NULL); +CREATE TABLE t2 AS SELECT FLOOR(a), CEILING(a) FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t1, t2; + --echo # --echo # End of 10.4 tests --echo # diff --git a/sql/item_func.cc b/sql/item_func.cc index 45a7b155481..424437ead07 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2218,8 +2218,7 @@ bool Item_func_int_val::fix_length_and_dec() { DBUG_ENTER("Item_func_int_val::fix_length_and_dec"); DBUG_PRINT("info", ("name %s", func_name())); - if (args[0]->cast_to_int_type_handler()-> - Item_func_int_val_fix_length_and_dec(this)) + if (args[0]->type_handler()->Item_func_int_val_fix_length_and_dec(this)) DBUG_RETURN(TRUE); DBUG_PRINT("info", ("Type: %s", type_handler()->name().ptr())); DBUG_RETURN(FALSE); @@ -2262,6 +2261,28 @@ my_decimal *Item_func_ceiling::decimal_op(my_decimal *decimal_value) } +bool Item_func_ceiling::date_op(THD *thd, MYSQL_TIME *to, date_mode_t fuzzydate) +{ + Datetime::Options opt(thd, TIME_FRAC_TRUNCATE); + Datetime *tm= new (to) Datetime(thd, args[0], opt); + tm->ceiling(thd); + null_value= !tm->is_valid_datetime(); + DBUG_ASSERT(maybe_null || !null_value); + return null_value; +} + + +bool Item_func_ceiling::time_op(THD *thd, MYSQL_TIME *to) +{ + static const Time::Options_for_round opt; + Time *tm= new (to) Time(thd, args[0], opt); + tm->ceiling(); + null_value= !tm->is_valid_time(); + DBUG_ASSERT(maybe_null || !null_value); + return null_value; +} + + longlong Item_func_floor::int_op() { switch (args[0]->result_type()) { @@ -2302,6 +2323,28 @@ my_decimal *Item_func_floor::decimal_op(my_decimal *decimal_value) } +bool Item_func_floor::date_op(THD *thd, MYSQL_TIME *to, date_mode_t fuzzydate) +{ + // DATETIME is not negative, so FLOOR means just truncation + Datetime::Options opt(thd, TIME_FRAC_TRUNCATE); + Datetime *tm= new (to) Datetime(thd, args[0], opt, 0); + null_value= !tm->is_valid_datetime(); + DBUG_ASSERT(maybe_null || !null_value); + return null_value; +} + + +bool Item_func_floor::time_op(THD *thd, MYSQL_TIME *to) +{ + static const Time::Options_for_round opt; + Time *tm= new (to) Time(thd, args[0], opt); + tm->floor(); + null_value= !tm->is_valid_time(); + DBUG_ASSERT(maybe_null || !null_value); + return null_value; +} + + void Item_func_round::fix_length_and_dec_decimal(uint decimals_to_set) { int decimals_delta= args[0]->decimals - decimals_to_set; @@ -2540,9 +2583,7 @@ bool Item_func_round::time_op(THD *thd, MYSQL_TIME *to) { DBUG_ASSERT(args[0]->type_handler()->mysql_timestamp_type() == MYSQL_TIMESTAMP_TIME); - Time::Options opt(Time::default_flags_for_get_date(), - truncate ? TIME_FRAC_TRUNCATE : TIME_FRAC_ROUND, - Time::DATETIME_TO_TIME_DISALLOW); + Time::Options_for_round opt(truncate ? TIME_FRAC_TRUNCATE : TIME_FRAC_ROUND); Longlong_hybrid_null dec= args[1]->to_longlong_hybrid_null(); Time *tm= new (to) Time(thd, args[0], opt, dec.to_uint(TIME_SECOND_PART_DIGITS)); diff --git a/sql/item_func.h b/sql/item_func.h index a8727272adc..dc9ec9be742 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -1666,13 +1666,32 @@ public: }; -class Item_func_int_val :public Item_func_num1 +class Item_func_int_val :public Item_func_hybrid_field_type { public: - Item_func_int_val(THD *thd, Item *a): Item_func_num1(thd, a) {} + Item_func_int_val(THD *thd, Item *a): Item_func_hybrid_field_type(thd, a) {} + bool check_partition_func_processor(void *int_arg) { return FALSE; } + bool check_vcol_func_processor(void *arg) { return FALSE; } void fix_length_and_dec_double(); void fix_length_and_dec_int_or_decimal(); + void fix_length_and_dec_time() + { + fix_attributes_time(0); + set_handler(&type_handler_time2); + } + void fix_length_and_dec_datetime() + { + fix_attributes_datetime(0); + set_handler(&type_handler_datetime2); + maybe_null= true; // E.g. CEILING(TIMESTAMP'0000-01-01 23:59:59.9') + } bool fix_length_and_dec(); + String *str_op(String *str) { DBUG_ASSERT(0); return 0; } + bool native_op(THD *thd, Native *to) + { + DBUG_ASSERT(0); + return true; + } }; @@ -1684,6 +1703,8 @@ public: longlong int_op(); double real_op(); my_decimal *decimal_op(my_decimal *); + bool date_op(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate); + bool time_op(THD *thd, MYSQL_TIME *ltime); Item *get_copy(THD *thd) { return get_item_copy(thd, this); } }; @@ -1697,6 +1718,8 @@ public: longlong int_op(); double real_op(); my_decimal *decimal_op(my_decimal *); + bool date_op(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate); + bool time_op(THD *thd, MYSQL_TIME *ltime); Item *get_copy(THD *thd) { return get_item_copy(thd, this); } }; diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index 924fdecffa9..d10c00aa325 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -1580,7 +1580,7 @@ static void set_sec_part(ulong sec_part, MYSQL_TIME *ltime, Item *item) { ltime->second_part= sec_part; if (item->decimals < TIME_SECOND_PART_DIGITS) - my_time_trunc(ltime, item->decimals); + my_datetime_trunc(ltime, item->decimals); } } diff --git a/sql/protocol.cc b/sql/protocol.cc index 8c7eeaec90c..947ddd33d4c 100644 --- a/sql/protocol.cc +++ b/sql/protocol.cc @@ -1524,7 +1524,7 @@ bool Protocol_binary::store(MYSQL_TIME *tm, int decimals) DBUG_ASSERT(decimals == AUTO_SEC_PART_DIGITS || (decimals >= 0 && decimals <= TIME_SECOND_PART_DIGITS)); if (decimals != AUTO_SEC_PART_DIGITS) - my_time_trunc(tm, decimals); + my_datetime_trunc(tm, decimals); int4store(pos+7, tm->second_part); if (tm->second_part) length=11; diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 8ec6ef96511..e5b178bd641 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -5330,7 +5330,7 @@ bool Protocol_local::store(const char *str, size_t length, bool Protocol_local::store(MYSQL_TIME *time, int decimals) { if (decimals != AUTO_SEC_PART_DIGITS) - my_time_trunc(time, decimals); + my_datetime_trunc(time, decimals); return store_column(time, sizeof(MYSQL_TIME)); } diff --git a/sql/sql_type.cc b/sql/sql_type.cc index b5711f6b41c..8b6d99de621 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -980,7 +980,7 @@ bool Temporal::datetime_round_or_invalidate(THD *thd, uint dec, int *warn, ulong DBUG_ASSERT(dec <= TIME_SECOND_PART_DIGITS); if (datetime_add_nanoseconds_or_invalidate(thd, warn, nsec)) return true; - my_time_trunc(this, dec); + my_datetime_trunc(this, dec); return false; } @@ -5732,6 +5732,22 @@ bool Type_handler_int_result:: } +bool Type_handler_typelib:: + Item_func_int_val_fix_length_and_dec(Item_func_int_val *item) const +{ + item->fix_length_and_dec_int_or_decimal(); + return false; +} + + +bool Type_handler_hex_hybrid:: + Item_func_int_val_fix_length_and_dec(Item_func_int_val *item) const +{ + item->fix_length_and_dec_int_or_decimal(); + return false; +} + + bool Type_handler_real_result:: Item_func_int_val_fix_length_and_dec(Item_func_int_val *item) const { @@ -5756,6 +5772,30 @@ bool Type_handler_temporal_result:: } +bool Type_handler_time_common:: + Item_func_int_val_fix_length_and_dec(Item_func_int_val *item) const +{ + item->fix_length_and_dec_time(); + return false; +} + + +bool Type_handler_datetime_common:: + Item_func_int_val_fix_length_and_dec(Item_func_int_val *item) const +{ + item->fix_length_and_dec_datetime(); + return false; +} + + +bool Type_handler_timestamp_common:: + Item_func_int_val_fix_length_and_dec(Item_func_int_val *item) const +{ + item->fix_length_and_dec_datetime(); + return false; +} + + bool Type_handler_string_result:: Item_func_int_val_fix_length_and_dec(Item_func_int_val *item) const { diff --git a/sql/sql_type.h b/sql/sql_type.h index 2be651a2f2f..efc8e94e454 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -1358,6 +1358,14 @@ public: { } }; + class Options_for_round: public Options + { + public: + Options_for_round(time_round_mode_t round_mode= TIME_FRAC_TRUNCATE) + :Options(Time::default_flags_for_get_date(), round_mode, + Time::DATETIME_TO_TIME_DISALLOW) + { } + }; class Options_cmp: public Options { public: @@ -1709,6 +1717,40 @@ public: DBUG_ASSERT(is_valid_value_slow()); return *this; } + Time &ceiling(int *warn) + { + if (is_valid_time()) + { + if (neg) + my_time_trunc(this, 0); + else if (second_part) + round_or_set_max(0, warn, 999999999); + } + DBUG_ASSERT(is_valid_value_slow()); + return *this; + } + Time &ceiling() + { + int warn= 0; + return ceiling(&warn); + } + Time &floor(int *warn) + { + if (is_valid_time()) + { + if (!neg) + my_time_trunc(this, 0); + else if (second_part) + round_or_set_max(0, warn, 999999999); + } + DBUG_ASSERT(is_valid_value_slow()); + return *this; + } + Time &floor() + { + int warn= 0; + return floor(&warn); + } Time &round(uint dec, int *warn) { if (is_valid_time()) @@ -2276,10 +2318,22 @@ public: Datetime &trunc(uint dec) { if (is_valid_datetime()) - my_time_trunc(this, dec); + my_datetime_trunc(this, dec); DBUG_ASSERT(is_valid_value_slow()); return *this; } + Datetime &ceiling(THD *thd, int *warn) + { + if (is_valid_datetime() && second_part) + round_or_invalidate(thd, 0, warn, 999999999); + DBUG_ASSERT(is_valid_value_slow()); + return *this; + } + Datetime &ceiling(THD *thd) + { + int warn= 0; + return ceiling(thd, &warn); + } Datetime &round(THD *thd, uint dec, int *warn) { if (is_valid_datetime()) @@ -5305,6 +5359,7 @@ public: MYSQL_TIME *, date_mode_t fuzzydate) const; longlong Item_func_between_val_int(Item_func_between *func) const; bool Item_func_round_fix_length_and_dec(Item_func_round *) const; + bool Item_func_int_val_fix_length_and_dec(Item_func_int_val *) const; Item *make_const_item_for_comparison(THD *, Item *src, const Item *cmp) const; bool set_comparator_func(Arg_comparator *cmp) const; cmp_item *make_cmp_item(THD *thd, CHARSET_INFO *cs) const; @@ -5532,6 +5587,7 @@ public: my_decimal *Item_func_min_max_val_decimal(Item_func_min_max *, my_decimal *) const; bool Item_func_round_fix_length_and_dec(Item_func_round *) const; + bool Item_func_int_val_fix_length_and_dec(Item_func_int_val *) const; bool Item_hybrid_func_fix_attributes(THD *thd, const char *name, Type_handler_hybrid_field_type *, @@ -5634,6 +5690,7 @@ public: int cmp_native(const Native &a, const Native &b) const; longlong Item_func_between_val_int(Item_func_between *func) const; bool Item_func_round_fix_length_and_dec(Item_func_round *) const; + bool Item_func_int_val_fix_length_and_dec(Item_func_int_val *) const; cmp_item *make_cmp_item(THD *thd, CHARSET_INFO *cs) const; in_vector *make_in_vector(THD *thd, const Item_func_in *f, uint nargs) const; void make_sort_key(uchar *to, Item *item, const SORT_FIELD_ATTR *sort_field, @@ -5977,6 +6034,7 @@ public: const Name name() const { return m_name_hex_hybrid; } const Type_handler *cast_to_int_type_handler() const; const Type_handler *type_handler_for_system_time() const; + bool Item_func_int_val_fix_length_and_dec(Item_func_int_val *) const; }; @@ -6212,6 +6270,7 @@ public: enum_field_types field_type() const { return MYSQL_TYPE_STRING; } const Type_handler *type_handler_for_item_field() const; const Type_handler *cast_to_int_type_handler() const; + bool Item_func_int_val_fix_length_and_dec(Item_func_int_val *) const; bool Item_hybrid_func_fix_attributes(THD *thd, const char *name, Type_handler_hybrid_field_type *, From 423de1e57417281a8b7265b97f46bf3933e411ad Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Tue, 28 Jul 2020 09:37:45 +0300 Subject: [PATCH 148/188] MDEV-23245 MDEV-22898 Still getting assertion failure in file data0type.cc line 67 Doesn't allow instant alter of a field which is a prefix part of some key is_part_of_a_key_prefix(): I hope the name of the function is clear ha_innobase::can_convert_string() ha_innobase::can_convert_varstring() ha_innobase::can_convert_blob(): it can't when field is_part_of_a_key_prefix() --- .../innodb/r/instant_alter_charset.result | 40 +++++++ .../suite/innodb/t/instant_alter_charset.test | 40 +++++++ storage/innobase/handler/ha_innodb.cc | 104 ++++++++++++------ 3 files changed, 148 insertions(+), 36 deletions(-) diff --git a/mysql-test/suite/innodb/r/instant_alter_charset.result b/mysql-test/suite/innodb/r/instant_alter_charset.result index 9e7dab8f7b4..6b60c79b558 100644 --- a/mysql-test/suite/innodb/r/instant_alter_charset.result +++ b/mysql-test/suite/innodb/r/instant_alter_charset.result @@ -1992,3 +1992,43 @@ KEY a_key (b, a(1)) INSERT INTO t1 VALUES (); ALTER TABLE t1 MODIFY a text DEFAULT NULL; DROP TABLE t1; +# +# MDEV-23245 Still getting assertion failure in file data0type.cc line 67 +# +CREATE TABLE Foo +( +Bar char(2) CHARACTER SET utf8, +KEY Bar (Bar(1)) +) ENGINE = InnoDB; +ALTER TABLE Foo MODIFY Bar char(2) CHARACTER SET utf8mb4; +INSERT INTO Foo VALUES ('a'); +DROP TABLE Foo; +CREATE TABLE Foo +( +Bar varchar(2) CHARACTER SET utf8, +KEY Bar (Bar(1)) +) ENGINE = InnoDB; +ALTER TABLE Foo MODIFY Bar varchar(2) CHARACTER SET utf8mb4; +INSERT INTO Foo VALUES ('a'); +DROP TABLE Foo; +CREATE TABLE Foo +( +Bar text CHARACTER SET utf8, +KEY Bar (Bar(1)) +) ENGINE = InnoDB; +ALTER TABLE Foo MODIFY Bar text CHARACTER SET utf8mb4; +INSERT INTO Foo VALUES ('a'); +DROP TABLE Foo; +CREATE TABLE t1 (a VARCHAR(2) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci, +PRIMARY KEY (a(1))) +ENGINE=InnoDB; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varchar(2) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, + PRIMARY KEY (`a`(1)) +) ENGINE=InnoDB DEFAULT CHARSET=latin1 +ALTER TABLE t1 MODIFY a VARCHAR(2) +CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +INSERT INTO t1 VALUES ('a'); +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/instant_alter_charset.test b/mysql-test/suite/innodb/t/instant_alter_charset.test index b14c7861c25..a5ddd49830c 100644 --- a/mysql-test/suite/innodb/t/instant_alter_charset.test +++ b/mysql-test/suite/innodb/t/instant_alter_charset.test @@ -803,3 +803,43 @@ CREATE TABLE t1 ( INSERT INTO t1 VALUES (); ALTER TABLE t1 MODIFY a text DEFAULT NULL; DROP TABLE t1; + +--echo # +--echo # MDEV-23245 Still getting assertion failure in file data0type.cc line 67 +--echo # + +CREATE TABLE Foo +( + Bar char(2) CHARACTER SET utf8, + KEY Bar (Bar(1)) +) ENGINE = InnoDB; +ALTER TABLE Foo MODIFY Bar char(2) CHARACTER SET utf8mb4; +INSERT INTO Foo VALUES ('a'); +DROP TABLE Foo; + +CREATE TABLE Foo +( + Bar varchar(2) CHARACTER SET utf8, + KEY Bar (Bar(1)) +) ENGINE = InnoDB; +ALTER TABLE Foo MODIFY Bar varchar(2) CHARACTER SET utf8mb4; +INSERT INTO Foo VALUES ('a'); +DROP TABLE Foo; + +CREATE TABLE Foo +( + Bar text CHARACTER SET utf8, + KEY Bar (Bar(1)) +) ENGINE = InnoDB; +ALTER TABLE Foo MODIFY Bar text CHARACTER SET utf8mb4; +INSERT INTO Foo VALUES ('a'); +DROP TABLE Foo; + +CREATE TABLE t1 (a VARCHAR(2) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci, +PRIMARY KEY (a(1))) +ENGINE=InnoDB; +SHOW CREATE TABLE t1; +ALTER TABLE t1 MODIFY a VARCHAR(2) +CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +INSERT INTO t1 VALUES ('a'); +DROP TABLE t1; diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 9678c466cb4..bda81bc6ac6 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -20970,6 +20970,31 @@ bool ha_innobase::rowid_filter_push(Rowid_filter* pk_filter) DBUG_RETURN(false); } +static bool is_part_of_a_key_prefix(const Field_longstr *field) +{ + const TABLE_SHARE *s= field->table->s; + + for (uint i= 0; i < s->keys; i++) + { + const KEY &key= s->key_info[i]; + for (uint j= 0; j < key.user_defined_key_parts; j++) + { + const KEY_PART_INFO &info= key.key_part[j]; + // When field is a part of some key, a key part and field will have the + // same length. And their length will be different when only some prefix + // of a field is used as a key part. That's what we're looking for here. + if (info.field->field_index == field->field_index && + info.length != field->field_length) + { + DBUG_ASSERT(info.length < field->field_length); + return true; + } + } + } + + return false; +} + static bool is_part_of_a_primary_key(const Field* field) { @@ -21004,6 +21029,11 @@ bool ha_innobase::can_convert_string(const Field_string *field, if (!field_cs.eq_collation_specific_names(new_type.charset)) return !is_part_of_a_primary_key(field); + // Fully indexed case works instantly like + // Compare_keys::EqualButKeyPartLength. But prefix case isn't implemented. + if (is_part_of_a_key_prefix(field)) + return false; + return true; } @@ -21018,53 +21048,50 @@ supports_enlarging(const dict_table_t* table, const Field_varstring* field, || field->field_length > 255 || !table->not_redundant(); } -bool -ha_innobase::can_convert_varstring(const Field_varstring* field, - const Column_definition& new_type) const +bool ha_innobase::can_convert_varstring( + const Field_varstring *field, const Column_definition &new_type) const { - if (new_type.length < field->field_length) { - return false; - } + if (new_type.length < field->field_length) + return false; - if (new_type.char_length < field->char_length()) { - return false; - } + if (new_type.char_length < field->char_length()) + return false; - if (!new_type.compression_method() != !field->compression_method()) { - return false; - } + if (!new_type.compression_method() != !field->compression_method()) + return false; - if (new_type.type_handler() != field->type_handler()) { - return false; - } + if (new_type.type_handler() != field->type_handler()) + return false; - if (new_type.charset != field->charset()) { - if (!supports_enlarging(m_prebuilt->table, field, new_type)) { - return false; - } + if (new_type.charset != field->charset()) + { + if (!supports_enlarging(m_prebuilt->table, field, new_type)) + return false; - Charset field_cs(field->charset()); - if (!field_cs.encoding_allows_reinterpret_as( - new_type.charset)) { - return false; - } + Charset field_cs(field->charset()); + if (!field_cs.encoding_allows_reinterpret_as(new_type.charset)) + return false; - if (!field_cs.eq_collation_specific_names(new_type.charset)) { - return !is_part_of_a_primary_key(field); - } + if (!field_cs.eq_collation_specific_names(new_type.charset)) + return !is_part_of_a_primary_key(field); - return true; - } + // Fully indexed case works instantly like + // Compare_keys::EqualButKeyPartLength. But prefix case isn't implemented. + if (is_part_of_a_key_prefix(field)) + return false; - if (new_type.length != field->field_length) { - if (!supports_enlarging(m_prebuilt->table, field, new_type)) { - return false; - } + return true; + } - return true; - } + if (new_type.length != field->field_length) + { + if (!supports_enlarging(m_prebuilt->table, field, new_type)) + return false; - return true; + return true; + } + + return true; } static bool is_part_of_a_key(const Field_blob *field) @@ -21106,6 +21133,11 @@ bool ha_innobase::can_convert_blob(const Field_blob *field, if (!field_cs.eq_collation_specific_names(new_type.charset)) return !is_part_of_a_key(field); + // Fully indexed case works instantly like + // Compare_keys::EqualButKeyPartLength. But prefix case isn't implemented. + if (is_part_of_a_key_prefix(field)) + return false; + return true; } From 34f2be3b296fdd5933687eda9c3ef3ba9f707261 Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Tue, 24 Jul 2018 01:49:59 +1000 Subject: [PATCH 149/188] MDEV-16023 Unfortunate error message WARN_VERS_PART_FULL (partition is full) when rotation time for the last interval passed * remove one case of WARN_VERS_PART_FULL --- .../versioning/r/partition_rotation.result | 20 +++++++++++++++---- .../versioning/t/partition_rotation.test | 18 +++++++++++++++++ sql/partition_info.cc | 1 - 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/mysql-test/suite/versioning/r/partition_rotation.result b/mysql-test/suite/versioning/r/partition_rotation.result index 82558085c02..ff312c937cc 100644 --- a/mysql-test/suite/versioning/r/partition_rotation.result +++ b/mysql-test/suite/versioning/r/partition_rotation.result @@ -8,11 +8,7 @@ insert t1 values (1); delete from t1; set timestamp=unix_timestamp('2001-02-04 10:20:50'); insert t1 values (2); -Warnings: -Warning 4114 Versioned table `test`.`t1`: partition `p1` is full, add more HISTORY partitions delete from t1; -Warnings: -Warning 4114 Versioned table `test`.`t1`: partition `p1` is full, add more HISTORY partitions select subpartition_name,partition_description,table_rows from information_schema.partitions where table_schema='test' and table_name='t1'; subpartition_name partition_description table_rows p1sp0 2001-02-04 10:20:30 1 @@ -55,4 +51,20 @@ i explain partitions select * from t1 for system_time all where row_end = @ts; id select_type table partitions type possible_keys key key_len ref rows Extra 1 SIMPLE t1 p1_p1sp0,p1_p1sp1 # NULL NULL NULL NULL # # +# +# MDEV-16023 Unfortunate error message WARN_VERS_PART_FULL +# +set timestamp= unix_timestamp('2020-07-29 10:30:10'); +create or replace table t1 (a int) with system versioning +partition by system_time interval 1 second ( +partition p0 history, +partition p1 history, +partition pc current +); +set timestamp= unix_timestamp('2020-07-29 10:30:14'); +insert into t1 values (1),(2),(3); +show warnings; +Level Code Message +# Cleanup +set timestamp= default; drop table t1; diff --git a/mysql-test/suite/versioning/t/partition_rotation.test b/mysql-test/suite/versioning/t/partition_rotation.test index 4937a2a069b..efcd393c7e0 100644 --- a/mysql-test/suite/versioning/t/partition_rotation.test +++ b/mysql-test/suite/versioning/t/partition_rotation.test @@ -37,4 +37,22 @@ select * from t1 for system_time all where row_end = @ts; --replace_column 5 # 10 # 11 # explain partitions select * from t1 for system_time all where row_end = @ts; +--echo # +--echo # MDEV-16023 Unfortunate error message WARN_VERS_PART_FULL +--echo # + +set timestamp= unix_timestamp('2020-07-29 10:30:10'); +create or replace table t1 (a int) with system versioning + partition by system_time interval 1 second ( + partition p0 history, + partition p1 history, + partition pc current + ); + +set timestamp= unix_timestamp('2020-07-29 10:30:14'); +insert into t1 values (1),(2),(3); +show warnings; + +--echo # Cleanup +set timestamp= default; drop table t1; diff --git a/sql/partition_info.cc b/sql/partition_info.cc index 8989a918c0c..9f08964e62c 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -875,7 +875,6 @@ void partition_info::vers_set_hist_part(THD *thd) if (next->range_value > thd->query_start()) return; } - goto warn; } return; warn: From 8ec877f40a0e8e7432f1ef2cbd1d744c793eab2d Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Wed, 29 Jul 2020 08:17:57 +0300 Subject: [PATCH 150/188] speed up my_timer_init() I run perf top during ./mtr testing and constantly see times() function there. It's so slow, that it has no sense to run it in a loop too many times. This patch speeds up -suite=innodb for me from 218s to 208s. 9s of times() function! --- mysys/my_rdtsc.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mysys/my_rdtsc.c b/mysys/my_rdtsc.c index afb97553dd7..b020e224a59 100644 --- a/mysys/my_rdtsc.c +++ b/mysys/my_rdtsc.c @@ -812,7 +812,11 @@ void my_timer_init(MY_TIMER_INFO *mti) time1= my_timer_cycles(); time2= my_timer_ticks(); time3= time2; /* Avoids a Microsoft/IBM compiler warning */ +#if defined(HAVE_SYS_TIMES_H) && defined(HAVE_TIMES) + for (i= 0; i < 1000; ++i) +#else for (i= 0; i < MY_TIMER_ITERATIONS * 1000; ++i) +#endif { time3= my_timer_ticks(); if (time3 - time2 > 10) break; From 2107e3bb9c0d2e039c371a36fe7b3d7dcb2b6c5f Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Tue, 28 Jul 2020 10:39:05 +0200 Subject: [PATCH 151/188] MDEV-21258: Can't uninstall plugin if the library file doesn't exist Removing plugin from the mysql.plugin even if the plugin is not loaded --- mysql-test/r/plugin.result | 13 ++++++ .../suite/plugins/r/audit_null_debug.result | 1 + .../suite/plugins/t/audit_null_debug.test | 3 +- mysql-test/t/plugin.test | 20 +++++++++ sql/sql_plugin.cc | 45 +++++++++++-------- 5 files changed, 63 insertions(+), 19 deletions(-) diff --git a/mysql-test/r/plugin.result b/mysql-test/r/plugin.result index 93a150ae424..04931001901 100644 --- a/mysql-test/r/plugin.result +++ b/mysql-test/r/plugin.result @@ -341,3 +341,16 @@ RENAME TABLE t1 TO t2; ERROR 42S02: Table 'test.t1' doesn't exist DROP TABLE t1; # End of 10.1 test +# +# MDEV-21258: Can't uninstall plugin if the library file doesn't exist +# +insert into mysql.plugin values ("unexisting_plugin", "soname"); +select * from mysql.plugin WHERE name='unexisting_plugin'; +name dl +unexisting_plugin soname +UNINSTALL PLUGIN unexisting_plugin; +select * from mysql.plugin WHERE name='unexisting_plugin'; +name dl +UNINSTALL PLUGIN unexisting_plugin; +ERROR 42000: PLUGIN unexisting_plugin does not exist +# End of 10.2 tests diff --git a/mysql-test/suite/plugins/r/audit_null_debug.result b/mysql-test/suite/plugins/r/audit_null_debug.result index 9d5c7c4a02c..e70de36a2ec 100644 --- a/mysql-test/suite/plugins/r/audit_null_debug.result +++ b/mysql-test/suite/plugins/r/audit_null_debug.result @@ -11,5 +11,6 @@ uninstall plugin audit_null; ERROR HY000: Index for table './mysql/plugin.MYI' is corrupt; try to repair it SET debug_dbug=@old_dbug; uninstall plugin audit_null; +uninstall plugin audit_null; ERROR 42000: PLUGIN audit_null does not exist delete from mysql.plugin where name='audit_null'; diff --git a/mysql-test/suite/plugins/t/audit_null_debug.test b/mysql-test/suite/plugins/t/audit_null_debug.test index 0534108b107..f3c88d24c0c 100644 --- a/mysql-test/suite/plugins/t/audit_null_debug.test +++ b/mysql-test/suite/plugins/t/audit_null_debug.test @@ -26,7 +26,8 @@ SET debug_dbug='+d,myisam_pretend_crashed_table_on_usage'; uninstall plugin audit_null; SET debug_dbug=@old_dbug; ---error 1305 +uninstall plugin audit_null; +--error ER_SP_DOES_NOT_EXIST uninstall plugin audit_null; delete from mysql.plugin where name='audit_null'; diff --git a/mysql-test/t/plugin.test b/mysql-test/t/plugin.test index e1a17d49174..d2e828b2589 100644 --- a/mysql-test/t/plugin.test +++ b/mysql-test/t/plugin.test @@ -276,3 +276,23 @@ RENAME TABLE t1 TO t2; DROP TABLE t1; --echo # End of 10.1 test + +--echo # +--echo # MDEV-21258: Can't uninstall plugin if the library file doesn't exist +--echo # + +insert into mysql.plugin values ("unexisting_plugin", "soname"); + +# check that we have the plugin installed +select * from mysql.plugin WHERE name='unexisting_plugin'; + +# make attempt to uninstall the plugin +UNINSTALL PLUGIN unexisting_plugin; + +# check that we have the plugin uninstalled +select * from mysql.plugin WHERE name='unexisting_plugin'; + +--error ER_SP_DOES_NOT_EXIST +UNINSTALL PLUGIN unexisting_plugin; + +--echo # End of 10.2 tests diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index 42d2d110f2b..968ec6ac7d4 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -2216,26 +2216,30 @@ static bool do_uninstall(THD *thd, TABLE *table, const LEX_STRING *name) if (!(plugin= plugin_find_internal(name, MYSQL_ANY_PLUGIN)) || plugin->state & (PLUGIN_IS_UNINITIALIZED | PLUGIN_IS_DYING)) { - my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "PLUGIN", name->str); - return 1; - } - if (!plugin->plugin_dl) - { - my_error(ER_PLUGIN_DELETE_BUILTIN, MYF(0)); - return 1; - } - if (plugin->load_option == PLUGIN_FORCE_PLUS_PERMANENT) - { - my_error(ER_PLUGIN_IS_PERMANENT, MYF(0), name->str); - return 1; + // maybe plugin is in mysql.plugin present so postpond the error + plugin= NULL; } - plugin->state= PLUGIN_IS_DELETED; - if (plugin->ref_count) - push_warning(thd, Sql_condition::WARN_LEVEL_WARN, - WARN_PLUGIN_BUSY, ER_THD(thd, WARN_PLUGIN_BUSY)); - else - reap_needed= true; + if (plugin) + { + if (!plugin->plugin_dl) + { + my_error(ER_PLUGIN_DELETE_BUILTIN, MYF(0)); + return 1; + } + if (plugin->load_option == PLUGIN_FORCE_PLUS_PERMANENT) + { + my_error(ER_PLUGIN_IS_PERMANENT, MYF(0), name->str); + return 1; + } + + plugin->state= PLUGIN_IS_DELETED; + if (plugin->ref_count) + push_warning(thd, Sql_condition::WARN_LEVEL_WARN, + WARN_PLUGIN_BUSY, ER_THD(thd, WARN_PLUGIN_BUSY)); + else + reap_needed= true; + } uchar user_key[MAX_KEY_LENGTH]; table->use_all_columns(); @@ -2260,6 +2264,11 @@ static bool do_uninstall(THD *thd, TABLE *table, const LEX_STRING *name) return 1; } } + else if (!plugin) + { + my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "PLUGIN", name->str); + return 1; + } return 0; } From 92499ae95ced000b064910d1a15705faa64cc88f Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Wed, 29 Jul 2020 10:22:17 +0400 Subject: [PATCH 152/188] MDEV-23320 Hex hybrid constants 0xHHHH work badly in rounding functions - Type_handler_hex_hybrid did not override Type_handler_string_result::Item_func_round_fix_length_and_dec(), so the result type of ROUND(0xFFFFFFFFFFFFFFFF) was erroneously calculated ad DOUBLE with a wrong length. Overriding Item_func_round_fix_length_and_dec(), to calculated the result type as INT/BIGINT. Also, fixing Item_func_round::fix_arg_int() to use args[0]->decimal_precision() instead of args[0]->max_length when calculating this->max_length, to get a correct result for hex hybrids. - Type_handler_hex_hybrid::Item_func_int_val_fix_length_and_dec() called item->fix_length_and_dec_int_or_decimal(), which did not produce a correct result data type for hex hybrid. Implementing a dedicated code instead, to return INT UNSIGNED or BIGINT UNSIGNED depending in the number of digits in the arguments. --- mysql-test/main/type_hex_hybrid.result | 158 +++++++++++++++++++++++++ mysql-test/main/type_hex_hybrid.test | 30 +++++ sql/item_func.cc | 4 +- sql/sql_type.cc | 17 ++- sql/sql_type.h | 1 + 5 files changed, 208 insertions(+), 2 deletions(-) diff --git a/mysql-test/main/type_hex_hybrid.result b/mysql-test/main/type_hex_hybrid.result index eec24f6e89e..92a7432ae56 100644 --- a/mysql-test/main/type_hex_hybrid.result +++ b/mysql-test/main/type_hex_hybrid.result @@ -20,5 +20,163 @@ Warnings: Note 1003 select `test`.`t1`.`a` AS `a` from `test`.`t1` where (octet_length(charset('a'))) + `test`.`t1`.`a` <=> (octet_length(charset(0x61))) + `test`.`t1`.`a` DROP TABLE t1; # +# MDEV-23320 Hex hybrid constants 0xHHHH work badly in rounding functions +# +BEGIN NOT ATOMIC +DECLARE arg TEXT DEFAULT ''; +DECLARE query TEXT DEFAULT +'CREATE TABLE t1 AS SELECT ' + '0xFFFFFFFFFFFFFFFF+0 AS c1,' + 'FLOOR(0xFFFFFFFFFFFFFFFF) AS c2,' + 'CEILING(0xFFFFFFFFFFFFFFFF) AS c3,' + 'ROUND(0xFFFFFFFFFFFFFFFF) AS c4,' + 'TRUNCATE(0xFFFFFFFFFFFFFFFF,0) AS c5'; +FOR i IN 1..9 +DO +SET arg= CONCAT('0x',REPEAT('FF',i)); +SELECT i, arg; +EXECUTE IMMEDIATE REPLACE(query,'0xFFFFFFFFFFFFFFFF', arg); +SHOW CREATE TABLE t1; +SELECT * FROM t1; +DROP TABLE t1; +END FOR; +END; +$$ +i 1 +arg 0xFF +Table t1 +Create Table CREATE TABLE `t1` ( + `c1` int(4) unsigned NOT NULL, + `c2` int(3) unsigned NOT NULL, + `c3` int(3) unsigned NOT NULL, + `c4` int(3) unsigned NOT NULL, + `c5` int(3) unsigned NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +c1 255 +c2 255 +c3 255 +c4 255 +c5 255 +i 2 +arg 0xFFFF +Table t1 +Create Table CREATE TABLE `t1` ( + `c1` int(6) unsigned NOT NULL, + `c2` int(5) unsigned NOT NULL, + `c3` int(5) unsigned NOT NULL, + `c4` int(5) unsigned NOT NULL, + `c5` int(5) unsigned NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +c1 65535 +c2 65535 +c3 65535 +c4 65535 +c5 65535 +i 3 +arg 0xFFFFFF +Table t1 +Create Table CREATE TABLE `t1` ( + `c1` int(9) unsigned NOT NULL, + `c2` int(8) unsigned NOT NULL, + `c3` int(8) unsigned NOT NULL, + `c4` int(8) unsigned NOT NULL, + `c5` int(8) unsigned NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +c1 16777215 +c2 16777215 +c3 16777215 +c4 16777215 +c5 16777215 +i 4 +arg 0xFFFFFFFF +Table t1 +Create Table CREATE TABLE `t1` ( + `c1` bigint(11) unsigned NOT NULL, + `c2` bigint(10) unsigned NOT NULL, + `c3` bigint(10) unsigned NOT NULL, + `c4` bigint(10) unsigned NOT NULL, + `c5` bigint(10) unsigned NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +c1 4294967295 +c2 4294967295 +c3 4294967295 +c4 4294967295 +c5 4294967295 +i 5 +arg 0xFFFFFFFFFF +Table t1 +Create Table CREATE TABLE `t1` ( + `c1` bigint(14) unsigned NOT NULL, + `c2` bigint(13) unsigned NOT NULL, + `c3` bigint(13) unsigned NOT NULL, + `c4` bigint(13) unsigned NOT NULL, + `c5` bigint(13) unsigned NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +c1 1099511627775 +c2 1099511627775 +c3 1099511627775 +c4 1099511627775 +c5 1099511627775 +i 6 +arg 0xFFFFFFFFFFFF +Table t1 +Create Table CREATE TABLE `t1` ( + `c1` bigint(16) unsigned NOT NULL, + `c2` bigint(15) unsigned NOT NULL, + `c3` bigint(15) unsigned NOT NULL, + `c4` bigint(15) unsigned NOT NULL, + `c5` bigint(15) unsigned NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +c1 281474976710655 +c2 281474976710655 +c3 281474976710655 +c4 281474976710655 +c5 281474976710655 +i 7 +arg 0xFFFFFFFFFFFFFF +Table t1 +Create Table CREATE TABLE `t1` ( + `c1` bigint(18) unsigned NOT NULL, + `c2` bigint(17) unsigned NOT NULL, + `c3` bigint(17) unsigned NOT NULL, + `c4` bigint(17) unsigned NOT NULL, + `c5` bigint(17) unsigned NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +c1 72057594037927935 +c2 72057594037927935 +c3 72057594037927935 +c4 72057594037927935 +c5 72057594037927935 +i 8 +arg 0xFFFFFFFFFFFFFFFF +Table t1 +Create Table CREATE TABLE `t1` ( + `c1` bigint(21) unsigned NOT NULL, + `c2` bigint(20) unsigned NOT NULL, + `c3` bigint(20) unsigned NOT NULL, + `c4` bigint(20) unsigned NOT NULL, + `c5` bigint(20) unsigned NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +c1 18446744073709551615 +c2 18446744073709551615 +c3 18446744073709551615 +c4 18446744073709551615 +c5 18446744073709551615 +i 9 +arg 0xFFFFFFFFFFFFFFFFFF +Table t1 +Create Table CREATE TABLE `t1` ( + `c1` bigint(21) unsigned NOT NULL, + `c2` bigint(20) unsigned NOT NULL, + `c3` bigint(20) unsigned NOT NULL, + `c4` bigint(20) unsigned NOT NULL, + `c5` bigint(20) unsigned NOT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +c1 18446744073709551615 +c2 18446744073709551615 +c3 18446744073709551615 +c4 18446744073709551615 +c5 18446744073709551615 +# # End of 10.4 tests # diff --git a/mysql-test/main/type_hex_hybrid.test b/mysql-test/main/type_hex_hybrid.test index a39750e2635..77afb45cfbf 100644 --- a/mysql-test/main/type_hex_hybrid.test +++ b/mysql-test/main/type_hex_hybrid.test @@ -16,6 +16,36 @@ SELECT * FROM t1 WHERE LENGTH(CHARSET('a'))+a<=>LENGTH(CHARSET(0x61))+a; EXPLAIN EXTENDED SELECT * FROM t1 WHERE LENGTH(CHARSET('a'))+a<=>LENGTH(CHARSET(0x61))+a; DROP TABLE t1; +--echo # +--echo # MDEV-23320 Hex hybrid constants 0xHHHH work badly in rounding functions +--echo # + +--vertical_results +DELIMITER $$; +BEGIN NOT ATOMIC + DECLARE arg TEXT DEFAULT ''; + DECLARE query TEXT DEFAULT + 'CREATE TABLE t1 AS SELECT ' + '0xFFFFFFFFFFFFFFFF+0 AS c1,' + 'FLOOR(0xFFFFFFFFFFFFFFFF) AS c2,' + 'CEILING(0xFFFFFFFFFFFFFFFF) AS c3,' + 'ROUND(0xFFFFFFFFFFFFFFFF) AS c4,' + 'TRUNCATE(0xFFFFFFFFFFFFFFFF,0) AS c5'; + FOR i IN 1..9 + DO + SET arg= CONCAT('0x',REPEAT('FF',i)); + SELECT i, arg; + EXECUTE IMMEDIATE REPLACE(query,'0xFFFFFFFFFFFFFFFF', arg); + SHOW CREATE TABLE t1; + SELECT * FROM t1; + DROP TABLE t1; + END FOR; +END; +$$ +DELIMITER ;$$ +--horizontal_results + + --echo # --echo # End of 10.4 tests --echo # diff --git a/sql/item_func.cc b/sql/item_func.cc index 424437ead07..cf01934806c 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2228,6 +2228,7 @@ bool Item_func_int_val::fix_length_and_dec() longlong Item_func_ceiling::int_op() { switch (args[0]->result_type()) { + case STRING_RESULT: // hex hybrid case INT_RESULT: return val_int_from_item(args[0]); case DECIMAL_RESULT: @@ -2286,6 +2287,7 @@ bool Item_func_ceiling::time_op(THD *thd, MYSQL_TIME *to) longlong Item_func_floor::int_op() { switch (args[0]->result_type()) { + case STRING_RESULT: // hex hybrid case INT_RESULT: return val_int_from_item(args[0]); case DECIMAL_RESULT: @@ -2452,7 +2454,7 @@ void Item_func_round::fix_arg_int() { // Length can increase in some cases: ROUND(9,-1) -> 10 int length_can_increase= MY_TEST(!truncate && val1.neg()); - max_length= args[0]->max_length + length_can_increase; + max_length= args[0]->decimal_precision() + length_can_increase; // Here we can keep INT_RESULT unsigned_flag= args[0]->unsigned_flag; decimals= 0; diff --git a/sql/sql_type.cc b/sql/sql_type.cc index 8b6d99de621..43b742604bc 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -5650,6 +5650,14 @@ bool Type_handler_int_result:: } +bool Type_handler_hex_hybrid:: + Item_func_round_fix_length_and_dec(Item_func_round *item) const +{ + item->fix_arg_int(); + return false; +} + + bool Type_handler_real_result:: Item_func_round_fix_length_and_dec(Item_func_round *item) const { @@ -5743,7 +5751,14 @@ bool Type_handler_typelib:: bool Type_handler_hex_hybrid:: Item_func_int_val_fix_length_and_dec(Item_func_int_val *item) const { - item->fix_length_and_dec_int_or_decimal(); + item->collation.set_numeric(); + item->unsigned_flag= true; + item->max_length= item->arguments()[0]->decimal_precision(); +#if MARIADB_VERSION_ID < 100500 + item->set_handler(type_handler_long_or_longlong(item->max_length)); +#else + item->set_handler(type_handler_long_or_longlong(item->max_length, true)); +#endif return false; } diff --git a/sql/sql_type.h b/sql/sql_type.h index efc8e94e454..f98f2349f78 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -6034,6 +6034,7 @@ public: const Name name() const { return m_name_hex_hybrid; } const Type_handler *cast_to_int_type_handler() const; const Type_handler *type_handler_for_system_time() const; + bool Item_func_round_fix_length_and_dec(Item_func_round *) const; bool Item_func_int_val_fix_length_and_dec(Item_func_int_val *) const; }; From ab48901d54f1d9002e786e0a01c6d26751e2cc32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Sun, 14 Jun 2020 14:49:45 +0300 Subject: [PATCH 153/188] Fix spelling errors --- mysql-test/suite/maria/maria-connect.result | 2 +- sql/mdl.cc | 4 ++-- sql/share/errmsg-utf8.txt | 2 +- sql/sql_help.cc | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mysql-test/suite/maria/maria-connect.result b/mysql-test/suite/maria/maria-connect.result index 76e30d7d136..5c8b5524d69 100644 --- a/mysql-test/suite/maria/maria-connect.result +++ b/mysql-test/suite/maria/maria-connect.result @@ -11,7 +11,7 @@ ERROR 23000: Duplicate entry '2' for key 'PRIMARY' show warnings; Level Code Message Error 1062 Duplicate entry '2' for key 'PRIMARY' -Note 4173 Engine Aria does not support rollback. Changes where commited during rollback call +Note 4173 Engine Aria does not support rollback. Changes where committed during rollback call Warning 1196 Some non-transactional changed tables couldn't be rolled back select * from t1; a diff --git a/sql/mdl.cc b/sql/mdl.cc index 6cdea8c3ebd..4772dc017f9 100644 --- a/sql/mdl.cc +++ b/sql/mdl.cc @@ -1035,7 +1035,7 @@ void MDL_ticket::destroy(MDL_ticket *ticket) /** Return the 'weight' of this ticket for the - victim selection algorithm. Requests with + victim selection algorithm. Requests with lower weight are preferred to requests with higher weight when choosing a victim. */ @@ -2179,7 +2179,7 @@ MDL_context::clone_ticket(MDL_request *mdl_request) to wait for another thread which is not ready to commit. This is always an error, as the upper level of parallel replication should not allow a scheduling of a conflicting DDL until all earlier - transactions has commited. + transactions have been committed. This function is only called for a slave using parallel replication and trying to get an exclusive lock for the table. diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index 275dc1605d8..63df3a6b956 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -7964,4 +7964,4 @@ ER_KEY_CANT_HAVE_WITHOUT_OVERLAPS ER_NOT_ALLOWED_IN_THIS_CONTEXT eng "'%-.128s' is not allowed in this context" ER_DATA_WAS_COMMITED_UNDER_ROLLBACK - eng "Engine %s does not support rollback. Changes where commited during rollback call" + eng "Engine %s does not support rollback. Changes where committed during rollback call" diff --git a/sql/sql_help.cc b/sql/sql_help.cc index 3ccab553bfe..e31e51d0316 100644 --- a/sql/sql_help.cc +++ b/sql/sql_help.cc @@ -671,7 +671,7 @@ SQL_SELECT *prepare_select_for_name(THD *thd, const char *mask, size_t mlen, RETURN VALUES FALSE Success - TRUE Error and send_error already commited + TRUE Error and send_error already committed */ static bool mysqld_help_internal(THD *thd, const char *mask) From b8031e362af4d86ea4260c233ccb56dd18112691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Sun, 14 Jun 2020 14:25:15 +0300 Subject: [PATCH 154/188] Use mktemp instead of deprecated tempfile This fixes the warning emitted during `/etc/init.d/mariadb restart`: WARNING: tempfile is deprecated; consider using mktemp instead. --- debian/additions/debian-start.inc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/additions/debian-start.inc.sh b/debian/additions/debian-start.inc.sh index fa5b1299bdc..dfb756225b0 100755 --- a/debian/additions/debian-start.inc.sh +++ b/debian/additions/debian-start.inc.sh @@ -15,7 +15,7 @@ function check_for_crashed_tables() { # Checking for $? is unreliable so the size of the output is checked. # Some table handlers like HEAP do not support CHECK TABLE. - tempfile=`tempfile` + tempfile=$(mktemp) # We have to use xargs in this case, because a for loop barfs on the # spaces in the thing to be looped over. From 7c1807a0ad1e7461b34a1d50165883a7392ca81f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Fri, 19 Jun 2020 13:40:50 +0300 Subject: [PATCH 155/188] Deb: On upgrades, stop both mysqld and mariadbd for backwards compat --- debian/mariadb-server-10.5.postrm | 3 +++ debian/mariadb-server-10.5.preinst | 3 +++ 2 files changed, 6 insertions(+) diff --git a/debian/mariadb-server-10.5.postrm b/debian/mariadb-server-10.5.postrm index 00ff90dbb20..97789a038df 100644 --- a/debian/mariadb-server-10.5.postrm +++ b/debian/mariadb-server-10.5.postrm @@ -18,9 +18,12 @@ stop_server() { # Return immediately if there are no mysql processes running # as there is no point in trying to shutdown in that case. if ! pgrep -x mariadbd > /dev/null; then return; fi + # Compatibility with versions that ran 'mysqld' + if ! pgrep -x mysqld > /dev/null; then return; fi set +e invoke-rc.d mariadb stop + invoke-rc.d mysql stop # Backwards compatibility errno=$? set -e diff --git a/debian/mariadb-server-10.5.preinst b/debian/mariadb-server-10.5.preinst index ce4ca3fee9d..919031066c9 100644 --- a/debian/mariadb-server-10.5.preinst +++ b/debian/mariadb-server-10.5.preinst @@ -31,9 +31,12 @@ stop_server() { # Return immediately if there are no mysql processes running # as there is no point in trying to shutdown in that case. if ! pgrep -x --ns $$ mariadbd > /dev/null; then return; fi + # Compatibility with versions that ran 'mysqld' + if ! pgrep -x --ns $$ mysqld > /dev/null; then return; fi set +e invoke-rc.d mariadb stop + invoke-rc.d mysql stop # Backwards compatibility errno=$? set -e From 7a0fa9da038b7fea95f00ba603c536beccb3d19c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Sat, 11 Jul 2020 12:12:34 +0300 Subject: [PATCH 156/188] Deb: Cleanup and document - Remove unnecessary unused files - Remove duplicate encryption configuration sample from sources and re-use the identical file in RPM directory instead - Clean away harmful "default-character-set = utf8mb4" from client config as it is unnecassary (server enforces utf8mb4 anyway by default) and could cause issues with mysqlbinlog and other tools (MDEV-22981). - Update S3 plugin description to be long enough - Remove trailing whitespace from support-files and Debian packaging. - Clean away fixed Lintian issues - Clean away temporary Salsa-CI fixes now that 10.5.4 is out and is fixed - Apply wrap-and-sort -a -v --- debian/additions/Docs__Images__Makefile.in | 6 - debian/additions/Docs__Makefile.in | 6 - debian/additions/debian-start.inc.sh | 12 +- debian/additions/enable_encryption.preset | 20 --- debian/additions/innotop/innotop | 140 +++++++++--------- debian/additions/innotop/innotop.1 | 50 +++---- debian/additions/mariadb.cnf | 7 +- debian/additions/mariadb.conf.d/50-client.cnf | 3 - .../99-enable-encryption.cnf.preset | 1 + debian/control | 6 +- debian/salsa-ci.yml | 24 +-- debian/source/lintian-overrides | 2 - 12 files changed, 112 insertions(+), 165 deletions(-) delete mode 100644 debian/additions/Docs__Images__Makefile.in delete mode 100644 debian/additions/Docs__Makefile.in delete mode 100644 debian/additions/enable_encryption.preset create mode 120000 debian/additions/mariadb.conf.d/99-enable-encryption.cnf.preset diff --git a/debian/additions/Docs__Images__Makefile.in b/debian/additions/Docs__Images__Makefile.in deleted file mode 100644 index f7316d4e345..00000000000 --- a/debian/additions/Docs__Images__Makefile.in +++ /dev/null @@ -1,6 +0,0 @@ -all: - -distclean: - -rm -f Makefile - -.PHONY: all distclean clean install check diff --git a/debian/additions/Docs__Makefile.in b/debian/additions/Docs__Makefile.in deleted file mode 100644 index f7316d4e345..00000000000 --- a/debian/additions/Docs__Makefile.in +++ /dev/null @@ -1,6 +0,0 @@ -all: - -distclean: - -rm -f Makefile - -.PHONY: all distclean clean install check diff --git a/debian/additions/debian-start.inc.sh b/debian/additions/debian-start.inc.sh index dfb756225b0..005aa290866 100755 --- a/debian/additions/debian-start.inc.sh +++ b/debian/additions/debian-start.inc.sh @@ -5,7 +5,7 @@ ## Check MyISAM and Aria unclosed tables. # - Requires the server to be up. -# - Is supposed to run silently in background. +# - Is supposed to run silently in background. function check_for_crashed_tables() { set -e set -u @@ -25,7 +25,7 @@ function check_for_crashed_tables() { LC_ALL=C $MYSQL --skip-column-names --batch -e ' select concat('\''select count(*) into @discard from `'\'', - TABLE_SCHEMA, '\''`.`'\'', TABLE_NAME, '\''`'\'') + TABLE_SCHEMA, '\''`.`'\'', TABLE_NAME, '\''`'\'') from information_schema.TABLES where TABLE_SCHEMA<>'\''INFORMATION_SCHEMA'\'' and TABLE_SCHEMA<>'\''PERFORMANCE_SCHEMA'\'' and ( ENGINE='\''MyISAM'\'' or ENGINE='\''Aria'\'' )' | \ xargs -i $MYSQL --skip-column-names --silent --batch \ --force -e "{}" &>$tempfile @@ -39,8 +39,8 @@ function check_for_crashed_tables() { $MYADMIN processlist status ) >> $tempfile # Check for presence as a dependency on mailx would require an MTA. - if [ -x /usr/bin/mailx ]; then - mailx -e -s"$MYCHECK_SUBJECT" $MYCHECK_RCPT < $tempfile + if [ -x /usr/bin/mailx ]; then + mailx -e -s"$MYCHECK_SUBJECT" $MYCHECK_RCPT < $tempfile fi (echo "$MYCHECK_SUBJECT"; cat $tempfile) | logger -p daemon.warn -i -t$0 fi @@ -49,7 +49,7 @@ function check_for_crashed_tables() { ## Check for tables needing an upgrade. # - Requires the server to be up. -# - Is supposed to run silently in background. +# - Is supposed to run silently in background. function upgrade_system_tables_if_necessary() { set -e set -u @@ -69,7 +69,7 @@ function upgrade_system_tables_if_necessary() { function check_root_accounts() { set -e set -u - + logger -p daemon.info -i -t$0 "Checking for insecure root accounts." ret=$( echo "SELECT count(*) FROM mysql.user WHERE user='root' and password='' and plugin in ('', 'mysql_native_password', 'mysql_old_password');" | $MYSQL --skip-column-names ) diff --git a/debian/additions/enable_encryption.preset b/debian/additions/enable_encryption.preset deleted file mode 100644 index 287bc03413a..00000000000 --- a/debian/additions/enable_encryption.preset +++ /dev/null @@ -1,20 +0,0 @@ -# -# !include this file into your my.cnf (or any of *.cnf files in /etc/mysql/conf.d) -# and it will enable data at rest encryption. This is a simple way to -# ensure that everything that can be encrypted will be and your -# data will not leak unencrypted. -# -# DO NOT EDIT THIS FILE! On MariaDB upgrades it might be replaced with a -# newer version and your edits will be lost. Instead, add your edits -# to the .cnf file after the !include directive. -# -# NOTE that you also need to install an encryption plugin for the encryption -# to work. See https://mariadb.com/kb/en/mariadb/data-at-rest-encryption/#encryption-key-management -# -[mariadb] -aria-encrypt-tables -encrypt-binlog -encrypt-tmp-disk-tables -encrypt-tmp-files -loose-innodb-encrypt-log -loose-innodb-encrypt-tables diff --git a/debian/additions/innotop/innotop b/debian/additions/innotop/innotop index 941d3c901cb..19229a57a82 100644 --- a/debian/additions/innotop/innotop +++ b/debian/additions/innotop/innotop @@ -3,7 +3,7 @@ # vim: tw=160:nowrap:expandtab:tabstop=3:shiftwidth=3:softtabstop=3 # This program is copyright (c) 2006 Baron Schwartz, baron at xaprb dot com. -# Maintainers since 2013 : Kenny Gryp - Frédéric Descamps +# Maintainers since 2013 : Kenny Gryp - Frédéric Descamps # Feedback and improvements are gratefully received. # # THIS PROGRAM IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED @@ -640,7 +640,7 @@ sub parse_fk_section { } else { ( $ts, $type ) = $fulltext =~ m/^$s\s+(\w+)/m; $section->{'ts'} = [ parse_innodb_timestamp( $ts ) ]; - } + } $section->{'timestring'} = ts_to_string($section->{'ts'}); $section->{'type'} = $type; @@ -715,7 +715,7 @@ sub parse_fk_bad_constraint_error { @{$section}{ qw(reason) } = $fulltext =~ m/:\s*([^:]+)(?= Constraint:|$)/ms; $section->{'reason'} =~ s/\s+/ /g if $section->{'reason'}; - + # Certain data may not be present. Make them '' if not present. map { $section->{$_} ||= "" } qw(child_index fk_name col_name parent_table parent_col); @@ -1042,7 +1042,7 @@ sub parse_tx_text { if ( $txn =~ m/^TABLE LOCK|RECORD LOCKS/ ) { $locks = [parse_innodb_record_locks($txn, $complete, $debug, $full)]; } - + my ( $tables_in_use, $tables_locked ) = $txn =~ m/^mysql tables in use $d, locked $d$/m; @@ -1544,7 +1544,7 @@ innotop is a MySQL and InnoDB transaction/status monitor, like 'top' for MySQL. It displays queries, InnoDB transactions, lock waits, deadlocks, foreign key errors, open tables, replication status, buffer information, row operations, logs, I/O operations, load graph, and more. You can -monitor many servers at once with innotop. +monitor many servers at once with innotop. USAGE exit(1); @@ -4695,23 +4695,23 @@ sub main { if ( !$windows ) { delete $config{max_height}; } - + # Try to lower my priority. eval { setpriority(0, 0, getpriority(0, 0) + 10); }; - + # Print stuff to the screen immediately, don't wait for a newline. $OUTPUT_AUTOFLUSH = 1; - + # Clear the screen and load the configuration. $clear_screen_sub->(); load_config(); - + # Override config variables with command-line options my %cmdline = map { $_->{c} => $opts{$_->{k}} } grep { exists $_->{c} && exists $opts{$_->{k}} } @opt_spec; - + foreach my $name (keys %cmdline) { next if not defined $cmdline{$name}; my $val = $cmdline{$name}; @@ -4719,23 +4719,23 @@ sub main { $config{$name}->{val} = $val; } } - + post_process_tbl_meta(); - + # Make sure no changes are written to config file in non-interactive mode. if ( $opts{n} ) { $config{readonly}->{val} = 1; } - + eval { - + # Open the file for InnoDB status if ( @ARGV ) { my $filename = shift @ARGV; open $file, "<", $filename or die "Cannot open '$filename': $OS_ERROR"; } - + # In certain modes we might have to collect data for two cycles # before printing anything out, so we need to bump up the count one. if ( $opts{n} && $opts{count} && $config{status_inc}->{val} @@ -4743,16 +4743,16 @@ sub main { { $opts{count}++; } - + while (++$clock) { - + my $mode = $config{mode}->{val} || 'Q'; if ( !$modes{$mode} ) { die "Mode '$mode' doesn't exist; try one of these:\n" . join("\n", map { " $_ $modes{$_}->{hdr}" } sort keys %modes) . "\n"; } - + if ( !$opts{n} ) { @last_term_size = @this_term_size; @this_term_size = Term::ReadKey::GetTerminalSize(\*STDOUT); @@ -4763,13 +4763,13 @@ sub main { } die("Can't read terminal size") unless @this_term_size; } - + # If there's no connection to a database server, we need to fix that... if ( !%connections ) { print "You have not defined any database connections.\n\n"; add_new_dsn(); } - + # See whether there are any connections defined for this mode. If there's only one # connection total, assume the user wants to just use innotop for a single server # and don't ask which server to connect to. Also, if we're monitoring from a file, @@ -4782,20 +4782,20 @@ sub main { choose_connections(); } } - + # Term::ReadLine might have re-set $OUTPUT_AUTOFLUSH. $OUTPUT_AUTOFLUSH = 1; - + # Prune old data my $sets = $config{num_status_sets}->{val}; foreach my $store ( values %vars ) { delete @{$store}{ grep { $_ < $clock - $sets } keys %$store }; } %info_gotten = (); - + # Call the subroutine to display this mode. $modes{$mode}->{display_sub}->(); - + # It may be time to quit now. if ( $opts{count} && $clock >= $opts{count} ) { finish(); @@ -4805,7 +4805,7 @@ sub main { foreach my $cxn ( grep { $dbhs{$_}->{failed} } keys %dbhs ) { eval { connect_to_db($cxn); }; # Ignore errors entirely here. } - + # Wait for a bit. if ( $opts{n} ) { sleep($config{interval}->{val}); @@ -4815,10 +4815,10 @@ sub main { $char = ReadKey($config{interval}->{val}); ReadMode('normal'); } - + # Handle whatever action the key indicates. do_key_action(); - + } }; if ( $EVAL_ERROR ) { @@ -5620,7 +5620,7 @@ sub display_M { push @slave_io_status, extract_values($set, $set, $pre, 'slave_io_status'); } } - if ( $linecount < 1 ) { + if ( $linecount < 1 ) { $channel = 'no_channels'; my $chcxn = $channel . '=' . $cxn; get_slave_status($cxn,$channel); @@ -6546,7 +6546,7 @@ sub set_to_tbl { map { push @group_by, $_ if $_ !~ /^cxn$/ } @{$meta->{group_by}}; $meta->{group_by} = \@group_by; } - # if cxn is not visible and there is now more than one connection, + # if cxn is not visible and there is now more than one connection, # make cxn visible again. assume it's not in group_by if it's not # visible else { @@ -7187,7 +7187,7 @@ sub distill { } $query .= " " . $t; } - } + } # die $orig_query if $query eq 'LOCK lock'; return $query; @@ -7524,7 +7524,7 @@ sub do_stmt { # Test if the cxn should not even be tried return undef if $dbhs{$cxn} - && $dbhs{$cxn}->{failed} + && $dbhs{$cxn}->{failed} && ( !$dbhs{$cxn}->{dbh} || !$dbhs{$cxn}->{dbh}->{Active} || $dbhs{$cxn}->{mode} eq $config{mode}->{val} ); my $sth; @@ -7599,7 +7599,7 @@ sub do_query { # Test if the cxn should not even be tried return undef if $dbhs{$cxn} - && $dbhs{$cxn}->{failed} + && $dbhs{$cxn}->{failed} && ( !$dbhs{$cxn}->{dbh} || !$dbhs{$cxn}->{dbh}->{Active} || $dbhs{$cxn}->{mode} eq $config{mode}->{val} ); my $sth; @@ -7627,7 +7627,7 @@ sub do_query { } } } - + return $sth; } @@ -7892,17 +7892,17 @@ sub migrate_config { # load_config {{{3 sub load_config { - + my ($old_filename, $answer); if ( $opts{u} or $opts{p} or $opts{h} or $opts{P} or $opts{S} ) { my @params = $dsn_parser->get_cxn_params(\%opts); # dsn=$params[0] - add_new_dsn($opts{h} || 'localhost', $params[0], 'test.innotop_dl', + add_new_dsn($opts{h} || 'localhost', $params[0], 'test.innotop_dl', $opts{u} ? 1 : 0, $opts{u}, $opts{p} ? 1 : 0, $opts{p}); } if ($opts{c}) { $conf_file = $opts{c}; - } + } # If we don't have a new config file but we do have an old one, # innotop got upgraded and this is an old config file. Convert it, but # don't overwrite something existing. @@ -7930,14 +7930,14 @@ sub load_config { $conf_file = $default_central_conf; } else { - # If no config file was loaded, set readonly to 0 if the user wants to + # If no config file was loaded, set readonly to 0 if the user wants to # write a config $config{readonly}->{val} = 0 if $opts{w}; - # If no connections have been defined, connect to a MySQL database + # If no connections have been defined, connect to a MySQL database # on localhost using mariadb_read_default_group=client if (!%connections) { - add_new_dsn('localhost', - 'DBI:MariaDB:;host=localhost;mariadb_read_default_group=client', + add_new_dsn('localhost', + 'DBI:MariaDB:;host=localhost;mariadb_read_default_group=client', 'test.innotop_dl'); } } @@ -8476,7 +8476,7 @@ sub save_config { elsif ($conf_file and $opts{w}) { print "Loaded config file on start-up, so ignoring -w (see --help)\n" } - + my $dirname = dirname($conf_file); # if directories don't exist, create them. This could cause errors @@ -9819,7 +9819,7 @@ sub get_slave_status { } } else { my $dbh = connect_to_db($cxn); - my $sql = 'SHOW SLAVE STATUS FOR CHANNEL \'' . $channel . '\''; + my $sql = 'SHOW SLAVE STATUS FOR CHANNEL \'' . $channel . '\''; my $stmt = $dbh->prepare($sql ) ; $stmt->execute(); my $res = $stmt->fetchall_arrayref({}); @@ -9835,8 +9835,8 @@ sub get_slave_status { } } } - - + + sub is_func { @@ -9902,8 +9902,8 @@ host, use the -h option. After you've connected, innotop should show you something like the following: [RO] Query List (? for help) localhost, 01:11:19, 449.44 QPS, 14/7/163 con/run - - CXN When Load QPS Slow QCacheHit KCacheHit BpsIn BpsOut + + CXN When Load QPS Slow QCacheHit KCacheHit BpsIn BpsOut localhost Total 0.00 1.07k 697 0.00% 98.17% 476.83k 242.83k CXN Cmd ID User Host DB Time Query @@ -10070,7 +10070,7 @@ L<"cmd_summary"> table, which looks something like the following: Command Summary (? for help) localhost, 25+07:16:43, 2.45 QPS, 3 thd, 5.0.40 _____________________ Command Summary _____________________ - Name Value Pct Last Incr Pct + Name Value Pct Last Incr Pct Select_scan 3244858 69.89% 2 100.00% Select_range 1354177 29.17% 0 0.00% Select_full_join 39479 0.85% 0 0.00% @@ -11189,7 +11189,7 @@ L<"STATUS_VARIABLES">. =item slave_io_status -Displays data about the slave I/O thread. Data source: +Displays data about the slave I/O thread. Data source: L<"STATUS_VARIABLES">. =item slave_sql_status @@ -11438,8 +11438,8 @@ L<"processlist"> table when prompted). Your display might now look like the following: Query List (? for help) localhost, 32:33, 0.11 QPS, 1 thd, 5.0.38-log - - CXN Cmd Cnt ID User Host Time Query + + CXN Cmd Cnt ID User Host Time Query localhost Query 49 12933 webusr localhost 19:38 SELECT * FROM localhost Sending Da 23 2383 webusr localhost 12:43 SELECT col1, localhost Sleep 120 140 webusr localhost 5:18:12 @@ -11488,14 +11488,14 @@ matches the row; if it does, the row gets the specified color, and no further rules are evaluated. The rules look like the following: state eq Locked black on_red - cmd eq Sleep white - user eq system user white - cmd eq Connect white - cmd eq Binlog Dump white - time > 600 red - time > 120 yellow - time > 60 green - time > 30 cyan + cmd eq Sleep white + user eq system user white + cmd eq Connect white + cmd eq Binlog Dump white + time > 600 red + time > 120 yellow + time > 60 green + time > 30 cyan This is the default rule set for the L<"processlist"> table. In order of priority, these rules make locked queries black on a red background, "gray out" @@ -11639,9 +11639,9 @@ screen, it will prompt you to choose one of them. Once you do, innotop will show you something like this: Editing table definition for Buffer Pool. Press ? for help, q to quit. - - name hdr label src - cxn CXN Connection from which cxn + + name hdr label src + cxn CXN Connection from which cxn buf_pool_size Size Buffer pool size IB_bp_buf_poo buf_free Free Bufs Buffers free in the b IB_bp_buf_fre pages_total Pages Pages total IB_bp_pages_t @@ -11931,15 +11931,15 @@ whitespace). use strict; use warnings FATAL => 'all'; - + package Innotop::Plugin::Example; # description: Adds an 'example' column to every table - + sub new { my ( $class, %vars ) = @_; # Store reference to innotop's variables in $self my $self = bless { %vars }, $class; - + # Design the example column my $col = { hdr => 'Example', @@ -11951,7 +11951,7 @@ whitespace). tbl => '', trans => [], }; - + # Add the column to every table. my $tbl_meta = $vars{tbl_meta}; foreach my $tbl ( values %$tbl_meta ) { @@ -11960,17 +11960,17 @@ whitespace). # Add the column to the list of visible columns unshift @{$tbl->{visible}}, 'example'; } - + # Be sure to return a reference to the object. return $self; } - + # I'd like to be called when a data set is being rendered into a table, please. sub register_for_events { my ( $self ) = @_; return qw(set_to_tbl_pre_filter); } - + # This method will be called when the event fires. sub set_to_tbl_pre_filter { my ( $self, $rows, $tbl ) = @_; @@ -11979,7 +11979,7 @@ whitespace). $row->{example} = 1; } } - + 1; =head2 Plugin Editor @@ -12181,7 +12181,7 @@ Allen K. Smith, Aurimas Mikalauskas, Bartosz Fenski, Brian Miezejewski, -Christian Hammers, +Christian Hammers, Cyril Scetbon, Dane Miller, David Multer, diff --git a/debian/additions/innotop/innotop.1 b/debian/additions/innotop/innotop.1 index fefea717cd6..65da5dc0dfb 100644 --- a/debian/additions/innotop/innotop.1 +++ b/debian/additions/innotop/innotop.1 @@ -193,8 +193,8 @@ After you've connected, innotop should show you something like the following: .PP .Vb 1 \& [RO] Query List (? for help) localhost, 01:11:19, 449.44 QPS, 14/7/163 con/run -\& -\& CXN When Load QPS Slow QCacheHit KCacheHit BpsIn BpsOut +\& +\& CXN When Load QPS Slow QCacheHit KCacheHit BpsIn BpsOut \& localhost Total 0.00 1.07k 697 0.00% 98.17% 476.83k 242.83k \& \& CXN Cmd ID User Host DB Time Query @@ -324,7 +324,7 @@ This mode is similar to mytop's Command Summary mode. It shows the .Vb 8 \& Command Summary (? for help) localhost, 25+07:16:43, 2.45 QPS, 3 thd, 5.0.40 \& _\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_ Command Summary _\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_\|_ -\& Name Value Pct Last Incr Pct +\& Name Value Pct Last Incr Pct \& Select_scan 3244858 69.89% 2 100.00% \& Select_range 1354177 29.17% 0 0.00% \& Select_full_join 39479 0.85% 0 0.00% @@ -1261,7 +1261,7 @@ Displays data about InnoDB's semaphores and mutexes. Data source: \&\*(L"\s-1STATUS_VARIABLES\*(R"\s0. .IP "slave_io_status" 4 .IX Item "slave_io_status" -Displays data about the slave I/O thread. Data source: +Displays data about the slave I/O thread. Data source: \&\*(L"\s-1STATUS_VARIABLES\*(R"\s0. .IP "slave_sql_status" 4 .IX Item "slave_sql_status" @@ -1472,8 +1472,8 @@ Your display might now look like the following: .PP .Vb 1 \& Query List (? for help) localhost, 32:33, 0.11 QPS, 1 thd, 5.0.38\-log -\& -\& CXN Cmd Cnt ID User Host Time Query +\& +\& CXN Cmd Cnt ID User Host Time Query \& localhost Query 49 12933 webusr localhost 19:38 SELECT * FROM \& localhost Sending Da 23 2383 webusr localhost 12:43 SELECT col1, \& localhost Sleep 120 140 webusr localhost 5:18:12 @@ -1526,13 +1526,13 @@ rules are evaluated. The rules look like the following: .PP .Vb 9 \& state eq Locked black on_red -\& cmd eq Sleep white -\& user eq system user white -\& cmd eq Connect white -\& cmd eq Binlog Dump white -\& time > 600 red -\& time > 120 yellow -\& time > 60 green +\& cmd eq Sleep white +\& user eq system user white +\& cmd eq Connect white +\& cmd eq Binlog Dump white +\& time > 600 red +\& time > 120 yellow +\& time > 60 green \& time > 30 cyan .Ve .PP @@ -1669,9 +1669,9 @@ show you something like this: .PP .Vb 1 \& Editing table definition for Buffer Pool. Press ? for help, q to quit. -\& -\& name hdr label src -\& cxn CXN Connection from which cxn +\& +\& name hdr label src +\& cxn CXN Connection from which cxn \& buf_pool_size Size Buffer pool size IB_bp_buf_poo \& buf_free Free Bufs Buffers free in the b IB_bp_buf_fre \& pages_total Pages Pages total IB_bp_pages_t @@ -1924,15 +1924,15 @@ whitespace). .Vb 2 \& use strict; \& use warnings FATAL => \*(Aqall\*(Aq; -\& +\& \& package Innotop::Plugin::Example; \& # description: Adds an \*(Aqexample\*(Aq column to every table -\& +\& \& sub new { \& my ( $class, %vars ) = @_; \& # Store reference to innotop\*(Aqs variables in $self \& my $self = bless { %vars }, $class; -\& +\& \& # Design the example column \& my $col = { \& hdr => \*(AqExample\*(Aq, @@ -1944,7 +1944,7 @@ whitespace). \& tbl => \*(Aq\*(Aq, \& trans => [], \& }; -\& +\& \& # Add the column to every table. \& my $tbl_meta = $vars{tbl_meta}; \& foreach my $tbl ( values %$tbl_meta ) { @@ -1953,17 +1953,17 @@ whitespace). \& # Add the column to the list of visible columns \& unshift @{$tbl\->{visible}}, \*(Aqexample\*(Aq; \& } -\& +\& \& # Be sure to return a reference to the object. \& return $self; \& } -\& +\& \& # I\*(Aqd like to be called when a data set is being rendered into a table, please. \& sub register_for_events { \& my ( $self ) = @_; \& return qw(set_to_tbl_pre_filter); \& } -\& +\& \& # This method will be called when the event fires. \& sub set_to_tbl_pre_filter { \& my ( $self, $rows, $tbl ) = @_; @@ -1972,7 +1972,7 @@ whitespace). \& $row\->{example} = 1; \& } \& } -\& +\& \& 1; .Ve .SS "Plugin Editor" @@ -2137,7 +2137,7 @@ Allen K. Smith, Aurimas Mikalauskas, Bartosz Fenski, Brian Miezejewski, -Christian Hammers, +Christian Hammers, Cyril Scetbon, Dane Miller, David Multer, diff --git a/debian/additions/mariadb.cnf b/debian/additions/mariadb.cnf index 8b283e21d3f..d40cdfe33d7 100644 --- a/debian/additions/mariadb.cnf +++ b/debian/additions/mariadb.cnf @@ -1,6 +1,7 @@ # The MariaDB configuration file # # The MariaDB/MySQL tools read configuration files in the following order: +# 0. "/etc/mysql/my.cnf" symlinks to this file, reason why all the rest is read. # 1. "/etc/mysql/mariadb.cnf" (this file) to set global defaults, # 2. "/etc/mysql/conf.d/*.cnf" to set global options. # 3. "/etc/mysql/mariadb.conf.d/*.cnf" to set MariaDB-only options. @@ -17,9 +18,9 @@ # use it for options that affect everything # [client-server] - -socket = /run/mysqld/mysqld.sock -#port = 3306 +# Port or socket location where to connect +# port = 3306 +socket = /run/mysqld/mysqld.sock # Import all .cnf files from configuration directory !includedir /etc/mysql/conf.d/ diff --git a/debian/additions/mariadb.conf.d/50-client.cnf b/debian/additions/mariadb.conf.d/50-client.cnf index 4b9bcf78089..fe8f2f3b788 100644 --- a/debian/additions/mariadb.conf.d/50-client.cnf +++ b/debian/additions/mariadb.conf.d/50-client.cnf @@ -4,9 +4,6 @@ # [client] -# Default is Latin1, if you need UTF-8 set this (also in server section) -# default-character-set = utf8mb4 - # Example of client certificate usage # ssl-cert=/etc/mysql/client-cert.pem # ssl-key=/etc/mysql/client-key.pem diff --git a/debian/additions/mariadb.conf.d/99-enable-encryption.cnf.preset b/debian/additions/mariadb.conf.d/99-enable-encryption.cnf.preset new file mode 120000 index 00000000000..53e8f5c645c --- /dev/null +++ b/debian/additions/mariadb.conf.d/99-enable-encryption.cnf.preset @@ -0,0 +1 @@ +../../../support-files/rpm/enable_encryption.preset \ No newline at end of file diff --git a/debian/control b/debian/control index 75a50a9b133..0644cd20d09 100644 --- a/debian/control +++ b/debian/control @@ -637,8 +637,10 @@ Depends: libcurl4, mariadb-server-10.5 (= ${binary:Version}), ${misc:Depends}, ${shlibs:Depends} -Description: S3 storage engine for MariaDB - Read only table stored in S3. +Description: Amazon S3 archival storage engine for MariaDB + The S3 storage engine allows one to archive MariaDB tables in Amazon S3 (or any + third-party public or private cloud that implements S3 API), but still have + them accessible in MariaDB in read-only mode. Package: mariadb-plugin-rocksdb Architecture: amd64 arm64 mips64el ppc64el diff --git a/debian/salsa-ci.yml b/debian/salsa-ci.yml index bd49f864562..1c10d984942 100644 --- a/debian/salsa-ci.yml +++ b/debian/salsa-ci.yml @@ -73,7 +73,6 @@ autopkgtest: piuparts: extends: .test-piuparts stage: test extras - allow_failure: true blhc: extends: .test-blhc @@ -84,11 +83,9 @@ blhc: lintian: extends: .test-lintian - allow_failure: true missing-breaks: extends: .test-missing-breaks - allow_failure: true # In addition to Salsa-CI, also run these fully MariaDB specific build jobs @@ -124,7 +121,6 @@ fresh install: except: variables: - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/ - allow_failure: true mariadb-10.3.x to mariadb-10.5.y upgrade: stage: upgrade in Sid @@ -165,7 +161,6 @@ mariadb-10.3.x to mariadb-10.5.y upgrade: except: variables: - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/ - allow_failure: true mariadb-10.3.x buster to mariadb-10.5 upgrade: stage: upgrade from Buster/Stretch/Jessie @@ -210,7 +205,6 @@ mariadb-10.3.x buster to mariadb-10.5 upgrade: except: variables: - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/ - allow_failure: true mariadb-10.1 to mariadb-10.5 upgrade: stage: upgrade from Buster/Stretch/Jessie @@ -255,7 +249,6 @@ mariadb-10.1 to mariadb-10.5 upgrade: except: variables: - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/ - allow_failure: true test basic features: stage: test @@ -311,7 +304,6 @@ test basic features: except: variables: - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/ - allow_failure: true # Build a piece of software that was designed for libmysqlclient-dev but using the # libmariadb-dev-compat layer. Should always end up using libmariadb.so.3 run-time. @@ -335,7 +327,6 @@ build mariadbclient consumer Python-MySQLdb: except: variables: - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/ - allow_failure: true libmysql* to libmariadb* upgrade: stage: test extras @@ -375,7 +366,6 @@ libmysql* to libmariadb* upgrade: except: variables: - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/ - allow_failure: true default-libmysqlclient-dev upgrade: stage: upgrade in Sid @@ -402,7 +392,6 @@ default-libmysqlclient-dev upgrade: except: variables: - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/ - allow_failure: true default-libmysqlclient-dev on buster upgrade: stage: upgrade from Buster/Stretch/Jessie @@ -431,7 +420,6 @@ default-libmysqlclient-dev on buster upgrade: except: variables: - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/ - allow_failure: true default-libmysqlclient-dev on stretch upgrade: stage: upgrade from Buster/Stretch/Jessie @@ -460,7 +448,6 @@ default-libmysqlclient-dev on stretch upgrade: except: variables: - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/ - allow_failure: true mariadb-connector-c on stretch upgrade: stage: upgrade from Buster/Stretch/Jessie @@ -489,7 +476,6 @@ mariadb-connector-c on stretch upgrade: except: variables: - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/ - allow_failure: true mysql-5.5 to mariadb-10.5 upgrade: stage: upgrade from Buster/Stretch/Jessie @@ -534,7 +520,6 @@ mysql-5.5 to mariadb-10.5 upgrade: except: variables: - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/ - allow_failure: true # Upgrading from MySQL 5.7 involves automatic renaming of auth_socket plugin # to unix_socket and automaticly re-adding Password column in user table. @@ -581,7 +566,6 @@ mysql-5.7 to mariadb-10.5 upgrade: except: variables: - $CI_COMMIT_TAG != null && $SALSA_CI_ENABLE_PIPELINE_ON_TAGS !~ /^(1|yes|true)$/ - allow_failure: true # Upgrading from MySQL 8.0 with datadir in place is not possible. Users need to do a data dump. # The Debian maintainer scripts detect this situation and simply moves old datadir aside and start fresh. @@ -648,17 +632,14 @@ mariadb.org-10.5.x to mariadb-10.5 upgrade: - sed -i "s/101/0/g" -i /usr/sbin/policy-rc.d # Enable automatic restarts from maint scripts - cd ${WORKING_DIR} # Don't repeat this step, it's just cd ./debian/output - apt-get update - - apt install -y curl systemctl # systemctl shim needed on platforms that don't have systemd + - apt install -y curl - curl -sS https://mariadb.org/mariadb_release_signing_key.asc -o /etc/apt/trusted.gpg.d/mariadb.asc - echo 'deb [arch=amd64,i386] http://mirror.one.com/mariadb/repo/10.5/debian sid main' > /etc/apt/sources.list.d/mariadb.list - apt-get update - apt-get install -y mariadb-server-10.5 # Verify installation of MySQL from Sid - dpkg -l | grep -iE 'maria|mysql|galera' || true # List installed - # MariaDB.org version of 10.4 and early 10.5 do not install an init file, so - # it must be installed here manually - - cp /usr/share/mysql/mysql.init /etc/init.d/mysql; chmod +x /etc/init.d/mysql; service mysql start; sleep 5 - - service mysql status + - service mariadb status - mysql --skip-column-names -e "SELECT @@version, @@version_comment" - mysql -e "SELECT Host,User,plugin,authentication_string FROM user;" mysql - mysql -e "SELECT * FROM plugin;" mysql @@ -668,7 +649,6 @@ mariadb.org-10.5.x to mariadb-10.5 upgrade: # Verify installation of MariaDB built in this commit - dpkg -l | grep -iE 'maria|mysql|galera' || true # List installed - mariadb --version # Client version - - service mysql status - service mariadb status - mkdir -p debug # Ensure dir exists before using it - find /var/lib/mysql -ls > debug/var-lib-mysql.list || true # Ignore errors about "no such file or directory" diff --git a/debian/source/lintian-overrides b/debian/source/lintian-overrides index a6c3a616ed8..3ce34a6d83a 100644 --- a/debian/source/lintian-overrides +++ b/debian/source/lintian-overrides @@ -1,5 +1,3 @@ -# Upstream fix pending: https://github.com/wolfSSL/wolfssl/pull/2785 -source-is-missing extra/wolfssl/wolfssl/doc/formats/html/html_changes/menu.js line length is 679 characters (>512) # Necessary for drop-in-place-replacement upgrades on mysql-server/-client # since package breaks/replaces these but at the same time also provides them version-substvar-for-external-package mariadb-client-core-10.5 -> mysql-client-5.5 From bdf8268307de96a2856bf4ef4bf55957b1d14efe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Sat, 11 Jul 2020 12:19:00 +0300 Subject: [PATCH 157/188] Deb: Simplify and unify autobake-deb.sh - Remove excess build flag from debian/rules that does nothing, introduced wrongly in commit 7cbde2d0a29e214afba4d5d30af890002fbf7db2. Instead implement the embedded server build skipping on Travis-CI correctly. - Simplify structure by doing all Travis-CI slimdown in one step. - Remove unnecessary -e from sed, as it does nothing. When regex is needed, use -r. Move -i to last so it is close to the file name it has an argument. - Remove backwards compat checks that are no longer relevant as neither Debian Jessie (was before Stretch) nor Ubuntu Trusty (before Xenial) are supported nor built for anymore. For example the GCC 4.8 check if not relevant anymore, since Debian Jessie already has 4.9 and Ubuntu Xenial has 5.3 and there is no GCC < 4.8 around anymore. - Skip building ColumnStore on both Travis-CI and Gitlab-CI as it is way too slow (time) and big (disk space) to pass. --- debian/autobake-deb.sh | 78 +++++++++++++----------------------------- 1 file changed, 24 insertions(+), 54 deletions(-) diff --git a/debian/autobake-deb.sh b/debian/autobake-deb.sh index 5e20df3a96b..928c67717c0 100755 --- a/debian/autobake-deb.sh +++ b/debian/autobake-deb.sh @@ -2,6 +2,11 @@ # # Build MariaDB .deb packages for test and release at mariadb.org # +# Purpose of this script: +# Always keep the actual packaging as up-to-date as possible following the latest +# 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 or +# specfic build environments. # Exit immediately on any error set -e @@ -17,21 +22,32 @@ if [[ $TRAVIS ]] || [[ $GITLAB_CI ]] then # On both Travis and Gitlab the output log must stay under 4MB so make the # build less verbose - sed -i -e '/Add support for verbose builds/,/^$/d' debian/rules + sed '/Add support for verbose builds/,/^$/d' -i debian/rules + + # MCOL-4149: ColumnStore builds are so slow and big that they must be skipped on + # both Travis-CI and Gitlab-CI + sed 's|-DPLUGIN_COLUMNSTORE=YES|-DPLUGIN_COLUMNSTORE=NO|' -i debian/rules + sed "/Package: mariadb-plugin-columnstore/,/^$/d" -i debian/control fi -# Travis-CI optimizations to keep build small (in both duration and disk space) +# Don't build or try to put files in a package for selected plugins and compontents on Travis-CI +# in order to keep build small (in both duration and disk space) if [[ $TRAVIS ]] then - # Don't include test suite package on Travis-CI to make the build time shorter + # Test suite package not relevant on Travis-CI + sed 's|DINSTALL_MYSQLTESTDIR=share/mysql/mysql-test|DINSTALL_MYSQLTESTDIR=false|' -i debian/rules sed '/Package: mariadb-test-data/,/^$/d' -i debian/control sed '/Package: mariadb-test$/,/^$/d' -i debian/control - # Don't build the test package at all to save time and disk space - sed 's|DINSTALL_MYSQLTESTDIR=share/mysql/mysql-test|DINSTALL_MYSQLTESTDIR=false|' -i debian/rules - - # Also skip building RocksDB, Mroonga etc to save even more time and disk space - sed 's|-DDEB|-DPLUGIN_MROONGA=NO -DPLUGIN_ROCKSDB=NO -DPLUGIN_SPIDER=NO -DPLUGIN_OQGRAPH=NO -DPLUGIN_PERFSCHEMA=NO -DPLUGIN_SPHINX=NO -DDEB|' -i debian/rules + # Extra plugins such as Mroonga, Spider, OQgraph, Sphinx and the embedded build can safely be skipped + sed 's|-DDEB|-DPLUGIN_MROONGA=NO -DPLUGIN_ROCKSDB=NO -DPLUGIN_SPIDER=NO -DPLUGIN_OQGRAPH=NO -DPLUGIN_PERFSCHEMA=NO -DPLUGIN_SPHINX=NO -DWITH_EMBEDDED_SERVER=OFF -DDEB|' -i debian/rules + sed "/Package: mariadb-plugin-mroonga/,/^$/d" -i debian/control + sed "/Package: mariadb-plugin-rocksdb/,/^$/d" -i debian/control + sed "/Package: mariadb-plugin-spider/,/^$/d" -i debian/control + sed "/Package: mariadb-plugin-oqgraph/,/^$/d" -i debian/control + sed "/ha_sphinx.so/d" -i debian/mariadb-server-10.5.install + sed "/Package: libmariadbd19/,/^$/d" -i debian/control + sed "/Package: libmariadbd-dev/,/^$/d" -i debian/control fi # Convert gcc version to numberical value. Format is Mmmpp where M is Major @@ -41,19 +57,6 @@ GCCVERSION=$(gcc -dumpfullversion -dumpversion | sed -e 's/\.\([0-9][0-9]\)/\1/g -e 's/\.\([0-9]\)/0\1/g' \ -e 's/^[0-9]\{3,4\}$/&00/') -# Look up distro-version specific stuff -# -# Always keep the actual packaging as up-to-date as possible following the latest -# 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. - -# 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 - # If rocksdb-tools is not available (before Debian Buster and Ubuntu Disco) # remove the dependency from the RocksDB plugin so it can install properly # and instead ship the one built from MariaDB sources @@ -70,39 +73,6 @@ then sed 's/libcurl4/libcurl3/g' -i debian/control fi -# Don't build rocksdb package if gcc version is less than 4.8 or we are running on -# x86 32 bit. -if [[ $GCCVERSION -lt 40800 ]] || [[ $(arch) =~ i[346]86 ]] || [[ $TRAVIS ]] -then - sed '/Package: mariadb-plugin-rocksdb/,/^$/d' -i debian/control -fi - -# If libpcre2-dev is not available (before Debian Stretch and Ubuntu Xenial) -# attempt to build using older libpcre3-dev (SIC!) -if ! apt-cache madison libpcre2-dev | grep --quiet 'libpcre2-dev' -then - sed 's/libcurl4-openssl-dev | libcurl4-dev/libpcre3-dev/' -i debian/control -fi - -# Mroonga, Spider etc never built on Travis CI anyway, see build flags above -if [[ $TRAVIS ]] -then - sed -i -e "/Package: mariadb-plugin-mroonga/,/^$/d" debian/control - sed -i -e "/Package: mariadb-plugin-spider/,/^$/d" debian/control - sed -i -e "/Package: mariadb-plugin-oqgraph/,/^$/d" debian/control - sed -i -e "/usr\/lib\/mysql\/plugin\/ha_sphinx.so/d" debian/mariadb-server-10.5.install - sed -i -e "/Package: libmariadbd-dev/,/^$/d" debian/control -fi - -# Don't build nor package ColumnStore on Travis-CI -if [[ $TRAVIS ]] -then - sed "/Package: mariadb-plugin-columnstore/,/^$/d" -i debian/control - sed '/flex/d' -i debian/control - sed -r '/libboost-[a-z-]+-dev/d' -i debian/control - sed 's|-DPLUGIN_COLUMNSTORE=YES|-DPLUGIN_COLUMNSTORE=NO|' -i debian/rules -fi - # Adjust changelog, add new version echo "Incrementing changelog and starting build scripts" From 497e7eda8cf398b5d30b6a05e0621b93c01ad657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Sun, 28 Jun 2020 15:35:30 +0300 Subject: [PATCH 158/188] Deb: Stop suggesting tinyca, upstream project does not exist anymore TinyCA has not been updated since 2016 and was removed from Debian in 2019 and the dev site https://tinyca.alioth.debian.org/ is offline. See https://tracker.debian.org/pkg/tinyca --- debian/control | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/debian/control b/debian/control index 0644cd20d09..0724ef6fa6a 100644 --- a/debian/control +++ b/debian/control @@ -486,8 +486,7 @@ Package: mariadb-server-10.5 Architecture: any Suggests: mailx, mariadb-test, - netcat-openbsd, - tinyca + netcat-openbsd Recommends: libhtml-template-perl Pre-Depends: adduser (>= 3.40), debconf, From a10f72aa5e9f4e6201f19e2d275ce098d5165d0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Sun, 28 Jun 2020 17:35:02 +0300 Subject: [PATCH 159/188] Deb: Proper DH_ and DEB_ flag use in debian/rules - DEB_BUILD_HARDENING is only used with hardening-wrapper which is deprecated in Debian, so remove it - The word 'terse' should be checked in DEB_BUILD_OPTIONS and verbosity controlled by it --- debian/rules | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/debian/rules b/debian/rules index 59f4c571679..b3ef1bab11a 100755 --- a/debian/rules +++ b/debian/rules @@ -1,12 +1,10 @@ #!/usr/bin/make -f -export DH_VERBOSE=1 -export DEB_BUILD_HARDENING=1 - -# enable Debian Hardening -# see: https://wiki.debian.org/Hardening +# Enable Debian Hardening +# https://wiki.debian.org/Hardening export DEB_BUILD_MAINT_OPTIONS = hardening=+all DPKG_EXPORT_BUILDFLAGS = 1 +# Include all defaults, including buildflags.mk include /usr/share/dpkg/default.mk # CPPFLAGS are nor read by CMake, so copy them to CXXFLAGS # See why at https://cmake.org/Bug/view.php?id=12928 @@ -22,6 +20,12 @@ TMP:=$(CURDIR)/debian/tmp CC := $(DEB_HOST_GNU_TYPE)-gcc CXX := $(DEB_HOST_GNU_TYPE)-g++ +# According to Debian Policy version 4.2.0 builds should be as verbose as +# possible unless 'terse' is specifically passed. +ifeq (,$(filter terse,$(DEB_BUILD_OPTIONS))) + export DH_VERBOSE=1 +endif + # Parallel build support as advised # at https://www.debian.org/doc/debian-policy/ch-source.html#s-debianrules-options ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS))) From f99de8915e8f9109384d1f197ca69c747487cb48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Sat, 4 Jul 2020 13:45:56 +0300 Subject: [PATCH 160/188] Deb: Make RocksDB plugin depend on python3 as myrocks_hotbackup needs it This fixes the Lintian error and thus the Lintian override can also be removed. --- debian/control | 1 + debian/mariadb-plugin-rocksdb.lintian-overrides | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) delete mode 100644 debian/mariadb-plugin-rocksdb.lintian-overrides diff --git a/debian/control b/debian/control index 0724ef6fa6a..b4797c59f29 100644 --- a/debian/control +++ b/debian/control @@ -644,6 +644,7 @@ Description: Amazon S3 archival storage engine for MariaDB Package: mariadb-plugin-rocksdb Architecture: amd64 arm64 mips64el ppc64el Depends: mariadb-server-10.5 (= ${binary:Version}), + python3, rocksdb-tools, ${misc:Depends}, ${shlibs:Depends} diff --git a/debian/mariadb-plugin-rocksdb.lintian-overrides b/debian/mariadb-plugin-rocksdb.lintian-overrides deleted file mode 100644 index bc2ec13dbf9..00000000000 --- a/debian/mariadb-plugin-rocksdb.lintian-overrides +++ /dev/null @@ -1,2 +0,0 @@ -# Overridden temporarily to get Salsa-CI pass and not stall other dev work with broken pipeline -python-script-but-no-python-dep usr/bin/myrocks_hotbackup #!python From 6d3186e326b20a2d8d01c8d071677aaba16350d2 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Wed, 29 Jul 2020 22:29:43 +0400 Subject: [PATCH 161/188] MDEV-23323 Rounding functions return a wrong data type for a BIT, ENUM, SET argument Implementing dedicated fixing methods: - Type_handler_bit::Item_func_round_fix_length_and_dec() - Type_handler_bit::Item_func_int_val_fix_length_and_dec() - Type_handler_typelib::Item_func_round_fix_length_and_dec() because the inherited methods did not work well. Fixing: - Type_handler_typelib::Item_func_int_val_fix_length_and_dec It did not work well, because it used args[0]->max_length to calculate the result data type. In case of ENUM and SET it was not correct, because in FLOOR() and CEILING() context ENUM and SET return not more than 5 digits (65535 is the biggest possible value). Misc: - Changing the API of Type_handler_bit::Bit_decimal_notation_int_digits(const Item *item) to a more generic form: Type_handler_bit::Bit_decimal_notation_int_digits_by_nbits(uint nbits) - Fixing Type_handler_bit::Bit_decimal_notation_int_digits_by_nbits() to return the exact number of decimal digits for all nbits 1..64. The old implementation was approximate. This change gives better (more precise) data types. --- mysql-test/main/func_math.result | 106 ++-- mysql-test/main/type_bit.result | 983 +++++++++++++++++++++++++++++++ mysql-test/main/type_bit.test | 29 + mysql-test/main/type_enum.result | 21 + mysql-test/main/type_enum.test | 13 + mysql-test/main/type_set.result | 21 + mysql-test/main/type_set.test | 13 + sql/item_func.cc | 8 +- sql/item_func.h | 29 +- sql/sql_type.cc | 58 +- sql/sql_type.h | 5 +- 11 files changed, 1217 insertions(+), 69 deletions(-) diff --git a/mysql-test/main/func_math.result b/mysql-test/main/func_math.result index db5d195f405..68922b09bf7 100644 --- a/mysql-test/main/func_math.result +++ b/mysql-test/main/func_math.result @@ -2619,7 +2619,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(3) DEFAULT NULL + `c1` varchar(2) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(4)); @@ -2664,7 +2664,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(5) DEFAULT NULL + `c1` varchar(3) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(7)); @@ -2709,7 +2709,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(6) DEFAULT NULL + `c1` varchar(5) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(10)); @@ -2754,7 +2754,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(7) DEFAULT NULL + `c1` varchar(6) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(13)); @@ -2769,7 +2769,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(7) DEFAULT NULL + `c1` varchar(6) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(14)); @@ -2799,7 +2799,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(9) DEFAULT NULL + `c1` varchar(7) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(16)); @@ -2814,7 +2814,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(9) DEFAULT NULL + `c1` varchar(7) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(17)); @@ -2844,7 +2844,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(10) DEFAULT NULL + `c1` varchar(9) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(19)); @@ -2859,7 +2859,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(10) DEFAULT NULL + `c1` varchar(9) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(20)); @@ -2889,7 +2889,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(11) DEFAULT NULL + `c1` varchar(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(22)); @@ -2904,7 +2904,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(11) DEFAULT NULL + `c1` varchar(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(23)); @@ -2919,7 +2919,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(11) DEFAULT NULL + `c1` varchar(10) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(24)); @@ -2934,7 +2934,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(13) DEFAULT NULL + `c1` varchar(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(25)); @@ -2949,7 +2949,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(13) DEFAULT NULL + `c1` varchar(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(26)); @@ -2964,7 +2964,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(13) DEFAULT NULL + `c1` varchar(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(27)); @@ -2979,7 +2979,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(14) DEFAULT NULL + `c1` varchar(13) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(28)); @@ -2994,7 +2994,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(14) DEFAULT NULL + `c1` varchar(13) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(29)); @@ -3009,7 +3009,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(14) DEFAULT NULL + `c1` varchar(13) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(30)); @@ -3024,7 +3024,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(15) DEFAULT NULL + `c1` varchar(14) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(31)); @@ -3039,7 +3039,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(15) DEFAULT NULL + `c1` varchar(14) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(32)); @@ -3054,7 +3054,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(15) DEFAULT NULL + `c1` varchar(14) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(33)); @@ -3069,7 +3069,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(17) DEFAULT NULL + `c1` varchar(14) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(34)); @@ -3084,7 +3084,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(17) DEFAULT NULL + `c1` varchar(15) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(35)); @@ -3099,7 +3099,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(17) DEFAULT NULL + `c1` varchar(15) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(36)); @@ -3114,7 +3114,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(18) DEFAULT NULL + `c1` varchar(15) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(37)); @@ -3129,7 +3129,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(18) DEFAULT NULL + `c1` varchar(17) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(38)); @@ -3144,7 +3144,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(18) DEFAULT NULL + `c1` varchar(17) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(39)); @@ -3159,7 +3159,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(19) DEFAULT NULL + `c1` varchar(17) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(40)); @@ -3174,7 +3174,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(19) DEFAULT NULL + `c1` varchar(18) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(41)); @@ -3189,7 +3189,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(19) DEFAULT NULL + `c1` varchar(18) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(42)); @@ -3204,7 +3204,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(21) DEFAULT NULL + `c1` varchar(18) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(43)); @@ -3219,7 +3219,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(21) DEFAULT NULL + `c1` varchar(18) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(44)); @@ -3234,7 +3234,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(21) DEFAULT NULL + `c1` varchar(19) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(45)); @@ -3249,7 +3249,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(22) DEFAULT NULL + `c1` varchar(19) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(46)); @@ -3264,7 +3264,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(22) DEFAULT NULL + `c1` varchar(19) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(47)); @@ -3279,7 +3279,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(22) DEFAULT NULL + `c1` varchar(21) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(48)); @@ -3294,7 +3294,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(23) DEFAULT NULL + `c1` varchar(21) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(49)); @@ -3309,7 +3309,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(23) DEFAULT NULL + `c1` varchar(21) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(50)); @@ -3324,7 +3324,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(23) DEFAULT NULL + `c1` varchar(22) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(51)); @@ -3339,7 +3339,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(25) DEFAULT NULL + `c1` varchar(22) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(52)); @@ -3354,7 +3354,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(25) DEFAULT NULL + `c1` varchar(22) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(53)); @@ -3369,7 +3369,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(25) DEFAULT NULL + `c1` varchar(22) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(54)); @@ -3384,7 +3384,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(26) DEFAULT NULL + `c1` varchar(23) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(55)); @@ -3399,7 +3399,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(26) DEFAULT NULL + `c1` varchar(23) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(56)); @@ -3414,7 +3414,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(26) DEFAULT NULL + `c1` varchar(23) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(57)); @@ -3429,7 +3429,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(27) DEFAULT NULL + `c1` varchar(25) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(58)); @@ -3444,7 +3444,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(27) DEFAULT NULL + `c1` varchar(25) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(59)); @@ -3459,7 +3459,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(27) DEFAULT NULL + `c1` varchar(25) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(60)); @@ -3474,7 +3474,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(29) DEFAULT NULL + `c1` varchar(26) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(61)); @@ -3489,7 +3489,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(29) DEFAULT NULL + `c1` varchar(26) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(62)); @@ -3504,7 +3504,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(29) DEFAULT NULL + `c1` varchar(26) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(63)); @@ -3519,7 +3519,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(30) DEFAULT NULL + `c1` varchar(26) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (c1 BIT(64)); @@ -3534,7 +3534,7 @@ HEX(c1) SHOW CREATE TABLE t2; Table Create Table t2 CREATE TABLE `t2` ( - `c1` varchar(30) DEFAULT NULL + `c1` varchar(27) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP TABLE t1,t2; CREATE OR REPLACE TABLE t1 (f float); diff --git a/mysql-test/main/type_bit.result b/mysql-test/main/type_bit.result index 2964f400f10..4e9d698b0c2 100644 --- a/mysql-test/main/type_bit.result +++ b/mysql-test/main/type_bit.result @@ -876,5 +876,988 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables DROP TABLE t1; # +# MDEV-23323 Rounding functions return a wrong data type for a BIT, ENUM, SET argument +# +BEGIN NOT ATOMIC +FOR i IN 1..64 +DO +SELECT '-----', CONCAT('BIT(',i,')') AS Type; +EXECUTE IMMEDIATE REPLACE('CREATE TABLE t1 (a BIT(64))','64', i); +INSERT IGNORE INTO t1 VALUES (0xFFFFFFFFFFFFFFFF); +CREATE TABLE t2 AS SELECT +a, +FLOOR(a) AS cf, +CEILING(a) AS cc, +ROUND(a) AS cr, +TRUNCATE(a,0) AS ct +FROM t1; +SHOW CREATE TABLE t2; +SELECT CAST(a AS UNSIGNED) AS a, cf, cc, cr, ct FROM t2; +DROP TABLE t2; +DROP TABLE t1; +END FOR; +END; +$$ +----- ----- +Type BIT(1) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(1) DEFAULT NULL, + `cf` int(1) unsigned DEFAULT NULL, + `cc` int(1) unsigned DEFAULT NULL, + `cr` int(1) unsigned DEFAULT NULL, + `ct` int(1) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 1 +cf 1 +cc 1 +cr 1 +ct 1 +----- ----- +Type BIT(2) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(2) DEFAULT NULL, + `cf` int(1) unsigned DEFAULT NULL, + `cc` int(1) unsigned DEFAULT NULL, + `cr` int(1) unsigned DEFAULT NULL, + `ct` int(1) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 3 +cf 3 +cc 3 +cr 3 +ct 3 +----- ----- +Type BIT(3) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(3) DEFAULT NULL, + `cf` int(1) unsigned DEFAULT NULL, + `cc` int(1) unsigned DEFAULT NULL, + `cr` int(1) unsigned DEFAULT NULL, + `ct` int(1) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 7 +cf 7 +cc 7 +cr 7 +ct 7 +----- ----- +Type BIT(4) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(4) DEFAULT NULL, + `cf` int(2) unsigned DEFAULT NULL, + `cc` int(2) unsigned DEFAULT NULL, + `cr` int(2) unsigned DEFAULT NULL, + `ct` int(2) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 15 +cf 15 +cc 15 +cr 15 +ct 15 +----- ----- +Type BIT(5) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(5) DEFAULT NULL, + `cf` int(2) unsigned DEFAULT NULL, + `cc` int(2) unsigned DEFAULT NULL, + `cr` int(2) unsigned DEFAULT NULL, + `ct` int(2) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 31 +cf 31 +cc 31 +cr 31 +ct 31 +----- ----- +Type BIT(6) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(6) DEFAULT NULL, + `cf` int(2) unsigned DEFAULT NULL, + `cc` int(2) unsigned DEFAULT NULL, + `cr` int(2) unsigned DEFAULT NULL, + `ct` int(2) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 63 +cf 63 +cc 63 +cr 63 +ct 63 +----- ----- +Type BIT(7) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(7) DEFAULT NULL, + `cf` int(3) unsigned DEFAULT NULL, + `cc` int(3) unsigned DEFAULT NULL, + `cr` int(3) unsigned DEFAULT NULL, + `ct` int(3) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 127 +cf 127 +cc 127 +cr 127 +ct 127 +----- ----- +Type BIT(8) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(8) DEFAULT NULL, + `cf` int(3) unsigned DEFAULT NULL, + `cc` int(3) unsigned DEFAULT NULL, + `cr` int(3) unsigned DEFAULT NULL, + `ct` int(3) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 255 +cf 255 +cc 255 +cr 255 +ct 255 +----- ----- +Type BIT(9) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(9) DEFAULT NULL, + `cf` int(3) unsigned DEFAULT NULL, + `cc` int(3) unsigned DEFAULT NULL, + `cr` int(3) unsigned DEFAULT NULL, + `ct` int(3) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 511 +cf 511 +cc 511 +cr 511 +ct 511 +----- ----- +Type BIT(10) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(10) DEFAULT NULL, + `cf` int(4) unsigned DEFAULT NULL, + `cc` int(4) unsigned DEFAULT NULL, + `cr` int(4) unsigned DEFAULT NULL, + `ct` int(4) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 1023 +cf 1023 +cc 1023 +cr 1023 +ct 1023 +----- ----- +Type BIT(11) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(11) DEFAULT NULL, + `cf` int(4) unsigned DEFAULT NULL, + `cc` int(4) unsigned DEFAULT NULL, + `cr` int(4) unsigned DEFAULT NULL, + `ct` int(4) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 2047 +cf 2047 +cc 2047 +cr 2047 +ct 2047 +----- ----- +Type BIT(12) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(12) DEFAULT NULL, + `cf` int(4) unsigned DEFAULT NULL, + `cc` int(4) unsigned DEFAULT NULL, + `cr` int(4) unsigned DEFAULT NULL, + `ct` int(4) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 4095 +cf 4095 +cc 4095 +cr 4095 +ct 4095 +----- ----- +Type BIT(13) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(13) DEFAULT NULL, + `cf` int(4) unsigned DEFAULT NULL, + `cc` int(4) unsigned DEFAULT NULL, + `cr` int(4) unsigned DEFAULT NULL, + `ct` int(4) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 8191 +cf 8191 +cc 8191 +cr 8191 +ct 8191 +----- ----- +Type BIT(14) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(14) DEFAULT NULL, + `cf` int(5) unsigned DEFAULT NULL, + `cc` int(5) unsigned DEFAULT NULL, + `cr` int(5) unsigned DEFAULT NULL, + `ct` int(5) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 16383 +cf 16383 +cc 16383 +cr 16383 +ct 16383 +----- ----- +Type BIT(15) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(15) DEFAULT NULL, + `cf` int(5) unsigned DEFAULT NULL, + `cc` int(5) unsigned DEFAULT NULL, + `cr` int(5) unsigned DEFAULT NULL, + `ct` int(5) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 32767 +cf 32767 +cc 32767 +cr 32767 +ct 32767 +----- ----- +Type BIT(16) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(16) DEFAULT NULL, + `cf` int(5) unsigned DEFAULT NULL, + `cc` int(5) unsigned DEFAULT NULL, + `cr` int(5) unsigned DEFAULT NULL, + `ct` int(5) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 65535 +cf 65535 +cc 65535 +cr 65535 +ct 65535 +----- ----- +Type BIT(17) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(17) DEFAULT NULL, + `cf` int(6) unsigned DEFAULT NULL, + `cc` int(6) unsigned DEFAULT NULL, + `cr` int(6) unsigned DEFAULT NULL, + `ct` int(6) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 131071 +cf 131071 +cc 131071 +cr 131071 +ct 131071 +----- ----- +Type BIT(18) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(18) DEFAULT NULL, + `cf` int(6) unsigned DEFAULT NULL, + `cc` int(6) unsigned DEFAULT NULL, + `cr` int(6) unsigned DEFAULT NULL, + `ct` int(6) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 262143 +cf 262143 +cc 262143 +cr 262143 +ct 262143 +----- ----- +Type BIT(19) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(19) DEFAULT NULL, + `cf` int(6) unsigned DEFAULT NULL, + `cc` int(6) unsigned DEFAULT NULL, + `cr` int(6) unsigned DEFAULT NULL, + `ct` int(6) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 524287 +cf 524287 +cc 524287 +cr 524287 +ct 524287 +----- ----- +Type BIT(20) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(20) DEFAULT NULL, + `cf` int(7) unsigned DEFAULT NULL, + `cc` int(7) unsigned DEFAULT NULL, + `cr` int(7) unsigned DEFAULT NULL, + `ct` int(7) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 1048575 +cf 1048575 +cc 1048575 +cr 1048575 +ct 1048575 +----- ----- +Type BIT(21) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(21) DEFAULT NULL, + `cf` int(7) unsigned DEFAULT NULL, + `cc` int(7) unsigned DEFAULT NULL, + `cr` int(7) unsigned DEFAULT NULL, + `ct` int(7) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 2097151 +cf 2097151 +cc 2097151 +cr 2097151 +ct 2097151 +----- ----- +Type BIT(22) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(22) DEFAULT NULL, + `cf` int(7) unsigned DEFAULT NULL, + `cc` int(7) unsigned DEFAULT NULL, + `cr` int(7) unsigned DEFAULT NULL, + `ct` int(7) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 4194303 +cf 4194303 +cc 4194303 +cr 4194303 +ct 4194303 +----- ----- +Type BIT(23) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(23) DEFAULT NULL, + `cf` int(7) unsigned DEFAULT NULL, + `cc` int(7) unsigned DEFAULT NULL, + `cr` int(7) unsigned DEFAULT NULL, + `ct` int(7) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 8388607 +cf 8388607 +cc 8388607 +cr 8388607 +ct 8388607 +----- ----- +Type BIT(24) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(24) DEFAULT NULL, + `cf` int(8) unsigned DEFAULT NULL, + `cc` int(8) unsigned DEFAULT NULL, + `cr` int(8) unsigned DEFAULT NULL, + `ct` int(8) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 16777215 +cf 16777215 +cc 16777215 +cr 16777215 +ct 16777215 +----- ----- +Type BIT(25) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(25) DEFAULT NULL, + `cf` int(8) unsigned DEFAULT NULL, + `cc` int(8) unsigned DEFAULT NULL, + `cr` int(8) unsigned DEFAULT NULL, + `ct` int(8) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 33554431 +cf 33554431 +cc 33554431 +cr 33554431 +ct 33554431 +----- ----- +Type BIT(26) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(26) DEFAULT NULL, + `cf` int(8) unsigned DEFAULT NULL, + `cc` int(8) unsigned DEFAULT NULL, + `cr` int(8) unsigned DEFAULT NULL, + `ct` int(8) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 67108863 +cf 67108863 +cc 67108863 +cr 67108863 +ct 67108863 +----- ----- +Type BIT(27) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(27) DEFAULT NULL, + `cf` int(9) unsigned DEFAULT NULL, + `cc` int(9) unsigned DEFAULT NULL, + `cr` int(9) unsigned DEFAULT NULL, + `ct` int(9) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 134217727 +cf 134217727 +cc 134217727 +cr 134217727 +ct 134217727 +----- ----- +Type BIT(28) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(28) DEFAULT NULL, + `cf` int(9) unsigned DEFAULT NULL, + `cc` int(9) unsigned DEFAULT NULL, + `cr` int(9) unsigned DEFAULT NULL, + `ct` int(9) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 268435455 +cf 268435455 +cc 268435455 +cr 268435455 +ct 268435455 +----- ----- +Type BIT(29) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(29) DEFAULT NULL, + `cf` int(9) unsigned DEFAULT NULL, + `cc` int(9) unsigned DEFAULT NULL, + `cr` int(9) unsigned DEFAULT NULL, + `ct` int(9) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 536870911 +cf 536870911 +cc 536870911 +cr 536870911 +ct 536870911 +----- ----- +Type BIT(30) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(30) DEFAULT NULL, + `cf` int(10) unsigned DEFAULT NULL, + `cc` int(10) unsigned DEFAULT NULL, + `cr` int(10) unsigned DEFAULT NULL, + `ct` int(10) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 1073741823 +cf 1073741823 +cc 1073741823 +cr 1073741823 +ct 1073741823 +----- ----- +Type BIT(31) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(31) DEFAULT NULL, + `cf` int(10) unsigned DEFAULT NULL, + `cc` int(10) unsigned DEFAULT NULL, + `cr` int(10) unsigned DEFAULT NULL, + `ct` int(10) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 2147483647 +cf 2147483647 +cc 2147483647 +cr 2147483647 +ct 2147483647 +----- ----- +Type BIT(32) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(32) DEFAULT NULL, + `cf` int(10) unsigned DEFAULT NULL, + `cc` int(10) unsigned DEFAULT NULL, + `cr` int(10) unsigned DEFAULT NULL, + `ct` int(10) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 4294967295 +cf 4294967295 +cc 4294967295 +cr 4294967295 +ct 4294967295 +----- ----- +Type BIT(33) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(33) DEFAULT NULL, + `cf` bigint(10) unsigned DEFAULT NULL, + `cc` bigint(10) unsigned DEFAULT NULL, + `cr` bigint(10) unsigned DEFAULT NULL, + `ct` bigint(10) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 8589934591 +cf 8589934591 +cc 8589934591 +cr 8589934591 +ct 8589934591 +----- ----- +Type BIT(34) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(34) DEFAULT NULL, + `cf` bigint(11) unsigned DEFAULT NULL, + `cc` bigint(11) unsigned DEFAULT NULL, + `cr` bigint(11) unsigned DEFAULT NULL, + `ct` bigint(11) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 17179869183 +cf 17179869183 +cc 17179869183 +cr 17179869183 +ct 17179869183 +----- ----- +Type BIT(35) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(35) DEFAULT NULL, + `cf` bigint(11) unsigned DEFAULT NULL, + `cc` bigint(11) unsigned DEFAULT NULL, + `cr` bigint(11) unsigned DEFAULT NULL, + `ct` bigint(11) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 34359738367 +cf 34359738367 +cc 34359738367 +cr 34359738367 +ct 34359738367 +----- ----- +Type BIT(36) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(36) DEFAULT NULL, + `cf` bigint(11) unsigned DEFAULT NULL, + `cc` bigint(11) unsigned DEFAULT NULL, + `cr` bigint(11) unsigned DEFAULT NULL, + `ct` bigint(11) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 68719476735 +cf 68719476735 +cc 68719476735 +cr 68719476735 +ct 68719476735 +----- ----- +Type BIT(37) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(37) DEFAULT NULL, + `cf` bigint(12) unsigned DEFAULT NULL, + `cc` bigint(12) unsigned DEFAULT NULL, + `cr` bigint(12) unsigned DEFAULT NULL, + `ct` bigint(12) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 137438953471 +cf 137438953471 +cc 137438953471 +cr 137438953471 +ct 137438953471 +----- ----- +Type BIT(38) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(38) DEFAULT NULL, + `cf` bigint(12) unsigned DEFAULT NULL, + `cc` bigint(12) unsigned DEFAULT NULL, + `cr` bigint(12) unsigned DEFAULT NULL, + `ct` bigint(12) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 274877906943 +cf 274877906943 +cc 274877906943 +cr 274877906943 +ct 274877906943 +----- ----- +Type BIT(39) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(39) DEFAULT NULL, + `cf` bigint(12) unsigned DEFAULT NULL, + `cc` bigint(12) unsigned DEFAULT NULL, + `cr` bigint(12) unsigned DEFAULT NULL, + `ct` bigint(12) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 549755813887 +cf 549755813887 +cc 549755813887 +cr 549755813887 +ct 549755813887 +----- ----- +Type BIT(40) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(40) DEFAULT NULL, + `cf` bigint(13) unsigned DEFAULT NULL, + `cc` bigint(13) unsigned DEFAULT NULL, + `cr` bigint(13) unsigned DEFAULT NULL, + `ct` bigint(13) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 1099511627775 +cf 1099511627775 +cc 1099511627775 +cr 1099511627775 +ct 1099511627775 +----- ----- +Type BIT(41) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(41) DEFAULT NULL, + `cf` bigint(13) unsigned DEFAULT NULL, + `cc` bigint(13) unsigned DEFAULT NULL, + `cr` bigint(13) unsigned DEFAULT NULL, + `ct` bigint(13) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 2199023255551 +cf 2199023255551 +cc 2199023255551 +cr 2199023255551 +ct 2199023255551 +----- ----- +Type BIT(42) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(42) DEFAULT NULL, + `cf` bigint(13) unsigned DEFAULT NULL, + `cc` bigint(13) unsigned DEFAULT NULL, + `cr` bigint(13) unsigned DEFAULT NULL, + `ct` bigint(13) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 4398046511103 +cf 4398046511103 +cc 4398046511103 +cr 4398046511103 +ct 4398046511103 +----- ----- +Type BIT(43) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(43) DEFAULT NULL, + `cf` bigint(13) unsigned DEFAULT NULL, + `cc` bigint(13) unsigned DEFAULT NULL, + `cr` bigint(13) unsigned DEFAULT NULL, + `ct` bigint(13) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 8796093022207 +cf 8796093022207 +cc 8796093022207 +cr 8796093022207 +ct 8796093022207 +----- ----- +Type BIT(44) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(44) DEFAULT NULL, + `cf` bigint(14) unsigned DEFAULT NULL, + `cc` bigint(14) unsigned DEFAULT NULL, + `cr` bigint(14) unsigned DEFAULT NULL, + `ct` bigint(14) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 17592186044415 +cf 17592186044415 +cc 17592186044415 +cr 17592186044415 +ct 17592186044415 +----- ----- +Type BIT(45) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(45) DEFAULT NULL, + `cf` bigint(14) unsigned DEFAULT NULL, + `cc` bigint(14) unsigned DEFAULT NULL, + `cr` bigint(14) unsigned DEFAULT NULL, + `ct` bigint(14) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 35184372088831 +cf 35184372088831 +cc 35184372088831 +cr 35184372088831 +ct 35184372088831 +----- ----- +Type BIT(46) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(46) DEFAULT NULL, + `cf` bigint(14) unsigned DEFAULT NULL, + `cc` bigint(14) unsigned DEFAULT NULL, + `cr` bigint(14) unsigned DEFAULT NULL, + `ct` bigint(14) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 70368744177663 +cf 70368744177663 +cc 70368744177663 +cr 70368744177663 +ct 70368744177663 +----- ----- +Type BIT(47) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(47) DEFAULT NULL, + `cf` bigint(15) unsigned DEFAULT NULL, + `cc` bigint(15) unsigned DEFAULT NULL, + `cr` bigint(15) unsigned DEFAULT NULL, + `ct` bigint(15) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 140737488355327 +cf 140737488355327 +cc 140737488355327 +cr 140737488355327 +ct 140737488355327 +----- ----- +Type BIT(48) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(48) DEFAULT NULL, + `cf` bigint(15) unsigned DEFAULT NULL, + `cc` bigint(15) unsigned DEFAULT NULL, + `cr` bigint(15) unsigned DEFAULT NULL, + `ct` bigint(15) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 281474976710655 +cf 281474976710655 +cc 281474976710655 +cr 281474976710655 +ct 281474976710655 +----- ----- +Type BIT(49) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(49) DEFAULT NULL, + `cf` bigint(15) unsigned DEFAULT NULL, + `cc` bigint(15) unsigned DEFAULT NULL, + `cr` bigint(15) unsigned DEFAULT NULL, + `ct` bigint(15) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 562949953421311 +cf 562949953421311 +cc 562949953421311 +cr 562949953421311 +ct 562949953421311 +----- ----- +Type BIT(50) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(50) DEFAULT NULL, + `cf` bigint(16) unsigned DEFAULT NULL, + `cc` bigint(16) unsigned DEFAULT NULL, + `cr` bigint(16) unsigned DEFAULT NULL, + `ct` bigint(16) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 1125899906842623 +cf 1125899906842623 +cc 1125899906842623 +cr 1125899906842623 +ct 1125899906842623 +----- ----- +Type BIT(51) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(51) DEFAULT NULL, + `cf` bigint(16) unsigned DEFAULT NULL, + `cc` bigint(16) unsigned DEFAULT NULL, + `cr` bigint(16) unsigned DEFAULT NULL, + `ct` bigint(16) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 2251799813685247 +cf 2251799813685247 +cc 2251799813685247 +cr 2251799813685247 +ct 2251799813685247 +----- ----- +Type BIT(52) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(52) DEFAULT NULL, + `cf` bigint(16) unsigned DEFAULT NULL, + `cc` bigint(16) unsigned DEFAULT NULL, + `cr` bigint(16) unsigned DEFAULT NULL, + `ct` bigint(16) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 4503599627370495 +cf 4503599627370495 +cc 4503599627370495 +cr 4503599627370495 +ct 4503599627370495 +----- ----- +Type BIT(53) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(53) DEFAULT NULL, + `cf` bigint(16) unsigned DEFAULT NULL, + `cc` bigint(16) unsigned DEFAULT NULL, + `cr` bigint(16) unsigned DEFAULT NULL, + `ct` bigint(16) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 9007199254740991 +cf 9007199254740991 +cc 9007199254740991 +cr 9007199254740991 +ct 9007199254740991 +----- ----- +Type BIT(54) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(54) DEFAULT NULL, + `cf` bigint(17) unsigned DEFAULT NULL, + `cc` bigint(17) unsigned DEFAULT NULL, + `cr` bigint(17) unsigned DEFAULT NULL, + `ct` bigint(17) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 18014398509481983 +cf 18014398509481983 +cc 18014398509481983 +cr 18014398509481983 +ct 18014398509481983 +----- ----- +Type BIT(55) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(55) DEFAULT NULL, + `cf` bigint(17) unsigned DEFAULT NULL, + `cc` bigint(17) unsigned DEFAULT NULL, + `cr` bigint(17) unsigned DEFAULT NULL, + `ct` bigint(17) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 36028797018963967 +cf 36028797018963967 +cc 36028797018963967 +cr 36028797018963967 +ct 36028797018963967 +----- ----- +Type BIT(56) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(56) DEFAULT NULL, + `cf` bigint(17) unsigned DEFAULT NULL, + `cc` bigint(17) unsigned DEFAULT NULL, + `cr` bigint(17) unsigned DEFAULT NULL, + `ct` bigint(17) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 72057594037927935 +cf 72057594037927935 +cc 72057594037927935 +cr 72057594037927935 +ct 72057594037927935 +----- ----- +Type BIT(57) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(57) DEFAULT NULL, + `cf` bigint(18) unsigned DEFAULT NULL, + `cc` bigint(18) unsigned DEFAULT NULL, + `cr` bigint(18) unsigned DEFAULT NULL, + `ct` bigint(18) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 144115188075855871 +cf 144115188075855871 +cc 144115188075855871 +cr 144115188075855871 +ct 144115188075855871 +----- ----- +Type BIT(58) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(58) DEFAULT NULL, + `cf` bigint(18) unsigned DEFAULT NULL, + `cc` bigint(18) unsigned DEFAULT NULL, + `cr` bigint(18) unsigned DEFAULT NULL, + `ct` bigint(18) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 288230376151711743 +cf 288230376151711743 +cc 288230376151711743 +cr 288230376151711743 +ct 288230376151711743 +----- ----- +Type BIT(59) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(59) DEFAULT NULL, + `cf` bigint(18) unsigned DEFAULT NULL, + `cc` bigint(18) unsigned DEFAULT NULL, + `cr` bigint(18) unsigned DEFAULT NULL, + `ct` bigint(18) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 576460752303423487 +cf 576460752303423487 +cc 576460752303423487 +cr 576460752303423487 +ct 576460752303423487 +----- ----- +Type BIT(60) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(60) DEFAULT NULL, + `cf` bigint(19) unsigned DEFAULT NULL, + `cc` bigint(19) unsigned DEFAULT NULL, + `cr` bigint(19) unsigned DEFAULT NULL, + `ct` bigint(19) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 1152921504606846975 +cf 1152921504606846975 +cc 1152921504606846975 +cr 1152921504606846975 +ct 1152921504606846975 +----- ----- +Type BIT(61) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(61) DEFAULT NULL, + `cf` bigint(19) unsigned DEFAULT NULL, + `cc` bigint(19) unsigned DEFAULT NULL, + `cr` bigint(19) unsigned DEFAULT NULL, + `ct` bigint(19) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 2305843009213693951 +cf 2305843009213693951 +cc 2305843009213693951 +cr 2305843009213693951 +ct 2305843009213693951 +----- ----- +Type BIT(62) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(62) DEFAULT NULL, + `cf` bigint(19) unsigned DEFAULT NULL, + `cc` bigint(19) unsigned DEFAULT NULL, + `cr` bigint(19) unsigned DEFAULT NULL, + `ct` bigint(19) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 4611686018427387903 +cf 4611686018427387903 +cc 4611686018427387903 +cr 4611686018427387903 +ct 4611686018427387903 +----- ----- +Type BIT(63) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(63) DEFAULT NULL, + `cf` bigint(19) unsigned DEFAULT NULL, + `cc` bigint(19) unsigned DEFAULT NULL, + `cr` bigint(19) unsigned DEFAULT NULL, + `ct` bigint(19) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 9223372036854775807 +cf 9223372036854775807 +cc 9223372036854775807 +cr 9223372036854775807 +ct 9223372036854775807 +----- ----- +Type BIT(64) +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bit(64) DEFAULT NULL, + `cf` bigint(20) unsigned DEFAULT NULL, + `cc` bigint(20) unsigned DEFAULT NULL, + `cr` bigint(20) unsigned DEFAULT NULL, + `ct` bigint(20) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 18446744073709551615 +cf 18446744073709551615 +cc 18446744073709551615 +cr 18446744073709551615 +ct 18446744073709551615 +# # End of 10.4 tests # diff --git a/mysql-test/main/type_bit.test b/mysql-test/main/type_bit.test index f7b2ec86040..2353fc535ad 100644 --- a/mysql-test/main/type_bit.test +++ b/mysql-test/main/type_bit.test @@ -507,6 +507,35 @@ EXPLAIN SELECT * FROM t1 WHERE a=200; EXPLAIN SELECT * FROM t1 WHERE a<=>200; DROP TABLE t1; +--echo # +--echo # MDEV-23323 Rounding functions return a wrong data type for a BIT, ENUM, SET argument +--echo # + +--vertical_results +DELIMITER $$; +BEGIN NOT ATOMIC + FOR i IN 1..64 + DO + SELECT '-----', CONCAT('BIT(',i,')') AS Type; + EXECUTE IMMEDIATE REPLACE('CREATE TABLE t1 (a BIT(64))','64', i); + INSERT IGNORE INTO t1 VALUES (0xFFFFFFFFFFFFFFFF); + CREATE TABLE t2 AS SELECT + a, + FLOOR(a) AS cf, + CEILING(a) AS cc, + ROUND(a) AS cr, + TRUNCATE(a,0) AS ct + FROM t1; + SHOW CREATE TABLE t2; + SELECT CAST(a AS UNSIGNED) AS a, cf, cc, cr, ct FROM t2; + DROP TABLE t2; + DROP TABLE t1; + END FOR; +END; +$$ +DELIMITER ;$$ +--horizontal_results + --echo # --echo # End of 10.4 tests diff --git a/mysql-test/main/type_enum.result b/mysql-test/main/type_enum.result index 02d71c6bd9f..c8277ab832f 100644 --- a/mysql-test/main/type_enum.result +++ b/mysql-test/main/type_enum.result @@ -2311,3 +2311,24 @@ t2 CREATE TABLE `t2` ( ) ENGINE=MyISAM DEFAULT CHARSET=latin1 DROP PROCEDURE p1; DROP TABLE t1; +# +# MDEV-23323 Rounding functions return a wrong data type for a BIT, ENUM, SET argument +# +CREATE TABLE t1 (a ENUM('999999999999999999999999999999999999999999999999999999999999')); +INSERT INTO t1 VALUES (1); +CREATE TABLE t2 AS +SELECT a, FLOOR(a), CEILING(a), TRUNCATE(a,0), ROUND(a) FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` enum('999999999999999999999999999999999999999999999999999999999999') DEFAULT NULL, + `FLOOR(a)` int(5) unsigned DEFAULT NULL, + `CEILING(a)` int(5) unsigned DEFAULT NULL, + `TRUNCATE(a,0)` int(5) unsigned DEFAULT NULL, + `ROUND(a)` int(5) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT * FROM t2; +a FLOOR(a) CEILING(a) TRUNCATE(a,0) ROUND(a) +999999999999999999999999999999999999999999999999999999999999 1 1 1 1 +DROP TABLE t2; +DROP TABLE t1; diff --git a/mysql-test/main/type_enum.test b/mysql-test/main/type_enum.test index a79335960bc..a36d63f8725 100644 --- a/mysql-test/main/type_enum.test +++ b/mysql-test/main/type_enum.test @@ -518,3 +518,16 @@ DELIMITER ;$$ CALL p1(); DROP PROCEDURE p1; DROP TABLE t1; + +--echo # +--echo # MDEV-23323 Rounding functions return a wrong data type for a BIT, ENUM, SET argument +--echo # + +CREATE TABLE t1 (a ENUM('999999999999999999999999999999999999999999999999999999999999')); +INSERT INTO t1 VALUES (1); +CREATE TABLE t2 AS + SELECT a, FLOOR(a), CEILING(a), TRUNCATE(a,0), ROUND(a) FROM t1; +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2; +DROP TABLE t1; diff --git a/mysql-test/main/type_set.result b/mysql-test/main/type_set.result index 76a0c343973..5f54521c9dc 100644 --- a/mysql-test/main/type_set.result +++ b/mysql-test/main/type_set.result @@ -358,3 +358,24 @@ DROP TABLE t1; SET NAMES utf8; CREATE TABLE t1 (a SET('a,bü')); ERROR 22007: Illegal set 'a,bü' value found during parsing +# +# MDEV-23323 Rounding functions return a wrong data type for a BIT, ENUM, SET argument +# +CREATE TABLE t1 (a SET('999999999999999999999999999999999999999999999999999999999999')); +INSERT INTO t1 VALUES (1); +CREATE TABLE t2 AS +SELECT a, FLOOR(a), CEILING(a), TRUNCATE(a,0), ROUND(a) FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` set('999999999999999999999999999999999999999999999999999999999999') DEFAULT NULL, + `FLOOR(a)` int(5) unsigned DEFAULT NULL, + `CEILING(a)` int(5) unsigned DEFAULT NULL, + `TRUNCATE(a,0)` int(5) unsigned DEFAULT NULL, + `ROUND(a)` int(5) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +SELECT * FROM t2; +a FLOOR(a) CEILING(a) TRUNCATE(a,0) ROUND(a) +999999999999999999999999999999999999999999999999999999999999 1 1 1 1 +DROP TABLE t2; +DROP TABLE t1; diff --git a/mysql-test/main/type_set.test b/mysql-test/main/type_set.test index 8a81c406c63..2d0c81340ae 100644 --- a/mysql-test/main/type_set.test +++ b/mysql-test/main/type_set.test @@ -248,3 +248,16 @@ DROP TABLE t1; SET NAMES utf8; --error ER_ILLEGAL_VALUE_FOR_TYPE CREATE TABLE t1 (a SET('a,bü')); + +--echo # +--echo # MDEV-23323 Rounding functions return a wrong data type for a BIT, ENUM, SET argument +--echo # + +CREATE TABLE t1 (a SET('999999999999999999999999999999999999999999999999999999999999')); +INSERT INTO t1 VALUES (1); +CREATE TABLE t2 AS + SELECT a, FLOOR(a), CEILING(a), TRUNCATE(a,0), ROUND(a) FROM t1; +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t2; +DROP TABLE t1; diff --git a/sql/item_func.cc b/sql/item_func.cc index cf01934806c..9f934a95f4d 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2218,9 +2218,13 @@ bool Item_func_int_val::fix_length_and_dec() { DBUG_ENTER("Item_func_int_val::fix_length_and_dec"); DBUG_PRINT("info", ("name %s", func_name())); - if (args[0]->type_handler()->Item_func_int_val_fix_length_and_dec(this)) + /* + We don't want to translate ENUM/SET to CHAR here. + So let's call real_type_handler(), not type_handler(). + */ + if (args[0]->real_type_handler()->Item_func_int_val_fix_length_and_dec(this)) DBUG_RETURN(TRUE); - DBUG_PRINT("info", ("Type: %s", type_handler()->name().ptr())); + DBUG_PRINT("info", ("Type: %s", real_type_handler()->name().ptr())); DBUG_RETURN(FALSE); } diff --git a/sql/item_func.h b/sql/item_func.h index dc9ec9be742..d1ebf98ccda 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -458,6 +458,29 @@ public: { Type_geometry_attributes::set_geometry_type(type); } + void fix_length_and_dec_long_or_longlong(uint char_length, bool unsigned_arg) + { + collation.set_numeric(); + unsigned_flag= unsigned_arg; + max_length= char_length; +#if MARIADB_VERSION_ID < 100500 + set_handler(Type_handler::type_handler_long_or_longlong(char_length)); +#else + set_handler(Type_handler::type_handler_long_or_longlong(char_length, + unsigned_arg)); +#endif + } + void fix_length_and_dec_ulong_or_ulonglong_by_nbits(uint nbits) + { + uint digits= Type_handler_bit::Bit_decimal_notation_int_digits_by_nbits(nbits); + collation.set_numeric(); + unsigned_flag= true; + max_length= digits; + if (nbits > 32) + set_handler(&type_handler_longlong); + else + set_handler(&type_handler_long); + } }; @@ -1758,7 +1781,11 @@ public: void fix_arg_temporal(const Type_handler *h, uint int_part_length); bool fix_length_and_dec() { - return args[0]->type_handler()->Item_func_round_fix_length_and_dec(this); + /* + We don't want to translate ENUM/SET to CHAR here. + So let's real_type_handler(), not type_handler(). + */ + return args[0]->real_type_handler()->Item_func_round_fix_length_and_dec(this); } Item *get_copy(THD *thd) { return get_item_copy(thd, this); } diff --git a/sql/sql_type.cc b/sql/sql_type.cc index 43b742604bc..88afc51564d 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -3536,7 +3536,7 @@ uint32 Type_handler_bit::Item_decimal_notation_int_digits(const Item *item) const { - return Bit_decimal_notation_int_digits(item); + return Bit_decimal_notation_int_digits_by_nbits(item->max_length); } @@ -3554,9 +3554,23 @@ Type_handler_general_purpose_int::Item_decimal_notation_int_digits( a divisor. */ uint32 -Type_handler_bit::Bit_decimal_notation_int_digits(const Item *item) +Type_handler_bit::Bit_decimal_notation_int_digits_by_nbits(uint nbits) { - return item->max_length/3+1; + DBUG_ASSERT(nbits > 0); + DBUG_ASSERT(nbits <= 64); + set_if_smaller(nbits, 64); // Safety + static uint ndigits[65]= + {0, + 1,1,1,2,2,2,3,3, // 1..8 bits + 3,4,4,4,4,5,5,5, // 9..16 bits + 6,6,6,7,7,7,7,8, // 17..24 bits + 8,8,9,9,9,10,10,10, // 25..32 bits + 10,11,11,11,12,12,12,13, // 33..40 bits + 13,13,13,14,14,14,15,15, // 41..48 bits + 15,16,16,16,16,17,17,17, // 49..56 bits + 18,18,18,19,19,19,19,20 // 57..64 bits + }; + return ndigits[nbits]; } /*************************************************************************/ @@ -5658,6 +5672,23 @@ bool Type_handler_hex_hybrid:: } +bool Type_handler_bit:: + Item_func_round_fix_length_and_dec(Item_func_round *item) const +{ + uint nbits= item->arguments()[0]->max_length; + item->fix_length_and_dec_ulong_or_ulonglong_by_nbits(nbits); + return false; +} + + +bool Type_handler_typelib:: + Item_func_round_fix_length_and_dec(Item_func_round *item) const +{ + item->fix_length_and_dec_long_or_longlong(5, true); + return false; +} + + bool Type_handler_real_result:: Item_func_round_fix_length_and_dec(Item_func_round *item) const { @@ -5740,10 +5771,19 @@ bool Type_handler_int_result:: } +bool Type_handler_bit:: + Item_func_int_val_fix_length_and_dec(Item_func_int_val *item) const +{ + uint nbits= item->arguments()[0]->max_length; + item->fix_length_and_dec_ulong_or_ulonglong_by_nbits(nbits); + return false; +} + + bool Type_handler_typelib:: Item_func_int_val_fix_length_and_dec(Item_func_int_val *item) const { - item->fix_length_and_dec_int_or_decimal(); + item->fix_length_and_dec_long_or_longlong(5, true); return false; } @@ -5751,14 +5791,8 @@ bool Type_handler_typelib:: bool Type_handler_hex_hybrid:: Item_func_int_val_fix_length_and_dec(Item_func_int_val *item) const { - item->collation.set_numeric(); - item->unsigned_flag= true; - item->max_length= item->arguments()[0]->decimal_precision(); -#if MARIADB_VERSION_ID < 100500 - item->set_handler(type_handler_long_or_longlong(item->max_length)); -#else - item->set_handler(type_handler_long_or_longlong(item->max_length, true)); -#endif + uint nchars= item->arguments()[0]->decimal_precision(); + item->fix_length_and_dec_long_or_longlong(nchars, true); return false; } diff --git a/sql/sql_type.h b/sql/sql_type.h index f98f2349f78..d6828832bf1 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -5147,7 +5147,7 @@ public: } uint32 max_display_length(const Item *item) const; uint32 Item_decimal_notation_int_digits(const Item *item) const; - static uint32 Bit_decimal_notation_int_digits(const Item *item); + static uint32 Bit_decimal_notation_int_digits_by_nbits(uint nbits); uint32 calc_pack_length(uint32 length) const { return length / 8; } bool Item_send(Item *item, Protocol *protocol, st_value *buf) const { @@ -5157,6 +5157,8 @@ public: { return print_item_value_csstr(thd, item, str); } + bool Item_func_round_fix_length_and_dec(Item_func_round *) const; + bool Item_func_int_val_fix_length_and_dec(Item_func_int_val *) const; Field *make_conversion_table_field(TABLE *, uint metadata, const Field *target) const; bool Column_definition_fix_attributes(Column_definition *c) const; @@ -6271,6 +6273,7 @@ public: enum_field_types field_type() const { return MYSQL_TYPE_STRING; } const Type_handler *type_handler_for_item_field() const; const Type_handler *cast_to_int_type_handler() const; + bool Item_func_round_fix_length_and_dec(Item_func_round *) const; bool Item_func_int_val_fix_length_and_dec(Item_func_int_val *) const; bool Item_hybrid_func_fix_attributes(THD *thd, const char *name, From c5d4dd253348655a663d37985a3e61b20d17ed20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Thu, 30 Jul 2020 09:24:36 +0300 Subject: [PATCH 162/188] MDEV-23339 innodb_force_recovery=2 may still abort the rollback of recovered transactions trx_rollback_active(), trx_rollback_resurrected(): Replace an incorrect condition that we failed to replace in commit b68f1d847f1fc00eed795e20162effc8fbc4119b (MDEV-21217). --- mysql-test/suite/innodb/disabled.def | 1 - .../suite/innodb/r/innodb_force_recovery_rollback.result | 2 +- mysql-test/suite/innodb/t/innodb_force_recovery_rollback.test | 3 ++- storage/innobase/trx/trx0roll.cc | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mysql-test/suite/innodb/disabled.def b/mysql-test/suite/innodb/disabled.def index 4484417afce..35c941f8af7 100644 --- a/mysql-test/suite/innodb/disabled.def +++ b/mysql-test/suite/innodb/disabled.def @@ -11,4 +11,3 @@ ############################################################################## create-index-debug : MDEV-13680 InnoDB may crash when btr_page_alloc() fails -innodb_force_recovery_rollback : MDEV-22889 InnoDB occasionally breaks ACID diff --git a/mysql-test/suite/innodb/r/innodb_force_recovery_rollback.result b/mysql-test/suite/innodb/r/innodb_force_recovery_rollback.result index dc037fd6c97..42cf8adfc13 100644 --- a/mysql-test/suite/innodb/r/innodb_force_recovery_rollback.result +++ b/mysql-test/suite/innodb/r/innodb_force_recovery_rollback.result @@ -12,6 +12,6 @@ SET GLOBAL innodb_flush_log_at_trx_commit=1; CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; disconnect con0; connection default; -SELECT * FROM t0 LOCK IN SHARE MODE; +SELECT * FROM t0 LIMIT 0 LOCK IN SHARE MODE; a DROP TABLE t0,t1; diff --git a/mysql-test/suite/innodb/t/innodb_force_recovery_rollback.test b/mysql-test/suite/innodb/t/innodb_force_recovery_rollback.test index ad234eba72e..f1d14c45aaf 100644 --- a/mysql-test/suite/innodb/t/innodb_force_recovery_rollback.test +++ b/mysql-test/suite/innodb/t/innodb_force_recovery_rollback.test @@ -30,5 +30,6 @@ CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; disconnect con0; connection default; # If the rollback was aborted, we would end up in a lock wait here. -SELECT * FROM t0 LOCK IN SHARE MODE; +# The LIMIT 0 works around MDEV-22889 InnoDB occasionally breaks ACID +SELECT * FROM t0 LIMIT 0 LOCK IN SHARE MODE; DROP TABLE t0,t1; diff --git a/storage/innobase/trx/trx0roll.cc b/storage/innobase/trx/trx0roll.cc index de749f993e7..ef3d93cd65e 100644 --- a/storage/innobase/trx/trx0roll.cc +++ b/storage/innobase/trx/trx0roll.cc @@ -611,7 +611,7 @@ trx_rollback_active( if (trx->error_state != DB_SUCCESS) { ut_ad(trx->error_state == DB_INTERRUPTED); - ut_ad(!srv_is_being_started); + ut_ad(srv_shutdown_state != SRV_SHUTDOWN_NONE); ut_ad(!srv_undo_sources); ut_ad(srv_fast_shutdown); ut_ad(!dictionary_locked); @@ -701,7 +701,7 @@ func_exit: trx_free_resurrected(trx); return(TRUE); case TRX_STATE_ACTIVE: - if (!srv_is_being_started + if (srv_shutdown_state != SRV_SHUTDOWN_NONE && !srv_undo_sources && srv_fast_shutdown) { fake_prepared: trx->state = TRX_STATE_PREPARED; From 71015d844e3f25a0c4eada9827a1dad464a4fdce Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Tue, 28 Jul 2020 15:59:38 +0200 Subject: [PATCH 163/188] MDEV-21101 unexpected wait_timeout with pool-of-threads Due to restricted size of the threadpool, execution of client queries can be delayed (queued) for a while. This delay was interpreted as client inactivity, and connection is closed, if client idle time + queue time exceeds wait_timeout. But users did not expect queue time to be included into wait_timeout. This patch changes the behavior. We don't close connection anymore, if there is some unread data present on connection, even if wait_timeout is exceeded. Unread data means that client was not idle, it sent a query, which we did not have time to process yet. --- include/violite.h | 2 -- mysql-test/main/mdev-21101.opt | 1 + mysql-test/main/mdev-21101.result | 43 +++++++++++++++++++++++++ mysql-test/main/mdev-21101.test | 53 +++++++++++++++++++++++++++++++ sql/sys_vars.cc | 6 ++++ sql/threadpool.h | 1 + sql/threadpool_common.cc | 22 ++++++++++--- sql/threadpool_generic.cc | 5 +-- vio/vio_priv.h | 1 + vio/viopipe.c | 6 ++++ vio/viosocket.c | 31 ++++++++++++------ 11 files changed, 151 insertions(+), 20 deletions(-) create mode 100644 mysql-test/main/mdev-21101.opt create mode 100644 mysql-test/main/mdev-21101.result create mode 100644 mysql-test/main/mdev-21101.test diff --git a/include/violite.h b/include/violite.h index 6808a9776de..5bc6359b153 100644 --- a/include/violite.h +++ b/include/violite.h @@ -110,9 +110,7 @@ my_bool vio_peer_addr(Vio *vio, char *buf, uint16 *port, size_t buflen); /* Wait for an I/O event notification. */ int vio_io_wait(Vio *vio, enum enum_vio_io_event event, int timeout); my_bool vio_is_connected(Vio *vio); -#ifndef DBUG_OFF ssize_t vio_pending(Vio *vio); -#endif /* Set timeout for a network operation. */ extern int vio_timeout(Vio *vio, uint which, int timeout_sec); extern void vio_set_wait_callback(void (*before_wait)(void), diff --git a/mysql-test/main/mdev-21101.opt b/mysql-test/main/mdev-21101.opt new file mode 100644 index 00000000000..b446a28986b --- /dev/null +++ b/mysql-test/main/mdev-21101.opt @@ -0,0 +1 @@ +--thread-handling=pool-of-threads \ No newline at end of file diff --git a/mysql-test/main/mdev-21101.result b/mysql-test/main/mdev-21101.result new file mode 100644 index 00000000000..94da9c31108 --- /dev/null +++ b/mysql-test/main/mdev-21101.result @@ -0,0 +1,43 @@ +SELECT +@@global.wait_timeout, @@global.thread_pool_max_threads, @@global.thread_pool_size, +@@global.thread_pool_oversubscribe, @@global.thread_pool_stall_limit +INTO +@_wait_timeout,@_thread_pool_max_threads,@_thread_pool_size, +@_thread_pool_oversubscribe,@_thread_pool_stall_limit; +SET @@global.wait_timeout=1, +@@global.thread_pool_max_threads=2, +@@global.thread_pool_size=1, +@@global.thread_pool_oversubscribe=1, +@@global.thread_pool_stall_limit=10; +connect c1, localhost, root,,; +connect c2, localhost, root,,; +connect c3, localhost, root,,; +connection c1; +select sleep(1.1); +connection c2; +select sleep(1.1); +connection c3; +select sleep(1.1); +connection default; +select sleep(1.1); +connection c1; +sleep(1.1) +0 +connection c2; +sleep(1.1) +0 +connection c3; +sleep(1.1) +0 +connection default; +sleep(1.1) +0 +disconnect c1; +disconnect c2; +disconnect c3; +connection default; +SET @@global.wait_timeout=@_wait_timeout, +@@global.thread_pool_max_threads=@_thread_pool_max_threads, +@@global.thread_pool_size=@_thread_pool_size, +@@global.thread_pool_oversubscribe=@_thread_pool_oversubscribe, +@@global.thread_pool_stall_limit=@_thread_pool_stall_limit; diff --git a/mysql-test/main/mdev-21101.test b/mysql-test/main/mdev-21101.test new file mode 100644 index 00000000000..9b43c60ec88 --- /dev/null +++ b/mysql-test/main/mdev-21101.test @@ -0,0 +1,53 @@ +# Test that wait_timeout does not cause connection to be closed, when connection is delayed due to +# threadpool internal problems, e.g misconfiguration - too few threads and queueing. +# So if client did not cause wait_timeout, do not report it either. +# See MDEV-21101 for details. + +# Intentionally misconfigure threadpool to have at most 1 or 2 threads ( +# depends on the implementation). Use minimal wait_timeout, do some slow queries from +# different connections simultaneously, to force queueing occurs. +# Verify connections are intact, even if queueing time exceeds wait_timeout + +SELECT + @@global.wait_timeout, @@global.thread_pool_max_threads, @@global.thread_pool_size, + @@global.thread_pool_oversubscribe, @@global.thread_pool_stall_limit +INTO + @_wait_timeout,@_thread_pool_max_threads,@_thread_pool_size, + @_thread_pool_oversubscribe,@_thread_pool_stall_limit; + +SET @@global.wait_timeout=1, + @@global.thread_pool_max_threads=2, + @@global.thread_pool_size=1, + @@global.thread_pool_oversubscribe=1, + @@global.thread_pool_stall_limit=10; + +--connect (c1, localhost, root,,) +--connect (c2, localhost, root,,) +--connect (c3, localhost, root,,) +--connection c1 +--send select sleep(1.1) +--connection c2 +--send select sleep(1.1) +--connection c3 +--send select sleep(1.1) +--connection default +--send select sleep(1.1) +--connection c1 +--reap +--connection c2 +--reap +--connection c3 +--reap +--connection default +--reap +--disconnect c1 +--disconnect c2 +--disconnect c3 +--connection default + +SET @@global.wait_timeout=@_wait_timeout, + @@global.thread_pool_max_threads=@_thread_pool_max_threads, + @@global.thread_pool_size=@_thread_pool_size, + @@global.thread_pool_oversubscribe=@_thread_pool_oversubscribe, + @@global.thread_pool_stall_limit=@_thread_pool_stall_limit; + diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 120fb87ab50..b096c8c5a12 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -3609,6 +3609,12 @@ static bool fix_tp_min_threads(sys_var *, THD *, enum_var_type) static bool check_threadpool_size(sys_var *self, THD *thd, set_var *var) { + +#ifdef _WIN32 + if (threadpool_mode != TP_MODE_GENERIC) + return false; +#endif + ulonglong v= var->save_result.ulonglong_value; if (v > threadpool_max_size) { diff --git a/sql/threadpool.h b/sql/threadpool.h index d41435a766c..ec320c6945c 100644 --- a/sql/threadpool.h +++ b/sql/threadpool.h @@ -74,6 +74,7 @@ enum TP_STATE { TP_STATE_IDLE, TP_STATE_RUNNING, + TP_STATE_PENDING }; /* diff --git a/sql/threadpool_common.cc b/sql/threadpool_common.cc index 53e22cd04ed..1d51f0da411 100644 --- a/sql/threadpool_common.cc +++ b/sql/threadpool_common.cc @@ -468,11 +468,25 @@ void tp_timeout_handler(TP_connection *c) { if (c->state != TP_STATE_IDLE) return; - THD *thd=c->thd; + THD *thd= c->thd; mysql_mutex_lock(&thd->LOCK_thd_kill); - thd->set_killed_no_mutex(KILL_WAIT_TIMEOUT); - c->priority= TP_PRIORITY_HIGH; - post_kill_notification(thd); + Vio *vio= thd->net.vio; + if (vio && (vio_pending(vio) > 0 || vio->has_data(vio)) && + c->state == TP_STATE_IDLE) + { + /* + There is some data on that connection, i.e + i.e there was no inactivity timeout. + Don't kill. + */ + c->state= TP_STATE_PENDING; + } + else if (c->state == TP_STATE_IDLE) + { + thd->set_killed_no_mutex(KILL_WAIT_TIMEOUT); + c->priority= TP_PRIORITY_HIGH; + post_kill_notification(thd); + } mysql_mutex_unlock(&thd->LOCK_thd_kill); } diff --git a/sql/threadpool_generic.cc b/sql/threadpool_generic.cc index 6531ce06360..2433369dbbb 100644 --- a/sql/threadpool_generic.cc +++ b/sql/threadpool_generic.cc @@ -591,11 +591,8 @@ static void timeout_check(pool_timer_t *timer) THD *thd; while ((thd=it++)) { - if (thd->net.reading_or_writing != 1) - continue; - TP_connection_generic *connection= (TP_connection_generic *)thd->event_scheduler.data; - if (!connection) + if (!connection || connection->state != TP_STATE_IDLE) { /* Connection does not have scheduler data. This happens for example diff --git a/vio/vio_priv.h b/vio/vio_priv.h index 71a0468e226..6780ec5664a 100644 --- a/vio/vio_priv.h +++ b/vio/vio_priv.h @@ -33,6 +33,7 @@ my_bool vio_is_connected_pipe(Vio *vio); int vio_close_pipe(Vio * vio); int cancel_io(HANDLE handle, DWORD thread_id); int vio_shutdown_pipe(Vio *vio,int how); +uint vio_pending_pipe(Vio* vio); #endif #ifdef HAVE_SMEM diff --git a/vio/viopipe.c b/vio/viopipe.c index 84643935c13..5007599aa17 100644 --- a/vio/viopipe.c +++ b/vio/viopipe.c @@ -141,5 +141,11 @@ int vio_close_pipe(Vio *vio) DBUG_RETURN(ret); } +/* return number of bytes readable from pipe.*/ +uint vio_pending_pipe(Vio *vio) +{ + DWORD bytes; + return PeekNamedPipe(vio->hPipe, NULL, 0, NULL, &bytes, NULL) ? bytes : 0; +} #endif diff --git a/vio/viosocket.c b/vio/viosocket.c index d1a3eeb5c0d..6409aeb9899 100644 --- a/vio/viosocket.c +++ b/vio/viosocket.c @@ -1214,7 +1214,6 @@ my_bool vio_is_connected(Vio *vio) DBUG_RETURN(bytes ? TRUE : FALSE); } -#ifndef DBUG_OFF /** Number of bytes in the read or socket buffer @@ -1233,22 +1232,34 @@ ssize_t vio_pending(Vio *vio) return vio->read_end - vio->read_pos; /* Skip non-socket based transport types. */ - if (vio->type == VIO_TYPE_TCPIP || vio->type == VIO_TYPE_SOCKET) + switch (vio->type) { + case VIO_TYPE_TCPIP: + /* fallthrough */ + case VIO_TYPE_SOCKET: /* Obtain number of readable bytes in the socket buffer. */ if (socket_peek_read(vio, &bytes)) return -1; + return bytes; + + case VIO_TYPE_SSL: + bytes= (uint) SSL_pending(vio->ssl_arg); + if (bytes) + return bytes; + if (socket_peek_read(vio, &bytes)) + return -1; + return bytes; + +#ifdef _WIN32 + case VIO_TYPE_NAMEDPIPE: + bytes= vio_pending_pipe(vio); + return bytes; +#endif + default: + return -1; } - - /* - SSL not checked due to a yaSSL bug in SSL_pending that - causes it to attempt to read from the socket. - */ - - return (ssize_t) bytes; } -#endif /* DBUG_OFF */ /** Checks if the error code, returned by vio_getnameinfo(), means it was the From 8a612314d0c9bc5b1db6f3998f26c28967915949 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Thu, 30 Jul 2020 13:38:43 +0530 Subject: [PATCH 164/188] MDEV-23332 Index online status assert failure in btr_search_drop_page_hash_index Problem: ======== In row_merge_drop_indexes(), InnoDB drops only the index from dictionary and frees the index pages but it maintains the index object if the table is being used by other DML threads. It sets the online status of the index to ONLINE_INDEX_ABORTED_DROPPED. Removing the index from dictionary doesn't remove the corressponding ahi entries of the index. When block is being reused, InnoDB tries to remove ahi entries for the block and it fails if index online status is ONLINE_INDEX_ABORTED_DROPPED. Fix: ==== MDEV-22456 allows the index ahi entries to be dropped lazily. so checking online status in btr_search_drop_page_hash_index() is meaningless and should be removed. --- storage/innobase/btr/btr0sea.cc | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/storage/innobase/btr/btr0sea.cc b/storage/innobase/btr/btr0sea.cc index 491a3e375d3..ea34b4034e4 100644 --- a/storage/innobase/btr/btr0sea.cc +++ b/storage/innobase/btr/btr0sea.cc @@ -1160,26 +1160,6 @@ retry: || block->page.id.space() == index->space); ut_a(index_id == index->id); ut_ad(!dict_index_is_ibuf(index)); -#ifdef UNIV_DEBUG - switch (dict_index_get_online_status(index)) { - case ONLINE_INDEX_CREATION: - /* The index is being created (bulk loaded). */ - case ONLINE_INDEX_COMPLETE: - /* The index has been published. */ - case ONLINE_INDEX_ABORTED: - /* Either the index creation was aborted due to an - error observed by InnoDB (in which case there should - not be any adaptive hash index entries), or it was - completed and then flagged aborted in - rollback_inplace_alter_table(). */ - break; - case ONLINE_INDEX_ABORTED_DROPPED: - /* The index should have been dropped from the tablespace - already, and the adaptive hash index entries should have - been dropped as well. */ - ut_error; - } -#endif /* UNIV_DEBUG */ n_fields = block->curr_n_fields; n_bytes = block->curr_n_bytes; From 0435fcf90b0afa97b468f9eb5dbdf00349325e35 Mon Sep 17 00:00:00 2001 From: Vladislav Vaintroub Date: Thu, 30 Jul 2020 12:08:07 +0200 Subject: [PATCH 165/188] MDEV-21101 skip test for embedded --- mysql-test/main/mdev-21101.test | 1 + 1 file changed, 1 insertion(+) diff --git a/mysql-test/main/mdev-21101.test b/mysql-test/main/mdev-21101.test index 9b43c60ec88..627e86462a1 100644 --- a/mysql-test/main/mdev-21101.test +++ b/mysql-test/main/mdev-21101.test @@ -1,3 +1,4 @@ +--source include/not_embedded.inc # Test that wait_timeout does not cause connection to be closed, when connection is delayed due to # threadpool internal problems, e.g misconfiguration - too few threads and queueing. # So if client did not cause wait_timeout, do not report it either. From c3958ae407016d7dde8b04ffbacf949c62b2e4eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Lindstr=C3=B6m?= Date: Wed, 29 Jul 2020 12:43:38 +0300 Subject: [PATCH 166/188] Enable test for testing. --- mysql-test/suite/galera/disabled.def | 1 - 1 file changed, 1 deletion(-) diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index fb06cde5294..221d55934dd 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -44,7 +44,6 @@ galera_var_reject_queries : assertion in inline_mysql_socket_send galera_var_retry_autocommit: MDEV-18181 Galera test failure on galera.galera_var_retry_autocommit galera_wan : MDEV-17259 Test failure on galera.galera_wan lp1376747-4 : MDEV-21911 Galera test failure on lp1376747-4 -mysql-wsrep#198 : MDEV-18935 Galera test mysql-wsrep#198 sporaric assertion transaction.cpp:362: int wsrep::transaction::before_commit(): Assertion `state() == s_executing || state() == s_committing || state() == s_must_abort || state() == s_replaying' failed. partition : MDEV-19958 Galera test failure on galera.partition query_cache: MDEV-15805 Test failure on galera.query_cache sql_log_bin : MDEV-21491 galera.sql_log_bin From c69520c9dfa6e4a26258842a1d3512c2b5d43d56 Mon Sep 17 00:00:00 2001 From: Krunal Bauskar Date: Wed, 29 Jul 2020 23:27:25 +0800 Subject: [PATCH 167/188] MDEV-23030: ARM crash on Raspberry Pi 4 MariaDB adopted a hardware optimized crc32c approach on ARM64 starting 10.5. Said implementation of crc32c needs support from target hardware for crc32 and pmull instructions. Existing logic is checking only for crc32 support from target hardware through a runtime check and so if target hardware doesn't support pmull it would cause things to fail/crash. Expanded runtime check to ensure pmull support is also checked on the target hardware along with existing crc32. Thanks to Marko and Daniel for review. --- include/my_sys.h | 3 +++ mysys/CMakeLists.txt | 3 ++- mysys/crc32/crc32_arm64.c | 13 +++++++++++++ storage/innobase/ut/ut0crc32.cc | 6 +++--- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/include/my_sys.h b/include/my_sys.h index 3acc1487f95..d2aaa5192a4 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -911,6 +911,9 @@ extern MYSQL_PLUGIN_IMPORT my_crc32_t my_checksum; #if defined(__GNUC__) && defined(HAVE_ARMV8_CRC) int crc32_aarch64_available(void); +#if defined(HAVE_ARMV8_CRYPTO) +int crc32c_aarch64_available(void); +#endif #endif #ifdef DBUG_ASSERT_EXISTS diff --git a/mysys/CMakeLists.txt b/mysys/CMakeLists.txt index 3d8a20e4f9a..14a4ea9e9bb 100644 --- a/mysys/CMakeLists.txt +++ b/mysys/CMakeLists.txt @@ -90,7 +90,8 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64") __asm__(\"pmull v2.1q, v2.1d, v1.1d\"); return ret; } - int main() { foo(0); }" HAVE_ARMV8_CRYPTO) + #include + int main() { foo(0); getauxval(AT_HWCAP); }" HAVE_ARMV8_CRYPTO) CHECK_C_COMPILER_FLAG(-march=armv8-a+crc+crypto HAVE_ARMV8_CRC_CRYPTO_INTRINSICS) IF(HAVE_ARMV8_CRC_CRYPTO_INTRINSICS) diff --git a/mysys/crc32/crc32_arm64.c b/mysys/crc32/crc32_arm64.c index 09ac7a12a66..aae6f769002 100644 --- a/mysys/crc32/crc32_arm64.c +++ b/mysys/crc32/crc32_arm64.c @@ -18,8 +18,21 @@ int crc32_aarch64_available(void) unsigned long auxv= getauxval(AT_HWCAP); return (auxv & HWCAP_CRC32) != 0; } + +#if defined(HAVE_ARMV8_CRYPTO) + +#ifndef HWCAP_PMULL +#define HWCAP_PMULL (1 << 4) #endif +/* Check if target ARM machine support crc32 + pmull for computing crc32c */ +int crc32c_aarch64_available(void) +{ + return !(~getauxval(AT_HWCAP) & (HWCAP_CRC32 | HWCAP_PMULL)); +} +#endif /* HAVE_ARMV8_CRYPTO */ +#endif /* HAVE_ARMV8_CRC */ + #ifndef HAVE_ARMV8_CRC_CRYPTO_INTRINSICS /* Request crc extension capabilities from the assembler */ diff --git a/storage/innobase/ut/ut0crc32.cc b/storage/innobase/ut/ut0crc32.cc index dabf92e875b..9de0ca81fe3 100644 --- a/storage/innobase/ut/ut0crc32.cc +++ b/storage/innobase/ut/ut0crc32.cc @@ -342,11 +342,11 @@ allocations, would not hurt if called twice, but would be pointless. */ void ut_crc32_init() { #ifndef HAVE_CRC32_VPMSUM -# if defined(__GNUC__) && defined(HAVE_ARMV8_CRC) - if (crc32_aarch64_available()) +# if defined(__GNUC__) && defined(HAVE_ARMV8_CRC) && defined(HAVE_ARMV8_CRYPTO) + if (crc32c_aarch64_available()) { ut_crc32_low= crc32c_aarch64; - ut_crc32_implementation= "Using ARMv8 crc32 instructions"; + ut_crc32_implementation= "Using ARMv8 crc32 + pmull instructions"; return; } # elif defined(TRY_SSE4_2) From 6053eb1ce278ac1f566cd74498506bf457d6d048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Thu, 30 Jul 2020 18:40:47 +0300 Subject: [PATCH 168/188] MDEV-23334 Crash in rec_get_nth_cfield()/rec_offs_validate() rec_get_nth_cfield(): Remove a bogus debug assertion. The function may be invoked by innobase_rec_to_mysql() for reporting a duplicate key error during CREATE UNIQUE INDEX or ALTER TABLE...ADD UNIQUE KEY, and in that case the record will be missing the 5-byte or 6-byte fixed header. It turns out that in every other code path leading to rec_get_nth_cfield() we either invoked rec_get_offsets() ourselves or asserted rec_offs_validate(). So, we can safely remove the assertion and make debug builds smaller and faster. --- storage/innobase/include/rem0rec.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/storage/innobase/include/rem0rec.h b/storage/innobase/include/rem0rec.h index 2a522ae4837..acf8896b225 100644 --- a/storage/innobase/include/rem0rec.h +++ b/storage/innobase/include/rem0rec.h @@ -829,7 +829,11 @@ rec_get_nth_cfield( ulint n, ulint* len) { - ut_ad(rec_offs_validate(rec, index, offsets)); + /* Because this function may be invoked by innobase_rec_to_mysql() + for reporting a duplicate key during ALTER TABLE or + CREATE UNIQUE INDEX, and in that case the rec omit the fixed-size + header of 5 or 6 bytes, the check + rec_offs_validate(rec, index, offsets) must be avoided here. */ if (!rec_offs_nth_default(offsets, n)) { return rec_get_nth_field(rec, offsets, n, len); } From a874b6c4459a2dd028d6c4a15e43eeb556183de0 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Thu, 30 Jul 2020 14:30:21 +0400 Subject: [PATCH 169/188] MDEV-23337 Rounding functions create a wrong data type for integer input 1. Fixing ROUND(x) and TRUNCATE(x,0) with TINYINT, SMALLINT, MEDIUMINT, BIGINT input to preserve the exact data type of the argument when it's possible. 2. Fixing FLOOR(x) and CEILING(x) with TINYINT, SMALLINT, MEDIUMINT, BIGINT to preserve the exact data type of the argument. 3. Adding dedicated Type_handler_year::Item_func_round_fix_length_and_dec() to easier handle ROUND(x) and TRUNCATE(x,y) for the YEAR(2) and YEAR(4) input. They still return INT(2) UNSIGNED and INT(4) UNSIGNED correspondingly, as before. --- mysql-test/main/metadata.result | 40 +++--- mysql-test/main/type_int.result | 216 +++++++++++++++++++++++++++++++ mysql-test/main/type_int.test | 35 +++++ mysql-test/main/type_year.result | 27 ++++ mysql-test/main/type_year.test | 15 +++ sql/item_func.cc | 50 ++++++- sql/item_func.h | 2 +- sql/sql_type.cc | 24 +++- sql/sql_type.h | 2 + 9 files changed, 381 insertions(+), 30 deletions(-) diff --git a/mysql-test/main/metadata.result b/mysql-test/main/metadata.result index 1f917bfe5ab..0704f5b8ae8 100644 --- a/mysql-test/main/metadata.result +++ b/mysql-test/main/metadata.result @@ -715,16 +715,16 @@ CEILING(11111111), CEILING(111111111), CEILING(1111111111) LIMIT 0; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def CEILING(1) 3 3 0 N 32897 0 63 -def CEILING(11) 3 4 0 N 32897 0 63 -def CEILING(111) 3 5 0 N 32897 0 63 -def CEILING(1111) 3 6 0 N 32897 0 63 -def CEILING(11111) 3 7 0 N 32897 0 63 -def CEILING(111111) 3 8 0 N 32897 0 63 -def CEILING(1111111) 3 9 0 N 32897 0 63 -def CEILING(11111111) 8 10 0 N 32897 0 63 -def CEILING(111111111) 8 11 0 N 32897 0 63 -def CEILING(1111111111) 8 12 0 N 32897 0 63 +def CEILING(1) 3 1 0 N 32897 0 63 +def CEILING(11) 3 2 0 N 32897 0 63 +def CEILING(111) 3 3 0 N 32897 0 63 +def CEILING(1111) 3 4 0 N 32897 0 63 +def CEILING(11111) 3 5 0 N 32897 0 63 +def CEILING(111111) 3 6 0 N 32897 0 63 +def CEILING(1111111) 3 7 0 N 32897 0 63 +def CEILING(11111111) 3 8 0 N 32897 0 63 +def CEILING(111111111) 3 9 0 N 32897 0 63 +def CEILING(1111111111) 8 10 0 N 32897 0 63 CEILING(1) CEILING(11) CEILING(111) CEILING(1111) CEILING(11111) CEILING(111111) CEILING(1111111) CEILING(11111111) CEILING(111111111) CEILING(1111111111) SELECT FLOOR(1), @@ -738,16 +738,16 @@ FLOOR(11111111), FLOOR(111111111), FLOOR(1111111111) LIMIT 0; Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def FLOOR(1) 3 3 0 N 32897 0 63 -def FLOOR(11) 3 4 0 N 32897 0 63 -def FLOOR(111) 3 5 0 N 32897 0 63 -def FLOOR(1111) 3 6 0 N 32897 0 63 -def FLOOR(11111) 3 7 0 N 32897 0 63 -def FLOOR(111111) 3 8 0 N 32897 0 63 -def FLOOR(1111111) 3 9 0 N 32897 0 63 -def FLOOR(11111111) 8 10 0 N 32897 0 63 -def FLOOR(111111111) 8 11 0 N 32897 0 63 -def FLOOR(1111111111) 8 12 0 N 32897 0 63 +def FLOOR(1) 3 1 0 N 32897 0 63 +def FLOOR(11) 3 2 0 N 32897 0 63 +def FLOOR(111) 3 3 0 N 32897 0 63 +def FLOOR(1111) 3 4 0 N 32897 0 63 +def FLOOR(11111) 3 5 0 N 32897 0 63 +def FLOOR(111111) 3 6 0 N 32897 0 63 +def FLOOR(1111111) 3 7 0 N 32897 0 63 +def FLOOR(11111111) 3 8 0 N 32897 0 63 +def FLOOR(111111111) 3 9 0 N 32897 0 63 +def FLOOR(1111111111) 8 10 0 N 32897 0 63 FLOOR(1) FLOOR(11) FLOOR(111) FLOOR(1111) FLOOR(11111) FLOOR(111111) FLOOR(1111111) FLOOR(11111111) FLOOR(111111111) FLOOR(1111111111) SELECT ROUND(1), diff --git a/mysql-test/main/type_int.result b/mysql-test/main/type_int.result index 0d744f6a97b..609889cd5e8 100644 --- a/mysql-test/main/type_int.result +++ b/mysql-test/main/type_int.result @@ -412,5 +412,221 @@ COUNT(*) 0 DROP TABLE t1; # +# MDEV-23337 Rounding functions create a wrong data type for numeric input +# +CREATE PROCEDURE p1(t VARCHAR(64)) +BEGIN +SELECT t AS ``; +EXECUTE IMMEDIATE REPLACE('CREATE TABLE t1 (a TYPE)', 'TYPE', t); +INSERT IGNORE INTO t1 VALUES (-100000000000000000000000000000); +INSERT IGNORE INTO t1 VALUES (100000000000000000000000000000); +CREATE TABLE t2 AS SELECT a, ROUND(a), TRUNCATE(a,0), FLOOR(a), CEILING(a) FROM t1; +SHOW CREATE TABLE t2; +SELECT * FROM t2; +DROP TABLE t1, t2; +END; +$$ +CALL p1('tinyint'); + tinyint +Table t2 +Create Table CREATE TABLE `t2` ( + `a` tinyint(4) DEFAULT NULL, + `ROUND(a)` tinyint(4) DEFAULT NULL, + `TRUNCATE(a,0)` tinyint(4) DEFAULT NULL, + `FLOOR(a)` tinyint(4) DEFAULT NULL, + `CEILING(a)` tinyint(4) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a -128 +ROUND(a) -128 +TRUNCATE(a,0) -128 +FLOOR(a) -128 +CEILING(a) -128 +a 127 +ROUND(a) 127 +TRUNCATE(a,0) 127 +FLOOR(a) 127 +CEILING(a) 127 +CALL p1('smallint'); + smallint +Table t2 +Create Table CREATE TABLE `t2` ( + `a` smallint(6) DEFAULT NULL, + `ROUND(a)` smallint(6) DEFAULT NULL, + `TRUNCATE(a,0)` smallint(6) DEFAULT NULL, + `FLOOR(a)` smallint(6) DEFAULT NULL, + `CEILING(a)` smallint(6) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a -32768 +ROUND(a) -32768 +TRUNCATE(a,0) -32768 +FLOOR(a) -32768 +CEILING(a) -32768 +a 32767 +ROUND(a) 32767 +TRUNCATE(a,0) 32767 +FLOOR(a) 32767 +CEILING(a) 32767 +CALL p1('mediumint'); + mediumint +Table t2 +Create Table CREATE TABLE `t2` ( + `a` mediumint(9) DEFAULT NULL, + `ROUND(a)` mediumint(9) DEFAULT NULL, + `TRUNCATE(a,0)` mediumint(9) DEFAULT NULL, + `FLOOR(a)` mediumint(9) DEFAULT NULL, + `CEILING(a)` mediumint(9) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a -8388608 +ROUND(a) -8388608 +TRUNCATE(a,0) -8388608 +FLOOR(a) -8388608 +CEILING(a) -8388608 +a 8388607 +ROUND(a) 8388607 +TRUNCATE(a,0) 8388607 +FLOOR(a) 8388607 +CEILING(a) 8388607 +CALL p1('int'); + int +Table t2 +Create Table CREATE TABLE `t2` ( + `a` int(11) DEFAULT NULL, + `ROUND(a)` int(11) DEFAULT NULL, + `TRUNCATE(a,0)` int(11) DEFAULT NULL, + `FLOOR(a)` int(11) DEFAULT NULL, + `CEILING(a)` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a -2147483648 +ROUND(a) -2147483648 +TRUNCATE(a,0) -2147483648 +FLOOR(a) -2147483648 +CEILING(a) -2147483648 +a 2147483647 +ROUND(a) 2147483647 +TRUNCATE(a,0) 2147483647 +FLOOR(a) 2147483647 +CEILING(a) 2147483647 +CALL p1('bigint'); + bigint +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bigint(20) DEFAULT NULL, + `ROUND(a)` bigint(20) DEFAULT NULL, + `TRUNCATE(a,0)` bigint(20) DEFAULT NULL, + `FLOOR(a)` bigint(20) DEFAULT NULL, + `CEILING(a)` bigint(20) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a -9223372036854775808 +ROUND(a) -9223372036854775808 +TRUNCATE(a,0) -9223372036854775808 +FLOOR(a) -9223372036854775808 +CEILING(a) -9223372036854775808 +a 9223372036854775807 +ROUND(a) 9223372036854775807 +TRUNCATE(a,0) 9223372036854775807 +FLOOR(a) 9223372036854775807 +CEILING(a) 9223372036854775807 +CALL p1('tinyint unsigned'); + tinyint unsigned +Table t2 +Create Table CREATE TABLE `t2` ( + `a` tinyint(3) unsigned DEFAULT NULL, + `ROUND(a)` tinyint(3) unsigned DEFAULT NULL, + `TRUNCATE(a,0)` tinyint(3) unsigned DEFAULT NULL, + `FLOOR(a)` tinyint(3) unsigned DEFAULT NULL, + `CEILING(a)` tinyint(3) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 0 +ROUND(a) 0 +TRUNCATE(a,0) 0 +FLOOR(a) 0 +CEILING(a) 0 +a 255 +ROUND(a) 255 +TRUNCATE(a,0) 255 +FLOOR(a) 255 +CEILING(a) 255 +CALL p1('smallint unsigned'); + smallint unsigned +Table t2 +Create Table CREATE TABLE `t2` ( + `a` smallint(5) unsigned DEFAULT NULL, + `ROUND(a)` smallint(5) unsigned DEFAULT NULL, + `TRUNCATE(a,0)` smallint(5) unsigned DEFAULT NULL, + `FLOOR(a)` smallint(5) unsigned DEFAULT NULL, + `CEILING(a)` smallint(5) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 0 +ROUND(a) 0 +TRUNCATE(a,0) 0 +FLOOR(a) 0 +CEILING(a) 0 +a 65535 +ROUND(a) 65535 +TRUNCATE(a,0) 65535 +FLOOR(a) 65535 +CEILING(a) 65535 +CALL p1('mediumint unsigned'); + mediumint unsigned +Table t2 +Create Table CREATE TABLE `t2` ( + `a` mediumint(8) unsigned DEFAULT NULL, + `ROUND(a)` mediumint(8) unsigned DEFAULT NULL, + `TRUNCATE(a,0)` mediumint(8) unsigned DEFAULT NULL, + `FLOOR(a)` mediumint(8) unsigned DEFAULT NULL, + `CEILING(a)` mediumint(8) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 0 +ROUND(a) 0 +TRUNCATE(a,0) 0 +FLOOR(a) 0 +CEILING(a) 0 +a 16777215 +ROUND(a) 16777215 +TRUNCATE(a,0) 16777215 +FLOOR(a) 16777215 +CEILING(a) 16777215 +CALL p1('int unsigned'); + int unsigned +Table t2 +Create Table CREATE TABLE `t2` ( + `a` int(10) unsigned DEFAULT NULL, + `ROUND(a)` int(10) unsigned DEFAULT NULL, + `TRUNCATE(a,0)` int(10) unsigned DEFAULT NULL, + `FLOOR(a)` int(10) unsigned DEFAULT NULL, + `CEILING(a)` int(10) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 0 +ROUND(a) 0 +TRUNCATE(a,0) 0 +FLOOR(a) 0 +CEILING(a) 0 +a 4294967295 +ROUND(a) 4294967295 +TRUNCATE(a,0) 4294967295 +FLOOR(a) 4294967295 +CEILING(a) 4294967295 +CALL p1('bigint unsigned'); + bigint unsigned +Table t2 +Create Table CREATE TABLE `t2` ( + `a` bigint(20) unsigned DEFAULT NULL, + `ROUND(a)` bigint(20) unsigned DEFAULT NULL, + `TRUNCATE(a,0)` bigint(20) unsigned DEFAULT NULL, + `FLOOR(a)` bigint(20) unsigned DEFAULT NULL, + `CEILING(a)` bigint(20) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +a 0 +ROUND(a) 0 +TRUNCATE(a,0) 0 +FLOOR(a) 0 +CEILING(a) 0 +a 18446744073709551615 +ROUND(a) 18446744073709551615 +TRUNCATE(a,0) 18446744073709551615 +FLOOR(a) 18446744073709551615 +CEILING(a) 18446744073709551615 +DROP PROCEDURE p1; +# # End of 10.4 tests # diff --git a/mysql-test/main/type_int.test b/mysql-test/main/type_int.test index 662be57abd3..4822f22521f 100644 --- a/mysql-test/main/type_int.test +++ b/mysql-test/main/type_int.test @@ -293,6 +293,41 @@ SELECT COUNT(*) FROM t1 WHERE a XOR a; DROP TABLE t1; +--echo # +--echo # MDEV-23337 Rounding functions create a wrong data type for numeric input +--echo # + +DELIMITER $$; +CREATE PROCEDURE p1(t VARCHAR(64)) +BEGIN + SELECT t AS ``; + EXECUTE IMMEDIATE REPLACE('CREATE TABLE t1 (a TYPE)', 'TYPE', t); + INSERT IGNORE INTO t1 VALUES (-100000000000000000000000000000); + INSERT IGNORE INTO t1 VALUES (100000000000000000000000000000); + CREATE TABLE t2 AS SELECT a, ROUND(a), TRUNCATE(a,0), FLOOR(a), CEILING(a) FROM t1; + SHOW CREATE TABLE t2; + SELECT * FROM t2; + DROP TABLE t1, t2; +END; +$$ +DELIMITER ;$$ + +--vertical_results +CALL p1('tinyint'); +CALL p1('smallint'); +CALL p1('mediumint'); +CALL p1('int'); +CALL p1('bigint'); + +CALL p1('tinyint unsigned'); +CALL p1('smallint unsigned'); +CALL p1('mediumint unsigned'); +CALL p1('int unsigned'); +CALL p1('bigint unsigned'); +--horizontal_results + +DROP PROCEDURE p1; + --echo # --echo # End of 10.4 tests --echo # diff --git a/mysql-test/main/type_year.result b/mysql-test/main/type_year.result index 71285418588..583a2818e02 100644 --- a/mysql-test/main/type_year.result +++ b/mysql-test/main/type_year.result @@ -585,5 +585,32 @@ COALESCE(a) DATE(COALESCE(a)) NULL NULL DROP TABLE t1; # +# MDEV-23337 Rounding functions create a wrong data type for numeric input +# +CREATE TABLE t1 (a YEAR(2)); +Warnings: +Note 1287 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead +CREATE TABLE t2 AS SELECT a, ROUND(a), TRUNCATE(a,0), FLOOR(a), CEILING(a) FROM t1; +Warnings: +Note 1287 'YEAR(2)' is deprecated and will be removed in a future release. Please use YEAR(4) instead +DESC t2; +Field Type Null Key Default Extra +a year(2) YES NULL +ROUND(a) int(2) unsigned YES NULL +TRUNCATE(a,0) int(2) unsigned YES NULL +FLOOR(a) int(2) unsigned YES NULL +CEILING(a) int(2) unsigned YES NULL +DROP TABLE t2,t1; +CREATE TABLE t1 (a YEAR(4)); +CREATE TABLE t2 AS SELECT a, ROUND(a), TRUNCATE(a,0), FLOOR(a), CEILING(a) FROM t1; +DESC t2; +Field Type Null Key Default Extra +a year(4) YES NULL +ROUND(a) int(4) unsigned YES NULL +TRUNCATE(a,0) int(4) unsigned YES NULL +FLOOR(a) int(4) unsigned YES NULL +CEILING(a) int(4) unsigned YES NULL +DROP TABLE t2,t1; +# # End of 10.4 tests # diff --git a/mysql-test/main/type_year.test b/mysql-test/main/type_year.test index 3c578b3ab59..19692148146 100644 --- a/mysql-test/main/type_year.test +++ b/mysql-test/main/type_year.test @@ -326,6 +326,21 @@ INSERT INTO t1 VALUES (NULL); SELECT COALESCE(a), DATE(COALESCE(a)) FROM t1; DROP TABLE t1; +--echo # +--echo # MDEV-23337 Rounding functions create a wrong data type for numeric input +--echo # + +CREATE TABLE t1 (a YEAR(2)); +CREATE TABLE t2 AS SELECT a, ROUND(a), TRUNCATE(a,0), FLOOR(a), CEILING(a) FROM t1; +DESC t2; +DROP TABLE t2,t1; + +CREATE TABLE t1 (a YEAR(4)); +CREATE TABLE t2 AS SELECT a, ROUND(a), TRUNCATE(a,0), FLOOR(a), CEILING(a) FROM t1; +DESC t2; +DROP TABLE t2,t1; + + --echo # --echo # End of 10.4 tests --echo # diff --git a/sql/item_func.cc b/sql/item_func.cc index 9f934a95f4d..8e36804888b 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2446,8 +2446,24 @@ void Item_func_round::fix_arg_datetime() } -void Item_func_round::fix_arg_int() +/** + Calculate data type and attributes for INT-alike input. + + @param [IN] preferred - The preferred data type handler for simple cases + such as ROUND(x) and TRUNCATE(x,0), when the input + is short enough to fit into an integer type + (without extending to DECIMAL). + - If `preferred` is not NULL, then the code tries + to preserve the given data type handler and + data type attributes of the argument. + - If `preferred` is NULL, then the code fully + calculates attributes using + args[0]->decimal_precision() and chooses between + INT and BIGINT, depending on attributes. +*/ +void Item_func_round::fix_arg_int(const Type_handler *preferred) { + DBUG_ASSERT(args[0]->decimals == 0); if (args[1]->const_item()) { Longlong_hybrid val1= args[1]->to_longlong_hybrid(); @@ -2456,13 +2472,35 @@ void Item_func_round::fix_arg_int() else if ((!val1.to_uint(DECIMAL_MAX_SCALE) && truncate) || args[0]->decimal_precision() < DECIMAL_LONGLONG_DIGITS) { + // Here we can keep INT_RESULT // Length can increase in some cases: ROUND(9,-1) -> 10 int length_can_increase= MY_TEST(!truncate && val1.neg()); - max_length= args[0]->decimal_precision() + length_can_increase; - // Here we can keep INT_RESULT - unsigned_flag= args[0]->unsigned_flag; - decimals= 0; - set_handler(type_handler_long_or_longlong()); + if (preferred) + { + Type_std_attributes::set(args[0]); + if (!length_can_increase) + { + // Preserve the exact data type and attributes + set_handler(preferred); + } + else + { + max_length++; + set_handler(type_handler_long_or_longlong()); + } + } + else + { + /* + This branch is currently used for hex hybrid only. + It's known to be unsigned. So sign length is 0. + */ + DBUG_ASSERT(args[0]->unsigned_flag); // no needs to add sign length + max_length= args[0]->decimal_precision() + length_can_increase; + unsigned_flag= true; + decimals= 0; + set_handler(type_handler_long_or_longlong()); + } } else fix_length_and_dec_decimal(val1.to_uint(DECIMAL_MAX_SCALE)); diff --git a/sql/item_func.h b/sql/item_func.h index d1ebf98ccda..549e576dbd3 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -1774,7 +1774,7 @@ public: return NULL; } void fix_arg_decimal(); - void fix_arg_int(); + void fix_arg_int(const Type_handler *preferred); void fix_arg_double(); void fix_arg_time(); void fix_arg_datetime(); diff --git a/sql/sql_type.cc b/sql/sql_type.cc index 88afc51564d..ee25a6c4fc5 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -5659,7 +5659,15 @@ bool Type_handler_row:: bool Type_handler_int_result:: Item_func_round_fix_length_and_dec(Item_func_round *item) const { - item->fix_arg_int(); + item->fix_arg_int(this); + return false; +} + + +bool Type_handler_year:: + Item_func_round_fix_length_and_dec(Item_func_round *item) const +{ + item->fix_arg_int(&type_handler_long); // 10.5 merge: fix to type_handler_ulong return false; } @@ -5667,7 +5675,7 @@ bool Type_handler_int_result:: bool Type_handler_hex_hybrid:: Item_func_round_fix_length_and_dec(Item_func_round *item) const { - item->fix_arg_int(); + item->fix_arg_int(NULL); return false; } @@ -5766,7 +5774,17 @@ bool Type_handler_row:: bool Type_handler_int_result:: Item_func_int_val_fix_length_and_dec(Item_func_int_val *item) const { - item->fix_length_and_dec_int_or_decimal(); + item->Type_std_attributes::set(item->arguments()[0]); + item->set_handler(this); + return false; +} + + +bool Type_handler_year:: + Item_func_int_val_fix_length_and_dec(Item_func_int_val *item) const +{ + item->Type_std_attributes::set(item->arguments()[0]); + item->set_handler(&type_handler_long); return false; } diff --git a/sql/sql_type.h b/sql/sql_type.h index d6828832bf1..dd3319dce5c 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -5124,6 +5124,8 @@ public: const Column_definition_attributes *attr, uint32 flags) const; Item_cache *Item_get_cache(THD *thd, const Item *item) const; + bool Item_func_round_fix_length_and_dec(Item_func_round *) const; + bool Item_func_int_val_fix_length_and_dec(Item_func_int_val *) const; void Item_get_date(THD *thd, Item *item, Temporal::Warn *warn, MYSQL_TIME *ltime, date_mode_t fuzzydate) const; void Item_func_hybrid_field_type_get_date(THD *, From 78f09b12d368b7b01e9dc09f84c19b3a3d6bad91 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 23 Jul 2020 16:17:59 +0200 Subject: [PATCH 170/188] MDEV-23009 SIGSEGV in get_field from acl_load (on optimized builds) Classes that handle privilege tables (like Tables_priv_table) could read some columns conditionally but they expect a certain minimal number of colunms always to exist. Add a check for a minimal required number of columns in privilege tables, don't use a table that has fewer columns than required. --- mysql-test/main/grant4.result | 2 +- mysql-test/main/grant5.result | 6 ++++++ mysql-test/main/grant5.test | 10 ++++++++++ sql/sql_acl.cc | 37 ++++++++++++++++++++--------------- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/mysql-test/main/grant4.result b/mysql-test/main/grant4.result index f252a4c2ad5..29021b608aa 100644 --- a/mysql-test/main/grant4.result +++ b/mysql-test/main/grant4.result @@ -148,7 +148,7 @@ call mtr.add_suppression('mysql.user table is damaged'); rename table mysql.user to mysql.user1; create table mysql.user (Host char(100), User char(100)); flush privileges; -ERROR HY000: Unknown error +ERROR HY000: Fatal error: mysql.user table is damaged or in unsupported 3.20 format drop table mysql.user; rename table mysql.user1 to mysql.user; # switching back from mysql.user to mysql.global_priv diff --git a/mysql-test/main/grant5.result b/mysql-test/main/grant5.result index df09b1fcc64..2cc1c11f7d8 100644 --- a/mysql-test/main/grant5.result +++ b/mysql-test/main/grant5.result @@ -242,4 +242,10 @@ disconnect con1; connection default; drop database db; drop user foo; +call mtr.add_suppression('mysql.host table is damaged'); +create table mysql.host (c1 int); +insert mysql.host values (1); +flush privileges; +ERROR HY000: Fatal error: mysql.host table is damaged or in unsupported 3.20 format +drop table mysql.host; # End of 10.4 tests diff --git a/mysql-test/main/grant5.test b/mysql-test/main/grant5.test index 39fcff92435..054b16c0a6e 100644 --- a/mysql-test/main/grant5.test +++ b/mysql-test/main/grant5.test @@ -199,4 +199,14 @@ delete from db.t1 returning *; drop database db; drop user foo; +# +# MDEV-23009 SIGSEGV in get_field from acl_load (on optimized builds) +# +call mtr.add_suppression('mysql.host table is damaged'); +create table mysql.host (c1 int); +insert mysql.host values (1); +--error ER_UNKNOWN_ERROR +flush privileges; +drop table mysql.host; + --echo # End of 10.4 tests diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 8e17958a8a1..11238fd573d 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -790,6 +790,15 @@ class Grant_table_base bool init_read_record(READ_RECORD* info) const { DBUG_ASSERT(m_table); + + if (num_fields() < min_columns) + { + my_printf_error(ER_UNKNOWN_ERROR, "Fatal error: mysql.%s table is " + "damaged or in unsupported 3.20 format", + MYF(ME_ERROR_LOG), m_table->s->table_name.str); + return 1; + } + bool result= ::init_read_record(info, m_table->in_use, m_table, NULL, NULL, 1, true, false); if (!result) @@ -814,7 +823,7 @@ class Grant_table_base protected: friend class Grant_tables; - Grant_table_base() : start_priv_columns(0), end_priv_columns(0), m_table(0) + Grant_table_base() : min_columns(3), start_priv_columns(0), end_priv_columns(0), m_table(0) { } /* Compute how many privilege columns this table has. This method @@ -843,6 +852,9 @@ class Grant_table_base } } + + /* the min number of columns a table should have */ + uint min_columns; /* The index at which privilege columns start. */ uint start_priv_columns; /* The index after the last privilege column */ @@ -1241,7 +1253,7 @@ class User_table_tabular: public User_table friend class Grant_tables; /* Only Grant_tables can instantiate this class. */ - User_table_tabular() {} + User_table_tabular() { min_columns= 13; /* As in 3.20.13 */ } /* The user table is a bit different compared to the other Grant tables. Usually, we only add columns to the grant tables when adding functionality. @@ -1263,13 +1275,6 @@ class User_table_tabular: public User_table int setup_sysvars() const { - if (num_fields() < 13) // number of columns in 3.21 - { - sql_print_error("Fatal error: mysql.user table is damaged or in " - "unsupported 3.20 format."); - return 1; - } - username_char_length= MY_MIN(m_table->field[1]->char_length(), USERNAME_CHAR_LENGTH); using_global_priv_table= false; @@ -1701,7 +1706,7 @@ class Db_table: public Grant_table_base private: friend class Grant_tables; - Db_table() {} + Db_table() { min_columns= 9; /* as in 3.20.13 */ } }; class Tables_priv_table: public Grant_table_base @@ -1719,7 +1724,7 @@ class Tables_priv_table: public Grant_table_base private: friend class Grant_tables; - Tables_priv_table() {} + Tables_priv_table() { min_columns= 8; /* as in 3.22.26a */ } }; class Columns_priv_table: public Grant_table_base @@ -1736,7 +1741,7 @@ class Columns_priv_table: public Grant_table_base private: friend class Grant_tables; - Columns_priv_table() {} + Columns_priv_table() { min_columns= 7; /* as in 3.22.26a */ } }; class Host_table: public Grant_table_base @@ -1748,7 +1753,7 @@ class Host_table: public Grant_table_base private: friend class Grant_tables; - Host_table() {} + Host_table() { min_columns= 8; /* as in 3.20.13 */ } }; class Procs_priv_table: public Grant_table_base @@ -1766,7 +1771,7 @@ class Procs_priv_table: public Grant_table_base private: friend class Grant_tables; - Procs_priv_table() {} + Procs_priv_table() { min_columns=8; } }; class Proxies_priv_table: public Grant_table_base @@ -1783,7 +1788,7 @@ class Proxies_priv_table: public Grant_table_base private: friend class Grant_tables; - Proxies_priv_table() {} + Proxies_priv_table() { min_columns= 7; } }; class Roles_mapping_table: public Grant_table_base @@ -1797,7 +1802,7 @@ class Roles_mapping_table: public Grant_table_base private: friend class Grant_tables; - Roles_mapping_table() {} + Roles_mapping_table() { min_columns= 4; } }; /** From 153cd6a27f1b798fea6dee3aecf3a95df561c6fa Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Thu, 23 Jul 2020 18:57:40 +0200 Subject: [PATCH 171/188] MDEV-23237 mariadb.sys has too many privileges don't GRANT UPDATE ON mysql.global_priv TO mariadb.sys@localhost; --- client/mysql_upgrade.c | 1 + mysql-test/main/grant.result | 2 -- mysql-test/main/information_schema.result | 1 - mysql-test/main/upgrade_MDEV-19650.result | 1 - mysql-test/main/view_grant.result | 1 - mysql-test/suite/funcs_1/r/is_table_privileges.result | 1 - mysql-test/suite/roles/set_role-table-column-priv.result | 2 +- mysql-test/suite/roles/set_role-table-simple.result | 2 +- scripts/mysql_system_tables.sql | 2 +- 9 files changed, 4 insertions(+), 9 deletions(-) diff --git a/client/mysql_upgrade.c b/client/mysql_upgrade.c index aa73680a3df..4f3f1ff86da 100644 --- a/client/mysql_upgrade.c +++ b/client/mysql_upgrade.c @@ -887,6 +887,7 @@ static const char *expected_errors[]= "ERROR 1290", /* RR_OPTION_PREVENTS_STATEMENT */ "ERROR 1347", /* 'mysql.user' is not of type 'BASE TABLE' */ "ERROR 1348", /* Column 'Show_db_priv' is not updatable */ + "ERROR 1356", /* definer of view lack rights (UPDATE) */ 0 }; diff --git a/mysql-test/main/grant.result b/mysql-test/main/grant.result index d24f53142d8..456bc251e78 100644 --- a/mysql-test/main/grant.result +++ b/mysql-test/main/grant.result @@ -968,7 +968,6 @@ select * from information_schema.table_privileges; GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE 'mysqltest_8'@'%' def test t1 UPDATE NO 'mariadb.sys'@'localhost' def mysql global_priv SELECT NO -'mariadb.sys'@'localhost' def mysql global_priv UPDATE NO 'mariadb.sys'@'localhost' def mysql global_priv DELETE NO connect conn5,localhost,mysqltest_8,,; select * from t1; @@ -985,7 +984,6 @@ GRANT USAGE ON *.* TO `mysqltest_8`@`%` select * from information_schema.table_privileges; GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE 'mariadb.sys'@'localhost' def mysql global_priv SELECT NO -'mariadb.sys'@'localhost' def mysql global_priv UPDATE NO 'mariadb.sys'@'localhost' def mysql global_priv DELETE NO flush privileges; show grants for mysqltest_8@''; diff --git a/mysql-test/main/information_schema.result b/mysql-test/main/information_schema.result index 697e00635eb..7e38c33e8c5 100644 --- a/mysql-test/main/information_schema.result +++ b/mysql-test/main/information_schema.result @@ -576,7 +576,6 @@ GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME PRIVILEGE_TYPE IS_GRAN select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES; GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE 'mariadb.sys'@'localhost' def mysql global_priv SELECT NO -'mariadb.sys'@'localhost' def mysql global_priv UPDATE NO 'mariadb.sys'@'localhost' def mysql global_priv DELETE NO drop view v1, v2, v3; drop table t1; diff --git a/mysql-test/main/upgrade_MDEV-19650.result b/mysql-test/main/upgrade_MDEV-19650.result index 386c15ae83e..7e8610683e2 100644 --- a/mysql-test/main/upgrade_MDEV-19650.result +++ b/mysql-test/main/upgrade_MDEV-19650.result @@ -165,7 +165,6 @@ GRANTEE TABLE_CATALOG PRIVILEGE_TYPE IS_GRANTABLE SELECT * FROM information_schema.TABLE_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'"; GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE 'mariadb.sys'@'localhost' def mysql global_priv SELECT NO -'mariadb.sys'@'localhost' def mysql global_priv UPDATE NO 'mariadb.sys'@'localhost' def mysql global_priv DELETE NO # check non root CREATE USER 'not_root'@'localhost'; diff --git a/mysql-test/main/view_grant.result b/mysql-test/main/view_grant.result index 263c932097d..954b57db768 100644 --- a/mysql-test/main/view_grant.result +++ b/mysql-test/main/view_grant.result @@ -1344,7 +1344,6 @@ connection default; select * from information_schema.table_privileges; GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE 'mariadb.sys'@'localhost' def mysql global_priv SELECT NO -'mariadb.sys'@'localhost' def mysql global_priv UPDATE NO 'mariadb.sys'@'localhost' def mysql global_priv DELETE NO End of 5.0 tests. connection default; diff --git a/mysql-test/suite/funcs_1/r/is_table_privileges.result b/mysql-test/suite/funcs_1/r/is_table_privileges.result index d4f0de131d1..d7065b54788 100644 --- a/mysql-test/suite/funcs_1/r/is_table_privileges.result +++ b/mysql-test/suite/funcs_1/r/is_table_privileges.result @@ -56,7 +56,6 @@ SELECT table_catalog, table_schema, table_name, privilege_type FROM information_schema.table_privileges WHERE table_catalog IS NOT NULL; table_catalog table_schema table_name privilege_type def mysql global_priv SELECT -def mysql global_priv UPDATE def mysql global_priv DELETE ###################################################################### # Testcase 3.2.11.2+3.2.11.3+3.2.11.4: diff --git a/mysql-test/suite/roles/set_role-table-column-priv.result b/mysql-test/suite/roles/set_role-table-column-priv.result index 9e1d21bab5e..4aaa0388170 100644 --- a/mysql-test/suite/roles/set_role-table-column-priv.result +++ b/mysql-test/suite/roles/set_role-table-column-priv.result @@ -63,7 +63,7 @@ ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for table 'ro drop user 'test_user'@'localhost'; select * from mysql.tables_priv; Host Db User Table_name Grantor Timestamp Table_priv Column_priv -localhost mysql mariadb.sys global_priv root@localhost 0000-00-00 00:00:00 Select,Update,Delete +localhost mysql mariadb.sys global_priv root@localhost 0000-00-00 00:00:00 Select,Delete mysql test_role2 roles_mapping root@localhost 0000-00-00 00:00:00 Select revoke select on mysql.roles_mapping from test_role2; delete from mysql.user where user like'test_%'; diff --git a/mysql-test/suite/roles/set_role-table-simple.result b/mysql-test/suite/roles/set_role-table-simple.result index 107ca726e22..f33df34d85e 100644 --- a/mysql-test/suite/roles/set_role-table-simple.result +++ b/mysql-test/suite/roles/set_role-table-simple.result @@ -61,7 +61,7 @@ ERROR 42000: SELECT command denied to user 'test_user'@'localhost' for table 'ro drop user 'test_user'@'localhost'; select * from mysql.tables_priv; Host Db User Table_name Grantor Timestamp Table_priv Column_priv -localhost mysql mariadb.sys global_priv root@localhost 0000-00-00 00:00:00 Select,Update,Delete +localhost mysql mariadb.sys global_priv root@localhost 0000-00-00 00:00:00 Select,Delete mysql test_role2 roles_mapping root@localhost 0000-00-00 00:00:00 Select revoke select on mysql.roles_mapping from test_role2; delete from mysql.user where user like'test_%'; diff --git a/scripts/mysql_system_tables.sql b/scripts/mysql_system_tables.sql index f81aa290100..d4d16c74c11 100644 --- a/scripts/mysql_system_tables.sql +++ b/scripts/mysql_system_tables.sql @@ -116,7 +116,7 @@ CREATE TABLE IF NOT EXISTS servers ( Server_name char(64) NOT NULL DEFAULT '', H CREATE TABLE IF NOT EXISTS tables_priv ( Host char(60) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(80) binary DEFAULT '' NOT NULL, Table_name char(64) binary DEFAULT '' NOT NULL, Grantor char(141) DEFAULT '' NOT NULL, Timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger','Delete versioning rows') COLLATE utf8_general_ci DEFAULT '' NOT NULL, Column_priv set('Select','Insert','Update','References') COLLATE utf8_general_ci DEFAULT '' NOT NULL, PRIMARY KEY (Host,Db,User,Table_name), KEY Grantor (Grantor) ) engine=Aria transactional=1 CHARACTER SET utf8 COLLATE utf8_bin comment='Table privileges'; CREATE TEMPORARY TABLE tmp_user_sys LIKE tables_priv; -INSERT INTO tmp_user_sys (Host,Db,User,Table_name,Grantor,Timestamp,Table_priv) VALUES ('localhost','mysql','mariadb.sys','global_priv','root@localhost','0','Select,Update,Delete'); +INSERT INTO tmp_user_sys (Host,Db,User,Table_name,Grantor,Timestamp,Table_priv) VALUES ('localhost','mysql','mariadb.sys','global_priv','root@localhost','0','Select,Delete'); INSERT INTO tables_priv SELECT * FROM tmp_user_sys WHERE 0 <> @need_sys_user_creation; DROP TABLE tmp_user_sys; From 91ebf1844f4fbc36edb66023332a045895d07cf5 Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Tue, 28 Jul 2020 23:45:51 +1000 Subject: [PATCH 172/188] MDEV-19338 InnoDB: Failing assertion: !cursor->index->is_committed() Call mark_columns_per_binlog_row_image before find_row() to set up table->vcol_set early, so the virtual column value will be updated after record read (ha_rnd_pos/ha_index_next/etc) by table->update_virtual_fields() call --- mysql-test/suite/rpl/r/rpl_row_virt.result | 20 ++++++++++++++++ mysql-test/suite/rpl/t/rpl_row_virt.test | 27 ++++++++++++++++++++++ sql/log_event.cc | 14 +++++------ 3 files changed, 54 insertions(+), 7 deletions(-) create mode 100644 mysql-test/suite/rpl/r/rpl_row_virt.result create mode 100644 mysql-test/suite/rpl/t/rpl_row_virt.test diff --git a/mysql-test/suite/rpl/r/rpl_row_virt.result b/mysql-test/suite/rpl/r/rpl_row_virt.result new file mode 100644 index 00000000000..b670c63d9f1 --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_row_virt.result @@ -0,0 +1,20 @@ +include/master-slave.inc +[connection master] +connection master; +create table t1 ( +id int auto_increment, +data varchar(32), +virt tinyint as (1), +primary key (id), +key virt (virt) +) engine=innodb default charset=utf8mb4; +insert into t1 (data) values ('broken'); +update t1 set data='more broken'; +connection slave; +select * from t1; +id data virt +1 more broken 1 +connection master; +drop table t1; +connection slave; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_row_virt.test b/mysql-test/suite/rpl/t/rpl_row_virt.test new file mode 100644 index 00000000000..e79869cd8e4 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_row_virt.test @@ -0,0 +1,27 @@ +--source include/have_binlog_format_row.inc +--source include/master-slave.inc +--source include/have_innodb.inc +connection master; + +create table t1 ( + id int auto_increment, + data varchar(32), + virt tinyint as (1), + primary key (id), + key virt (virt) +) engine=innodb default charset=utf8mb4; + +insert into t1 (data) values ('broken'); + +update t1 set data='more broken'; + +--sync_slave_with_master + +select * from t1; + +--connection master +drop table t1; + +--sync_slave_with_master + +--source include/rpl_end.inc diff --git a/sql/log_event.cc b/sql/log_event.cc index f9e4365ff94..1c59cca8e83 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -13614,7 +13614,6 @@ end: if (is_table_scan || is_index_scan) issue_long_find_row_warning(get_general_type_code(), m_table->alias.c_ptr(), is_index_scan, rgi); - table->default_column_bitmaps(); DBUG_RETURN(error); } @@ -13928,6 +13927,12 @@ Update_rows_log_event::do_exec_row(rpl_group_info *rgi) #endif /* WSREP_PROC_INFO */ thd_proc_info(thd, message); + // Temporary fix to find out why it fails [/Matz] + memcpy(m_table->read_set->bitmap, m_cols.bitmap, (m_table->read_set->n_bits + 7) / 8); + memcpy(m_table->write_set->bitmap, m_cols_ai.bitmap, (m_table->write_set->n_bits + 7) / 8); + + m_table->mark_columns_per_binlog_row_image(); + int error= find_row(rgi); if (error) { @@ -13997,12 +14002,7 @@ Update_rows_log_event::do_exec_row(rpl_group_info *rgi) error= HA_ERR_GENERIC; // in case if error is not set yet goto err; } - - // Temporary fix to find out why it fails [/Matz] - memcpy(m_table->read_set->bitmap, m_cols.bitmap, (m_table->read_set->n_bits + 7) / 8); - memcpy(m_table->write_set->bitmap, m_cols_ai.bitmap, (m_table->write_set->n_bits + 7) / 8); - - m_table->mark_columns_per_binlog_row_image(); + error= m_table->file->ha_update_row(m_table->record[1], m_table->record[0]); if (error == HA_ERR_RECORD_IS_THE_SAME) error= 0; From fd0abc890f99e2b5ca1b8ae4cb0dc3968eef1208 Mon Sep 17 00:00:00 2001 From: Nikita Malyavin Date: Wed, 29 Jul 2020 01:01:24 +1000 Subject: [PATCH 173/188] MDEV-18042 Server crashes upon adding a non-null date column under NO_ZERO_DATE with ALGORITHM=INPLACE accept table_name and db_name instead of table_share in make_truncated_value_warning --- mysql-test/suite/innodb/r/innodb-alter.result | 17 ++++++++++++++ mysql-test/suite/innodb/t/innodb-alter.test | 22 +++++++++++++++++++ sql/field.cc | 2 +- sql/item.cc | 2 +- sql/item_create.cc | 2 +- sql/item_timefunc.cc | 8 +++---- sql/sql_table.cc | 3 ++- sql/sql_time.cc | 21 +++++++++--------- sql/sql_time.h | 9 +++++--- 9 files changed, 64 insertions(+), 22 deletions(-) diff --git a/mysql-test/suite/innodb/r/innodb-alter.result b/mysql-test/suite/innodb/r/innodb-alter.result index a5361f720ce..80cf14c1725 100644 --- a/mysql-test/suite/innodb/r/innodb-alter.result +++ b/mysql-test/suite/innodb/r/innodb-alter.result @@ -1055,3 +1055,20 @@ SELECT * FROM t1; a b 10 10:20:30 DROP TABLE t1; +# +# MDEV-18042 Server crashes in mysql_alter_table upon adding a non-null +# date column under NO_ZERO_DATE with ALGORITHM=INPLACE +# +SET @OLD_SQL_MODE= @@SQL_MODE; +SET @@SQL_MODE= 'NO_ZERO_DATE'; +CREATE OR REPLACE TABLE t1 (i INT) ENGINE=MyISAM; +ALTER TABLE t1 ADD COLUMN d DATE NOT NULL, ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY +CREATE OR REPLACE TABLE t1 (i INT) ENGINE=InnoDB; +ALTER TABLE t1 ADD d DATETIME NOT NULL CHECK (f <= 0), ALGORITHM=COPY; +ERROR 42S22: Unknown column 'f' in 'CHECK' +CREATE OR REPLACE TABLE t1 (a int) ENGINE=InnoDB; +ALTER TABLE t1 ADD COLUMN b DATETIME NOT NULL, LOCK=NONE; +# Cleanup +SET @@SQL_MODE= @OLD_SQL_MODE; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/innodb-alter.test b/mysql-test/suite/innodb/t/innodb-alter.test index 9bfc1262a1b..aae3f3960a2 100644 --- a/mysql-test/suite/innodb/t/innodb-alter.test +++ b/mysql-test/suite/innodb/t/innodb-alter.test @@ -646,6 +646,28 @@ ALTER TABLE t1 ADD b TIME NOT NULL DEFAULT if(unix_timestamp()>1,TIMESTAMP'2001- SELECT * FROM t1; DROP TABLE t1; +--echo # +--echo # MDEV-18042 Server crashes in mysql_alter_table upon adding a non-null +--echo # date column under NO_ZERO_DATE with ALGORITHM=INPLACE +--echo # + +SET @OLD_SQL_MODE= @@SQL_MODE; +SET @@SQL_MODE= 'NO_ZERO_DATE'; +CREATE OR REPLACE TABLE t1 (i INT) ENGINE=MyISAM; +--error ER_ALTER_OPERATION_NOT_SUPPORTED +ALTER TABLE t1 ADD COLUMN d DATE NOT NULL, ALGORITHM=INPLACE; + +CREATE OR REPLACE TABLE t1 (i INT) ENGINE=InnoDB; +--error ER_BAD_FIELD_ERROR +ALTER TABLE t1 ADD d DATETIME NOT NULL CHECK (f <= 0), ALGORITHM=COPY; + +CREATE OR REPLACE TABLE t1 (a int) ENGINE=InnoDB; +ALTER TABLE t1 ADD COLUMN b DATETIME NOT NULL, LOCK=NONE; + +--echo # Cleanup +SET @@SQL_MODE= @OLD_SQL_MODE; +DROP TABLE t1; + # # End of 10.2 tests # diff --git a/sql/field.cc b/sql/field.cc index 65bd9d22857..9a1779dea5f 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -11059,7 +11059,7 @@ void Field::set_datetime_warning(Sql_condition::enum_warning_level level, THD *thd= get_thd(); if (thd->really_abort_on_warning() && level >= Sql_condition::WARN_LEVEL_WARN) make_truncated_value_warning(thd, level, str, ts_type, - table->s, field_name); + table->s->db.str, table->s->table_name.str, field_name); else set_warning(level, code, cuted_increment); } diff --git a/sql/item.cc b/sql/item.cc index 644bef7524a..2915b0cfb4d 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -3669,7 +3669,7 @@ void Item_param::set_time(MYSQL_TIME *tm, timestamp_type time_type, { ErrConvTime str(&value.time); make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, - &str, time_type, 0, 0); + &str, time_type, NULL, NULL, NULL); set_zero_time(&value.time, time_type); } maybe_null= 0; diff --git a/sql/item_create.cc b/sql/item_create.cc index 4b7400eb0c0..1cf5a06a3a4 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -7338,7 +7338,7 @@ Item *create_temporal_literal(THD *thd, ErrConvString err(str, length, cs); make_truncated_value_warning(thd, Sql_condition::time_warn_level(status.warnings), - &err, ltime.time_type, 0, 0); + &err, ltime.time_type, NULL, NULL, NULL); } return item; } diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc index b7455f36d1b..f2f3fdaafe3 100644 --- a/sql/item_timefunc.cc +++ b/sql/item_timefunc.cc @@ -430,7 +430,7 @@ static bool extract_date_time(DATE_TIME_FORMAT *format, make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, val_begin, length, - cached_timestamp_type, 0, NullS); + cached_timestamp_type, NULL, NULL, NULL); break; } } while (++val != val_end); @@ -1870,13 +1870,13 @@ overflow: { ErrConvInteger err2(sec, unsigned_flag); make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, - &err2, MYSQL_TIMESTAMP_TIME, 0, NullS); + &err2, MYSQL_TIMESTAMP_TIME, NULL, NULL, NULL); } else { ErrConvString err2(err); make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, - &err2, MYSQL_TIMESTAMP_TIME, 0, NullS); + &err2, MYSQL_TIMESTAMP_TIME, NULL, NULL, NULL); } return 0; } @@ -2894,7 +2894,7 @@ bool Item_func_maketime::get_date(MYSQL_TIME *ltime, ulonglong fuzzy_date) int len = (int)(ptr - buf) + sprintf(ptr, ":%02u:%02u", (uint)minute, (uint)second); make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, buf, len, MYSQL_TIMESTAMP_TIME, - 0, NullS); + NULL, NULL, NULL); } return (null_value= 0); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index b3a600eec36..57284272316 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -9952,7 +9952,8 @@ err_new_table_cleanup: thd->abort_on_warning= true; make_truncated_value_warning(thd, Sql_condition::WARN_LEVEL_WARN, f_val, strlength(f_val), t_type, - new_table->s, + alter_ctx.new_db, + alter_ctx.new_name, alter_ctx.datetime_field->field_name); thd->abort_on_warning= save_abort_on_warning; } diff --git a/sql/sql_time.cc b/sql/sql_time.cc index a6fe937df4b..7f5919007e8 100644 --- a/sql/sql_time.cc +++ b/sql/sql_time.cc @@ -18,7 +18,6 @@ /* Functions to handle date and time */ #include -#include "sql_priv.h" #include "sql_time.h" #include "tztime.h" // struct Time_zone #include "sql_class.h" // THD @@ -223,7 +222,7 @@ check_date_with_warn(const MYSQL_TIME *ltime, ulonglong fuzzy_date, { ErrConvTime str(ltime); make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, - &str, ts_type, 0, 0); + &str, ts_type, NULL, NULL, NULL); return true; } return false; @@ -240,7 +239,7 @@ adjust_time_range_with_warn(MYSQL_TIME *ltime, uint dec) return true; if (warnings) make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, - &str, MYSQL_TIMESTAMP_TIME, 0, NullS); + &str, MYSQL_TIMESTAMP_TIME, NULL, NULL, NULL); return false; } @@ -329,7 +328,8 @@ str_to_datetime_with_warn(CHARSET_INFO *cs, ret_val ? Sql_condition::WARN_LEVEL_WARN : Sql_condition::time_warn_level(status.warnings), str, length, flags & TIME_TIME_ONLY ? - MYSQL_TIMESTAMP_TIME : l_time->time_type, 0, NullS); + MYSQL_TIMESTAMP_TIME : l_time->time_type, + NULL, NULL, NULL); DBUG_EXECUTE_IF("str_to_datetime_warn", push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, ER_YES, str);); @@ -387,7 +387,8 @@ static bool number_to_time_with_warn(bool neg, ulonglong nr, ulong sec_part, Sql_condition::WARN_LEVEL_WARN, str, res < 0 ? MYSQL_TIMESTAMP_ERROR : mysql_type_to_time_type(f_type), - s, field_name); + s ? s->db.str : NULL, + s ? s->table_name.str : NULL, field_name); } return res < 0; } @@ -859,7 +860,8 @@ void make_truncated_value_warning(THD *thd, Sql_condition::enum_warning_level level, const ErrConv *sval, timestamp_type time_type, - const TABLE_SHARE *s, const char *field_name) + const char *db_name, const char *table_name, + const char *field_name) { char warn_buff[MYSQL_ERRMSG_SIZE]; const char *type_str; @@ -879,9 +881,6 @@ void make_truncated_value_warning(THD *thd, } if (field_name) { - const char *db_name= s->db.str; - const char *table_name= s->table_name.str; - if (!db_name) db_name= ""; if (!table_name) @@ -1219,7 +1218,7 @@ make_date_with_warn(MYSQL_TIME *ltime, ulonglong fuzzy_date, /* e.g. negative time */ ErrConvTime str(ltime); make_truncated_value_warning(current_thd, Sql_condition::WARN_LEVEL_WARN, - &str, ts_type, 0, 0); + &str, ts_type, NULL, NULL, NULL); return true; } if ((ltime->time_type= ts_type) == MYSQL_TIMESTAMP_DATE) @@ -1383,7 +1382,7 @@ time_to_datetime_with_warn(THD *thd, { ErrConvTime str(from); make_truncated_value_warning(thd, Sql_condition::WARN_LEVEL_WARN, - &str, MYSQL_TIMESTAMP_DATETIME, 0, 0); + &str, MYSQL_TIMESTAMP_DATETIME, NULL, NULL, NULL); return true; } return false; diff --git a/sql/sql_time.h b/sql/sql_time.h index 1dafb9b783b..ebfb86cde61 100644 --- a/sql/sql_time.h +++ b/sql/sql_time.h @@ -120,15 +120,18 @@ void make_truncated_value_warning(THD *thd, Sql_condition::enum_warning_level level, const ErrConv *str_val, timestamp_type time_type, - const TABLE_SHARE *s, const char *field_name); + const char *db_name, const char *table_name, + const char *field_name); static inline void make_truncated_value_warning(THD *thd, Sql_condition::enum_warning_level level, const char *str_val, uint str_length, timestamp_type time_type, - const TABLE_SHARE *s, const char *field_name) + const char *db_name, const char *table_name, + const char *field_name) { const ErrConvString str(str_val, str_length, &my_charset_bin); - make_truncated_value_warning(thd, level, &str, time_type, s, field_name); + make_truncated_value_warning(thd, level, &str, time_type, db_name, table_name, + field_name); } extern DATE_TIME_FORMAT *date_time_format_make(timestamp_type format_type, From f35d1721039f8f115fc55e8f4b4d2bb4012161d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 31 Jul 2020 11:38:23 +0300 Subject: [PATCH 174/188] MDEV-23198 Crash in REPLACE row_vers_impl_x_locked_low(): clust_offsets may point to memory that is allocated by mem_heap_alloc() and may have been freed. For initializing clust_offsets, try to use the stack-allocated buffer instead of a pointer that may point to freed memory. This fixes a regression that was introduced in commit f0aa073f2bf3d8d85b3d028df89cdb4cdfc4002d (MDEV-20950). --- mysql-test/suite/innodb/r/mvcc.result | 14 ++++++++++++++ mysql-test/suite/innodb/t/mvcc.test | 20 ++++++++++++++++++++ storage/innobase/row/row0vers.cc | 8 ++++---- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/mysql-test/suite/innodb/r/mvcc.result b/mysql-test/suite/innodb/r/mvcc.result index 6826978d6a7..b0b834c91a4 100644 --- a/mysql-test/suite/innodb/r/mvcc.result +++ b/mysql-test/suite/innodb/r/mvcc.result @@ -28,4 +28,18 @@ SELECT * FROM t1; a 0 DROP TABLE t1; +# +# MDEV-23198 Crash in REPLACE +# +BEGIN NOT ATOMIC +DECLARE c TEXT DEFAULT(SELECT CONCAT('CREATE TABLE t1(id INT PRIMARY KEY, c', +GROUP_CONCAT(seq SEPARATOR ' INT, c'), +' INT NOT NULL UNIQUE) ENGINE=InnoDB') +FROM seq_1_to_294); +EXECUTE IMMEDIATE c; +END; +$$ +INSERT INTO t1 SET id=1,c294=1; +REPLACE t1 SET id=1,c294=1; +DROP TABLE t1; SET GLOBAL innodb_file_per_table= @save_per_table; diff --git a/mysql-test/suite/innodb/t/mvcc.test b/mysql-test/suite/innodb/t/mvcc.test index bf76a5de798..7c37718c28a 100644 --- a/mysql-test/suite/innodb/t/mvcc.test +++ b/mysql-test/suite/innodb/t/mvcc.test @@ -1,4 +1,5 @@ --source include/have_innodb.inc +--source include/have_sequence.inc SET @save_per_table= @@GLOBAL.innodb_file_per_table; SET GLOBAL innodb_file_per_table= 1; @@ -49,4 +50,23 @@ SELECT * FROM t1; DROP TABLE t1; +--echo # +--echo # MDEV-23198 Crash in REPLACE +--echo # + +DELIMITER $$; +BEGIN NOT ATOMIC + DECLARE c TEXT DEFAULT(SELECT CONCAT('CREATE TABLE t1(id INT PRIMARY KEY, c', + GROUP_CONCAT(seq SEPARATOR ' INT, c'), + ' INT NOT NULL UNIQUE) ENGINE=InnoDB') + FROM seq_1_to_294); + EXECUTE IMMEDIATE c; +END; +$$ +DELIMITER ;$$ + +INSERT INTO t1 SET id=1,c294=1; +REPLACE t1 SET id=1,c294=1; +DROP TABLE t1; + SET GLOBAL innodb_file_per_table= @save_per_table; diff --git a/storage/innobase/row/row0vers.cc b/storage/innobase/row/row0vers.cc index 09509444ea4..77bbb1b3459 100644 --- a/storage/innobase/row/row0vers.cc +++ b/storage/innobase/row/row0vers.cc @@ -91,7 +91,7 @@ row_vers_impl_x_locked_low( { rec_t* prev_version = NULL; rec_offs clust_offsets_[REC_OFFS_NORMAL_SIZE]; - rec_offs* clust_offsets = clust_offsets_; + rec_offs* clust_offsets; mem_heap_t* heap; dtuple_t* ientry = NULL; mem_heap_t* v_heap = NULL; @@ -105,7 +105,7 @@ row_vers_impl_x_locked_low( heap = mem_heap_create(1024); - clust_offsets = rec_get_offsets(clust_rec, clust_index, clust_offsets, + clust_offsets = rec_get_offsets(clust_rec, clust_index, clust_offsets_, true, ULINT_UNDEFINED, &heap); const trx_id_t trx_id = row_get_rec_trx_id( @@ -187,7 +187,7 @@ row_vers_impl_x_locked_low( ut_ad(committed || prev_version || !rec_get_deleted_flag(version, comp)); - /* Free version. */ + /* Free version and clust_offsets. */ mem_heap_free(old_heap); if (committed) { @@ -222,7 +222,7 @@ not_locked: } clust_offsets = rec_get_offsets( - prev_version, clust_index, clust_offsets, true, + prev_version, clust_index, clust_offsets_, true, ULINT_UNDEFINED, &heap); vers_del = rec_get_deleted_flag(prev_version, comp); From 879ba1979b5fa6fb7d96c7577b4071185a5408da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 31 Jul 2020 11:51:44 +0300 Subject: [PATCH 175/188] MDEV-11799 Doublewrite recovery can corrupt data pages The purpose of the InnoDB doublewrite buffer is to make InnoDB tolerant against cases where the server was killed in the middle of a page write. (In Linux, killing a process may interrupt a write system call, typically on a 4096-byte boundary.) There may exist multiple copies of a page number in the doublewrite buffer. Recovery should choose the latest valid copy of the page. By design, the FIL_PAGE_LSN must not precede the latest checkpoint LSN nor be later than the end of the recovered log. For page_compressed and encrypted pages, we were missing proper consistency checks. In the 10.4 data set generated for in MDEV-23231, the data file contained a valid page_compressed page, and an identical copy of that page was also present in the doublewrite buffer. But, recovery would incorrectly consider the page invalid and restore an uncompressed copy of the same page that had been written before the log checkpoint. (In fact, no redo log was to be applied to that page.) buf_dblwr_process(): Validate the FIL_PAGE_LSN in the doublewrite buffer pages, and always skip page 0, because those pages should have been recovered by Datafile::restore_from_doublewrite() if necessary. Datafile::restore_from_doublewrite(): Choose the latest applicable page from the doublewrite buffer. recv_dblwr_t::find_page(): Also validate encrypted or page_compressed pages. recv_dblwr_t::validate_page(): New function to validate a page, either a copy in a data file or in the doublewrite buffer. Also validate encrypted or page_compressed pages. This is joint work with Thirunarayanan Balathandayuthapani. --- storage/innobase/buf/buf0dblwr.cc | 123 +++++++++++----------------- storage/innobase/fsp/fsp0file.cc | 17 ++-- storage/innobase/include/log0recv.h | 40 +++++---- storage/innobase/log/log0recv.cc | 92 ++++++++++++++++++--- 4 files changed, 161 insertions(+), 111 deletions(-) diff --git a/storage/innobase/buf/buf0dblwr.cc b/storage/innobase/buf/buf0dblwr.cc index 6cc4bd6dc00..17185eab650 100644 --- a/storage/innobase/buf/buf0dblwr.cc +++ b/storage/innobase/buf/buf0dblwr.cc @@ -532,30 +532,54 @@ buf_dblwr_init_or_load_pages( void buf_dblwr_process() { + ut_ad(recv_sys->parse_start_lsn); + ulint page_no_dblwr = 0; byte* read_buf; - byte* unaligned_read_buf; recv_dblwr_t& recv_dblwr = recv_sys->dblwr; if (!buf_dblwr) { return; } - unaligned_read_buf = static_cast( - ut_malloc_nokey(3 * UNIV_PAGE_SIZE)); - read_buf = static_cast( - ut_align(unaligned_read_buf, UNIV_PAGE_SIZE)); - byte* const buf = read_buf + UNIV_PAGE_SIZE; + aligned_malloc(3 * srv_page_size, srv_page_size)); + byte* const buf = read_buf + srv_page_size; for (recv_dblwr_t::list::iterator i = recv_dblwr.pages.begin(); i != recv_dblwr.pages.end(); ++i, ++page_no_dblwr) { - byte* page = *i; - ulint space_id = page_get_space_id(page); - fil_space_t* space = fil_space_get(space_id); + byte* page = *i; + const ulint page_no = page_get_page_no(page); - if (space == NULL) { + if (!page_no) { + /* page 0 should have been recovered + already via Datafile::restore_from_doublewrite() */ + continue; + } + + const ulint space_id = page_get_space_id(page); + const lsn_t lsn = mach_read_from_8(page + FIL_PAGE_LSN); + + if (recv_sys->parse_start_lsn > lsn) { + /* Pages written before the checkpoint are + not useful for recovery. */ + continue; + } + + const page_id_t page_id(space_id, page_no); + + if (recv_sys->scanned_lsn < lsn) { + ib::warn() << "Ignoring a doublewrite copy of page " + << page_id + << " with future log sequence number " + << lsn; + continue; + } + + fil_space_t* space = fil_space_acquire_for_io(space_id); + + if (!space) { /* Maybe we have dropped the tablespace and this page once belonged to it: do nothing */ continue; @@ -563,9 +587,6 @@ buf_dblwr_process() fil_space_open_if_needed(space); - const ulint page_no = page_get_page_no(page); - const page_id_t page_id(space_id, page_no); - if (UNIV_UNLIKELY(page_no >= space->size)) { /* Do not report the warning if the tablespace @@ -581,6 +602,8 @@ buf_dblwr_process() << space->name << " (" << space->size << " pages)"; } +next_page: + fil_space_release_for_io(space); continue; } @@ -609,76 +632,27 @@ buf_dblwr_process() << "error: " << err; } - const bool is_all_zero = buf_is_zeroes( - span(read_buf, page_size.physical())); - const bool expect_encrypted = space->crypt_data - && space->crypt_data->type != CRYPT_SCHEME_UNENCRYPTED; - - if (is_all_zero) { + if (buf_is_zeroes(span(read_buf, + page_size.physical()))) { /* We will check if the copy in the doublewrite buffer is valid. If not, we will ignore this page (there should be redo log records to initialize it). */ + } else if (recv_dblwr.validate_page( + page_id, read_buf, space, buf)) { + goto next_page; } else { - /* Decompress the page before - validating the checksum. */ - ulint decomp = fil_page_decompress(buf, read_buf); - if (!decomp || (decomp != srv_page_size - && page_size.is_compressed())) { - goto bad; - } - - if (expect_encrypted && mach_read_from_4( - read_buf - + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION) - ? fil_space_verify_crypt_checksum(read_buf, - page_size) - : !buf_page_is_corrupted(true, read_buf, - page_size, space)) { - /* The page is good; there is no need - to consult the doublewrite buffer. */ - continue; - } - -bad: /* We intentionally skip this message for - is_all_zero pages. */ + all-zero pages. */ ib::info() << "Trying to recover page " << page_id << " from the doublewrite buffer."; } - ulint decomp = fil_page_decompress(buf, page); - if (!decomp || (decomp != srv_page_size - && page_size.is_compressed())) { - continue; - } + page = recv_dblwr.find_page(page_id, space, buf); - if (expect_encrypted && mach_read_from_4( - page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION) - ? !fil_space_verify_crypt_checksum(page, page_size) - : buf_page_is_corrupted(true, page, page_size, space)) { - /* Theoretically we could have another good - copy for this page in the doublewrite - buffer. If not, we will report a fatal error - for a corrupted page somewhere else if that - page was truly needed. */ - continue; - } - - if (page_no == 0) { - /* Check the FSP_SPACE_FLAGS. */ - ulint flags = fsp_header_get_flags(page); - if (!fsp_flags_is_valid(flags, space_id) - && fsp_flags_convert_from_101(flags) - == ULINT_UNDEFINED) { - ib::warn() << "Ignoring a doublewrite copy" - " of page " << page_id - << " due to invalid flags " - << ib::hex(flags); - continue; - } - /* The flags on the page should be converted later. */ + if (!page) { + goto next_page; } /* Write the good page from the doublewrite buffer to @@ -687,17 +661,18 @@ bad: IORequest write_request(IORequest::WRITE); fil_io(write_request, true, page_id, page_size, - 0, page_size.physical(), - const_cast(page), NULL); + 0, page_size.physical(), page, NULL); ib::info() << "Recovered page " << page_id << " from the doublewrite buffer."; + + goto next_page; } recv_dblwr.pages.clear(); fil_flush_file_spaces(FIL_TYPE_TABLESPACE); - ut_free(unaligned_read_buf); + aligned_free(read_buf); } /****************************************************************//** diff --git a/storage/innobase/fsp/fsp0file.cc b/storage/innobase/fsp/fsp0file.cc index 5abdf22d939..b367ed37c2b 100644 --- a/storage/innobase/fsp/fsp0file.cc +++ b/storage/innobase/fsp/fsp0file.cc @@ -768,10 +768,10 @@ Datafile::restore_from_doublewrite() } /* Find if double write buffer contains page_no of given space id. */ - const byte* page = recv_sys->dblwr.find_page(m_space_id, 0); const page_id_t page_id(m_space_id, 0); + const byte* page = recv_sys->dblwr.find_page(page_id); - if (page == NULL) { + if (!page) { /* If the first page of the given user tablespace is not there in the doublewrite buffer, then the recovery is going to fail now. Hence this is treated as an error. */ @@ -788,15 +788,10 @@ Datafile::restore_from_doublewrite() FSP_HEADER_OFFSET + FSP_SPACE_FLAGS + page); if (!fsp_flags_is_valid(flags, m_space_id)) { - ulint cflags = fsp_flags_convert_from_101(flags); - if (cflags == ULINT_UNDEFINED) { - ib::warn() - << "Ignoring a doublewrite copy of page " - << page_id - << " due to invalid flags " << ib::hex(flags); - return(true); - } - flags = cflags; + flags = fsp_flags_convert_from_101(flags); + /* recv_dblwr_t::validate_page() inside find_page() + checked this already. */ + ut_ad(flags != ULINT_UNDEFINED); /* The flags on the page should be converted later. */ } diff --git a/storage/innobase/include/log0recv.h b/storage/innobase/include/log0recv.h index b91312e81e2..6425e3c6c37 100644 --- a/storage/innobase/include/log0recv.h +++ b/storage/innobase/include/log0recv.h @@ -195,23 +195,35 @@ struct recv_t{ rec_list;/*!< list of log records for this page */ }; -struct recv_dblwr_t { - /** Add a page frame to the doublewrite recovery buffer. */ - void add(byte* page) { - pages.push_back(page); - } +struct recv_dblwr_t +{ + /** Add a page frame to the doublewrite recovery buffer. */ + void add(byte *page) { pages.push_back(page); } - /** Find a doublewrite copy of a page. - @param[in] space_id tablespace identifier - @param[in] page_no page number - @return page frame - @retval NULL if no page was found */ - const byte* find_page(ulint space_id, ulint page_no); + /** Validate the page. + @param page_id page identifier + @param page page contents + @param space the tablespace of the page (not available for page 0) + @param tmp_buf 2*srv_page_size for decrypting and decompressing any + page_compressed or encrypted pages + @return whether the page is valid */ + bool validate_page(const page_id_t page_id, const byte *page, + const fil_space_t *space, byte *tmp_buf); - typedef std::list > list; + /** Find a doublewrite copy of a page. + @param page_id page identifier + @param space tablespace (not available for page_id.page_no()==0) + @param tmp_buf 2*srv_page_size for decrypting and decompressing any + page_compressed or encrypted pages + @return page frame + @retval NULL if no valid page for page_id was found */ + byte* find_page(const page_id_t page_id, const fil_space_t *space= NULL, + byte *tmp_buf= NULL); - /** Recovered doublewrite buffer page frames */ - list pages; + typedef std::list > list; + + /** Recovered doublewrite buffer page frames */ + list pages; }; /** Recovery system data structure */ diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index c2eb1fe7659..4980e92ea6d 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -57,6 +57,7 @@ Created 9/20/1997 Heikki Tuuri #include "srv0start.h" #include "trx0roll.h" #include "row0merge.h" +#include "fil0pagecompress.h" /** Log records are stored in the hash table in chunks at most of this size; this must be less than UNIV_PAGE_SIZE as it is stored in the buffer pool */ @@ -3910,6 +3911,8 @@ skip_apply: rescan = true; } + recv_sys->parse_start_lsn = checkpoint_lsn; + if (srv_operation == SRV_OPERATION_NORMAL) { buf_dblwr_process(); } @@ -4084,26 +4087,91 @@ recv_recovery_rollback_active(void) } } -/** Find a doublewrite copy of a page. -@param[in] space_id tablespace identifier -@param[in] page_no page number -@return page frame -@retval NULL if no page was found */ -const byte* -recv_dblwr_t::find_page(ulint space_id, ulint page_no) +bool recv_dblwr_t::validate_page(const page_id_t page_id, + const byte *page, + const fil_space_t *space, + byte *tmp_buf) { - const byte *result= NULL; + if (page_id.page_no() == 0) + { + ulint flags= fsp_header_get_flags(page); + if (!fsp_flags_is_valid(flags, page_id.space())) + { + ulint cflags= fsp_flags_convert_from_101(flags); + if (cflags == ULINT_UNDEFINED) + { + ib::warn() << "Ignoring a doublewrite copy of page " << page_id + << "due to invalid flags " << ib::hex(flags); + return false; + } + + flags= cflags; + } + + /* Page 0 is never page_compressed or encrypted. */ + return !buf_page_is_corrupted(true, page, page_size_t(flags)); + } + + ut_ad(tmp_buf); + byte *tmp_frame= tmp_buf; + byte *tmp_page= tmp_buf + srv_page_size; + const uint16_t page_type= mach_read_from_2(page + FIL_PAGE_TYPE); + const page_size_t page_size(space->flags); + const bool expect_encrypted= space->crypt_data && + space->crypt_data->type != CRYPT_SCHEME_UNENCRYPTED; + + if (expect_encrypted && + mach_read_from_4(page + FIL_PAGE_FILE_FLUSH_LSN_OR_KEY_VERSION)) + { + if (!fil_space_verify_crypt_checksum(page, page_size)) + return false; + if (page_type != FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) + return true; + if (page_size.is_compressed()) + return false; + memcpy(tmp_page, page, page_size.physical()); + if (!fil_space_decrypt(space, tmp_frame, tmp_page)) + return false; + } + + switch (page_type) { + case FIL_PAGE_PAGE_COMPRESSED: + memcpy(tmp_page, page, page_size.physical()); + /* fall through */ + case FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED: + if (page_size.is_compressed()) + return false; /* ROW_FORMAT=COMPRESSED cannot be page_compressed */ + ulint decomp= fil_page_decompress(tmp_frame, tmp_page); + if (!decomp) + return false; /* decompression failed */ + if (decomp == srv_page_size) + return false; /* the page was not compressed (invalid page type) */ + return !buf_page_is_corrupted(true, tmp_page, page_size, space); + } + + return !buf_page_is_corrupted(true, page, page_size, space); +} + +byte *recv_dblwr_t::find_page(const page_id_t page_id, + const fil_space_t *space, byte *tmp_buf) +{ + byte *result= NULL; lsn_t max_lsn= 0; for (list::const_iterator i = pages.begin(); i != pages.end(); ++i) { - const byte *page= *i; - if (page_get_page_no(page) != page_no || - page_get_space_id(page) != space_id) + byte *page= *i; + if (page_get_page_no(page) != page_id.page_no() || + page_get_space_id(page) != page_id.space()) continue; const lsn_t lsn= mach_read_from_8(page + FIL_PAGE_LSN); - if (lsn <= max_lsn) + if (lsn <= max_lsn || + !validate_page(page_id, page, space, tmp_buf)) + { + /* Mark processed for subsequent iterations in buf_dblwr_process() */ + memset(page + FIL_PAGE_LSN, 0, 8); continue; + } max_lsn= lsn; result= page; } From a773d932678a0b205f43d8a1aaa416d843d66bc8 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Fri, 31 Jul 2020 11:10:41 +0200 Subject: [PATCH 176/188] MDEV-19603 MariaDB 10.4 does not build on OpenBSD due to the use of libdl --- plugin/auth_pam/CMakeLists.txt | 2 +- wsrep-lib | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugin/auth_pam/CMakeLists.txt b/plugin/auth_pam/CMakeLists.txt index 28a194927e9..93ac29cd425 100644 --- a/plugin/auth_pam/CMakeLists.txt +++ b/plugin/auth_pam/CMakeLists.txt @@ -25,7 +25,7 @@ IF(HAVE_PAM_APPL_H) FIND_LIBRARY(PAM_LIBRARY pam) # for srpm build-depends detection ADD_DEFINITIONS(-D_GNU_SOURCE) MYSQL_ADD_PLUGIN(auth_pam_v1 auth_pam_v1.c LINK_LIBRARIES pam MODULE_ONLY) - MYSQL_ADD_PLUGIN(auth_pam auth_pam.c LINK_LIBRARIES pam dl MODULE_ONLY) + MYSQL_ADD_PLUGIN(auth_pam auth_pam.c LINK_LIBRARIES pam ${LIBDL} MODULE_ONLY) IF (TARGET auth_pam) MYSQL_ADD_EXECUTABLE(auth_pam_tool auth_pam_tool.c DESTINATION ${INSTALL_PLUGINDIR}/auth_pam_tool_dir COMPONENT Server) TARGET_LINK_LIBRARIES(auth_pam_tool pam) diff --git a/wsrep-lib b/wsrep-lib index 3e5a28df32c..ae4e58ba031 160000 --- a/wsrep-lib +++ b/wsrep-lib @@ -1 +1 @@ -Subproject commit 3e5a28df32c85c7768dd84d1731ad4661bf90022 +Subproject commit ae4e58ba031587039c8830f2f8ca51fa9fb7d6eb From a6066e230efadddbfad68434cc44379f3320fed6 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Fri, 31 Jul 2020 15:07:43 +0530 Subject: [PATCH 177/188] MDEV-22511 innodb.truncate_foreign failed in buildbot with wrong error code - Adding lock_wait_timeout value as 1 make sure that truncate table fails instead of making MDL timeout. --- mysql-test/suite/innodb/r/truncate_foreign.result | 1 + mysql-test/suite/innodb/t/truncate_foreign.test | 1 + 2 files changed, 2 insertions(+) diff --git a/mysql-test/suite/innodb/r/truncate_foreign.result b/mysql-test/suite/innodb/r/truncate_foreign.result index bcf5b16aa83..fc09b74d62f 100644 --- a/mysql-test/suite/innodb/r/truncate_foreign.result +++ b/mysql-test/suite/innodb/r/truncate_foreign.result @@ -29,6 +29,7 @@ SET DEBUG_SYNC='foreign_constraint_check_for_update SIGNAL fk WAIT_FOR go'; DELETE FROM parent; connection default; SET DEBUG_SYNC='now WAIT_FOR fk'; +SET lock_wait_timeout=1; TRUNCATE TABLE child; ERROR HY000: Lock wait timeout exceeded; try restarting transaction SET DEBUG_SYNC='now SIGNAL go'; diff --git a/mysql-test/suite/innodb/t/truncate_foreign.test b/mysql-test/suite/innodb/t/truncate_foreign.test index 2c00c0641e9..d9d647e69f0 100644 --- a/mysql-test/suite/innodb/t/truncate_foreign.test +++ b/mysql-test/suite/innodb/t/truncate_foreign.test @@ -37,6 +37,7 @@ send DELETE FROM parent; connection default; SET DEBUG_SYNC='now WAIT_FOR fk'; +SET lock_wait_timeout=1; --error ER_LOCK_WAIT_TIMEOUT TRUNCATE TABLE child; SET DEBUG_SYNC='now SIGNAL go'; From 5ec40fbb2704a0bf1369836d88a5def4721809c8 Mon Sep 17 00:00:00 2001 From: Thirunarayanan Balathandayuthapani Date: Fri, 31 Jul 2020 16:45:35 +0530 Subject: [PATCH 178/188] MDEV-14711 Fix-up --- storage/innobase/btr/btr0cur.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index bacc05686e9..d433f9cadc8 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -470,7 +470,7 @@ btr_cur_optimistic_latch_leaves( /* release the left block */ btr_leaf_page_release( cursor->left_block, mode, mtr); - return false; + goto unpin_failed; } } else { cursor->left_block = NULL; From a8458a2345ea2497ada2f1bd01aeb9c34934dfc6 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Wed, 8 Jul 2020 16:26:34 +0200 Subject: [PATCH 179/188] MDEV-21201 No records produced in information_schema query, depending on projection In case of NATURAL JOIN / USING mark all field (one table can not be opened in any case so optimisation does not worth it). IMHO table should be checked for used fields and filled after prepare, when we will fave whole info about used fields but it is too big change for a bugfix. Which will be made later by Serg patch --- mysql-test/main/information_schema.result | 64 +++++++++++++++++++++++ mysql-test/main/information_schema.test | 62 ++++++++++++++++++++++ sql/sql_parse.cc | 2 + sql/sql_show.cc | 5 +- sql/table.h | 1 + 5 files changed, 133 insertions(+), 1 deletion(-) diff --git a/mysql-test/main/information_schema.result b/mysql-test/main/information_schema.result index 62a563bf483..20b5985deb6 100644 --- a/mysql-test/main/information_schema.result +++ b/mysql-test/main/information_schema.result @@ -2201,3 +2201,67 @@ SCHEMA_NAME # # End of 10.1 tests # +# +# MDEV-21201:No records produced in information_schema query, +# depending on projection +# +create table t (i int, constraint a check (i > 0)); +select +tc.TABLE_SCHEMA, +tc.TABLE_NAME, +cc.CONSTRAINT_NAME, +cc.CHECK_CLAUSE +from information_schema.TABLE_CONSTRAINTS tc +join information_schema.CHECK_CONSTRAINTS cc +using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) +; +TABLE_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE +test t a `i` > 0 +select +tc.TABLE_SCHEMA, +tc.TABLE_NAME, +cc.CONSTRAINT_NAME, +cc.CHECK_CLAUSE +from information_schema.CHECK_CONSTRAINTS cc +join information_schema.TABLE_CONSTRAINTS tc +using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) +; +TABLE_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE +test t a `i` > 0 +select +tc.TABLE_SCHEMA, +tc.TABLE_NAME, +cc.CONSTRAINT_NAME, +cc.CHECK_CLAUSE +from information_schema.TABLE_CONSTRAINTS tc +NATURAL join information_schema.CHECK_CONSTRAINTS cc +; +TABLE_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE +test t a `i` > 0 +select +tc.TABLE_SCHEMA, +tc.TABLE_NAME, +cc.CONSTRAINT_NAME, +cc.CHECK_CLAUSE +from information_schema.CHECK_CONSTRAINTS cc +NATURAL join information_schema.TABLE_CONSTRAINTS tc +; +TABLE_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE +test t a `i` > 0 +select +tc.TABLE_SCHEMA, +tc.TABLE_NAME, +cc.CONSTRAINT_NAME, +cc.CHECK_CLAUSE, +tc.CONSTRAINT_CATALOG, +tc.CONSTRAINT_SCHEMA +from information_schema.TABLE_CONSTRAINTS tc +join information_schema.CHECK_CONSTRAINTS cc +using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) +; +TABLE_SCHEMA TABLE_NAME CONSTRAINT_NAME CHECK_CLAUSE CONSTRAINT_CATALOG CONSTRAINT_SCHEMA +test t a `i` > 0 def test +drop table t; +# +# End of 10.3 tests +# diff --git a/mysql-test/main/information_schema.test b/mysql-test/main/information_schema.test index 08eeef5aa90..d97aed0e0f2 100644 --- a/mysql-test/main/information_schema.test +++ b/mysql-test/main/information_schema.test @@ -1922,3 +1922,65 @@ SELECT SCHEMA_NAME from information_schema.schemata where schema_name=REPEAT('a' --echo # --echo # End of 10.1 tests --echo # + + +--echo # +--echo # MDEV-21201:No records produced in information_schema query, +--echo # depending on projection +--echo # + +create table t (i int, constraint a check (i > 0)); + +--disable_warnings +select + tc.TABLE_SCHEMA, + tc.TABLE_NAME, + cc.CONSTRAINT_NAME, + cc.CHECK_CLAUSE +from information_schema.TABLE_CONSTRAINTS tc + join information_schema.CHECK_CONSTRAINTS cc + using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) +; +select + tc.TABLE_SCHEMA, + tc.TABLE_NAME, + cc.CONSTRAINT_NAME, + cc.CHECK_CLAUSE +from information_schema.CHECK_CONSTRAINTS cc + join information_schema.TABLE_CONSTRAINTS tc + using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) +; +select + tc.TABLE_SCHEMA, + tc.TABLE_NAME, + cc.CONSTRAINT_NAME, + cc.CHECK_CLAUSE +from information_schema.TABLE_CONSTRAINTS tc + NATURAL join information_schema.CHECK_CONSTRAINTS cc +; +select + tc.TABLE_SCHEMA, + tc.TABLE_NAME, + cc.CONSTRAINT_NAME, + cc.CHECK_CLAUSE +from information_schema.CHECK_CONSTRAINTS cc + NATURAL join information_schema.TABLE_CONSTRAINTS tc +; +select + tc.TABLE_SCHEMA, + tc.TABLE_NAME, + cc.CONSTRAINT_NAME, + cc.CHECK_CLAUSE, + tc.CONSTRAINT_CATALOG, + tc.CONSTRAINT_SCHEMA +from information_schema.TABLE_CONSTRAINTS tc + join information_schema.CHECK_CONSTRAINTS cc + using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) +; +--enable_warnings + +drop table t; + +--echo # +--echo # End of 10.3 tests +--echo # diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index ac73b5e9cdf..6802816caaf 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -8904,6 +8904,8 @@ void add_join_natural(TABLE_LIST *a, TABLE_LIST *b, List *using_fields, SELECT_LEX *lex) { b->natural_join= a; + a->part_of_natural_join= TRUE; + b->part_of_natural_join= TRUE; lex->prev_join_using= using_fields; } diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 3dbc7724928..c6e801b7976 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -8183,7 +8183,10 @@ TABLE *create_schema_table(THD *thd, TABLE_LIST *table_list) else all_items= thd->free_list; - mark_all_fields_used_in_query(thd, fields_info, &bitmap, all_items); + if (table_list->part_of_natural_join) + bitmap_set_all(&bitmap); + else + mark_all_fields_used_in_query(thd, fields_info, &bitmap, all_items); for (field_count=0; fields_info->field_name; fields_info++) { diff --git a/sql/table.h b/sql/table.h index a5821a712c6..3d289bf241a 100644 --- a/sql/table.h +++ b/sql/table.h @@ -2183,6 +2183,7 @@ struct TABLE_LIST parsing 'this' is a NATURAL/USING join iff (natural_join != NULL). */ TABLE_LIST *natural_join; + bool part_of_natural_join; /* True if 'this' represents a nested join that is a NATURAL JOIN. For one of the operands of 'this', the member 'natural_join' points From dc513dff911d72eaaf9f752f390fef8d1ef9a4b0 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Fri, 31 Jul 2020 10:42:44 +0400 Subject: [PATCH 180/188] MDEV-23351 Rounding functions return wrong data types for DATE input Fixing ROUND(date,0), TRUNCATE(date,x), FLOOR(date), CEILING(date) to return the `int(8) unsigned` data type. Details: 1. Cleanup: moving virtual implementations - Type_handler_temporal_result::Item_func_int_val_fix_length_and_dec() - Type_handler_temporal_result::Item_func_round_fix_length_and_dec() to Type_handler_date_common. Other temporal data type handlers override these methods anyway. So they were only DATE specific. This change makes the code clearer. 2. Backporting DTCollation_numeric from 10.5, to reuse the code easier. 3. Adding the `preferred_attrs` argument to Item_func_round::fix_arg_int(). Now Type_handler_xxx::Item_func_round_val_fix_length_and_dec() work as follows: - The INT-alike and YEAR handlers copy preferred_attrs from args[0]. - The DATE handler passes explicit attributes, to get `int(8) unsigned`. - The hex hybrid handler passes NULL, so fix_arg_int() calculates attributes. 4. Type_handler_date_common::Item_func_int_val_fix_length_and_dec() now sets the type handler and attributes to get `int(8) unsigned`. --- mysql-test/main/type_date.result | 14 ++++++++++++++ mysql-test/main/type_date.test | 8 ++++++++ sql/item_func.cc | 9 ++++++--- sql/item_func.h | 3 ++- sql/sql_type.cc | 25 ++++++++++++++++++------- sql/sql_type.h | 15 +++++++++++++-- 6 files changed, 61 insertions(+), 13 deletions(-) diff --git a/mysql-test/main/type_date.result b/mysql-test/main/type_date.result index 616ba0a4529..f40a27e5f5c 100644 --- a/mysql-test/main/type_date.result +++ b/mysql-test/main/type_date.result @@ -1089,5 +1089,19 @@ CAST(1012.5 AS DATE) * 1.0 Warnings: Note 1292 Truncated incorrect date value: '1012.5' # +# MDEV-23351 Rounding functions return wrong data types for DATE input +# +CREATE TABLE t1 (a date); +CREATE TABLE t2 AS SELECT FLOOR(a), CEIL(a),ROUND(a),TRUNCATE(a,0) FROM t1; +SHOW CREATE TABLE t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `FLOOR(a)` int(8) unsigned DEFAULT NULL, + `CEIL(a)` int(8) unsigned DEFAULT NULL, + `ROUND(a)` int(8) unsigned DEFAULT NULL, + `TRUNCATE(a,0)` int(8) unsigned DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 +DROP TABLE t2,t1; +# # End of 10.4 tests # diff --git a/mysql-test/main/type_date.test b/mysql-test/main/type_date.test index c041295f845..33598846504 100644 --- a/mysql-test/main/type_date.test +++ b/mysql-test/main/type_date.test @@ -740,6 +740,14 @@ SET sql_mode=DEFAULT; SELECT NULLIF(CAST(1012.5 AS DATE), 1); SELECT CAST(1012.5 AS DATE) * 1.0; +--echo # +--echo # MDEV-23351 Rounding functions return wrong data types for DATE input +--echo # + +CREATE TABLE t1 (a date); +CREATE TABLE t2 AS SELECT FLOOR(a), CEIL(a),ROUND(a),TRUNCATE(a,0) FROM t1; +SHOW CREATE TABLE t2; +DROP TABLE t2,t1; --echo # --echo # End of 10.4 tests diff --git a/sql/item_func.cc b/sql/item_func.cc index 8e36804888b..6b19933fd48 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -2455,13 +2455,16 @@ void Item_func_round::fix_arg_datetime() (without extending to DECIMAL). - If `preferred` is not NULL, then the code tries to preserve the given data type handler and - data type attributes of the argument. + the data type attributes `preferred_attrs`. - If `preferred` is NULL, then the code fully calculates attributes using args[0]->decimal_precision() and chooses between INT and BIGINT, depending on attributes. + @param [IN] preferred_attrs - The preferred data type attributes for + simple cases. */ -void Item_func_round::fix_arg_int(const Type_handler *preferred) +void Item_func_round::fix_arg_int(const Type_handler *preferred, + const Type_std_attributes *preferred_attrs) { DBUG_ASSERT(args[0]->decimals == 0); if (args[1]->const_item()) @@ -2477,7 +2480,7 @@ void Item_func_round::fix_arg_int(const Type_handler *preferred) int length_can_increase= MY_TEST(!truncate && val1.neg()); if (preferred) { - Type_std_attributes::set(args[0]); + Type_std_attributes::set(preferred_attrs); if (!length_can_increase) { // Preserve the exact data type and attributes diff --git a/sql/item_func.h b/sql/item_func.h index 549e576dbd3..ecee1a1b83a 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -1774,7 +1774,8 @@ public: return NULL; } void fix_arg_decimal(); - void fix_arg_int(const Type_handler *preferred); + void fix_arg_int(const Type_handler *preferred, + const Type_std_attributes *preferred_attributes); void fix_arg_double(); void fix_arg_time(); void fix_arg_datetime(); diff --git a/sql/sql_type.cc b/sql/sql_type.cc index ee25a6c4fc5..8757d2fef59 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -23,6 +23,12 @@ #include "log.h" #include "tztime.h" +const DTCollation &DTCollation_numeric::singleton() +{ + static const DTCollation_numeric tmp; + return tmp; +} + Type_handler_row type_handler_row; Type_handler_null type_handler_null; @@ -5659,7 +5665,7 @@ bool Type_handler_row:: bool Type_handler_int_result:: Item_func_round_fix_length_and_dec(Item_func_round *item) const { - item->fix_arg_int(this); + item->fix_arg_int(this, item->arguments()[0]); return false; } @@ -5667,7 +5673,7 @@ bool Type_handler_int_result:: bool Type_handler_year:: Item_func_round_fix_length_and_dec(Item_func_round *item) const { - item->fix_arg_int(&type_handler_long); // 10.5 merge: fix to type_handler_ulong + item->fix_arg_int(&type_handler_long, item->arguments()[0]); // 10.5 merge: fix to type_handler_ulong return false; } @@ -5675,7 +5681,7 @@ bool Type_handler_year:: bool Type_handler_hex_hybrid:: Item_func_round_fix_length_and_dec(Item_func_round *item) const { - item->fix_arg_int(NULL); + item->fix_arg_int(NULL, NULL); return false; } @@ -5713,10 +5719,12 @@ bool Type_handler_decimal_result:: } -bool Type_handler_temporal_result:: +bool Type_handler_date_common:: Item_func_round_fix_length_and_dec(Item_func_round *item) const { - item->fix_arg_double(); + static const Type_std_attributes attr(8, 0/*dec*/, true/*unsigned*/, + DTCollation_numeric::singleton()); + item->fix_arg_int(&type_handler_long, &attr); // 10.5 merge: fix to *_ulong return false; } @@ -5831,10 +5839,13 @@ bool Type_handler_decimal_result:: } -bool Type_handler_temporal_result:: +bool Type_handler_date_common:: Item_func_int_val_fix_length_and_dec(Item_func_int_val *item) const { - item->fix_length_and_dec_int_or_decimal(); + static const Type_std_attributes attr(8, 0/*dec*/, true/*unsigned*/, + DTCollation_numeric::singleton()); + item->Type_std_attributes::set(attr); + item->set_handler(&type_handler_long); // 10.5 merge: fix to *_ulong return false; } diff --git a/sql/sql_type.h b/sql/sql_type.h index dd3319dce5c..65935c1bd66 100644 --- a/sql/sql_type.h +++ b/sql/sql_type.h @@ -2742,6 +2742,17 @@ public: }; +class DTCollation_numeric: public DTCollation +{ +public: + DTCollation_numeric() + :DTCollation(charset_info(), DERIVATION_NUMERIC, MY_REPERTOIRE_NUMERIC) + { } + static const CHARSET_INFO *charset_info() { return &my_charset_numeric; } + static const DTCollation & singleton(); +}; + + static inline uint32 char_to_byte_length_safe(size_t char_length_arg, uint32 mbmaxlen_arg) { @@ -4658,8 +4669,6 @@ public: bool Item_func_between_fix_length_and_dec(Item_func_between *func) const; bool Item_func_in_fix_comparator_compatible_types(THD *thd, Item_func_in *) const; - bool Item_func_round_fix_length_and_dec(Item_func_round *) const; - bool Item_func_int_val_fix_length_and_dec(Item_func_int_val *) const; bool Item_func_abs_fix_length_and_dec(Item_func_abs *) const; bool Item_func_neg_fix_length_and_dec(Item_func_neg *) const; bool Item_func_plus_fix_length_and_dec(Item_func_plus *) const; @@ -5486,6 +5495,8 @@ public: longlong Item_func_min_max_val_int(Item_func_min_max *) const; my_decimal *Item_func_min_max_val_decimal(Item_func_min_max *, my_decimal *) const; + bool Item_func_round_fix_length_and_dec(Item_func_round *) const; + bool Item_func_int_val_fix_length_and_dec(Item_func_int_val *) const; bool Item_hybrid_func_fix_attributes(THD *thd, const char *name, Type_handler_hybrid_field_type *, From a0518ed998d3e3256d576e6209593c3fd3969ce9 Mon Sep 17 00:00:00 2001 From: Sergei Golubchik Date: Fri, 31 Jul 2020 17:11:17 +0200 Subject: [PATCH 181/188] MDEV-23357 Server crashes in Sql_cmd_alter_table_exchange_partition::exchange_partition --- mysql-test/suite/parts/r/alter_table.result | 7 +++++++ mysql-test/suite/parts/t/alter_table.test | 11 +++++++++++ sql/sql_partition_admin.cc | 6 +++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/mysql-test/suite/parts/r/alter_table.result b/mysql-test/suite/parts/r/alter_table.result index fc508663204..94100b83118 100644 --- a/mysql-test/suite/parts/r/alter_table.result +++ b/mysql-test/suite/parts/r/alter_table.result @@ -21,3 +21,10 @@ set @@session.alter_algorithm= @save_alter_algorithm; CREATE TABLE t1 (a INT) PARTITION BY RANGE(a) SUBPARTITION BY HASH(a) (PARTITION p VALUES LESS THAN (5) (SUBPARTITION sp, SUBPARTITION sp1), PARTITION p1 VALUES LESS THAN MAXVALUE (SUBPARTITION sp2, SUBPARTITION sp3)); ALTER TABLE t1 DROP PARTITION p; DROP TABLE if exists t1; +CREATE TABLE t1 (i INT); +CREATE VIEW v1 as SELECT * FROM t1; +CREATE TABLE t2 (i INT); +ALTER TABLE v1 EXCHANGE PARTITION p2 WITH TABLE t2 ; +ERROR 42000: Can't open table +DROP VIEW v1; +DROP TABLE t1, t2; diff --git a/mysql-test/suite/parts/t/alter_table.test b/mysql-test/suite/parts/t/alter_table.test index 6c4d83f9eed..53b61806acb 100644 --- a/mysql-test/suite/parts/t/alter_table.test +++ b/mysql-test/suite/parts/t/alter_table.test @@ -27,3 +27,14 @@ set @@session.alter_algorithm= @save_alter_algorithm; CREATE TABLE t1 (a INT) PARTITION BY RANGE(a) SUBPARTITION BY HASH(a) (PARTITION p VALUES LESS THAN (5) (SUBPARTITION sp, SUBPARTITION sp1), PARTITION p1 VALUES LESS THAN MAXVALUE (SUBPARTITION sp2, SUBPARTITION sp3)); ALTER TABLE t1 DROP PARTITION p; DROP TABLE if exists t1; + +# +# MDEV-23357 Server crashes in Sql_cmd_alter_table_exchange_partition::exchange_partition +# +CREATE TABLE t1 (i INT); +CREATE VIEW v1 as SELECT * FROM t1; +CREATE TABLE t2 (i INT); +--error ER_CHECK_NO_SUCH_TABLE +ALTER TABLE v1 EXCHANGE PARTITION p2 WITH TABLE t2 ; +DROP VIEW v1; +DROP TABLE t1, t2; diff --git a/sql/sql_partition_admin.cc b/sql/sql_partition_admin.cc index 7822cab5ff0..55abee72a52 100644 --- a/sql/sql_partition_admin.cc +++ b/sql/sql_partition_admin.cc @@ -563,12 +563,12 @@ bool Sql_cmd_alter_table_exchange_partition:: part_table= table_list->table; swap_table= swap_table_list->table; - if (part_table->file->check_if_updates_are_ignored("ALTER")) - DBUG_RETURN(return_with_logging(thd)); - if (unlikely(check_exchange_partition(swap_table, part_table))) DBUG_RETURN(TRUE); + if (part_table->file->check_if_updates_are_ignored("ALTER")) + DBUG_RETURN(return_with_logging(thd)); + /* Add IF EXISTS to binlog if shared table */ if (part_table->file->partition_ht()->flags & HTON_TABLE_MAY_NOT_EXIST_ON_SLAVE) From afbd61811faad1b95e941e9b8f0c174f412200d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Sat, 27 Jun 2020 15:41:20 +0300 Subject: [PATCH 182/188] MDEV-22980: Allow plugin-maturity=alpha so S3 plugin loads Verified by running before and after: mariadb --skip-column-names -e "select plugin_name, plugin_status, plugin_type, plugin_library, plugin_license from information_schema.all_plugins order by plugin_name, plugin_library" Nothing else but exactly this line changed so there are no side effects: -S3 NOT INSTALLED STORAGE ENGINE ha_s3.so GPL +S3 ACTIVE STORAGE ENGINE ha_s3.so GPL Also enrich config file with link to KB and unify option syntax and standard comments. --- storage/maria/s3.cnf | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/storage/maria/s3.cnf b/storage/maria/s3.cnf index 94682cc14d7..345bddd1cb1 100644 --- a/storage/maria/s3.cnf +++ b/storage/maria/s3.cnf @@ -1,12 +1,22 @@ +[mariadbd] +# +# Uncomment line to enable +# +#plugin-maturity = alpha + [mariadb] -plugin-load-add=ha_s3 +# +# Uncomment line to enable +# +#plugin-load-add = ha_s3 # -# Uncomment and configure the S3 engine +# Uncomment to configure the S3 engine +# See all options at https://mariadb.com/kb/en/s3-storage-engine/ # -#s3-host-name=s3.amazonaws.com -#s3-protocol-version=Amazon -#s3-bucket=... -#s3-access-key=... -#s3-secret-key=... -#s3-region=eu-north-1 +#s3-host-name = s3.amazonaws.com +#s3-protocol-version = Amazon +#s3-bucket = ... +#s3-access-key = ... +#s3-secret-key = ... +#s3-region = eu-north-1 From 842da858b6c5b619bb5395ef4216f7e675b0f3a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Sat, 27 Jun 2020 15:43:46 +0300 Subject: [PATCH 183/188] Unify config syntax in default files - Include a link to the relevant KB article for more info - Use spaced around the equal sign for better readability and so that the examples are more aligned with the general style in the KB - Load plugins with just the base name, the .so is optional and excess --- debian/additions/mariadb.cnf | 2 ++ debian/additions/mariadb.conf.d/50-client.cnf | 6 +++--- .../mariadb.conf.d/50-mysqld_safe.cnf | 14 +++++++------- debian/additions/mariadb.conf.d/60-galera.cnf | 19 ++++++++++--------- storage/spider/spider.cnf | 6 ++++-- 5 files changed, 26 insertions(+), 21 deletions(-) diff --git a/debian/additions/mariadb.cnf b/debian/additions/mariadb.cnf index d40cdfe33d7..62b4ea8f11e 100644 --- a/debian/additions/mariadb.cnf +++ b/debian/additions/mariadb.cnf @@ -12,6 +12,8 @@ # One can use all long options that the program supports. # Run program with --help to get a list of available options and with # --print-defaults to see which it would actually understand and use. +# +# If you are new to MariaDB, check out https://mariadb.com/kb/en/basic-mariadb-articles/ # # This group is read both by the client and the server diff --git a/debian/additions/mariadb.conf.d/50-client.cnf b/debian/additions/mariadb.conf.d/50-client.cnf index fe8f2f3b788..54cfb44ac2d 100644 --- a/debian/additions/mariadb.conf.d/50-client.cnf +++ b/debian/additions/mariadb.conf.d/50-client.cnf @@ -5,11 +5,11 @@ [client] # Example of client certificate usage -# ssl-cert=/etc/mysql/client-cert.pem -# ssl-key=/etc/mysql/client-key.pem +# ssl-cert = /etc/mysql/client-cert.pem +# ssl-key = /etc/mysql/client-key.pem # # Allow only TLS encrypted connections -# ssl-verify-server-cert=on +# ssl-verify-server-cert = on # This group is *never* read by mysql client library, though this # /etc/mysql/mariadb.cnf.d/client.cnf file is not read by Oracle MySQL diff --git a/debian/additions/mariadb.conf.d/50-mysqld_safe.cnf b/debian/additions/mariadb.conf.d/50-mysqld_safe.cnf index df8e82f5b3c..e24f96a9e65 100644 --- a/debian/additions/mariadb.conf.d/50-mysqld_safe.cnf +++ b/debian/additions/mariadb.conf.d/50-mysqld_safe.cnf @@ -9,12 +9,12 @@ # with the following contents: # # [Service] -# User=mysql -# StandardOutput=syslog -# StandardError=syslog -# SyslogFacility=daemon -# SyslogLevel=err -# SyslogIdentifier=mysqld +# User = mysql +# StandardOutput = syslog +# StandardError = syslog +# SyslogFacility = daemon +# SyslogLevel = err +# SyslogIdentifier = mysqld # # For more information, please read https://mariadb.com/kb/en/mariadb/systemd/ @@ -23,6 +23,6 @@ # It has been reported that passwords should be enclosed with ticks/quotes # especially if they contain "#" chars... -nice = 0 +nice = 0 skip_log_error syslog diff --git a/debian/additions/mariadb.conf.d/60-galera.cnf b/debian/additions/mariadb.conf.d/60-galera.cnf index 945c05281c9..55d7c0b0322 100644 --- a/debian/additions/mariadb.conf.d/60-galera.cnf +++ b/debian/additions/mariadb.conf.d/60-galera.cnf @@ -2,19 +2,20 @@ # * Galera-related settings # # See the examples of server wsrep.cnf files in /usr/share/mysql +# and read more at https://mariadb.com/kb/en/galera-cluster/ [galera] # Mandatory settings -#wsrep_on=ON -#wsrep_provider= -#wsrep_cluster_address= -#binlog_format=row -#default_storage_engine=InnoDB -#innodb_autoinc_lock_mode=2 +#wsrep_on = ON +#wsrep_provider = +#wsrep_cluster_address = +#binlog_format = row +#default_storage_engine = InnoDB +#innodb_autoinc_lock_mode = 2 # Allow server to accept connections on all interfaces. -#bind-address=0.0.0.0 +#bind-address = 0.0.0.0 # Optional settings -#wsrep_slave_threads=1 -#innodb_flush_log_at_trx_commit=0 +#wsrep_slave_threads = 1 +#innodb_flush_log_at_trx_commit = 0 diff --git a/storage/spider/spider.cnf b/storage/spider/spider.cnf index 2ee546962d6..ebc9968b490 100644 --- a/storage/spider/spider.cnf +++ b/storage/spider/spider.cnf @@ -1,5 +1,7 @@ [mariadb] # -# uncomment the following line to enable SPIDER storage engine +# Uncomment line to enable # -#plugin-load-add=ha_spider.so +#plugin-load-add = ha_spider + +# Read more at https://mariadb.com/kb/en/spider/ From 976abe64df0c662d36a86bfaac2e944a63064327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Sat, 1 Aug 2020 10:38:50 +0300 Subject: [PATCH 184/188] MDEV-21201: Add --sorted_result to the test, for 10.4 On MariaDB 10.4 (commit 4db4b773653eacba029631363ef1abdd5242b71a), the query results would not be sorted, which creates random result differences. Let us explicitly sort the results already in 10.3 in order to avoid future merge trouble. --- mysql-test/main/information_schema.test | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mysql-test/main/information_schema.test b/mysql-test/main/information_schema.test index d97aed0e0f2..dbb0622baf3 100644 --- a/mysql-test/main/information_schema.test +++ b/mysql-test/main/information_schema.test @@ -1932,6 +1932,7 @@ SELECT SCHEMA_NAME from information_schema.schemata where schema_name=REPEAT('a' create table t (i int, constraint a check (i > 0)); --disable_warnings +--sorted_result select tc.TABLE_SCHEMA, tc.TABLE_NAME, @@ -1941,6 +1942,7 @@ from information_schema.TABLE_CONSTRAINTS tc join information_schema.CHECK_CONSTRAINTS cc using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) ; +--sorted_result select tc.TABLE_SCHEMA, tc.TABLE_NAME, @@ -1950,6 +1952,7 @@ from information_schema.CHECK_CONSTRAINTS cc join information_schema.TABLE_CONSTRAINTS tc using (CONSTRAINT_CATALOG, CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAME) ; +--sorted_result select tc.TABLE_SCHEMA, tc.TABLE_NAME, @@ -1958,6 +1961,7 @@ select from information_schema.TABLE_CONSTRAINTS tc NATURAL join information_schema.CHECK_CONSTRAINTS cc ; +--sorted_result select tc.TABLE_SCHEMA, tc.TABLE_NAME, @@ -1966,6 +1970,7 @@ select from information_schema.CHECK_CONSTRAINTS cc NATURAL join information_schema.TABLE_CONSTRAINTS tc ; +--sorted_result select tc.TABLE_SCHEMA, tc.TABLE_NAME, From c12d24e29162f35f4fb751b761a0fbd84db19498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Sun, 2 Aug 2020 20:39:36 +0300 Subject: [PATCH 185/188] MDEV-23369 False sharing in page_hash_latch::read_lock_wait() MDEV-22871 refactored the InnoDB buf_pool.page_hash to use a simple rw-lock implementation that avoids a spinloop between non-contended read-lock requests, simply using std::atomic::fetch_add() for the lock acquisition. Alas, in a write-heavy stress test on a 56-core system with 1,000 concurrent client connections, the server would stop processing any transactions every now and then. The reason turned out to be false sharing. Attaching a debugger to the server during one such hang revealed that 22 of the 1,033 threads were polling in page_hash_latch::read_lock_wait() on the same object, which appeared to be in unlocked state (no readers or writers). All 22 requests were for accessing an undo log page, with a distinct page number. To eliminate such false sharing, we will make buf_pool.page_hash.array contain one page_hash_latch per CPU data cache line. On AMD64, this will pad the size of the array by 8/7, or almost 15%. For a 50GiB buffer pool of 16KiB pages, the buf_pool.page_hash.array would grow from 25MiB to 28.6MiB. On other instruction set architectures, the incurred memory overhead may be smaller. Thanks to Vladislav Vaintroub for noticing this anomaly. --- storage/innobase/include/buf0buf.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index 2677d4228fa..20bf8d5b24b 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -1824,7 +1824,8 @@ public: { /** Number of array[] elements per page_hash_latch. Must be one less than a power of 2. */ - static constexpr size_t ELEMENTS_PER_LATCH= 1023; + static constexpr size_t ELEMENTS_PER_LATCH= CPU_LEVEL1_DCACHE_LINESIZE / + sizeof(void*) - 1; /** number of payload elements in array[] */ Atomic_relaxed n_cells; From fd1d6969e6e49fe2634803bb66fe1f1348789747 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Tue, 4 Aug 2020 12:09:30 +1000 Subject: [PATCH 186/188] MDEV-23362: s3 - link to zlib The function uncompress from the zlib libraries is used in s3_get_object in s3_func.c. --- storage/maria/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/storage/maria/CMakeLists.txt b/storage/maria/CMakeLists.txt index d2c498e84be..0b71a94977a 100644 --- a/storage/maria/CMakeLists.txt +++ b/storage/maria/CMakeLists.txt @@ -118,12 +118,12 @@ ENDIF() IF (CURL_FOUND) LINK_DIRECTORIES(${PC_CURL_LIBDIR}) MYSQL_ADD_PLUGIN(s3 ha_s3.cc ${S3_SOURCES} COMPONENT s3-engine - LINK_LIBRARIES curl STORAGE_ENGINE NOT_EMBEDDED CONFIG s3.cnf) + LINK_LIBRARIES curl zlib STORAGE_ENGINE NOT_EMBEDDED CONFIG s3.cnf) ENDIF() IF(TARGET s3) MYSQL_ADD_EXECUTABLE(aria_s3_copy aria_s3_copy.cc ${S3_SOURCES} COMPONENT s3-engine) - TARGET_LINK_LIBRARIES(aria_s3_copy aria myisam mysys mysys_ssl curl) + TARGET_LINK_LIBRARIES(aria_s3_copy aria myisam mysys mysys_ssl curl zlib) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/libmarias3) ADD_DEFINITIONS(-DWITH_S3_STORAGE_ENGINE) ENDIF() From 7438fc4f7302c80a36e5883d76e4f4aff1e5c672 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Tue, 4 Aug 2020 12:19:40 +1000 Subject: [PATCH 187/188] MDEV-23362: s3 postfix libz -> z --- storage/maria/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/storage/maria/CMakeLists.txt b/storage/maria/CMakeLists.txt index 0b71a94977a..c21694a070c 100644 --- a/storage/maria/CMakeLists.txt +++ b/storage/maria/CMakeLists.txt @@ -118,12 +118,12 @@ ENDIF() IF (CURL_FOUND) LINK_DIRECTORIES(${PC_CURL_LIBDIR}) MYSQL_ADD_PLUGIN(s3 ha_s3.cc ${S3_SOURCES} COMPONENT s3-engine - LINK_LIBRARIES curl zlib STORAGE_ENGINE NOT_EMBEDDED CONFIG s3.cnf) + LINK_LIBRARIES curl z STORAGE_ENGINE NOT_EMBEDDED CONFIG s3.cnf) ENDIF() IF(TARGET s3) MYSQL_ADD_EXECUTABLE(aria_s3_copy aria_s3_copy.cc ${S3_SOURCES} COMPONENT s3-engine) - TARGET_LINK_LIBRARIES(aria_s3_copy aria myisam mysys mysys_ssl curl zlib) + TARGET_LINK_LIBRARIES(aria_s3_copy aria myisam mysys mysys_ssl curl z) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/libmarias3) ADD_DEFINITIONS(-DWITH_S3_STORAGE_ENGINE) ENDIF() From bbd70fcc43cc889e4593594ee5ca436fe1433aac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 4 Aug 2020 06:59:29 +0300 Subject: [PATCH 188/188] MDEV-23379 Deprecate&ignore InnoDB concurrency throttling parameters The parameters innodb_thread_concurrency and innodb_commit_concurrency were useful years ago when both computing resources and the implementation of some shared data structures were limited. MySQL 5.0 or 5.1 had trouble scaling beyond 8 concurrent connections. Most of the scalability bottlenecks have been removed since then, and the transactions per second delivered by MariaDB Server 10.5 should not dramatically drop upon exceeding the 'optimal' number of connections. Hence, enabling any concurrency throttling for InnoDB actually makes things worse. We have seen many customers mistakenly setting this to a small value like 16 or 64 and then complaining the server was slow. Ignoring the parameters allows us to remove some normally unused code and data structures, which could slightly improve performance. innodb_thread_concurrency, innodb_commit_concurrency, innodb_replication_delay, innodb_concurrency_tickets, innodb_thread_sleep_delay, innodb_adaptive_max_sleep_delay: Deprecate and ignore; hard-wire to 0. The column INFORMATION_SCHEMA.INNODB_TRX.trx_concurrency_tickets will always report 0. --- extra/mariabackup/xtrabackup.cc | 1 - mysql-test/include/mix1.inc | 4 - .../r/innodb_buffer_pool_resize_debug.result | 1 - .../innodb/r/innodb_bug42101-nonzero.result | 26 -- .../suite/innodb/r/innodb_bug42101.result | 22 - mysql-test/suite/innodb/r/innodb_mysql.result | 3 - mysql-test/suite/innodb/t/innodb.test | 7 - .../t/innodb_buffer_pool_resize_debug.test | 5 - .../t/innodb_bug42101-nonzero-master.opt | 1 - .../innodb/t/innodb_bug42101-nonzero.test | 20 - .../suite/innodb/t/innodb_bug42101.test | 18 - .../r/rpl_sync_with_innodb_thd_conc.result | 18 - .../rpl/t/rpl_sync_with_innodb_thd_conc.test | 41 -- ...nodb_adaptive_max_sleep_delay_basic.result | 24 +- .../r/innodb_commit_concurrency_basic.result | 26 +- .../r/innodb_concurrency_tickets_basic.result | 68 +-- .../r/innodb_replication_delay_basic.result | 34 +- .../r/innodb_thread_concurrency_basic.result | 38 +- .../r/innodb_thread_sleep_delay_basic.result | 46 +- .../sys_vars/r/sysvars_innodb,32bit.rdiff | 122 ++---- .../suite/sys_vars/r/sysvars_innodb.result | 36 +- .../t/innodb_commit_concurrency_basic.test | 12 +- storage/innobase/CMakeLists.txt | 2 - storage/innobase/handler/ha_innodb.cc | 392 +++++------------- storage/innobase/handler/i_s.cc | 3 +- storage/innobase/include/ha_prototypes.h | 5 +- storage/innobase/include/que0types.h | 1 + storage/innobase/include/srv0conc.h | 93 ----- storage/innobase/include/srv0srv.h | 27 +- storage/innobase/include/srv0start.h | 4 +- storage/innobase/include/trx0i_s.h | 5 +- storage/innobase/include/trx0trx.h | 15 - storage/innobase/lock/lock0wait.cc | 18 - storage/innobase/log/log0log.cc | 2 +- storage/innobase/srv/srv0conc.cc | 327 --------------- storage/innobase/srv/srv0srv.cc | 9 - storage/innobase/srv/srv0start.cc | 14 +- storage/innobase/trx/trx0i_s.cc | 2 - storage/innobase/trx/trx0trx.cc | 23 - 39 files changed, 345 insertions(+), 1170 deletions(-) delete mode 100644 mysql-test/suite/innodb/r/innodb_bug42101-nonzero.result delete mode 100644 mysql-test/suite/innodb/r/innodb_bug42101.result delete mode 100644 mysql-test/suite/innodb/t/innodb_bug42101-nonzero-master.opt delete mode 100644 mysql-test/suite/innodb/t/innodb_bug42101-nonzero.test delete mode 100644 mysql-test/suite/innodb/t/innodb_bug42101.test delete mode 100644 mysql-test/suite/rpl/r/rpl_sync_with_innodb_thd_conc.result delete mode 100644 mysql-test/suite/rpl/t/rpl_sync_with_innodb_thd_conc.test delete mode 100644 storage/innobase/include/srv0conc.h delete mode 100644 storage/innobase/srv/srv0conc.cc diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 1a79068d5a5..650ab49fbcd 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -5376,7 +5376,6 @@ static bool xtrabackup_prepare_func(char** argv) xb_filters_init(); srv_log_group_home_dir = NULL; - srv_thread_concurrency = 1; if (xtrabackup_incremental) { srv_operation = SRV_OPERATION_RESTORE_DELTA; diff --git a/mysql-test/include/mix1.inc b/mysql-test/include/mix1.inc index 30b17c2e063..2ec0868c39e 100644 --- a/mysql-test/include/mix1.inc +++ b/mysql-test/include/mix1.inc @@ -1183,10 +1183,6 @@ set @my_innodb_autoextend_increment=@@global.innodb_autoextend_increment; set global innodb_autoextend_increment=8; set global innodb_autoextend_increment=@my_innodb_autoextend_increment; -set @my_innodb_commit_concurrency=@@global.innodb_commit_concurrency; -set global innodb_commit_concurrency=0; -set global innodb_commit_concurrency=@my_innodb_commit_concurrency; - # # Bug #37830: ORDER BY ASC/DESC - no difference # diff --git a/mysql-test/suite/innodb/r/innodb_buffer_pool_resize_debug.result b/mysql-test/suite/innodb/r/innodb_buffer_pool_resize_debug.result index f1faeb1d554..0dea25f6bf1 100644 --- a/mysql-test/suite/innodb/r/innodb_buffer_pool_resize_debug.result +++ b/mysql-test/suite/innodb/r/innodb_buffer_pool_resize_debug.result @@ -1,5 +1,4 @@ set global innodb_file_per_table=ON; -set global innodb_thread_concurrency=20; connect con1,localhost,root,,; connect con2,localhost,root,,; connect con3,localhost,root,,; diff --git a/mysql-test/suite/innodb/r/innodb_bug42101-nonzero.result b/mysql-test/suite/innodb/r/innodb_bug42101-nonzero.result deleted file mode 100644 index f43cb9da239..00000000000 --- a/mysql-test/suite/innodb/r/innodb_bug42101-nonzero.result +++ /dev/null @@ -1,26 +0,0 @@ -set global innodb_commit_concurrency=0; -ERROR 42000: Variable 'innodb_commit_concurrency' can't be set to the value of '0' -select @@innodb_commit_concurrency; -@@innodb_commit_concurrency -1 -set global innodb_commit_concurrency=1; -select @@innodb_commit_concurrency; -@@innodb_commit_concurrency -1 -set global innodb_commit_concurrency=42; -select @@innodb_commit_concurrency; -@@innodb_commit_concurrency -42 -set global innodb_commit_concurrency=DEFAULT; -select @@innodb_commit_concurrency; -@@innodb_commit_concurrency -1 -set global innodb_commit_concurrency=0; -ERROR 42000: Variable 'innodb_commit_concurrency' can't be set to the value of '0' -select @@innodb_commit_concurrency; -@@innodb_commit_concurrency -1 -set global innodb_commit_concurrency=1; -select @@innodb_commit_concurrency; -@@innodb_commit_concurrency -1 diff --git a/mysql-test/suite/innodb/r/innodb_bug42101.result b/mysql-test/suite/innodb/r/innodb_bug42101.result deleted file mode 100644 index 4e3367d5a54..00000000000 --- a/mysql-test/suite/innodb/r/innodb_bug42101.result +++ /dev/null @@ -1,22 +0,0 @@ -set global innodb_commit_concurrency=0; -select @@innodb_commit_concurrency; -@@innodb_commit_concurrency -0 -set global innodb_commit_concurrency=1; -ERROR 42000: Variable 'innodb_commit_concurrency' can't be set to the value of '1' -select @@innodb_commit_concurrency; -@@innodb_commit_concurrency -0 -set global innodb_commit_concurrency=42; -ERROR 42000: Variable 'innodb_commit_concurrency' can't be set to the value of '42' -select @@innodb_commit_concurrency; -@@innodb_commit_concurrency -0 -set global innodb_commit_concurrency=0; -select @@innodb_commit_concurrency; -@@innodb_commit_concurrency -0 -set global innodb_commit_concurrency=DEFAULT; -select @@innodb_commit_concurrency; -@@innodb_commit_concurrency -0 diff --git a/mysql-test/suite/innodb/r/innodb_mysql.result b/mysql-test/suite/innodb/r/innodb_mysql.result index 31db0622fe1..595a56a8bef 100644 --- a/mysql-test/suite/innodb/r/innodb_mysql.result +++ b/mysql-test/suite/innodb/r/innodb_mysql.result @@ -1797,9 +1797,6 @@ DROP TABLE t1; set @my_innodb_autoextend_increment=@@global.innodb_autoextend_increment; set global innodb_autoextend_increment=8; set global innodb_autoextend_increment=@my_innodb_autoextend_increment; -set @my_innodb_commit_concurrency=@@global.innodb_commit_concurrency; -set global innodb_commit_concurrency=0; -set global innodb_commit_concurrency=@my_innodb_commit_concurrency; CREATE TABLE t1 (a int, b int, c int, PRIMARY KEY (a), KEY t1_b (b)) ENGINE=InnoDB; INSERT INTO t1 (a,b,c) VALUES (1,1,1), (2,1,1), (3,1,1), (4,1,1); diff --git a/mysql-test/suite/innodb/t/innodb.test b/mysql-test/suite/innodb/t/innodb.test index 6fd2cdc74d2..dfb4da3a63d 100644 --- a/mysql-test/suite/innodb/t/innodb.test +++ b/mysql-test/suite/innodb/t/innodb.test @@ -24,10 +24,6 @@ call mtr.add_suppression("Cannot add field .* in table .* because after adding i call mtr.add_suppression("\\[ERROR\\] InnoDB: in ALTER TABLE `test`.`t1`"); call mtr.add_suppression("\\[ERROR\\] InnoDB: in RENAME TABLE table `test`.`t1`"); -SET @innodb_thread_sleep_delay_orig = @@innodb_thread_sleep_delay; - -SET @innodb_thread_concurrency_orig = @@innodb_thread_concurrency; - --disable_warnings SET @innodb_rows_deleted_orig = (SELECT variable_value FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_rows_deleted'); SET @innodb_rows_inserted_orig = (SELECT variable_value FROM information_schema.global_status WHERE LOWER(variable_name) = 'innodb_rows_inserted'); @@ -2503,9 +2499,6 @@ DROP TABLE bug35537; DISCONNECT c1; CONNECTION default; -SET GLOBAL innodb_thread_sleep_delay = @innodb_thread_sleep_delay_orig; -SET GLOBAL innodb_thread_concurrency = @innodb_thread_concurrency_orig; - -- enable_query_log # Clean up after the Bug#55284/Bug#58912 test case. diff --git a/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_debug.test b/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_debug.test index 4f5ee089852..ddac64c17c9 100644 --- a/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_debug.test +++ b/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_debug.test @@ -9,8 +9,6 @@ --disable_query_log set @old_innodb_buffer_pool_size = @@innodb_buffer_pool_size; set @old_innodb_file_per_table = @@innodb_file_per_table; -set @old_innodb_thread_concurrency = @@innodb_thread_concurrency; -set @old_innodb_thread_sleep_delay = @@innodb_thread_sleep_delay; set @old_innodb_disable_resize = @@innodb_disable_resize_buffer_pool_debug; set global innodb_disable_resize_buffer_pool_debug = OFF; call mtr.add_suppression("\\[ERROR\\] InnoDB: failed to allocate memory for buffer pool chunk"); @@ -22,7 +20,6 @@ call mtr.add_suppression("\\[ERROR\\] InnoDB: failed to allocate memory for buff let $wait_timeout = 180; set global innodb_file_per_table=ON; -set global innodb_thread_concurrency=20; connect (con1,localhost,root,,); connect (con2,localhost,root,,); @@ -178,8 +175,6 @@ drop table t6; --disable_query_log set global innodb_buffer_pool_size = @old_innodb_buffer_pool_size; set global innodb_file_per_table = @old_innodb_file_per_table; -set global innodb_thread_concurrency = @old_innodb_thread_concurrency; -set global innodb_thread_sleep_delay = @old_innodb_thread_sleep_delay; set global innodb_disable_resize_buffer_pool_debug = @old_innodb_disable_resize; --enable_query_log diff --git a/mysql-test/suite/innodb/t/innodb_bug42101-nonzero-master.opt b/mysql-test/suite/innodb/t/innodb_bug42101-nonzero-master.opt deleted file mode 100644 index e82f614c897..00000000000 --- a/mysql-test/suite/innodb/t/innodb_bug42101-nonzero-master.opt +++ /dev/null @@ -1 +0,0 @@ ---loose-innodb-commit-concurrency=1 diff --git a/mysql-test/suite/innodb/t/innodb_bug42101-nonzero.test b/mysql-test/suite/innodb/t/innodb_bug42101-nonzero.test deleted file mode 100644 index 3ee3f1e6a8b..00000000000 --- a/mysql-test/suite/innodb/t/innodb_bug42101-nonzero.test +++ /dev/null @@ -1,20 +0,0 @@ ---source include/have_innodb.inc -# -# Bug#42101 Race condition in innodb_commit_concurrency -# http://bugs.mysql.com/42101 -# - ---error ER_WRONG_VALUE_FOR_VAR -set global innodb_commit_concurrency=0; -select @@innodb_commit_concurrency; -set global innodb_commit_concurrency=1; -select @@innodb_commit_concurrency; -set global innodb_commit_concurrency=42; -select @@innodb_commit_concurrency; -set global innodb_commit_concurrency=DEFAULT; -select @@innodb_commit_concurrency; ---error ER_WRONG_VALUE_FOR_VAR -set global innodb_commit_concurrency=0; -select @@innodb_commit_concurrency; -set global innodb_commit_concurrency=1; -select @@innodb_commit_concurrency; diff --git a/mysql-test/suite/innodb/t/innodb_bug42101.test b/mysql-test/suite/innodb/t/innodb_bug42101.test deleted file mode 100644 index 374d3e6b5f5..00000000000 --- a/mysql-test/suite/innodb/t/innodb_bug42101.test +++ /dev/null @@ -1,18 +0,0 @@ ---source include/have_innodb.inc -# -# Bug#42101 Race condition in innodb_commit_concurrency -# http://bugs.mysql.com/42101 -# - -set global innodb_commit_concurrency=0; -select @@innodb_commit_concurrency; ---error ER_WRONG_VALUE_FOR_VAR -set global innodb_commit_concurrency=1; -select @@innodb_commit_concurrency; ---error ER_WRONG_VALUE_FOR_VAR -set global innodb_commit_concurrency=42; -select @@innodb_commit_concurrency; -set global innodb_commit_concurrency=0; -select @@innodb_commit_concurrency; -set global innodb_commit_concurrency=DEFAULT; -select @@innodb_commit_concurrency; diff --git a/mysql-test/suite/rpl/r/rpl_sync_with_innodb_thd_conc.result b/mysql-test/suite/rpl/r/rpl_sync_with_innodb_thd_conc.result deleted file mode 100644 index cd9ac1db9b1..00000000000 --- a/mysql-test/suite/rpl/r/rpl_sync_with_innodb_thd_conc.result +++ /dev/null @@ -1,18 +0,0 @@ -include/master-slave.inc -[connection master] -connection slave; -SET @old_innodb_thread_concurrency := @@innodb_thread_concurrency; -SET @old_innodb_thread_sleep_delay := @@innodb_thread_sleep_delay; -SET GLOBAL innodb_thread_concurrency = 100; -connection master; -CREATE TABLE t(f INT) ENGINE=INNODB; -INSERT INTO t VALUES (10); -connection slave; -include/diff_tables.inc [master:t, slave:t] -"===== Clean up=======" -connection master; -DROP TABLE t; -connection slave; -SET GLOBAL innodb_thread_concurrency = @old_innodb_thread_concurrency; -SET GLOBAL innodb_thread_sleep_delay = @old_innodb_thread_sleep_delay; -include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_sync_with_innodb_thd_conc.test b/mysql-test/suite/rpl/t/rpl_sync_with_innodb_thd_conc.test deleted file mode 100644 index b4c2971d2fb..00000000000 --- a/mysql-test/suite/rpl/t/rpl_sync_with_innodb_thd_conc.test +++ /dev/null @@ -1,41 +0,0 @@ -# ==== Purpose ==== -# -# Test verifies that replication shouldn't hang when number of active threads -# on the slave server are less than the allowed innodb_thread_concurrency value. -# -# ==== Implementation ==== -# -# Steps: -# 0 - Have master slave replication setup with engine being Innodb. -# 1 - Configure innodb_thread_concurrency = 100. -# 2 - Do some DML on master and sync the slave with master. -# 3 - Ensure replication doesn't hang. -# -# ==== References ==== -# -# MDEV-20247: Replication hangs with "preparing" and never starts -# - ---source include/master-slave.inc ---source include/have_innodb.inc - ---connection slave -SET @old_innodb_thread_concurrency := @@innodb_thread_concurrency; -SET @old_innodb_thread_sleep_delay := @@innodb_thread_sleep_delay; -SET GLOBAL innodb_thread_concurrency = 100; - ---connection master -CREATE TABLE t(f INT) ENGINE=INNODB; -INSERT INTO t VALUES (10); ---sync_slave_with_master - ---let $diff_tables=master:t, slave:t ---source include/diff_tables.inc - ---echo "===== Clean up=======" ---connection master -DROP TABLE t; ---sync_slave_with_master -SET GLOBAL innodb_thread_concurrency = @old_innodb_thread_concurrency; -SET GLOBAL innodb_thread_sleep_delay = @old_innodb_thread_sleep_delay; ---source include/rpl_end.inc diff --git a/mysql-test/suite/sys_vars/r/innodb_adaptive_max_sleep_delay_basic.result b/mysql-test/suite/sys_vars/r/innodb_adaptive_max_sleep_delay_basic.result index b3ba28a4411..c5f468a7427 100644 --- a/mysql-test/suite/sys_vars/r/innodb_adaptive_max_sleep_delay_basic.result +++ b/mysql-test/suite/sys_vars/r/innodb_adaptive_max_sleep_delay_basic.result @@ -1,37 +1,48 @@ SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay; @@GLOBAL.innodb_adaptive_max_sleep_delay -150000 +0 150000 Expected SET @@GLOBAL.innodb_adaptive_max_sleep_delay=100; +Warnings: +Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect. SET @@GLOBAL.innodb_adaptive_max_sleep_delay=0; +Warnings: +Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect. SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay; @@GLOBAL.innodb_adaptive_max_sleep_delay 0 SET @@GLOBAL.innodb_adaptive_max_sleep_delay=100000; +Warnings: +Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect. SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay; @@GLOBAL.innodb_adaptive_max_sleep_delay -100000 +0 SET @@GLOBAL.innodb_adaptive_max_sleep_delay=1000000; +Warnings: +Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect. SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay; @@GLOBAL.innodb_adaptive_max_sleep_delay -1000000 +0 SET @@GLOBAL.innodb_adaptive_max_sleep_delay=1000001; Warnings: Warning 1292 Truncated incorrect innodb_adaptive_max_sleep_delay value: '1000001' +Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect. SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay; @@GLOBAL.innodb_adaptive_max_sleep_delay -1000000 +0 1000000 Expected SET @@GLOBAL.innodb_adaptive_max_sleep_delay=4294967295; Warnings: Warning 1292 Truncated incorrect innodb_adaptive_max_sleep_delay value: '4294967295' +Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect. SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay; @@GLOBAL.innodb_adaptive_max_sleep_delay -1000000 +0 1000000 Expected SET @@GLOBAL.innodb_adaptive_max_sleep_delay=-1; Warnings: Warning 1292 Truncated incorrect innodb_adaptive_max_sleep_delay value: '-1' +Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect. SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay; @@GLOBAL.innodb_adaptive_max_sleep_delay 0 @@ -39,6 +50,7 @@ SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay; SET @@GLOBAL.innodb_adaptive_max_sleep_delay=-1024; Warnings: Warning 1292 Truncated incorrect innodb_adaptive_max_sleep_delay value: '-1024' +Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect. SELECT @@GLOBAL.innodb_adaptive_max_sleep_delay; @@GLOBAL.innodb_adaptive_max_sleep_delay 0 @@ -70,3 +82,5 @@ Expected error 'Variable is a GLOBAL variable' SELECT innodb_adaptive_max_sleep_delay = @@SESSION.innodb_adaptive_max_sleep_delay; ERROR 42S22: Unknown column 'innodb_adaptive_max_sleep_delay' in 'field list' SET @@GLOBAL.innodb_adaptive_max_sleep_delay=150000; +Warnings: +Warning 138 The parameter innodb_adaptive_max_sleep_delay is deprecated and has no effect. diff --git a/mysql-test/suite/sys_vars/r/innodb_commit_concurrency_basic.result b/mysql-test/suite/sys_vars/r/innodb_commit_concurrency_basic.result index 474818829c5..3c1f6a7d2aa 100644 --- a/mysql-test/suite/sys_vars/r/innodb_commit_concurrency_basic.result +++ b/mysql-test/suite/sys_vars/r/innodb_commit_concurrency_basic.result @@ -4,35 +4,49 @@ SELECT @global_start_value; 0 '#--------------------FN_DYNVARS_046_01------------------------#' SET @@global.innodb_commit_concurrency = 0; +Warnings: +Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect. SET @@global.innodb_commit_concurrency = DEFAULT; +Warnings: +Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect. SELECT @@global.innodb_commit_concurrency; @@global.innodb_commit_concurrency 0 '#---------------------FN_DYNVARS_046_02-------------------------#' SET innodb_commit_concurrency = 1; ERROR HY000: Variable 'innodb_commit_concurrency' is a GLOBAL variable and should be set with SET GLOBAL +SET GLOBAL innodb_commit_concurrency = 1; +Warnings: +Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect. SELECT @@innodb_commit_concurrency; @@innodb_commit_concurrency 0 SELECT local.innodb_commit_concurrency; ERROR 42S02: Unknown table 'local' in field list SET global innodb_commit_concurrency = 0; +Warnings: +Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect. SELECT @@global.innodb_commit_concurrency; @@global.innodb_commit_concurrency 0 '#--------------------FN_DYNVARS_046_03------------------------#' SET @@global.innodb_commit_concurrency = 0; +Warnings: +Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect. SELECT @@global.innodb_commit_concurrency; @@global.innodb_commit_concurrency 0 '#--------------------FN_DYNVARS_046_04-------------------------#' -SET @@global.innodb_commit_concurrency = 1; -ERROR 42000: Variable 'innodb_commit_concurrency' can't be set to the value of '1' +SELECT @@global.innodb_commit_concurrency; +@@global.innodb_commit_concurrency +0 SELECT @@global.innodb_commit_concurrency; @@global.innodb_commit_concurrency 0 SET @@global.innodb_commit_concurrency = -1; -ERROR 42000: Variable 'innodb_commit_concurrency' can't be set to the value of '-1' +Warnings: +Warning 1292 Truncated incorrect innodb_commit_concurrency value: '-1' +Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect. SELECT @@global.innodb_commit_concurrency; @@global.innodb_commit_concurrency 0 @@ -52,7 +66,9 @@ SELECT @@global.innodb_commit_concurrency; @@global.innodb_commit_concurrency 0 SET @@global.innodb_commit_concurrency = 1001; -ERROR 42000: Variable 'innodb_commit_concurrency' can't be set to the value of '1001' +Warnings: +Warning 1292 Truncated incorrect innodb_commit_concurrency value: '1001' +Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect. SELECT @@global.innodb_commit_concurrency; @@global.innodb_commit_concurrency 0 @@ -82,6 +98,8 @@ SELECT @@global.innodb_commit_concurrency; @@global.innodb_commit_concurrency 0 SET @@global.innodb_commit_concurrency = @global_start_value; +Warnings: +Warning 138 The parameter innodb_commit_concurrency is deprecated and has no effect. SELECT @@global.innodb_commit_concurrency; @@global.innodb_commit_concurrency 0 diff --git a/mysql-test/suite/sys_vars/r/innodb_concurrency_tickets_basic.result b/mysql-test/suite/sys_vars/r/innodb_concurrency_tickets_basic.result index dd4488a97b3..5d35833dd88 100644 --- a/mysql-test/suite/sys_vars/r/innodb_concurrency_tickets_basic.result +++ b/mysql-test/suite/sys_vars/r/innodb_concurrency_tickets_basic.result @@ -1,93 +1,103 @@ SET @global_start_value = @@global.innodb_concurrency_tickets; SELECT @global_start_value; @global_start_value -5000 +0 '#--------------------FN_DYNVARS_046_01------------------------#' SET @@global.innodb_concurrency_tickets = 0; Warnings: -Warning 1292 Truncated incorrect innodb_concurrency_tickets value: '0' +Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect. SET @@global.innodb_concurrency_tickets = DEFAULT; +Warnings: +Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect. SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -5000 +0 '#---------------------FN_DYNVARS_046_02-------------------------#' SET innodb_concurrency_tickets = 1; ERROR HY000: Variable 'innodb_concurrency_tickets' is a GLOBAL variable and should be set with SET GLOBAL SELECT @@innodb_concurrency_tickets; @@innodb_concurrency_tickets -5000 +0 SELECT local.innodb_concurrency_tickets; ERROR 42S02: Unknown table 'local' in field list SET global innodb_concurrency_tickets = 0; Warnings: -Warning 1292 Truncated incorrect innodb_concurrency_tickets value: '0' +Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect. SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1 +0 '#--------------------FN_DYNVARS_046_03------------------------#' SET @@global.innodb_concurrency_tickets = 1; +Warnings: +Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect. SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1 +0 SET @@global.innodb_concurrency_tickets = 1000; +Warnings: +Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect. SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1000 +0 SET @@global.innodb_concurrency_tickets = 4294967295; +Warnings: +Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect. SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -4294967295 +0 '#--------------------FN_DYNVARS_046_04-------------------------#' SET @@global.innodb_concurrency_tickets = 4294967296; SELECT @@global.innodb_concurrency_tickets IN (4294967296,4294967295); @@global.innodb_concurrency_tickets IN (4294967296,4294967295) -1 +0 SET @@global.innodb_concurrency_tickets = 12345678901; SELECT @@global.innodb_concurrency_tickets IN (12345678901,4294967295); @@global.innodb_concurrency_tickets IN (12345678901,4294967295) -1 +0 SET @@global.innodb_concurrency_tickets = 18446744073709551615; SELECT @@global.innodb_concurrency_tickets IN (18446744073709551615,4294967295); @@global.innodb_concurrency_tickets IN (18446744073709551615,4294967295) -1 +0 '#--------------------FN_DYNVARS_046_05-------------------------#' SET @@global.innodb_concurrency_tickets = -1; Warnings: Warning 1292 Truncated incorrect innodb_concurrency_tickets value: '-1' +Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect. SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1 +0 SET @@global.innodb_concurrency_tickets = -1024; Warnings: Warning 1292 Truncated incorrect innodb_concurrency_tickets value: '-1024' +Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect. SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1 +0 SET @@global.innodb_concurrency_tickets = "T"; ERROR 42000: Incorrect argument type to variable 'innodb_concurrency_tickets' SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1 +0 SET @@global.innodb_concurrency_tickets = "Y"; ERROR 42000: Incorrect argument type to variable 'innodb_concurrency_tickets' SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1 +0 SET @@global.innodb_concurrency_tickets = 1.1; ERROR 42000: Incorrect argument type to variable 'innodb_concurrency_tickets' SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1 +0 SET @@global.innodb_concurrency_tickets = " "; ERROR 42000: Incorrect argument type to variable 'innodb_concurrency_tickets' SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1 +0 SET @@global.innodb_concurrency_tickets = ' '; ERROR 42000: Incorrect argument type to variable 'innodb_concurrency_tickets' SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1 +0 '#----------------------FN_DYNVARS_046_06------------------------#' SELECT @@global.innodb_concurrency_tickets = VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES @@ -97,34 +107,38 @@ VARIABLE_VALUE 1 SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1 +0 SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='innodb_concurrency_tickets'; VARIABLE_VALUE -1 +0 '#---------------------FN_DYNVARS_046_07-------------------------#' SET @@global.innodb_concurrency_tickets = OFF; ERROR 42000: Incorrect argument type to variable 'innodb_concurrency_tickets' SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1 +0 SET @@global.innodb_concurrency_tickets = ON; ERROR 42000: Incorrect argument type to variable 'innodb_concurrency_tickets' SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1 +0 '#---------------------FN_DYNVARS_046_08----------------------#' SET @@global.innodb_concurrency_tickets = TRUE; +Warnings: +Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect. SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1 +0 SET @@global.innodb_concurrency_tickets = FALSE; Warnings: -Warning 1292 Truncated incorrect innodb_concurrency_tickets value: '0' +Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect. SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -1 +0 SET @@global.innodb_concurrency_tickets = @global_start_value; +Warnings: +Warning 138 The parameter innodb_concurrency_tickets is deprecated and has no effect. SELECT @@global.innodb_concurrency_tickets; @@global.innodb_concurrency_tickets -5000 +0 diff --git a/mysql-test/suite/sys_vars/r/innodb_replication_delay_basic.result b/mysql-test/suite/sys_vars/r/innodb_replication_delay_basic.result index 5e0fb425f6b..53a499ff34b 100644 --- a/mysql-test/suite/sys_vars/r/innodb_replication_delay_basic.result +++ b/mysql-test/suite/sys_vars/r/innodb_replication_delay_basic.result @@ -24,33 +24,43 @@ select * from information_schema.session_variables where variable_name='innodb_r VARIABLE_NAME VARIABLE_VALUE INNODB_REPLICATION_DELAY 0 set global innodb_replication_delay=10; +Warnings: +Warning 138 The parameter innodb_replication_delay is deprecated and has no effect. select @@global.innodb_replication_delay; @@global.innodb_replication_delay -10 +0 select * from information_schema.global_variables where variable_name='innodb_replication_delay'; VARIABLE_NAME VARIABLE_VALUE -INNODB_REPLICATION_DELAY 10 +INNODB_REPLICATION_DELAY 0 select * from information_schema.session_variables where variable_name='innodb_replication_delay'; VARIABLE_NAME VARIABLE_VALUE -INNODB_REPLICATION_DELAY 10 +INNODB_REPLICATION_DELAY 0 set session innodb_replication_delay=1; ERROR HY000: Variable 'innodb_replication_delay' is a GLOBAL variable and should be set with SET GLOBAL set global innodb_replication_delay=DEFAULT; +Warnings: +Warning 138 The parameter innodb_replication_delay is deprecated and has no effect. select @@global.innodb_replication_delay; @@global.innodb_replication_delay 0 set global innodb_replication_delay=0; +Warnings: +Warning 138 The parameter innodb_replication_delay is deprecated and has no effect. select @@global.innodb_replication_delay; @@global.innodb_replication_delay 0 set global innodb_replication_delay=65535; +Warnings: +Warning 138 The parameter innodb_replication_delay is deprecated and has no effect. select @@global.innodb_replication_delay; @@global.innodb_replication_delay -65535 +0 set global innodb_replication_delay=4294967295; +Warnings: +Warning 138 The parameter innodb_replication_delay is deprecated and has no effect. select @@global.innodb_replication_delay; @@global.innodb_replication_delay -4294967295 +0 set global innodb_replication_delay=1.1; ERROR 42000: Incorrect argument type to variable 'innodb_replication_delay' set global innodb_replication_delay=1e1; @@ -61,21 +71,23 @@ set global innodb_replication_delay=' '; ERROR 42000: Incorrect argument type to variable 'innodb_replication_delay' select @@global.innodb_replication_delay; @@global.innodb_replication_delay -4294967295 +0 set global innodb_replication_delay=" "; ERROR 42000: Incorrect argument type to variable 'innodb_replication_delay' select @@global.innodb_replication_delay; @@global.innodb_replication_delay -4294967295 +0 set global innodb_replication_delay=-7; Warnings: Warning 1292 Truncated incorrect innodb_replication_delay value: '-7' +Warning 138 The parameter innodb_replication_delay is deprecated and has no effect. select @@global.innodb_replication_delay; @@global.innodb_replication_delay 0 set global innodb_replication_delay=-1024; Warnings: Warning 1292 Truncated incorrect innodb_replication_delay value: '-1024' +Warning 138 The parameter innodb_replication_delay is deprecated and has no effect. select @@global.innodb_replication_delay; @@global.innodb_replication_delay 0 @@ -85,16 +97,18 @@ INNODB_REPLICATION_DELAY 0 SET @@global.innodb_replication_delay = 4294967296; SELECT @@global.innodb_replication_delay IN (4294967296,4294967295); @@global.innodb_replication_delay IN (4294967296,4294967295) -1 +0 SET @@global.innodb_replication_delay = 12345678901; SELECT @@global.innodb_replication_delay IN (12345678901,4294967295); @@global.innodb_replication_delay IN (12345678901,4294967295) -1 +0 SET @@global.innodb_replication_delay = 18446744073709551615; SELECT @@global.innodb_replication_delay IN (18446744073709551615,4294967295); @@global.innodb_replication_delay IN (18446744073709551615,4294967295) -1 +0 SET @@global.innodb_replication_delay = @start_global_value; +Warnings: +Warning 138 The parameter innodb_replication_delay is deprecated and has no effect. SELECT @@global.innodb_replication_delay; @@global.innodb_replication_delay 0 diff --git a/mysql-test/suite/sys_vars/r/innodb_thread_concurrency_basic.result b/mysql-test/suite/sys_vars/r/innodb_thread_concurrency_basic.result index ca3c253604a..39d1a659a20 100644 --- a/mysql-test/suite/sys_vars/r/innodb_thread_concurrency_basic.result +++ b/mysql-test/suite/sys_vars/r/innodb_thread_concurrency_basic.result @@ -4,7 +4,11 @@ SELECT @global_start_value; 0 '#--------------------FN_DYNVARS_046_01------------------------#' SET @@global.innodb_thread_concurrency = 0; +Warnings: +Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect. SET @@global.innodb_thread_concurrency = DEFAULT; +Warnings: +Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect. SELECT @@global.innodb_thread_concurrency; @@global.innodb_thread_concurrency 0 @@ -17,26 +21,35 @@ SELECT @@innodb_thread_concurrency; SELECT local.innodb_thread_concurrency; ERROR 42S02: Unknown table 'local' in field list SET global innodb_thread_concurrency = 0; +Warnings: +Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect. SELECT @@global.innodb_thread_concurrency; @@global.innodb_thread_concurrency 0 '#--------------------FN_DYNVARS_046_03------------------------#' SET @@global.innodb_thread_concurrency = 0; +Warnings: +Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect. SELECT @@global.innodb_thread_concurrency; @@global.innodb_thread_concurrency 0 SET @@global.innodb_thread_concurrency = 1; +Warnings: +Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect. SELECT @@global.innodb_thread_concurrency; @@global.innodb_thread_concurrency -1 +0 SET @@global.innodb_thread_concurrency = 1000; +Warnings: +Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect. SELECT @@global.innodb_thread_concurrency; @@global.innodb_thread_concurrency -1000 +0 '#--------------------FN_DYNVARS_046_04-------------------------#' SET @@global.innodb_thread_concurrency = -1; Warnings: Warning 1292 Truncated incorrect innodb_thread_concurrency value: '-1' +Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect. SELECT @@global.innodb_thread_concurrency; @@global.innodb_thread_concurrency 0 @@ -63,14 +76,15 @@ SELECT @@global.innodb_thread_concurrency; SET @@global.innodb_thread_concurrency = 1001; Warnings: Warning 1292 Truncated incorrect innodb_thread_concurrency value: '1001' +Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect. SELECT @@global.innodb_thread_concurrency; @@global.innodb_thread_concurrency -1000 +0 SET @@global.innodb_thread_concurrency = 255.01; ERROR 42000: Incorrect argument type to variable 'innodb_thread_concurrency' SELECT @@global.innodb_thread_concurrency; @@global.innodb_thread_concurrency -1000 +0 '#----------------------FN_DYNVARS_046_05------------------------#' SELECT @@global.innodb_thread_concurrency = VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES @@ -80,32 +94,38 @@ VARIABLE_VALUE 1 SELECT @@global.innodb_thread_concurrency; @@global.innodb_thread_concurrency -1000 +0 SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='innodb_thread_concurrency'; VARIABLE_VALUE -1000 +0 '#---------------------FN_DYNVARS_046_06-------------------------#' SET @@global.innodb_thread_concurrency = OFF; ERROR 42000: Incorrect argument type to variable 'innodb_thread_concurrency' SELECT @@global.innodb_thread_concurrency; @@global.innodb_thread_concurrency -1000 +0 SET @@global.innodb_thread_concurrency = ON; ERROR 42000: Incorrect argument type to variable 'innodb_thread_concurrency' SELECT @@global.innodb_thread_concurrency; @@global.innodb_thread_concurrency -1000 +0 '#---------------------FN_DYNVARS_046_07----------------------#' SET @@global.innodb_thread_concurrency = TRUE; +Warnings: +Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect. SELECT @@global.innodb_thread_concurrency; @@global.innodb_thread_concurrency -1 +0 SET @@global.innodb_thread_concurrency = FALSE; +Warnings: +Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect. SELECT @@global.innodb_thread_concurrency; @@global.innodb_thread_concurrency 0 SET @@global.innodb_thread_concurrency = @global_start_value; +Warnings: +Warning 138 The parameter innodb_thread_concurrency is deprecated and has no effect. SELECT @@global.innodb_thread_concurrency; @@global.innodb_thread_concurrency 0 diff --git a/mysql-test/suite/sys_vars/r/innodb_thread_sleep_delay_basic.result b/mysql-test/suite/sys_vars/r/innodb_thread_sleep_delay_basic.result index c2017ee0b66..b6310bb5652 100644 --- a/mysql-test/suite/sys_vars/r/innodb_thread_sleep_delay_basic.result +++ b/mysql-test/suite/sys_vars/r/innodb_thread_sleep_delay_basic.result @@ -1,38 +1,40 @@ SET @start_global_value = @@global.innodb_thread_sleep_delay; SELECT @start_global_value; @start_global_value -10000 +0 Valid values are zero or above select @@global.innodb_thread_sleep_delay >=0; @@global.innodb_thread_sleep_delay >=0 1 select @@global.innodb_thread_sleep_delay; @@global.innodb_thread_sleep_delay -10000 +0 select @@session.innodb_thread_sleep_delay; ERROR HY000: Variable 'innodb_thread_sleep_delay' is a GLOBAL variable show global variables like 'innodb_thread_sleep_delay'; Variable_name Value -innodb_thread_sleep_delay 10000 +innodb_thread_sleep_delay 0 show session variables like 'innodb_thread_sleep_delay'; Variable_name Value -innodb_thread_sleep_delay 10000 +innodb_thread_sleep_delay 0 select * from information_schema.global_variables where variable_name='innodb_thread_sleep_delay'; VARIABLE_NAME VARIABLE_VALUE -INNODB_THREAD_SLEEP_DELAY 10000 +INNODB_THREAD_SLEEP_DELAY 0 select * from information_schema.session_variables where variable_name='innodb_thread_sleep_delay'; VARIABLE_NAME VARIABLE_VALUE -INNODB_THREAD_SLEEP_DELAY 10000 +INNODB_THREAD_SLEEP_DELAY 0 set global innodb_thread_sleep_delay=10; +Warnings: +Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect. select @@global.innodb_thread_sleep_delay; @@global.innodb_thread_sleep_delay -10 +0 select * from information_schema.global_variables where variable_name='innodb_thread_sleep_delay'; VARIABLE_NAME VARIABLE_VALUE -INNODB_THREAD_SLEEP_DELAY 10 +INNODB_THREAD_SLEEP_DELAY 0 select * from information_schema.session_variables where variable_name='innodb_thread_sleep_delay'; VARIABLE_NAME VARIABLE_VALUE -INNODB_THREAD_SLEEP_DELAY 10 +INNODB_THREAD_SLEEP_DELAY 0 set session innodb_thread_sleep_delay=1; ERROR HY000: Variable 'innodb_thread_sleep_delay' is a GLOBAL variable and should be set with SET GLOBAL set global innodb_thread_sleep_delay=1.1; @@ -45,9 +47,11 @@ set global innodb_thread_sleep_delay=18446744073709551616; Warnings: Warning 1916 Got overflow when converting '18446744073709551616' to INT. Value truncated Warning 1292 Truncated incorrect innodb_thread_sleep_delay value: '9223372036854775807' +Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect. set global innodb_thread_sleep_delay=-7; Warnings: Warning 1292 Truncated incorrect innodb_thread_sleep_delay value: '-7' +Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect. select @@global.innodb_thread_sleep_delay; @@global.innodb_thread_sleep_delay 0 @@ -55,34 +59,46 @@ select * from information_schema.global_variables where variable_name='innodb_th VARIABLE_NAME VARIABLE_VALUE INNODB_THREAD_SLEEP_DELAY 0 set global innodb_thread_sleep_delay=0; +Warnings: +Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect. select @@global.innodb_thread_sleep_delay; @@global.innodb_thread_sleep_delay 0 set global innodb_thread_sleep_delay=1000; +Warnings: +Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect. select @@global.innodb_thread_sleep_delay; @@global.innodb_thread_sleep_delay -1000 +0 set global innodb_thread_sleep_delay=1000000; +Warnings: +Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect. select @@global.innodb_thread_sleep_delay; @@global.innodb_thread_sleep_delay -1000000 +0 set global innodb_thread_sleep_delay=1000001; Warnings: Warning 1292 Truncated incorrect innodb_thread_sleep_delay value: '1000001' +Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect. select @@global.innodb_thread_sleep_delay; @@global.innodb_thread_sleep_delay -1000000 +0 set global innodb_thread_sleep_delay=4294967295; Warnings: Warning 1292 Truncated incorrect innodb_thread_sleep_delay value: '4294967295' +Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect. select @@global.innodb_thread_sleep_delay; @@global.innodb_thread_sleep_delay -1000000 +0 set global innodb_thread_sleep_delay=555; +Warnings: +Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect. select @@global.innodb_thread_sleep_delay; @@global.innodb_thread_sleep_delay -555 +0 SET @@global.innodb_thread_sleep_delay = @start_global_value; +Warnings: +Warning 138 The parameter innodb_thread_sleep_delay is deprecated and has no effect. SELECT @@global.innodb_thread_sleep_delay; @@global.innodb_thread_sleep_delay -10000 +0 diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff index 84aecf2ce36..2f39a472b99 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb,32bit.rdiff @@ -9,15 +9,6 @@ VARIABLE_COMMENT Number of InnoDB Adaptive Hash Index Partitions (default 8) NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 512 -@@ -61,7 +61,7 @@ - SESSION_VALUE NULL - DEFAULT_VALUE 150000 - VARIABLE_SCOPE GLOBAL --VARIABLE_TYPE BIGINT UNSIGNED -+VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT The upper limit of the sleep delay in usec. Value of 0 disables it. - NUMERIC_MIN_VALUE 0 - NUMERIC_MAX_VALUE 1000000 @@ -73,7 +73,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 64 @@ -76,16 +67,7 @@ VARIABLE_COMMENT A number between [0, 100] that tells how oftern buffer pool dump status in percentages should be printed. E.g. 10 means that buffer pool dump status is printed when every 10% of number of buffer pool pages are dumped. Default is 0 (only start and end status is printed). NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -373,7 +373,7 @@ - SESSION_VALUE NULL - DEFAULT_VALUE 0 - VARIABLE_SCOPE GLOBAL --VARIABLE_TYPE BIGINT UNSIGNED -+VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT Helps in performance tuning in heavily concurrent environments. - NUMERIC_MIN_VALUE 0 - NUMERIC_MAX_VALUE 1000 -@@ -409,7 +409,7 @@ +@@ -421,7 +421,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 5 VARIABLE_SCOPE GLOBAL @@ -94,7 +76,7 @@ VARIABLE_COMMENT If the compression failure rate of a table is greater than this number more padding is added to the pages to reduce the failures. A value of zero implies no padding NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 100 -@@ -433,7 +433,7 @@ +@@ -445,7 +445,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 50 VARIABLE_SCOPE GLOBAL @@ -103,20 +85,7 @@ VARIABLE_COMMENT Percentage of empty space on a data page that can be reserved to make the page compressible. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 75 -@@ -445,10 +445,10 @@ - SESSION_VALUE NULL - DEFAULT_VALUE 5000 - VARIABLE_SCOPE GLOBAL --VARIABLE_TYPE BIGINT UNSIGNED -+VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT Number of times a thread is allowed to enter InnoDB within the same SQL query after it has once got the ticket - NUMERIC_MIN_VALUE 1 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 - NUMERIC_BLOCK_SIZE 0 - ENUM_VALUE_LIST NULL - READ_ONLY NO -@@ -673,7 +673,7 @@ +@@ -661,7 +661,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 120 VARIABLE_SCOPE GLOBAL @@ -125,7 +94,7 @@ VARIABLE_COMMENT Number of pages reserved in doublewrite buffer for batch flushing NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 127 -@@ -769,7 +769,7 @@ +@@ -757,7 +757,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 600 VARIABLE_SCOPE GLOBAL @@ -134,7 +103,7 @@ VARIABLE_COMMENT Maximum number of seconds that semaphore times out in InnoDB. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 4294967295 -@@ -817,7 +817,7 @@ +@@ -805,7 +805,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -143,7 +112,7 @@ VARIABLE_COMMENT Make the first page of the given tablespace dirty. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -829,7 +829,7 @@ +@@ -817,7 +817,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 30 VARIABLE_SCOPE GLOBAL @@ -152,7 +121,7 @@ VARIABLE_COMMENT Number of iterations over which the background flushing is averaged. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1000 -@@ -853,7 +853,7 @@ +@@ -841,7 +841,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 1 VARIABLE_SCOPE GLOBAL @@ -161,7 +130,7 @@ VARIABLE_COMMENT Controls the durability/speed trade-off for commits. Set to 0 (write and flush redo log to disk only once per second), 1 (flush to disk at each commit), 2 (write to log at commit but flush to disk only once per second) or 3 (flush to disk at prepare and at commit, slower and usually redundant). 1 and 3 guarantees that after a crash, committed transactions will not be lost and will be consistent with the binlog and other transactional engines. 2 can get inconsistent and lose transactions if there is a power failure or kernel crash but not if mysqld crashes. 0 has no guarantees in case of crash. 0 and 2 can be faster than 1 or 3. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 3 -@@ -877,7 +877,7 @@ +@@ -865,7 +865,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 1 VARIABLE_SCOPE GLOBAL @@ -170,7 +139,7 @@ VARIABLE_COMMENT Set to 0 (don't flush neighbors from buffer pool), 1 (flush contiguous neighbors from buffer pool) or 2 (flush neighbors from buffer pool), when flushing a block NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 2 -@@ -925,7 +925,7 @@ +@@ -913,7 +913,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -179,7 +148,7 @@ VARIABLE_COMMENT Helps to save your data in case the disk image of the database becomes corrupt. Value 5 can return bogus data, and 6 can permanently corrupt data. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 6 -@@ -949,7 +949,7 @@ +@@ -937,7 +937,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 8000000 VARIABLE_SCOPE GLOBAL @@ -188,7 +157,7 @@ VARIABLE_COMMENT InnoDB Fulltext search cache size in bytes NUMERIC_MIN_VALUE 1600000 NUMERIC_MAX_VALUE 80000000 -@@ -985,7 +985,7 @@ +@@ -973,7 +973,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 84 VARIABLE_SCOPE GLOBAL @@ -197,7 +166,7 @@ VARIABLE_COMMENT InnoDB Fulltext search maximum token size in characters NUMERIC_MIN_VALUE 10 NUMERIC_MAX_VALUE 84 -@@ -997,7 +997,7 @@ +@@ -985,7 +985,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 3 VARIABLE_SCOPE GLOBAL @@ -206,7 +175,7 @@ VARIABLE_COMMENT InnoDB Fulltext search minimum token size in characters NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 16 -@@ -1009,7 +1009,7 @@ +@@ -997,7 +997,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 2000 VARIABLE_SCOPE GLOBAL @@ -215,7 +184,7 @@ VARIABLE_COMMENT InnoDB Fulltext search number of words to optimize for each optimize table call NUMERIC_MIN_VALUE 1000 NUMERIC_MAX_VALUE 10000 -@@ -1021,10 +1021,10 @@ +@@ -1009,10 +1009,10 @@ SESSION_VALUE NULL DEFAULT_VALUE 2000000000 VARIABLE_SCOPE GLOBAL @@ -228,7 +197,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1045,7 +1045,7 @@ +@@ -1033,7 +1033,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 2 VARIABLE_SCOPE GLOBAL @@ -237,7 +206,7 @@ VARIABLE_COMMENT InnoDB Fulltext search parallel sort degree, will round up to nearest power of 2 number NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 16 -@@ -1057,7 +1057,7 @@ +@@ -1045,7 +1045,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 640000000 VARIABLE_SCOPE GLOBAL @@ -246,7 +215,7 @@ VARIABLE_COMMENT Total memory allocated for InnoDB Fulltext Search cache NUMERIC_MIN_VALUE 32000000 NUMERIC_MAX_VALUE 1600000000 -@@ -1081,7 +1081,7 @@ +@@ -1069,7 +1069,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 100 VARIABLE_SCOPE GLOBAL @@ -373,14 +342,14 @@ READ_ONLY YES @@ -1489,7 +1489,7 @@ SESSION_VALUE NULL - DEFAULT_VALUE 4 + DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED +VARIABLE_TYPE INT UNSIGNED VARIABLE_COMMENT Deprecated parameter with no effect. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 64 -@@ -1525,7 +1525,7 @@ +@@ -1513,7 +1513,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 16384 VARIABLE_SCOPE GLOBAL @@ -389,7 +358,7 @@ VARIABLE_COMMENT Page size to use for all InnoDB tablespaces. NUMERIC_MIN_VALUE 4096 NUMERIC_MAX_VALUE 65536 -@@ -1561,7 +1561,7 @@ +@@ -1549,7 +1549,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 300 VARIABLE_SCOPE GLOBAL @@ -398,7 +367,7 @@ VARIABLE_COMMENT Number of UNDO log pages to purge in one batch from the history list. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 5000 -@@ -1573,7 +1573,7 @@ +@@ -1561,7 +1561,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 128 VARIABLE_SCOPE GLOBAL @@ -407,7 +376,7 @@ VARIABLE_COMMENT Dictates rate at which UNDO records are purged. Value N means purge rollback segment(s) on every Nth iteration of purge invocation NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 128 -@@ -1609,7 +1609,7 @@ +@@ -1597,7 +1597,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 56 VARIABLE_SCOPE GLOBAL @@ -416,7 +385,7 @@ VARIABLE_COMMENT Number of pages that must be accessed sequentially for InnoDB to trigger a readahead. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 64 -@@ -1621,7 +1621,7 @@ +@@ -1609,7 +1609,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 4 VARIABLE_SCOPE GLOBAL @@ -425,20 +394,7 @@ VARIABLE_COMMENT Number of background read I/O threads in InnoDB. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 64 -@@ -1645,10 +1645,10 @@ - SESSION_VALUE NULL - DEFAULT_VALUE 0 - VARIABLE_SCOPE GLOBAL --VARIABLE_TYPE BIGINT UNSIGNED -+VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT Replication thread delay (ms) on the slave server if innodb_thread_concurrency is reached (0 by default) - NUMERIC_MIN_VALUE 0 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 - NUMERIC_BLOCK_SIZE 0 - ENUM_VALUE_LIST NULL - READ_ONLY NO -@@ -1669,7 +1669,7 @@ +@@ -1657,7 +1657,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -447,7 +403,7 @@ VARIABLE_COMMENT An InnoDB page number. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 4294967295 -@@ -1717,7 +1717,7 @@ +@@ -1705,7 +1705,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 1048576 VARIABLE_SCOPE GLOBAL @@ -456,7 +412,7 @@ VARIABLE_COMMENT Memory buffer size for index creation NUMERIC_MIN_VALUE 65536 NUMERIC_MAX_VALUE 67108864 -@@ -1885,7 +1885,7 @@ +@@ -1873,7 +1873,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 1 VARIABLE_SCOPE GLOBAL @@ -465,7 +421,7 @@ VARIABLE_COMMENT Size of the mutex/lock wait array. NUMERIC_MIN_VALUE 1 NUMERIC_MAX_VALUE 1024 -@@ -1909,10 +1909,10 @@ +@@ -1897,10 +1897,10 @@ SESSION_VALUE NULL DEFAULT_VALUE 30 VARIABLE_SCOPE GLOBAL @@ -478,25 +434,7 @@ NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO -@@ -1945,7 +1945,7 @@ - SESSION_VALUE NULL - DEFAULT_VALUE 0 - VARIABLE_SCOPE GLOBAL --VARIABLE_TYPE BIGINT UNSIGNED -+VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT Helps in performance tuning in heavily concurrent environments. Sets the maximum number of threads allowed inside InnoDB. Value 0 will disable the thread throttling. - NUMERIC_MIN_VALUE 0 - NUMERIC_MAX_VALUE 1000 -@@ -1957,7 +1957,7 @@ - SESSION_VALUE NULL - DEFAULT_VALUE 10000 - VARIABLE_SCOPE GLOBAL --VARIABLE_TYPE BIGINT UNSIGNED -+VARIABLE_TYPE INT UNSIGNED - VARIABLE_COMMENT Time of innodb thread sleeping before joining InnoDB queue (usec). Value 0 disable a sleep - NUMERIC_MIN_VALUE 0 - NUMERIC_MAX_VALUE 1000000 -@@ -2017,7 +2017,7 @@ +@@ -2005,7 +2005,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 128 VARIABLE_SCOPE GLOBAL @@ -505,7 +443,7 @@ VARIABLE_COMMENT Deprecated parameter with no effect. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 128 -@@ -2041,7 +2041,7 @@ +@@ -2029,7 +2029,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL @@ -514,7 +452,7 @@ VARIABLE_COMMENT Number of undo tablespaces to use. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 127 -@@ -2065,7 +2065,7 @@ +@@ -2053,7 +2053,7 @@ SESSION_VALUE NULL DEFAULT_VALUE 4 VARIABLE_SCOPE GLOBAL diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb.result b/mysql-test/suite/sys_vars/r/sysvars_innodb.result index 4d062995b1e..7e59a8ea810 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result @@ -59,10 +59,10 @@ READ_ONLY YES COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_ADAPTIVE_MAX_SLEEP_DELAY SESSION_VALUE NULL -DEFAULT_VALUE 150000 +DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT The upper limit of the sleep delay in usec. Value of 0 disables it. +VARIABLE_TYPE INT UNSIGNED +VARIABLE_COMMENT Deprecated parameter with no effect. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000000 NUMERIC_BLOCK_SIZE 0 @@ -385,8 +385,8 @@ VARIABLE_NAME INNODB_COMMIT_CONCURRENCY SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT Helps in performance tuning in heavily concurrent environments. +VARIABLE_TYPE INT UNSIGNED +VARIABLE_COMMENT Deprecated parameter with no effect. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000 NUMERIC_BLOCK_SIZE 0 @@ -455,12 +455,12 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL VARIABLE_NAME INNODB_CONCURRENCY_TICKETS SESSION_VALUE NULL -DEFAULT_VALUE 5000 +DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT Number of times a thread is allowed to enter InnoDB within the same SQL query after it has once got the ticket -NUMERIC_MIN_VALUE 1 -NUMERIC_MAX_VALUE 18446744073709551615 +VARIABLE_TYPE INT UNSIGNED +VARIABLE_COMMENT Deprecated parameter with no effect. +NUMERIC_MIN_VALUE 0 +NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO @@ -1633,10 +1633,10 @@ VARIABLE_NAME INNODB_REPLICATION_DELAY SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT Replication thread delay (ms) on the slave server if innodb_thread_concurrency is reached (0 by default) +VARIABLE_TYPE INT UNSIGNED +VARIABLE_COMMENT Deprecated parameter with no effect. NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 4294967295 NUMERIC_BLOCK_SIZE 0 ENUM_VALUE_LIST NULL READ_ONLY NO @@ -1933,8 +1933,8 @@ VARIABLE_NAME INNODB_THREAD_CONCURRENCY SESSION_VALUE NULL DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT Helps in performance tuning in heavily concurrent environments. Sets the maximum number of threads allowed inside InnoDB. Value 0 will disable the thread throttling. +VARIABLE_TYPE INT UNSIGNED +VARIABLE_COMMENT Deprecated parameter with no effect. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000 NUMERIC_BLOCK_SIZE 0 @@ -1943,10 +1943,10 @@ READ_ONLY NO COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME INNODB_THREAD_SLEEP_DELAY SESSION_VALUE NULL -DEFAULT_VALUE 10000 +DEFAULT_VALUE 0 VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE BIGINT UNSIGNED -VARIABLE_COMMENT Time of innodb thread sleeping before joining InnoDB queue (usec). Value 0 disable a sleep +VARIABLE_TYPE INT UNSIGNED +VARIABLE_COMMENT Deprecated parameter with no effect. NUMERIC_MIN_VALUE 0 NUMERIC_MAX_VALUE 1000000 NUMERIC_BLOCK_SIZE 0 diff --git a/mysql-test/suite/sys_vars/t/innodb_commit_concurrency_basic.test b/mysql-test/suite/sys_vars/t/innodb_commit_concurrency_basic.test index 4ed706b372b..67be561348a 100644 --- a/mysql-test/suite/sys_vars/t/innodb_commit_concurrency_basic.test +++ b/mysql-test/suite/sys_vars/t/innodb_commit_concurrency_basic.test @@ -52,8 +52,9 @@ SELECT @@global.innodb_commit_concurrency; # Check if innodb_commit_concurrency can be accessed with and without @@ sign# ################################################################################ ---Error ER_GLOBAL_VARIABLE +--error ER_GLOBAL_VARIABLE SET innodb_commit_concurrency = 1; +SET GLOBAL innodb_commit_concurrency = 1; SELECT @@innodb_commit_concurrency; @@ -79,14 +80,8 @@ SELECT @@global.innodb_commit_concurrency; # Change the value of innodb_commit_concurrency to invalid value # ########################################################################### -# -# InnoDB doesn't allow innodb_commit_concurrency to change from -# zero to non-zero or vice versa -# ---Error ER_WRONG_VALUE_FOR_VAR -SET @@global.innodb_commit_concurrency = 1; SELECT @@global.innodb_commit_concurrency; ---Error ER_WRONG_VALUE_FOR_VAR +SELECT @@global.innodb_commit_concurrency; SET @@global.innodb_commit_concurrency = -1; SELECT @@global.innodb_commit_concurrency; --Error ER_WRONG_TYPE_FOR_VAR @@ -98,7 +93,6 @@ SELECT @@global.innodb_commit_concurrency; --Error ER_WRONG_TYPE_FOR_VAR SET @@global.innodb_commit_concurrency = 1.1; SELECT @@global.innodb_commit_concurrency; ---Error ER_WRONG_VALUE_FOR_VAR SET @@global.innodb_commit_concurrency = 1001; SELECT @@global.innodb_commit_concurrency; diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt index b6ea78115e9..0547674a4dd 100644 --- a/storage/innobase/CMakeLists.txt +++ b/storage/innobase/CMakeLists.txt @@ -235,7 +235,6 @@ SET(INNOBASE_SOURCES include/row0upd.h include/row0upd.ic include/row0vers.h - include/srv0conc.h include/srv0mon.h include/srv0mon.ic include/srv0srv.h @@ -328,7 +327,6 @@ SET(INNOBASE_SOURCES row/row0upd.cc row/row0quiesce.cc row/row0vers.cc - srv/srv0conc.cc srv/srv0mon.cc srv/srv0srv.cc srv/srv0start.cc diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 1db3d73c027..cf51b91af64 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -157,9 +157,6 @@ void close_thread_tables(THD* thd); #endif /* WITH_WSREP */ /** to force correct commit order in binlog */ -static ulong commit_threads = 0; -static mysql_cond_t commit_cond; -static mysql_mutex_t commit_cond_m; static mysql_mutex_t pending_checkpoint_mutex; #define INSIDE_HA_INNOBASE_CC @@ -174,7 +171,6 @@ static const long AUTOINC_NO_LOCKING = 2; static ulong innobase_open_files; static long innobase_autoinc_lock_mode; -static ulong innobase_commit_concurrency; static ulonglong innobase_buffer_pool_size; @@ -1184,20 +1180,6 @@ innobase_release_savepoint( static void innobase_checkpoint_request(handlerton *hton, void *cookie); -/** @brief Initialize the default value of innodb_commit_concurrency. - -Once InnoDB is running, the innodb_commit_concurrency must not change -from zero to nonzero. (Bug #42101) - -The initial default value is 0, and without this extra initialization, -SET GLOBAL innodb_commit_concurrency=DEFAULT would set the parameter -to 0, even if it was initially set to nonzero at the command line -or configuration file. */ -static -void -innobase_commit_concurrency_init_default(); -/*=======================================*/ - /** @brief Adjust some InnoDB startup parameters based on file contents or innodb_page_size. */ static @@ -1377,36 +1359,6 @@ innobase_fts_store_docid( } #endif -/*************************************************************//** -Check for a valid value of innobase_commit_concurrency. -@return 0 for valid innodb_commit_concurrency */ -static -int -innobase_commit_concurrency_validate( -/*=================================*/ - THD*, st_mysql_sys_var*, - void* save, /*!< out: immediate result - for update function */ - struct st_mysql_value* value) /*!< in: incoming string */ -{ - long long intbuf; - ulong commit_concurrency; - - DBUG_ENTER("innobase_commit_concurrency_validate"); - - if (value->val_int(value, &intbuf)) { - /* The value is NULL. That is invalid. */ - DBUG_RETURN(1); - } - - *reinterpret_cast(save) = commit_concurrency - = static_cast(intbuf); - - /* Allow the value to be updated, as long as it remains zero - or nonzero. */ - DBUG_RETURN(!(!commit_concurrency == !innobase_commit_concurrency)); -} - /*******************************************************************//** Function for constructing an InnoDB table handler instance. */ static @@ -1449,10 +1401,7 @@ innodb_page_size_validate( /******************************************************************//** Returns true if the thread is the replication thread on the slave -server. Used in srv_conc_enter_innodb() to determine if the thread -should be allowed to enter InnoDB - the replication thread is treated -differently than other threads. Also used in -srv_conc_force_exit_innodb(). +server. @return true if thd is the replication thread */ ibool thd_is_replication_slave_thread( @@ -1541,77 +1490,6 @@ thd_trx_is_auto_commit( && thd_is_select(thd)); } -/** Enter InnoDB engine after checking the max number of user threads -allowed, else the thread is put into sleep. -@param[in,out] prebuilt row prebuilt handler */ -static inline void innobase_srv_conc_enter_innodb(row_prebuilt_t *prebuilt) -{ - trx_t* trx = prebuilt->trx; - -#ifdef WITH_WSREP - if (trx->is_wsrep() && wsrep_thd_is_BF(trx->mysql_thd, FALSE)) return; -#endif /* WITH_WSREP */ - - if (srv_thread_concurrency) { - if (trx->n_tickets_to_enter_innodb > 0) { - - /* If trx has 'free tickets' to enter the engine left, - then use one such ticket */ - - --trx->n_tickets_to_enter_innodb; - - } else if (trx->mysql_thd != NULL - && thd_is_replication_slave_thread(trx->mysql_thd)) { - const ulonglong end = my_interval_timer() - + ulonglong(srv_replication_delay) * 1000000; - while ((srv_conc_get_active_threads() - >= srv_thread_concurrency) - && my_interval_timer() < end) { - os_thread_sleep(2000 /* 2 ms */); - } - } else { - srv_conc_enter_innodb(prebuilt); - } - } -} - -/** Note that the thread wants to leave InnoDB only if it doesn't have -any spare tickets. -@param[in,out] m_prebuilt row prebuilt handler */ -static inline void innobase_srv_conc_exit_innodb(row_prebuilt_t *prebuilt) -{ - ut_ad(!sync_check_iterate(sync_check())); - - trx_t* trx = prebuilt->trx; - -#ifdef WITH_WSREP - if (trx->is_wsrep() && wsrep_thd_is_BF(trx->mysql_thd, FALSE)) return; -#endif /* WITH_WSREP */ - - /* This is to avoid making an unnecessary function call. */ - if (trx->declared_to_be_inside_innodb - && trx->n_tickets_to_enter_innodb == 0) { - - srv_conc_force_exit_innodb(trx); - } -} - -/******************************************************************//** -Force a thread to leave InnoDB even if it has spare tickets. */ -static inline -void -innobase_srv_conc_force_exit_innodb( -/*================================*/ - trx_t* trx) /*!< in: transaction handle */ -{ - ut_ad(!sync_check_iterate(sync_check())); - - /* This is to avoid making an unnecessary function call. */ - if (trx->declared_to_be_inside_innodb) { - srv_conc_force_exit_innodb(trx); - } -} - /******************************************************************//** Returns the NUL terminated value of glob_hostname. @return pointer to glob_hostname. */ @@ -2905,8 +2783,6 @@ innobase_query_caching_of_table_permitted( return(false); } - innobase_srv_conc_force_exit_innodb(trx); - if (!thd_test_options(thd, OPTION_NOT_AUTOCOMMIT | OPTION_BEGIN) && trx->n_mysql_tables_in_use == 0) { /* We are going to retrieve the query result from the query @@ -3204,8 +3080,6 @@ ha_innobase::init_table_handle_for_HANDLER(void) /* Initialize the m_prebuilt struct much like it would be inited in external_lock */ - innobase_srv_conc_force_exit_innodb(m_prebuilt->trx); - /* If the transaction is not started yet, start it */ trx_start_if_not_started_xa(m_prebuilt->trx, false); @@ -3388,6 +3262,65 @@ static uint innodb_background_scrub_data_interval; static const char* innodb_background_scrub_data_interval_msg = "The parameter innodb_background_scrub_data_interval is deprecated and" " has no effect."; + +uint replication_delay; +uint thread_concurrency; +uint commit_concurrency; +uint concurrency_tickets; +uint adaptive_max_sleep_delay; +uint thread_sleep_delay; + +static const char * const replication_delay_msg += "The parameter innodb_replication_delay is deprecated and has no effect."; +static const char * const thread_concurrency_msg += "The parameter innodb_thread_concurrency is deprecated and has no effect."; +static const char * const commit_concurrency_msg += "The parameter innodb_commit_concurrency is deprecated and has no effect."; +static const char * const concurrency_tickets_msg += "The parameter innodb_concurrency_tickets is deprecated and has no effect."; +static const char * const adaptive_max_sleep_delay_msg += "The parameter innodb_adaptive_max_sleep_delay is deprecated and" + " has no effect."; +static const char * const thread_sleep_delay_msg += "The parameter innodb_thread_sleep_delay is deprecated and has no effect."; + +static void replication_delay_warn(THD* thd, st_mysql_sys_var*, void*, + const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, HA_ERR_UNSUPPORTED, + replication_delay_msg); +} +static void thread_concurrency_warn(THD* thd, st_mysql_sys_var*, void*, + const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, HA_ERR_UNSUPPORTED, + thread_concurrency_msg); +} +static void commit_concurrency_warn(THD* thd, st_mysql_sys_var*, void*, + const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, HA_ERR_UNSUPPORTED, + commit_concurrency_msg); +} +static void concurrency_tickets_warn(THD* thd, st_mysql_sys_var*, void*, + const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, HA_ERR_UNSUPPORTED, + concurrency_tickets_msg); +} +static void adaptive_max_sleep_delay_warn(THD* thd, st_mysql_sys_var*, void*, + const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, HA_ERR_UNSUPPORTED, + adaptive_max_sleep_delay_msg); +} +static void thread_sleep_delay_warn(THD* thd, st_mysql_sys_var*, void*, + const void*) +{ + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, HA_ERR_UNSUPPORTED, + thread_sleep_delay_msg); +} + } // namespace deprecated /** Initialize, validate and normalize the InnoDB startup parameters. @@ -3462,6 +3395,31 @@ static int innodb_init_params() deprecated::innodb_undo_logs = TRX_SYS_N_RSEGS; } + if (UNIV_UNLIKELY(deprecated::replication_delay)) { + sql_print_warning(deprecated::replication_delay_msg); + deprecated::replication_delay = 0; + } + if (UNIV_UNLIKELY(deprecated::thread_concurrency)) { + sql_print_warning(deprecated::thread_concurrency_msg); + deprecated::thread_concurrency = 0; + } + if (UNIV_UNLIKELY(deprecated::commit_concurrency)) { + sql_print_warning(deprecated::commit_concurrency_msg); + deprecated::commit_concurrency = 0; + } + if (UNIV_UNLIKELY(deprecated::concurrency_tickets)) { + sql_print_warning(deprecated::concurrency_tickets_msg); + deprecated::concurrency_tickets = 0; + } + if (UNIV_UNLIKELY(deprecated::adaptive_max_sleep_delay)) { + sql_print_warning(deprecated::adaptive_max_sleep_delay_msg); + deprecated::adaptive_max_sleep_delay = 0; + } + if (UNIV_UNLIKELY(deprecated::thread_sleep_delay)) { + sql_print_warning(deprecated::thread_sleep_delay_msg); + deprecated::thread_sleep_delay = 0; + } + /* Check that values don't overflow on 32-bit systems. */ if (sizeof(ulint) == 4) { if (innobase_buffer_pool_size > UINT_MAX32) { @@ -3774,8 +3732,6 @@ static int innodb_init_params() data_mysql_default_charset_coll = (ulint) default_charset_info->number; - innobase_commit_concurrency_init_default(); - srv_use_atomic_writes = innobase_use_atomic_writes && my_may_have_atomic_write; if (srv_use_atomic_writes && !srv_file_per_table) @@ -3986,9 +3942,6 @@ static int innodb_init(void* p) ibuf_max_size_update(srv_change_buffer_max_size); - mysql_mutex_init(commit_cond_mutex_key, - &commit_cond_m, MY_MUTEX_INIT_FAST); - mysql_cond_init(commit_cond_key, &commit_cond, 0); mysql_mutex_init(pending_checkpoint_mutex_key, &pending_checkpoint_mutex, MY_MUTEX_INIT_FAST); @@ -4058,8 +4011,6 @@ innobase_end(handlerton*, ha_panic_function) innodb_shutdown(); innobase_space_shutdown(); - mysql_mutex_destroy(&commit_cond_m); - mysql_cond_destroy(&commit_cond); mysql_mutex_destroy(&pending_checkpoint_mutex); } @@ -4127,8 +4078,6 @@ innobase_start_trx_and_assign_read_view( trx_t* trx = check_trx_exists(thd); - innobase_srv_conc_force_exit_innodb(trx); - /* The transaction should not be active yet, start it */ ut_ad(!trx_is_started(trx)); @@ -4168,30 +4117,9 @@ innobase_commit_ordered_2( { DBUG_ENTER("innobase_commit_ordered_2"); - bool read_only = trx->read_only || trx->id == 0; + const bool read_only = trx->read_only || trx->id == 0; if (!read_only) { - - while (innobase_commit_concurrency > 0) { - - mysql_mutex_lock(&commit_cond_m); - - ++commit_threads; - - if (commit_threads - <= innobase_commit_concurrency) { - - mysql_mutex_unlock(&commit_cond_m); - break; - } - - --commit_threads; - - mysql_cond_wait(&commit_cond, &commit_cond_m); - - mysql_mutex_unlock(&commit_cond_m); - } - /* The following call reads the binary log position of the transaction being committed. @@ -4225,18 +4153,6 @@ innobase_commit_ordered_2( if (!read_only) { trx->mysql_log_file_name = NULL; trx->flush_log_later = false; - - if (innobase_commit_concurrency > 0) { - - mysql_mutex_lock(&commit_cond_m); - - ut_ad(commit_threads > 0); - --commit_threads; - - mysql_cond_signal(&commit_cond); - - mysql_mutex_unlock(&commit_cond_m); - } } DBUG_VOID_RETURN; @@ -4377,8 +4293,6 @@ innobase_commit( /* This is a statement level variable. */ trx->fts_next_doc_id = 0; - innobase_srv_conc_force_exit_innodb(trx); - DBUG_RETURN(0); } @@ -4406,8 +4320,6 @@ innobase_rollback( ut_ad(trx->dict_operation_lock_mode == 0); ut_ad(trx->dict_operation == TRX_DICT_OP_NONE); - innobase_srv_conc_force_exit_innodb(trx); - /* Reset the number AUTO-INC rows required */ trx->n_autoinc_rows = 0; @@ -4458,8 +4370,6 @@ innobase_rollback_trx( DBUG_ENTER("innobase_rollback_trx"); DBUG_PRINT("trans", ("aborting transaction")); - innobase_srv_conc_force_exit_innodb(trx); - /* If we had reserved the auto-inc lock for some table (if we come here to roll back the latest SQL statement) we release it now before a possibly lengthy rollback */ @@ -4630,8 +4540,6 @@ innobase_rollback_to_savepoint( trx_t* trx = check_trx_exists(thd); - innobase_srv_conc_force_exit_innodb(trx); - /* TODO: use provided savepoint data area to store savepoint data */ char name[64]; @@ -4736,8 +4644,6 @@ innobase_savepoint( trx_t* trx = check_trx_exists(thd); - innobase_srv_conc_force_exit_innodb(trx); - /* Cannot happen outside of transaction */ DBUG_ASSERT(trx_is_registered_for_2pc(trx)); @@ -7683,8 +7589,6 @@ ha_innobase::write_row( build_template(true); } - innobase_srv_conc_enter_innodb(m_prebuilt); - vers_set_fields = table->versioned_write(VERS_TRX_ID) ? ROW_INS_VERSIONED : ROW_INS_NORMAL; @@ -7754,8 +7658,6 @@ ha_innobase::write_row( wsrep_thd_query(m_user_thd)); error= DB_SUCCESS; wsrep_thd_self_abort(m_user_thd); - innobase_srv_conc_exit_innodb( - m_prebuilt); /* jump straight to func exit over * later wsrep hooks */ goto func_exit; @@ -7823,8 +7725,6 @@ set_max_autoinc: } } - innobase_srv_conc_exit_innodb(m_prebuilt); - report_error: /* Cleanup and exit. */ if (error == DB_TABLESPACE_DELETED) { @@ -8476,8 +8376,6 @@ ha_innobase::update_row( ? VERSIONED_DELETE : NO_DELETE; - innobase_srv_conc_enter_innodb(m_prebuilt); - error = row_update_for_mysql(m_prebuilt); if (error == DB_SUCCESS && vers_ins_row @@ -8530,8 +8428,6 @@ ha_innobase::update_row( } } - innobase_srv_conc_exit_innodb(m_prebuilt); - func_exit: if (error == DB_FTS_INVALID_DOCID) { err = HA_FTS_INVALID_DOCID; @@ -8596,12 +8492,8 @@ ha_innobase::delete_row( ? VERSIONED_DELETE : PLAIN_DELETE; - innobase_srv_conc_enter_innodb(m_prebuilt); - error = row_update_for_mysql(m_prebuilt); - innobase_srv_conc_exit_innodb(m_prebuilt); - #ifdef WITH_WSREP if (error == DB_SUCCESS && trx->is_wsrep() && wsrep_thd_is_local(m_user_thd) @@ -8902,20 +8794,8 @@ ha_innobase::index_read( m_last_match_mode = (uint) match_mode; - dberr_t ret; - - if (mode != PAGE_CUR_UNSUPP) { - - innobase_srv_conc_enter_innodb(m_prebuilt); - - ret = row_search_mvcc( - buf, mode, m_prebuilt, match_mode, 0); - - innobase_srv_conc_exit_innodb(m_prebuilt); - } else { - - ret = DB_UNSUPPORTED; - } + dberr_t ret = mode == PAGE_CUR_UNSUPP ? DB_UNSUPPORTED + : row_search_mvcc(buf, mode, m_prebuilt, match_mode, 0); DBUG_EXECUTE_IF("ib_select_query_failure", ret = DB_ERROR;); @@ -9171,16 +9051,10 @@ ha_innobase::general_fetch( : HA_ERR_NO_SUCH_TABLE); } - innobase_srv_conc_enter_innodb(m_prebuilt); - - dberr_t ret = row_search_mvcc( - buf, PAGE_CUR_UNSUPP, m_prebuilt, match_mode, direction); - - innobase_srv_conc_exit_innodb(m_prebuilt); - int error; - switch (ret) { + switch (dberr_t ret = row_search_mvcc(buf, PAGE_CUR_UNSUPP, m_prebuilt, + match_mode, direction)) { case DB_SUCCESS: error = 0; table->status = 0; @@ -9691,16 +9565,11 @@ next_record: tuple. */ innobase_fts_create_doc_id_key(tuple, index, &search_doc_id); - innobase_srv_conc_enter_innodb(m_prebuilt); - - dberr_t ret = row_search_for_mysql( - (byte*) buf, PAGE_CUR_GE, m_prebuilt, ROW_SEL_EXACT, 0); - - innobase_srv_conc_exit_innodb(m_prebuilt); - int error; - switch (ret) { + switch (dberr_t ret = row_search_for_mysql(buf, PAGE_CUR_GE, + m_prebuilt, + ROW_SEL_EXACT, 0)) { case DB_SUCCESS: error = 0; table->status = 0; @@ -15640,8 +15509,6 @@ ha_innobase::start_stmt( trx = m_prebuilt->trx; - innobase_srv_conc_force_exit_innodb(trx); - /* Reset the AUTOINC statement level counter for multi-row INSERTs. */ trx->n_autoinc_rows = 0; @@ -15947,8 +15814,6 @@ ha_innobase::external_lock( trx->n_mysql_tables_in_use--; m_mysql_has_locked = false; - innobase_srv_conc_force_exit_innodb(trx); - /* If the MySQL lock count drops to zero we know that the current SQL statement has ended */ @@ -16023,10 +15888,6 @@ innodb_show_status( srv_wake_purge_thread_if_not_active(); - trx_t* trx = check_trx_exists(thd); - - innobase_srv_conc_force_exit_innodb(trx); - /* We let the InnoDB Monitor to output at most MAX_STATUS_SIZE bytes of text. */ @@ -17139,8 +17000,6 @@ innobase_xa_prepare( thd_get_xid(thd, (MYSQL_XID*) trx->xid); - innobase_srv_conc_force_exit_innodb(trx); - if (!trx_is_registered_for_2pc(trx) && trx_is_started(trx)) { sql_print_error("Transaction not registered for MariaDB 2PC," @@ -19029,7 +18888,6 @@ wsrep_abort_transaction( victim_trx, signal); trx_mutex_exit(victim_trx); lock_mutex_exit(); - wsrep_srv_conc_cancel_wait(victim_trx); DBUG_RETURN(rcode); } else { wsrep_thd_bf_abort(bf_thd, victim_thd, signal); @@ -19386,11 +19244,10 @@ static MYSQL_SYSVAR_ULONG(adaptive_hash_index_parts, btr_ahi_parts, NULL, NULL, 8, 1, 512, 0); #endif /* BTR_CUR_HASH_ADAPT */ -static MYSQL_SYSVAR_ULONG(replication_delay, srv_replication_delay, +static MYSQL_SYSVAR_UINT(replication_delay, deprecated::replication_delay, PLUGIN_VAR_RQCMDARG, - "Replication thread delay (ms) on the slave server if" - " innodb_thread_concurrency is reached (0 by default)", - NULL, NULL, 0, 0, ~0UL, 0); + innodb_deprecated_ignored, nullptr, deprecated::replication_delay_warn, + 0, 0, ~0U, 0); static MYSQL_SYSVAR_UINT(compression_level, page_zip_level, PLUGIN_VAR_RQCMDARG, @@ -19586,15 +19443,15 @@ static MYSQL_SYSVAR_ULONG(flush_neighbors, srv_flush_neighbors, " when flushing a block", NULL, NULL, 1, 0, 2, 0); -static MYSQL_SYSVAR_ULONG(commit_concurrency, innobase_commit_concurrency, +static MYSQL_SYSVAR_UINT(commit_concurrency, deprecated::commit_concurrency, PLUGIN_VAR_RQCMDARG, - "Helps in performance tuning in heavily concurrent environments.", - innobase_commit_concurrency_validate, NULL, 0, 0, 1000, 0); + innodb_deprecated_ignored, nullptr, deprecated::commit_concurrency_warn, + 0, 0, 1000, 0); -static MYSQL_SYSVAR_ULONG(concurrency_tickets, srv_n_free_tickets_to_enter, +static MYSQL_SYSVAR_UINT(concurrency_tickets, deprecated::concurrency_tickets, PLUGIN_VAR_RQCMDARG, - "Number of times a thread is allowed to enter InnoDB within the same SQL query after it has once got the ticket", - NULL, NULL, 5000L, 1L, ~0UL, 0); + innodb_deprecated_ignored, nullptr, deprecated::concurrency_tickets_warn, + 0, 0, ~0U, 0); static MYSQL_SYSVAR_BOOL(deadlock_detect, innobase_deadlock_detect, PLUGIN_VAR_NOCMDARG, @@ -19743,19 +19600,16 @@ static MYSQL_SYSVAR_UINT(spin_wait_delay, srv_spin_wait_delay, "Maximum delay between polling for a spin lock (4 by default)", NULL, NULL, 4, 0, 6000, 0); -static MYSQL_SYSVAR_ULONG(thread_concurrency, srv_thread_concurrency, +static MYSQL_SYSVAR_UINT(thread_concurrency, deprecated::thread_concurrency, PLUGIN_VAR_RQCMDARG, - "Helps in performance tuning in heavily concurrent environments. Sets the maximum number of threads allowed inside InnoDB. Value 0 will disable the thread throttling.", - NULL, NULL, 0, 0, 1000, 0); + innodb_deprecated_ignored, nullptr, deprecated::thread_concurrency_warn, + 0, 0, 1000, 0); -static MYSQL_SYSVAR_ULONG( - adaptive_max_sleep_delay, srv_adaptive_max_sleep_delay, +static MYSQL_SYSVAR_UINT( + adaptive_max_sleep_delay, deprecated::adaptive_max_sleep_delay, PLUGIN_VAR_RQCMDARG, - "The upper limit of the sleep delay in usec. Value of 0 disables it.", - NULL, NULL, - 150000, /* Default setting */ - 0, /* Minimum value */ - 1000000, 0); /* Maximum value */ + innodb_deprecated_ignored, + nullptr, deprecated::adaptive_max_sleep_delay_warn, 0, 0, 1000000, 0); static MYSQL_SYSVAR_BOOL(prefix_index_cluster_optimization, srv_prefix_index_cluster_optimization, @@ -19763,14 +19617,10 @@ static MYSQL_SYSVAR_BOOL(prefix_index_cluster_optimization, "Enable prefix optimization to sometimes avoid cluster index lookups.", NULL, NULL, FALSE); -static MYSQL_SYSVAR_ULONG(thread_sleep_delay, srv_thread_sleep_delay, +static MYSQL_SYSVAR_UINT(thread_sleep_delay, deprecated::thread_sleep_delay, PLUGIN_VAR_RQCMDARG, - "Time of innodb thread sleeping before joining InnoDB queue (usec)." - " Value 0 disable a sleep", - NULL, NULL, - 10000L, - 0L, - 1000000L, 0); + innodb_deprecated_ignored, nullptr, deprecated::thread_sleep_delay_warn, + 0, 0, 1000000, 0); static MYSQL_SYSVAR_STR(data_file_path, innobase_data_file_path, PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY, @@ -20443,24 +20293,6 @@ i_s_innodb_sys_semaphore_waits, i_s_innodb_tablespaces_encryption maria_declare_plugin_end; -/** @brief Initialize the default value of innodb_commit_concurrency. - -Once InnoDB is running, the innodb_commit_concurrency must not change -from zero to nonzero. (Bug #42101) - -The initial default value is 0, and without this extra initialization, -SET GLOBAL innodb_commit_concurrency=DEFAULT would set the parameter -to 0, even if it was initially set to nonzero at the command line -or configuration file. */ -static -void -innobase_commit_concurrency_init_default() -/*======================================*/ -{ - MYSQL_SYSVAR_NAME(commit_concurrency).def_val - = innobase_commit_concurrency; -} - /** @brief Adjust some InnoDB startup parameters based on file contents or innodb_page_size. */ static diff --git a/storage/innobase/handler/i_s.cc b/storage/innobase/handler/i_s.cc index 255bc889205..897bda85d9b 100644 --- a/storage/innobase/handler/i_s.cc +++ b/storage/innobase/handler/i_s.cc @@ -470,8 +470,7 @@ fill_innodb_trx_from_cache( row->trx_rows_modified, true)); /* trx_concurrency_tickets */ - OK(fields[IDX_TRX_CONNCURRENCY_TICKETS]->store( - row->trx_concurrency_tickets, true)); + OK(fields[IDX_TRX_CONNCURRENCY_TICKETS]->store(0, true)); /* trx_isolation_level */ OK(fields[IDX_TRX_ISOLATION_LEVEL]->store( diff --git a/storage/innobase/include/ha_prototypes.h b/storage/innobase/include/ha_prototypes.h index ef1174c95dd..0632c0c5140 100644 --- a/storage/innobase/include/ha_prototypes.h +++ b/storage/innobase/include/ha_prototypes.h @@ -110,10 +110,7 @@ innobase_convert_name( /******************************************************************//** Returns true if the thread is the replication thread on the slave -server. Used in srv_conc_enter_innodb() to determine if the thread -should be allowed to enter InnoDB - the replication thread is treated -differently than other threads. Also used in -srv_conc_force_exit_innodb(). +server. @return true if thd is the replication thread */ ibool thd_is_replication_slave_thread( diff --git a/storage/innobase/include/que0types.h b/storage/innobase/include/que0types.h index d9005095d3c..38f6e380a30 100644 --- a/storage/innobase/include/que0types.h +++ b/storage/innobase/include/que0types.h @@ -35,6 +35,7 @@ typedef void que_node_t; /* Query graph root is a fork node */ typedef struct que_fork_t que_t; +struct row_prebuilt_t; struct que_thr_t; /* Query graph node types */ diff --git a/storage/innobase/include/srv0conc.h b/storage/innobase/include/srv0conc.h deleted file mode 100644 index d24107735ed..00000000000 --- a/storage/innobase/include/srv0conc.h +++ /dev/null @@ -1,93 +0,0 @@ -/***************************************************************************** - -Copyright (c) 2011, 2014, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2018, MariaDB Corporation. - -Portions of this file contain modifications contributed and copyrighted by -Google, Inc. Those modifications are gratefully acknowledged and are described -briefly in the InnoDB documentation. The contributions by Google are -incorporated with their permission, and subject to the conditions contained in -the file COPYING.Google. - -Portions of this file contain modifications contributed and copyrighted -by Percona Inc.. Those modifications are -gratefully acknowledged and are described briefly in the InnoDB -documentation. The contributions by Percona Inc. are incorporated with -their permission, and subject to the conditions contained in the file -COPYING.Percona. - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA - -*****************************************************************************/ - -/**************************************************//** -@file srv/srv0conc.h - -InnoDB concurrency manager header file - -Created 2011/04/18 Sunny Bains -*******************************************************/ - -#ifndef srv_conc_h -#define srv_conc_h - -/** We are prepared for a situation that we have this many threads waiting for -a semaphore inside InnoDB. srv_start() sets the value. */ -extern ulint srv_max_n_threads; - -/** The following controls how many threads we let inside InnoDB concurrently: -threads waiting for locks are not counted into the number because otherwise -we could get a deadlock. Value of 0 will disable the concurrency check. */ - -extern ulong srv_thread_concurrency; - -struct row_prebuilt_t; -/*********************************************************************//** -Puts an OS thread to wait if there are too many concurrent threads -(>= srv_thread_concurrency) inside InnoDB. The threads wait in a FIFO queue. -@param[in,out] prebuilt row prebuilt handler */ -void -srv_conc_enter_innodb( - row_prebuilt_t* prebuilt); - -/*********************************************************************//** -This lets a thread enter InnoDB regardless of the number of threads inside -InnoDB. This must be called when a thread ends a lock wait. */ -void -srv_conc_force_enter_innodb( -/*========================*/ - trx_t* trx); /*!< in: transaction object associated with - the thread */ - -/*********************************************************************//** -This must be called when a thread exits InnoDB in a lock wait or at the -end of an SQL statement. */ -void -srv_conc_force_exit_innodb( -/*=======================*/ - trx_t* trx); /*!< in: transaction object associated with - the thread */ - -/*********************************************************************//** -Get the count of threads waiting inside InnoDB. */ -ulint -srv_conc_get_waiting_threads(void); -/*==============================*/ - -/*********************************************************************//** -Get the count of threads active inside InnoDB. */ -ulint -srv_conc_get_active_threads(void); -/*==============================*/ - -#endif /* srv_conc_h */ diff --git a/storage/innobase/include/srv0srv.h b/storage/innobase/include/srv0srv.h index 9cad1497b85..57542b32719 100644 --- a/storage/innobase/include/srv0srv.h +++ b/storage/innobase/include/srv0srv.h @@ -39,14 +39,12 @@ The server main program Created 10/10/1995 Heikki Tuuri *******************************************************/ -#ifndef srv0srv_h -#define srv0srv_h +#pragma once #include "log0log.h" #include "os0event.h" #include "que0types.h" #include "trx0types.h" -#include "srv0conc.h" #include "fil0fil.h" #include "mysql/psi/mysql_stage.h" @@ -198,6 +196,10 @@ struct srv_stats_t ulint_ctr_1_t lock_deadlock_count; }; +/** We are prepared for a situation that we have this many threads waiting for +a semaphore inside InnoDB. srv_start() sets the value. */ +extern ulint srv_max_n_threads; + extern const char* srv_main_thread_op_info; /** Prefix used by MySQL to indicate pre-5.1 table name encoding */ @@ -246,10 +248,6 @@ extern my_bool high_level_read_only; /** store to its own file each table created by an user; data dictionary tables are in the system tablespace 0 */ extern my_bool srv_file_per_table; -/** Sleep delay for threads waiting to enter InnoDB. In micro-seconds. */ -extern ulong srv_thread_sleep_delay; -/** Maximum sleep delay (in micro-seconds), value of 0 disables it.*/ -extern ulong srv_adaptive_max_sleep_delay; /** Sort buffer size in index creation */ extern ulong srv_sort_buf_size; @@ -423,8 +421,6 @@ extern double srv_max_buf_pool_modified_pct; extern ulong srv_max_purge_lag; extern ulong srv_max_purge_lag_delay; -extern ulong srv_replication_delay; - extern my_bool innodb_encrypt_temporary_tables; extern my_bool srv_immediate_scrub_data_uncompressed; @@ -455,8 +451,6 @@ extern bool srv_monitor_active; extern ulong srv_n_spin_wait_rounds; -extern ulong srv_n_free_tickets_to_enter; -extern ulong srv_thread_sleep_delay; extern uint srv_spin_wait_delay; extern ulint srv_truncated_status_writes; @@ -942,14 +936,3 @@ static inline void srv_start_periodic_timer(std::unique_ptr& t, void srv_thread_pool_init(); void srv_thread_pool_end(); - -#ifdef WITH_WSREP -UNIV_INTERN -void -wsrep_srv_conc_cancel_wait( -/*==================*/ - trx_t* trx); /*!< in: transaction object associated with the - thread */ -#endif /* WITH_WSREP */ - -#endif diff --git a/storage/innobase/include/srv0start.h b/storage/innobase/include/srv0start.h index 596f6d4f5ab..23dc8347129 100644 --- a/storage/innobase/include/srv0start.h +++ b/storage/innobase/include/srv0start.h @@ -24,8 +24,7 @@ Starts the Innobase database server Created 10/10/1995 Heikki Tuuri *******************************************************/ -#ifndef srv0start_h -#define srv0start_h +#pragma once #include "log0log.h" #include "ut0byte.h" @@ -133,4 +132,3 @@ extern enum srv_shutdown_t srv_shutdown_state; /** Files comprising the system tablespace */ extern pfs_os_file_t files[1000]; -#endif diff --git a/storage/innobase/include/trx0i_s.h b/storage/innobase/include/trx0i_s.h index 4eab97c0b02..892ee3cfe18 100644 --- a/storage/innobase/include/trx0i_s.h +++ b/storage/innobase/include/trx0i_s.h @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2007, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2017, 2019, MariaDB Corporation. +Copyright (c) 2017, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -141,9 +141,6 @@ struct i_s_trx_row_t { trx->lock_heap) */ ulint trx_rows_locked;/*!< lock_number_of_rows_locked() */ uintmax_t trx_rows_modified;/*!< trx_t::undo_no */ - ulint trx_concurrency_tickets; - /*!< n_tickets_to_enter_innodb in - trx_t */ uint trx_isolation_level; /*!< trx_t::isolation_level */ bool trx_unique_checks; diff --git a/storage/innobase/include/trx0trx.h b/storage/innobase/include/trx0trx.h index 034552fc62e..20043a6c4a4 100644 --- a/storage/innobase/include/trx0trx.h +++ b/storage/innobase/include/trx0trx.h @@ -864,17 +864,6 @@ public: ulint duplicates; /*!< TRX_DUP_IGNORE | TRX_DUP_REPLACE */ trx_dict_op_t dict_operation; /**< @see enum trx_dict_op_t */ - /* Fields protected by the srv_conc_mutex. */ - bool declared_to_be_inside_innodb; - /*!< this is TRUE if we have declared - this transaction in - srv_conc_enter_innodb to be inside the - InnoDB engine */ - ib_uint32_t n_tickets_to_enter_innodb; - /*!< this can be > 0 only when - declared_to_... is TRUE; when we come - to srv_conc_innodb_enter, if the value - here is > 0, we decrement this by 1 */ ib_uint32_t dict_operation_lock_mode; /*!< 0, RW_S_LATCH, or RW_X_LATCH: the latch mode trx currently holds @@ -1018,10 +1007,6 @@ public: /*!< Total table lock wait time up to this moment. */ -#ifdef WITH_WSREP - os_event_t wsrep_event; /* event waited for in srv_conc_slot */ -#endif /* WITH_WSREP */ - rw_trx_hash_element_t *rw_trx_hash_element; LF_PINS *rw_trx_hash_pins; ulint magic_n; diff --git a/storage/innobase/lock/lock0wait.cc b/storage/innobase/lock/lock0wait.cc index 7b184495aa3..6b6e2c04659 100644 --- a/storage/innobase/lock/lock0wait.cc +++ b/storage/innobase/lock/lock0wait.cc @@ -234,7 +234,6 @@ lock_wait_suspend_thread( { srv_slot_t* slot; trx_t* trx; - ibool was_declared_inside_innodb; ulong lock_wait_timeout; ut_a(lock_sys.timeout_timer.get()); @@ -329,16 +328,6 @@ lock_wait_suspend_thread( /* Suspend this thread and wait for the event. */ - was_declared_inside_innodb = trx->declared_to_be_inside_innodb; - - if (was_declared_inside_innodb) { - /* We must declare this OS thread to exit InnoDB, since a - possible other thread holding a lock which this thread waits - for must be allowed to enter, sooner or later */ - - srv_conc_force_exit_innodb(trx); - } - /* Unknown is also treated like a record lock */ if (lock_type == ULINT_UNDEFINED || lock_type == LOCK_REC) { thd_wait_begin(trx->mysql_thd, THD_WAIT_ROW_LOCK); @@ -354,13 +343,6 @@ lock_wait_suspend_thread( /* After resuming, reacquire the data dictionary latch if necessary. */ - if (was_declared_inside_innodb) { - - /* Return back inside InnoDB */ - - srv_conc_force_enter_innodb(trx); - } - if (had_dict_lock) { row_mysql_freeze_data_dictionary(trx); diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc index 0fe480ca660..62de68790ed 100644 --- a/storage/innobase/log/log0log.cc +++ b/storage/innobase/log/log0log.cc @@ -448,7 +448,7 @@ log_set_capacity(ulonglong file_size) by single query steps: running out of free log space is a serious system error which requires rebooting the database. */ - free = LOG_CHECKPOINT_FREE_PER_THREAD * (10 + srv_thread_concurrency) + free = LOG_CHECKPOINT_FREE_PER_THREAD * 10 + LOG_CHECKPOINT_EXTRA_FREE; if (free >= smallest_capacity / 2) { ib::error() << "Cannot continue operation because log file is " diff --git a/storage/innobase/srv/srv0conc.cc b/storage/innobase/srv/srv0conc.cc deleted file mode 100644 index 07e0299dc98..00000000000 --- a/storage/innobase/srv/srv0conc.cc +++ /dev/null @@ -1,327 +0,0 @@ -/***************************************************************************** - -Copyright (c) 2011, 2015, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, 2020, MariaDB Corporation. - -Portions of this file contain modifications contributed and copyrighted by -Google, Inc. Those modifications are gratefully acknowledged and are described -briefly in the InnoDB documentation. The contributions by Google are -incorporated with their permission, and subject to the conditions contained in -the file COPYING.Google. - -Portions of this file contain modifications contributed and copyrighted -by Percona Inc.. Those modifications are -gratefully acknowledged and are described briefly in the InnoDB -documentation. The contributions by Percona Inc. are incorporated with -their permission, and subject to the conditions contained in the file -COPYING.Percona. - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA - -*****************************************************************************/ - -/**************************************************//** -@file srv/srv0conc.cc - -InnoDB concurrency manager - -Created 2011/04/18 Sunny Bains -*******************************************************/ - -#include "srv0srv.h" -#include "trx0trx.h" -#include "row0mysql.h" -#include "dict0dict.h" -#include -#include - -/** Number of times a thread is allowed to enter InnoDB within the same -SQL query after it has once got the ticket. */ -ulong srv_n_free_tickets_to_enter = 500; - -/** Maximum sleep delay (in micro-seconds), value of 0 disables it. */ -ulong srv_adaptive_max_sleep_delay = 150000; - -ulong srv_thread_sleep_delay = 10000; - - -/** We are prepared for a situation that we have this many threads waiting for -a semaphore inside InnoDB. srv_start() sets the value. */ -ulint srv_max_n_threads; - -/** The following controls how many threads we let inside InnoDB concurrently: -threads waiting for locks are not counted into the number because otherwise -we could get a deadlock. Value of 0 will disable the concurrency check. */ - -ulong srv_thread_concurrency = 0; - -/** Variables tracking the active and waiting threads. */ -struct srv_conc_t { - /** Number of transactions that have declared_to_be_inside_innodb */ - MY_ALIGNED(CPU_LEVEL1_DCACHE_LINESIZE) Atomic_counter n_active; - - /** Number of OS threads waiting in the FIFO for permission to - enter InnoDB */ - MY_ALIGNED(CPU_LEVEL1_DCACHE_LINESIZE) Atomic_counter n_waiting; -}; - -/* Control variables for tracking concurrency. */ -static srv_conc_t srv_conc; - -/*********************************************************************//** -Note that a user thread is entering InnoDB. */ -static -void -srv_enter_innodb_with_tickets( -/*==========================*/ - trx_t* trx) /*!< in/out: transaction that wants - to enter InnoDB */ -{ - trx->declared_to_be_inside_innodb = TRUE; - trx->n_tickets_to_enter_innodb = static_cast( - srv_n_free_tickets_to_enter); -} - -/*********************************************************************//** -Handle the scheduling of a user thread that wants to enter InnoDB. Setting -srv_adaptive_max_sleep_delay > 0 switches the adaptive sleep calibration to -ON. When set, we want to wait in the queue for as little time as possible. -However, very short waits will result in a lot of context switches and that -is also not desirable. When threads need to sleep multiple times we increment -os_thread_sleep_delay by one. When we see threads getting a slot without -waiting and there are no other threads waiting in the queue, we try and reduce -the wait as much as we can. Currently we reduce it by half each time. If the -thread only had to wait for one turn before it was able to enter InnoDB we -decrement it by one. This is to try and keep the sleep time stable around the -"optimum" sleep time. */ -static -void -srv_conc_enter_innodb_with_atomics( -/*===============================*/ - trx_t* trx) /*!< in/out: transaction that wants - to enter InnoDB */ -{ - ulint n_sleeps = 0; - ibool notified_mysql = FALSE; - - ut_a(!trx->declared_to_be_inside_innodb); - - for (;;) { - ulint sleep_in_us; -#ifdef WITH_WSREP - if (trx->is_wsrep() && wsrep_thd_is_aborting(trx->mysql_thd)) { - if (UNIV_UNLIKELY(wsrep_debug)) { - ib::info() << - "srv_conc_enter due to MUST_ABORT"; - } - srv_conc_force_enter_innodb(trx); - return; - } -#endif /* WITH_WSREP */ - - if (srv_thread_concurrency == 0) { - if (notified_mysql) { - srv_conc.n_waiting--; - thd_wait_end(trx->mysql_thd); - } - - return; - } - - if (srv_conc.n_active < srv_thread_concurrency) { - - /* Check if there are any free tickets. */ - if (srv_conc.n_active++ < srv_thread_concurrency) { - - srv_enter_innodb_with_tickets(trx); - - if (notified_mysql) { - srv_conc.n_waiting--; - thd_wait_end(trx->mysql_thd); - } - - if (srv_adaptive_max_sleep_delay > 0) { - if (srv_thread_sleep_delay > 20 - && n_sleeps == 1) { - - --srv_thread_sleep_delay; - } - - if (srv_conc.n_waiting == 0) { - srv_thread_sleep_delay >>= 1; - } - } - - return; - } - - /* Since there were no free seats, we relinquish - the overbooked ticket. */ - - srv_conc.n_active--; - } - - if (!notified_mysql) { - srv_conc.n_waiting++; - - thd_wait_begin(trx->mysql_thd, THD_WAIT_USER_LOCK); - - notified_mysql = TRUE; - } - - DEBUG_SYNC_C("user_thread_waiting"); - trx->op_info = "sleeping before entering InnoDB"; - - sleep_in_us = srv_thread_sleep_delay; - - /* Guard against overflow when adaptive sleep delay is on. */ - - if (srv_adaptive_max_sleep_delay > 0 - && sleep_in_us > srv_adaptive_max_sleep_delay) { - - sleep_in_us = srv_adaptive_max_sleep_delay; - srv_thread_sleep_delay = static_cast(sleep_in_us); - } - - os_thread_sleep(sleep_in_us); - - trx->op_info = ""; - - ++n_sleeps; - - if (srv_adaptive_max_sleep_delay > 0 && n_sleeps > 1) { - ++srv_thread_sleep_delay; - } - } -} - -/*********************************************************************//** -Note that a user thread is leaving InnoDB code. */ -static -void -srv_conc_exit_innodb_with_atomics( -/*==============================*/ - trx_t* trx) /*!< in/out: transaction */ -{ - trx->n_tickets_to_enter_innodb = 0; - trx->declared_to_be_inside_innodb = FALSE; - - srv_conc.n_active--; -} - -/*********************************************************************//** -Puts an OS thread to wait if there are too many concurrent threads -(>= srv_thread_concurrency) inside InnoDB. The threads wait in a FIFO queue. -@param[in,out] prebuilt row prebuilt handler */ -void -srv_conc_enter_innodb( - row_prebuilt_t* prebuilt) -{ - trx_t* trx = prebuilt->trx; - - ut_ad(!sync_check_iterate(sync_check())); - - srv_conc_enter_innodb_with_atomics(trx); -} - -/*********************************************************************//** -This lets a thread enter InnoDB regardless of the number of threads inside -InnoDB. This must be called when a thread ends a lock wait. */ -void -srv_conc_force_enter_innodb( -/*========================*/ - trx_t* trx) /*!< in: transaction object associated with the - thread */ -{ - ut_ad(!sync_check_iterate(sync_check())); - - if (!srv_thread_concurrency) { - - return; - } - - srv_conc.n_active++; - - trx->n_tickets_to_enter_innodb = 1; - trx->declared_to_be_inside_innodb = TRUE; -} - -/*********************************************************************//** -This must be called when a thread exits InnoDB in a lock wait or at the -end of an SQL statement. */ -void -srv_conc_force_exit_innodb( -/*=======================*/ - trx_t* trx) /*!< in: transaction object associated with the - thread */ -{ - if ((trx->mysql_thd != NULL - && thd_is_replication_slave_thread(trx->mysql_thd)) - || trx->declared_to_be_inside_innodb == FALSE) { - - return; - } - - srv_conc_exit_innodb_with_atomics(trx); - - ut_ad(!sync_check_iterate(sync_check())); -} - -/*********************************************************************//** -Get the count of threads waiting inside InnoDB. */ -ulint -srv_conc_get_waiting_threads(void) -/*==============================*/ -{ - return(srv_conc.n_waiting); -} - -/*********************************************************************//** -Get the count of threads active inside InnoDB. */ -ulint -srv_conc_get_active_threads(void) -/*==============================*/ -{ - return(srv_conc.n_active); -} - -#ifdef WITH_WSREP -UNIV_INTERN -void -wsrep_srv_conc_cancel_wait( -/*=======================*/ - trx_t* trx) /*!< in: transaction object associated with the - thread */ -{ -#ifdef HAVE_ATOMIC_BUILTINS - /* aborting transactions will enter innodb by force in - srv_conc_enter_innodb_with_atomics(). No need to cancel here, - thr will wake up after os_sleep and let to enter innodb - */ - if (UNIV_UNLIKELY(wsrep_debug)) { - ib::info() << "WSREP: conc slot cancel, no atomics"; - } -#else - // JAN: TODO: MySQL 5.7 - //os_fast_mutex_lock(&srv_conc_mutex); - if (trx->wsrep_event) { - if (UNIV_UNLIKELY(wsrep_debug)) { - ib::info() << "WSREP: conc slot cancel"; - } - os_event_set(trx->wsrep_event); - } - //os_fast_mutex_unlock(&srv_conc_mutex); -#endif -} -#endif /* WITH_WSREP */ - diff --git a/storage/innobase/srv/srv0srv.cc b/storage/innobase/srv/srv0srv.cc index 09cdf6fe0c1..aa8a5ea2d14 100644 --- a/storage/innobase/srv/srv0srv.cc +++ b/storage/innobase/srv/srv0srv.cc @@ -348,9 +348,6 @@ number of pages to use in LRU and flush_list batch flushing. The rest of the doublewrite buffer is used for single-page flushing. */ ulong srv_doublewrite_batch_size = 120; -/** innodb_replication_delay */ -ulong srv_replication_delay; - /** innodb_sync_spin_loops */ ulong srv_n_spin_wait_rounds; /** innodb_spin_wait_delay */ @@ -1006,12 +1003,6 @@ srv_printf_innodb_monitor( fputs("--------------\n" "ROW OPERATIONS\n" "--------------\n", file); - fprintf(file, - ULINTPF " queries inside InnoDB, " - ULINTPF " queries in queue\n", - srv_conc_get_active_threads(), - srv_conc_get_waiting_threads()); - fprintf(file, ULINTPF " read views open inside InnoDB\n", trx_sys.view_count()); diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc index 60fc333c4ba..85fc90a8e0c 100644 --- a/storage/innobase/srv/srv0start.cc +++ b/storage/innobase/srv/srv0start.cc @@ -101,6 +101,10 @@ Created 2/16/1996 Heikki Tuuri #include "zlib.h" #include "ut0crc32.h" +/** We are prepared for a situation that we have this many threads waiting for +a semaphore inside InnoDB. srv_start() sets the value. */ +ulint srv_max_n_threads; + /** Log sequence number at shutdown */ lsn_t srv_shutdown_lsn; @@ -1196,9 +1200,7 @@ dberr_t srv_start(bool create_new_db) static_cast(UT_ARR_SIZE(srv_stages))); /* Set the maximum number of threads which can wait for a semaphore - inside InnoDB: this is the 'sync wait array' size, as well as the - maximum number of threads that can wait in the 'srv_conc array' for - their time to enter InnoDB. */ + inside InnoDB: this is the 'sync wait array' size */ srv_max_n_threads = 1 /* io_ibuf_thread */ + 1 /* io_log_thread */ @@ -2096,12 +2098,6 @@ void innodb_shutdown() case SRV_OPERATION_NORMAL: /* Shut down the persistent files. */ logs_empty_and_mark_files_at_shutdown(); - - if (ulint n_threads = srv_conc_get_active_threads()) { - ib::warn() << "Query counter shows " - << n_threads << " queries still" - " inside InnoDB at shutdown"; - } } os_aio_free(); diff --git a/storage/innobase/trx/trx0i_s.cc b/storage/innobase/trx/trx0i_s.cc index 8e46057f654..2736dbd285f 100644 --- a/storage/innobase/trx/trx0i_s.cc +++ b/storage/innobase/trx/trx0i_s.cc @@ -499,8 +499,6 @@ thd_done: row->trx_rows_modified = trx->undo_no; - row->trx_concurrency_tickets = trx->n_tickets_to_enter_innodb; - row->trx_isolation_level = trx->isolation_level; row->trx_unique_checks = (ibool) trx->check_unique_secondary; diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index ac9fc7d22c2..a9ba8cd7786 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -377,10 +377,6 @@ trx_t *trx_create() ut_ad(trx->lock.rec_cached == 0); ut_ad(UT_LIST_GET_LEN(trx->lock.evicted_tables) == 0); -#ifdef WITH_WSREP - trx->wsrep_event= NULL; -#endif /* WITH_WSREP */ - trx_sys.register_trx(trx); return(trx); @@ -392,25 +388,11 @@ trx_t *trx_create() */ void trx_free(trx_t*& trx) { - ut_ad(!trx->declared_to_be_inside_innodb); ut_ad(!trx->n_mysql_tables_in_use); ut_ad(!trx->mysql_n_tables_locked); ut_ad(!trx->internal); ut_ad(!trx->mysql_log_file_name); - if (UNIV_UNLIKELY(trx->declared_to_be_inside_innodb)) { - ib::error() << "Freeing a trx (" - << trx_get_id_for_print(trx) << ") which is declared" - " to be processing inside InnoDB"; - - trx_print(stderr, trx, 600); - putc('\n', stderr); - - /* This is an error but not a fatal error. We must keep - the counters like srv_conc.n_active accurate. */ - srv_conc_force_exit_innodb(trx); - } - if (trx->n_mysql_tables_in_use != 0 || trx->mysql_n_tables_locked != 0) { @@ -1824,11 +1806,6 @@ state_ok: fputs(" recovered trx", f); } - if (trx->declared_to_be_inside_innodb) { - fprintf(f, ", thread declared inside InnoDB %lu", - (ulong) trx->n_tickets_to_enter_innodb); - } - putc('\n', f); if (trx->n_mysql_tables_in_use > 0 || trx->mysql_n_tables_locked > 0) {