Drizzled Public API Documentation

int_val.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 
22 #include <drizzled/type/decimal.h>
23 #include <drizzled/function/math/int_val.h>
24 
25 namespace drizzled
26 {
27 
28 void Item_func_int_val::fix_num_length_and_dec()
29 {
30  max_length= args[0]->max_length - (args[0]->decimals ?
31  args[0]->decimals + 1 :
32  0) + 2;
33  uint32_t tmp= float_length(decimals);
34  set_if_smaller(max_length,tmp);
35  decimals= 0;
36 }
37 
39 {
40  switch(hybrid_type= args[0]->result_type())
41  {
42  case STRING_RESULT:
43  case REAL_RESULT:
44  hybrid_type= REAL_RESULT;
45  max_length= float_length(decimals);
46  break;
47  case INT_RESULT:
48  case DECIMAL_RESULT:
49  /*
50  -2 because in most high position can't be used any digit for int64_t
51  and one position for increasing value during operation
52  */
53  if ((args[0]->max_length - args[0]->decimals) >=
54  (DECIMAL_LONGLONG_DIGITS - 2))
55  {
56  hybrid_type= DECIMAL_RESULT;
57  }
58  else
59  {
60  unsigned_flag= args[0]->unsigned_flag;
61  hybrid_type= INT_RESULT;
62  }
63  break;
64  default:
65  assert(0);
66  }
67  return;
68 }
69 
70 } /* namespace drizzled */