Skip to content

Commit

Permalink
MDEV-28769 Assertion `(m_ci->state & 32) || m_with_collate' failed in…
Browse files Browse the repository at this point in the history
… Lex_exact_charset_opt_extended_collate::Lex_exact_charset_opt_extended_collate on SET NAMES

These system variables:
  @@character_set_client
  @@character_set_connection
  @@character_set_database
  @@character_set_filesystem
  @@character_set_results
  @@character_set_server

can now be set in numeric format only to IDs of default collations, e.g.:

SET @@character_set_xxx=9;  -- OK    (latin2_general_ci  is default)
SET @@character_set_xxx=2;  -- ERROR (latin2_czech_cs is not default)
SET @@character_set_xxx=21; -- ERROR (latin2_hungarian_ci is not default)

Before this change the server accepted IDs of non-default collations
so all three examples above worked without errors,
but this could lead to unexpected behavior in later statements.
  • Loading branch information
abarkov committed Jun 16, 2022
1 parent 9fe784f commit a923d6f
Show file tree
Hide file tree
Showing 13 changed files with 157 additions and 78 deletions.
27 changes: 15 additions & 12 deletions mysql-test/suite/sys_vars/r/character_set_client_basic.result
Expand Up @@ -383,10 +383,9 @@ SET @@character_set_client = 1;
SELECT @@character_set_client;
@@character_set_client
big5
# latin2_czech_cs is not a default collation
SET @@character_set_client = 2;
SELECT @@character_set_client;
@@character_set_client
latin2
ERROR 42000: Unknown character set: '2'
SET @@character_set_client = 3;
SELECT @@character_set_client;
@@character_set_client
Expand All @@ -395,20 +394,19 @@ SET @@character_set_client = 36;
SELECT @@character_set_client;
@@character_set_client
cp866
# cp1250_polish_ci is not a default collation
SET @@character_set_client = 99;
SELECT @@character_set_client;
@@character_set_client
cp1250
ERROR 42000: Unknown character set: '99'
# Collation ID 100 does not exist
SET @@character_set_client = 100;
ERROR 42000: Unknown character set: '100'
SET @@global.character_set_client = 1;
SELECT @@global.character_set_client;
@@global.character_set_client
big5
# latin2_czech_cs is not a default collation
SET @@global.character_set_client = 2;
SELECT @@global.character_set_client;
@@global.character_set_client
latin2
ERROR 42000: Unknown character set: '2'
SET @@global.character_set_client = 3;
SELECT @@global.character_set_client;
@@global.character_set_client
Expand All @@ -417,10 +415,10 @@ SET @@global.character_set_client = 36;
SELECT @@global.character_set_client;
@@global.character_set_client
cp866
# cp1250_polish_ci is not a default collation
SET @@global.character_set_client = 99;
SELECT @@global.character_set_client;
@@global.character_set_client
cp1250
ERROR 42000: Unknown character set: '99'
# Collation ID 100 does not exist
SET @@global.character_set_client = 100;
ERROR 42000: Unknown character set: '100'
SET @total_charset = (SELECT count(*) FROM INFORMATION_SCHEMA.CHARACTER_SETS);
Expand Down Expand Up @@ -497,5 +495,10 @@ SELECT @@session.character_set_client =
WHERE VARIABLE_NAME='character_set_client') AS res;
res
1
#
# MDEV-28769 Assertion `(m_ci->state & 32) || m_with_collate' failed in Lex_exact_charset_opt_extended_collate::Lex_exact_charset_opt_extended_collate on SET NAMES
#
SET GLOBAL character_set_client=2;
ERROR 42000: Unknown character set: '2'
SET @@global.character_set_client = @global_start_value;
SET @@session.character_set_client = @session_start_value;
26 changes: 14 additions & 12 deletions mysql-test/suite/sys_vars/r/character_set_connection_basic.result
Expand Up @@ -378,10 +378,9 @@ SET @@character_set_connection = 1;
SELECT @@character_set_connection;
@@character_set_connection
big5
# latin2_czech_cs is not a default collation
SET @@character_set_connection = 2;
SELECT @@character_set_connection;
@@character_set_connection
latin2
ERROR 42000: Unknown character set: '2'
SET @@character_set_connection = 3;
SELECT @@character_set_connection;
@@character_set_connection
Expand All @@ -390,20 +389,19 @@ SET @@character_set_connection = 36;
SELECT @@character_set_connection;
@@character_set_connection
cp866
# cp1250_polish_ci is not a default collation
SET @@character_set_connection = 99;
SELECT @@character_set_connection;
@@character_set_connection
cp1250
ERROR 42000: Unknown character set: '99'
# Collation ID 100 does not exist
SET @@character_set_connection = 100;
ERROR 42000: Unknown character set: '100'
SET @@global.character_set_connection = 1;
SELECT @@global.character_set_connection;
@@global.character_set_connection
big5
# latin2_czech_cs is not a default collation
SET @@global.character_set_connection = 2;
SELECT @@global.character_set_connection;
@@global.character_set_connection
latin2
ERROR 42000: Unknown character set: '2'
SET @@global.character_set_connection = 3;
SELECT @@global.character_set_connection;
@@global.character_set_connection
Expand All @@ -412,10 +410,10 @@ SET @@global.character_set_connection = 36;
SELECT @@global.character_set_connection;
@@global.character_set_connection
cp866
# cp1250_polish_ci is not a default collation
SET @@global.character_set_connection = 99;
SELECT @@global.character_set_connection;
@@global.character_set_connection
cp1250
ERROR 42000: Unknown character set: '99'
# Collation ID 100 does not exist
SET @@global.character_set_connection = 100;
ERROR 42000: Unknown character set: '100'
SET @total_charset = (SELECT count(*) FROM INFORMATION_SCHEMA.CHARACTER_SETS);
Expand All @@ -435,8 +433,12 @@ SET @@character_set_connection = -1;
ERROR 42000: Unknown character set: '-1'
SET @@character_set_connection = 'utf8 ';
ERROR 42000: Unknown character set: 'utf8 '
SET @@character_set_connection=cp1250;
SET @@character_set_connection = 'l�tin2';
ERROR 42000: Unknown character set: 'l�tin2'
SET @@character_set_connection=cp866;
SET @@character_set_connection = 'l�tin2';
ERROR 42000: Unknown character set: 'l?tin2'
SET @@character_set_connection = true;
SELECT @@character_set_connection AS res_with_true;
res_with_true
Expand Down
22 changes: 10 additions & 12 deletions mysql-test/suite/sys_vars/r/character_set_database_basic.result
Expand Up @@ -380,10 +380,9 @@ SET @@character_set_database = 1;
SELECT @@character_set_database;
@@character_set_database
big5
# latin2_czech_cs is not a default collation
SET @@character_set_database = 2;
SELECT @@character_set_database;
@@character_set_database
latin2
ERROR 42000: Unknown character set: '2'
SET @@character_set_database = 3;
SELECT @@character_set_database;
@@character_set_database
Expand All @@ -392,20 +391,19 @@ SET @@character_set_database = 36;
SELECT @@character_set_database;
@@character_set_database
cp866
# cp1250_polish_ci is not a default collation
SET @@character_set_database = 99;
SELECT @@character_set_database;
@@character_set_database
cp1250
ERROR 42000: Unknown character set: '99'
# Collation ID 100 does not exist
SET @@character_set_database = 100;
ERROR 42000: Unknown character set: '100'
SET @@global.character_set_database = 1;
SELECT @@global.character_set_database;
@@global.character_set_database
big5
# latin2_czech_cs is not a default collation
SET @@global.character_set_database = 2;
SELECT @@global.character_set_database;
@@global.character_set_database
latin2
ERROR 42000: Unknown character set: '2'
SET @@global.character_set_database = 3;
SELECT @@global.character_set_database;
@@global.character_set_database
Expand All @@ -414,10 +412,10 @@ SET @@global.character_set_database = 36;
SELECT @@global.character_set_database;
@@global.character_set_database
cp866
# cp1250_polish_ci is not a default collation
SET @@global.character_set_database = 99;
SELECT @@global.character_set_database;
@@global.character_set_database
cp1250
ERROR 42000: Unknown character set: '99'
# Collation ID 100 does not exist
SET @@global.character_set_database = 100;
ERROR 42000: Unknown character set: '100'
SET @total_charset = (SELECT count(*) FROM INFORMATION_SCHEMA.CHARACTER_SETS);
Expand Down
Expand Up @@ -379,10 +379,9 @@ SET @@character_set_filesystem = 1;
SELECT @@character_set_filesystem;
@@character_set_filesystem
big5
# latin2_czech_cs is not a default collation
SET @@character_set_filesystem = 2;
SELECT @@character_set_filesystem;
@@character_set_filesystem
latin2
ERROR 42000: Unknown character set: '2'
SET @@character_set_filesystem = 3;
SELECT @@character_set_filesystem;
@@character_set_filesystem
Expand All @@ -391,10 +390,10 @@ SET @@character_set_filesystem = 36;
SELECT @@character_set_filesystem;
@@character_set_filesystem
cp866
# cp1250_polish_ci is not a default collation
SET @@character_set_filesystem = 99;
SELECT @@character_set_filesystem;
@@character_set_filesystem
cp1250
ERROR 42000: Unknown character set: '99'
# Collation ID 100 does not exist
SET @@character_set_filesystem = 100;
ERROR 42000: Unknown character set: '100'
SET @total_charset = (SELECT count(*) FROM INFORMATION_SCHEMA.CHARACTER_SETS);
Expand Down
Binary file modified mysql-test/suite/sys_vars/r/character_set_results_basic.result
Binary file not shown.
22 changes: 10 additions & 12 deletions mysql-test/suite/sys_vars/r/character_set_server_basic.result
Expand Up @@ -382,10 +382,9 @@ SET @@character_set_server = 1;
SELECT @@character_set_server;
@@character_set_server
big5
# latin2_czech_cs is not a default collation
SET @@character_set_server = 2;
SELECT @@character_set_server;
@@character_set_server
latin2
ERROR 42000: Unknown character set: '2'
SET @@character_set_server = 3;
SELECT @@character_set_server;
@@character_set_server
Expand All @@ -394,28 +393,27 @@ SET @@character_set_server = 36;
SELECT @@character_set_server;
@@character_set_server
cp866
# cp1250_polish_ci is not a default collation
SET @@character_set_server = 99;
SELECT @@character_set_server;
@@character_set_server
cp1250
ERROR 42000: Unknown character set: '99'
# Collation ID 100 does not exist
SET @@character_set_server = 100;
ERROR 42000: Unknown character set: '100'
SET @@global.character_set_server = 1;
SELECT @@global.character_set_server;
@@global.character_set_server
big5
# latin2_czech_cs is not a default collation
SET @@global.character_set_server = 2;
SELECT @@global.character_set_server;
@@global.character_set_server
latin2
ERROR 42000: Unknown character set: '2'
SET @@global.character_set_server = 36;
SELECT @@global.character_set_server;
@@global.character_set_server
cp866
# cp1250_polish_ci is not a default collation
SET @@global.character_set_server = 99;
SELECT @@global.character_set_server;
@@global.character_set_server
cp1250
ERROR 42000: Unknown character set: '99'
# Collation ID 100 does not exist
SET @@global.character_set_server = 100;
ERROR 42000: Unknown character set: '100'
'#--------------------FN_DYNVARS_009_10-------------------------#'
Expand Down
28 changes: 23 additions & 5 deletions mysql-test/suite/sys_vars/t/character_set_client_basic.test
Expand Up @@ -229,33 +229,44 @@ SELECT @@global.character_set_client;
##############################################################
SET @@character_set_client = 1;
SELECT @@character_set_client;

--echo # latin2_czech_cs is not a default collation
--error ER_UNKNOWN_CHARACTER_SET
SET @@character_set_client = 2;
SELECT @@character_set_client;

SET @@character_set_client = 3;
SELECT @@character_set_client;
SET @@character_set_client = 36;
SELECT @@character_set_client;

--echo # cp1250_polish_ci is not a default collation
--error ER_UNKNOWN_CHARACTER_SET
SET @@character_set_client = 99;
SELECT @@character_set_client;

--echo # Collation ID 100 does not exist
--Error ER_UNKNOWN_CHARACTER_SET
SET @@character_set_client = 100;

SET @@global.character_set_client = 1;
SELECT @@global.character_set_client;

--echo # latin2_czech_cs is not a default collation
--error ER_UNKNOWN_CHARACTER_SET
SET @@global.character_set_client = 2;
SELECT @@global.character_set_client;

SET @@global.character_set_client = 3;
SELECT @@global.character_set_client;
SET @@global.character_set_client = 36;
SELECT @@global.character_set_client;

--echo # cp1250_polish_ci is not a default collation
--error ER_UNKNOWN_CHARACTER_SET
SET @@global.character_set_client = 99;
SELECT @@global.character_set_client;

--echo # Collation ID 100 does not exist
--Error ER_UNKNOWN_CHARACTER_SET
SET @@global.character_set_client = 100;


SET @total_charset = (SELECT count(*) FROM INFORMATION_SCHEMA.CHARACTER_SETS);
SELECT @total_charset;

Expand Down Expand Up @@ -332,6 +343,13 @@ SELECT @@session.character_set_client =
(SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES
WHERE VARIABLE_NAME='character_set_client') AS res;

--echo #
--echo # MDEV-28769 Assertion `(m_ci->state & 32) || m_with_collate' failed in Lex_exact_charset_opt_extended_collate::Lex_exact_charset_opt_extended_collate on SET NAMES
--echo #

--error ER_UNKNOWN_CHARACTER_SET
SET GLOBAL character_set_client=2;

####################################
# Restore initial value #
####################################
Expand Down
24 changes: 20 additions & 4 deletions mysql-test/suite/sys_vars/t/character_set_connection_basic.test
Expand Up @@ -155,30 +155,42 @@ SELECT @@global.character_set_connection;
##############################################################
SET @@character_set_connection = 1;
SELECT @@character_set_connection;

--echo # latin2_czech_cs is not a default collation
--error ER_UNKNOWN_CHARACTER_SET
SET @@character_set_connection = 2;
SELECT @@character_set_connection;

SET @@character_set_connection = 3;
SELECT @@character_set_connection;
SET @@character_set_connection = 36;
SELECT @@character_set_connection;

--echo # cp1250_polish_ci is not a default collation
--error ER_UNKNOWN_CHARACTER_SET
SET @@character_set_connection = 99;
SELECT @@character_set_connection;

--echo # Collation ID 100 does not exist
--Error ER_UNKNOWN_CHARACTER_SET
SET @@character_set_connection = 100;


SET @@global.character_set_connection = 1;
SELECT @@global.character_set_connection;

--echo # latin2_czech_cs is not a default collation
--error ER_UNKNOWN_CHARACTER_SET
SET @@global.character_set_connection = 2;
SELECT @@global.character_set_connection;

SET @@global.character_set_connection = 3;
SELECT @@global.character_set_connection;
SET @@global.character_set_connection = 36;
SELECT @@global.character_set_connection;

--echo # cp1250_polish_ci is not a default collation
--error ER_UNKNOWN_CHARACTER_SET
SET @@global.character_set_connection = 99;
SELECT @@global.character_set_connection;

--echo # Collation ID 100 does not exist
--Error ER_UNKNOWN_CHARACTER_SET
SET @@global.character_set_connection = 100;

Expand All @@ -201,6 +213,10 @@ SET @@character_set_connection = 1.1;
SET @@character_set_connection = -1;
--Error ER_UNKNOWN_CHARACTER_SET
SET @@character_set_connection = 'utf8 ';
SET @@character_set_connection=cp1250;
--Error ER_UNKNOWN_CHARACTER_SET
SET @@character_set_connection = 'l�tin2';
SET @@character_set_connection=cp866;
--Error ER_UNKNOWN_CHARACTER_SET
SET @@character_set_connection = 'l�tin2';
SET @@character_set_connection = true;
Expand Down

0 comments on commit a923d6f

Please sign in to comment.