diff options
author | unknown <ram@gw.mysql.r18.ru> | 2004-10-21 19:52:55 +0500 |
---|---|---|
committer | unknown <ram@gw.mysql.r18.ru> | 2004-10-21 19:52:55 +0500 |
commit | 3c4c309088ca674305f31b4c069b28b69ee593ca (patch) | |
tree | 16440e561cf6e37c0650a9287e6f686ad1b2db64 | |
parent | 0ceeea0b9e1d2402ed7e0aeaf592f3b4ca5bfede (diff) | |
download | mariadb-git-3c4c309088ca674305f31b4c069b28b69ee593ca.tar.gz |
A fix (bug #6138: MOD operator should not round non-integral argument).
-rw-r--r-- | mysql-test/r/func_test.result | 9 | ||||
-rw-r--r-- | mysql-test/t/func_test.test | 13 | ||||
-rw-r--r-- | sql/item_func.cc | 13 |
3 files changed, 27 insertions, 8 deletions
diff --git a/mysql-test/r/func_test.result b/mysql-test/r/func_test.result index c3fe1de15db..8a28312b348 100644 --- a/mysql-test/r/func_test.result +++ b/mysql-test/r/func_test.result @@ -174,3 +174,12 @@ SELECT GREATEST(d,d) FROM t1 WHERE k=2; GREATEST(d,d) NULL DROP TABLE t1; +select 1197.90 mod 50; +1197.90 mod 50 +47.90 +select 5.1 mod 3, 5.1 mod -3, -5.1 mod 3, -5.1 mod -3; +5.1 mod 3 5.1 mod -3 -5.1 mod 3 -5.1 mod -3 +2.1 2.1 -2.1 -2.1 +select 5 mod 3, 5 mod -3, -5 mod 3, -5 mod -3; +5 mod 3 5 mod -3 -5 mod 3 -5 mod -3 +2 2 -2 -2 diff --git a/mysql-test/t/func_test.test b/mysql-test/t/func_test.test index e7bcd81a15e..eb506a58870 100644 --- a/mysql-test/t/func_test.test +++ b/mysql-test/t/func_test.test @@ -94,3 +94,16 @@ CREATE TABLE t1 (d varchar(6), k int); INSERT INTO t1 VALUES (NULL, 2); SELECT GREATEST(d,d) FROM t1 WHERE k=2; DROP TABLE t1; + +# +# Bug #6138: mod and doubles +# + +select 1197.90 mod 50; +select 5.1 mod 3, 5.1 mod -3, -5.1 mod 3, -5.1 mod -3; + +# +# Test for mod and signed integers +# + +select 5 mod 3, 5 mod -3, -5 mod 3, -5 mod -3; diff --git a/sql/item_func.cc b/sql/item_func.cc index f20d69bf2ad..17cf8642ce5 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -651,11 +651,11 @@ void Item_func_int_div::fix_length_and_dec() double Item_func_mod::val() { DBUG_ASSERT(fixed == 1); - double value= floor(args[0]->val()+0.5); - double val2=floor(args[1]->val()+0.5); - if ((null_value=val2 == 0.0 || args[0]->null_value || args[1]->null_value)) + double x= args[0]->val(); + double y= args[1]->val(); + if ((null_value= (y == 0.0) || args[0]->null_value || args[1]->null_value)) return 0.0; /* purecov: inspected */ - return fmod(value,val2); + return fmod(x, y); } longlong Item_func_mod::val_int() @@ -670,10 +670,7 @@ longlong Item_func_mod::val_int() void Item_func_mod::fix_length_and_dec() { - max_length=args[1]->max_length; - decimals=0; - maybe_null=1; - find_num_type(); + Item_num_op::fix_length_and_dec(); } |