22 #include <drizzled/function/str/replace.h>
23 #include <drizzled/error.h>
24 #include <drizzled/session.h>
25 #include <drizzled/system_variables.h>
43 uint32_t from_length,to_length;
45 const char *ptr,*end,*strend,*search,*search_end;
53 res2=args[1]->
val_str(&tmp_value);
57 res->set_charset(collation.collation);
59 binary_cmp = ((res->charset()->state & MY_CS_BINSORT) || !use_mb(res->charset()));
61 if (res2->length() == 0)
64 if (binary_cmp && (offset=res->strstr(*res2)) < 0)
66 if (!(res3=args[2]->
val_str(&tmp_value2)))
68 from_length= res2->length();
69 to_length= res3->length();
74 search_end=search+from_length;
76 ptr=res->ptr()+offset;
77 strend=res->ptr()+res->length();
78 end=strend-from_length+1;
84 i=(
char*) ptr+1; j=(
char*) search+1;
85 while (j != search_end)
86 if (*i++ != *j++)
goto skip;
87 offset= (int) (ptr-res->ptr());
88 if (res->length()-from_length + to_length >
91 push_warning_printf(&session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
92 ER_WARN_ALLOWED_PACKET_OVERFLOWED,
93 ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED),
102 res=copy_if_not_alloced(str,res,res->length()+to_length);
104 res->replace((uint) offset,from_length,*res3);
105 offset+=(int) to_length;
109 if ((l=my_ismbchar(res->charset(), ptr,strend))) ptr+=l;
116 if (res->length()-from_length + to_length >
119 push_warning_printf(&session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
120 ER_WARN_ALLOWED_PACKET_OVERFLOWED,
121 ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED), func_name(),
128 res=copy_if_not_alloced(str,res,res->length()+to_length);
130 res->replace((uint) offset,from_length,*res3);
131 offset+=(int) to_length;
133 while ((offset=res->strstr(*res2,(uint) offset)) >= 0);
142 void Item_func_replace::fix_length_and_dec()
144 uint64_t max_result_length= args[0]->max_length;
145 int diff=(int) (args[2]->max_length - args[1]->max_length);
146 if (diff > 0 && args[1]->max_length)
148 uint64_t max_substrs= max_result_length/args[1]->max_length;
149 max_result_length+= max_substrs * (uint) diff;
151 if (max_result_length >= MAX_BLOB_WIDTH)
153 max_result_length= MAX_BLOB_WIDTH;
156 max_length= (ulong) max_result_length;
158 if (agg_arg_charsets(collation, args, 3, MY_COLL_CMP_CONV, 1))