00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <config.h>
00021 #include <math.h>
00022 #include "log.h"
00023
00024 namespace drizzled
00025 {
00026
00033 double Item_func_log::val_real()
00034 {
00035 assert(fixed == 1);
00036 double value= args[0]->val_real();
00037 if ((null_value= args[0]->null_value))
00038 return 0.0;
00039 if (value <= 0.0)
00040 {
00041 signal_divide_by_null();
00042 return 0.0;
00043 }
00044 if (arg_count == 2)
00045 {
00046 double value2= args[1]->val_real();
00047 if ((null_value= args[1]->null_value))
00048 return 0.0;
00049 if (value2 <= 0.0 || value == 1.0)
00050 {
00051 signal_divide_by_null();
00052 return 0.0;
00053 }
00054 return log(value2) / log(value);
00055 }
00056 return log(value);
00057 }
00058
00059 double Item_func_log2::val_real()
00060 {
00061 assert(fixed == 1);
00062 double value= args[0]->val_real();
00063
00064 if ((null_value=args[0]->null_value))
00065 return 0.0;
00066 if (value <= 0.0)
00067 {
00068 signal_divide_by_null();
00069 return 0.0;
00070 }
00071 return log(value) / M_LN2;
00072 }
00073
00074 double Item_func_log10::val_real()
00075 {
00076 assert(fixed == 1);
00077 double value= args[0]->val_real();
00078 if ((null_value= args[0]->null_value))
00079 return 0.0;
00080 if (value <= 0.0)
00081 {
00082 signal_divide_by_null();
00083 return 0.0;
00084 }
00085 return log10(value);
00086 }
00087
00088 }