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/signed.h>
00026 #include <drizzled/lex_string.h>
00027
00028 namespace drizzled {
00029 namespace function {
00030 namespace cast {
00031
00032 void Signed::print(String *str)
00033 {
00034 str->append(STRING_WITH_LEN("cast("));
00035 args[0]->print(str);
00036 str->append(STRING_WITH_LEN(" as signed)"));
00037
00038 }
00039
00040
00041 int64_t Signed::val_int()
00042 {
00043 int64_t value;
00044 int error= 0;
00045 char buff[MAX_FIELD_WIDTH];
00046 String res_buffer(buff,sizeof(buff), &my_charset_bin);
00047 String *res;
00048
00049 if (not (res= args[0]->val_str(&res_buffer)))
00050 {
00051 null_value= 1;
00052 error= 0;
00053
00054 return 0;
00055 }
00056 null_value= 0;
00057
00058 char *end= res->ptr() + res->length();
00059 value= res->charset()->cset->strntoull10rnd(res->charset(),
00060 res->ptr(),
00061 res->length(),
00062 false, &end, &error);
00063
00064 if (error or (end != res->ptr() + res->length()))
00065 {
00066 my_error(ER_INVALID_CAST_TO_SIGNED, MYF(0), res->c_str());
00067 }
00068
00069 return value;
00070 }
00071
00072
00073 }
00074 }
00075 }