22 #include <drizzled/function/str/insert.h>
23 #include <drizzled/error.h>
24 #include <drizzled/session.h>
25 #include <drizzled/system_variables.h>
33 int64_t start, length;
37 res2=args[3]->
val_str(&tmp_value);
45 if ((start < 0) || (start > static_cast<int64_t>(res->length())))
47 if ((length < 0) || (length >
static_cast<int64_t
>(res->length())))
48 length= res->length();
51 start= res->charpos((
int) start);
52 length= res->charpos((
int) length, (uint32_t) start);
55 if (start > static_cast<int64_t>(res->length()))
57 if (length > static_cast<int64_t>(res->length()) - start)
58 length= res->length() - start;
60 if ((uint64_t) (res->length() - length + res2->length()) >
61 (uint64_t) session.
variables.max_allowed_packet)
63 push_warning_printf(&session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
64 ER_WARN_ALLOWED_PACKET_OVERFLOWED,
65 ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED),
66 func_name(), session.
variables.max_allowed_packet);
69 res=copy_if_not_alloced(str,res,res->length());
70 res->replace((uint32_t) start,(uint32_t) length,*res2);
77 void Item_func_insert::fix_length_and_dec()
80 if (agg_arg_charsets(collation, &args[0], 2, MY_COLL_ALLOW_CONV, 3))
82 uint64_t max_result_length= ((uint64_t) args[0]->max_length + (uint64_t) args[3]->max_length);
83 if (max_result_length >= MAX_BLOB_WIDTH)
85 max_result_length= MAX_BLOB_WIDTH;
88 max_length= (ulong) max_result_length;