Commit 05001e75 authored by unknown's avatar unknown
Browse files

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
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -70,3 +70,27 @@ select timediff(b, a) >= '00:00:03' from t1;
timediff(b, a) >= '00:00:03'
1
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;
+23 −0
Original line number Diff line number Diff line
@@ -55,3 +55,26 @@ select sleep(3);
update t1 set b = now();
select timediff(b, a) >= '00:00:03' from 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
+1 −0
Original line number Diff line number Diff line
@@ -356,6 +356,7 @@ Item *create_func_sha(Item* a)

Item *create_func_sleep(Item* a)
{
  current_thd->lex->uncacheable(UNCACHEABLE_SIDEEFFECT);
  return new Item_func_sleep(a);
}

+6 −0
Original line number Diff line number Diff line
@@ -893,7 +893,13 @@ class Item_func_sleep :public Item_int_func
{
public:
  Item_func_sleep(Item *a) :Item_int_func(a) {}
  bool const_item() const { return 0; }
  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();
};