mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
MDEV-33772 Bad SEPARATOR value in GROUP_CONCAT on character set conversion
Item_func_group_concat::print() did not take into account that Item_func_group_concat::separator can be of a different character set than the "String *str" (when the printing is being done to). Therefore, printing did not work correctly for: - non-ASCII separators when GROUP_CONCAT is done on 8bit data or multi-byte data with mbminlen==1. - all separators (even including simple ones like comma) when GROUP_CONCAT is done on ucs2/utf16/utf32 data (mbminlen>1). Because of this problem, VIEW definitions did not print correctly to their FRM files. This later led to a wrong SELECT and SHOW CREATE output. Fix: - Adding new String methods: bool append_for_single_quote_using_mb_wc(const char *str, size_t length, CHARSET_INFO *cs); bool append_for_single_quote_opt_convert(const char *str, size_t length, CHARSET_INFO *cs) which perform both escaping and character set conversion at the same time. - Adding a new String method escaped_wc_for_single_quote(), to reuse the code between the old and the new methods. - Fixing Item_func_group_concat::print() to use the new method append_for_single_quote_opt_convert().
This commit is contained in:
@ -1517,4 +1517,24 @@ deallocate prepare stmt;
|
||||
set join_cache_level=default;
|
||||
set group_concat_max_len=default;
|
||||
drop table t1,t2;
|
||||
#
|
||||
# MDEV-33772 Bad SEPARATOR value in GROUP_CONCAT on character set conversion
|
||||
#
|
||||
SET NAMES utf8, @@collation_connection=latin1_swedish_ci;
|
||||
CREATE TABLE t1 (c VARCHAR(10)) CHARACTER SET latin1;
|
||||
INSERT INTO t1 VALUES ('a'),('A');
|
||||
CREATE OR REPLACE VIEW v1 AS
|
||||
SELECT GROUP_CONCAT(c SEPARATOR 'ß') AS c1 FROM t1 GROUP BY c;
|
||||
SELECT * FROM v1;
|
||||
c1
|
||||
aßA
|
||||
SELECT HEX(c1) FROM v1;
|
||||
HEX(c1)
|
||||
61DF41
|
||||
SHOW CREATE VIEW v1;
|
||||
View Create View character_set_client collation_connection
|
||||
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select group_concat(`t1`.`c` separator 'ß') AS `c1` from `t1` group by `t1`.`c` utf8 latin1_swedish_ci
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
SET NAMES latin1;
|
||||
# End of 10.5 tests
|
||||
|
Reference in New Issue
Block a user