diff options
author | Alexander Barkov <bar@mariadb.com> | 2019-03-21 13:43:17 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.com> | 2019-03-22 07:28:59 +0400 |
commit | f4484dfdbf2d78b0f357916ebd8ade024dd73c09 (patch) | |
tree | 680aca6e1cf1290efd65fa5fa53e936169394422 | |
parent | 482710b20c28e2cdc598dc37468cc5dc06c53ac1 (diff) | |
download | mariadb-git-f4484dfdbf2d78b0f357916ebd8ade024dd73c09.tar.gz |
MDEV-19008 Slow EXPLAIN SELECT ... WHERE col IN (const1,const2,(subquery))
-rw-r--r-- | mysql-test/main/func_debug.result | 19 | ||||
-rw-r--r-- | mysql-test/main/func_debug.test | 13 | ||||
-rw-r--r-- | sql/item.h | 10 | ||||
-rw-r--r-- | sql/item_cmpfunc.h | 2 | ||||
-rw-r--r-- | sql/item_subselect.cc | 6 |
5 files changed, 49 insertions, 1 deletions
diff --git a/mysql-test/main/func_debug.result b/mysql-test/main/func_debug.result index 7fcf522abba..e2bf0ca8df3 100644 --- a/mysql-test/main/func_debug.result +++ b/mysql-test/main/func_debug.result @@ -1655,3 +1655,22 @@ Note 1105 DBUG: [1] arg=2 handler=0 (time) Note 1105 DBUG: [2] arg=3 handler=2 (datetime) SET SESSION debug_dbug="-d,Predicant_to_list_comparator"; SET SESSION debug_dbug="-d,Item_func_in"; +# +# MDEV-19008 Slow EXPLAIN SELECT ... WHERE col IN (const1,const2,(subquery)) +# +SET SESSION debug_dbug="+d,Item_subselect"; +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +EXPLAIN SELECT * FROM t1 WHERE a IN (1,2,(SELECT MAX(a) FROM t1)); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 10 Using where +2 SUBQUERY t1 ALL NULL NULL NULL NULL 10 +SELECT * FROM t1 WHERE a IN (1,2,(SELECT MAX(a) FROM t1)); +a +1 +2 +9 +Warnings: +Note 1105 DBUG: Item_subselect::exec (select max(`test`.`t1`.`a`) from `test`.`t1`) +DROP TABLE t1; +SET SESSION debug_dbug="-d,Item_subselect"; diff --git a/mysql-test/main/func_debug.test b/mysql-test/main/func_debug.test index e0960f736cb..8dd01650ed3 100644 --- a/mysql-test/main/func_debug.test +++ b/mysql-test/main/func_debug.test @@ -475,3 +475,16 @@ SELECT SET SESSION debug_dbug="-d,Predicant_to_list_comparator"; SET SESSION debug_dbug="-d,Item_func_in"; + + +--echo # +--echo # MDEV-19008 Slow EXPLAIN SELECT ... WHERE col IN (const1,const2,(subquery)) +--echo # + +SET SESSION debug_dbug="+d,Item_subselect"; +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +EXPLAIN SELECT * FROM t1 WHERE a IN (1,2,(SELECT MAX(a) FROM t1)); +SELECT * FROM t1 WHERE a IN (1,2,(SELECT MAX(a) FROM t1)); +DROP TABLE t1; +SET SESSION debug_dbug="-d,Item_subselect"; diff --git a/sql/item.h b/sql/item.h index 4eab7090276..883cc791f38 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1409,6 +1409,16 @@ public: LOWEST_PRECEDENCE); } virtual void print(String *str, enum_query_type query_type); + + class Print: public String + { + public: + Print(Item *item, enum_query_type type) + { + item->print(this, type); + } + }; + void print_item_w_name(String *str, enum_query_type query_type); void print_value(String *str); diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 4a1202837f4..06f15503258 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -2281,7 +2281,7 @@ class Item_func_in :public Item_func_opt_neg, { for (uint i= 0; i < nitems; i++) { - if (!items[i]->const_item()) + if (!items[i]->const_item() || items[i]->is_expensive()) return false; } return true; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 207aa9a25c9..cd411c5d4c1 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -710,6 +710,12 @@ bool Item_subselect::exec() DBUG_ENTER("Item_subselect::exec"); DBUG_ASSERT(fixed); + DBUG_EXECUTE_IF("Item_subselect", + push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, + ER_UNKNOWN_ERROR, "DBUG: Item_subselect::exec %s", + Item::Print(this, + enum_query_type(QT_TO_SYSTEM_CHARSET | + QT_WITHOUT_INTRODUCERS)).ptr());); /* Do not execute subselect in case of a fatal error or if the query has been killed. |