From 4725318d0da6e06771c907506a864ea339d66a91 Mon Sep 17 00:00:00 2001 From: Osama Nabih Date: Sat, 17 Jan 2026 21:01:32 +0200 Subject: [PATCH 1/9] Allow VARCHAR without length to default to a length of 65,535 Signed-off-by: Osama Nabih --- sql/sql_type.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sql/sql_type.cc b/sql/sql_type.cc index a41cdee95c7c7..0c5fc7d1b6ccb 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -2862,8 +2862,14 @@ 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 + */ + def->length= UINT_MAX16; + return false; } thd->parse_error(); return true; From f2ac3fc0ec3abff210ad9b60664c900ace0f9602 Mon Sep 17 00:00:00 2001 From: Osama Nabih Date: Sat, 17 Jan 2026 22:57:33 +0200 Subject: [PATCH 2/9] Change default VARCHAR size to 16383 Signed-off-by: Osama Nabih --- sql/sql_type.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/sql_type.cc b/sql/sql_type.cc index 0c5fc7d1b6ccb..baecece3ef985 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -2868,7 +2868,7 @@ Type_handler_varchar::Column_definition_set_attributes( Support SQL Standard T081: "Optional string types maximum length" Allows users to specify VARCHAR fields without a length */ - def->length= UINT_MAX16; + def->length= 16383; return false; } thd->parse_error(); From 0ee3e34ca69fe997e7fc5c94c4925d7edd59e4f5 Mon Sep 17 00:00:00 2001 From: Osama Nabih Date: Tue, 20 Jan 2026 11:46:05 +0200 Subject: [PATCH 3/9] Define MAX_VARCHAR_ESTIMATED_SIZE with value 16383 Signed-off-by: Osama Nabih --- sql/sql_const.h | 8 ++++++++ sql/sql_type.cc | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/sql/sql_const.h b/sql/sql_const.h index 389c70e2668b4..df6b6ef5b8cd0 100644 --- a/sql/sql_const.h +++ b/sql/sql_const.h @@ -67,6 +67,14 @@ in non-strict mode. */ #define MAX_FIELD_VARCHARLENGTH (65535-2-1) + +/* + Estimated max size for VARCHAR for all collations (mbmaxlen = 4) + = MAX_FIELD_VARCHARLENGTH / mbmaxlen + NOTE: Support for "gb18030" will have mbmaxlen=5 - See MDEV-7495 + For such charsets, a value of 16383 will cause an error +*/ +#define MAX_VARCHAR_ESTIMATED_SIZE 16383 #define MAX_FIELD_BLOBLENGTH UINT_MAX32 /* cf field_blob::get_length() */ #define CONVERT_IF_BIGGER_TO_BLOB 512 /* Threshold *in characters* */ diff --git a/sql/sql_type.cc b/sql/sql_type.cc index baecece3ef985..228bc158817e9 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -2868,7 +2868,7 @@ Type_handler_varchar::Column_definition_set_attributes( Support SQL Standard T081: "Optional string types maximum length" Allows users to specify VARCHAR fields without a length */ - def->length= 16383; + def->length= MAX_VARCHAR_ESTIMATED_SIZE; return false; } thd->parse_error(); From 1995c232aac737cbfece11c8a957b6e0196d844e Mon Sep 17 00:00:00 2001 From: Osama Nabih Date: Tue, 20 Jan 2026 15:49:44 +0200 Subject: [PATCH 4/9] Revert "Define MAX_VARCHAR_ESTIMATED_SIZE with value 16383" This reverts commit 85217ec2774aeefaf077db2d81a56777bea91ada. --- sql/sql_const.h | 8 -------- sql/sql_type.cc | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/sql/sql_const.h b/sql/sql_const.h index df6b6ef5b8cd0..389c70e2668b4 100644 --- a/sql/sql_const.h +++ b/sql/sql_const.h @@ -67,14 +67,6 @@ in non-strict mode. */ #define MAX_FIELD_VARCHARLENGTH (65535-2-1) - -/* - Estimated max size for VARCHAR for all collations (mbmaxlen = 4) - = MAX_FIELD_VARCHARLENGTH / mbmaxlen - NOTE: Support for "gb18030" will have mbmaxlen=5 - See MDEV-7495 - For such charsets, a value of 16383 will cause an error -*/ -#define MAX_VARCHAR_ESTIMATED_SIZE 16383 #define MAX_FIELD_BLOBLENGTH UINT_MAX32 /* cf field_blob::get_length() */ #define CONVERT_IF_BIGGER_TO_BLOB 512 /* Threshold *in characters* */ diff --git a/sql/sql_type.cc b/sql/sql_type.cc index 228bc158817e9..baecece3ef985 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -2868,7 +2868,7 @@ Type_handler_varchar::Column_definition_set_attributes( Support SQL Standard T081: "Optional string types maximum length" Allows users to specify VARCHAR fields without a length */ - def->length= MAX_VARCHAR_ESTIMATED_SIZE; + def->length= 16383; return false; } thd->parse_error(); From 7adad2c3b3cd2b605ea3fe1e5b8b1e855a1da099 Mon Sep 17 00:00:00 2001 From: Osama Nabih Date: Tue, 20 Jan 2026 15:49:56 +0200 Subject: [PATCH 5/9] Calculate default VARCHAR max len based on Column charset, fallback to DB charset Signed-off-by: Osama Nabih --- sql/sql_type.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sql/sql_type.cc b/sql/sql_type.cc index baecece3ef985..1612b90c1f32f 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -2868,7 +2868,9 @@ Type_handler_varchar::Column_definition_set_attributes( Support SQL Standard T081: "Optional string types maximum length" Allows users to specify VARCHAR fields without a length */ - def->length= 16383; + def->length = def->charset->mbmaxlen ? + MAX_FIELD_VARCHARLENGTH / def->charset->mbmaxlen : + MAX_FIELD_VARCHARLENGTH / thd->db_charset->mbmaxlen; return false; } thd->parse_error(); From 8dfcafde68bd5e757815bc471eadd5ac7b1f38b0 Mon Sep 17 00:00:00 2001 From: Osama Nabih Date: Tue, 20 Jan 2026 23:38:20 +0200 Subject: [PATCH 6/9] Add nullptr check for def->charset Signed-off-by: Osama Nabih --- sql/sql_type.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/sql_type.cc b/sql/sql_type.cc index 1612b90c1f32f..dc57a2f934eee 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -2868,7 +2868,7 @@ Type_handler_varchar::Column_definition_set_attributes( Support SQL Standard T081: "Optional string types maximum length" Allows users to specify VARCHAR fields without a length */ - def->length = def->charset->mbmaxlen ? + def->length = def->charset && def->charset->mbmaxlen ? MAX_FIELD_VARCHARLENGTH / def->charset->mbmaxlen : MAX_FIELD_VARCHARLENGTH / thd->db_charset->mbmaxlen; return false; From 42f87afac824e22feecd2a2350b2e9b025d6d9da Mon Sep 17 00:00:00 2001 From: Osama Nabih Date: Tue, 20 Jan 2026 23:54:40 +0200 Subject: [PATCH 7/9] Add initial test for CREATE TABLE statement with VARCHAR column without length Signed-off-by: Osama Nabih --- mysql-test/main/varchar_no_length.cnf | 2 ++ mysql-test/main/varchar_no_length.result | 25 ++++++++++++++++++++++++ mysql-test/main/varchar_no_length.test | 25 ++++++++++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 mysql-test/main/varchar_no_length.cnf create mode 100644 mysql-test/main/varchar_no_length.result create mode 100644 mysql-test/main/varchar_no_length.test diff --git a/mysql-test/main/varchar_no_length.cnf b/mysql-test/main/varchar_no_length.cnf new file mode 100644 index 0000000000000..129cff26ea246 --- /dev/null +++ b/mysql-test/main/varchar_no_length.cnf @@ -0,0 +1,2 @@ +# Use default conf to set collation and charset +!include include/default_my.cnf diff --git a/mysql-test/main/varchar_no_length.result b/mysql-test/main/varchar_no_length.result new file mode 100644 index 0000000000000..4a54ab34743db --- /dev/null +++ b/mysql-test/main/varchar_no_length.result @@ -0,0 +1,25 @@ +# +# SQL Standard T081: VARCHAR without explicit length specification +# +# +# Basic test: CREATE TABLE with VARCHAR without length +# +CREATE TABLE t1 (a VARCHAR); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varchar(16383) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci +DESC t1; +Field Type Null Key Default Extra +a varchar(16383) YES NULL +# Verify we can insert and retrieve data +INSERT INTO t1 VALUES ('test string'); +INSERT INTO t1 VALUES (''); +INSERT INTO t1 VALUES (NULL); +SELECT * FROM t1; +a +test string + +NULL +DROP TABLE t1; diff --git a/mysql-test/main/varchar_no_length.test b/mysql-test/main/varchar_no_length.test new file mode 100644 index 0000000000000..b948a7f85e50a --- /dev/null +++ b/mysql-test/main/varchar_no_length.test @@ -0,0 +1,25 @@ +# +# 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) +# + +--echo # +--echo # SQL Standard T081: VARCHAR without explicit length specification +--echo # + +--echo # +--echo # Basic test: CREATE TABLE with VARCHAR without length +--echo # + +CREATE TABLE t1 (a VARCHAR); +SHOW CREATE TABLE t1; +DESC t1; + +--echo # Verify we can insert and retrieve data +INSERT INTO t1 VALUES ('test string'); +INSERT INTO t1 VALUES (''); +INSERT INTO t1 VALUES (NULL); +SELECT * FROM t1; + +DROP TABLE t1; From 74497683979b50eef1847a58a212ae43b7cda5b7 Mon Sep 17 00:00:00 2001 From: Osama Nabih Date: Wed, 21 Jan 2026 00:18:04 +0200 Subject: [PATCH 8/9] Add test case for different column charsets Signed-off-by: Osama Nabih --- mysql-test/main/varchar_no_length.result | 17 +++++++++++++++++ mysql-test/main/varchar_no_length.test | 12 ++++++++++++ 2 files changed, 29 insertions(+) diff --git a/mysql-test/main/varchar_no_length.result b/mysql-test/main/varchar_no_length.result index 4a54ab34743db..e0da57ebda3a1 100644 --- a/mysql-test/main/varchar_no_length.result +++ b/mysql-test/main/varchar_no_length.result @@ -23,3 +23,20 @@ test string NULL DROP TABLE t1; +# +# Test VARCHAR without length with various character sets +# +CREATE TABLE t1 (a VARCHAR CHARSET utf8mb4); +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varchar(16383) 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` varchar(65532) CHARACTER SET latin1 COLLATE latin1_swedish_ci DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci +DROP TABLE t1; diff --git a/mysql-test/main/varchar_no_length.test b/mysql-test/main/varchar_no_length.test index b948a7f85e50a..aba11c6732491 100644 --- a/mysql-test/main/varchar_no_length.test +++ b/mysql-test/main/varchar_no_length.test @@ -23,3 +23,15 @@ INSERT INTO t1 VALUES (NULL); SELECT * FROM t1; DROP TABLE t1; + +--echo # +--echo # Test VARCHAR without length with various character sets +--echo # + +CREATE TABLE t1 (a VARCHAR CHARSET utf8mb4); +SHOW CREATE TABLE t1; +DROP TABLE t1; + +CREATE TABLE t1 (a VARCHAR CHARSET latin1); +SHOW CREATE TABLE t1; +DROP TABLE t1; \ No newline at end of file From dea3c0cf6ebe145df770bf740f7a74bdd5b331c9 Mon Sep 17 00:00:00 2001 From: Osama Nabih Date: Sun, 25 Jan 2026 21:07:54 +0200 Subject: [PATCH 9/9] MDEV-31414 Implement optional lengths for string types Add test for CREATE TABLE .... CHARSET scenario Signed-off-by: Osama Nabih --- mysql-test/main/varchar_no_length.result | 7 +++++++ mysql-test/main/varchar_no_length.test | 14 +++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/mysql-test/main/varchar_no_length.result b/mysql-test/main/varchar_no_length.result index e0da57ebda3a1..1e320282538b9 100644 --- a/mysql-test/main/varchar_no_length.result +++ b/mysql-test/main/varchar_no_length.result @@ -40,3 +40,10 @@ t1 CREATE TABLE `t1` ( `a` varchar(65532) 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) CHARSET latin1; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` varchar(65532) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +DROP TABLE t1; diff --git a/mysql-test/main/varchar_no_length.test b/mysql-test/main/varchar_no_length.test index aba11c6732491..31cbba6ab2df1 100644 --- a/mysql-test/main/varchar_no_length.test +++ b/mysql-test/main/varchar_no_length.test @@ -9,7 +9,7 @@ --echo # --echo # ---echo # Basic test: CREATE TABLE with VARCHAR without length +--echo # Basic test: CREATE TABLE with VARCHAR without length or charset --echo # CREATE TABLE t1 (a VARCHAR); @@ -25,7 +25,7 @@ SELECT * FROM t1; DROP TABLE t1; --echo # ---echo # Test VARCHAR without length with various character sets +--echo # Test VARCHAR without length with various column charsets --echo # CREATE TABLE t1 (a VARCHAR CHARSET utf8mb4); @@ -34,4 +34,12 @@ DROP TABLE t1; CREATE TABLE t1 (a VARCHAR CHARSET latin1); SHOW CREATE TABLE t1; -DROP TABLE t1; \ No newline at end of file +DROP TABLE t1; + +--echo # +--echo # Basic test: CREATE TABLE with charset +--echo # + +CREATE TABLE t1 (a VARCHAR) CHARSET latin1; +SHOW CREATE TABLE t1; +DROP TABLE t1;