Skip to content

Commit

Permalink
MDEV-19008 Slow EXPLAIN SELECT ... WHERE col IN (const1,const2,(subqu…
Browse files Browse the repository at this point in the history
…ery))
  • Loading branch information
abarkov committed Mar 22, 2019
1 parent 482710b commit f4484df
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 1 deletion.
19 changes: 19 additions & 0 deletions mysql-test/main/func_debug.result
Original file line number Diff line number Diff line change
Expand Up @@ -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";
13 changes: 13 additions & 0 deletions mysql-test/main/func_debug.test
Original file line number Diff line number Diff line change
Expand Up @@ -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";
10 changes: 10 additions & 0 deletions sql/item.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion sql/item_cmpfunc.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
6 changes: 6 additions & 0 deletions sql/item_subselect.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

0 comments on commit f4484df

Please sign in to comment.