~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/item_func.cc

code clean move Item_func_abs, Item_func_int_exp, Item_func_ln, Item_func_log to functions directory

Show diffs side-by-side

added added

removed removed

Lines of Context:
150
150
  return copy_or_same(thd);
151
151
}
152
152
 
153
 
double Item_func_abs::real_op()
154
 
{
155
 
  double value= args[0]->val_real();
156
 
  null_value= args[0]->null_value;
157
 
  return fabs(value);
158
 
}
159
 
 
160
 
 
161
 
int64_t Item_func_abs::int_op()
162
 
{
163
 
  int64_t value= args[0]->val_int();
164
 
  if ((null_value= args[0]->null_value))
165
 
    return 0;
166
 
  return (value >= 0) || unsigned_flag ? value : -value;
167
 
}
168
 
 
169
 
 
170
 
my_decimal *Item_func_abs::decimal_op(my_decimal *decimal_value)
171
 
{
172
 
  my_decimal val, *value= args[0]->val_decimal(&val);
173
 
  if (!(null_value= args[0]->null_value))
174
 
  {
175
 
    my_decimal2decimal(value, decimal_value);
176
 
    if (decimal_value->sign())
177
 
      my_decimal_neg(decimal_value);
178
 
    return decimal_value;
179
 
  }
180
 
  return 0;
181
 
}
182
 
 
183
 
 
184
 
void Item_func_abs::fix_length_and_dec()
185
 
{
186
 
  Item_func_num1::fix_length_and_dec();
187
 
  unsigned_flag= args[0]->unsigned_flag;
188
 
}
189
 
 
190
 
 
191
 
/** Gateway to natural LOG function. */
192
 
double Item_func_ln::val_real()
193
 
{
194
 
  assert(fixed == 1);
195
 
  double value= args[0]->val_real();
196
 
  if ((null_value= args[0]->null_value))
197
 
    return 0.0;
198
 
  if (value <= 0.0)
199
 
  {
200
 
    signal_divide_by_null();
201
 
    return 0.0;
202
 
  }
203
 
  return log(value);
204
 
}
205
 
 
206
 
/** 
207
 
  Extended but so slower LOG function.
208
 
 
209
 
  We have to check if all values are > zero and first one is not one
210
 
  as these are the cases then result is not a number.
211
 
*/ 
212
 
double Item_func_log::val_real()
213
 
{
214
 
  assert(fixed == 1);
215
 
  double value= args[0]->val_real();
216
 
  if ((null_value= args[0]->null_value))
217
 
    return 0.0;
218
 
  if (value <= 0.0)
219
 
  {
220
 
    signal_divide_by_null();
221
 
    return 0.0;
222
 
  }
223
 
  if (arg_count == 2)
224
 
  {
225
 
    double value2= args[1]->val_real();
226
 
    if ((null_value= args[1]->null_value))
227
 
      return 0.0;
228
 
    if (value2 <= 0.0 || value == 1.0)
229
 
    {
230
 
      signal_divide_by_null();
231
 
      return 0.0;
232
 
    }
233
 
    return log(value2) / log(value);
234
 
  }
235
 
  return log(value);
236
 
}
237
 
 
238
 
double Item_func_log2::val_real()
239
 
{
240
 
  assert(fixed == 1);
241
 
  double value= args[0]->val_real();
242
 
 
243
 
  if ((null_value=args[0]->null_value))
244
 
    return 0.0;
245
 
  if (value <= 0.0)
246
 
  {
247
 
    signal_divide_by_null();
248
 
    return 0.0;
249
 
  }
250
 
  return log(value) / M_LN2;
251
 
}
252
 
 
253
 
double Item_func_log10::val_real()
254
 
{
255
 
  assert(fixed == 1);
256
 
  double value= args[0]->val_real();
257
 
  if ((null_value= args[0]->null_value))
258
 
    return 0.0;
259
 
  if (value <= 0.0)
260
 
  {
261
 
    signal_divide_by_null();
262
 
    return 0.0;
263
 
  }
264
 
  return log10(value);
265
 
}
266
 
 
267
 
double Item_func_exp::val_real()
268
 
{
269
 
  assert(fixed == 1);
270
 
  double value= args[0]->val_real();
271
 
  if ((null_value=args[0]->null_value))
272
 
    return 0.0; /* purecov: inspected */
273
 
  return fix_result(exp(value));
274
 
}
275
 
 
276
153
double Item_func_sqrt::val_real()
277
154
{
278
155
  assert(fixed == 1);