diff --git a/include/mysql_com.h b/include/mysql_com.h index 3b1dee91a6e..91d33d33226 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -71,6 +71,7 @@ #define COLUMN_COMMENT_MAXLEN 1024 #define INDEX_COMMENT_MAXLEN 1024 #define TABLE_PARTITION_COMMENT_MAXLEN 1024 +#define DATABASE_COMMENT_MAXLEN 1024 /* Maximum length of protocol packet. diff --git a/mysql-test/main/comment_database.result b/mysql-test/main/comment_database.result new file mode 100644 index 00000000000..02dd24574db --- /dev/null +++ b/mysql-test/main/comment_database.result @@ -0,0 +1,78 @@ +# +# MDEV-307: Add functionality for database comments +# +CREATE DATABASE db1 COMMENT=; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1 +CREATE DATABASE db1 +COMMENT='abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcd'; +SHOW CREATE DATABASE db1; +Database Create Database +db1 CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET latin1 */ COMMENT 'abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcd' +SELECT schema_comment, char_length(schema_comment) +FROM information_schema.schemata +WHERE schema_name='db1'; +schema_comment char_length(schema_comment) +abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcd 1024 +DROP DATABASE db1; +SET SQL_MODE=''; +CREATE DATABASE db1 +COMMENT='abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcde'; +Warnings: +Warning 4144 Comment for database 'db1' is too long (max = 1024) +SHOW CREATE DATABASE db1; +Database Create Database +db1 CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET latin1 */ COMMENT 'abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcd' +SELECT schema_comment, char_length(schema_comment) +FROM information_schema.schemata +WHERE schema_name='db1'; +schema_comment char_length(schema_comment) +abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcd 1024 +DROP DATABASE db1; +SET SQL_MODE='TRADITIONAL'; +CREATE DATABASE db1 +COMMENT='abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcde'; +ERROR HY000: Comment for database 'db1' is too long (max = 1024) +SELECT schema_comment, char_length(schema_comment) +FROM information_schema.schemata +WHERE schema_name='db1'; +schema_comment char_length(schema_comment) +CREATE DATABASE db1 COMMENT 'db1'; +SHOW CREATE DATABASE db1; +Database Create Database +db1 CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET latin1 */ COMMENT 'db1' +ALTER DATABASE db1 COMMENT = "db1 comment"; +SELECT * FROM information_schema.schemata +WHERE schema_name='db1'; +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT +def db1 latin1 latin1_swedish_ci NULL db1 comment +DROP DATABASE db1; +CREATE DATABASE db1; +USE db1; +ALTER DATABASE COMMENT 'db1 comment' CHARACTER SET 'utf8'; +SHOW CREATE DATABASE db1; +Database Create Database +db1 CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8 */ COMMENT 'db1 comment' +ALTER DATABASE db1 COMMENT 'this is db1 comment'; +SHOW CREATE DATABASE db1; +Database Create Database +db1 CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET utf8 */ COMMENT 'this is db1 comment' +ALTER DATABASE CHARACTER SET 'latin1'; +SHOW CREATE DATABASE db1; +Database Create Database +db1 CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET latin1 */ COMMENT 'this is db1 comment' +DROP DATABASE db1; +CREATE DATABASE comment COMMENT 'comment' CHARACTER SET 'latin2'; +SHOW CREATE DATABASE comment; +Database Create Database +comment CREATE DATABASE `comment` /*!40100 DEFAULT CHARACTER SET latin2 */ COMMENT 'comment' +ALTER DATABASE comment COMMENT 'comment comment'; +SHOW CREATE DATABASE comment; +Database Create Database +comment CREATE DATABASE `comment` /*!40100 DEFAULT CHARACTER SET latin2 */ COMMENT 'comment comment' +USE comment; +ALTER DATABASE COMMENT 'comment'; +SELECT * FROM information_schema.schemata +WHERE schema_name='comment'; +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT +def comment latin2 latin2_general_ci NULL comment +DROP DATABASE comment; diff --git a/mysql-test/main/comment_database.test b/mysql-test/main/comment_database.test new file mode 100644 index 00000000000..3fe1c7b205c --- /dev/null +++ b/mysql-test/main/comment_database.test @@ -0,0 +1,63 @@ +--echo # +--echo # MDEV-307: Add functionality for database comments +--echo # + +# Check an error state +--error ER_PARSE_ERROR +CREATE DATABASE db1 COMMENT=; + +# 1024 bytes +CREATE DATABASE db1 +COMMENT='abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcd'; +SHOW CREATE DATABASE db1; +SELECT schema_comment, char_length(schema_comment) +FROM information_schema.schemata +WHERE schema_name='db1'; +DROP DATABASE db1; + +# 1025 bytes (warning) +SET SQL_MODE=''; +CREATE DATABASE db1 +COMMENT='abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcde'; +SHOW CREATE DATABASE db1; +SELECT schema_comment, char_length(schema_comment) +FROM information_schema.schemata +WHERE schema_name='db1'; +DROP DATABASE db1; +SET SQL_MODE='TRADITIONAL'; + +# 1025 bytes (error) +--error ER_TOO_LONG_DATABASE_COMMENT +CREATE DATABASE db1 +COMMENT='abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcde'; +SELECT schema_comment, char_length(schema_comment) +FROM information_schema.schemata +WHERE schema_name='db1'; + +CREATE DATABASE db1 COMMENT 'db1'; +SHOW CREATE DATABASE db1; +ALTER DATABASE db1 COMMENT = "db1 comment"; +SELECT * FROM information_schema.schemata +WHERE schema_name='db1'; +DROP DATABASE db1; + +CREATE DATABASE db1; +USE db1; +ALTER DATABASE COMMENT 'db1 comment' CHARACTER SET 'utf8'; +SHOW CREATE DATABASE db1; +ALTER DATABASE db1 COMMENT 'this is db1 comment'; +SHOW CREATE DATABASE db1; +ALTER DATABASE CHARACTER SET 'latin1'; +SHOW CREATE DATABASE db1; +DROP DATABASE db1; + +# Test the case when the database is named 'comment' +CREATE DATABASE comment COMMENT 'comment' CHARACTER SET 'latin2'; +SHOW CREATE DATABASE comment; +ALTER DATABASE comment COMMENT 'comment comment'; +SHOW CREATE DATABASE comment; +USE comment; +ALTER DATABASE COMMENT 'comment'; +SELECT * FROM information_schema.schemata +WHERE schema_name='comment'; +DROP DATABASE comment; diff --git a/mysql-test/main/information_schema.result b/mysql-test/main/information_schema.result index b4d2d065d4a..9e9c92e31be 100644 --- a/mysql-test/main/information_schema.result +++ b/mysql-test/main/information_schema.result @@ -10,11 +10,11 @@ grant select, update on test.* to mysqltest_1@localhost; create user mysqltest_3@localhost; create user mysqltest_3; select * from information_schema.SCHEMATA where schema_name > 'm'; -CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH -def mtr latin1 latin1_swedish_ci NULL -def mysql latin1 latin1_swedish_ci NULL -def performance_schema utf8 utf8_general_ci NULL -def test latin1 latin1_swedish_ci NULL +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT +def mtr latin1 latin1_swedish_ci NULL +def mysql latin1 latin1_swedish_ci NULL +def performance_schema utf8 utf8_general_ci NULL +def test latin1 latin1_swedish_ci NULL select schema_name from information_schema.schemata; schema_name information_schema @@ -1575,14 +1575,14 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE b ALL NULL NULL NULL NULL NULL Using where; Open_frm_only; Scanned all databases; Using join buffer (flat, BNL join) SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'mysqltest'; -CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ''; -CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'test'; -CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH -def test latin1 latin1_swedish_ci NULL +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT +def test latin1 latin1_swedish_ci NULL select count(*) from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA='mysql' AND TABLE_NAME='nonexisting'; count(*) 0 @@ -1627,7 +1627,7 @@ CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME UNIQUE_CONSTRAINT_CATALOG U select * from `information_schema`.`REFERENTIAL_CONSTRAINTS` where `TABLE_NAME` = NULL; CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME UNIQUE_CONSTRAINT_CATALOG UNIQUE_CONSTRAINT_SCHEMA UNIQUE_CONSTRAINT_NAME MATCH_OPTION UPDATE_RULE DELETE_RULE TABLE_NAME REFERENCED_TABLE_NAME select * from information_schema.schemata where schema_name = NULL; -CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT select * from `information_schema`.`STATISTICS` where `TABLE_SCHEMA` = NULL; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME NON_UNIQUE INDEX_SCHEMA INDEX_NAME SEQ_IN_INDEX COLUMN_NAME COLLATION CARDINALITY SUB_PART PACKED NULLABLE INDEX_TYPE COMMENT INDEX_COMMENT select * from `information_schema`.`STATISTICS` where `TABLE_NAME` = NULL; diff --git a/mysql-test/suite/funcs_1/r/is_columns_is.result b/mysql-test/suite/funcs_1/r/is_columns_is.result index 386b0f07f98..00f9f347067 100644 --- a/mysql-test/suite/funcs_1/r/is_columns_is.result +++ b/mysql-test/suite/funcs_1/r/is_columns_is.result @@ -326,6 +326,7 @@ def information_schema ROUTINES SQL_PATH 22 NULL YES varchar 64 192 NULL NULL NU def information_schema SCHEMATA CATALOG_NAME 1 '' NO varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL def information_schema SCHEMATA DEFAULT_CHARACTER_SET_NAME 3 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL def information_schema SCHEMATA DEFAULT_COLLATION_NAME 4 '' NO varchar 32 96 NULL NULL NULL utf8 utf8_general_ci varchar(32) select NEVER NULL +def information_schema SCHEMATA SCHEMA_COMMENT 6 '' NO varchar 1024 3072 NULL NULL NULL utf8 utf8_general_ci varchar(1024) select NEVER NULL def information_schema SCHEMATA SCHEMA_NAME 2 '' NO varchar 64 192 NULL NULL NULL utf8 utf8_general_ci varchar(64) select NEVER NULL def information_schema SCHEMATA SQL_PATH 5 NULL YES varchar 512 1536 NULL NULL NULL utf8 utf8_general_ci varchar(512) select NEVER NULL def information_schema SCHEMA_PRIVILEGES GRANTEE 1 '' NO varchar 190 570 NULL NULL NULL utf8 utf8_general_ci varchar(190) select NEVER NULL @@ -870,6 +871,7 @@ NULL information_schema ROUTINES LAST_ALTERED datetime NULL NULL NULL NULL datet 3.0000 information_schema SCHEMATA DEFAULT_CHARACTER_SET_NAME varchar 32 96 utf8 utf8_general_ci varchar(32) 3.0000 information_schema SCHEMATA DEFAULT_COLLATION_NAME varchar 32 96 utf8 utf8_general_ci varchar(32) 3.0000 information_schema SCHEMATA SQL_PATH varchar 512 1536 utf8 utf8_general_ci varchar(512) +3.0000 information_schema SCHEMATA SCHEMA_COMMENT varchar 1024 3072 utf8 utf8_general_ci varchar(1024) 3.0000 information_schema SCHEMA_PRIVILEGES GRANTEE varchar 190 570 utf8 utf8_general_ci varchar(190) 3.0000 information_schema SCHEMA_PRIVILEGES TABLE_CATALOG varchar 512 1536 utf8 utf8_general_ci varchar(512) 3.0000 information_schema SCHEMA_PRIVILEGES TABLE_SCHEMA varchar 64 192 utf8 utf8_general_ci varchar(64) diff --git a/mysql-test/suite/funcs_1/r/is_schemata.result b/mysql-test/suite/funcs_1/r/is_schemata.result index 6db6ac8f150..18ee8d01147 100644 --- a/mysql-test/suite/funcs_1/r/is_schemata.result +++ b/mysql-test/suite/funcs_1/r/is_schemata.result @@ -33,6 +33,7 @@ SCHEMA_NAME varchar(64) NO DEFAULT_CHARACTER_SET_NAME varchar(32) NO DEFAULT_COLLATION_NAME varchar(32) NO SQL_PATH varchar(512) YES NULL +SCHEMA_COMMENT varchar(1024) NO SHOW CREATE TABLE information_schema.SCHEMATA; Table Create Table SCHEMATA CREATE TEMPORARY TABLE `SCHEMATA` ( @@ -40,7 +41,8 @@ SCHEMATA CREATE TEMPORARY TABLE `SCHEMATA` ( `SCHEMA_NAME` varchar(64) NOT NULL DEFAULT '', `DEFAULT_CHARACTER_SET_NAME` varchar(32) NOT NULL DEFAULT '', `DEFAULT_COLLATION_NAME` varchar(32) NOT NULL DEFAULT '', - `SQL_PATH` varchar(512) DEFAULT NULL + `SQL_PATH` varchar(512) DEFAULT NULL, + `SCHEMA_COMMENT` varchar(1024) NOT NULL DEFAULT '' ) ENGINE=MEMORY DEFAULT CHARSET=utf8 SHOW COLUMNS FROM information_schema.SCHEMATA; Field Type Null Key Default Extra @@ -49,6 +51,7 @@ SCHEMA_NAME varchar(64) NO DEFAULT_CHARACTER_SET_NAME varchar(32) NO DEFAULT_COLLATION_NAME varchar(32) NO SQL_PATH varchar(512) YES NULL +SCHEMA_COMMENT varchar(1024) NO SELECT catalog_name, schema_name, sql_path FROM information_schema.schemata WHERE catalog_name IS NOT NULL or sql_path IS NOT NULL @@ -77,9 +80,9 @@ GRANT SELECT ON db_datadict_1.* to 'testuser2'@'localhost'; GRANT SELECT ON db_datadict_2.* to 'testuser2'@'localhost'; SELECT * FROM information_schema.schemata WHERE schema_name LIKE 'db_datadict_%' ORDER BY schema_name; -CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH -def db_datadict_1 latin1 latin1_swedish_ci NULL -def db_datadict_2 latin1 latin1_swedish_ci NULL +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT +def db_datadict_1 latin1 latin1_swedish_ci NULL +def db_datadict_2 latin1 latin1_swedish_ci NULL SHOW DATABASES LIKE 'db_datadict_%'; Database (db_datadict_%) db_datadict_1 @@ -87,17 +90,17 @@ db_datadict_2 connect testuser1, localhost, testuser1, , db_datadict_1; SELECT * FROM information_schema.schemata WHERE schema_name LIKE 'db_datadict_%' ORDER BY schema_name; -CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH -def db_datadict_1 latin1 latin1_swedish_ci NULL +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT +def db_datadict_1 latin1 latin1_swedish_ci NULL SHOW DATABASES LIKE 'db_datadict_%'; Database (db_datadict_%) db_datadict_1 connect testuser2, localhost, testuser2, , db_datadict_2; SELECT * FROM information_schema.schemata WHERE schema_name LIKE 'db_datadict_%' ORDER BY schema_name; -CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH -def db_datadict_1 latin1 latin1_swedish_ci NULL -def db_datadict_2 latin1 latin1_swedish_ci NULL +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT +def db_datadict_1 latin1 latin1_swedish_ci NULL +def db_datadict_2 latin1 latin1_swedish_ci NULL SHOW DATABASES LIKE 'db_datadict_%'; Database (db_datadict_%) db_datadict_1 @@ -105,7 +108,7 @@ db_datadict_2 connect testuser3, localhost, testuser3, , test; SELECT * FROM information_schema.schemata WHERE schema_name LIKE 'db_datadict_%' ORDER BY schema_name; -CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT SHOW DATABASES LIKE 'db_datadict_%'; Database (db_datadict_%) connection default; @@ -122,11 +125,11 @@ DROP DATABASE db_datadict_2; ################################################################################# DROP DATABASE IF EXISTS db_datadict; SELECT * FROM information_schema.schemata WHERE schema_name = 'db_datadict'; -CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT CREATE DATABASE db_datadict CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci'; SELECT * FROM information_schema.schemata WHERE schema_name = 'db_datadict'; -CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH -def db_datadict latin1 latin1_swedish_ci NULL +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT +def db_datadict latin1 latin1_swedish_ci NULL SELECT schema_name, default_character_set_name FROM information_schema.schemata WHERE schema_name = 'db_datadict'; schema_name default_character_set_name diff --git a/mysql-test/suite/funcs_1/r/is_schemata_is_mysql_test.result b/mysql-test/suite/funcs_1/r/is_schemata_is_mysql_test.result index 0679142bd82..ccf0e513d88 100644 --- a/mysql-test/suite/funcs_1/r/is_schemata_is_mysql_test.result +++ b/mysql-test/suite/funcs_1/r/is_schemata_is_mysql_test.result @@ -9,10 +9,10 @@ GRANT SELECT ON db_datadict.* TO 'testuser1'@'localhost'; SELECT * FROM information_schema.schemata WHERE schema_name IN ('information_schema','mysql','test') ORDER BY schema_name; -CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH -def information_schema utf8 utf8_general_ci NULL -def mysql latin1 latin1_swedish_ci NULL -def test latin1 latin1_swedish_ci NULL +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT +def information_schema utf8 utf8_general_ci NULL +def mysql latin1 latin1_swedish_ci NULL +def test latin1 latin1_swedish_ci NULL SHOW DATABASES LIKE 'information_schema'; Database (information_schema) information_schema @@ -26,9 +26,9 @@ connect testuser1, localhost, testuser1, , db_datadict; SELECT * FROM information_schema.schemata WHERE schema_name IN ('information_schema','mysql','test') ORDER BY schema_name; -CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH -def information_schema utf8 utf8_general_ci NULL -def test latin1 latin1_swedish_ci NULL +CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH SCHEMA_COMMENT +def information_schema utf8 utf8_general_ci NULL +def test latin1 latin1_swedish_ci NULL SHOW DATABASES LIKE 'information_schema'; Database (information_schema) information_schema diff --git a/sql/handler.h b/sql/handler.h index fb6862e4ce1..096f5f0b1c7 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -1945,11 +1945,12 @@ enum enum_stats_auto_recalc { HA_STATS_AUTO_RECALC_DEFAULT= 0, It stores the "schema_specification" part of the CREATE/ALTER statements and is passed to mysql_create_db() and mysql_alter_db(). - Currently consists only of the schema default character set and collation. + Currently consists of the schema default character set, collation and schema_comment. */ struct Schema_specification_st { CHARSET_INFO *default_table_charset; + LEX_CSTRING *schema_comment; void init() { bzero(this, sizeof(*this)); diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index feb47f9af94..e30fe877dcf 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -7931,3 +7931,5 @@ ER_PERIOD_CONSTRAINT_DROP eng "Can't DROP CONSTRAINT `%s`. Use DROP PERIOD `%s` for this" ER_TOO_LONG_KEYPART 42000 S1009 eng "Specified key part was too long; max key part length is %u bytes" +ER_TOO_LONG_DATABASE_COMMENT + eng "Comment for database '%-.64s' is too long (max = %u)" diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 61d8f12deaa..3b74e3735c9 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -26,6 +26,7 @@ #include "lock.h" // lock_schema_name #include "sql_table.h" // build_table_filename, // filename_to_tablename + // validate_comment_length #include "sql_rename.h" // mysql_rename_tables #include "sql_acl.h" // SELECT_ACL, DB_ACLS, // acl_get, check_grant_db @@ -77,6 +78,7 @@ typedef struct my_dbopt_st char *name; /* Database name */ uint name_length; /* Database length name */ CHARSET_INFO *charset; /* Database default character set */ + LEX_STRING comment; /* Database comment */ } my_dbopt_t; @@ -235,7 +237,8 @@ void my_dbopt_cleanup(void) 1 on error. */ -static my_bool get_dbopt(const char *dbname, Schema_specification_st *create) +static my_bool get_dbopt(THD *thd, const char *dbname, + Schema_specification_st *create) { my_dbopt_t *opt; uint length; @@ -247,6 +250,11 @@ static my_bool get_dbopt(const char *dbname, Schema_specification_st *create) if ((opt= (my_dbopt_t*) my_hash_search(&dboptions, (uchar*) dbname, length))) { create->default_table_charset= opt->charset; + if (opt->comment.length) + { + create->schema_comment= thd->make_clex_string(const_cast(opt->comment.str), + opt->comment.length); + } error= 0; } mysql_rwlock_unlock(&LOCK_dboptions); @@ -274,15 +282,17 @@ static my_bool put_dbopt(const char *dbname, Schema_specification_st *create) DBUG_ENTER("put_dbopt"); length= (uint) strlen(dbname); - + mysql_rwlock_wrlock(&LOCK_dboptions); if (!(opt= (my_dbopt_t*) my_hash_search(&dboptions, (uchar*) dbname, length))) { /* Options are not in the hash, insert them */ char *tmp_name; + char *tmp_comment= NULL; if (!my_multi_malloc(MYF(MY_WME | MY_ZEROFILL), &opt, (uint) sizeof(*opt), &tmp_name, (uint) length+1, + &tmp_comment, (uint) DATABASE_COMMENT_MAXLEN+1, NullS)) { error= 1; @@ -292,7 +302,7 @@ static my_bool put_dbopt(const char *dbname, Schema_specification_st *create) opt->name= tmp_name; strmov(opt->name, dbname); opt->name_length= length; - + opt->comment.str= tmp_comment; if (unlikely((error= my_hash_insert(&dboptions, (uchar*) opt)))) { my_free(opt); @@ -303,6 +313,12 @@ static my_bool put_dbopt(const char *dbname, Schema_specification_st *create) /* Update / write options in hash */ opt->charset= create->default_table_charset; + if (create->schema_comment) + { + strmov(opt->comment.str, create->schema_comment->str); + opt->comment.length= create->schema_comment->length; + } + end: mysql_rwlock_unlock(&LOCK_dboptions); DBUG_RETURN(error); @@ -328,7 +344,7 @@ static void del_dbopt(const char *path) Create database options file: DESCRIPTION - Currently database default charset is only stored there. + Currently database default charset, default collation and comment are stored there. RETURN VALUES 0 ok @@ -339,9 +355,31 @@ static bool write_db_opt(THD *thd, const char *path, Schema_specification_st *create) { File file; - char buf[256]; // Should be enough for one option + char buf[256+DATABASE_COMMENT_MAXLEN]; bool error=1; + if (create->schema_comment) + { + if (validate_comment_length(thd, create->schema_comment, + DATABASE_COMMENT_MAXLEN, ER_TOO_LONG_DATABASE_COMMENT, + thd->lex->name.str)) + return error; + } + + /* Use existing values of schema_comment and charset for ALTER DATABASE queries */ + Schema_specification_st tmp; + bzero((char*) &tmp,sizeof(tmp)); + if (thd->lex->sql_command == SQLCOM_ALTER_DB) + { + load_db_opt(thd, path, &tmp); + + if (!create->schema_comment) + create->schema_comment= tmp.schema_comment; + + if (!create->default_table_charset) + create->default_table_charset= tmp.default_table_charset; + } + if (!create->default_table_charset) create->default_table_charset= thd->variables.collation_server; @@ -358,6 +396,11 @@ static bool write_db_opt(THD *thd, const char *path, create->default_table_charset->name, "\n", NullS) - buf); + if (create->schema_comment) + length= (ulong) (strxnmov(buf+length, sizeof(buf)-1-length, + "comment=", create->schema_comment->str, + "\n", NullS) - buf); + /* Error is written by mysql_file_write */ if (!mysql_file_write(file, (uchar*) buf, length, MYF(MY_NABP+MY_WME))) error=0; @@ -385,7 +428,7 @@ static bool write_db_opt(THD *thd, const char *path, bool load_db_opt(THD *thd, const char *path, Schema_specification_st *create) { File file; - char buf[256]; + char buf[256+DATABASE_COMMENT_MAXLEN]; DBUG_ENTER("load_db_opt"); bool error=1; size_t nbytes; @@ -394,7 +437,7 @@ bool load_db_opt(THD *thd, const char *path, Schema_specification_st *create) create->default_table_charset= thd->variables.collation_server; /* Check if options for this database are already in the hash */ - if (!get_dbopt(path, create)) + if (!get_dbopt(thd, path, create)) DBUG_RETURN(0); /* Otherwise, load options from the .opt file */ @@ -444,6 +487,8 @@ bool load_db_opt(THD *thd, const char *path, Schema_specification_st *create) create->default_table_charset= default_charset_info; } } + else if (!strncmp(buf, "comment", (pos-buf))) + create->schema_comment= thd->make_clex_string(pos+1, strlen(pos+1)); } } /* @@ -544,7 +589,7 @@ CHARSET_INFO *get_default_db_collation(THD *thd, const char *db_name) Create a database SYNOPSIS - mysql_create_db_iternal() + mysql_create_db_internal() thd Thread handler db Name of database to create Function assumes that this is already validated. diff --git a/sql/sql_show.cc b/sql/sql_show.cc index a0cde02be65..6eb1e7f35d1 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1470,7 +1470,7 @@ bool mysqld_show_create_db(THD *thd, LEX_CSTRING *dbname, LEX_CSTRING *orig_dbname, const DDL_options_st &options) { - char buff[2048]; + char buff[2048+DATABASE_COMMENT_MAXLEN]; String buffer(buff, sizeof(buff), system_charset_info); #ifndef NO_EMBEDDED_ACCESS_CHECKS Security_context *sctx= thd->security_ctx; @@ -1506,6 +1506,7 @@ bool mysqld_show_create_db(THD *thd, LEX_CSTRING *dbname, { *dbname= INFORMATION_SCHEMA_NAME; create.default_table_charset= system_charset_info; + create.schema_comment= NULL; } else { @@ -1545,6 +1546,13 @@ bool mysqld_show_create_db(THD *thd, LEX_CSTRING *dbname, } buffer.append(STRING_WITH_LEN(" */")); } + + if (create.schema_comment) + { + buffer.append(STRING_WITH_LEN(" COMMENT ")); + append_unescaped(&buffer, create.schema_comment->str, + create.schema_comment->length); + } protocol->store(buffer.ptr(), buffer.length(), buffer.charset()); if (protocol->write()) @@ -5306,14 +5314,16 @@ err: } -bool store_schema_shemata(THD* thd, TABLE *table, LEX_CSTRING *db_name, - CHARSET_INFO *cs) +bool store_schema_schemata(THD* thd, TABLE *table, LEX_CSTRING *db_name, + CHARSET_INFO *cs, LEX_CSTRING *schema_comment= NULL) { restore_record(table, s->default_values); table->field[0]->store(STRING_WITH_LEN("def"), system_charset_info); table->field[1]->store(db_name->str, db_name->length, system_charset_info); table->field[2]->store(cs->csname, strlen(cs->csname), system_charset_info); table->field[3]->store(cs->name, strlen(cs->name), system_charset_info); + if (schema_comment) + table->field[5]->store(schema_comment->str, schema_comment->length, system_charset_info); return schema_table_store_record(thd, table); } @@ -5366,8 +5376,8 @@ int fill_schema_schemata(THD *thd, TABLE_LIST *tables, COND *cond) DBUG_ASSERT(db_name->length <= NAME_LEN); if (db_name == &INFORMATION_SCHEMA_NAME) { - if (store_schema_shemata(thd, table, db_name, - system_charset_info)) + if (store_schema_schemata(thd, table, db_name, + system_charset_info)) DBUG_RETURN(1); continue; } @@ -5380,8 +5390,8 @@ int fill_schema_schemata(THD *thd, TABLE_LIST *tables, COND *cond) #endif { load_db_opt_by_name(thd, db_name->str, &create); - if (store_schema_shemata(thd, table, db_name, - create.default_table_charset)) + if (store_schema_schemata(thd, table, db_name, + create.default_table_charset, create.schema_comment)) DBUG_RETURN(1); } } @@ -9044,6 +9054,7 @@ ST_FIELD_INFO schema_fields_info[]= {"DEFAULT_COLLATION_NAME", MY_CS_NAME_SIZE, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}, {"SQL_PATH", FN_REFLEN, MYSQL_TYPE_STRING, 0, 1, 0, SKIP_OPEN_TABLE}, + {"SCHEMA_COMMENT", DATABASE_COMMENT_MAXLEN, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE}, {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, SKIP_OPEN_TABLE} }; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 23faa57ad61..a2e8b24bed6 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1687,6 +1687,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); */ %left PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE %left TRANSACTION_SYM TIMESTAMP PERIOD_SYM SYSTEM USER +%left COMMENT_SYM /* @@ -2793,6 +2794,7 @@ create: | create_or_replace DATABASE opt_if_not_exists ident { Lex->create_info.default_table_charset= NULL; + Lex->create_info.schema_comment= NULL; Lex->create_info.used_fields= 0; if (Lex->main_select_push()) MYSQL_YYABORT; @@ -6043,6 +6045,11 @@ create_database_options: create_database_option: default_collation {} | default_charset {} + | COMMENT_SYM opt_equal TEXT_STRING_sys + { + Lex->create_info.schema_comment= thd->make_clex_string($3); + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } ; opt_if_not_exists_table_element: @@ -7764,6 +7771,7 @@ alter: | ALTER DATABASE ident_or_empty { Lex->create_info.default_table_charset= NULL; + Lex->create_info.schema_comment= NULL; Lex->create_info.used_fields= 0; if (Lex->main_select_push()) MYSQL_YYABORT; @@ -7778,6 +7786,22 @@ alter: MYSQL_YYABORT; Lex->pop_select(); //main select } + | ALTER DATABASE COMMENT_SYM opt_equal TEXT_STRING_sys + { + Lex->create_info.default_table_charset= NULL; + Lex->create_info.used_fields= 0; + Lex->create_info.schema_comment= thd->make_clex_string($5); + Lex->create_info.used_fields|= HA_CREATE_USED_COMMENT; + } + opt_create_database_options + { + LEX *lex=Lex; + lex->sql_command=SQLCOM_ALTER_DB; + lex->name= Lex_ident_sys(); + if (lex->name.str == NULL && + unlikely(lex->copy_db_to(&lex->name))) + MYSQL_YYABORT; + } | ALTER DATABASE ident UPGRADE_SYM DATA_SYM DIRECTORY_SYM NAME_SYM { LEX *lex= Lex; @@ -8022,7 +8046,7 @@ opt_ev_sql_stmt: ; ident_or_empty: - /* empty */ { $$= Lex_ident_sys(); } + /* empty */ %prec PREC_BELOW_IDENTIFIER_OPT_SPECIAL_CASE { $$= Lex_ident_sys(); } | ident ;