diff options
author | unknown <monty@work.mysql.com> | 2001-09-13 09:52:35 +0200 |
---|---|---|
committer | unknown <monty@work.mysql.com> | 2001-09-13 09:52:35 +0200 |
commit | c96bf55b9c8641d4b1c2ece0c0314071bc1022df (patch) | |
tree | 1fb0fbca5b7a4edebe2c26a5ed0b272e92bc21f2 /sql | |
parent | 9e4206b990df875e063a07784c77cc39dc394654 (diff) | |
parent | c88dd9b291cf7fe9086102d74d255f4b880d1486 (diff) | |
download | mariadb-git-c96bf55b9c8641d4b1c2ece0c0314071bc1022df.tar.gz |
Merge with 3.23.42
configure.in:
Auto merged
BitKeeper/deleted/.del-violite.c~d7b85be615595ace:
Auto merged
BitKeeper/deleted/.del-violite.c~984c09cffe14a11b:
Auto merged
client/Makefile.am:
Auto merged
client/mysql.cc:
Auto merged
client/mysqlbinlog.cc:
Auto merged
heap/hp_test2.c:
Auto merged
include/global.h:
Auto merged
include/my_pthread.h:
Auto merged
include/myisam.h:
Auto merged
libmysql/libmysql.c:
Auto merged
libmysql/net.c:
Auto merged
myisam/sort.c:
Auto merged
sql-bench/test-create.sh:
Auto merged
sql/handler.cc:
Auto merged
sql/handler.h:
Auto merged
sql/lock.cc:
Auto merged
sql/log_event.cc:
Auto merged
sql/mini_client.cc:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/mysqld.cc:
Auto merged
sql/net_serv.cc:
Auto merged
mysql-test/t/merge.test:
Auto merged
sql/ha_innobase.cc:
Auto merged
sql/sql_base.cc:
Auto merged
sql/sql_lex.cc:
Auto merged
sql/sql_parse.cc:
Auto merged
sql/sql_select.cc:
Auto merged
sql/sql_table.cc:
Auto merged
support-files/mysql.spec.sh:
Auto merged
mysql-test/t/bdb.test:
Auto merged
Docs/manual.texi:
merge
myisam/myisampack.c:
merge
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/handler.h | 2 | ||||
-rw-r--r-- | sql/lock.cc | 15 | ||||
-rw-r--r-- | sql/log_event.cc | 2 | ||||
-rw-r--r-- | sql/mini_client.cc | 12 | ||||
-rw-r--r-- | sql/mysql_priv.h | 3 | ||||
-rw-r--r-- | sql/mysqld.cc | 27 | ||||
-rw-r--r-- | sql/net_serv.cc | 4 | ||||
-rw-r--r-- | sql/sql_base.cc | 3 | ||||
-rw-r--r-- | sql/sql_lex.cc | 16 | ||||
-rw-r--r-- | sql/sql_parse.cc | 10 | ||||
-rw-r--r-- | sql/sql_select.cc | 2 | ||||
-rw-r--r-- | sql/sql_table.cc | 2 | ||||
-rw-r--r-- | sql/unireg.cc | 4 |
17 files changed, 107 insertions, 62 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 3493b2f2c89..cb76c034749 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 @@ -2839,7 +2839,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 fbf5144c090..f790417cf79 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,"", @@ -839,8 +839,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/handler.h b/sql/handler.h index b190cedd040..4b047fb320e 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -77,7 +77,7 @@ #define HA_NO_FULLTEXT_KEY (HA_NO_PREFIX_CHAR_KEYS*2) /* Parameters for open() (in register form->filestat) */ - /* HA_GET_INFO does a implicit HA_ABORT_IF_LOCKED */ + /* HA_GET_INFO does an implicit HA_ABORT_IF_LOCKED */ #define HA_OPEN_KEYFILE 1 #define HA_OPEN_RNDFILE 2 diff --git a/sql/lock.cc b/sql/lock.cc index 9ce4137e380..d9bc5d43c79 100644 --- a/sql/lock.cc +++ b/sql/lock.cc @@ -149,8 +149,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; } @@ -193,7 +195,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 */ @@ -212,7 +214,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; } @@ -294,7 +296,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) { @@ -302,7 +304,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 ce0873f0be6..ecf4e815b49 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -554,7 +554,7 @@ void Log_event::print_timestamp(FILE* file, time_t* ts) ts = &when; } #ifdef MYSQL_SERVER - res=localtime_r(ts,&tm_tmp); + localtime_r(ts,(res= &tm_tmp)); #else res=localtime(ts); #endif diff --git a/sql/mini_client.cc b/sql/mini_client.cc index 994f788f423..09944959673 100644 --- a/sql/mini_client.cc +++ b/sql/mini_client.cc @@ -117,16 +117,10 @@ static MYSQL_DATA *mc_read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields, #define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_LOCAL_FILES) #if defined(MSDOS) || defined(__WIN__) -#define ERRNO WSAGetLastError() #define perror(A) -#elif defined(OS2) -#define ERRNO sock_errno() -#define SOCKET_ERROR -1 #else -#include <sys/errno.h> -#define ERRNO errno +#include <errno.h> #define SOCKET_ERROR -1 -#define closesocket(A) close(A) #endif #ifdef __WIN__ @@ -370,7 +364,7 @@ mc_net_safe_read(MYSQL *mysql) { DBUG_PRINT("error",("Wrong connection or packet. fd: %s len: %d", vio_description(net->vio),len)); - if (socket_errno != EINTR) + if (socket_errno != SOCKET_EINTR) { mc_end_server(mysql); if(net->last_errno != ER_NET_PACKET_TOO_LARGE) @@ -563,7 +557,7 @@ mc_mysql_connect(MYSQL *mysql,const char *host, const char *user, if ((sock = socket(AF_UNIX,SOCK_STREAM,0)) == SOCKET_ERROR) { net->last_errno=CR_SOCKET_CREATE_ERROR; - sprintf(net->last_error,ER(net->last_errno),ERRNO); + sprintf(net->last_error,ER(net->last_errno),socket_errno); goto error; } net->vio = vio_new(sock, VIO_TYPE_SOCKET, TRUE); diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 49ca09098dd..8e38c8174a4 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -165,7 +165,8 @@ char* query_table_status(THD *thd,const char *db,const char *table_name); #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 05fdf6316c2..20ccb6d1f76 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -650,9 +650,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; } @@ -684,9 +682,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 } @@ -1493,10 +1489,6 @@ static int my_message_sql(uint error, const char *str, } #ifdef __WIN__ -#undef errno -#undef EINTR -#define errno WSAGetLastError() -#define EINTR WSAEINTR struct utsname { @@ -1609,18 +1601,26 @@ int main(int argc, char **argv) tzset(); // Set tzname start_time=time((time_t*) 0); +#ifdef OS2 + { + // fix timezone for daylight saving + struct tm *ts = localtime(&start_time); + if (ts->tm_isdst > 0) + _timezone -= 3600; + } +#endif #ifdef HAVE_TZNAME #if defined(HAVE_LOCALTIME_R) && defined(_REENTRANT) { struct tm tm_tmp; localtime_r(&start_time,&tm_tmp); - strmov(time_zone,tzname[tm_tmp.tm_isdst == 1 ? 1 : 0]); + strmov(time_zone,tzname[tm_tmp.tm_isdst != 0 ? 1 : 0]); } #else { struct tm *start_tm; start_tm=localtime(&start_time); - strmov(time_zone,tzname[start_tm->tm_isdst == 1 ? 1 : 0]); + strmov(time_zone,tzname[start_tm->tm_isdst != 0 ? 1 : 0]); } #endif #endif @@ -2305,7 +2305,7 @@ pthread_handler_decl(handle_connections_sockets,arg __attribute__((unused))) #else if (select((int) max_used_connection,&readFDs,0,0,0) < 0) { - if (socket_errno != EINTR) + if (socket_errno != SOCKET_EINTR) { if (!select_errors++ && !abort_loop) /* purecov: inspected */ sql_print_error("mysqld: Got error %d from select",socket_errno); /* purecov: inspected */ @@ -2348,7 +2348,8 @@ pthread_handler_decl(handle_connections_sockets,arg __attribute__((unused))) size_socket length=sizeof(struct sockaddr_in); new_sock = accept(sock, my_reinterpret_cast(struct sockaddr *) (&cAddr), &length); - if (new_sock != INVALID_SOCKET || (errno != EINTR && errno != EAGAIN)) + if (new_sock != INVALID_SOCKET || + (socket_errno != SOCKET_EINTR && socket_errno != SOCKET_EAGAIN)) break; #if !defined(NO_FCNTL_NONBLOCK) if (!(test_flags & TEST_BLOCKING)) @@ -2366,7 +2367,7 @@ pthread_handler_decl(handle_connections_sockets,arg __attribute__((unused))) { if ((error_count++ & 255) == 0) // This can happen often sql_perror("Error in accept"); - if (errno == ENFILE || errno == EMFILE) + if (socket_errno == SOCKET_ENFILE || socket_errno == SOCKET_EMFILE) sleep(1); // Give other threads some time continue; } diff --git a/sql/net_serv.cc b/sql/net_serv.cc index be08065b589..fded2c3ce32 100644 --- a/sql/net_serv.cc +++ b/sql/net_serv.cc @@ -344,7 +344,7 @@ net_real_write(NET *net,const char *packet,ulong len) int length; char *pos,*end; thr_alarm_t alarmed; -#if !defined(__WIN__) && !defined(__EMX__) && !defined(OS2) +#if !defined(__WIN__) ALARM alarm_buff; #endif uint retry_count=0; @@ -439,7 +439,7 @@ net_real_write(NET *net,const char *packet,ulong len) #endif /* EXTRA_DEBUG */ } #if defined(THREAD_SAFE_CLIENT) && !defined(MYSQL_SERVER) - if (vio_errno(net->vio) == EINTR) + if (vio_errno(net->vio) == SOCKET_EINTR) { DBUG_PRINT("warning",("Interrupted write. Retrying...")); continue; diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 4c3e113d537..9ba5277a92c 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -407,7 +407,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_lex.cc b/sql/sql_lex.cc index 0e77757b13b..bfda57a06ad 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -820,9 +820,19 @@ int yylex(void *arg) } break; case STATE_USER_END: // end '@' of user@hostname - if (state_map[yyPeek()] != STATE_STRING && - state_map[yyPeek()] != STATE_USER_VARIABLE_DELIMITER) - lex->next_state=STATE_HOSTNAME; // Mark for next loop + switch (state_map[yyPeek()]) + { + case STATE_STRING: + case STATE_USER_VARIABLE_DELIMITER: + break; + case STATE_USER_END: + lex->next_state=STATE_USER_END; + yySkip(); + break; + default: + lex->next_state=STATE_HOSTNAME; + break; + } yylval->lex_str.str=(char*) lex->ptr; yylval->lex_str.length=1; return((int) '@'); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 3dd0176c546..a41ad1ba9ab 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -86,7 +86,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; @@ -1931,7 +1932,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) unlock_global_read_lock(thd); @@ -1949,12 +1954,15 @@ mysql_execute_command(void) if (grant_option && check_grant(thd,SELECT_ACL | INSERT_ACL | UPDATE_ACL | DELETE_ACL,tables)) 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 07de0dc5b33..38aedbb4193 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -2595,6 +2595,7 @@ static void join_free(JOIN *join) { JOIN_TAB *tab,*end; + DBUG_ENTER("join_free"); if (join->table) { @@ -2636,6 +2637,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/sql_table.cc b/sql/sql_table.cc index f50da413f53..ad9bf532268 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -193,7 +193,7 @@ int quick_rm_table(enum db_type base,const char *db, } /***************************************************************************** - * Create at table. + * Create a table. * If one creates a temporary table, this is automaticly opened ****************************************************************************/ diff --git a/sql/unireg.cc b/sql/unireg.cc index d02af0ef0d0..c5bfbbbea88 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -18,7 +18,7 @@ /* Functions to create a unireg form-file from a FIELD and a fieldname-fieldinfo struct. - In the following functions FIELD * is a ordinary field-structure with + In the following functions FIELD * is an ordinary field-structure with the following exeptions: sc_length,typepos,row,kol,dtype,regnr and field nead not to be set. str is a (long) to record position where 0 is the first position. @@ -502,7 +502,7 @@ static bool pack_fields(File file,List<create_field> &create_fields) } - /* save a empty record on start of formfile */ + /* save an empty record on start of formfile */ static bool make_empty_rec(File file,enum db_type table_type, uint table_options, |