From bdcecfa22cc2eb255610f5574ff0a91c8d247066 Mon Sep 17 00:00:00 2001 From: Daniele Sciascia Date: Mon, 16 Mar 2020 15:03:00 +0100 Subject: [PATCH 1/8] MDEV-22021: Galera database could get inconsistent with rollback to savepoint When binlog is disabled, WSREP will not behave correctly when SAVEPOINT ROLLBACK is executed and we will not rollback transaction. --- mysql-test/suite/galera/r/MDEV-22021.result | 57 ++++++++++++++++++ .../suite/galera/t/MDEV-22021.combinations | 4 ++ mysql-test/suite/galera/t/MDEV-22021.test | 60 +++++++++++++++++++ mysql-test/suite/galera_sr/r/GCF-571.result | 6 +- mysql-test/suite/galera_sr/r/GCF-620.result | 2 +- .../r/galera_sr_rollback_savepoint.result | 2 +- .../r/mysql-wsrep-features#22.result | 2 +- sql/log.cc | 18 +++--- sql/wsrep_high_priority_service.cc | 6 +- sql/wsrep_thd.cc | 7 --- 10 files changed, 139 insertions(+), 25 deletions(-) create mode 100644 mysql-test/suite/galera/r/MDEV-22021.result create mode 100644 mysql-test/suite/galera/t/MDEV-22021.combinations create mode 100644 mysql-test/suite/galera/t/MDEV-22021.test diff --git a/mysql-test/suite/galera/r/MDEV-22021.result b/mysql-test/suite/galera/r/MDEV-22021.result new file mode 100644 index 00000000000..a217e66e2f0 --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-22021.result @@ -0,0 +1,57 @@ +connection node_2; +connection node_1; +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); +START TRANSACTION; +INSERT INTO t1 VALUES (1); +SAVEPOINT sp1; +INSERT INTO t1 VALUES (2); +ROLLBACK TO SAVEPOINT sp1; +COMMIT; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +connection node_2; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +connection node_1; +DELETE FROM t1; +START TRANSACTION; +SAVEPOINT sp1; +INSERT INTO t1 VALUES (1); +SAVEPOINT sp2; +INSERT INTO t1 VALUES (2); +ROLLBACK TO SAVEPOINT sp2; +ROLLBACK TO SAVEPOINT sp1; +COMMIT; +SELECT COUNT(*) = 0 FROM t1; +COUNT(*) = 0 +1 +connection node_2; +SELECT COUNT(*) = 0 FROM t1; +COUNT(*) = 0 +1 +connection node_1; +DELETE FROM t1; +START TRANSACTION; +SAVEPOINT sp1; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +INSERT INTO t1 VALUES (4); +SAVEPOINT sp2; +INSERT INTO t1 VALUES (5); +ROLLBACK TO SAVEPOINT sp2; +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +ROLLBACK TO SAVEPOINT sp1; +INSERT INTO t1 VALUES (8); +COMMIT; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +connection node_2; +SELECT COUNT(*) = 1 FROM t1; +COUNT(*) = 1 +1 +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-22021.combinations b/mysql-test/suite/galera/t/MDEV-22021.combinations new file mode 100644 index 00000000000..1eeb8fb4614 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-22021.combinations @@ -0,0 +1,4 @@ +[binlogoff] + +[binlogon] +log-bin diff --git a/mysql-test/suite/galera/t/MDEV-22021.test b/mysql-test/suite/galera/t/MDEV-22021.test new file mode 100644 index 00000000000..5e189faf5ea --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-22021.test @@ -0,0 +1,60 @@ +# +# SAVEPOINT ROLLBACK can introduce inconsistency in cluster. +# + +--source include/galera_cluster.inc + +CREATE TABLE t1 (f1 INTEGER PRIMARY KEY); + +START TRANSACTION; +INSERT INTO t1 VALUES (1); +SAVEPOINT sp1; +INSERT INTO t1 VALUES (2); +ROLLBACK TO SAVEPOINT sp1; +COMMIT; + +SELECT COUNT(*) = 1 FROM t1; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +--connection node_1 +DELETE FROM t1; + +START TRANSACTION; +SAVEPOINT sp1; +INSERT INTO t1 VALUES (1); +SAVEPOINT sp2; +INSERT INTO t1 VALUES (2); +ROLLBACK TO SAVEPOINT sp2; +ROLLBACK TO SAVEPOINT sp1; +COMMIT; + +SELECT COUNT(*) = 0 FROM t1; +--connection node_2 +SELECT COUNT(*) = 0 FROM t1; + +--connection node_1 +DELETE FROM t1; + +START TRANSACTION; +SAVEPOINT sp1; +INSERT INTO t1 VALUES (1); +INSERT INTO t1 VALUES (2); +INSERT INTO t1 VALUES (3); +INSERT INTO t1 VALUES (4); +SAVEPOINT sp2; +INSERT INTO t1 VALUES (5); +ROLLBACK TO SAVEPOINT sp2; +INSERT INTO t1 VALUES (6); +INSERT INTO t1 VALUES (7); +ROLLBACK TO SAVEPOINT sp1; +INSERT INTO t1 VALUES (8); +COMMIT; + +SELECT COUNT(*) = 1 FROM t1; + +--connection node_2 +SELECT COUNT(*) = 1 FROM t1; + +DROP TABLE t1; diff --git a/mysql-test/suite/galera_sr/r/GCF-571.result b/mysql-test/suite/galera_sr/r/GCF-571.result index 4b4f749d910..fd20afd7e6e 100644 --- a/mysql-test/suite/galera_sr/r/GCF-571.result +++ b/mysql-test/suite/galera_sr/r/GCF-571.result @@ -24,7 +24,7 @@ COUNT(*) > 0 1 SELECT COUNT(*) = 1 FROM mysql.wsrep_streaming_log WHERE frag LIKE '%SAVEPOINT `A`%'; COUNT(*) = 1 -0 +1 connection node_1; ROLLBACK TO SAVEPOINT A; connection node_1a; @@ -36,7 +36,7 @@ COUNT(*) > 0 1 SELECT COUNT(*) = 1 FROM mysql.wsrep_streaming_log WHERE frag LIKE '%SAVEPOINT `A`%'; COUNT(*) = 1 -0 +1 SELECT COUNT(*) = 1 FROM mysql.wsrep_streaming_log WHERE frag LIKE '%ROLLBACK TO `A`%'; COUNT(*) = 1 0 @@ -49,7 +49,7 @@ COUNT(*) > 0 1 SELECT COUNT(*) = 1 FROM mysql.wsrep_streaming_log WHERE frag LIKE '%SAVEPOINT `A`%'; COUNT(*) = 1 -0 +1 SELECT COUNT(*) = 1 FROM mysql.wsrep_streaming_log WHERE frag LIKE '%ROLLBACK TO `A`%'; COUNT(*) = 1 0 diff --git a/mysql-test/suite/galera_sr/r/GCF-620.result b/mysql-test/suite/galera_sr/r/GCF-620.result index 33789f82add..02cb163a199 100644 --- a/mysql-test/suite/galera_sr/r/GCF-620.result +++ b/mysql-test/suite/galera_sr/r/GCF-620.result @@ -14,5 +14,5 @@ COMMIT; connection node_2; SELECT COUNT(*) = 2 FROM t1; COUNT(*) = 2 -0 +1 DROP TABLE t1; diff --git a/mysql-test/suite/galera_sr/r/galera_sr_rollback_savepoint.result b/mysql-test/suite/galera_sr/r/galera_sr_rollback_savepoint.result index f2efa20f0d3..9db548c1616 100644 --- a/mysql-test/suite/galera_sr/r/galera_sr_rollback_savepoint.result +++ b/mysql-test/suite/galera_sr/r/galera_sr_rollback_savepoint.result @@ -33,7 +33,7 @@ COUNT(*) = 5 1 SELECT COUNT(*) = 0 FROM t1 WHERE f2 = 'b'; COUNT(*) = 0 -0 +1 SELECT COUNT(*) = 5 FROM t1 WHERE f2 = 'c'; COUNT(*) = 5 1 diff --git a/mysql-test/suite/galera_sr/r/mysql-wsrep-features#22.result b/mysql-test/suite/galera_sr/r/mysql-wsrep-features#22.result index 0053619187c..1215f3341e7 100644 --- a/mysql-test/suite/galera_sr/r/mysql-wsrep-features#22.result +++ b/mysql-test/suite/galera_sr/r/mysql-wsrep-features#22.result @@ -31,5 +31,5 @@ COUNT(*) = 6 connection node_2; SELECT COUNT(*) = 6 FROM t1; COUNT(*) = 6 -0 +1 DROP TABLE t1; diff --git a/sql/log.cc b/sql/log.cc index 1da73ab25df..172f90aa270 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -2271,9 +2271,6 @@ static int binlog_savepoint_set(handlerton *hton, THD *thd, void *sv) int error= 1; DBUG_ENTER("binlog_savepoint_set"); - if (wsrep_emulate_bin_log) - DBUG_RETURN(0); - char buf[1024]; String log_query(buf, sizeof(buf), &my_charset_bin); @@ -2306,9 +2303,6 @@ static int binlog_savepoint_rollback(handlerton *hton, THD *thd, void *sv) { DBUG_ENTER("binlog_savepoint_rollback"); - if (wsrep_emulate_bin_log) - DBUG_RETURN(0); - /* Write ROLLBACK TO SAVEPOINT to the binlog cache if we have updated some non-transactional table. Otherwise, truncate the binlog cache starting @@ -10798,18 +10792,20 @@ void wsrep_register_binlog_handler(THD *thd, bool trx) back a statement or a transaction. However, notifications do not happen if the binary log is set as read/write. */ - //binlog_cache_mngr *cache_mngr= thd_get_cache_mngr(thd); binlog_cache_mngr *cache_mngr= (binlog_cache_mngr*) thd_get_ha_data(thd, binlog_hton); /* cache_mngr may be missing e.g. in mtr test ev51914.test */ - if (cache_mngr && cache_mngr->trx_cache.get_prev_position() == MY_OFF_T_UNDEF) + if (cache_mngr) { /* Set an implicit savepoint in order to be able to truncate a trx-cache. */ - my_off_t pos= 0; - binlog_trans_log_savepos(thd, &pos); - cache_mngr->trx_cache.set_prev_position(pos); + if (cache_mngr->trx_cache.get_prev_position() == MY_OFF_T_UNDEF) + { + my_off_t pos= 0; + binlog_trans_log_savepos(thd, &pos); + cache_mngr->trx_cache.set_prev_position(pos); + } /* Set callbacks in order to be able to call commmit or rollback. diff --git a/sql/wsrep_high_priority_service.cc b/sql/wsrep_high_priority_service.cc index ef9a46f1a8e..9f6cbf30e68 100644 --- a/sql/wsrep_high_priority_service.cc +++ b/sql/wsrep_high_priority_service.cc @@ -453,11 +453,15 @@ Wsrep_applier_service::Wsrep_applier_service(THD* thd) thd->wsrep_cs().open(wsrep::client_id(thd->thread_id)); thd->wsrep_cs().before_command(); thd->wsrep_cs().debug_log_level(wsrep_debug); - + if (!thd->slave_thread) + thd->system_thread_info.rpl_sql_info= + new rpl_sql_thread_info(thd->wsrep_rgi->rli->mi->rpl_filter); } Wsrep_applier_service::~Wsrep_applier_service() { + if (!m_thd->slave_thread) + delete m_thd->system_thread_info.rpl_sql_info; m_thd->wsrep_cs().after_command_before_result(); m_thd->wsrep_cs().after_command_after_result(); m_thd->wsrep_cs().close(); diff --git a/sql/wsrep_thd.cc b/sql/wsrep_thd.cc index b605ff0496d..94d01b273c5 100644 --- a/sql/wsrep_thd.cc +++ b/sql/wsrep_thd.cc @@ -53,11 +53,6 @@ static void wsrep_replication_process(THD *thd, Wsrep_applier_service applier_service(thd); - /* thd->system_thread_info.rpl_sql_info isn't initialized. */ - if (!thd->slave_thread) - thd->system_thread_info.rpl_sql_info= - new rpl_sql_thread_info(thd->wsrep_rgi->rli->mi->rpl_filter); - WSREP_INFO("Starting applier thread %llu", thd->thread_id); enum wsrep::provider::status ret= Wsrep_server_state::get_provider().run_applier(&applier_service); @@ -68,8 +63,6 @@ static void wsrep_replication_process(THD *thd, mysql_cond_broadcast(&COND_wsrep_slave_threads); mysql_mutex_unlock(&LOCK_wsrep_slave_threads); - if (!thd->slave_thread) - delete thd->system_thread_info.rpl_sql_info; delete thd->wsrep_rgi->rli->mi; delete thd->wsrep_rgi->rli; From a21900663626647a7b6f4904fa564f05df38ff5f Mon Sep 17 00:00:00 2001 From: Sergei Petrunia Date: Thu, 2 Apr 2020 11:50:47 +0300 Subject: [PATCH 2/8] MDEV-22014: Rowid Filtering is not displayed well in the optimizer trace - Print the rowid filters that are available for use with each table. - Make print_best_access_for_table() print which filter it has picked. - Make best_access_path() print the filter for considered ref accesses. --- mysql-test/main/opt_trace.result | 410 +++++++----------- mysql-test/main/opt_trace_index_merge.result | 3 +- .../main/opt_trace_index_merge_innodb.result | 13 +- mysql-test/main/opt_trace_security.result | 6 +- sql/opt_trace.cc | 21 +- sql/rowid_filter.cc | 29 ++ sql/rowid_filter.h | 2 + sql/sql_select.cc | 2 + sql/table.h | 1 + 9 files changed, 222 insertions(+), 265 deletions(-) diff --git a/mysql-test/main/opt_trace.result b/mysql-test/main/opt_trace.result index 110ce60edfd..08c0895e839 100644 --- a/mysql-test/main/opt_trace.result +++ b/mysql-test/main/opt_trace.result @@ -140,8 +140,7 @@ select * from v1 { "type": "scan", "records": 1, "cost": 2.2044, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 1, @@ -286,8 +285,7 @@ select * from (select * from t1 where t1.a=1)q { "type": "scan", "records": 1, "cost": 2.2044, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 1, @@ -438,8 +436,7 @@ select * from v2 { "type": "scan", "records": 1, "cost": 2.2044, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 1, @@ -505,8 +502,7 @@ select * from v2 { "type": "scan", "records": 2, "cost": 2, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 2, @@ -645,8 +641,7 @@ explain select * from v2 { "type": "scan", "records": 10, "cost": 2.022, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 10, @@ -765,8 +760,7 @@ explain select * from v1 { "type": "scan", "records": 10, "cost": 2.022, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 10, @@ -832,8 +826,7 @@ explain select * from v1 { "type": "scan", "records": 10, "cost": 10, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 10, @@ -1004,8 +997,7 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b { "type": "scan", "records": 100, "cost": 2.3174, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 100, @@ -1036,8 +1028,7 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b { "type": "ref", "records": 1, "cost": 200, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 100, @@ -1062,8 +1053,7 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b { "type": "scan", "records": 100, "cost": 2.3174, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 100, @@ -1094,8 +1084,7 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b { "type": "ref", "records": 1, "cost": 200, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 100, @@ -1265,8 +1254,7 @@ EXPLAIN SELECT DISTINCT a FROM t1 { "type": "index_merge", "records": 5, "cost": 6.75, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 5, @@ -1456,8 +1444,7 @@ EXPLAIN SELECT MIN(d) FROM t1 where b=2 and c=3 group by a { "type": "scan", "records": 0.5849, "cost": 3.3121, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 0.5849, @@ -1658,8 +1645,7 @@ EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a>=20010104e0 GROUP BY id { "type": "scan", "records": 16, "cost": 2.0312, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 16, @@ -1849,8 +1835,7 @@ EXPLAIN SELECT * FROM t1 WHERE a = 20010104e0 GROUP BY id { "type": "scan", "records": 16, "cost": 2.0312, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 16, @@ -2076,6 +2061,21 @@ explain select * from t1 where a=1 and b=2 order by c limit 1 { } } }, + { + "table": "t1", + "rowid_filters": [ + { + "key": "a_b", + "build_cost": 2.989, + "rows": 21 + }, + { + "key": "a_c", + "build_cost": 23.969, + "rows": 180 + } + ] + }, { "selectivity_for_indexes": [ { @@ -2130,8 +2130,7 @@ explain select * from t1 where a=1 and b=2 order by c limit 1 { "type": "ref", "records": 21, "cost": 22, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 21, @@ -2371,8 +2370,7 @@ select t1.a from t1 left join t2 on t1.a=t2.a { "type": "scan", "records": 4, "cost": 2.0068, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 4, @@ -2498,8 +2496,7 @@ explain select * from t1 left join t2 on t2.a=t1.a { "type": "scan", "records": 4, "cost": 2.0068, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 4, @@ -2528,8 +2525,7 @@ explain select * from t1 left join t2 on t2.a=t1.a { "type": "eq_ref", "records": 1, "cost": 4, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 4, @@ -2689,8 +2685,7 @@ explain select t1.a from t1 left join (t2 join t3 on t2.b=t3.b) on t2.a=t1.a and "type": "scan", "records": 4, "cost": 2.0068, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 4, @@ -2892,8 +2887,7 @@ explain extended select * from t1 where a in (select pk from t10) { "type": "scan", "records": 10, "cost": 2.022, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 10, @@ -2923,8 +2917,7 @@ explain extended select * from t1 where a in (select pk from t10) { "type": "scan", "records": 3, "cost": 2.0066, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -2947,8 +2940,7 @@ explain extended select * from t1 where a in (select pk from t10) { "type": "scan", "records": 10, "cost": 2.022, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 30, @@ -2993,8 +2985,7 @@ explain extended select * from t1 where a in (select pk from t10) { "type": "scan", "records": 10, "cost": 2.022, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 10, @@ -3284,6 +3275,26 @@ explain select * from t1 where pk = 2 and a=5 and b=1 { } } }, + { + "table": "t1", + "rowid_filters": [ + { + "key": "pk", + "build_cost": 1.1823, + "rows": 1 + }, + { + "key": "pk_a", + "build_cost": 1.1833, + "rows": 1 + }, + { + "key": "pk_a_b", + "build_cost": 1.1843, + "rows": 1 + } + ] + }, { "selectivity_for_indexes": [ { @@ -3347,8 +3358,7 @@ explain select * from t1 where pk = 2 and a=5 and b=1 { "type": "ref", "records": 1, "cost": 1.0043, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 1, @@ -3472,8 +3482,7 @@ select f1(a) from t1 { "type": "scan", "records": 4, "cost": 2.0068, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 4, @@ -3571,8 +3580,7 @@ select f2(a) from t1 { "type": "scan", "records": 4, "cost": 2.0068, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 4, @@ -3624,7 +3632,7 @@ a 2 select length(trace) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; length(trace) -2205 +2163 set optimizer_trace_max_mem_size=100; select * from t1; a @@ -3638,7 +3646,7 @@ select * from t1 { "join_preparation": { "select_id": 1, "steps": [ - 2105 0 + 2063 0 set optimizer_trace_max_mem_size=0; select * from t1; a @@ -3646,7 +3654,7 @@ a 2 select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE; QUERY TRACE MISSING_BYTES_BEYOND_MAX_MEM_SIZE INSUFFICIENT_PRIVILEGES -select * from t1 2205 0 +select * from t1 2163 0 drop table t1; set optimizer_trace='enabled=off'; set @@optimizer_trace_max_mem_size= @save_optimizer_trace_max_mem_size; @@ -3954,8 +3962,7 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 { "type": "range", "records": 3, "cost": 1.407, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -3985,8 +3992,7 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 { "type": "ref", "records": 1, "cost": 3.007, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4011,8 +4017,7 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 { "type": "range", "records": 3, "cost": 1.407, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4042,8 +4047,7 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 { "type": "ref", "records": 2, "cost": 3.014, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 6, @@ -4182,8 +4186,7 @@ explain select * from (select rand() from t1)q { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4249,8 +4252,7 @@ explain select * from (select rand() from t1)q { "type": "scan", "records": 3, "cost": 3, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4458,8 +4460,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4481,8 +4482,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -4507,8 +4507,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4538,8 +4537,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4562,8 +4560,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -4586,8 +4583,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -4632,8 +4628,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -4659,8 +4654,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4684,8 +4678,7 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -4993,8 +4986,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -5017,8 +5009,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -5041,8 +5032,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -5079,8 +5069,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -5108,8 +5097,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -5138,8 +5126,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -5184,8 +5171,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -5211,8 +5197,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -5240,8 +5225,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -5270,8 +5254,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -5311,8 +5294,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -5338,8 +5320,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -5365,8 +5346,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -5389,8 +5369,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -5427,8 +5406,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -5457,8 +5435,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -5498,8 +5475,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -5525,8 +5501,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -5554,8 +5529,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -5584,8 +5558,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -5611,8 +5584,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -5640,8 +5612,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -5679,8 +5650,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 6561, @@ -5708,8 +5678,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -5732,8 +5701,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -5761,8 +5729,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -5791,8 +5758,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -5818,8 +5784,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -5843,8 +5808,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -5870,8 +5834,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -5894,8 +5857,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -5923,8 +5885,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -5953,8 +5914,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 6561, @@ -5980,8 +5940,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -6009,8 +5968,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -6039,8 +5997,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 2187, @@ -6066,8 +6023,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -6095,8 +6051,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -6120,8 +6075,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -6145,8 +6099,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -6170,8 +6123,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -6197,8 +6149,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -6222,8 +6173,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -6247,8 +6197,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -6272,8 +6221,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -6297,8 +6245,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -6612,8 +6559,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -6635,8 +6581,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -6661,8 +6606,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -6689,8 +6633,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -6712,8 +6655,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -6738,8 +6680,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -6769,8 +6710,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -6793,8 +6733,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -6817,8 +6756,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -6860,8 +6798,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -6889,8 +6826,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -6919,8 +6855,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 729, @@ -6970,8 +6905,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 243, @@ -6997,8 +6931,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -7026,8 +6959,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -7056,8 +6988,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -7083,8 +7014,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -7110,8 +7040,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -7135,8 +7064,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -7160,8 +7088,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 81, @@ -7187,8 +7114,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -7212,8 +7138,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -7237,8 +7162,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 9, @@ -7262,8 +7186,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": true, - "filter_used": false + "uses_join_buffering": true } }, "rows_for_plan": 27, @@ -7289,8 +7212,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -7314,8 +7236,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -7339,8 +7260,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -7364,8 +7284,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -7389,8 +7308,7 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { "type": "scan", "records": 9, "cost": 2.0154, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 9, @@ -8083,8 +8001,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) "type": "scan", "records": 5.9375, "cost": 2.8296, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 5.9375, @@ -8115,8 +8032,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) "type": "scan", "records": 804.69, "cost": 256.85, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 4777.8, @@ -8148,8 +8064,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) "type": "scan", "records": 804.69, "cost": 43.26, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 804.69, @@ -8192,8 +8107,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) "type": "scan", "records": 10, "cost": 2.0171, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 10, @@ -8234,8 +8148,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) "type": "ref", "records": 1, "cost": 20, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 10, @@ -8268,8 +8181,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) "type": "scan", "records": 804.69, "cost": 43.26, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 804.69, diff --git a/mysql-test/main/opt_trace_index_merge.result b/mysql-test/main/opt_trace_index_merge.result index 40d75d549ec..ed5ddfd69f4 100644 --- a/mysql-test/main/opt_trace_index_merge.result +++ b/mysql-test/main/opt_trace_index_merge.result @@ -217,8 +217,7 @@ explain select * from t1 where a=1 or b=1 { "type": "index_merge", "records": 2, "cost": 4.1484, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 2, diff --git a/mysql-test/main/opt_trace_index_merge_innodb.result b/mysql-test/main/opt_trace_index_merge_innodb.result index 4b047315bf5..3c6259b0202 100644 --- a/mysql-test/main/opt_trace_index_merge_innodb.result +++ b/mysql-test/main/opt_trace_index_merge_innodb.result @@ -171,6 +171,16 @@ explain select * from t1 where pk1 != 0 and key1 = 1 { } } }, + { + "table": "t1", + "rowid_filters": [ + { + "key": "key1", + "build_cost": 1.1801, + "rows": 1 + } + ] + }, { "selectivity_for_indexes": [ { @@ -212,8 +222,7 @@ explain select * from t1 where pk1 != 0 and key1 = 1 { "type": "ref", "records": 1, "cost": 2, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 1, diff --git a/mysql-test/main/opt_trace_security.result b/mysql-test/main/opt_trace_security.result index 22c5f3ff6f6..6f377cd02b5 100644 --- a/mysql-test/main/opt_trace_security.result +++ b/mysql-test/main/opt_trace_security.result @@ -103,8 +103,7 @@ select * from db1.t1 { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, @@ -227,8 +226,7 @@ select * from db1.v1 { "type": "scan", "records": 3, "cost": 2.0051, - "uses_join_buffering": false, - "filter_used": false + "uses_join_buffering": false } }, "rows_for_plan": 3, diff --git a/sql/opt_trace.cc b/sql/opt_trace.cc index afb188ceeb0..9957e524e90 100644 --- a/sql/opt_trace.cc +++ b/sql/opt_trace.cc @@ -24,6 +24,8 @@ #include "my_json_writer.h" #include "sp_head.h" +#include "rowid_filter.h" + const char I_S_table_name[]= "OPTIMIZER_TRACE"; /** @@ -661,14 +663,17 @@ void print_best_access_for_table(THD *thd, POSITION *pos, { DBUG_ASSERT(thd->trace_started()); - Json_writer_object trace_best_access(thd, "chosen_access_method"); - trace_best_access.add("type", type == JT_ALL ? "scan" : - join_type_str[type]); - trace_best_access.add("records", pos->records_read); - trace_best_access.add("cost", pos->read_time); - trace_best_access.add("uses_join_buffering", pos->use_join_buffer); - trace_best_access.add("filter_used", - pos->range_rowid_filter_info != NULL); + Json_writer_object obj(thd, "chosen_access_method"); + obj.add("type", type == JT_ALL ? "scan" : join_type_str[type]); + obj.add("records", pos->records_read); + obj.add("cost", pos->read_time); + obj.add("uses_join_buffering", pos->use_join_buffer); + if (pos->range_rowid_filter_info) + { + uint key_no= pos->range_rowid_filter_info->key_no; + obj.add("rowid_filter_key", + pos->table->table->key_info[key_no].name); + } } diff --git a/sql/rowid_filter.cc b/sql/rowid_filter.cc index 865f22b431a..6ab9e40de32 100644 --- a/sql/rowid_filter.cc +++ b/sql/rowid_filter.cc @@ -20,6 +20,7 @@ #include "opt_range.h" #include "rowid_filter.h" #include "sql_select.h" +#include "opt_trace.h" inline @@ -403,9 +404,37 @@ void TABLE::init_cost_info_for_usable_range_rowid_filters(THD *thd) } prune_range_rowid_filters(); + + if (unlikely(thd->trace_started())) + trace_range_rowid_filters(thd); } +void TABLE::trace_range_rowid_filters(THD *thd) const +{ + if (!range_rowid_filter_cost_info_elems) + return; + + Range_rowid_filter_cost_info **p= range_rowid_filter_cost_info_ptr; + Range_rowid_filter_cost_info **end= p + range_rowid_filter_cost_info_elems; + + Json_writer_object js_obj(thd); + js_obj.add_table_name(this); + Json_writer_array js_arr(thd, "rowid_filters"); + + for (; p < end; p++) + (*p)->trace_info(thd); +} + + +void Range_rowid_filter_cost_info::trace_info(THD *thd) +{ + Json_writer_object js_obj(thd); + js_obj.add("key", table->key_info[key_no].name); + js_obj.add("build_cost", b); + js_obj.add("rows", est_elements); +} + /** @brief Choose the best range filter for the given access of the table diff --git a/sql/rowid_filter.h b/sql/rowid_filter.h index a9930dcbca8..467b6884ca6 100644 --- a/sql/rowid_filter.h +++ b/sql/rowid_filter.h @@ -452,6 +452,8 @@ public: double get_a() { return a; } + void trace_info(THD *thd); + friend void TABLE::prune_range_rowid_filters(); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 539d8362050..a64eb5b327d 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -7758,6 +7758,8 @@ best_access_path(JOIN *join, filter->get_cmp_gain(rows); tmp-= filter->get_adjusted_gain(rows) - filter->get_cmp_gain(rows); DBUG_ASSERT(tmp >= 0); + trace_access_idx.add("rowid_filter_key", + s->table->key_info[filter->key_no].name); } } trace_access_idx.add("rows", records).add("cost", tmp); diff --git a/sql/table.h b/sql/table.h index cd9eaaf1e76..e9bbd1d6966 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1566,6 +1566,7 @@ public: void init_cost_info_for_usable_range_rowid_filters(THD *thd); void prune_range_rowid_filters(); + void trace_range_rowid_filters(THD *thd) const; Range_rowid_filter_cost_info * best_range_rowid_filter_for_partial_join(uint access_key_no, double records, From 76063c2a13ff0a9aebf071d24a740f96882c4339 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Fri, 3 Apr 2020 23:55:48 +0300 Subject: [PATCH 3/8] MDEV-20494 ER_NOT_FORM_FILE or assertion upon adding partition to period table - Fixed mysql_prepare_create_table() constraint duplicate checking; - Refactored period constraint handling in mysql_prepare_alter_table(): * No need to allocate new objects; * Keep old constraint name but exclude it from dup checking by automatic_name; - Some minor memory leaks fixed; - Some conceptual TODOs. --- mysql-test/suite/period/r/alter.result | 16 +++++++++++ mysql-test/suite/period/t/alter.test | 20 ++++++++++++++ sql/field.cc | 17 ++++++++++++ sql/field.h | 1 + sql/sql_partition.cc | 1 + sql/sql_table.cc | 37 +++++++++++++++++--------- sql/unireg.cc | 7 +++++ 7 files changed, 87 insertions(+), 12 deletions(-) diff --git a/mysql-test/suite/period/r/alter.result b/mysql-test/suite/period/r/alter.result index e202ba2698f..a6466c8944b 100644 --- a/mysql-test/suite/period/r/alter.result +++ b/mysql-test/suite/period/r/alter.result @@ -174,3 +174,19 @@ alter table t add constraint mytime_1 check (x > 2); insert t values (3, @e, @s); ERROR 23000: CONSTRAINT `mytime_2` failed for `test`.`t` drop table t; +# +# MDEV-20494 ER_NOT_FORM_FILE or assertion upon adding partition to period table +# +create table t1 (f date, t date, period for app(f,t)) with system versioning partition by system_time ( partition p1 history, partition pn current ); +lock table t1 write; +alter table t1 add partition (partition p2 history); +Warnings: +Warning 4115 Maybe missing parameters: no rotation condition for multiple HISTORY partitions. +unlock tables; +create or replace table t1 (x int, s date, e date, period for app(s,e)); +insert into t1 values(1, '2020-03-01', '2020-03-02'); +insert into t1 values(1, '2020-03-01', '2020-03-02'); +alter table t1 add primary key(x, s, e); +ERROR 23000: Duplicate entry '1-2020-03-01-2020-03-02' for key 'PRIMARY' +alter table t1 add system versioning; +drop table t1; diff --git a/mysql-test/suite/period/t/alter.test b/mysql-test/suite/period/t/alter.test index 3f45d68cd61..3fa3c5c87d5 100644 --- a/mysql-test/suite/period/t/alter.test +++ b/mysql-test/suite/period/t/alter.test @@ -1,3 +1,5 @@ +--source include/have_partition.inc + set @s= '1992-01-01'; set @e= '1999-12-31'; @@ -131,3 +133,21 @@ alter table t add constraint mytime_1 check (x > 2); insert t values (3, @e, @s); drop table t; + +--echo # +--echo # MDEV-20494 ER_NOT_FORM_FILE or assertion upon adding partition to period table +--echo # +create table t1 (f date, t date, period for app(f,t)) with system versioning partition by system_time ( partition p1 history, partition pn current ); +lock table t1 write; +alter table t1 add partition (partition p2 history); +unlock tables; + +create or replace table t1 (x int, s date, e date, period for app(s,e)); +insert into t1 values(1, '2020-03-01', '2020-03-02'); +insert into t1 values(1, '2020-03-01', '2020-03-02'); +--error ER_DUP_ENTRY +alter table t1 add primary key(x, s, e); +alter table t1 add system versioning; + +# cleanup +drop table t1; diff --git a/sql/field.cc b/sql/field.cc index ace70c178bc..a9bd97d9844 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -11387,3 +11387,20 @@ void Field::print_key_value_binary(String *out, const uchar* key, uint32 length) { out->append_semi_hex((const char*)key, length, charset()); } + + +Virtual_column_info* Virtual_column_info::clone(THD *thd) +{ + Virtual_column_info* dst= new (thd->mem_root) Virtual_column_info(*this); + if (!dst) + return NULL; + if (expr) + { + dst->expr= expr->get_copy(thd); + if (!dst->expr) + return NULL; + } + if (!thd->make_lex_string(&dst->name, name.str, name.length)) + return NULL; + return dst; +}; diff --git a/sql/field.h b/sql/field.h index 5fe3a9ed106..773f0e05468 100644 --- a/sql/field.h +++ b/sql/field.h @@ -555,6 +555,7 @@ public: name.str= NULL; name.length= 0; }; + Virtual_column_info* clone(THD *thd); ~Virtual_column_info() {}; enum_vcol_info_type get_vcol_type() const { diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 12198d34c88..3a4cb8a5da0 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -6875,6 +6875,7 @@ static void alter_partition_lock_handling(ALTER_PARTITION_PARAM_TYPE *lpt) thd->set_stmt_da(&tmp_stmt_da); } + // TODO: why error status of reopen_tables() is ignored? if (unlikely(thd->locked_tables_list.reopen_tables(thd, false))) sql_print_warning("We failed to reacquire LOCKs in ALTER TABLE"); diff --git a/sql/sql_table.cc b/sql/sql_table.cc index f46a7da09f5..7c4a4956a93 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -4311,6 +4311,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, const Virtual_column_info *dup_check; while ((dup_check= dup_it++) && dup_check != check) { + if (!dup_check->name.length || dup_check->automatic_name) + continue; if (!lex_string_cmp(system_charset_info, &check->name, &dup_check->name)) { @@ -8480,8 +8482,8 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, key_part_length= 0; // Use whole field } key_part_length /= kfield->charset()->mbmaxlen; - key_parts.push_back(new Key_part_spec(&cfield->field_name, - key_part_length), + key_parts.push_back(new (thd->mem_root) Key_part_spec( + &cfield->field_name, key_part_length), thd->mem_root); } if (table->s->tmp_table == NO_TMP_TABLE) @@ -8547,7 +8549,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, tmp_name.str= key_name; tmp_name.length= strlen(key_name); /* We dont need LONG_UNIQUE_HASH_FIELD flag because it will be autogenerated */ - key= new Key(key_type, &tmp_name, &key_create_info, + key= new (thd->mem_root) Key(key_type, &tmp_name, &key_create_info, MY_TEST(key_info->flags & HA_GENERATED_KEY), &key_parts, key_info->option_list, DDL_options()); new_key_list.push_back(key, thd->mem_root); @@ -8627,26 +8629,37 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, } } + // NB: `check` is TABLE resident, we must keep it intact. + if (keep) + { + check= check->clone(thd); + if (!check) + { + my_error(ER_OUT_OF_RESOURCES, MYF(0)); + goto err; + } + } + if (share->period.constr_name.streq(check->name.str)) { - if (!drop_period && !keep) + if (drop_period) + { + keep= false; + } + else if(!keep) { my_error(ER_PERIOD_CONSTRAINT_DROP, MYF(0), check->name.str, share->period.name.str); goto err; } - keep= keep && !drop_period; - - DBUG_ASSERT(create_info->period_info.constr == NULL || drop_period); - - if (keep) + else { - Item *expr_copy= check->expr->get_copy(thd); - check= new Virtual_column_info(); - check->expr= expr_copy; + DBUG_ASSERT(create_info->period_info.constr == NULL); create_info->period_info.constr= check; + create_info->period_info.constr->automatic_name= true; } } + /* see if the constraint depends on *only* on dropped fields */ if (keep && dropped_fields) { diff --git a/sql/unireg.cc b/sql/unireg.cc index a1605dac2e6..8cb5a22dba8 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -57,6 +57,13 @@ static bool make_empty_rec(THD *, uchar *, uint, List &, uint, */ static uchar *extra2_write_len(uchar *pos, size_t len) { + /* TODO: should be + if (len > 0 && len <= 255) + *pos++= (uchar)len; + ... + because extra2_read_len() uses 0 for 2-byte lengths. + extra2_str_size() must be fixed too. + */ if (len <= 255) *pos++= (uchar)len; else From 198af54bb9410b31a4ac1cf50c72a5c430bf54ad Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Fri, 3 Apr 2020 23:55:48 +0300 Subject: [PATCH 4/8] MDEV-20494 Fix wrongly ignored error status --- sql/sql_partition.cc | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 3a4cb8a5da0..82a77d3638f 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -6848,9 +6848,9 @@ static void release_log_entries(partition_info *part_info) alter_partition_lock_handling() lpt Struct carrying parameters RETURN VALUES - NONE + true on error */ -static void alter_partition_lock_handling(ALTER_PARTITION_PARAM_TYPE *lpt) +static bool alter_partition_lock_handling(ALTER_PARTITION_PARAM_TYPE *lpt) { THD *thd= lpt->thd; @@ -6864,24 +6864,9 @@ static void alter_partition_lock_handling(ALTER_PARTITION_PARAM_TYPE *lpt) lpt->table= 0; lpt->table_list->table= 0; if (thd->locked_tables_mode) - { - Diagnostics_area *stmt_da= NULL; - Diagnostics_area tmp_stmt_da(true); + return thd->locked_tables_list.reopen_tables(thd, false); - if (unlikely(thd->is_error())) - { - /* reopen might fail if we have a previous error, use a temporary da. */ - stmt_da= thd->get_stmt_da(); - thd->set_stmt_da(&tmp_stmt_da); - } - - // TODO: why error status of reopen_tables() is ignored? - if (unlikely(thd->locked_tables_list.reopen_tables(thd, false))) - sql_print_warning("We failed to reacquire LOCKs in ALTER TABLE"); - - if (stmt_da) - thd->set_stmt_da(stmt_da); - } + return false; } @@ -7082,6 +7067,8 @@ err_exclusive_lock: thd->set_stmt_da(&tmp_stmt_da); } + /* NB: error status is not needed here, the statement fails with + the original error. */ if (unlikely(thd->locked_tables_list.reopen_tables(thd, false))) sql_print_warning("We failed to reacquire LOCKs in ALTER TABLE"); @@ -7305,13 +7292,14 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, ERROR_INJECT_ERROR("fail_drop_partition_8") || (write_log_completed(lpt, FALSE), FALSE) || ERROR_INJECT_CRASH("crash_drop_partition_9") || - ERROR_INJECT_ERROR("fail_drop_partition_9") || - (alter_partition_lock_handling(lpt), FALSE)) + ERROR_INJECT_ERROR("fail_drop_partition_9")) { handle_alter_part_error(lpt, action_completed, TRUE, frm_install, close_table_on_failure); goto err; } + if (alter_partition_lock_handling(lpt)) + goto err; } else if ((alter_info->partition_flags & ALTER_PARTITION_ADD) && (part_info->part_type == RANGE_PARTITION || @@ -7382,13 +7370,14 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, ERROR_INJECT_ERROR("fail_add_partition_9") || (write_log_completed(lpt, FALSE), FALSE) || ERROR_INJECT_CRASH("crash_add_partition_10") || - ERROR_INJECT_ERROR("fail_add_partition_10") || - (alter_partition_lock_handling(lpt), FALSE)) + ERROR_INJECT_ERROR("fail_add_partition_10")) { handle_alter_part_error(lpt, action_completed, FALSE, frm_install, close_table_on_failure); goto err; } + if (alter_partition_lock_handling(lpt)) + goto err; } else { @@ -7487,13 +7476,14 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, ERROR_INJECT_ERROR("fail_change_partition_11") || (write_log_completed(lpt, FALSE), FALSE) || ERROR_INJECT_CRASH("crash_change_partition_12") || - ERROR_INJECT_ERROR("fail_change_partition_12") || - (alter_partition_lock_handling(lpt), FALSE)) + ERROR_INJECT_ERROR("fail_change_partition_12")) { handle_alter_part_error(lpt, action_completed, FALSE, frm_install, close_table_on_failure); goto err; } + if (alter_partition_lock_handling(lpt)) + goto err; } downgrade_mdl_if_lock_tables_mode(thd, mdl_ticket, MDL_SHARED_NO_READ_WRITE); /* From aa7f2578fcf2ddceef89e9cac5c9a8eb98873540 Mon Sep 17 00:00:00 2001 From: Aleksey Midenkov Date: Fri, 3 Apr 2020 23:55:48 +0300 Subject: [PATCH 5/8] MDEV-21471 ER_CRASHED_ON_USAGE upon UPDATE FOR PORTION on Aria table Turn read cache off for periodic update. Like 498a96a4 says: Aria with row_format=fixed uses IO_CACHE of type READ_CACHE for sequential read in update loop. When history row is inserted inside this loop the cache misses it and fails with error. This applicable to any additional row inserts on UPDATE. In this case it was initiated by UPDATE FOR PORTION. Related to MDEV-20441. --- mysql-test/suite/period/r/update.result | 7 +++++++ mysql-test/suite/period/t/update.test | 10 ++++++++++ sql/sql_update.cc | 1 + 3 files changed, 18 insertions(+) diff --git a/mysql-test/suite/period/r/update.result b/mysql-test/suite/period/r/update.result index b86537fc9fb..05d1a2eb6d3 100644 --- a/mysql-test/suite/period/r/update.result +++ b/mysql-test/suite/period/r/update.result @@ -274,3 +274,10 @@ drop function f; drop function g; drop function h; drop procedure log; +# +# MDEV-21471 ER_CRASHED_ON_USAGE upon UPDATE FOR PORTION on Aria table +# +create table t1 (s date, e date, period for app(s,e), f varchar(8)) engine=aria row_format=fixed; +insert into t1 values ('2024-05-13','2026-03-25','foo'); +update t1 for portion of app from '2024-04-02' to '2026-03-15' set f = 'bar'; +drop table t1; diff --git a/mysql-test/suite/period/t/update.test b/mysql-test/suite/period/t/update.test index 5730387dfda..0f54dd80eec 100644 --- a/mysql-test/suite/period/t/update.test +++ b/mysql-test/suite/period/t/update.test @@ -163,3 +163,13 @@ drop function f; drop function g; drop function h; drop procedure log; + +--echo # +--echo # MDEV-21471 ER_CRASHED_ON_USAGE upon UPDATE FOR PORTION on Aria table +--echo # +create table t1 (s date, e date, period for app(s,e), f varchar(8)) engine=aria row_format=fixed; +insert into t1 values ('2024-05-13','2026-03-25','foo'); +update t1 for portion of app from '2024-04-02' to '2026-03-15' set f = 'bar'; + +# cleanup +drop table t1; diff --git a/sql/sql_update.cc b/sql/sql_update.cc index af09675d917..0d2860de19f 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -465,6 +465,7 @@ int mysql_update(THD *thd, my_error(ER_NOT_CONSTANT_EXPRESSION, MYF(0), "FOR PORTION OF"); DBUG_RETURN(true); } + table->no_cache= true; } old_covering_keys= table->covering_keys; // Keys used in WHERE From 28604c349bbb2ed73c93e56eb5ac3bf0d7269f52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Sun, 5 Apr 2020 18:55:15 +0300 Subject: [PATCH 6/8] Travis-CI: Add missing build dependency dh-exec Backported from 30b44aaec7120f41ee1383536730947cfa427308. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 9c862d496c1..9be6b2e9ffd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -56,6 +56,7 @@ matrix: - cmake - debhelper - dh-apparmor + - dh-exec - dpatch - gdb - libaio-dev From b6eabce13941cde954d451f7be07c1e7ffd3bdcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Otto=20Kek=C3=A4l=C3=A4inen?= Date: Mon, 16 Mar 2020 13:07:52 +0200 Subject: [PATCH 7/8] Travis-CI: Shorten deb build log to keep it under 4 MB There is a 4 MB hard limit on Travis-CI and build output needs to be less than that. Silencing the 'make install' step gets rid of a lot of "Installing.." and "Missing.." and removing all mysql-test files will make the dh_missing warnings much shorter. --- debian/rules | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/debian/rules b/debian/rules index 360d22d3836..c7862141c71 100755 --- a/debian/rules +++ b/debian/rules @@ -117,8 +117,13 @@ ifneq (,$(filter linux,$(DEB_HOST_ARCH_OS))) cp $(BUILDDIR)/support-files/mariadb@.service debian/mariadb-server-10.4.mariadb@.service endif - # make install - cd $(BUILDDIR) && $(MAKE) install DESTDIR=$(TMP) + # Run 'make install' without output since it is uninteresting and + # silencing it helps to make overall build log shorter and more readable + @echo "Running $(MAKE) install DESTDIR=$(TMP) ..." + cd $(BUILDDIR) && $(MAKE) install DESTDIR=$(TMP) > /dev/null + + # If mariadb-test package is removed, also remove most of it's files + grep --quiet "Package: mariadb-test" debian/control || rm -rf $(TMP)/usr/share/mysql/mysql-test # Delete runnable files we don't want to have in the test data package. # This avoids triggering multiple Lintian errors. From 476966b3fb05ce8c061a4b77a0ab0b722bb0d192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Wed, 8 Apr 2020 09:58:08 +0300 Subject: [PATCH 8/8] MDEV-21535 Unnecessarily large ha_innobase::records_in_range() scans The bug was already fixed in commit 1242eb3d32f2863f847aa96a10e2ab983a1a643b but the test innodb.innodb_wl6326 had not been enabled. --- mysql-test/suite/innodb/disabled.def | 1 - mysql-test/suite/innodb/r/innodb_wl6326.result | 2 -- 2 files changed, 3 deletions(-) diff --git a/mysql-test/suite/innodb/disabled.def b/mysql-test/suite/innodb/disabled.def index 3c2d32765d8..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_wl6326 : MDEV-21535 Too broad ha_innobase::records_in_range() diff --git a/mysql-test/suite/innodb/r/innodb_wl6326.result b/mysql-test/suite/innodb/r/innodb_wl6326.result index 6f7ad8a3de4..85908ca1773 100644 --- a/mysql-test/suite/innodb/r/innodb_wl6326.result +++ b/mysql-test/suite/innodb/r/innodb_wl6326.result @@ -295,8 +295,6 @@ SET DEBUG_SYNC = 'now WAIT_FOR lockwait1 TIMEOUT 1'; SET DEBUG_SYNC = 'now WAIT_FOR lockwait2 TIMEOUT 1'; SET DEBUG_SYNC = 'now SIGNAL continue'; connection con1; -Warnings: -Warning 1639 debug sync point wait timed out connection con2; a00 a01 ar a