1
0
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:
Alexander Barkov
2024-11-26 13:34:28 +04:00
parent f521b8ac21
commit 350cc77fee
24 changed files with 413 additions and 179 deletions

View 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;