mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
MDEV-270: SHOW EXPLAIN: server crashes in JOIN::print_explain on a query with
select tables optimized away - Take into account, that for some degenerate joins instead of "join->table_count=0" the code sets "join->tables_list=0".
This commit is contained in:
@@ -414,4 +414,43 @@ Note 1003 select * from t0,t3 where t3.a=112233
|
||||
a a
|
||||
set debug='';
|
||||
drop table t3;
|
||||
#
|
||||
# MDEV-270: SHOW EXPLAIN: server crashes in JOIN::print_explain on a query with
|
||||
# select tables optimized away
|
||||
#
|
||||
CREATE TABLE t2 (pk INT PRIMARY KEY, a INT ) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES
|
||||
(1,4),(2,62),(3,7),(4,1),(5,0),(6,7),(7,7),(8,1),(9,7),(10,1),
|
||||
(11,5),(12,2),(13,0),(14,1),(15,8),(16,1),(17,1),(18,9),(19,1),(20,5) ;
|
||||
explain SELECT * FROM t2 WHERE a =
|
||||
(SELECT MAX(a) FROM t2
|
||||
WHERE pk= (SELECT MAX(pk) FROM t2 WHERE pk = 3)
|
||||
);
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 20 Using where
|
||||
2 SUBQUERY t2 const PRIMARY PRIMARY 4 const 1 Using where
|
||||
3 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||
set @show_explain_probe_select_id=2;
|
||||
set debug='d,show_explain_probe_do_select';
|
||||
SELECT * FROM t2 WHERE a =
|
||||
(SELECT MAX(a) FROM t2
|
||||
WHERE pk= (SELECT MAX(pk) FROM t2 WHERE pk = 3)
|
||||
);
|
||||
show explain for $thr2;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t2 ALL NULL NULL NULL NULL 20 Using where
|
||||
2 SUBQUERY t2 const PRIMARY PRIMARY 4 1 Using where
|
||||
3 SUBQUERY NULL NULL NULL NULL NULL NULL NULL Select tables optimized away
|
||||
Warnings:
|
||||
Note 1003 SELECT * FROM t2 WHERE a =
|
||||
(SELECT MAX(a) FROM t2
|
||||
WHERE pk= (SELECT MAX(pk) FROM t2 WHERE pk = 3)
|
||||
)
|
||||
pk a
|
||||
3 7
|
||||
6 7
|
||||
7 7
|
||||
9 7
|
||||
set debug='';
|
||||
drop table t2;
|
||||
drop table t0,t1;
|
||||
|
||||
@@ -414,6 +414,40 @@ reap;
|
||||
set debug='';
|
||||
drop table t3;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-270: SHOW EXPLAIN: server crashes in JOIN::print_explain on a query with
|
||||
--echo # select tables optimized away
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t2 (pk INT PRIMARY KEY, a INT ) ENGINE=MyISAM;
|
||||
INSERT INTO t2 VALUES
|
||||
(1,4),(2,62),(3,7),(4,1),(5,0),(6,7),(7,7),(8,1),(9,7),(10,1),
|
||||
(11,5),(12,2),(13,0),(14,1),(15,8),(16,1),(17,1),(18,9),(19,1),(20,5) ;
|
||||
|
||||
explain SELECT * FROM t2 WHERE a =
|
||||
(SELECT MAX(a) FROM t2
|
||||
WHERE pk= (SELECT MAX(pk) FROM t2 WHERE pk = 3)
|
||||
);
|
||||
|
||||
set @show_explain_probe_select_id=2;
|
||||
set debug='d,show_explain_probe_do_select';
|
||||
send SELECT * FROM t2 WHERE a =
|
||||
(SELECT MAX(a) FROM t2
|
||||
WHERE pk= (SELECT MAX(pk) FROM t2 WHERE pk = 3)
|
||||
);
|
||||
connection default;
|
||||
--source include/wait_condition.inc
|
||||
evalp show explain for $thr2;
|
||||
connection con1;
|
||||
reap;
|
||||
set debug='';
|
||||
drop table t2;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## TODO: Test this: have several SHOW EXPLAIN requests be queued up for a
|
||||
## thread and served together.
|
||||
|
||||
|
||||
@@ -3752,7 +3752,7 @@ int st_select_lex::print_explain(select_result_sink *output,
|
||||
int res;
|
||||
if (join && join->optimized == JOIN::OPTIMIZATION_DONE)
|
||||
{
|
||||
if (!join->table_count)
|
||||
if (!join->table_count || !join->tables_list)
|
||||
{
|
||||
/* It's a degenerate join */
|
||||
const char *cause= join->zero_result_cause ? join-> zero_result_cause :
|
||||
|
||||
@@ -15399,6 +15399,15 @@ do_select(JOIN *join,List<Item> *fields,TABLE *table,Procedure *procedure)
|
||||
else
|
||||
{
|
||||
DBUG_ASSERT(join->table_count);
|
||||
|
||||
THD *thd= join->thd;
|
||||
DBUG_EXECUTE_IF("show_explain_probe_do_select",
|
||||
if (dbug_user_var_equals_int(thd,
|
||||
"show_explain_probe_select_id",
|
||||
join->select_lex->select_number))
|
||||
dbug_serve_apcs(thd, 1);
|
||||
);
|
||||
|
||||
if (join->outer_ref_cond && !join->outer_ref_cond->val_int())
|
||||
error= NESTED_LOOP_NO_MORE_ROWS;
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user