Commit 9ca47d04 authored by unknown's avatar unknown

BUG#4393, BUG#4356 - incorrect decimals in fix_length_and_dec() in some functions


mysql-test/mysql-test-run.sh:
  report failed test name
mysql-test/r/func_math.result:
  test results fixed
parent 42ed0103
...@@ -589,6 +589,8 @@ show_failed_diff () ...@@ -589,6 +589,8 @@ show_failed_diff ()
echo "Please follow the instructions outlined at" echo "Please follow the instructions outlined at"
echo "http://www.mysql.com/doc/en/Reporting_mysqltest_bugs.html" echo "http://www.mysql.com/doc/en/Reporting_mysqltest_bugs.html"
echo "to find the reason to this problem and how to report this." echo "to find the reason to this problem and how to report this."
echo ""
echo "Test $1 failed!"
fi fi
} }
......
...@@ -18,44 +18,44 @@ abs(-10) sign(-5) sign(5) sign(0) ...@@ -18,44 +18,44 @@ abs(-10) sign(-5) sign(5) sign(0)
10 -1 1 0 10 -1 1 0
select log(exp(10)),exp(log(sqrt(10))*2),log(-1),log(NULL),log(1,1),log(3,9),log(-1,2),log(NULL,2); select log(exp(10)),exp(log(sqrt(10))*2),log(-1),log(NULL),log(1,1),log(3,9),log(-1,2),log(NULL,2);
log(exp(10)) exp(log(sqrt(10))*2) log(-1) log(NULL) log(1,1) log(3,9) log(-1,2) log(NULL,2) log(exp(10)) exp(log(sqrt(10))*2) log(-1) log(NULL) log(1,1) log(3,9) log(-1,2) log(NULL,2)
10.000000 10.000000 NULL NULL NULL 2.000000 NULL NULL 10 10 NULL NULL NULL 2 NULL NULL
select ln(exp(10)),exp(ln(sqrt(10))*2),ln(-1),ln(0),ln(NULL); select ln(exp(10)),exp(ln(sqrt(10))*2),ln(-1),ln(0),ln(NULL);
ln(exp(10)) exp(ln(sqrt(10))*2) ln(-1) ln(0) ln(NULL) ln(exp(10)) exp(ln(sqrt(10))*2) ln(-1) ln(0) ln(NULL)
10.000000 10.000000 NULL NULL NULL 10 10 NULL NULL NULL
select log2(8),log2(15),log2(-2),log2(0),log2(NULL); select log2(8),log2(15),log2(-2),log2(0),log2(NULL);
log2(8) log2(15) log2(-2) log2(0) log2(NULL) log2(8) log2(15) log2(-2) log2(0) log2(NULL)
3.000000 3.906891 NULL NULL NULL 3 3.9068905956085 NULL NULL NULL
select log10(100),log10(18),log10(-4),log10(0),log10(NULL); select log10(100),log10(18),log10(-4),log10(0),log10(NULL);
log10(100) log10(18) log10(-4) log10(0) log10(NULL) log10(100) log10(18) log10(-4) log10(0) log10(NULL)
2.000000 1.255273 NULL NULL NULL 2 1.2552725051033 NULL NULL NULL
select pow(10,log10(10)),power(2,4); select pow(10,log10(10)),power(2,4);
pow(10,log10(10)) power(2,4) pow(10,log10(10)) power(2,4)
10.000000 16.000000 10 16
set @@rand_seed1=10000000,@@rand_seed2=1000000; set @@rand_seed1=10000000,@@rand_seed2=1000000;
select rand(999999),rand(); select rand(999999),rand();
rand(999999) rand() rand(999999) rand()
0.014231365187309 0.028870999839968 0.014231365187309 0.028870999839968
select pi(),sin(pi()/2),cos(pi()/2),abs(tan(pi())),cot(1),asin(1),acos(0),atan(1); select pi(),sin(pi()/2),cos(pi()/2),abs(tan(pi())),cot(1),asin(1),acos(0),atan(1);
pi() sin(pi()/2) cos(pi()/2) abs(tan(pi())) cot(1) asin(1) acos(0) atan(1) pi() sin(pi()/2) cos(pi()/2) abs(tan(pi())) cot(1) asin(1) acos(0) atan(1)
3.141593 1.000000 0.000000 0.000000 0.64209262 1.570796 1.570796 0.785398 3.141593 1 6.1230317691119e-17 1.2246063538224e-16 0.64209261593433 1.5707963267949 1.5707963267949 0.78539816339745
select degrees(pi()),radians(360); select degrees(pi()),radians(360);
degrees(pi()) radians(360) degrees(pi()) radians(360)
180 6.2831853071796 180 6.2831853071796
SELECT ACOS(1.0); SELECT ACOS(1.0);
ACOS(1.0) ACOS(1.0)
0.000000 0
SELECT ASIN(1.0); SELECT ASIN(1.0);
ASIN(1.0) ASIN(1.0)
1.570796 1.5707963267949
SELECT ACOS(0.2*5.0); SELECT ACOS(0.2*5.0);
ACOS(0.2*5.0) ACOS(0.2*5.0)
0.000000 0
SELECT ACOS(0.5*2.0); SELECT ACOS(0.5*2.0);
ACOS(0.5*2.0) ACOS(0.5*2.0)
0.000000 0
SELECT ASIN(0.8+0.2); SELECT ASIN(0.8+0.2);
ASIN(0.8+0.2) ASIN(0.8+0.2)
1.570796 1.5707963267949
SELECT ASIN(1.2-0.2); SELECT ASIN(1.2-0.2);
ASIN(1.2-0.2) ASIN(1.2-0.2)
1.570796 1.5707963267949
...@@ -72,14 +72,17 @@ insert t1 values (121,"16"); ...@@ -72,14 +72,17 @@ insert t1 values (121,"16");
select c1 + c1 * (c2 / 100) as col from t1; select c1 + c1 * (c2 / 100) as col from t1;
col col
140.36 140.36
create table t2 select c1 + c1 * (c2 / 100) as col from t1; create table t2 select c1 + c1 * (c2 / 100) as col1, round(c1, 5) as col2, round(c1, 35) as col3, sqrt(c1*1e-15) col4 from t1;
select * from t2; select * from t2;
col col1 col2 col3 col4
140.36 140.36 121.00000 121 3.47850542618522e-07
show create table t2; show create table t2;
Table Create Table Table Create Table
t2 CREATE TABLE `t2` ( t2 CREATE TABLE `t2` (
`col` double default NULL `col1` double default NULL,
`col2` double(22,5) default NULL,
`col3` double default NULL,
`col4` double default NULL
) TYPE=MyISAM ) TYPE=MyISAM
drop table t1,t2; drop table t1,t2;
create table t1 (f float, f2 float(24), f3 float(6,2), d double, d2 float(53), d3 double(10,3), de decimal, de2 decimal(6), de3 decimal(5,2), n numeric, n2 numeric(8), n3 numeric(5,6)); create table t1 (f float, f2 float(24), f3 float(6,2), d double, d2 float(53), d3 double(10,3), de decimal, de2 decimal(6), de3 decimal(5,2), n numeric, n2 numeric(8), n3 numeric(5,6));
......
...@@ -28,10 +28,14 @@ select a from t1 order by a; ...@@ -28,10 +28,14 @@ select a from t1 order by a;
select min(a) from t1; select min(a) from t1;
drop table t1; drop table t1;
#
# BUG#3612, BUG#4393, BUG#4356, BUG#4394
#
create table t1 (c1 double, c2 varchar(20)); create table t1 (c1 double, c2 varchar(20));
insert t1 values (121,"16"); insert t1 values (121,"16");
select c1 + c1 * (c2 / 100) as col from t1; select c1 + c1 * (c2 / 100) as col from t1;
create table t2 select c1 + c1 * (c2 / 100) as col from t1; create table t2 select c1 + c1 * (c2 / 100) as col1, round(c1, 5) as col2, round(c1, 35) as col3, sqrt(c1*1e-15) col4 from t1;
select * from t2; select * from t2;
show create table t2; show create table t2;
drop table t1,t2; drop table t1,t2;
...@@ -52,6 +56,7 @@ drop table t1; ...@@ -52,6 +56,7 @@ drop table t1;
# Errors # Errors
!$1063 create table t1 (f float(54)); # Should give an error --error 1063
create table t1 (f float(54)); # Should give an error
drop table if exists t1; drop table if exists t1;
...@@ -684,7 +684,7 @@ void Item_func_round::fix_length_and_dec() ...@@ -684,7 +684,7 @@ void Item_func_round::fix_length_and_dec()
if (tmp < 0) if (tmp < 0)
decimals=0; decimals=0;
else else
decimals=tmp; decimals=min(tmp,NOT_FIXED_DEC);
} }
} }
...@@ -1286,7 +1286,7 @@ udf_handler::fix_fields(THD *thd,TABLE_LIST *tables,Item_result_field *func, ...@@ -1286,7 +1286,7 @@ udf_handler::fix_fields(THD *thd,TABLE_LIST *tables,Item_result_field *func,
func->max_length=min(initid.max_length,MAX_BLOB_WIDTH); func->max_length=min(initid.max_length,MAX_BLOB_WIDTH);
func->maybe_null=initid.maybe_null; func->maybe_null=initid.maybe_null;
const_item_cache=initid.const_item; const_item_cache=initid.const_item;
func->decimals=min(initid.decimals,31); func->decimals=min(initid.decimals,NOT_FIXED_DEC);
} }
initialized=1; initialized=1;
if (error) if (error)
......
...@@ -295,7 +295,7 @@ class Item_dec_func :public Item_real_func ...@@ -295,7 +295,7 @@ class Item_dec_func :public Item_real_func
Item_dec_func(Item *a,Item *b) :Item_real_func(a,b) {} Item_dec_func(Item *a,Item *b) :Item_real_func(a,b) {}
void fix_length_and_dec() void fix_length_and_dec()
{ {
decimals=6; max_length=float_length(decimals); decimals=NOT_FIXED_DEC; max_length=float_length(decimals);
maybe_null=1; maybe_null=1;
} }
inline double fix_result(double value) inline double fix_result(double value)
......
...@@ -234,7 +234,11 @@ public: ...@@ -234,7 +234,11 @@ public:
class Item_sum_avg :public Item_sum_num class Item_sum_avg :public Item_sum_num
{ {
void fix_length_and_dec() { decimals+=4; maybe_null=1; } void fix_length_and_dec()
{
decimals=min(decimals+4, NOT_FIXED_DEC);
maybe_null=1;
}
double sum; double sum;
ulonglong count; ulonglong count;
...@@ -276,7 +280,11 @@ class Item_sum_std :public Item_sum_num ...@@ -276,7 +280,11 @@ class Item_sum_std :public Item_sum_num
double sum; double sum;
double sum_sqr; double sum_sqr;
ulonglong count; ulonglong count;
void fix_length_and_dec() { decimals+=4; maybe_null=1; } void fix_length_and_dec()
{
decimals=min(decimals+4, NOT_FIXED_DEC);
maybe_null=1;
}
public: public:
Item_sum_std(Item *item_par) :Item_sum_num(item_par),count(0) {} Item_sum_std(Item *item_par) :Item_sum_num(item_par),count(0) {}
......
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