List:Commits« Previous MessageNext Message »
From:Satya B Date:October 5 2009 11:17am
Subject:bzr commit into mysql-5.1-bugteam branch (satya.bn:3156) Bug#44369
View as plain text  
#At file:///home/satya/WORK/mysql/mysql-5.1-pe-stage/ based on revid:satya.bn@stripped

 3156 Satya B	2009-10-05
      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.

    added:
      mysql-test/r/innodb_bug44369.result
      mysql-test/t/innodb_bug44369.test
    modified:
      mysql-test/lib/mtr_cases.pm
      storage/innobase/dict/dict0dict.c
      storage/innobase/handler/ha_innodb.cc
      storage/innobase/row/row0mysql.c
=== modified file 'mysql-test/lib/mtr_cases.pm'
--- a/mysql-test/lib/mtr_cases.pm	2009-10-05 11:09:07 +0000
+++ b/mysql-test/lib/mtr_cases.pm	2009-10-05 11:17:48 +0000
@@ -509,6 +509,8 @@ sub collect_one_suite($)
       next if ($test->{'name'} eq 'sys_vars.innodb_thread_concurrency_basic');
       # Disable for Innodb Plugin until the fix for Plugin is received
       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
       my $new_test= My::Test->new();
       while (my ($key, $value) = each(%$test))

=== added file 'mysql-test/r/innodb_bug44369.result'
--- a/mysql-test/r/innodb_bug44369.result	1970-01-01 00:00:00 +0000
+++ b/mysql-test/r/innodb_bug44369.result	2009-10-05 11:17:48 +0000
@@ -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)

=== added file 'mysql-test/t/innodb_bug44369.test'
--- a/mysql-test/t/innodb_bug44369.test	1970-01-01 00:00:00 +0000
+++ b/mysql-test/t/innodb_bug44369.test	2009-10-05 11:17:48 +0000
@@ -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;

=== modified file 'storage/innobase/dict/dict0dict.c'
--- a/storage/innobase/dict/dict0dict.c	2009-05-19 08:31:29 +0000
+++ b/storage/innobase/dict/dict0dict.c	2009-10-05 11:17:48 +0000
@@ -1268,7 +1268,7 @@ dict_col_name_is_reserved(
 	ulint			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);
 		}

=== modified file 'storage/innobase/handler/ha_innodb.cc'
--- a/storage/innobase/handler/ha_innodb.cc	2009-10-05 11:09:07 +0000
+++ b/storage/innobase/handler/ha_innodb.cc	2009-10-05 11:17:48 +0000
@@ -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,
 			(char*) field->field_name,
 			col_type,
@@ -5181,6 +5203,7 @@ create_table_def(
 
 	innodb_check_for_record_too_big_error(flags & DICT_TF_COMPACT, error);
 
+error_ret:
 	error = convert_error_code_to_mysql(error, NULL);
 
 	DBUG_RETURN(error);

=== modified file 'storage/innobase/row/row0mysql.c'
--- a/storage/innobase/row/row0mysql.c	2009-07-10 23:12:13 +0000
+++ b/storage/innobase/row/row0mysql.c	2009-10-05 11:17:48 +0000
@@ -1788,7 +1788,6 @@ row_create_table_for_mysql(
 	const char*	table_name;
 	ulint		table_name_len;
 	ulint		err;
-	ulint		i;
 
 	ut_ad(trx->mysql_thread_id == os_thread_get_curr_id());
 #ifdef UNIV_SYNC_DEBUG
@@ -1827,18 +1826,6 @@ row_create_table_for_mysql(
 		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);
 
 	/* The table name is prefixed with the database name and a '/'.


Attachment: [text/bzr-bundle] bzr/satya.bn@sun.com-20091005111748-458521sqz9m268n4.bundle
Thread
bzr commit into mysql-5.1-bugteam branch (satya.bn:3156) Bug#44369Satya B5 Oct