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/error.h>
00024 #include <drizzled/function/cast/boolean.h>
00025 #include <drizzled/lex_string.h>
00026 #include <drizzled/type/boolean.h>
00027
00028 namespace drizzled {
00029 namespace function {
00030 namespace cast {
00031
00032 void Boolean::print(String *str)
00033 {
00034 str->append(STRING_WITH_LEN("cast("));
00035 args[0]->print(str);
00036 str->append(STRING_WITH_LEN(" as boolean)"));
00037 }
00038
00039 drizzled::String *Boolean::val_str(drizzled::String *value)
00040 {
00041 switch (args[0]->result_type())
00042 {
00043 case STRING_RESULT:
00044 {
00045 drizzled::String _res, *res;
00046
00047 if (not (res= args[0]->val_str(&_res)))
00048 {
00049 null_value= true;
00050 break;
00051 }
00052 null_value= false;
00053
00054 bool result;
00055 if (not type::convert(result, *res))
00056 {
00057 my_error(ER_INVALID_CAST_TO_BOOLEAN, MYF(0), res->c_ptr());
00058 }
00059
00060 return evaluate(result, value);
00061 }
00062
00063 case REAL_RESULT:
00064 case ROW_RESULT:
00065 case DECIMAL_RESULT:
00066 case INT_RESULT:
00067 {
00068 bool tmp= args[0]->val_bool();
00069 null_value=args[0]->null_value;
00070
00071 return evaluate(tmp, value);
00072 }
00073 }
00074
00075
00076 return evaluate(false, value);
00077 }
00078
00079 String *Boolean::evaluate(const bool &result, String *val_buffer)
00080 {
00081 const CHARSET_INFO * const cs= &my_charset_bin;
00082 uint32_t mlength= (5) * cs->mbmaxlen;
00083
00084 val_buffer->alloc(mlength);
00085 char *buffer=(char*) val_buffer->c_ptr();
00086
00087 if (result)
00088 {
00089 memcpy(buffer, "TRUE", 4);
00090 val_buffer->length(4);
00091 }
00092 else
00093 {
00094 memcpy(buffer, "FALSE", 5);
00095 val_buffer->length(5);
00096 }
00097
00098 return val_buffer;
00099 }
00100
00101 }
00102 }
00103 }