Skip to content

Commit 833f448

Browse files
committed
MDEV-27690 Crash on CHARACTER SET csname COLLATE DEFAULT in column definition
This is a temporary fix for 10.2. This problem was permanently fixed in 10.9 under terms of MDEV-27743. This patch should propagate up to 10.8 then null-merged to 10.9.
1 parent 4d1955d commit 833f448

File tree

3 files changed

+46
-8
lines changed

3 files changed

+46
-8
lines changed

mysql-test/r/ctype_collate.result

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,3 +754,20 @@ hex(b)
754754

755755
61
756756
drop table t1;
757+
#
758+
# Start of 10.2 tests
759+
#
760+
#
761+
# MDEV-27690 Crash on `CHARACTER SET csname COLLATE DEFAULT` in column definition
762+
#
763+
CREATE TABLE t1 (a CHAR(10) CHARACTER SET latin1 COLLATE DEFAULT);
764+
DROP TABLE t1;
765+
SELECT CAST('a' AS CHAR(10) CHARACTER SET latin1 COLLATE DEFAULT);
766+
CAST('a' AS CHAR(10) CHARACTER SET latin1 COLLATE DEFAULT)
767+
a
768+
SELECT COLUMN_GET(COLUMN_CREATE(0, 'string'),0 AS CHAR CHARACTER SET latin1 COLLATE DEFAULT) AS c1;
769+
c1
770+
string
771+
#
772+
# End of 10.2 tests
773+
#

mysql-test/t/ctype_collate.test

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,3 +339,20 @@ select hex(b) from t1 where b<'zzz' order by b;
339339

340340
drop table t1;
341341

342+
--echo #
343+
--echo # Start of 10.2 tests
344+
--echo #
345+
346+
--echo #
347+
--echo # MDEV-27690 Crash on `CHARACTER SET csname COLLATE DEFAULT` in column definition
348+
--echo #
349+
350+
CREATE TABLE t1 (a CHAR(10) CHARACTER SET latin1 COLLATE DEFAULT);
351+
DROP TABLE t1;
352+
SELECT CAST('a' AS CHAR(10) CHARACTER SET latin1 COLLATE DEFAULT);
353+
SELECT COLUMN_GET(COLUMN_CREATE(0, 'string'),0 AS CHAR CHARACTER SET latin1 COLLATE DEFAULT) AS c1;
354+
355+
356+
--echo #
357+
--echo # End of 10.2 tests
358+
--echo #

sql/sql_yacc.yy

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1916,6 +1916,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
19161916

19171917
%type <charset>
19181918
opt_collate
1919+
collate
19191920
charset_name
19201921
charset_or_alias
19211922
charset_name_or_default
@@ -6776,10 +6777,7 @@ charset_or_alias:
67766777
}
67776778
;
67786779

6779-
collate: COLLATE_SYM collation_name_or_default
6780-
{
6781-
Lex->charset= Lex->last_field->charset= $2;
6782-
}
6780+
collate: COLLATE_SYM collation_name_or_default { $$= $2; }
67836781
;
67846782

67856783
opt_binary:
@@ -6790,11 +6788,17 @@ opt_binary:
67906788
| BINARY charset_or_alias { bincmp_collation($2, true); }
67916789
| charset_or_alias collate
67926790
{
6793-
if (!my_charset_same(Lex->charset, $1))
6794-
my_yyabort_error((ER_COLLATION_CHARSET_MISMATCH, MYF(0),
6795-
Lex->charset->name, $1->csname));
6791+
if (!$2)
6792+
Lex->charset= $1; // CHARACTER SET cs COLLATE DEFAULT
6793+
else
6794+
{
6795+
if (!my_charset_same($2, $1))
6796+
my_yyabort_error((ER_COLLATION_CHARSET_MISMATCH, MYF(0),
6797+
$2->name, $1->csname));
6798+
Lex->charset= $2;
6799+
}
67966800
}
6797-
| collate { }
6801+
| collate { Lex->charset= $1; }
67986802
;
67996803

68006804
opt_bin_mod:

0 commit comments

Comments
 (0)