Commit 15fbd07a authored by hf@deer.(none)'s avatar hf@deer.(none)

Fix for bug #13820 (No warning on log(NEGATIVE))

parent 35e16842
...@@ -170,3 +170,30 @@ insert into t1 values (1); ...@@ -170,3 +170,30 @@ insert into t1 values (1);
select rand(i) from t1; select rand(i) from t1;
ERROR HY000: Incorrect arguments to RAND ERROR HY000: Incorrect arguments to RAND
drop table t1; 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='';
...@@ -117,3 +117,15 @@ select rand(i) from t1; ...@@ -117,3 +117,15 @@ select rand(i) from t1;
drop table t1; drop table t1;
# End of 4.1 tests # 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='';
...@@ -1386,8 +1386,13 @@ double Item_func_ln::val_real() ...@@ -1386,8 +1386,13 @@ double Item_func_ln::val_real()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
double value= args[0]->val_real(); 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 0.0;
}
return log(value); return log(value);
} }
...@@ -1400,13 +1405,23 @@ double Item_func_log::val_real() ...@@ -1400,13 +1405,23 @@ double Item_func_log::val_real()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
double value= args[0]->val_real(); 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 0.0;
}
if (arg_count == 2) if (arg_count == 2)
{ {
double value2= args[1]->val_real(); 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; 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(value2) / log(value);
} }
return log(value); return log(value);
...@@ -1416,8 +1431,14 @@ double Item_func_log2::val_real() ...@@ -1416,8 +1431,14 @@ double Item_func_log2::val_real()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
double value= args[0]->val_real(); 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; return 0.0;
if ((null_value= value <=0.0))
{
signal_divide_by_null();
return 0.0;
}
return log(value) / M_LN2; return log(value) / M_LN2;
} }
...@@ -1425,8 +1446,13 @@ double Item_func_log10::val_real() ...@@ -1425,8 +1446,13 @@ double Item_func_log10::val_real()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
double value= args[0]->val_real(); 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; /* purecov: inspected */ return 0.0;
if ((null_value= value <=0.0))
{
signal_divide_by_null();
return 0.0;
}
return log10(value); return log10(value);
} }
......
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