Alexander Barkov
3a37afec29
MDEV-10306 Wrong results with combination of CONCAT, SUBSTR and CONVERT in subquery
...
The bug happens because of a combination of unfortunate circumstances:
1. Arguments args[0] and args[2] of Item_func_concat point recursively
(through Item_direct_view_ref's) to the same Item_func_conv_charset.
Both args[0]->args[0]->ref[0] and args[2]->args[0]->ref[0] refer to
this Item_func_conv_charset.
2. When Item_func_concat::args[0]->val_str() is called,
Item_func_conv_charset::val_str() writes its result to
Item_func_conc_charset::tmp_value.
3. Then, for optimization purposes (to avoid copying),
Item_func_substr::val_str() initializes Item_func_substr::tmp_value
to point to the buffer fragment owned by Item_func_conv_charset::tmp_value
Item_func_substr::tmp_value is returned as a result of
Item_func_concat::args[0]->val_str().
4. Due to optimization to avoid memory reallocs,
Item_func_concat::val_str() remembers the result of args[0]->val_str()
in "res" and further uses "res" to collect the return value.
5. When Item_func_concat::args[2]->val_str() is called,
Item_func_conv_charset::tmp_value gets overwritten (see #1 ),
which effectively overwrites args[0]'s Item_func_substr::tmp_value (see #3 ),
which effectively overwrites "res" (see #4 ).
This patch does the following:
a. Changes Item_func_conv_charset::val_str(String *str) to use
tmp_value and str the other way around. After this change tmp_value
is used to store a temporary result, while str is used to return the value.
The fixes the second problem (without SUBSTR):
SELECT CONCAT(t2,'-',t2) c2
FROM (SELECT CONVERT(t USING latin1) t2 FROM t1) sub;
As Item_func_concat::val_str() supplies two different buffers when calling
args[0]->val_str() and args[2]->val_str(), in the new reduction the result
created during args[0]->val_str() does not get overwritten by
args[2]->val_str().
b. Fixing the same problem in val_str() for similar classes
Item_func_to_base64
Item_func_from_base64
Item_func_weight_string
Item_func_hex
Item_func_unhex
Item_func_quote
Item_func_compress
Item_func_uncompress
Item_func_des_encrypt
Item_func_des_decrypt
Item_func_conv_charset
Item_func_reverse
Item_func_soundex
Item_func_aes_encrypt
Item_func_aes_decrypt
Item_func_buffer
c. Fixing Item_func::val_str_from_val_str_ascii() the same way.
Now Item_str_ascii_func::ascii_buff is used for temporary value,
while the parameter passed to val_str() is used to return the result.
This fixes the same problem when conversion (from ASCII to e.g. UCS2)
takes place. See the ctype_ucs.test for example queries that returned
wrong results before the fix.
d. Some Item_func descendand classes had temporary String buffers
(tmp_value and tmp_str), but did not really use them.
Removing these temporary buffers from:
Item_func_decode_histogram
Item_func_format
Item_func_binlog_gtid_pos
Item_func_spatial_collection:
e. Removing Item_func_buffer::tmp_value, because it's not used any more.
f. Renaming Item_func_[un]compress::buffer to "tmp_value",
for consistency with other classes.
Note, this patch does not fix the following classes
(although they have a similar problem):
Item_str_conv
Item_func_make_set
Item_char_typecast
They have a complex implementations and simple swapping between "tmp_value"
and "str" won't work. These classes will be fixed separately.
2017-06-19 12:45:32 +04:00
..
2013-10-29 15:08:44 +01:00
2014-02-01 09:33:26 +01:00
2016-04-24 18:15:20 +02:00
2014-05-09 12:35:11 +02:00
2017-02-26 23:01:23 +04:00
2014-01-27 12:11:04 +01:00
2013-09-18 17:25:10 +02:00
2016-04-22 16:04:20 +04:00
2015-07-29 13:51:22 +04:00
2015-05-04 22:00:24 +02:00
2015-05-03 11:51:22 +02:00
2016-12-19 14:28:08 +04:00
2016-04-20 08:53:30 +04:00
2014-06-06 00:07:27 +02:00
2014-12-02 20:35:45 +01:00
2016-12-04 01:59:35 +01:00
2014-03-26 09:41:16 +01:00
2014-02-25 16:04:35 +01:00
2014-01-29 15:37:17 +02:00
2014-06-11 10:09:29 +02:00
2016-12-04 01:59:35 +01:00
2017-06-15 14:42:41 +04:00
2014-03-19 15:15:57 +02:00
2016-10-26 14:12:02 +04:00
2014-03-10 14:08:12 +02:00
2017-01-06 17:09:59 +02:00
2014-09-23 15:58:54 +04:00
2016-12-19 14:28:08 +04:00
2013-10-28 12:17:46 +04:00
2016-04-02 00:04:47 +04:00
2013-12-09 12:37:45 +01:00
2014-09-23 15:58:54 +04:00
2014-08-12 17:16:51 +05:30
2014-05-09 12:35:11 +02:00
2016-12-19 14:28:08 +04:00
2015-03-13 16:12:54 +04:00
2014-09-24 17:27:00 +04:00
2014-05-09 12:35:11 +02:00
2015-12-07 09:20:31 +02:00
2014-09-12 12:57:27 +04:00
2014-09-23 15:58:54 +04:00
2014-04-25 17:10:25 +04:00
2016-12-19 14:28:08 +04:00
2013-10-28 12:17:46 +04:00
2013-12-11 16:37:53 +04:00
2013-11-12 16:48:57 +04:00
2013-11-12 16:48:57 +04:00
2013-10-28 12:17:46 +04:00
2014-09-11 22:42:35 +03:00
2016-06-10 15:50:19 +04:00
2014-09-23 15:58:54 +04:00
2014-09-12 16:06:18 +04:00
2014-04-25 17:10:25 +04:00
2015-04-24 11:00:34 +04:00
2015-05-04 22:00:24 +02:00
2017-01-06 17:09:59 +02:00
2017-01-06 17:09:59 +02:00
2017-06-19 12:45:32 +04:00
2014-09-24 17:27:00 +04:00
2015-05-04 22:00:24 +02:00
2016-12-19 14:28:08 +04:00
2016-02-15 22:50:59 +01:00
2016-02-15 22:50:59 +01:00
2016-02-15 22:50:59 +01:00
2013-12-20 12:42:33 +04:00
2016-11-29 06:51:12 +04:00
2017-01-06 17:09:59 +02:00
2014-05-09 12:35:11 +02:00
2017-01-12 03:37:13 +02:00
2014-04-25 17:10:25 +04:00
2014-05-09 12:35:11 +02:00
2017-01-12 03:37:13 +02:00
2014-04-24 16:59:01 +04:00
2016-11-10 18:15:36 +04:00
2016-03-21 11:43:19 +01:00
2013-09-25 19:41:53 +02:00
2013-09-25 19:41:53 +02:00
2015-03-06 18:41:32 +01:00
2017-05-20 00:59:40 +02:00
2017-03-03 01:37:54 +02:00
2014-04-22 14:39:57 -07:00
2016-10-27 00:04:26 +04:00
2015-12-16 11:09:54 +01:00
2015-08-13 01:28:15 +03:00
2015-02-18 15:16:27 +01:00
2016-06-21 21:26:31 +04:00
2017-04-21 18:34:06 +02:00
2016-03-04 02:09:37 +02:00
2015-10-21 16:31:11 +03:00
2017-01-06 17:09:59 +02:00
2013-12-18 11:08:21 +01:00
2015-10-06 15:54:37 +03:00
2013-11-21 16:29:46 +04:00
2016-12-04 01:59:35 +01:00
2014-11-18 22:26:14 +01:00
2014-03-16 19:21:37 +01:00
2015-04-29 11:29:25 +02:00
2014-11-11 16:01:13 +01:00
2015-04-27 15:42:12 +02:00
2014-02-02 10:00:36 +01:00
2014-09-11 16:42:54 +02:00
2015-01-21 12:03:02 +01:00
2016-04-26 12:58:14 +02:00
2016-12-03 22:03:38 +01:00
2015-12-13 00:10:40 +01:00
2014-11-18 15:42:48 +01:00
2017-06-19 12:45:32 +04:00
2017-06-19 12:45:32 +04:00
2013-11-21 15:19:25 -08:00
2015-07-31 13:05:10 +04:00
2014-04-22 14:39:57 -07:00
2016-08-08 18:37:02 +04:00
2015-09-04 15:56:58 +02:00
2016-06-20 14:11:01 +04:00
2013-12-17 13:23:05 +04:00
2016-08-10 19:19:05 +02:00
2016-08-10 19:19:05 +02:00
2015-05-14 14:43:37 +04:00
2017-05-15 22:23:10 +02:00
2014-03-20 23:26:50 +01:00
2013-09-21 10:14:42 +02:00
2015-02-22 12:54:52 +01:00
2016-02-15 22:50:59 +01:00
2013-11-03 16:31:52 +01:00
2014-11-02 01:08:09 +04:00
2013-09-21 10:14:42 +02:00
2017-01-06 17:09:59 +02:00
2013-10-23 20:25:52 +04:00
2015-05-05 13:22:09 +04:00
2015-05-05 13:22:09 +04:00
2013-11-21 14:25:28 +01:00
2014-07-01 00:30:24 +05:00
2014-10-08 18:10:31 +04:00
2017-06-19 12:45:32 +04:00
2016-07-18 11:50:08 +04:00
2013-09-20 13:12:53 +04:00
2016-04-24 18:15:20 +02:00
2013-11-03 16:31:52 +01:00
2013-10-18 11:38:13 -07:00
2013-10-18 11:38:13 -07:00
2013-10-16 13:38:42 +04:00
2013-11-03 16:31:52 +01:00
2017-03-03 01:37:54 +02:00
2016-12-08 02:03:34 +05:30
2014-01-26 21:49:19 +01:00
2016-12-09 16:33:48 +01:00
2016-09-27 09:21:19 +02:00
2016-12-04 01:59:35 +01:00
2016-08-21 20:18:39 +03:00
2013-12-12 19:18:49 +04:00
2015-05-04 22:00:24 +02:00
2016-06-21 21:26:31 +04:00
2013-09-18 11:17:16 +04:00
2014-07-08 19:38:26 +02:00
2014-02-25 01:18:13 +04:00
2017-01-06 17:09:59 +02:00
2016-12-04 01:59:35 +01:00
2015-10-08 10:01:43 +02:00
2014-03-07 15:21:07 +01:00
2016-12-20 17:42:08 +04:00
2016-07-25 01:57:00 +03:00
2014-03-12 12:34:47 +01:00
2016-12-04 01:59:35 +01:00
2015-10-22 07:23:59 +02:00
2016-08-21 20:18:39 +03:00
2017-04-21 18:34:06 +02:00
2015-08-03 23:09:43 +03:00
2014-10-29 13:22:48 +03:00
2014-07-31 12:03:20 +02:00
2016-12-04 01:59:35 +01:00
2016-06-14 13:55:28 +02:00
2016-08-21 20:18:39 +03:00
2014-12-18 00:13:16 +01:00
2016-04-22 10:25:16 +05:30
2014-08-06 11:47:26 +02:00
2017-01-06 17:09:59 +02:00
2017-02-24 09:40:53 -08:00
2017-02-24 09:40:53 -08:00
2013-09-21 10:14:42 +02:00
2017-05-29 13:15:36 +03:00
2017-05-29 13:15:36 +03:00
2016-08-21 20:18:39 +03:00
2015-01-19 14:07:51 +01:00
2016-12-04 01:59:35 +01:00
2016-06-14 14:44:09 +04:00
2015-01-19 14:07:41 +01:00
2014-12-15 13:01:11 +02:00
2013-09-16 18:14:46 +04:00
2017-05-17 15:42:36 +03:00
2017-04-21 18:34:06 +02:00
2015-08-18 12:24:27 +05:30
2016-06-21 14:11:02 +02:00
2014-09-16 11:28:46 +05:30
2014-03-26 19:56:23 +01:00
2015-05-04 22:00:24 +02:00
2017-01-06 17:09:59 +02:00
2015-05-04 22:00:24 +02:00
2016-11-09 19:27:35 +01:00
2015-01-15 20:15:50 +04:00
2015-10-28 21:32:07 +01:00
2016-10-26 18:44:34 +02:00
2016-12-04 01:59:35 +01:00
2014-06-25 12:35:50 +02:00
2014-03-23 15:43:57 +02:00
2014-03-23 15:43:57 +02:00
2014-01-31 12:06:28 +02:00
2016-04-19 11:27:00 +02:00
2015-08-24 01:37:21 +03:00
2014-05-08 10:25:24 +02:00
2016-02-09 11:28:59 +01:00
2016-09-27 09:21:19 +02:00
2016-12-04 01:59:35 +01:00
2016-12-04 01:59:35 +01:00
2016-06-21 18:48:14 +02:00
2017-05-15 22:23:10 +02:00
2016-08-10 19:19:05 +02:00
2014-07-09 13:09:41 +04:00
2017-04-21 18:34:06 +02:00
2014-02-01 00:54:03 +01:00
2015-05-12 20:27:26 +05:30
2015-12-29 14:17:31 +04:00
2017-03-03 20:12:48 +02:00
2016-12-04 01:59:35 +01:00
2014-06-06 00:07:27 +02:00
2014-07-19 13:38:40 +03:00
2016-10-14 01:12:04 +02:00
2015-11-07 22:03:47 +05:30
2015-06-05 10:44:10 +04:00
2015-05-04 22:00:24 +02:00
2015-05-04 22:00:24 +02:00
2016-02-15 22:50:59 +01:00
2015-10-21 16:31:11 +03:00
2016-02-06 11:45:23 +01:00
2016-10-13 21:38:32 +02:00
2013-09-25 19:41:41 +02:00
2016-08-10 19:19:05 +02:00
2016-06-18 10:46:55 +04:00
2016-04-26 23:05:26 +02:00
2016-10-14 01:12:04 +02:00
2017-04-21 18:34:06 +02:00
2013-09-25 21:07:06 +03:00
2016-10-25 16:41:43 +02:00
2016-10-26 18:44:34 +02:00
2014-03-26 09:42:52 +01:00
2014-03-21 14:05:44 +01:00
2016-08-21 20:18:39 +03:00
2014-11-02 01:08:09 +04:00
2014-10-20 16:42:00 +04:00
2016-07-12 12:21:38 +02:00
2014-11-19 18:54:02 +01:00
2014-11-19 18:54:02 +01:00
2014-07-22 15:52:49 +04:00
2014-07-09 13:09:41 +04:00
2014-11-18 22:27:31 +01:00
2017-01-06 17:09:59 +02:00
2014-04-23 17:01:35 +02:00
2016-12-09 16:33:48 +01:00
2015-09-14 09:56:17 +02:00
2014-02-06 16:27:55 +01:00
2014-03-21 14:05:44 +01:00
2015-10-09 17:12:26 +02:00
2014-01-29 15:37:17 +02:00
2016-08-21 20:18:39 +03:00
2015-02-18 14:07:13 +02:00
2017-03-03 01:37:54 +02:00
2017-03-03 01:37:54 +02:00
2015-06-16 23:58:40 +02:00
2014-03-11 16:45:08 +01:00
2016-02-01 19:36:22 +03:00
2016-11-25 14:55:01 +05:30
2015-07-10 07:54:55 +05:30
2014-03-23 17:00:29 +02:00
2016-12-04 01:59:35 +01:00
2014-01-22 15:29:36 +01:00
2013-10-18 11:38:13 -07:00
2013-11-19 13:16:25 +01:00
2014-06-30 19:24:25 +05:30
2015-07-10 07:54:55 +05:30
2014-02-01 00:54:03 +01:00
2014-07-28 09:42:52 +02:00
2013-11-11 09:31:09 +01:00
2014-01-28 11:12:43 +04:00
2015-07-29 13:51:22 +04:00
2017-01-04 13:03:30 +02:00
2015-01-06 16:32:41 +01:00
2016-07-12 22:20:46 +02:00
2014-06-02 12:33:17 +04:00
2014-06-02 12:33:17 +04:00
2014-06-02 12:33:17 +04:00
2014-06-02 12:33:17 +04:00
2015-10-11 17:21:51 -04:00
2014-01-29 15:37:17 +02:00
2015-04-27 14:33:25 +05:30
2013-11-12 15:02:25 +01:00
2017-03-03 01:37:54 +02:00
2013-10-17 19:01:57 +03:00
2014-01-27 12:10:53 +01:00
2015-06-09 18:56:51 +03:00
2016-08-10 19:19:05 +02:00
2017-03-03 01:37:54 +02:00
2017-03-03 01:37:54 +02:00
2016-08-10 19:19:05 +02:00
2014-01-20 19:09:01 +01:00
2015-05-08 11:20:43 +02:00
2014-07-09 13:36:28 +02:00
2016-02-06 11:45:23 +01:00
2016-04-19 11:27:00 +02:00
2016-02-15 13:02:21 +01:00
2016-08-21 20:18:39 +03:00
2016-08-21 20:18:39 +03:00
2016-08-21 20:18:39 +03:00
2016-11-29 11:29:07 -08:00
2015-09-21 17:32:37 +03:00
2016-11-29 11:29:07 -08:00
2016-04-19 11:27:00 +02:00
2014-10-07 11:55:39 +02:00
2015-01-19 14:07:41 +01:00
2014-02-03 15:22:39 +01:00
2016-04-26 23:05:26 +02:00
2015-12-08 09:46:51 +01:00
2013-11-10 17:51:06 +01:00
2014-09-07 20:19:12 +02:00
2016-08-21 20:18:39 +03:00
2015-10-21 16:31:11 +03:00
2015-02-17 18:07:56 +01:00
2013-12-09 12:37:45 +01:00
2014-09-06 09:46:41 +02:00
2014-09-16 14:03:17 +02:00
2015-05-04 22:00:24 +02:00
2015-08-04 23:40:25 +02:00
2015-05-04 22:00:24 +02:00
2017-01-06 10:46:21 +01:00
2014-03-20 23:26:41 +01:00
2016-04-23 00:28:50 +04:00
2017-02-27 10:12:17 +01:00
2015-06-09 22:16:26 +02:00
2015-06-09 22:16:26 +02:00
2016-07-12 12:21:38 +02:00
2016-02-09 11:27:40 +01:00
2016-07-12 12:21:38 +02:00
2016-04-20 19:03:59 +02:00
2016-07-12 12:21:38 +02:00
2016-07-12 12:36:11 +02:00
2014-03-11 17:37:46 +02:00
2015-11-18 21:31:45 +03:00
2014-03-28 00:32:53 +04:00
2014-03-28 00:32:53 +04:00
2014-03-28 00:32:53 +04:00
2014-03-28 00:32:53 +04:00
2014-03-28 00:32:53 +04:00
2014-08-04 21:36:02 +02:00
2015-11-18 21:31:45 +03:00
2015-01-17 16:58:10 +00:00
2015-11-09 17:58:35 +03:00
2016-08-21 20:18:39 +03:00
2016-08-21 20:18:39 +03:00
2017-01-06 17:09:59 +02:00
2017-04-21 18:34:06 +02:00
2017-04-21 18:34:06 +02:00
2017-04-21 18:34:06 +02:00
2016-08-21 20:18:39 +03:00
2013-11-13 13:38:37 +01:00
2017-04-21 14:34:24 -07:00
2016-02-15 22:50:59 +01:00
2015-03-06 18:41:32 +01:00
2017-04-25 16:30:39 +02:00
2017-05-15 10:00:00 -07:00
2017-04-21 14:34:24 -07:00
2017-01-06 17:09:59 +02:00
2017-01-06 17:09:59 +02:00
2017-01-06 17:09:59 +02:00
2017-01-06 17:09:59 +02:00
2017-01-06 17:09:59 +02:00
2015-08-18 22:54:42 +03:00
2017-05-17 15:42:36 +03:00
2015-08-18 22:54:42 +03:00
2017-05-20 00:59:40 +02:00
2017-04-21 14:34:24 -07:00
2017-05-20 00:59:40 +02:00
2017-01-06 17:09:59 +02:00
2017-03-14 00:25:26 +02:00
2017-03-14 00:25:26 +02:00
2017-04-21 18:34:06 +02:00
2013-11-13 22:58:10 +01:00
2015-11-14 07:21:03 +02:00
2015-11-14 07:21:03 +02:00
2015-11-14 07:21:03 +02:00
2015-11-12 22:21:47 +03:00
2017-03-03 01:37:54 +02:00
2015-02-28 23:58:05 +02:00
2014-07-08 19:39:27 +02:00
2016-07-18 11:50:08 +04:00
2014-04-22 11:23:35 +04:00
2014-03-07 00:21:25 +04:00
2013-09-13 14:43:10 +04:00
2013-09-13 14:43:10 +04:00
2015-02-26 23:09:54 +02:00
2013-10-29 15:08:44 +01:00
2015-01-27 13:13:55 +05:30
2014-03-20 00:44:35 +01:00
2015-06-04 18:04:31 +03:00
2015-07-16 16:28:06 +04:00
2014-08-05 11:47:58 +02:00
2014-08-05 11:47:58 +02:00
2015-12-29 15:18:55 +04:00
2016-08-10 19:19:05 +02:00
2014-03-07 00:21:25 +04:00
2016-06-16 14:57:32 +04:00
2016-12-05 10:28:20 +01:00
2014-11-19 12:08:35 +04:00
2014-11-18 16:33:29 +04:00
2014-11-18 16:33:29 +04:00
2016-12-04 01:59:35 +01:00
2014-11-19 12:08:35 +04:00
2014-06-11 10:08:08 +02:00
2015-06-15 11:11:42 +04:00
2014-10-09 10:30:11 +02:00
2015-05-05 13:22:09 +04:00
2016-04-26 23:05:26 +02:00
2016-09-27 09:21:19 +02:00
2014-11-18 16:33:29 +04:00
2014-02-13 16:41:08 +04:00
2015-12-08 09:46:52 +01:00
2014-02-14 14:09:29 +01:00
2016-12-20 11:25:47 +01:00
2015-04-29 14:16:03 +03:00
2015-06-06 16:13:51 +02:00
2016-08-21 20:18:39 +03:00
2013-11-04 21:47:54 +01:00
2014-03-16 13:59:44 +01:00
2013-11-11 16:17:32 +01:00
2014-09-16 14:03:17 +02:00
2015-02-22 12:54:52 +01:00
2014-03-24 08:18:01 +02:00
2017-06-15 19:20:35 +03:00
2016-10-26 18:44:34 +02:00
2014-10-21 16:25:35 +05:30
2014-05-09 12:35:11 +02:00
2016-08-04 13:14:45 +03:00