22 #include <drizzled/charset.h>
23 #include <drizzled/function/find_in_set.h>
32 void Item_func_find_in_set::fix_length_and_dec()
36 agg_arg_charsets(cmp_collation, args, 2, MY_COLL_CMP_CONV, 1);
39 static const char separator=
',';
46 uint64_t tmp=(uint64_t) args[1]->
val_int();
64 if (buffer->length() >= find->length())
68 const char *str_begin= buffer->ptr();
69 const char *str_end= buffer->ptr();
70 const char *real_end= str_end+buffer->length();
71 const unsigned char *find_str= (
const unsigned char *) find->ptr();
72 uint32_t find_str_len= find->length();
77 if ((symbol_len= cs->cset->mb_wc(cs, &wc, (
unsigned char*) str_end, (
unsigned char*) real_end)) > 0)
79 const char *substr_end= str_end + symbol_len;
80 bool is_last_item= (substr_end == real_end);
81 bool is_separator= (wc == (my_wc_t) separator);
82 if (is_separator || is_last_item)
85 if (is_last_item && !is_separator)
87 if (!my_strnncoll(cs, (
const unsigned char *) str_begin,
89 find_str, find_str_len))
90 return (int64_t) position;
92 str_begin= substr_end;
96 else if (str_end - str_begin == 0 &&
98 wc == (my_wc_t) separator)
99 return (int64_t) ++position;
virtual String * val_str(String *str)=0