00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <config.h>
00021
00022 #include <drizzled/function/str/left.h>
00023
00024 namespace drizzled
00025 {
00026
00027 String *Item_func_left::val_str(String *str)
00028 {
00029 assert(fixed == 1);
00030 String *res= args[0]->val_str(str);
00031
00032
00033 int64_t length= args[1]->val_int();
00034 uint32_t char_pos;
00035
00036 if ((null_value=(args[0]->null_value || args[1]->null_value)))
00037 return 0;
00038
00039
00040 if ((length <= 0) && (!args[1]->unsigned_flag))
00041 return &my_empty_string;
00042
00043 if ((res->length() <= (uint64_t) length) ||
00044 (res->length() <= (char_pos= res->charpos((int) length))))
00045 return res;
00046
00047 tmp_value.set(*res, 0, char_pos);
00048 return &tmp_value;
00049 }
00050
00051 void Item_func_left::fix_length_and_dec()
00052 {
00053 collation.set(args[0]->collation);
00054 left_right_max_length();
00055 }
00056
00057 }