From 83516a33a8397ba537b6e85f0a386ade73f2e8f7 Mon Sep 17 00:00:00 2001 From: Alexander Barkov Date: Thu, 14 Apr 2022 12:22:28 +0400 Subject: An additional patch for MDEV-27690 Crash on `CHARACTER SET csname COLLATE DEFAULT` in column definition Applying the fix to sql_yacc_ora.yy. Adding a test for sql_mode=ORACLE. --- mysql-test/suite/compat/oracle/r/misc.result | 23 +++++++++++++++++++++++ mysql-test/suite/compat/oracle/t/misc.test | 28 ++++++++++++++++++++++++++++ sql/sql_yacc_ora.yy | 20 ++++++++++++-------- 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/mysql-test/suite/compat/oracle/r/misc.result b/mysql-test/suite/compat/oracle/r/misc.result index 38f38bd07e6..fed7e26c31b 100644 --- a/mysql-test/suite/compat/oracle/r/misc.result +++ b/mysql-test/suite/compat/oracle/r/misc.result @@ -1,5 +1,25 @@ SET sql_mode=ORACLE; # +# Start of 10.2 tests +# +# +# MDEV-27690 Crash on `CHARACTER SET csname COLLATE DEFAULT` in column definition +# +CREATE TABLE t1 (a CHAR(10) CHARACTER SET latin1 COLLATE DEFAULT); +DROP TABLE t1; +SELECT CAST('a' AS CHAR(10) CHARACTER SET latin1 COLLATE DEFAULT); +CAST('a' AS CHAR(10) CHARACTER SET latin1 COLLATE DEFAULT) +a +SELECT COLUMN_GET(COLUMN_CREATE(0, 'string'),0 AS CHAR CHARACTER SET latin1 COLLATE DEFAULT) AS c1; +c1 +string +# +# End of 10.2 tests +# +# +# Start of 10.3 tests +# +# # MDEV-12086 sql_mode=ORACLE: allow SELECT UNIQUE as a synonym for SELECT DISTINCT # CREATE TABLE t1 (a INT); @@ -10,3 +30,6 @@ a 20 30 DROP TABLE t1; +# +# End of 10.3 tests +# diff --git a/mysql-test/suite/compat/oracle/t/misc.test b/mysql-test/suite/compat/oracle/t/misc.test index d939b20f8a0..b3fdfdf3851 100644 --- a/mysql-test/suite/compat/oracle/t/misc.test +++ b/mysql-test/suite/compat/oracle/t/misc.test @@ -1,5 +1,28 @@ SET sql_mode=ORACLE; +--echo # +--echo # Start of 10.2 tests +--echo # + +--echo # +--echo # MDEV-27690 Crash on `CHARACTER SET csname COLLATE DEFAULT` in column definition +--echo # + +CREATE TABLE t1 (a CHAR(10) CHARACTER SET latin1 COLLATE DEFAULT); +DROP TABLE t1; +SELECT CAST('a' AS CHAR(10) CHARACTER SET latin1 COLLATE DEFAULT); +SELECT COLUMN_GET(COLUMN_CREATE(0, 'string'),0 AS CHAR CHARACTER SET latin1 COLLATE DEFAULT) AS c1; + +--echo # +--echo # End of 10.2 tests +--echo # + + + +--echo # +--echo # Start of 10.3 tests +--echo # + --echo # --echo # MDEV-12086 sql_mode=ORACLE: allow SELECT UNIQUE as a synonym for SELECT DISTINCT --echo # @@ -8,3 +31,8 @@ CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (10),(20),(20),(30),(30),(30); SELECT UNIQUE a FROM t1; DROP TABLE t1; + + +--echo # +--echo # End of 10.3 tests +--echo # diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index f0e6b5b54c7..ea7ba454d0b 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -1438,6 +1438,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %type opt_collate + collate charset_name charset_or_alias charset_name_or_default @@ -7466,10 +7467,7 @@ charset_or_alias: } ; -collate: COLLATE_SYM collation_name_or_default - { - Lex->charset= $2; - } +collate: COLLATE_SYM collation_name_or_default { $$= $2; } ; opt_binary: @@ -7484,11 +7482,17 @@ binary: | BINARY charset_or_alias { bincmp_collation($2, true); } | charset_or_alias collate { - if (!my_charset_same(Lex->charset, $1)) - my_yyabort_error((ER_COLLATION_CHARSET_MISMATCH, MYF(0), - Lex->charset->name, $1->csname)); + if (!$2) + Lex->charset= $1; // CHARACTER SET cs COLLATE DEFAULT + else + { + if (!my_charset_same($2, $1)) + my_yyabort_error((ER_COLLATION_CHARSET_MISMATCH, MYF(0), + $2->name, $1->csname)); + Lex->charset= $2; + } } - | collate { } + | collate { Lex->charset= $1; } ; opt_bin_mod: -- cgit v1.2.1