Bug#53933 crash when using uncacheable subquery in the having clause of outer query

The problem is in the Item_func_isnull::update_used_tables() function,
bracket is at the wrong place. Because of that isnull item erroneously
is treated as const item. The fix is to set brackets in the right place.
This commit is contained in:
Sergey Glukhov 2010-06-08 10:22:40 +04:00
parent 80acd9573f
commit bc774bd332
3 changed files with 31 additions and 2 deletions

View File

@ -5,3 +5,17 @@ flush tables;
select * from t1 where isnull(to_days(mydate)); select * from t1 where isnull(to_days(mydate));
id mydate id mydate
drop table t1; drop table t1;
#
# Bug#53933 crash when using uncacheable subquery in the having clause of outer query
#
CREATE TABLE t1 (f1 INT);
INSERT INTO t1 VALUES (0),(0);
SELECT ISNULL((SELECT GET_LOCK('Bug#53933', 0) FROM t1 GROUP BY f1)) AS f2
FROM t1 GROUP BY f1 HAVING f2 = f2;
f2
0
SELECT RELEASE_LOCK('Bug#53933');
RELEASE_LOCK('Bug#53933')
1
DROP TABLE t1;
End of 5.0 tests

View File

@ -13,3 +13,18 @@ select * from t1 where isnull(to_days(mydate));
drop table t1; drop table t1;
# End of 4.1 tests # End of 4.1 tests
--echo #
--echo # Bug#53933 crash when using uncacheable subquery in the having clause of outer query
--echo #
CREATE TABLE t1 (f1 INT);
INSERT INTO t1 VALUES (0),(0);
SELECT ISNULL((SELECT GET_LOCK('Bug#53933', 0) FROM t1 GROUP BY f1)) AS f2
FROM t1 GROUP BY f1 HAVING f2 = f2;
SELECT RELEASE_LOCK('Bug#53933');
DROP TABLE t1;
--echo End of 5.0 tests

View File

@ -1209,8 +1209,8 @@ public:
else else
{ {
args[0]->update_used_tables(); args[0]->update_used_tables();
if ((const_item_cache= !(used_tables_cache= args[0]->used_tables())) && if ((const_item_cache= !(used_tables_cache= args[0]->used_tables()) &&
!with_subselect) !with_subselect))
{ {
/* Remember if the value is always NULL or never NULL */ /* Remember if the value is always NULL or never NULL */
cached_value= (longlong) args[0]->is_null(); cached_value= (longlong) args[0]->is_null();