00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <config.h>
00022
00023 #include <drizzled/charset_info.h>
00024 #include <drizzled/error.h>
00025 #include <drizzled/function/cast/unsigned.h>
00026 #include <drizzled/lex_string.h>
00027
00028 namespace drizzled {
00029 namespace function {
00030 namespace cast {
00031
00032 void Unsigned::print(String *str)
00033 {
00034 str->append(STRING_WITH_LEN("cast("));
00035 args[0]->print(str);
00036 str->append(STRING_WITH_LEN(" as unsigned)"));
00037
00038 }
00039
00040
00041 int64_t Unsigned::val_int()
00042 {
00043 int64_t value= 0;
00044 int error= 0;
00045 char buff[MAX_FIELD_WIDTH];
00046 String tmp(buff,sizeof(buff), &my_charset_bin), *res;
00047
00048
00049
00050
00051
00052
00053 if (not (res= args[0]->val_str(&tmp)))
00054 {
00055 null_value= true;
00056 error= 0;
00057 return 0;
00058 }
00059 null_value= false;
00060
00061 char *end= res->ptr() + res->length();
00062
00063 if (res->length() and ((char *)res->ptr())[0] == '-')
00064 {
00065 error= -1;
00066 }
00067 else
00068 {
00069 value= res->charset()->cset->strntoull10rnd(res->charset(),
00070 res->ptr(),
00071 res->length(),
00072 true, &end, &error);
00073 }
00074
00075 if (error or (end != res->ptr() + res->length()))
00076 {
00077 my_error(ER_INVALID_CAST_TO_UNSIGNED, MYF(0), res->c_str());
00078 }
00079
00080 return value;
00081 }
00082
00083 }
00084 }
00085 }