summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2019-03-21 13:43:17 +0400
committerAlexander Barkov <bar@mariadb.com>2019-03-22 07:28:59 +0400
commitf4484dfdbf2d78b0f357916ebd8ade024dd73c09 (patch)
tree680aca6e1cf1290efd65fa5fa53e936169394422
parent482710b20c28e2cdc598dc37468cc5dc06c53ac1 (diff)
downloadmariadb-git-f4484dfdbf2d78b0f357916ebd8ade024dd73c09.tar.gz
MDEV-19008 Slow EXPLAIN SELECT ... WHERE col IN (const1,const2,(subquery))
-rw-r--r--mysql-test/main/func_debug.result19
-rw-r--r--mysql-test/main/func_debug.test13
-rw-r--r--sql/item.h10
-rw-r--r--sql/item_cmpfunc.h2
-rw-r--r--sql/item_subselect.cc6
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.