22 #include <drizzled/function/str/pad.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_rpad::fix_length_and_dec()
33 if (agg_arg_charsets(collation, &args[0], 2, MY_COLL_ALLOW_CONV, 2))
39 if (collation.collation->mbmaxlen > 0)
41 uint64_t temp= (uint64_t) args[1]->
val_int();
48 length= temp * collation.collation->mbmaxlen;
51 if (length >= MAX_BLOB_WIDTH)
53 length= MAX_BLOB_WIDTH;
56 max_length= (ulong) length;
60 max_length= MAX_BLOB_WIDTH;
70 uint32_t res_byte_length,res_char_length,pad_char_length,pad_byte_length;
73 int64_t count= args[1]->
val_int();
77 if (!res || args[1]->
null_value || !rpad || ((count < 0) && !args[1]->unsigned_flag))
81 if ((uint64_t) count > INT32_MAX)
83 if (count <= (res_char_length= res->numchars()))
85 res->length(res->charpos((
int) count));
89 pad_char_length= rpad->numchars();
91 int64_t byte_count= count * collation.collation->mbmaxlen;
92 if ((uint64_t) byte_count > session.
variables.max_allowed_packet)
94 push_warning_printf(&session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
95 ER_WARN_ALLOWED_PACKET_OVERFLOWED,
96 ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED),
97 func_name(), session.
variables.max_allowed_packet);
102 res_byte_length= res->length();
103 res= alloc_buffer(res,str,&tmp_value, (ulong) byte_count);
104 char* to= (
char*) res->ptr()+res_byte_length;
106 pad_byte_length= rpad->length();
107 count-= res_char_length;
108 for ( ; (uint32_t) count > pad_char_length; count-= pad_char_length)
110 memcpy(to,ptr_pad,pad_byte_length);
111 to+= pad_byte_length;
115 pad_byte_length= rpad->charpos((
int) count);
116 memcpy(to,ptr_pad,(
size_t) pad_byte_length);
117 to+= pad_byte_length;
119 res->length(to- (
char*) res->ptr());
125 void Item_func_lpad::fix_length_and_dec()
128 if (agg_arg_charsets(collation, &args[0], 2, MY_COLL_ALLOW_CONV, 2))
135 if (collation.collation->mbmaxlen > 0)
137 uint64_t temp= (uint64_t) args[1]->
val_int();
141 if (temp > INT32_MAX)
144 length= temp * collation.collation->mbmaxlen;
147 if (length >= MAX_BLOB_WIDTH)
149 length= MAX_BLOB_WIDTH;
152 max_length= (ulong) length;
156 max_length= MAX_BLOB_WIDTH;
165 uint32_t res_char_length,pad_char_length;
167 int64_t count= args[1]->
val_int();
173 ((count < 0) && !args[1]->unsigned_flag))
178 if ((uint64_t) count > INT32_MAX)
181 res_char_length= res->numchars();
183 if (count <= res_char_length)
185 res->length(res->charpos((
int) count));
189 pad_char_length= pad->numchars();
190 byte_count= count * collation.collation->mbmaxlen;
192 if ((uint64_t) byte_count > session.
variables.max_allowed_packet)
194 push_warning_printf(&session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
195 ER_WARN_ALLOWED_PACKET_OVERFLOWED,
196 ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED),
197 func_name(), session.
variables.max_allowed_packet);
203 str->alloc((
size_t) byte_count);
205 str->set_charset(collation.collation);
206 count-= res_char_length;
207 while (count >= pad_char_length)
210 count-= pad_char_length;
213 str->append(pad->ptr(), pad->charpos((
int) count));