Drizzled Public API Documentation

log.cc
00001 /* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
00002  *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
00003  *
00004  *  Copyright (C) 2008 Sun Microsystems, Inc.
00005  *
00006  *  This program is free software; you can redistribute it and/or modify
00007  *  it under the terms of the GNU General Public License as published by
00008  *  the Free Software Foundation; version 2 of the License.
00009  *
00010  *  This program is distributed in the hope that it will be useful,
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  *  GNU General Public License for more details.
00014  *
00015  *  You should have received a copy of the GNU General Public License
00016  *  along with this program; if not, write to the Free Software
00017  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
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 } /* namespace drizzled */