Commit b7583537 authored by aivanov@mysql.com's avatar aivanov@mysql.com

Applied innodb-4.1-ss22 snapshot.

 Fix BUG#16814: "SHOW INNODB STATUS format error in LATEST FOREIGN KEY ERROR section"
     Add a missing newline to the LAST FOREIGN KEY ERROR section in SHOW INNODB STATUS
     output.
 Fix BUG#18934: "InnoDB crashes when table uses column names like DB_ROW_ID".
     Refuse tables that use reserved column names.
parent 4d5ab7a9
...@@ -1377,6 +1377,38 @@ dict_col_reposition_in_cache( ...@@ -1377,6 +1377,38 @@ dict_col_reposition_in_cache(
HASH_INSERT(dict_col_t, hash, dict_sys->col_hash, fold, col); HASH_INSERT(dict_col_t, hash, dict_sys->col_hash, fold, col);
} }
/********************************************************************
If the given column name is reserved for InnoDB system columns, return
TRUE.*/
ibool
dict_col_name_is_reserved(
/*======================*/
/* out: TRUE if name is reserved */
const char* name) /* in: column name */
{
/* This check reminds that if a new system column is added to
the program, it should be dealt with here. */
#if DATA_N_SYS_COLS != 4
#error "DATA_N_SYS_COLS != 4"
#endif
static const char* reserved_names[] = {
"DB_ROW_ID", "DB_TRX_ID", "DB_ROLL_PTR", "DB_MIX_ID"
};
ulint i;
for (i = 0; i < UT_ARR_SIZE(reserved_names); i++) {
if (strcmp(name, reserved_names[i]) == 0) {
return(TRUE);
}
}
return(FALSE);
}
/************************************************************************** /**************************************************************************
Adds an index to the dictionary cache. */ Adds an index to the dictionary cache. */
...@@ -2160,8 +2192,9 @@ dict_foreign_error_report( ...@@ -2160,8 +2192,9 @@ dict_foreign_error_report(
fputs(msg, file); fputs(msg, file);
fputs(" Constraint:\n", file); fputs(" Constraint:\n", file);
dict_print_info_on_foreign_key_in_create_format(file, NULL, fk); dict_print_info_on_foreign_key_in_create_format(file, NULL, fk);
putc('\n', file);
if (fk->foreign_index) { if (fk->foreign_index) {
fputs("\nThe index in the foreign key in table is ", file); fputs("The index in the foreign key in table is ", file);
ut_print_name(file, NULL, fk->foreign_index->name); ut_print_name(file, NULL, fk->foreign_index->name);
fputs( fputs(
"\nSee http://dev.mysql.com/doc/mysql/en/InnoDB_foreign_key_constraints.html\n" "\nSee http://dev.mysql.com/doc/mysql/en/InnoDB_foreign_key_constraints.html\n"
......
...@@ -94,6 +94,21 @@ dict_mem_table_create( ...@@ -94,6 +94,21 @@ dict_mem_table_create(
return(table); return(table);
} }
/********************************************************************
Free a table memory object. */
void
dict_mem_table_free(
/*================*/
dict_table_t* table) /* in: table */
{
ut_ad(table);
ut_ad(table->magic_n == DICT_TABLE_MAGIC_N);
mutex_free(&(table->autoinc_mutex));
mem_heap_free(table->heap);
}
/************************************************************************** /**************************************************************************
Creates a cluster memory object. */ Creates a cluster memory object. */
......
...@@ -98,6 +98,15 @@ ulint ...@@ -98,6 +98,15 @@ ulint
dict_col_get_clust_pos( dict_col_get_clust_pos(
/*===================*/ /*===================*/
dict_col_t* col); dict_col_t* col);
/********************************************************************
If the given column name is reserved for InnoDB system columns, return
TRUE. */
ibool
dict_col_name_is_reserved(
/*======================*/
/* out: TRUE if name is reserved */
const char* name); /* in: column name */
/************************************************************************ /************************************************************************
Initializes the autoinc counter. It is not an error to initialize an already Initializes the autoinc counter. It is not an error to initialize an already
initialized counter. */ initialized counter. */
......
...@@ -55,6 +55,13 @@ dict_mem_table_create( ...@@ -55,6 +55,13 @@ dict_mem_table_create(
is ignored if the table is made is ignored if the table is made
a member of a cluster */ a member of a cluster */
ulint n_cols); /* in: number of columns */ ulint n_cols); /* in: number of columns */
/********************************************************************
Free a table memory object. */
void
dict_mem_table_free(
/*================*/
dict_table_t* table); /* in: table */
/************************************************************************** /**************************************************************************
Creates a cluster memory object. */ Creates a cluster memory object. */
......
...@@ -242,6 +242,9 @@ contains the sum of the following flag and the locally stored len. */ ...@@ -242,6 +242,9 @@ contains the sum of the following flag and the locally stored len. */
#define UNIV_EXTERN_STORAGE_FIELD (UNIV_SQL_NULL - UNIV_PAGE_SIZE) #define UNIV_EXTERN_STORAGE_FIELD (UNIV_SQL_NULL - UNIV_PAGE_SIZE)
/* Compile-time constant of the given array's size. */
#define UT_ARR_SIZE(a) (sizeof(a) / sizeof((a)[0]))
#include <stdio.h> #include <stdio.h>
#include "ut0dbg.h" #include "ut0dbg.h"
#include "ut0ut.h" #include "ut0ut.h"
......
...@@ -1474,6 +1474,7 @@ row_create_table_for_mysql( ...@@ -1474,6 +1474,7 @@ 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
...@@ -1510,6 +1511,19 @@ row_create_table_for_mysql( ...@@ -1510,6 +1511,19 @@ 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++) {
dict_col_t* col = dict_table_get_nth_col(table, i);
if (dict_col_name_is_reserved(col->name)) {
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);
if (row_mysql_is_recovered_tmp_table(table->name)) { if (row_mysql_is_recovered_tmp_table(table->name)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment