From f4484dfdbf2d78b0f357916ebd8ade024dd73c09 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Thu, 21 Mar 2019 13:43:17 +0400 Subject: [PATCH] MDEV-19008 Slow EXPLAIN SELECT ... WHERE col IN (const1,const2,(subquery)) --- mysql-test/main/func_debug.result | 19 +++++++++++++++++++ mysql-test/main/func_debug.test | 13 +++++++++++++ sql/item.h | 10 ++++++++++ sql/item_cmpfunc.h | 2 +- sql/item_subselect.cc | 6 ++++++ 5 files changed, 49 insertions(+), 1 deletion(-) diff --git a/mysql-test/main/func_debug.result b/mysql-test/main/func_debug.result index 7fcf522abba2a..e2bf0ca8df341 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 e0960f736cb54..8dd01650ed36b 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 4eab7090276d4..883cc791f3843 100644 --- a/sql/item.h +++ b/sql/item.h @@ -1409,6 +1409,16 @@ class Item: public Value_source, 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 4a1202837f49f..06f15503258a3 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 207aa9a25c98a..cd411c5d4c110 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.