Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions mysql-test/main/type_varchar_no_length.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# MDEV-31414: Implement optional lengths for string types
# Test for SQL Standard T081: "Optional string types maximum length"
# This tests the feature that allows VARCHAR, NVARCHAR and VARBINARY columns
# to be created without specifying a length. For flexibility, we do the following conversions
# VARCHAR, NVARCHAR -> TEXT
# VARBINARY -> BLOB
#
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;
CREATE TABLE t1 (a VARBINARY);
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` blob DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
DROP TABLE t1;
CREATE TABLE t1 (a NVARCHAR);
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` text CHARACTER SET utf8mb3 COLLATE utf8mb3_uca1400_ai_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
DROP TABLE t1;
CREATE TABLE t1 (a VARCHAR COMPRESSED);
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` text /*M!100301 COMPRESSED*/ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
DROP TABLE t1;
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;
CREATE TABLE t1 (id INTEGER);
ALTER TABLE t1 ADD 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;
34 changes: 34 additions & 0 deletions mysql-test/main/type_varchar_no_length.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
--echo # MDEV-31414: Implement optional lengths for string types
--echo # Test for SQL Standard T081: "Optional string types maximum length"
--echo # This tests the feature that allows VARCHAR, NVARCHAR and VARBINARY columns
--echo # to be created without specifying a length. For flexibility, we do the following conversions
--echo # VARCHAR, NVARCHAR -> TEXT
--echo # VARBINARY -> BLOB
--echo #

CREATE TABLE t1 (a VARCHAR);
SHOW CREATE TABLE t1;
DROP TABLE t1;

CREATE TABLE t1 (a VARBINARY);
SHOW CREATE TABLE t1;
DROP TABLE t1;

CREATE TABLE t1 (a NVARCHAR);
SHOW CREATE TABLE t1;
DROP TABLE t1;

CREATE TABLE t1 (a VARCHAR COMPRESSED);
SHOW CREATE TABLE t1;
DROP TABLE t1;

CREATE TABLE t1 (id INTEGER, a VARCHAR(255));
ALTER TABLE t1 MODIFY a VARCHAR;
SHOW CREATE TABLE t1;
DROP TABLE t1;

CREATE TABLE t1 (id INTEGER);
ALTER TABLE t1 ADD a VARCHAR;
SHOW CREATE TABLE t1;
DROP TABLE t1;

15 changes: 14 additions & 1 deletion sql/sql_type.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2862,8 +2862,21 @@ 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.
This is only allowed for types VARCHAR, VARBINARY, NVARCHAR.
Note that Type_handler_vector inherits from Type_handler_varchar.
*/
if (this == &type_handler_varchar ||
this == &type_handler_varchar_compressed)
{
def->set_handler(&type_handler_blob);
return false;
}
}
thd->parse_error();
return true;
Expand Down