From ae455e41e02da9f67668fc9b8e41a5eafa76c3cb Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 17 Jun 2002 11:41:08 +0200 Subject: Bump up version number to 3.23.52 in configure.in since version 3.23.51 has finally been released configure.in: Bump up version number to 3.23.52 now that 3.23.51 is finally out --- configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.in b/configure.in index 00c986c4006..0869ce43e6d 100644 --- a/configure.in +++ b/configure.in @@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(sql/mysqld.cc) AC_CANONICAL_SYSTEM # The Docs Makefile.am parses this line! -AM_INIT_AUTOMAKE(mysql, 3.23.51) +AM_INIT_AUTOMAKE(mysql, 3.23.52) AM_CONFIG_HEADER(config.h) PROTOCOL_VERSION=10 -- cgit v1.2.1 From 9ee25c7109ef9f00484c8b06407584b570c2a440 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 21 Jun 2002 23:54:01 +0200 Subject: Added -DHAVE_BROKEN_REALPATH to the Mac OS X (darwin) compile options in configure.in configure.in: Added -DHAVE_BROKEN_REALPATH to the Mac OS X (darwin) compile options this reportedly increases the stability under high load --- configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.in b/configure.in index 0869ce43e6d..99d8e9bc1f5 100644 --- a/configure.in +++ b/configure.in @@ -882,7 +882,7 @@ case $SYSTEM_TYPE in *darwin*) if test "$ac_cv_prog_gcc" = "yes" then - CFLAGS="$CFLAGS -traditional-cpp -DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ" + CFLAGS="$CFLAGS -traditional-cpp -DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DHAVE_BROKEN_REALPATH" CXXFLAGS="$CXXFLAGS -traditional-cpp -DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ" MAX_C_OPTIMIZE="-O" with_named_curses="" -- cgit v1.2.1 From 23dbcb0fa4f8904c43761791c0c852a368cfa753 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Jun 2002 20:00:32 +0300 Subject: slave.h, slave.cc: Do not flush the position to master.info file if we have a transaction open sql/slave.cc: Do not flush the position to master.info file if we have a transaction open sql/slave.h: Do not flush the position to master.info file if we have a transaction open --- sql/slave.cc | 29 ++++++++++++++++++++++++++--- sql/slave.h | 6 ++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/sql/slave.cc b/sql/slave.cc index c7a048e8452..b535c87024b 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -907,6 +907,12 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) event_len); char llbuff[22]; + mi->event_len = event_len; /* Added by Heikki: InnoDB internally stores the + master log position it has processed so far; + position to store is really + mi->pos + mi->pending + mi->event_len + since we must store the pos of the END of the + current log event */ if (ev) { int type_code = ev->get_type_code(); @@ -1017,7 +1023,16 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) delete ev; mi->inc_pos(event_len); - flush_master_info(mi); + + if (!(thd->options & (OPTION_NOT_AUTO_COMMIT | OPTION_BEGIN))) { + + /* We only flush the master info position to the master.info file if + the transaction is not open any more: an incomplete transaction will + be rolled back automatically in crash recovery in transactional + table handlers */ + + flush_master_info(mi); + } break; } @@ -1139,10 +1154,16 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) } mi->inc_pos(event_len); - flush_master_info(mi); + + if (!(thd->options & (OPTION_NOT_AUTO_COMMIT | OPTION_BEGIN))) + flush_master_info(mi); + break; } + /* Question: in a START or STOP event, what happens if we have transaction + open? */ + case START_EVENT: mi->inc_pos(event_len); flush_master_info(mi); @@ -1168,7 +1189,9 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) mi->pos = 4; // skip magic number pthread_cond_broadcast(&mi->cond); pthread_mutex_unlock(&mi->lock); - flush_master_info(mi); + + if (!(thd->options & (OPTION_NOT_AUTO_COMMIT | OPTION_BEGIN))) + flush_master_info(mi); #ifndef DBUG_OFF if(abort_slave_event_count) ++events_till_abort; diff --git a/sql/slave.h b/sql/slave.h index 2934e675d56..769689ebfa2 100644 --- a/sql/slave.h +++ b/sql/slave.h @@ -12,6 +12,12 @@ typedef struct st_master_info { char log_file_name[FN_REFLEN]; ulonglong pos,pending; + int event_len; /* Added by Heikki: InnoDB internally stores the + master log position it has processed so far; the + position to store is really the sum + pos + pending + event_len + here since we must store the pos of the END of the + current log event */ File fd; // we keep the file open, so we need to remember the file pointer IO_CACHE file; // the variables below are needed because we can change masters on the fly -- cgit v1.2.1 From 4237b04189903ad3a4e01e2edecbfbb082b73924 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Jun 2002 20:05:30 +0300 Subject: log.cc, handler.cc: Add BEGIN andd COMMIT around transactions in the binlog sql/handler.cc: Add BEGIN andd COMMIT around transactions in the binlog sql/log.cc: Add BEGIN andd COMMIT around transactions in the binlog --- sql/handler.cc | 31 +++++++++++++++++++++++++++++++ sql/log.cc | 40 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/sql/handler.cc b/sql/handler.cc index 098c3130de2..564d91aa887 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -251,6 +251,7 @@ int ha_autocommit_or_rollback(THD *thd, int error) } else (void) ha_rollback_stmt(thd); + thd->tx_isolation=thd->session_tx_isolation; } #endif @@ -309,6 +310,36 @@ int ha_commit_trans(THD *thd, THD_TRANS* trans) if (trans == &thd->transaction.all && mysql_bin_log.is_open() && my_b_tell(&thd->transaction.trans_log)) { + /* We write the command "COMMIT" as the last SQL command in the + binlog segment cached for this transaction */ + + int save_query_length = thd->query_length; + + thd->query_length = 6; /* length of 'COMMIT'; note that we may come + here because a DROP TABLE, for instance, + makes an implicit commit, and then + thd->query is not 'COMMIT'! */ + + Query_log_event qinfo(thd, "COMMIT", TRUE); + + /* When we come here, and the user wrapped the transaction into + BEGIN and COMMIT, then qinfo got above the field cache_stmt + erroneously set to 0. Let us set it to 1: */ + + qinfo.cache_stmt = 1; + + /* Write the 'COMMIT' entry to the cache */ + + if (mysql_bin_log.write(&qinfo)) { + my_error(ER_ERROR_DURING_COMMIT, MYF(0), 5000); + error=1; + } + + thd->query_length = save_query_length; + + /* Now we write the binlog segment cached for this transaction to + the real binlog */ + mysql_bin_log.write(thd, &thd->transaction.trans_log); reinit_io_cache(&thd->transaction.trans_log, WRITE_CACHE, (my_off_t) 0, 0, 1); diff --git a/sql/log.cc b/sql/log.cc index f4284ac6bad..ee5818fc594 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -442,8 +442,8 @@ int MYSQL_LOG::purge_logs(THD* thd, const char* to_log) #ifdef HAVE_FTRUNCATE if (ftruncate(index_file,0)) { - sql_print_error("Could not truncate the binlog index file \ -during log purge for write"); + sql_print_error( +"Could not truncate the binlog index file during log purge for write"); error = LOG_INFO_FATAL; goto err; } @@ -455,8 +455,8 @@ during log purge for write"); O_CREAT | O_BINARY | O_RDWR | O_APPEND, MYF(MY_WME)))) { - sql_print_error("Could not re-open the binlog index file \ -during log purge for write"); + sql_print_error( +"Could not re-open the binlog index file during log purge for write"); error = LOG_INFO_FATAL; goto err; } @@ -661,6 +661,38 @@ bool MYSQL_LOG::write(Query_log_event* event_info) error=1; + if (file == &thd->transaction.trans_log + && !my_b_tell(&thd->transaction.trans_log)) { + + /* Add the "BEGIN" and "COMMIT" in the binlog around transactions + which may contain more than 1 SQL statement. If we run with + AUTOCOMMIT=1, then MySQL immediately writes each SQL statement to + the binlog when the statement has been completed. No need to add + "BEGIN" ... "COMMIT" around such statements. Otherwise, MySQL uses + thd->transaction.trans_log to cache the SQL statements until the + explicit commit, and at the commit writes the contents in .trans_log + to the binlog. + + We write the "BEGIN" mark first in the buffer (.trans_log) where we + store the SQL statements for a transaction. At the transaction commit + we will add the "COMMIT mark and write the buffer to the binlog. + The function my_b_tell above returns != 0 if there already is data + in the buffer. */ + + int save_query_length = thd->query_length; + + thd->query_length = 5; /* length of string BEGIN */ + + Query_log_event qinfo(thd, "BEGIN", TRUE); + + error = ((&qinfo)->write(file)); + + thd->query_length = save_query_length; + + if (error) + goto err; + } + if (thd->last_insert_id_used) { Intvar_log_event e((uchar)LAST_INSERT_ID_EVENT, thd->last_insert_id); -- cgit v1.2.1 From 7510893e702c919d5727a9801c95f62e20371c15 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Jun 2002 20:11:01 +0300 Subject: ha_innobase.cc: Merge 3.23.52 sql/ha_innobase.cc: Merge 3.23.52 --- sql/ha_innobase.cc | 188 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 149 insertions(+), 39 deletions(-) diff --git a/sql/ha_innobase.cc b/sql/ha_innobase.cc index 5ce7869e3f8..0e712f42df7 100644 --- a/sql/ha_innobase.cc +++ b/sql/ha_innobase.cc @@ -27,6 +27,7 @@ InnoDB */ #endif #include "mysql_priv.h" +#include "slave.h" #ifdef HAVE_INNOBASE_DB #include #include @@ -53,10 +54,12 @@ typedef byte mysql_byte; /* Include necessary InnoDB headers */ extern "C" { #include "../innobase/include/univ.i" +#include "../innobase/include/os0file.h" #include "../innobase/include/srv0start.h" #include "../innobase/include/srv0srv.h" #include "../innobase/include/trx0roll.h" #include "../innobase/include/trx0trx.h" +#include "../innobase/include/trx0sys.h" #include "../innobase/include/row0ins.h" #include "../innobase/include/row0mysql.h" #include "../innobase/include/row0sel.h" @@ -180,7 +183,8 @@ int convert_error_code_to_mysql( /*========================*/ /* out: MySQL error code */ - int error) /* in: InnoDB error code */ + int error, /* in: InnoDB error code */ + THD* thd) /* in: user thread handle or NULL */ { if (error == DB_SUCCESS) { @@ -199,11 +203,27 @@ convert_error_code_to_mysql( return(HA_ERR_NO_ACTIVE_RECORD); } else if (error == (int) DB_DEADLOCK) { + /* Since we roll back the whole transaction, we must + tell it also to MySQL so that MySQL knows to empty the + cached binlog for this transaction */ + + if (thd) { + ha_rollback(thd); + } return(HA_ERR_LOCK_DEADLOCK); } else if (error == (int) DB_LOCK_WAIT_TIMEOUT) { + /* Since we roll back the whole transaction, we must + tell it also to MySQL so that MySQL knows to empty the + cached binlog for this transaction */ + + + if (thd) { + ha_rollback(thd); + } + return(HA_ERR_LOCK_WAIT_TIMEOUT); } else if (error == (int) DB_NO_REFERENCED_ROW) { @@ -313,7 +333,23 @@ check_trx_exists( thd->transaction.stmt.innobase_tid = (void*)&innodb_dummy_stmt_trx_handle; } else { - ut_a(trx->magic_n == TRX_MAGIC_N); + if (trx->magic_n != TRX_MAGIC_N) { + mem_analyze_corruption((byte*)trx); + + ut_a(0); + } + } + + if (thd->options & OPTION_NO_FOREIGN_KEY_CHECKS) { + trx->check_foreigns = FALSE; + } else { + trx->check_foreigns = TRUE; + } + + if (thd->options & OPTION_RELAXED_UNIQUE_CHECKS) { + trx->check_unique_secondary = FALSE; + } else { + trx->check_unique_secondary = TRUE; } return(trx); @@ -359,6 +395,8 @@ innobase_init(void) DBUG_ENTER("innobase_init"); + os_innodb_umask = (ulint)my_umask; + if (specialflag & SPECIAL_NO_PRIOR) { srv_set_thread_priorities = FALSE; } else { @@ -435,7 +473,7 @@ innobase_init(void) srv_log_archive_on = (ulint) innobase_log_archive; srv_log_buffer_size = (ulint) innobase_log_buffer_size; - srv_flush_log_at_trx_commit = (ibool) innobase_flush_log_at_trx_commit; + srv_flush_log_at_trx_commit = (ulint) innobase_flush_log_at_trx_commit; srv_use_native_aio = 0; @@ -470,6 +508,22 @@ innobase_init(void) (void) hash_init(&innobase_open_tables,32,0,0, (hash_get_key) innobase_get_key,0,0); pthread_mutex_init(&innobase_mutex,MY_MUTEX_INIT_FAST); + + /* If this is a replication slave and we needed to do a crash recovery, + set the master binlog position to what InnoDB internally knew about + how far we got transactions durable inside InnoDB. There is a + problem here: if the user used also MyISAM tables, InnoDB might not + know the right position for them. + + THIS DOES NOT WORK CURRENTLY because replication seems to initialize + glob_mi also after innobase_init. */ + +/* if (trx_sys_mysql_master_log_pos != -1) { + ut_memcpy(glob_mi.log_file_name, trx_sys_mysql_master_log_name, + 1 + ut_strlen(trx_sys_mysql_master_log_name)); + glob_mi.pos = trx_sys_mysql_master_log_pos; + } +*/ DBUG_RETURN(0); } @@ -528,6 +582,17 @@ innobase_get_free_space(void) /********************************************************************* Commits a transaction in an InnoDB database. */ +void +innobase_commit_low( +/*================*/ + trx_t* trx) /* in: transaction handle */ +{ + trx_commit_for_mysql(trx); +} + +/********************************************************************* +Commits a transaction in an InnoDB database. */ + int innobase_commit( /*============*/ @@ -547,8 +612,21 @@ innobase_commit( trx = check_trx_exists(thd); if (trx_handle != (void*)&innodb_dummy_stmt_trx_handle) { + if (thd->slave_thread) { + + /* Update the replication position info inside + InnoDB. Note that we cannot presently do this for + CREATE TABLE etc. because MySQL does not tell us the + thd associated with those operations! */ + + trx->mysql_master_log_file_name = + glob_mi.log_file_name; + trx->mysql_master_log_pos = (ib_longlong) + (glob_mi.pos + glob_mi.event_len + + glob_mi.pending); + } - trx_commit_for_mysql(trx); + innobase_commit_low(trx); } /* Release possible statement level resources */ @@ -589,6 +667,8 @@ innobase_report_binlog_offset_and_commit( trx = (trx_t*)trx_handle; + ut_a(trx != NULL); + trx->mysql_log_file_name = log_file_name; trx->mysql_log_offset = (ib_longlong)end_offset; @@ -629,7 +709,7 @@ innobase_rollback( trx_mark_sql_stat_end(trx); - DBUG_RETURN(convert_error_code_to_mysql(error)); + DBUG_RETURN(convert_error_code_to_mysql(error, NULL)); } /********************************************************************* @@ -791,10 +871,9 @@ ha_innobase::open( ib_table = dict_table_get_and_increment_handle_count( norm_name, NULL); - if (NULL == ib_table) { - fprintf(stderr, + fprintf(stderr, "InnoDB: Error: cannot find table %s from the internal data dictionary\n" "InnoDB: of InnoDB though the .frm file for the table exists. Maybe you\n" "InnoDB: have deleted and recreated InnoDB data files but have forgotten\n" @@ -846,6 +925,9 @@ ha_innobase::open( auto_inc_counter_for_this_stat = 0; + block_size = 16 * 1024; /* Index block size in InnoDB: used by MySQL + in query optimization */ + /* Init table lock structure */ thr_lock_data_init(&share->lock,&lock,(void*) 0); @@ -1365,7 +1447,8 @@ ha_innobase::write_row( if (error != DB_SUCCESS) { - error = convert_error_code_to_mysql(error); + error = convert_error_code_to_mysql(error, + user_thd); goto func_exit; } @@ -1381,7 +1464,7 @@ ha_innobase::write_row( srv_conc_exit_innodb(prebuilt->trx); error = convert_error_code_to_mysql( - error); + error, user_thd); goto func_exit; } } @@ -1412,7 +1495,8 @@ ha_innobase::write_row( if (error != DB_SUCCESS) { - error = convert_error_code_to_mysql(error); + error = convert_error_code_to_mysql(error, + user_thd); goto func_exit; } @@ -1452,7 +1536,7 @@ ha_innobase::write_row( prebuilt->trx->ignore_duplicates_in_insert = FALSE; - error = convert_error_code_to_mysql(error); + error = convert_error_code_to_mysql(error, user_thd); /* Tell InnoDB server that there might be work for utility threads: */ @@ -1669,7 +1753,7 @@ ha_innobase::update_row( srv_conc_exit_innodb(prebuilt->trx); - error = convert_error_code_to_mysql(error); + error = convert_error_code_to_mysql(error, user_thd); /* Tell InnoDB server that there might be work for utility threads: */ @@ -1714,7 +1798,7 @@ ha_innobase::delete_row( srv_conc_exit_innodb(prebuilt->trx); - error = convert_error_code_to_mysql(error); + error = convert_error_code_to_mysql(error, user_thd); /* Tell the InnoDB server that there might be work for utility threads: */ @@ -1872,7 +1956,7 @@ ha_innobase::index_read( error = HA_ERR_KEY_NOT_FOUND; table->status = STATUS_NOT_FOUND; } else { - error = convert_error_code_to_mysql(ret); + error = convert_error_code_to_mysql(ret, user_thd); table->status = STATUS_NOT_FOUND; } @@ -1891,7 +1975,7 @@ ha_innobase::change_active_index( InnoDB */ { row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt; - KEY* key=0; + KEY* key; statistic_increment(ha_read_key_count, &LOCK_status); @@ -1912,10 +1996,9 @@ ha_innobase::change_active_index( if (!prebuilt->index) { fprintf(stderr, "InnoDB: Could not find key n:o %u with name %s from dict cache\n" - "InnoDB: for table %s\n", keynr, key ? key->name : "NULL", - prebuilt->table->name); + "InnoDB: for table %s\n", keynr, key->name, prebuilt->table->name); - DBUG_RETURN(1); + return(1); } assert(prebuilt->search_tuple); @@ -1931,7 +2014,7 @@ ha_innobase::change_active_index( build_template(prebuilt, user_thd, table, ROW_MYSQL_WHOLE_ROW); - DBUG_RETURN(0); + return(0); } /************************************************************************** @@ -1999,7 +2082,7 @@ ha_innobase::general_fetch( error = HA_ERR_END_OF_FILE; table->status = STATUS_NOT_FOUND; } else { - error = convert_error_code_to_mysql(ret); + error = convert_error_code_to_mysql(ret, user_thd); table->status = STATUS_NOT_FOUND; } @@ -2301,7 +2384,7 @@ create_table_def( error = row_create_table_for_mysql(table, trx); - error = convert_error_code_to_mysql(error); + error = convert_error_code_to_mysql(error, NULL); DBUG_RETURN(error); } @@ -2358,7 +2441,7 @@ create_index( error = row_create_index_for_mysql(index, trx); - error = convert_error_code_to_mysql(error); + error = convert_error_code_to_mysql(error, NULL); DBUG_RETURN(error); } @@ -2384,7 +2467,7 @@ create_clustered_index_when_no_primary( 0, DICT_CLUSTERED, 0); error = row_create_index_for_mysql(index, trx); - error = convert_error_code_to_mysql(error); + error = convert_error_code_to_mysql(error, NULL); return(error); } @@ -2414,19 +2497,36 @@ ha_innobase::create( DBUG_ENTER("ha_innobase::create"); + assert(current_thd != NULL); + trx = trx_allocate_for_mysql(); + if (current_thd->options & OPTION_NO_FOREIGN_KEY_CHECKS) { + trx->check_foreigns = FALSE; + } + + if (current_thd->options & OPTION_RELAXED_UNIQUE_CHECKS) { + trx->check_unique_secondary = FALSE; + } + fn_format(name2, name, "", "",2); // Remove the .frm extension normalize_table_name(norm_name, name2); - /* Create the table definition in InnoDB */ + /* Latch the InnoDB data dictionary exclusive so that no deadlocks + or lock waits can happen in it during a table create operation. + (Drop table etc. do this latching in row0mysql.c.) */ + + row_mysql_lock_data_dictionary(); + + /* Create the table definition in InnoDB */ error = create_table_def(trx, form, norm_name); if (error) { + innobase_commit_low(trx); - trx_commit_for_mysql(trx); + row_mysql_unlock_data_dictionary(); trx_free_for_mysql(trx); @@ -2458,7 +2558,9 @@ ha_innobase::create( error = create_clustered_index_when_no_primary(trx, norm_name); if (error) { - trx_commit_for_mysql(trx); + innobase_commit_low(trx); + + row_mysql_unlock_data_dictionary(); trx_free_for_mysql(trx); @@ -2471,7 +2573,9 @@ ha_innobase::create( first */ if ((error = create_index(trx, form, norm_name, (uint) primary_key_no))) { - trx_commit_for_mysql(trx); + innobase_commit_low(trx); + + row_mysql_unlock_data_dictionary(); trx_free_for_mysql(trx); @@ -2485,9 +2589,11 @@ ha_innobase::create( if ((error = create_index(trx, form, norm_name, i))) { - trx_commit_for_mysql(trx); + innobase_commit_low(trx); - trx_free_for_mysql(trx); + row_mysql_unlock_data_dictionary(); + + trx_free_for_mysql(trx); DBUG_RETURN(error); } @@ -2497,17 +2603,21 @@ ha_innobase::create( error = row_table_add_foreign_constraints(trx, create_info->create_statement, norm_name); - error = convert_error_code_to_mysql(error); + error = convert_error_code_to_mysql(error, NULL); if (error) { - trx_commit_for_mysql(trx); + innobase_commit_low(trx); + + row_mysql_unlock_data_dictionary(); trx_free_for_mysql(trx); DBUG_RETURN(error); } - trx_commit_for_mysql(trx); + innobase_commit_low(trx); + + row_mysql_unlock_data_dictionary(); /* Flush the log to reduce probability that the .frm files and the InnoDB data dictionary get out-of-sync if the user runs @@ -2575,11 +2685,11 @@ ha_innobase::delete_table( srv_active_wake_master_thread(); - trx_commit_for_mysql(trx); + innobase_commit_low(trx); trx_free_for_mysql(trx); - error = convert_error_code_to_mysql(error); + error = convert_error_code_to_mysql(error, NULL); DBUG_RETURN(error); } @@ -2640,10 +2750,10 @@ innobase_drop_database( srv_active_wake_master_thread(); - trx_commit_for_mysql(trx); + innobase_commit_low(trx); trx_free_for_mysql(trx); - error = convert_error_code_to_mysql(error); + error = convert_error_code_to_mysql(error, NULL); return(error); } @@ -2693,10 +2803,10 @@ ha_innobase::rename_table( srv_active_wake_master_thread(); - trx_commit_for_mysql(trx); + innobase_commit_low(trx); trx_free_for_mysql(trx); - error = convert_error_code_to_mysql(error); + error = convert_error_code_to_mysql(error, NULL); DBUG_RETURN(error); } @@ -2814,7 +2924,7 @@ ha_innobase::estimate_number_of_rows(void) estimate = 2 * data_file_length / dict_index_calc_min_rec_len(index); - DBUG_RETURN((ha_rows) estimate); + return((ha_rows) estimate); } /************************************************************************* -- cgit v1.2.1 From c9faa802b2b538d8446d0f2ce11fe50662823381 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Jun 2002 20:17:58 +0300 Subject: mysqld.cc: Add option innodb_flush_log_at_trx_commit=2 which means we always write the log to file at commit, but only do fsync about once per second sql/mysqld.cc: Add option innodb_flush_log_at_trx_commit=2 which means we always write the log to file at commit, but only do fsync about once per second --- sql/mysqld.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 6aad4848242..4d9336afb1d 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -3013,7 +3013,7 @@ struct show_var_st init_vars[]= { {"innodb_file_io_threads", (char*) &innobase_file_io_threads, SHOW_LONG }, {"innodb_force_recovery", (char*) &innobase_force_recovery, SHOW_LONG }, {"innodb_thread_concurrency", (char*) &innobase_thread_concurrency, SHOW_LONG }, - {"innodb_flush_log_at_trx_commit", (char*) &innobase_flush_log_at_trx_commit, SHOW_MY_BOOL}, + {"innodb_flush_log_at_trx_commit", (char*) &innobase_flush_log_at_trx_commit, SHOW_LONG}, {"innodb_fast_shutdown", (char*) &innobase_fast_shutdown, SHOW_MY_BOOL}, {"innodb_flush_method", (char*) &innobase_unix_file_flush_method, SHOW_CHAR_PTR}, {"innodb_lock_wait_timeout", (char*) &innobase_lock_wait_timeout, SHOW_LONG }, @@ -3995,7 +3995,7 @@ static void get_options(int argc,char **argv) innobase_log_archive= optarg ? test(atoi(optarg)) : 1; break; case OPT_INNODB_FLUSH_LOG_AT_TRX_COMMIT: - innobase_flush_log_at_trx_commit= optarg ? test(atoi(optarg)) : 1; + innobase_flush_log_at_trx_commit= optarg ? atoi(optarg) : 1; break; case OPT_INNODB_FAST_SHUTDOWN: innobase_fast_shutdown= optarg ? test(atoi(optarg)) : 1; -- cgit v1.2.1 From 562faa29e21b115c9b934926cb5e031c6841e0b8 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Jun 2002 20:23:53 +0300 Subject: sql_yacc.yy, mysql_priv.h, lex.h: Add syntax SET NO_FOREIGN_KEY_CHECKS=1 and SET RELAXED_UNIQUE_CHECKS=1 sql/lex.h: Add syntax SET NO_FOREIGN_KEY_CHECKS=1 and SET RELAXED_UNIQUE_CHECKS=1 sql/mysql_priv.h: Add syntax SET NO_FOREIGN_KEY_CHECKS=1 and SET RELAXED_UNIQUE_CHECKS=1 sql/sql_yacc.yy: Add syntax SET NO_FOREIGN_KEY_CHECKS=1 and SET RELAXED_UNIQUE_CHECKS=1 --- sql/lex.h | 6 ++++-- sql/mysql_priv.h | 7 +++++++ sql/sql_yacc.yy | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/sql/lex.h b/sql/lex.h index 30fbf46e354..a242f751053 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -30,9 +30,9 @@ #endif /* -** Symbols are breaked in to separated arrays to allow fieldnames with +** Symbols are broken into separated arrays to allow fieldnames with ** same name as functions -** Theese are kept sorted for human lookup (the symbols are hashed) +** These are kept sorted for human lookup (the symbols are hashed) */ static SYMBOL symbols[] = { @@ -232,6 +232,7 @@ static SYMBOL symbols[] = { { "NCHAR", SYM(NCHAR_SYM),0,0}, { "NUMERIC", SYM(NUMERIC_SYM),0,0}, { "NO", SYM(NO_SYM),0,0}, + { "NO_FOREIGN_KEY_CHECKS", SYM(NO_FOREIGN_KEY_CHECKS), 0, 0}, { "NOT", SYM(NOT),0,0}, { "NULL", SYM(NULL_SYM),0,0}, { "ON", SYM(ON),0,0}, @@ -260,6 +261,7 @@ static SYMBOL symbols[] = { { "REFERENCES", SYM(REFERENCES),0,0}, { "RELOAD", SYM(RELOAD),0,0}, { "REGEXP", SYM(REGEXP),0,0}, + { "RELAXED_UNIQUE_CHECKS", SYM(RELAXED_UNIQUE_CHECKS), 0, 0}, { "RENAME", SYM(RENAME),0,0}, { "REPAIR", SYM(REPAIR),0,0}, { "REPLACE", SYM(REPLACE),0,0}, diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 4cee7d04ef0..6b2721f4ab7 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -183,6 +183,13 @@ void kill_one_thread(THD *thd, ulong id); /* The following is set when parsing the query */ #define QUERY_NO_INDEX_USED OPTION_STATUS_NO_TRANS_UPDATE*2 #define QUERY_NO_GOOD_INDEX_USED QUERY_NO_INDEX_USED*2 +/* The following can be set when importing tables in a 'wrong order' + to suppress foreign key checks */ +#define OPTION_NO_FOREIGN_KEY_CHECKS QUERY_NO_GOOD_INDEX_USED*2 +/* The following speeds up inserts to InnoDB tables by suppressing unique + key checks in some cases */ +#define OPTION_RELAXED_UNIQUE_CHECKS OPTION_NO_FOREIGN_KEY_CHECKS*2 +/* NOTE: we have now used 31 bits of the OPTION flag! */ /* Bits for different SQL modes modes (including ANSI mode) */ #define MODE_REAL_AS_FLOAT 1 diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index c01532e48f7..07a0263dd88 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -224,6 +224,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token NATURAL %token NCHAR_SYM %token NOT +%token NO_FOREIGN_KEY_CHECKS %token NO_SYM %token NULL_SYM %token NUM @@ -252,6 +253,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token REAL_NUM %token REFERENCES %token REGEXP +%token RELAXED_UNIQUE_CHECKS %token RELOAD %token RENAME %token REPEATABLE_SYM @@ -2602,6 +2604,7 @@ keyword: | MYISAM_SYM {} | NATIONAL_SYM {} | NCHAR_SYM {} + | NO_FOREIGN_KEY_CHECKS {} | NO_SYM {} | OPEN_SYM {} | PACK_KEYS_SYM {} @@ -2614,6 +2617,7 @@ keyword: | RAID_CHUNKSIZE {} | RAID_STRIPED_SYM {} | RAID_TYPE {} + | RELAXED_UNIQUE_CHECKS {} | RELOAD {} | REPAIR {} | REPEATABLE_SYM {} @@ -2771,6 +2775,20 @@ option_value: slave_skip_counter = $3; pthread_mutex_unlock(&LOCK_slave); } + | NO_FOREIGN_KEY_CHECKS equal NUM + { + if (atoi($3.str) != 0) + Lex->options|= OPTION_NO_FOREIGN_KEY_CHECKS; + else + Lex->options&= ~(OPTION_NO_FOREIGN_KEY_CHECKS); + } + | RELAXED_UNIQUE_CHECKS equal NUM + { + if (atoi($3.str) != 0) + Lex->options|= OPTION_RELAXED_UNIQUE_CHECKS; + else + Lex->options&= ~(OPTION_RELAXED_UNIQUE_CHECKS); + } text_or_password: TEXT_STRING { $$=$1.str;} -- cgit v1.2.1 From b7b988b3c36fa7a1f0a284d6478bbccbe706c09f Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Jun 2002 20:33:48 +0300 Subject: ha_innobase.cc: Use current_thd to check if a transaction is done by a slave thread sql/ha_innobase.cc: Use current_thd to check if a transaction is done by a slave thread --- sql/ha_innobase.cc | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/sql/ha_innobase.cc b/sql/ha_innobase.cc index 0e712f42df7..761d74f49b0 100644 --- a/sql/ha_innobase.cc +++ b/sql/ha_innobase.cc @@ -587,6 +587,16 @@ innobase_commit_low( /*================*/ trx_t* trx) /* in: transaction handle */ { + if (current_thd->slave_thread) { + + /* Update the replication position info inside InnoDB */ + + trx->mysql_master_log_file_name = glob_mi.log_file_name; + trx->mysql_master_log_pos = (ib_longlong) + (glob_mi.pos + glob_mi.event_len + + glob_mi.pending); + } + trx_commit_for_mysql(trx); } @@ -612,20 +622,6 @@ innobase_commit( trx = check_trx_exists(thd); if (trx_handle != (void*)&innodb_dummy_stmt_trx_handle) { - if (thd->slave_thread) { - - /* Update the replication position info inside - InnoDB. Note that we cannot presently do this for - CREATE TABLE etc. because MySQL does not tell us the - thd associated with those operations! */ - - trx->mysql_master_log_file_name = - glob_mi.log_file_name; - trx->mysql_master_log_pos = (ib_longlong) - (glob_mi.pos + glob_mi.event_len - + glob_mi.pending); - } - innobase_commit_low(trx); } -- cgit v1.2.1 From 1081513a12851d432103eaabcb6533c84062196c Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Jun 2002 20:41:14 +0300 Subject: Many files: Merge 3.23.52 innobase/btr/btr0btr.c: Merge 3.23.52 innobase/btr/btr0cur.c: Merge 3.23.52 innobase/btr/btr0sea.c: Merge 3.23.52 innobase/include/btr0btr.h: Merge 3.23.52 innobase/include/btr0cur.h: Merge 3.23.52 innobase/include/btr0sea.h: Merge 3.23.52 innobase/include/buf0buf.h: Merge 3.23.52 innobase/include/buf0rea.h: Merge 3.23.52 innobase/include/data0data.h: Merge 3.23.52 innobase/include/data0data.ic: Merge 3.23.52 innobase/include/log0log.h: Merge 3.23.52 innobase/include/log0log.ic: Merge 3.23.52 innobase/include/os0file.h: Merge 3.23.52 innobase/include/page0page.h: Merge 3.23.52 innobase/include/page0page.ic: Merge 3.23.52 innobase/include/row0mysql.h: Merge 3.23.52 innobase/include/trx0roll.h: Merge 3.23.52 innobase/include/trx0sys.h: Merge 3.23.52 innobase/include/trx0trx.h: Merge 3.23.52 innobase/include/ut0ut.h: Merge 3.23.52 innobase/include/univ.i: Merge 3.23.52 innobase/include/ut0ut.ic: Merge 3.23.52 innobase/buf/buf0buf.c: Merge 3.23.52 innobase/buf/buf0rea.c: Merge 3.23.52 innobase/data/data0data.c: Merge 3.23.52 innobase/dict/dict0crea.c: Merge 3.23.52 innobase/dict/dict0dict.c: Merge 3.23.52 innobase/dict/dict0load.c: Merge 3.23.52 innobase/dict/dict0mem.c: Merge 3.23.52 innobase/fsp/fsp0fsp.c: Merge 3.23.52 innobase/ibuf/ibuf0ibuf.c: Merge 3.23.52 innobase/lock/lock0lock.c: Merge 3.23.52 innobase/log/log0log.c: Merge 3.23.52 innobase/log/log0recv.c: Merge 3.23.52 innobase/mtr/mtr0log.c: Merge 3.23.52 innobase/mtr/mtr0mtr.c: Merge 3.23.52 innobase/os/os0file.c: Merge 3.23.52 innobase/page/page0cur.c: Merge 3.23.52 innobase/page/page0page.c: Merge 3.23.52 innobase/rem/rem0cmp.c: Merge 3.23.52 innobase/row/row0ins.c: Merge 3.23.52 innobase/row/row0mysql.c: Merge 3.23.52 innobase/row/row0purge.c: Merge 3.23.52 innobase/row/row0upd.c: Merge 3.23.52 innobase/srv/srv0srv.c: Merge 3.23.52 innobase/srv/srv0start.c: Merge 3.23.52 innobase/trx/trx0roll.c: Merge 3.23.52 innobase/trx/trx0sys.c: Merge 3.23.52 innobase/trx/trx0trx.c: Merge 3.23.52 innobase/trx/trx0undo.c: Merge 3.23.52 innobase/ut/ut0mem.c: Merge 3.23.52 innobase/ut/ut0ut.c: Merge 3.23.52 --- innobase/btr/btr0btr.c | 27 +- innobase/btr/btr0cur.c | 85 ++++- innobase/btr/btr0sea.c | 79 ++++- innobase/buf/buf0buf.c | 42 ++- innobase/buf/buf0rea.c | 29 ++ innobase/data/data0data.c | 115 ++++++- innobase/dict/dict0crea.c | 1 + innobase/dict/dict0dict.c | 14 + innobase/dict/dict0load.c | 741 +++++++++++++++++++++--------------------- innobase/dict/dict0mem.c | 3 + innobase/fsp/fsp0fsp.c | 22 +- innobase/ibuf/ibuf0ibuf.c | 47 ++- innobase/include/btr0btr.h | 10 - innobase/include/btr0cur.h | 1 + innobase/include/btr0sea.h | 3 + innobase/include/buf0buf.h | 13 + innobase/include/buf0rea.h | 2 +- innobase/include/data0data.h | 10 +- innobase/include/data0data.ic | 24 -- innobase/include/log0log.h | 50 ++- innobase/include/log0log.ic | 29 +- innobase/include/os0file.h | 12 + innobase/include/page0page.h | 2 +- innobase/include/page0page.ic | 42 +-- innobase/include/row0mysql.h | 13 + innobase/include/trx0roll.h | 8 +- innobase/include/trx0sys.h | 52 ++- innobase/include/trx0trx.h | 24 +- innobase/include/univ.i | 40 +-- innobase/include/ut0ut.h | 9 +- innobase/include/ut0ut.ic | 22 -- innobase/lock/lock0lock.c | 20 +- innobase/log/log0log.c | 207 +++++++++--- innobase/log/log0recv.c | 147 ++++++++- innobase/mtr/mtr0log.c | 6 +- innobase/mtr/mtr0mtr.c | 2 +- innobase/os/os0file.c | 110 ++++++- innobase/page/page0cur.c | 9 + innobase/page/page0page.c | 60 ++++ innobase/rem/rem0cmp.c | 13 +- innobase/row/row0ins.c | 24 +- innobase/row/row0mysql.c | 70 ++-- innobase/row/row0purge.c | 8 + innobase/row/row0upd.c | 23 +- innobase/srv/srv0srv.c | 72 ++-- innobase/srv/srv0start.c | 22 +- innobase/trx/trx0roll.c | 29 +- innobase/trx/trx0sys.c | 121 ++++--- innobase/trx/trx0trx.c | 86 ++++- innobase/trx/trx0undo.c | 4 +- innobase/ut/ut0mem.c | 10 +- innobase/ut/ut0ut.c | 66 ++++ 52 files changed, 1899 insertions(+), 781 deletions(-) diff --git a/innobase/btr/btr0btr.c b/innobase/btr/btr0btr.c index b9253562fe6..88472d6dbe0 100644 --- a/innobase/btr/btr0btr.c +++ b/innobase/btr/btr0btr.c @@ -572,6 +572,13 @@ btr_page_get_father_for_rec( if (btr_node_ptr_get_child_page_no(node_ptr) != buf_frame_get_page_no(page)) { + fprintf(stderr, +"InnoDB: Dump of the child page:\n"); + buf_page_print(buf_frame_align(page)); + fprintf(stderr, +"InnoDB: Dump of the parent page:\n"); + buf_page_print(buf_frame_align(node_ptr)); + fprintf(stderr, "InnoDB: Corruption of an index tree: table %s, index %s,\n" "InnoDB: father ptr page no %lu, child page no %lu\n", @@ -581,6 +588,12 @@ btr_page_get_father_for_rec( buf_frame_get_page_no(page)); page_rec_print(page_rec_get_next(page_get_infimum_rec(page))); page_rec_print(node_ptr); + + fprintf(stderr, +"InnoDB: You should dump + drop + reimport the table to fix the\n" +"InnoDB: corruption. If the crash happens at the database startup, see\n" +"InnoDB: section 6.1 of http://www.innodb.com/ibman.html about forcing\n" +"InnoDB: recovery. Then dump + drop + reimport.\n"); } ut_a(btr_node_ptr_get_child_page_no(node_ptr) == @@ -780,12 +793,14 @@ top_loop: /***************************************************************** Reorganizes an index page. */ - +static void btr_page_reorganize_low( /*====================*/ - ibool low, /* in: TRUE if locks should not be updated, i.e., - there cannot exist locks on the page */ + ibool recovery,/* in: TRUE if called in recovery: locks should not + be updated, i.e., there cannot exist locks on the + page, and a hash index should not be dropped: it + cannot exist */ page_t* page, /* in: page to be reorganized */ mtr_t* mtr) /* in: mtr */ { @@ -805,7 +820,9 @@ btr_page_reorganize_low( /* Copy the old page to temporary space */ buf_frame_copy(new_page, page); - btr_search_drop_page_hash_index(page); + if (!recovery) { + btr_search_drop_page_hash_index(page); + } /* Recreate the page: note that global data on page (possible segment headers, next page-field, etc.) is preserved intact */ @@ -820,7 +837,7 @@ btr_page_reorganize_low( /* Copy max trx id to recreated page */ page_set_max_trx_id(page, page_get_max_trx_id(new_page)); - if (!low) { + if (!recovery) { /* Update the record lock bitmaps */ lock_move_reorganize_page(page, new_page); } diff --git a/innobase/btr/btr0cur.c b/innobase/btr/btr0cur.c index daebb8dbbaf..67b74967e8d 100644 --- a/innobase/btr/btr0cur.c +++ b/innobase/btr/btr0cur.c @@ -36,9 +36,14 @@ Created 10/16/1994 Heikki Tuuri #include "ibuf0ibuf.h" #include "lock0lock.h" +/* If the following is set to TRUE, this module prints a lot of +trace information of individual record operations */ +ibool btr_cur_print_record_ops = FALSE; + ulint btr_cur_rnd = 0; ulint btr_cur_n_non_sea = 0; +ulint btr_cur_n_sea = 0; /* In the optimistic insert, if the insert does not fit, but this much space can be released by page reorganize, then it is reorganized */ @@ -187,11 +192,7 @@ btr_cur_search_to_nth_level( tuple must be set so that it cannot get compared to the node ptr page number field! */ ulint mode, /* in: PAGE_CUR_L, ...; - NOTE that if the search is made using a unique - prefix of a record, mode should be - PAGE_CUR_LE, not PAGE_CUR_GE, as the latter - may end up on the previous page relative to the - record! Inserts should always be made using + Inserts should always be made using PAGE_CUR_LE to search the position! */ ulint latch_mode, /* in: BTR_SEARCH_LEAF, ..., ORed with BTR_INSERT and BTR_ESTIMATE; @@ -268,7 +269,7 @@ btr_cur_search_to_nth_level( #ifdef UNIV_SEARCH_PERF_STAT info->n_searches++; #endif - if (btr_search_latch.writer != RW_LOCK_NOT_LOCKED + if (btr_search_latch.writer == RW_LOCK_NOT_LOCKED && latch_mode <= BTR_MODIFY_LEAF && info->last_hash_succ && !estimate && btr_search_guess_on_hash(index, info, tuple, mode, @@ -283,14 +284,14 @@ btr_cur_search_to_nth_level( || mode != PAGE_CUR_LE); ut_ad(cursor->low_match != ULINT_UNDEFINED || mode != PAGE_CUR_LE); + btr_cur_n_sea++; + return; } #endif #endif - -#ifdef UNIV_SEARCH_PERF_STAT btr_cur_n_non_sea++; -#endif + /* If the hash search did not succeed, do binary search down the tree */ @@ -796,15 +797,28 @@ btr_cur_optimistic_insert( ulint data_size; ulint extra_size; ulint type; - ulint err; - - ut_ad(dtuple_check_typed(entry)); + ulint err; *big_rec = NULL; page = btr_cur_get_page(cursor); index = cursor->index; + if (!dtuple_check_typed_no_assert(entry)) { + fprintf(stderr, +"InnoDB: Error in a tuple to insert into table %lu index %lu\n", + index->table_name, index->name); + } + + if (btr_cur_print_record_ops && thr) { + printf( + "Trx with id %lu %lu going to insert to table %s index %s\n", + ut_dulint_get_high(thr_get_trx(thr)->id), + ut_dulint_get_low(thr_get_trx(thr)->id), + index->table_name, index->name); + dtuple_print(entry); + } + ut_ad(mtr_memo_contains(mtr, buf_block_align(page), MTR_MEMO_PAGE_X_FIX)); max_size = page_get_max_insert_size_after_reorganize(page, 1); @@ -928,7 +942,7 @@ calculate_sizes_again: buf_frame_get_page_no(page), max_size, rec_size + PAGE_DIR_SLOT_SIZE, type); */ - if (!(type & (DICT_CLUSTERED | DICT_UNIQUE))) { + if (!(type & DICT_CLUSTERED)) { /* We have added a record to page: update its free bits */ ibuf_update_free_bits_if_full(cursor->index, page, max_size, rec_size + PAGE_DIR_SLOT_SIZE); @@ -1258,6 +1272,15 @@ btr_cur_update_sec_rec_in_place( rec = btr_cur_get_rec(cursor); + if (btr_cur_print_record_ops && thr) { + printf( + "Trx with id %lu %lu going to update table %s index %s\n", + ut_dulint_get_high(thr_get_trx(thr)->id), + ut_dulint_get_low(thr_get_trx(thr)->id), + index->table_name, index->name); + rec_print(rec); + } + err = lock_sec_rec_modify_check_and_lock(0, rec, index, thr); if (err != DB_SUCCESS) { @@ -1312,6 +1335,15 @@ btr_cur_update_in_place( index = cursor->index; trx = thr_get_trx(thr); + if (btr_cur_print_record_ops && thr) { + printf( + "Trx with id %lu %lu going to update table %s index %s\n", + ut_dulint_get_high(thr_get_trx(thr)->id), + ut_dulint_get_low(thr_get_trx(thr)->id), + index->table_name, index->name); + rec_print(rec); + } + /* Do lock checking and undo logging */ err = btr_cur_upd_lock_and_undo(flags, cursor, update, cmpl_info, thr, &roll_ptr); @@ -1398,6 +1430,15 @@ btr_cur_optimistic_update( rec = btr_cur_get_rec(cursor); index = cursor->index; + if (btr_cur_print_record_ops && thr) { + printf( + "Trx with id %lu %lu going to update table %s index %s\n", + ut_dulint_get_high(thr_get_trx(thr)->id), + ut_dulint_get_low(thr_get_trx(thr)->id), + index->table_name, index->name); + rec_print(rec); + } + ut_ad(mtr_memo_contains(mtr, buf_block_align(page), MTR_MEMO_PAGE_X_FIX)); if (!row_upd_changes_field_size(rec, index, update)) { @@ -1973,6 +2014,15 @@ btr_cur_del_mark_set_clust_rec( rec = btr_cur_get_rec(cursor); index = cursor->index; + if (btr_cur_print_record_ops && thr) { + printf( + "Trx with id %lu %lu going to del mark table %s index %s\n", + ut_dulint_get_high(thr_get_trx(thr)->id), + ut_dulint_get_low(thr_get_trx(thr)->id), + index->table_name, index->name); + rec_print(rec); + } + ut_ad(index->type & DICT_CLUSTERED); ut_ad(rec_get_deleted_flag(rec) == FALSE); @@ -2102,6 +2152,15 @@ btr_cur_del_mark_set_sec_rec( rec = btr_cur_get_rec(cursor); + if (btr_cur_print_record_ops && thr) { + printf( + "Trx with id %lu %lu going to del mark table %s index %s\n", + ut_dulint_get_high(thr_get_trx(thr)->id), + ut_dulint_get_low(thr_get_trx(thr)->id), + cursor->index->table_name, cursor->index->name); + rec_print(rec); + } + err = lock_sec_rec_modify_check_and_lock(flags, rec, cursor->index, thr); if (err != DB_SUCCESS) { diff --git a/innobase/btr/btr0sea.c b/innobase/btr/btr0sea.c index aac86f45ec9..5e1c8401e28 100644 --- a/innobase/btr/btr0sea.c +++ b/innobase/btr/btr0sea.c @@ -15,6 +15,7 @@ Created 2/17/1996 Heikki Tuuri #include "page0page.h" #include "page0cur.h" #include "btr0cur.h" +#include "btr0pcur.h" #include "btr0btr.h" ulint btr_search_n_succ = 0; @@ -145,6 +146,8 @@ btr_search_info_create( info = mem_heap_alloc(heap, sizeof(btr_search_t)); + info->magic_n = BTR_SEARCH_MAGIC_N; + info->last_search = NULL; info->n_direction = 0; info->root_guess = NULL; @@ -159,6 +162,12 @@ btr_search_info_create( info->n_patt_succ = 0; info->n_searches = 0; + /* Set some sensible values */ + info->n_fields = 1; + info->n_bytes = 0; + + info->side = BTR_SEARCH_LEFT_SIDE; + return(info); } @@ -197,7 +206,7 @@ btr_search_info_update_hash( /* Test if the search would have succeeded using the recommended hash prefix */ - if ((info->n_fields >= n_unique) && (cursor->up_match >= n_unique)) { + if (info->n_fields >= n_unique && cursor->up_match >= n_unique) { info->n_hash_potential++; @@ -207,8 +216,8 @@ btr_search_info_update_hash( cmp = ut_pair_cmp(info->n_fields, info->n_bytes, cursor->low_match, cursor->low_bytes); - if (((info->side == BTR_SEARCH_LEFT_SIDE) && (cmp <= 0)) - || ((info->side == BTR_SEARCH_RIGHT_SIDE) && (cmp > 0))) { + if ((info->side == BTR_SEARCH_LEFT_SIDE && cmp <= 0) + || (info->side == BTR_SEARCH_RIGHT_SIDE && cmp > 0)) { goto set_new_recomm; } @@ -216,8 +225,8 @@ btr_search_info_update_hash( cmp = ut_pair_cmp(info->n_fields, info->n_bytes, cursor->up_match, cursor->up_bytes); - if (((info->side == BTR_SEARCH_LEFT_SIDE) && (cmp > 0)) - || ((info->side == BTR_SEARCH_RIGHT_SIDE) && (cmp <= 0))) { + if ((info->side == BTR_SEARCH_LEFT_SIDE && cmp > 0) + || (info->side == BTR_SEARCH_RIGHT_SIDE && cmp <= 0)) { goto set_new_recomm; } @@ -233,19 +242,18 @@ set_new_recomm: info->hash_analysis = 0; - if ((cursor->up_match >= n_unique) - || (cursor->low_match >= n_unique)) { - info->n_fields = n_unique; - info->n_bytes = 0; - - info->side = BTR_SEARCH_LEFT_SIDE; - } - cmp = ut_pair_cmp(cursor->up_match, cursor->up_bytes, cursor->low_match, cursor->low_bytes); if (cmp == 0) { info->n_hash_potential = 0; + /* For extra safety, we set some sensible values here */ + + info->n_fields = 1; + info->n_bytes = 0; + + info->side = BTR_SEARCH_LEFT_SIDE; + } else if (cmp > 0) { info->n_hash_potential = 1; @@ -305,6 +313,9 @@ btr_search_update_block_hash_info( info->last_hash_succ = FALSE; + ut_a(block->magic_n == BUF_BLOCK_MAGIC_N); + ut_a(info->magic_n == BTR_SEARCH_MAGIC_N); + if ((block->n_hash_helps > 0) && (info->n_hash_potential > 0) && (block->n_fields == info->n_fields) @@ -622,6 +633,7 @@ btr_search_guess_on_hash( dulint tree_id; #ifdef notdefined btr_cur_t cursor2; + btr_pcur_t pcur; #endif ut_ad(index && info && tuple && cursor && mtr); ut_ad((latch_mode == BTR_SEARCH_LEAF) @@ -754,7 +766,26 @@ btr_search_guess_on_hash( btr_cur_search_to_nth_level(index, 0, tuple, mode, latch_mode, &cursor2, 0, mtr); - ut_a(btr_cur_get_rec(&cursor2) == btr_cur_get_rec(cursor)); + if (mode == PAGE_CUR_GE + && btr_cur_get_rec(&cursor2) == page_get_supremum_rec( + buf_frame_align(btr_cur_get_rec(&cursor2)))) { + + /* If mode is PAGE_CUR_GE, then the binary search + in the index tree may actually take us to the supremum + of the previous page */ + + info->last_hash_succ = FALSE; + + btr_pcur_open_on_user_rec(index, tuple, mode, latch_mode, + &pcur, mtr); + ut_a(btr_pcur_get_rec(&pcur) == btr_cur_get_rec(cursor)); + } else { + ut_a(btr_cur_get_rec(&cursor2) == btr_cur_get_rec(cursor)); + } + + /* NOTE that it is theoretically possible that the above assertions + fail if the page of the cursor gets removed from the buffer pool + meanwhile! Thus it might not be a bug. */ info->last_hash_succ = TRUE; #endif @@ -835,6 +866,8 @@ btr_search_drop_page_hash_index( n_fields = block->curr_n_fields; n_bytes = block->curr_n_bytes; + ut_a(n_fields + n_bytes > 0); + rw_lock_s_unlock(&btr_search_latch); n_recs = page_get_n_recs(page); @@ -851,6 +884,14 @@ btr_search_drop_page_hash_index( rec = page_get_infimum_rec(page); rec = page_rec_get_next(rec); + if (rec != sup) { + ut_a(n_fields <= rec_get_n_fields(rec)); + + if (n_bytes > 0) { + ut_a(n_fields < rec_get_n_fields(rec)); + } + } + tree_id = btr_page_get_index_id(page); prev_fold = 0; @@ -980,6 +1021,8 @@ btr_search_build_page_hash_index( return; } + ut_a(n_fields + n_bytes > 0); + /* Calculate and cache fold values and corresponding records into an array for fast insertion to the hash index */ @@ -995,6 +1038,14 @@ btr_search_build_page_hash_index( rec = page_get_infimum_rec(page); rec = page_rec_get_next(rec); + if (rec != sup) { + ut_a(n_fields <= rec_get_n_fields(rec)); + + if (n_bytes > 0) { + ut_a(n_fields < rec_get_n_fields(rec)); + } + } + /* FIXME: in a mixed tree, all records may not have enough ordering fields: */ diff --git a/innobase/buf/buf0buf.c b/innobase/buf/buf0buf.c index f1a2d915d46..7d001a6953d 100644 --- a/innobase/buf/buf0buf.c +++ b/innobase/buf/buf0buf.c @@ -1125,13 +1125,51 @@ buf_page_get_known_nowait( return(TRUE); } +/************************************************************************ +Inits a page to the buffer buf_pool, for use in ibbackup --restore. */ + +void +buf_page_init_for_backup_restore( +/*=============================*/ + ulint space, /* in: space id */ + ulint offset, /* in: offset of the page within space + in units of a page */ + buf_block_t* block) /* in: block to init */ +{ + /* Set the state of the block */ + block->magic_n = BUF_BLOCK_MAGIC_N; + + block->state = BUF_BLOCK_FILE_PAGE; + block->space = space; + block->offset = offset; + + block->lock_hash_val = 0; + block->lock_mutex = NULL; + + block->freed_page_clock = 0; + + block->newest_modification = ut_dulint_zero; + block->oldest_modification = ut_dulint_zero; + + block->accessed = FALSE; + block->buf_fix_count = 0; + block->io_fix = 0; + + block->n_hash_helps = 0; + block->is_hashed = FALSE; + block->n_fields = 1; + block->n_bytes = 0; + block->side = BTR_SEARCH_LEFT_SIDE; + + block->file_page_was_freed = FALSE; +} + /************************************************************************ Inits a page to the buffer buf_pool. */ static void buf_page_init( /*==========*/ - /* out: pointer to the block */ ulint space, /* in: space id */ ulint offset, /* in: offset of the page within space in units of a page */ @@ -1141,6 +1179,8 @@ buf_page_init( ut_ad(block->state == BUF_BLOCK_READY_FOR_USE); /* Set the state of the block */ + block->magic_n = BUF_BLOCK_MAGIC_N; + block->state = BUF_BLOCK_FILE_PAGE; block->space = space; block->offset = offset; diff --git a/innobase/buf/buf0rea.c b/innobase/buf/buf0rea.c index db187cdd896..475a5bd9cbd 100644 --- a/innobase/buf/buf0rea.c +++ b/innobase/buf/buf0rea.c @@ -100,6 +100,11 @@ buf_read_page_low( block = buf_page_init_for_read(mode, space, offset); if (block != NULL) { + if (buf_debug_prints) { + printf("Posting read request for page %lu, sync %lu\n", + offset, sync); + } + fil_io(OS_FILE_READ | wake_later, sync, space, offset, 0, UNIV_PAGE_SIZE, (void*)block->frame, (void*)block); @@ -467,6 +472,12 @@ buf_read_ahead_linear( count = 0; + /* Since Windows XP seems to schedule the i/o handler thread + very eagerly, and consequently it does not wait for the + full read batch to be posted, we use special heuristics here */ + + os_aio_simulated_put_read_threads_to_sleep(); + for (i = low; i < high; i++) { /* It is only sensible to do read-ahead in the non-sync aio mode: hence FALSE as the first parameter */ @@ -556,16 +567,34 @@ buf_read_recv_pages( highest page number the last in the array */ ulint n_stored) /* in: number of page numbers in the array */ { + ulint count; ulint i; for (i = 0; i < n_stored; i++) { + count = 0; + + os_aio_print_debug = FALSE; + while (buf_pool->n_pend_reads >= RECV_POOL_N_FREE_BLOCKS / 2) { os_aio_simulated_wake_handler_threads(); os_thread_sleep(500000); + + count++; + + if (count > 100) { + fprintf(stderr, +"InnoDB: Error: InnoDB has waited for 50 seconds for pending\n" +"InnoDB: reads to the buffer pool to be finished.\n" +"InnoDB: Number of pending reads %lu\n", buf_pool->n_pend_reads); + + os_aio_print_debug = TRUE; + } } + os_aio_print_debug = FALSE; + if ((i + 1 == n_stored) && sync) { buf_read_page_low(TRUE, BUF_READ_ANY_PAGE, space, page_nos[i]); diff --git a/innobase/data/data0data.c b/innobase/data/data0data.c index 2254dcb6ae6..61a02f7efd0 100644 --- a/innobase/data/data0data.c +++ b/innobase/data/data0data.c @@ -64,6 +64,35 @@ dtuple_get_nth_field_noninline( return(dtuple_get_nth_field(tuple, n)); } +/************************************************************************* +Tests if dfield data length and content is equal to the given. */ + +ibool +dfield_data_is_binary_equal( +/*========================*/ + /* out: TRUE if equal */ + dfield_t* field, /* in: field */ + ulint len, /* in: data length or UNIV_SQL_NULL */ + byte* data) /* in: data */ +{ + if (len != field->len) { + + return(FALSE); + } + + if (len == UNIV_SQL_NULL) { + + return(TRUE); + } + + if (0 != ut_memcmp(field->data, data, len)) { + + return(FALSE); + } + + return(TRUE); +} + /**************************************************************** Returns TRUE if lengths of two dtuples are equal and respective data fields in them are equal when compared with collation in char fields (not as binary @@ -153,6 +182,69 @@ dtuple_set_n_fields( tuple->n_fields_cmp = n_fields; } +/************************************************************** +Checks that a data field is typed. */ +static +ibool +dfield_check_typed_no_assert( +/*=========================*/ + /* out: TRUE if ok */ + dfield_t* field) /* in: data field */ +{ + if (dfield_get_type(field)->mtype > DATA_MYSQL + || dfield_get_type(field)->mtype < DATA_VARCHAR) { + + fprintf(stderr, +"InnoDB: Error: data field type %lu, len %lu\n", + dfield_get_type(field)->mtype, dfield_get_len(field)); + return(FALSE); + } + + return(TRUE); +} + +/************************************************************** +Checks that a data tuple is typed. */ + +ibool +dtuple_check_typed_no_assert( +/*=========================*/ + /* out: TRUE if ok */ + dtuple_t* tuple) /* in: tuple */ +{ + dfield_t* field; + ulint i; + char err_buf[1000]; + + if (dtuple_get_n_fields(tuple) > REC_MAX_N_FIELDS) { + fprintf(stderr, +"InnoDB: Error: index entry has %lu fields\n", + dtuple_get_n_fields(tuple)); + + dtuple_sprintf(err_buf, 900, tuple); + fprintf(stderr, +"InnoDB: Tuple contents: %s\n", err_buf); + + return(FALSE); + } + + for (i = 0; i < dtuple_get_n_fields(tuple); i++) { + + field = dtuple_get_nth_field(tuple, i); + + if (!dfield_check_typed_no_assert(field)) { + + dtuple_sprintf(err_buf, 900, tuple); + fprintf(stderr, +"InnoDB: Tuple contents: %s\n", err_buf); + + return(FALSE); + } + } + + return(TRUE); +} + /************************************************************** Checks that a data field is typed. Asserts an error if not. */ @@ -162,8 +254,15 @@ dfield_check_typed( /* out: TRUE if ok */ dfield_t* field) /* in: data field */ { - ut_a(dfield_get_type(field)->mtype <= DATA_MYSQL); - ut_a(dfield_get_type(field)->mtype >= DATA_VARCHAR); + if (dfield_get_type(field)->mtype > DATA_MYSQL + || dfield_get_type(field)->mtype < DATA_VARCHAR) { + + fprintf(stderr, +"InnoDB: Error: data field type %lu, len %lu\n", + dfield_get_type(field)->mtype, dfield_get_len(field)); + + ut_a(0); + } return(TRUE); } @@ -460,9 +559,21 @@ dtuple_convert_big_rec( ibool is_externally_stored; ulint i; ulint j; + char err_buf[1000]; + ut_a(dtuple_check_typed_no_assert(entry)); + size = rec_get_converted_size(entry); + if (size > 1000000000) { + fprintf(stderr, +"InnoDB: Warning: tuple size very big: %lu\n", size); + + dtuple_sprintf(err_buf, 900, entry); + fprintf(stderr, +"InnoDB: Tuple contents: %s\n", err_buf); + } + heap = mem_heap_create(size + dtuple_get_n_fields(entry) * sizeof(big_rec_field_t) + 1000); diff --git a/innobase/dict/dict0crea.c b/innobase/dict/dict0crea.c index 38c09c1011d..d981dc59036 100644 --- a/innobase/dict/dict0crea.c +++ b/innobase/dict/dict0crea.c @@ -153,6 +153,7 @@ dict_create_sys_tables_tuple( if (table->type == DICT_TABLE_CLUSTER_MEMBER) { dfield_set_data(dfield, table->cluster_name, ut_strlen(table->cluster_name)); + ut_a(0); /* Oracle-style clusters are not supported yet */ } else { dfield_set_data(dfield, NULL, UNIV_SQL_NULL); } diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c index a6f268c2153..7c166ecd068 100644 --- a/innobase/dict/dict0dict.c +++ b/innobase/dict/dict0dict.c @@ -2805,6 +2805,12 @@ dict_update_statistics_low( index = dict_table_get_first_index(table); + if (index == NULL) { + /* Table definition is corrupt */ + + return; + } + while (index) { size = btr_get_size(index, BTR_TOTAL_SIZE); @@ -3196,6 +3202,14 @@ dict_print_info_on_foreign_keys( buf2 += sprintf(buf2, ")"); + if (foreign->type == DICT_FOREIGN_ON_DELETE_CASCADE) { + buf2 += sprintf(buf2, " ON DELETE CASCADE"); + } + + if (foreign->type == DICT_FOREIGN_ON_DELETE_SET_NULL) { + buf2 += sprintf(buf2, " ON DELETE SET NULL"); + } + foreign = UT_LIST_GET_NEXT(foreign_list, foreign); } diff --git a/innobase/dict/dict0load.c b/innobase/dict/dict0load.c index 4917359c748..6d48ddf4d95 100644 --- a/innobase/dict/dict0load.c +++ b/innobase/dict/dict0load.c @@ -20,33 +20,6 @@ Created 4/24/1996 Heikki Tuuri #include "dict0dict.h" #include "dict0boot.h" -/************************************************************************ -Loads definitions for table columns. */ -static -void -dict_load_columns( -/*==============*/ - dict_table_t* table, /* in: table */ - mem_heap_t* heap); /* in: memory heap for temporary storage */ -/************************************************************************ -Loads definitions for table indexes. */ -static -void -dict_load_indexes( -/*==============*/ - dict_table_t* table, /* in: table */ - mem_heap_t* heap); /* in: memory heap for temporary storage */ -/************************************************************************ -Loads definitions for index fields. */ -static -void -dict_load_fields( -/*=============*/ - dict_table_t* table, /* in: table */ - dict_index_t* index, /* in: index whose fields to load */ - mem_heap_t* heap); /* in: memory heap for temporary storage */ - - /************************************************************************ Finds the first table name in the given database. */ @@ -194,7 +167,12 @@ loop: fprintf(stderr, "InnoDB: Failed to load table %s\n", table_name); } else { - dict_update_statistics_low(table, TRUE); + /* The table definition was corrupt if there + is no index */ + + if (dict_table_get_first_index(table)) { + dict_update_statistics_low(table, TRUE); + } dict_table_print_low(table); } @@ -208,358 +186,181 @@ loop: } /************************************************************************ -Loads a table definition and also all its index definitions, and also -the cluster definition if the table is a member in a cluster. Also loads -all foreign key constraints where the foreign key is in the table or where -a foreign key references columns in this table. Adds all these to the data -dictionary cache. */ - -dict_table_t* -dict_load_table( -/*============*/ - /* out: table, NULL if does not exist */ - char* name) /* in: table name */ +Loads definitions for table columns. */ +static +void +dict_load_columns( +/*==============*/ + dict_table_t* table, /* in: table */ + mem_heap_t* heap) /* in: memory heap for temporary storage */ { - dict_table_t* table; - dict_table_t* sys_tables; - btr_pcur_t pcur; + dict_table_t* sys_columns; dict_index_t* sys_index; + btr_pcur_t pcur; dtuple_t* tuple; - mem_heap_t* heap; dfield_t* dfield; rec_t* rec; byte* field; ulint len; - char* buf; - ulint space; - ulint n_cols; + byte* buf; + char* name_buf; + char* name; + ulint mtype; + ulint prtype; + ulint col_len; + ulint prec; + ulint i; mtr_t mtr; ut_ad(mutex_own(&(dict_sys->mutex))); - heap = mem_heap_create(1000); - mtr_start(&mtr); - sys_tables = dict_table_get_low("SYS_TABLES"); - sys_index = UT_LIST_GET_FIRST(sys_tables->indexes); + sys_columns = dict_table_get_low("SYS_COLUMNS"); + sys_index = UT_LIST_GET_FIRST(sys_columns->indexes); tuple = dtuple_create(heap, 1); dfield = dtuple_get_nth_field(tuple, 0); - dfield_set_data(dfield, name, ut_strlen(name)); + buf = mem_heap_alloc(heap, 8); + mach_write_to_8(buf, table->id); + + dfield_set_data(dfield, buf, 8); dict_index_copy_types(tuple, sys_index, 1); btr_pcur_open_on_user_rec(sys_index, tuple, PAGE_CUR_GE, - BTR_SEARCH_LEAF, &pcur, &mtr); - rec = btr_pcur_get_rec(&pcur); - - if (!btr_pcur_is_on_user_rec(&pcur, &mtr) - || rec_get_deleted_flag(rec)) { - /* Not found */ - - btr_pcur_close(&pcur); - mtr_commit(&mtr); - mem_heap_free(heap); - - return(NULL); - } + BTR_SEARCH_LEAF, &pcur, &mtr); + for (i = 0; i < table->n_cols - DATA_N_SYS_COLS; i++) { - field = rec_get_nth_field(rec, 0, &len); + rec = btr_pcur_get_rec(&pcur); - /* Check if the table name in record is the searched one */ - if (len != ut_strlen(name) || ut_memcmp(name, field, len) != 0) { + ut_a(btr_pcur_is_on_user_rec(&pcur, &mtr)); - btr_pcur_close(&pcur); - mtr_commit(&mtr); - mem_heap_free(heap); + ut_a(!rec_get_deleted_flag(rec)); - return(NULL); - } - - ut_a(0 == ut_strcmp("SPACE", - dict_field_get_col( - dict_index_get_nth_field( - dict_table_get_first_index(sys_tables), 9))->name)); - - field = rec_get_nth_field(rec, 9, &len); - space = mach_read_from_4(field); + field = rec_get_nth_field(rec, 0, &len); + ut_ad(len == 8); + ut_a(ut_dulint_cmp(table->id, mach_read_from_8(field)) == 0); - ut_a(0 == ut_strcmp("N_COLS", - dict_field_get_col( - dict_index_get_nth_field( - dict_table_get_first_index(sys_tables), 4))->name)); + field = rec_get_nth_field(rec, 1, &len); + ut_ad(len == 4); + ut_a(i == mach_read_from_4(field)); - field = rec_get_nth_field(rec, 4, &len); - n_cols = mach_read_from_4(field); + ut_a(0 == ut_strcmp("NAME", + dict_field_get_col( + dict_index_get_nth_field( + dict_table_get_first_index(sys_columns), 4))->name)); - table = dict_mem_table_create(name, space, n_cols); + field = rec_get_nth_field(rec, 4, &len); - ut_a(0 == ut_strcmp("ID", - dict_field_get_col( - dict_index_get_nth_field( - dict_table_get_first_index(sys_tables), 3))->name)); + name_buf = mem_heap_alloc(heap, len + 1); + ut_memcpy(name_buf, field, len); + name_buf[len] = '\0'; - field = rec_get_nth_field(rec, 3, &len); - table->id = mach_read_from_8(field); + name = name_buf; - field = rec_get_nth_field(rec, 5, &len); - table->type = mach_read_from_4(field); + field = rec_get_nth_field(rec, 5, &len); + mtype = mach_read_from_4(field); - if (table->type == DICT_TABLE_CLUSTER_MEMBER) { - ut_a(0); - field = rec_get_nth_field(rec, 6, &len); - table->mix_id = mach_read_from_8(field); - - field = rec_get_nth_field(rec, 8, &len); - buf = mem_heap_alloc(heap, len); - ut_memcpy(buf, field, len); - - table->cluster_name = buf; - } + prtype = mach_read_from_4(field); - if ((table->type == DICT_TABLE_CLUSTER) - || (table->type == DICT_TABLE_CLUSTER_MEMBER)) { - field = rec_get_nth_field(rec, 7, &len); - table->mix_len = mach_read_from_4(field); - } - - btr_pcur_close(&pcur); - mtr_commit(&mtr); - - if (table->type == DICT_TABLE_CLUSTER_MEMBER) { - /* Load the cluster table definition if not yet in - memory cache */ - dict_table_get_low(table->cluster_name); - } - - dict_load_columns(table, heap); + col_len = mach_read_from_4(field); - dict_table_add_to_cache(table); + ut_a(0 == ut_strcmp("PREC", + dict_field_get_col( + dict_index_get_nth_field( + dict_table_get_first_index(sys_columns), 8))->name)); - dict_load_indexes(table, heap); - - ut_a(DB_SUCCESS == dict_load_foreigns(table->name)); + field = rec_get_nth_field(rec, 8, &len); + prec = mach_read_from_4(field); - mem_heap_free(heap); + dict_mem_table_add_col(table, name, mtype, prtype, col_len, + prec); + btr_pcur_move_to_next_user_rec(&pcur, &mtr); + } - return(table); + btr_pcur_close(&pcur); + mtr_commit(&mtr); } -/*************************************************************************** -Loads a table object based on the table id. */ - -dict_table_t* -dict_load_table_on_id( -/*==================*/ - /* out: table; NULL if table does not exist */ - dulint table_id) /* in: table id */ +/************************************************************************ +Loads definitions for index fields. */ +static +void +dict_load_fields( +/*=============*/ + dict_table_t* table, /* in: table */ + dict_index_t* index, /* in: index whose fields to load */ + mem_heap_t* heap) /* in: memory heap for temporary storage */ { - byte id_buf[8]; + dict_table_t* sys_fields; + dict_index_t* sys_index; btr_pcur_t pcur; - mem_heap_t* heap; dtuple_t* tuple; dfield_t* dfield; - dict_index_t* sys_table_ids; - dict_table_t* sys_tables; + char* col_name; rec_t* rec; byte* field; - ulint len; - dict_table_t* table; - char* name; + ulint len; + byte* buf; + ulint i; mtr_t mtr; ut_ad(mutex_own(&(dict_sys->mutex))); - /* NOTE that the operation of this function is protected by - the dictionary mutex, and therefore no deadlocks can occur - with other dictionary operations. */ + UT_NOT_USED(table); - mtr_start(&mtr); - /*---------------------------------------------------*/ - /* Get the secondary index based on ID for table SYS_TABLES */ - sys_tables = dict_sys->sys_tables; - sys_table_ids = dict_table_get_next_index( - dict_table_get_first_index(sys_tables)); - heap = mem_heap_create(256); + mtr_start(&mtr); - tuple = dtuple_create(heap, 1); + sys_fields = dict_table_get_low("SYS_FIELDS"); + sys_index = UT_LIST_GET_FIRST(sys_fields->indexes); + + tuple = dtuple_create(heap, 1); dfield = dtuple_get_nth_field(tuple, 0); - /* Write the table id in byte format to id_buf */ - mach_write_to_8(id_buf, table_id); - - dfield_set_data(dfield, id_buf, 8); - dict_index_copy_types(tuple, sys_table_ids, 1); + buf = mem_heap_alloc(heap, 8); + mach_write_to_8(buf, index->id); - btr_pcur_open_on_user_rec(sys_table_ids, tuple, PAGE_CUR_GE, + dfield_set_data(dfield, buf, 8); + dict_index_copy_types(tuple, sys_index, 1); + + btr_pcur_open_on_user_rec(sys_index, tuple, PAGE_CUR_GE, BTR_SEARCH_LEAF, &pcur, &mtr); - rec = btr_pcur_get_rec(&pcur); - - if (!btr_pcur_is_on_user_rec(&pcur, &mtr) - || rec_get_deleted_flag(rec)) { - /* Not found */ + for (i = 0; i < index->n_fields; i++) { - btr_pcur_close(&pcur); - mtr_commit(&mtr); - mem_heap_free(heap); - - return(NULL); - } - - /*---------------------------------------------------*/ - /* Now we have the record in the secondary index containing the - table ID and NAME */ - - rec = btr_pcur_get_rec(&pcur); - field = rec_get_nth_field(rec, 0, &len); - ut_ad(len == 8); - - /* Check if the table id in record is the one searched for */ - if (ut_dulint_cmp(table_id, mach_read_from_8(field)) != 0) { - - btr_pcur_close(&pcur); - mtr_commit(&mtr); - mem_heap_free(heap); - - return(NULL); - } - - /* Now we get the table name from the record */ - field = rec_get_nth_field(rec, 1, &len); - - name = mem_heap_alloc(heap, len + 1); - ut_memcpy(name, field, len); - name[len] = '\0'; - - /* Load the table definition to memory */ - table = dict_load_table(name); - - ut_a(table); - - btr_pcur_close(&pcur); - mtr_commit(&mtr); - mem_heap_free(heap); - - return(table); -} - -/************************************************************************ -This function is called when the database is booted. Loads system table -index definitions except for the clustered index which is added to the -dictionary cache at booting before calling this function. */ - -void -dict_load_sys_table( -/*================*/ - dict_table_t* table) /* in: system table */ -{ - mem_heap_t* heap; - - ut_ad(mutex_own(&(dict_sys->mutex))); - - heap = mem_heap_create(1000); - - dict_load_indexes(table, heap); - - mem_heap_free(heap); -} - -/************************************************************************ -Loads definitions for table columns. */ -static -void -dict_load_columns( -/*==============*/ - dict_table_t* table, /* in: table */ - mem_heap_t* heap) /* in: memory heap for temporary storage */ -{ - dict_table_t* sys_columns; - dict_index_t* sys_index; - btr_pcur_t pcur; - dtuple_t* tuple; - dfield_t* dfield; - rec_t* rec; - byte* field; - ulint len; - byte* buf; - char* name_buf; - char* name; - ulint mtype; - ulint prtype; - ulint col_len; - ulint prec; - ulint i; - mtr_t mtr; - - ut_ad(mutex_own(&(dict_sys->mutex))); - - mtr_start(&mtr); - - sys_columns = dict_table_get_low("SYS_COLUMNS"); - sys_index = UT_LIST_GET_FIRST(sys_columns->indexes); - - tuple = dtuple_create(heap, 1); - dfield = dtuple_get_nth_field(tuple, 0); - - buf = mem_heap_alloc(heap, 8); - mach_write_to_8(buf, table->id); - - dfield_set_data(dfield, buf, 8); - dict_index_copy_types(tuple, sys_index, 1); - - btr_pcur_open_on_user_rec(sys_index, tuple, PAGE_CUR_GE, - BTR_SEARCH_LEAF, &pcur, &mtr); - for (i = 0; i < table->n_cols - DATA_N_SYS_COLS; i++) { - - rec = btr_pcur_get_rec(&pcur); + rec = btr_pcur_get_rec(&pcur); ut_a(btr_pcur_is_on_user_rec(&pcur, &mtr)); - - ut_a(!rec_get_deleted_flag(rec)); + if (rec_get_deleted_flag(rec)) { + fprintf(stderr, +"InnoDB: Error: data dictionary entry for table %s is corrupt!\n", +"InnoDB: An index field is delete marked.\n", + table->name); + } field = rec_get_nth_field(rec, 0, &len); ut_ad(len == 8); - ut_a(ut_dulint_cmp(table->id, mach_read_from_8(field)) == 0); + ut_a(ut_memcmp(buf, field, len) == 0); field = rec_get_nth_field(rec, 1, &len); ut_ad(len == 4); ut_a(i == mach_read_from_4(field)); - ut_a(0 == ut_strcmp("NAME", + ut_a(0 == ut_strcmp("COL_NAME", dict_field_get_col( dict_index_get_nth_field( - dict_table_get_first_index(sys_columns), 4))->name)); + dict_table_get_first_index(sys_fields), 4))->name)); field = rec_get_nth_field(rec, 4, &len); - name_buf = mem_heap_alloc(heap, len + 1); - ut_memcpy(name_buf, field, len); - name_buf[len] = '\0'; - - name = name_buf; - - field = rec_get_nth_field(rec, 5, &len); - mtype = mach_read_from_4(field); - - field = rec_get_nth_field(rec, 6, &len); - prtype = mach_read_from_4(field); - - field = rec_get_nth_field(rec, 7, &len); - col_len = mach_read_from_4(field); - - ut_a(0 == ut_strcmp("PREC", - dict_field_get_col( - dict_index_get_nth_field( - dict_table_get_first_index(sys_columns), 8))->name)); - - field = rec_get_nth_field(rec, 8, &len); - prec = mach_read_from_4(field); + col_name = mem_heap_alloc(heap, len + 1); + ut_memcpy(col_name, field, len); + col_name[len] = '\0'; + + dict_mem_index_add_field(index, col_name, 0); - dict_mem_table_add_col(table, name, mtype, prtype, col_len, - prec); btr_pcur_move_to_next_user_rec(&pcur, &mtr); } @@ -568,12 +369,14 @@ dict_load_columns( } /************************************************************************ -Loads definitions for table indexes. Adds them to the data dictionary cache. -*/ +Loads definitions for table indexes. Adds them to the data dictionary +cache. */ static -void +ibool dict_load_indexes( /*==============*/ + /* out: TRUE if ok, FALSE if corruption + of dictionary table */ dict_table_t* table, /* in: table */ mem_heap_t* heap) /* in: memory heap for temporary storage */ { @@ -637,7 +440,17 @@ dict_load_indexes( break; } - ut_a(!rec_get_deleted_flag(rec)); + if (rec_get_deleted_flag(rec)) { + fprintf(stderr, +"InnoDB: Error: data dictionary entry for table %s is corrupt!\n" +"InnoDB: An index is delete marked.\n", + table->name); + + btr_pcur_close(&pcur); + mtr_commit(&mtr); + + return(FALSE); + } field = rec_get_nth_field(rec, 1, &len); ut_ad(len == 8); @@ -671,6 +484,33 @@ dict_load_indexes( field = rec_get_nth_field(rec, 8, &len); page_no = mach_read_from_4(field); + if (page_no == FIL_NULL) { + + fprintf(stderr, + "InnoDB: Error: trying to load index %s for table %s\n" + "InnoDB: but the index tree has been freed!\n", + name_buf, table->name); + + btr_pcur_close(&pcur); + mtr_commit(&mtr); + + return(FALSE); + } + + if ((type & DICT_CLUSTERED) == 0 + && NULL == dict_table_get_first_index(table)) { + + fprintf(stderr, + "InnoDB: Error: trying to load index %s for table %s\n" + "InnoDB: but the first index was not clustered!\n", + name_buf, table->name); + + btr_pcur_close(&pcur); + mtr_commit(&mtr); + + return(FALSE); + } + if (is_sys_table && ((type & DICT_CLUSTERED) || ((table == dict_sys->sys_tables) @@ -688,16 +528,7 @@ dict_load_indexes( dict_load_fields(table, index, heap); - if (index->type & DICT_CLUSTERED == 0 - && NULL == dict_table_get_first_index(table)) { - - fprintf(stderr, - "InnoDB: Error: trying to load index %s for table %s\n" - "InnoDB: but the first index was not clustered\n", - index->name, table->name); - } else { - dict_index_add_to_cache(table, index); - } + dict_index_add_to_cache(table, index); } btr_pcur_move_to_next_user_rec(&pcur, &mtr); @@ -705,84 +536,266 @@ dict_load_indexes( btr_pcur_close(&pcur); mtr_commit(&mtr); + + return(TRUE); } /************************************************************************ -Loads definitions for index fields. */ -static -void -dict_load_fields( -/*=============*/ - dict_table_t* table, /* in: table */ - dict_index_t* index, /* in: index whose fields to load */ - mem_heap_t* heap) /* in: memory heap for temporary storage */ +Loads a table definition and also all its index definitions, and also +the cluster definition if the table is a member in a cluster. Also loads +all foreign key constraints where the foreign key is in the table or where +a foreign key references columns in this table. Adds all these to the data +dictionary cache. */ + +dict_table_t* +dict_load_table( +/*============*/ + /* out: table, NULL if does not exist */ + char* name) /* in: table name */ { - dict_table_t* sys_fields; - dict_index_t* sys_index; + dict_table_t* table; + dict_table_t* sys_tables; btr_pcur_t pcur; + dict_index_t* sys_index; dtuple_t* tuple; + mem_heap_t* heap; dfield_t* dfield; - char* col_name; rec_t* rec; byte* field; ulint len; - byte* buf; - ulint i; + char* buf; + ulint space; + ulint n_cols; mtr_t mtr; ut_ad(mutex_own(&(dict_sys->mutex))); - UT_NOT_USED(table); - + heap = mem_heap_create(1000); + mtr_start(&mtr); - sys_fields = dict_table_get_low("SYS_FIELDS"); - sys_index = UT_LIST_GET_FIRST(sys_fields->indexes); + sys_tables = dict_table_get_low("SYS_TABLES"); + sys_index = UT_LIST_GET_FIRST(sys_tables->indexes); tuple = dtuple_create(heap, 1); dfield = dtuple_get_nth_field(tuple, 0); - buf = mem_heap_alloc(heap, 8); - mach_write_to_8(buf, index->id); - - dfield_set_data(dfield, buf, 8); + dfield_set_data(dfield, name, ut_strlen(name)); dict_index_copy_types(tuple, sys_index, 1); btr_pcur_open_on_user_rec(sys_index, tuple, PAGE_CUR_GE, - BTR_SEARCH_LEAF, &pcur, &mtr); - for (i = 0; i < index->n_fields; i++) { + BTR_SEARCH_LEAF, &pcur, &mtr); + rec = btr_pcur_get_rec(&pcur); - rec = btr_pcur_get_rec(&pcur); + if (!btr_pcur_is_on_user_rec(&pcur, &mtr) + || rec_get_deleted_flag(rec)) { + /* Not found */ - ut_a(btr_pcur_is_on_user_rec(&pcur, &mtr)); - ut_a(!rec_get_deleted_flag(rec)); + btr_pcur_close(&pcur); + mtr_commit(&mtr); + mem_heap_free(heap); - field = rec_get_nth_field(rec, 0, &len); - ut_ad(len == 8); - ut_a(ut_memcmp(buf, field, len) == 0); + return(NULL); + } - field = rec_get_nth_field(rec, 1, &len); - ut_ad(len == 4); - ut_a(i == mach_read_from_4(field)); + field = rec_get_nth_field(rec, 0, &len); - ut_a(0 == ut_strcmp("COL_NAME", - dict_field_get_col( - dict_index_get_nth_field( - dict_table_get_first_index(sys_fields), 4))->name)); + /* Check if the table name in record is the searched one */ + if (len != ut_strlen(name) || ut_memcmp(name, field, len) != 0) { - field = rec_get_nth_field(rec, 4, &len); + btr_pcur_close(&pcur); + mtr_commit(&mtr); + mem_heap_free(heap); + + return(NULL); + } - col_name = mem_heap_alloc(heap, len + 1); - ut_memcpy(col_name, field, len); - col_name[len] = '\0'; + ut_a(0 == ut_strcmp("SPACE", + dict_field_get_col( + dict_index_get_nth_field( + dict_table_get_first_index(sys_tables), 9))->name)); + + field = rec_get_nth_field(rec, 9, &len); + space = mach_read_from_4(field); + + ut_a(0 == ut_strcmp("N_COLS", + dict_field_get_col( + dict_index_get_nth_field( + dict_table_get_first_index(sys_tables), 4))->name)); + + field = rec_get_nth_field(rec, 4, &len); + n_cols = mach_read_from_4(field); + + table = dict_mem_table_create(name, space, n_cols); + + ut_a(0 == ut_strcmp("ID", + dict_field_get_col( + dict_index_get_nth_field( + dict_table_get_first_index(sys_tables), 3))->name)); + + field = rec_get_nth_field(rec, 3, &len); + table->id = mach_read_from_8(field); + + field = rec_get_nth_field(rec, 5, &len); + table->type = mach_read_from_4(field); + + if (table->type == DICT_TABLE_CLUSTER_MEMBER) { + ut_a(0); + + field = rec_get_nth_field(rec, 6, &len); + table->mix_id = mach_read_from_8(field); + + field = rec_get_nth_field(rec, 8, &len); + buf = mem_heap_alloc(heap, len); + ut_memcpy(buf, field, len); + + table->cluster_name = buf; + } + + if ((table->type == DICT_TABLE_CLUSTER) + || (table->type == DICT_TABLE_CLUSTER_MEMBER)) { - dict_mem_index_add_field(index, col_name, 0); + field = rec_get_nth_field(rec, 7, &len); + table->mix_len = mach_read_from_4(field); + } - btr_pcur_move_to_next_user_rec(&pcur, &mtr); - } + btr_pcur_close(&pcur); + mtr_commit(&mtr); + + if (table->type == DICT_TABLE_CLUSTER_MEMBER) { + /* Load the cluster table definition if not yet in + memory cache */ + dict_table_get_low(table->cluster_name); + } + + dict_load_columns(table, heap); + + dict_table_add_to_cache(table); + + dict_load_indexes(table, heap); + + ut_a(DB_SUCCESS == dict_load_foreigns(table->name)); + + mem_heap_free(heap); + + return(table); +} + +/*************************************************************************** +Loads a table object based on the table id. */ + +dict_table_t* +dict_load_table_on_id( +/*==================*/ + /* out: table; NULL if table does not exist */ + dulint table_id) /* in: table id */ +{ + byte id_buf[8]; + btr_pcur_t pcur; + mem_heap_t* heap; + dtuple_t* tuple; + dfield_t* dfield; + dict_index_t* sys_table_ids; + dict_table_t* sys_tables; + rec_t* rec; + byte* field; + ulint len; + dict_table_t* table; + char* name; + mtr_t mtr; + + ut_ad(mutex_own(&(dict_sys->mutex))); + + /* NOTE that the operation of this function is protected by + the dictionary mutex, and therefore no deadlocks can occur + with other dictionary operations. */ + + mtr_start(&mtr); + /*---------------------------------------------------*/ + /* Get the secondary index based on ID for table SYS_TABLES */ + sys_tables = dict_sys->sys_tables; + sys_table_ids = dict_table_get_next_index( + dict_table_get_first_index(sys_tables)); + heap = mem_heap_create(256); + + tuple = dtuple_create(heap, 1); + dfield = dtuple_get_nth_field(tuple, 0); + + /* Write the table id in byte format to id_buf */ + mach_write_to_8(id_buf, table_id); + + dfield_set_data(dfield, id_buf, 8); + dict_index_copy_types(tuple, sys_table_ids, 1); + + btr_pcur_open_on_user_rec(sys_table_ids, tuple, PAGE_CUR_GE, + BTR_SEARCH_LEAF, &pcur, &mtr); + rec = btr_pcur_get_rec(&pcur); + + if (!btr_pcur_is_on_user_rec(&pcur, &mtr) + || rec_get_deleted_flag(rec)) { + /* Not found */ + + btr_pcur_close(&pcur); + mtr_commit(&mtr); + mem_heap_free(heap); + + return(NULL); + } + + /*---------------------------------------------------*/ + /* Now we have the record in the secondary index containing the + table ID and NAME */ + + rec = btr_pcur_get_rec(&pcur); + field = rec_get_nth_field(rec, 0, &len); + ut_ad(len == 8); + /* Check if the table id in record is the one searched for */ + if (ut_dulint_cmp(table_id, mach_read_from_8(field)) != 0) { + + btr_pcur_close(&pcur); + mtr_commit(&mtr); + mem_heap_free(heap); + + return(NULL); + } + + /* Now we get the table name from the record */ + field = rec_get_nth_field(rec, 1, &len); + + name = mem_heap_alloc(heap, len + 1); + ut_memcpy(name, field, len); + name[len] = '\0'; + + /* Load the table definition to memory */ + table = dict_load_table(name); + btr_pcur_close(&pcur); mtr_commit(&mtr); + mem_heap_free(heap); + + return(table); +} + +/************************************************************************ +This function is called when the database is booted. Loads system table +index definitions except for the clustered index which is added to the +dictionary cache at booting before calling this function. */ + +void +dict_load_sys_table( +/*================*/ + dict_table_t* table) /* in: system table */ +{ + mem_heap_t* heap; + + ut_ad(mutex_own(&(dict_sys->mutex))); + + heap = mem_heap_create(1000); + + dict_load_indexes(table, heap); + + mem_heap_free(heap); } /************************************************************************ diff --git a/innobase/dict/dict0mem.c b/innobase/dict/dict0mem.c index 52f46062065..9a4c94de885 100644 --- a/innobase/dict/dict0mem.c +++ b/innobase/dict/dict0mem.c @@ -65,6 +65,9 @@ dict_mem_table_create( table->cached = FALSE; + table->mix_id = ut_dulint_zero; + table->mix_len = 0; + table->cols = mem_heap_alloc(heap, (n_cols + DATA_N_SYS_COLS) * sizeof(dict_col_t)); UT_LIST_INIT(table->indexes); diff --git a/innobase/fsp/fsp0fsp.c b/innobase/fsp/fsp0fsp.c index e823fe62259..d78db2a5ea8 100644 --- a/innobase/fsp/fsp0fsp.c +++ b/innobase/fsp/fsp0fsp.c @@ -2608,6 +2608,7 @@ fseg_free_page_low( ulint not_full_n_used; ulint state; ulint i; + char errbuf[200]; ut_ad(seg_inode && mtr); ut_ad(mach_read_from_4(seg_inode + FSEG_MAGIC_N) == @@ -2621,8 +2622,25 @@ fseg_free_page_low( descr = xdes_get_descriptor(space, page, mtr); ut_a(descr); - ut_a(xdes_get_bit(descr, XDES_FREE_BIT, page % FSP_EXTENT_SIZE, mtr) - == FALSE); + if (xdes_get_bit(descr, XDES_FREE_BIT, page % FSP_EXTENT_SIZE, mtr) + != FALSE) { + ut_sprintf_buf(errbuf, descr, 40); + fprintf(stderr, +"InnoDB: Dump of the tablespace extent descriptor: %s\n", errbuf); + + fprintf(stderr, +"InnoDB: Serious error! InnoDB is trying to free page %lu\n", +"InnoDB: though it is already marked as free in the tablespace!\n" +"InnoDB: The tablespace free space info is corrupt.\n" +"InnoDB: You may need to dump your InnoDB tables and recreate the whole\n" +"InnoDB: database!\n", page); + + fprintf(stderr, +"InnoDB: If the InnoDB recovery crashes here, see section 6.1\n" +"InnoDB: of http://www.innodb.com/ibman.html about forcing recovery.\n"); + ut_a(0); + } + state = xdes_get_state(descr, mtr); if (state != XDES_FSEG) { diff --git a/innobase/ibuf/ibuf0ibuf.c b/innobase/ibuf/ibuf0ibuf.c index bd1f0e6e1d8..f51a924c87f 100644 --- a/innobase/ibuf/ibuf0ibuf.c +++ b/innobase/ibuf/ibuf0ibuf.c @@ -685,21 +685,21 @@ ibuf_bitmap_get_map_page( /**************************************************************************** Sets the free bits of the page in the ibuf bitmap. This is done in a separate mini-transaction, hence this operation does not restrict further work to only -ibuf bitmap operations, which would result if the latch to the bitmap pag +ibuf bitmap operations, which would result if the latch to the bitmap page were kept. */ UNIV_INLINE void ibuf_set_free_bits_low( /*===================*/ ulint type, /* in: index type */ - page_t* page, /* in: index page; free bit is reset if the index is - a non-clustered non-unique, and page level is 0 */ + page_t* page, /* in: index page; free bit is set if the index is + non-clustered and page level is 0 */ ulint val, /* in: value to set: < 4 */ mtr_t* mtr) /* in: mtr */ { page_t* bitmap_page; - if (type & (DICT_CLUSTERED | DICT_UNIQUE)) { + if (type & DICT_CLUSTERED) { return; } @@ -733,8 +733,8 @@ void ibuf_set_free_bits( /*===============*/ ulint type, /* in: index type */ - page_t* page, /* in: index page; free bit is reset if the index is - a non-clustered non-unique, and page level is 0 */ + page_t* page, /* in: index page; free bit is set if the index is + non-clustered and page level is 0 */ ulint val, /* in: value to set: < 4 */ ulint max_val)/* in: ULINT_UNDEFINED or a maximum value which the bits must have before setting; this is for @@ -743,7 +743,7 @@ ibuf_set_free_bits( mtr_t mtr; page_t* bitmap_page; - if (type & (DICT_CLUSTERED | DICT_UNIQUE)) { + if (type & DICT_CLUSTERED) { return; } @@ -2024,7 +2024,7 @@ ibuf_insert_low( ulint n_stored; ulint bits; - ut_a(!(index->type & (DICT_UNIQUE | DICT_CLUSTERED))); + ut_a(!(index->type & DICT_CLUSTERED)); ut_ad(dtuple_check_typed(entry)); do_merge = FALSE; @@ -2254,10 +2254,7 @@ ibuf_insert( ut_ad(dtuple_check_typed(entry)); - if (index->type & DICT_CLUSTERED || index->type & DICT_UNIQUE) { - - return(FALSE); - } + ut_a(!(index->type & DICT_CLUSTERED)); if (rec_get_converted_size(entry) >= page_get_free_space_of_empty() / 2) { @@ -2302,6 +2299,7 @@ ibuf_insert_to_index_page( rec_t* rec; page_t* bitmap_page; ulint old_bits; + char errbuf[1000]; ut_ad(ibuf_inside()); ut_ad(dtuple_check_typed(entry)); @@ -2324,11 +2322,24 @@ ibuf_insert_to_index_page( /* This time the record must fit */ if (!page_cur_tuple_insert(&page_cur, entry, mtr)) { - printf( - "Ibuf insert fails; page free %lu, dtuple size %lu\n", + + ut_print_timestamp(stderr); + + fprintf(stderr, +"InnoDB: Error: Insert buffer insert fails; page free %lu, dtuple size %lu\n", page_get_max_insert_size(page, 1), rec_get_converted_size(entry)); + dtuple_sprintf(errbuf, 900, entry); + + fprintf(stderr, +"InnoDB: Cannot insert index record %s\n", errbuf); + + fprintf(stderr, +"InnoDB: The table where where this index record belongs\n" +"InnoDB: is now probably corrupt. Please run CHECK TABLE on\n" +"InnoDB: that table.\n"); + bitmap_page = ibuf_bitmap_get_map_page( buf_frame_get_space_id(page), buf_frame_get_page_no(page), @@ -2339,9 +2350,11 @@ ibuf_insert_to_index_page( buf_frame_get_page_no(page), IBUF_BITMAP_FREE, mtr); - printf("Bitmap bits %lu\n", old_bits); - - ut_error; + fprintf(stderr, "Bitmap bits %lu\n", old_bits); + + fprintf(stderr, +"InnoDB: Send a detailed bug report to mysql@lists.mysql.com!\n"); + } } } diff --git a/innobase/include/btr0btr.h b/innobase/include/btr0btr.h index d22f9d79c1c..bf433c0c264 100644 --- a/innobase/include/btr0btr.h +++ b/innobase/include/btr0btr.h @@ -204,16 +204,6 @@ btr_page_reorganize( page_t* page, /* in: page to be reorganized */ mtr_t* mtr); /* in: mtr */ /***************************************************************** -Reorganizes an index page. */ - -void -btr_page_reorganize_low( -/*====================*/ - ibool low, /* in: TRUE if locks should not be updated, i.e., - there cannot exist locks on the page */ - page_t* page, /* in: page to be reorganized */ - mtr_t* mtr); /* in: mtr */ -/***************************************************************** Decides if the page should be split at the convergence point of inserts converging to left. */ diff --git a/innobase/include/btr0cur.h b/innobase/include/btr0cur.h index bce1f0685cc..7af34deb30f 100644 --- a/innobase/include/btr0cur.h +++ b/innobase/include/btr0cur.h @@ -709,6 +709,7 @@ allowed to free an inherited external field. */ #define BTR_EXTERN_INHERITED_FLAG 64 extern ulint btr_cur_n_non_sea; +extern ulint btr_cur_n_sea; #ifndef UNIV_NONINL #include "btr0cur.ic" diff --git a/innobase/include/btr0sea.h b/innobase/include/btr0sea.h index fdf5cf375a3..14feca5d5c5 100644 --- a/innobase/include/btr0sea.h +++ b/innobase/include/btr0sea.h @@ -176,6 +176,7 @@ btr_search_validate(void); /* The search info struct in an index */ struct btr_search_struct{ + ulint magic_n; /* magic number */ /* The following 4 fields are currently not used: */ rec_t* last_search; /* pointer to the lower limit record of the previous search; NULL if not known */ @@ -220,6 +221,8 @@ struct btr_search_struct{ ulint n_searches; /* number of searches */ }; +#define BTR_SEARCH_MAGIC_N 1112765 + /* The hash index system */ typedef struct btr_search_sys_struct btr_search_sys_t; diff --git a/innobase/include/buf0buf.h b/innobase/include/buf0buf.h index 5ddbf39335a..ca0692f1e17 100644 --- a/innobase/include/buf0buf.h +++ b/innobase/include/buf0buf.h @@ -219,6 +219,16 @@ buf_page_create( a page */ mtr_t* mtr); /* in: mini-transaction handle */ /************************************************************************ +Inits a page to the buffer buf_pool, for use in ibbackup --restore. */ + +void +buf_page_init_for_backup_restore( +/*=============================*/ + ulint space, /* in: space id */ + ulint offset, /* in: offset of the page within space + in units of a page */ + buf_block_t* block); /* in: block to init */ +/************************************************************************ Decrements the bufferfix count of a buffer control block and releases a latch, if specified. */ UNIV_INLINE @@ -605,6 +615,7 @@ struct buf_block_struct{ /* 1. General fields */ + ulint magic_n; /* magic number to check */ ulint state; /* state of the control block: BUF_BLOCK_NOT_USED, ... */ byte* frame; /* pointer to buffer frame which @@ -729,6 +740,8 @@ struct buf_block_struct{ frees a page in buffer pool */ }; +#define BUF_BLOCK_MAGIC_N 41526563 + /* The buffer pool structure. NOTE! The definition appears here only for other modules of this directory (buf) to see it. Do not use from outside! */ diff --git a/innobase/include/buf0rea.h b/innobase/include/buf0rea.h index 1efe67369ab..aed965a6b21 100644 --- a/innobase/include/buf0rea.h +++ b/innobase/include/buf0rea.h @@ -89,7 +89,7 @@ buf_read_recv_pages( /* The size in pages of the area which the read-ahead algorithms read if invoked */ -#define BUF_READ_AHEAD_AREA ut_min(32, buf_pool->curr_size / 16) +#define BUF_READ_AHEAD_AREA ut_min(64, ut_2_power_up(buf_pool->curr_size / 32)) /* Modes used in read-ahead */ #define BUF_READ_IBUF_PAGES_ONLY 131 diff --git a/innobase/include/data0data.h b/innobase/include/data0data.h index c19d7ea5552..e0fb06e5018 100644 --- a/innobase/include/data0data.h +++ b/innobase/include/data0data.h @@ -123,7 +123,7 @@ dfield_datas_are_binary_equal( dfield_t* field2);/* in: field */ /************************************************************************* Tests if dfield data length and content is equal to the given. */ -UNIV_INLINE + ibool dfield_data_is_binary_equal( /*========================*/ @@ -279,6 +279,14 @@ dtuple_check_typed( /* out: TRUE if ok */ dtuple_t* tuple); /* in: tuple */ /************************************************************** +Checks that a data tuple is typed. */ + +ibool +dtuple_check_typed_no_assert( +/*=========================*/ + /* out: TRUE if ok */ + dtuple_t* tuple); /* in: tuple */ +/************************************************************** Validates the consistency of a tuple which must be complete, i.e, all fields must have been set. */ diff --git a/innobase/include/data0data.ic b/innobase/include/data0data.ic index 0750a3894d1..d356664df21 100644 --- a/innobase/include/data0data.ic +++ b/innobase/include/data0data.ic @@ -153,30 +153,6 @@ dfield_datas_are_binary_equal( return(TRUE); } -/************************************************************************* -Tests if dfield data length and content is equal to the given. */ -UNIV_INLINE -ibool -dfield_data_is_binary_equal( -/*========================*/ - /* out: TRUE if equal */ - dfield_t* field, /* in: field */ - ulint len, /* in: data length or UNIV_SQL_NULL */ - byte* data) /* in: data */ -{ - if (len != field->len) { - - return(FALSE); - } - - if (len != UNIV_SQL_NULL && 0 != ut_memcmp(field->data, data, len)) { - - return(FALSE); - } - - return(TRUE); -} - /************************************************************************* Gets info bits in a data tuple. */ UNIV_INLINE diff --git a/innobase/include/log0log.h b/innobase/include/log0log.h index eeb4f2e45f1..d4bd0036c5a 100644 --- a/innobase/include/log0log.h +++ b/innobase/include/log0log.h @@ -157,6 +157,14 @@ log_io_complete( /*============*/ log_group_t* group); /* in: log group */ /********************************************************** +Flushes the log files to the disk, using, for example, the Unix fsync. +This function does the flush even if the user has set +srv_flush_log_at_trx_commit = FALSE. */ + +void +log_flush_to_disk(void); +/*===================*/ +/********************************************************** This function is called, e.g., when a transaction wants to commit. It checks that the log has been flushed to disk up to the last log entry written by the transaction. If there is a flush running, it waits and checks if the flush @@ -260,7 +268,9 @@ log_reset_first_header_and_checkpoint( /*==================================*/ byte* hdr_buf,/* in: buffer which will be written to the start of the first log file */ - dulint lsn); /* in: lsn of the start of the first log file */ + dulint start); /* in: lsn of the start of the first log file; + we pretend that there is a checkpoint at + start + LOG_BLOCK_HDR_SIZE */ /************************************************************************ Starts an archiving operation. */ @@ -463,6 +473,15 @@ log_block_init( byte* log_block, /* in: pointer to the log buffer */ dulint lsn); /* in: lsn within the log block */ /**************************************************************** +Initializes a log block in the log buffer in the old, < 3.23.52 format, where +there was no checksum yet. */ +UNIV_INLINE +void +log_block_init_in_old_format( +/*=========================*/ + byte* log_block, /* in: pointer to the log buffer */ + dulint lsn); /* in: lsn within the log block */ +/**************************************************************** Converts a lsn to a log block number. */ UNIV_INLINE ulint @@ -523,7 +542,10 @@ extern log_t* log_sys; bytes */ /* Offsets of a log block trailer from the end of the block */ -#define LOG_BLOCK_TRL_NO 4 /* log block number */ +#define LOG_BLOCK_TRL_CHECKSUM 4 /* 1 byte checksum of the log block + contents */ +#define LOG_BLOCK_TRL_NO 3 /* 3 lowest bytes of the log block + number */ #define LOG_BLOCK_TRL_SIZE 4 /* trailer size in bytes */ /* Offsets for a checkpoint field */ @@ -558,11 +580,22 @@ extern log_t* log_sys; #define LOG_GROUP_ID 0 /* log group number */ #define LOG_FILE_START_LSN 4 /* lsn of the start of data in this log file */ -#define LOG_FILE_NO 12 /* 4-byte archived log file number */ +#define LOG_FILE_NO 12 /* 4-byte archived log file number; + this field is only defined in an + archived log file */ +#define LOG_FILE_WAS_CREATED_BY_HOT_BACKUP 16 + /* a 32-byte field which contains + the string 'ibbackup' and the + creation time if the log file was + created by ibbackup --restore; + when mysqld is first time started + on the restored database, it can + print helpful info for the user */ #define LOG_FILE_ARCH_COMPLETED OS_FILE_LOG_BLOCK_SIZE /* this 4-byte field is TRUE when the writing of an archived log file - has been completed */ + has been completed; this field is + only defined in an archived log file */ #define LOG_FILE_END_LSN (OS_FILE_LOG_BLOCK_SIZE + 4) /* lsn where the archived log file at least extends: actually the @@ -572,7 +605,14 @@ extern log_t* log_sys; is defined only when an archived log file has been completely written */ #define LOG_CHECKPOINT_1 OS_FILE_LOG_BLOCK_SIZE + /* first checkpoint field in the log + header; we write alternately to the + checkpoint fields when we make new + checkpoints; this field is only defined + in the first log file of a log group */ #define LOG_CHECKPOINT_2 (3 * OS_FILE_LOG_BLOCK_SIZE) + /* second checkpoint field in the log + header */ #define LOG_FILE_HDR_SIZE (4 * OS_FILE_LOG_BLOCK_SIZE) #define LOG_GROUP_OK 301 @@ -678,7 +718,7 @@ struct log_struct{ write i/o has been completed for all log groups */ dulint flush_lsn; /* end lsn for the current flush */ - ulint flush_end_offset;/* the data in buffer ha been flushed + ulint flush_end_offset;/* the data in buffer has been flushed up to this offset when the current flush ends: this field will then be copied to buf_next_to_write */ diff --git a/innobase/include/log0log.ic b/innobase/include/log0log.ic index e5c313d129b..36e65239374 100644 --- a/innobase/include/log0log.ic +++ b/innobase/include/log0log.ic @@ -179,7 +179,7 @@ log_block_get_trl_no( trailer */ byte* log_block) /* in: log block */ { - return(mach_read_from_4(log_block + OS_FILE_LOG_BLOCK_SIZE + return(mach_read_from_3(log_block + OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_TRL_NO)); } @@ -192,8 +192,8 @@ log_block_set_trl_no( byte* log_block, /* in: log block */ ulint n) /* in: log block number */ { - mach_write_to_4(log_block + OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_TRL_NO, - n); + mach_write_to_3(log_block + OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_TRL_NO, + n & 0xFFFFFF); } /**************************************************************** @@ -237,6 +237,29 @@ log_block_init( log_block_set_data_len(log_block, LOG_BLOCK_HDR_SIZE); log_block_set_first_rec_group(log_block, 0); } + +/**************************************************************** +Initializes a log block in the log buffer in the old format, where there +was no checksum yet. */ +UNIV_INLINE +void +log_block_init_in_old_format( +/*=========================*/ + byte* log_block, /* in: pointer to the log buffer */ + dulint lsn) /* in: lsn within the log block */ +{ + ulint no; + + ut_ad(mutex_own(&(log_sys->mutex))); + + no = log_block_convert_lsn_to_no(lsn); + + log_block_set_hdr_no(log_block, no); + mach_write_to_4(log_block + OS_FILE_LOG_BLOCK_SIZE + - LOG_BLOCK_TRL_NO - 1, no); + log_block_set_data_len(log_block, LOG_BLOCK_HDR_SIZE); + log_block_set_first_rec_group(log_block, 0); +} /**************************************************************** Writes to the log the string given. The log must be released with diff --git a/innobase/include/os0file.h b/innobase/include/os0file.h index 01fa12955ff..d4d12e4a9d9 100644 --- a/innobase/include/os0file.h +++ b/innobase/include/os0file.h @@ -16,6 +16,7 @@ Created 10/21/1995 Heikki Tuuri os_file_write */ extern ibool os_do_not_call_flush_at_each_write; extern ibool os_has_said_disk_full; +extern ibool os_aio_print_debug; #ifdef __WIN__ @@ -33,6 +34,8 @@ extern ibool os_has_said_disk_full; typedef int os_file_t; #endif +extern ulint os_innodb_umask; + /* If this flag is TRUE, then we will use the native aio of the OS (provided we compiled Innobase with it in), otherwise we will use simulated aio we build below with threads */ @@ -309,6 +312,15 @@ Wakes up simulated aio i/o-handler threads if they have something to do. */ void os_aio_simulated_wake_handler_threads(void); /*=======================================*/ +/************************************************************************** +This function can be called if one wants to post a batch of reads and +prefers an i/o-handler thread to handle them all at once later. You must +call os_aio_simulated_wake_handler_threads later to ensure the threads +are not left sleeping! */ + +void +os_aio_simulated_put_read_threads_to_sleep(void); +/*============================================*/ #ifdef WIN_ASYNC_IO /************************************************************************** diff --git a/innobase/include/page0page.h b/innobase/include/page0page.h index 8e68381b868..2f77127466f 100644 --- a/innobase/include/page0page.h +++ b/innobase/include/page0page.h @@ -328,7 +328,7 @@ page_dir_calc_reserved_space( ulint n_recs); /* in: number of records */ /******************************************************************* Looks for the directory slot which owns the given record. */ -UNIV_INLINE + ulint page_dir_find_owner_slot( /*=====================*/ diff --git a/innobase/include/page0page.ic b/innobase/include/page0page.ic index f84fe5a5606..e7c0f8ee07c 100644 --- a/innobase/include/page0page.ic +++ b/innobase/include/page0page.ic @@ -479,6 +479,8 @@ page_rec_get_next( offs = rec_get_next_offs(rec); + ut_a(offs < UNIV_PAGE_SIZE); + if (offs == 0) { return(NULL); @@ -487,40 +489,6 @@ page_rec_get_next( return(page + offs); } -/******************************************************************* -Looks for the directory slot which owns the given record. */ -UNIV_INLINE -ulint -page_dir_find_owner_slot( -/*=====================*/ - /* out: the directory slot number */ - rec_t* rec) /* in: the physical record */ -{ - ulint i; - page_t* page; - page_dir_slot_t* slot; - - ut_ad(page_rec_check(rec)); - - while (rec_get_n_owned(rec) == 0) { - rec = page_rec_get_next(rec); - } - - page = buf_frame_align(rec); - - i = page_dir_get_n_slots(page) - 1; - slot = page_dir_get_nth_slot(page, i); - - while (page_dir_slot_get_rec(slot) != rec) { - ut_a(i > 0); - - i--; - slot = page_dir_get_nth_slot(page, i); - } - - return(i); -} - /**************************************************************** Sets the pointer to the next record on the page. */ UNIV_INLINE @@ -534,7 +502,7 @@ page_rec_set_next( page_t* page; ut_ad(page_rec_check(rec)); - ut_ad((next == NULL) + ut_a((next == NULL) || (buf_frame_align(rec) == buf_frame_align(next))); page = buf_frame_align(rec); @@ -573,7 +541,7 @@ page_rec_get_prev( slot_no = page_dir_find_owner_slot(rec); - ut_ad(slot_no != 0); + ut_a(slot_no != 0); slot = page_dir_get_nth_slot(page, slot_no - 1); @@ -584,7 +552,7 @@ page_rec_get_prev( rec2 = page_rec_get_next(rec2); } - ut_ad(prev_rec); + ut_a(prev_rec); return(prev_rec); } diff --git a/innobase/include/row0mysql.h b/innobase/include/row0mysql.h index 13b3dffd874..8152c534f48 100644 --- a/innobase/include/row0mysql.h +++ b/innobase/include/row0mysql.h @@ -230,6 +230,19 @@ row_update_cascade_for_mysql( or set null operation */ dict_table_t* table); /* in: table where we do the operation */ /************************************************************************* +Locks the data dictionary exclusively for performing a table create +operation. */ + +void +row_mysql_lock_data_dictionary(void); +/*================================*/ +/************************************************************************* +Unlocks the data dictionary exclusively lock. */ + +void +row_mysql_unlock_data_dictionary(void); +/*==================================*/ +/************************************************************************* Does a table creation operation for MySQL. If the name of the created table ends to characters INNODB_MONITOR, then this also starts printing of monitor output by the master thread. */ diff --git a/innobase/include/trx0roll.h b/innobase/include/trx0roll.h index c456768e820..820af4cd014 100644 --- a/innobase/include/trx0roll.h +++ b/innobase/include/trx0roll.h @@ -102,11 +102,13 @@ trx_rollback( calling function can start running a new query thread */ /*********************************************************************** -Rollback uncommitted transactions which have no user session. */ +Rollback or clean up transactions which have no user session. If the +transaction already was committed, then we clean up a possible insert +undo log. If the transaction was not yet committed, then we roll it back. */ void -trx_rollback_all_without_sess(void); -/*===============================*/ +trx_rollback_or_clean_all_without_sess(void); +/*========================================*/ /******************************************************************** Finishes a transaction rollback. */ diff --git a/innobase/include/trx0sys.h b/innobase/include/trx0sys.h index 60d5adb72d1..b08df7f6901 100644 --- a/innobase/include/trx0sys.h +++ b/innobase/include/trx0sys.h @@ -24,6 +24,14 @@ Created 3/26/1996 Heikki Tuuri #include "fsp0fsp.h" #include "read0types.h" +/* In a MySQL replication slave, in crash recovery we store the master log +file name and position here. We have successfully got the updates to InnoDB +up to this position. If .._pos is -1, it means no crash recovery was needed, +or there was no master log position info inside InnoDB. */ + +extern char trx_sys_mysql_master_log_name[]; +extern ib_longlong trx_sys_mysql_master_log_pos; + /* The transaction system */ extern trx_sys_t* trx_sys; @@ -229,13 +237,18 @@ trx_in_trx_list( trx_t* in_trx);/* in: trx */ /********************************************************************* Updates the offset information about the end of the MySQL binlog entry -which corresponds to the transaction just being committed. */ +which corresponds to the transaction just being committed. In a MySQL +replication slave updates the latest master binlog position up to which +replication has proceeded. */ void trx_sys_update_mysql_binlog_offset( /*===============================*/ - trx_t* trx, /* in: transaction being committed */ - mtr_t* mtr); /* in: mtr */ + char* file_name,/* in: MySQL log file name */ + ib_longlong offset, /* in: position in that log file */ + ulint field, /* in: offset of the MySQL log info field in + the trx sys header */ + mtr_t* mtr); /* in: mtr */ /********************************************************************* Prints to stderr the MySQL binlog offset info in the trx system header if the magic number shows it valid. */ @@ -243,15 +256,17 @@ the magic number shows it valid. */ void trx_sys_print_mysql_binlog_offset(void); /*===================================*/ +/********************************************************************* +Prints to stderr the MySQL master log offset info in the trx system header if +the magic number shows it valid. */ + +void +trx_sys_print_mysql_master_log_pos(void); +/*====================================*/ /* The automatically created system rollback segment has this id */ #define TRX_SYS_SYSTEM_RSEG_ID 0 -/* Max number of rollback segments: the number of segment specification slots -in the transaction system array; rollback segment id must fit in one byte, -therefore 256 */ -#define TRX_SYS_N_RSEGS 256 - /* Space id and page no where the trx system file copy resides */ #define TRX_SYS_SPACE 0 /* the SYSTEM tablespace */ #define TRX_SYS_PAGE_NO FSP_TRX_SYS_PAGE_NO @@ -277,22 +292,29 @@ therefore 256 */ segment specification slots */ /*-------------------------------------------------------------*/ -#define TRX_SYS_MYSQL_LOG_NAME_LEN 32 +/* Max number of rollback segments: the number of segment specification slots +in the transaction system array; rollback segment id must fit in one byte, +therefore 256; each slot is currently 8 bytes in size */ +#define TRX_SYS_N_RSEGS 256 + +#define TRX_SYS_MYSQL_LOG_NAME_LEN 512 #define TRX_SYS_MYSQL_LOG_MAGIC_N 873422344 +/* The offset of the MySQL replication info on the trx system header page; +this contains the same fields as TRX_SYS_MYSQL_LOG_INFO below */ +#define TRX_SYS_MYSQL_MASTER_LOG_INFO (UNIV_PAGE_SIZE - 2000) + /* The offset of the MySQL binlog offset info on the trx system header page */ -#define TRX_SYS_MYSQL_LOG_INFO (UNIV_PAGE_SIZE - 300) +#define TRX_SYS_MYSQL_LOG_INFO (UNIV_PAGE_SIZE - 1000) #define TRX_SYS_MYSQL_LOG_MAGIC_N_FLD 0 /* magic number which shows if we have valid data in the MySQL binlog info; the value is ..._MAGIC_N if yes */ -#define TRX_SYS_MYSQL_LOG_NAME 4 /* MySQL log file name */ -#define TRX_SYS_MYSQL_LOG_OFFSET_HIGH (4 + TRX_SYS_MYSQL_LOG_NAME_LEN) - /* high 4 bytes of the offset +#define TRX_SYS_MYSQL_LOG_OFFSET_HIGH 4 /* high 4 bytes of the offset within that file */ -#define TRX_SYS_MYSQL_LOG_OFFSET_LOW (8 + TRX_SYS_MYSQL_LOG_NAME_LEN) - /* low 4 bytes of the offset +#define TRX_SYS_MYSQL_LOG_OFFSET_LOW 8 /* low 4 bytes of the offset within that file */ +#define TRX_SYS_MYSQL_LOG_NAME 12 /* MySQL log file name */ /* The offset of the doublewrite buffer header on the trx system header page */ #define TRX_SYS_DOUBLEWRITE (UNIV_PAGE_SIZE - 200) diff --git a/innobase/include/trx0trx.h b/innobase/include/trx0trx.h index 261f33d3dc3..090473f3a5a 100644 --- a/innobase/include/trx0trx.h +++ b/innobase/include/trx0trx.h @@ -124,6 +124,15 @@ void trx_commit_off_kernel( /*==================*/ trx_t* trx); /* in: transaction */ +/******************************************************************** +Cleans up a transaction at database startup. The cleanup is needed if +the transaction already got to the middle of a commit when the database +crashed, andf we cannot roll it back. */ + +void +trx_cleanup_at_db_startup( +/*======================*/ + trx_t* trx); /* in: transaction */ /************************************************************************** Does the transaction commit for MySQL. */ @@ -322,13 +331,24 @@ struct trx_struct{ void* mysql_thd; /* MySQL thread handle corresponding to this trx, or NULL */ char* mysql_log_file_name; - /* If MySQL binlog is used, this field + /* if MySQL binlog is used, this field contains a pointer to the latest file name; this is NULL if binlog is not used */ - ib_longlong mysql_log_offset;/* If MySQL binlog is used, this field + ib_longlong mysql_log_offset;/* if MySQL binlog is used, this field contains the end offset of the binlog entry */ + char* mysql_master_log_file_name; + /* if the database server is a MySQL + replication slave, we have here the + master binlog name up to which + replication has processed; otherwise + this is a pointer to a null character */ + ib_longlong mysql_master_log_pos; + /* if the database server is a MySQL + replication slave, this is the + position in the log file up to which + replication has processed */ os_thread_id_t mysql_thread_id;/* id of the MySQL thread associated with this transaction object */ /*------------------------------*/ diff --git a/innobase/include/univ.i b/innobase/include/univ.i index b958475e683..e7d93a594c1 100644 --- a/innobase/include/univ.i +++ b/innobase/include/univ.i @@ -9,40 +9,26 @@ Created 1/20/1994 Heikki Tuuri #ifndef univ_i #define univ_i -#if (defined(_WIN32) || defined(_WIN64)) && !defined(MYSQL_SERVER) +#if (defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)) && !defined(MYSQL_SERVER) #define __WIN__ #include -/* When compiling for Itanium IA64, undefine the flag below to prevent use -of 32-bit assembler */ - -#ifndef WIN64 +#if !defined(WIN64) && !defined(_WIN64) #define UNIV_CAN_USE_X86_ASSEMBLER #endif -/* If you want to check for errors with compiler level -W4, -comment out the above include of windows.h and let the following defines -be defined: -#define HANDLE void* -#define CRITICAL_SECTION ulint -*/ - #ifdef _NT_ #define __NT__ #endif #else -/* The Unix version */ - -/* Most C compilers other than gcc do not know 'extern inline' */ -#if !defined(__GNUC__) && !defined(__WIN__) -#define UNIV_MUST_NOT_INLINE -#endif +/* The defines used with MySQL */ /* Include two header files from MySQL to make the Unix flavor used -in compiling more Posix-compatible. We assume that 'innobase' is a -subdirectory of 'mysql'. */ +in compiling more Posix-compatible. These headers also define __WIN__ +if we are compiling on Windows. */ + #include #include @@ -59,6 +45,20 @@ subdirectory of 'mysql'. */ #include #endif +/* When compiling for Itanium IA64, undefine the flag below to prevent use +of the 32-bit x86 assembler in mutex operations. */ + +#if defined(__WIN__) && !defined(WIN64) && !defined(_WIN64) +#define UNIV_CAN_USE_X86_ASSEMBLER +#endif + +/* We only try to do explicit inlining of functions with gcc and +Microsoft Visual C++ */ + +#if !defined(__GNUC__) && !defined(__WIN__) +#define UNIV_MUST_NOT_INLINE +#endif + #ifdef HAVE_PREAD #define HAVE_PWRITE #endif diff --git a/innobase/include/ut0ut.h b/innobase/include/ut0ut.h index 338460d7de9..408788016c1 100644 --- a/innobase/include/ut0ut.h +++ b/innobase/include/ut0ut.h @@ -114,7 +114,7 @@ ut_2_exp( ulint n); /* in: number */ /***************************************************************** Calculates fast the number rounded up to the nearest power of 2. */ -UNIV_INLINE + ulint ut_2_power_up( /*==========*/ @@ -155,6 +155,13 @@ ut_print_timestamp( /*===============*/ FILE* file); /* in: file where to print */ /************************************************************** +Sprintfs a timestamp to a buffer. */ + +void +ut_sprintf_timestamp( +/*=================*/ + char* buf); /* in: buffer where to sprintf */ +/************************************************************** Returns current year, month, day. */ void diff --git a/innobase/include/ut0ut.ic b/innobase/include/ut0ut.ic index 90f25d2b382..9d7dd283f29 100644 --- a/innobase/include/ut0ut.ic +++ b/innobase/include/ut0ut.ic @@ -172,25 +172,3 @@ ut_2_exp( { return(1 << n); } - -/***************************************************************** -Calculates fast the number rounded up to the nearest power of 2. */ -UNIV_INLINE -ulint -ut_2_power_up( -/*==========*/ - /* out: first power of 2 which is >= n */ - ulint n) /* in: number != 0 */ -{ - ulint res; - - res = 1; - - ut_ad(n > 0); - - while (res < n) { - res = res * 2; - } - - return(res); -} diff --git a/innobase/lock/lock0lock.c b/innobase/lock/lock0lock.c index 9fd6811d639..1bdbf72bda6 100644 --- a/innobase/lock/lock0lock.c +++ b/innobase/lock/lock0lock.c @@ -1541,6 +1541,15 @@ lock_rec_enqueue_waiting( trx = thr_get_trx(thr); + if (trx->dict_operation) { + ut_print_timestamp(stderr); + + fprintf(stderr, +" InnoDB: Error: a record lock wait happens in a dictionary operation!\n" +"InnoDB: Table name %s. Send a bug report to mysql@lists.mysql.com\n", +index->table_name); + } + /* Enqueue the lock request that will wait to be granted */ lock = lock_rec_create(type_mode | LOCK_WAIT, rec, index, trx); @@ -2914,7 +2923,7 @@ lock_table_enqueue_waiting( trx_t* trx; ut_ad(mutex_own(&kernel_mutex)); - + /* Test if there already is some other reason to suspend thread: we do not enqueue a lock request if the query thread should be stopped anyway */ @@ -2926,6 +2935,15 @@ lock_table_enqueue_waiting( } trx = thr_get_trx(thr); + + if (trx->dict_operation) { + ut_print_timestamp(stderr); + + fprintf(stderr, +" InnoDB: Error: a table lock wait happens in a dictionary operation!\n" +"InnoDB: Table name %s. Send a bug report to mysql@lists.mysql.com\n", +table->name); + } /* Enqueue the lock request that will wait to be granted */ diff --git a/innobase/log/log0log.c b/innobase/log/log0log.c index 2ba035d1eb2..d6e9deaa151 100644 --- a/innobase/log/log0log.c +++ b/innobase/log/log0log.c @@ -162,6 +162,8 @@ log_reserve_and_open( ulint archived_lsn_age; ulint count = 0; ulint dummy; + + ut_a(len < log->buf_size / 2); loop: mutex_enter(&(log->mutex)); @@ -663,6 +665,8 @@ log_init(void) log_sys->buf_next_to_write = 0; + log_sys->flush_lsn = ut_dulint_zero; + log_sys->written_to_some_lsn = log_sys->lsn; log_sys->written_to_all_lsn = log_sys->lsn; @@ -777,9 +781,15 @@ log_group_init( *(group->file_header_bufs + i) = ut_align( mem_alloc(LOG_FILE_HDR_SIZE + OS_FILE_LOG_BLOCK_SIZE), OS_FILE_LOG_BLOCK_SIZE); + + memset(*(group->file_header_bufs + i), '\0', + LOG_FILE_HDR_SIZE); + *(group->archive_file_header_bufs + i) = ut_align( mem_alloc(LOG_FILE_HDR_SIZE + OS_FILE_LOG_BLOCK_SIZE), OS_FILE_LOG_BLOCK_SIZE); + memset(*(group->archive_file_header_bufs + i), '\0', + LOG_FILE_HDR_SIZE); } group->archive_space_id = archive_space_id; @@ -791,6 +801,8 @@ log_group_init( mem_alloc(2 * OS_FILE_LOG_BLOCK_SIZE), OS_FILE_LOG_BLOCK_SIZE); + memset(group->checkpoint_buf, '\0', OS_FILE_LOG_BLOCK_SIZE); + UT_LIST_ADD_LAST(log_groups, log_sys->log_groups, group); ut_a(log_calc_max_ages()); @@ -839,7 +851,7 @@ log_group_check_flush_completion( { ut_ad(mutex_own(&(log_sys->mutex))); - if (!log_sys->one_flushed && (group->n_pending_writes == 0)) { + if (!log_sys->one_flushed && group->n_pending_writes == 0) { if (log_debug_writes) { printf("Log flushed first to group %lu\n", group->id); @@ -933,16 +945,20 @@ log_io_complete( return; } + ut_a(0); /* We currently use synchronous writing of the + logs and cannot end up here! */ + if (srv_unix_file_flush_method != SRV_UNIX_O_DSYNC - && srv_unix_file_flush_method != SRV_UNIX_NOSYNC) { + && srv_unix_file_flush_method != SRV_UNIX_NOSYNC + && srv_flush_log_at_trx_commit != 2) { fil_flush(group->space_id); } mutex_enter(&(log_sys->mutex)); - ut_ad(group->n_pending_writes > 0); - ut_ad(log_sys->n_pending_writes > 0); + ut_a(group->n_pending_writes > 0); + ut_a(log_sys->n_pending_writes > 0); group->n_pending_writes--; log_sys->n_pending_writes--; @@ -955,6 +971,57 @@ log_io_complete( mutex_exit(&(log_sys->mutex)); } +/********************************************************** +Flushes the log files to the disk, using, for example, the Unix fsync. +This function does the flush even if the user has set +srv_flush_log_at_trx_commit = FALSE. */ + +void +log_flush_to_disk(void) +/*===================*/ +{ + log_group_t* group; +loop: + mutex_enter(&(log_sys->mutex)); + + if (log_sys->n_pending_writes > 0) { + /* A log file write is running */ + + mutex_exit(&(log_sys->mutex)); + + /* Wait for the log file write to complete and try again */ + + os_event_wait(log_sys->no_flush_event); + + goto loop; + } + + group = UT_LIST_GET_FIRST(log_sys->log_groups); + + log_sys->n_pending_writes++; + group->n_pending_writes++; + + os_event_reset(log_sys->no_flush_event); + os_event_reset(log_sys->one_flushed_event); + + mutex_exit(&(log_sys->mutex)); + + fil_flush(group->space_id); + + mutex_enter(&(log_sys->mutex)); + + ut_a(group->n_pending_writes == 1); + ut_a(log_sys->n_pending_writes == 1); + + group->n_pending_writes--; + log_sys->n_pending_writes--; + + os_event_set(log_sys->no_flush_event); + os_event_set(log_sys->one_flushed_event); + + mutex_exit(&(log_sys->mutex)); +} + /********************************************************** Writes a log file header to a log file space. */ static @@ -970,7 +1037,6 @@ log_group_file_header_flush( { byte* buf; ulint dest_offset; - ibool sync; ut_ad(mutex_own(&(log_sys->mutex))); @@ -981,15 +1047,11 @@ log_group_file_header_flush( mach_write_to_4(buf + LOG_GROUP_ID, group->id); mach_write_to_8(buf + LOG_FILE_START_LSN, start_lsn); - dest_offset = nth_file * group->file_size; + /* Wipe over possible label of ibbackup --restore */ + memcpy(buf + LOG_FILE_WAS_CREATED_BY_HOT_BACKUP, " ", 4); - sync = FALSE; - - if (type == LOG_RECOVER) { + dest_offset = nth_file * group->file_size; - sync = TRUE; - } - if (log_debug_writes) { printf( "Writing log file header to group %lu file %lu\n", group->id, @@ -997,14 +1059,9 @@ log_group_file_header_flush( } if (log_do_write) { - if (type == LOG_FLUSH) { - log_sys->n_pending_writes++; - group->n_pending_writes++; - } - log_sys->n_log_ios++; - fil_io(OS_FILE_WRITE | OS_FILE_LOG, sync, group->space_id, + fil_io(OS_FILE_WRITE | OS_FILE_LOG, TRUE, group->space_id, dest_offset / UNIV_PAGE_SIZE, dest_offset % UNIV_PAGE_SIZE, OS_FILE_LOG_BLOCK_SIZE, @@ -1012,6 +1069,31 @@ log_group_file_header_flush( } } +/********************************************************** +Stores a 1-byte checksum to the trailer checksum field of a log block +before writing it to a log file. This checksum is used in recovery to +check the consistency of a log block. The checksum is simply the 8 low +bits of 1 + the sum of the bytes in the log block except the trailer bytes. */ +static +void +log_block_store_checksum( +/*=====================*/ + byte* block) /* in/out: pointer to a log block */ +{ + ulint i; + ulint sum; + + sum = 1; + + for (i = 0; i < OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_TRL_SIZE; i++) { + sum += (ulint)(*(block + i)); + } + + mach_write_to_1(block + OS_FILE_LOG_BLOCK_SIZE + - LOG_BLOCK_TRL_CHECKSUM, + 0xFF & sum); +} + /********************************************************** Writes a buffer to a log file group. */ @@ -1032,20 +1114,13 @@ log_group_write_buf( header */ { ulint write_len; - ibool sync; ibool write_header; ulint next_offset; + ulint i; ut_ad(mutex_own(&(log_sys->mutex))); - ut_ad(len % OS_FILE_LOG_BLOCK_SIZE == 0); - ut_ad(ut_dulint_get_low(start_lsn) % OS_FILE_LOG_BLOCK_SIZE == 0); - - sync = FALSE; - - if (type == LOG_RECOVER) { - - sync = TRUE; - } + ut_a(len % OS_FILE_LOG_BLOCK_SIZE == 0); + ut_a(ut_dulint_get_low(start_lsn) % OS_FILE_LOG_BLOCK_SIZE == 0); if (new_data_offset == 0) { write_header = TRUE; @@ -1076,7 +1151,6 @@ loop: } if (log_debug_writes) { - ulint i; printf( "Writing log file segment to group %lu offset %lu len %lu\n" @@ -1100,15 +1174,17 @@ loop: } } - if (log_do_write) { - if (type == LOG_FLUSH) { - log_sys->n_pending_writes++; - group->n_pending_writes++; - } + /* Calculate the checksums for each log block and write them to + the trailer fields of the log blocks */ + + for (i = 0; i < write_len / OS_FILE_LOG_BLOCK_SIZE; i++) { + log_block_store_checksum(buf + i * OS_FILE_LOG_BLOCK_SIZE); + } + if (log_do_write) { log_sys->n_log_ios++; - fil_io(OS_FILE_WRITE | OS_FILE_LOG, sync, group->space_id, + fil_io(OS_FILE_WRITE | OS_FILE_LOG, TRUE, group->space_id, next_offset / UNIV_PAGE_SIZE, next_offset % UNIV_PAGE_SIZE, write_len, buf, group); } @@ -1126,15 +1202,15 @@ loop: /********************************************************** This function is called, e.g., when a transaction wants to commit. It checks -that the log has been flushed to disk up to the last log entry written by the -transaction. If there is a flush running, it waits and checks if the flush -flushed enough. If not, starts a new flush. */ +that the log has been written to the log file up to the last log entry written +by the transaction. If there is a flush running, it waits and checks if the +flush flushed enough. If not, starts a new flush. */ void log_flush_up_to( /*============*/ dulint lsn, /* in: log sequence number up to which the log should - be flushed, ut_dulint_max if not specified */ + be written, ut_dulint_max if not specified */ ulint wait) /* in: LOG_NO_WAIT, LOG_WAIT_ONE_GROUP, or LOG_WAIT_ALL_GROUPS */ { @@ -1144,6 +1220,7 @@ log_flush_up_to( ulint area_start; ulint area_end; ulint loop_count; + ulint unlock; if (recv_no_ibuf_operations) { /* Recovery is running and no operations on the log files are @@ -1209,6 +1286,12 @@ loop: ut_dulint_get_low(log_sys->lsn)); } + log_sys->n_pending_writes++; + + group = UT_LIST_GET_FIRST(log_sys->log_groups); + group->n_pending_writes++; /* We assume here that we have only + one log group! */ + os_event_reset(log_sys->no_flush_event); os_event_reset(log_sys->one_flushed_event); @@ -1254,6 +1337,36 @@ loop: group = UT_LIST_GET_NEXT(log_groups, group); } + mutex_exit(&(log_sys->mutex)); + + if (srv_unix_file_flush_method != SRV_UNIX_O_DSYNC + && srv_unix_file_flush_method != SRV_UNIX_NOSYNC + && srv_flush_log_at_trx_commit != 2) { + + group = UT_LIST_GET_FIRST(log_sys->log_groups); + + fil_flush(group->space_id); + } + + mutex_enter(&(log_sys->mutex)); + + group = UT_LIST_GET_FIRST(log_sys->log_groups); + + ut_a(group->n_pending_writes == 1); + ut_a(log_sys->n_pending_writes == 1); + + group->n_pending_writes--; + log_sys->n_pending_writes--; + + unlock = log_group_check_flush_completion(group); + unlock = unlock | log_sys_check_flush_completion(); + + log_flush_do_unlocks(unlock); + + mutex_exit(&(log_sys->mutex)); + + return; + do_waits: mutex_exit(&(log_sys->mutex)); @@ -1539,15 +1652,23 @@ log_reset_first_header_and_checkpoint( /*==================================*/ byte* hdr_buf,/* in: buffer which will be written to the start of the first log file */ - dulint lsn) /* in: lsn of the start of the first log file - + LOG_BLOCK_HDR_SIZE */ + dulint start) /* in: lsn of the start of the first log file; + we pretend that there is a checkpoint at + start + LOG_BLOCK_HDR_SIZE */ { ulint fold; byte* buf; - + dulint lsn; + mach_write_to_4(hdr_buf + LOG_GROUP_ID, 0); - mach_write_to_8(hdr_buf + LOG_FILE_START_LSN, lsn); + mach_write_to_8(hdr_buf + LOG_FILE_START_LSN, start); + + lsn = ut_dulint_add(start, LOG_BLOCK_HDR_SIZE); + /* Write the label of ibbackup --restore */ + sprintf(hdr_buf + LOG_FILE_WAS_CREATED_BY_HOT_BACKUP, "ibbackup "); + ut_sprintf_timestamp(hdr_buf + LOG_FILE_WAS_CREATED_BY_HOT_BACKUP + + strlen("ibbackup ")); buf = hdr_buf + LOG_CHECKPOINT_1; mach_write_to_8(buf + LOG_CHECKPOINT_NO, ut_dulint_zero); diff --git a/innobase/log/log0recv.c b/innobase/log/log0recv.c index c31719f7bb0..53f75c176ea 100644 --- a/innobase/log/log0recv.c +++ b/innobase/log/log0recv.c @@ -568,6 +568,55 @@ recv_read_cp_info_for_backup( return(TRUE); } +/********************************************************** +Checks the 1-byte checksum to the trailer checksum field of a log block. +We also accept a log block in the old format where the checksum field +contained the highest byte of the log block number. */ +static +ibool +log_block_checksum_is_ok_or_old_format( +/*===================================*/ + /* out: TRUE if ok, or if the log block may be in the + format of InnoDB version < 3.23.52 */ + byte* block) /* in: pointer to a log block */ +{ + ulint i; + ulint sum; + + sum = 1; + + for (i = 0; i < OS_FILE_LOG_BLOCK_SIZE - LOG_BLOCK_TRL_SIZE; i++) { + sum += (ulint)(*(block + i)); + } + +/* printf("Checksum %lu, byte %lu\n", 0xFF & sum, + mach_read_from_1(block + OS_FILE_LOG_BLOCK_SIZE + - LOG_BLOCK_TRL_CHECKSUM)); +*/ + if (mach_read_from_1(block + OS_FILE_LOG_BLOCK_SIZE + - LOG_BLOCK_TRL_CHECKSUM) + == (0xFF & sum)) { + + return(TRUE); + } + + if (((0xFF000000 & log_block_get_hdr_no(block)) >> 24) + == mach_read_from_1(block + OS_FILE_LOG_BLOCK_SIZE + - LOG_BLOCK_TRL_CHECKSUM)) { + + /* We assume the log block is in the format of + InnoDB version < 3.23.52 and the block is ok */ +/* + fprintf(stderr, +"InnoDB: Scanned old format < InnoDB-3.23.52 log block number %lu\n", + log_block_get_hdr_no(block)); +*/ + return(TRUE); + } + + return(FALSE); +} + /*********************************************************************** Scans the log segment and n_bytes_scanned is set to the length of valid log scanned. */ @@ -598,12 +647,13 @@ recv_scan_log_seg_for_backup( no = log_block_get_hdr_no(log_block); - /* fprintf(stderr, "Log block header no %lu\n", no); */ +/* fprintf(stderr, "Log block header no %lu\n", no); */ - if (no != log_block_get_trl_no(log_block) - || no != log_block_convert_lsn_to_no(*scanned_lsn)) { - -/* printf( + if ((no & 0xFFFFFF) != log_block_get_trl_no(log_block) + || no != log_block_convert_lsn_to_no(*scanned_lsn) + || !log_block_checksum_is_ok_or_old_format(log_block)) { +/* + printf( "Log block n:o %lu, trailer n:o %lu, scanned lsn n:o %lu\n", no, log_block_get_trl_no(log_block), log_block_convert_lsn_to_no(*scanned_lsn)); @@ -611,8 +661,8 @@ recv_scan_log_seg_for_backup( /* Garbage or an incompletely written log block */ log_block += OS_FILE_LOG_BLOCK_SIZE; - -/* printf( +/* + printf( "Next log block n:o %lu, trailer n:o %lu\n", log_block_get_hdr_no(log_block), log_block_get_trl_no(log_block)); @@ -629,11 +679,11 @@ recv_scan_log_seg_for_backup( /* Garbage from a log buffer flush which was made before the most recent database recovery */ - +/* printf("Scanned cp n:o %lu, block cp n:o %lu\n", *scanned_checkpoint_no, log_block_get_checkpoint_no(log_block)); - +*/ break; } @@ -1011,7 +1061,7 @@ recv_recover_page( page_lsn = page_newest_lsn; } } else { - /* In recovery from a backup we do not use the buffer + /* In recovery from a backup we do not really use the buffer pool */ page_newest_lsn = ut_dulint_zero; @@ -1361,6 +1411,14 @@ recv_apply_log_recs_for_backup( nth_page_in_file >> (32 - UNIV_PAGE_SIZE_SHIFT), UNIV_PAGE_SIZE); + /* We simulate a page read made by the buffer pool, + to make sure recovery works ok. We must init the + block corresponding to buf_pool->frame_zero + (== page) */ + + buf_page_init_for_backup_restore(0, i, + buf_block_align(page)); + recv_recover_page(TRUE, FALSE, page, 0, i); buf_flush_init_for_writing(page, @@ -2037,8 +2095,33 @@ recv_scan_log_recs( /* fprintf(stderr, "Log block header no %lu\n", no); */ - if (no != log_block_get_trl_no(log_block) - || no != log_block_convert_lsn_to_no(scanned_lsn)) { + if ((no & 0xFFFFFF) != log_block_get_trl_no(log_block) + || no != log_block_convert_lsn_to_no(scanned_lsn) + || !log_block_checksum_is_ok_or_old_format(log_block)) { + + if ((no & 0xFFFFFF) == log_block_get_trl_no(log_block) + && no == log_block_convert_lsn_to_no(scanned_lsn) + && !log_block_checksum_is_ok_or_old_format( + log_block)) { + fprintf(stderr, +"InnoDB: Log block no %lu at lsn %lu %lu has\n" +"InnoDB: ok header and trailer, but checksum field contains %lu\n", + no, ut_dulint_get_high(scanned_lsn), + ut_dulint_get_low(scanned_lsn), + mach_read_from_1(log_block + + OS_FILE_LOG_BLOCK_SIZE + - LOG_BLOCK_TRL_CHECKSUM)); + } + + if ((no & 0xFFFFFF) + != log_block_get_trl_no(log_block)) { + fprintf(stderr, +"InnoDB: Log block with header no %lu at lsn %lu %lu has\n" +"InnoDB: trailer no %lu\n", + no, ut_dulint_get_high(scanned_lsn), + ut_dulint_get_low(scanned_lsn), + log_block_get_trl_no(log_block)); + } /* Garbage or an incompletely written log block */ @@ -2241,6 +2324,7 @@ recv_recovery_from_checkpoint_start( dulint archived_lsn; ulint capacity; byte* buf; + byte log_hdr_buf[LOG_FILE_HDR_SIZE]; ulint err; ut_ad((type != LOG_CHECKPOINT) @@ -2288,6 +2372,33 @@ recv_recovery_from_checkpoint_start( checkpoint_no = mach_read_from_8(buf + LOG_CHECKPOINT_NO); archived_lsn = mach_read_from_8(buf + LOG_CHECKPOINT_ARCHIVED_LSN); + /* Read the first log file header to print a note if this is + a recovery from a restored InnoDB Hot Backup */ + + fil_io(OS_FILE_READ | OS_FILE_LOG, TRUE, max_cp_group->space_id, + 0, 0, LOG_FILE_HDR_SIZE, + log_hdr_buf, max_cp_group); + + if (0 == ut_memcmp(log_hdr_buf + LOG_FILE_WAS_CREATED_BY_HOT_BACKUP, + "ibbackup", ut_strlen("ibbackup"))) { + /* This log file was created by ibbackup --restore: print + a note to the user about it */ + + fprintf(stderr, + "InnoDB: The log file was created by ibbackup --restore at\n" + "InnoDB: %s\n", log_hdr_buf + LOG_FILE_WAS_CREATED_BY_HOT_BACKUP); + + /* Wipe over the label now */ + + ut_memcpy(log_hdr_buf + LOG_FILE_WAS_CREATED_BY_HOT_BACKUP, + " ", 4); + /* Write to the log file to wipe over the label */ + fil_io(OS_FILE_WRITE | OS_FILE_LOG, TRUE, + max_cp_group->space_id, + 0, 0, OS_FILE_LOG_BLOCK_SIZE, + log_hdr_buf, max_cp_group); + } + group = UT_LIST_GET_FIRST(log_sys->log_groups); while (group) { @@ -2471,7 +2582,7 @@ recv_recovery_from_checkpoint_finish(void) /* Rollback the uncommitted transactions which have no user session */ if (srv_force_recovery < SRV_FORCE_NO_TRX_UNDO) { - trx_rollback_all_without_sess(); + trx_rollback_or_clean_all_without_sess(); } /* Apply the hashed log records to the respective file pages */ @@ -2487,6 +2598,7 @@ recv_recovery_from_checkpoint_finish(void) } if (recv_needed_recovery) { + trx_sys_print_mysql_master_log_pos(); trx_sys_print_mysql_binlog_offset(); } @@ -2614,10 +2726,9 @@ recv_reset_log_files_for_backup( /* We pretend there is a checkpoint at lsn + LOG_BLOCK_HDR_SIZE */ - log_reset_first_header_and_checkpoint(buf, - ut_dulint_add(lsn, LOG_BLOCK_HDR_SIZE)); + log_reset_first_header_and_checkpoint(buf, lsn); - log_block_init(buf + LOG_FILE_HDR_SIZE, lsn); + log_block_init_in_old_format(buf + LOG_FILE_HDR_SIZE, lsn); log_block_set_first_rec_group(buf + LOG_FILE_HDR_SIZE, LOG_BLOCK_HDR_SIZE); sprintf(name, "%sib_logfile%lu", log_dir, 0); @@ -2754,7 +2865,7 @@ ask_again: if (ut_dulint_cmp(recv_sys->parse_start_lsn, start_lsn) < 0) { fprintf(stderr, "InnoDB: Archive log file %s starts from too big a lsn\n", - name); + name); return(TRUE); } @@ -2765,7 +2876,7 @@ ask_again: fprintf(stderr, "InnoDB: Archive log file %s starts from a wrong lsn\n", - name); + name); return(TRUE); } diff --git a/innobase/mtr/mtr0log.c b/innobase/mtr/mtr0log.c index 26f5a5d1cb7..b582afc5710 100644 --- a/innobase/mtr/mtr0log.c +++ b/innobase/mtr/mtr0log.c @@ -290,7 +290,7 @@ mlog_write_string( ut_a(0); } ut_ad(ptr && mtr); - ut_ad(len < UNIV_PAGE_SIZE); + ut_a(len < UNIV_PAGE_SIZE); ut_memcpy(ptr, str, len); @@ -338,9 +338,13 @@ mlog_parse_string( offset = mach_read_from_2(ptr); ptr += 2; + ut_a(offset < UNIV_PAGE_SIZE); + len = mach_read_from_2(ptr); ptr += 2; + ut_a(len + offset < UNIV_PAGE_SIZE); + if (end_ptr < ptr + len) { return(NULL); diff --git a/innobase/mtr/mtr0mtr.c b/innobase/mtr/mtr0mtr.c index f38aa6793b9..565489613ae 100644 --- a/innobase/mtr/mtr0mtr.c +++ b/innobase/mtr/mtr0mtr.c @@ -315,7 +315,7 @@ mtr_log_reserve_and_write( } data_size = dyn_array_get_data_size(mlog); - + /* Open the database log for log_write_low */ mtr->start_lsn = log_reserve_and_open(data_size); diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c index dd51227bbf6..5806cb8f1f3 100644 --- a/innobase/os/os0file.c +++ b/innobase/os/os0file.c @@ -22,6 +22,16 @@ Created 10/21/1995 Heikki Tuuri #endif +/* This specifies the file permissions InnoDB uses when it craetes files in +Unix; the value of os_innodb_umask is initialized in ha_innodb.cc to +my_umask */ + +#ifndef __WIN__ +ulint os_innodb_umask = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP; +#else +ulint os_innodb_umask = 0; +#endif + /* If the following is set to TRUE, we do not call os_file_flush in every os_file_write. We can set this TRUE if the doublewrite buffer is used. */ ibool os_do_not_call_flush_at_each_write = FALSE; @@ -32,7 +42,7 @@ OS does not provide an atomic pread or pwrite, or similar */ os_mutex_t os_file_seek_mutexes[OS_FILE_N_SEEK_MUTEXES]; /* In simulated aio, merge at most this many consecutive i/os */ -#define OS_AIO_MERGE_N_CONSECUTIVE 32 +#define OS_AIO_MERGE_N_CONSECUTIVE 64 /* If this flag is TRUE, then we will use the native aio of the OS (provided we compiled Innobase with it in), otherwise we will @@ -40,6 +50,8 @@ use simulated aio we build below with threads */ ibool os_aio_use_native_aio = FALSE; +ibool os_aio_print_debug = FALSE; + /* The aio array slot structure */ typedef struct os_aio_slot_struct os_aio_slot_t; @@ -115,7 +127,12 @@ os_aio_array_t* os_aio_sync_array = NULL; ulint os_aio_n_segments = ULINT_UNDEFINED; +/* If the following is TRUE, read i/o handler threads try to +wait until a batch of new read requests have been posted */ +ibool os_aio_recommend_sleep_for_read_threads = FALSE; + ulint os_n_file_reads = 0; +ulint os_bytes_read_since_printout = 0; ulint os_n_file_writes = 0; ulint os_n_fsyncs = 0; ulint os_n_file_reads_old = 0; @@ -412,8 +429,8 @@ try_again: } if (create_mode == OS_FILE_CREATE) { - file = open(name, create_flag, S_IRUSR | S_IWUSR | S_IRGRP - | S_IWGRP | S_IROTH | S_IWOTH); + file = open(name, create_flag, S_IRUSR | S_IWUSR + | S_IRGRP | S_IWGRP); } else { file = open(name, create_flag); } @@ -548,8 +565,7 @@ try_again: } #endif if (create_mode == OS_FILE_CREATE) { - file = open(name, create_flag, S_IRUSR | S_IWUSR | S_IRGRP - | S_IWGRP | S_IROTH | S_IWOTH); + file = open(name, create_flag, os_innodb_umask); } else { file = open(name, create_flag); } @@ -735,6 +751,8 @@ os_file_flush( ut_a(file); + os_n_fsyncs++; + ret = FlushFileBuffers(file); if (ret) { @@ -957,6 +975,7 @@ os_file_read( ut_a((offset & 0xFFFFFFFF) == offset); os_n_file_reads++; + os_bytes_read_since_printout += n; try_again: ut_ad(file); @@ -1626,13 +1645,40 @@ os_aio_simulated_wake_handler_threads(void) /* We do not use simulated aio: do nothing */ return; - } + } + + os_aio_recommend_sleep_for_read_threads = FALSE; for (i = 0; i < os_aio_n_segments; i++) { os_aio_simulated_wake_handler_thread(i); } } +/************************************************************************** +This function can be called if one wants to post a batch of reads and +prefers an i/o-handler thread to handle them all at once later. You must +call os_aio_simulated_wake_handler_threads later to ensure the threads +are not left sleeping! */ + +void +os_aio_simulated_put_read_threads_to_sleep(void) +/*============================================*/ +{ + os_aio_array_t* array; + ulint g; + + os_aio_recommend_sleep_for_read_threads = TRUE; + + for (g = 0; g < os_aio_n_segments; g++) { + os_aio_get_array_and_local_segment(&array, g); + + if (array == os_aio_read_array) { + + os_event_reset(os_aio_segment_wait_events[g]); + } + } +} + /*********************************************************************** Requests an asynchronous i/o operation. */ @@ -2042,15 +2088,10 @@ os_aio_simulated_handle( ibool ret; ulint n; ulint i; - + segment = os_aio_get_array_and_local_segment(&array, global_segment); restart: - /* Give other threads chance to add several i/os to the array - at once */ - - os_thread_yield(); - /* NOTE! We only access constant fields in os_aio_array. Therefore we do not have to acquire the protecting mutex yet */ @@ -2061,6 +2102,15 @@ restart: /* Look through n slots after the segment * n'th slot */ + if (array == os_aio_read_array + && os_aio_recommend_sleep_for_read_threads) { + + /* Give other threads chance to add several i/os to the array + at once. */ + + goto recommended_sleep; + } + os_mutex_enter(array->mutex); /* Check if there is a slot for which the i/o has already been @@ -2071,6 +2121,11 @@ restart: if (slot->reserved && slot->io_already_done) { + if (os_aio_print_debug) { + fprintf(stderr, +"InnoDB: i/o for slot %lu already done, returning\n", i); + } + ret = TRUE; goto slot_io_done; @@ -2177,6 +2232,13 @@ consecutive_loop: srv_io_thread_op_info[global_segment] = (char*) "doing file i/o"; + if (os_aio_print_debug) { + fprintf(stderr, +"InnoDB: doing i/o of type %lu at offset %lu %lu, length %lu\n", + slot->type, slot->offset_high, slot->offset, + total_len); + } + /* Do the i/o with ordinary, synchronous i/o functions: */ if (slot->type == OS_FILE_WRITE) { ret = os_file_write(slot->name, slot->file, combined_buf, @@ -2244,10 +2306,18 @@ wait_for_io: os_mutex_exit(array->mutex); - srv_io_thread_op_info[global_segment] = (char*) "waiting for i/o request"; +recommended_sleep: + srv_io_thread_op_info[global_segment] = + (char*)"waiting for i/o request"; os_event_wait(os_aio_segment_wait_events[global_segment]); + if (os_aio_print_debug) { + fprintf(stderr, +"InnoDB: i/o handler thread for i/o segment %lu wakes up\n", + global_segment); + } + goto restart; } @@ -2316,6 +2386,7 @@ os_aio_print(void) ulint n_reserved; time_t current_time; double time_elapsed; + double avg_bytes_read; ulint i; for (i = 0; i < srv_n_file_io_threads; i++) { @@ -2392,9 +2463,19 @@ loop: fil_n_pending_log_flushes, fil_n_pending_tablespace_flushes); printf("%lu OS file reads, %lu OS file writes, %lu OS fsyncs\n", os_n_file_reads, os_n_file_writes, os_n_fsyncs); - printf("%.2f reads/s, %.2f writes/s, %.2f fsyncs/s\n", + + if (os_n_file_reads == os_n_file_reads_old) { + avg_bytes_read = 0.0; + } else { + avg_bytes_read = os_bytes_read_since_printout / + (os_n_file_reads - os_n_file_reads_old); + } + + printf( +"%.2f reads/s, %lu avg bytes/read, %.2f writes/s, %.2f fsyncs/s\n", (os_n_file_reads - os_n_file_reads_old) / time_elapsed, + (ulint)avg_bytes_read, (os_n_file_writes - os_n_file_writes_old) / time_elapsed, (os_n_fsyncs - os_n_fsyncs_old) @@ -2403,6 +2484,7 @@ loop: os_n_file_reads_old = os_n_file_reads; os_n_file_writes_old = os_n_file_writes; os_n_fsyncs_old = os_n_fsyncs; + os_bytes_read_since_printout = 0; os_last_printout = current_time; } diff --git a/innobase/page/page0cur.c b/innobase/page/page0cur.c index 0b233b4dd72..dfe28fd40c4 100644 --- a/innobase/page/page0cur.c +++ b/innobase/page/page0cur.c @@ -403,6 +403,8 @@ page_cur_insert_rec_write_log( byte* log_ptr; ulint i; + ut_a(rec_size < UNIV_PAGE_SIZE); + log_ptr = mlog_open(mtr, 30 + MLOG_BUF_MARGIN); if (log_ptr == NULL) { @@ -491,6 +493,8 @@ page_cur_insert_rec_write_log( mlog_close(mtr, log_ptr); + ut_a(rec_size - i < UNIV_PAGE_SIZE); + if (rec_size - i >= MLOG_BUF_MARGIN) { mlog_catenate_string(mtr, ins_ptr, rec_size - i); } @@ -602,6 +606,9 @@ page_cur_parse_insert_rec( /* Build the inserted record to buf */ + ut_a(mismatch_index < UNIV_PAGE_SIZE); + ut_a(end_seg_len < UNIV_PAGE_SIZE); + ut_memcpy(buf, rec_get_start(cursor_rec), mismatch_index); ut_memcpy(buf + mismatch_index, ptr, end_seg_len); @@ -937,6 +944,8 @@ page_copy_rec_list_end_to_created_page( log_data_len = dyn_array_get_data_size(&(mtr->log)) - log_data_len; + ut_a(log_data_len < 100 * UNIV_PAGE_SIZE); + mach_write_to_4(log_ptr, log_data_len); rec_set_next_offs(insert_rec, PAGE_SUPREMUM); diff --git a/innobase/page/page0page.c b/innobase/page/page0page.c index a75a7279fb5..f3f6776bf13 100644 --- a/innobase/page/page0page.c +++ b/innobase/page/page0page.c @@ -17,6 +17,7 @@ Created 2/2/1994 Heikki Tuuri #include "lock0lock.h" #include "fut0lst.h" #include "btr0sea.h" +#include "buf0buf.h" /* A cached template page used in page_create */ page_t* page_template = NULL; @@ -63,6 +64,65 @@ Assuming a page size of 8 kB, a typical index page of a secondary index contains 300 index entries, and the size of the page directory is 50 x 4 bytes = 200 bytes. */ +/******************************************************************* +Looks for the directory slot which owns the given record. */ + +ulint +page_dir_find_owner_slot( +/*=====================*/ + /* out: the directory slot number */ + rec_t* rec) /* in: the physical record */ +{ + ulint i; + ulint steps = 0; + page_t* page; + page_dir_slot_t* slot; + rec_t* original_rec = rec; + char err_buf[1000]; + + ut_ad(page_rec_check(rec)); + + while (rec_get_n_owned(rec) == 0) { + steps++; + rec = page_rec_get_next(rec); + } + + page = buf_frame_align(rec); + + i = page_dir_get_n_slots(page) - 1; + slot = page_dir_get_nth_slot(page, i); + + while (page_dir_slot_get_rec(slot) != rec) { + + if (i == 0) { + fprintf(stderr, + "InnoDB: Probable data corruption on page %lu\n", + buf_frame_get_page_no(page)); + + rec_sprintf(err_buf, 900, original_rec); + + fprintf(stderr, + "InnoDB: Original record %s\n" + "InnoDB: on that page. Steps %lu.\n", err_buf, steps); + + rec_sprintf(err_buf, 900, rec); + + fprintf(stderr, + "InnoDB: Cannot find the dir slot for record %s\n" + "InnoDB: on that page!\n", err_buf); + + buf_page_print(page); + + ut_a(0); + } + + i--; + slot = page_dir_get_nth_slot(page, i); + } + + return(i); +} + /****************************************************************** Used to check the consistency of a directory slot. */ static diff --git a/innobase/rem/rem0cmp.c b/innobase/rem/rem0cmp.c index e4779b5f26b..31c76705c4b 100644 --- a/innobase/rem/rem0cmp.c +++ b/innobase/rem/rem0cmp.c @@ -104,7 +104,9 @@ cmp_types_are_equal( if ((type1->mtype == DATA_VARCHAR && type2->mtype == DATA_CHAR) || (type1->mtype == DATA_CHAR && type2->mtype == DATA_VARCHAR) || (type1->mtype == DATA_FIXBINARY && type2->mtype == DATA_BINARY) - || (type1->mtype == DATA_BINARY && type2->mtype == DATA_FIXBINARY)) { + || (type1->mtype == DATA_BINARY && type2->mtype == DATA_FIXBINARY) + || (type1->mtype == DATA_MYSQL && type2->mtype == DATA_VARMYSQL) + || (type1->mtype == DATA_VARMYSQL && type2->mtype == DATA_MYSQL)) { return(TRUE); } @@ -124,14 +126,9 @@ cmp_types_are_equal( return(FALSE); } - if (type1->mtype == DATA_MYSQL - || type1->mtype == DATA_VARMYSQL) { + if (type1->mtype == DATA_INT && type1->len != type2->len) { - if ((type1->prtype & ~DATA_NOT_NULL) - != (type2->prtype & ~DATA_NOT_NULL)) { - - return(FALSE); - } + return(FALSE); } return(TRUE); diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c index b28be55347c..bbec004176b 100644 --- a/innobase/row/row0ins.c +++ b/innobase/row/row0ins.c @@ -609,7 +609,7 @@ the caller must have a shared latch on dict_foreign_key_check_lock. */ ulint row_ins_check_foreign_constraint( /*=============================*/ - /* out: DB_SUCCESS, DB_LOCK_WAIT, + /* out: DB_SUCCESS, DB_NO_REFERENCED_ROW, or DB_ROW_IS_REFERENCED */ ibool check_ref,/* in: TRUE if we want to check that @@ -635,6 +635,7 @@ row_ins_check_foreign_constraint( ulint i; mtr_t mtr; +run_again: ut_ad(rw_lock_own(&dict_foreign_key_check_lock, RW_LOCK_SHARED)); if (thr_get_trx(thr)->check_foreigns == FALSE) { @@ -682,7 +683,7 @@ row_ins_check_foreign_constraint( if (err != DB_SUCCESS) { - return(err); + goto do_possible_lock_wait; } } @@ -727,6 +728,11 @@ row_ins_check_foreign_constraint( if (!rec_get_deleted_flag(rec)) { /* Found a matching record */ +/* printf( +"FOREIGN: Found matching record from %s %s\n", + check_index->table_name, check_index->name); + rec_print(rec); +*/ if (check_ref) { err = DB_SUCCESS; @@ -779,6 +785,17 @@ next_rec: /* Restore old value */ dtuple_set_n_fields_cmp(entry, n_fields_cmp); +do_possible_lock_wait: + if (err == DB_LOCK_WAIT) { + thr_get_trx(thr)->error_state = err; + + que_thr_stop_for_mysql(thr); + + row_mysql_handle_errors(&err, thr_get_trx(thr), thr, NULL); + + goto run_again; + } + return(err); } @@ -792,8 +809,7 @@ static ulint row_ins_check_foreign_constraints( /*==============================*/ - /* out: DB_SUCCESS, DB_LOCK_WAIT, or error - code */ + /* out: DB_SUCCESS or error code */ dict_table_t* table, /* in: table */ dict_index_t* index, /* in: index */ dtuple_t* entry, /* in: index entry for index */ diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index 1dfb1c4ee77..b05476e0a3d 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -934,6 +934,7 @@ row_update_for_mysql( ut_ad(!prebuilt->sql_stat_start); que_thr_move_to_run_state_for_mysql(thr, trx); + run_again: thr->run_node = node; thr->prev_node = node; @@ -998,7 +999,6 @@ row_update_cascade_for_mysql( trx_t* trx; trx = thr_get_trx(thr); - run_again: thr->run_node = node; thr->prev_node = node; @@ -1130,6 +1130,35 @@ row_mysql_recover_tmp_table( return(row_rename_table_for_mysql(old_name, table->name, trx)); } +/************************************************************************* +Locks the data dictionary exclusively for performing a table create +operation. */ + +void +row_mysql_lock_data_dictionary(void) +/*================================*/ +{ + /* Serialize data dictionary operations with dictionary mutex: + no deadlocks or lock waits can occur then in these operations */ + + rw_lock_x_lock(&(dict_foreign_key_check_lock)); + mutex_enter(&(dict_sys->mutex)); +} + +/************************************************************************* +Unlocks the data dictionary exclusively lock. */ + +void +row_mysql_unlock_data_dictionary(void) +/*==================================*/ +{ + /* Serialize data dictionary operations with dictionary mutex: + no deadlocks can occur then in these operations */ + + mutex_exit(&(dict_sys->mutex)); + rw_lock_x_unlock(&(dict_foreign_key_check_lock)); +} + /************************************************************************* Does a table creation operation for MySQL. If the name of the created table ends to characters INNODB_MONITOR, then this also starts @@ -1150,6 +1179,7 @@ row_create_table_for_mysql( ulint err; ut_ad(trx->mysql_thread_id == os_thread_get_curr_id()); + ut_ad(mutex_own(&(dict_sys->mutex))); if (srv_created_new_raw || srv_force_recovery) { fprintf(stderr, @@ -1263,19 +1293,13 @@ row_create_table_for_mysql( "to use this feature you must compile InnoDB with\n" "UNIV_MEM_DEBUG defined in univ.i and the server must be\n" "quiet because allocation from a mem heap is not protected\n" - "by any semaphore.\n"); + "by any semaphore.\n"); ut_a(mem_validate()); printf("Memory validated\n"); } - /* Serialize data dictionary operations with dictionary mutex: - no deadlocks can occur then in these operations */ - - rw_lock_x_lock(&(dict_foreign_key_check_lock)); - mutex_enter(&(dict_sys->mutex)); - heap = mem_heap_create(512); trx->dict_operation = TRUE; @@ -1325,9 +1349,6 @@ row_create_table_for_mysql( trx->error_state = DB_SUCCESS; } - mutex_exit(&(dict_sys->mutex)); - rw_lock_x_unlock(&(dict_foreign_key_check_lock)); - que_graph_free((que_t*) que_node_get_parent(thr)); trx->op_info = ""; @@ -1354,6 +1375,7 @@ row_create_index_for_mysql( ulint keywordlen; ulint err; + ut_ad(mutex_own(&(dict_sys->mutex))); ut_ad(trx->mysql_thread_id == os_thread_get_curr_id()); trx->op_info = "creating index"; @@ -1372,12 +1394,6 @@ row_create_index_for_mysql( return(DB_SUCCESS); } - /* Serialize data dictionary operations with dictionary mutex: - no deadlocks can occur then in these operations */ - - rw_lock_x_lock(&(dict_foreign_key_check_lock)); - mutex_enter(&(dict_sys->mutex)); - heap = mem_heap_create(512); trx->dict_operation = TRUE; @@ -1405,9 +1421,6 @@ row_create_index_for_mysql( trx->error_state = DB_SUCCESS; } - mutex_exit(&(dict_sys->mutex)); - rw_lock_x_unlock(&(dict_foreign_key_check_lock)); - que_graph_free((que_t*) que_node_get_parent(thr)); trx->op_info = ""; @@ -1441,6 +1454,7 @@ row_table_add_foreign_constraints( ulint keywordlen; ulint err; + ut_ad(mutex_own(&(dict_sys->mutex))); ut_a(sql_string); trx->op_info = "adding foreign keys"; @@ -1459,12 +1473,6 @@ row_table_add_foreign_constraints( return(DB_SUCCESS); } - /* Serialize data dictionary operations with dictionary mutex: - no deadlocks can occur then in these operations */ - - rw_lock_x_lock(&(dict_foreign_key_check_lock)); - mutex_enter(&(dict_sys->mutex)); - trx->dict_operation = TRUE; err = dict_create_foreign_constraints(trx, sql_string, name); @@ -1486,9 +1494,6 @@ row_table_add_foreign_constraints( trx->error_state = DB_SUCCESS; } - mutex_exit(&(dict_sys->mutex)); - rw_lock_x_unlock(&(dict_foreign_key_check_lock)); - return((int) err); } @@ -1917,6 +1922,13 @@ row_drop_table_for_mysql( ut_a(0); } else { dict_table_remove_from_cache(table); + + if (dict_load_table(name) != NULL) { + ut_print_timestamp(stderr); + fprintf(stderr, +" InnoDB: Error: dropping of table %s failed!\n", name); + + } } funct_exit: rw_lock_s_unlock(&(purge_sys->purge_is_running)); diff --git a/innobase/row/row0purge.c b/innobase/row/row0purge.c index 390f1b59a4d..5da98943926 100644 --- a/innobase/row/row0purge.c +++ b/innobase/row/row0purge.c @@ -511,6 +511,14 @@ row_purge_parse_undo_rec( clust_index = dict_table_get_first_index(node->table); + if (clust_index == NULL) { + /* The table was corrupt in the data dictionary */ + + rw_lock_x_unlock(&(purge_sys->purge_is_running)); + + return(FALSE); + } + ptr = trx_undo_rec_get_row_ref(ptr, clust_index, &(node->ref), node->heap); diff --git a/innobase/row/row0upd.c b/innobase/row/row0upd.c index 457cb72aaad..77af2390786 100644 --- a/innobase/row/row0upd.c +++ b/innobase/row/row0upd.c @@ -129,8 +129,7 @@ static ulint row_upd_check_references_constraints( /*=================================*/ - /* out: DB_SUCCESS, DB_LOCK_WAIT, or an error - code */ + /* out: DB_SUCCESS or an error code */ btr_pcur_t* pcur, /* in: cursor positioned on a record; NOTE: the cursor position is lost in this function! */ dict_table_t* table, /* in: table in question */ @@ -626,7 +625,7 @@ row_upd_index_parse( /******************************************************************* Returns TRUE if ext_vec contains i. */ -UNIV_INLINE +static ibool upd_ext_vec_contains( /*=================*/ @@ -738,6 +737,7 @@ row_upd_build_difference_binary( ulint n_diff; ulint roll_ptr_pos; ulint trx_id_pos; + ibool extern_bit; ulint i; /* This function is used only for a clustered index */ @@ -763,9 +763,10 @@ row_upd_build_difference_binary( goto skip_compare; } + + extern_bit = rec_get_nth_field_extern_bit(rec, i); - if (rec_get_nth_field_extern_bit(rec, i) - != upd_ext_vec_contains(ext_vec, n_ext_vec, i) + if (extern_bit != upd_ext_vec_contains(ext_vec, n_ext_vec, i) || !dfield_data_is_binary_equal(dfield, len, data)) { upd_field = upd_get_nth_field(update, n_diff); @@ -1362,7 +1363,7 @@ ulint row_upd_del_mark_clust_rec( /*=======================*/ /* out: DB_SUCCESS if operation successfully - completed, else error code or DB_LOCK_WAIT */ + completed, else error code */ upd_node_t* node, /* in: row update node */ dict_index_t* index, /* in: clustered index */ que_thr_t* thr, /* in: query thread */ @@ -1381,8 +1382,6 @@ row_upd_del_mark_clust_rec( pcur = node->pcur; btr_cur = btr_pcur_get_btr_cur(pcur); - ut_ad(FALSE == rec_get_deleted_flag(btr_pcur_get_rec(pcur))); - /* Store row because we have to build also the secondary index entries */ @@ -1391,11 +1390,11 @@ row_upd_del_mark_clust_rec( /* Mark the clustered index record deleted; we do not have to check locks, because we assume that we have an x-lock on the record */ - err = btr_cur_del_mark_set_clust_rec(BTR_NO_LOCKING_FLAG, btr_cur, - TRUE, thr, mtr); + err = btr_cur_del_mark_set_clust_rec(BTR_NO_LOCKING_FLAG, + btr_cur, TRUE, thr, mtr); if (err == DB_SUCCESS && check_ref) { - /* NOTE that the following call loses - the position of pcur ! */ + /* NOTE that the following call loses the position of pcur ! */ + err = row_upd_check_references_constraints(pcur, index->table, index, thr, mtr); if (err != DB_SUCCESS) { diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index d4aa085479b..19e2b08d5a6 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -639,7 +639,7 @@ srv_release_threads( slot = srv_table_get_nth_slot(i); - if ((slot->type == type) && slot->suspended) { + if (slot->in_use && slot->type == type && slot->suspended) { slot->suspended = FALSE; @@ -1631,6 +1631,7 @@ srv_init(void) for (i = 0; i < OS_THREAD_MAX_N; i++) { slot = srv_mysql_table + i; slot->in_use = FALSE; + slot->type = 0; slot->event = os_event_create(NULL); ut_a(slot->event); } @@ -1890,8 +1891,6 @@ srv_conc_exit_innodb( trx_t* trx) /* in: transaction object associated with the thread */ { - srv_conc_slot_t* slot = NULL; - if (srv_thread_concurrency >= 500) { return; @@ -2200,10 +2199,12 @@ loop: "FILE I/O\n" "--------\n"); os_aio_print(); - printf("-------------\n" - "INSERT BUFFER\n" - "-------------\n"); + printf("-------------------------------------\n" + "INSERT BUFFER AND ADAPTIVE HASH INDEX\n" + "-------------------------------------\n"); ibuf_print(); + printf("Successful hash searches %lu, non-hash searches %lu\n", + btr_cur_n_sea, btr_cur_n_non_sea); printf("---\n" "LOG\n" "---\n"); @@ -2498,18 +2499,19 @@ loop: for (i = 0; i < 10; i++) { n_ios_old = log_sys->n_log_ios + buf_pool->n_pages_read + buf_pool->n_pages_written; - srv_main_thread_op_info = "sleeping"; + srv_main_thread_op_info = (char*)"sleeping"; os_thread_sleep(1000000); /* ALTER TABLE in MySQL requires on Unix that the table handler can drop tables lazily after there no longer are SELECT queries to them. */ - srv_main_thread_op_info = "doing background drop tables"; + srv_main_thread_op_info = + (char*)"doing background drop tables"; row_drop_tables_for_mysql_in_background(); - srv_main_thread_op_info = ""; + srv_main_thread_op_info = (char*)""; if (srv_force_recovery >= SRV_FORCE_NO_BACKGROUND) { @@ -2520,8 +2522,9 @@ loop: is issued or the we have specified in my.cnf no flush at transaction commit */ - srv_main_thread_op_info = "flushing log"; + srv_main_thread_op_info = (char*)"flushing log"; log_flush_up_to(ut_dulint_max, LOG_WAIT_ONE_GROUP); + log_flush_to_disk(); /* If there were less than 10 i/os during the one second sleep, we assume that there is free @@ -2533,11 +2536,14 @@ loop: n_ios = log_sys->n_log_ios + buf_pool->n_pages_read + buf_pool->n_pages_written; if (n_pend_ios < 3 && (n_ios - n_ios_old < 10)) { - srv_main_thread_op_info = "doing insert buffer merge"; + srv_main_thread_op_info = + (char*)"doing insert buffer merge"; ibuf_contract_for_n_pages(TRUE, 5); - srv_main_thread_op_info = "flushing log"; + srv_main_thread_op_info = + (char*)"flushing log"; log_flush_up_to(ut_dulint_max, LOG_WAIT_ONE_GROUP); + log_flush_to_disk(); } if (srv_fast_shutdown && srv_shutdown_state > 0) { @@ -2578,16 +2584,18 @@ loop: srv_main_thread_op_info = "flushing log"; log_flush_up_to(ut_dulint_max, LOG_WAIT_ONE_GROUP); + log_flush_to_disk(); } /* We run a batch of insert buffer merge every 10 seconds, even if the server were active */ - srv_main_thread_op_info = "doing insert buffer merge"; + srv_main_thread_op_info = (char*)"doing insert buffer merge"; ibuf_contract_for_n_pages(TRUE, 5); - srv_main_thread_op_info = "flushing log"; + srv_main_thread_op_info = (char*)"flushing log"; log_flush_up_to(ut_dulint_max, LOG_WAIT_ONE_GROUP); + log_flush_to_disk(); /* We run a full purge every 10 seconds, even if the server were active */ @@ -2603,7 +2611,7 @@ loop: goto background_loop; } - srv_main_thread_op_info = "purging"; + srv_main_thread_op_info = (char*)"purging"; n_pages_purged = trx_purge(); current_time = time(NULL); @@ -2612,6 +2620,7 @@ loop: srv_main_thread_op_info = "flushing log"; log_flush_up_to(ut_dulint_max, LOG_WAIT_ONE_GROUP); + log_flush_to_disk(); last_flush_time = current_time; } } @@ -2620,25 +2629,25 @@ background_loop: /* In this loop we run background operations when the server is quiet and we also come here about once in 10 seconds */ - srv_main_thread_op_info = "doing background drop tables"; + srv_main_thread_op_info = (char*)"doing background drop tables"; n_tables_to_drop = row_drop_tables_for_mysql_in_background(); - srv_main_thread_op_info = ""; + srv_main_thread_op_info = (char*)""; - srv_main_thread_op_info = "flushing buffer pool pages"; + srv_main_thread_op_info = (char*)"flushing buffer pool pages"; /* Flush a few oldest pages to make the checkpoint younger */ n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST, 10, ut_dulint_max); - srv_main_thread_op_info = "making checkpoint"; + srv_main_thread_op_info = (char*)"making checkpoint"; /* Make a new checkpoint about once in 10 seconds */ log_checkpoint(TRUE, FALSE); - srv_main_thread_op_info = "reserving kernel mutex"; + srv_main_thread_op_info = (char*)"reserving kernel mutex"; mutex_enter(&kernel_mutex); if (srv_activity_count != old_activity_count) { @@ -2651,11 +2660,11 @@ background_loop: /* The server has been quiet for a while: start running background operations */ - srv_main_thread_op_info = "purging"; + srv_main_thread_op_info = (char*)"purging"; n_pages_purged = trx_purge(); - srv_main_thread_op_info = "reserving kernel mutex"; + srv_main_thread_op_info = (char*)"reserving kernel mutex"; mutex_enter(&kernel_mutex); if (srv_activity_count != old_activity_count) { @@ -2664,10 +2673,10 @@ background_loop: } mutex_exit(&kernel_mutex); - srv_main_thread_op_info = "doing insert buffer merge"; + srv_main_thread_op_info = (char*)"doing insert buffer merge"; n_bytes_merged = ibuf_contract_for_n_pages(TRUE, 20); - srv_main_thread_op_info = "reserving kernel mutex"; + srv_main_thread_op_info = (char*)"reserving kernel mutex"; mutex_enter(&kernel_mutex); if (srv_activity_count != old_activity_count) { @@ -2676,10 +2685,10 @@ background_loop: } mutex_exit(&kernel_mutex); - srv_main_thread_op_info = "flushing buffer pool pages"; + srv_main_thread_op_info = (char*)"flushing buffer pool pages"; n_pages_flushed = buf_flush_batch(BUF_FLUSH_LIST, 100, ut_dulint_max); - srv_main_thread_op_info = "reserving kernel mutex"; + srv_main_thread_op_info = (char*)"reserving kernel mutex"; mutex_enter(&kernel_mutex); if (srv_activity_count != old_activity_count) { @@ -2691,11 +2700,11 @@ background_loop: srv_main_thread_op_info = "waiting for buffer pool flush to end"; buf_flush_wait_batch_end(BUF_FLUSH_LIST); - srv_main_thread_op_info = "making checkpoint"; + srv_main_thread_op_info = (char*)"making checkpoint"; log_checkpoint(TRUE, FALSE); - srv_main_thread_op_info = "reserving kernel mutex"; + srv_main_thread_op_info = (char*)"reserving kernel mutex"; mutex_enter(&kernel_mutex); if (srv_activity_count != old_activity_count) { @@ -2704,7 +2713,8 @@ background_loop: } mutex_exit(&kernel_mutex); - srv_main_thread_op_info = "archiving log (if log archive is on)"; + srv_main_thread_op_info = + (char*)"archiving log (if log archive is on)"; log_archive_do(FALSE, &n_bytes_archived); @@ -2730,7 +2740,7 @@ background_loop: master thread to wait for more server activity */ suspend_thread: - srv_main_thread_op_info = "suspending"; + srv_main_thread_op_info = (char*)"suspending"; mutex_enter(&kernel_mutex); @@ -2744,7 +2754,7 @@ suspend_thread: mutex_exit(&kernel_mutex); - srv_main_thread_op_info = "waiting for server activity"; + srv_main_thread_op_info = (char*)"waiting for server activity"; os_event_wait(event); diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c index 1fcf8c76a5f..ba0ffbda851 100644 --- a/innobase/srv/srv0start.c +++ b/innobase/srv/srv0start.c @@ -932,6 +932,26 @@ innobase_start_or_create_for_mysql(void) ulint k; mtr_t mtr; +#ifdef UNIV_DEBUG + fprintf(stderr, +"InnoDB: !!!!!!!!!!!!!! UNIV_DEBUG switched on !!!!!!!!!!!!!!!\n"); +#endif + +#ifdef UNIV_SYNC_DEBUG + fprintf(stderr, +"InnoDB: !!!!!!!!!!!!!! UNIV_SYNC_DEBUG switched on !!!!!!!!!!!!!!!\n"); +#endif + +#ifdef UNIV_SEARCH_DEBUG + fprintf(stderr, +"InnoDB: !!!!!!!!!!!!!! UNIV_SEARCH_DEBUG switched on !!!!!!!!!!!!!!!\n"); +#endif + +#ifdef UNIV_MEM_DEBUG + fprintf(stderr, +"InnoDB: !!!!!!!!!!!!!! UNIV_MEM_DEBUG switched on !!!!!!!!!!!!!!!\n"); +#endif + log_do_write = TRUE; /* yydebug = TRUE; */ @@ -999,7 +1019,7 @@ innobase_start_or_create_for_mysql(void) os_aio_use_native_aio = FALSE; if (!os_aio_use_native_aio) { - os_aio_init(4 * SRV_N_PENDING_IOS_PER_THREAD + os_aio_init(8 * SRV_N_PENDING_IOS_PER_THREAD * srv_n_file_io_threads, srv_n_file_io_threads, SRV_MAX_N_PENDING_SYNC_IOS); diff --git a/innobase/trx/trx0roll.c b/innobase/trx/trx0roll.c index 47fffea5e40..0a951484b59 100644 --- a/innobase/trx/trx0roll.c +++ b/innobase/trx/trx0roll.c @@ -160,11 +160,13 @@ trx_rollback_last_sql_stat_for_mysql( } /*********************************************************************** -Rollback uncommitted transactions which have no user session. */ +Rollback or clean up transactions which have no user session. If the +transaction already was committed, then we clean up a possible insert +undo log. If the transaction was not yet committed, then we roll it back. */ void -trx_rollback_all_without_sess(void) -/*===============================*/ +trx_rollback_or_clean_all_without_sess(void) +/*========================================*/ { mem_heap_t* heap; que_fork_t* fork; @@ -217,6 +219,19 @@ loop: trx->sess = trx_dummy_sess; + if (trx->conc_state == TRX_COMMITTED_IN_MEMORY) { + + fprintf(stderr, "InnoDB: Cleaning up trx with id %lu %lu\n", + ut_dulint_get_high(trx->id), + ut_dulint_get_low(trx->id)); + + trx_cleanup_at_db_startup(trx); + + mem_heap_free(heap); + + goto loop; + } + fork = que_fork_create(NULL, NULL, QUE_FORK_RECOVERY, heap); fork->trx = trx; @@ -264,9 +279,17 @@ loop: /* If the transaction was for a dictionary operation, we drop the relevant table, if it still exists */ + fprintf(stderr, +"InnoDB: Dropping table with id %lu %lu in recovery if it exists\n", + ut_dulint_get_high(trx->table_id), + ut_dulint_get_low(trx->table_id)); + table = dict_table_get_on_id_low(trx->table_id, trx); if (table) { + fprintf(stderr, +"InnoDB: Table found: dropping table %s in recovery\n", table->name); + err = row_drop_table_for_mysql(table->name, trx, TRUE); ut_a(err == (int) DB_SUCCESS); diff --git a/innobase/trx/trx0sys.c b/innobase/trx/trx0sys.c index 32a1db48488..675cdf1b7e4 100644 --- a/innobase/trx/trx0sys.c +++ b/innobase/trx/trx0sys.c @@ -26,6 +26,14 @@ Created 3/26/1996 Heikki Tuuri trx_sys_t* trx_sys = NULL; trx_doublewrite_t* trx_doublewrite = NULL; +/* In a MySQL replication slave, in crash recovery we store the master log +file name and position here. We have successfully got the updates to InnoDB +up to this position. If .._pos is -1, it means no crash recovery was needed, +or there was no master log position info inside InnoDB. */ + +char trx_sys_mysql_master_log_name[TRX_SYS_MYSQL_LOG_NAME_LEN]; +ib_longlong trx_sys_mysql_master_log_pos = -1; + /******************************************************************** Determines if a page number is located inside the doublewrite buffer. */ @@ -427,75 +435,62 @@ trx_sys_flush_max_trx_id(void) /********************************************************************* Updates the offset information about the end of the MySQL binlog entry -which corresponds to the transaction just being committed. */ +which corresponds to the transaction just being committed. In a MySQL +replication slave updates the latest master binlog position up to which +replication has proceeded. */ void trx_sys_update_mysql_binlog_offset( /*===============================*/ - trx_t* trx, /* in: transaction being committed */ - mtr_t* mtr) /* in: mtr */ + char* file_name,/* in: MySQL log file name */ + ib_longlong offset, /* in: position in that log file */ + ulint field, /* in: offset of the MySQL log info field in + the trx sys header */ + mtr_t* mtr) /* in: mtr */ { trx_sysf_t* sys_header; - char namebuf[TRX_SYS_MYSQL_LOG_NAME_LEN]; - - ut_ad(trx->mysql_log_file_name); - memset(namebuf, ' ', TRX_SYS_MYSQL_LOG_NAME_LEN - 1); - namebuf[TRX_SYS_MYSQL_LOG_NAME_LEN - 1] = '\0'; + if (ut_strlen(file_name) >= TRX_SYS_MYSQL_LOG_NAME_LEN) { - /* Copy the whole MySQL log file name to the buffer, or only the - last characters, if it does not fit */ + /* We cannot fit the name to the 512 bytes we have reserved */ - if (ut_strlen(trx->mysql_log_file_name) - > TRX_SYS_MYSQL_LOG_NAME_LEN - 1) { - ut_memcpy(namebuf, trx->mysql_log_file_name - + ut_strlen(trx->mysql_log_file_name) - - (TRX_SYS_MYSQL_LOG_NAME_LEN - 1), - TRX_SYS_MYSQL_LOG_NAME_LEN - 1); - } else { - ut_memcpy(namebuf, trx->mysql_log_file_name, - 1 + ut_strlen(trx->mysql_log_file_name)); + return; } - namebuf[TRX_SYS_MYSQL_LOG_NAME_LEN - 1] = '\0'; - sys_header = trx_sysf_get(mtr); - if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO + if (mach_read_from_4(sys_header + field + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD) != TRX_SYS_MYSQL_LOG_MAGIC_N) { - mlog_write_ulint(sys_header + TRX_SYS_MYSQL_LOG_INFO + mlog_write_ulint(sys_header + field + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD, TRX_SYS_MYSQL_LOG_MAGIC_N, MLOG_4BYTES, mtr); } - if (0 != ut_memcmp(sys_header + TRX_SYS_MYSQL_LOG_INFO - + TRX_SYS_MYSQL_LOG_NAME, - namebuf, TRX_SYS_MYSQL_LOG_NAME_LEN)) { + if (0 != ut_memcmp(sys_header + field + TRX_SYS_MYSQL_LOG_NAME, + file_name, 1 + ut_strlen(file_name))) { - mlog_write_string(sys_header + TRX_SYS_MYSQL_LOG_INFO + mlog_write_string(sys_header + field + TRX_SYS_MYSQL_LOG_NAME, - namebuf, TRX_SYS_MYSQL_LOG_NAME_LEN, mtr); + file_name, 1 + ut_strlen(file_name), mtr); } - if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_LOG_INFO + if (mach_read_from_4(sys_header + field + TRX_SYS_MYSQL_LOG_OFFSET_HIGH) > 0 - || (trx->mysql_log_offset >> 32) > 0) { + || (offset >> 32) > 0) { - mlog_write_ulint(sys_header + TRX_SYS_MYSQL_LOG_INFO + mlog_write_ulint(sys_header + field + TRX_SYS_MYSQL_LOG_OFFSET_HIGH, - (ulint)(trx->mysql_log_offset >> 32), + (ulint)(offset >> 32), MLOG_4BYTES, mtr); } - mlog_write_ulint(sys_header + TRX_SYS_MYSQL_LOG_INFO + mlog_write_ulint(sys_header + field + TRX_SYS_MYSQL_LOG_OFFSET_LOW, - (ulint)(trx->mysql_log_offset & 0xFFFFFFFF), + (ulint)(offset & 0xFFFFFFFF), MLOG_4BYTES, mtr); - - trx->mysql_log_file_name = NULL; } /********************************************************************* @@ -533,6 +528,58 @@ trx_sys_print_mysql_binlog_offset(void) mtr_commit(&mtr); } +/********************************************************************* +Prints to stderr the MySQL master log offset info in the trx system header if +the magic number shows it valid. */ + +void +trx_sys_print_mysql_master_log_pos(void) +/*====================================*/ +{ + trx_sysf_t* sys_header; + mtr_t mtr; + + mtr_start(&mtr); + + sys_header = trx_sysf_get(&mtr); + + if (mach_read_from_4(sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO + + TRX_SYS_MYSQL_LOG_MAGIC_N_FLD) + != TRX_SYS_MYSQL_LOG_MAGIC_N) { + + mtr_commit(&mtr); + + return; + } + + fprintf(stderr, +"InnoDB: In a MySQL replication slave the last master binlog file\n" +"InnoDB: position %lu %lu, file name %s\n", + mach_read_from_4(sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO + + TRX_SYS_MYSQL_LOG_OFFSET_HIGH), + mach_read_from_4(sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO + + TRX_SYS_MYSQL_LOG_OFFSET_LOW), + sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO + + TRX_SYS_MYSQL_LOG_NAME); + /* Copy the master log position info to global variables we can + use in ha_innobase.cc to initialize glob_mi to right values */ + + ut_memcpy(trx_sys_mysql_master_log_name, + sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO + + TRX_SYS_MYSQL_LOG_NAME, + TRX_SYS_MYSQL_LOG_NAME_LEN); + + trx_sys_mysql_master_log_pos = + (((ib_longlong)mach_read_from_4( + sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO + + TRX_SYS_MYSQL_LOG_OFFSET_HIGH)) + << 32) + + (ib_longlong) + mach_read_from_4(sys_header + TRX_SYS_MYSQL_MASTER_LOG_INFO + + TRX_SYS_MYSQL_LOG_OFFSET_LOW); + mtr_commit(&mtr); +} + /******************************************************************** Looks for a free slot for a rollback segment in the trx system file copy. */ @@ -660,7 +707,7 @@ trx_sys_init_at_db_start(void) if (UT_LIST_GET_LEN(trx_sys->trx_list) > 0) { fprintf(stderr, - "InnoDB: %lu uncommitted transaction(s) which must be rolled back\n", + "InnoDB: %lu transaction(s) which must be rolled back or cleaned up\n", UT_LIST_GET_LEN(trx_sys->trx_list)); fprintf(stderr, "InnoDB: Trx id counter is %lu %lu\n", diff --git a/innobase/trx/trx0trx.c b/innobase/trx/trx0trx.c index ae607c33fbe..9c49abbd287 100644 --- a/innobase/trx/trx0trx.c +++ b/innobase/trx/trx0trx.c @@ -83,6 +83,8 @@ trx_create( trx->mysql_log_file_name = NULL; trx->mysql_log_offset = 0; + trx->mysql_master_log_file_name = ""; + trx->mysql_master_log_pos = 0; trx->ignore_duplicates_in_insert = FALSE; @@ -363,16 +365,31 @@ trx_lists_init_at_db_start(void) trx = trx_create(NULL); + trx->id = undo->trx_id; + + trx->insert_undo = undo; + trx->rseg = rseg; + if (undo->state != TRX_UNDO_ACTIVE) { trx->conc_state = TRX_COMMITTED_IN_MEMORY; + + /* We give a dummy value for the trx no; + this should have no relevance since purge + is not interested in committed transaction + numbers, unless they are in the history + list, in which case it looks the number + from the disk based undo log structure */ + + trx->no = trx->id; } else { trx->conc_state = TRX_ACTIVE; - } - trx->id = undo->trx_id; - trx->insert_undo = undo; - trx->rseg = rseg; + /* A running transaction always has the number + field inited to ut_dulint_max */ + + trx->no = ut_dulint_max; + } if (undo->dict_operation) { trx->dict_operation = undo->dict_operation; @@ -397,14 +414,25 @@ trx_lists_init_at_db_start(void) if (NULL == trx) { trx = trx_create(NULL); + trx->id = undo->trx_id; + if (undo->state != TRX_UNDO_ACTIVE) { trx->conc_state = TRX_COMMITTED_IN_MEMORY; + /* We give a dummy value for the trx + number */ + + trx->no = trx->id; } else { trx->conc_state = TRX_ACTIVE; + + /* A running transaction always has + the number field inited to + ut_dulint_max */ + + trx->no = ut_dulint_max; } - trx->id = undo->trx_id; trx->rseg = rseg; trx_list_insert_ordered(trx); @@ -583,7 +611,7 @@ trx_commit_off_kernel( if (undo) { mutex_enter(&kernel_mutex); #ifdef notdefined - /* ########## There is a bug here: purge and rollback + /* !!!!!!!!! There is a bug here: purge and rollback need the whole stack of old record versions even if no consistent read would need them!! This is because they decide on the basis of the old versions when we can @@ -627,12 +655,25 @@ trx_commit_off_kernel( mutex_exit(&(rseg->mutex)); /* Update the latest MySQL binlog name and offset info - in trx sys header if MySQL binlogging is on */ + in trx sys header if MySQL binlogging is on or the database + server is a MySQL replication slave */ if (trx->mysql_log_file_name) { - trx_sys_update_mysql_binlog_offset(trx, &mtr); + trx_sys_update_mysql_binlog_offset( + trx->mysql_log_file_name, + trx->mysql_log_offset, + TRX_SYS_MYSQL_LOG_INFO, &mtr); + trx->mysql_log_file_name = NULL; } - + + if (trx->mysql_master_log_file_name[0] != '\0') { + /* This database server is a MySQL replication slave */ + trx_sys_update_mysql_binlog_offset( + trx->mysql_master_log_file_name, + trx->mysql_master_log_pos, + TRX_SYS_MYSQL_MASTER_LOG_INFO, &mtr); + } + /* If we did not take the shortcut, the following call commits the mini-transaction, making the whole transaction committed in the file-based world at this log sequence number; @@ -707,12 +748,12 @@ trx_commit_off_kernel( /*-------------------------------------*/ - /* Most MySQL users run with srv_flush.. set to FALSE: */ + /* Most MySQL users run with srv_flush_.. set to FALSE: */ if (srv_flush_log_at_trx_commit) { log_flush_up_to(lsn, LOG_WAIT_ONE_GROUP); - } + } /*-------------------------------------*/ @@ -730,6 +771,29 @@ trx_commit_off_kernel( UT_LIST_REMOVE(trx_list, trx_sys->trx_list, trx); } +/******************************************************************** +Cleans up a transaction at database startup. The cleanup is needed if +the transaction already got to the middle of a commit when the database +crashed, andf we cannot roll it back. */ + +void +trx_cleanup_at_db_startup( +/*======================*/ + trx_t* trx) /* in: transaction */ +{ + if (trx->insert_undo != NULL) { + + trx_undo_insert_cleanup(trx); + } + + trx->conc_state = TRX_NOT_STARTED; + trx->rseg = NULL; + trx->undo_no = ut_dulint_zero; + trx->last_sql_stat_start.least_undo_no = ut_dulint_zero; + + UT_LIST_REMOVE(trx_list, trx_sys->trx_list, trx); +} + /************************************************************************ Assigns a read view for a consistent read query. All the consistent reads within the same transaction will get the same read view, which is created diff --git a/innobase/trx/trx0undo.c b/innobase/trx/trx0undo.c index b5341871228..dd249a7062a 100644 --- a/innobase/trx/trx0undo.c +++ b/innobase/trx/trx0undo.c @@ -1147,7 +1147,7 @@ trx_undo_mem_create_at_db_start( /* If the log segment is being freed, the page list is inconsistent! */ if (state == TRX_UNDO_TO_FREE) { - return(undo); + goto add_to_list; } last_addr = flst_get_last(seg_header + TRX_UNDO_PAGE_LIST, mtr); @@ -1166,7 +1166,7 @@ trx_undo_mem_create_at_db_start( undo->top_offset = rec - last_page; undo->top_undo_no = trx_undo_rec_get_undo_no(rec); } - +add_to_list: if (type == TRX_UNDO_INSERT) { if (state != TRX_UNDO_CACHED) { UT_LIST_ADD_LAST(undo_list, rseg->insert_undo_list, diff --git a/innobase/ut/ut0mem.c b/innobase/ut/ut0mem.c index a1320e8b5bc..2a7643551ad 100644 --- a/innobase/ut/ut0mem.c +++ b/innobase/ut/ut0mem.c @@ -38,6 +38,8 @@ os_fast_mutex_t ut_list_mutex; /* this protects the list */ ibool ut_mem_block_list_inited = FALSE; +ulint* ut_mem_null_ptr = NULL; + /************************************************************************** Initializes the mem block list at database startup. */ static @@ -83,12 +85,16 @@ ut_malloc_low( "InnoDB: Check if you should increase the swap file or\n" "InnoDB: ulimits of your operating system.\n" "InnoDB: On FreeBSD check you have compiled the OS with\n" - "InnoDB: a big enough maximum process size.\n", + "InnoDB: a big enough maximum process size.\n" + "InnoDB: We now intentionally generate a seg fault so that\n" + "InnoDB: on Linux we get a stack trace.\n", n, ut_total_allocated_memory, errno); os_fast_mutex_unlock(&ut_list_mutex); - exit(1); + /* Make an intentional seg fault so that we get a stack + trace */ + printf("%lu\n", *ut_mem_null_ptr); } if (set_to_zero) { diff --git a/innobase/ut/ut0ut.c b/innobase/ut/ut0ut.c index 7ee32b9a8e2..6a5f273e731 100644 --- a/innobase/ut/ut0ut.c +++ b/innobase/ut/ut0ut.c @@ -110,6 +110,49 @@ ut_print_timestamp( #endif } +/************************************************************** +Sprintfs a timestamp to a buffer. */ + +void +ut_sprintf_timestamp( +/*=================*/ + char* buf) /* in: buffer where to sprintf */ +{ +#ifdef __WIN__ + SYSTEMTIME cal_tm; + + GetLocalTime(&cal_tm); + + sprintf(buf, "%02d%02d%02d %2d:%02d:%02d", + (int)cal_tm.wYear % 100, + (int)cal_tm.wMonth, + (int)cal_tm.wDay, + (int)cal_tm.wHour, + (int)cal_tm.wMinute, + (int)cal_tm.wSecond); +#else + struct tm cal_tm; + struct tm* cal_tm_ptr; + time_t tm; + + time(&tm); + +#ifdef HAVE_LOCALTIME_R + localtime_r(&tm, &cal_tm); + cal_tm_ptr = &cal_tm; +#else + cal_tm_ptr = localtime(&tm); +#endif + sprintf(buf, "%02d%02d%02d %2d:%02d:%02d", + cal_tm_ptr->tm_year % 100, + cal_tm_ptr->tm_mon + 1, + cal_tm_ptr->tm_mday, + cal_tm_ptr->tm_hour, + cal_tm_ptr->tm_min, + cal_tm_ptr->tm_sec); +#endif +} + /************************************************************** Returns current year, month, day. */ @@ -258,3 +301,26 @@ ut_ulint_sort(ulint* arr, ulint* aux_arr, ulint low, ulint high) UT_SORT_FUNCTION_BODY(ut_ulint_sort, arr, aux_arr, low, high, ut_ulint_cmp); } + +/***************************************************************** +Calculates fast the number rounded up to the nearest power of 2. */ + +ulint +ut_2_power_up( +/*==========*/ + /* out: first power of 2 which is >= n */ + ulint n) /* in: number != 0 */ +{ + ulint res; + + res = 1; + + ut_ad(n > 0); + + while (res < n) { + res = res * 2; + } + + return(res); +} + -- cgit v1.2.1 From ee102a7886dc79c7d49cd50e8af653c0e9a4b74a Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 22 Jun 2002 23:31:51 +0300 Subject: os0sync.c: Initing a mutex with MY_MUTEX_INIT_FAST may relieve thread thrashing on Linux innobase/os/os0sync.c: Initing a mutex with MY_MUTEX_INIT_FAST may relieve thread thrashing on Linux --- innobase/os/os0sync.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/innobase/os/os0sync.c b/innobase/os/os0sync.c index 2cf5160d055..c1345de0d55 100644 --- a/innobase/os/os0sync.c +++ b/innobase/os/os0sync.c @@ -435,7 +435,7 @@ os_fast_mutex_init( InitializeCriticalSection((LPCRITICAL_SECTION) fast_mutex); #else - pthread_mutex_init(fast_mutex, NULL); + pthread_mutex_init(fast_mutex, MY_MUTEX_INIT_FAST); #endif } -- cgit v1.2.1 From 38ffd49a8bb407674bfb5a2182e65e8c53554812 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 23 Jun 2002 00:35:36 +0300 Subject: slave.cc: Slave thread is always in an auto-commit state: remove unnecessary tests when we flush master info sql/slave.cc: Slave thread is always in an auto-commit state: remove unnecessary tests when we flush master info --- sql/slave.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sql/slave.cc b/sql/slave.cc index b535c87024b..32c478c369d 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -1024,7 +1024,7 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) mi->inc_pos(event_len); - if (!(thd->options & (OPTION_NOT_AUTO_COMMIT | OPTION_BEGIN))) { + if (!(thd->options & OPTION_BEGIN)) { /* We only flush the master info position to the master.info file if the transaction is not open any more: an incomplete transaction will @@ -1155,7 +1155,7 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) mi->inc_pos(event_len); - if (!(thd->options & (OPTION_NOT_AUTO_COMMIT | OPTION_BEGIN))) + if (!(thd->options & OPTION_BEGIN)) flush_master_info(mi); break; @@ -1190,7 +1190,7 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) pthread_cond_broadcast(&mi->cond); pthread_mutex_unlock(&mi->lock); - if (!(thd->options & (OPTION_NOT_AUTO_COMMIT | OPTION_BEGIN))) + if (!(thd->options & OPTION_BEGIN)) flush_master_info(mi); #ifndef DBUG_OFF if(abort_slave_event_count) -- cgit v1.2.1 From 458c785e1f1614382cd389df3afd24519ff30536 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 25 Jun 2002 20:24:15 +0300 Subject: A fix for small error in displaying db names in SHOW GRANTS --- sql/sql_acl.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 446076e0d55..794f96fee86 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -2470,9 +2470,9 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user) } } } - db.append (" ON ",4); + db.append (" ON '",5); db.append(acl_db->db); - db.append (".* TO '",7); + db.append ("'.* TO '",8); db.append(lex_user->user.str,lex_user->user.length); db.append ("'@'",3); db.append(lex_user->host.str, lex_user->host.length); -- cgit v1.2.1 From 0ae83cae796d1158f21605015fd47e1e4af652c8 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 26 Jun 2002 10:09:11 +0300 Subject: os0file.c: Crash the server if file flush does not succeed: the database can get corrupt, better to crash it than let it run innobase/os/os0file.c: Crash the server if file flush does not succeed: the database can get corrupt, better to crash it than let it run --- innobase/os/os0file.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c index 5806cb8f1f3..e98b9e95cf7 100644 --- a/innobase/os/os0file.c +++ b/innobase/os/os0file.c @@ -761,6 +761,10 @@ os_file_flush( os_file_handle_error(file, NULL); + /* It is a fatal error if a file flush does not succeed, because then + the database can get corrupt on disk */ + ut_a(0); + return(FALSE); #else int ret; @@ -783,11 +787,17 @@ os_file_flush( return(TRUE); } + ut_print_timestamp(stderr); + fprintf(stderr, - "InnoDB: Error: the OS said file flush did not succeed\n"); + " InnoDB: Error: the OS said file flush did not succeed\n"); os_file_handle_error(file, NULL); + /* It is a fatal error if a file flush does not succeed, because then + the database can get corrupt on disk */ + ut_a(0); + return(FALSE); #endif } @@ -1144,8 +1154,8 @@ os_file_write( "InnoDB: Operating system error number %lu.\n" "InnoDB: Check that your OS and file system support files of this size.\n" "InnoDB: Check also the disk is not full or a disk quota exceeded.\n", - name, offset_high, offset, n, ret, (ulint)errno); - + name, offset_high, offset, n, (ulint)ret, + (ulint)errno); os_has_said_disk_full = TRUE; } -- cgit v1.2.1 From 15171d977c9ee1cc80c69ae64e524c90c7544401 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 26 Jun 2002 14:53:18 +0300 Subject: Trying to make Arjen happy ... --- sql/sql_acl.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 794f96fee86..edfc2ceeab8 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -2470,9 +2470,9 @@ int mysql_show_grants(THD *thd,LEX_USER *lex_user) } } } - db.append (" ON '",5); + db.append (" ON `",5); db.append(acl_db->db); - db.append ("'.* TO '",8); + db.append ("`.* TO '",8); db.append(lex_user->user.str,lex_user->user.length); db.append ("'@'",3); db.append(lex_user->host.str, lex_user->host.length); -- cgit v1.2.1 From 36bcddf9a29e8b7a56ac6a7f689ef11ac6a72564 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 26 Jun 2002 21:42:40 +0300 Subject: buf0buf.ic: Fix a bug: if buffer pool size > 2 GB on a 32-bit computer, we got an assertion failure because >> acted as a division operator (not as a register shift) for a wrapped-over integer value innobase/include/buf0buf.ic: Fix a bug: if buffer pool size > 2 GB on a 32-bit computer, we got an assertion failure because >> acted as a division operator (not as a register shift) for a wrapped-over integer value --- innobase/include/buf0buf.ic | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/innobase/include/buf0buf.ic b/innobase/include/buf0buf.ic index 8f5443ad150..50248a7b2da 100644 --- a/innobase/include/buf0buf.ic +++ b/innobase/include/buf0buf.ic @@ -209,7 +209,7 @@ buf_block_align( ut_ad((ulint)ptr >= (ulint)frame_zero); - block = buf_pool_get_nth_block(buf_pool, (ptr - frame_zero) + block = buf_pool_get_nth_block(buf_pool, ((ulint)(ptr - frame_zero)) >> UNIV_PAGE_SIZE_SHIFT); ut_a(block >= buf_pool->blocks); ut_a(block < buf_pool->blocks + buf_pool->max_size); @@ -236,7 +236,7 @@ buf_block_align_low( ut_ad((ulint)ptr >= (ulint)frame_zero); - block = buf_pool_get_nth_block(buf_pool, (ptr - frame_zero) + block = buf_pool_get_nth_block(buf_pool, ((ulint)(ptr - frame_zero)) >> UNIV_PAGE_SIZE_SHIFT); ut_a(block >= buf_pool->blocks); ut_a(block < buf_pool->blocks + buf_pool->max_size); -- cgit v1.2.1 From b9d64a6f43930fc290bf30a9cacee628b1aad881 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 26 Jun 2002 22:29:54 +0300 Subject: Small typo as reported by one registered customer --- Docs/manual.texi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index f987ff94f98..300b94eb897 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -11528,7 +11528,7 @@ MySQL (This example uses the IBM compiler): export CC="xlc_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192 " export CXX="xlC_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192" export CFLAGS="-I /usr/local/include" -export LDLFAGS="-L /usr/local/lib" +export LDFLAGS="-L /usr/local/lib" export CPPFLAGS=$CFLAGS export CXXFLAGS=$CFLAGS -- cgit v1.2.1 From 0ac018183d11cbdcd17b9a6bd8630299f666e806 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 29 Jun 2002 01:06:14 +0300 Subject: Fixed copyright in pack_isam.c Docs/manual.texi: Changelog configure.in: Version update isam/pack_isam.c: Fixed copyright myisam/mi_cache.c: Indentation fixup --- Docs/manual.texi | 2 ++ configure.in | 2 +- isam/pack_isam.c | 7 ++++--- myisam/mi_cache.c | 4 ++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index f987ff94f98..7c20b08164e 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -46927,6 +46927,8 @@ not yet 100% confident in this code. @node News-3.23.52, News-3.23.51, News-3.23.x, News-3.23.x @appendixsubsec Changes in release 3.23.52 @itemize @bullet +@code +Fixed a bug in range optimiser (causing crashes). @item Fixed possible problem in replication when doing @code{DROP DATABASE} on a database with InnoDB tables. diff --git a/configure.in b/configure.in index 00c986c4006..0869ce43e6d 100644 --- a/configure.in +++ b/configure.in @@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script. AC_INIT(sql/mysqld.cc) AC_CANONICAL_SYSTEM # The Docs Makefile.am parses this line! -AM_INIT_AUTOMAKE(mysql, 3.23.51) +AM_INIT_AUTOMAKE(mysql, 3.23.52) AM_CONFIG_HEADER(config.h) PROTOCOL_VERSION=10 diff --git a/isam/pack_isam.c b/isam/pack_isam.c index e7b5170d398..5a66a9cb33c 100644 --- a/isam/pack_isam.c +++ b/isam/pack_isam.c @@ -265,9 +265,10 @@ static void print_version(void) static void usage(void) { print_version(); - puts("Copyright (C) 1994-2000 TcX AB & Monty Program KB & Detron HB."); - puts("This is not free software. You must have a licence to use this program"); - puts("This software comes with ABSOLUTELY NO WARRANTY\n"); + puts("Copyright (C) 2002 MySQL AB"); + puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,"); + puts("and you are welcome to modify and redistribute it under the GPL license\n"); + puts("Pack a ISAM-table to take much smaller space"); puts("Keys are not updated, so you must run isamchk -rq on any table"); puts("that has keys after you have compressed it"); diff --git a/myisam/mi_cache.c b/myisam/mi_cache.c index 69a1cb0d7a5..f88725ff04b 100644 --- a/myisam/mi_cache.c +++ b/myisam/mi_cache.c @@ -59,8 +59,8 @@ int _mi_read_cache(IO_CACHE *info, byte *buff, my_off_t pos, uint length, in_buff_length=0; if (flag & READING_NEXT) { - if (pos != ((info)->pos_in_file + - (uint) ((info)->rc_end - (info)->rc_request_pos))) + if (pos != (info->pos_in_file + + (uint) (info->rc_end - info->rc_request_pos))) { info->pos_in_file=pos; /* Force start here */ info->rc_pos=info->rc_end=info->rc_request_pos; /* Everything used */ -- cgit v1.2.1 From fbaede459b0e6e0a4e77930cf345d44f05547d1a Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 30 Jun 2002 23:25:46 +0300 Subject: Fixed bug in binary log when using LOAD DATA INFILE without active database. Docs/manual.texi: Changelog and fix of typo --- Docs/manual.texi | 5 ++++- sql/log_event.h | 19 +++++++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 388bf64a344..55ac278155f 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -46927,7 +46927,10 @@ not yet 100% confident in this code. @node News-3.23.52, News-3.23.51, News-3.23.x, News-3.23.x @appendixsubsec Changes in release 3.23.52 @itemize @bullet -@code +@item +Fixed bug when logging @code{LOAD DATA INFILE} to binary log with no +active database. +@item Fixed a bug in range optimiser (causing crashes). @item Fixed possible problem in replication when doing @code{DROP DATABASE} on a diff --git a/sql/log_event.h b/sql/log_event.h index a31c698fae9..7cd84a8c001 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -234,8 +234,8 @@ public: List& fields_arg, enum enum_duplicates handle_dup ): Log_event(thd->start_time),data_buf(0),thread_id(thd->thread_id), num_fields(0),fields(0),field_lens(0),field_block_len(0), - table_name(table_name_arg), - db(db_arg), + table_name(table_name_arg ? table_name_arg : ""), + db(db_arg ? db_arg : ""), fname(ex->file_name), thd(thd) { @@ -243,8 +243,8 @@ public: time(&end_time); exec_time = (ulong) (end_time - thd->start_time); valid_exec_time = 1; - db_len = (db) ? (uint32) strlen(db) : 0; - table_name_len = (table_name) ? (uint32) strlen(table_name) : 0; + db_len = (uint32) strlen(db); + table_name_len = (uint32) strlen(table_name); fname_len = (fname) ? (uint) strlen(fname) : 0; sql_ex.field_term = (*ex->field_term)[0]; sql_ex.enclosed = (*ex->enclosed)[0]; @@ -259,12 +259,11 @@ public: sql_ex.empty_flags = 0; - switch(handle_dup) - { - case DUP_IGNORE: sql_ex.opt_flags |= IGNORE_FLAG; break; - case DUP_REPLACE: sql_ex.opt_flags |= REPLACE_FLAG; break; - case DUP_ERROR: break; - } + switch(handle_dup) { + case DUP_IGNORE: sql_ex.opt_flags |= IGNORE_FLAG; break; + case DUP_REPLACE: sql_ex.opt_flags |= REPLACE_FLAG; break; + case DUP_ERROR: break; + } if(!ex->field_term->length()) sql_ex.empty_flags |= FIELD_TERM_EMPTY; -- cgit v1.2.1 From ea13cafbfe83b1aba0c2dd6582eebd2acc5c6729 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 1 Jul 2002 02:19:58 +0300 Subject: row0ins.c: The UNIV_DEBUG version asserted if a foreign key check failed because of a lock wait timeout btr0cur.c: Fix a bug: if the primary key was updated (or delete + insert) so that only the case of characters changed, we were left with a dangling adaptive hash index pointer, often causing an assertion failure in page0page.ic line 515 innobase/btr/btr0cur.c: Fix a bug: if the primary key was updated (or delete + insert) so that only the case of characters changed, we were left with a dangling adaptive hash index pointer, often causing an assertion failure in page0page.ic line 515 innobase/row/row0ins.c: The UNIV_DEBUG version asserted if a foreign key check failed because of a lock wait timeout --- innobase/btr/btr0cur.c | 6 ++++++ innobase/row/row0ins.c | 10 ++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/innobase/btr/btr0cur.c b/innobase/btr/btr0cur.c index 67b74967e8d..f3aebb7f96f 100644 --- a/innobase/btr/btr0cur.c +++ b/innobase/btr/btr0cur.c @@ -1355,6 +1355,12 @@ btr_cur_update_in_place( block = buf_block_align(rec); if (block->is_hashed) { + if (row_upd_changes_ord_field_binary(NULL, index, update)) { + + /* Remove possible hash index pointer to this record */ + btr_search_update_hash_on_delete(cursor); + } + rw_lock_x_lock(&btr_search_latch); } diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c index bbec004176b..ee4805d51d2 100644 --- a/innobase/row/row0ins.c +++ b/innobase/row/row0ins.c @@ -627,6 +627,7 @@ row_ins_check_foreign_constraint( dict_table_t* check_table; dict_index_t* check_index; ulint n_fields_cmp; + ibool timeout_expired; rec_t* rec; btr_pcur_t pcur; ibool moved; @@ -790,10 +791,15 @@ do_possible_lock_wait: thr_get_trx(thr)->error_state = err; que_thr_stop_for_mysql(thr); + + timeout_expired = srv_suspend_mysql_thread(thr); - row_mysql_handle_errors(&err, thr_get_trx(thr), thr, NULL); + if (!timeout_expired) { + + goto run_again; + } - goto run_again; + err = DB_LOCK_WAIT_TIMEOUT; } return(err); -- cgit v1.2.1 From 12fae523c30af4eff48d8f89bac65cb2b30c06bd Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 1 Jul 2002 12:06:37 +0300 Subject: srv0start.c: Remove freeing of all memory at shutdown: since we do not exit the i/o-handlers and other threads, we could potentially get a seg fault at shutdown innobase/srv/srv0start.c: Remove freeing of all memory at shutdown: since we do not exit the i/o-handlers and other threads, we could potentially get a seg fault at shutdown --- innobase/srv/srv0start.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c index ba0ffbda851..ff4c4f021b0 100644 --- a/innobase/srv/srv0start.c +++ b/innobase/srv/srv0start.c @@ -1362,8 +1362,15 @@ innobase_shutdown_for_mysql(void) "InnoDB: inside InnoDB at shutdown\n", srv_conc_n_threads); } - - ut_free_all_mem(); - + + /* + TODO: We should exit the i/o-handler and other utility threads + before freeing all memory. Now this can potentially cause a seg + fault! + */ +#ifdef NOT_WORKING_YET + ut_free_all_mem(); +#endif + return((int) DB_SUCCESS); } -- cgit v1.2.1 From 6f1f9d5c743d94326c486d49089739fc87248847 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 3 Jul 2002 03:29:30 +0300 Subject: ha_innobase.cc: Clarify the setting of innodb_data_file_path in my.cnf: it is in the [mysqld] section sql/ha_innobase.cc: Clarify the setting of innodb_data_file_path in my.cnf: it is in the [mysqld] section --- sql/ha_innobase.cc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/sql/ha_innobase.cc b/sql/ha_innobase.cc index 761d74f49b0..3f23a28c62b 100644 --- a/sql/ha_innobase.cc +++ b/sql/ha_innobase.cc @@ -394,7 +394,7 @@ innobase_init(void) bool ret; DBUG_ENTER("innobase_init"); - + os_innodb_umask = (ulint)my_umask; if (specialflag & SPECIAL_NO_PRIOR) { @@ -418,8 +418,9 @@ innobase_init(void) "If you do not want to use transactional InnoDB tables, add a line\n" "skip-innodb\n" "to the [mysqld] section of init parameters in your my.cnf\n" - "or my.ini. If you want to use InnoDB tables, add for example,\n" - "innodb_data_file_path = ibdata1:30M:autoextend\n" + "or my.ini. If you want to use InnoDB tables, add to the [mysqld]\n" + "section, for example,\n" + "innodb_data_file_path = ibdata1:10M:autoextend\n" "But to get good performance you should adjust for your hardware\n" "the InnoDB startup options listed in section 2 at\n" "http://www.innodb.com/ibman.html\n"); @@ -478,6 +479,9 @@ innobase_init(void) srv_use_native_aio = 0; srv_pool_size = (ulint) innobase_buffer_pool_size; + + printf("Buffer pool size set to %lu\n", srv_pool_size); + srv_mem_pool_size = (ulint) innobase_additional_mem_pool_size; srv_n_file_io_threads = (ulint) innobase_file_io_threads; -- cgit v1.2.1 From 99bde364f64d8827e97722cebabaf75dd5889774 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 3 Jul 2002 03:39:10 +0300 Subject: ha_innobase.cc: Remove a debug printf which unintentionally was committed to the source tree sql/ha_innobase.cc: Remove a debug printf which unintentionally was committed to the source tree --- sql/ha_innobase.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/sql/ha_innobase.cc b/sql/ha_innobase.cc index 3f23a28c62b..0975cdce290 100644 --- a/sql/ha_innobase.cc +++ b/sql/ha_innobase.cc @@ -480,8 +480,6 @@ innobase_init(void) srv_pool_size = (ulint) innobase_buffer_pool_size; - printf("Buffer pool size set to %lu\n", srv_pool_size); - srv_mem_pool_size = (ulint) innobase_additional_mem_pool_size; srv_n_file_io_threads = (ulint) innobase_file_io_threads; -- cgit v1.2.1 From 88012698db7988beba4ad39be5d68362c9f0d92c Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 4 Jul 2002 12:25:13 +0200 Subject: do not crash on myrg_rprev/myrg_rnext if no current table (as when previous myrg_rkey failed, e.g. found nothing) --- myisammrg/myrg_rnext.c | 3 +++ myisammrg/myrg_rprev.c | 3 +++ 2 files changed, 6 insertions(+) diff --git a/myisammrg/myrg_rnext.c b/myisammrg/myrg_rnext.c index 5a3fbdfb299..703ca29632b 100644 --- a/myisammrg/myrg_rnext.c +++ b/myisammrg/myrg_rnext.c @@ -25,6 +25,9 @@ int myrg_rnext(MYRG_INFO *info, byte *buf, int inx) int err; MI_INFO *mi; + if (!info->current_table) + return (HA_ERR_KEY_NOT_FOUND); + /* at first, do rnext for the table found before */ if ((err=mi_rnext(info->current_table->table,NULL,inx))) { diff --git a/myisammrg/myrg_rprev.c b/myisammrg/myrg_rprev.c index d8089e80498..8c43b40035a 100644 --- a/myisammrg/myrg_rprev.c +++ b/myisammrg/myrg_rprev.c @@ -25,6 +25,9 @@ int myrg_rprev(MYRG_INFO *info, byte *buf, int inx) int err; MI_INFO *mi; + if (!info->current_table) + return (HA_ERR_KEY_NOT_FOUND); + /* at first, do rprev for the table found before */ if ((err=mi_rprev(info->current_table->table,NULL,inx))) { -- cgit v1.2.1 From c0e8c9a11f0427fe6e0604eaeef5988abdb55210 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 8 Jul 2002 19:34:49 +0300 Subject: Many files: Merge InnoDB-3.23.52b innobase/btr/btr0btr.c: Merge InnoDB-3.23.52b innobase/btr/btr0cur.c: Merge InnoDB-3.23.52b innobase/btr/btr0sea.c: Merge InnoDB-3.23.52b innobase/buf/buf0buf.c: Merge InnoDB-3.23.52b innobase/ha/ha0ha.c: Merge InnoDB-3.23.52b innobase/ibuf/ibuf0ibuf.c: Merge InnoDB-3.23.52b innobase/include/btr0cur.h: Merge InnoDB-3.23.52b innobase/include/buf0buf.h: Merge InnoDB-3.23.52b innobase/include/ha0ha.h: Merge InnoDB-3.23.52b innobase/include/ibuf0ibuf.h: Merge InnoDB-3.23.52b innobase/include/lock0lock.h: Merge InnoDB-3.23.52b innobase/include/log0log.h: Merge InnoDB-3.23.52b innobase/include/os0file.h: Merge InnoDB-3.23.52b innobase/include/rem0rec.ic: Merge InnoDB-3.23.52b innobase/include/srv0srv.h: Merge InnoDB-3.23.52b innobase/include/sync0arr.h: Merge InnoDB-3.23.52b innobase/include/sync0sync.h: Merge InnoDB-3.23.52b innobase/include/trx0trx.h: Merge InnoDB-3.23.52b innobase/lock/lock0lock.c: Merge InnoDB-3.23.52b innobase/log/log0log.c: Merge InnoDB-3.23.52b innobase/os/os0file.c: Merge InnoDB-3.23.52b innobase/row/row0mysql.c: Merge InnoDB-3.23.52b innobase/row/row0umod.c: Merge InnoDB-3.23.52b innobase/row/row0upd.c: Merge InnoDB-3.23.52b innobase/srv/srv0srv.c: Merge InnoDB-3.23.52b innobase/srv/srv0start.c: Merge InnoDB-3.23.52b innobase/sync/sync0arr.c: Merge InnoDB-3.23.52b innobase/sync/sync0sync.c: Merge InnoDB-3.23.52b innobase/trx/trx0trx.c: Merge InnoDB-3.23.52b sql/ha_innobase.h: Merge InnoDB-3.23.52b sql/ha_innobase.cc: Merge InnoDB-3.23.52b sql/sql_lex.h: Merge InnoDB-3.23.52b sql/mysqld.cc: Merge InnoDB-3.23.52b sql/sql_parse.cc: Merge InnoDB-3.23.52b sql/sql_yacc.yy: Merge InnoDB-3.23.52b --- innobase/btr/btr0btr.c | 3 +- innobase/btr/btr0cur.c | 2 + innobase/btr/btr0sea.c | 85 ++++++++++++++++-- innobase/buf/buf0buf.c | 36 +++++--- innobase/ha/ha0ha.c | 43 ++++++--- innobase/ibuf/ibuf0ibuf.c | 16 +++- innobase/include/btr0cur.h | 2 + innobase/include/buf0buf.h | 8 +- innobase/include/ha0ha.h | 2 + innobase/include/ibuf0ibuf.h | 6 +- innobase/include/lock0lock.h | 10 ++- innobase/include/log0log.h | 6 +- innobase/include/os0file.h | 6 +- innobase/include/rem0rec.ic | 2 - innobase/include/srv0srv.h | 8 ++ innobase/include/sync0arr.h | 2 + innobase/include/sync0sync.h | 12 ++- innobase/include/trx0trx.h | 4 +- innobase/lock/lock0lock.c | 128 +++++++++++++++++---------- innobase/log/log0log.c | 15 +++- innobase/os/os0file.c | 48 +++++++---- innobase/row/row0mysql.c | 8 ++ innobase/row/row0umod.c | 5 +- innobase/row/row0upd.c | 7 +- innobase/srv/srv0srv.c | 201 +++++++++++++++++++++++++++++-------------- innobase/srv/srv0start.c | 2 +- innobase/sync/sync0arr.c | 78 +++++++++++------ innobase/sync/sync0sync.c | 33 +++++-- innobase/trx/trx0trx.c | 49 +++++++---- sql/ha_innobase.cc | 94 ++++++++++++++++++-- sql/ha_innobase.h | 1 + sql/mysqld.cc | 1 + sql/sql_lex.h | 1 + sql/sql_parse.cc | 13 +++ sql/sql_yacc.yy | 2 + 35 files changed, 682 insertions(+), 257 deletions(-) diff --git a/innobase/btr/btr0btr.c b/innobase/btr/btr0btr.c index 88472d6dbe0..15642e6ccbc 100644 --- a/innobase/btr/btr0btr.c +++ b/innobase/btr/btr0btr.c @@ -2076,8 +2076,7 @@ btr_discard_page( btr_search_drop_page_hash_index(page); - if ((left_page_no == FIL_NULL) - && (btr_page_get_level(page, mtr) > 0)) { + if (left_page_no == FIL_NULL && btr_page_get_level(page, mtr) > 0) { /* We have to mark the leftmost node pointer on the right side page as the predefined minimum record */ diff --git a/innobase/btr/btr0cur.c b/innobase/btr/btr0cur.c index f3aebb7f96f..50f9584e86d 100644 --- a/innobase/btr/btr0cur.c +++ b/innobase/btr/btr0cur.c @@ -44,6 +44,8 @@ ulint btr_cur_rnd = 0; ulint btr_cur_n_non_sea = 0; ulint btr_cur_n_sea = 0; +ulint btr_cur_n_non_sea_old = 0; +ulint btr_cur_n_sea_old = 0; /* In the optimistic insert, if the insert does not fit, but this much space can be released by page reorganize, then it is reorganized */ diff --git a/innobase/btr/btr0sea.c b/innobase/btr/btr0sea.c index 5e1c8401e28..5db737561aa 100644 --- a/innobase/btr/btr0sea.c +++ b/innobase/btr/btr0sea.c @@ -451,7 +451,9 @@ btr_search_info_update_slow( rw_lock_x_unlock(&btr_search_latch); } - if (build_index) { + if (build_index) { + ut_a(block->n_fields + block->n_bytes > 0); + btr_search_build_page_hash_index(block->frame, block->n_fields, block->n_bytes, @@ -676,6 +678,9 @@ btr_search_guess_on_hash( rw_lock_s_lock(&btr_search_latch); } + ut_a(btr_search_latch.writer != RW_LOCK_EX); + ut_a(btr_search_latch.reader_count > 0); + rec = ha_search_and_get_data(btr_search_sys->hash_index, fold); if (!rec) { @@ -902,7 +907,7 @@ btr_search_drop_page_hash_index( fold = rec_fold(rec, n_fields, n_bytes, tree_id); - if ((fold == prev_fold) && (prev_fold != 0)) { + if (fold == prev_fold && prev_fold != 0) { goto next_rec; } @@ -914,6 +919,7 @@ btr_search_drop_page_hash_index( n_cached++; next_rec: rec = page_rec_get_next(rec); + prev_fold = fold; } rw_lock_x_lock(&btr_search_latch); @@ -954,7 +960,7 @@ btr_search_drop_page_hash_when_freed( mtr_start(&mtr); /* We assume that if the caller has a latch on the page, - then the caller has already drooped the hash index for the page, + then the caller has already dropped the hash index for the page, and we never get here. Therefore we can acquire the s-latch to the page without fearing a deadlock. */ @@ -1177,6 +1183,8 @@ btr_search_move_or_delete_hash_entries( rw_lock_s_unlock(&btr_search_latch); + ut_a(n_fields + n_bytes > 0); + btr_search_build_page_hash_index(new_page, n_fields, n_bytes, side); ut_a(n_fields == block->curr_n_fields); @@ -1217,9 +1225,11 @@ btr_search_update_hash_on_delete( return; } + ut_a(block->curr_n_fields + block->curr_n_bytes > 0); + table = btr_search_sys->hash_index; - tree_id = ((cursor->index)->tree)->id; + tree_id = cursor->index->tree->id; fold = rec_fold(rec, block->curr_n_fields, block->curr_n_bytes, tree_id); @@ -1336,7 +1346,6 @@ btr_search_update_hash_on_insert( if (rec != page_get_infimum_rec(page)) { fold = rec_fold(rec, n_fields, n_bytes, tree_id); - } else { if (side == BTR_SEARCH_LEFT_SIDE) { @@ -1421,7 +1430,7 @@ btr_search_print_info(void) rw_lock_x_lock(&btr_search_latch); - ha_print_info(btr_search_sys->hash_index); +/* ha_print_info(btr_search_sys->hash_index); */ rw_lock_x_unlock(&btr_search_latch); } @@ -1487,11 +1496,71 @@ btr_search_validate(void) /*=====================*/ /* out: TRUE if ok */ { + buf_block_t* block; + page_t* page; + ha_node_t* node; + ulint n_page_dumps = 0; + ibool ok = TRUE; + ulint i; + char rec_str[500]; + rw_lock_x_lock(&btr_search_latch); + + for (i = 0; i < hash_get_n_cells(btr_search_sys->hash_index); i++) { + node = hash_get_nth_cell(btr_search_sys->hash_index, i)->node; + + while (node != NULL) { + block = buf_block_align(node->data); + page = buf_frame_align(node->data); + + if (!block->is_hashed + || node->fold != rec_fold((rec_t*)(node->data), + block->curr_n_fields, + block->curr_n_bytes, + btr_page_get_index_id(page))) { + ok = FALSE; + ut_print_timestamp(stderr); + + fprintf(stderr, +" InnoDB: Error in an adaptive hash index pointer to page %lu\n" +"ptr mem address %lu index id %lu %lu, node fold %lu, rec fold %lu\n", + buf_frame_get_page_no(page), + (ulint)(node->data), + ut_dulint_get_high(btr_page_get_index_id(page)), + ut_dulint_get_low(btr_page_get_index_id(page)), + node->fold, rec_fold((rec_t*)(node->data), + block->curr_n_fields, + block->curr_n_bytes, + btr_page_get_index_id(page))); + + rec_sprintf(rec_str, 450, (rec_t*)(node->data)); + + fprintf(stderr, + "InnoDB: Record %s\n" + "InnoDB: on that page.", rec_str); + + fprintf(stderr, +"Page mem address %lu, is hashed %lu, n fields %lu, n bytes %lu\n" +"side %lu\n", + (ulint)page, block->is_hashed, block->curr_n_fields, + block->curr_n_bytes, block->curr_side); + + if (n_page_dumps < 20) { + buf_page_print(page); + n_page_dumps++; + } + } + + node = node->next; + } + } - ut_a(ha_validate(btr_search_sys->hash_index)); + if (!ha_validate(btr_search_sys->hash_index)) { + + ok = FALSE; + } rw_lock_x_unlock(&btr_search_latch); - return(TRUE); + return(ok); } diff --git a/innobase/buf/buf0buf.c b/innobase/buf/buf0buf.c index 7d001a6953d..80e89e16588 100644 --- a/innobase/buf/buf0buf.c +++ b/innobase/buf/buf0buf.c @@ -1798,8 +1798,10 @@ buf_get_n_pending_ios(void) Prints info of the buffer i/o. */ void -buf_print_io(void) -/*==============*/ +buf_print_io( +/*=========*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end)/* in: buffer end */ { time_t current_time; double time_elapsed; @@ -1807,19 +1809,28 @@ buf_print_io(void) ut_ad(buf_pool); + if (buf_end - buf < 400) { + + return; + } + size = buf_pool_get_curr_size() / UNIV_PAGE_SIZE; mutex_enter(&(buf_pool->mutex)); - printf("Free list length %lu \n", UT_LIST_GET_LEN(buf_pool->free)); - printf("LRU list length %lu \n", UT_LIST_GET_LEN(buf_pool->LRU)); - printf("Flush list length %lu \n", + buf += sprintf(buf, + "Free list length %lu \n", UT_LIST_GET_LEN(buf_pool->free)); + buf += sprintf(buf, + "LRU list length %lu \n", UT_LIST_GET_LEN(buf_pool->LRU)); + buf += sprintf(buf, + "Flush list length %lu \n", UT_LIST_GET_LEN(buf_pool->flush_list)); - printf("Buffer pool size %lu\n", size); + buf += sprintf(buf, "Buffer pool size %lu\n", size); - printf("Pending reads %lu \n", buf_pool->n_pend_reads); + buf += sprintf(buf, "Pending reads %lu \n", buf_pool->n_pend_reads); - printf("Pending writes: LRU %lu, flush list %lu, single page %lu\n", + buf += sprintf(buf, + "Pending writes: LRU %lu, flush list %lu, single page %lu\n", buf_pool->n_flush[BUF_FLUSH_LRU], buf_pool->n_flush[BUF_FLUSH_LIST], buf_pool->n_flush[BUF_FLUSH_SINGLE_PAGE]); @@ -1829,10 +1840,10 @@ buf_print_io(void) buf_pool->last_printout_time = current_time; - printf("Pages read %lu, created %lu, written %lu\n", + buf += sprintf(buf, "Pages read %lu, created %lu, written %lu\n", buf_pool->n_pages_read, buf_pool->n_pages_created, buf_pool->n_pages_written); - printf("%.2f reads/s, %.2f creates/s, %.2f writes/s\n", + buf += sprintf(buf, "%.2f reads/s, %.2f creates/s, %.2f writes/s\n", (buf_pool->n_pages_read - buf_pool->n_pages_read_old) / time_elapsed, (buf_pool->n_pages_created - buf_pool->n_pages_created_old) @@ -1841,13 +1852,14 @@ buf_print_io(void) / time_elapsed); if (buf_pool->n_page_gets > buf_pool->n_page_gets_old) { - printf("Buffer pool hit rate %lu / 1000\n", + buf += sprintf(buf, "Buffer pool hit rate %lu / 1000\n", 1000 - ((1000 * (buf_pool->n_pages_read - buf_pool->n_pages_read_old)) / (buf_pool->n_page_gets - buf_pool->n_page_gets_old))); } else { - printf("No buffer pool activity since the last printout\n"); + buf += sprintf(buf, + "No buffer pool activity since the last printout\n"); } buf_pool->n_page_gets_old = buf_pool->n_page_gets; diff --git a/innobase/ha/ha0ha.c b/innobase/ha/ha0ha.c index 3e4473126cf..c3ad6cdca76 100644 --- a/innobase/ha/ha0ha.c +++ b/innobase/ha/ha0ha.c @@ -194,7 +194,7 @@ ha_delete( node = ha_search_with_data(table, fold, data); - ut_ad(node); + ut_a(node); ha_delete_hash_node(table, node); } @@ -232,6 +232,16 @@ ha_remove_all_nodes_to_page( node = ha_chain_get_next(table, node); } } + + /* Check that all nodes really got deleted */ + + node = ha_chain_get_first(table, fold); + + while (node) { + ut_a(buf_frame_align(ha_node_get_data(node)) != page); + + node = ha_chain_get_next(table, node); + } } /***************************************************************** @@ -245,6 +255,7 @@ ha_validate( { hash_cell_t* cell; ha_node_t* node; + ibool ok = TRUE; ulint i; for (i = 0; i < hash_get_n_cells(table); i++) { @@ -254,13 +265,21 @@ ha_validate( node = cell->node; while (node) { - ut_a(hash_calc_hash(node->fold, table) == i); + if (hash_calc_hash(node->fold, table) != i) { + ut_print_timestamp(stderr); + fprintf(stderr, +"InnoDB: Error: hash table node fold value %lu does not\n" +"InnoDB: match with the cell number %lu.\n", + node->fold, i); + + ok = FALSE; + } node = node->next; } } - return(TRUE); + return(ok); } /***************************************************************** @@ -269,16 +288,22 @@ Prints info of a hash table. */ void ha_print_info( /*==========*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end,/* in: buffer end */ hash_table_t* table) /* in: hash table */ { hash_cell_t* cell; - ha_node_t* node; +/* ha_node_t* node; */ ulint nodes = 0; ulint cells = 0; ulint len = 0; ulint max_len = 0; ulint i; + if (buf_end - buf < 200) { + return; + } + for (i = 0; i < hash_get_n_cells(table); i++) { cell = hash_get_nth_cell(table, i); @@ -286,7 +311,7 @@ ha_print_info( if (cell->node) { cells++; - +/* len = 0; node = cell->node; @@ -306,12 +331,10 @@ ha_print_info( if (len > max_len) { max_len = len; } +*/ } } - printf("Hash table size %lu, used cells %lu, nodes %lu\n", - hash_get_n_cells(table), cells, nodes); - printf("max chain length %lu\n", max_len); - - ut_a(ha_validate(table)); + buf += sprintf(buf, "Hash table size %lu, used cells %lu\n", + hash_get_n_cells(table), cells); } diff --git a/innobase/ibuf/ibuf0ibuf.c b/innobase/ibuf/ibuf0ibuf.c index f51a924c87f..2cbffadf6a9 100644 --- a/innobase/ibuf/ibuf0ibuf.c +++ b/innobase/ibuf/ibuf0ibuf.c @@ -2703,22 +2703,30 @@ ibuf_validate_low(void) Prints info of ibuf. */ void -ibuf_print(void) -/*============*/ +ibuf_print( +/*=======*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end)/* in: buffer end */ { ibuf_data_t* data; #ifdef UNIV_IBUF_DEBUG ulint i; #endif + if (buf_end - buf < 500) { + return; + } + mutex_enter(&ibuf_mutex); data = UT_LIST_GET_FIRST(ibuf->data_list); while (data) { - printf( + buf += sprintf(buf, "Ibuf for space %lu: size %lu, free list len %lu, seg size %lu,\n", data->space, data->size, data->free_list_len, data->seg_size); - printf("%lu inserts, %lu merged recs, %lu merges\n", + + buf += sprintf(buf, + "%lu inserts, %lu merged recs, %lu merges\n", data->n_inserts, data->n_merged_recs, data->n_merges); #ifdef UNIV_IBUF_DEBUG for (i = 0; i < IBUF_COUNT_N_PAGES; i++) { diff --git a/innobase/include/btr0cur.h b/innobase/include/btr0cur.h index 7af34deb30f..b01cbd9a875 100644 --- a/innobase/include/btr0cur.h +++ b/innobase/include/btr0cur.h @@ -710,6 +710,8 @@ allowed to free an inherited external field. */ extern ulint btr_cur_n_non_sea; extern ulint btr_cur_n_sea; +extern ulint btr_cur_n_non_sea_old; +extern ulint btr_cur_n_sea_old; #ifndef UNIV_NONINL #include "btr0cur.ic" diff --git a/innobase/include/buf0buf.h b/innobase/include/buf0buf.h index ca0692f1e17..b80ed96f54c 100644 --- a/innobase/include/buf0buf.h +++ b/innobase/include/buf0buf.h @@ -448,7 +448,7 @@ Prints info of the buffer pool data structure. */ void buf_print(void); -/*===========*/ +/*============*/ /************************************************************************* Returns the number of pending buf pool ios. */ @@ -459,8 +459,10 @@ buf_get_n_pending_ios(void); Prints info of the buffer i/o. */ void -buf_print_io(void); -/*==============*/ +buf_print_io( +/*=========*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end);/* in: buffer end */ /************************************************************************* Checks that all file pages in the buffer are in a replaceable state. */ diff --git a/innobase/include/ha0ha.h b/innobase/include/ha0ha.h index aeed7c32eff..945b1198a41 100644 --- a/innobase/include/ha0ha.h +++ b/innobase/include/ha0ha.h @@ -127,6 +127,8 @@ Prints info of a hash table. */ void ha_print_info( /*==========*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end,/* in: buffer end */ hash_table_t* table); /* in: hash table */ diff --git a/innobase/include/ibuf0ibuf.h b/innobase/include/ibuf0ibuf.h index fac28461be4..a290e90e4db 100644 --- a/innobase/include/ibuf0ibuf.h +++ b/innobase/include/ibuf0ibuf.h @@ -269,8 +269,10 @@ ibuf_count_get( Prints info of ibuf. */ void -ibuf_print(void); -/*============*/ +ibuf_print( +/*=======*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end);/* in: buffer end */ #define IBUF_HEADER_PAGE_NO FSP_IBUF_HEADER_PAGE_NO #define IBUF_TREE_ROOT_PAGE_NO FSP_IBUF_TREE_ROOT_PAGE_NO diff --git a/innobase/include/lock0lock.h b/innobase/include/lock0lock.h index 5a15b78b869..80afba97416 100644 --- a/innobase/include/lock0lock.h +++ b/innobase/include/lock0lock.h @@ -460,6 +460,8 @@ Prints info of a table lock. */ void lock_table_print( /*=============*/ + char* buf, /* in/out: buffer where to print, must be at least + 500 bytes */ lock_t* lock); /* in: table type lock */ /************************************************************************* Prints info of a record lock. */ @@ -467,13 +469,17 @@ Prints info of a record lock. */ void lock_rec_print( /*===========*/ + char* buf, /* in/out: buffer where to print, must be at least + 500 bytes */ lock_t* lock); /* in: record type lock */ /************************************************************************* Prints info of locks for all transactions. */ void -lock_print_info(void); -/*=================*/ +lock_print_info( +/*============*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end);/* in: buffer end */ /************************************************************************* Validates the lock queue on a table. */ diff --git a/innobase/include/log0log.h b/innobase/include/log0log.h index d4bd0036c5a..5d848b85658 100644 --- a/innobase/include/log0log.h +++ b/innobase/include/log0log.h @@ -493,8 +493,10 @@ log_block_convert_lsn_to_no( Prints info of the log. */ void -log_print(void); -/*===========*/ +log_print( +/*======*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end);/* in: buffer end */ extern log_t* log_sys; diff --git a/innobase/include/os0file.h b/innobase/include/os0file.h index d4d12e4a9d9..b7911c5014a 100644 --- a/innobase/include/os0file.h +++ b/innobase/include/os0file.h @@ -403,8 +403,10 @@ os_aio_validate(void); Prints info of the aio arrays. */ void -os_aio_print(void); -/*==============*/ +os_aio_print( +/*=========*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end);/* in: buffer end */ /************************************************************************** Checks that all slots in the system have been freed, that is, there are no pending io operations. */ diff --git a/innobase/include/rem0rec.ic b/innobase/include/rem0rec.ic index 6b96e3056fa..aaa3c58a003 100644 --- a/innobase/include/rem0rec.ic +++ b/innobase/include/rem0rec.ic @@ -970,8 +970,6 @@ rec_fold( ut_ad(n_fields <= rec_get_n_fields(rec)); ut_ad((n_fields < rec_get_n_fields(rec)) || (n_bytes == 0)); ut_ad(n_fields + n_bytes > 0); - /* Only the page supremum and infimum records have 1 field: */ - ut_ad(rec_get_n_fields(rec) > 1); n_fields_rec = rec_get_n_fields(rec); diff --git a/innobase/include/srv0srv.h b/innobase/include/srv0srv.h index 903dd9afc90..1f76974b03d 100644 --- a/innobase/include/srv0srv.h +++ b/innobase/include/srv0srv.h @@ -356,6 +356,14 @@ srv_error_monitor_thread( /* out: a dummy parameter */ void* arg); /* in: a dummy parameter required by os_thread_create */ +/********************************************************************** +Sprintfs to a buffer the output of the InnoDB Monitor. */ + +void +srv_sprintf_innodb_monitor( +/*=======================*/ + char* buf, /* in/out: buffer which must be at least 4 kB */ + ulint len); /* in: length of the buffer */ /* Types for the threads existing in the system. Threads of types 4 - 9 diff --git a/innobase/include/sync0arr.h b/innobase/include/sync0arr.h index f0134894997..765ad33afea 100644 --- a/innobase/include/sync0arr.h +++ b/innobase/include/sync0arr.h @@ -114,6 +114,8 @@ Prints info of the wait array. */ void sync_array_print_info( /*==================*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end,/* in: buffer end */ sync_array_t* arr); /* in: wait array */ diff --git a/innobase/include/sync0sync.h b/innobase/include/sync0sync.h index 4f55709a5d7..5bfa0bc2d48 100644 --- a/innobase/include/sync0sync.h +++ b/innobase/include/sync0sync.h @@ -117,14 +117,18 @@ FUNCTION PROTOTYPES FOR DEBUGGING */ Prints wait info of the sync system. */ void -sync_print_wait_info(void); -/*======================*/ +sync_print_wait_info( +/*=================*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end); /* in: buffer end */ /*********************************************************************** Prints info of the sync system. */ void -sync_print(void); -/*============*/ +sync_print( +/*=======*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end); /* in: buffer end */ /********************************************************************** Checks that the mutex has been initialized. */ diff --git a/innobase/include/trx0trx.h b/innobase/include/trx0trx.h index 090473f3a5a..83789966514 100644 --- a/innobase/include/trx0trx.h +++ b/innobase/include/trx0trx.h @@ -261,7 +261,9 @@ own the kernel mutex. */ void trx_print( /*======*/ - trx_t* trx); /* in: transaction */ + char* buf, /* in/out: buffer where to print, must be at least + 500 bytes */ + trx_t* trx); /* in: transaction */ /* Signal to a transaction */ diff --git a/innobase/lock/lock0lock.c b/innobase/lock/lock0lock.c index 1bdbf72bda6..f7ba49004d7 100644 --- a/innobase/lock/lock0lock.c +++ b/innobase/lock/lock0lock.c @@ -3326,34 +3326,37 @@ Prints info of a table lock. */ void lock_table_print( /*=============*/ + char* buf, /* in/out: buffer where to print, must be at least + 500 bytes */ lock_t* lock) /* in: table type lock */ { ut_ad(mutex_own(&kernel_mutex)); ut_a(lock_get_type(lock) == LOCK_TABLE); - printf("TABLE LOCK table %s trx id %lu %lu", + buf += sprintf(buf, "TABLE LOCK table %s trx id %lu %lu", lock->un_member.tab_lock.table->name, (lock->trx)->id.high, (lock->trx)->id.low); if (lock_get_mode(lock) == LOCK_S) { - printf(" lock mode S"); + buf += sprintf(buf, " lock mode S"); } else if (lock_get_mode(lock) == LOCK_X) { - printf(" lock_mode X"); + buf += sprintf(buf, " lock_mode X"); } else if (lock_get_mode(lock) == LOCK_IS) { - printf(" lock_mode IS"); + buf += sprintf(buf, " lock_mode IS"); } else if (lock_get_mode(lock) == LOCK_IX) { - printf(" lock_mode IX"); + buf += sprintf(buf, " lock_mode IX"); } else if (lock_get_mode(lock) == LOCK_AUTO_INC) { - printf(" lock_mode AUTO-INC"); + buf += sprintf(buf, " lock_mode AUTO-INC"); } else { - printf(" unknown lock_mode %lu", lock_get_mode(lock)); + buf += sprintf(buf, + " unknown lock_mode %lu", lock_get_mode(lock)); } if (lock_get_wait(lock)) { - printf(" waiting"); + buf += sprintf(buf, " waiting"); } - printf("\n"); + buf += sprintf(buf, "\n"); } /************************************************************************* @@ -3362,6 +3365,8 @@ Prints info of a record lock. */ void lock_rec_print( /*===========*/ + char* buf, /* in/out: buffer where to print, must be at least + 500 bytes */ lock_t* lock) /* in: record type lock */ { page_t* page; @@ -3369,8 +3374,7 @@ lock_rec_print( ulint page_no; ulint i; ulint count = 0; - ulint len; - char buf[200]; + char* buf_start = buf; mtr_t mtr; ut_ad(mutex_own(&kernel_mutex)); @@ -3379,32 +3383,32 @@ lock_rec_print( space = lock->un_member.rec_lock.space; page_no = lock->un_member.rec_lock.page_no; - printf("RECORD LOCKS space id %lu page no %lu n bits %lu", + buf += sprintf(buf, "RECORD LOCKS space id %lu page no %lu n bits %lu", space, page_no, lock_rec_get_n_bits(lock)); - printf(" table %s index %s trx id %lu %lu", + buf += sprintf(buf, " table %s index %s trx id %lu %lu", lock->index->table->name, lock->index->name, (lock->trx)->id.high, (lock->trx)->id.low); if (lock_get_mode(lock) == LOCK_S) { - printf(" lock mode S"); + buf += sprintf(buf, " lock mode S"); } else if (lock_get_mode(lock) == LOCK_X) { - printf(" lock_mode X"); + buf += sprintf(buf, " lock_mode X"); } else { ut_error; } if (lock_rec_get_gap(lock)) { - printf(" gap type lock"); + buf += sprintf(buf, " gap type lock"); } if (lock_get_wait(lock)) { - printf(" waiting"); + buf += sprintf(buf, " waiting"); } mtr_start(&mtr); - printf("\n"); + buf += sprintf(buf, "\n"); /* If the page is not in the buffer pool, we cannot load it because we have the kernel mutex and ibuf operations would @@ -3423,28 +3427,28 @@ lock_rec_print( for (i = 0; i < lock_rec_get_n_bits(lock); i++) { + if (buf - buf_start > 300) { + + buf += sprintf(buf, + "Suppressing further record lock prints for this page\n"); + return; + } + if (lock_rec_get_nth_bit(lock, i)) { - printf("Record lock, heap no %lu ", i); + buf += sprintf(buf, "Record lock, heap no %lu ", i); if (page) { - len = rec_sprintf(buf, 190, + buf += rec_sprintf(buf, 120, page_find_rec_with_heap_no(page, i)); - buf[len] = '\0'; - printf("%s", buf); + *buf = '\0'; } - printf("\n"); + buf += sprintf(buf, "\n"); count++; } - - if (count >= 3) { - printf( - "3 LOCKS PRINTED FOR THIS TRX AND PAGE: SUPPRESSING FURTHER PRINTS\n"); - goto end_prints; - } } -end_prints: + mtr_commit(&mtr); } @@ -3479,8 +3483,10 @@ lock_get_n_rec_locks(void) Prints info of locks for all transactions. */ void -lock_print_info(void) -/*=================*/ +lock_print_info( +/*============*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end)/* in: buffer end */ { lock_t* lock; trx_t* trx; @@ -3493,11 +3499,15 @@ lock_print_info(void) ulint i; mtr_t mtr; - printf("Trx id counter %lu %lu\n", + if (buf_end - buf < 600) { + return; + } + + buf += sprintf(buf, "Trx id counter %lu %lu\n", ut_dulint_get_high(trx_sys->max_trx_id), ut_dulint_get_low(trx_sys->max_trx_id)); - printf( + buf += sprintf(buf, "Purge done for trx's n:o < %lu %lu undo n:o < %lu %lu\n", ut_dulint_get_high(purge_sys->purge_trx_no), ut_dulint_get_low(purge_sys->purge_trx_no), @@ -3506,7 +3516,8 @@ lock_print_info(void) lock_mutex_enter_kernel(); - printf("Total number of lock structs in row lock hash table %lu\n", + buf += sprintf(buf, + "Total number of lock structs in row lock hash table %lu\n", lock_get_n_rec_locks()); /* First print info on non-active transactions */ @@ -3514,9 +3525,15 @@ lock_print_info(void) trx = UT_LIST_GET_FIRST(trx_sys->mysql_trx_list); while (trx) { + if (buf_end - buf < 600) { + return; + } + if (trx->conc_state == TRX_NOT_STARTED) { - printf("---"); - trx_print(trx); + buf += sprintf(buf, "---"); + trx_print(buf, trx); + + buf += strlen(buf); } trx = UT_LIST_GET_NEXT(mysql_trx_list, trx); @@ -3545,12 +3562,22 @@ loop: return; } + if (buf_end - buf < 600) { + return; + } + if (nth_lock == 0) { - printf("---"); - trx_print(trx); + buf += sprintf(buf, "---"); + trx_print(buf, trx); + buf += strlen(buf); + + if (buf_end - buf < 500) { + return; + } + if (trx->read_view) { - printf( + buf += sprintf(buf, "Trx read view will not see trx with id >= %lu %lu, sees < %lu %lu\n", ut_dulint_get_high(trx->read_view->low_limit_id), ut_dulint_get_low(trx->read_view->low_limit_id), @@ -3559,16 +3586,17 @@ loop: } if (trx->que_state == TRX_QUE_LOCK_WAIT) { - printf( + buf += sprintf(buf, "------------------TRX IS WAITING FOR THE LOCK:\n"); if (lock_get_type(trx->wait_lock) == LOCK_REC) { - lock_rec_print(trx->wait_lock); + lock_rec_print(buf, trx->wait_lock); } else { - lock_table_print(trx->wait_lock); + lock_table_print(buf, trx->wait_lock); } - printf( + buf += strlen(buf); + buf += sprintf(buf, "------------------\n"); } } @@ -3597,6 +3625,10 @@ loop: goto loop; } + if (buf_end - buf < 500) { + return; + } + if (lock_get_type(lock) == LOCK_REC) { space = lock->un_member.rec_lock.space; page_no = lock->un_member.rec_lock.page_no; @@ -3617,19 +3649,21 @@ loop: goto loop; } - lock_rec_print(lock); + lock_rec_print(buf, lock); } else { ut_ad(lock_get_type(lock) == LOCK_TABLE); - lock_table_print(lock); + lock_table_print(buf, lock); } + buf += strlen(buf); + load_page_first = TRUE; nth_lock++; if (nth_lock >= 10) { - printf( + buf += sprintf(buf, "10 LOCKS PRINTED FOR THIS TRX: SUPPRESSING FURTHER PRINTS\n"); nth_trx++; diff --git a/innobase/log/log0log.c b/innobase/log/log0log.c index d6e9deaa151..9d79c19a586 100644 --- a/innobase/log/log0log.c +++ b/innobase/log/log0log.c @@ -3081,15 +3081,22 @@ log_check_log_recs( Prints info of the log. */ void -log_print(void) -/*===========*/ +log_print( +/*======*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end)/* in: buffer end */ { double time_elapsed; time_t current_time; + if (buf_end - buf < 300) { + + return; + } + mutex_enter(&(log_sys->mutex)); - printf("Log sequence number %lu %lu\n" + buf += sprintf(buf, "Log sequence number %lu %lu\n" "Log flushed up to %lu %lu\n" "Last checkpoint at %lu %lu\n", ut_dulint_get_high(log_sys->lsn), @@ -3103,7 +3110,7 @@ log_print(void) time_elapsed = difftime(current_time, log_sys->last_printout_time); - printf( + buf += sprintf(buf, "%lu pending log writes, %lu pending chkp writes\n" "%lu log i/o's done, %.2f log i/o's/second\n", log_sys->n_pending_writes, diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c index e98b9e95cf7..34e13b80c58 100644 --- a/innobase/os/os0file.c +++ b/innobase/os/os0file.c @@ -1094,7 +1094,9 @@ os_file_write( fprintf(stderr, " InnoDB: Error: File pointer positioning to file %s failed at\n" -"InnoDB: offset %lu %lu. Operating system error number %lu.\n", +"InnoDB: offset %lu %lu. Operating system error number %lu.\n" +"InnoDB: Look from section 13.2 at http://www.innodb.com/ibman.html\n" +"InnoDB: what the error number means.\n", name, offset_high, offset, (ulint)GetLastError()); @@ -1125,8 +1127,10 @@ os_file_write( " InnoDB: Error: Write to file %s failed at offset %lu %lu.\n" "InnoDB: %lu bytes should have been written, only %lu were written.\n" "InnoDB: Operating system error number %lu.\n" +"InnoDB: Look from section 13.2 at http://www.innodb.com/ibman.html\n" +"InnoDB: what the error number means.\n" "InnoDB: Check that your OS and file system support files of this size.\n" -"InnoDB: Check also the disk is not full or a disk quota exceeded.\n", +"InnoDB: Check also that the disk is not full or a disk quota exceeded.\n", name, offset_high, offset, n, len, (ulint)GetLastError()); @@ -1152,8 +1156,10 @@ os_file_write( " InnoDB: Error: Write to file %s failed at offset %lu %lu.\n" "InnoDB: %lu bytes should have been written, only %lu were written.\n" "InnoDB: Operating system error number %lu.\n" +"InnoDB: Look from section 13.2 at http://www.innodb.com/ibman.html\n" +"InnoDB: what the error number means or use the perror program of MySQL.\n" "InnoDB: Check that your OS and file system support files of this size.\n" -"InnoDB: Check also the disk is not full or a disk quota exceeded.\n", +"InnoDB: Check also that the disk is not full or a disk quota exceeded.\n", name, offset_high, offset, n, (ulint)ret, (ulint)errno); os_has_said_disk_full = TRUE; @@ -1744,7 +1750,6 @@ os_aio( ut_ad(buf); ut_ad(n > 0); ut_ad(n % OS_FILE_LOG_BLOCK_SIZE == 0); - ut_ad((ulint)buf % OS_FILE_LOG_BLOCK_SIZE == 0) ut_ad(offset % OS_FILE_LOG_BLOCK_SIZE == 0); ut_ad(os_aio_validate()); @@ -2388,8 +2393,10 @@ os_aio_validate(void) Prints info of the aio arrays. */ void -os_aio_print(void) -/*==============*/ +os_aio_print( +/*=========*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end)/* in: buffer end */ { os_aio_array_t* array; os_aio_slot_t* slot; @@ -2399,12 +2406,17 @@ os_aio_print(void) double avg_bytes_read; ulint i; + if (buf_end - buf < 1000) { + + return; + } + for (i = 0; i < srv_n_file_io_threads; i++) { - printf("I/O thread %lu state: %s\n", i, + buf += sprintf(buf, "I/O thread %lu state: %s\n", i, srv_io_thread_op_info[i]); } - printf("Pending normal aio reads:"); + buf += sprintf(buf, "Pending normal aio reads:"); array = os_aio_read_array; loop: @@ -2431,12 +2443,12 @@ loop: ut_a(array->n_reserved == n_reserved); - printf(" %lu", n_reserved); + buf += sprintf(buf, " %lu", n_reserved); os_mutex_exit(array->mutex); if (array == os_aio_read_array) { - printf(", aio writes:"); + buf += sprintf(buf, ", aio writes:"); array = os_aio_write_array; @@ -2444,34 +2456,36 @@ loop: } if (array == os_aio_write_array) { - printf(",\n ibuf aio reads:"); + buf += sprintf(buf, ",\n ibuf aio reads:"); array = os_aio_ibuf_array; goto loop; } if (array == os_aio_ibuf_array) { - printf(", log i/o's:"); + buf += sprintf(buf, ", log i/o's:"); array = os_aio_log_array; goto loop; } if (array == os_aio_log_array) { - printf(", sync i/o's:"); + buf += sprintf(buf, ", sync i/o's:"); array = os_aio_sync_array; goto loop; } - printf("\n"); + buf += sprintf(buf, "\n"); current_time = time(NULL); time_elapsed = difftime(current_time, os_last_printout); - printf("Pending flushes (fsync) log: %lu; buffer pool: %lu\n", + buf += sprintf(buf, + "Pending flushes (fsync) log: %lu; buffer pool: %lu\n", fil_n_pending_log_flushes, fil_n_pending_tablespace_flushes); - printf("%lu OS file reads, %lu OS file writes, %lu OS fsyncs\n", + buf += sprintf(buf, + "%lu OS file reads, %lu OS file writes, %lu OS fsyncs\n", os_n_file_reads, os_n_file_writes, os_n_fsyncs); if (os_n_file_reads == os_n_file_reads_old) { @@ -2481,7 +2495,7 @@ loop: (os_n_file_reads - os_n_file_reads_old); } - printf( + buf += sprintf(buf, "%.2f reads/s, %lu avg bytes/read, %.2f writes/s, %.2f fsyncs/s\n", (os_n_file_reads - os_n_file_reads_old) / time_elapsed, diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index b05476e0a3d..638df1b6380 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -2416,6 +2416,14 @@ row_check_table_for_mysql( index = dict_table_get_next_index(index); } + /* We validate also the whole adaptive hash index for all tables + at every CHECK TABLE */ + + if (!btr_search_validate()) { + + ret = DB_ERROR; + } + prebuilt->trx->op_info = ""; return(ret); diff --git a/innobase/row/row0umod.c b/innobase/row/row0umod.c index 9e8ba87fc2f..bbffda39352 100644 --- a/innobase/row/row0umod.c +++ b/innobase/row/row0umod.c @@ -437,11 +437,12 @@ row_undo_mod_del_unmark_sec( rec_sprintf(err_buf, 900, btr_pcur_get_rec(&pcur)); fprintf(stderr, "InnoDB: record %s\n", err_buf); + trx_print(err_buf, thr_get_trx(thr)); fprintf(stderr, - "InnoDB: Make a detailed bug report and send it\n"); + "%s\nInnoDB: Make a detailed bug report and send it\n", + err_buf); fprintf(stderr, "InnoDB: to mysql@lists.mysql.com\n"); - trx_print(thr_get_trx(thr)); } else { btr_cur = btr_pcur_get_btr_cur(&pcur); diff --git a/innobase/row/row0upd.c b/innobase/row/row0upd.c index 77af2390786..6eaab79060e 100644 --- a/innobase/row/row0upd.c +++ b/innobase/row/row0upd.c @@ -1095,11 +1095,12 @@ row_upd_sec_index_entry( rec_sprintf(err_buf, 900, rec); fprintf(stderr, "InnoDB: record %s\n", err_buf); + trx_print(err_buf, thr_get_trx(thr)); + fprintf(stderr, - "InnoDB: Make a detailed bug report and send it\n"); + "%s\nInnoDB: Make a detailed bug report and send it\n", + err_buf); fprintf(stderr, "InnoDB: to mysql@lists.mysql.com\n"); - - trx_print(thr_get_trx(thr)); } else { /* Delete mark the old index record; it can already be delete marked if we return after a lock wait in diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index 19e2b08d5a6..81b3333cbe8 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -272,6 +272,8 @@ i/o handler thread */ char* srv_io_thread_op_info[SRV_MAX_N_IO_THREADS]; +time_t srv_last_monitor_time; + /* IMPLEMENTATION OF THE SERVER MAIN PROGRAM ========================================= @@ -2131,106 +2133,106 @@ srv_release_mysql_thread_if_suspended( /* not found */ } -/************************************************************************* -A thread which wakes up threads whose lock wait may have lasted too long. -This also prints the info output by various InnoDB monitors. */ +/********************************************************************** +Sprintfs to a buffer the output of the InnoDB Monitor. */ -#ifndef __WIN__ -void* -#else -ulint -#endif -srv_lock_timeout_and_monitor_thread( -/*================================*/ - /* out: a dummy parameter */ - void* arg) /* in: a dummy parameter required by - os_thread_create */ +void +srv_sprintf_innodb_monitor( +/*=======================*/ + char* buf, /* in/out: buffer which must be at least 4 kB */ + ulint len) /* in: length of the buffer */ { - srv_slot_t* slot; - double time_elapsed; - time_t current_time; - time_t last_monitor_time; - time_t last_table_monitor_time; - ibool some_waits; - double wait_time; - ulint i; + char* buf_end = buf + len - 2000; + double time_elapsed; + time_t current_time; - UT_NOT_USED(arg); - last_monitor_time = time(NULL); - last_table_monitor_time = time(NULL); -loop: - srv_lock_timeout_and_monitor_active = TRUE; - - /* When someone is waiting for a lock, we wake up every second - and check if a timeout has passed for a lock wait */ - - os_thread_sleep(1000000); + current_time = time(NULL); - /* In case mutex_exit is not a memory barrier, it is - theoretically possible some threads are left waiting though - the semaphore is already released. Wake up those threads: */ - - sync_arr_wake_threads_if_sema_free(); + time_elapsed = difftime(current_time, srv_last_monitor_time); - current_time = time(NULL); + srv_last_monitor_time = time(NULL); - time_elapsed = difftime(current_time, last_monitor_time); - - if (time_elapsed > 15) { + ut_a(len >= 4096); - if (srv_print_innodb_monitor) { + buf += sprintf(buf, "\n=====================================\n"); - last_monitor_time = time(NULL); + ut_sprintf_timestamp(buf); + buf = buf + strlen(buf); - printf("=====================================\n"); - ut_print_timestamp(stdout); - - printf(" INNODB MONITOR OUTPUT\n" + buf += sprintf(buf, " INNODB MONITOR OUTPUT\n" "=====================================\n"); - printf("----------\n" + + buf += sprintf(buf, +"Per second values calculated from the last %lu seconds\n", + (ulint)time_elapsed); + + buf += sprintf(buf, "----------\n" "SEMAPHORES\n" "----------\n"); - sync_print(); - printf("------------\n" + sync_print(buf, buf_end); + + buf = buf + strlen(buf); + + buf += sprintf(buf, "------------\n" "TRANSACTIONS\n" "------------\n"); - lock_print_info(); - printf("--------\n" + lock_print_info(buf, buf_end); + buf = buf + strlen(buf); + + buf += sprintf(buf, "--------\n" "FILE I/O\n" "--------\n"); - os_aio_print(); - printf("-------------------------------------\n" + os_aio_print(buf, buf_end); + buf = buf + strlen(buf); + + buf += sprintf(buf, "-------------------------------------\n" "INSERT BUFFER AND ADAPTIVE HASH INDEX\n" "-------------------------------------\n"); - ibuf_print(); - printf("Successful hash searches %lu, non-hash searches %lu\n", - btr_cur_n_sea, btr_cur_n_non_sea); - printf("---\n" + ibuf_print(buf, buf_end); + buf = buf + strlen(buf); + + ha_print_info(buf, buf_end, btr_search_sys->hash_index); + buf = buf + strlen(buf); + + buf += sprintf(buf, + "%.2f hash searches/s, %.2f non-hash searches/s\n", + (btr_cur_n_sea - btr_cur_n_sea_old) + / time_elapsed, + (btr_cur_n_non_sea - btr_cur_n_non_sea_old) + / time_elapsed); + btr_cur_n_sea_old = btr_cur_n_sea; + btr_cur_n_non_sea_old = btr_cur_n_non_sea; + + buf += sprintf(buf,"---\n" "LOG\n" "---\n"); - log_print(); - printf("----------------------\n" + log_print(buf, buf_end); + buf = buf + strlen(buf); + + buf += sprintf(buf, "----------------------\n" "BUFFER POOL AND MEMORY\n" "----------------------\n"); - printf( + buf += sprintf(buf, "Total memory allocated %lu; in additional pool allocated %lu\n", ut_total_allocated_memory, mem_pool_get_reserved(mem_comm_pool)); - buf_print_io(); - printf("--------------\n" + buf_print_io(buf, buf_end); + buf = buf + strlen(buf); + + buf += sprintf(buf, "--------------\n" "ROW OPERATIONS\n" "--------------\n"); - printf( + buf += sprintf(buf, "%ld queries inside InnoDB, %ld queries in queue; main thread: %s\n", srv_conc_n_threads, srv_conc_n_waiting_threads, srv_main_thread_op_info); - printf( + buf += sprintf(buf, "Number of rows inserted %lu, updated %lu, deleted %lu, read %lu\n", srv_n_rows_inserted, srv_n_rows_updated, srv_n_rows_deleted, srv_n_rows_read); - printf( + buf += sprintf(buf, "%.2f inserts/s, %.2f updates/s, %.2f deletes/s, %.2f reads/s\n", (srv_n_rows_inserted - srv_n_rows_inserted_old) / time_elapsed, @@ -2246,9 +2248,70 @@ loop: srv_n_rows_deleted_old = srv_n_rows_deleted; srv_n_rows_read_old = srv_n_rows_read; - printf("----------------------------\n" + buf += sprintf(buf, "----------------------------\n" "END OF INNODB MONITOR OUTPUT\n" "============================\n"); +} + +/************************************************************************* +A thread which wakes up threads whose lock wait may have lasted too long. +This also prints the info output by various InnoDB monitors. */ + +#ifndef __WIN__ +void* +#else +ulint +#endif +srv_lock_timeout_and_monitor_thread( +/*================================*/ + /* out: a dummy parameter */ + void* arg) /* in: a dummy parameter required by + os_thread_create */ +{ + srv_slot_t* slot; + double time_elapsed; + time_t current_time; + time_t last_table_monitor_time; + time_t last_monitor_time; + ibool some_waits; + double wait_time; + char* buf; + ulint i; + + UT_NOT_USED(arg); + srv_last_monitor_time = time(NULL); + last_table_monitor_time = time(NULL); + last_monitor_time = time(NULL); +loop: + srv_lock_timeout_and_monitor_active = TRUE; + + /* When someone is waiting for a lock, we wake up every second + and check if a timeout has passed for a lock wait */ + + os_thread_sleep(1000000); + + /* In case mutex_exit is not a memory barrier, it is + theoretically possible some threads are left waiting though + the semaphore is already released. Wake up those threads: */ + + sync_arr_wake_threads_if_sema_free(); + + current_time = time(NULL); + + time_elapsed = difftime(current_time, last_monitor_time); + + if (time_elapsed > 15) { + last_monitor_time = time(NULL); + + if (srv_print_innodb_monitor) { + + buf = mem_alloc(100000); + + srv_sprintf_innodb_monitor(buf, 100000); + + printf("%s", buf); + + mem_free(buf); } if (srv_print_innodb_tablespace_monitor @@ -2380,7 +2443,13 @@ loop: srv_error_monitor_active = TRUE; os_thread_sleep(10000000); + /* + printf("Validating has index\n"); + + btr_search_validate(); + printf("Hash index validated\n"); + */ sync_array_print_long_waits(); /* Flush stdout and stderr so that a database user gets their output diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c index ff4c4f021b0..9768d484ce6 100644 --- a/innobase/srv/srv0start.c +++ b/innobase/srv/srv0start.c @@ -896,7 +896,7 @@ test_measure_cont( "Mutex res. l %lu, p %lu, k %lu s x %lu s s %lu s mut %lu of %lu\n", lcount, pcount, kcount, s_xcount, s_scount, s_mcount, j); - sync_print_wait_info(); +/* sync_print_wait_info(); */ fprintf(stderr, "log i/o %lu n non sea %lu n succ %lu n h fail %lu\n", diff --git a/innobase/sync/sync0arr.c b/innobase/sync/sync0arr.c index 7788b104120..81b5b7de195 100644 --- a/innobase/sync/sync0arr.c +++ b/innobase/sync/sync0arr.c @@ -441,7 +441,8 @@ static void sync_array_cell_print( /*==================*/ - FILE* file, /* in: file where to print */ + char* buf, /* in: buffer where to print, must be + at least 400 characters */ sync_cell_t* cell) /* in: sync cell */ { mutex_t* mutex; @@ -451,7 +452,7 @@ sync_array_cell_print( type = cell->request_type; - fprintf(file, + buf += sprintf(buf, "--Thread %lu has waited at %s line %lu for %.2f seconds the semaphore:\n", (ulint)cell->thread, cell->file, cell->line, difftime(time(NULL), cell->reservation_time)); @@ -461,54 +462,58 @@ sync_array_cell_print( been freed meanwhile */ mutex = cell->old_wait_mutex; - fprintf(file, + buf += sprintf(buf, "Mutex at %lx created file %s line %lu, lock var %lu\n", (ulint)mutex, mutex->cfile_name, mutex->cline, mutex->lock_word); - fprintf(file, + buf += sprintf(buf, "Last time reserved in file %s line %lu, waiters flag %lu\n", mutex->file_name, mutex->line, mutex->waiters); } else if (type == RW_LOCK_EX || type == RW_LOCK_SHARED) { if (type == RW_LOCK_EX) { - fprintf(file, "X-lock on"); + buf += sprintf(buf, "X-lock on"); } else { - fprintf(file, "S-lock on"); + buf += sprintf(buf, "S-lock on"); } rwlock = cell->old_wait_rw_lock; - fprintf(file, " RW-latch at %lx created in file %s line %lu\n", + buf += sprintf(buf, + " RW-latch at %lx created in file %s line %lu\n", (ulint)rwlock, rwlock->cfile_name, rwlock->cline); if (rwlock->writer != RW_LOCK_NOT_LOCKED) { - fprintf(file, + buf += sprintf(buf, "a writer (thread id %lu) has reserved it in mode", (ulint)rwlock->writer_thread); if (rwlock->writer == RW_LOCK_EX) { - fprintf(file, " exclusive\n"); + buf += sprintf(buf, " exclusive\n"); } else { - fprintf(file, " wait exclusive\n"); + buf += sprintf(buf, " wait exclusive\n"); } } - fprintf(file, "number of readers %lu, waiters flag %lu\n", + buf += sprintf(buf, + "number of readers %lu, waiters flag %lu\n", rwlock->reader_count, rwlock->waiters); - fprintf(file, "Last time read locked in file %s line %lu\n", + buf += sprintf(buf, + "Last time read locked in file %s line %lu\n", rwlock->last_s_file_name, rwlock->last_s_line); - fprintf(file, "Last time write locked in file %s line %lu\n", + buf += sprintf(buf, + "Last time write locked in file %s line %lu\n", rwlock->last_x_file_name, rwlock->last_x_line); } else { ut_error; } if (!cell->waiting) { - fprintf(file, "wait has ended\n"); + buf += sprintf(buf, "wait has ended\n"); } if (cell->event_set) { - fprintf(file, "wait is ending\n"); + buf += sprintf(buf, "wait is ending\n"); } } @@ -610,6 +615,7 @@ sync_array_detect_deadlock( os_thread_id_t thread; ibool ret; rw_lock_debug_t* debug; + char buf[500]; ut_a(arr && start && cell); ut_ad(cell->wait_object); @@ -642,11 +648,12 @@ sync_array_detect_deadlock( ret = sync_array_deadlock_step(arr, start, thread, 0, depth); if (ret) { + sync_array_cell_print(buf, cell); printf( - "Mutex %lx owned by thread %lu file %s line %lu\n", + "Mutex %lx owned by thread %lu file %s line %lu\n%s", (ulint)mutex, mutex->thread_id, - mutex->file_name, mutex->line); - sync_array_cell_print(stdout, cell); + mutex->file_name, mutex->line, + buf); return(TRUE); } } @@ -678,9 +685,9 @@ sync_array_detect_deadlock( debug->pass, depth); if (ret) { - printf("rw-lock %lx ", (ulint) lock); + sync_array_cell_print(buf, cell); + printf("rw-lock %lx %s ", (ulint) lock, buf); rw_lock_debug_print(debug); - sync_array_cell_print(stdout, cell); return(TRUE); } @@ -711,9 +718,9 @@ sync_array_detect_deadlock( debug->pass, depth); if (ret) { - printf("rw-lock %lx ", (ulint) lock); + sync_array_cell_print(buf, cell); + printf("rw-lock %lx %s ", (ulint) lock, buf); rw_lock_debug_print(debug); - sync_array_cell_print(stdout, cell); return(TRUE); } @@ -898,6 +905,7 @@ sync_array_print_long_waits(void) sync_cell_t* cell; ibool old_val; ibool noticed = FALSE; + char buf[500]; ulint i; for (i = 0; i < sync_primary_wait_array->n_cells; i++) { @@ -907,9 +915,10 @@ sync_array_print_long_waits(void) if (cell->wait_object != NULL && difftime(time(NULL), cell->reservation_time) > 240) { + sync_array_cell_print(buf, cell); + fprintf(stderr, - "InnoDB: Warning: a long semaphore wait:\n"); - sync_array_cell_print(stderr, cell); + "InnoDB: Warning: a long semaphore wait:\n%s", buf); noticed = TRUE; } @@ -948,6 +957,8 @@ static void sync_array_output_info( /*===================*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end,/* in: buffer end */ sync_array_t* arr) /* in: wait array; NOTE! caller must own the mutex */ { @@ -955,18 +966,29 @@ sync_array_output_info( ulint count; ulint i; - printf("OS WAIT ARRAY INFO: reservation count %ld, signal count %ld\n", + if (buf_end - buf < 500) { + return; + } + + buf += sprintf(buf, + "OS WAIT ARRAY INFO: reservation count %ld, signal count %ld\n", arr->res_count, arr->sg_count); i = 0; count = 0; while (count < arr->n_reserved) { + if (buf_end - buf < 500) { + return; + } + cell = sync_array_get_nth_cell(arr, i); if (cell->wait_object != NULL) { count++; - sync_array_cell_print(stdout, cell); + sync_array_cell_print(buf, cell); + + buf = buf + strlen(buf); } i++; @@ -979,11 +1001,13 @@ Prints info of the wait array. */ void sync_array_print_info( /*==================*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end,/* in: buffer end */ sync_array_t* arr) /* in: wait array */ { sync_array_enter(arr); - sync_array_output_info(arr); + sync_array_output_info(buf, buf_end, arr); sync_array_exit(arr); } diff --git a/innobase/sync/sync0sync.c b/innobase/sync/sync0sync.c index f5b4e35e8d2..c070e97f692 100644 --- a/innobase/sync/sync0sync.c +++ b/innobase/sync/sync0sync.c @@ -874,6 +874,7 @@ sync_thread_levels_empty_gen( sync_level_t* slot; rw_lock_t* lock; mutex_t* mutex; + char* buf; ulint i; if (!sync_order_checks_on) { @@ -907,7 +908,9 @@ sync_thread_levels_empty_gen( mutex = slot->latch; mutex_exit(&sync_thread_mutex); - sync_print(); + buf = mem_alloc(20000); + + sync_print(buf, buf + 18000); ut_error; return(FALSE); @@ -1243,14 +1246,21 @@ sync_close(void) Prints wait info of the sync system. */ void -sync_print_wait_info(void) -/*======================*/ +sync_print_wait_info( +/*=================*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end) /* in: buffer end */ { #ifdef UNIV_SYNC_DEBUG printf("Mutex exits %lu, rws exits %lu, rwx exits %lu\n", mutex_exit_count, rw_s_exit_count, rw_x_exit_count); #endif - printf( + if (buf_end - buf < 500) { + + return; + } + + sprintf(buf, "Mutex spin waits %lu, rounds %lu, OS waits %lu\n" "RW-shared spins %lu, OS waits %lu; RW-excl spins %lu, OS waits %lu\n", mutex_spin_wait_count, mutex_spin_round_count, @@ -1263,11 +1273,18 @@ sync_print_wait_info(void) Prints info of the sync system. */ void -sync_print(void) -/*============*/ +sync_print( +/*=======*/ + char* buf, /* in/out: buffer where to print */ + char* buf_end) /* in: buffer end */ { mutex_list_print_info(); + rw_lock_list_print_info(); - sync_array_print_info(sync_primary_wait_array); - sync_print_wait_info(); + + sync_array_print_info(buf, buf_end, sync_primary_wait_array); + + buf = buf + strlen(buf); + + sync_print_wait_info(buf, buf_end); } diff --git a/innobase/trx/trx0trx.c b/innobase/trx/trx0trx.c index 9c49abbd287..c2d99424d33 100644 --- a/innobase/trx/trx0trx.c +++ b/innobase/trx/trx0trx.c @@ -26,9 +26,11 @@ Created 3/26/1996 Heikki Tuuri /* Copy of the prototype for innobase_mysql_print_thd: this -copy must be equal to the one in mysql/sql/ha_innobase.cc ! */ +copy MUST be equal to the one in mysql/sql/ha_innobase.cc ! */ -void innobase_mysql_print_thd(void* thd); +void innobase_mysql_print_thd( + char* buf, + void* thd); /* Dummy session used currently in MySQL interface */ sess_t* trx_dummy_sess = NULL; @@ -1459,54 +1461,63 @@ own the kernel mutex. */ void trx_print( /*======*/ + char* buf, /* in/out: buffer where to print, must be at least + 500 bytes */ trx_t* trx) /* in: transaction */ { - printf("TRANSACTION %lu %lu, OS thread id %lu", + buf += sprintf(buf, "TRANSACTION %lu %lu, OS thread id %lu", ut_dulint_get_high(trx->id), ut_dulint_get_low(trx->id), (ulint)trx->mysql_thread_id); if (ut_strlen(trx->op_info) > 0) { - printf(" %s", trx->op_info); + buf += sprintf(buf, " %s", trx->op_info); } if (trx->type != TRX_USER) { - printf(" purge trx"); + buf += sprintf(buf, " purge trx"); } switch (trx->conc_state) { - case TRX_NOT_STARTED: printf(", not started"); break; - case TRX_ACTIVE: printf(", active"); break; - case TRX_COMMITTED_IN_MEMORY: printf(", committed in memory"); + case TRX_NOT_STARTED: buf += sprintf(buf, + ", not started"); break; + case TRX_ACTIVE: buf += sprintf(buf, + ", active"); break; + case TRX_COMMITTED_IN_MEMORY: buf += sprintf(buf, + ", committed in memory"); break; - default: printf(" state %lu", trx->conc_state); + default: buf += sprintf(buf, " state %lu", trx->conc_state); } switch (trx->que_state) { - case TRX_QUE_RUNNING: printf(", runs or sleeps"); break; - case TRX_QUE_LOCK_WAIT: printf(", lock wait"); break; - case TRX_QUE_ROLLING_BACK: printf(", rolling back"); break; - case TRX_QUE_COMMITTING: printf(", committing"); break; - default: printf(" que state %lu", trx->que_state); + case TRX_QUE_RUNNING: buf += sprintf(buf, + ", runs or sleeps"); break; + case TRX_QUE_LOCK_WAIT: buf += sprintf(buf, + ", lock wait"); break; + case TRX_QUE_ROLLING_BACK: buf += sprintf(buf, + ", rolling back"); break; + case TRX_QUE_COMMITTING: buf += sprintf(buf, + ", committing"); break; + default: buf += sprintf(buf, " que state %lu", trx->que_state); } if (0 < UT_LIST_GET_LEN(trx->trx_locks)) { - printf(", has %lu lock struct(s)", + buf += sprintf(buf, ", has %lu lock struct(s)", UT_LIST_GET_LEN(trx->trx_locks)); } if (trx->has_search_latch) { - printf(", holds adaptive hash latch"); + buf += sprintf(buf, ", holds adaptive hash latch"); } if (ut_dulint_cmp(trx->undo_no, ut_dulint_zero) != 0) { - printf(", undo log entries %lu", + buf += sprintf(buf, ", undo log entries %lu", ut_dulint_get_low(trx->undo_no)); } - printf("\n"); + buf += sprintf(buf, "\n"); if (trx->mysql_thd != NULL) { - innobase_mysql_print_thd(trx->mysql_thd); + innobase_mysql_print_thd(buf, trx->mysql_thd); } } diff --git a/sql/ha_innobase.cc b/sql/ha_innobase.cc index 0975cdce290..f5b80241f9a 100644 --- a/sql/ha_innobase.cc +++ b/sql/ha_innobase.cc @@ -269,35 +269,37 @@ the prototype for this function! */ void innobase_mysql_print_thd( /*=====================*/ + char* buf, /* in/out: buffer where to print, must be at least + 300 bytes */ void* input_thd)/* in: pointer to a MySQL THD object */ { THD* thd; thd = (THD*) input_thd; - printf("MySQL thread id %lu, query id %lu", + buf += sprintf(buf, "MySQL thread id %lu, query id %lu", thd->thread_id, thd->query_id); if (thd->host) { - printf(" %s", thd->host); + buf += sprintf(buf, " %.30s", thd->host); } if (thd->ip) { - printf(" %s", thd->ip); + buf += sprintf(buf, " %.20s", thd->ip); } if (thd->user) { - printf(" %s", thd->user); + buf += sprintf(buf, " %.20s", thd->user); } if (thd->proc_info) { - printf(" %s", thd->proc_info); + buf += sprintf(buf, " %.50s", thd->proc_info); } if (thd->query) { - printf("\n%.100s", thd->query); + buf += sprintf(buf, "\n%.150s", thd->query); } - printf("\n"); + buf += sprintf(buf, "\n"); } } @@ -314,10 +316,12 @@ check_trx_exists( { trx_t* trx; + ut_a(thd == current_thd); + trx = (trx_t*) thd->transaction.all.innobase_tid; if (trx == NULL) { - dbug_assert(thd != NULL); + ut_a(thd != NULL); trx = trx_allocate_for_mysql(); trx->mysql_thd = thd; @@ -368,7 +372,7 @@ ha_innobase::update_thd( { row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt; trx_t* trx; - + trx = check_trx_exists(thd); if (prebuilt->trx != trx) { @@ -1378,6 +1382,9 @@ ha_innobase::write_row( DBUG_ENTER("ha_innobase::write_row"); + ut_a(prebuilt->trx == + (trx_t*) current_thd->transaction.all.innobase_tid); + statistic_increment(ha_write_count, &LOCK_status); if (table->time_stamp) { @@ -1718,6 +1725,9 @@ ha_innobase::update_row( DBUG_ENTER("ha_innobase::update_row"); + ut_a(prebuilt->trx == + (trx_t*) current_thd->transaction.all.innobase_tid); + if (table->time_stamp) { update_timestamp(new_row + table->time_stamp - 1); } @@ -1775,6 +1785,9 @@ ha_innobase::delete_row( DBUG_ENTER("ha_innobase::delete_row"); + ut_a(prebuilt->trx == + (trx_t*) current_thd->transaction.all.innobase_tid); + if (last_query_id != user_thd->query_id) { prebuilt->sql_stat_start = TRUE; last_query_id = user_thd->query_id; @@ -1888,6 +1901,10 @@ ha_innobase::index_read( ulint ret; DBUG_ENTER("index_read"); + + ut_a(prebuilt->trx == + (trx_t*) current_thd->transaction.all.innobase_tid); + statistic_increment(ha_read_key_count, &LOCK_status); if (last_query_id != user_thd->query_id) { @@ -2062,6 +2079,9 @@ ha_innobase::general_fetch( DBUG_ENTER("general_fetch"); + ut_a(prebuilt->trx == + (trx_t*) current_thd->transaction.all.innobase_tid); + srv_conc_enter_innodb(prebuilt->trx); ret = row_search_for_mysql((byte*)buf, 0, prebuilt, match_mode, @@ -2272,6 +2292,9 @@ ha_innobase::rnd_pos( DBUG_ENTER("rnd_pos"); statistic_increment(ha_read_rnd_count, &LOCK_status); + ut_a(prebuilt->trx == + (trx_t*) current_thd->transaction.all.innobase_tid); + if (prebuilt->clust_index_was_generated) { /* No primary key was defined for the table and we generated the clustered index from the row id: the @@ -2310,6 +2333,9 @@ ha_innobase::position( row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt; uint len; + ut_a(prebuilt->trx == + (trx_t*) current_thd->transaction.all.innobase_tid); + if (prebuilt->clust_index_was_generated) { /* No primary key was defined for the table and we generated the clustered index from row id: the @@ -3067,6 +3093,8 @@ ha_innobase::check( ulint ret; ut_a(prebuilt->trx && prebuilt->trx->magic_n == TRX_MAGIC_N); + ut_a(prebuilt->trx == + (trx_t*) current_thd->transaction.all.innobase_tid); if (prebuilt->mysql_template == NULL) { /* Build the template; we will use a dummy template @@ -3301,6 +3329,51 @@ ha_innobase::external_lock( DBUG_RETURN(error); } +/**************************************************************************** +Implements the SHOW INNODB STATUS command. Send the output of the InnoDB +Monitor to the client. */ + +int +innodb_show_status( +/*===============*/ + THD* thd) /* in: the MySQL query thread of the caller */ +{ + String* packet = &thd->packet; + char* buf; + + DBUG_ENTER("innodb_show_status"); + + /* We let the InnoDB Monitor to output at most 100 kB of text */ + buf = (char*)ut_malloc(100 * 1024); + + srv_sprintf_innodb_monitor(buf, 100 * 1024); + + List field_list; + + field_list.push_back(new Item_empty_string("Status", strlen(buf))); + + if(send_fields(thd, field_list, 1)) { + DBUG_RETURN(-1); + } + + packet->length(0); + + net_store_data(packet, buf); + + if (my_net_write(&thd->net, (char*)thd->packet.ptr(), + packet->length())) { + ut_free(buf); + + DBUG_RETURN(-1); + } + + ut_free(buf); + + send_eof(&thd->net); + + DBUG_RETURN(0); +} + /**************************************************************************** Handling the shared INNOBASE_SHARE structure that is needed to provide table locking. @@ -3424,6 +3497,9 @@ ha_innobase::get_auto_increment() longlong nr; int error; + ut_a(prebuilt->trx == + (trx_t*) current_thd->transaction.all.innobase_tid); + /* Also SHOW TABLE STATUS calls this function. Previously, when we did always read the max autoinc key value, setting x-locks, users were surprised that SHOW TABLE STATUS could end up in a deadlock with diff --git a/sql/ha_innobase.h b/sql/ha_innobase.h index 9f752dd2eda..aa497132b25 100644 --- a/sql/ha_innobase.h +++ b/sql/ha_innobase.h @@ -195,4 +195,5 @@ int innobase_report_binlog_offset_and_commit( int innobase_rollback(THD *thd, void* trx_handle); int innobase_close_connection(THD *thd); int innobase_drop_database(char *path); +int innodb_show_status(THD* thd); diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 4d9336afb1d..a810219da15 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -3155,6 +3155,7 @@ struct show_var_st status_vars[]= { {"Com_show_processlist", (char*) (com_stat+(uint) SQLCOM_SHOW_PROCESSLIST),SHOW_LONG}, {"Com_show_slave_status", (char*) (com_stat+(uint) SQLCOM_SHOW_SLAVE_STAT),SHOW_LONG}, {"Com_show_status", (char*) (com_stat+(uint) SQLCOM_SHOW_STATUS),SHOW_LONG}, + {"Com_show_innodb_status", (char*) (com_stat+(uint) SQLCOM_SHOW_INNODB_STATUS),SHOW_LONG}, {"Com_show_tables", (char*) (com_stat+(uint) SQLCOM_SHOW_TABLES),SHOW_LONG}, {"Com_show_variables", (char*) (com_stat+(uint) SQLCOM_SHOW_VARIABLES),SHOW_LONG}, {"Com_slave_start", (char*) (com_stat+(uint) SQLCOM_SLAVE_START),SHOW_LONG}, diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 2b889d356bb..7d1df04b852 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -40,6 +40,7 @@ enum enum_sql_command { SQLCOM_SHOW_DATABASES, SQLCOM_SHOW_TABLES, SQLCOM_SHOW_FIELDS, SQLCOM_SHOW_KEYS, SQLCOM_SHOW_VARIABLES, SQLCOM_SHOW_LOGS, SQLCOM_SHOW_STATUS, + SQLCOM_SHOW_INNODB_STATUS, SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT, SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE, diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 21590f743a5..9cca8c8fa58 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -24,6 +24,10 @@ #include #include +#ifdef HAVE_INNOBASE_DB +#include "ha_innobase.h" +#endif + #define SCRAMBLE_LENGTH 8 @@ -1232,6 +1236,15 @@ mysql_execute_command(void) res = show_binlog_info(thd); break; } +#ifdef HAVE_INNOBASE_DB + case SQLCOM_SHOW_INNODB_STATUS: + { + if (check_process_priv(thd)) + goto error; + res = innodb_show_status(thd); + break; + } +#endif case SQLCOM_LOAD_MASTER_TABLE: if (!tables->db) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 07a0263dd88..e258f5d3827 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -2242,6 +2242,8 @@ show_param: } | STATUS_SYM wild { Lex->sql_command= SQLCOM_SHOW_STATUS; } + | INNOBASE_SYM STATUS_SYM + { Lex->sql_command = SQLCOM_SHOW_INNODB_STATUS;} | opt_full PROCESSLIST_SYM { Lex->sql_command= SQLCOM_SHOW_PROCESSLIST;} | VARIABLES wild -- cgit v1.2.1 From 5db805be78e04beafceba01c60f5ce8a8eb8c2a4 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 8 Jul 2002 20:04:10 +0300 Subject: srv0srv.c: Eliminate potential division by zero innobase/srv/srv0srv.c: Eliminate potential division by zero --- innobase/srv/srv0srv.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index 81b3333cbe8..5d9d6a77b12 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -2148,7 +2148,12 @@ srv_sprintf_innodb_monitor( current_time = time(NULL); - time_elapsed = difftime(current_time, srv_last_monitor_time); + /* We add 0.001 seconds to time_elapsed to prevent division + by zero if two users happen to call SHOW INNODB STATUS at the same + time */ + + time_elapsed = difftime(current_time, srv_last_monitor_time) + + 0.001; srv_last_monitor_time = time(NULL); @@ -2443,13 +2448,13 @@ loop: srv_error_monitor_active = TRUE; os_thread_sleep(10000000); - /* + printf("Validating has index\n"); btr_search_validate(); printf("Hash index validated\n"); - */ + sync_array_print_long_waits(); /* Flush stdout and stderr so that a database user gets their output -- cgit v1.2.1 From 68c79127dc3258b1901556a3a9714822e27d454e Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 8 Jul 2002 20:08:16 +0300 Subject: srv0srv.c: Remove debug code innobase/srv/srv0srv.c: Remove debug code --- innobase/srv/srv0srv.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index 5d9d6a77b12..1643988837c 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -2449,12 +2449,6 @@ loop: os_thread_sleep(10000000); - printf("Validating has index\n"); - - btr_search_validate(); - - printf("Hash index validated\n"); - sync_array_print_long_waits(); /* Flush stdout and stderr so that a database user gets their output -- cgit v1.2.1 From a0a0af76fa53eb22579bcdf0879c6c9576cbc534 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 9 Jul 2002 14:57:06 +0300 Subject: This is the only way to fix ALTER TABLE bug with BDB I wish I had connection stop / start so that I could have made a test case. Docs/manual.texi: This is the only way to fix ALTER TABLE bug with BDB sql/sql_table.cc: This is the only way to fix ALTER TABLE bug with BDB --- Docs/manual.texi | 2 ++ sql/sql_table.cc | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 55ac278155f..209751aa4dc 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -46928,6 +46928,8 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.52 @itemize @bullet @item +Fixed bug in ALTERing TABLE of BDB type. +@item Fixed bug when logging @code{LOAD DATA INFILE} to binary log with no active database. @item diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 7b5fc5797c9..ce3415f10fb 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -1652,7 +1652,11 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, VOID(pthread_mutex_unlock(&LOCK_open)); goto err; } - +#ifdef HAVE_BERKELEY_DB + extern bool berkeley_flush_logs(void); + if (old_db_type == DB_TYPE_BERKELEY_DB && berkeley_flush_logs()) + goto err; +#endif thd->proc_info="end"; mysql_update_log.write(thd, thd->query,thd->query_length); if (mysql_bin_log.is_open()) -- cgit v1.2.1 From b0b67eff596039d3ffd3a5dba3a001f461df3261 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 9 Jul 2002 18:13:59 +0300 Subject: srv0srv.c: Protect InnoDB monitor with a mutex innobase/srv/srv0srv.c: Protect InnoDB monitor with a mutex --- innobase/srv/srv0srv.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index 1643988837c..556a4256e9e 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -274,6 +274,8 @@ char* srv_io_thread_op_info[SRV_MAX_N_IO_THREADS]; time_t srv_last_monitor_time; +mutex_t srv_innodb_monitor_mutex; + /* IMPLEMENTATION OF THE SERVER MAIN PROGRAM ========================================= @@ -1618,6 +1620,9 @@ srv_init(void) kernel_mutex_temp = mem_alloc(sizeof(mutex_t)); mutex_create(&kernel_mutex); mutex_set_level(&kernel_mutex, SYNC_KERNEL); + + mutex_create(&srv_innodb_monitor_mutex); + mutex_set_level(&srv_innodb_monitor_mutex, SYNC_NO_ORDER_CHECK); srv_sys->threads = mem_alloc(OS_THREAD_MAX_N * sizeof(srv_slot_t)); @@ -2146,6 +2151,8 @@ srv_sprintf_innodb_monitor( double time_elapsed; time_t current_time; + mutex_enter(&srv_innodb_monitor_mutex); + current_time = time(NULL); /* We add 0.001 seconds to time_elapsed to prevent division @@ -2256,6 +2263,7 @@ srv_sprintf_innodb_monitor( buf += sprintf(buf, "----------------------------\n" "END OF INNODB MONITOR OUTPUT\n" "============================\n"); + mutex_exit(&srv_innodb_monitor_mutex); } /************************************************************************* -- cgit v1.2.1 From 8b1e397765cbb7643fbc8f9fd601d67047b0a7dc Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 10 Jul 2002 19:55:27 +0300 Subject: row0mysql.c: Forgot to release an x-latch in DROP DATABASE innobase/row/row0mysql.c: Forgot to release an x-latch in DROP DATABASE --- innobase/row/row0mysql.c | 1 + 1 file changed, 1 insertion(+) diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index 638df1b6380..529007dfb26 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -1986,6 +1986,7 @@ loop: if (table->n_mysql_handles_opened > 0) { mutex_exit(&(dict_sys->mutex)); + rw_lock_x_unlock(&(dict_foreign_key_check_lock)); ut_print_timestamp(stderr); fprintf(stderr, -- cgit v1.2.1 From 9ae7aad20fd8ab21173a0ac716686facbb4471bb Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 12 Jul 2002 20:00:15 +0300 Subject: my-huge.cnf.sh, my-small.cnf.sh, my-medium.cnf.sh, my-large.cnf.sh: Update my.cnf example files to reflect InnoDB autoextend and also simplify them for InnoDB support-files/my-large.cnf.sh: Update my.cnf example files to reflect InnoDB autoextend and also simplify them for InnoDB support-files/my-medium.cnf.sh: Update my.cnf example files to reflect InnoDB autoextend and also simplify them for InnoDB support-files/my-small.cnf.sh: Update my.cnf example files to reflect InnoDB autoextend and also simplify them for InnoDB support-files/my-huge.cnf.sh: Update my.cnf example files to reflect InnoDB autoextend and also simplify them for InnoDB --- support-files/my-huge.cnf.sh | 17 ++++++++--------- support-files/my-large.cnf.sh | 17 ++++++++--------- support-files/my-medium.cnf.sh | 15 +++++++-------- support-files/my-small.cnf.sh | 15 +++++++-------- 4 files changed, 30 insertions(+), 34 deletions(-) diff --git a/support-files/my-huge.cnf.sh b/support-files/my-huge.cnf.sh index ce9b5b18586..6c204abd4c7 100644 --- a/support-files/my-huge.cnf.sh +++ b/support-files/my-huge.cnf.sh @@ -46,20 +46,19 @@ server-id = 1 #set-variable = bdb_cache_size=384M #set-variable = bdb_max_lock=100000 -# Uncomment the following if you are using Innobase tables -#innodb_data_file_path = ibdata1:2000M;ibdata2:2000M +# Uncomment the following if you are using InnoDB tables #innodb_data_home_dir = @localstatedir@/ +#innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend #innodb_log_group_home_dir = @localstatedir@/ #innodb_log_arch_dir = @localstatedir@/ -#set-variable = innodb_mirrored_log_groups=1 -#set-variable = innodb_log_files_in_group=3 -#set-variable = innodb_log_file_size=5M +# You can set .._buffer_pool_size up to 50 - 80 % +# of RAM but beware of setting memory usage too high +#set-variable = innodb_buffer_pool_size=384M +#set-variable = innodb_additional_mem_pool_size=20M +# Set .._log_file_size to 25 % of buffer pool size +#set-variable = innodb_log_file_size=100M #set-variable = innodb_log_buffer_size=8M #innodb_flush_log_at_trx_commit=1 -#innodb_log_archive=0 -#set-variable = innodb_buffer_pool_size=16M -#set-variable = innodb_additional_mem_pool_size=2M -#set-variable = innodb_file_io_threads=4 #set-variable = innodb_lock_wait_timeout=50 [mysqldump] diff --git a/support-files/my-large.cnf.sh b/support-files/my-large.cnf.sh index 0602921abc1..3c388d611d8 100644 --- a/support-files/my-large.cnf.sh +++ b/support-files/my-large.cnf.sh @@ -42,20 +42,19 @@ server-id = 1 #set-variable = bdb_cache_size=64M #set-variable = bdb_max_lock=100000 -# Uncomment the following if you are using Innobase tables -#innodb_data_file_path = ibdata1:1000M +# Uncomment the following if you are using InnoDB tables #innodb_data_home_dir = @localstatedir@/ +#innodb_data_file_path = ibdata1:10M:autoextend #innodb_log_group_home_dir = @localstatedir@/ #innodb_log_arch_dir = @localstatedir@/ -#set-variable = innodb_mirrored_log_groups=1 -#set-variable = innodb_log_files_in_group=3 -#set-variable = innodb_log_file_size=5M +# You can set .._buffer_pool_size up to 50 - 80 % +# of RAM but beware of setting memory usage too high +#set-variable = innodb_buffer_pool_size=256M +#set-variable = innodb_additional_mem_pool_size=20M +# Set .._log_file_size to 25 % of buffer pool size +#set-variable = innodb_log_file_size=64M #set-variable = innodb_log_buffer_size=8M #innodb_flush_log_at_trx_commit=1 -#innodb_log_archive=0 -#set-variable = innodb_buffer_pool_size=16M -#set-variable = innodb_additional_mem_pool_size=2M -#set-variable = innodb_file_io_threads=4 #set-variable = innodb_lock_wait_timeout=50 # Point the following paths to different dedicated disks diff --git a/support-files/my-medium.cnf.sh b/support-files/my-medium.cnf.sh index bddba03eee9..a92494358cb 100644 --- a/support-files/my-medium.cnf.sh +++ b/support-files/my-medium.cnf.sh @@ -44,20 +44,19 @@ server-id = 1 #set-variable = bdb_cache_size=4M #set-variable = bdb_max_lock=10000 -# Uncomment the following if you are using Innobase tables -#innodb_data_file_path = ibdata1:400M +# Uncomment the following if you are using InnoDB tables #innodb_data_home_dir = @localstatedir@/ +#innodb_data_file_path = ibdata1:10M:autoextend #innodb_log_group_home_dir = @localstatedir@/ #innodb_log_arch_dir = @localstatedir@/ -#set-variable = innodb_mirrored_log_groups=1 -#set-variable = innodb_log_files_in_group=3 +# You can set .._buffer_pool_size up to 50 - 80 % +# of RAM but beware of setting memory usage too high +#set-variable = innodb_buffer_pool_size=16M +#set-variable = innodb_additional_mem_pool_size=2M +# Set .._log_file_size to 25 % of buffer pool size #set-variable = innodb_log_file_size=5M #set-variable = innodb_log_buffer_size=8M #innodb_flush_log_at_trx_commit=1 -#innodb_log_archive=0 -#set-variable = innodb_buffer_pool_size=16M -#set-variable = innodb_additional_mem_pool_size=2M -#set-variable = innodb_file_io_threads=4 #set-variable = innodb_lock_wait_timeout=50 [mysqldump] diff --git a/support-files/my-small.cnf.sh b/support-files/my-small.cnf.sh index 9e7d07ec449..b8941184fe0 100644 --- a/support-files/my-small.cnf.sh +++ b/support-files/my-small.cnf.sh @@ -41,20 +41,19 @@ server-id = 1 # Uncomment the following if you are NOT using BDB tables #skip-bdb -# Uncomment the following if you are using Innobase tables -#innodb_data_file_path = ibdata1:100M +# Uncomment the following if you are using InnoDB tables #innodb_data_home_dir = @localstatedir@/ +#innodb_data_file_path = ibdata1:10M:autoextend #innodb_log_group_home_dir = @localstatedir@/ #innodb_log_arch_dir = @localstatedir@/ -#set-variable = innodb_mirrored_log_groups=1 -#set-variable = innodb_log_files_in_group=3 +# You can set .._buffer_pool_size up to 50 - 80 % +# of RAM but beware of setting memory usage too high +#set-variable = innodb_buffer_pool_size=16M +#set-variable = innodb_additional_mem_pool_size=2M +# Set .._log_file_size to 25 % of buffer pool size #set-variable = innodb_log_file_size=5M #set-variable = innodb_log_buffer_size=8M #innodb_flush_log_at_trx_commit=1 -#innodb_log_archive=0 -#set-variable = innodb_buffer_pool_size=16M -#set-variable = innodb_additional_mem_pool_size=2M -#set-variable = innodb_file_io_threads=4 #set-variable = innodb_lock_wait_timeout=50 [mysqldump] -- cgit v1.2.1 From 765519dbcfe6d4311fa18f308c1dbcb59050503c Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 14 Jul 2002 10:37:34 +0300 Subject: Do handler specific drop-database at safe place. Fix for access problem (merge from 4.0) sql/sql_db.cc: Do handler specific drop-database at safe place. sql/sql_parse.cc: Fix for access problem (merge from 4.0) --- sql/sql_db.cc | 9 +-------- sql/sql_parse.cc | 3 ++- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/sql/sql_db.cc b/sql/sql_db.cc index e368ef3ae94..5ce1929e90a 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -166,6 +166,7 @@ void mysql_rm_db(THD *thd,char *db,bool if_exists) if ((deleted=mysql_rm_known_files(thd, dirp, path,0)) >= 0) { + ha_drop_database(path); if (!thd->query) { thd->query = path; @@ -189,14 +190,6 @@ void mysql_rm_db(THD *thd,char *db,bool if_exists) exit: VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_mysql_create_db)); - - /* It seems MySQL may call this function when there still are queries - running on tables of the database. Since InnoDB waits until the - queries have ended, we have to call ha_drop_database outside - the above two mutexes to avoid deadlocks. */ - - ha_drop_database(path); - DBUG_VOID_RETURN; } diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 9cca8c8fa58..d97c392bb9f 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2154,7 +2154,8 @@ check_access(THD *thd,uint want_access,const char *db, uint *save_priv, thd->priv_user, db); /* purecov: inspected */ else db_access=thd->db_access; - want_access &= ~EXTRA_ACL; // Remove SHOW attribute + // Remove SHOW attribute and access rights we already have + want_access &= ~(thd->master_access | EXTRA_ACL); db_access= ((*save_priv=(db_access | thd->master_access)) & want_access); /* grant_option is set if there exists a single table or column grant */ -- cgit v1.2.1 From b6637e9fb4405acb34ea615096788cb83bf7aa68 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 15 Jul 2002 09:54:26 +0200 Subject: Updated Packager Tag --- support-files/mysql.spec.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/support-files/mysql.spec.sh b/support-files/mysql.spec.sh index 58909518b25..4c37ff31a0b 100644 --- a/support-files/mysql.spec.sh +++ b/support-files/mysql.spec.sh @@ -16,7 +16,7 @@ Copyright: GPL / LGPL Source: http://www.mysql.com/Downloads/MySQL-@MYSQL_BASE_VERSION@/mysql-%{mysql_version}.tar.gz Icon: mysql.gif URL: http://www.mysql.com/ -Packager: David Axmark +Packager: Lenz Grimmer Vendor: MySQL AB Provides: msqlormysql MySQL-server mysql Obsoletes: mysql @@ -445,6 +445,10 @@ fi %changelog +* Mon Jul 15 2002 Lenz Grimmer + +- updated Packager tag + * Fri Feb 15 2002 Sasha - changed build to use --with-other-libc -- cgit v1.2.1 From 3814a0ff761cb486925beead1751af7a74fc7881 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 15 Jul 2002 13:17:42 +0200 Subject: Typo fixes, added changelog entry Docs/manual.ja.texi: Fixed typo Docs/manual.texi: Fixed typo, added changelog entry --- Docs/manual.ja.texi | 2 +- Docs/manual.texi | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Docs/manual.ja.texi b/Docs/manual.ja.texi index d3ee43acd29..aac97c61c8d 100644 --- a/Docs/manual.ja.texi +++ b/Docs/manual.ja.texi @@ -34271,7 +34271,7 @@ Some small changes to the join table optimizer to make some joins faster. @code{MYSQL} ¤È¤È¤·¤Æ¥³¡¼¥ë¤Ç¤­¤º¡¢¤³¤ÎÂå¤ï¤ê¤Ë @code{mysql_field_count()} ¤ò »ÈÍѤ·¤Ê¤¯¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£ @item -@code{LIBEWRAP} ¤ÎÄɲÃ; Patch by Henning P . Schmiedehausen. +@code{LIBWRAP} ¤ÎÄɲÃ; Patch by Henning P . Schmiedehausen. @item Don't allow @code{AUTO_INCREMENT} for other than numerical columns. @item diff --git a/Docs/manual.texi b/Docs/manual.texi index 209751aa4dc..1ef91638e17 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -46940,6 +46940,9 @@ database with InnoDB tables. @item Fixed that @code{mysql_info()} returns 0 for 'Duplicates' when using @code{INSERT DELAYED IGNORE}. +@item +Added @code{-DHAVE_BROKEN_REALPATH} to the Mac OS X (darwin) compile +options in @file{configure.in} to fix a failure under high load. @end itemize @node News-3.23.51, News-3.23.50, News-3.23.52, News-3.23.x @@ -49690,7 +49693,7 @@ All C client API macros are now functions to make shared libraries more reliable. Because of this, you can no longer call @code{mysql_num_fields()} on a @code{MYSQL} object, you must use @code{mysql_field_count()} instead. @item -Added use of @code{LIBEWRAP}; Patch by Henning P . Schmiedehausen. +Added use of @code{LIBWRAP}; Patch by Henning P . Schmiedehausen. @item Don't allow @code{AUTO_INCREMENT} for other than numerical columns. @item -- cgit v1.2.1 From f9232ee50342699ddc1e43909ab2fed09db13766 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 15 Jul 2002 13:33:56 +0200 Subject: Added some patches provided by SuSE to fix build problems on ppc64 and x86-64, fixed a compile bug when building with TCP wrapper support on Linux bdb/dist/acconfig.h: Added patch for x86_64 (provided by SuSE) bdb/dist/aclocal/mutex.m4: Added patch for x86_64 (provided by SuSE) bdb/include/mutex.h: Added patch for x86_64 (provided by SuSE) include/global.h: Added a SMP-related patch for PPC64 (provided by SuSE) sql/mysqld.cc: Compile fix for Linux when compiling with --with-librwap --- bdb/dist/acconfig.h | 1 + bdb/dist/aclocal/mutex.m4 | 12 ++++++++++++ bdb/include/mutex.h | 22 ++++++++++++++++++++++ include/global.h | 3 ++- sql/mysqld.cc | 10 +++++----- 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/bdb/dist/acconfig.h b/bdb/dist/acconfig.h index e30d0e3d2c2..19f85a460d9 100644 --- a/bdb/dist/acconfig.h +++ b/bdb/dist/acconfig.h @@ -52,6 +52,7 @@ #undef HAVE_MUTEX_WIN16 #undef HAVE_MUTEX_WIN32 #undef HAVE_MUTEX_X86_GCC_ASSEMBLY +#undef HAVE_MUTEX_X86_64_GCC_ASSEMBLY /* Define if building on QNX. */ #undef HAVE_QNX diff --git a/bdb/dist/aclocal/mutex.m4 b/bdb/dist/aclocal/mutex.m4 index 5f16ee0e114..a6b1fa1a053 100644 --- a/bdb/dist/aclocal/mutex.m4 +++ b/bdb/dist/aclocal/mutex.m4 @@ -314,6 +314,18 @@ AC_TRY_RUN([main(){ }], [db_cv_mutex="x86/gcc-assembly"]) fi +dnl x86_64/gcc: FreeBSD, NetBSD, BSD/OS, Linux +if test "$db_cv_mutex" = no; then +AC_TRY_RUN([main(){ +#if defined(x86_64) || defined(__x86_64__) +#if defined(__GNUC__) + exit(0); +#endif +#endif + exit(1); +}], [db_cv_mutex="x86_64/gcc-assembly"]) +fi + dnl ia86/gcc: Linux if test "$db_cv_mutex" = no; then AC_TRY_RUN([main(){ diff --git a/bdb/include/mutex.h b/bdb/include/mutex.h index a8a41451012..4c1b265355d 100644 --- a/bdb/include/mutex.h +++ b/bdb/include/mutex.h @@ -611,6 +611,28 @@ typedef unsigned char tsl_t; #endif #endif +#ifdef HAVE_MUTEX_X86_64_GCC_ASSEMBLY +typedef unsigned char tsl_t; + +#ifdef LOAD_ACTUAL_MUTEX_CODE +/* + * For gcc/x86, 0 is clear, 1 is set. + */ +#define MUTEX_SET(tsl) ({ \ + register tsl_t *__l = (tsl); \ + int __r; \ + asm volatile("mov $1,%%rax; lock; xchgb %1,%%al; xor $1,%%rax"\ + : "=&a" (__r), "=m" (*__l) \ + : "1" (*__l) \ + ); \ + __r & 1; \ +}) + +#define MUTEX_UNSET(tsl) (*(tsl) = 0) +#define MUTEX_INIT(tsl) MUTEX_UNSET(tsl) +#endif +#endif + /* * Mutex alignment defaults to one byte. * diff --git a/include/global.h b/include/global.h index a58179e6759..61e00df375d 100644 --- a/include/global.h +++ b/include/global.h @@ -139,7 +139,7 @@ #endif /* In Linux-ia64 including atomic.h will give us an error */ -#if (defined(HAVE_LINUXTHREADS) && defined(__GNUC__) && defined(__ia64__)) || !defined(THREAD) +#if (defined(HAVE_LINUXTHREADS) && defined(__GNUC__) && (defined(__ia64__) || defined(__powerpc64__))) || !defined(THREAD) #undef HAVE_ATOMIC_ADD #undef HAVE_ATOMIC_SUB #endif @@ -200,6 +200,7 @@ #endif #ifdef HAVE_ATOMIC_ADD #define __SMP__ +#define CONFIG_SMP #include #endif diff --git a/sql/mysqld.cc b/sql/mysqld.cc index a810219da15..251dda77d34 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -90,14 +90,14 @@ extern "C" { // Because of SCO 3.2V4.2 int allow_severity = LOG_INFO; int deny_severity = LOG_WARNING; -#ifdef __linux__ -#define my_fromhost(A) fromhost() -#define my_hosts_access(A) hosts_access() -#define my_eval_client(A) eval_client() -#else +#ifdef __STDC__ #define my_fromhost(A) fromhost(A) #define my_hosts_access(A) hosts_access(A) #define my_eval_client(A) eval_client(A) +#else +#define my_fromhost(A) fromhost() +#define my_hosts_access(A) hosts_access() +#define my_eval_client(A) eval_client() #endif #endif /* HAVE_LIBWRAP */ -- cgit v1.2.1 From 0dd47486d6d5f91f8083f8caddaf1ada09cc1919 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 15 Jul 2002 15:47:53 +0300 Subject: sql_db.cc: Revert Monty's change to the positioning of ha_drop_database(): otherwise a running query on a table to be dropped in DROP DATABASE always causes the server to hang sql/sql_db.cc: Revert Monty's change to the positioning of ha_drop_database(): otherwise a running query on a table to be dropped in DROP DATABASE always causes the server to hang --- sql/sql_db.cc | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 5ce1929e90a..a3829aae073 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -166,7 +166,6 @@ void mysql_rm_db(THD *thd,char *db,bool if_exists) if ((deleted=mysql_rm_known_files(thd, dirp, path,0)) >= 0) { - ha_drop_database(path); if (!thd->query) { thd->query = path; @@ -190,6 +189,17 @@ void mysql_rm_db(THD *thd,char *db,bool if_exists) exit: VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_mysql_create_db)); + + /* If there are running queries on the tables, MySQL needs to get + access to LOCK_open to end them. InnoDB on the other hand waits + for the queries to end before dropping the database. That is why we + must do the dropping outside of the mutexes above, otherwise the server + always hangs if there are running queries. We only drop inside InnoDB + if deleted got value >= 0 which means that it was successful. */ + + if (deleted >= 0) + ha_drop_database(path); + DBUG_VOID_RETURN; } -- cgit v1.2.1 From 9e5fd21c3b4fadb518720d5e64735d232acf0d8d Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 15 Jul 2002 18:26:11 +0200 Subject: - Updated OS/2 port with files provided by Yuri Dario from TeamOS/2 Italy - removed some obsolete files on Yuri's request - Added missing os2 related files outside the os2 subdirectory to the distribution BitKeeper/deleted/.del-MySQL-All.icc~132f824bdf16897c: Delete: os2/MySQL-All.icc BitKeeper/deleted/.del-MySQL-Client.irs~6dc13dcf3bbd5c0e: Delete: os2/MySQL-Client.irs BitKeeper/deleted/.del-MySQL-Lib.icc~6775a33b1eeed98: Delete: os2/MySQL-Lib.icc BitKeeper/deleted/.del-MySQL-ReadLine.icc~d7ab937c4ed8922f: Delete: os2/MySQL-ReadLine.icc BitKeeper/deleted/.del-MySQL-binlog.icc~ec86ef1b392553e: Delete: os2/MySQL-binlog.icc BitKeeper/deleted/.del-MySQL-binlog.irs~80d1800461e185d1: Delete: os2/MySQL-binlog.irs BitKeeper/deleted/.del-MySQL-sql.irs~563a18a769b1785d: Delete: os2/MySQL-sql.irs BitKeeper/deleted/.del-build-all.log~8dda947d95dfb926: Delete: os2/build-all.log BitKeeper/deleted/.del-mysql.base~330f9ea62769c03a: Delete: os2/mysql.base BitKeeper/deleted/.del-mysql.ih~767482ec101feda3: Delete: os2/mysql.ih BitKeeper/deleted/.del-readme.os2~e8fe94e278248f7e: Delete: os2/readme.os2 configure.in: Added new os2 subdirectories include/Makefile.am: Added include/config-os2.h to distribution include/config-os2.h: Applied modifications provided by Yuri Dario from TeamOS/2 Italy mysys/Makefile.am: Added missing OS/2 files in mysys to distribution mysys/my_os2file64.c: Applied modifications provided by Yuri Dario from TeamOS/2 Italy mysys/my_os2thread.c: Applied modifications provided by Yuri Dario from TeamOS/2 Italy os2/BldLevel.cmd: Applied modifications provided by Yuri Dario from TeamOS/2 Italy os2/BldLevel.rc: Applied modifications provided by Yuri Dario from TeamOS/2 Italy os2/ChangeLog.os2: Applied modifications provided by Yuri Dario from TeamOS/2 Italy os2/Makefile.am: Fixed OS/2 file list (some new files, some have been removed) os2/MySQL-Client.icc: Applied modifications provided by Yuri Dario from TeamOS/2 Italy os2/MySQL-Opt.icc: Applied modifications provided by Yuri Dario from TeamOS/2 Italy os2/MySQL-Source.icc: Applied modifications provided by Yuri Dario from TeamOS/2 Italy os2/MySQL-Util.icc: Applied modifications provided by Yuri Dario from TeamOS/2 Italy os2/MySQL-Util.irs: Applied modifications provided by Yuri Dario from TeamOS/2 Italy os2/ReadMe.txt: Applied modifications provided by Yuri Dario from TeamOS/2 Italy os2/build-all.cmd: Applied modifications provided by Yuri Dario from TeamOS/2 Italy os2/rint.obj: Applied modifications provided by Yuri Dario from TeamOS/2 Italy --- configure.in | 2 +- include/Makefile.am | 4 +- include/config-os2.h | 7 +- mysys/Makefile.am | 5 +- mysys/my_os2file64.c | 16 +- mysys/my_os2thread.c | 7 +- os2/BldLevel.RES | Bin 0 -> 127 bytes os2/BldLevel.cmd | 4 +- os2/BldLevel.rc | 2 +- os2/ChangeLog.os2 | 22 +- os2/Makefile.am | 15 +- os2/MySQL-All.icc | 13 - os2/MySQL-Client.icc | 7 +- os2/MySQL-Client.irs | 2335 ------------------------------------------- os2/MySQL-Lib.icc | 72 -- os2/MySQL-Opt.icc | 7 +- os2/MySQL-ReadLine.icc | 27 - os2/MySQL-Source.icc | 65 +- os2/MySQL-Sql.irs | 7 + os2/MySQL-Util.icc | 3 +- os2/MySQL-Util.irs | 1226 +++++++++++++---------- os2/MySQL-binlog.icc | 68 -- os2/MySQL-binlog.irs | 7 - os2/MySQL-sql.irs | 13 - os2/ReadMe.txt | 44 +- os2/build-all.cmd | 1 - os2/build-all.log | 39 - os2/include/Makefile.am | 23 + os2/include/config.h | 13 + os2/include/pwd.h | 1 + os2/include/sgtty.h | 1 + os2/include/sys/Makefile.am | 22 + os2/include/sys/file.h | 1 + os2/include/termio.h | 156 +++ os2/mysql.base | 127 --- os2/mysql.ih | 7 - os2/readme.os2 | 190 ---- os2/rint.obj | Bin 334 -> 334 bytes 38 files changed, 1089 insertions(+), 3470 deletions(-) create mode 100644 os2/BldLevel.RES delete mode 100644 os2/MySQL-All.icc delete mode 100644 os2/MySQL-Client.irs delete mode 100644 os2/MySQL-Lib.icc delete mode 100644 os2/MySQL-ReadLine.icc create mode 100644 os2/MySQL-Sql.irs delete mode 100644 os2/MySQL-binlog.icc delete mode 100644 os2/MySQL-binlog.irs delete mode 100644 os2/MySQL-sql.irs delete mode 100644 os2/build-all.log create mode 100644 os2/include/Makefile.am create mode 100644 os2/include/config.h create mode 100644 os2/include/pwd.h create mode 100644 os2/include/sgtty.h create mode 100644 os2/include/sys/Makefile.am create mode 100644 os2/include/sys/file.h create mode 100644 os2/include/termio.h delete mode 100644 os2/mysql.base delete mode 100644 os2/mysql.ih delete mode 100644 os2/readme.os2 diff --git a/configure.in b/configure.in index 99d8e9bc1f5..460c5e73abe 100644 --- a/configure.in +++ b/configure.in @@ -2264,7 +2264,7 @@ AC_OUTPUT(Makefile extra/Makefile mysys/Makefile isam/Makefile \ strings/Makefile regex/Makefile heap/Makefile \ bdb/Makefile \ myisam/Makefile myisammrg/Makefile \ - man/Makefile os2/Makefile \ + man/Makefile os2/Makefile os2/include/Makefile os2/include/sys/Makefile \ readline/Makefile libmysql_r/Makefile libmysql/Makefile client/Makefile \ sql/Makefile sql/share/Makefile \ merge/Makefile dbug/Makefile scripts/Makefile \ diff --git a/include/Makefile.am b/include/Makefile.am index f3685b51cd3..393dac3fd82 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -18,11 +18,11 @@ BUILT_SOURCES = mysql_version.h m_ctype.h my_config.h pkginclude_HEADERS = dbug.h m_string.h my_sys.h mysql.h mysql_com.h \ mysqld_error.h my_list.h \ - my_pthread.h my_no_pthread.h raid.h errmsg.h \ + my_pthread.h my_no_pthread.h raid.h errmsg.h \ my_global.h my_net.h \ sslopt-case.h sslopt-longopts.h sslopt-usage.h \ sslopt-vars.h $(BUILT_SOURCES) -noinst_HEADERS = global.h config-win.h \ +noinst_HEADERS = global.h config-win.h config-os2.h\ nisam.h heap.h merge.h my_bitmap.h\ myisam.h myisampack.h myisammrg.h ft_global.h\ my_dir.h mysys_err.h my_base.h \ diff --git a/include/config-os2.h b/include/config-os2.h index 9064cd5a5bb..e23f4eb75e8 100644 --- a/include/config-os2.h +++ b/include/config-os2.h @@ -26,6 +26,7 @@ #include #include #include +#include /* Define to name of system eg solaris*/ #define SYSTEM_TYPE "IBM OS/2 Warp" @@ -55,6 +56,8 @@ #define FILE_BINARY O_BINARY /* my_fopen in binary mode */ #define S_IROTH S_IREAD /* for my_lib */ +#define CANT_DELETE_OPEN_FILES /* saves open files in a list, for delayed delete */ + #define O_NONBLOCK 0x10 #define NO_OPEN_3 /* For my_create() */ @@ -84,7 +87,7 @@ #define F_WRLCK 2 /* Write lock. */ #define F_UNLCK 0 /* Remove lock. */ -#define S_IFMT 0xF000 /* Mask for file type */ +#define S_IFMT 0x17000 /* Mask for file type */ #define F_TO_EOF 0L /* Param to lockf() to lock rest of file */ #define HUGE_PTR @@ -268,7 +271,7 @@ typedef unsigned long long os_off_t; /* #undef HAVE_NONPOSIX_PTHREAD_MUTEX_INIT */ /* READLINE: */ -#define HAVE_POSIX_SIGNALS 1 +#define HAVE_POSIX_SIGNALS 0 /* sigwait with one argument */ /* #undef HAVE_NONPOSIX_SIGWAIT */ diff --git a/mysys/Makefile.am b/mysys/Makefile.am index 0d193b7a035..7de59939227 100644 --- a/mysys/Makefile.am +++ b/mysys/Makefile.am @@ -21,7 +21,10 @@ INCLUDES = @MT_INCLUDES@ -I$(srcdir)/../include -I../include -I.. -I$(srcdir) pkglib_LIBRARIES = libmysys.a LDADD = libmysys.a ../dbug/libdbug.a \ ../strings/libmystrings.a -noinst_HEADERS = mysys_priv.h my_static.h +noinst_HEADERS = mysys_priv.h my_static.h \ + my_os2cond.c my_os2dirsrch.c my_os2dirsrch.h \ + my_os2dlfcn.c my_os2file64.c my_os2mutex.c \ + my_os2thread.c my_os2tls.c libmysys_a_SOURCES = my_init.c my_getwd.c mf_getdate.c\ mf_path.c mf_loadpath.c\ my_open.c my_create.c my_seek.c my_read.c \ diff --git a/mysys/my_os2file64.c b/mysys/my_os2file64.c index b7ee40d292e..2f41d344e32 100644 --- a/mysys/my_os2file64.c +++ b/mysys/my_os2file64.c @@ -22,6 +22,7 @@ void _OS2errno( APIRET rc); longlong _lseek64( int fd, longlong offset, int seektype); int _lock64( int fd, int locktype, my_off_t start, my_off_t length, myf MyFlags); +int _sopen64( const char *name, int oflag, int shflag, int mask); // // this class is used to define a global c++ variable, that @@ -191,8 +192,17 @@ inline _SetFileLocksL(HFILE hFile, ULONG timeout, ULONG flags) { - if (_DosSetFileLocksL) - return _DosSetFileLocksL( hFile, pflUnlock, pflLock, timeout, flags); + if (_DosSetFileLocksL) { + APIRET rc; + rc = _DosSetFileLocksL( hFile, pflUnlock, pflLock, timeout, flags); + + // on FAT/HPFS/LAN a INVALID_PARAMETER is returned, seems that + // only JFS can handle >2GB ranges. + if (rc != 87) + return rc; + + // got INVALID_PARAMETER, fallback to standard call + } FILELOCK flUnlock = { pflUnlock->lOffset, pflUnlock->lRange }; FILELOCK flLock = { pflLock->lOffset, pflLock->lRange }; @@ -254,7 +264,7 @@ int _lock64( int fd, int locktype, my_off_t start, return(-1); } -int _sopen( const char *name, int oflag, int shflag, int mask) +int sopen( const char *name, int oflag, int shflag, int mask) { int fail_errno; APIRET rc = 0; diff --git a/mysys/my_os2thread.c b/mysys/my_os2thread.c index 017ba7f316b..89a3311c10b 100644 --- a/mysys/my_os2thread.c +++ b/mysys/my_os2thread.c @@ -53,6 +53,7 @@ void win_pthread_init(void) static pthread_handler_decl(pthread_start,param) { + DBUG_ENTER("pthread_start"); pthread_handler func=((struct pthread_map *) param)->func; void *func_param=((struct pthread_map *) param)->param; my_thread_init(); /* Will always succeed in windows */ @@ -60,8 +61,10 @@ static pthread_handler_decl(pthread_start,param) win_pthread_self=((struct pthread_map *) param)->pthreadself; pthread_mutex_unlock(&THR_LOCK_thread); free((char*) param); /* Free param from create */ - pthread_exit((void*) (*func)(func_param)); - return 0; /* Safety */ + //pthread_exit((void*) (*func)(func_param)); + (*func)(func_param); + DBUG_RETURN(0); + //return 0; /* Safety */ } diff --git a/os2/BldLevel.RES b/os2/BldLevel.RES new file mode 100644 index 00000000000..302d9fc875e Binary files /dev/null and b/os2/BldLevel.RES differ diff --git a/os2/BldLevel.cmd b/os2/BldLevel.cmd index 2bc85a06abb..d98d8c9dfb9 100644 --- a/os2/BldLevel.cmd +++ b/os2/BldLevel.cmd @@ -4,7 +4,7 @@ REM I'm using resources for BLDLEVEL info, because VA4 linker has the bad REM feature of using versionstring content for padding files. REM To set fixpak level: -P"fixpak level" -SET MYSQL_VERSION=3.23.42 -SET MYSQL_BUILD=1 +SET MYSQL_VERSION=3.23.50 +SET MYSQL_BUILD=B1 BldLevelInf -V%MYSQL_VERSION% -N"MySQL AB, Yuri Dario" -D"MySQL %MYSQL_VERSION% for OS/2 - Build %MYSQL_BUILD%" -Len BldLevel.rc diff --git a/os2/BldLevel.rc b/os2/BldLevel.rc index fe266a25c3c..ac028379892 100644 --- a/os2/BldLevel.rc +++ b/os2/BldLevel.rc @@ -1 +1 @@ -RCDATA 1 { "@#MySQL AB, Yuri Dario:3.23.42#@##1## 10 Sep 2001 11:57:17 paperino::en::::@@MySQL 3.23.42 for OS/2 - Build 1" } +RCDATA 1 { "@#MySQL AB, Yuri Dario:3.23.50#@##1## 24 Jun 2002 22:42:20 paperino::en::::@@MySQL 3.23.50 for OS/2 - Build B1" } diff --git a/os2/ChangeLog.os2 b/os2/ChangeLog.os2 index 8f2604c0453..7957906ad7d 100644 --- a/os2/ChangeLog.os2 +++ b/os2/ChangeLog.os2 @@ -1,4 +1,25 @@ + +2002/05/02 + - now libinit is automatically called on client dll startup + +2002/01/27 + - fixed console output for get_password + +2002/01/20 + - back-ported fix for fulltext indexes (wrong report by myisamchk) + +2001/11/21 + - MySQL 3.32.42 build 3 released. + +2001/11/19 + - got GNU Readline to compile with VAC++, now console has a working + history. + +2001/11/10 + - fixed file locking on non-JFS disks; DosSetFileLocksL does not + support ranges > 2GB on non-JFS disks. + 2001/09/16 - fixed creation directory of temporary files - enabled cached list file for deleting temp open files @@ -30,4 +51,3 @@ 2001/05/19 - new TLS code, fixed parser crashes and many other problems. - fixed pthread_cond_timedwait, now handle manager expires - diff --git a/os2/Makefile.am b/os2/Makefile.am index 7e626e45cf8..9feab6d1b2c 100644 --- a/os2/Makefile.am +++ b/os2/Makefile.am @@ -16,14 +16,13 @@ ## Process this file with automake to create Makefile.in -EXTRA_DIST = BldLevel.cmd BldLevel.rc BldLevelInf.cmd ChangeLog.os2 \ - MySQL-All.icc MySQL-Client.icc MySQL-Client.irs \ - MySQL-Lib.icc MySQL-Opt.icc MySQL-ReadLine.icc \ - MySQL-Source.icc MySQL-Sql.icc MySQL-Util.icc MySQL-Util.irs \ - MySQL-binlog.icc MySQL-binlog.irs MySQL-sql.irs ReadMe.txt \ - build-all.cmd build-all.log mysql-inf.wis mysql.base \ - mysql.ih mysql.wis mysqlalt.wis readme.os2 rint.cmd rint.obj \ - rint.s +EXTRA_DIST = BldLevel.RES BldLevel.cmd BldLevel.rc \ + BldLevelInf.cmd ChangeLog.os2 MySQL-Client.icc \ + MySQL-Opt.icc MySQL-Source.icc MySQL-Sql.icc \ + MySQL-Sql.irs MySQL-Util.icc MySQL-Util.irs \ + ReadMe.txt build-all.cmd mysql-inf.wis \ + mysql.wis mysqlalt.wis rint.cmd rint.obj rint.s +SUBDIRS = include # Don't update the files from bitkeeper %::SCCS/s.% diff --git a/os2/MySQL-All.icc b/os2/MySQL-All.icc deleted file mode 100644 index 1bd8a1dd89f..00000000000 --- a/os2/MySQL-All.icc +++ /dev/null @@ -1,13 +0,0 @@ - -// create directories -for dir in "..\\bin", "..\\lib", "..\\obj", "..\\obj\\zlib", "..\\obj\\readline" { - run "if not exist "dir" mkdir "dir -} - -// build sequence -run "vacbld MySQL-Lib.icc -showprogress=10 -showwarning" -run "vacbld MySQL-Client.icc -showprogress=10 -showwarning" -run "vacbld MySQL-Sql.icc -showprogress=10 -showwarning" - -// need only for utilities and test applications -run "vacbld MySQL-Util.icc -showprogress=10 -showwarning" diff --git a/os2/MySQL-Client.icc b/os2/MySQL-Client.icc index 7a41567f983..bc614c1c723 100644 --- a/os2/MySQL-Client.icc +++ b/os2/MySQL-Client.icc @@ -43,11 +43,13 @@ option ProjectOptions = MySQLOptions // target source files source type('cpp') "..\\client\\mysql.cc" source BldLevelInfo + option define("HAVE_STRING_H", ), define("HAVE_CONFIG_H", ) + { + source GnuReadline + } } } - option file(genobject, "..\\OBJ\\READLINE\\") - { target "..\\bin\\mysqladmin.exe" { // optimized precompiled headers @@ -59,7 +61,6 @@ option ProjectOptions = MySQLOptions source type('cpp') "..\\client\\mysqladmin.c" source BldLevelInfo } - } target "..\\bin\\mysqldump.exe" { diff --git a/os2/MySQL-Client.irs b/os2/MySQL-Client.irs deleted file mode 100644 index 4b5a9e3475a..00000000000 --- a/os2/MySQL-Client.irs +++ /dev/null @@ -1,2335 +0,0 @@ -31 Run Specifications: Version 1.1 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -39 E:\rd\mysql\vacpp-3.23.40\bin\mysql.exe -1 -0 -0 -5 Local -0 -44 E:\rd\mysql\vacpp-3.23.40\bin\mysqladmin.exe -1 -0 -0 -5 Local -0 -43 E:\rd\mysql\vacpp-3.23.40\bin\mysqldump.exe -1 -0 -0 -5 Local -0 -43 E:\rd\mysql\vacpp-3.23.40\bin\mysqlshow.exe -1 -0 -0 -5 Local -0 -45 E:\rd\mysql\vacpp-3.23.40\bin\mysqlimport.exe -1 -0 -0 -5 Local -0 -43 E:\rd\mysql\vacpp-3.23.40\bin\mysqltest.exe -1 -0 -0 -5 Local -0 diff --git a/os2/MySQL-Lib.icc b/os2/MySQL-Lib.icc deleted file mode 100644 index 51f55ed8302..00000000000 --- a/os2/MySQL-Lib.icc +++ /dev/null @@ -1,72 +0,0 @@ -// disable code inlining when building static libs -InlineCode = "no" - -// include common options -include "MySQL-Opt.icc" -include "MySQL-Source.icc" - -option ProjectOptions = MySQLOptions -{ - - option file(genobject, "..\\OBJ\\ZLIB\\") - { - target "..\\lib\\common.lib" - { - // optimized precompiled headers - option macros('global', 'yes') - { - source type('cpp') client_pch //, 'sql_string.h' - } - // target source files - source zlib - if debug_build { - source type('cpp') dbug - } - source type('cpp') heap - //source type('cpp') merge - source type('cpp') my_sys - source type('cpp') my_sys_cli - source type('cpp') my_sys_sql - source type('cpp') strings - } - } - -/* - option file(genobject, "..\\OBJ\\READLINE\\") - { - target "..\\lib\\readline.lib" - { - // optimized precompiled headers - option macros('global', 'yes') - { - source type('cpp') client_pch //, 'sql_string.h' - } - // target source files - source readline - } - } -*/ - - target "..\\lib\\myisam.lib" - { - // optimized precompiled headers - option macros('global', 'yes') - { - source type('cpp') client_pch //, 'sql_string.h' - } - // target source files - source type('cpp') myisam - } - - target "..\\lib\\isam.lib" - { - // optimized precompiled headers - option macros('global', 'yes') - { - source type('cpp') client_pch //, 'sql_string.h' - } - // target source files - source type('cpp') isam - } - -} diff --git a/os2/MySQL-Opt.icc b/os2/MySQL-Opt.icc index 7045f111d9b..56e89057862 100644 --- a/os2/MySQL-Opt.icc +++ b/os2/MySQL-Opt.icc @@ -1,6 +1,9 @@ // set to 1 to enable debug code debug_build = 0 +// set to zlib relative directory name +zlib_dir = '../../zlib-1.1.4' + // common options option BaseOptions = link(defaultlibsname, "tcpip32.lib") , link(libsearchpath, "..\\lib\\") @@ -9,6 +12,7 @@ option BaseOptions = link(defaultlibsname, "tcpip32.lib") , link(padding, no) , link(linkwithmultithreadlib, "yes") , link(linkwithsharedlib, "no") + , link(stack, 131072, 131072) , gen(initauto, "yes") , define("__MT__", ) , define("HAVE_BSD_SIGNALS", ) @@ -19,11 +23,12 @@ option BaseOptions = link(defaultlibsname, "tcpip32.lib") , define("USE_TLS", ) , lang(signedchars, yes) , incl(searchpath, "..") + , incl(searchpath, "include") , incl(searchpath, "..\\include") , incl(searchpath, "..\\my_sys") , incl(searchpath, "..\\regex") , incl(searchpath, "..\\sql") - , incl(searchpath, "..\\..\\zlib-1.1.3") + , incl(searchpath, zlib_dir) , incl(searchpath, "..\\..\\ufc") , incl(searchpath, "..\\os2") diff --git a/os2/MySQL-ReadLine.icc b/os2/MySQL-ReadLine.icc deleted file mode 100644 index 3f63b0815e6..00000000000 --- a/os2/MySQL-ReadLine.icc +++ /dev/null @@ -1,27 +0,0 @@ -// disable code inlining when building static libs -InlineCode = "no" - -// include common options -include "MySQL-Opt.icc" -include "MySQL-Source.icc" - -option ProjectOptions = MySQLOptions -{ - - - - option file(genobject, "..\\OBJ\\READLINE\\") - { - target "..\\lib\\readline.lib" - { - // optimized precompiled headers - option macros('global', 'yes') - { - source type('cpp') client_pch //, 'sql_string.h' - } - // target source files - source readline - } - } - -} diff --git a/os2/MySQL-Source.icc b/os2/MySQL-Source.icc index 134a64dc9b0..f4ac881c90e 100644 --- a/os2/MySQL-Source.icc +++ b/os2/MySQL-Source.icc @@ -30,7 +30,7 @@ group server_global_pch = 'm_string.h', 'm_ctype.h', 'myisam.h', 'myisampack.h', '.\myisam\myisamdef.h', 'sql_string.h', 'item.h', 'unireg.h', - 'field.h', 'sql_lex.h', 'sql_list.h', + 'field.h', 'sql_lex.h', 'sql_list.h', 'sql_repl.h', 'md5.h', 'sql_acl.h', 'slave.h', 'ha_myisam.h', 'procedure.h', 'sql_select.h', 'errmsg.h', 't_ctype.h', 'direct.h', @@ -57,12 +57,20 @@ group mysqlclientlib = "..\\libmysql\\violite.c" group zlib = - "..\\..\\zlib-1.1.3\\compress.c", "..\\..\\zlib-1.1.3\\crc32.c", - "..\\..\\zlib-1.1.3\\deflate.c", "..\\..\\zlib-1.1.3\\gzio.c", "..\\..\\zlib-1.1.3\\infblock.c", - "..\\..\\zlib-1.1.3\\infcodes.c", "..\\..\\zlib-1.1.3\\inffast.c", - "..\\..\\zlib-1.1.3\\inflate.c", "..\\..\\zlib-1.1.3\\inftrees.c", - "..\\..\\zlib-1.1.3\\infutil.c", "..\\..\\zlib-1.1.3\\trees.c", "..\\..\\zlib-1.1.3\\uncompr.c", - "..\\..\\zlib-1.1.3\\zutil.c", "..\\..\\zlib-1.1.3\\adler32.c" + zlib_dir "/compress.c", + zlib_dir "/crc32.c", + zlib_dir "/deflate.c", + zlib_dir "/gzio.c", + zlib_dir "/infblock.c", + zlib_dir "/infcodes.c", + zlib_dir "/inffast.c", + zlib_dir "/inflate.c", + zlib_dir "/inftrees.c", + zlib_dir "/infutil.c", + zlib_dir "/trees.c", + zlib_dir "/uncompr.c", + zlib_dir "/zutil.c", + zlib_dir "/adler32.c" group ufc = "..\\..\\ufc\\crypt.c", @@ -118,6 +126,7 @@ group sql = "..\\sql\\sql_class.cc", "..\\sql\\sql_crypt.cc", "..\\sql\\sql_db.cc", + "..\\sql\\sql_do.cc", "..\\sql\\sql_delete.cc", "..\\sql\\sql_insert.cc", "..\\sql\\sql_lex.cc", @@ -308,24 +317,32 @@ group strings = group dbug = "..\\dbug\\dbug.c", "..\\dbug\\factorial.c", "..\\dbug\\sanity.c" - group readline = "..\\readline\\bind.c", "..\\readline\\callback.c", - "..\\readline\\complete.c", "..\\readline\\display.c", - //"..\\readline\\emacs_keymap.c", - "..\\readline\\funmap.c", "..\\readline\\histexpand.c", - "..\\readline\\histfile.c", "..\\readline\\history.c", - "..\\readline\\histsearch.c", "..\\readline\\input.c", - "..\\readline\\isearch.c", "..\\readline\\keymaps.c", - "..\\readline\\kill.c", "..\\readline\\macro.c", - "..\\readline\\nls.c", "..\\readline\\parens.c", - "..\\readline\\readline.c", "..\\readline\\rltty.c", - "..\\readline\\search.c", "..\\readline\\shell.c", - "..\\readline\\signals.c", "..\\readline\\terminal.c", - "..\\readline\\tilde.c", "..\\readline\\undo.c", - "..\\readline\\util.c", - //"..\\readline\\vi_keymap.c", - "..\\readline\\vi_mode.c", "..\\readline\\xmalloc.c" - group regex = "..\\regex\\regcomp.c", "..\\regex\\regerror.c", "..\\regex\\regexec.c", "..\\regex\\regfree.c", "..\\regex\\reginit.c" group BldLevelInfo = 'os2\BldLevel.rc' + + group GnuReadline = + "..\\readline\\bind.c", + "..\\readline\\callback.c", + "..\\readline\\complete.c", + "..\\readline\\display.c", + "..\\readline\\funmap.c", + "..\\readline\\histexpand.c", "..\\readline\\histfile.c", + "..\\readline\\history.c", "..\\readline\\histsearch.c", + "..\\readline\\input.c", "..\\readline\\isearch.c", + "..\\readline\\keymaps.c", + "..\\readline\\kill.c", + "..\\readline\\macro.c", + "..\\readline\\nls.c", "..\\readline\\parens.c", + "..\\readline\\readline.c", + "..\\readline\\rltty.c", + "..\\readline\\search.c", + "..\\readline\\shell.c", + "..\\readline\\signals.c", + "..\\readline\\terminal.c", + "..\\readline\\tilde.c", + "..\\readline\\undo.c", + "..\\readline\\util.c", + "..\\readline\\vi_mode.c", + "..\\readline\\xmalloc.c" diff --git a/os2/MySQL-Sql.irs b/os2/MySQL-Sql.irs new file mode 100644 index 00000000000..b651a678c91 --- /dev/null +++ b/os2/MySQL-Sql.irs @@ -0,0 +1,7 @@ +31 Run Specifications: Version 1.1 +40 E:\rd\MySQL\vacpp-3.23.50\bin\mysqld.exe +1 +0 +0 +5 Local +0 diff --git a/os2/MySQL-Util.icc b/os2/MySQL-Util.icc index 5a7ae2959b9..36fd499e520 100644 --- a/os2/MySQL-Util.icc +++ b/os2/MySQL-Util.icc @@ -153,6 +153,7 @@ option ProjectOptions = MySQLOptions } } */ + target "..\\bin\\test\\insert_test.exe" { // optimized precompiled headers @@ -179,4 +180,4 @@ option ProjectOptions = MySQLOptions } run after sources('..\bin\gen_lex_hash.exe') targets('..\sql\lex_hash.h') - '..\bin\gen_lex_has.exe > ..\sql\lex_hash.h' + 'cd ..\bin & ..\bin\gen_lex_hash.exe > ..\sql\lex_hash.h' diff --git a/os2/MySQL-Util.irs b/os2/MySQL-Util.irs index 01a1f62a483..183aa13ba27 100644 --- a/os2/MySQL-Util.irs +++ b/os2/MySQL-Util.irs @@ -1,3065 +1,3269 @@ 31 Run Specifications: Version 1.1 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamchk.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -43 E:\rd\mysql\vacpp-3.23.40\bin\myisamlog.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -44 E:\rd\mysql\vacpp-3.23.40\bin\myisampack.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -47 E:\rd\mysql\vacpp-3.23.40\bin\test\is_test1.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -47 E:\rd\mysql\vacpp-3.23.40\bin\test\is_test2.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -47 E:\rd\mysql\vacpp-3.23.40\bin\test\mi_test1.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -47 E:\rd\mysql\vacpp-3.23.40\bin\test\mi_test2.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -46 E:\rd\mysql\vacpp-3.23.40\bin\test\ft_eval.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -47 E:\rd\mysql\vacpp-3.23.40\bin\test\ft_test1.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -51 E:\rd\mysql\vacpp-3.23.40\bin\test\test_charset.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -47 E:\rd\mysql\vacpp-3.23.40\bin\test\hp_test1.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -47 E:\rd\mysql\vacpp-3.23.40\bin\test\hp_test2.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -47 E:\rd\mysql\vacpp-3.23.40\bin\test\thr_lock.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -50 E:\rd\mysql\vacpp-3.23.40\bin\test\insert_test.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -50 E:\rd\mysql\vacpp-3.23.40\bin\test\select_test.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe 1 0 0 5 Local 0 -50 E:\rd\mysql\vacpp-3.23.40\bin\test\thread_test.exe +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamchk.exe +1 +0 +0 +5 Local +0 +43 E:\rd\MySQL\vacpp-3.23.50\bin\myisamlog.exe +1 +0 +0 +5 Local +0 +44 E:\rd\MySQL\vacpp-3.23.50\bin\myisampack.exe +1 +0 +0 +5 Local +0 +47 E:\rd\MySQL\vacpp-3.23.50\bin\test\comp_err.exe +1 +0 +0 +5 Local +0 +46 E:\rd\MySQL\vacpp-3.23.50\bin\gen_lex_hash.exe +1 +0 +0 +5 Local +0 +47 E:\rd\MySQL\vacpp-3.23.50\bin\test\is_test1.exe +1 +0 +0 +5 Local +0 +47 E:\rd\MySQL\vacpp-3.23.50\bin\test\is_test2.exe +1 +0 +0 +5 Local +0 +47 E:\rd\MySQL\vacpp-3.23.50\bin\test\mi_test1.exe +1 +0 +0 +5 Local +0 +47 E:\rd\MySQL\vacpp-3.23.50\bin\test\mi_test2.exe +1 +0 +0 +5 Local +0 +46 E:\rd\MySQL\vacpp-3.23.50\bin\test\ft_eval.exe +1 +0 +0 +5 Local +0 +47 E:\rd\MySQL\vacpp-3.23.50\bin\test\ft_test1.exe +1 +0 +0 +5 Local +0 +51 E:\rd\MySQL\vacpp-3.23.50\bin\test\test_charset.exe +1 +0 +0 +5 Local +0 +47 E:\rd\MySQL\vacpp-3.23.50\bin\test\hp_test1.exe +1 +0 +0 +5 Local +0 +47 E:\rd\MySQL\vacpp-3.23.50\bin\test\hp_test2.exe +1 +0 +0 +5 Local +0 +50 E:\rd\MySQL\vacpp-3.23.50\bin\test\insert_test.exe +1 +0 +0 +5 Local +0 +50 E:\rd\MySQL\vacpp-3.23.50\bin\test\select_test.exe +1 +0 +0 +5 Local +0 +50 E:\rd\MySQL\vacpp-3.23.50\bin\test\thread_test.exe 1 0 0 diff --git a/os2/MySQL-binlog.icc b/os2/MySQL-binlog.icc deleted file mode 100644 index d441198f5e0..00000000000 --- a/os2/MySQL-binlog.icc +++ /dev/null @@ -1,68 +0,0 @@ -// disable code inlining when building static libs -InlineCode = "no" - -// include common options -include "MySQL-Opt.icc" -include "MySQL-Source.icc" - -option ProjectOptions = MySQLOptions - , define( "MYSQL_SERVER", "") - , link(defaultlibsname, "common.lib") - , link(defaultlibsname, "myisam.lib") - , link(defaultlibsname, "isam.lib") - , link(defaultlibsname, "mysql.lib") -{ - option define( "MYSQL_SERVER", "") - { - target "..\\bin\\mysqlbinlog.exe" - { - // optimized precompiled headers - option macros('global', 'yes') - { - source type('cpp') 'os2.h' - source type('cpp') 'errno.h', 'nerrno.h' - source type('cpp') 'config-os2.h', 'mysql_com.h' -/* - source type('cpp') - 'global.h', 'my_base.h', 'config-os2.h', - 'my_dir.h', 'my_sys.h', 'mysql.h', - 'my_bitmap.h', 'violite.h', - 'mysql_priv.h', - 'm_string.h' -*/ - } - // target source files - source type('cpp') - "..\\sql\\mysqlbinlog.cc" - option macros('global', 'yes') - { - source type('cpp') 'sys/stat.h' - } - source type('cpp') "..\\sql\\mini_client.cc" - option macros('global', 'yes') - { - source type('cpp') 'os2.h' - source type('cpp') 'math.h' - source type('cpp') 'stdio.h' - source type('cpp') 'stdlib.h' - source type('cpp') 'stddef.h' - source type('cpp') 'limits.h' - source type('cpp') 'sys/types.h' - source type('cpp') 'sys/time.h' - source type('cpp') 'types.h' - source type('cpp') 'stdarg.h' - source type('cpp') 'string.h' - } - source type('cpp') "..\\sql\\net_serv.cc", - "..\\sql\\mini_client_errors.c" - option macros('global', 'yes') - { - source type('cpp') 'assert.h' - } - source type('cpp') "..\\sql\\violite.c", - "..\\sql\\password.c" - //"..\\sql\\thr_malloc.cc" - } - } - -} diff --git a/os2/MySQL-binlog.irs b/os2/MySQL-binlog.irs deleted file mode 100644 index 8d094544f1c..00000000000 --- a/os2/MySQL-binlog.irs +++ /dev/null @@ -1,7 +0,0 @@ -31 Run Specifications: Version 1.1 -45 E:\rd\mysql\vacpp-3.23.40\bin\mysqlbinlog.exe -1 -0 -0 -5 Local -0 diff --git a/os2/MySQL-sql.irs b/os2/MySQL-sql.irs deleted file mode 100644 index dc0b016d8d4..00000000000 --- a/os2/MySQL-sql.irs +++ /dev/null @@ -1,13 +0,0 @@ -31 Run Specifications: Version 1.1 -40 E:\rd\mysql\vacpp-3.23.40\bin\mysqld.exe -1 -0 -0 -5 Local -0 -40 E:\rd\mysql\vacpp-3.23.40\bin\mysqld.exe -1 -0 -0 -5 Local -0 diff --git a/os2/ReadMe.txt b/os2/ReadMe.txt index 1a8158df4bf..073c65290c0 100644 --- a/os2/ReadMe.txt +++ b/os2/ReadMe.txt @@ -6,7 +6,6 @@ Welcome to the latest port of MySQL for OS/2 and eComStation. Modules included in this build: - protocol data compression - - transaction support - perl BDB/BDI support (not in this package) - Library and header files for C/CPP developers included @@ -24,7 +23,7 @@ some files may be in the public domain. The latest information about MySQL can be found at: http://www.mysql.com To get the latest information about this port please subscribe to our -newsgroup/mailinglist mysql2 at www.egroups.com. +newsgroup/mailinglist mysql2 at groups.yahoo.com. To see what MySQL can do, take a look at the features section in the manual. For future plans see the TODO appendix in the manual. @@ -58,7 +57,7 @@ Prerequisite: OS/2 Warp Server for e-Business, eComStation 1.0 (prev 1/2 OK) - TCPIP 4.x installed (requires 32-bit tcpip stack) -- WarpIN installer 0.9.14 (ftp://ftp.os2.org/xworkplace/warpin-0-9-14.exe) +- WarpIN installer 0.9.16 (ftp://ftp.os2.org/xworkplace/warpin-0-9-16.exe) Note: probably some fixpak level is required on both Warp3&Warp4 to support >2GB file sizes. @@ -67,7 +66,7 @@ Save the installation archives into a temporary folder and double click on the main package; otherwise you can drop the mysql package in your WarpIN object or type - WARPIN MYSQL-3-23-??-BLD1.WPI + WARPIN MYSQL-3-23-??-B1.WPI from the command line. The configuration file for MySQL is named my.cnf and it is placed into @@ -75,9 +74,9 @@ your %ETC% directory. Usually it located into the boot driver under x:\MPTN\ETC -If the installation detect an existing configuration file, this will be -renamed to my.cnf.bak; your current settings aren't migrated to current -installation. This file is not deleted by uninstall process. +If the installation detect an existing configuration file, it will not be +overwritten, keeping you settings; see x:\...\mysql\data\my.cnf.sample +for new settings. This file is not deleted by uninstall process. Startup options for MySQL daemon could be added there. As default, client connections uses data compression: if you don't like it, @@ -93,6 +92,19 @@ default into mysql\bin together with client applications. Copy it to your x:\OS2\DLL or another directory in your LIBPATH to run command line utilities from every place. +See documentation for manuals installation. + + +New features +------------ +With build 4, the sql daemon supports a new option + + --preload-client-dll + +that enables preloading of mysql.dll and mysqlu.dll directly by the +server. This way, client programs doesn't need to have the dll's in +the current libpath. + Documentation ------------- @@ -102,7 +114,7 @@ INF documentation (requires OS/2 view or NewView). The PDF documentation is found in - MYSQL-3-23-42-PDF.WPI + MYSQL-3-23-??-PDF.WPI and the INF documentation is found in @@ -115,6 +127,9 @@ The INF documentation could contain errors because of semi-automatic translation from texi original. Also it is not updated as the latest PDF manual (sorry, but conversion from texi to ipf requires quite a lot of work). +To install the manuals, their WPI must be placed in the same directory +of the main WPI package: once the main package installation is started, +new install options will be available (inf or pdf manual). Support @@ -136,6 +151,7 @@ Since this software is ported for free, donations are welcome! You can get also an extended support, which is not free and subject to custom rates. Ask in the mailing list for details. +At least, a post card is welcome! Know problems @@ -161,8 +177,20 @@ All questions that are specific to the OS2/eComStation version should be posted to this list! Please remember to include all relevant information that may help solve your problem. + Building MySQL (VAC++ 4) ------------------------ +Place zlib-1.1.4 at the same level of mysql-3.23.50 +Place ufc lib at the same level of mysql-3.23.50 + +Add the following files: + include\config-os2.h + include\mysql_version.h + mysys\my_os2*.* +Get the following files from Windows source distribution: + strings\ctype_extra_sources.c + libmysql\dll.c + Apply file and patches found in the src\ directory (if exists). Create the following subdirectories diff --git a/os2/build-all.cmd b/os2/build-all.cmd index 9cb9ef6ea44..23558946c79 100644 --- a/os2/build-all.cmd +++ b/os2/build-all.cmd @@ -5,7 +5,6 @@ mkdir ..\lib mkdir ..\obj mkdir ..\obj\zlib -vacbld MySQL-Lib.icc -showprogress=10 -showwarning >> build-all.log vacbld MySQL-Client.icc -showprogress=10 -showwarning >> build-all.log vacbld MySQL-Sql.icc -showprogress=10 -showwarning >> build-all.log vacbld MySQL-Util.icc -showprogress=10 -showwarning >> build-all.log diff --git a/os2/build-all.log b/os2/build-all.log deleted file mode 100644 index a5a64db316f..00000000000 --- a/os2/build-all.log +++ /dev/null @@ -1,39 +0,0 @@ -Item 237 of 47475 (0%) ... source file ..\mysys\list.c -Item 4357 of 29226 (15%) ... source region "extern int _Optlink _spawnve(int, const char *, const char ..." -Item 10021 of 16290 (62%) ... initializer [0x7319920] for uchar to_upper_latin1[] -Item 11487 of 15248 (75%) ... kernel-provided extension source file \rd\mysql\zlib-1.1.3\crc32.c -Item 12920 of 15380 (84%) ... body of function [0x6dca980] int my_strcoll_czech(const uchar *, const uchar *) -Item 13952 of 16411 (85%) ... output object file E:\rd\mysql\vacpp-3.23.33\os2\ft_search.obj -Item 14083 of 16542 (85%) ... publish library or executable marker -Item 1278 of 16668 (8%) ... source region "typedef STARTDATA *PSTARTDATA;" -Item 6013 of 8617 (70%) ... kernel-provided extension source file \rd\mysql\zlib-1.1.3\trees.c -Item 6962 of 8581 (81%) ... initializer [0x229bf00] for const char @485 (static target)[23] "Failed in mysql_init()" -Item 7519 of 9019 (83%) ... initializer [0x2337bc0] for const char @630 (static target)[20] "No query specified -" -Item 8502 of 10001 (85%) ... publish library or executable marker -Item 182 of 49201 (0%) ... source file ..\myisam\mi_statrec.c -Item 2136 of 46089 (5%) ... source region "class Item_sum_udf_float :public Item_udf_sum { public: Item_sum_udf_float ..." -Item 11112 of 25912 (43%) ... source region "extern uint _nisam_get_key(N_KEYDEF *keyinfo ..." -Item 13919 of 24304 (57%) ... initializer [0x1ec6f10] for const short yypgoto[] -Item 15179 of 23800 (64%) ... kernel-provided extension source file \rd\mysql\zlib-1.1.3\trees.c -Item 17342 of 24056 (72%) ... initializer [0x29d1180] for __vftType __vft10Field_date5Field[46] -Item 17912 of 24406 (73%) ... body of function [0x1d1df40] void Item_func_case::print(String *) -Item 18247 of 24721 (74%) ... template instantiation (0x2b9dd20) of declaration of class I_List (2b9dc20) -Item 18775 of 25165 (75%) ... initializer [0x2c45600] for __vftType __vft18Item_func_get_lock4Item[34] -Item 19066 of 25369 (75%) ... initializer [0x2c800d0] for const char @2105 (static target)[22] "parser stack overflow" -Item 19395 of 25535 (76%) ... body of function [0x171eef0] db_type ha_checktype(db_type) -Item 19682 of 25654 (77%) ... body of function [0x17f1860] void kill_mysql() -Item 20070 of 25717 (78%) ... body of function [0x183e570] Item *create_func_date_format(Item *, Item *) -Item 20541 of 25764 (80%) ... body of function [0x1802b40] uint acl_get(const char *, const char *, const char *, const char *, const char *) -Item 21017 of 25874 (81%) ... body of function [0x2c55180] String *field_str::get_max_arg(String *) -Item 21406 of 25988 (82%) ... initializer [0x372d950] for const char @2567 (static target)[7] "%s(%d)" -Item 22411 of 25867 (87%) ... body of function [0x161b160] Item_func_udf_int::Item_func_udf_int(udf_func *) -Item 23345 of 25805 (90%) ... initializer [0x3447840] for const char @2709 (static target)[27] "waiting for handler insert" -Item 23783 of 26226 (91%) ... initializer [0x39a95b0] for const char @2766 (static target)[25] "Creating delayed handler" -Item 24887 of 27330 (91%) ... body of function [0x2b075a0] Item_load_file::~Item_load_file() -Item 25018 of 27461 (91%) ... body of function [0x2cf5e50] Item_sum::Item_sum() -Item 25267 of 27710 (91%) ... body of function [0x1c93d80] bool select_export::send_data(List &) -Item 25484 of 27927 (91%) ... body of function [0x116e840] Item *create_func_ascii(Item *) -Item 3212 of 9073 (35%) ... source region "extern int _mi_cmp_static_record(MI_INFO *info,const byte ..." -Item 7171 of 8564 (84%) ... code csect _test_handle from library E:\bin\IBMCPP40\LIB\CPPRMS40.LIB -Item 8345 of 9738 (86%) ... target E:\rd\mysql\vacpp-3.23.33\os2\..\bin\test\testhash.exe diff --git a/os2/include/Makefile.am b/os2/include/Makefile.am new file mode 100644 index 00000000000..b0478e7c470 --- /dev/null +++ b/os2/include/Makefile.am @@ -0,0 +1,23 @@ +# Copyright (C) 2002 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## Process this file with automake to create Makefile.in + +EXTRA_DIST = config.h pwd.h sgtty.h termio.h +SUBDIRS = sys + +# Don't update the files from bitkeeper +%::SCCS/s.% diff --git a/os2/include/config.h b/os2/include/config.h new file mode 100644 index 00000000000..bb1e3d9bb0f --- /dev/null +++ b/os2/include/config.h @@ -0,0 +1,13 @@ +#include +#include + +#undef HAVE_POSIX_SIGNALS +#undef HAVE_BSD_SIGNALS +#define TERMIO_TTY_DRIVER + +#define ScreenCols() 80 +#define ScreenRows() 25 + +#define tputs(a,b,c) puts(a) +#define kbhit _kbhit +//#define _read_kbd(a, b, c) _kbhit() diff --git a/os2/include/pwd.h b/os2/include/pwd.h new file mode 100644 index 00000000000..ec283586db2 --- /dev/null +++ b/os2/include/pwd.h @@ -0,0 +1 @@ +/* dummy */ diff --git a/os2/include/sgtty.h b/os2/include/sgtty.h new file mode 100644 index 00000000000..ec283586db2 --- /dev/null +++ b/os2/include/sgtty.h @@ -0,0 +1 @@ +/* dummy */ diff --git a/os2/include/sys/Makefile.am b/os2/include/sys/Makefile.am new file mode 100644 index 00000000000..b68f968aafe --- /dev/null +++ b/os2/include/sys/Makefile.am @@ -0,0 +1,22 @@ +# Copyright (C) 2002 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +## Process this file with automake to create Makefile.in + +EXTRA_DIST = file.h + +# Don't update the files from bitkeeper +%::SCCS/s.% diff --git a/os2/include/sys/file.h b/os2/include/sys/file.h new file mode 100644 index 00000000000..ec283586db2 --- /dev/null +++ b/os2/include/sys/file.h @@ -0,0 +1 @@ +/* dummy */ diff --git a/os2/include/termio.h b/os2/include/termio.h new file mode 100644 index 00000000000..cad88caccf9 --- /dev/null +++ b/os2/include/termio.h @@ -0,0 +1,156 @@ +/* sys/termio.h (emx+gcc) */ + +#ifndef _SYS_TERMIO_H +#define _SYS_TERMIO_H + +#if defined (__cplusplus) +extern "C" { +#endif + +/* Request codes */ + +#if !defined (TCGETA) +#define TCGETA 1 +#define TCSETA 2 +#define TCSETAW 3 +#define TCSETAF 4 +#define TCFLSH 5 +#define TCSBRK 6 +#define TCXONC 7 +#endif + +/* c_cc indexes */ + +#if !defined (VINTR) /* Symbols common to termio.h and termios.h */ +#define VINTR 0 +#define VQUIT 1 +#define VERASE 2 +#define VKILL 3 +#define VEOF 4 +#define VEOL 5 +#define VMIN 6 +#define VTIME 7 +#endif + +#define NCC 8 /* Number of the above */ + +/* c_iflag, emx ignores most of the following bits */ + +#if !defined (IGNBRK) /* Symbols common to termio.h and termios.h */ +#define IGNBRK 0x0001 +#define BRKINT 0x0002 +#define IGNPAR 0x0004 +#define PARMRK 0x0008 +#define INPCK 0x0010 +#define ISTRIP 0x0020 +#define INLCR 0x0040 +#define IGNCR 0x0080 +#define ICRNL 0x0100 +#define IUCLC 0x0200 +#define IXON 0x0400 +#define IXANY 0x0800 +#define IXOFF 0x1000 +#define IDELETE 0x8000 /* Extension (emx) */ +#endif + +/* c_oflag, emx ignores all of the following bits */ + +#if !defined (OPOST) /* Symbols common to termio.h and termios.h */ +#define OPOST 0x0001 +#endif +#define OLCUC 0x0002 +#define ONLCR 0x0004 +#define OCRNL 0x0008 +#define ONOCR 0x0010 +#define ONLRET 0x0020 +#define OFILL 0x0040 +#define OFDEL 0x0080 +#define NLDLY 0x0100 /* Mask */ +#define NL0 0x0000 +#define NL1 0x0100 +#define CRDLY 0x0600 /* Mask */ +#define CR0 0x0000 +#define CR1 0x0200 +#define CR2 0x0400 +#define CR3 0x0600 +#define TABDLY 0x1800 /* Mask */ +#define TAB0 0x0000 +#define TAB1 0x0800 +#define TAB2 0x1000 +#define TAB3 0x1800 +#define BSDLY 0x2000 /* Mask */ +#define BS0 0x0000 +#define BS1 0x2000 +#define VTDLY 0x4000 /* Mask */ +#define VT0 0x0000 +#define VT1 0x4000 +#define FFDLY 0x8000 /* Mask */ +#define FF0 0x0000 +#define FF1 0x8000 + +/* c_cflag, emx ignores all of the following bits */ + +#if !defined (CBAUD) +#define CBAUD 0x000f /* Mask */ +#endif +#if !defined (B0) /* Symbols common to termio.h and termios.h */ +#define B0 0x0000 +#define B50 0x0001 +#define B75 0x0002 +#define B110 0x0003 +#define B134 0x0004 +#define B150 0x0005 +#define B200 0x0006 +#define B300 0x0007 +#define B600 0x0008 +#define B1200 0x0009 +#define B1800 0x000a +#define B2400 0x000b +#define B4800 0x000c +#define B9600 0x000d +#define B19200 0x000e +#define B38400 0x000f +#define CSIZE 0x0030 /* Mask */ +#define CS5 0x0000 +#define CS6 0x0010 +#define CS7 0x0020 +#define CS8 0x0030 +#define CSTOPB 0x0040 +#define CREAD 0x0080 +#define PARENB 0x0100 +#define PARODD 0x0200 +#define HUPCL 0x0400 +#define CLOCAL 0x0800 +#define LOBLK 0x1000 +#endif + +/* c_lflag, emx ignores some of the following bits */ + +#if !defined (ISIG) /* Symbols common to termio.h and termios.h */ +#define ISIG 0x0001 +#define ICANON 0x0002 +#define XCASE 0x0004 +#define ECHO 0x0008 +#define ECHOE 0x0010 +#define ECHOK 0x0020 +#define ECHONL 0x0040 +#define NOFLSH 0x0080 +#define IDEFAULT 0x8000 /* Extension (emx) */ +#endif + + +struct termio +{ + unsigned int c_iflag; + unsigned int c_oflag; + unsigned int c_cflag; + unsigned int c_lflag; + unsigned int c_line; + unsigned char c_cc[NCC]; +}; + +#if defined (__cplusplus) +} +#endif + +#endif /* not _SYS_TERMIO_H */ diff --git a/os2/mysql.base b/os2/mysql.base deleted file mode 100644 index 4f0886e0697..00000000000 --- a/os2/mysql.base +++ /dev/null @@ -1,127 +0,0 @@ -#include "mysql.ih" - -> - - -This package will install MySQL for OS/2 SQL engine - - -This package will install MySQL for OS/2 sdk - - -This package will install MySQL for OS/2 documentation - - -This package will install MySQL for OS/2 documentation - - -This package will install MySQL for OS/2 test suite - - - - - - - - - - -~Next - - -readme.os2 - - - - -~I agree - -By pressing the "I agree" button, you agree to all terms and conditions to the below licence agreement. - -license.htm - - - - - - -~Next - -Please select the packages which are to be installed. You may change the target paths for the packages. - - - - - - -I~nstall - -Press "Install" to begin installing this archive. - - - - diff --git a/os2/mysql.ih b/os2/mysql.ih deleted file mode 100644 index 71978c4135a..00000000000 --- a/os2/mysql.ih +++ /dev/null @@ -1,7 +0,0 @@ -#define WARPIN_VERSION "0.9.12" -#define MySQL.Major 3 -#define MySQL.Minor 23 -#define MySQL.Rev 40 -#define MySQL\VER 3\23\40 -#define MySQL.VER 3.23.40 -#define MySQL-VER 3-23-40 diff --git a/os2/readme.os2 b/os2/readme.os2 deleted file mode 100644 index 9936dd15369..00000000000 --- a/os2/readme.os2 +++ /dev/null @@ -1,190 +0,0 @@ -MySQL 3.23.40 for OS/2 Warp build 1 -==================================================== - -Contents --------- -Welcome to the latest port of MySQL for OS/2 and eComStation. - -Modules included in this build: - - protocol data compression - - transaction support - - perl BDB/BDI support (not in this package) - - Library and header files for C/CPP developers included - -This package has been built using IBM VAC++ 4.0 - -The MySQL server is distributed under the GPL license. Please refer to -the file COPYING for the license information. - -The MySQL client library is distributed under the LGPL license. -Please refer to the file COPYING for the license information. - -Most of the MySQL clients are distributed under the GPL license, but -some files may be in the public domain. - -The latest information about MySQL can be found at: http://www.mysql.com - -To get the latest information about this port please subscribe to our -newsgroup/mailinglist mysql2 at www.egroups.com. - -To see what MySQL can do, take a look at the features section in the -manual. For future plans see the TODO appendix in the manual. - -New features/bug fixes history is in the news appendix in the manual. - -For the currently known bugs/misfeatures (known errors) see the bugs -appendix in the manual. The OS/2 section contains notes that are -specific to the MySQL OS/2 and eComStation version. - -Please note that MySQL is a constantly moving target. New builds for -Linux are made available every week. This port may therefore be a few -minor versions after the latest Linux/Win32 builds but its generally -more stable than the "latest and greates" port. - -MySQL is brought to you by: TcX DataKonsult AB & MySQL Finland AB - -This port is brought to you by: - -Yuri Dario , development, porting -Timo Maier , documentation, testing -John M Alfredsson , documentation, testing - - -Installation ------------- -Prerequisite: - -- OS/2 Warp 3 with FP ?? or later, - OS/2 Warp 4 with FP ?? or later, - OS/2 Warp Server for e-Business, - eComStation 1.0 (prev 1/2 OK) -- TCPIP 4.x installed (requires 32-bit tcpip stack) -- WarpIN installer 0.9.12 (ftp://ftp.os2.org/xworkplace/warpin-0-9-12.zip) - -Note: probably some fixpak level is required on both Warp3&Warp4 to - support >2GB file sizes. - -Save the installation archives into a temporary folder and double click -on the main package; otherwise you can drop the mysql package in your -WarpIN object or type - - WARPIN MYSQL-3-23-??-B1.WPI - -from the command line. -The configuration file for MySQL is named my.cnf and it is placed into -your %ETC% directory. Usually it located into the boot driver under - - x:\MPTN\ETC - -If the installation detect an existing configuration file, this will be -renamed to my.cnf.bak; your current settings aren't migrated to current -installation. This file is not deleted by uninstall process. -Startup options for MySQL daemon could be added there. - -As default, client connections uses data compression: if you don't like it, -remove the following from your %ETC%\my.cnf - - [client] - compress - -The server switches automatically compression mode on client request. - -SMP systems: while my developement system is a SMP one, and here MySQL seems -to run fine with two processors enabled, keep in mind that both EMX runtime -and current thread model are not SMP safe. - -This release comes with DLL client library MYSQL.DLL: it is installed by -default into mysql\bin together with client applications. Copy it to your -x:\OS2\DLL or another directory in your LIBPATH to run command line -utilities from every place. - - -Documentation -------------- -Documentation is provided in separate files. You can use either -the PDF documentation (requires Adobe Acrobat Reader) or the -INF documentation (requires OS/2 view or NewView). - -The PDF documentation is found in MYSQL-3-23-28-PDF.WPI and -the INF documentation is found in MYSQL-3-23-28-INF.WPI - -The latest documentation can always be downloaded from -http://www.mysql.com. However this documentation may -no fully apply to this port. -The INF documentation could contain errors because of semi-automatic -translation from texi original. - -Support -------- -Since MySQL is a OpenSource freeware product there are no -formal support options available. - -Please subscribe to mysql2 at www.egroups.com to get in contact -with other users using this port. - -http://www.egroups.com/group/mysql2 - -This newsgroup/mailinglist is the official "home" of this port. - - -Know problems -------------- -alter_table.test and show_check are failing, reporting a different status -message: actually seems only a different text, no bugs in table checking. - - -Apache/2 + PHP --------------- -To avoid problems with different socket when you use PHP and Apache -webserver, get the PHP4 module from the Apache Server for OS/2 homepage -http://silk.apana.org.au/apache/ - - -Developing MySQL ----------------- -If you want to help us develop MySQL for OS2/eComStation please join -the mysql2 mailinglist at www.egroups.com and ask for help to set up -your environment! - -All questions that are specific to the OS2/eComStation version should -be posted to this list! Please remember to include all relevant -information that may help solve your problem. - - -Building MySQL (EMX) --------------------- -NOTE: these instructions are outdated - -db-3.2.x: before compiling MySQL, you need to setup Berkeley DB. Untar -the distribution, enter dist directory and run - -attrib -r * /s -sh -c s_config - -to create proper aclocal macros and configure headers. - -In the src directory you will find patches used to build this release -of MySQL. -You can run 'sh -c config.status' to create current makefiles without -running autoconf & configure. - -apply previous patches (if not already included) -sh -c autoconf (upgrade scripts) -sh -c configure.os2 (config system) -edit config.status: - s%@MYSQL_UNIX_ADDR@%\\socket\\MySQL%g - s%@LN_CP_F@%cp.exe%g - replace -O2 -m486 with -mpentiumpro -sh -c config.status (upgrade makefiles again) -edit libmysql\Makefile - remove all occurences of -Zexe - replace libmysqlclient with libmysql (case sensitive search) -edit client\Makefile - replace libmysqlclient with libmysql (case sensitive search) -make - -After config.status, you have to edit include\mysql_version.h and correct -the socket definition (\\socket\\MySQL is correct). -If you go with configure, you have to change LN_CP_F macro from 'ln -s' to -'cp' and correct all makefiles (sh -c config.status will do it). - diff --git a/os2/rint.obj b/os2/rint.obj index 41c766c6661..1231f093327 100644 Binary files a/os2/rint.obj and b/os2/rint.obj differ -- cgit v1.2.1 From 335c58d1c2c2359c7abafa5d2ed7fc1a374bb7b1 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 16 Jul 2002 03:29:02 +0300 Subject: sql_db.cc: On Monty's suggestion move ha_drop_database back inside LOCK_mysql_create_db, but we release LOCK_open during it to let possible running queries complete. I tested this and it seemed to work also in complex concurrent DELETE, SELECT, DROP DATABASE, and CREATE DATABASE situations sql/sql_db.cc: On Monty's suggestion move ha_drop_database back inside LOCK_mysql_create_db, but we release LOCK_open during it to let possible running queries complete. I tested this and it seemed to work also in complex concurrent DELETE, SELECT, DROP DATABASE, and CREATE DATABASE situations --- sql/sql_db.cc | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/sql/sql_db.cc b/sql/sql_db.cc index a3829aae073..688a6055a7b 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -166,6 +166,15 @@ void mysql_rm_db(THD *thd,char *db,bool if_exists) if ((deleted=mysql_rm_known_files(thd, dirp, path,0)) >= 0) { + /* If there are running queries on the tables, MySQL needs to get + access to LOCK_open to end them. InnoDB on the other hand waits + for the queries to end before dropping the database. That is why we + must do the dropping with LOCK_open released. */ + + VOID(pthread_mutex_unlock(&LOCK_open)); + ha_drop_database(path); + VOID(pthread_mutex_lock(&LOCK_open)); + if (!thd->query) { thd->query = path; @@ -190,16 +199,6 @@ exit: VOID(pthread_mutex_unlock(&LOCK_open)); VOID(pthread_mutex_unlock(&LOCK_mysql_create_db)); - /* If there are running queries on the tables, MySQL needs to get - access to LOCK_open to end them. InnoDB on the other hand waits - for the queries to end before dropping the database. That is why we - must do the dropping outside of the mutexes above, otherwise the server - always hangs if there are running queries. We only drop inside InnoDB - if deleted got value >= 0 which means that it was successful. */ - - if (deleted >= 0) - ha_drop_database(path); - DBUG_VOID_RETURN; } -- cgit v1.2.1 From daede62b02cbd6a9e46638d02624839c361f9650 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 16 Jul 2002 13:59:24 +0300 Subject: os0thread.h, srv0srv.c: Increase max number of waiting threads to 10000 and put diagnostic prints if this value is exceeded innobase/srv/srv0srv.c: Increase max number of waiting threads to 10000 and put diagnostic prints if this value is exceeded innobase/include/os0thread.h: Increase max number of waiting threads to 10000 and put diagnostic prints if this value is exceeded --- innobase/include/os0thread.h | 6 ++++-- innobase/srv/srv0srv.c | 26 +++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/innobase/include/os0thread.h b/innobase/include/os0thread.h index 2e4b6f0f6ee..0d6fa5a8f37 100644 --- a/innobase/include/os0thread.h +++ b/innobase/include/os0thread.h @@ -12,8 +12,10 @@ Created 9/8/1995 Heikki Tuuri #include "univ.i" -/* Maximum number of threads which can be created in the program */ -#define OS_THREAD_MAX_N 1000 +/* Maximum number of threads which can be created in the program; +this is also the size of the wait slot array for MySQL threads which +can wait inside InnoDB */ +#define OS_THREAD_MAX_N 10000 /* Possible fixed priorities for threads */ #define OS_THREAD_PRIORITY_NONE 100 diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c index 556a4256e9e..80de52dc4a1 100644 --- a/innobase/srv/srv0srv.c +++ b/innobase/srv/srv0srv.c @@ -2001,7 +2001,31 @@ srv_table_reserve_slot_for_mysql(void) while (slot->in_use) { i++; - ut_a(i < OS_THREAD_MAX_N); + + if (i >= OS_THREAD_MAX_N) { + + ut_print_timestamp(stderr); + + fprintf(stderr, +" InnoDB: There appear to be %lu MySQL threads currently waiting\n" +"InnoDB: inside InnoDB, which is the upper limit. Cannot continue operation.\n" +"InnoDB: We intentionally generate a seg fault to print a stack trace\n" +"InnoDB: on Linux. But first we print a list of waiting threads.\n", i); + + for (i = 0; i < OS_THREAD_MAX_N; i++) { + + slot = srv_mysql_table + i; + + fprintf(stderr, +"Slot %lu: thread id %lu, type %lu, in use %lu, susp %lu, time %lu\n", + i, (ulint)(slot->id), + slot->type, slot->in_use, + slot->suspended, + (ulint)difftime(ut_time(), slot->suspend_time)); + } + + ut_a(0); + } slot = srv_mysql_table + i; } -- cgit v1.2.1 From e7454a0725c233c1945b1c5e89131cd98e2a5649 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 16 Jul 2002 16:48:56 +0500 Subject: Brazilian Portuguesse messages BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted --- BitKeeper/etc/logging_ok | 1 + sql/share/pt_br/errmsg.txt | 225 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 226 insertions(+) create mode 100644 sql/share/pt_br/errmsg.txt diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 5bc690d4061..16db163b051 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -24,3 +24,4 @@ sinisa@rhols221.adsl.netsonic.fi zak@balfor.local monty@narttu. monty@mashka.mysql.fi +bar@bar.udmsearch.izhnet.ru diff --git a/sql/share/pt_br/errmsg.txt b/sql/share/pt_br/errmsg.txt new file mode 100644 index 00000000000..92a29a0e939 --- /dev/null +++ b/sql/share/pt_br/errmsg.txt @@ -0,0 +1,225 @@ +/* Copyright Abandoned 1997 TCX DataKonsult AB & Monty Program KB & Detron HB + This file is public domain and comes with NO WARRANTY of any kind */ +/* Updated by Roberto de Martin Serqueira - martinsc@uol.com.br - 07.05.2002 */ + + + + +"hashchk", +"isamchk", +"não", +"sim", +"Não pode criar arquivo '%-.64s' (erro no. %d)", +"Não pode criar tabela '%-.64s' (erro no. %d)", +"Não pode criar banco de dados '%-.64s' (erro no. %d)", +"Não pode criar banco de dados '%-.64s'. Banco de dados já existe", +"Não pode eliminar banco de dados '%-.64s'. Banco de dados não existe", +"Erro ao eliminar banco de dados (não pode eliminar '%-.64s' - erro no. %d)", +"Erro ao eliminar banco de dados (não pode remover diretório '%-.64s' - erro no. %d)", +"Erro na deleção de '%-.64s' (erro no. %d)", +"Não pode ler registro em tabela do sistema", +"Não pode obter status de '%-.64s' (erro no. %d)", +"Não pode obter diretório corrente (erro no. %d)", +"Não pode bloquear arquivo (erro no. %d)", +"Não pode abrir arquivo '%-.64s' (erro no. %d)", +"Não pode encontrar arquivo '%-.64s' (erro no. %d)", +"Não pode ler diretório de '%-.64s' (erro no. %d)", +"Não pode mudar para o diretório '%-.64s' (erro no. %d)", +"Registro alterado desde a última leitura da tabela '%-.64s'", +"Disco cheio (%s). Aguardando alguém liberar algum espaço....", +"Não pode gravar. Chave duplicada na tabela '%-.64s'", +"Erro ao fechar '%-.64s' (erro no. %d)", +"Erro ao ler arquivo '%-.64s' (erro no. %d)", +"Erro ao renomear '%-.64s' para '%-.64s' (erro no. %d)", +"Erro ao gravar arquivo '%-.64s' (erro no. %d)", +"'%-.64s' está com bloqueio contra alterações", +"Ordenação abortada", +"'View' '%-.64s' não existe para '%-.64s'", +"Obteve erro %d no manipulador de tabelas", +"Manipulador de tabela para '%-.64s' não tem esta opção", +"Não pode encontrar registro em '%-.64s'", +"Informação incorreta no arquivo '%-.64s'", +"Arquivo de índice incorreto para tabela '%-.64s'. Tente reparar", +"Arquivo chave desatualizado para tabela '%-.64s'. Repare-o!", +"Tabela '%-.64s' é somente para leitura", +"Sem memória. Reinicie o programa e tente novamente (necessita de %d bytes)", +"Sem memória para ordenação. Aumente tamanho do 'buffer' de ordenação", +"Encontrado fim de arquivo inesperado ao ler arquivo '%-.64s' (erro no. %d)", +"Excesso de conexões", +"Sem memória. Verifique se o mysqld ou algum outro processo está usando toda memória disponível. Se não, você pode ter que usar 'ulimit' para permitir ao mysqld usar mais memória ou você pode adicionar mais área de 'swap'", +"Não pode obter nome do 'host' para seu endereço", +"Negociação de acesso falhou", +"Acesso negado para o usuário '%-.32s@%-.64s' ao banco de dados '%-.64s'", +"Acesso negado para o usuário '%-.32s@%-.64s' (uso de senha: %s)", +"Nenhum banco de dados foi selecionado", +"Comando desconhecido", +"Coluna '%-.64s' não pode ter NULL", +"Banco de dados '%-.64s' desconhecido", +"Tabela '%-.64s' já existe", +"Tabela '%-.64s' desconhecida", +"Coluna '%-.64s' em '%-.64s' é ambígua", +"'Shutdown' do servidor em andamento", +"Coluna '%-.64s' desconhecida em '%-.64s'", +"'%-.64s' não está em 'GROUP BY'", +"Não pode agrupar em '%-.64s'", +"Cláusula contém funções de soma e colunas juntas", +"Contagem de colunas não confere com a contagem de valores", +"Nome identificador '%-.100s' é longo demais", +"Nome da coluna '%-.64s' duplicado", +"Nome da chave '%-.64s' duplicado", +"Entrada '%-.64s' duplicada para a chave %d", +"Especificador de coluna incorreto para a coluna '%-.64s'", +"%s próximo a '%-.80s' na linha %d", +"'Query' estava vazia", +"Tabela/alias '%-.64s' não única", +"Valor 'default' inválido para '%-.64s'", +"Definida mais de uma chave primária", +"Especificadas chaves demais. O máximo permitido são %d chaves", +"Especificadas partes de chave demais. O máximo permitido são %d partes", +"Chave especificada longa demais. O comprimento de chave máximo permitido é %d", +"Coluna chave '%-.64s' não existe na tabela", +"Coluna BLOB '%-.64s' não pode ser utilizada na especificação de chave para o tipo de tabela usado", +"Comprimento da coluna '%-.64s' grande demais (max = %d). Use BLOB em seu lugar", +"Definição incorreta de tabela. Somente é permitido um único campo auto-incrementado e ele tem que ser definido como chave", +"%s: Pronto para conexões\n", +"%s: 'Shutdown' normal\n", +"%s: Obteve sinal %d. Abortando!\n", +"%s: 'Shutdown' completo\n", +"%s: Forçando finalização da 'thread' %ld - usuário '%-.32s'\n", +"Não pode criar 'IP socket'", +"Tabela '%-.64s' não possui um índice como o usado em CREATE INDEX. Recrie a tabela", +"Argumento separador de campos não é o esperado. Confira no manual", +"Você não pode usar comprimento de linha fixo com BLOBs. Favor usar 'fields terminated by'", +"Arquivo '%-.64s' tem que estar no diretório do banco de dados ou ter leitura possível para todos", +"Arquivo '%-.80s' já existe", +"Registros: %ld - Deletados: %ld - Ignorados: %ld - Avisos: %ld", +"Registros: %ld - Duplicados: %ld", +"Parte de chave incorreta. A parte de chave usada não é um 'string' ou o comprimento usado é maior do que a parte de chave ou o manipulador de tabelas não aceita partes de chaves únicas", +"Você não pode deletar todas as colunas com ALTER TABLE. Use DROP TABLE em seu lugar", +"Não pode fazer DROP '%-.64s'. Confira se esta coluna/chave existe", +"Registros: %ld - Duplicados: %ld - Avisos: %ld", +"INSERT TABLE '%-.64s' não é permitido em lista de tabelas FROM", +"'Id' de 'thread' %lu desconhecido", +"Você não é proprietário da 'thread' %lu", +"Nenhuma tabela usada", +"'Strings' demais para coluna '%-.64s' e SET", +"Não pode gerar um nome de arquivo de 'log' único '%-.64s'.(1-999)\n", +"Tabela '%-.64s' foi bloqueada com bloqueio de READ e não pode ser atualizada", +"Tabela '%-.64s' não foi bloqueada com LOCK TABLES", +"Coluna BLOB '%-.64s' não pode ter um valor 'default'", +"Nome de banco de dados '%-.100s' incorreto", +"Nome de tabela '%-.100s' incorreto", +"O SELECT examinaria registros demais e provavelmente tomaria um tempo muito longo. Confira sua cláusula WHERE e use SET OPTION SQL_BIG_SELECTS=1, se o SELECT estiver correto", +"Erro desconhecido", +"'Procedure' '%-.64s' desconhecida", +"Número de parâmetros incorreto para a 'procedure' '%-.64s'", +"Parâmetros incorretos para a 'procedure' '%-.64s'", +"Tabela '%-.64s' desconhecida em '%-.32s'", +"Coluna '%-.64s' especificada duas vezes", +"Uso inválido de função de grupo", +"Tabela '%-.64s' usa uma extensão que não existe nesta versão do MySQL", +"Uma tabela tem que ter pelo menos uma (1) coluna", +"Tabela '%-.64s' está cheia", +"Conjunto de caracteres '%-.64s' desconhecido", +"Tabelas demais. O MySQL pode usar somente %d tabelas em um JOIN", +"Colunas demais", +"Tamanho de linha grande demais. O máximo tamanho de linha, não contando BLOBs, é %d. Você tem que mudar alguns campos para BLOBs", +"Estouro da pilha do 'thread'. Usados %ld de uma pilha de %ld . Use 'mysqld -O thread_stack=#' para especificar uma pilha maior, se necessário", +"Dependência cruzada encontrada em OUTER JOIN. Examine suas condições ON", +"Coluna '%-.64s' é usada com UNIQUE ou INDEX, mas não está definida como NOT NULL", +"Não pode carregar a função '%-.64s'", +"Não pode inicializar a função '%-.64s' - '%-.80s'", +"Não é permitido caminho para biblioteca compartilhada", +"Função '%-.64s' já existe", +"Não pode abrir biblioteca compartilhada '%-.64s' (erro no. '%d' - '%-.64s')", +"Não pode encontrar a função '%-.64s' na biblioteca", +"Função '%-.64s' não está definida", +"'Host' '%-.64s' está bloqueado devido a muitos erros de conexão. Desbloqueie com 'mysqladmin flush-hosts'", +"'Host' '%-.64s' não tem permissão para se conectar com este servidor MySQL", +"Você está usando o MySQL como usuário anônimo e usuários anônimos não têm permissão para mudar senhas", +"Você tem que ter o privilégio para atualizar tabelas no banco de dados mysql para ser capaz de mudar a senha de outros", +"Não pode encontrar nenhuma linha que combine na tabela user", +"Linhas que combinaram: %ld - Alteradas: %ld - Avisos: %ld", +"Não pode criar uma nova 'thread' (erro no. %d). Se você não estiver sem memória disponível, você pode consultar o manual sobre um possível 'bug' dependente do sistema operacional", +"Contagem de colunas não confere com a contagem de valores na linha %ld", +"Não pode reabrir a tabela '%-.64s', +"Uso inválido do valor NULL", +"Obteve erro '%-.64s' em regexp", +"Mistura de colunas GROUP (MIN(),MAX(),COUNT()...) com colunas não GROUP é ilegal, se não existir cláusula GROUP BY", +"Não existe tal 'grant' definido para o usuário '%-.32s' no 'host' '%-.64s'", +"Comando '%-.16s' negado para o usuário '%-.32s@%-.64s' na tabela '%-.64s'", +"Comando '%-.16s' negado para o usuário '%-.32s@%-.64s' na coluna '%-.64s', na tabela '%-.64s'", +"Comando GRANT/REVOKE ilegal. Por favor consulte no manual quais privilégios podem ser usados.", +"Argumento de 'host' ou de usuário para o GRANT é longo demais", +"Tabela '%-.64s.%-.64s' não existe", +"Não existe tal 'grant' definido para o usuário '%-.32s' no 'host' '%-.64s', na tabela '%-.64s'", +"Comando usado não é permitido para esta versão do MySQL", +"Você tem um erro de sintaxe no seu SQL", +"'Thread' de inserção retardada ('delayed') não conseguiu obter bloqueio solicitado para tabela '%-.64s'", +"Excesso de 'threads' retardadas ('delayed') em uso", +"Conexão %ld abortou para o banco de dados '%-.64s' - usuário '%-.32s' (%-.64s)", +"Obteve um pacote maior do que 'max_allowed_packet'", +"Obteve um erro de leitura no 'pipe' da conexão", +"Obteve um erro em fcntl()", +"Obteve pacotes fora de ordem", +"Não conseguiu descomprimir pacote de comunicação", +"Obteve um erro na leitura de pacotes de comunicação", +"Obteve expiração de tempo ('timeout') na leitura de pacotes de comunicação", +"Obteve um erro na escrita de pacotes de comunicação", +"Obteve expiração de tempo ('timeout') na escrita de pacotes de comunicação", +"'String' resultante é mais longa do que 'max_allowed_packet'", +"Tipo de tabela usado não permite colunas BLOB/TEXT", +"Tipo de tabela usado não permite colunas AUTO_INCREMENT", +"INSERT DELAYED não pode ser usado com a tabela '%-.64s', porque ela está bloqueada com LOCK TABLES", +"Nome de coluna '%-.100s' incorreto", +"O manipulador de tabela usado não pode indexar a coluna '%-.64s'", +"Tabelas no MERGE não estão todas definidas identicamente", +"Não pode gravar, devido à restrição UNIQUE, na tabela '%-.64s'", +"Coluna BLOB '%-.64s' usada na especificação de chave sem o comprimento da chave", +"Todas as partes de uma PRIMARY KEY têm que ser NOT NULL. Se você precisar de NULL em uma chave, use UNIQUE em seu lugar", +"O resultado consistiu em mais do que uma linha", +"Este tipo de tabela requer uma chave primária", +"Esta versão do MySQL não foi compilada com suporte a RAID", +"Você está usando modo de atualização seguro e tentou atualizar uma tabela sem um WHERE que use uma coluna de KEY", +"Chave '%-.64s' não existe na tabela '%-.64s'", +"Não pode abrir a tabela", +"O manipulador de tabela não suporta check/repair", +"Não lhe é permitido executar este comando em uma transação", +"Obteve erro %d durante COMMIT", +"Obteve erro %d durante ROLLBACK", +"Obteve erro %d durante FLUSH_LOGS", +"Obteve erro %d durante CHECKPOINT", +"Conexão %ld abortada ao banco de dados '%-.64s' - usuário '%-.32s' - 'host' `%-.64s' ('%-.64s')", +"O manipulador de tabela não suporta DUMP binário de tabela", +"'Binlog' fechado. Não pode fazer RESET MASTER", +"Falhou na reconstrução do índice da tabela '%-.64s' 'dumped'", +"Erro no 'master' '%-.64s'", +"Erro de rede na leitura do 'master'", +"Erro de rede na gravação do 'master'", +"Não pode encontrar índice FULLTEXT que combine com a lista de colunas", +"Não pode executar o comando dado porque você tem tabelas ativas bloqueadas ou uma transação ativa", +"Variável de sistema '%-.64s' desconhecida", +"Tabela '%-.64s' está marcada como danificada e deve ser reparada", +"Tabela '%-.64s' está marcada como danificada e a última reparação (automática?) falhou", +"Aviso: Algumas tabelas não-transacionais alteradas não puderam ser reconstituídas ('rolled back')", +"Transação 'multi-statement' requereu mais do que 'max_binlog_cache_size' bytes de armazenagem. Aumente o valor desta variável do mysqld e tente novamente', +"Esta operação não pode ser realizada com um 'slave' em execução. Execute SLAVE STOP primeiro", +"Esta operação requer um 'slave' em execução. Configure o 'slave' e execute SLAVE START", +"O servidor não está configurado como 'slave'. Acerte o arquivo de configuração ou use CHANGE MASTER TO", +"Não pode inicializar a estrutura de informação do 'master'. Verifique as permissões em 'master.info'", +"Não conseguiu criar 'thread' de 'slave'. Verifique os recursos do sistema", +"Usuário '%-.64s' já possui 'max_user_connections' conexões ativas", +"Você pode usar apenas expressões de constante com SET", +"Excedido tempo de espera ('timeout') do bloqueio; tente reiniciar a transação", +"O número total de bloqueios excede o tamanho da tabela de bloqueios", +"Bloqueios de atualização não podem ser obtidos durante uma transação de READ UNCOMMITTED", +"DROP DATABASE não permitido enquanto uma 'thread' está mantendo um bloqueio global de leitura", +"CREATE DATABASE não permitido enquanto uma 'thread' está mantendo um bloqueio global de leitura", +"Argumentos errados para %s", +"Não é permitido a %-.32s@%-.64s criar novos usuários", +"Definição incorreta de tabela; todas as tabelas em MERGE têm que estar no mesmo banco de dados", +"Encontrado impasse ('deadlock') ao tentar obter bloqueio; tente reiniciar a transação", +"O tipo de tabela usado não suporta índices FULLTEXT", +"Não pode adicionar restrição em chave externa", +"Não pode adicionar linha filha: uma restrição em chave externa não funciona", +"Não pode deletar linha mãe: uma restrição em chave externa não funciona", -- cgit v1.2.1 From 1b05330d58914741a397bba51883a1bc7bc95657 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 16 Jul 2002 16:55:22 +0500 Subject: Adding pt_br --- configure.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.in b/configure.in index 460c5e73abe..ef5bc1858f9 100644 --- a/configure.in +++ b/configure.in @@ -27,7 +27,7 @@ MYSQL_UNIX_ADDR_DEFAULT="/tmp/mysql.sock" # Remember to add a directory sql/share/LANGUAGE AVAILABLE_LANGUAGES="\ czech danish dutch english estonian french german greek hungarian \ -italian japanese korean norwegian norwegian-ny polish portuguese \ +italian japanese korean norwegian norwegian-ny polish portuguese pt_br \ romanian russian slovak spanish swedish ukrainian" # Generate make rules for all error messages -- cgit v1.2.1 From 1ca6b811e5f9ba5b47f4390ab1f56028c20d925a Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 16 Jul 2002 17:18:54 +0500 Subject: In my previous commit I didn't notice that we already have brazilian portuguese :( BitKeeper/deleted/.del-errmsg.txt~7b5c3eb97e12d271: Delete: sql/share/pt_br/errmsg.txt configure.in: Remove pt_br sql/share/portuguese/errmsg.txt: Update portuhuese --- configure.in | 2 +- sql/share/portuguese/errmsg.txt | 144 ++++++++++++------------- sql/share/pt_br/errmsg.txt | 225 ---------------------------------------- 3 files changed, 73 insertions(+), 298 deletions(-) delete mode 100644 sql/share/pt_br/errmsg.txt diff --git a/configure.in b/configure.in index ef5bc1858f9..460c5e73abe 100644 --- a/configure.in +++ b/configure.in @@ -27,7 +27,7 @@ MYSQL_UNIX_ADDR_DEFAULT="/tmp/mysql.sock" # Remember to add a directory sql/share/LANGUAGE AVAILABLE_LANGUAGES="\ czech danish dutch english estonian french german greek hungarian \ -italian japanese korean norwegian norwegian-ny polish portuguese pt_br \ +italian japanese korean norwegian norwegian-ny polish portuguese \ romanian russian slovak spanish swedish ukrainian" # Generate make rules for all error messages diff --git a/sql/share/portuguese/errmsg.txt b/sql/share/portuguese/errmsg.txt index 7737fe6b1fd..d1d9bbc5681 100644 --- a/sql/share/portuguese/errmsg.txt +++ b/sql/share/portuguese/errmsg.txt @@ -1,28 +1,28 @@ /* Copyright Abandoned 1997 TCX DataKonsult AB & Monty Program KB & Detron HB This file is public domain and comes with NO WARRANTY of any kind */ -/* Updated by Roberto de Martin Serqueira - martinsc@uol.com.br - 08.20.2001 */ +/* Updated by Thiago Delgado Pinto - thiagodp@ieg.com.br - 06.07.2002 */ "hashchk", "isamchk", -"não", -"sim", -"Não pode criar arquivo '%-.64s' (erro no. %d)", -"Não pode criar tabela '%-.64s' (erro no. %d)", -"Não pode criar banco de dados '%-.64s' (erro no. %d)", -"Não pode criar banco de dados '%-.64s'. Banco de dados já existe", -"Não pode eliminar banco de dados '%-.64s'. Banco de dados não existe", +"NÃO", +"SIM", +"Não pode criar o arquivo '%-.64s' (erro no. %d)", +"Não pode criar a tabela '%-.64s' (erro no. %d)", +"Não pode criar o banco de dados '%-.64s' (erro no. %d)", +"Não pode criar o banco de dados '%-.64s'. Este banco de dados já existe", +"Não pode eliminar o banco de dados '%-.64s'. Este banco de dados não existe", "Erro ao eliminar banco de dados (não pode eliminar '%-.64s' - erro no. %d)", "Erro ao eliminar banco de dados (não pode remover diretório '%-.64s' - erro no. %d)", -"Erro na deleção de '%-.64s' (erro no. %d)", -"Não pode ler registro em tabela do sistema", -"Não pode obter status de '%-.64s' (erro no. %d)", -"Não pode obter diretório corrente (erro no. %d)", -"Não pode travar arquivo (erro no. %d)", -"Não pode abrir arquivo '%-.64s' (erro no. %d)", -"Não pode encontrar arquivo '%-.64s' (erro no. %d)", -"Não pode ler diretório de '%-.64s' (erro no. %d)", +"Erro na remoção de '%-.64s' (erro no. %d)", +"Não pode ler um registro numa tabela do sistema", +"Não pode obter o status de '%-.64s' (erro no. %d)", +"Não pode obter o diretório corrente (erro no. %d)", +"Não pode travar o arquivo (erro no. %d)", +"Não pode abrir o arquivo '%-.64s' (erro no. %d)", +"Não pode encontrar o arquivo '%-.64s' (erro no. %d)", +"Não pode ler o diretório de '%-.64s' (erro no. %d)", "Não pode mudar para o diretório '%-.64s' (erro no. %d)", "Registro alterado desde a última leitura da tabela '%-.64s'", -"Disco cheio (%s). Aguardando alguém liberar algum espaço....", +"Disco cheio (%s). Aguardando alguém liberar algum espaço...", "Não pode gravar. Chave duplicada na tabela '%-.64s'", "Erro ao fechar '%-.64s' (erro no. %d)", "Erro ao ler arquivo '%-.64s' (erro no. %d)", @@ -30,13 +30,13 @@ "Erro ao gravar arquivo '%-.64s' (erro no. %d)", "'%-.64s' está com travamento contra alterações", "Ordenação abortada", -"'View' '%-.64s' não existe para '%-.64s'", +"Visão '%-.64s' não existe para '%-.64s'", "Obteve erro %d no manipulador de tabelas", "Manipulador de tabela para '%-.64s' não tem esta opção", "Não pode encontrar registro em '%-.64s'", "Informação incorreta no arquivo '%-.64s'", -"Arquivo de índice incorreto para tabela '%-.64s'. Tente reparar", -"Arquivo chave desatualizado para tabela '%-.64s'. Repare-o!", +"Arquivo de índice incorreto para tabela '%-.64s'. Tente repará-lo", +"Arquivo de índice desatualizado para tabela '%-.64s'. Repare-o!", "Tabela '%-.64s' é somente para leitura", "Sem memória. Reinicie o programa e tente novamente (necessita de %d bytes)", "Sem memória para ordenação. Aumente tamanho do 'buffer' de ordenação", @@ -46,10 +46,10 @@ "Não pode obter nome do 'host' para seu endereço", "Negociação de acesso falhou", "Acesso negado para o usuário '%-.32s@%-.64s' ao banco de dados '%-.64s'", -"Acesso negado para o usuário '%-.32s@%-.64s' (uso de senha: %s)", +"Acesso negado para o usuário '%-.32s@%-.64s' (senha usada: %s)", "Nenhum banco de dados foi selecionado", "Comando desconhecido", -"Coluna '%-.64s' não pode ter NULL", +"Coluna '%-.64s' não pode ser vazia", "Banco de dados '%-.64s' desconhecido", "Tabela '%-.64s' já existe", "Tabela '%-.64s' desconhecida", @@ -66,9 +66,9 @@ "Entrada '%-.64s' duplicada para a chave %d", "Especificador de coluna incorreto para a coluna '%-.64s'", "%s próximo a '%-.80s' na linha %d", -"'Query' estava vazia", +"Consulta (query) estava vazia", "Tabela/alias '%-.64s' não única", -"Valor 'default' inválido para '%-.64s'", +"Valor padrão (default) inválido para '%-.64s'", "Definida mais de uma chave primária", "Especificadas chaves demais. O máximo permitido são %d chaves", "Especificadas partes de chave demais. O máximo permitido são %d partes", @@ -82,50 +82,50 @@ "%s: Obteve sinal %d. Abortando!\n", "%s: 'Shutdown' completo\n", "%s: Forçando finalização da 'thread' %ld - usuário '%-.32s'\n", -"Não pode criar 'IP socket'", +"Não pode criar o soquete IP", "Tabela '%-.64s' não possui um índice como o usado em CREATE INDEX. Recrie a tabela", -"Argumento separador de campos não é o esperado. Confira no manual", -"Você não pode usar comprimento de linha fixo com BLOBs. Favor usar 'fields terminated by'", +"Argumento separador de campos não é o esperado. Cheque o manual", +"Você não pode usar comprimento de linha fixo com BLOBs. Por favor, use campos com comprimento limitado.", "Arquivo '%-.64s' tem que estar no diretório do banco de dados ou ter leitura possível para todos", "Arquivo '%-.80s' já existe", "Registros: %ld - Deletados: %ld - Ignorados: %ld - Avisos: %ld", "Registros: %ld - Duplicados: %ld", -"Parte de chave incorreta. A parte de chave usada não é um 'string' ou o comprimento usado é maior do que a parte de chave ou o manipulador de tabelas não aceita partes de chaves únicas", +"Sub parte da chave incorreta. A parte da chave usada não é uma 'string' ou o comprimento usado é maior que parte da chave ou o manipulador de tabelas não suporta sub chaves únicas", "Você não pode deletar todas as colunas com ALTER TABLE. Use DROP TABLE em seu lugar", -"Não pode fazer DROP '%-.64s'. Confira se esta coluna/chave existe", +"Não se pode fazer DROP '%-.64s'. Confira se esta coluna/chave existe", "Registros: %ld - Duplicados: %ld - Avisos: %ld", -"INSERT TABLE '%-.64s' não é permitido em lista de tabelas FROM", +"INSERT TABLE '%-.64s' não é permitido na lista de tabelas contidas em FROM", "'Id' de 'thread' %lu desconhecido", "Você não é proprietário da 'thread' %lu", "Nenhuma tabela usada", "'Strings' demais para coluna '%-.64s' e SET", "Não pode gerar um nome de arquivo de 'log' único '%-.64s'.(1-999)\n", -"Tabela '%-.64s' foi travada com trava de READ e não pode ser atualizada", +"Tabela '%-.64s' foi travada com trava de leitura e não pode ser atualizada", "Tabela '%-.64s' não foi travada com LOCK TABLES", -"Coluna BLOB '%-.64s' não pode ter um valor 'default'", +"Coluna BLOB '%-.64s' não pode ter um valor padrão (default)", "Nome de banco de dados '%-.100s' incorreto", "Nome de tabela '%-.100s' incorreto", -"O SELECT examinaria registros demais e provavelmente tomaria um tempo muito longo. Confira sua cláusula WHERE e use SET OPTION SQL_BIG_SELECTS=1, se o SELECT estiver correto", +"O SELECT examinaria registros demais e provavelmente levaria muito tempo. Cheque sua cláusula WHERE e use SET OPTION SQL_BIG_SELECTS=1, se o SELECT estiver correto", "Erro desconhecido", "'Procedure' '%-.64s' desconhecida", "Número de parâmetros incorreto para a 'procedure' '%-.64s'", "Parâmetros incorretos para a 'procedure' '%-.64s'", "Tabela '%-.64s' desconhecida em '%-.32s'", "Coluna '%-.64s' especificada duas vezes", -"Uso inválido de função de grupo", +"Uso inválido de função de agrupamento (GROUP)", "Tabela '%-.64s' usa uma extensão que não existe nesta versão do MySQL", "Uma tabela tem que ter pelo menos uma (1) coluna", "Tabela '%-.64s' está cheia", "Conjunto de caracteres '%-.64s' desconhecido", -"Tabelas demais. O MySQL pode usar somente %d tabelas em um JOIN", +"Tabelas demais. O MySQL pode usar somente %d tabelas em uma junção (JOIN)", "Colunas demais", "Tamanho de linha grande demais. O máximo tamanho de linha, não contando BLOBs, é %d. Você tem que mudar alguns campos para BLOBs", "Estouro da pilha do 'thread'. Usados %ld de uma pilha de %ld . Use 'mysqld -O thread_stack=#' para especificar uma pilha maior, se necessário", -"Dependência cruzada encontrada em OUTER JOIN. Examine suas condições ON", -"Coluna '%-.64s' é usada com UNIQUE ou INDEX, mas não está definida como NOT NULL", +"Dependência cruzada encontrada em junção externa (OUTER JOIN). Examine as condições utilizadas nas cláusulas 'ON'", +"Coluna '%-.64s' é usada com única (UNIQUE) ou índice (INDEX), mas não está definida como não-nula (NOT NULL)", "Não pode carregar a função '%-.64s'", "Não pode inicializar a função '%-.64s' - '%-.80s'", -"Não é permitido caminho para biblioteca compartilhada", +"Não há caminhos (paths) permitidos para biblioteca compartilhada", "Função '%-.64s' já existe", "Não pode abrir biblioteca compartilhada '%-.64s' (erro no. '%d' - '%-.64s')", "Não pode encontrar a função '%-.64s' na biblioteca", @@ -133,34 +133,34 @@ "'Host' '%-.64s' está bloqueado devido a muitos erros de conexão. Desbloqueie com 'mysqladmin flush-hosts'", "'Host' '%-.64s' não tem permissão para se conectar com este servidor MySQL", "Você está usando o MySQL como usuário anônimo e usuários anônimos não têm permissão para mudar senhas", -"Você tem que ter o privilégio para atualizar tabelas no banco de dados mysql para ser capaz de mudar a senha de outros", -"Não pode encontrar nenhuma linha que combine na tabela user", +"Você deve ter privilégios para atualizar tabelas no banco de dados mysql para ser capaz de mudar a senha de outros", +"Não pode encontrar nenhuma linha que combine na tabela usuário (user table)", "Linhas que combinaram: %ld - Alteradas: %ld - Avisos: %ld", "Não pode criar uma nova 'thread' (erro no. %d). Se você não estiver sem memória disponível, você pode consultar o manual sobre um possível 'bug' dependente do sistema operacional", "Contagem de colunas não confere com a contagem de valores na linha %ld", "Não pode reabrir a tabela '%-.64s', "Uso inválido do valor NULL", "Obteve erro '%-.64s' em regexp", -"Mistura de colunas GROUP (MIN(),MAX(),COUNT()...) com colunas não GROUP é ilegal, se não existir cláusula GROUP BY", -"Não existe tal 'grant' definido para o usuário '%-.32s' no 'host' '%-.64s'", +"Mistura de colunas agrupadas (com MIN(), MAX(), COUNT(), ...) com colunas não agrupadas é ilegal, se não existir uma cláusula de agrupamento (cláusula GROUP BY)", +"Não existe tal permissão (grant) definida para o usuário '%-.32s' no 'host' '%-.64s'", "Comando '%-.16s' negado para o usuário '%-.32s@%-.64s' na tabela '%-.64s'", "Comando '%-.16s' negado para o usuário '%-.32s@%-.64s' na coluna '%-.64s', na tabela '%-.64s'", "Comando GRANT/REVOKE ilegal. Por favor consulte no manual quais privilégios podem ser usados.", "Argumento de 'host' ou de usuário para o GRANT é longo demais", "Tabela '%-.64s.%-.64s' não existe", -"Não existe tal 'grant' definido para o usuário '%-.32s' no 'host' '%-.64s', na tabela '%-.64s'", +"Não existe tal permissão (grant) definido para o usuário '%-.32s' no 'host' '%-.64s', na tabela '%-.64s'", "Comando usado não é permitido para esta versão do MySQL", "Você tem um erro de sintaxe no seu SQL", -"'Thread' de inserção retardada ('delayed') não conseguiu obter trava solicitada para tabela '%-.64s'", -"Excesso de 'threads' retardadas ('delayed') em uso", +"'Thread' de inserção retardada (atrasada) pois não conseguiu obter a trava solicitada para tabela '%-.64s'", +"Excesso de 'threads' retardadas (atrasadas) em uso", "Conexão %ld abortou para o banco de dados '%-.64s' - usuário '%-.32s' (%-.64s)", -"Obteve um pacote maior do que 'max_allowed_packet'", +"Obteve um pacote maior do que a taxa máxima de pacotes definida (max_allowed_packet)", "Obteve um erro de leitura no 'pipe' da conexão", "Obteve um erro em fcntl()", "Obteve pacotes fora de ordem", "Não conseguiu descomprimir pacote de comunicação", "Obteve um erro na leitura de pacotes de comunicação", -"Obteve expiração de tempo ('timeout') na leitura de pacotes de comunicação", +"Obteve expiração de tempo (timeout) na leitura de pacotes de comunicação", "Obteve um erro na escrita de pacotes de comunicação", "Obteve expiração de tempo ('timeout') na escrita de pacotes de comunicação", "'String' resultante é mais longa do que 'max_allowed_packet'", @@ -169,53 +169,53 @@ "INSERT DELAYED não pode ser usado com a tabela '%-.64s', porque ela está travada com LOCK TABLES", "Nome de coluna '%-.100s' incorreto", "O manipulador de tabela usado não pode indexar a coluna '%-.64s'", -"Tabelas no MERGE não estão todas definidas identicamente", +"Todas as tabelas contidas na tabela fundida (MERGE) não estão definidas identicamente", "Não pode gravar, devido à restrição UNIQUE, na tabela '%-.64s'", "Coluna BLOB '%-.64s' usada na especificação de chave sem o comprimento da chave", -"Todas as partes de uma PRIMARY KEY têm que ser NOT NULL. Se você precisar de NULL em uma chave, use UNIQUE em seu lugar", +"Todas as partes de uma chave primária devem ser não-nulas. Se você precisou usar um valor nulo (NULL) em uma chave, use a cláusula UNIQUE em seu lugar", "O resultado consistiu em mais do que uma linha", "Este tipo de tabela requer uma chave primária", "Esta versão do MySQL não foi compilada com suporte a RAID", -"Você está usando modo de atualização seguro e tentou atualizar uma tabela sem um WHERE que use uma coluna de KEY", +"Você está usando modo de atualização seguro e tentou atualizar uma tabela sem uma cláusula WHERE que use uma coluna chave", "Chave '%-.64s' não existe na tabela '%-.64s'", "Não pode abrir a tabela", -"O manipulador de tabela não suporta check/repair", -"Não lhe é permitido executar este comando em uma 'transaction'", +"O manipulador de tabela não suporta checagem/reparação (check/repair)", +"Não lhe é permitido executar este comando em uma transação", "Obteve erro %d durante COMMIT", "Obteve erro %d durante ROLLBACK", "Obteve erro %d durante FLUSH_LOGS", "Obteve erro %d durante CHECKPOINT", -"Conexão %ld abortada ao banco de dados '%-.64s' - usuário '%-.32s' - 'host' `%-.64s' ('%-.64s')", -"O manipulador de tabela não suporta DUMP binário de tabela", +"Conexão %ld abortada para banco de dados '%-.64s' - usuário '%-.32s' - 'host' `%-.64s' ('%-.64s')", +"O manipulador de tabela não suporta 'dump' binário de tabela", "Binlog fechado. Não pode fazer RESET MASTER", -"Falhou na reconstrução do índice da tabela '%-.64s' 'dumped'", +"Falhou na reconstrução do índice da tabela 'dumped' '%-.64s'", "Erro no 'master' '%-.64s'", -"Erro de rede na leitura do 'master'", -"Erro de rede na gravação do 'master'", -"Não pode encontrar índice FULLTEXT que combine com a lista de colunas", -"Não pode executar o comando dado porque você tem tabelas ativas travadas ou uma 'transaction' ativa", -"Variável de sistema '%-.64s' desconhecida", +"Erro de rede lendo do 'master'", +"Erro de rede gravando no 'master'", +"Não pode encontrar um índice para o texto todo que combine com a lista de colunas", +"Não pode executar o comando dado porque você tem tabelas ativas travadas ou uma transação ativa", +"Variável de sistema '%-.64' desconhecida", "Tabela '%-.64s' está marcada como danificada e deve ser reparada", "Tabela '%-.64s' está marcada como danificada e a última reparação (automática?) falhou", -"Aviso: Algumas tabelas não-transacionais alteradas não puderam ser reconstituídas ('rolled back')", -"'Multi-statement transaction' requereu mais do que 'max_binlog_cache_size' bytes de armazenagem. Aumente o valor desta variável do mysqld e tente novamente', +"Aviso: Algumas tabelas não-transacionais alteradas não puderam ser reconstituídas (rolled back)", +"Transações multi-declaradas (multi-statement transactions) requeriram mais do que o valor limite (max_binlog_cache_size) de bytes para armazenagem. Aumente o valor desta variável do mysqld e tente novamente", "Esta operação não pode ser realizada com um 'slave' em execução. Execute SLAVE STOP primeiro", "Esta operação requer um 'slave' em execução. Configure o 'slave' e execute SLAVE START", "O servidor não está configurado como 'slave'. Acerte o arquivo de configuração ou use CHANGE MASTER TO", "Não pode inicializar a estrutura de informação do 'master'. Verifique as permissões em 'master.info'", "Não conseguiu criar 'thread' de 'slave'. Verifique os recursos do sistema", -"Usuário '%-.64s' já possui 'max_user_connections' conexões ativas", -"Você pode usar apenas expressões de constante com SET", -"Excedido tempo de espera (timeout) do travamento", +"Usuário '%-.64s' já possui mais que o valor máximo de conexões (max_user_connections) ativas", +"Você pode usar apenas expressões constantes com SET", +"Tempo de espera (timeout) de travamento excedido. Tente reiniciar a transação.", "O número total de travamentos excede o tamanho da tabela de travamentos", -"Travamentos de atualização não podem ser obtidos durante uma transação de READ UNCOMMITTED", +"Travamentos de atualização não podem ser obtidos durante uma transação de tipo READ UNCOMMITTED", "DROP DATABASE não permitido enquanto uma 'thread' está mantendo um travamento global de leitura", "CREATE DATABASE não permitido enquanto uma 'thread' está mantendo um travamento global de leitura", "Argumentos errados para %s", "Não é permitido a %-.32s@%-.64s criar novos usuários", -"Incorrect table definition; All MERGE tables must be in the same database", -"Deadlock found when trying to get lock; Try restarting transaction", -"The used table type doesn't support FULLTEXT indexes", -"Cannot add foreign key constraint", -"Cannot add a child row: a foreign key constraint fails", -"Cannot delete a parent row: a foreign key constraint fails", +"Definição incorreta da tabela. Todas as tabelas contidas na junção devem estar no mesmo banco de dados.", +"Encontrado um travamento fatal (deadlock) quando tentava obter uma trava. Tente reiniciar a transação.", +"O tipo de tabela utilizado não suporta índices de texto completo (fulltext indexes)", +"Não pode acrescentar uma restrição de chave estrangeira", +"Não pode acrescentar uma linha filha: uma restrição de chave estrangeira falhou", +"Não pode apagar uma linha pai: uma restrição de chave estrangeira falhou", diff --git a/sql/share/pt_br/errmsg.txt b/sql/share/pt_br/errmsg.txt deleted file mode 100644 index 92a29a0e939..00000000000 --- a/sql/share/pt_br/errmsg.txt +++ /dev/null @@ -1,225 +0,0 @@ -/* Copyright Abandoned 1997 TCX DataKonsult AB & Monty Program KB & Detron HB - This file is public domain and comes with NO WARRANTY of any kind */ -/* Updated by Roberto de Martin Serqueira - martinsc@uol.com.br - 07.05.2002 */ - - - - -"hashchk", -"isamchk", -"não", -"sim", -"Não pode criar arquivo '%-.64s' (erro no. %d)", -"Não pode criar tabela '%-.64s' (erro no. %d)", -"Não pode criar banco de dados '%-.64s' (erro no. %d)", -"Não pode criar banco de dados '%-.64s'. Banco de dados já existe", -"Não pode eliminar banco de dados '%-.64s'. Banco de dados não existe", -"Erro ao eliminar banco de dados (não pode eliminar '%-.64s' - erro no. %d)", -"Erro ao eliminar banco de dados (não pode remover diretório '%-.64s' - erro no. %d)", -"Erro na deleção de '%-.64s' (erro no. %d)", -"Não pode ler registro em tabela do sistema", -"Não pode obter status de '%-.64s' (erro no. %d)", -"Não pode obter diretório corrente (erro no. %d)", -"Não pode bloquear arquivo (erro no. %d)", -"Não pode abrir arquivo '%-.64s' (erro no. %d)", -"Não pode encontrar arquivo '%-.64s' (erro no. %d)", -"Não pode ler diretório de '%-.64s' (erro no. %d)", -"Não pode mudar para o diretório '%-.64s' (erro no. %d)", -"Registro alterado desde a última leitura da tabela '%-.64s'", -"Disco cheio (%s). Aguardando alguém liberar algum espaço....", -"Não pode gravar. Chave duplicada na tabela '%-.64s'", -"Erro ao fechar '%-.64s' (erro no. %d)", -"Erro ao ler arquivo '%-.64s' (erro no. %d)", -"Erro ao renomear '%-.64s' para '%-.64s' (erro no. %d)", -"Erro ao gravar arquivo '%-.64s' (erro no. %d)", -"'%-.64s' está com bloqueio contra alterações", -"Ordenação abortada", -"'View' '%-.64s' não existe para '%-.64s'", -"Obteve erro %d no manipulador de tabelas", -"Manipulador de tabela para '%-.64s' não tem esta opção", -"Não pode encontrar registro em '%-.64s'", -"Informação incorreta no arquivo '%-.64s'", -"Arquivo de índice incorreto para tabela '%-.64s'. Tente reparar", -"Arquivo chave desatualizado para tabela '%-.64s'. Repare-o!", -"Tabela '%-.64s' é somente para leitura", -"Sem memória. Reinicie o programa e tente novamente (necessita de %d bytes)", -"Sem memória para ordenação. Aumente tamanho do 'buffer' de ordenação", -"Encontrado fim de arquivo inesperado ao ler arquivo '%-.64s' (erro no. %d)", -"Excesso de conexões", -"Sem memória. Verifique se o mysqld ou algum outro processo está usando toda memória disponível. Se não, você pode ter que usar 'ulimit' para permitir ao mysqld usar mais memória ou você pode adicionar mais área de 'swap'", -"Não pode obter nome do 'host' para seu endereço", -"Negociação de acesso falhou", -"Acesso negado para o usuário '%-.32s@%-.64s' ao banco de dados '%-.64s'", -"Acesso negado para o usuário '%-.32s@%-.64s' (uso de senha: %s)", -"Nenhum banco de dados foi selecionado", -"Comando desconhecido", -"Coluna '%-.64s' não pode ter NULL", -"Banco de dados '%-.64s' desconhecido", -"Tabela '%-.64s' já existe", -"Tabela '%-.64s' desconhecida", -"Coluna '%-.64s' em '%-.64s' é ambígua", -"'Shutdown' do servidor em andamento", -"Coluna '%-.64s' desconhecida em '%-.64s'", -"'%-.64s' não está em 'GROUP BY'", -"Não pode agrupar em '%-.64s'", -"Cláusula contém funções de soma e colunas juntas", -"Contagem de colunas não confere com a contagem de valores", -"Nome identificador '%-.100s' é longo demais", -"Nome da coluna '%-.64s' duplicado", -"Nome da chave '%-.64s' duplicado", -"Entrada '%-.64s' duplicada para a chave %d", -"Especificador de coluna incorreto para a coluna '%-.64s'", -"%s próximo a '%-.80s' na linha %d", -"'Query' estava vazia", -"Tabela/alias '%-.64s' não única", -"Valor 'default' inválido para '%-.64s'", -"Definida mais de uma chave primária", -"Especificadas chaves demais. O máximo permitido são %d chaves", -"Especificadas partes de chave demais. O máximo permitido são %d partes", -"Chave especificada longa demais. O comprimento de chave máximo permitido é %d", -"Coluna chave '%-.64s' não existe na tabela", -"Coluna BLOB '%-.64s' não pode ser utilizada na especificação de chave para o tipo de tabela usado", -"Comprimento da coluna '%-.64s' grande demais (max = %d). Use BLOB em seu lugar", -"Definição incorreta de tabela. Somente é permitido um único campo auto-incrementado e ele tem que ser definido como chave", -"%s: Pronto para conexões\n", -"%s: 'Shutdown' normal\n", -"%s: Obteve sinal %d. Abortando!\n", -"%s: 'Shutdown' completo\n", -"%s: Forçando finalização da 'thread' %ld - usuário '%-.32s'\n", -"Não pode criar 'IP socket'", -"Tabela '%-.64s' não possui um índice como o usado em CREATE INDEX. Recrie a tabela", -"Argumento separador de campos não é o esperado. Confira no manual", -"Você não pode usar comprimento de linha fixo com BLOBs. Favor usar 'fields terminated by'", -"Arquivo '%-.64s' tem que estar no diretório do banco de dados ou ter leitura possível para todos", -"Arquivo '%-.80s' já existe", -"Registros: %ld - Deletados: %ld - Ignorados: %ld - Avisos: %ld", -"Registros: %ld - Duplicados: %ld", -"Parte de chave incorreta. A parte de chave usada não é um 'string' ou o comprimento usado é maior do que a parte de chave ou o manipulador de tabelas não aceita partes de chaves únicas", -"Você não pode deletar todas as colunas com ALTER TABLE. Use DROP TABLE em seu lugar", -"Não pode fazer DROP '%-.64s'. Confira se esta coluna/chave existe", -"Registros: %ld - Duplicados: %ld - Avisos: %ld", -"INSERT TABLE '%-.64s' não é permitido em lista de tabelas FROM", -"'Id' de 'thread' %lu desconhecido", -"Você não é proprietário da 'thread' %lu", -"Nenhuma tabela usada", -"'Strings' demais para coluna '%-.64s' e SET", -"Não pode gerar um nome de arquivo de 'log' único '%-.64s'.(1-999)\n", -"Tabela '%-.64s' foi bloqueada com bloqueio de READ e não pode ser atualizada", -"Tabela '%-.64s' não foi bloqueada com LOCK TABLES", -"Coluna BLOB '%-.64s' não pode ter um valor 'default'", -"Nome de banco de dados '%-.100s' incorreto", -"Nome de tabela '%-.100s' incorreto", -"O SELECT examinaria registros demais e provavelmente tomaria um tempo muito longo. Confira sua cláusula WHERE e use SET OPTION SQL_BIG_SELECTS=1, se o SELECT estiver correto", -"Erro desconhecido", -"'Procedure' '%-.64s' desconhecida", -"Número de parâmetros incorreto para a 'procedure' '%-.64s'", -"Parâmetros incorretos para a 'procedure' '%-.64s'", -"Tabela '%-.64s' desconhecida em '%-.32s'", -"Coluna '%-.64s' especificada duas vezes", -"Uso inválido de função de grupo", -"Tabela '%-.64s' usa uma extensão que não existe nesta versão do MySQL", -"Uma tabela tem que ter pelo menos uma (1) coluna", -"Tabela '%-.64s' está cheia", -"Conjunto de caracteres '%-.64s' desconhecido", -"Tabelas demais. O MySQL pode usar somente %d tabelas em um JOIN", -"Colunas demais", -"Tamanho de linha grande demais. O máximo tamanho de linha, não contando BLOBs, é %d. Você tem que mudar alguns campos para BLOBs", -"Estouro da pilha do 'thread'. Usados %ld de uma pilha de %ld . Use 'mysqld -O thread_stack=#' para especificar uma pilha maior, se necessário", -"Dependência cruzada encontrada em OUTER JOIN. Examine suas condições ON", -"Coluna '%-.64s' é usada com UNIQUE ou INDEX, mas não está definida como NOT NULL", -"Não pode carregar a função '%-.64s'", -"Não pode inicializar a função '%-.64s' - '%-.80s'", -"Não é permitido caminho para biblioteca compartilhada", -"Função '%-.64s' já existe", -"Não pode abrir biblioteca compartilhada '%-.64s' (erro no. '%d' - '%-.64s')", -"Não pode encontrar a função '%-.64s' na biblioteca", -"Função '%-.64s' não está definida", -"'Host' '%-.64s' está bloqueado devido a muitos erros de conexão. Desbloqueie com 'mysqladmin flush-hosts'", -"'Host' '%-.64s' não tem permissão para se conectar com este servidor MySQL", -"Você está usando o MySQL como usuário anônimo e usuários anônimos não têm permissão para mudar senhas", -"Você tem que ter o privilégio para atualizar tabelas no banco de dados mysql para ser capaz de mudar a senha de outros", -"Não pode encontrar nenhuma linha que combine na tabela user", -"Linhas que combinaram: %ld - Alteradas: %ld - Avisos: %ld", -"Não pode criar uma nova 'thread' (erro no. %d). Se você não estiver sem memória disponível, você pode consultar o manual sobre um possível 'bug' dependente do sistema operacional", -"Contagem de colunas não confere com a contagem de valores na linha %ld", -"Não pode reabrir a tabela '%-.64s', -"Uso inválido do valor NULL", -"Obteve erro '%-.64s' em regexp", -"Mistura de colunas GROUP (MIN(),MAX(),COUNT()...) com colunas não GROUP é ilegal, se não existir cláusula GROUP BY", -"Não existe tal 'grant' definido para o usuário '%-.32s' no 'host' '%-.64s'", -"Comando '%-.16s' negado para o usuário '%-.32s@%-.64s' na tabela '%-.64s'", -"Comando '%-.16s' negado para o usuário '%-.32s@%-.64s' na coluna '%-.64s', na tabela '%-.64s'", -"Comando GRANT/REVOKE ilegal. Por favor consulte no manual quais privilégios podem ser usados.", -"Argumento de 'host' ou de usuário para o GRANT é longo demais", -"Tabela '%-.64s.%-.64s' não existe", -"Não existe tal 'grant' definido para o usuário '%-.32s' no 'host' '%-.64s', na tabela '%-.64s'", -"Comando usado não é permitido para esta versão do MySQL", -"Você tem um erro de sintaxe no seu SQL", -"'Thread' de inserção retardada ('delayed') não conseguiu obter bloqueio solicitado para tabela '%-.64s'", -"Excesso de 'threads' retardadas ('delayed') em uso", -"Conexão %ld abortou para o banco de dados '%-.64s' - usuário '%-.32s' (%-.64s)", -"Obteve um pacote maior do que 'max_allowed_packet'", -"Obteve um erro de leitura no 'pipe' da conexão", -"Obteve um erro em fcntl()", -"Obteve pacotes fora de ordem", -"Não conseguiu descomprimir pacote de comunicação", -"Obteve um erro na leitura de pacotes de comunicação", -"Obteve expiração de tempo ('timeout') na leitura de pacotes de comunicação", -"Obteve um erro na escrita de pacotes de comunicação", -"Obteve expiração de tempo ('timeout') na escrita de pacotes de comunicação", -"'String' resultante é mais longa do que 'max_allowed_packet'", -"Tipo de tabela usado não permite colunas BLOB/TEXT", -"Tipo de tabela usado não permite colunas AUTO_INCREMENT", -"INSERT DELAYED não pode ser usado com a tabela '%-.64s', porque ela está bloqueada com LOCK TABLES", -"Nome de coluna '%-.100s' incorreto", -"O manipulador de tabela usado não pode indexar a coluna '%-.64s'", -"Tabelas no MERGE não estão todas definidas identicamente", -"Não pode gravar, devido à restrição UNIQUE, na tabela '%-.64s'", -"Coluna BLOB '%-.64s' usada na especificação de chave sem o comprimento da chave", -"Todas as partes de uma PRIMARY KEY têm que ser NOT NULL. Se você precisar de NULL em uma chave, use UNIQUE em seu lugar", -"O resultado consistiu em mais do que uma linha", -"Este tipo de tabela requer uma chave primária", -"Esta versão do MySQL não foi compilada com suporte a RAID", -"Você está usando modo de atualização seguro e tentou atualizar uma tabela sem um WHERE que use uma coluna de KEY", -"Chave '%-.64s' não existe na tabela '%-.64s'", -"Não pode abrir a tabela", -"O manipulador de tabela não suporta check/repair", -"Não lhe é permitido executar este comando em uma transação", -"Obteve erro %d durante COMMIT", -"Obteve erro %d durante ROLLBACK", -"Obteve erro %d durante FLUSH_LOGS", -"Obteve erro %d durante CHECKPOINT", -"Conexão %ld abortada ao banco de dados '%-.64s' - usuário '%-.32s' - 'host' `%-.64s' ('%-.64s')", -"O manipulador de tabela não suporta DUMP binário de tabela", -"'Binlog' fechado. Não pode fazer RESET MASTER", -"Falhou na reconstrução do índice da tabela '%-.64s' 'dumped'", -"Erro no 'master' '%-.64s'", -"Erro de rede na leitura do 'master'", -"Erro de rede na gravação do 'master'", -"Não pode encontrar índice FULLTEXT que combine com a lista de colunas", -"Não pode executar o comando dado porque você tem tabelas ativas bloqueadas ou uma transação ativa", -"Variável de sistema '%-.64s' desconhecida", -"Tabela '%-.64s' está marcada como danificada e deve ser reparada", -"Tabela '%-.64s' está marcada como danificada e a última reparação (automática?) falhou", -"Aviso: Algumas tabelas não-transacionais alteradas não puderam ser reconstituídas ('rolled back')", -"Transação 'multi-statement' requereu mais do que 'max_binlog_cache_size' bytes de armazenagem. Aumente o valor desta variável do mysqld e tente novamente', -"Esta operação não pode ser realizada com um 'slave' em execução. Execute SLAVE STOP primeiro", -"Esta operação requer um 'slave' em execução. Configure o 'slave' e execute SLAVE START", -"O servidor não está configurado como 'slave'. Acerte o arquivo de configuração ou use CHANGE MASTER TO", -"Não pode inicializar a estrutura de informação do 'master'. Verifique as permissões em 'master.info'", -"Não conseguiu criar 'thread' de 'slave'. Verifique os recursos do sistema", -"Usuário '%-.64s' já possui 'max_user_connections' conexões ativas", -"Você pode usar apenas expressões de constante com SET", -"Excedido tempo de espera ('timeout') do bloqueio; tente reiniciar a transação", -"O número total de bloqueios excede o tamanho da tabela de bloqueios", -"Bloqueios de atualização não podem ser obtidos durante uma transação de READ UNCOMMITTED", -"DROP DATABASE não permitido enquanto uma 'thread' está mantendo um bloqueio global de leitura", -"CREATE DATABASE não permitido enquanto uma 'thread' está mantendo um bloqueio global de leitura", -"Argumentos errados para %s", -"Não é permitido a %-.32s@%-.64s criar novos usuários", -"Definição incorreta de tabela; todas as tabelas em MERGE têm que estar no mesmo banco de dados", -"Encontrado impasse ('deadlock') ao tentar obter bloqueio; tente reiniciar a transação", -"O tipo de tabela usado não suporta índices FULLTEXT", -"Não pode adicionar restrição em chave externa", -"Não pode adicionar linha filha: uma restrição em chave externa não funciona", -"Não pode deletar linha mãe: uma restrição em chave externa não funciona", -- cgit v1.2.1 From 43376d554f7449a261ecedb057fa113a409b3225 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 16 Jul 2002 20:06:39 +0300 Subject: slave.cc: Suppress prints by slave.cc when there is a normal reconnect after the master has been quiet for the time of the net read timeout; this removes the Error 1159 messages many users have complained about in the replication of 3.23.51 sql/slave.cc: Suppress prints by slave.cc when there is a normal reconnect after the master has been quiet for the time of the net read timeout; this removes the Error 1159 messages many users have complained about in the replication of 3.23.51 --- sql/slave.cc | 53 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 11 deletions(-) diff --git a/sql/slave.cc b/sql/slave.cc index 32c478c369d..65fc807cc2b 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -50,12 +50,12 @@ static int events_till_disconnect = -1, events_till_abort = -1; static int stuck_count = 0; #endif - inline void skip_load_data_infile(NET* net); inline bool slave_killed(THD* thd); static int init_slave_thread(THD* thd); static int safe_connect(THD* thd, MYSQL* mysql, MASTER_INFO* mi); -static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi); +static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi, + bool suppress_prints_as_normal_reconnect_after_timeout); static int safe_sleep(THD* thd, int sec); static int request_table_dump(MYSQL* mysql, char* db, char* table); static int create_table_from_dump(THD* thd, NET* net, const char* db, @@ -839,8 +839,13 @@ command"); return 0; } +/* We set suppress_prints_as_normal_reconnect_after_timeout TRUE +when a normal net read timeout has caused us to try a reconnect. +We do not want to print anything to the error log in this case +because this a anormal event in an idle server. */ -static uint read_event(MYSQL* mysql, MASTER_INFO *mi) +static uint read_event(MYSQL* mysql, MASTER_INFO *mi, + bool* suppress_prints_as_normal_reconnect_after_timeout) { uint len = packet_error; @@ -850,12 +855,22 @@ static uint read_event(MYSQL* mysql, MASTER_INFO *mi) if (disconnect_slave_event_count && !(events_till_disconnect--)) return packet_error; #endif - + *suppress_prints_as_normal_reconnect_after_timeout = 0; + len = mc_net_safe_read(mysql); if (len == packet_error || (long) len < 1) { - sql_print_error("Error reading packet from server: %s (\ + if (mc_mysql_errno(mysql) == ER_NET_READ_INTERRUPTED) { + + /* We are trying a normal reconnect after a read timeout; + we suppress prints to .err file as long as the reconnect + happens without problems */ + *suppress_prints_as_normal_reconnect_after_timeout = TRUE; + } + + if (!(*suppress_prints_as_normal_reconnect_after_timeout)) + sql_print_error("Error reading packet from server: %s (\ server_errno=%d)", mc_mysql_error(mysql), mc_mysql_errno(mysql)); return packet_error; @@ -1352,7 +1367,7 @@ dump"); sql_print_error("Slave: failed dump request, reconnecting to \ try again, log '%s' at postion %s", RPL_LOG_NAME, llstr(last_failed_pos,llbuff)); - if(safe_reconnect(thd, mysql, &glob_mi) || slave_killed(thd)) + if(safe_reconnect(thd, mysql, &glob_mi, 0) || slave_killed(thd)) { sql_print_error("Slave thread killed during or after reconnect"); goto err; @@ -1363,10 +1378,15 @@ try again, log '%s' at postion %s", RPL_LOG_NAME, while(!slave_killed(thd)) { + bool suppress_prints_as_normal_reconnect_after_timeout = 0; + thd->proc_info = "Reading master update"; - uint event_len = read_event(mysql, &glob_mi); + uint event_len = read_event(mysql, &glob_mi, + &suppress_prints_as_normal_reconnect_after_timeout); + if(slave_killed(thd)) { + suppress_prints_as_normal_reconnect_after_timeout = 0; sql_print_error("Slave thread killed while reading event"); goto err; } @@ -1375,6 +1395,7 @@ try again, log '%s' at postion %s", RPL_LOG_NAME, { if(mc_mysql_errno(mysql) == ER_NET_PACKET_TOO_LARGE) { + suppress_prints_as_normal_reconnect_after_timeout = 0; sql_print_error("Log entry on master is longer than \ max_allowed_packet on slave. Slave thread will be aborted. If the entry is \ really supposed to be that long, restart the server with a higher value of \ @@ -1392,22 +1413,29 @@ max_allowed_packet. The current value is %ld", max_allowed_packet); if(slave_killed(thd)) { + suppress_prints_as_normal_reconnect_after_timeout = 0; sql_print_error("Slave thread killed while waiting to \ reconnect after a failed read"); goto err; } thd->proc_info = "Reconnecting after a failed read"; last_failed_pos= glob_mi.pos; - sql_print_error("Slave: Failed reading log event, \ + + if (!suppress_prints_as_normal_reconnect_after_timeout) + sql_print_error("Slave: Failed reading log event, \ reconnecting to retry, log '%s' position %s", RPL_LOG_NAME, llstr(last_failed_pos, llbuff)); - if(safe_reconnect(thd, mysql, &glob_mi) || slave_killed(thd)) + if(safe_reconnect(thd, mysql, &glob_mi, + suppress_prints_as_normal_reconnect_after_timeout) + || slave_killed(thd)) { + suppress_prints_as_normal_reconnect_after_timeout = 0; sql_print_error("Slave thread killed during or after a \ reconnect done to recover from failed read"); goto err; } + suppress_prints_as_normal_reconnect_after_timeout = 0; goto connected; } // if(event_len == packet_error) @@ -1519,7 +1547,8 @@ static int safe_connect(THD* thd, MYSQL* mysql, MASTER_INFO* mi) master_retry_count times */ -static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi) +static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi, + bool suppress_prints_as_normal_reconnect_after_timeout) { int slave_was_killed; int last_errno= -2; // impossible error @@ -1539,6 +1568,7 @@ static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi) /* Don't repeat last error */ if (mc_mysql_errno(mysql) != last_errno) { + suppress_prints_as_normal_reconnect_after_timeout = 0; sql_print_error("Slave thread: error re-connecting to master: \ %s, last_errno=%d, retry in %d sec", mc_mysql_error(mysql), last_errno=mc_mysql_errno(mysql), @@ -1555,7 +1585,8 @@ static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi) if (!slave_was_killed) { - sql_print_error("Slave: reconnected to master '%s@%s:%d',\ + if (!suppress_prints_as_normal_reconnect_after_timeout) + sql_print_error("Slave: reconnected to master '%s@%s:%d',\ replication resumed in log '%s' at position %s", glob_mi.user, glob_mi.host, glob_mi.port, RPL_LOG_NAME, -- cgit v1.2.1 From 8d4d7d6f25135630e7cafac83d87435ee9974b2f Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 16 Jul 2002 21:16:34 +0300 Subject: Fixing slave timeouting --- Docs/manual.texi | 2 ++ sql/slave.cc | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 1ef91638e17..e005cedf144 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -46928,6 +46928,8 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.52 @itemize @bullet @item +Fixed bug with slave net read timeouting +@item Fixed bug in ALTERing TABLE of BDB type. @item Fixed bug when logging @code{LOAD DATA INFILE} to binary log with no diff --git a/sql/slave.cc b/sql/slave.cc index 32c478c369d..c3365952d5f 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -456,7 +456,7 @@ int fetch_nx_table(THD* thd, MASTER_INFO* mi) nx_errno = ER_BAD_HOST_ERROR; goto err; } - + mysql->net.timeout=slave_net_timeout; safe_connect(thd, mysql, mi); if (slave_killed(thd)) goto err; @@ -1297,6 +1297,7 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused))) goto err; } + mysql->net = thd->net; thd->proc_info = "connecting to master"; #ifndef DBUG_OFF sql_print_error("Slave thread initialized"); -- cgit v1.2.1 From 39859d5d7cf2585b01f01204c7a664d10f3ee89e Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 16 Jul 2002 22:07:12 +0300 Subject: making necessary changes after Sasha's correct remarks --- sql/slave.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/slave.cc b/sql/slave.cc index c3365952d5f..f886473d779 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -1297,7 +1297,7 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused))) goto err; } - mysql->net = thd->net; + mysql->net.timeout=slave_net_timeout; thd->proc_info = "connecting to master"; #ifndef DBUG_OFF sql_print_error("Slave thread initialized"); -- cgit v1.2.1 From 076bdd6cc33aa2d9f5c100540fa50cb3b1ff288d Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 17 Jul 2002 14:46:09 +0300 Subject: Another try to fix slave timeouts --- sql/mini_client.cc | 5 ++++- sql/slave.cc | 7 ++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/sql/mini_client.cc b/sql/mini_client.cc index 8f703b80e3a..453f27822d9 100644 --- a/sql/mini_client.cc +++ b/sql/mini_client.cc @@ -112,6 +112,8 @@ static my_bool is_NT(void) } #endif +extern ulong slave_net_timeout; + /* ** Create a named pipe connection */ @@ -203,6 +205,7 @@ mc_mysql_init(MYSQL *mysql) #ifdef __WIN__ mysql->options.connect_timeout=20; #endif + mysql->net.timeout = slave_net_timeout; return mysql; } @@ -655,7 +658,7 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user, goto error; } vio_keepalive(net->vio,TRUE); - + net->timeout=slave_net_timeout; /* Get version info */ mysql->protocol_version= PROTOCOL_VERSION; /* Assume this */ if ((pkt_length=mc_net_safe_read(mysql)) == packet_error) diff --git a/sql/slave.cc b/sql/slave.cc index dd815037d5e..b11fcc0d847 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -456,7 +456,7 @@ int fetch_nx_table(THD* thd, MASTER_INFO* mi) nx_errno = ER_BAD_HOST_ERROR; goto err; } - mysql->net.timeout=slave_net_timeout; + safe_connect(thd, mysql, mi); if (slave_killed(thd)) goto err; @@ -1312,7 +1312,7 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused))) goto err; } - mysql->net.timeout=slave_net_timeout; + thd->proc_info = "connecting to master"; #ifndef DBUG_OFF sql_print_error("Slave thread initialized"); @@ -1331,7 +1331,8 @@ pthread_handler_decl(handle_slave,arg __attribute__((unused))) } connected: - + + mysql->net.timeout=slave_net_timeout; while (!slave_killed(thd)) { thd->proc_info = "Requesting binlog dump"; -- cgit v1.2.1 From d0b58e312976c50c0b6859a2a657f4a9f79ee5e7 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 19 Jul 2002 08:33:52 +0300 Subject: os0file.c: Align the buffer used in initing a data file to zero; this may be needed if the data file is actually a raw device innobase/os/os0file.c: Align the buffer used in initing a data file to zero; this may be needed if the data file is actually a raw device --- innobase/os/os0file.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c index 34e13b80c58..94908ae9ade 100644 --- a/innobase/os/os0file.c +++ b/innobase/os/os0file.c @@ -690,6 +690,7 @@ os_file_set_size( ulint n_bytes; ibool ret; byte* buf; + byte* buf2; ulint i; ut_a(size == (size & 0xFFFFFFFF)); @@ -697,7 +698,10 @@ os_file_set_size( /* We use a very big 8 MB buffer in writing because Linux may be extremely slow in fsync on 1 MB writes */ - buf = ut_malloc(UNIV_PAGE_SIZE * 512); + buf2 = ut_malloc(UNIV_PAGE_SIZE * 513); + + /* Align the buffer for possible raw i/o */ + buf = ut_align(buf2, UNIV_PAGE_SIZE); /* Write buffer full of zeros */ for (i = 0; i < UNIV_PAGE_SIZE * 512; i++) { @@ -725,7 +729,7 @@ os_file_set_size( offset += n_bytes; } - ut_free(buf); + ut_free(buf2); ret = os_file_flush(file); -- cgit v1.2.1 From dda85ba004d099adfcdf794e02db4467f3662409 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 19 Jul 2002 17:09:40 +0300 Subject: os0file.c: Fix a bug in the previous commit change and align also the buffer in simulataled aio for possible use in i/o to raw devices innobase/os/os0file.c: Fix a bug in the previous commit change and align also the buffer in simulataled aio for possible use in i/o to raw devices --- innobase/os/os0file.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/innobase/os/os0file.c b/innobase/os/os0file.c index 94908ae9ade..4a1bbfa9874 100644 --- a/innobase/os/os0file.c +++ b/innobase/os/os0file.c @@ -723,7 +723,7 @@ os_file_set_size( (ulint)(offset >> 32), n_bytes); if (!ret) { - ut_free(buf); + ut_free(buf2); goto error_handling; } offset += n_bytes; @@ -2104,6 +2104,7 @@ os_aio_simulated_handle( ulint offs; ulint lowest_offset; byte* combined_buf; + byte* combined_buf2; ibool ret; ulint n; ulint i; @@ -2226,9 +2227,11 @@ consecutive_loop: /* We can use the buffer of the i/o request */ combined_buf = slot->buf; } else { - combined_buf = ut_malloc(total_len); + combined_buf2 = ut_malloc(total_len + UNIV_PAGE_SIZE); - ut_a(combined_buf); + ut_a(combined_buf2); + + combined_buf = ut_align(combined_buf2, UNIV_PAGE_SIZE); } /* We release the array mutex for the time of the i/o: NOTE that @@ -2287,7 +2290,7 @@ consecutive_loop: } if (n_consecutive > 1) { - ut_free(combined_buf); + ut_free(combined_buf2); } os_mutex_enter(array->mutex); -- cgit v1.2.1 From 887aaff93919e9f359133d8c7a86277789d130e1 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 19 Jul 2002 18:49:25 +0300 Subject: fil0fil.c: Align a buffer for i/o from a raw device innobase/fil/fil0fil.c: Align a buffer for i/o from a raw device --- innobase/fil/fil0fil.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/innobase/fil/fil0fil.c b/innobase/fil/fil0fil.c index ca508785497..910ca842f21 100644 --- a/innobase/fil/fil0fil.c +++ b/innobase/fil/fil0fil.c @@ -573,17 +573,20 @@ fil_read_flushed_lsn_and_arch_log_no( ulint* max_arch_log_no) /* in/out: */ { byte* buf; + byte* buf2; dulint flushed_lsn; ulint arch_log_no; - buf = ut_malloc(UNIV_PAGE_SIZE); - + buf2 = ut_malloc(2 * UNIV_PAGE_SIZE); + /* Align the memory for a possibel read from a raw device */ + buf = ut_align(buf2, UNIV_PAGE_SIZE); + os_file_read(data_file, buf, 0, 0, UNIV_PAGE_SIZE); flushed_lsn = mach_read_from_8(buf + FIL_PAGE_FILE_FLUSH_LSN); arch_log_no = mach_read_from_4(buf + FIL_PAGE_ARCH_LOG_NO); - ut_free(buf); + ut_free(buf2); if (!one_read_already) { *min_flushed_lsn = flushed_lsn; -- cgit v1.2.1 From a9c52ff7172308af72f062a1cae86671cbb1ed7a Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 19 Jul 2002 21:57:53 +0300 Subject: Fix wrong usage of constant which could cause mysqld to use index when doing an update/delete on small tables. code cleanup Docs/manual.texi: changelog sql/ha_innobase.cc: Removed compiler warning sql/slave.cc: Cleanup comments and indentation for suppressing connect warnings sql/sql_db.cc: clean up comment sql/sql_delete.cc: Fix wrong usage of constant which could cause mysqld to use index when doing an update/delete on small tables. sql/sql_update.cc: Fix wrong usage of constant which could cause mysqld to use index when doing an update/delete on small tables. --- Docs/manual.texi | 2 ++ sql/ha_innobase.cc | 4 ++-- sql/slave.cc | 57 ++++++++++++++++++++++++++---------------------------- sql/sql_db.cc | 11 ++++++----- sql/sql_delete.cc | 2 +- sql/sql_update.cc | 2 +- 6 files changed, 39 insertions(+), 39 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index e005cedf144..2c4b0f71352 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -46928,6 +46928,8 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.52 @itemize @bullet @item +Don't write slave-timeout reconnects to the error log. +@item Fixed bug with slave net read timeouting @item Fixed bug in ALTERing TABLE of BDB type. diff --git a/sql/ha_innobase.cc b/sql/ha_innobase.cc index f5b80241f9a..33bc4613ef5 100644 --- a/sql/ha_innobase.cc +++ b/sql/ha_innobase.cc @@ -1990,7 +1990,7 @@ ha_innobase::change_active_index( InnoDB */ { row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt; - KEY* key; + KEY* key=0; statistic_increment(ha_read_key_count, &LOCK_status); @@ -2011,7 +2011,7 @@ ha_innobase::change_active_index( if (!prebuilt->index) { fprintf(stderr, "InnoDB: Could not find key n:o %u with name %s from dict cache\n" - "InnoDB: for table %s\n", keynr, key->name, prebuilt->table->name); + "InnoDB: for table %s\n", keynr, key ? key->name : "NULL", prebuilt->table->name); return(1); } diff --git a/sql/slave.cc b/sql/slave.cc index b11fcc0d847..adbf3c106cc 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -55,7 +55,7 @@ inline bool slave_killed(THD* thd); static int init_slave_thread(THD* thd); static int safe_connect(THD* thd, MYSQL* mysql, MASTER_INFO* mi); static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi, - bool suppress_prints_as_normal_reconnect_after_timeout); + bool suppress_warnings); static int safe_sleep(THD* thd, int sec); static int request_table_dump(MYSQL* mysql, char* db, char* table); static int create_table_from_dump(THD* thd, NET* net, const char* db, @@ -839,13 +839,15 @@ command"); return 0; } -/* We set suppress_prints_as_normal_reconnect_after_timeout TRUE -when a normal net read timeout has caused us to try a reconnect. -We do not want to print anything to the error log in this case -because this a anormal event in an idle server. */ -static uint read_event(MYSQL* mysql, MASTER_INFO *mi, - bool* suppress_prints_as_normal_reconnect_after_timeout) +/* + We set suppress_warnings TRUE when a normal net read timeout has + caused us to try a reconnect. We do not want to print anything to + the error log in this case because this a anormal event in an idle + server. +*/ + +static uint read_event(MYSQL* mysql, MASTER_INFO *mi, bool* suppress_warnings) { uint len = packet_error; @@ -855,24 +857,25 @@ static uint read_event(MYSQL* mysql, MASTER_INFO *mi, if (disconnect_slave_event_count && !(events_till_disconnect--)) return packet_error; #endif - *suppress_prints_as_normal_reconnect_after_timeout = 0; + *suppress_warnings= 0; len = mc_net_safe_read(mysql); if (len == packet_error || (long) len < 1) { - if (mc_mysql_errno(mysql) == ER_NET_READ_INTERRUPTED) { - - /* We are trying a normal reconnect after a read timeout; - we suppress prints to .err file as long as the reconnect - happens without problems */ - *suppress_prints_as_normal_reconnect_after_timeout = TRUE; + if (mc_mysql_errno(mysql) == ER_NET_READ_INTERRUPTED) + { + /* + We are trying a normal reconnect after a read timeout; + we suppress prints to .err file as long as the reconnect + happens without problems + */ + *suppress_warnings= TRUE; } - - if (!(*suppress_prints_as_normal_reconnect_after_timeout)) + else sql_print_error("Error reading packet from server: %s (\ server_errno=%d)", - mc_mysql_error(mysql), mc_mysql_errno(mysql)); + mc_mysql_error(mysql), mc_mysql_errno(mysql)); return packet_error; } @@ -1380,15 +1383,13 @@ try again, log '%s' at postion %s", RPL_LOG_NAME, while(!slave_killed(thd)) { - bool suppress_prints_as_normal_reconnect_after_timeout = 0; + bool suppress_warnings= 0; thd->proc_info = "Reading master update"; - uint event_len = read_event(mysql, &glob_mi, - &suppress_prints_as_normal_reconnect_after_timeout); + uint event_len = read_event(mysql, &glob_mi, &suppress_warnings); if(slave_killed(thd)) { - suppress_prints_as_normal_reconnect_after_timeout = 0; sql_print_error("Slave thread killed while reading event"); goto err; } @@ -1397,7 +1398,6 @@ try again, log '%s' at postion %s", RPL_LOG_NAME, { if(mc_mysql_errno(mysql) == ER_NET_PACKET_TOO_LARGE) { - suppress_prints_as_normal_reconnect_after_timeout = 0; sql_print_error("Log entry on master is longer than \ max_allowed_packet on slave. Slave thread will be aborted. If the entry is \ really supposed to be that long, restart the server with a higher value of \ @@ -1415,7 +1415,6 @@ max_allowed_packet. The current value is %ld", max_allowed_packet); if(slave_killed(thd)) { - suppress_prints_as_normal_reconnect_after_timeout = 0; sql_print_error("Slave thread killed while waiting to \ reconnect after a failed read"); goto err; @@ -1423,21 +1422,19 @@ reconnect after a failed read"); thd->proc_info = "Reconnecting after a failed read"; last_failed_pos= glob_mi.pos; - if (!suppress_prints_as_normal_reconnect_after_timeout) + if (!suppress_warnings) sql_print_error("Slave: Failed reading log event, \ reconnecting to retry, log '%s' position %s", RPL_LOG_NAME, llstr(last_failed_pos, llbuff)); if(safe_reconnect(thd, mysql, &glob_mi, - suppress_prints_as_normal_reconnect_after_timeout) + suppress_warnings) || slave_killed(thd)) { - suppress_prints_as_normal_reconnect_after_timeout = 0; sql_print_error("Slave thread killed during or after a \ reconnect done to recover from failed read"); goto err; } - suppress_prints_as_normal_reconnect_after_timeout = 0; goto connected; } // if(event_len == packet_error) @@ -1550,7 +1547,7 @@ static int safe_connect(THD* thd, MYSQL* mysql, MASTER_INFO* mi) */ static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi, - bool suppress_prints_as_normal_reconnect_after_timeout) + bool suppress_warnings) { int slave_was_killed; int last_errno= -2; // impossible error @@ -1570,7 +1567,7 @@ static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi, /* Don't repeat last error */ if (mc_mysql_errno(mysql) != last_errno) { - suppress_prints_as_normal_reconnect_after_timeout = 0; + suppress_warnings= 0; sql_print_error("Slave thread: error re-connecting to master: \ %s, last_errno=%d, retry in %d sec", mc_mysql_error(mysql), last_errno=mc_mysql_errno(mysql), @@ -1587,7 +1584,7 @@ static int safe_reconnect(THD* thd, MYSQL* mysql, MASTER_INFO* mi, if (!slave_was_killed) { - if (!suppress_prints_as_normal_reconnect_after_timeout) + if (!suppress_warnings) sql_print_error("Slave: reconnected to master '%s@%s:%d',\ replication resumed in log '%s' at position %s", glob_mi.user, glob_mi.host, glob_mi.port, diff --git a/sql/sql_db.cc b/sql/sql_db.cc index 688a6055a7b..b3d63f72b8d 100644 --- a/sql/sql_db.cc +++ b/sql/sql_db.cc @@ -166,11 +166,12 @@ void mysql_rm_db(THD *thd,char *db,bool if_exists) if ((deleted=mysql_rm_known_files(thd, dirp, path,0)) >= 0) { - /* If there are running queries on the tables, MySQL needs to get - access to LOCK_open to end them. InnoDB on the other hand waits - for the queries to end before dropping the database. That is why we - must do the dropping with LOCK_open released. */ - + /* + If there are running queries on the tables, MySQL needs to get + access to LOCK_open to end them. InnoDB on the other hand waits + for the queries to end before dropping the database. That is why we + must do the dropping with LOCK_open released. + */ VOID(pthread_mutex_unlock(&LOCK_open)); ha_drop_database(path); VOID(pthread_mutex_lock(&LOCK_open)); diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 930e71d7678..278e98533c9 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -169,7 +169,7 @@ int mysql_delete(THD *thd,TABLE_LIST *table_list,COND *conds,ha_rows limit, select=make_select(table,0,0,conds,&error); if (error) DBUG_RETURN(-1); - if ((select && select->check_quick(test(thd->options & SQL_SAFE_UPDATES), + if ((select && select->check_quick(test(thd->options & OPTION_SAFE_UPDATES), limit)) || !limit) { diff --git a/sql/sql_update.cc b/sql/sql_update.cc index e5e246b3962..6a4cdb80e5d 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -110,7 +110,7 @@ int mysql_update(THD *thd,TABLE_LIST *table_list,List &fields, table->used_keys=0; select=make_select(table,0,0,conds,&error); if (error || - (select && select->check_quick(test(thd->options & SQL_SAFE_UPDATES), + (select && select->check_quick(test(thd->options & OPTION_SAFE_UPDATES), limit)) || !limit) { -- cgit v1.2.1 From b6b2546c18faf4d72a879e5ef756a241144c7018 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 21 Jul 2002 12:58:14 +0300 Subject: row0ins.c: Do not perform ON DELETE action for a FOREIGN KEY constraint if we are doing an UPDATE, not a DELETE dict0dict.c: test innobase/dict/dict0dict.c: test innobase/row/row0ins.c: Do not perform ON DELETE action for a FOREIGN KEY constraint if we are doing an UPDATE, not a DELETE --- innobase/dict/dict0dict.c | 37 ++++++++++++++++++++++++++++++------- innobase/row/row0ins.c | 12 ++++++++++++ 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c index 7c166ecd068..65f40d345d8 100644 --- a/innobase/dict/dict0dict.c +++ b/innobase/dict/dict0dict.c @@ -270,7 +270,7 @@ void dict_table_autoinc_initialize( /*==========================*/ dict_table_t* table, /* in: table */ - ib_longlong value) /* in: value which was assigned to a row */ + ib_longlong value) /* in: next value to assign to a row */ { mutex_enter(&(table->autoinc_mutex)); @@ -281,8 +281,8 @@ dict_table_autoinc_initialize( } /************************************************************************ -Gets the next autoinc value, 0 if not yet initialized. If initialized, -increments the counter by 1. */ +Gets the next autoinc value (== autoinc counter value), 0 if not yet +initialized. If initialized, increments the counter by 1. */ ib_longlong dict_table_autoinc_get( @@ -298,8 +298,8 @@ dict_table_autoinc_get( value = 0; } else { - table->autoinc = table->autoinc + 1; value = table->autoinc; + table->autoinc = table->autoinc + 1; } mutex_exit(&(table->autoinc_mutex)); @@ -334,20 +334,43 @@ dict_table_autoinc_read( } /************************************************************************ -Updates the autoinc counter if the value supplied is bigger than the +Peeks the autoinc counter value, 0 if not yet initialized. Does not +increment the counter. The read not protected by any mutex! */ + +ib_longlong +dict_table_autoinc_peek( +/*====================*/ + /* out: value of the counter */ + dict_table_t* table) /* in: table */ +{ + ib_longlong value; + + if (!table->autoinc_inited) { + + value = 0; + } else { + value = table->autoinc; + } + + return(value); +} + +/************************************************************************ +Updates the autoinc counter if the value supplied is equal or bigger than the current value. If not inited, does nothing. */ void dict_table_autoinc_update( /*======================*/ + dict_table_t* table, /* in: table */ ib_longlong value) /* in: value which was assigned to a row */ { mutex_enter(&(table->autoinc_mutex)); if (table->autoinc_inited) { - if (value > table->autoinc) { - table->autoinc = value; + if (value >= table->autoinc) { + table->autoinc = value + 1; } } diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c index ee4805d51d2..5badebf2011 100644 --- a/innobase/row/row0ins.c +++ b/innobase/row/row0ins.c @@ -389,9 +389,21 @@ row_ins_foreign_delete_or_set_null( char err_buf[1000]; ut_a(thr && foreign && pcur && mtr); + ut_a(que_node_get_type(node) == QUE_NODE_UPDATE); node = thr->run_node; + if (!node->is_delete) { + /* According to SQL-92 an UPDATE with respect to FOREIGN + KEY constraints is not semantically equivalent to a + DELETE + INSERT. Therefore we do not perform any action + here and consequently the child rows would be left + orphaned if we would let the UPDATE happen. Thus we return + an error. */ + + return(DB_ROW_IS_REFERENCED); + } + if (node->cascade_node == NULL) { /* Extend our query graph by creating a child to current update node. The child is used in the cascade or set null -- cgit v1.2.1 From 81a75051de3ab8c763913c058ad72a853d7d2afb Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 21 Jul 2002 13:09:57 +0300 Subject: dict0dict.c: Revert the test changes to wait for a full push of new auto-inc algorithm innobase/dict/dict0dict.c: Revert the test changes to wait for a full push of new auto-inc algorithm --- innobase/dict/dict0dict.c | 39 ++++++++------------------------------- 1 file changed, 8 insertions(+), 31 deletions(-) diff --git a/innobase/dict/dict0dict.c b/innobase/dict/dict0dict.c index 65f40d345d8..9ed1d088290 100644 --- a/innobase/dict/dict0dict.c +++ b/innobase/dict/dict0dict.c @@ -261,7 +261,7 @@ dict_table_get_index_noninline( { return(dict_table_get_index(table, name)); } - + /************************************************************************ Initializes the autoinc counter. It is not an error to initialize an already initialized counter. */ @@ -270,7 +270,7 @@ void dict_table_autoinc_initialize( /*==========================*/ dict_table_t* table, /* in: table */ - ib_longlong value) /* in: next value to assign to a row */ + ib_longlong value) /* in: value which was assigned to a row */ { mutex_enter(&(table->autoinc_mutex)); @@ -281,8 +281,8 @@ dict_table_autoinc_initialize( } /************************************************************************ -Gets the next autoinc value (== autoinc counter value), 0 if not yet -initialized. If initialized, increments the counter by 1. */ +Gets the next autoinc value, 0 if not yet initialized. If initialized, +increments the counter by 1. */ ib_longlong dict_table_autoinc_get( @@ -298,8 +298,8 @@ dict_table_autoinc_get( value = 0; } else { - value = table->autoinc; table->autoinc = table->autoinc + 1; + value = table->autoinc; } mutex_exit(&(table->autoinc_mutex)); @@ -334,43 +334,20 @@ dict_table_autoinc_read( } /************************************************************************ -Peeks the autoinc counter value, 0 if not yet initialized. Does not -increment the counter. The read not protected by any mutex! */ - -ib_longlong -dict_table_autoinc_peek( -/*====================*/ - /* out: value of the counter */ - dict_table_t* table) /* in: table */ -{ - ib_longlong value; - - if (!table->autoinc_inited) { - - value = 0; - } else { - value = table->autoinc; - } - - return(value); -} - -/************************************************************************ -Updates the autoinc counter if the value supplied is equal or bigger than the +Updates the autoinc counter if the value supplied is bigger than the current value. If not inited, does nothing. */ void dict_table_autoinc_update( /*======================*/ - dict_table_t* table, /* in: table */ ib_longlong value) /* in: value which was assigned to a row */ { mutex_enter(&(table->autoinc_mutex)); if (table->autoinc_inited) { - if (value >= table->autoinc) { - table->autoinc = value + 1; + if (value > table->autoinc) { + table->autoinc = value; } } -- cgit v1.2.1 From 8f09b7053b16f4fe1458012a4367b883d5933b1e Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 21 Jul 2002 13:17:49 +0300 Subject: row0ins.c: Move the assertion in foreign keys to the right place innobase/row/row0ins.c: Move the assertion in foreign keys to the right place --- innobase/row/row0ins.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/innobase/row/row0ins.c b/innobase/row/row0ins.c index 5badebf2011..1f0d0f40114 100644 --- a/innobase/row/row0ins.c +++ b/innobase/row/row0ins.c @@ -389,10 +389,11 @@ row_ins_foreign_delete_or_set_null( char err_buf[1000]; ut_a(thr && foreign && pcur && mtr); - ut_a(que_node_get_type(node) == QUE_NODE_UPDATE); node = thr->run_node; + ut_a(que_node_get_type(node) == QUE_NODE_UPDATE); + if (!node->is_delete) { /* According to SQL-92 an UPDATE with respect to FOREIGN KEY constraints is not semantically equivalent to a -- cgit v1.2.1 From 15013f97caac27f4e6f181e507668a5a623ca781 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 23 Jul 2002 02:08:48 +0300 Subject: Fixed problem with auto_increment key as not first key part Docs/manual.texi: Changelog --- Docs/manual.texi | 3 +++ sql/key.cc | 2 +- sql/table.cc | 25 ++++++++++++++----------- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/Docs/manual.texi b/Docs/manual.texi index 2c4b0f71352..19ce75e5d7d 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -46928,6 +46928,9 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.52 @itemize @bullet @item +Fixed bug with creating an auto-increment value on second part of a +@code{UNIQUE()} key where first part could contain NULL values. +@item Don't write slave-timeout reconnects to the error log. @item Fixed bug with slave net read timeouting diff --git a/sql/key.cc b/sql/key.cc index 80a33bc45d3..f2488ab74cb 100644 --- a/sql/key.cc +++ b/sql/key.cc @@ -59,7 +59,7 @@ int find_ref_key(TABLE *table,Field *field, uint *key_length) { if (key_part->offset == fieldpos) return(i); /* Use this key */ - *key_length+=key_part->length; + *key_length+=key_part->store_length; } } return(-1); /* No key is ok */ diff --git a/sql/table.cc b/sql/table.cc index 66cbe7cfa16..4f71dacfa1d 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -346,17 +346,7 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, } } if (reg_field->unireg_check == Field::NEXT_NUMBER) - { - if ((int) (outparam->next_number_index= (uint) - find_ref_key(outparam,reg_field, - &outparam->next_number_key_offset)) < 0) - reg_field->unireg_check=Field::NONE; /* purecov: inspected */ - else - { - outparam->found_next_number_field=reg_field; - reg_field->flags|=AUTO_INCREMENT_FLAG; - } - } + outparam->found_next_number_field= reg_field; if (outparam->timestamp_field == reg_field) outparam->timestamp_field_offset=i; if (use_hash) @@ -507,6 +497,19 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag, bfill(outparam->null_flags+outparam->rec_buff_length*2,null_length,255); } + if ((reg_field=outparam->found_next_number_field)) + { + if ((int) (outparam->next_number_index= (uint) + find_ref_key(outparam,reg_field, + &outparam->next_number_key_offset)) < 0) + { + reg_field->unireg_check=Field::NONE; /* purecov: inspected */ + outparam->found_next_number_field=0; + } + else + reg_field->flags|=AUTO_INCREMENT_FLAG; + } + if (outparam->blob_fields) { Field **ptr; -- cgit v1.2.1