Commit df3a48ea authored by unknown's avatar unknown

Bug #27354 stored function in where condition was always treated as const

Possible problems: function call could be eliminated from where class and only
be evaluated once; function can be evaluated during table and item setup phase which could
cause side effects not to be registered in binlog.

Fixed with introducing func_item_sp::used_tables() returning the correct table_map constant.



mysql-test/r/sp.result:
  results changed
mysql-test/t/sp.test:
  regression test demonstrating that function's returns match where condition
  of the top-level query table.
sql/item_func.h:
  private used_tables() method returning the correct table_bit with meaning the item is not
  a constant
parent 3798a7d5
...@@ -5779,3 +5779,28 @@ SUM(f2) bug25373(f1) ...@@ -5779,3 +5779,28 @@ SUM(f2) bug25373(f1)
DROP FUNCTION bug25373| DROP FUNCTION bug25373|
DROP TABLE t3| DROP TABLE t3|
drop table t1,t2; drop table t1,t2;
CREATE TABLE t1 (a int auto_increment primary key) engine=MyISAM;
CREATE TABLE t2 (a int auto_increment primary key, b int) engine=innodb;
set @a=0;
CREATE function bug27354() RETURNS int deterministic
begin
insert into t1 values (null);
set @a=@a+1;
return @a;
end|
update t2 set b=1 where a=bug27354();
select count(t_1.a),count(t_2.a) from t1 as t_1, t2 as t_2 /* must be 0,0 */;
count(t_1.a) count(t_2.a)
0 0
insert into t2 values (1,1),(2,2),(3,3);
update t2 set b=-b where a=bug27354();
select * from t2 /* must return 1,-1 ... */;
a b
1 -1
2 -2
3 -3
select count(*) from t1 /* must be 3 */;
count(*)
3
drop table t1,t2;
drop function bug27354;
...@@ -6770,3 +6770,27 @@ DROP TABLE t3| ...@@ -6770,3 +6770,27 @@ DROP TABLE t3|
# practical, or create table t3, t4 etc temporarily (and drop them). # practical, or create table t3, t4 etc temporarily (and drop them).
delimiter ;| delimiter ;|
drop table t1,t2; drop table t1,t2;
CREATE TABLE t1 (a int auto_increment primary key) engine=MyISAM;
CREATE TABLE t2 (a int auto_increment primary key, b int) engine=innodb;
set @a=0;
delimiter |;
CREATE function bug27354() RETURNS int deterministic
begin
insert into t1 values (null);
set @a=@a+1;
return @a;
end|
delimiter ;|
update t2 set b=1 where a=bug27354();
select count(t_1.a),count(t_2.a) from t1 as t_1, t2 as t_2 /* must be 0,0 */;
insert into t2 values (1,1),(2,2),(3,3);
update t2 set b=-b where a=bug27354();
select * from t2 /* must return 1,-1 ... */;
select count(*) from t1 /* must be 3 */;
drop table t1,t2;
drop function bug27354;
...@@ -1411,7 +1411,7 @@ private: ...@@ -1411,7 +1411,7 @@ private:
bool execute(Field **flp); bool execute(Field **flp);
bool execute_impl(THD *thd, Field *return_value_fld); bool execute_impl(THD *thd, Field *return_value_fld);
Field *sp_result_field(void) const; Field *sp_result_field(void) const;
public: public:
Item_func_sp(Name_resolution_context *context_arg, sp_name *name); Item_func_sp(Name_resolution_context *context_arg, sp_name *name);
...@@ -1422,6 +1422,8 @@ public: ...@@ -1422,6 +1422,8 @@ public:
virtual ~Item_func_sp() virtual ~Item_func_sp()
{} {}
table_map used_tables() const { return RAND_TABLE_BIT; }
void cleanup(); void cleanup();
const char *func_name() const; const char *func_name() const;
......
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