diff --git a/mysql-test/main/varchar_no_length_text.result b/mysql-test/main/varchar_no_length_text.result new file mode 100644 index 0000000000000..8474d6fbae639 --- /dev/null +++ b/mysql-test/main/varchar_no_length_text.result @@ -0,0 +1,102 @@ +# +# SQL Standard T081: VARCHAR without explicit length specification +# +# +# Basic test: CREATE TABLE with VARCHAR without length or charset (scenario 1a) +# +CREATE TABLE t1 (a VARCHAR); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` text DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci +DROP TABLE t1; + +# +# Basic test: CREATE TABLE with charset (scenario 1b) +# +CREATE TABLE t1 (a VARCHAR CHARSET latin1); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` text CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci +DROP TABLE t1; + +# +# Test VARCHAR without length with specific column charsets or collations (scenario 2a) +# +CREATE TABLE t1 (a VARCHAR CHARSET utf8mb4); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` text DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci +DROP TABLE t1; + +CREATE TABLE t1 (a VARCHAR COLLATE utf8mb4_general_ci); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci +DROP TABLE t1; + +CREATE TABLE t1 (a VARCHAR CHARSET latin1); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` text CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci +DROP TABLE t1; + +CREATE TABLE t1 (a VARCHAR COLLATE latin1_general_ci); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` text CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci +DROP TABLE t1; + +# +# Test VARCHAR without length with specific column charsets and collations (scenario 2b) +# +CREATE TABLE t1 (a VARCHAR CHARSET utf8mb4 COLLATE utf8mb4_general_ci); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci +DROP TABLE t1; + +CREATE TABLE t1 (a VARCHAR CHARSET latin1 COLLATE latin1_general_ci); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` text CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci +DROP TABLE t1; + +# +# Basic test: CREATE TABLE with charset (Scenario 3) +# +CREATE TABLE t1 (a VARCHAR) CHARSET latin1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` text DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; + +# +# Test ALTER TABLE MODIFY COLUMN with VARCHAR without length +# +CREATE TABLE t1 (id INTEGER, a VARCHAR(255)); +ALTER TABLE t1 MODIFY a VARCHAR; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `id` int(11) DEFAULT NULL, + `a` text DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci +DROP TABLE t1; diff --git a/mysql-test/main/varchar_no_length_text.test b/mysql-test/main/varchar_no_length_text.test new file mode 100644 index 0000000000000..1aa3275dd026a --- /dev/null +++ b/mysql-test/main/varchar_no_length_text.test @@ -0,0 +1,90 @@ +# +# MDEV-31414 +# Test for SQL Standard T081: "Optional string types maximum length" +# This tests the feature that allows VARCHAR columns to be created without +# specifying a length, defaulting to the maximum VARCHAR length (65535) +# +# We have 3 scenarios for resolving charset and collation +# 1. Empty +# 2. Precisely Typed +# 3. Contextually typed +# +# Check the comment section in "lex_charset.cc" at +# CHARSET_INFO *Lex_exact_charset_extended_collation_attrs_st:: +# resolved_to_character_set + +--echo # +--echo # SQL Standard T081: VARCHAR without explicit length specification +--echo # + +--echo # +--echo # Basic test: CREATE TABLE with VARCHAR without length or charset (scenario 1a) +--echo # + +CREATE TABLE t1 (a VARCHAR); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo +--echo # +--echo # Basic test: CREATE TABLE with charset (scenario 1b) +--echo # + +CREATE TABLE t1 (a VARCHAR CHARSET latin1); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo +--echo # +--echo # Test VARCHAR without length with specific column charsets or collations (scenario 2a) +--echo # + +CREATE TABLE t1 (a VARCHAR CHARSET utf8mb4); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo +CREATE TABLE t1 (a VARCHAR COLLATE utf8mb4_general_ci); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo +CREATE TABLE t1 (a VARCHAR CHARSET latin1); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo +CREATE TABLE t1 (a VARCHAR COLLATE latin1_general_ci); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo +--echo # +--echo # Test VARCHAR without length with specific column charsets and collations (scenario 2b) +--echo # + +CREATE TABLE t1 (a VARCHAR CHARSET utf8mb4 COLLATE utf8mb4_general_ci); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo +CREATE TABLE t1 (a VARCHAR CHARSET latin1 COLLATE latin1_general_ci); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo +--echo # +--echo # Basic test: CREATE TABLE with charset (Scenario 3) +--echo # +CREATE TABLE t1 (a VARCHAR) CHARSET latin1; +SHOW CREATE TABLE t1; +DROP TABLE t1; + +--echo +--echo # +--echo # Test ALTER TABLE MODIFY COLUMN with VARCHAR without length +--echo # +CREATE TABLE t1 (id INTEGER, a VARCHAR(255)); +ALTER TABLE t1 MODIFY a VARCHAR; +SHOW CREATE TABLE t1; +DROP TABLE t1; diff --git a/sql/sql_type.cc b/sql/sql_type.cc index a41cdee95c7c7..202f8223edae6 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -2862,8 +2862,15 @@ Type_handler_varchar::Column_definition_set_attributes( } break; case COLUMN_DEFINITION_ROUTINE_LOCAL: - case COLUMN_DEFINITION_TABLE_FIELD: break; + case COLUMN_DEFINITION_TABLE_FIELD: + /* + Support SQL Standard T081: "Optional string types maximum length" + Allows users to specify VARCHAR fields without a length + In this case, has_explicit_length is false. + */ + def->set_handler(&type_handler_blob); + return false; } thd->parse_error(); return true;