1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-30 16:24:05 +03:00

MDEV-6661 PI() does not work well in UCS2/UTF16/UTF32 context

MDEV-6666 Malformed result for CONCAT(utf8_column, binary_string)

Item_static_string_func::safe_charset_converter() and 
Item_hex_string::safe_charset_converter() did not
handle character sets with mbminlen>1 properly, as well as
did not handle conversion from binary to multi-byte well.

Introducing Item::const_charset_converter(), to reuse it in a number
of Item_*::safe_charset_converter().
This commit is contained in:
Alexander Barkov
2014-09-01 20:57:32 +04:00
parent 18b307a7d2
commit 1427e1db99
16 changed files with 433 additions and 189 deletions

View File

@ -5323,3 +5323,15 @@ DROP TABLE t1;
#
# End of 5.6 tests
#
#
# Start of 10.0 tests
#
#
# MDEV-6661 PI() does not work well in UCS2/UTF16/UTF32 context
#
SELECT CONCAT(CONVERT('pi=' USING ucs2),PI()) AS PI;
PI
pi=3.141593
#
# End of 10.0 tests
#

View File

@ -2078,3 +2078,45 @@ DFFFFFDFFFFF9CFFFF9DFFFF9EFFFF
#
# End of 5.6 tests
#
#
# Start of 10.0 tests
#
#
# MDEV-6661 PI() does not work well in UCS2/UTF16/UTF32 context
#
SELECT CONCAT(CONVERT('pi=' USING utf16),PI()) AS PI;
PI
pi=3.141593
#
# MDEV-6666 Malformed result for CONCAT(utf8_column, binary_string)
#
SET NAMES utf8mb4;
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET utf16);
INSERT INTO t1 VALUES ('a');
SELECT CONCAT(a,0xD800) FROM t1;
ERROR HY000: Invalid utf16 character string: 'D800'
SELECT CONCAT(a,0xD800DC00) FROM t1;
CONCAT(a,0xD800DC00)
a𐀀
SELECT CONCAT(a,0x00FF) FROM t1;
CONCAT(a,0x00FF)
aÿ
DROP TABLE t1;
SELECT CONCAT(_utf16'a' COLLATE utf16_unicode_ci, _binary 0xD800);
ERROR HY000: Invalid utf16 character string: 'D800'
PREPARE stmt FROM "SELECT CONCAT(_utf16'a' COLLATE utf16_unicode_ci, ?)";
SET @arg00=_binary 0xD800;
EXECUTE stmt USING @arg00;
ERROR HY000: Invalid utf16 character string: 'D800'
SET @arg00=_binary 0xD800DC00;
EXECUTE stmt USING @arg00;
CONCAT(_utf16'a' COLLATE utf16_unicode_ci, ?)
a𐀀
SET @arg00=_binary 0x00FF;
EXECUTE stmt USING @arg00;
CONCAT(_utf16'a' COLLATE utf16_unicode_ci, ?)
aÿ
DEALLOCATE PREPARE stmt;
#
# End of 10.0 tests
#

View File

@ -2164,3 +2164,45 @@ DFFFFFDFFFFF9CFFFF9DFFFF9EFFFF
#
# End of 5.6 tests
#
#
# Start of 10.0 tests
#
#
# MDEV-6661 PI() does not work well in UCS2/UTF16/UTF32 context
#
SELECT CONCAT(CONVERT('pi=' USING utf32),PI()) AS PI;
PI
pi=3.141593
#
# MDEV-6666 Malformed result for CONCAT(utf8_column, binary_string)
#
SET NAMES utf8mb4;
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET utf32);
INSERT INTO t1 VALUES ('a');
SELECT CONCAT(a,0x20FFFF) FROM t1;
ERROR HY000: Invalid utf32 character string: '0020FF'
SELECT CONCAT(a,0x010000) FROM t1;
CONCAT(a,0x010000)
a𐀀
SELECT CONCAT(a,0x00FF) FROM t1;
CONCAT(a,0x00FF)
aÿ
DROP TABLE t1;
SELECT CONCAT(_utf32'a' COLLATE utf32_unicode_ci, _binary 0x20FFFF);
ERROR HY000: Invalid utf32 character string: '0020FF'
PREPARE stmt FROM "SELECT CONCAT(_utf32'a' COLLATE utf32_unicode_ci, ?)";
SET @arg00=_binary 0x20FFFF;
EXECUTE stmt USING @arg00;
ERROR HY000: Invalid utf32 character string: '0020FF'
SET @arg00=_binary 0x010000;
EXECUTE stmt USING @arg00;
CONCAT(_utf32'a' COLLATE utf32_unicode_ci, ?)
a𐀀
SET @arg00=_binary 0x00FF;
EXECUTE stmt USING @arg00;
CONCAT(_utf32'a' COLLATE utf32_unicode_ci, ?)
aÿ
DEALLOCATE PREPARE stmt;
#
# End of 10.0 tests
#

View File

@ -5933,3 +5933,27 @@ set max_sort_length=default;
#
# End of 5.6 tests
#
#
# Start of 10.0 tests
#
#
# MDEV-6666 Malformed result for CONCAT(utf8_column, binary_string)
#
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET utf8);
INSERT INTO t1 VALUES ('a');
SELECT CONCAT(a,0xFF) FROM t1;
ERROR HY000: Invalid utf8 character string: 'FF'
SELECT CONCAT(a,0xC3BF) FROM t1;
CONCAT(a,0xC3BF)
aÿ
DROP TABLE t1;
SELECT CONCAT('a' COLLATE utf8_unicode_ci, _binary 0xFF);
ERROR HY000: Invalid utf8 character string: 'FF'
PREPARE stmt FROM "SELECT CONCAT('a' COLLATE utf8_unicode_ci, ?)";
SET @arg00=_binary 0xFF;
EXECUTE stmt USING @arg00;
ERROR HY000: Invalid utf8 character string: 'FF'
DEALLOCATE PREPARE stmt;
#
# End of 10.0 tests
#

View File

@ -891,3 +891,17 @@ DROP TABLE t1;
--echo #
--echo # End of 5.6 tests
--echo #
--echo #
--echo # Start of 10.0 tests
--echo #
--echo #
--echo # MDEV-6661 PI() does not work well in UCS2/UTF16/UTF32 context
--echo #
SELECT CONCAT(CONVERT('pi=' USING ucs2),PI()) AS PI;
--echo #
--echo # End of 10.0 tests
--echo #

View File

@ -816,3 +816,39 @@ set collation_connection=utf16_bin;
--echo # End of 5.6 tests
--echo #
--echo #
--echo # Start of 10.0 tests
--echo #
--echo #
--echo # MDEV-6661 PI() does not work well in UCS2/UTF16/UTF32 context
--echo #
SELECT CONCAT(CONVERT('pi=' USING utf16),PI()) AS PI;
--echo #
--echo # MDEV-6666 Malformed result for CONCAT(utf8_column, binary_string)
--echo #
SET NAMES utf8mb4;
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET utf16);
INSERT INTO t1 VALUES ('a');
--error ER_INVALID_CHARACTER_STRING
SELECT CONCAT(a,0xD800) FROM t1;
SELECT CONCAT(a,0xD800DC00) FROM t1;
SELECT CONCAT(a,0x00FF) FROM t1;
DROP TABLE t1;
--error ER_INVALID_CHARACTER_STRING
SELECT CONCAT(_utf16'a' COLLATE utf16_unicode_ci, _binary 0xD800);
PREPARE stmt FROM "SELECT CONCAT(_utf16'a' COLLATE utf16_unicode_ci, ?)";
SET @arg00=_binary 0xD800;
--error ER_INVALID_CHARACTER_STRING
EXECUTE stmt USING @arg00;
SET @arg00=_binary 0xD800DC00;
EXECUTE stmt USING @arg00;
SET @arg00=_binary 0x00FF;
EXECUTE stmt USING @arg00;
DEALLOCATE PREPARE stmt;
--echo #
--echo # End of 10.0 tests
--echo #

View File

@ -1,4 +1,5 @@
-- source include/have_utf32.inc
-- source include/have_utf8mb4.inc
SET TIME_ZONE = '+03:00';
@ -918,3 +919,40 @@ set collation_connection=utf32_bin;
--echo #
--echo #
--echo # Start of 10.0 tests
--echo #
--echo #
--echo # MDEV-6661 PI() does not work well in UCS2/UTF16/UTF32 context
--echo #
SELECT CONCAT(CONVERT('pi=' USING utf32),PI()) AS PI;
--echo #
--echo # MDEV-6666 Malformed result for CONCAT(utf8_column, binary_string)
--echo #
SET NAMES utf8mb4;
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET utf32);
INSERT INTO t1 VALUES ('a');
--error ER_INVALID_CHARACTER_STRING
SELECT CONCAT(a,0x20FFFF) FROM t1;
SELECT CONCAT(a,0x010000) FROM t1;
SELECT CONCAT(a,0x00FF) FROM t1;
DROP TABLE t1;
--error ER_INVALID_CHARACTER_STRING
SELECT CONCAT(_utf32'a' COLLATE utf32_unicode_ci, _binary 0x20FFFF);
PREPARE stmt FROM "SELECT CONCAT(_utf32'a' COLLATE utf32_unicode_ci, ?)";
SET @arg00=_binary 0x20FFFF;
--error ER_INVALID_CHARACTER_STRING
EXECUTE stmt USING @arg00;
SET @arg00=_binary 0x010000;
EXECUTE stmt USING @arg00;
SET @arg00=_binary 0x00FF;
EXECUTE stmt USING @arg00;
DEALLOCATE PREPARE stmt;
--echo #
--echo # End of 10.0 tests
--echo #

View File

@ -1654,3 +1654,28 @@ set max_sort_length=default;
--echo # End of 5.6 tests
--echo #
--echo #
--echo # Start of 10.0 tests
--echo #
--echo #
--echo # MDEV-6666 Malformed result for CONCAT(utf8_column, binary_string)
--echo #
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET utf8);
INSERT INTO t1 VALUES ('a');
--error ER_INVALID_CHARACTER_STRING
SELECT CONCAT(a,0xFF) FROM t1;
SELECT CONCAT(a,0xC3BF) FROM t1;
DROP TABLE t1;
--error ER_INVALID_CHARACTER_STRING
SELECT CONCAT('a' COLLATE utf8_unicode_ci, _binary 0xFF);
PREPARE stmt FROM "SELECT CONCAT('a' COLLATE utf8_unicode_ci, ?)";
SET @arg00=_binary 0xFF;
--error ER_INVALID_CHARACTER_STRING
EXECUTE stmt USING @arg00;
DEALLOCATE PREPARE stmt;
--echo #
--echo # End of 10.0 tests
--echo #