Commit f4484dfd authored by Alexander Barkov's avatar Alexander Barkov

MDEV-19008 Slow EXPLAIN SELECT ... WHERE col IN (const1,const2,(subquery))

parent 482710b2
...@@ -1655,3 +1655,22 @@ Note 1105 DBUG: [1] arg=2 handler=0 (time) ...@@ -1655,3 +1655,22 @@ Note 1105 DBUG: [1] arg=2 handler=0 (time)
Note 1105 DBUG: [2] arg=3 handler=2 (datetime) Note 1105 DBUG: [2] arg=3 handler=2 (datetime)
SET SESSION debug_dbug="-d,Predicant_to_list_comparator"; SET SESSION debug_dbug="-d,Predicant_to_list_comparator";
SET SESSION debug_dbug="-d,Item_func_in"; 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";
...@@ -475,3 +475,16 @@ SELECT ...@@ -475,3 +475,16 @@ SELECT
SET SESSION debug_dbug="-d,Predicant_to_list_comparator"; SET SESSION debug_dbug="-d,Predicant_to_list_comparator";
SET SESSION debug_dbug="-d,Item_func_in"; 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";
...@@ -1409,6 +1409,16 @@ class Item: public Value_source, ...@@ -1409,6 +1409,16 @@ class Item: public Value_source,
LOWEST_PRECEDENCE); LOWEST_PRECEDENCE);
} }
virtual void print(String *str, enum_query_type query_type); 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_item_w_name(String *str, enum_query_type query_type);
void print_value(String *str); void print_value(String *str);
......
...@@ -2281,7 +2281,7 @@ class Item_func_in :public Item_func_opt_neg, ...@@ -2281,7 +2281,7 @@ class Item_func_in :public Item_func_opt_neg,
{ {
for (uint i= 0; i < nitems; i++) for (uint i= 0; i < nitems; i++)
{ {
if (!items[i]->const_item()) if (!items[i]->const_item() || items[i]->is_expensive())
return false; return false;
} }
return true; return true;
......
...@@ -710,6 +710,12 @@ bool Item_subselect::exec() ...@@ -710,6 +710,12 @@ bool Item_subselect::exec()
DBUG_ENTER("Item_subselect::exec"); DBUG_ENTER("Item_subselect::exec");
DBUG_ASSERT(fixed); 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 Do not execute subselect in case of a fatal error
or if the query has been killed. or if the query has been killed.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment