48
48
if (res->length() == 0)
50
50
if (!(res=args[i]->val_str(str)))
55
55
if (!(res2=args[i]->val_str(use_as_buff)))
57
57
if (res2->length() == 0)
59
59
if (res->length()+res2->length() >
60
current_session->variables.max_allowed_packet)
60
session.variables.max_allowed_packet)
62
push_warning_printf(current_session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
63
ER_WARN_ALLOWED_PACKET_OVERFLOWED,
64
ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED), func_name(),
65
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);
68
68
if (!is_const && res->alloced_length() >= res->length()+res2->length())
69
69
{ // Use old buffer
72
72
else if (str->alloced_length() >= res->length()+res2->length())
75
str->replace(0,0,*res);
75
str->replace(0,0,*res);
82
82
use_as_buff= &tmp_value;
84
84
else if (res == &tmp_value)
86
if (res->append(*res2)) // Must be a blob
86
if (res->append(*res2)) // Must be a blob
89
89
else if (res2 == &tmp_value)
90
90
{ // This can happend only 1 time
91
if (tmp_value.replace(0,0,*res))
94
use_as_buff=str; // Put next arg here
91
if (tmp_value.replace(0,0,*res))
94
use_as_buff=str; // Put next arg here
96
96
else if (tmp_value.is_alloced() && res2->ptr() >= tmp_value.ptr() &&
97
res2->ptr() <= tmp_value.ptr() + tmp_value.alloced_length())
97
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
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
115
115
{ // Two big const strings
117
NOTE: We should be prudent in the initial allocation unit -- the
117
@note We should be prudent in the initial allocation unit -- the
118
118
size of the arguments is a function of data distribution, which
119
119
can be any. Instead of overcommitting at the first row, we grow
120
120
the allocated amount by the factor of 2. This ensures that no
218
218
continue; // Skip NULL
220
220
if (res->length() + sep_str->length() + res2->length() >
221
current_session->variables.max_allowed_packet)
221
session.variables.max_allowed_packet)
223
push_warning_printf(current_session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
224
ER_WARN_ALLOWED_PACKET_OVERFLOWED,
225
ER(ER_WARN_ALLOWED_PACKET_OVERFLOWED), func_name(),
226
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);
229
229
if (res->alloced_length() >=
230
res->length() + sep_str->length() + res2->length())
230
res->length() + sep_str->length() + res2->length())
231
231
{ // Use old buffer
232
232
res->append(*sep_str); // res->length() > 0 always
233
233
res->append(*res2);
235
235
else if (str->alloced_length() >=
236
res->length() + sep_str->length() + res2->length())
236
res->length() + sep_str->length() + res2->length())
238
238
/* We have room in str; We can't get any errors here */
240
240
{ // This is quote uncommon!
241
str->replace(0,0,*sep_str);
242
str->replace(0,0,*res);
241
str->replace(0,0,*sep_str);
242
str->replace(0,0,*res);
247
str->append(*sep_str);
247
str->append(*sep_str);
251
251
use_as_buff= &tmp_value;
253
253
else if (res == &tmp_value)
255
255
if (res->append(*sep_str) || res->append(*res2))
256
goto null; // Must be a blob
256
goto null; // Must be a blob
258
258
else if (res2 == &tmp_value)
259
259
{ // This can happend only 1 time
260
260
if (tmp_value.replace(0,0,*sep_str) || tmp_value.replace(0,0,*res))
263
263
use_as_buff=str; // Put next arg here
265
265
else if (tmp_value.is_alloced() && res2->ptr() >= tmp_value.ptr() &&
266
res2->ptr() < tmp_value.ptr() + tmp_value.alloced_length())
266
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
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
273
273
/* Chop the last characters in tmp_value that isn't in res2 */
274
274
tmp_value.length((uint32_t) (res2->ptr() - tmp_value.ptr()) +
276
276
/* Place res2 at start of tmp_value, remove chars before res2 */
277
277
if (tmp_value.replace(0,(uint32_t) (res2->ptr() - tmp_value.ptr()),
279
tmp_value.replace(res->length(),0, *sep_str))
279
tmp_value.replace(res->length(),0, *sep_str))
282
282
use_as_buff=str; // Put next arg here
285
285
{ // Two big const strings
287
NOTE: We should be prudent in the initial allocation unit -- the
287
@note We should be prudent in the initial allocation unit -- the
288
288
size of the arguments is a function of data distribution, which can
289
289
be any. Instead of overcommitting at the first row, we grow the
290
290
allocated amount by the factor of 2. This ensures that no more than
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.
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.
341
341
max_result_length= (uint64_t) args[0]->max_length * (arg_count - 2);
342
342
for (uint32_t i=1 ; i < arg_count ; i++)