diff options
author | unknown <sasha@mysql.sashanet.com> | 2001-09-10 17:31:33 -0600 |
---|---|---|
committer | unknown <sasha@mysql.sashanet.com> | 2001-09-10 17:31:33 -0600 |
commit | 93a15f452eb08eab559b12b1947cfae71fc628f5 (patch) | |
tree | 37dd381b754127332c0c5d2e94e5c93479b0526c /sql | |
parent | 8cfd4949c2725431d78605d30c1138c4d42ab4d2 (diff) | |
parent | 341504b3c9770c450b8101784344b403bd0257cc (diff) | |
download | mariadb-git-93a15f452eb08eab559b12b1947cfae71fc628f5.tar.gz |
Merge work:/home/bk/mysql
into mysql.sashanet.com:/home/sasha/src/bk/mysql
Diffstat (limited to 'sql')
-rw-r--r-- | sql/ha_berkeley.cc | 48 | ||||
-rw-r--r-- | sql/ha_berkeley.h | 2 | ||||
-rw-r--r-- | sql/ha_innobase.cc | 4 | ||||
-rw-r--r-- | sql/handler.cc | 13 | ||||
-rw-r--r-- | sql/lock.cc | 15 | ||||
-rw-r--r-- | sql/log_event.cc | 18 | ||||
-rw-r--r-- | sql/mysql_priv.h | 3 | ||||
-rw-r--r-- | sql/mysqld.cc | 4 | ||||
-rw-r--r-- | sql/sql_base.cc | 3 | ||||
-rw-r--r-- | sql/sql_parse.cc | 10 | ||||
-rw-r--r-- | sql/sql_select.cc | 2 | ||||
-rw-r--r-- | sql/violite.c | 6 |
12 files changed, 82 insertions, 46 deletions
diff --git a/sql/ha_berkeley.cc b/sql/ha_berkeley.cc index 25f8148e52f..9a437607729 100644 --- a/sql/ha_berkeley.cc +++ b/sql/ha_berkeley.cc @@ -1181,9 +1181,11 @@ int ha_berkeley::remove_key(DB_TXN *trans, uint keynr, const byte *record, DBUG_ENTER("remove_key"); DBUG_PRINT("enter",("index: %d",keynr)); - if (keynr == primary_key || - ((table->key_info[keynr].flags & (HA_NOSAME | HA_NULL_PART_KEY)) == - HA_NOSAME)) + if (keynr == active_index && cursor) + error=cursor->c_del(cursor,0); + else if (keynr == primary_key || + ((table->key_info[keynr].flags & (HA_NOSAME | HA_NULL_PART_KEY)) == + HA_NOSAME)) { // Unique key dbug_assert(keynr == primary_key || prim_key->data != key_buff2); error=key_file[keynr]->del(key_file[keynr], trans, @@ -1304,7 +1306,7 @@ int ha_berkeley::delete_row(const byte * record) int ha_berkeley::index_init(uint keynr) { int error; - DBUG_ENTER("index_init"); + DBUG_ENTER("ha_berkeley::index_init"); DBUG_PRINT("enter",("table: '%s' key: %d", table->real_name, keynr)); /* @@ -1312,7 +1314,10 @@ int ha_berkeley::index_init(uint keynr) an active cursor at this point */ if (cursor) + { + DBUG_PRINT("note",("Closing active cursor")); cursor->c_close(cursor); + } active_index=keynr; if ((error=key_file[keynr]->cursor(key_file[keynr], transaction, &cursor, table->reginfo.lock_type > @@ -1342,7 +1347,7 @@ int ha_berkeley::index_end() int ha_berkeley::read_row(int error, char *buf, uint keynr, DBT *row, DBT *found_key, bool read_next) { - DBUG_ENTER("read_row"); + DBUG_ENTER("ha_berkeley::read_row"); if (error) { if (error == DB_NOTFOUND || error == DB_KEYEMPTY) @@ -1394,6 +1399,7 @@ int ha_berkeley::index_read_idx(byte * buf, uint keynr, const byte * key, statistic_increment(ha_read_key_count,&LOCK_status); DBUG_ENTER("index_read_idx"); current_row.flags=DB_DBT_REALLOC; + active_index= -1; DBUG_RETURN(read_row(key_file[keynr]->get(key_file[keynr], transaction, pack_key(&last_key, keynr, key_buff, key, key_len), @@ -1408,7 +1414,7 @@ int ha_berkeley::index_read(byte * buf, const byte * key, DBT row; int error; KEY *key_info= &table->key_info[active_index]; - DBUG_ENTER("index_read"); + DBUG_ENTER("ha_berkeley::index_read"); statistic_increment(ha_read_key_count,&LOCK_status); bzero((char*) &row,sizeof(row)); @@ -1513,8 +1519,9 @@ int ha_berkeley::index_last(byte * buf) int ha_berkeley::rnd_init(bool scan) { + DBUG_ENTER("rnd_init"); current_row.flags=DB_DBT_REALLOC; - return index_init(primary_key); + DBUG_RETURN(index_init(primary_key)); } int ha_berkeley::rnd_end() @@ -1529,7 +1536,7 @@ int ha_berkeley::rnd_next(byte *buf) statistic_increment(ha_read_rnd_next_count,&LOCK_status); bzero((char*) &row,sizeof(row)); DBUG_RETURN(read_row(cursor->c_get(cursor, &last_key, &row, DB_NEXT), - (char*) buf, active_index, &row, &last_key, 1)); + (char*) buf, primary_key, &row, &last_key, 1)); } @@ -1559,10 +1566,11 @@ int ha_berkeley::rnd_pos(byte * buf, byte *pos) DBT db_pos; statistic_increment(ha_read_rnd_count,&LOCK_status); + active_index= (uint) -1; // Don't delete via cursor return read_row(file->get(file, transaction, get_pos(&db_pos, pos), ¤t_row, 0), - (char*) buf, active_index, ¤t_row, (DBT*) 0, 0); + (char*) buf, primary_key, ¤t_row, (DBT*) 0, 0); } void ha_berkeley::position(const byte *record) @@ -1577,10 +1585,10 @@ void ha_berkeley::position(const byte *record) void ha_berkeley::info(uint flag) { - DBUG_ENTER("info"); + DBUG_ENTER("ha_berkeley::info"); if (flag & HA_STATUS_VARIABLE) { - records = share->rows; // Just to get optimisations right + records = share->rows + changed_rows; // Just to get optimisations right deleted = 0; } if ((flag & HA_STATUS_CONST) || version != share->version) @@ -1658,12 +1666,15 @@ int ha_berkeley::external_lock(THD *thd, int lock_type) { if (!thd->transaction.bdb_lock_count++) { + DBUG_ASSERT(thd->transaction.stmt.bdb_tid == 0); + transaction=0; // Safety /* First table lock, start transaction */ - if ((thd->options & (OPTION_NOT_AUTO_COMMIT | OPTION_BEGIN)) && + if ((thd->options & (OPTION_NOT_AUTO_COMMIT | OPTION_BEGIN | + OPTION_TABLE_LOCK)) && !thd->transaction.all.bdb_tid) { /* We have to start a master transaction */ - DBUG_PRINT("trans",("starting transaction")); + DBUG_PRINT("trans",("starting transaction all")); if ((error=txn_begin(db_env, 0, (DB_TXN**) &thd->transaction.all.bdb_tid, 0))) @@ -1671,8 +1682,10 @@ int ha_berkeley::external_lock(THD *thd, int lock_type) thd->transaction.bdb_lock_count--; // We didn't get the lock /* purecov: inspected */ DBUG_RETURN(error); /* purecov: inspected */ } + if (thd->in_lock_tables) + DBUG_RETURN(0); // Don't create stmt trans } - DBUG_PRINT("trans",("starting transaction for statement")); + DBUG_PRINT("trans",("starting transaction stmt")); if ((error=txn_begin(db_env, (DB_TXN*) thd->transaction.all.bdb_tid, (DB_TXN**) &thd->transaction.stmt.bdb_tid, @@ -1684,12 +1697,12 @@ int ha_berkeley::external_lock(THD *thd, int lock_type) } } transaction= (DB_TXN*) thd->transaction.stmt.bdb_tid; - changed_rows=0; } else { lock.type=TL_UNLOCK; // Unlocked thread_safe_add(share->rows, changed_rows, &share->mutex); + changed_rows=0; if (!--thd->transaction.bdb_lock_count) { if (thd->transaction.stmt.bdb_tid) @@ -1722,11 +1735,12 @@ int ha_berkeley::start_stmt(THD *thd) DBUG_ENTER("ha_berkeley::start_stmt"); if (!thd->transaction.stmt.bdb_tid) { + DBUG_PRINT("trans",("starting transaction stmt")); error=txn_begin(db_env, (DB_TXN*) thd->transaction.all.bdb_tid, (DB_TXN**) &thd->transaction.stmt.bdb_tid, 0); - transaction= (DB_TXN*) thd->transaction.stmt.bdb_tid; } + transaction= (DB_TXN*) thd->transaction.stmt.bdb_tid; DBUG_RETURN(error); } @@ -1931,6 +1945,8 @@ longlong ha_berkeley::get_auto_increment() longlong nr=1; // Default if error or new key int error; (void) ha_berkeley::extra(HA_EXTRA_KEYREAD); + + /* Set 'active_index' */ ha_berkeley::index_init(table->next_number_index); if (!table->next_number_key_offset) diff --git a/sql/ha_berkeley.h b/sql/ha_berkeley.h index 3eb793937ae..fda7d2f2069 100644 --- a/sql/ha_berkeley.h +++ b/sql/ha_berkeley.h @@ -93,7 +93,7 @@ class ha_berkeley: public handler HA_BLOB_KEY | HA_NOT_EXACT_COUNT | HA_PRIMARY_KEY_IN_READ_INDEX | HA_DROP_BEFORE_CREATE | HA_AUTO_PART_KEY), - last_dup_key((uint) -1),version(0),using_ignore(0) + changed_rows(0),last_dup_key((uint) -1),version(0),using_ignore(0) { } ~ha_berkeley() {} diff --git a/sql/ha_innobase.cc b/sql/ha_innobase.cc index 2eed5ada680..104aaf8886c 100644 --- a/sql/ha_innobase.cc +++ b/sql/ha_innobase.cc @@ -21,7 +21,7 @@ InnoDB */ - Ask Monty if strings of different languages can exist in the same database. Answer: in near future yes, but not yet. */ - + #ifdef __GNUC__ #pragma implementation // gcc: Class implementation #endif @@ -2844,7 +2844,7 @@ ha_innobase::info( if (records == 0) { mean_rec_length = 0; } else { - mean_rec_length = (ulong) data_file_length / records; + mean_rec_length = (ulong) (data_file_length / records); } } diff --git a/sql/handler.cc b/sql/handler.cc index bb17d8f2331..1c50634de1f 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -52,7 +52,7 @@ ulong ha_read_count, ha_write_count, ha_delete_count, ha_update_count, const char *ha_table_type[] = { "", "DIAB_ISAM","HASH","MISAM","PISAM","RMS_ISAM","HEAP", "ISAM", - "MRG_ISAM","MYISAM", "MRG_MYISAM", "BDB", "INNOBASE", "GEMINI", "?", "?",NullS + "MRG_ISAM","MYISAM", "MRG_MYISAM", "BDB", "INNODB", "GEMINI", "?", "?",NullS }; TYPELIB ha_table_typelib= {array_elements(ha_table_type)-4,"", @@ -837,8 +837,15 @@ int ha_create_table(const char *name, HA_CREATE_INFO *create_info, } error=table.file->create(name,&table,create_info); VOID(closefrm(&table)); - if (error) - my_error(ER_CANT_CREATE_TABLE,MYF(ME_BELL+ME_WAITTANG),name,my_errno); + if (error) { + if (table.db_type == DB_TYPE_INNOBASE) { + /* Creation of InnoDB table cannot fail because of an OS error: + put error as the number */ + my_error(ER_CANT_CREATE_TABLE,MYF(ME_BELL+ME_WAITTANG),name,error); + } else { + my_error(ER_CANT_CREATE_TABLE,MYF(ME_BELL+ME_WAITTANG),name,my_errno); + } + } DBUG_RETURN(error != 0); } diff --git a/sql/lock.cc b/sql/lock.cc index a8b26c3b17d..aa06822e03f 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -169,8 +169,10 @@ static int lock_external(TABLE **tables,uint count) void mysql_unlock_tables(THD *thd, MYSQL_LOCK *sql_lock) { DBUG_ENTER("mysql_unlock_tables"); - thr_multi_unlock(sql_lock->locks,sql_lock->lock_count); - VOID(unlock_external(thd,sql_lock->table,sql_lock->table_count)); + if (sql_lock->lock_count) + thr_multi_unlock(sql_lock->locks,sql_lock->lock_count); + if (sql_lock->table_count) + VOID(unlock_external(thd,sql_lock->table,sql_lock->table_count)); my_free((gptr) sql_lock,MYF(0)); DBUG_VOID_RETURN; } @@ -213,7 +215,7 @@ void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock) if (i != found) { thr_multi_unlock(lock,i-found); - sql_lock->lock_count-=found; + sql_lock->lock_count= found; } /* Then to the same for the external locks */ @@ -232,7 +234,7 @@ void mysql_unlock_read_tables(THD *thd, MYSQL_LOCK *sql_lock) if (i != found) { VOID(unlock_external(thd,table,i-found)); - sql_lock->table_count-=found; + sql_lock->table_count=found; } DBUG_VOID_RETURN; } @@ -314,7 +316,7 @@ static int unlock_external(THD *thd, TABLE **table,uint count) DBUG_ENTER("unlock_external"); error_code=0; - for (; count-- ; table++) + do { if ((*table)->current_lock != F_UNLCK) { @@ -322,7 +324,8 @@ static int unlock_external(THD *thd, TABLE **table,uint count) if ((error=(*table)->file->external_lock(thd, F_UNLCK))) error_code=error; } - } + table++; + } while (--count); if (error_code) print_lock_error(error_code); DBUG_RETURN(error_code); diff --git a/sql/log_event.cc b/sql/log_event.cc index 6e99e031f4a..521e0f7765f 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -272,24 +272,24 @@ void Log_event::print_header(FILE* file) void Log_event::print_timestamp(FILE* file, time_t* ts) { - struct tm tm_tmp; + struct tm tm_tmp, *res; if (!ts) { ts = &when; } #ifdef MYSQL_SERVER - localtime_r(ts,&tm_tmp); + localtime_r(ts,(res= &tm_tmp)); #else - localtime(ts); + res=localtime(ts); #endif fprintf(file,"%02d%02d%02d %2d:%02d:%02d", - tm_tmp.tm_year % 100, - tm_tmp.tm_mon+1, - tm_tmp.tm_mday, - tm_tmp.tm_hour, - tm_tmp.tm_min, - tm_tmp.tm_sec); + res->tm_year % 100, + res->tm_mon+1, + res->tm_mday, + res->tm_hour, + res->tm_min, + res->tm_sec); } diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 06d0b1528f4..841d76928e1 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -163,7 +163,8 @@ void kill_one_thread(THD *thd, ulong id); #define OPTION_BIN_LOG OPTION_BUFFER_RESULT*2 #define OPTION_NOT_AUTO_COMMIT OPTION_BIN_LOG*2 #define OPTION_BEGIN OPTION_NOT_AUTO_COMMIT*2 -#define OPTION_QUICK OPTION_BEGIN*2 +#define OPTION_TABLE_LOCK OPTION_BEGIN*2 +#define OPTION_QUICK OPTION_TABLE_LOCK*2 #define OPTION_QUOTE_SHOW_CREATE OPTION_QUICK*2 #define OPTION_INTERNAL_SUBTRANSACTIONS OPTION_QUOTE_SHOW_CREATE*2 diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 7d6863cb6eb..b7cd101695a 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -636,9 +636,7 @@ static void __cdecl kill_server(int sig_ptr) unireg_abort(1); /* purecov: inspected */ else unireg_end(0); -#ifndef OS2 pthread_exit(0); /* purecov: deadcode */ -#endif RETURN_FROM_KILL_SERVER; } @@ -670,9 +668,7 @@ static sig_handler print_signal_warning(int sig) void unireg_end(int signal_number __attribute__((unused))) { clean_up(); -#ifndef OS2 pthread_exit(0); // Exit is in main thread -#endif } diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 16495ab03b0..624377b688e 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -413,7 +413,10 @@ void close_thread_tables(THD *thd, bool locked) DBUG_ENTER("close_thread_tables"); if (thd->locked_tables) + { + ha_commit_stmt(thd); // If select statement DBUG_VOID_RETURN; // LOCK TABLES in use + } TABLE *table,*next; bool found_old_table=0; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 417484b2ef7..18ab3c45359 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -81,7 +81,8 @@ static void init_signals(void) inline bool end_active_trans(THD *thd) { int error=0; - if (thd->options & (OPTION_NOT_AUTO_COMMIT | OPTION_BEGIN)) + if (thd->options & (OPTION_NOT_AUTO_COMMIT | OPTION_BEGIN | + OPTION_TABLE_LOCK)) { thd->options&= ~(ulong) (OPTION_BEGIN | OPTION_STATUS_NO_TRANS_UPDATE); thd->server_status&= ~SERVER_STATUS_IN_TRANS; @@ -1825,7 +1826,11 @@ mysql_execute_command(void) { thd->lock=thd->locked_tables; thd->locked_tables=0; // Will be automaticly closed + } + if (thd->options & OPTION_TABLE_LOCK) + { end_active_trans(thd); + thd->options&= ~(ulong) (OPTION_TABLE_LOCK); } if (thd->global_read_lock) { @@ -1847,12 +1852,15 @@ mysql_execute_command(void) if (check_db_used(thd,tables) || end_active_trans(thd)) goto error; thd->in_lock_tables=1; + thd->options|= OPTION_TABLE_LOCK; if (!(res=open_and_lock_tables(thd,tables))) { thd->locked_tables=thd->lock; thd->lock=0; send_ok(&thd->net); } + else + thd->options&= ~(ulong) (OPTION_TABLE_LOCK); thd->in_lock_tables=0; break; case SQLCOM_CREATE_DB: diff --git a/sql/sql_select.cc b/sql/sql_select.cc index b30cb6bb639..b6c261d1463 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -2516,6 +2516,7 @@ static void join_free(JOIN *join) { JOIN_TAB *tab,*end; + DBUG_ENTER("join_free"); if (join->table) { @@ -2556,6 +2557,7 @@ join_free(JOIN *join) join->tmp_table_param.copy_funcs.delete_elements(); delete [] join->tmp_table_param.copy_field; join->tmp_table_param.copy_field=0; + DBUG_VOID_RETURN; } diff --git a/sql/violite.c b/sql/violite.c index 0d96c71969c..d551b9b8632 100644 --- a/sql/violite.c +++ b/sql/violite.c @@ -154,7 +154,7 @@ int vio_read(Vio * vio, gptr buf, int size) { int r; DBUG_ENTER("vio_read"); - DBUG_PRINT("enter", ("sd=%d, buf=%p, size=%d", vio->sd, buf, size)); + DBUG_PRINT("enter", ("sd=%d size=%d", vio->sd, size)); #if defined( __WIN__) || defined(OS2) if (vio->type == VIO_TYPE_NAMEDPIPE) { @@ -188,7 +188,7 @@ int vio_write(Vio * vio, const gptr buf, int size) { int r; DBUG_ENTER("vio_write"); - DBUG_PRINT("enter", ("sd=%d, buf=%p, size=%d", vio->sd, buf, size)); + DBUG_PRINT("enter", ("sd=%d size=%d", vio->sd, size)); #if defined( __WIN__) || defined(OS2) if ( vio->type == VIO_TYPE_NAMEDPIPE) { @@ -303,7 +303,7 @@ int vio_keepalive(Vio* vio, my_bool set_keep_alive) int r=0; uint opt = 0; DBUG_ENTER("vio_keepalive"); - DBUG_PRINT("enter", ("sd=%d, set_keep_alive=%d", vio->sd, (int) + DBUG_PRINT("enter", ("sd=%d set_keep_alive=%d", vio->sd, (int) set_keep_alive)); if (vio->type != VIO_TYPE_NAMEDPIPE) { |