Commit 695f20f1 authored by Oleksandr Byelkin's avatar Oleksandr Byelkin

MDEV-30007 SIGSEGV in st_select_lex_unit::is_derived_eliminated, runtime...

MDEV-30007 SIGSEGV in st_select_lex_unit::is_derived_eliminated, runtime error: member access within null pointer of type 'struct TABLE' in st_select_lex_unit::is_derived_eliminated()

Take into account case of a degenerate subquery (like SELECT 1).
parent dc378280
...@@ -1003,3 +1003,23 @@ a1 a2 ...@@ -1003,3 +1003,23 @@ a1 a2
5 277 5 277
NULL 278 NULL 278
DROP TABLE t1, t2; DROP TABLE t1, t2;
#
# MDEV-30007: SIGSEGV in st_select_lex_unit::is_derived_eliminated,
# runtime error: member access within null pointer of type
# 'struct TABLE' in st_select_lex_unit::is_derived_eliminated()
#
CREATE VIEW v AS SELECT 1 AS a;
SELECT ROUND ((SELECT 1 FROM v)) FROM v GROUP BY ROUND ((SELECT 1 FROM v));
ROUND ((SELECT 1 FROM v))
1
EXPLAIN
SELECT ROUND ((SELECT 1 FROM v)) FROM v GROUP BY ROUND ((SELECT 1 FROM v));
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived4> system NULL NULL NULL NULL 1
4 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used
2 SUBQUERY <derived5> system NULL NULL NULL NULL 1
5 DERIVED NULL NULL NULL NULL NULL NULL NULL No tables used
DROP VIEW v;
#
# End of 10.10 tests
#
...@@ -784,3 +784,18 @@ SELECT t1.* FROM t1 LEFT JOIN ...@@ -784,3 +784,18 @@ SELECT t1.* FROM t1 LEFT JOIN
) dt2 ON dt2.a2 = t1.a2; ) dt2 ON dt2.a2 = t1.a2;
DROP TABLE t1, t2; DROP TABLE t1, t2;
--echo #
--echo # MDEV-30007: SIGSEGV in st_select_lex_unit::is_derived_eliminated,
--echo # runtime error: member access within null pointer of type
--echo # 'struct TABLE' in st_select_lex_unit::is_derived_eliminated()
--echo #
CREATE VIEW v AS SELECT 1 AS a;
SELECT ROUND ((SELECT 1 FROM v)) FROM v GROUP BY ROUND ((SELECT 1 FROM v));
EXPLAIN
SELECT ROUND ((SELECT 1 FROM v)) FROM v GROUP BY ROUND ((SELECT 1 FROM v));
DROP VIEW v;
--echo #
--echo # End of 10.10 tests
--echo #
...@@ -11924,9 +11924,18 @@ bool SELECT_LEX_UNIT::explainable() const ...@@ -11924,9 +11924,18 @@ bool SELECT_LEX_UNIT::explainable() const
false; false;
} }
/*
Determines whether the derived table was eliminated during
the call of eliminate_tables(JOIN *) made at the optimization stage
or completely optimized out (for such degenerate statements like
"SELECT 1", for example)
*/
bool SELECT_LEX_UNIT::is_derived_eliminated() const bool SELECT_LEX_UNIT::is_derived_eliminated() const
{ {
if (!derived) if (!derived)
return false; return false;
if (!derived->table)
return true;
return derived->table->map & outer_select()->join->eliminated_tables; return derived->table->map & outer_select()->join->eliminated_tables;
} }
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