summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Barkov <bar@mariadb.com>2022-04-14 12:22:28 +0400
committerAlexander Barkov <bar@mariadb.com>2022-04-14 12:22:28 +0400
commit83516a33a8397ba537b6e85f0a386ade73f2e8f7 (patch)
tree314ee398767f44835dc91241f2d4d81efcdb8320
parent9d734cdd61e4174589031431138bed2f85472a58 (diff)
downloadmariadb-git-83516a33a8397ba537b6e85f0a386ade73f2e8f7.tar.gz
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.
-rw-r--r--mysql-test/suite/compat/oracle/r/misc.result23
-rw-r--r--mysql-test/suite/compat/oracle/t/misc.test28
-rw-r--r--sql/sql_yacc_ora.yy20
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,6 +1,29 @@
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 <charset>
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: