Commit 66c621ba authored by Sergey Glukhov's avatar Sergey Glukhov

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.


mysql-test/r/func_isnull.result:
  test case
mysql-test/t/func_isnull.test:
  test case
sql/item_cmpfunc.h:
  set brackets in the right place.
parent df088b8d
...@@ -5,3 +5,17 @@ flush tables; ...@@ -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
...@@ -13,3 +13,18 @@ select * from t1 where isnull(to_days(mydate)); ...@@ -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
...@@ -1209,8 +1209,8 @@ public: ...@@ -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();
......
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