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/right.h>
00023
00024 namespace drizzled
00025 {
00026
00027 String *Item_func_right::val_str(String *str)
00028 {
00029 assert(fixed == 1);
00030 String *res= args[0]->val_str(str);
00031
00032 int64_t length= args[1]->val_int();
00033
00034 if ((null_value=(args[0]->null_value || args[1]->null_value)))
00035 return 0;
00036
00037
00038 if ((length <= 0) && (!args[1]->unsigned_flag))
00039 return &my_empty_string;
00040
00041 if (res->length() <= (uint64_t) length)
00042 return res;
00043
00044 uint32_t start=res->numchars();
00045 if (start <= (uint) length)
00046 return res;
00047 start=res->charpos(start - (uint) length);
00048 tmp_value.set(*res,start,res->length()-start);
00049 return &tmp_value;
00050 }
00051
00052 void Item_func_right::fix_length_and_dec()
00053 {
00054 collation.set(args[0]->collation);
00055 left_right_max_length();
00056 }
00057
00058 }