~drizzle-trunk/drizzle/development

2015.1.3 by Brian Aker
Merge in CAST operators for SIGNED/UNSIGNED
1
/* - mode: c++ c-basic-offset: 2; indent-tabs-mode: nil; -*-
2
 *  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
3
 *
4
 *  Copyright (C) 2010 Brian Aker
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; either version 2 of the License, or
9
 *  (at your option) any later version.
10
 *
11
 *  This program is distributed in the hope that it will be useful,
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *  GNU General Public License for more details.
15
 *
16
 *  You should have received a copy of the GNU General Public License
17
 *  along with this program; if not, write to the Free Software
18
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19
 */
20
21
#include "config.h"
22
23
#include "drizzled/function/cast/unsigned.h"
24
#include "drizzled/error.h"
25
26
namespace drizzled {
27
namespace function {
28
namespace cast {
29
30
void Unsigned::print(String *str, enum_query_type query_type)
31
{
32
  str->append(STRING_WITH_LEN("cast("));
33
  args[0]->print(str, query_type);
34
  str->append(STRING_WITH_LEN(" as unsigned)"));
35
36
}
37
38
39
int64_t Unsigned::val_int()
40
{
41
  int64_t value= 0;
42
  int error= 0;
43
  char buff[MAX_FIELD_WIDTH];
44
  String tmp(buff,sizeof(buff), &my_charset_bin), *res; 
45
46
  /* 
47
    For a string result, we must first get the string and then convert it 
48
    to a longlong 
49
   */ 
50
51
  if (not (res= args[0]->val_str(&tmp))) 
52
  { 
53
    null_value= true; 
54
    error= 0; 
55
    return 0; 
56
  } 
57
  null_value= false; 
58
59
  char *end= res->ptr() + res->length(); 
60
61
  if (res->length() and ((char *)res->ptr())[0] == '-')
62
  {
63
    error= -1;
64
  }
65
  else
66
  {
67
    value= res->charset()->cset->strntoull10rnd(res->charset(),
68
                                                res->ptr(),
69
                                                res->length(),
70
                                                true, &end, &error);
71
  }
72
73
  if (error or (end != res->ptr() + res->length())) 
74
  {
75
    my_error(ER_INVALID_CAST_TO_UNSIGNED, MYF(0), res->c_str());
76
  }
77
78
  return value;
79
}
80
81
} // namespace cast
82
} // namespace function
83
} // namespace drizzled