48
45
if (res->length() == 0)
50
47
if (!(res=args[i]->val_str(str)))
55
52
if (!(res2=args[i]->val_str(use_as_buff)))
57
54
if (res2->length() == 0)
59
56
if (res->length()+res2->length() >
60
session.variables.max_allowed_packet)
57
current_session->variables.max_allowed_packet)
62
push_warning_printf(&session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
63
ER_WARN_ALLOWED_PACKET_OVERFLOWED,
64
ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED), func_name(),
65
session.variables.max_allowed_packet);
59
push_warning_printf(current_session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
60
ER_WARN_ALLOWED_PACKET_OVERFLOWED,
61
ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED), func_name(),
62
current_session->variables.max_allowed_packet);
68
65
if (!is_const && res->alloced_length() >= res->length()+res2->length())
69
66
{ // Use old buffer
72
69
else if (str->alloced_length() >= res->length()+res2->length())
75
str->replace(0,0,*res);
72
str->replace(0,0,*res);
82
79
use_as_buff= &tmp_value;
84
81
else if (res == &tmp_value)
86
if (res->append(*res2)) // Must be a blob
83
if (res->append(*res2)) // Must be a blob
89
86
else if (res2 == &tmp_value)
90
87
{ // This can happend only 1 time
91
if (tmp_value.replace(0,0,*res))
94
use_as_buff=str; // Put next arg here
88
if (tmp_value.replace(0,0,*res))
91
use_as_buff=str; // Put next arg here
96
93
else if (tmp_value.is_alloced() && res2->ptr() >= tmp_value.ptr() &&
97
res2->ptr() <= tmp_value.ptr() + tmp_value.alloced_length())
94
res2->ptr() <= tmp_value.ptr() + tmp_value.alloced_length())
100
This happens really seldom:
101
In this case res2 is sub string of tmp_value. We will
102
now work in place in tmp_value to set it to res | res2
104
/* Chop the last characters in tmp_value that isn't in res2 */
105
tmp_value.length((uint32_t) (res2->ptr() - tmp_value.ptr()) +
107
/* Place res2 at start of tmp_value, remove chars before res2 */
108
if (tmp_value.replace(0,(uint32_t) (res2->ptr() - tmp_value.ptr()),
112
use_as_buff=str; // Put next arg here
97
This happens really seldom:
98
In this case res2 is sub string of tmp_value. We will
99
now work in place in tmp_value to set it to res | res2
101
/* Chop the last characters in tmp_value that isn't in res2 */
102
tmp_value.length((uint32_t) (res2->ptr() - tmp_value.ptr()) +
104
/* Place res2 at start of tmp_value, remove chars before res2 */
105
if (tmp_value.replace(0,(uint32_t) (res2->ptr() - tmp_value.ptr()),
109
use_as_buff=str; // Put next arg here
115
112
{ // Two big const strings
117
@note We should be prudent in the initial allocation unit -- the
114
NOTE: We should be prudent in the initial allocation unit -- the
118
115
size of the arguments is a function of data distribution, which
119
116
can be any. Instead of overcommitting at the first row, we grow
120
117
the allocated amount by the factor of 2. This ensures that no
121
118
more than 25% of memory will be overcommitted on average.
124
size_t concat_len= res->length() + res2->length();
121
uint32_t concat_len= res->length() + res2->length();
126
123
if (tmp_value.alloced_length() < concat_len)
218
215
continue; // Skip NULL
220
217
if (res->length() + sep_str->length() + res2->length() >
221
session.variables.max_allowed_packet)
218
current_session->variables.max_allowed_packet)
223
push_warning_printf(&session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
224
ER_WARN_ALLOWED_PACKET_OVERFLOWED,
225
ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED), func_name(),
226
session.variables.max_allowed_packet);
220
push_warning_printf(current_session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
221
ER_WARN_ALLOWED_PACKET_OVERFLOWED,
222
ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED), func_name(),
223
current_session->variables.max_allowed_packet);
229
226
if (res->alloced_length() >=
230
res->length() + sep_str->length() + res2->length())
227
res->length() + sep_str->length() + res2->length())
231
228
{ // Use old buffer
232
229
res->append(*sep_str); // res->length() > 0 always
233
230
res->append(*res2);
235
232
else if (str->alloced_length() >=
236
res->length() + sep_str->length() + res2->length())
233
res->length() + sep_str->length() + res2->length())
238
235
/* We have room in str; We can't get any errors here */
240
237
{ // This is quote uncommon!
241
str->replace(0,0,*sep_str);
242
str->replace(0,0,*res);
238
str->replace(0,0,*sep_str);
239
str->replace(0,0,*res);
247
str->append(*sep_str);
244
str->append(*sep_str);
251
248
use_as_buff= &tmp_value;
253
250
else if (res == &tmp_value)
255
252
if (res->append(*sep_str) || res->append(*res2))
256
goto null; // Must be a blob
253
goto null; // Must be a blob
258
255
else if (res2 == &tmp_value)
259
256
{ // This can happend only 1 time
260
257
if (tmp_value.replace(0,0,*sep_str) || tmp_value.replace(0,0,*res))
263
260
use_as_buff=str; // Put next arg here
265
262
else if (tmp_value.is_alloced() && res2->ptr() >= tmp_value.ptr() &&
266
res2->ptr() < tmp_value.ptr() + tmp_value.alloced_length())
263
res2->ptr() < tmp_value.ptr() + tmp_value.alloced_length())
269
This happens really seldom:
270
In this case res2 is sub string of tmp_value. We will
271
now work in place in tmp_value to set it to res | sep_str | res2
266
This happens really seldom:
267
In this case res2 is sub string of tmp_value. We will
268
now work in place in tmp_value to set it to res | sep_str | res2
273
270
/* Chop the last characters in tmp_value that isn't in res2 */
274
271
tmp_value.length((uint32_t) (res2->ptr() - tmp_value.ptr()) +
276
273
/* Place res2 at start of tmp_value, remove chars before res2 */
277
274
if (tmp_value.replace(0,(uint32_t) (res2->ptr() - tmp_value.ptr()),
279
tmp_value.replace(res->length(),0, *sep_str))
276
tmp_value.replace(res->length(),0, *sep_str))
282
279
use_as_buff=str; // Put next arg here
285
282
{ // Two big const strings
287
@note We should be prudent in the initial allocation unit -- the
284
NOTE: We should be prudent in the initial allocation unit -- the
288
285
size of the arguments is a function of data distribution, which can
289
286
be any. Instead of overcommitting at the first row, we grow the
290
287
allocated amount by the factor of 2. This ensures that no more than
291
288
25% of memory will be overcommitted on average.
294
size_t concat_len= res->length() + sep_str->length() + res2->length();
291
uint32_t concat_len= res->length() + sep_str->length() + res2->length();
296
293
if (tmp_value.alloced_length() < concat_len)
337
arg_count cannot be less than 2,
338
it is done on parser level in sql_yacc.yy
339
so, (arg_count - 2) is safe here.
334
arg_count cannot be less than 2,
335
it is done on parser level in sql_yacc.yy
336
so, (arg_count - 2) is safe here.
341
338
max_result_length= (uint64_t) args[0]->max_length * (arg_count - 2);
342
339
for (uint32_t i=1 ; i < arg_count ; i++)