Drizzled Public API Documentation

numhybrid.cc
1 /* -*- mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3  *
4  * Copyright (C) 2008 Sun Microsystems, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18  */
19 
20 #include <config.h>
21 #include <math.h>
22 #include <drizzled/function/numhybrid.h>
23 
24 namespace drizzled
25 {
26 
27 void Item_func_numhybrid::fix_num_length_and_dec()
28 {}
29 
30 void Item_func_numhybrid::fix_length_and_dec()
31 {
32  fix_num_length_and_dec();
33  find_num_type();
34 }
35 
37 {
38  assert(fixed == 1);
39  switch (hybrid_type) {
40  case DECIMAL_RESULT:
41  {
42  type::Decimal decimal_value, *val;
43  if (!(val= decimal_op(&decimal_value)))
44  return 0; // null is set
45  class_decimal_round(E_DEC_FATAL_ERROR, val, decimals, false, val);
46  class_decimal2string(val, 0, str);
47  break;
48  }
49  case INT_RESULT:
50  {
51  int64_t nr= int_op();
52  if (null_value)
53  return 0;
54  str->set_int(nr, unsigned_flag, &my_charset_bin);
55  break;
56  }
57  case REAL_RESULT:
58  {
59  double nr= real_op();
60  if (null_value)
61  return 0;
62  str->set_real(nr,decimals,&my_charset_bin);
63  break;
64  }
65  case STRING_RESULT:
66  return str_op(&str_value);
67  case ROW_RESULT:
68  assert(0);
69  }
70  return str;
71 }
72 
73 
75 {
76  assert(fixed == 1);
77  switch (hybrid_type) {
78  case DECIMAL_RESULT:
79  {
80  type::Decimal decimal_value, *val;
81  double result;
82  if (!(val= decimal_op(&decimal_value)))
83  return 0.0; // null is set
84  class_decimal2double(E_DEC_FATAL_ERROR, val, &result);
85  return result;
86  }
87  case INT_RESULT:
88  {
89  int64_t result= int_op();
90  return unsigned_flag ? (double) ((uint64_t) result) : (double) result;
91  }
92  case REAL_RESULT:
93  return real_op();
94  case STRING_RESULT:
95  {
96  char *end_not_used;
97  int err_not_used;
98  String *res= str_op(&str_value);
99  return (res ? my_strntod(res->charset(), (char*) res->ptr(), res->length(),
100  &end_not_used, &err_not_used) : 0.0);
101  }
102  case ROW_RESULT:
103  assert(0);
104  }
105 
106  return 0.0;
107 }
108 
109 
111 {
112  assert(fixed == 1);
113  switch (hybrid_type) {
114  case DECIMAL_RESULT:
115  {
116  type::Decimal decimal_value, *val;
117  if (!(val= decimal_op(&decimal_value)))
118  return 0; // null is set
119  int64_t result;
120  val->val_int32(E_DEC_FATAL_ERROR, unsigned_flag, &result);
121  return result;
122  }
123  case INT_RESULT:
124  return int_op();
125  case REAL_RESULT:
126  return (int64_t) rint(real_op());
127  case STRING_RESULT:
128  {
129  int err_not_used;
130  String *res;
131  if (!(res= str_op(&str_value)))
132  return 0;
133 
134  char *end= (char*) res->ptr() + res->length();
135  const charset_info_st * const cs= str_value.charset();
136  return (*(cs->cset->strtoll10))(cs, res->ptr(), &end, &err_not_used);
137  }
138  case ROW_RESULT:
139  assert(0);
140  }
141  return 0;
142 }
143 
144 
146 {
147  type::Decimal *val= decimal_value;
148  assert(fixed == 1);
149 
150  switch (hybrid_type) {
151  case DECIMAL_RESULT:
152  val= decimal_op(decimal_value);
153  break;
154  case INT_RESULT:
155  {
156  int64_t result= int_op();
157  int2_class_decimal(E_DEC_FATAL_ERROR, result, unsigned_flag, decimal_value);
158  break;
159  }
160  case REAL_RESULT:
161  {
162  double result= (double)real_op();
163  double2_class_decimal(E_DEC_FATAL_ERROR, result, decimal_value);
164  break;
165  }
166  case STRING_RESULT:
167  {
168  String *res;
169  if (!(res= str_op(&str_value)))
170  return NULL;
171 
172  decimal_value->store(E_DEC_FATAL_ERROR, (char*) res->ptr(),
173  res->length(), res->charset());
174  break;
175  }
176  case ROW_RESULT:
177  assert(0);
178  }
179 
180  return val;
181 }
182 
183 } /* namespace drizzled */
bool fixed
Definition: item.h:120
bool null_value
Definition: item.h:122
String * val_str(String *str)
Definition: numhybrid.cc:36
type::Decimal * val_decimal(type::Decimal *)
Definition: numhybrid.cc:145
int store(uint32_t mask, const char *from, uint32_t length, const charset_info_st *charset)
Convert string for decimal when string can be in some multibyte charset.
Definition: decimal.cc:285
virtual double real_op()=0
Performs the operation that this functions implements when the result type is REAL.
virtual type::Decimal * decimal_op(type::Decimal *)=0
Performs the operation that this functions implements when the result type is DECIMAL.
virtual String * str_op(String *)=0
Performs the operation that this functions implements when the result type is a string type...
int class_decimal2string(const type::Decimal *d, uint32_t fixed_dec, String *str)
Converting decimal to string.
Definition: decimal.cc:197
String str_value
Definition: item.h:107
virtual int64_t int_op()=0
Performs the operation that this functions implements when the result type is INT.