22 #include <drizzled/function/str/trim.h>
30 char buff[MAX_FIELD_WIDTH], *ptr, *end;
31 String tmp(buff,
sizeof(buff),system_charset_info);
33 uint32_t remove_length;
41 remove_str= args[1]->
val_str(&tmp);
46 if ((remove_length= remove_str->length()) == 0 ||
47 remove_length > res->length())
50 ptr= (
char*) res->ptr();
51 end= ptr+res->length();
52 if (remove_length == 1)
54 char chr=(*remove_str)[0];
55 while (ptr != end && *ptr == chr)
60 const char *r_ptr=remove_str->ptr();
62 while (ptr <= end && !memcmp(ptr, r_ptr, remove_length))
66 if (ptr == res->ptr())
68 tmp_value.set(*res,(uint) (ptr - res->ptr()),(uint) (end-ptr));
75 char buff[MAX_FIELD_WIDTH], *ptr, *end;
76 String tmp(buff,
sizeof(buff), system_charset_info);
78 uint32_t remove_length;
86 remove_str= args[1]->
val_str(&tmp);
91 if ((remove_length= remove_str->length()) == 0 ||
92 remove_length > res->length())
95 ptr= (
char*) res->ptr();
96 end= ptr+res->length();
99 if (remove_length == 1)
101 char chr=(*remove_str)[0];
102 if (use_mb(res->charset()))
106 if ((l=my_ismbchar(res->charset(), ptr,end))) ptr+=l,p=ptr;
111 while (ptr != end && end[-1] == chr)
116 const char *r_ptr=remove_str->ptr();
117 if (use_mb(res->charset()))
120 while (ptr + remove_length < end)
122 if ((l=my_ismbchar(res->charset(), ptr,end))) ptr+=l;
125 if (ptr + remove_length == end && !memcmp(ptr,r_ptr,remove_length))
134 while (ptr + remove_length <= end &&
135 !memcmp(end-remove_length, r_ptr, remove_length))
139 if (end == res->ptr()+res->length())
141 tmp_value.set(*res,0,(uint) (end-res->ptr()));
149 char buff[MAX_FIELD_WIDTH], *ptr, *end;
151 String tmp(buff,
sizeof(buff), system_charset_info);
153 uint32_t remove_length;
161 remove_str= args[1]->
val_str(&tmp);
166 if ((remove_length= remove_str->length()) == 0 ||
167 remove_length > res->length())
170 ptr= (
char*) res->ptr();
171 end= ptr+res->length();
172 r_ptr= remove_str->ptr();
173 while (ptr+remove_length <= end && !memcmp(ptr,r_ptr,remove_length))
175 if (use_mb(res->charset()))
180 while (ptr + remove_length < end)
182 if ((l=my_ismbchar(res->charset(), ptr,end))) ptr+=l;
185 if (ptr + remove_length == end && !memcmp(ptr,r_ptr,remove_length))
195 while (ptr + remove_length <= end &&
196 !memcmp(end-remove_length,r_ptr,remove_length))
199 if (ptr == res->ptr() && end == ptr+res->length())
201 tmp_value.set(*res,(uint) (ptr - res->ptr()),(uint) (end-ptr));
205 void Item_func_trim::fix_length_and_dec()
207 max_length= args[0]->max_length;
210 collation.set(args[0]->collation);
211 remove.set_charset(collation.collation);
212 remove.set_ascii(
" ",1);
218 if (agg_arg_charsets(collation, &args[1], 2, MY_COLL_CMP_CONV, -1))
230 str->append(Item_func_trim::func_name(), strlen(Item_func_trim::func_name()));
232 str->append(mode_name(), strlen(mode_name()));
235 str->append(STRING_WITH_LEN(
" from "));