diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index a883321bdf2..a04e178263b 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -2736,4 +2736,23 @@ call bug8849()| call bug8849()| drop procedure bug8849| drop tables t3,t4,t5| +drop procedure if exists bug8937| +create procedure bug8937() +begin +declare s,x,y,z int; +declare a float; +select sum(data),avg(data),min(data),max(data) into s,x,y,z from t1; +select s,x,y,z; +select avg(data) into a from t1; +select a; +end| +delete from t1| +insert into t1 (data) values (1), (2), (3), (4), (6)| +call bug8937()| +s x y z +16 3 1 6 +a +3.2000 +drop procedure bug8937| +delete from t1| drop table t1,t2; diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 18e6de29b89..c120e7e94b7 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -3330,8 +3330,32 @@ call bug8849()| drop procedure bug8849| drop tables t3,t4,t5| +# +# BUG#8937: Stored Procedure: AVG() works as SUM() in SELECT ... INTO statement +# +--disable_warnings +drop procedure if exists bug8937| +--enable_warnings +create procedure bug8937() +begin + declare s,x,y,z int; + declare a float; -# Add bug above this line. Use existing tables t1 and t2 when + select sum(data),avg(data),min(data),max(data) into s,x,y,z from t1; + select s,x,y,z; + select avg(data) into a from t1; + select a; +end| + +delete from t1| +insert into t1 (data) values (1), (2), (3), (4), (6)| +call bug8937()| + +drop procedure bug8937| +delete from t1| + + +# Add bugs above this line. Use existing tables t1 and t2 when # practical, or create table t3, t3 etc temporarily (and drop them). delimiter ;| drop table t1,t2; diff --git a/sql/item_sum.h b/sql/item_sum.h index fead45f1881..af2710d7800 100644 --- a/sql/item_sum.h +++ b/sql/item_sum.h @@ -356,6 +356,8 @@ public: void clear(); bool add(); double val_real(); + // In SPs we might force the "wrong" type with select into a declare variable + longlong val_int() { return (longlong)val_real(); } my_decimal *val_decimal(my_decimal *); String *val_str(String *str); void reset_field();