mirror of
https://github.com/MariaDB/server.git
synced 2025-08-07 00:04:31 +03:00
MDEV-29968 Functions in default values in tables with some character sets break SHOW CREATE (and mysqldump)
Item:print_for_table_def() uses QT_TO_SYSTEM_CHARSET to print the DEFAULT expression into FRM file during CREATE TABLE. Therefore, the expression is encoded in utf8 in FRM. get_field_default_value() erroneously used field->charset() to print the DEFAULT expression at SHOW CREATE TABLE time. Fixing get_field_default_value() to use &my_charset_utf8mb4_general_ci instead. This makes DEFAULT work in the way way with: - virtual column expressions: if (field->vcol_info) { StringBuffer<MAX_FIELD_WIDTH> str(&my_charset_utf8mb4_general_ci); field->vcol_info->print(&str); - check constraint expressions: if (field->check_constraint) { StringBuffer<MAX_FIELD_WIDTH> str(&my_charset_utf8mb4_general_ci); field->check_constraint->print(&str); Additional cleanup: Fixing system_charset_info to &my_charset_utf8mb4_general_ci in a few places to make non-BMP characters work in DEFAULT, virtual column, check constraint expressions.
This commit is contained in:
26
mysql-test/include/ctype_supplementary_chars.inc
Normal file
26
mysql-test/include/ctype_supplementary_chars.inc
Normal file
@@ -0,0 +1,26 @@
|
||||
--eval CREATE TABLE t1 (a CHAR(8) DEFAULT REVERSE('aha')) $table_charset
|
||||
SHOW CREATE TABLE t1;
|
||||
INSERT INTO t1 VALUES ();
|
||||
SELECT * FROM t1;
|
||||
|
||||
--eval CREATE TABLE t2 (a CHAR(8) DEFAULT REVERSE('åäá')) $table_charset
|
||||
SHOW CREATE TABLE t2;
|
||||
INSERT INTO t2 VALUES ();
|
||||
SELECT * FROM t2;
|
||||
|
||||
--eval CREATE TABLE t3 (a CHAR(8) DEFAULT REVERSE('😎😀')) $table_charset
|
||||
SHOW CREATE TABLE t3;
|
||||
INSERT INTO t3 VALUES ();
|
||||
SELECT * FROM t3;
|
||||
|
||||
--eval CREATE TABLE t4 (a CHAR(8), b CHAR(8) AS (REVERSE('😎😀'))) $table_charset
|
||||
SHOW CREATE TABLE t4;
|
||||
INSERT INTO t4 (a) VALUES ('');
|
||||
SELECT * FROM t4;
|
||||
|
||||
--eval CREATE TABLE t5 (a CHAR(8), b CHAR(8) CHECK (b=BINARY REVERSE('😎😀'))) $table_charset
|
||||
SHOW CREATE TABLE t5;
|
||||
--error ER_CONSTRAINT_FAILED
|
||||
INSERT INTO t5 VALUES ('','😎😀');
|
||||
INSERT INTO t5 VALUES ('','😀😎');
|
||||
SELECT * FROM t5;
|
Reference in New Issue
Block a user