mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Fix bug lp:1002079
Analysis: The optimizer detects an empty result through constant table optimization. Then it calls return_zero_rows(), which in turns calls inderctly Item_maxmin_subselect::no_rows_in_result(). The latter method set "value=0", however "value" is pointer to Item_cache, and not just an integer value. All of the Item_[maxmin | singlerow]_subselect::val_XXX methods does: if (forced_const) return value->val_real(); which of course crashes when value is a NULL pointer. Solution: When the optimizer discovers an empty result set, set Item_singlerow_subselect::value to a FALSE constant Item instead of NULL.
This commit is contained in:
@ -6094,5 +6094,23 @@ SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE
|
|||||||
COUNT(f1) f4
|
COUNT(f1) f4
|
||||||
0 0
|
0 0
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
#
|
||||||
|
# LP BUG#1002079 Server crashes in Item_singlerow_subselect::val_int with constant table,
|
||||||
|
# HAVING, UNION in subquery
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a INT);
|
||||||
|
INSERT INTO t1 VALUES (7),(0);
|
||||||
|
CREATE TABLE t2 (b INT);
|
||||||
|
EXPLAIN
|
||||||
|
SELECT SUM(a) AS f1, a AS f2 FROM (t1, t2) HAVING f2 >= ALL (SELECT 4 UNION SELECT 5) AND f1 = 7;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t2 system NULL NULL NULL NULL 0 const row not found
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||||
|
3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||||
|
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
|
||||||
|
SELECT SUM(a) AS f1, a AS f2 FROM (t1, t2) HAVING f2 >= ALL (SELECT 4 UNION SELECT 5) AND f1 = 7;
|
||||||
|
f1 f2
|
||||||
|
drop table t1,t2;
|
||||||
# return optimizer switch changed in the beginning of this test
|
# return optimizer switch changed in the beginning of this test
|
||||||
set optimizer_switch=@subselect_tmp;
|
set optimizer_switch=@subselect_tmp;
|
||||||
|
@ -6093,6 +6093,24 @@ SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE
|
|||||||
COUNT(f1) f4
|
COUNT(f1) f4
|
||||||
0 0
|
0 0
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
#
|
||||||
|
# LP BUG#1002079 Server crashes in Item_singlerow_subselect::val_int with constant table,
|
||||||
|
# HAVING, UNION in subquery
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a INT);
|
||||||
|
INSERT INTO t1 VALUES (7),(0);
|
||||||
|
CREATE TABLE t2 (b INT);
|
||||||
|
EXPLAIN
|
||||||
|
SELECT SUM(a) AS f1, a AS f2 FROM (t1, t2) HAVING f2 >= ALL (SELECT 4 UNION SELECT 5) AND f1 = 7;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t2 system NULL NULL NULL NULL 0 const row not found
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||||
|
3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||||
|
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
|
||||||
|
SELECT SUM(a) AS f1, a AS f2 FROM (t1, t2) HAVING f2 >= ALL (SELECT 4 UNION SELECT 5) AND f1 = 7;
|
||||||
|
f1 f2
|
||||||
|
drop table t1,t2;
|
||||||
# return optimizer switch changed in the beginning of this test
|
# return optimizer switch changed in the beginning of this test
|
||||||
set optimizer_switch=@subselect_tmp;
|
set optimizer_switch=@subselect_tmp;
|
||||||
set optimizer_switch=default;
|
set optimizer_switch=default;
|
||||||
|
@ -6089,6 +6089,24 @@ SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE
|
|||||||
COUNT(f1) f4
|
COUNT(f1) f4
|
||||||
0 0
|
0 0
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
#
|
||||||
|
# LP BUG#1002079 Server crashes in Item_singlerow_subselect::val_int with constant table,
|
||||||
|
# HAVING, UNION in subquery
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a INT);
|
||||||
|
INSERT INTO t1 VALUES (7),(0);
|
||||||
|
CREATE TABLE t2 (b INT);
|
||||||
|
EXPLAIN
|
||||||
|
SELECT SUM(a) AS f1, a AS f2 FROM (t1, t2) HAVING f2 >= ALL (SELECT 4 UNION SELECT 5) AND f1 = 7;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t2 system NULL NULL NULL NULL 0 const row not found
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||||
|
3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||||
|
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
|
||||||
|
SELECT SUM(a) AS f1, a AS f2 FROM (t1, t2) HAVING f2 >= ALL (SELECT 4 UNION SELECT 5) AND f1 = 7;
|
||||||
|
f1 f2
|
||||||
|
drop table t1,t2;
|
||||||
# return optimizer switch changed in the beginning of this test
|
# return optimizer switch changed in the beginning of this test
|
||||||
set optimizer_switch=@subselect_tmp;
|
set optimizer_switch=@subselect_tmp;
|
||||||
set @optimizer_switch_for_subselect_test=null;
|
set @optimizer_switch_for_subselect_test=null;
|
||||||
|
@ -6100,6 +6100,24 @@ SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE
|
|||||||
COUNT(f1) f4
|
COUNT(f1) f4
|
||||||
0 0
|
0 0
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
#
|
||||||
|
# LP BUG#1002079 Server crashes in Item_singlerow_subselect::val_int with constant table,
|
||||||
|
# HAVING, UNION in subquery
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a INT);
|
||||||
|
INSERT INTO t1 VALUES (7),(0);
|
||||||
|
CREATE TABLE t2 (b INT);
|
||||||
|
EXPLAIN
|
||||||
|
SELECT SUM(a) AS f1, a AS f2 FROM (t1, t2) HAVING f2 >= ALL (SELECT 4 UNION SELECT 5) AND f1 = 7;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t2 system NULL NULL NULL NULL 0 const row not found
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||||
|
3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||||
|
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
|
||||||
|
SELECT SUM(a) AS f1, a AS f2 FROM (t1, t2) HAVING f2 >= ALL (SELECT 4 UNION SELECT 5) AND f1 = 7;
|
||||||
|
f1 f2
|
||||||
|
drop table t1,t2;
|
||||||
# return optimizer switch changed in the beginning of this test
|
# return optimizer switch changed in the beginning of this test
|
||||||
set optimizer_switch=@subselect_tmp;
|
set optimizer_switch=@subselect_tmp;
|
||||||
set optimizer_switch=default;
|
set optimizer_switch=default;
|
||||||
|
@ -6089,6 +6089,24 @@ SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE
|
|||||||
COUNT(f1) f4
|
COUNT(f1) f4
|
||||||
0 0
|
0 0
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
#
|
||||||
|
# LP BUG#1002079 Server crashes in Item_singlerow_subselect::val_int with constant table,
|
||||||
|
# HAVING, UNION in subquery
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a INT);
|
||||||
|
INSERT INTO t1 VALUES (7),(0);
|
||||||
|
CREATE TABLE t2 (b INT);
|
||||||
|
EXPLAIN
|
||||||
|
SELECT SUM(a) AS f1, a AS f2 FROM (t1, t2) HAVING f2 >= ALL (SELECT 4 UNION SELECT 5) AND f1 = 7;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t2 system NULL NULL NULL NULL 0 const row not found
|
||||||
|
1 PRIMARY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
2 SUBQUERY NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||||
|
3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||||
|
NULL UNION RESULT <union2,3> ALL NULL NULL NULL NULL NULL
|
||||||
|
SELECT SUM(a) AS f1, a AS f2 FROM (t1, t2) HAVING f2 >= ALL (SELECT 4 UNION SELECT 5) AND f1 = 7;
|
||||||
|
f1 f2
|
||||||
|
drop table t1,t2;
|
||||||
# return optimizer switch changed in the beginning of this test
|
# return optimizer switch changed in the beginning of this test
|
||||||
set optimizer_switch=@subselect_tmp;
|
set optimizer_switch=@subselect_tmp;
|
||||||
set @optimizer_switch_for_subselect_test=null;
|
set @optimizer_switch_for_subselect_test=null;
|
||||||
|
@ -5174,6 +5174,21 @@ SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE
|
|||||||
|
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # LP BUG#1002079 Server crashes in Item_singlerow_subselect::val_int with constant table,
|
||||||
|
--echo # HAVING, UNION in subquery
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a INT);
|
||||||
|
INSERT INTO t1 VALUES (7),(0);
|
||||||
|
CREATE TABLE t2 (b INT);
|
||||||
|
|
||||||
|
EXPLAIN
|
||||||
|
SELECT SUM(a) AS f1, a AS f2 FROM (t1, t2) HAVING f2 >= ALL (SELECT 4 UNION SELECT 5) AND f1 = 7;
|
||||||
|
|
||||||
|
SELECT SUM(a) AS f1, a AS f2 FROM (t1, t2) HAVING f2 >= ALL (SELECT 4 UNION SELECT 5) AND f1 = 7;
|
||||||
|
|
||||||
|
drop table t1,t2;
|
||||||
|
|
||||||
--echo # return optimizer switch changed in the beginning of this test
|
--echo # return optimizer switch changed in the beginning of this test
|
||||||
set optimizer_switch=@subselect_tmp;
|
set optimizer_switch=@subselect_tmp;
|
||||||
|
@ -892,13 +892,21 @@ void Item_maxmin_subselect::print(String *str, enum_query_type query_type)
|
|||||||
|
|
||||||
void Item_maxmin_subselect::no_rows_in_result()
|
void Item_maxmin_subselect::no_rows_in_result()
|
||||||
{
|
{
|
||||||
value= 0;
|
value= Item_cache::get_cache(new Item_null());
|
||||||
null_value= 0;
|
null_value= 0;
|
||||||
was_values= 0;
|
was_values= 0;
|
||||||
make_const();
|
make_const();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Item_singlerow_subselect::no_rows_in_result()
|
||||||
|
{
|
||||||
|
value= Item_cache::get_cache(new Item_null());
|
||||||
|
reset();
|
||||||
|
make_const();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Item_singlerow_subselect::reset()
|
void Item_singlerow_subselect::reset()
|
||||||
{
|
{
|
||||||
Item_subselect::reset();
|
Item_subselect::reset();
|
||||||
|
@ -267,7 +267,7 @@ public:
|
|||||||
subs_type substype() { return SINGLEROW_SUBS; }
|
subs_type substype() { return SINGLEROW_SUBS; }
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
void no_rows_in_result() { reset(); make_const(); }
|
void no_rows_in_result();
|
||||||
bool select_transformer(JOIN *join);
|
bool select_transformer(JOIN *join);
|
||||||
void store(uint i, Item* item);
|
void store(uint i, Item* item);
|
||||||
double val_real();
|
double val_real();
|
||||||
|
Reference in New Issue
Block a user