diff --git a/libmariadb b/libmariadb index c2b322d2ca2..5af90f00ffe 160000 --- a/libmariadb +++ b/libmariadb @@ -1 +1 @@ -Subproject commit c2b322d2ca27ef66385d9938b98541c7cf14ac74 +Subproject commit 5af90f00ffeda64795e23753c14d601cce5d02ca diff --git a/mysql-test/main/group_min_max_notembedded.result b/mysql-test/main/group_min_max_notembedded.result index b1606886c97..e19560b4923 100644 --- a/mysql-test/main/group_min_max_notembedded.result +++ b/mysql-test/main/group_min_max_notembedded.result @@ -15,10 +15,12 @@ a b 2 2 select CAST(json_value(json_extract(trace, '$**.chosen_access_method.cost'), '$[0]') -as DOUBLE) < 1.0e100 +as DOUBLE) < 1.0e100 as ACCESS_METHOD_COST_IS_FINITE from information_schema.optimizer_trace; -CAST(json_value(json_extract(trace, '$**.chosen_access_method.cost'), '$[0]') -as DOUBLE) < 1.0e100 +ACCESS_METHOD_COST_IS_FINITE 1 set optimizer_use_condition_selectivity = @tmp, optimizer_trace=@tmp2; drop table t1; +# +# End of 10.5 tests +# diff --git a/mysql-test/main/group_min_max_notembedded.test b/mysql-test/main/group_min_max_notembedded.test index 9da7e9f54b0..930ee8464f8 100644 --- a/mysql-test/main/group_min_max_notembedded.test +++ b/mysql-test/main/group_min_max_notembedded.test @@ -1,7 +1,10 @@ ---source include/no_valgrind_without_big.inc +# +# Tests for group-min-max optimization that require optimizer trace +# and so need not-embedded. +# --source include/default_optimizer_switch.inc ---source include/have_sequence.inc --source include/have_innodb.inc +--source include/have_sequence.inc --source include/not_embedded.inc --echo # @@ -22,8 +25,13 @@ SELECT DISTINCT * FROM t1 WHERE a IN (1, 2); select CAST(json_value(json_extract(trace, '$**.chosen_access_method.cost'), '$[0]') - as DOUBLE) < 1.0e100 + as DOUBLE) < 1.0e100 as ACCESS_METHOD_COST_IS_FINITE from information_schema.optimizer_trace; set optimizer_use_condition_selectivity = @tmp, optimizer_trace=@tmp2; drop table t1; + +--echo # +--echo # End of 10.5 tests +--echo # + diff --git a/mysql-test/main/join.result b/mysql-test/main/join.result index 942ee96fc32..427b06aabbe 100644 --- a/mysql-test/main/join.result +++ b/mysql-test/main/join.result @@ -3424,3 +3424,18 @@ COUNT(*) 2 DROP TABLE t1, t2, t3; # End of 10.5 tests +# +# MDEV-31449: Assertion s->table->opt_range_condition_rows <= s->found_records +# +CREATE TABLE t1 (a INT, b INT); +INSERT INTO t1 VALUES (1,2),(3,4); +CREATE TABLE t2 (c INT); +INSERT INTO t2 VALUES (5),(6); +SET @tmp=@@OPTIMIZER_USE_CONDITION_SELECTIVITY, OPTIMIZER_USE_CONDITION_SELECTIVITY = 1; +SELECT * FROM +(SELECT t1.* FROM t1 WHERE t1.a IN (SELECT MAX(t2.c) FROM t2 JOIN t1)) AS sq1, +(SELECT t2.* FROM t2 JOIN t1 ON (t1.b IN (SELECT t1.b FROM t2 STRAIGHT_JOIN t1))) AS sq2; +a b c +SET OPTIMIZER_USE_CONDITION_SELECTIVITY=@tmp; +DROP TABLE t1,t2; +# End of 10.6 tests diff --git a/mysql-test/main/join.test b/mysql-test/main/join.test index c8bd2886b30..b665f034813 100644 --- a/mysql-test/main/join.test +++ b/mysql-test/main/join.test @@ -1835,3 +1835,22 @@ SELECT COUNT(*) FROM t1 LEFT JOIN (t2 LEFT JOIN t3 ON t2.b = t3.c) ON t1.a = t2. DROP TABLE t1, t2, t3; --echo # End of 10.5 tests + +--echo # +--echo # MDEV-31449: Assertion s->table->opt_range_condition_rows <= s->found_records +--echo # +CREATE TABLE t1 (a INT, b INT); +INSERT INTO t1 VALUES (1,2),(3,4); + +CREATE TABLE t2 (c INT); +INSERT INTO t2 VALUES (5),(6); + +SET @tmp=@@OPTIMIZER_USE_CONDITION_SELECTIVITY, OPTIMIZER_USE_CONDITION_SELECTIVITY = 1; + +SELECT * FROM +(SELECT t1.* FROM t1 WHERE t1.a IN (SELECT MAX(t2.c) FROM t2 JOIN t1)) AS sq1, +(SELECT t2.* FROM t2 JOIN t1 ON (t1.b IN (SELECT t1.b FROM t2 STRAIGHT_JOIN t1))) AS sq2; + +SET OPTIMIZER_USE_CONDITION_SELECTIVITY=@tmp; +DROP TABLE t1,t2; +--echo # End of 10.6 tests diff --git a/sql/multi_range_read.cc b/sql/multi_range_read.cc index 2701dac56c4..2180cbb66b2 100644 --- a/sql/multi_range_read.cc +++ b/sql/multi_range_read.cc @@ -2008,6 +2008,9 @@ bool DsMrr_impl::get_disk_sweep_mrr_cost(uint keynr, ha_rows rows, uint flags, /* Total cost of all index accesses */ index_read_cost= primary_file->keyread_time(keynr, 1, rows); cost->add_io(index_read_cost, 1 /* Random seeks */); + + cost->cpu_cost+= (rows2double(rows) / TIME_FOR_COMPARE + + MULTI_RANGE_READ_SETUP_COST); return FALSE; } diff --git a/sql/sql_priv.h b/sql/sql_priv.h index 76260ec51e7..549f279e95a 100644 --- a/sql/sql_priv.h +++ b/sql/sql_priv.h @@ -190,7 +190,7 @@ /* The rest of the file is included in the server only */ #ifndef MYSQL_CLIENT -/* @@optimizer_switch flags. These must be in sync with optimizer_switch_typelib */ +/* @@optimizer_switch flags. These must be in sync with optimizer_switch_names */ #define OPTIMIZER_SWITCH_INDEX_MERGE (1ULL << 0) #define OPTIMIZER_SWITCH_INDEX_MERGE_UNION (1ULL << 1) #define OPTIMIZER_SWITCH_INDEX_MERGE_SORT_UNION (1ULL << 2) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 709a456cd9b..f9b655d5af7 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -5799,7 +5799,7 @@ make_join_statistics(JOIN *join, List &tables_list, get_delayed_table_estimates(s->table, &s->records, &s->read_time, &s->startup_cost); s->found_records= s->records; - table->opt_range_condition_rows=s->records; + s->table->opt_range_condition_rows=s->records; } else s->scan_time(); diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h index 3d88e6ad48f..c3aadd587e0 100644 --- a/storage/innobase/include/fil0fil.h +++ b/storage/innobase/include/fil0fil.h @@ -1655,9 +1655,11 @@ template inline void fil_space_t::flush() flush_low(); else { - if (!(acquire_low() & (STOPPING | CLOSING))) + if (!(acquire_low(STOPPING | CLOSING) & (STOPPING | CLOSING))) + { flush_low(); - release(); + release(); + } } }