summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <monty@work.mysql.com>2001-09-13 09:52:35 +0200
committerunknown <monty@work.mysql.com>2001-09-13 09:52:35 +0200
commitc96bf55b9c8641d4b1c2ece0c0314071bc1022df (patch)
tree1fb0fbca5b7a4edebe2c26a5ed0b272e92bc21f2 /sql
parent9e4206b990df875e063a07784c77cc39dc394654 (diff)
parentc88dd9b291cf7fe9086102d74d255f4b880d1486 (diff)
downloadmariadb-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.cc48
-rw-r--r--sql/ha_berkeley.h2
-rw-r--r--sql/ha_innobase.cc4
-rw-r--r--sql/handler.cc13
-rw-r--r--sql/handler.h2
-rw-r--r--sql/lock.cc15
-rw-r--r--sql/log_event.cc2
-rw-r--r--sql/mini_client.cc12
-rw-r--r--sql/mysql_priv.h3
-rw-r--r--sql/mysqld.cc27
-rw-r--r--sql/net_serv.cc4
-rw-r--r--sql/sql_base.cc3
-rw-r--r--sql/sql_lex.cc16
-rw-r--r--sql/sql_parse.cc10
-rw-r--r--sql/sql_select.cc2
-rw-r--r--sql/sql_table.cc2
-rw-r--r--sql/unireg.cc4
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),
&current_row, 0),
- (char*) buf, active_index, &current_row, (DBT*) 0, 0);
+ (char*) buf, primary_key, &current_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,