Skip to content

Commit 5de0b57

Browse files
committed
Bug#27760787: ERROR IN SQL SYNTAX WHEN USING "DEFAULT" KEYWORD IN ALTER TABLE COMMAND
The syntax ALTER TABLE ... CONVERT CHARACTER SET TO DEFAULT is documented, however it was removed by a mistake. The current patch restores that feature in 8.0.
1 parent 6b55e03 commit 5de0b57

File tree

3 files changed

+225
-5
lines changed

3 files changed

+225
-5
lines changed

mysql-test/r/parser.result

Lines changed: 109 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2225,8 +2225,6 @@ ALTER DATABASE db COLLATE DEFAULT;
22252225
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DEFAULT' at line 1
22262226
ALTER TABLE t COLLATE DEFAULT;
22272227
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DEFAULT' at line 1
2228-
ALTER TABLE t CONVERT TO CHARSET DEFAULT;
2229-
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DEFAULT' at line 1
22302228
SET NAMES utf8 COLLATE DEFAULT;
22312229
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DEFAULT' at line 1
22322230
SET NAMES DEFAULT COLLATE DEFAULT;
@@ -2261,3 +2259,112 @@ ERROR 42000: You have an error in your SQL syntax; check the manual that corresp
22612259
#
22622260
CREATE TEMPORARY TABLE admin (admin INT);
22632261
DROP TABLE admin;
2262+
#
2263+
# Bug#27760787: ERROR IN SQL SYNTAX WHEN USING "DEFAULT" KEYWORD IN
2264+
# ALTER TABLE COMMAND
2265+
SELECT @@default_collation_for_utf8mb4;
2266+
@@default_collation_for_utf8mb4
2267+
utf8mb4_0900_ai_ci
2268+
#########################################################################
2269+
#
2270+
# 1. @@default_collation_for_utf8mb4 does not matter:
2271+
#
2272+
#########################################################################
2273+
CREATE DATABASE db1 CHARSET cp1251 COLLATE cp1251_general_ci;
2274+
USE db1;
2275+
CREATE TABLE t1 (i INT) CHARSET utf8mb4;
2276+
#
2277+
# Implicit COLLATE:
2278+
#
2279+
ALTER TABLE t1 CONVERT TO CHARACTER SET DEFAULT;
2280+
SHOW CREATE TABLE t1;
2281+
Table Create Table
2282+
t1 CREATE TABLE `t1` (
2283+
`i` int(11) DEFAULT NULL
2284+
) ENGINE=InnoDB DEFAULT CHARSET=cp1251
2285+
#
2286+
# Explicit COLLATE:
2287+
#
2288+
ALTER TABLE t1 CONVERT TO CHARACTER SET DEFAULT COLLATE cp1251_bin;
2289+
SHOW CREATE TABLE t1;
2290+
Table Create Table
2291+
t1 CREATE TABLE `t1` (
2292+
`i` int(11) DEFAULT NULL
2293+
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin
2294+
DROP DATABASE db1;
2295+
#########################################################################
2296+
#
2297+
# 2. @@default_collation_for_utf8mb4 == utf8mb4_general_ci
2298+
# @@collation_database == utf8mb4_0900_ai_ci
2299+
#
2300+
#########################################################################
2301+
SET @@default_collation_for_utf8mb4 = utf8mb4_general_ci;
2302+
Warnings:
2303+
Warning 1681 Updating 'default_collation_for_utf8mb4' is deprecated. It will be made read-only in a future release.
2304+
CREATE DATABASE db2 COLLATE utf8mb4_0900_ai_ci;
2305+
USE db2;
2306+
CREATE TABLE t2 (i INT) CHARSET latin1;
2307+
#
2308+
# Implicit COLLATE result in utf8mb4_0900_ai_ci (@@collation_database):
2309+
#
2310+
ALTER TABLE t2 CONVERT TO CHARACTER SET DEFAULT;
2311+
SHOW CREATE TABLE t2;
2312+
Table Create Table
2313+
t2 CREATE TABLE `t2` (
2314+
`i` int(11) DEFAULT NULL
2315+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
2316+
# Cleanup:
2317+
ALTER TABLE t2 CONVERT TO CHARACTER SET latin1;
2318+
#
2319+
# Explicit COLLATE should result in utf8mb4_bin:
2320+
#
2321+
ALTER TABLE t2 CONVERT TO CHARACTER SET DEFAULT COLLATE utf8mb4_bin;
2322+
SHOW CREATE TABLE t2;
2323+
Table Create Table
2324+
t2 CREATE TABLE `t2` (
2325+
`i` int(11) DEFAULT NULL
2326+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
2327+
DROP DATABASE db2;
2328+
#########################################################################
2329+
#
2330+
# 3. @@default_collation_for_utf8mb4 == utf8mb4_0900_ai_ci
2331+
# @@collation_database == utf8mb4_general_ci
2332+
#
2333+
#########################################################################
2334+
SET @@default_collation_for_utf8mb4 = DEFAULT;
2335+
Warnings:
2336+
Warning 1681 Updating 'default_collation_for_utf8mb4' is deprecated. It will be made read-only in a future release.
2337+
SELECT @@default_collation_for_utf8mb4;
2338+
@@default_collation_for_utf8mb4
2339+
utf8mb4_0900_ai_ci
2340+
CREATE DATABASE db3 COLLATE utf8mb4_general_ci;
2341+
USE db3;
2342+
CREATE TABLE t3 (i INT) CHARSET latin1;
2343+
#
2344+
# Implicit COLLATE should result in utf8mb4_general_ci (@@collation_database):
2345+
#
2346+
ALTER TABLE t3 CONVERT TO CHARACTER SET DEFAULT;
2347+
SHOW CREATE TABLE t3;
2348+
Table Create Table
2349+
t3 CREATE TABLE `t3` (
2350+
`i` int(11) DEFAULT NULL
2351+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
2352+
#
2353+
# Explicit COLLATE should result in utf8mb4_bin:
2354+
#
2355+
ALTER TABLE t3 CONVERT TO CHARACTER SET DEFAULT COLLATE utf8mb4_bin;
2356+
SHOW CREATE TABLE t3;
2357+
Table Create Table
2358+
t3 CREATE TABLE `t3` (
2359+
`i` int(11) DEFAULT NULL
2360+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
2361+
#########################################################################
2362+
#
2363+
# 4. Incompatible character set in @@character_set_database and COLLATE should fail:
2364+
#
2365+
#########################################################################
2366+
ALTER TABLE t3 CONVERT TO CHARACTER SET DEFAULT COLLATE cp1251_general_cs;
2367+
ERROR 42000: COLLATION 'cp1251_general_cs' is not valid for CHARACTER SET 'utf8mb4'
2368+
DROP DATABASE db3;
2369+
# Cleanup
2370+
USE test;

mysql-test/t/parser.test

Lines changed: 110 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2127,9 +2127,6 @@ ALTER DATABASE db COLLATE DEFAULT;
21272127
--error ER_PARSE_ERROR
21282128
ALTER TABLE t COLLATE DEFAULT;
21292129

2130-
--error ER_PARSE_ERROR
2131-
ALTER TABLE t CONVERT TO CHARSET DEFAULT;
2132-
21332130
--error ER_PARSE_ERROR
21342131
SET NAMES utf8 COLLATE DEFAULT;
21352132

@@ -2178,3 +2175,113 @@ CREATE FUNCTION f1() RETURNS CHAR(1) COLLATE DEFAULT RETURN '';
21782175

21792176
CREATE TEMPORARY TABLE admin (admin INT);
21802177
DROP TABLE admin;
2178+
2179+
2180+
--echo #
2181+
--echo # Bug#27760787: ERROR IN SQL SYNTAX WHEN USING "DEFAULT" KEYWORD IN
2182+
--echo # ALTER TABLE COMMAND
2183+
2184+
SELECT @@default_collation_for_utf8mb4;
2185+
2186+
--echo #########################################################################
2187+
--echo #
2188+
--echo # 1. @@default_collation_for_utf8mb4 does not matter:
2189+
--echo #
2190+
--echo #########################################################################
2191+
2192+
CREATE DATABASE db1 CHARSET cp1251 COLLATE cp1251_general_ci;
2193+
USE db1;
2194+
CREATE TABLE t1 (i INT) CHARSET utf8mb4;
2195+
2196+
--echo #
2197+
--echo # Implicit COLLATE:
2198+
--echo #
2199+
2200+
ALTER TABLE t1 CONVERT TO CHARACTER SET DEFAULT;
2201+
SHOW CREATE TABLE t1;
2202+
2203+
--echo #
2204+
--echo # Explicit COLLATE:
2205+
--echo #
2206+
2207+
ALTER TABLE t1 CONVERT TO CHARACTER SET DEFAULT COLLATE cp1251_bin;
2208+
SHOW CREATE TABLE t1;
2209+
2210+
DROP DATABASE db1;
2211+
2212+
--echo #########################################################################
2213+
--echo #
2214+
--echo # 2. @@default_collation_for_utf8mb4 == utf8mb4_general_ci
2215+
--echo # @@collation_database == utf8mb4_0900_ai_ci
2216+
--echo #
2217+
--echo #########################################################################
2218+
2219+
SET @@default_collation_for_utf8mb4 = utf8mb4_general_ci;
2220+
2221+
CREATE DATABASE db2 COLLATE utf8mb4_0900_ai_ci;
2222+
USE db2;
2223+
2224+
CREATE TABLE t2 (i INT) CHARSET latin1;
2225+
2226+
--echo #
2227+
--echo # Implicit COLLATE result in utf8mb4_0900_ai_ci (@@collation_database):
2228+
--echo #
2229+
2230+
ALTER TABLE t2 CONVERT TO CHARACTER SET DEFAULT;
2231+
SHOW CREATE TABLE t2;
2232+
2233+
--echo # Cleanup:
2234+
ALTER TABLE t2 CONVERT TO CHARACTER SET latin1;
2235+
2236+
--echo #
2237+
--echo # Explicit COLLATE should result in utf8mb4_bin:
2238+
--echo #
2239+
2240+
ALTER TABLE t2 CONVERT TO CHARACTER SET DEFAULT COLLATE utf8mb4_bin;
2241+
SHOW CREATE TABLE t2;
2242+
2243+
DROP DATABASE db2;
2244+
2245+
--echo #########################################################################
2246+
--echo #
2247+
--echo # 3. @@default_collation_for_utf8mb4 == utf8mb4_0900_ai_ci
2248+
--echo # @@collation_database == utf8mb4_general_ci
2249+
--echo #
2250+
--echo #########################################################################
2251+
2252+
SET @@default_collation_for_utf8mb4 = DEFAULT;
2253+
SELECT @@default_collation_for_utf8mb4;
2254+
2255+
CREATE DATABASE db3 COLLATE utf8mb4_general_ci;
2256+
USE db3;
2257+
2258+
CREATE TABLE t3 (i INT) CHARSET latin1;
2259+
2260+
--echo #
2261+
--echo # Implicit COLLATE should result in utf8mb4_general_ci (@@collation_database):
2262+
--echo #
2263+
2264+
ALTER TABLE t3 CONVERT TO CHARACTER SET DEFAULT;
2265+
SHOW CREATE TABLE t3;
2266+
2267+
--echo #
2268+
--echo # Explicit COLLATE should result in utf8mb4_bin:
2269+
--echo #
2270+
2271+
ALTER TABLE t3 CONVERT TO CHARACTER SET DEFAULT COLLATE utf8mb4_bin;
2272+
SHOW CREATE TABLE t3;
2273+
2274+
--echo #########################################################################
2275+
--echo #
2276+
--echo # 4. Incompatible character set in @@character_set_database and COLLATE should fail:
2277+
--echo #
2278+
--echo #########################################################################
2279+
2280+
--error ER_COLLATION_CHARSET_MISMATCH
2281+
ALTER TABLE t3 CONVERT TO CHARACTER SET DEFAULT COLLATE cp1251_general_cs;
2282+
2283+
DROP DATABASE db3;
2284+
2285+
--echo # Cleanup
2286+
2287+
USE test;

sql/sql_yacc.yy

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7843,6 +7843,12 @@ alter_list_item:
78437843
{
78447844
$$= NEW_PTN PT_alter_table_convert_to_charset($4, $5);
78457845
}
7846+
| CONVERT_SYM TO_SYM character_set DEFAULT_SYM opt_collate
7847+
{
7848+
$$ = NEW_PTN PT_alter_table_convert_to_charset(
7849+
YYTHD->variables.collation_database,
7850+
$5 ? $5 : YYTHD->variables.collation_database);
7851+
}
78467852
| FORCE_SYM
78477853
{
78487854
$$= NEW_PTN PT_alter_table_force;

0 commit comments

Comments
 (0)