138 lines
9.2 KiB
Plaintext
138 lines
9.2 KiB
Plaintext
#
|
|
# Test the limits of a file-per-table tablespace name. MySQL combines
|
|
# the database name with the table name to make a unique table name.
|
|
#
|
|
SET default_storage_engine=InnoDB;
|
|
#
|
|
# MySQL limits each database and tablename identifier to 64 characters
|
|
# of up to 3 bytes per character, corresponding to 192 bytes.
|
|
#
|
|
CREATE DATABASE `this_sixty_five_byte_name_is_too_long____________________________`;
|
|
ERROR 42000: Identifier name 'this_sixty_five_byte_name_is_too_long____________________________' is too long
|
|
CREATE DATABASE `this_sixty_four_byte_name_is_not_too_long_______________________`;
|
|
USE `this_sixty_four_byte_name_is_not_too_long_______________________`;
|
|
#
|
|
# A 64 character tablename can be created in a 64 character database name
|
|
#
|
|
CREATE TABLE `this_sixty_four_byte_name_is_not_too_long_______________________`.`this_sixty_four_byte_name_is_not_too_long_______________________` (a SERIAL);
|
|
#
|
|
# A 65 character tablename is too long.
|
|
#
|
|
CREATE TABLE `test`.`this_sixty_five_byte_name_is_too_long____________________________` (a SERIAL);
|
|
ERROR 42000: Identifier name 'this_sixty_five_byte_name_is_too_long____________________________' is too long
|
|
CREATE TABLE `this_sixty_four_byte_name_is_not_too_long_______________________`.`this_sixty_five_byte_name_is_too_long____________________________` (a SERIAL);
|
|
ERROR 42000: Identifier name 'this_sixty_five_byte_name_is_too_long____________________________' is too long
|
|
#
|
|
# Non-non-filename-safe characters like '#' are expanded to '@0023'.
|
|
# On many file systems, such as Linux extfs, you can create a database name
|
|
# that expands to up to 255 bytes long.
|
|
# `##################################################_long` is expanded to
|
|
# (50 * 5) + 5 = 255.
|
|
#
|
|
CREATE DATABASE `##################################################_long`;;
|
|
USE `##################################################_long`;
|
|
#
|
|
# This 256-byte name is only one byte longer but fails with an error code
|
|
# from the stat operation.
|
|
# `##################################################_long_` is expanded to
|
|
# (50 * 5) + 6 = 256.
|
|
#
|
|
CREATE DATABASE `##################################################_long_`;
|
|
ERROR HY000: Can't get stat of './##################################################_long_' (Errcode: ## - File name too long)
|
|
#
|
|
# This 300-byte name which is the longest name that gets an error code
|
|
# from the stat operation.
|
|
# `###########################################################_long` is expanded to
|
|
# (59 * 5) + 5 = 300.
|
|
#
|
|
CREATE DATABASE `###########################################################_long`;
|
|
ERROR HY000: Can't get stat of './###########################################################_long' (Errcode: ## - File name too long)
|
|
#
|
|
# This 301-byte name which is only one byte longer but fails with ER_TOO_LONG_IDENT.
|
|
# `###########################################################_long_` is expanded to
|
|
# (59 * 5) + 6 = 301.
|
|
#
|
|
CREATE DATABASE `###########################################################_long_`;
|
|
ERROR 42000: Identifier name '###########################################################_long_' is too long
|
|
USE test;
|
|
#
|
|
# An expanded table name is limited to 251 bytes
|
|
#
|
|
CREATE TABLE `test`.`#################################################_long_` (a SERIAL);
|
|
#
|
|
# A 252-byte tablename is too long
|
|
#
|
|
CREATE TABLE `test`.`#################################################_long___` (a SERIAL);
|
|
ERROR HY000: Got error 168 - 'Unknown (generic) error from engine' from storage engine
|
|
CREATE DATABASE twenty_byte_db_name_;
|
|
USE `twenty_byte_db_name_`;
|
|
#
|
|
# A 251 byte expanded table name will fit with a longer database name
|
|
#
|
|
CREATE TABLE `twenty_byte_db_name_`.`#################################################_long_` (a SERIAL);
|
|
#
|
|
# A 252 byte expanded table name is also too long in a longer database name
|
|
#
|
|
CREATE TABLE `twenty_byte_db_name_`.`#################################################_long___` (a SERIAL);
|
|
ERROR HY000: Got error 168 - 'Unknown (generic) error from engine' from storage engine
|
|
#
|
|
# Another limitation is a 512 byte length to an expanded path that includes
|
|
# the datadir which is './' in this test, the expanded database name,
|
|
# the directory separator '/', the expanded table name, and the file extension.
|
|
# './long_db_name.long_250_byte_table_name.frm'
|
|
# 2+ 255 +1+ 250 +1+3 = 512
|
|
#
|
|
CREATE TABLE `##################################################_long`.`#################################################_long` (a SERIAL);
|
|
CREATE TABLE `##################################################_long`.`#################################################_long_` (a SERIAL);
|
|
ERROR HY000: Long database name and identifier for object resulted in path length exceeding 512 characters. Path: './@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023_long/@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@
|
|
SHOW WARNINGS;
|
|
Level Code Message
|
|
Error 1860 Long database name and identifier for object resulted in path length exceeding 512 characters. Path: './@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023_long/@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@0023@
|
|
#
|
|
# Show the successfully created databases and tables
|
|
#
|
|
---- list_files MYSQLD_DATADIR/test
|
|
#################################################_long_.ibd
|
|
---- list_files MYSQLD_DATADIR/this_sixty_four_byte_name_is_not_too_long_______________________
|
|
this_sixty_four_byte_name_is_not_too_long_______________________.ibd
|
|
---- list_files MYSQLD_DATADIR/##################################################_long
|
|
#################################################_long.ibd
|
|
SELECT name FROM information_schema.innodb_tables WHERE name LIKE '%long%';
|
|
name
|
|
this_sixty_four_byte_name_is_not_too_long_______________________/this_sixty_four_byte_name_is_not_too_long_______________________
|
|
test/#################################################_long_
|
|
twenty_byte_db_name_/#################################################_long_
|
|
##################################################_long/#################################################_long
|
|
SELECT name FROM information_schema.innodb_tablespaces WHERE name LIKE '%long%';
|
|
name
|
|
this_sixty_four_byte_name_is_not_too_long_______________________/this_sixty_four_byte_name_is_not_too_long_______________________
|
|
test/#################################################_long_
|
|
twenty_byte_db_name_/#################################################_long_
|
|
##################################################_long/#################################################_long
|
|
SELECT path FROM information_schema.innodb_datafiles WHERE path LIKE '%long%' order by path;
|
|
PATH
|
|
./##################################################_long/#################################################_long.ibd
|
|
./test/#################################################_long_.ibd
|
|
./this_sixty_four_byte_name_is_not_too_long_______________________/this_sixty_four_byte_name_is_not_too_long_______________________.ibd
|
|
./twenty_byte_db_name_/#################################################_long_.ibd
|
|
SELECT file_name, tablespace_name FROM information_schema.files
|
|
WHERE file_name LIKE '%long%' ORDER BY file_name;
|
|
FILE_NAME ./##################################################_long/#################################################_long.ibd
|
|
TABLESPACE_NAME ##################################################_long/#################################################_long
|
|
FILE_NAME ./test/#################################################_long_.ibd
|
|
TABLESPACE_NAME test/#################################################_long_
|
|
FILE_NAME ./this_sixty_four_byte_name_is_not_too_long_______________________/this_sixty_four_byte_name_is_not_too_long_______________________.ibd
|
|
TABLESPACE_NAME this_sixty_four_byte_name_is_not_too_long_______________________/this_sixty_four_byte_name_is_not_too_long_______________________
|
|
FILE_NAME ./twenty_byte_db_name_/#################################################_long_.ibd
|
|
TABLESPACE_NAME twenty_byte_db_name_/#################################################_long_
|
|
#
|
|
# Cleanup
|
|
#
|
|
DROP TABLE `this_sixty_four_byte_name_is_not_too_long_______________________`.`this_sixty_four_byte_name_is_not_too_long_______________________`;
|
|
DROP TABLE `test`.`#################################################_long_`;
|
|
DROP TABLE `twenty_byte_db_name_`.`#################################################_long_`;
|
|
DROP TABLE `##################################################_long`.`#################################################_long`;
|
|
DROP DATABASE `this_sixty_four_byte_name_is_not_too_long_______________________`;
|
|
DROP DATABASE `##################################################_long`;
|
|
DROP DATABASE `twenty_byte_db_name_`;
|