mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Applying InnoDB snapshot 5.1-ss5921, part 2. Fixes BUG#44369
BUG#44369 - InnoDB: Does not uniformly disallow disallowed column names Detailed revision comments: r5741 | jyang | 2009-09-03 07:16:01 +0300 (Thu, 03 Sep 2009) | 5 lines branches/5.1: Block creating table with column name conflicting with Innodb reserved key words. (Bug #44369) rb://151 approved by Sunny Bains. r5760 | jyang | 2009-09-04 07:07:34 +0300 (Fri, 04 Sep 2009) | 3 lines branches/5.1: This is to revert change 5741. A return status for create_table_def() needs to be fixed. r5834 | jyang | 2009-09-11 00:43:05 +0300 (Fri, 11 Sep 2009) | 5 lines branches/5.1: Block creating table with column name conflicting with Innodb reserved key words. (Bug #44369) rb://151 approved by Sunny Bains.
This commit is contained in:
@ -509,6 +509,8 @@ sub collect_one_suite($)
|
|||||||
next if ($test->{'name'} eq 'sys_vars.innodb_thread_concurrency_basic');
|
next if ($test->{'name'} eq 'sys_vars.innodb_thread_concurrency_basic');
|
||||||
# Disable for Innodb Plugin until the fix for Plugin is received
|
# Disable for Innodb Plugin until the fix for Plugin is received
|
||||||
next if ($test->{'name'} eq 'main.innodb_bug46000');
|
next if ($test->{'name'} eq 'main.innodb_bug46000');
|
||||||
|
# Disable for Innodb Plugin until the fix for Plugin is received
|
||||||
|
next if ($test->{'name'} eq 'main.innodb_bug44369');
|
||||||
# Copy test options
|
# Copy test options
|
||||||
my $new_test= My::Test->new();
|
my $new_test= My::Test->new();
|
||||||
while (my ($key, $value) = each(%$test))
|
while (my ($key, $value) = each(%$test))
|
||||||
|
14
mysql-test/r/innodb_bug44369.result
Normal file
14
mysql-test/r/innodb_bug44369.result
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
create table bug44369 (DB_ROW_ID int) engine=innodb;
|
||||||
|
ERROR HY000: Can't create table 'test.bug44369' (errno: -1)
|
||||||
|
create table bug44369 (db_row_id int) engine=innodb;
|
||||||
|
ERROR HY000: Can't create table 'test.bug44369' (errno: -1)
|
||||||
|
show errors;
|
||||||
|
Level Code Message
|
||||||
|
Error 1005 Error creating table 'test/bug44369' with column name 'db_row_id'. 'db_row_id' is a reserved name. Please try to re-create the table with a different column name.
|
||||||
|
Error 1005 Can't create table 'test.bug44369' (errno: -1)
|
||||||
|
create table bug44369 (db_TRX_Id int) engine=innodb;
|
||||||
|
ERROR HY000: Can't create table 'test.bug44369' (errno: -1)
|
||||||
|
show errors;
|
||||||
|
Level Code Message
|
||||||
|
Error 1005 Error creating table 'test/bug44369' with column name 'db_TRX_Id'. 'db_TRX_Id' is a reserved name. Please try to re-create the table with a different column name.
|
||||||
|
Error 1005 Can't create table 'test.bug44369' (errno: -1)
|
21
mysql-test/t/innodb_bug44369.test
Normal file
21
mysql-test/t/innodb_bug44369.test
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# This is the test for bug 44369. We should
|
||||||
|
# block table creation with columns match
|
||||||
|
# some innodb internal reserved key words,
|
||||||
|
# both case sensitively and insensitely.
|
||||||
|
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
|
||||||
|
# This create table operation should fail.
|
||||||
|
--error ER_CANT_CREATE_TABLE
|
||||||
|
create table bug44369 (DB_ROW_ID int) engine=innodb;
|
||||||
|
|
||||||
|
# This create should fail as well
|
||||||
|
--error ER_CANT_CREATE_TABLE
|
||||||
|
create table bug44369 (db_row_id int) engine=innodb;
|
||||||
|
|
||||||
|
show errors;
|
||||||
|
|
||||||
|
--error ER_CANT_CREATE_TABLE
|
||||||
|
create table bug44369 (db_TRX_Id int) engine=innodb;
|
||||||
|
|
||||||
|
show errors;
|
@ -1268,7 +1268,7 @@ dict_col_name_is_reserved(
|
|||||||
ulint i;
|
ulint i;
|
||||||
|
|
||||||
for (i = 0; i < UT_ARR_SIZE(reserved_names); i++) {
|
for (i = 0; i < UT_ARR_SIZE(reserved_names); i++) {
|
||||||
if (strcmp(name, reserved_names[i]) == 0) {
|
if (innobase_strcasecmp(name, reserved_names[i]) == 0) {
|
||||||
|
|
||||||
return(TRUE);
|
return(TRUE);
|
||||||
}
|
}
|
||||||
|
@ -5166,6 +5166,28 @@ create_table_def(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* First check whether the column to be added has a
|
||||||
|
system reserved name. */
|
||||||
|
if (dict_col_name_is_reserved(field->field_name)){
|
||||||
|
push_warning_printf(
|
||||||
|
(THD*) trx->mysql_thd,
|
||||||
|
MYSQL_ERROR::WARN_LEVEL_ERROR,
|
||||||
|
ER_CANT_CREATE_TABLE,
|
||||||
|
"Error creating table '%s' with "
|
||||||
|
"column name '%s'. '%s' is a "
|
||||||
|
"reserved name. Please try to "
|
||||||
|
"re-create the table with a "
|
||||||
|
"different column name.",
|
||||||
|
table->name, (char*) field->field_name,
|
||||||
|
(char*) field->field_name);
|
||||||
|
|
||||||
|
dict_mem_table_free(table);
|
||||||
|
trx_commit_for_mysql(trx);
|
||||||
|
|
||||||
|
error = DB_ERROR;
|
||||||
|
goto error_ret;
|
||||||
|
}
|
||||||
|
|
||||||
dict_mem_table_add_col(table, table->heap,
|
dict_mem_table_add_col(table, table->heap,
|
||||||
(char*) field->field_name,
|
(char*) field->field_name,
|
||||||
col_type,
|
col_type,
|
||||||
@ -5181,6 +5203,7 @@ create_table_def(
|
|||||||
|
|
||||||
innodb_check_for_record_too_big_error(flags & DICT_TF_COMPACT, error);
|
innodb_check_for_record_too_big_error(flags & DICT_TF_COMPACT, error);
|
||||||
|
|
||||||
|
error_ret:
|
||||||
error = convert_error_code_to_mysql(error, NULL);
|
error = convert_error_code_to_mysql(error, NULL);
|
||||||
|
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
|
@ -1788,7 +1788,6 @@ row_create_table_for_mysql(
|
|||||||
const char* table_name;
|
const char* table_name;
|
||||||
ulint table_name_len;
|
ulint table_name_len;
|
||||||
ulint err;
|
ulint err;
|
||||||
ulint i;
|
|
||||||
|
|
||||||
ut_ad(trx->mysql_thread_id == os_thread_get_curr_id());
|
ut_ad(trx->mysql_thread_id == os_thread_get_curr_id());
|
||||||
#ifdef UNIV_SYNC_DEBUG
|
#ifdef UNIV_SYNC_DEBUG
|
||||||
@ -1827,18 +1826,6 @@ row_create_table_for_mysql(
|
|||||||
return(DB_ERROR);
|
return(DB_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check that no reserved column names are used. */
|
|
||||||
for (i = 0; i < dict_table_get_n_user_cols(table); i++) {
|
|
||||||
if (dict_col_name_is_reserved(
|
|
||||||
dict_table_get_col_name(table, i))) {
|
|
||||||
|
|
||||||
dict_mem_table_free(table);
|
|
||||||
trx_commit_for_mysql(trx);
|
|
||||||
|
|
||||||
return(DB_ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
trx_start_if_not_started(trx);
|
trx_start_if_not_started(trx);
|
||||||
|
|
||||||
/* The table name is prefixed with the database name and a '/'.
|
/* The table name is prefixed with the database name and a '/'.
|
||||||
|
Reference in New Issue
Block a user