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)
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";
......@@ -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";
......@@ -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);
......
......@@ -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;
......
......@@ -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.
......
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