Merge marko@build.mysql.com:/home/bk/mysql-4.1

into hundin.mysql.fi:/home/marko/j/mysql-4.1
This commit is contained in:
marko@hundin.mysql.fi 2004-10-01 14:17:05 +03:00
commit 76cda983a9
40 changed files with 580 additions and 369 deletions

View file

@ -595,10 +595,10 @@ btr_page_get_father_for_rec(
buf_page_print(buf_frame_align(node_ptr)); buf_page_print(buf_frame_align(node_ptr));
fputs("InnoDB: Corruption of an index tree: table ", stderr); fputs("InnoDB: Corruption of an index tree: table ", stderr);
ut_print_name(stderr, ut_print_name(stderr, NULL,
UT_LIST_GET_FIRST(tree->tree_indexes)->table_name); UT_LIST_GET_FIRST(tree->tree_indexes)->table_name);
fputs(", index ", stderr); fputs(", index ", stderr);
ut_print_name(stderr, ut_print_name(stderr, NULL,
UT_LIST_GET_FIRST(tree->tree_indexes)->name); UT_LIST_GET_FIRST(tree->tree_indexes)->name);
fprintf(stderr, ",\n" fprintf(stderr, ",\n"
"InnoDB: father ptr page no %lu, child page no %lu\n", "InnoDB: father ptr page no %lu, child page no %lu\n",
@ -2341,7 +2341,7 @@ btr_index_rec_validate_report(
dict_index_t* index) /* in: index */ dict_index_t* index) /* in: index */
{ {
fputs("InnoDB: Record in ", stderr); fputs("InnoDB: Record in ", stderr);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, NULL, index);
fprintf(stderr, ", page %lu, at offset %lu\n", fprintf(stderr, ", page %lu, at offset %lu\n",
buf_frame_get_page_no(page), (ulint)(rec - page)); buf_frame_get_page_no(page), (ulint)(rec - page));
} }
@ -2482,7 +2482,7 @@ btr_validate_report1(
{ {
fprintf(stderr, "InnoDB: Error in page %lu of ", fprintf(stderr, "InnoDB: Error in page %lu of ",
buf_frame_get_page_no(page)); buf_frame_get_page_no(page));
dict_index_name_print(stderr, index); dict_index_name_print(stderr, NULL, index);
if (level) { if (level) {
fprintf(stderr, ", index tree level %lu", level); fprintf(stderr, ", index tree level %lu", level);
} }
@ -2503,7 +2503,7 @@ btr_validate_report2(
fprintf(stderr, "InnoDB: Error in pages %lu and %lu of ", fprintf(stderr, "InnoDB: Error in pages %lu and %lu of ",
buf_frame_get_page_no(page1), buf_frame_get_page_no(page1),
buf_frame_get_page_no(page2)); buf_frame_get_page_no(page2));
dict_index_name_print(stderr, index); dict_index_name_print(stderr, NULL, index);
if (level) { if (level) {
fprintf(stderr, ", index tree level %lu", level); fprintf(stderr, ", index tree level %lu", level);
} }

View file

@ -839,7 +839,7 @@ static
void void
btr_cur_trx_report( btr_cur_trx_report(
/*===============*/ /*===============*/
const trx_t* trx, /* in: transaction */ trx_t* trx, /* in: transaction */
const dict_index_t* index, /* in: index */ const dict_index_t* index, /* in: index */
const char* op) /* in: operation */ const char* op) /* in: operation */
{ {
@ -847,7 +847,7 @@ btr_cur_trx_report(
ut_dulint_get_high(trx->id), ut_dulint_get_high(trx->id),
ut_dulint_get_low(trx->id)); ut_dulint_get_low(trx->id));
fputs(op, stderr); fputs(op, stderr);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, trx, index);
putc('\n', stderr); putc('\n', stderr);
} }
@ -899,7 +899,7 @@ btr_cur_optimistic_insert(
if (!dtuple_check_typed_no_assert(entry)) { if (!dtuple_check_typed_no_assert(entry)) {
fputs("InnoDB: Error in a tuple to insert into ", stderr); fputs("InnoDB: Error in a tuple to insert into ", stderr);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, thr_get_trx(thr), index);
} }
if (btr_cur_print_record_ops && thr) { if (btr_cur_print_record_ops && thr) {
@ -1001,7 +1001,7 @@ calculate_sizes_again:
fputs("InnoDB: Error: cannot insert tuple ", stderr); fputs("InnoDB: Error: cannot insert tuple ", stderr);
dtuple_print(stderr, entry); dtuple_print(stderr, entry);
fputs(" into ", stderr); fputs(" into ", stderr);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, thr_get_trx(thr), index);
fprintf(stderr, "\nInnoDB: max insert size %lu\n", fprintf(stderr, "\nInnoDB: max insert size %lu\n",
(ulong) max_size); (ulong) max_size);
ut_error; ut_error;

View file

@ -427,7 +427,7 @@ buf_page_print(
btr_page_get_index_id(read_buf)); btr_page_get_index_id(read_buf));
if (index) { if (index) {
fputs("InnoDB: (", stderr); fputs("InnoDB: (", stderr);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, NULL, index);
fputs(")\n", stderr); fputs(")\n", stderr);
} }
} }
@ -2123,7 +2123,7 @@ buf_print(void)
if (index) { if (index) {
putc(' ', stderr); putc(' ', stderr);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, NULL, index);
} }
putc('\n', stderr); putc('\n', stderr);

View file

@ -501,11 +501,14 @@ dict_build_index_def_step(
dict_table_t* table; dict_table_t* table;
dict_index_t* index; dict_index_t* index;
dtuple_t* row; dtuple_t* row;
trx_t* trx;
#ifdef UNIV_SYNC_DEBUG #ifdef UNIV_SYNC_DEBUG
ut_ad(mutex_own(&(dict_sys->mutex))); ut_ad(mutex_own(&(dict_sys->mutex)));
#endif /* UNIV_SYNC_DEBUG */ #endif /* UNIV_SYNC_DEBUG */
trx = thr_get_trx(thr);
index = node->index; index = node->index;
table = dict_table_get_low(index->table_name); table = dict_table_get_low(index->table_name);
@ -514,7 +517,7 @@ dict_build_index_def_step(
return(DB_TABLE_NOT_FOUND); return(DB_TABLE_NOT_FOUND);
} }
thr_get_trx(thr)->table_id = table->id; trx->table_id = table->id;
node->table = table; node->table = table;
@ -1264,9 +1267,9 @@ loop:
ut_print_timestamp(ef); ut_print_timestamp(ef);
fputs(" Error in foreign key constraint creation for table ", fputs(" Error in foreign key constraint creation for table ",
ef); ef);
ut_print_name(ef, table->name); ut_print_name(ef, trx, table->name);
fputs(".\nA foreign key constraint of name ", ef); fputs(".\nA foreign key constraint of name ", ef);
ut_print_name(ef, foreign->id); ut_print_name(ef, trx, foreign->id);
fputs("\nalready exists." fputs("\nalready exists."
" (Note that internally InnoDB adds 'databasename/'\n" " (Note that internally InnoDB adds 'databasename/'\n"
"in front of the user-defined constraint name).\n", "in front of the user-defined constraint name).\n",
@ -1286,7 +1289,7 @@ loop:
ut_print_timestamp(ef); ut_print_timestamp(ef);
fputs(" Internal error in foreign key constraint creation" fputs(" Internal error in foreign key constraint creation"
" for table ", ef); " for table ", ef);
ut_print_name(ef, table->name); ut_print_name(ef, trx, table->name);
fputs(".\n" fputs(".\n"
"See the MySQL .err log in the datadir for more information.\n", ef); "See the MySQL .err log in the datadir for more information.\n", ef);
mutex_exit(&dict_foreign_err_mutex); mutex_exit(&dict_foreign_err_mutex);

View file

@ -2085,14 +2085,14 @@ Report an error in a foreign key definition. */
static static
void void
dict_foreign_error_report_low( dict_foreign_error_report_low(
/*==========================*/
FILE* file, /* in: output stream */ FILE* file, /* in: output stream */
const char* name) /* in: table name */ const char* name) /* in: table name */
{ {
rewind(file); rewind(file);
ut_print_timestamp(file); ut_print_timestamp(file);
fputs(" Error in foreign key constraint of table ", file); fprintf(file, " Error in foreign key constraint of table %s:\n",
ut_print_name(file, name); name);
fputs(":\n", file);
} }
/************************************************************************** /**************************************************************************
@ -2100,6 +2100,7 @@ Report an error in a foreign key definition. */
static static
void void
dict_foreign_error_report( dict_foreign_error_report(
/*======================*/
FILE* file, /* in: output stream */ FILE* file, /* in: output stream */
dict_foreign_t* fk, /* in: foreign key constraint */ dict_foreign_t* fk, /* in: foreign key constraint */
const char* msg) /* in: the error message */ const char* msg) /* in: the error message */
@ -2108,10 +2109,10 @@ dict_foreign_error_report(
dict_foreign_error_report_low(file, fk->foreign_table_name); dict_foreign_error_report_low(file, fk->foreign_table_name);
fputs(msg, file); fputs(msg, file);
fputs(" Constraint:\n", file); fputs(" Constraint:\n", file);
dict_print_info_on_foreign_key_in_create_format(file, fk); dict_print_info_on_foreign_key_in_create_format(file, NULL, fk);
if (fk->foreign_index) { if (fk->foreign_index) {
fputs("\nThe index in the foreign key in table is ", file); fputs("\nThe index in the foreign key in table is ", file);
ut_print_name(file, fk->foreign_index->name); ut_print_name(file, NULL, fk->foreign_index->name);
fputs( fputs(
"See http://www.innodb.com/ibman.php for correct foreign key definition.\n", "See http://www.innodb.com/ibman.php for correct foreign key definition.\n",
file); file);
@ -2946,7 +2947,7 @@ col_loop1:
mutex_enter(&dict_foreign_err_mutex); mutex_enter(&dict_foreign_err_mutex);
dict_foreign_error_report_low(ef, name); dict_foreign_error_report_low(ef, name);
fputs("There is no index in table ", ef); fputs("There is no index in table ", ef);
ut_print_name(ef, name); ut_print_name(ef, NULL, name);
fprintf(ef, " where the columns appear\n" fprintf(ef, " where the columns appear\n"
"as the first columns. Constraint:\n%s\n" "as the first columns. Constraint:\n%s\n"
"See http://www.innodb.com/ibman.php for correct foreign key definition.\n", "See http://www.innodb.com/ibman.php for correct foreign key definition.\n",
@ -3389,12 +3390,12 @@ loop:
ut_print_timestamp(ef); ut_print_timestamp(ef);
fputs( fputs(
" Error in dropping of a foreign key constraint of table ", ef); " Error in dropping of a foreign key constraint of table ", ef);
ut_print_name(ef, table->name); ut_print_name(ef, NULL, table->name);
fputs(",\n" fputs(",\n"
"in SQL command\n", ef); "in SQL command\n", ef);
fputs(str, ef); fputs(str, ef);
fputs("\nCannot find a constraint with the given id ", ef); fputs("\nCannot find a constraint with the given id ", ef);
ut_print_name(ef, id); ut_print_name(ef, NULL, id);
fputs(".\n", ef); fputs(".\n", ef);
mutex_exit(&dict_foreign_err_mutex); mutex_exit(&dict_foreign_err_mutex);
@ -3411,7 +3412,7 @@ syntax_error:
ut_print_timestamp(ef); ut_print_timestamp(ef);
fputs( fputs(
" Syntax error in dropping of a foreign key constraint of table ", ef); " Syntax error in dropping of a foreign key constraint of table ", ef);
ut_print_name(ef, table->name); ut_print_name(ef, NULL, table->name);
fprintf(ef, ",\n" fprintf(ef, ",\n"
"close to:\n%s\n in SQL command\n%s\n", ptr, str); "close to:\n%s\n in SQL command\n%s\n", ptr, str);
mutex_exit(&dict_foreign_err_mutex); mutex_exit(&dict_foreign_err_mutex);
@ -3818,9 +3819,11 @@ dict_update_statistics_low(
if (table->ibd_file_missing) { if (table->ibd_file_missing) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fprintf(stderr,
" InnoDB: cannot calculate statistics for table %s\n" " InnoDB: cannot calculate statistics for table %s\n"
"InnoDB: because the .ibd file is missing. See section 15.1 of\n" "InnoDB: because the .ibd file is missing. For help, please refer to\n"
"InnoDB: http:/www.innodb.com/ibman.html for help\n", table->name); "InnoDB: "
"http://dev.mysql.com/doc/mysql/en/InnoDB_troubleshooting_datadict.html\n",
table->name);
return; return;
} }
@ -3906,25 +3909,19 @@ dict_foreign_print_low(
ut_ad(mutex_own(&(dict_sys->mutex))); ut_ad(mutex_own(&(dict_sys->mutex)));
#endif /* UNIV_SYNC_DEBUG */ #endif /* UNIV_SYNC_DEBUG */
fputs(" FOREIGN KEY CONSTRAINT ", stderr); fprintf(stderr, " FOREIGN KEY CONSTRAINT %s: %s (",
ut_print_name(stderr, foreign->id); foreign->id, foreign->foreign_table_name);
fputs(": ", stderr);
ut_print_name(stderr, foreign->foreign_table_name);
fputs(" (", stderr);
for (i = 0; i < foreign->n_fields; i++) { for (i = 0; i < foreign->n_fields; i++) {
putc(' ', stderr); fprintf(stderr, " %s", foreign->foreign_col_names[i]);
ut_print_name(stderr, foreign->foreign_col_names[i]);
} }
fputs(" )\n" fprintf(stderr, " )\n"
" REFERENCES ", stderr); " REFERENCES %s (",
ut_print_name(stderr, foreign->referenced_table_name); foreign->referenced_table_name);
fputs(" (", stderr);
for (i = 0; i < foreign->n_fields; i++) { for (i = 0; i < foreign->n_fields; i++) {
putc(' ', stderr); fprintf(stderr, " %s", foreign->referenced_col_names[i]);
ut_print_name(stderr, foreign->referenced_col_names[i]);
} }
fputs(" )\n", stderr); fputs(" )\n", stderr);
@ -3981,12 +3978,11 @@ dict_table_print_low(
dict_update_statistics_low(table, TRUE); dict_update_statistics_low(table, TRUE);
fputs("--------------------------------------\n"
"TABLE: name ", stderr);
ut_print_name(stderr, table->name);
fprintf(stderr, fprintf(stderr,
", id %lu %lu, columns %lu, indexes %lu, appr.rows %lu\n" "--------------------------------------\n"
" COLUMNS: ", "TABLE: name %s, id %lu %lu, columns %lu, indexes %lu, appr.rows %lu\n"
" COLUMNS: ",
table->name,
(ulong) ut_dulint_get_high(table->id), (ulong) ut_dulint_get_high(table->id),
(ulong) ut_dulint_get_low(table->id), (ulong) ut_dulint_get_low(table->id),
(ulong) table->n_cols, (ulong) table->n_cols,
@ -4037,8 +4033,7 @@ dict_col_print_low(
#endif /* UNIV_SYNC_DEBUG */ #endif /* UNIV_SYNC_DEBUG */
type = dict_col_get_type(col); type = dict_col_get_type(col);
ut_print_name(stderr, col->name); fprintf(stderr, "%s: ", col->name);
fputs(": ", stderr);
dtype_print(type); dtype_print(type);
} }
@ -4068,13 +4063,12 @@ dict_index_print_low(
n_vals = index->stat_n_diff_key_vals[1]; n_vals = index->stat_n_diff_key_vals[1];
} }
fputs(" INDEX: ", stderr);
dict_index_name_print(stderr, index);
fprintf(stderr, fprintf(stderr,
", id %lu %lu, fields %lu/%lu, type %lu\n" " INDEX: name %s, id %lu %lu, fields %lu/%lu, type %lu\n"
" root page %lu, appr.key vals %lu," " root page %lu, appr.key vals %lu,"
" leaf pages %lu, size pages %lu\n" " leaf pages %lu, size pages %lu\n"
" FIELDS: ", " FIELDS: ",
index->name,
(ulong) ut_dulint_get_high(tree->id), (ulong) ut_dulint_get_high(tree->id),
(ulong) ut_dulint_get_low(tree->id), (ulong) ut_dulint_get_low(tree->id),
(ulong) index->n_user_defined_cols, (ulong) index->n_user_defined_cols,
@ -4106,8 +4100,7 @@ dict_field_print_low(
#ifdef UNIV_SYNC_DEBUG #ifdef UNIV_SYNC_DEBUG
ut_ad(mutex_own(&(dict_sys->mutex))); ut_ad(mutex_own(&(dict_sys->mutex)));
#endif /* UNIV_SYNC_DEBUG */ #endif /* UNIV_SYNC_DEBUG */
putc(' ', stderr); fprintf(stderr, " %s", field->name);
ut_print_name(stderr, field->name);
if (field->prefix_len != 0) { if (field->prefix_len != 0) {
fprintf(stderr, "(%lu)", (ulong) field->prefix_len); fprintf(stderr, "(%lu)", (ulong) field->prefix_len);
@ -4122,6 +4115,7 @@ void
dict_print_info_on_foreign_key_in_create_format( dict_print_info_on_foreign_key_in_create_format(
/*============================================*/ /*============================================*/
FILE* file, /* in: file where to print */ FILE* file, /* in: file where to print */
trx_t* trx, /* in: transaction */
dict_foreign_t* foreign)/* in: foreign key constraint */ dict_foreign_t* foreign)/* in: foreign key constraint */
{ {
const char* stripped_id; const char* stripped_id;
@ -4136,11 +4130,11 @@ dict_print_info_on_foreign_key_in_create_format(
} }
fputs(",\n CONSTRAINT ", file); fputs(",\n CONSTRAINT ", file);
ut_print_name(file, stripped_id); ut_print_name(file, trx, stripped_id);
fputs(" FOREIGN KEY (", file); fputs(" FOREIGN KEY (", file);
for (i = 0;;) { for (i = 0;;) {
ut_print_name(file, foreign->foreign_col_names[i]); ut_print_name(file, trx, foreign->foreign_col_names[i]);
if (++i < foreign->n_fields) { if (++i < foreign->n_fields) {
fputs(", ", file); fputs(", ", file);
} else { } else {
@ -4153,7 +4147,7 @@ dict_print_info_on_foreign_key_in_create_format(
if (dict_tables_have_same_db(foreign->foreign_table_name, if (dict_tables_have_same_db(foreign->foreign_table_name,
foreign->referenced_table_name)) { foreign->referenced_table_name)) {
/* Do not print the database name of the referenced table */ /* Do not print the database name of the referenced table */
ut_print_name(file, dict_remove_db_name( ut_print_name(file, trx, dict_remove_db_name(
foreign->referenced_table_name)); foreign->referenced_table_name));
} else { } else {
/* Look for the '/' in the table name */ /* Look for the '/' in the table name */
@ -4163,16 +4157,17 @@ dict_print_info_on_foreign_key_in_create_format(
i++; i++;
} }
ut_print_namel(file, foreign->referenced_table_name, i); ut_print_namel(file, trx, foreign->referenced_table_name, i);
putc('.', file); putc('.', file);
ut_print_name(file, foreign->referenced_table_name + i + 1); ut_print_name(file, trx,
foreign->referenced_table_name + i + 1);
} }
putc(' ', file); putc(' ', file);
putc('(', file); putc('(', file);
for (i = 0;;) { for (i = 0;;) {
ut_print_name(file, foreign->referenced_col_names[i]); ut_print_name(file, trx, foreign->referenced_col_names[i]);
if (++i < foreign->n_fields) { if (++i < foreign->n_fields) {
fputs(", ", file); fputs(", ", file);
} else { } else {
@ -4218,6 +4213,7 @@ dict_print_info_on_foreign_keys(
a CREATE TABLE, otherwise in the format a CREATE TABLE, otherwise in the format
of SHOW TABLE STATUS */ of SHOW TABLE STATUS */
FILE* file, /* in: file where to print */ FILE* file, /* in: file where to print */
trx_t* trx, /* in: transaction */
dict_table_t* table) /* in: table */ dict_table_t* table) /* in: table */
{ {
dict_foreign_t* foreign; dict_foreign_t* foreign;
@ -4235,7 +4231,7 @@ dict_print_info_on_foreign_keys(
while (foreign != NULL) { while (foreign != NULL) {
if (create_table_format) { if (create_table_format) {
dict_print_info_on_foreign_key_in_create_format( dict_print_info_on_foreign_key_in_create_format(
file, foreign); file, trx, foreign);
} else { } else {
ulint i; ulint i;
fputs("; (", file); fputs("; (", file);
@ -4245,19 +4241,20 @@ dict_print_info_on_foreign_keys(
putc(' ', file); putc(' ', file);
} }
ut_print_name(file, ut_print_name(file, trx,
foreign->foreign_col_names[i]); foreign->foreign_col_names[i]);
} }
fputs(") REFER ", file); fputs(") REFER ", file);
ut_print_name(file, foreign->referenced_table_name); ut_print_name(file, trx,
foreign->referenced_table_name);
putc('(', file); putc('(', file);
for (i = 0; i < foreign->n_fields; i++) { for (i = 0; i < foreign->n_fields; i++) {
if (i) { if (i) {
putc(' ', file); putc(' ', file);
} }
ut_print_name(file, ut_print_name(file, trx,
foreign->referenced_col_names[i]); foreign->referenced_col_names[i]);
} }
@ -4300,10 +4297,11 @@ void
dict_index_name_print( dict_index_name_print(
/*==================*/ /*==================*/
FILE* file, /* in: output stream */ FILE* file, /* in: output stream */
trx_t* trx, /* in: transaction */
const dict_index_t* index) /* in: index to print */ const dict_index_t* index) /* in: index to print */
{ {
fputs("index ", file); fputs("index ", file);
ut_print_name(file, index->name); ut_print_name(file, trx, index->name);
fputs(" of table ", file); fputs(" of table ", file);
ut_print_name(file, index->table_name); ut_print_name(file, trx, index->table_name);
} }

View file

@ -30,7 +30,7 @@ dict_get_first_table_name_in_db(
/* out, own: table name, NULL if /* out, own: table name, NULL if
does not exist; the caller must does not exist; the caller must
free the memory in the string! */ free the memory in the string! */
const char* name) /* in: database name which ends to '/' */ const char* name) /* in: database name which ends in '/' */
{ {
dict_table_t* sys_tables; dict_table_t* sys_tables;
btr_pcur_t pcur; btr_pcur_t pcur;
@ -165,7 +165,7 @@ loop:
if (table == NULL) { if (table == NULL) {
fputs("InnoDB: Failed to load table ", stderr); fputs("InnoDB: Failed to load table ", stderr);
ut_print_namel(stderr, field, len); ut_print_namel(stderr, NULL, field, len);
putc('\n', stderr); putc('\n', stderr);
} else { } else {
/* The table definition was corrupt if there /* The table definition was corrupt if there
@ -389,18 +389,16 @@ Report that an index field or index for a table has been delete marked. */
static static
void void
dict_load_report_deleted_index( dict_load_report_deleted_index(
/*===========================*/
const char* name, /* in: table name */ const char* name, /* in: table name */
ulint field) /* in: index field, or ULINT_UNDEFINED */ ulint field) /* in: index field, or ULINT_UNDEFINED */
{ {
fputs("InnoDB: Error: data dictionary entry" fprintf(stderr, "InnoDB: Error: data dictionary entry"
" for table ", stderr); " for table %s is corrupt!\n", name);
ut_print_name(stderr, name);
fputs(" is corrupt!\n", stderr);
if (field != ULINT_UNDEFINED) { if (field != ULINT_UNDEFINED) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Index field %lu is delete marked.\n", field); "InnoDB: Index field %lu is delete marked.\n", field);
} } else {
else {
fputs("InnoDB: An index is delete marked.\n", stderr); fputs("InnoDB: An index is delete marked.\n", stderr);
} }
} }
@ -620,12 +618,10 @@ dict_load_indexes(
if (page_no == FIL_NULL) { if (page_no == FIL_NULL) {
fputs("InnoDB: Error: trying to load index ", stderr); fprintf(stderr,
ut_print_name(stderr, name_buf); "InnoDB: Error: trying to load index %s for table %s\n"
fputs(" for table ", stderr); "InnoDB: but the index tree has been freed!\n",
ut_print_name(stderr, table->name); name_buf, table->name);
fputs("\n"
"InnoDB: but the index tree has been freed!\n", stderr);
btr_pcur_close(&pcur); btr_pcur_close(&pcur);
mtr_commit(&mtr); mtr_commit(&mtr);
@ -636,12 +632,10 @@ dict_load_indexes(
if ((type & DICT_CLUSTERED) == 0 if ((type & DICT_CLUSTERED) == 0
&& NULL == dict_table_get_first_index(table)) { && NULL == dict_table_get_first_index(table)) {
fputs("InnoDB: Error: trying to load index ", stderr); fprintf(stderr,
ut_print_namel(stderr, name_buf, name_len); "InnoDB: Error: trying to load index %s for table %s\n"
fputs(" for table ", stderr); "InnoDB: but the first index is not clustered!\n",
ut_print_name(stderr, table->name); name_buf, table->name);
fputs("\n"
"InnoDB: but the first index is not clustered!\n", stderr);
btr_pcur_close(&pcur); btr_pcur_close(&pcur);
mtr_commit(&mtr); mtr_commit(&mtr);
@ -1097,10 +1091,9 @@ dict_load_foreign(
|| rec_get_deleted_flag(rec)) { || rec_get_deleted_flag(rec)) {
/* Not found */ /* Not found */
fputs("InnoDB: Error A: cannot load foreign constraint ", fprintf(stderr,
stderr); "InnoDB: Error A: cannot load foreign constraint %s\n",
ut_print_name(stderr, id); id);
putc('\n', stderr);
btr_pcur_close(&pcur); btr_pcur_close(&pcur);
mtr_commit(&mtr); mtr_commit(&mtr);
@ -1114,10 +1107,9 @@ dict_load_foreign(
/* Check if the id in record is the searched one */ /* Check if the id in record is the searched one */
if (len != ut_strlen(id) || ut_memcmp(id, field, len) != 0) { if (len != ut_strlen(id) || ut_memcmp(id, field, len) != 0) {
fputs("InnoDB: Error B: cannot load foreign constraint ", fprintf(stderr,
stderr); "InnoDB: Error B: cannot load foreign constraint %s\n",
ut_print_name(stderr, id); id);
putc('\n', stderr);
btr_pcur_close(&pcur); btr_pcur_close(&pcur);
mtr_commit(&mtr); mtr_commit(&mtr);

View file

@ -428,7 +428,9 @@ fil_node_create(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fprintf(stderr,
" InnoDB: Error: Could not find tablespace %lu for\n" " InnoDB: Error: Could not find tablespace %lu for\n"
"InnoDB: file %s from the tablespace memory cache.\n", (ulong) id, name); "InnoDB: file ", (ulong) id);
ut_print_filename(stderr, name);
fputs(" in the tablespace memory cache.\n", stderr);
mem_free(node->name); mem_free(node->name);
mem_free(node); mem_free(node);
@ -596,16 +598,19 @@ fil_try_to_close_file_in_LRU(
} }
if (print_info && node->n_pending_flushes > 0) { if (print_info && node->n_pending_flushes > 0) {
fprintf(stderr, fputs("InnoDB: cannot close file ", stderr);
"InnoDB: cannot close file %s, because n_pending_flushes %lu\n", node->name, ut_print_filename(stderr, node->name);
fprintf(stderr, ", because n_pending_flushes %lu\n",
(ulong) node->n_pending_flushes); (ulong) node->n_pending_flushes);
} }
if (print_info if (print_info
&& node->modification_counter != node->flush_counter) { && node->modification_counter != node->flush_counter) {
fputs("InnoDB: cannot close file ", stderr);
ut_print_filename(stderr, node->name);
fprintf(stderr, fprintf(stderr,
"InnoDB: cannot close file %s, because mod_count %lld != fl_count %lld\n", ", because mod_count %lld != fl_count %lld\n",
node->name, node->modification_counter, node->modification_counter,
node->flush_counter); node->flush_counter);
} }
@ -660,10 +665,11 @@ retry:
for a while */ for a while */
if (count2 > 20000) { if (count2 > 20000) {
fputs("InnoDB: Warning: tablespace ", stderr);
ut_print_filename(stderr, space->name);
fprintf(stderr, fprintf(stderr,
"InnoDB: Warning: tablespace %s has i/o ops stopped for a long time %lu\n", " has i/o ops stopped for a long time %lu\n",
space->name, (ulong) count2);
(ulong) count2);
} }
mutex_exit(&(system->mutex)); mutex_exit(&(system->mutex));
@ -833,11 +839,12 @@ try_again:
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fprintf(stderr,
" InnoDB: Warning: trying to init to the tablespace memory cache\n" " InnoDB: Warning: trying to init to the tablespace memory cache\n"
"InnoDB: a tablespace %lu of name %s,\n" "InnoDB: a tablespace %lu of name ", (ulong) id);
"InnoDB: but a tablespace %lu of the same name %s\n" ut_print_filename(stderr, name);
fprintf(stderr, ",\n"
"InnoDB: but a tablespace %lu of the same name\n"
"InnoDB: already exists in the tablespace memory cache!\n", "InnoDB: already exists in the tablespace memory cache!\n",
(ulong) id, name, (ulong) space->id);
(ulong) space->id, space->name);
if (id == 0 || purpose != FIL_TABLESPACE) { if (id == 0 || purpose != FIL_TABLESPACE) {
@ -868,10 +875,14 @@ try_again:
if (space != NULL) { if (space != NULL) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Error: trying to add tablespace %lu of name %s\n" "InnoDB: Error: trying to add tablespace %lu of name ", (ulong) id);
ut_print_filename(stderr, name);
fprintf(stderr, "\n"
"InnoDB: to the tablespace memory cache, but tablespace\n" "InnoDB: to the tablespace memory cache, but tablespace\n"
"InnoDB: %lu of name %s already exists in the tablespace\n" "InnoDB: %lu of name ", (ulong) space->id);
"InnoDB: memory cache!\n", (ulong) id, name, (ulong) space->id, space->name); ut_print_filename(stderr, space->name);
fputs(" already exists in the tablespace\n"
"InnoDB: memory cache!\n", stderr);
mutex_exit(&(system->mutex)); mutex_exit(&(system->mutex));
@ -1772,10 +1783,12 @@ stop_ibuf_merges:
} else { } else {
if (count > 5000) { if (count > 5000) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fputs(
" InnoDB: Warning: trying to delete tablespace %s,\n" " InnoDB: Warning: trying to delete tablespace ", stderr);
ut_print_filename(stderr, space->name);
fprintf(stderr, ",\n"
"InnoDB: but there are %lu pending ibuf merges on it.\n" "InnoDB: but there are %lu pending ibuf merges on it.\n"
"InnoDB: Loop %lu.\n", space->name, (ulong) space->n_pending_ibuf_merges, "InnoDB: Loop %lu.\n", (ulong) space->n_pending_ibuf_merges,
(ulong) count); (ulong) count);
} }
@ -1819,10 +1832,12 @@ try_again:
if (space->n_pending_flushes > 0 || node->n_pending > 0) { if (space->n_pending_flushes > 0 || node->n_pending > 0) {
if (count > 1000) { if (count > 1000) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fputs(
" InnoDB: Warning: trying to delete tablespace %s,\n" " InnoDB: Warning: trying to delete tablespace ", stderr);
ut_print_filename(stderr, space->name);
fprintf(stderr, ",\n"
"InnoDB: but there are %lu flushes and %lu pending i/o's on it\n" "InnoDB: but there are %lu flushes and %lu pending i/o's on it\n"
"InnoDB: Loop %lu.\n", space->name, (ulong) space->n_pending_flushes, "InnoDB: Loop %lu.\n", (ulong) space->n_pending_flushes,
(ulong) node->n_pending, (ulong) node->n_pending,
(ulong) count); (ulong) count);
} }
@ -1931,8 +1946,9 @@ fil_rename_tablespace_in_mem(
HASH_SEARCH(name_hash, system->name_hash, ut_fold_string(old_name), HASH_SEARCH(name_hash, system->name_hash, ut_fold_string(old_name),
space2, 0 == strcmp(old_name, space2->name)); space2, 0 == strcmp(old_name, space2->name));
if (space != space2) { if (space != space2) {
fprintf(stderr, fputs("InnoDB: Error: cannot find ", stderr);
"InnoDB: Error: cannot find %s in tablespace memory cache\n", old_name); ut_print_filename(stderr, old_name);
fputs(" in tablespace memory cache\n", stderr);
return(FALSE); return(FALSE);
} }
@ -1940,8 +1956,9 @@ fil_rename_tablespace_in_mem(
HASH_SEARCH(name_hash, system->name_hash, ut_fold_string(path), HASH_SEARCH(name_hash, system->name_hash, ut_fold_string(path),
space2, 0 == strcmp(path, space2->name)); space2, 0 == strcmp(path, space2->name));
if (space2 != NULL) { if (space2 != NULL) {
fprintf(stderr, fputs("InnoDB: Error: ", stderr);
"InnoDB: Error: %s is already in tablespace memory cache\n", path); ut_print_filename(stderr, path);
fputs(" is already in tablespace memory cache\n", stderr);
return(FALSE); return(FALSE);
} }
@ -2019,10 +2036,11 @@ retry:
if (count > 1000) { if (count > 1000) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fputs(" InnoDB: Warning: problems renaming ", stderr);
" InnoDB: Warning: problems renaming %s to %s, %lu iterations\n", ut_print_filename(stderr, old_name);
old_name, new_name, fputs(" to ", stderr);
(ulong) count); ut_print_filename(stderr, new_name);
fprintf(stderr, ", %lu iterations\n", (ulong) count);
} }
mutex_enter(&(system->mutex)); mutex_enter(&(system->mutex));
@ -2032,8 +2050,9 @@ retry:
if (space == NULL) { if (space == NULL) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Error: cannot find space id %lu from the tablespace memory cache\n" "InnoDB: Error: cannot find space id %lu from the tablespace memory cache\n"
"InnoDB: though the table %s in a rename operation should have that id\n", "InnoDB: though the table ", (ulong) id);
(ulong) id, old_name); ut_print_filename(stderr, old_name);
fputs(" in a rename operation should have that id\n", stderr);
mutex_exit(&(system->mutex)); mutex_exit(&(system->mutex));
return(FALSE); return(FALSE);
@ -2166,22 +2185,25 @@ fil_create_new_single_table_tablespace(
OS_DATA_FILE, &ret); OS_DATA_FILE, &ret);
if (ret == FALSE) { if (ret == FALSE) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fputs(" InnoDB: Error creating file ", stderr);
" InnoDB: Error creating file %s.\n", path); ut_print_filename(stderr, path);
fputs(".\n", stderr);
/* The following call will print an error message */ /* The following call will print an error message */
err = os_file_get_last_error(TRUE); err = os_file_get_last_error(TRUE);
if (err == OS_FILE_ALREADY_EXISTS) { if (err == OS_FILE_ALREADY_EXISTS) {
fprintf(stderr, fputs(
"InnoDB: The file already exists though the corresponding table did not\n" "InnoDB: The file already exists though the corresponding table did not\n"
"InnoDB: exist in the InnoDB data dictionary. Have you moved InnoDB\n" "InnoDB: exist in the InnoDB data dictionary. Have you moved InnoDB\n"
"InnoDB: .ibd files around without using the SQL commands\n" "InnoDB: .ibd files around without using the SQL commands\n"
"InnoDB: DISCARD TABLESPACE and IMPORT TABLESPACE, or did\n" "InnoDB: DISCARD TABLESPACE and IMPORT TABLESPACE, or did\n"
"InnoDB: mysqld crash in the middle of CREATE TABLE? You can\n" "InnoDB: mysqld crash in the middle of CREATE TABLE? You can\n"
"InnoDB: resolve the problem by removing the file %s\n" "InnoDB: resolve the problem by removing the file ", stderr);
"InnoDB: under the 'datadir' of MySQL.\n", path); ut_print_filename(stderr, path);
fputs("\n"
"InnoDB: under the 'datadir' of MySQL.\n", stderr);
mem_free(path); mem_free(path);
return(DB_TABLESPACE_ALREADY_EXISTS); return(DB_TABLESPACE_ALREADY_EXISTS);
@ -2249,16 +2271,20 @@ fil_create_new_single_table_tablespace(
ut_free(buf2); ut_free(buf2);
if (!ret) { if (!ret) {
fprintf(stderr, fputs(
"InnoDB: Error: could not write the first page to tablespace %s\n", path); "InnoDB: Error: could not write the first page to tablespace ", stderr);
ut_print_filename(stderr, path);
putc('\n', stderr);
goto error_exit; goto error_exit;
} }
ret = os_file_flush(file); ret = os_file_flush(file);
if (!ret) { if (!ret) {
fprintf(stderr, fputs(
"InnoDB: Error: file flush of tablespace %s failed\n", path); "InnoDB: Error: file flush of tablespace ", stderr);
ut_print_filename(stderr, path);
fputs(" failed\n", stderr);
goto error_exit; goto error_exit;
} }
@ -2361,12 +2387,14 @@ fil_reset_too_high_lsns(
fprintf(stderr, fprintf(stderr,
" InnoDB: Flush lsn in the tablespace file %lu to be imported\n" " InnoDB: Flush lsn in the tablespace file %lu to be imported\n"
"InnoDB: is %lu %lu, which exceeds current system lsn %lu %lu.\n" "InnoDB: is %lu %lu, which exceeds current system lsn %lu %lu.\n"
"InnoDB: We reset the lsn's in the file %s.\n", "InnoDB: We reset the lsn's in the file ",
(ulong) space_id, (ulong) space_id,
(ulong) ut_dulint_get_high(flush_lsn), (ulong) ut_dulint_get_high(flush_lsn),
(ulong) ut_dulint_get_low(flush_lsn), (ulong) ut_dulint_get_low(flush_lsn),
(ulong) ut_dulint_get_high(current_lsn), (ulong) ut_dulint_get_high(current_lsn),
(ulong) ut_dulint_get_low(current_lsn), filepath); (ulong) ut_dulint_get_low(current_lsn));
ut_print_filename(stderr, filepath);
fputs(".\n", stderr);
/* Loop through all the pages in the tablespace and reset the lsn and /* Loop through all the pages in the tablespace and reset the lsn and
the page checksum if necessary */ the page checksum if necessary */
@ -2464,14 +2492,17 @@ fil_open_single_table_tablespace(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fputs(
" InnoDB: Error: trying to open a table, but could not\n" " InnoDB: Error: trying to open a table, but could not\n"
"InnoDB: open the tablespace file %s!\n", filepath); "InnoDB: open the tablespace file ", stderr);
fprintf(stderr, ut_print_filename(stderr, filepath);
"InnoDB: have you moved InnoDB .ibd files around without using the\n" fputs("!\n"
"InnoDB: Have you moved InnoDB .ibd files around without using the\n"
"InnoDB: commands DISCARD TABLESPACE and IMPORT TABLESPACE?\n" "InnoDB: commands DISCARD TABLESPACE and IMPORT TABLESPACE?\n"
"InnoDB: You can look from section 15.1 of http://www.innodb.com/ibman.html\n" "InnoDB: Please refer to\n"
"InnoDB: how to resolve the issue.\n"); "InnoDB:"
" http://dev.mysql.com/doc/mysql/en/InnoDB_troubleshooting_datadict.html\n"
"InnoDB: how to resolve the issue.\n", stderr);
mem_free(filepath); mem_free(filepath);
@ -2493,14 +2524,17 @@ fil_open_single_table_tablespace(
if (space_id != id) { if (space_id != id) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fputs(
" InnoDB: Error: tablespace id in file %s is %lu, but in the InnoDB\n" " InnoDB: Error: tablespace id in file ", stderr);
"InnoDB: data dictionary it is %lu.\n", filepath, (ulong) space_id, (ulong) id); ut_print_filename(stderr, filepath);
fprintf(stderr, fprintf(stderr, " is %lu, but in the InnoDB\n"
"InnoDB: data dictionary it is %lu.\n"
"InnoDB: Have you moved InnoDB .ibd files around without using the\n" "InnoDB: Have you moved InnoDB .ibd files around without using the\n"
"InnoDB: commands DISCARD TABLESPACE and IMPORT TABLESPACE?\n" "InnoDB: commands DISCARD TABLESPACE and IMPORT TABLESPACE?\n"
"InnoDB: You can look from section 15.1 of http://www.innodb.com/ibman.html\n" "InnoDB: Please refer to\n"
"InnoDB: how to resolve the issue.\n"); "InnoDB:"
" http://dev.mysql.com/doc/mysql/en/InnoDB_troubleshooting_datadict.html\n"
"InnoDB: how to resolve the issue.\n", (ulong) space_id, (ulong) id);
ret = FALSE; ret = FALSE;
@ -2867,8 +2901,10 @@ next_file_item:
} }
if (0 != os_file_closedir(dbdir)) { if (0 != os_file_closedir(dbdir)) {
fprintf(stderr, fputs(
"InnoDB: Warning: could not close database directory %s\n", dbpath); "InnoDB: Warning: could not close database directory ", stderr);
ut_print_filename(stderr, dbpath);
putc('\n', stderr);
} }
} }
@ -2921,9 +2957,10 @@ fil_print_orphaned_tablespaces(void)
while (space) { while (space) {
if (space->purpose == FIL_TABLESPACE && space->id != 0 if (space->purpose == FIL_TABLESPACE && space->id != 0
&& !space->mark) { && !space->mark) {
fprintf(stderr, fputs("InnoDB: Warning: tablespace ", stderr);
"InnoDB: Warning: tablespace %s of id %lu has no matching table in\n" ut_print_filename(stderr, space->name);
"InnoDB: the InnoDB data dictionary.\n", space->name, (ulong) space->id); fprintf(stderr, " of id %lu has no matching table in\n"
"InnoDB: the InnoDB data dictionary.\n", (ulong) space->id);
} }
space = UT_LIST_GET_NEXT(space_list, space); space = UT_LIST_GET_NEXT(space_list, space);
@ -3072,26 +3109,31 @@ fil_space_for_table_exists_in_mem(
if (space == NULL) { if (space == NULL) {
if (namespace == NULL) { if (namespace == NULL) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fputs(" InnoDB: Error: table ", stderr);
" InnoDB: Error: table %s\n" ut_print_filename(stderr, name);
fprintf(stderr, "\n"
"InnoDB: in InnoDB data dictionary has tablespace id %lu,\n" "InnoDB: in InnoDB data dictionary has tablespace id %lu,\n"
"InnoDB: but tablespace with that id or name does not exist. Have\n" "InnoDB: but tablespace with that id or name does not exist. Have\n"
"InnoDB: you deleted or moved .ibd files?\n", "InnoDB: you deleted or moved .ibd files?\n",
name, (ulong) id); (ulong) id);
} else { } else {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fputs(" InnoDB: Error: table ", stderr);
" InnoDB: Error: table %s\n" ut_print_filename(stderr, name);
fprintf(stderr, "\n"
"InnoDB: in InnoDB data dictionary has tablespace id %lu,\n" "InnoDB: in InnoDB data dictionary has tablespace id %lu,\n"
"InnoDB: but tablespace with that id does not exist. There is\n" "InnoDB: but tablespace with that id does not exist. There is\n"
"InnoDB: a tablespace of name %s and id %lu, though. Have\n" "InnoDB: a tablespace of name %s and id %lu, though. Have\n"
"InnoDB: you deleted or moved .ibd files?\n", "InnoDB: you deleted or moved .ibd files?\n",
name, (ulong) id, namespace->name, (ulong) id, namespace->name,
(ulong) namespace->id); (ulong) namespace->id);
} }
fprintf(stderr, error_exit:
"InnoDB: You can look from section 15.1 of http://www.innodb.com/ibman.html\n" fputs(
"InnoDB: how to resolve the issue.\n"); "InnoDB: Please refer to\n"
"InnoDB:"
" http://dev.mysql.com/doc/mysql/en/InnoDB_troubleshooting_datadict.html\n"
"InnoDB: how to resolve the issue.\n", stderr);
mem_free(path); mem_free(path);
mutex_exit(&(system->mutex)); mutex_exit(&(system->mutex));
@ -3101,26 +3143,23 @@ fil_space_for_table_exists_in_mem(
if (0 != strcmp(space->name, path)) { if (0 != strcmp(space->name, path)) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fputs(" InnoDB: Error: table ", stderr);
" InnoDB: Error: table %s\n" ut_print_filename(stderr, name);
fprintf(stderr, "\n"
"InnoDB: in InnoDB data dictionary has tablespace id %lu,\n" "InnoDB: in InnoDB data dictionary has tablespace id %lu,\n"
"InnoDB: but tablespace with that id has name %s.\n" "InnoDB: but tablespace with that id has name %s.\n"
"InnoDB: Have you deleted or moved .ibd files?\n", name, (ulong) id, space->name); "InnoDB: Have you deleted or moved .ibd files?\n", (ulong) id, space->name);
if (namespace != NULL) { if (namespace != NULL) {
fprintf(stderr, fputs(
"InnoDB: There is a tablespace with the right name\n" "InnoDB: There is a tablespace with the right name\n"
"InnoDB: %s, but its id is %lu.\n", namespace->name, (ulong) namespace->id); "InnoDB: ", stderr);
ut_print_filename(stderr, namespace->name);
fprintf(stderr, ", but its id is %lu.\n",
(ulong) namespace->id);
} }
fprintf(stderr, goto error_exit;
"InnoDB: You can look from section 15.1 of http://www.innodb.com/ibman.html\n"
"InnoDB: how to resolve the issue.\n");
mem_free(path);
mutex_exit(&(system->mutex));
return(FALSE);
} }
mem_free(path); mem_free(path);

View file

@ -3268,8 +3268,9 @@ leave_loop:
mutex_exit(&ibuf_mutex); mutex_exit(&ibuf_mutex);
printf("Discarded %lu ibuf entries for space %lu\n", (ulong) n_inserts, fprintf(stderr,
(ulong) space); "InnoDB: Discarded %lu ibuf entries for space %lu\n",
(ulong) n_inserts, (ulong) space);
ibuf_exit(); ibuf_exit();

View file

@ -356,6 +356,7 @@ dict_print_info_on_foreign_keys(
a CREATE TABLE, otherwise in the format a CREATE TABLE, otherwise in the format
of SHOW TABLE STATUS */ of SHOW TABLE STATUS */
FILE* file, /* in: file where to print */ FILE* file, /* in: file where to print */
trx_t* trx, /* in: transaction */
dict_table_t* table); /* in: table */ dict_table_t* table); /* in: table */
/************************************************************************** /**************************************************************************
Outputs info on a foreign key of a table in a format suitable for Outputs info on a foreign key of a table in a format suitable for
@ -364,6 +365,7 @@ void
dict_print_info_on_foreign_key_in_create_format( dict_print_info_on_foreign_key_in_create_format(
/*============================================*/ /*============================================*/
FILE* file, /* in: file where to print */ FILE* file, /* in: file where to print */
trx_t* trx, /* in: transaction */
dict_foreign_t* foreign);/* in: foreign key constraint */ dict_foreign_t* foreign);/* in: foreign key constraint */
/************************************************************************ /************************************************************************
Displays the names of the index and the table. */ Displays the names of the index and the table. */
@ -371,6 +373,7 @@ void
dict_index_name_print( dict_index_name_print(
/*==================*/ /*==================*/
FILE* file, /* in: output stream */ FILE* file, /* in: output stream */
trx_t* trx, /* in: transaction */
const dict_index_t* index); /* in: index to print */ const dict_index_t* index); /* in: index to print */
/************************************************************************ /************************************************************************
Gets the first index on the table (the clustered index). */ Gets the first index on the table (the clustered index). */

View file

@ -147,12 +147,13 @@ row_build_row_ref_in_tuple(
dtuple_t* ref, /* in/out: row reference built; see the dtuple_t* ref, /* in/out: row reference built; see the
NOTE below! */ NOTE below! */
dict_index_t* index, /* in: index */ dict_index_t* index, /* in: index */
rec_t* rec); /* in: record in the index; rec_t* rec, /* in: record in the index;
NOTE: the data fields in ref will point NOTE: the data fields in ref will point
directly into this record, therefore, directly into this record, therefore,
the buffer page of this record must be the buffer page of this record must be
at least s-latched and the latch held at least s-latched and the latch held
as long as the row reference is used! */ as long as the row reference is used! */
trx_t* trx); /* in: transaction */
/*********************************************************************** /***********************************************************************
From a row build a row reference with which we can search the clustered From a row build a row reference with which we can search the clustered
index record. */ index record. */

View file

@ -105,7 +105,8 @@ row_sel_convert_mysql_key_to_innobase(
ulint buf_len, /* in: buffer length */ ulint buf_len, /* in: buffer length */
dict_index_t* index, /* in: index of the key value */ dict_index_t* index, /* in: index of the key value */
byte* key_ptr, /* in: MySQL key value */ byte* key_ptr, /* in: MySQL key value */
ulint key_len); /* in: MySQL key value length */ ulint key_len, /* in: MySQL key value length */
trx_t* trx); /* in: transaction */
/************************************************************************ /************************************************************************
Searches for rows in the database. This is used in the interface to Searches for rows in the database. This is used in the interface to
MySQL. This function opens a cursor, and also implements fetch next MySQL. This function opens a cursor, and also implements fetch next

View file

@ -55,7 +55,8 @@ upd_field_set_field_no(
upd_field_t* upd_field, /* in: update vector field */ upd_field_t* upd_field, /* in: update vector field */
ulint field_no, /* in: field number in a clustered ulint field_no, /* in: field number in a clustered
index */ index */
dict_index_t* index); /* in: index */ dict_index_t* index, /* in: index */
trx_t* trx); /* in: transaction */
/************************************************************************* /*************************************************************************
Writes into the redo log the values of trx id and roll ptr and enough info Writes into the redo log the values of trx id and roll ptr and enough info
to determine their positions within a clustered index record. */ to determine their positions within a clustered index record. */
@ -149,6 +150,7 @@ row_upd_build_sec_rec_difference_binary(
dict_index_t* index, /* in: index */ dict_index_t* index, /* in: index */
dtuple_t* entry, /* in: entry to insert */ dtuple_t* entry, /* in: entry to insert */
rec_t* rec, /* in: secondary index record */ rec_t* rec, /* in: secondary index record */
trx_t* trx, /* in: transaction */
mem_heap_t* heap); /* in: memory heap from which allocated */ mem_heap_t* heap); /* in: memory heap from which allocated */
/******************************************************************* /*******************************************************************
Builds an update vector from those fields, excluding the roll ptr and Builds an update vector from those fields, excluding the roll ptr and
@ -166,6 +168,7 @@ row_upd_build_difference_binary(
externally stored fields in entry, or NULL */ externally stored fields in entry, or NULL */
ulint n_ext_vec,/* in: number of fields in ext_vec */ ulint n_ext_vec,/* in: number of fields in ext_vec */
rec_t* rec, /* in: clustered index record */ rec_t* rec, /* in: clustered index record */
trx_t* trx, /* in: transaction */
mem_heap_t* heap); /* in: memory heap from which allocated */ mem_heap_t* heap); /* in: memory heap from which allocated */
/*************************************************************** /***************************************************************
Replaces the new column values stored in the update vector to the index entry Replaces the new column values stored in the update vector to the index entry

View file

@ -78,7 +78,8 @@ upd_field_set_field_no(
upd_field_t* upd_field, /* in: update vector field */ upd_field_t* upd_field, /* in: update vector field */
ulint field_no, /* in: field number in a clustered ulint field_no, /* in: field number in a clustered
index */ index */
dict_index_t* index) /* in: index */ dict_index_t* index, /* in: index */
trx_t* trx) /* in: transaction */
{ {
upd_field->field_no = field_no; upd_field->field_no = field_no;
@ -86,7 +87,7 @@ upd_field_set_field_no(
fprintf(stderr, fprintf(stderr,
"InnoDB: Error: trying to access field %lu in ", "InnoDB: Error: trying to access field %lu in ",
(ulong) field_no); (ulong) field_no);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, trx, index);
fprintf(stderr, "\n" fprintf(stderr, "\n"
"InnoDB: but index only has %lu fields\n", "InnoDB: but index only has %lu fields\n",
(ulong) dict_index_get_n_fields(index)); (ulong) dict_index_get_n_fields(index));

View file

@ -110,6 +110,8 @@ extern int srv_query_thread_priority;
extern ibool srv_use_awe; extern ibool srv_use_awe;
extern ibool srv_use_adaptive_hash_indexes; extern ibool srv_use_adaptive_hash_indexes;
extern ulint srv_max_purge_lag;
/*-------------------------------------------*/ /*-------------------------------------------*/
extern ulint srv_n_rows_inserted; extern ulint srv_n_rows_inserted;
@ -163,6 +165,7 @@ extern ulint srv_test_array_size;
extern ulint srv_activity_count; extern ulint srv_activity_count;
extern ulint srv_fatal_semaphore_wait_threshold; extern ulint srv_fatal_semaphore_wait_threshold;
extern ulint srv_dml_needed_delay;
extern mutex_t* kernel_mutex_temp;/* mutex protecting the server, trx structs, extern mutex_t* kernel_mutex_temp;/* mutex protecting the server, trx structs,
query threads, and lock table: we allocate query threads, and lock table: we allocate

View file

@ -145,6 +145,7 @@ trx_undo_update_rec_get_update(
dulint trx_id, /* in: transaction id from this undorecord */ dulint trx_id, /* in: transaction id from this undorecord */
dulint roll_ptr,/* in: roll pointer from this undo record */ dulint roll_ptr,/* in: roll pointer from this undo record */
ulint info_bits,/* in: info bits from this undo record */ ulint info_bits,/* in: info bits from this undo record */
trx_t* trx, /* in: transaction */
mem_heap_t* heap, /* in: memory heap from which the memory mem_heap_t* heap, /* in: memory heap from which the memory
needed is allocated */ needed is allocated */
upd_t** upd); /* out, own: update vector */ upd_t** upd); /* out, own: update vector */

View file

@ -432,6 +432,10 @@ struct trx_sys_struct{
trx_rseg_t* rseg_array[TRX_SYS_N_RSEGS]; trx_rseg_t* rseg_array[TRX_SYS_N_RSEGS];
/* Pointer array to rollback segments; /* Pointer array to rollback segments;
NULL if slot not in use */ NULL if slot not in use */
ulint rseg_history_len;/* Length of the TRX_RSEG_HISTORY
list (update undo logs for committed
transactions), protected by
rseg->mutex */
UT_LIST_BASE_NODE_T(read_view_t) view_list; UT_LIST_BASE_NODE_T(read_view_t) view_list;
/* List of read views sorted on trx no, /* List of read views sorted on trx no,
biggest first */ biggest first */

View file

@ -197,13 +197,25 @@ ut_print_buf(
const byte* buf, /* in: memory buffer */ const byte* buf, /* in: memory buffer */
ulint len); /* in: length of the buffer */ ulint len); /* in: length of the buffer */
/**************************************************************************
Outputs a NUL-terminated file name, quoted with apostrophes. */
void
ut_print_filename(
/*==============*/
FILE* f, /* in: output stream */
const char* name); /* in: name to print */
/************************************************************************** /**************************************************************************
Outputs a NUL-terminated string, quoted as an SQL identifier. */ Outputs a NUL-terminated string, quoted as an SQL identifier. */
struct trx_struct;
void void
ut_print_name( ut_print_name(
/*==========*/ /*==========*/
FILE* f, /* in: output stream */ FILE* f, /* in: output stream */
struct trx_struct*trx, /* in: transaction */
const char* name); /* in: name to print */ const char* name); /* in: name to print */
/************************************************************************** /**************************************************************************
@ -213,6 +225,7 @@ void
ut_print_namel( ut_print_namel(
/*==========*/ /*==========*/
FILE* f, /* in: output stream */ FILE* f, /* in: output stream */
struct trx_struct*trx, /* in: transaction (NULL=no quotes) */
const char* name, /* in: name to print */ const char* name, /* in: name to print */
ulint namelen);/* in: length of name */ ulint namelen);/* in: length of name */

View file

@ -398,7 +398,7 @@ lock_check_trx_id_sanity(
stderr); stderr);
rec_print(stderr, rec); rec_print(stderr, rec);
fputs("InnoDB: in ", stderr); fputs("InnoDB: in ", stderr);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, NULL, index);
fprintf(stderr, "\n" fprintf(stderr, "\n"
"InnoDB: is %lu %lu which is higher than the global trx id counter %lu %lu!\n" "InnoDB: is %lu %lu which is higher than the global trx id counter %lu %lu!\n"
"InnoDB: The table is corrupt. You have to do dump + drop + reimport.\n", "InnoDB: The table is corrupt. You have to do dump + drop + reimport.\n",
@ -1672,7 +1672,7 @@ lock_rec_enqueue_waiting(
fputs( fputs(
" InnoDB: Error: a record lock wait happens in a dictionary operation!\n" " InnoDB: Error: a record lock wait happens in a dictionary operation!\n"
"InnoDB: Table name ", stderr); "InnoDB: Table name ", stderr);
ut_print_name(stderr, index->table_name); ut_print_name(stderr, trx, index->table_name);
fputs(".\n" fputs(".\n"
"InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n", "InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n",
stderr); stderr);
@ -1709,7 +1709,7 @@ lock_rec_enqueue_waiting(
if (lock_print_waits) { if (lock_print_waits) {
fprintf(stderr, "Lock wait for trx %lu in index ", fprintf(stderr, "Lock wait for trx %lu in index ",
(ulong) ut_dulint_get_low(trx->id)); (ulong) ut_dulint_get_low(trx->id));
ut_print_name(stderr, index->name); ut_print_name(stderr, trx, index->name);
} }
return(DB_LOCK_WAIT); return(DB_LOCK_WAIT);
@ -3314,7 +3314,7 @@ lock_table_enqueue_waiting(
fputs( fputs(
" InnoDB: Error: a table lock wait happens in a dictionary operation!\n" " InnoDB: Error: a table lock wait happens in a dictionary operation!\n"
"InnoDB: Table name ", stderr); "InnoDB: Table name ", stderr);
ut_print_name(stderr, table->name); ut_print_name(stderr, trx, table->name);
fputs(".\n" fputs(".\n"
"InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n", "InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n",
stderr); stderr);
@ -3841,7 +3841,7 @@ lock_table_print(
fputs("EXPLICIT ", file); fputs("EXPLICIT ", file);
} }
fputs("TABLE LOCK table ", file); fputs("TABLE LOCK table ", file);
ut_print_name(file, lock->un_member.tab_lock.table->name); ut_print_name(file, lock->trx, lock->un_member.tab_lock.table->name);
fprintf(file, " trx id %lu %lu", fprintf(file, " trx id %lu %lu",
(ulong) (lock->trx)->id.high, (ulong) (lock->trx)->id.low); (ulong) (lock->trx)->id.high, (ulong) (lock->trx)->id.low);
@ -3892,7 +3892,7 @@ lock_rec_print(
fprintf(file, "RECORD LOCKS space id %lu page no %lu n bits %lu ", fprintf(file, "RECORD LOCKS space id %lu page no %lu n bits %lu ",
(ulong) space, (ulong) page_no, (ulong) space, (ulong) page_no,
(ulong) lock_rec_get_n_bits(lock)); (ulong) lock_rec_get_n_bits(lock));
dict_index_name_print(file, lock->index); dict_index_name_print(file, lock->trx, lock->index);
fprintf(file, " trx id %lu %lu", fprintf(file, " trx id %lu %lu",
(ulong) (lock->trx)->id.high, (ulong) (lock->trx)->id.high,
(ulong) (lock->trx)->id.low); (ulong) (lock->trx)->id.low);

View file

@ -1579,7 +1579,7 @@ page_validate(
fputs("InnoDB: Record heap and dir overlap on a page ", fputs("InnoDB: Record heap and dir overlap on a page ",
stderr); stderr);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, NULL, index);
fprintf(stderr, ", %p, %p\n", fprintf(stderr, ", %p, %p\n",
page_header_get_ptr(page, PAGE_HEAP_TOP), page_header_get_ptr(page, PAGE_HEAP_TOP),
page_dir_get_nth_slot(page, n_slots - 1)); page_dir_get_nth_slot(page, n_slots - 1));
@ -1610,7 +1610,7 @@ page_validate(
fprintf(stderr, fprintf(stderr,
"InnoDB: Records in wrong order on page %lu", "InnoDB: Records in wrong order on page %lu",
(ulong) buf_frame_get_page_no(page)); (ulong) buf_frame_get_page_no(page));
dict_index_name_print(stderr, index); dict_index_name_print(stderr, NULL, index);
fputs("\nInnoDB: previous record ", stderr); fputs("\nInnoDB: previous record ", stderr);
rec_print(stderr, old_rec); rec_print(stderr, old_rec);
fputs("\nInnoDB: record ", stderr); fputs("\nInnoDB: record ", stderr);
@ -1752,7 +1752,7 @@ func_exit:
func_exit2: func_exit2:
fprintf(stderr, "InnoDB: Apparent corruption in page %lu in ", fprintf(stderr, "InnoDB: Apparent corruption in page %lu in ",
(ulong) buf_frame_get_page_no(page)); (ulong) buf_frame_get_page_no(page));
dict_index_name_print(stderr, index); dict_index_name_print(stderr, NULL, index);
putc('\n', stderr); putc('\n', stderr);
buf_page_print(page); buf_page_print(page);
} }

View file

@ -1229,7 +1229,7 @@ opt_print_query_plan(
} }
fputs("Table ", stderr); fputs("Table ", stderr);
dict_index_name_print(stderr, plan->index); dict_index_name_print(stderr, NULL, plan->index);
fprintf(stderr,"; exact m. %lu, match %lu, end conds %lu\n", fprintf(stderr,"; exact m. %lu, match %lu, end conds %lu\n",
(unsigned long) plan->n_exact_match, (unsigned long) plan->n_exact_match,
(unsigned long) n_fields, (unsigned long) n_fields,

View file

@ -886,7 +886,7 @@ pars_process_assign_list(
upd_field_set_field_no(upd_field, upd_field_set_field_no(upd_field,
dict_index_get_nth_col_pos(clust_index, dict_index_get_nth_col_pos(clust_index,
col_sym->col_no), col_sym->col_no),
clust_index); clust_index, NULL);
upd_field->exp = assign_node->val; upd_field->exp = assign_node->val;
if (!dtype_is_fixed_size( if (!dtype_is_fixed_size(

View file

@ -252,7 +252,7 @@ row_ins_sec_index_entry_by_modify(
heap = mem_heap_create(1024); heap = mem_heap_create(1024);
update = row_upd_build_sec_rec_difference_binary(cursor->index, update = row_upd_build_sec_rec_difference_binary(cursor->index,
entry, rec, heap); entry, rec, thr_get_trx(thr), heap);
if (mode == BTR_MODIFY_LEAF) { if (mode == BTR_MODIFY_LEAF) {
/* Try an optimistic updating of the record, keeping changes /* Try an optimistic updating of the record, keeping changes
within the page */ within the page */
@ -316,7 +316,7 @@ row_ins_clust_index_entry_by_modify(
roll_ptr */ roll_ptr */
update = row_upd_build_difference_binary(cursor->index, entry, ext_vec, update = row_upd_build_difference_binary(cursor->index, entry, ext_vec,
n_ext_vec, rec, heap); n_ext_vec, rec, thr_get_trx(thr), heap);
if (mode == BTR_MODIFY_LEAF) { if (mode == BTR_MODIFY_LEAF) {
/* Try optimistic updating of the record, keeping changes /* Try optimistic updating of the record, keeping changes
within the page */ within the page */
@ -554,29 +554,30 @@ row_ins_foreign_report_err(
table */ table */
{ {
FILE* ef = dict_foreign_err_file; FILE* ef = dict_foreign_err_file;
trx_t* trx = thr_get_trx(thr);
mutex_enter(&dict_foreign_err_mutex); mutex_enter(&dict_foreign_err_mutex);
rewind(ef); rewind(ef);
ut_print_timestamp(ef); ut_print_timestamp(ef);
fputs(" Transaction:\n", ef); fputs(" Transaction:\n", ef);
trx_print(ef, thr_get_trx(thr)); trx_print(ef, trx);
fputs("Foreign key constraint fails for table ", ef); fputs("Foreign key constraint fails for table ", ef);
ut_print_name(ef, foreign->foreign_table_name); ut_print_name(ef, trx, foreign->foreign_table_name);
fputs(":\n", ef); fputs(":\n", ef);
dict_print_info_on_foreign_key_in_create_format(ef, foreign); dict_print_info_on_foreign_key_in_create_format(ef, trx, foreign);
putc('\n', ef); putc('\n', ef);
fputs(errstr, ef); fputs(errstr, ef);
fputs(" in parent table, in index ", ef); fputs(" in parent table, in index ", ef);
ut_print_name(ef, foreign->referenced_index->name); ut_print_name(ef, trx, foreign->referenced_index->name);
if (entry) { if (entry) {
fputs(" tuple:\n", ef); fputs(" tuple:\n", ef);
dtuple_print(ef, entry); dtuple_print(ef, entry);
} }
fputs("\nBut in child table ", ef); fputs("\nBut in child table ", ef);
ut_print_name(ef, foreign->foreign_table_name); ut_print_name(ef, trx, foreign->foreign_table_name);
fputs(", in index ", ef); fputs(", in index ", ef);
ut_print_name(ef, foreign->foreign_index->name); ut_print_name(ef, trx, foreign->foreign_index->name);
if (rec) { if (rec) {
fputs(", there is a record:\n", ef); fputs(", there is a record:\n", ef);
rec_print(ef, rec); rec_print(ef, rec);
@ -612,19 +613,19 @@ row_ins_foreign_report_add_err(
fputs(" Transaction:\n", ef); fputs(" Transaction:\n", ef);
trx_print(ef, trx); trx_print(ef, trx);
fputs("Foreign key constraint fails for table ", ef); fputs("Foreign key constraint fails for table ", ef);
ut_print_name(ef, foreign->foreign_table_name); ut_print_name(ef, trx, foreign->foreign_table_name);
fputs(":\n", ef); fputs(":\n", ef);
dict_print_info_on_foreign_key_in_create_format(ef, foreign); dict_print_info_on_foreign_key_in_create_format(ef, trx, foreign);
fputs("\nTrying to add in child table, in index ", ef); fputs("\nTrying to add in child table, in index ", ef);
ut_print_name(ef, foreign->foreign_index->name); ut_print_name(ef, trx, foreign->foreign_index->name);
if (entry) { if (entry) {
fputs(" tuple:\n", ef); fputs(" tuple:\n", ef);
dtuple_print(ef, entry); dtuple_print(ef, entry);
} }
fputs("\nBut in parent table ", ef); fputs("\nBut in parent table ", ef);
ut_print_name(ef, foreign->referenced_table_name); ut_print_name(ef, trx, foreign->referenced_table_name);
fputs(", in index ", ef); fputs(", in index ", ef);
ut_print_name(ef, foreign->referenced_index->name); ut_print_name(ef, trx, foreign->referenced_index->name);
fputs(",\nthe closest match we can find is record:\n", ef); fputs(",\nthe closest match we can find is record:\n", ef);
if (rec && page_rec_is_supremum(rec)) { if (rec && page_rec_is_supremum(rec)) {
/* If the cursor ended on a supremum record, it is better /* If the cursor ended on a supremum record, it is better
@ -704,11 +705,13 @@ row_ins_foreign_check_on_constraint(
ulint n_to_update; ulint n_to_update;
ulint err; ulint err;
ulint i; ulint i;
trx_t* trx;
ut_a(thr && foreign && pcur && mtr); ut_a(thr && foreign && pcur && mtr);
trx = thr_get_trx(thr);
/* Since we are going to delete or update a row, we have to invalidate /* Since we are going to delete or update a row, we have to invalidate
the MySQL query cache for table */ the MySQL query cache for table */
@ -847,7 +850,7 @@ row_ins_foreign_check_on_constraint(
fputs( fputs(
"InnoDB: error in cascade of a foreign key op\n" "InnoDB: error in cascade of a foreign key op\n"
"InnoDB: ", stderr); "InnoDB: ", stderr);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, trx, index);
fputs("\n" fputs("\n"
"InnoDB: record ", stderr); "InnoDB: record ", stderr);
@ -1084,6 +1087,7 @@ row_ins_check_foreign_constraint(
ulint err; ulint err;
ulint i; ulint i;
mtr_t mtr; mtr_t mtr;
trx_t* trx = thr_get_trx(thr);
run_again: run_again:
#ifdef UNIV_SYNC_DEBUG #ifdef UNIV_SYNC_DEBUG
@ -1092,7 +1096,7 @@ run_again:
err = DB_SUCCESS; err = DB_SUCCESS;
if (thr_get_trx(thr)->check_foreigns == FALSE) { if (trx->check_foreigns == FALSE) {
/* The user has suppressed foreign key checks currently for /* The user has suppressed foreign key checks currently for
this session */ this session */
@ -1150,18 +1154,18 @@ run_again:
rewind(ef); rewind(ef);
ut_print_timestamp(ef); ut_print_timestamp(ef);
fputs(" Transaction:\n", ef); fputs(" Transaction:\n", ef);
trx_print(ef, thr_get_trx(thr)); trx_print(ef, trx);
fputs("Foreign key constraint fails for table ", ef); fputs("Foreign key constraint fails for table ", ef);
ut_print_name(ef, foreign->foreign_table_name); ut_print_name(ef, trx, foreign->foreign_table_name);
fputs(":\n", ef); fputs(":\n", ef);
dict_print_info_on_foreign_key_in_create_format(ef, dict_print_info_on_foreign_key_in_create_format(ef,
foreign); trx, foreign);
fputs("\nTrying to add to index ", ef); fputs("\nTrying to add to index ", ef);
ut_print_name(ef, foreign->foreign_index->name); ut_print_name(ef, trx, foreign->foreign_index->name);
fputs(" tuple:\n", ef); fputs(" tuple:\n", ef);
dtuple_print(ef, entry); dtuple_print(ef, entry);
fputs("\nBut the parent table ", ef); fputs("\nBut the parent table ", ef);
ut_print_name(ef, foreign->referenced_table_name); ut_print_name(ef, trx, foreign->referenced_table_name);
fputs(" does not currently exist!\n", ef); fputs(" does not currently exist!\n", ef);
mutex_exit(&dict_foreign_err_mutex); mutex_exit(&dict_foreign_err_mutex);
@ -1294,7 +1298,7 @@ run_again:
if (check_ref) { if (check_ref) {
err = DB_NO_REFERENCED_ROW; err = DB_NO_REFERENCED_ROW;
row_ins_foreign_report_add_err( row_ins_foreign_report_add_err(
thr_get_trx(thr), foreign, rec, entry); trx, foreign, rec, entry);
} else { } else {
err = DB_SUCCESS; err = DB_SUCCESS;
} }
@ -1310,7 +1314,7 @@ next_rec:
if (check_ref) { if (check_ref) {
rec = btr_pcur_get_rec(&pcur); rec = btr_pcur_get_rec(&pcur);
row_ins_foreign_report_add_err( row_ins_foreign_report_add_err(
thr_get_trx(thr), foreign, rec, entry); trx, foreign, rec, entry);
err = DB_NO_REFERENCED_ROW; err = DB_NO_REFERENCED_ROW;
} else { } else {
err = DB_SUCCESS; err = DB_SUCCESS;
@ -1329,18 +1333,18 @@ next_rec:
do_possible_lock_wait: do_possible_lock_wait:
if (err == DB_LOCK_WAIT) { if (err == DB_LOCK_WAIT) {
thr_get_trx(thr)->error_state = err; trx->error_state = err;
que_thr_stop_for_mysql(thr); que_thr_stop_for_mysql(thr);
srv_suspend_mysql_thread(thr); srv_suspend_mysql_thread(thr);
if (thr_get_trx(thr)->error_state == DB_SUCCESS) { if (trx->error_state == DB_SUCCESS) {
goto run_again; goto run_again;
} }
err = thr_get_trx(thr)->error_state; err = trx->error_state;
} }
return(err); return(err);

View file

@ -92,6 +92,19 @@ row_mysql_is_system_table(
|| 0 == strcmp(name + 6, "user") || 0 == strcmp(name + 6, "user")
|| 0 == strcmp(name + 6, "db")); || 0 == strcmp(name + 6, "db"));
} }
/***********************************************************************
Delays an INSERT, DELETE or UPDATE operation if the purge is lagging. */
static
void
row_mysql_delay_if_needed(void)
/*===========================*/
{
if (srv_dml_needed_delay) {
os_thread_sleep(srv_dml_needed_delay);
}
}
/*********************************************************************** /***********************************************************************
Reads a MySQL format variable-length field (like VARCHAR) length and Reads a MySQL format variable-length field (like VARCHAR) length and
returns pointer to the field data. */ returns pointer to the field data. */
@ -444,7 +457,7 @@ row_prebuilt_free(
"InnoDB: table handle. Magic n %lu, magic n2 %lu, table name", "InnoDB: table handle. Magic n %lu, magic n2 %lu, table name",
(ulong) prebuilt->magic_n, (ulong) prebuilt->magic_n,
(ulong) prebuilt->magic_n2); (ulong) prebuilt->magic_n2);
ut_print_name(stderr, prebuilt->table->name); ut_print_name(stderr, NULL, prebuilt->table->name);
putc('\n', stderr); putc('\n', stderr);
mem_analyze_corruption((byte*)prebuilt); mem_analyze_corruption((byte*)prebuilt);
@ -537,7 +550,7 @@ row_update_prebuilt_trx(
"InnoDB: Error: trying to use a corrupt\n" "InnoDB: Error: trying to use a corrupt\n"
"InnoDB: table handle. Magic n %lu, table name", "InnoDB: table handle. Magic n %lu, table name",
(ulong) prebuilt->magic_n); (ulong) prebuilt->magic_n);
ut_print_name(stderr, prebuilt->table->name); ut_print_name(stderr, NULL, prebuilt->table->name);
putc('\n', stderr); putc('\n', stderr);
mem_analyze_corruption((byte*)prebuilt); mem_analyze_corruption((byte*)prebuilt);
@ -851,7 +864,7 @@ row_insert_for_mysql(
"InnoDB: Error: trying to free a corrupt\n" "InnoDB: Error: trying to free a corrupt\n"
"InnoDB: table handle. Magic n %lu, table name", "InnoDB: table handle. Magic n %lu, table name",
(ulong) prebuilt->magic_n); (ulong) prebuilt->magic_n);
ut_print_name(stderr, prebuilt->table->name); ut_print_name(stderr, prebuilt->trx, prebuilt->table->name);
putc('\n', stderr); putc('\n', stderr);
mem_analyze_corruption((byte*)prebuilt); mem_analyze_corruption((byte*)prebuilt);
@ -873,6 +886,8 @@ row_insert_for_mysql(
trx->op_info = "inserting"; trx->op_info = "inserting";
row_mysql_delay_if_needed();
trx_start_if_not_started(trx); trx_start_if_not_started(trx);
if (node == NULL) { if (node == NULL) {
@ -1066,7 +1081,7 @@ row_update_for_mysql(
"InnoDB: Error: trying to free a corrupt\n" "InnoDB: Error: trying to free a corrupt\n"
"InnoDB: table handle. Magic n %lu, table name", "InnoDB: table handle. Magic n %lu, table name",
(ulong) prebuilt->magic_n); (ulong) prebuilt->magic_n);
ut_print_name(stderr, prebuilt->table->name); ut_print_name(stderr, prebuilt->trx, prebuilt->table->name);
putc('\n', stderr); putc('\n', stderr);
mem_analyze_corruption((byte*)prebuilt); mem_analyze_corruption((byte*)prebuilt);
@ -1088,6 +1103,8 @@ row_update_for_mysql(
trx->op_info = "updating or deleting"; trx->op_info = "updating or deleting";
row_mysql_delay_if_needed();
trx_start_if_not_started(trx); trx_start_if_not_started(trx);
node = prebuilt->upd_node; node = prebuilt->upd_node;
@ -1551,7 +1568,7 @@ row_create_table_for_mysql(
if (err == DB_OUT_OF_FILE_SPACE) { if (err == DB_OUT_OF_FILE_SPACE) {
fputs("InnoDB: Warning: cannot create table ", stderr); fputs("InnoDB: Warning: cannot create table ", stderr);
ut_print_name(stderr, table->name); ut_print_name(stderr, trx, table->name);
fputs(" because tablespace full\n", stderr); fputs(" because tablespace full\n", stderr);
row_drop_table_for_mysql(table->name, trx, FALSE); row_drop_table_for_mysql(table->name, trx, FALSE);
@ -1559,7 +1576,7 @@ row_create_table_for_mysql(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error: table ", stderr); fputs(" InnoDB: Error: table ", stderr);
ut_print_name(stderr, table->name); ut_print_name(stderr, trx, table->name);
fputs(" already exists in InnoDB internal\n" fputs(" already exists in InnoDB internal\n"
"InnoDB: data dictionary. Have you deleted the .frm file\n" "InnoDB: data dictionary. Have you deleted the .frm file\n"
"InnoDB: and not used DROP TABLE? Have you used DROP DATABASE\n" "InnoDB: and not used DROP TABLE? Have you used DROP DATABASE\n"
@ -1626,10 +1643,10 @@ row_create_index_for_mysql(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error: column ", stderr); fputs(" InnoDB: Error: column ", stderr);
ut_print_name(stderr, ut_print_name(stderr, trx,
dict_index_get_nth_field(index, i)->name); dict_index_get_nth_field(index, i)->name);
fputs(" appears twice in ", stderr); fputs(" appears twice in ", stderr);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, trx, index);
fputs("\n" fputs("\n"
"InnoDB: This is not allowed in InnoDB.\n", "InnoDB: This is not allowed in InnoDB.\n",
stderr); stderr);
@ -1778,7 +1795,7 @@ row_drop_table_for_mysql_in_background(
if (error != DB_SUCCESS) { if (error != DB_SUCCESS) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error: Dropping table ", stderr); fputs(" InnoDB: Error: Dropping table ", stderr);
ut_print_name(stderr, name); ut_print_name(stderr, trx, name);
fputs(" in background drop list failed\n", stderr); fputs(" in background drop list failed\n", stderr);
} }
@ -1857,9 +1874,9 @@ already_dropped:
UT_LIST_REMOVE(row_mysql_drop_list, row_mysql_drop_list, drop); UT_LIST_REMOVE(row_mysql_drop_list, row_mysql_drop_list, drop);
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Dropped table ", stderr); fprintf(stderr,
ut_print_name(stderr, drop->table_name); " InnoDB: Dropped table %s in background drop queue.\n",
fputs(" in background drop queue.\n", stderr); drop->table_name);
mem_free(drop->table_name); mem_free(drop->table_name);
@ -2014,7 +2031,7 @@ row_discard_tablespace_for_mysql(
if (table->space == 0) { if (table->space == 0) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error: table ", stderr); fputs(" InnoDB: Error: table ", stderr);
ut_print_name(stderr, name); ut_print_name(stderr, trx, name);
fputs("\n" fputs("\n"
"InnoDB: is in the system tablespace 0 which cannot be discarded\n", stderr); "InnoDB: is in the system tablespace 0 which cannot be discarded\n", stderr);
err = DB_ERROR; err = DB_ERROR;
@ -2148,7 +2165,7 @@ row_import_tablespace_for_mysql(
if (table->space == 0) { if (table->space == 0) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error: table ", stderr); fputs(" InnoDB: Error: table ", stderr);
ut_print_name(stderr, name); ut_print_name(stderr, trx, name);
fputs("\n" fputs("\n"
"InnoDB: is in the system tablespace 0 which cannot be imported\n", stderr); "InnoDB: is in the system tablespace 0 which cannot be imported\n", stderr);
err = DB_ERROR; err = DB_ERROR;
@ -2161,7 +2178,7 @@ row_import_tablespace_for_mysql(
fputs( fputs(
" InnoDB: Error: you are trying to IMPORT a tablespace\n" " InnoDB: Error: you are trying to IMPORT a tablespace\n"
"InnoDB: ", stderr); "InnoDB: ", stderr);
ut_print_name(stderr, name); ut_print_name(stderr, trx, name);
fputs(", though you have not called DISCARD on it yet\n" fputs(", though you have not called DISCARD on it yet\n"
"InnoDB: during the lifetime of the mysqld process!\n", stderr); "InnoDB: during the lifetime of the mysqld process!\n", stderr);
@ -2378,7 +2395,7 @@ row_drop_table_for_mysql(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error: table ", stderr); fputs(" InnoDB: Error: table ", stderr);
ut_print_name(stderr, name); ut_print_name(stderr, trx, name);
fputs(" does not exist in the InnoDB internal\n" fputs(" does not exist in the InnoDB internal\n"
"InnoDB: data dictionary though MySQL is trying to drop it.\n" "InnoDB: data dictionary though MySQL is trying to drop it.\n"
"InnoDB: Have you copied the .frm file of the table to the\n" "InnoDB: Have you copied the .frm file of the table to the\n"
@ -2412,10 +2429,10 @@ row_drop_table_for_mysql(
ut_print_timestamp(ef); ut_print_timestamp(ef);
fputs(" Cannot drop table ", ef); fputs(" Cannot drop table ", ef);
ut_print_name(ef, name); ut_print_name(ef, trx, name);
fputs("\n" fputs("\n"
"because it is referenced by ", ef); "because it is referenced by ", ef);
ut_print_name(ef, foreign->foreign_table_name); ut_print_name(ef, trx, foreign->foreign_table_name);
putc('\n', ef); putc('\n', ef);
mutex_exit(&dict_foreign_err_mutex); mutex_exit(&dict_foreign_err_mutex);
@ -2427,7 +2444,7 @@ row_drop_table_for_mysql(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Warning: MySQL is trying to drop table ", fputs(" InnoDB: Warning: MySQL is trying to drop table ",
stderr); stderr);
ut_print_name(stderr, table->name); ut_print_name(stderr, trx, table->name);
fputs("\n" fputs("\n"
"InnoDB: though there are still open handles to it.\n" "InnoDB: though there are still open handles to it.\n"
"InnoDB: Adding the table to the background drop queue.\n", "InnoDB: Adding the table to the background drop queue.\n",
@ -2444,7 +2461,7 @@ row_drop_table_for_mysql(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: You are trying to drop table ", stderr); fputs(" InnoDB: You are trying to drop table ", stderr);
ut_print_name(stderr, table->name); ut_print_name(stderr, trx, table->name);
fputs("\n" fputs("\n"
"InnoDB: though there are foreign key check running on it.\n" "InnoDB: though there are foreign key check running on it.\n"
"InnoDB: Adding the table to the background drop queue.\n", "InnoDB: Adding the table to the background drop queue.\n",
@ -2486,7 +2503,7 @@ row_drop_table_for_mysql(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error: not able to remove table ", fputs(" InnoDB: Error: not able to remove table ",
stderr); stderr);
ut_print_name(stderr, name); ut_print_name(stderr, trx, name);
fputs(" from the dictionary cache!\n", stderr); fputs(" from the dictionary cache!\n", stderr);
err = DB_ERROR; err = DB_ERROR;
} }
@ -2509,7 +2526,7 @@ row_drop_table_for_mysql(
fprintf(stderr, fprintf(stderr,
" InnoDB: Error: not able to delete tablespace %lu of table ", " InnoDB: Error: not able to delete tablespace %lu of table ",
(ulong) space_id); (ulong) space_id);
ut_print_name(stderr, name); ut_print_name(stderr, trx, name);
fputs("!\n", stderr); fputs("!\n", stderr);
err = DB_ERROR; err = DB_ERROR;
} }
@ -2573,10 +2590,10 @@ loop:
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs( fputs(
" InnoDB: Warning: MySQL is trying to drop database ", stderr); " InnoDB: Warning: MySQL is trying to drop database ", stderr);
ut_print_name(stderr, name); ut_print_name(stderr, trx, name);
fputs("\n" fputs("\n"
"InnoDB: though there are still open handles to table ", stderr); "InnoDB: though there are still open handles to table ", stderr);
ut_print_name(stderr, table_name); ut_print_name(stderr, trx, table_name);
fputs(".\n", stderr); fputs(".\n", stderr);
os_thread_sleep(1000000); os_thread_sleep(1000000);
@ -2592,10 +2609,10 @@ loop:
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
fputs("InnoDB: DROP DATABASE ", stderr); fputs("InnoDB: DROP DATABASE ", stderr);
ut_print_name(stderr, name); ut_print_name(stderr, trx, name);
fprintf(stderr, " failed with error %lu for table ", fprintf(stderr, " failed with error %lu for table ",
(ulint) err); (ulint) err);
ut_print_name(stderr, table_name); ut_print_name(stderr, trx, table_name);
putc('\n', stderr); putc('\n', stderr);
break; break;
} }
@ -2776,7 +2793,7 @@ row_rename_table_for_mysql(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error: table ", stderr); fputs(" InnoDB: Error: table ", stderr);
ut_print_name(stderr, old_name); ut_print_name(stderr, trx, old_name);
fputs(" does not exist in the InnoDB internal\n" fputs(" does not exist in the InnoDB internal\n"
"InnoDB: data dictionary though MySQL is trying to rename the table.\n" "InnoDB: data dictionary though MySQL is trying to rename the table.\n"
"InnoDB: Have you copied the .frm file of the table to the\n" "InnoDB: Have you copied the .frm file of the table to the\n"
@ -2791,7 +2808,7 @@ row_rename_table_for_mysql(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error: table ", stderr); fputs(" InnoDB: Error: table ", stderr);
ut_print_name(stderr, old_name); ut_print_name(stderr, trx, old_name);
fputs( fputs(
" does not have an .ibd file in the database directory.\n" " does not have an .ibd file in the database directory.\n"
"InnoDB: You can look for further help from section 15.1 of\n" "InnoDB: You can look for further help from section 15.1 of\n"
@ -2923,16 +2940,16 @@ row_rename_table_for_mysql(
if (err == DB_DUPLICATE_KEY) { if (err == DB_DUPLICATE_KEY) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error: table ", stderr); fputs(" InnoDB: Error: table ", stderr);
ut_print_name(stderr, new_name); ut_print_name(stderr, trx, new_name);
fputs(" exists in the InnoDB internal data\n" fputs(" exists in the InnoDB internal data\n"
"InnoDB: dictionary though MySQL is trying rename table ", stderr); "InnoDB: dictionary though MySQL is trying rename table ", stderr);
ut_print_name(stderr, old_name); ut_print_name(stderr, trx, old_name);
fputs(" to it.\n" fputs(" to it.\n"
"InnoDB: Have you deleted the .frm file and not used DROP TABLE?\n" "InnoDB: Have you deleted the .frm file and not used DROP TABLE?\n"
"InnoDB: You can look for further help from section 15.1 of\n" "InnoDB: You can look for further help from section 15.1 of\n"
"InnoDB: http://www.innodb.com/ibman.php\n" "InnoDB: http://www.innodb.com/ibman.php\n"
"InnoDB: If table ", stderr); "InnoDB: If table ", stderr);
ut_print_name(stderr, new_name); ut_print_name(stderr, trx, new_name);
fputs(" is a temporary table #sql..., then it can be that\n" fputs(" is a temporary table #sql..., then it can be that\n"
"InnoDB: there are still queries running on the table, and it will be\n" "InnoDB: there are still queries running on the table, and it will be\n"
"InnoDB: dropped automatically when the queries end.\n" "InnoDB: dropped automatically when the queries end.\n"
@ -2958,9 +2975,9 @@ row_rename_table_for_mysql(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error in table rename, cannot rename ", fputs(" InnoDB: Error in table rename, cannot rename ",
stderr); stderr);
ut_print_name(stderr, old_name); ut_print_name(stderr, trx, old_name);
fputs(" to ", stderr); fputs(" to ", stderr);
ut_print_name(stderr, new_name); ut_print_name(stderr, trx, new_name);
putc('\n', stderr); putc('\n', stderr);
err = DB_ERROR; err = DB_ERROR;
@ -2982,14 +2999,14 @@ row_rename_table_for_mysql(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error: in ALTER TABLE ", fputs(" InnoDB: Error: in ALTER TABLE ",
stderr); stderr);
ut_print_name(stderr, new_name); ut_print_name(stderr, trx, new_name);
fputs("\n" fputs("\n"
"InnoDB: has or is referenced in foreign key constraints\n" "InnoDB: has or is referenced in foreign key constraints\n"
"InnoDB: which are not compatible with the new table definition.\n", "InnoDB: which are not compatible with the new table definition.\n",
stderr); stderr);
ut_a(dict_table_rename_in_cache(table, ut_a(dict_table_rename_in_cache(table,
old_name, FALSE)); old_name, FALSE));
trx->error_state = DB_SUCCESS; trx->error_state = DB_SUCCESS;
trx_general_rollback_for_mysql(trx, FALSE, trx_general_rollback_for_mysql(trx, FALSE,
NULL); NULL);
@ -3005,14 +3022,14 @@ row_rename_table_for_mysql(
fputs( fputs(
" InnoDB: Error: in RENAME TABLE table ", " InnoDB: Error: in RENAME TABLE table ",
stderr); stderr);
ut_print_name(stderr, new_name); ut_print_name(stderr, trx, new_name);
fputs("\n" fputs("\n"
"InnoDB: is referenced in foreign key constraints\n" "InnoDB: is referenced in foreign key constraints\n"
"InnoDB: which are not compatible with the new table definition.\n", "InnoDB: which are not compatible with the new table definition.\n",
stderr); stderr);
ut_a(dict_table_rename_in_cache(table, ut_a(dict_table_rename_in_cache(table,
old_name, FALSE)); old_name, FALSE));
trx->error_state = DB_SUCCESS; trx->error_state = DB_SUCCESS;
trx_general_rollback_for_mysql(trx, FALSE, trx_general_rollback_for_mysql(trx, FALSE,
@ -3129,7 +3146,8 @@ loop:
fputs("InnoDB: index records in a wrong order in ", fputs("InnoDB: index records in a wrong order in ",
stderr); stderr);
not_ok: not_ok:
dict_index_name_print(stderr, index); dict_index_name_print(stderr,
prebuilt->trx, index);
fputs("\n" fputs("\n"
"InnoDB: prev record ", stderr); "InnoDB: prev record ", stderr);
dtuple_print(stderr, prev_entry); dtuple_print(stderr, prev_entry);
@ -3215,7 +3233,8 @@ row_check_table_for_mysql(
ret = DB_ERROR; ret = DB_ERROR;
fputs("Error: ", stderr); fputs("Error: ", stderr);
dict_index_name_print(stderr, index); dict_index_name_print(stderr,
prebuilt->trx, index);
fprintf(stderr, fprintf(stderr,
" contains %lu entries, should be %lu\n", " contains %lu entries, should be %lu\n",
(ulong) n_rows, (ulong) n_rows,

View file

@ -543,8 +543,8 @@ row_purge_parse_undo_rec(
node->heap); node->heap);
ptr = trx_undo_update_rec_get_update(ptr, clust_index, type, trx_id, ptr = trx_undo_update_rec_get_update(ptr, clust_index, type, trx_id,
roll_ptr, info_bits, node->heap, roll_ptr, info_bits, trx,
&(node->update)); node->heap, &(node->update));
/* Read to the partial row the fields that occur in indexes */ /* Read to the partial row the fields that occur in indexes */

View file

@ -395,12 +395,13 @@ row_build_row_ref_in_tuple(
dtuple_t* ref, /* in/out: row reference built; see the dtuple_t* ref, /* in/out: row reference built; see the
NOTE below! */ NOTE below! */
dict_index_t* index, /* in: index */ dict_index_t* index, /* in: index */
rec_t* rec) /* in: record in the index; rec_t* rec, /* in: record in the index;
NOTE: the data fields in ref will point NOTE: the data fields in ref will point
directly into this record, therefore, directly into this record, therefore,
the buffer page of this record must be the buffer page of this record must be
at least s-latched and the latch held at least s-latched and the latch held
as long as the row reference is used! */ as long as the row reference is used! */
trx_t* trx) /* in: transaction */
{ {
dict_index_t* clust_index; dict_index_t* clust_index;
dfield_t* dfield; dfield_t* dfield;
@ -415,9 +416,9 @@ row_build_row_ref_in_tuple(
if (!index->table) { if (!index->table) {
fputs("InnoDB: table ", stderr); fputs("InnoDB: table ", stderr);
notfound: notfound:
ut_print_name(stderr, index->table_name); ut_print_name(stderr, trx, index->table_name);
fputs(" for index ", stderr); fputs(" for index ", stderr);
ut_print_name(stderr, index->name); ut_print_name(stderr, trx, index->name);
fputs(" not found\n", stderr); fputs(" not found\n", stderr);
ut_error; ut_error;
} }

View file

@ -1951,7 +1951,8 @@ row_sel_convert_mysql_key_to_innobase(
ulint buf_len, /* in: buffer length */ ulint buf_len, /* in: buffer length */
dict_index_t* index, /* in: index of the key value */ dict_index_t* index, /* in: index of the key value */
byte* key_ptr, /* in: MySQL key value */ byte* key_ptr, /* in: MySQL key value */
ulint key_len) /* in: MySQL key value length */ ulint key_len, /* in: MySQL key value length */
trx_t* trx) /* in: transaction */
{ {
byte* original_buf = buf; byte* original_buf = buf;
byte* original_key_ptr = key_ptr; byte* original_key_ptr = key_ptr;
@ -2034,7 +2035,7 @@ row_sel_convert_mysql_key_to_innobase(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs( fputs(
" InnoDB: Error: BLOB or TEXT prefix > 255 bytes in query to table ", stderr); " InnoDB: Error: BLOB or TEXT prefix > 255 bytes in query to table ", stderr);
ut_print_name(stderr, index->table_name); ut_print_name(stderr, trx, index->table_name);
putc('\n', stderr); putc('\n', stderr);
} }
@ -2078,11 +2079,13 @@ row_sel_convert_mysql_key_to_innobase(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fputs(
" InnoDB: Warning: using a partial-field key prefix in search.\n" " InnoDB: Warning: using a partial-field key prefix in search.\n"
"InnoDB: Table name %s, index name %s. Last data field length %lu bytes,\n" "InnoDB: ", stderr);
dict_index_name_print(stderr, trx, index);
fprintf(stderr, ". Last data field length %lu bytes,\n"
"InnoDB: key ptr now exceeds key end by %lu bytes.\n" "InnoDB: key ptr now exceeds key end by %lu bytes.\n"
"InnoDB: Key value in the MySQL format:\n", index->table_name, index->name, "InnoDB: Key value in the MySQL format:\n",
(ulong) data_field_len, (ulong) data_field_len,
(ulong) (key_ptr - key_end)); (ulong) (key_ptr - key_end));
fflush(stderr); fflush(stderr);
@ -2125,7 +2128,7 @@ row_sel_store_row_id_to_prebuilt(
if (len != DATA_ROW_ID_LEN) { if (len != DATA_ROW_ID_LEN) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Error: Row id field is wrong length %lu in ", (ulong) len); "InnoDB: Error: Row id field is wrong length %lu in ", (ulong) len);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, prebuilt->trx, index);
fprintf(stderr, "\n" fprintf(stderr, "\n"
"InnoDB: Field number %lu, record:\n", "InnoDB: Field number %lu, record:\n",
(ulong) dict_index_get_sys_col_pos(index, DATA_ROW_ID)); (ulong) dict_index_get_sys_col_pos(index, DATA_ROW_ID));
@ -2284,7 +2287,11 @@ row_sel_store_mysql_rec(
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, fprintf(stderr,
" InnoDB: Warning: could not allocate %lu + 1000000 bytes to retrieve\n" " InnoDB: Warning: could not allocate %lu + 1000000 bytes to retrieve\n"
"InnoDB: a big column. Table name %s\n", (ulong) len, prebuilt->table->name); "InnoDB: a big column. Table name ", (ulong) len);
ut_print_name(stderr,
prebuilt->trx,
prebuilt->table->name);
putc('\n', stderr);
if (extern_field_heap) { if (extern_field_heap) {
mem_heap_free( mem_heap_free(
@ -2416,8 +2423,9 @@ row_sel_get_clust_rec_for_mysql(
trx_t* trx; trx_t* trx;
*out_rec = NULL; *out_rec = NULL;
trx = thr_get_trx(thr);
row_build_row_ref_in_tuple(prebuilt->clust_ref, sec_index, rec); row_build_row_ref_in_tuple(prebuilt->clust_ref, sec_index, rec, trx);
clust_index = dict_table_get_first_index(sec_index->table); clust_index = dict_table_get_first_index(sec_index->table);
@ -2450,7 +2458,7 @@ row_sel_get_clust_rec_for_mysql(
fputs(" InnoDB: error clustered record" fputs(" InnoDB: error clustered record"
" for sec rec not found\n" " for sec rec not found\n"
"InnoDB: ", stderr); "InnoDB: ", stderr);
dict_index_name_print(stderr, sec_index); dict_index_name_print(stderr, trx, sec_index);
fputs("\n" fputs("\n"
"InnoDB: sec index record ", stderr); "InnoDB: sec index record ", stderr);
rec_print(stderr, rec); rec_print(stderr, rec);
@ -2458,7 +2466,7 @@ row_sel_get_clust_rec_for_mysql(
"InnoDB: clust index record ", stderr); "InnoDB: clust index record ", stderr);
rec_print(stderr, clust_rec); rec_print(stderr, clust_rec);
putc('\n', stderr); putc('\n', stderr);
trx_print(stderr, thr_get_trx(thr)); trx_print(stderr, trx);
fputs("\n" fputs("\n"
"InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n", stderr); "InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n", stderr);
@ -2486,8 +2494,6 @@ row_sel_get_clust_rec_for_mysql(
/* This is a non-locking consistent read: if necessary, fetch /* This is a non-locking consistent read: if necessary, fetch
a previous version of the record */ a previous version of the record */
trx = thr_get_trx(thr);
old_vers = NULL; old_vers = NULL;
/* If the isolation level allows reading of uncommitted data, /* If the isolation level allows reading of uncommitted data,
@ -2812,7 +2818,7 @@ row_search_for_mysql(
"InnoDB: Error: trying to free a corrupt\n" "InnoDB: Error: trying to free a corrupt\n"
"InnoDB: table handle. Magic n %lu, table name ", "InnoDB: table handle. Magic n %lu, table name ",
(ulong) prebuilt->magic_n); (ulong) prebuilt->magic_n);
ut_print_name(stderr, prebuilt->table->name); ut_print_name(stderr, trx, prebuilt->table->name);
putc('\n', stderr); putc('\n', stderr);
mem_analyze_corruption((byte*)prebuilt); mem_analyze_corruption((byte*)prebuilt);
@ -3246,7 +3252,7 @@ rec_loop:
(ulong) (rec - buf_frame_align(rec)), (ulong) (rec - buf_frame_align(rec)),
(ulong) next_offs, (ulong) next_offs,
(ulong) buf_frame_get_page_no(rec)); (ulong) buf_frame_get_page_no(rec));
dict_index_name_print(stderr, index); dict_index_name_print(stderr, trx, index);
fputs(". Run CHECK TABLE. You may need to\n" fputs(". Run CHECK TABLE. You may need to\n"
"InnoDB: restore from a backup, or dump + drop + reimport the table.\n", "InnoDB: restore from a backup, or dump + drop + reimport the table.\n",
stderr); stderr);
@ -3264,7 +3270,7 @@ rec_loop:
(ulong) (rec - buf_frame_align(rec)), (ulong) (rec - buf_frame_align(rec)),
(ulong) next_offs, (ulong) next_offs,
(ulong) buf_frame_get_page_no(rec)); (ulong) buf_frame_get_page_no(rec));
dict_index_name_print(stderr, index); dict_index_name_print(stderr, trx, index);
fputs(". We try to skip the rest of the page.\n", fputs(". We try to skip the rest of the page.\n",
stderr); stderr);
@ -3283,7 +3289,7 @@ rec_loop:
(ulong) (rec - buf_frame_align(rec)), (ulong) (rec - buf_frame_align(rec)),
(ulong) next_offs, (ulong) next_offs,
(ulong) buf_frame_get_page_no(rec)); (ulong) buf_frame_get_page_no(rec));
dict_index_name_print(stderr, index); dict_index_name_print(stderr, trx, index);
fputs(". We try to skip the record.\n", fputs(". We try to skip the record.\n",
stderr); stderr);

View file

@ -422,6 +422,7 @@ row_undo_mod_del_unmark_sec_and_undo_update(
ibool found; ibool found;
big_rec_t* dummy_big_rec; big_rec_t* dummy_big_rec;
mtr_t mtr; mtr_t mtr;
trx_t* trx = thr_get_trx(thr);
log_free_check(); log_free_check();
mtr_start(&mtr); mtr_start(&mtr);
@ -431,7 +432,7 @@ row_undo_mod_del_unmark_sec_and_undo_update(
if (!found) { if (!found) {
fputs("InnoDB: error in sec index entry del undo in\n" fputs("InnoDB: error in sec index entry del undo in\n"
"InnoDB: ", stderr); "InnoDB: ", stderr);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, trx, index);
fputs("\n" fputs("\n"
"InnoDB: tuple ", stderr); "InnoDB: tuple ", stderr);
dtuple_print(stderr, entry); dtuple_print(stderr, entry);
@ -439,7 +440,7 @@ row_undo_mod_del_unmark_sec_and_undo_update(
"InnoDB: record ", stderr); "InnoDB: record ", stderr);
rec_print(stderr, btr_pcur_get_rec(&pcur)); rec_print(stderr, btr_pcur_get_rec(&pcur));
putc('\n', stderr); putc('\n', stderr);
trx_print(stderr, thr_get_trx(thr)); trx_print(stderr, trx);
fputs("\n" fputs("\n"
"InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n", stderr); "InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n", stderr);
} else { } else {
@ -451,7 +452,7 @@ row_undo_mod_del_unmark_sec_and_undo_update(
heap = mem_heap_create(100); heap = mem_heap_create(100);
update = row_upd_build_sec_rec_difference_binary(index, entry, update = row_upd_build_sec_rec_difference_binary(index, entry,
btr_cur_get_rec(btr_cur), heap); btr_cur_get_rec(btr_cur), trx, heap);
if (upd_get_n_fields(update) == 0) { if (upd_get_n_fields(update) == 0) {
/* Do nothing */ /* Do nothing */
@ -671,14 +672,15 @@ row_undo_mod_parse_undo_rec(
ulint type; ulint type;
ulint cmpl_info; ulint cmpl_info;
ibool dummy_extern; ibool dummy_extern;
trx_t* trx;
ut_ad(node && thr); ut_ad(node && thr);
trx = thr_get_trx(thr);
ptr = trx_undo_rec_get_pars(node->undo_rec, &type, &cmpl_info, ptr = trx_undo_rec_get_pars(node->undo_rec, &type, &cmpl_info,
&dummy_extern, &undo_no, &table_id); &dummy_extern, &undo_no, &table_id);
node->rec_type = type; node->rec_type = type;
node->table = dict_table_get_on_id(table_id, thr_get_trx(thr)); node->table = dict_table_get_on_id(table_id, trx);
/* TODO: other fixes associated with DROP TABLE + rollback in the /* TODO: other fixes associated with DROP TABLE + rollback in the
same table by another user */ same table by another user */
@ -704,8 +706,8 @@ row_undo_mod_parse_undo_rec(
node->heap); node->heap);
trx_undo_update_rec_get_update(ptr, clust_index, type, trx_id, trx_undo_update_rec_get_update(ptr, clust_index, type, trx_id,
roll_ptr, info_bits, node->heap, roll_ptr, info_bits, trx,
&(node->update)); node->heap, &(node->update));
node->new_roll_ptr = roll_ptr; node->new_roll_ptr = roll_ptr;
node->new_trx_id = trx_id; node->new_trx_id = trx_id;
node->cmpl_info = cmpl_info; node->cmpl_info = cmpl_info;

View file

@ -685,6 +685,7 @@ row_upd_build_sec_rec_difference_binary(
dict_index_t* index, /* in: index */ dict_index_t* index, /* in: index */
dtuple_t* entry, /* in: entry to insert */ dtuple_t* entry, /* in: entry to insert */
rec_t* rec, /* in: secondary index record */ rec_t* rec, /* in: secondary index record */
trx_t* trx, /* in: transaction */
mem_heap_t* heap) /* in: memory heap from which allocated */ mem_heap_t* heap) /* in: memory heap from which allocated */
{ {
upd_field_t* upd_field; upd_field_t* upd_field;
@ -725,7 +726,7 @@ row_upd_build_sec_rec_difference_binary(
dfield_copy(&(upd_field->new_val), dfield); dfield_copy(&(upd_field->new_val), dfield);
upd_field_set_field_no(upd_field, i, index); upd_field_set_field_no(upd_field, i, index, trx);
upd_field->extern_storage = FALSE; upd_field->extern_storage = FALSE;
@ -754,6 +755,7 @@ row_upd_build_difference_binary(
externally stored fields in entry, or NULL */ externally stored fields in entry, or NULL */
ulint n_ext_vec,/* in: number of fields in ext_vec */ ulint n_ext_vec,/* in: number of fields in ext_vec */
rec_t* rec, /* in: clustered index record */ rec_t* rec, /* in: clustered index record */
trx_t* trx, /* in: transaction */
mem_heap_t* heap) /* in: memory heap from which allocated */ mem_heap_t* heap) /* in: memory heap from which allocated */
{ {
upd_field_t* upd_field; upd_field_t* upd_field;
@ -800,7 +802,7 @@ row_upd_build_difference_binary(
dfield_copy(&(upd_field->new_val), dfield); dfield_copy(&(upd_field->new_val), dfield);
upd_field_set_field_no(upd_field, i, index); upd_field_set_field_no(upd_field, i, index, trx);
if (upd_ext_vec_contains(ext_vec, n_ext_vec, i)) { if (upd_ext_vec_contains(ext_vec, n_ext_vec, i)) {
upd_field->extern_storage = TRUE; upd_field->extern_storage = TRUE;
@ -1220,10 +1222,11 @@ row_upd_sec_index_entry(
rec_t* rec; rec_t* rec;
ulint err = DB_SUCCESS; ulint err = DB_SUCCESS;
mtr_t mtr; mtr_t mtr;
trx_t* trx = thr_get_trx(thr);
index = node->index; index = node->index;
check_ref = row_upd_index_is_referenced(index, thr_get_trx(thr)); check_ref = row_upd_index_is_referenced(index, trx);
heap = mem_heap_create(1024); heap = mem_heap_create(1024);
@ -1242,7 +1245,7 @@ row_upd_sec_index_entry(
if (!found) { if (!found) {
fputs("InnoDB: error in sec index entry update in\n" fputs("InnoDB: error in sec index entry update in\n"
"InnoDB: ", stderr); "InnoDB: ", stderr);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, trx, index);
fputs("\n" fputs("\n"
"InnoDB: tuple ", stderr); "InnoDB: tuple ", stderr);
dtuple_print(stderr, entry); dtuple_print(stderr, entry);
@ -1251,7 +1254,7 @@ row_upd_sec_index_entry(
rec_print(stderr, rec); rec_print(stderr, rec);
putc('\n', stderr); putc('\n', stderr);
trx_print(stderr, thr_get_trx(thr)); trx_print(stderr, trx);
fputs("\n" fputs("\n"
"InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n", stderr); "InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n", stderr);

View file

@ -58,6 +58,10 @@ ulint srv_activity_count = 0;
/* The following is the maximum allowed duration of a lock wait. */ /* The following is the maximum allowed duration of a lock wait. */
ulint srv_fatal_semaphore_wait_threshold = 600; ulint srv_fatal_semaphore_wait_threshold = 600;
/* How much data manipulation language (DML) statements need to be delayed,
in microseconds, in order to reduce the lagging of the purge thread. */
ulint srv_dml_needed_delay = 0;
ibool srv_lock_timeout_and_monitor_active = FALSE; ibool srv_lock_timeout_and_monitor_active = FALSE;
ibool srv_error_monitor_active = FALSE; ibool srv_error_monitor_active = FALSE;
@ -258,6 +262,8 @@ disable adaptive hash indexes */
ibool srv_use_awe = FALSE; ibool srv_use_awe = FALSE;
ibool srv_use_adaptive_hash_indexes = TRUE; ibool srv_use_adaptive_hash_indexes = TRUE;
/* Maximum allowable purge history length. <=0 means 'infinite'. */
ulint srv_max_purge_lag = 0;
/*-------------------------------------------*/ /*-------------------------------------------*/
ulint srv_n_spin_wait_rounds = 20; ulint srv_n_spin_wait_rounds = 20;

View file

@ -295,6 +295,9 @@ trx_purge_add_update_undo_to_history(
/* Add the log as the first in the history list */ /* Add the log as the first in the history list */
flst_add_first(rseg_header + TRX_RSEG_HISTORY, flst_add_first(rseg_header + TRX_RSEG_HISTORY,
undo_header + TRX_UNDO_HISTORY_NODE, mtr); undo_header + TRX_UNDO_HISTORY_NODE, mtr);
mutex_enter(&kernel_mutex);
trx_sys->rseg_history_len++;
mutex_exit(&kernel_mutex);
/* Write the trx number to the undo log header */ /* Write the trx number to the undo log header */
mlog_write_dulint(undo_header + TRX_UNDO_TRX_NO, trx->no, mtr); mlog_write_dulint(undo_header + TRX_UNDO_TRX_NO, trx->no, mtr);
@ -386,6 +389,12 @@ loop:
flst_cut_end(rseg_hdr + TRX_RSEG_HISTORY, flst_cut_end(rseg_hdr + TRX_RSEG_HISTORY,
log_hdr + TRX_UNDO_HISTORY_NODE, n_removed_logs, &mtr); log_hdr + TRX_UNDO_HISTORY_NODE, n_removed_logs, &mtr);
mutex_enter(&kernel_mutex);
ut_ad(trx_sys->rseg_history_len >= n_removed_logs);
trx_sys->rseg_history_len -= n_removed_logs;
mutex_exit(&kernel_mutex);
freed = FALSE; freed = FALSE;
while (!freed) { while (!freed) {
@ -470,6 +479,11 @@ loop:
} }
if (cmp >= 0) { if (cmp >= 0) {
mutex_enter(&kernel_mutex);
ut_a(trx_sys->rseg_history_len >= n_removed_logs);
trx_sys->rseg_history_len -= n_removed_logs;
mutex_exit(&kernel_mutex);
flst_truncate_end(rseg_hdr + TRX_RSEG_HISTORY, flst_truncate_end(rseg_hdr + TRX_RSEG_HISTORY,
log_hdr + TRX_UNDO_HISTORY_NODE, log_hdr + TRX_UNDO_HISTORY_NODE,
n_removed_logs, &mtr); n_removed_logs, &mtr);
@ -1031,6 +1045,27 @@ trx_purge(void)
purge_sys->view = NULL; purge_sys->view = NULL;
mem_heap_empty(purge_sys->heap); mem_heap_empty(purge_sys->heap);
/* Determine how much data manipulation language (DML) statements
need to be delayed in order to reduce the lagging of the purge
thread. */
srv_dml_needed_delay = 0; /* in microseconds; default: no delay */
/* If we cannot advance the 'purge view' because of an old
'consistent read view', then the DML statements cannot be delayed.
Also, srv_max_purge_lag <= 0 means 'infinity'. */
if (srv_max_purge_lag > 0
&& !UT_LIST_GET_LAST(trx_sys->view_list)) {
float ratio = (float) trx_sys->rseg_history_len
/ srv_max_purge_lag;
if (ratio > 1) {
/* If the history list length exceeds the
innodb_max_purge_lag, the
data manipulation statements are delayed
by at least 5000 microseconds. */
srv_dml_needed_delay = (ratio - .5) * 10000;
}
}
purge_sys->view = read_view_oldest_copy_or_open_new(NULL, purge_sys->view = read_view_oldest_copy_or_open_new(NULL,
purge_sys->heap); purge_sys->heap);
mutex_exit(&kernel_mutex); mutex_exit(&kernel_mutex);

View file

@ -770,6 +770,7 @@ trx_undo_update_rec_get_update(
dulint trx_id, /* in: transaction id from this undo record */ dulint trx_id, /* in: transaction id from this undo record */
dulint roll_ptr,/* in: roll pointer from this undo record */ dulint roll_ptr,/* in: roll pointer from this undo record */
ulint info_bits,/* in: info bits from this undo record */ ulint info_bits,/* in: info bits from this undo record */
trx_t* trx, /* in: transaction */
mem_heap_t* heap, /* in: memory heap from which the memory mem_heap_t* heap, /* in: memory heap from which the memory
needed is allocated */ needed is allocated */
upd_t** upd) /* out, own: update vector */ upd_t** upd) /* out, own: update vector */
@ -803,7 +804,7 @@ trx_undo_update_rec_get_update(
upd_field_set_field_no(upd_field, upd_field_set_field_no(upd_field,
dict_index_get_sys_col_pos(index, DATA_TRX_ID), dict_index_get_sys_col_pos(index, DATA_TRX_ID),
index); index, trx);
dfield_set_data(&(upd_field->new_val), buf, DATA_TRX_ID_LEN); dfield_set_data(&(upd_field->new_val), buf, DATA_TRX_ID_LEN);
upd_field = upd_get_nth_field(update, n_fields + 1); upd_field = upd_get_nth_field(update, n_fields + 1);
@ -812,7 +813,7 @@ trx_undo_update_rec_get_update(
upd_field_set_field_no(upd_field, upd_field_set_field_no(upd_field,
dict_index_get_sys_col_pos(index, DATA_ROLL_PTR), dict_index_get_sys_col_pos(index, DATA_ROLL_PTR),
index); index, trx);
dfield_set_data(&(upd_field->new_val), buf, DATA_ROLL_PTR_LEN); dfield_set_data(&(upd_field->new_val), buf, DATA_ROLL_PTR_LEN);
/* Store then the updated ordinary columns to the update vector */ /* Store then the updated ordinary columns to the update vector */
@ -824,13 +825,13 @@ trx_undo_update_rec_get_update(
if (field_no >= dict_index_get_n_fields(index)) { if (field_no >= dict_index_get_n_fields(index)) {
fprintf(stderr, fprintf(stderr,
"InnoDB: Error: trying to access update undo rec field %lu in ", (ulong) field_no); "InnoDB: Error: trying to access update undo rec field %lu in ", (ulong) field_no);
dict_index_name_print(stderr, index); dict_index_name_print(stderr, trx, index);
fprintf(stderr, "\n" fprintf(stderr, "\n"
"InnoDB: but index has only %lu fields\n" "InnoDB: but index has only %lu fields\n"
"InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n" "InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n"
"InnoDB: Run also CHECK TABLE ", "InnoDB: Run also CHECK TABLE ",
(ulong) dict_index_get_n_fields(index)); (ulong) dict_index_get_n_fields(index));
ut_print_name(stderr, index->table_name); ut_print_name(stderr, trx, index->table_name);
fprintf(stderr, "\n" fprintf(stderr, "\n"
"InnoDB: n_fields = %lu, i = %lu, ptr %p\n", "InnoDB: n_fields = %lu, i = %lu, ptr %p\n",
(ulong) n_fields, (ulong) i, ptr); (ulong) n_fields, (ulong) i, ptr);
@ -841,7 +842,7 @@ trx_undo_update_rec_get_update(
upd_field = upd_get_nth_field(update, i); upd_field = upd_get_nth_field(update, i);
upd_field_set_field_no(upd_field, field_no, index); upd_field_set_field_no(upd_field, field_no, index, trx);
if (len != UNIV_SQL_NULL && len >= UNIV_EXTERN_STORAGE_FIELD) { if (len != UNIV_SQL_NULL && len >= UNIV_EXTERN_STORAGE_FIELD) {
@ -1266,12 +1267,11 @@ trx_undo_prev_version_build(
mtr_memo_contains(index_mtr, buf_block_align(index_rec), mtr_memo_contains(index_mtr, buf_block_align(index_rec),
MTR_MEMO_PAGE_X_FIX)); MTR_MEMO_PAGE_X_FIX));
if (!(index->type & DICT_CLUSTERED)) { if (!(index->type & DICT_CLUSTERED)) {
fputs("InnoDB: Error: trying to access" fprintf(stderr, "InnoDB: Error: trying to access"
" update undo rec for non-clustered ", stderr); " update undo rec for non-clustered index %s\n"
dict_index_name_print(stderr, index); "InnoDB: Submit a detailed bug report to"
fputs("\n" " http://bugs.mysql.com\n"
"InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n" "InnoDB: index record ", index->name);
"InnoDB: index record ", stderr);
rec_print(stderr, index_rec); rec_print(stderr, index_rec);
fputs("\n" fputs("\n"
"InnoDB: record version ", stderr); "InnoDB: record version ", stderr);
@ -1309,32 +1309,29 @@ trx_undo_prev_version_build(
ptr = trx_undo_rec_skip_row_ref(ptr, index); ptr = trx_undo_rec_skip_row_ref(ptr, index);
ptr = trx_undo_update_rec_get_update(ptr, index, type, trx_id, ptr = trx_undo_update_rec_get_update(ptr, index, type, trx_id,
roll_ptr, info_bits, heap, &update); roll_ptr, info_bits, NULL, heap, &update);
if (ut_dulint_cmp(table_id, index->table->id) != 0) { if (ut_dulint_cmp(table_id, index->table->id) != 0) {
ptr = NULL; ptr = NULL;
fputs("InnoDB: Error: trying to access" fprintf(stderr,
" update undo rec for table ", stderr); "InnoDB: Error: trying to access update undo rec for table %s\n"
ut_print_name(stderr, index->table_name);
fputs("\n"
"InnoDB: but the table id in the undo record is wrong\n" "InnoDB: but the table id in the undo record is wrong\n"
"InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n" "InnoDB: Submit a detailed bug report to http://bugs.mysql.com\n"
"InnoDB: Run also CHECK TABLE ", stderr); "InnoDB: Run also CHECK TABLE %s\n",
ut_print_name(stderr, index->table_name); index->table_name, index->table_name);
putc('\n', stderr);
} }
if (ptr == NULL) { if (ptr == NULL) {
/* The record was corrupted, return an error; these printfs /* The record was corrupted, return an error; these printfs
should catch an elusive bug in row_vers_old_has_index_entry */ should catch an elusive bug in row_vers_old_has_index_entry */
fputs("InnoDB: ", stderr); fprintf(stderr,
dict_index_name_print(stderr, index); "InnoDB: table %s, index %s, n_uniq %lu\n"
fprintf(stderr, ", n_uniq %lu\n"
"InnoDB: undo rec address %p, type %lu cmpl_info %lu\n" "InnoDB: undo rec address %p, type %lu cmpl_info %lu\n"
"InnoDB: undo rec table id %lu %lu, index table id %lu %lu\n" "InnoDB: undo rec table id %lu %lu, index table id %lu %lu\n"
"InnoDB: dump of 150 bytes in undo rec: ", "InnoDB: dump of 150 bytes in undo rec: ",
index->table_name, index->name,
(ulong) dict_index_get_n_unique(index), (ulong) dict_index_get_n_unique(index),
undo_rec, (ulong) type, (ulong) cmpl_info, undo_rec, (ulong) type, (ulong) cmpl_info,
(ulong) ut_dulint_get_high(table_id), (ulong) ut_dulint_get_high(table_id),

View file

@ -229,7 +229,7 @@ trx_rollback_to_savepoint_for_mysql(
if (trx->conc_state == TRX_NOT_STARTED) { if (trx->conc_state == TRX_NOT_STARTED) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fputs(" InnoDB: Error: transaction has a savepoint ", stderr); fputs(" InnoDB: Error: transaction has a savepoint ", stderr);
ut_print_name(stderr, savep->name); ut_print_name(stderr, trx, savep->name);
fputs(" though it is not started\n", stderr); fputs(" though it is not started\n", stderr);
return(DB_ERROR); return(DB_ERROR);
} }
@ -467,7 +467,7 @@ loop:
if (table) { if (table) {
fputs("InnoDB: Table found: dropping table ", stderr); fputs("InnoDB: Table found: dropping table ", stderr);
ut_print_name(stderr, table->name); ut_print_name(stderr, trx, table->name);
fputs(" in recovery\n", stderr); fputs(" in recovery\n", stderr);
err = row_drop_table_for_mysql(table->name, trx, TRUE); err = row_drop_table_for_mysql(table->name, trx, TRUE);

View file

@ -135,6 +135,7 @@ trx_rseg_mem_create(
trx_ulogf_t* undo_log_hdr; trx_ulogf_t* undo_log_hdr;
fil_addr_t node_addr; fil_addr_t node_addr;
ulint sum_of_undo_sizes; ulint sum_of_undo_sizes;
ulint len;
#ifdef UNIV_SYNC_DEBUG #ifdef UNIV_SYNC_DEBUG
ut_ad(mutex_own(&kernel_mutex)); ut_ad(mutex_own(&kernel_mutex));
@ -166,7 +167,9 @@ trx_rseg_mem_create(
MLOG_4BYTES, mtr) MLOG_4BYTES, mtr)
+ 1 + sum_of_undo_sizes; + 1 + sum_of_undo_sizes;
if (flst_get_len(rseg_header + TRX_RSEG_HISTORY, mtr) > 0) { len = flst_get_len(rseg_header + TRX_RSEG_HISTORY, mtr);
if (len > 0) {
trx_sys->rseg_history_len += len;
node_addr = trx_purge_get_log_from_hist( node_addr = trx_purge_get_log_from_hist(
flst_get_last(rseg_header + TRX_RSEG_HISTORY, flst_get_last(rseg_header + TRX_RSEG_HISTORY,
@ -206,6 +209,8 @@ trx_rseg_list_and_array_init(
UT_LIST_INIT(trx_sys->rseg_list); UT_LIST_INIT(trx_sys->rseg_list);
trx_sys->rseg_history_len = 0;
for (i = 0; i < TRX_SYS_N_RSEGS; i++) { for (i = 0; i < TRX_SYS_N_RSEGS; i++) {
page_no = trx_sysf_rseg_get_page_no(sys_header, i, mtr); page_no = trx_sysf_rseg_get_page_no(sys_header, i, mtr);

View file

@ -16,18 +16,22 @@ Created 5/11/1994 Heikki Tuuri
#include <string.h> #include <string.h>
#include "ut0sort.h" #include "ut0sort.h"
#include "trx0trx.h"
ibool ut_always_false = FALSE; ibool ut_always_false = FALSE;
/********************************************************************* /*********************************************************************
Get the quote character to be used in SQL identifiers. Get the quote character to be used in SQL identifiers.
This definition must match the one in sql/ha_innodb.cc! */ This definition must match the one in sql/ha_innodb.cc! */
extern
char int
mysql_get_identifier_quote_char(void); mysql_get_identifier_quote_char(
/*=================================*/ /*============================*/
/* out: quote character to be /* out: quote character to be
used in SQL identifiers */ used in SQL identifiers; EOF if none */
trx_t* trx, /* in: transaction */
const char* name, /* in: name to print */
ulint namelen);/* in: length of name */
/************************************************************ /************************************************************
Gets the high 32 bits in a ulint. That is makes a shift >> 32, Gets the high 32 bits in a ulint. That is makes a shift >> 32,
@ -333,6 +337,31 @@ ut_2_power_up(
return(res); return(res);
} }
/**************************************************************************
Outputs a NUL-terminated file name, quoted with apostrophes. */
void
ut_print_filename(
/*==============*/
FILE* f, /* in: output stream */
const char* name) /* in: name to print */
{
putc('\'', f);
for (;;) {
int c = *name++;
switch (c) {
case 0:
goto done;
case '\'':
putc(c, f);
/* fall through */
default:
putc(c, f);
}
}
done:
putc('\'', f);
}
/************************************************************************** /**************************************************************************
Outputs a NUL-terminated string, quoted as an SQL identifier. */ Outputs a NUL-terminated string, quoted as an SQL identifier. */
@ -341,9 +370,10 @@ void
ut_print_name( ut_print_name(
/*==========*/ /*==========*/
FILE* f, /* in: output stream */ FILE* f, /* in: output stream */
trx_t* trx, /* in: transaction */
const char* name) /* in: name to print */ const char* name) /* in: name to print */
{ {
ut_print_namel(f, name, strlen(name)); ut_print_namel(f, trx, name, strlen(name));
} }
/************************************************************************** /**************************************************************************
@ -353,12 +383,17 @@ void
ut_print_namel( ut_print_namel(
/*==========*/ /*==========*/
FILE* f, /* in: output stream */ FILE* f, /* in: output stream */
trx_t* trx, /* in: transaction (NULL=no quotes) */
const char* name, /* in: name to print */ const char* name, /* in: name to print */
ulint namelen)/* in: length of name */ ulint namelen)/* in: length of name */
{ {
const char* s = name; const char* s = name;
const char* e = s + namelen; const char* e = s + namelen;
char q = mysql_get_identifier_quote_char(); int q = mysql_get_identifier_quote_char(trx, name, namelen);
if (q == EOF) {
fwrite(name, 1, namelen, f);
return;
}
putc(q, f); putc(q, f);
while (s < e) { while (s < e) {
int c = *s++; int c = *s++;

View file

@ -98,7 +98,7 @@ long innobase_mirrored_log_groups, innobase_log_files_in_group,
innobase_buffer_pool_size, innobase_additional_mem_pool_size, innobase_buffer_pool_size, innobase_additional_mem_pool_size,
innobase_file_io_threads, innobase_lock_wait_timeout, innobase_file_io_threads, innobase_lock_wait_timeout,
innobase_thread_concurrency, innobase_force_recovery, innobase_thread_concurrency, innobase_force_recovery,
innobase_open_files, innobase_auto_extend_increment; innobase_open_files;
/* The default values for the following char* start-up parameters /* The default values for the following char* start-up parameters
are determined in innobase_init below: */ are determined in innobase_init below: */
@ -737,15 +737,35 @@ innobase_invalidate_query_cache(
} }
/********************************************************************* /*********************************************************************
Get the quote character to be used in SQL identifiers. */ Get the quote character to be used in SQL identifiers.
This definition must match the one in innobase/ut/ut0ut.c! */
extern "C" extern "C"
char int
mysql_get_identifier_quote_char(void) mysql_get_identifier_quote_char(
/*=================================*/ /*============================*/
/* out: quote character to be /* out: quote character to be
used in SQL identifiers */ used in SQL identifiers; EOF if none */
trx_t* trx, /* in: transaction */
const char* name, /* in: name to print */
ulint namelen)/* in: length of name */
{ {
return '`'; if (!trx || !trx->mysql_thd) {
return(EOF);
}
return(get_quote_char_for_identifier((THD*) trx->mysql_thd,
name, namelen));
}
/**************************************************************************
Obtain a pointer to the MySQL THD object, as in current_thd(). This
definition must match the one in sql/ha_innodb.cc! */
extern "C"
void*
innobase_current_thd(void)
/*======================*/
/* out: MySQL THD object */
{
return(current_thd);
} }
/********************************************************************* /*********************************************************************
@ -964,7 +984,6 @@ innobase_init(void)
srv_locks_unsafe_for_binlog = (ibool) innobase_locks_unsafe_for_binlog; srv_locks_unsafe_for_binlog = (ibool) innobase_locks_unsafe_for_binlog;
srv_max_n_open_files = (ulint) innobase_open_files; srv_max_n_open_files = (ulint) innobase_open_files;
srv_auto_extend_increment = (ulint) innobase_auto_extend_increment;
srv_innodb_status = (ibool) innobase_create_status_file; srv_innodb_status = (ibool) innobase_create_status_file;
srv_print_verbose_log = mysql_embedded ? 0 : 1; srv_print_verbose_log = mysql_embedded ? 0 : 1;
@ -1485,12 +1504,14 @@ ha_innobase::open(
{ {
dict_table_t* ib_table; dict_table_t* ib_table;
char norm_name[1000]; char norm_name[1000];
THD* thd;
DBUG_ENTER("ha_innobase::open"); DBUG_ENTER("ha_innobase::open");
UT_NOT_USED(mode); UT_NOT_USED(mode);
UT_NOT_USED(test_if_locked); UT_NOT_USED(test_if_locked);
thd = current_thd;
normalize_table_name(norm_name, name); normalize_table_name(norm_name, name);
user_thd = NULL; user_thd = NULL;
@ -1540,7 +1561,7 @@ ha_innobase::open(
DBUG_RETURN(1); DBUG_RETURN(1);
} }
if (ib_table->ibd_file_missing && !current_thd->tablespace_op) { if (ib_table->ibd_file_missing && !thd->tablespace_op) {
ut_print_timestamp(stderr); ut_print_timestamp(stderr);
fprintf(stderr, " InnoDB error:\n" fprintf(stderr, " InnoDB error:\n"
"MySQL is trying to open a table handle but the .ibd file for\n" "MySQL is trying to open a table handle but the .ibd file for\n"
@ -2864,7 +2885,7 @@ ha_innobase::index_read(
(ulint)upd_and_key_val_buff_len, (ulint)upd_and_key_val_buff_len,
index, index,
(byte*) key_ptr, (byte*) key_ptr,
(ulint) key_len); (ulint) key_len, prebuilt->trx);
} else { } else {
/* We position the cursor to the last or the first entry /* We position the cursor to the last or the first entry
in the index */ in the index */
@ -4076,14 +4097,16 @@ ha_innobase::records_in_range(
index, index,
(byte*) (min_key ? min_key->key : (byte*) (min_key ? min_key->key :
(const mysql_byte*) 0), (const mysql_byte*) 0),
(ulint) (min_key ? min_key->length : 0)); (ulint) (min_key ? min_key->length : 0),
prebuilt->trx);
row_sel_convert_mysql_key_to_innobase( row_sel_convert_mysql_key_to_innobase(
range_end, (byte*) key_val_buff2, range_end, (byte*) key_val_buff2,
buff2_len, index, buff2_len, index,
(byte*) (max_key ? max_key->key : (byte*) (max_key ? max_key->key :
(const mysql_byte*) 0), (const mysql_byte*) 0),
(ulint) (max_key ? max_key->length : 0)); (ulint) (max_key ? max_key->length : 0),
prebuilt->trx);
mode1 = convert_search_mode_to_innobase(min_key ? min_key->flag : mode1 = convert_search_mode_to_innobase(min_key ? min_key->flag :
HA_READ_KEY_EXACT); HA_READ_KEY_EXACT);
@ -4470,7 +4493,8 @@ ha_innobase::update_table_comment(
(ulong) fsp_get_available_space_in_free_extents( (ulong) fsp_get_available_space_in_free_extents(
prebuilt->table->space)); prebuilt->table->space));
dict_print_info_on_foreign_keys(FALSE, file, prebuilt->table); dict_print_info_on_foreign_keys(FALSE, file,
prebuilt->trx, prebuilt->table);
flen = ftell(file); flen = ftell(file);
if(length + flen + 3 > 64000) { if(length + flen + 3 > 64000) {
flen = 64000 - 3 - length; flen = 64000 - 3 - length;
@ -4536,7 +4560,8 @@ ha_innobase::get_foreign_key_create_info(void)
trx_search_latch_release_if_reserved(prebuilt->trx); trx_search_latch_release_if_reserved(prebuilt->trx);
/* output the data to a temporary file */ /* output the data to a temporary file */
dict_print_info_on_foreign_keys(TRUE, file, prebuilt->table); dict_print_info_on_foreign_keys(TRUE, file,
prebuilt->trx, prebuilt->table);
prebuilt->trx->op_info = (char*)""; prebuilt->trx->op_info = (char*)"";
flen = ftell(file); flen = ftell(file);

View file

@ -183,7 +183,6 @@ extern long innobase_buffer_pool_awe_mem_mb;
extern long innobase_file_io_threads, innobase_lock_wait_timeout; extern long innobase_file_io_threads, innobase_lock_wait_timeout;
extern long innobase_force_recovery, innobase_thread_concurrency; extern long innobase_force_recovery, innobase_thread_concurrency;
extern long innobase_open_files; extern long innobase_open_files;
extern long innobase_auto_extend_increment;
extern char *innobase_data_home_dir, *innobase_data_file_path; extern char *innobase_data_home_dir, *innobase_data_file_path;
extern char *innobase_log_group_home_dir, *innobase_log_arch_dir; extern char *innobase_log_group_home_dir, *innobase_log_arch_dir;
extern char *innobase_unix_file_flush_method; extern char *innobase_unix_file_flush_method;
@ -194,6 +193,8 @@ extern my_bool innobase_log_archive,
innobase_create_status_file; innobase_create_status_file;
extern "C" { extern "C" {
extern ulong srv_max_buf_pool_modified_pct; extern ulong srv_max_buf_pool_modified_pct;
extern ulong srv_auto_extend_increment;
extern ulong srv_max_purge_lag;
} }
extern TYPELIB innobase_lock_typelib; extern TYPELIB innobase_lock_typelib;

View file

@ -636,6 +636,7 @@ int mysqld_show_keys(THD *thd, TABLE_LIST *table);
int mysqld_show_logs(THD *thd); int mysqld_show_logs(THD *thd);
void append_identifier(THD *thd, String *packet, const char *name, void append_identifier(THD *thd, String *packet, const char *name,
uint length); uint length);
int get_quote_char_for_identifier(THD *thd, const char *name, uint length);
void mysqld_list_fields(THD *thd,TABLE_LIST *table, const char *wild); void mysqld_list_fields(THD *thd,TABLE_LIST *table, const char *wild);
int mysqld_dump_create_info(THD *thd, TABLE *table, int fd = -1); int mysqld_dump_create_info(THD *thd, TABLE *table, int fd = -1);
int mysqld_show_create(THD *thd, TABLE_LIST *table_list); int mysqld_show_create(THD *thd, TABLE_LIST *table_list);

View file

@ -3998,6 +3998,7 @@ enum options_mysqld
OPT_INNODB_BUFFER_POOL_SIZE, OPT_INNODB_BUFFER_POOL_SIZE,
OPT_INNODB_BUFFER_POOL_AWE_MEM_MB, OPT_INNODB_BUFFER_POOL_AWE_MEM_MB,
OPT_INNODB_ADDITIONAL_MEM_POOL_SIZE, OPT_INNODB_ADDITIONAL_MEM_POOL_SIZE,
OPT_INNODB_MAX_PURGE_LAG,
OPT_INNODB_FILE_IO_THREADS, OPT_INNODB_FILE_IO_THREADS,
OPT_INNODB_LOCK_WAIT_TIMEOUT, OPT_INNODB_LOCK_WAIT_TIMEOUT,
OPT_INNODB_THREAD_CONCURRENCY, OPT_INNODB_THREAD_CONCURRENCY,
@ -4233,6 +4234,11 @@ Disable with --skip-innodb (will save memory).",
{"innodb_max_dirty_pages_pct", OPT_INNODB_MAX_DIRTY_PAGES_PCT, {"innodb_max_dirty_pages_pct", OPT_INNODB_MAX_DIRTY_PAGES_PCT,
"Percentage of dirty pages allowed in bufferpool.", (gptr*) &srv_max_buf_pool_modified_pct, "Percentage of dirty pages allowed in bufferpool.", (gptr*) &srv_max_buf_pool_modified_pct,
(gptr*) &srv_max_buf_pool_modified_pct, 0, GET_ULONG, REQUIRED_ARG, 90, 0, 100, 0, 0, 0}, (gptr*) &srv_max_buf_pool_modified_pct, 0, GET_ULONG, REQUIRED_ARG, 90, 0, 100, 0, 0, 0},
{"innodb_max_purge_lag", OPT_INNODB_MAX_PURGE_LAG,
"",
(gptr*) &srv_max_purge_lag,
(gptr*) &srv_max_purge_lag, 0, GET_LONG, REQUIRED_ARG, 0, 0, ~0L,
0, 1L, 0},
{"innodb_status_file", OPT_INNODB_STATUS_FILE, {"innodb_status_file", OPT_INNODB_STATUS_FILE,
"Enable SHOW INNODB STATUS output in the innodb_status.<pid> file", "Enable SHOW INNODB STATUS output in the innodb_status.<pid> file",
(gptr*) &innobase_create_status_file, (gptr*) &innobase_create_status_file, (gptr*) &innobase_create_status_file, (gptr*) &innobase_create_status_file,
@ -4712,6 +4718,11 @@ replicating a LOAD DATA INFILE command.",
(gptr*) &innobase_additional_mem_pool_size, (gptr*) &innobase_additional_mem_pool_size,
(gptr*) &innobase_additional_mem_pool_size, 0, GET_LONG, REQUIRED_ARG, (gptr*) &innobase_additional_mem_pool_size, 0, GET_LONG, REQUIRED_ARG,
1*1024*1024L, 512*1024L, ~0L, 0, 1024, 0}, 1*1024*1024L, 512*1024L, ~0L, 0, 1024, 0},
{"innodb_autoextend_increment", OPT_INNODB_AUTOEXTEND_INCREMENT,
"Data file autoextend increment in megabytes",
(gptr*) &srv_auto_extend_increment,
(gptr*) &srv_auto_extend_increment,
0, GET_LONG, REQUIRED_ARG, 8L, 1L, ~0L, 0, 1L, 0},
{"innodb_buffer_pool_awe_mem_mb", OPT_INNODB_BUFFER_POOL_AWE_MEM_MB, {"innodb_buffer_pool_awe_mem_mb", OPT_INNODB_BUFFER_POOL_AWE_MEM_MB,
"If Windows AWE is used, the size of InnoDB buffer pool allocated from the AWE memory.", "If Windows AWE is used, the size of InnoDB buffer pool allocated from the AWE memory.",
(gptr*) &innobase_buffer_pool_awe_mem_mb, (gptr*) &innobase_buffer_pool_awe_mem_mb, 0, (gptr*) &innobase_buffer_pool_awe_mem_mb, (gptr*) &innobase_buffer_pool_awe_mem_mb, 0,
@ -4753,11 +4764,6 @@ replicating a LOAD DATA INFILE command.",
"How many files at the maximum InnoDB keeps open at the same time.", "How many files at the maximum InnoDB keeps open at the same time.",
(gptr*) &innobase_open_files, (gptr*) &innobase_open_files, 0, (gptr*) &innobase_open_files, (gptr*) &innobase_open_files, 0,
GET_LONG, REQUIRED_ARG, 300L, 10L, ~0L, 0, 1L, 0}, GET_LONG, REQUIRED_ARG, 300L, 10L, ~0L, 0, 1L, 0},
{"innodb_autoextend_increment", OPT_INNODB_AUTOEXTEND_INCREMENT,
"Data file autoextend increment in megabytes",
(gptr*) &innobase_auto_extend_increment,
(gptr*) &innobase_auto_extend_increment,
0, GET_LONG, REQUIRED_ARG, 8L, 1L, ~0L, 0, 1L, 0},
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
/* /*
Disabled for the 4.1.3 release. Disabling just this paragraph of code is Disabled for the 4.1.3 release. Disabling just this paragraph of code is

View file

@ -351,6 +351,10 @@ sys_var_thd_ulong sys_net_wait_timeout("wait_timeout",
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
sys_var_long_ptr sys_innodb_max_dirty_pages_pct("innodb_max_dirty_pages_pct", sys_var_long_ptr sys_innodb_max_dirty_pages_pct("innodb_max_dirty_pages_pct",
&srv_max_buf_pool_modified_pct); &srv_max_buf_pool_modified_pct);
sys_var_long_ptr sys_innodb_autoextend_increment("innodb_autoextend_increment",
&srv_auto_extend_increment);
sys_var_long_ptr sys_innodb_max_purge_lag("innodb_max_purge_lag",
&srv_max_purge_lag);
#endif #endif
/* Time/date/datetime formats */ /* Time/date/datetime formats */
@ -601,6 +605,8 @@ sys_var *sys_variables[]=
&sys_os, &sys_os,
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
&sys_innodb_max_dirty_pages_pct, &sys_innodb_max_dirty_pages_pct,
&sys_innodb_max_purge_lag,
&sys_innodb_autoextend_increment,
#endif #endif
&sys_unique_checks, &sys_unique_checks,
&sys_warning_count &sys_warning_count
@ -674,6 +680,7 @@ struct show_var_st init_vars[]= {
{"init_slave", (char*) &sys_init_slave, SHOW_SYS}, {"init_slave", (char*) &sys_init_slave, SHOW_SYS},
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
{"innodb_additional_mem_pool_size", (char*) &innobase_additional_mem_pool_size, SHOW_LONG }, {"innodb_additional_mem_pool_size", (char*) &innobase_additional_mem_pool_size, SHOW_LONG },
{sys_innodb_autoextend_increment.name, (char*) &sys_innodb_autoextend_increment, SHOW_SYS},
{"innodb_buffer_pool_awe_mem_mb", (char*) &innobase_buffer_pool_awe_mem_mb, SHOW_LONG }, {"innodb_buffer_pool_awe_mem_mb", (char*) &innobase_buffer_pool_awe_mem_mb, SHOW_LONG },
{"innodb_buffer_pool_size", (char*) &innobase_buffer_pool_size, SHOW_LONG }, {"innodb_buffer_pool_size", (char*) &innobase_buffer_pool_size, SHOW_LONG },
{"innodb_data_file_path", (char*) &innobase_data_file_path, SHOW_CHAR_PTR}, {"innodb_data_file_path", (char*) &innobase_data_file_path, SHOW_CHAR_PTR},
@ -693,6 +700,7 @@ struct show_var_st init_vars[]= {
{"innodb_log_files_in_group", (char*) &innobase_log_files_in_group, SHOW_LONG}, {"innodb_log_files_in_group", (char*) &innobase_log_files_in_group, SHOW_LONG},
{"innodb_log_group_home_dir", (char*) &innobase_log_group_home_dir, SHOW_CHAR_PTR}, {"innodb_log_group_home_dir", (char*) &innobase_log_group_home_dir, SHOW_CHAR_PTR},
{sys_innodb_max_dirty_pages_pct.name, (char*) &sys_innodb_max_dirty_pages_pct, SHOW_SYS}, {sys_innodb_max_dirty_pages_pct.name, (char*) &sys_innodb_max_dirty_pages_pct, SHOW_SYS},
{sys_innodb_max_purge_lag.name, (char*) &sys_innodb_max_purge_lag, SHOW_SYS},
{"innodb_mirrored_log_groups", (char*) &innobase_mirrored_log_groups, SHOW_LONG}, {"innodb_mirrored_log_groups", (char*) &innobase_mirrored_log_groups, SHOW_LONG},
{"innodb_open_files", (char*) &innobase_open_files, SHOW_LONG }, {"innodb_open_files", (char*) &innobase_open_files, SHOW_LONG },
{"innodb_thread_concurrency", (char*) &innobase_thread_concurrency, SHOW_LONG }, {"innodb_thread_concurrency", (char*) &innobase_thread_concurrency, SHOW_LONG },

View file

@ -1143,40 +1143,18 @@ static const char *require_quotes(const char *name, uint name_length)
} }
static void append_quoted_simple_identifier(String *packet, char quote_char,
const char *name, uint length)
{
packet->append(&quote_char, 1, system_charset_info);
packet->append(name, length, system_charset_info);
packet->append(&quote_char, 1, system_charset_info);
}
void void
append_identifier(THD *thd, String *packet, const char *name, uint length) append_identifier(THD *thd, String *packet, const char *name, uint length)
{ {
const char *name_end; const char *name_end;
char quote_char; int q= get_quote_char_for_identifier(thd, name, length);
if (thd->variables.sql_mode & MODE_ANSI_QUOTES) if (q == EOF) {
quote_char= '\"'; packet->append(name, length, system_charset_info);
else
quote_char= '`';
if (is_keyword(name,length))
{
append_quoted_simple_identifier(packet, quote_char, name, length);
return; return;
} }
if (!require_quotes(name, length)) char quote_char= q;
{
if (!(thd->options & OPTION_QUOTE_SHOW_CREATE))
packet->append(name, length, system_charset_info);
else
append_quoted_simple_identifier(packet, quote_char, name, length);
return;
}
/* The identifier must be quoted as it includes a quote character */ /* The identifier must be quoted as it includes a quote character */
@ -1195,6 +1173,22 @@ append_identifier(THD *thd, String *packet, const char *name, uint length)
} }
/* Get the quote character for displaying an identifier.
If no quote character is needed, return EOF. */
int get_quote_char_for_identifier(THD *thd, const char *name, uint length)
{
if (!is_keyword(name,length) &&
!require_quotes(name, length) &&
!(thd->options & OPTION_QUOTE_SHOW_CREATE))
return EOF;
else if (thd->variables.sql_mode & MODE_ANSI_QUOTES)
return '"';
else
return '`';
}
/* Append directory name (if exists) to CREATE INFO */ /* Append directory name (if exists) to CREATE INFO */
static void append_directory(THD *thd, String *packet, const char *dir_type, static void append_directory(THD *thd, String *packet, const char *dir_type,