Commit 05001e75 authored by unknown's avatar unknown

Fix cases where SLEEP() calls would get optimized away or cached. (Bug #12689)


mysql-test/r/func_misc.result:
  Add new results
mysql-test/t/func_misc.test:
  Add new regression test.
sql/item_create.cc:
  When SLEEP() is used, mark the statement as uncacheable.
sql/item_func.h:
  Flag SLEEP() as not constant, and set RAND_TABLE_BIT so that it is
  always evaluated.
parent 0f556e8f
...@@ -70,3 +70,27 @@ select timediff(b, a) >= '00:00:03' from t1; ...@@ -70,3 +70,27 @@ select timediff(b, a) >= '00:00:03' from t1;
timediff(b, a) >= '00:00:03' timediff(b, a) >= '00:00:03'
1 1
drop table t1; drop table t1;
set global query_cache_size=1355776;
create table t1 (a int);
insert into t1 values (1),(1),(1);
create table t2 (a datetime default null, b datetime default null);
insert into t2 set a = now();
select a from t1 where sleep(1);
a
update t2 set b = now() where b is null;
insert into t2 set a = now();
select a from t1 where sleep(a);
a
update t2 set b = now() where b is null;
insert into t2 set a = now();
select a from t1 where sleep(1);
a
update t2 set b = now() where b is null;
select timediff(b, a) >= '00:00:03' from t2;
timediff(b, a) >= '00:00:03'
1
1
1
drop table t2;
drop table t1;
set global query_cache_size=default;
...@@ -55,3 +55,26 @@ select sleep(3); ...@@ -55,3 +55,26 @@ select sleep(3);
update t1 set b = now(); update t1 set b = now();
select timediff(b, a) >= '00:00:03' from t1; select timediff(b, a) >= '00:00:03' from t1;
drop table t1; drop table t1;
#
# Bug #12689: SLEEP() gets incorrectly cached/optimized-away
#
set global query_cache_size=1355776;
create table t1 (a int);
insert into t1 values (1),(1),(1);
create table t2 (a datetime default null, b datetime default null);
insert into t2 set a = now();
select a from t1 where sleep(1);
update t2 set b = now() where b is null;
insert into t2 set a = now();
select a from t1 where sleep(a);
update t2 set b = now() where b is null;
insert into t2 set a = now();
select a from t1 where sleep(1);
update t2 set b = now() where b is null;
select timediff(b, a) >= '00:00:03' from t2;
drop table t2;
drop table t1;
set global query_cache_size=default;
# End of 5.0 tests
...@@ -356,6 +356,7 @@ Item *create_func_sha(Item* a) ...@@ -356,6 +356,7 @@ Item *create_func_sha(Item* a)
Item *create_func_sleep(Item* a) Item *create_func_sleep(Item* a)
{ {
current_thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT);
return new Item_func_sleep(a); return new Item_func_sleep(a);
} }
......
...@@ -893,7 +893,13 @@ class Item_func_sleep :public Item_int_func ...@@ -893,7 +893,13 @@ class Item_func_sleep :public Item_int_func
{ {
public: public:
Item_func_sleep(Item *a) :Item_int_func(a) {} Item_func_sleep(Item *a) :Item_int_func(a) {}
bool const_item() const { return 0; }
const char *func_name() const { return "sleep"; } const char *func_name() const { return "sleep"; }
void update_used_tables()
{
Item_int_func::update_used_tables();
used_tables_cache|= RAND_TABLE_BIT;
}
longlong val_int(); longlong val_int();
}; };
......
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