22 #include <drizzled/function/str/repeat.h>
23 #include <drizzled/error.h>
24 #include <drizzled/function/str/alloc_buffer.h>
25 #include <drizzled/session.h>
26 #include <drizzled/system_variables.h>
30 void Item_func_repeat::fix_length_and_dec()
32 collation.set(args[0]->collation);
36 int64_t count= args[1]->
val_int();
40 if (count > INT32_MAX)
43 uint64_t max_result_length= (uint64_t) args[0]->max_length * count;
44 if (max_result_length >= MAX_BLOB_WIDTH)
46 max_result_length= MAX_BLOB_WIDTH;
49 max_length= (ulong) max_result_length;
53 max_length= MAX_BLOB_WIDTH;
66 uint32_t length,tot_length;
69 int64_t count= args[1]->
val_int();
76 if (count <= 0 && (count == 0 || !args[1]->unsigned_flag))
77 return &my_empty_string;
81 if ((uint64_t) count > INT32_MAX)
87 if (length > session.
variables.max_allowed_packet / (uint) count)
89 push_warning_printf(&session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
90 ER_WARN_ALLOWED_PACKET_OVERFLOWED,
91 ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED),
92 func_name(), session.
variables.max_allowed_packet);
95 tot_length= length*(uint) count;
96 if (!(res= alloc_buffer(res,str,&tmp_value,tot_length)))
99 to=(
char*) res->ptr()+length;
102 memcpy(to,res->ptr(),length);
String * val_str(String *)
virtual int64_t val_int()=0
TODO: Rename this file - func.h is stupid.
virtual bool const_item() const
virtual String * val_str(String *str)=0
drizzle_system_variables & variables