diff options
-rw-r--r-- | mysql-test/r/func_math.result | 27 | ||||
-rw-r--r-- | mysql-test/t/func_math.test | 12 | ||||
-rw-r--r-- | sql/item_func.cc | 38 |
3 files changed, 71 insertions, 6 deletions
diff --git a/mysql-test/r/func_math.result b/mysql-test/r/func_math.result index 5b6c29f87fb..b7ba2273956 100644 --- a/mysql-test/r/func_math.result +++ b/mysql-test/r/func_math.result @@ -170,3 +170,30 @@ insert into t1 values (1); select rand(i) from t1; ERROR HY000: Incorrect arguments to RAND drop table t1; +set sql_mode='traditional'; +select ln(-1); +ln(-1) +NULL +Warnings: +Error 1365 Division by 0 +select log10(-1); +log10(-1) +NULL +Warnings: +Error 1365 Division by 0 +select log2(-1); +log2(-1) +NULL +Warnings: +Error 1365 Division by 0 +select log(2,-1); +log(2,-1) +NULL +Warnings: +Error 1365 Division by 0 +select log(-2,1); +log(-2,1) +NULL +Warnings: +Error 1365 Division by 0 +set sql_mode=''; diff --git a/mysql-test/t/func_math.test b/mysql-test/t/func_math.test index 633e36f51ab..2935f24f2d7 100644 --- a/mysql-test/t/func_math.test +++ b/mysql-test/t/func_math.test @@ -117,3 +117,15 @@ select rand(i) from t1; drop table t1; # End of 4.1 tests + +# +# Bug #13820 (No warning on log(negative) +# +set sql_mode='traditional'; +select ln(-1); +select log10(-1); +select log2(-1); +select log(2,-1); +select log(-2,1); +set sql_mode=''; + diff --git a/sql/item_func.cc b/sql/item_func.cc index 491243e9de7..3d29b4c6b66 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1386,8 +1386,13 @@ double Item_func_ln::val_real() { DBUG_ASSERT(fixed == 1); double value= args[0]->val_real(); - if ((null_value=(args[0]->null_value || value <= 0.0))) + if ((null_value=args[0]->null_value)) + return 0.0; + if ((null_value= value <=0.0)) + { + signal_divide_by_null(); return 0.0; + } return log(value); } @@ -1400,13 +1405,23 @@ double Item_func_log::val_real() { DBUG_ASSERT(fixed == 1); double value= args[0]->val_real(); - if ((null_value=(args[0]->null_value || value <= 0.0))) + if ((null_value=args[0]->null_value)) + return 0.0; + if ((null_value= value <=0.0)) + { + signal_divide_by_null(); return 0.0; + } if (arg_count == 2) { double value2= args[1]->val_real(); - if ((null_value=(args[1]->null_value || value2 <= 0.0 || value == 1.0))) + if ((null_value=args[1]->null_value)) return 0.0; + if ((null_value= value2 <=0.0) || (value == 1.0)) + { + signal_divide_by_null(); + return 0.0; + } return log(value2) / log(value); } return log(value); @@ -1416,8 +1431,14 @@ double Item_func_log2::val_real() { DBUG_ASSERT(fixed == 1); double value= args[0]->val_real(); - if ((null_value=(args[0]->null_value || value <= 0.0))) + + if ((null_value=args[0]->null_value)) return 0.0; + if ((null_value= value <=0.0)) + { + signal_divide_by_null(); + return 0.0; + } return log(value) / M_LN2; } @@ -1425,8 +1446,13 @@ double Item_func_log10::val_real() { DBUG_ASSERT(fixed == 1); double value= args[0]->val_real(); - if ((null_value=(args[0]->null_value || value <= 0.0))) - return 0.0; /* purecov: inspected */ + if ((null_value=args[0]->null_value)) + return 0.0; + if ((null_value= value <=0.0)) + { + signal_divide_by_null(); + return 0.0; + } return log10(value); } |