Commit fe074a72 authored by unknown's avatar unknown
Browse files

Bug#21432 Database/Table name limited to 64 bytes, not chars, problems with multi-byte


client/mysqldump.c:
  fixed typo
include/mysql_com.h:
  added new constants SYSTEM_CHARSET_MBMAXLEN, NAME_CHAR_LEN, USERNAME_CHAR_LENGTH
  increased NAME_LEN, USERNAME_LENGTH
mysql-test/r/create.result:
  result fix
mysql-test/r/grant.result:
  result fix
mysql-test/r/mysql.result:
  result fix
mysql-test/r/sp.result:
  result fix
mysql-test/t/create.test:
  test case
mysql-test/t/grant.test:
  test case
sql/events.cc:
  NAME_LEN is replaced with NAME_CHAR_LEN
sql/item_strfunc.h:
  fixed calculation of max_length
sql/mysql_priv.h:
  check_string_length function is replaced with check_string_byte_length
  added new function check_string_char_length
sql/sp.cc:
  NAME_LEN is replaced with NAME_CHAR_LEN
sql/sp_head.cc:
  NAME_LEN is replaced with NAME_CHAR_LEN
sql/sp_head.h:
  changed parameter of 'check_routine_name' function
sql/sql_class.cc:
  NAME_LEN is replaced with NAME_CHAR_LEN
sql/share/errmsg.txt:
  increased argument lengths according to new constants
sql/sql_parse.cc:
  removed unnecessary checks
  added function 'check_string_char_length'
sql/sql_plugin.cc:
  check that name is not longer than NAME_CHAR_LEN symbols
sql/sql_show.cc:
  NAME_LEN is replaced with NAME_CHAR_LEN
sql/sql_table.cc:
  check that key name is not longer than NAME_LEN symbols
sql/sql_udf.cc:
  check that udf name is not longer than NAME_CHAR_LEN symbols
sql/sql_yacc.yy:
  check that user name is not longer than USERNAME_CHAR_LENGTH symbols
sql/table.cc:
  check that db or table or column name is not longer than NAME_LEN symbols
storage/innobase/handler/ha_innodb.cc:
  removed unnecessary multiplication
tests/mysql_client_test.c:
  NAME_LEN is replaced with NAME_CHAR_LEN
parent 6e5ca12b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -3454,7 +3454,7 @@ static char *get_actual_table_name(const char *old_table_name, MEM_ROOT *root)

static int dump_selected_tables(char *db, char **table_names, int tables)
{
  char table_buff[NAME_LEN*+3];
  char table_buff[NAME_LEN*2+3];
  DYNAMIC_STRING lock_tables_query;
  MEM_ROOT root;
  char **dump_tables, **pos, **end;
+6 −2
Original line number Diff line number Diff line
@@ -20,9 +20,13 @@
#ifndef _mysql_com_h
#define _mysql_com_h

#define NAME_LEN	64		/* Field/table name length */
#define HOSTNAME_LENGTH 60
#define USERNAME_LENGTH 16
#define SYSTEM_CHARSET_MBMAXLEN 3
#define NAME_CHAR_LEN	64              /* Field/table name length */
#define USERNAME_CHAR_LENGTH 16
#define NAME_LEN                (NAME_CHAR_LEN*SYSTEM_CHARSET_MBMAXLEN)
#define USERNAME_LENGTH         (USERNAME_CHAR_LENGTH*SYSTEM_CHARSET_MBMAXLEN)

#define SERVER_VERSION_LENGTH 60
#define SQLSTATE_LENGTH 5

+98 −1
Original line number Diff line number Diff line
@@ -827,7 +827,7 @@ ERROR 42000: Incorrect database name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
DROP DATABASE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
ERROR 42000: Incorrect database name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
RENAME DATABASE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa TO a;
ERROR 42000: Unknown database 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
ERROR 42000: Unknown database 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
RENAME DATABASE mysqltest TO aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
ERROR 42000: Incorrect database name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
create database mysqltest;
@@ -838,3 +838,100 @@ USE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
ERROR 42000: Incorrect database name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
SHOW CREATE DATABASE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
ERROR 42000: Incorrect database name 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
set names utf8;
create database имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
use имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
select database();
database()
имя_базы_в_кодировке_утф8_длиной_больше_чем_45
create table имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48
(
имя_поля_в_кодировке_утф8_длиной_больше_чем_45 int,
index имя_индекса_в_кодировке_утф8_длиной_больше_чем_48 (имя_поля_в_кодировке_утф8_длиной_больше_чем_45)
);
create view имя_вью_кодировке_утф8_длиной_больше_чем_42 as
select имя_поля_в_кодировке_утф8_длиной_больше_чем_45
from имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48;
select * from имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48;
имя_поля_в_кодировке_утф8_длиной_больше_чем_45
select SCHEMA_NAME from information_schema.schemata
where schema_name='имя_базы_в_кодировке_утф8_длиной_больше_чем_45';
SCHEMA_NAME
имя_базы_в_кодировке_утф8_длиной_больше_чем_45
select TABLE_NAME from information_schema.tables where
table_schema='имя_базы_в_кодировке_утф8_длиной_больше_чем_45';
TABLE_NAME
имя_вью_кодировке_утф8_длиной_больше_чем_42
имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48
select COLUMN_NAME from information_schema.columns where
table_schema='имя_базы_в_кодировке_утф8_длиной_больше_чем_45';
COLUMN_NAME
имя_поля_в_кодировке_утф8_длиной_больше_чем_45
имя_поля_в_кодировке_утф8_длиной_больше_чем_45
select INDEX_NAME from information_schema.statistics where
table_schema='имя_базы_в_кодировке_утф8_длиной_больше_чем_45';
INDEX_NAME
имя_индекса_в_кодировке_утф8_длиной_больше_чем_48
select TABLE_NAME from information_schema.views where
table_schema='имя_базы_в_кодировке_утф8_длиной_больше_чем_45';
TABLE_NAME
имя_вью_кодировке_утф8_длиной_больше_чем_42
show create table имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48;
Table	Create Table
имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48	CREATE TABLE `имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48` (
  `имя_поля_в_кодировке_утф8_длиной_больше_чем_45` int(11) DEFAULT NULL,
  KEY `имя_индекса_в_кодировке_утф8_длиной_больше_чем_48` (`имя_поля_в_кодировке_утф8_длиной_больше_чем_45`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
show create view имя_вью_кодировке_утф8_длиной_больше_чем_42;
View	Create View
имя_вью_кодировке_утф8_длиной_больше_чем_42	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `имя_вью_кодировке_утф8_длиной_больше_чем_42` AS select `имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48`.`имя_поля_в_кодировке_утф8_длиной_больше_чем_45` AS `имя_поля_в_кодировке_утф8_длиной_больше_чем_45` from `имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48`
create event имя_события_в_кодировке_утф8_длиной_больше_чем_48 on schedule every 2 year do select 1;
select EVENT_NAME from information_schema.events
where event_schema='имя_базы_в_кодировке_утф8_длиной_больше_чем_45';
EVENT_NAME
имя_события_в_кодировке_утф8_длиной_больше_чем_48
drop event имя_события_в_кодировке_утф8_длиной_больше_чем_48;
create event
очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_66
on schedule every 2 year do select 1;
ERROR 42000: Identifier name 'очень_очень_очень_очень_очень_очень_очень_очень_длинна' is too long
create trigger имя_триггера_в_кодировке_утф8_длиной_больше_чем_49
before insert on имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48 for each row set @a:=1;
select TRIGGER_NAME from information_schema.triggers where
trigger_schema='имя_базы_в_кодировке_утф8_длиной_больше_чем_45';
TRIGGER_NAME
имя_триггера_в_кодировке_утф8_длиной_больше_чем_49
drop trigger имя_триггера_в_кодировке_утф8_длиной_больше_чем_49;
create trigger
очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_66
before insert on имя_таблицы_в_кодировке_утф8_длиной_больше_чем_48 for each row set @a:=1;
ERROR 42000: Identifier name 'очень_очень_очень_очень_очень_очень_очень_очень_длинна' is too long
drop trigger очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_66;
ERROR 42000: Identifier name 'очень_очень_очень_очень_очень_очень_очень_очень_длинна' is too long
create procedure имя_процедуры_в_кодировке_утф8_длиной_больше_чем_50()
begin
end;
select ROUTINE_NAME from information_schema.routines where
routine_schema='имя_базы_в_кодировке_утф8_длиной_больше_чем_45';
ROUTINE_NAME
имя_процедуры_в_кодировке_утф8_длиной_больше_чем_50
drop procedure имя_процедуры_в_кодировке_утф8_длиной_больше_чем_50;
create procedure очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_66()
begin
end;
ERROR 42000: Identifier name 'очень_очень_очень_очень_очень_очень_очень_очень_длинна' is too long
create function имя_функции_в_кодировке_утф8_длиной_больше_чем_49()
returns int
return 0;
select ROUTINE_NAME from information_schema.routines where
routine_schema='имя_базы_в_кодировке_утф8_длиной_больше_чем_45';
ROUTINE_NAME
имя_функции_в_кодировке_утф8_длиной_больше_чем_49
drop function имя_функции_в_кодировке_утф8_длиной_больше_чем_49;
create function очень_очень_очень_очень_очень_очень_очень_очень_длинная_строка_66()
returns int
return 0;
ERROR 42000: Identifier name 'очень_очень_очень_очень_очень_очень_очень_очень_длинна' is too long
drop database имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
set names default;
use test;
+9 −0
Original line number Diff line number Diff line
@@ -1060,3 +1060,12 @@ DROP USER bug23556@localhost;
GRANT PROCESS ON * TO user@localhost;
ERROR 3D000: No database selected
End of 5.0 tests
set names utf8;
grant select on test.* to юзер_юзер@localhost;
user()
юзер_юзер@localhost
revoke all on test.* from юзер_юзер@localhost;
drop user юзер_юзер@localhost;
grant select on test.* to очень_длинный_юзер@localhost;
ERROR HY000: String 'очень_длинный_юзер' is too long for user name (should be no longer than 16)
set names default;
+1 −1
Original line number Diff line number Diff line
@@ -167,7 +167,7 @@ ERROR 2005 (HY000) at line 1: Unknown MySQL server host 'invalid_hostname' (errn
The commands reported in the bug report
ERROR 2005 (HY000) at line 1: Unknown MySQL server host 'cyril has found a bug :)XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' (errno)
Too long dbname
ERROR 1049 (42000) at line 1: Unknown database 'test_really_long_dbnamexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
ERROR 1102 (42000) at line 1: Incorrect database name 'test_really_long_dbnamexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
Too long hostname
ERROR 2005 (HY000) at line 1: Unknown MySQL server host 'cyrils_superlonghostnameXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' (errno)
1
Loading