Commit 55a2ab6e authored by monty@hundin.mysql.fi's avatar monty@hundin.mysql.fi

Cleanup of alarm macros.

Fixed data corruption bug in query cache.
Made queries be dependent of the database in use.
parent f5a1abd8
...@@ -10200,7 +10200,7 @@ because it can't compile @code{.S} (assembler) files. ...@@ -10200,7 +10200,7 @@ because it can't compile @code{.S} (assembler) files.
The following configure line should work: The following configure line should work:
@example @example
CFLAGS="-DHPUX -I/opt/dce/include" CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors -fno-exceptions -fno-rtti" CXX=gcc ./configure --with-pthread --with-named-thread-libs='-ldce' --prefix=/usr/local/mysql --disable-shared CFLAGS="-DHPUX -I/opt/dce/include -fpic" CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors -fno-exceptions -fno-rtti" CXX=gcc ./configure --with-pthread --with-named-thread-libs='-ldce' --prefix=/usr/local/mysql --disable-shared
@end example @end example
If you are compiling @code{gcc} 2.95 yourself, you should NOT link it with If you are compiling @code{gcc} 2.95 yourself, you should NOT link it with
...@@ -22679,10 +22679,13 @@ file is written in the data directory. ...@@ -22679,10 +22679,13 @@ file is written in the data directory.
If you supply an extension to @code{--log-bin=filename.extension}, the If you supply an extension to @code{--log-bin=filename.extension}, the
extension will be silenty removed. extension will be silenty removed.
To the binary log filename @code{mysqld} will append an extension that is a To the binary log filename @code{mysqld} will append an extension that
number that is incremented each time you execute @code{mysqladmin is a number that is incremented each time you execute @code{mysqladmin
refresh}, execute @code{mysqladmin flush-logs}, execute the @code{FLUSH LOGS} refresh}, execute @code{mysqladmin flush-logs}, execute the @code{FLUSH
statement or restart the server. LOGS} statement or restart the server. A new binary log will also
automaticly be created when it reaches @code{max_bin_log_size}. You can
delete all not active binary log files with the @code{RESET MASTER}
command. @xref{RESET}.
You can use the following options to @code{mysqld} to affect what is logged You can use the following options to @code{mysqld} to affect what is logged
to the binary log: to the binary log:
...@@ -1717,7 +1717,6 @@ print_table_data_xml(MYSQL_RES *result) ...@@ -1717,7 +1717,6 @@ print_table_data_xml(MYSQL_RES *result)
(void) tee_fputs("\n <row>\n", PAGER); (void) tee_fputs("\n <row>\n", PAGER);
for (uint i=0; i < mysql_num_fields(result); i++) for (uint i=0; i < mysql_num_fields(result); i++)
{ {
char *data;
ulong *lengths=mysql_fetch_lengths(result); ulong *lengths=mysql_fetch_lengths(result);
tee_fprintf(PAGER, "\t<%s>", (fields[i].name ? tee_fprintf(PAGER, "\t<%s>", (fields[i].name ?
(fields[i].name[0] ? fields[i].name : (fields[i].name[0] ? fields[i].name :
......
...@@ -38,24 +38,23 @@ extern "C" { ...@@ -38,24 +38,23 @@ extern "C" {
#define THR_SERVER_ALARM SIGALRM #define THR_SERVER_ALARM SIGALRM
#endif #endif
#if defined(DONT_USE_THR_ALARM) #if defined(DONT_USE_THR_ALARM) || !defined(THREAD)
#define USE_ALARM_THREAD #define USE_ALARM_THREAD
#undef USE_ONE_SIGNAL_HAND #undef USE_ONE_SIGNAL_HAND
typedef struct st_thr_alarm_entry typedef my_bool thr_alarm_t;
{ typedef my_bool ALARM;
uint crono;
} thr_alarm_entry;
#define thr_alarm_init(A) (A)->crono=0 #define thr_alarm_init(A) (*(A))=0
#define thr_alarm_in_use(A) (A)->crono #define thr_alarm_in_use(A) (*(A) != 0)
#define thr_end_alarm(A)
#define thr_alarm(A,B,C) ((*(A)=1)-1)
/* The following should maybe be (*(A)) */
#define thr_got_alarm(A) 0
#define init_thr_alarm(A) #define init_thr_alarm(A)
#define thr_alarm_kill(A) #define thr_alarm_kill(A)
#define end_thr_alarm() #define end_thr_alarm()
#define thr_alarm(A,B) (((A)->crono=1)-1)
#define thr_got_alarm(A) (A)->crono
#define thr_end_alarm(A)
#else #else
#if defined(__WIN__) #if defined(__WIN__)
......
...@@ -2225,7 +2225,7 @@ send_file_to_server(MYSQL *mysql, const char *filename) ...@@ -2225,7 +2225,7 @@ send_file_to_server(MYSQL *mysql, const char *filename)
my_net_write(&mysql->net,"",0); /* Server needs one packet */ my_net_write(&mysql->net,"",0); /* Server needs one packet */
net_flush(&mysql->net); net_flush(&mysql->net);
mysql->net.last_errno=EE_FILENOTFOUND; mysql->net.last_errno=EE_FILENOTFOUND;
snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1, my_snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1,
EE(mysql->net.last_errno),tmp_name, errno); EE(mysql->net.last_errno),tmp_name, errno);
goto err; goto err;
} }
...@@ -2250,7 +2250,7 @@ send_file_to_server(MYSQL *mysql, const char *filename) ...@@ -2250,7 +2250,7 @@ send_file_to_server(MYSQL *mysql, const char *filename)
if (readcount < 0) if (readcount < 0)
{ {
mysql->net.last_errno=EE_READ; /* the errmsg for not entire file read */ mysql->net.last_errno=EE_READ; /* the errmsg for not entire file read */
snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1, my_snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1,
tmp_name,errno); tmp_name,errno);
goto err; goto err;
} }
......
...@@ -41,68 +41,55 @@ ...@@ -41,68 +41,55 @@
#include <signal.h> #include <signal.h>
#include <errno.h> #include <errno.h>
/*
The following handles the differences when this is linked between the
client and the server.
This gives an error if a too big packet is found
The server can change this with the -O switch, but because the client
can't normally do this the client should have a bigger max_allowed_packet.
*/
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
ulong max_allowed_packet=65536; ulong max_allowed_packet=65536;
extern ulong net_read_timeout,net_write_timeout; extern ulong net_read_timeout,net_write_timeout;
extern uint test_flags; extern uint test_flags;
#else #else
ulong max_allowed_packet=16*1024*1024L;
/*
** Give error if a too big packet is found
** The server can change this with the -O switch, but because the client
** can't normally do this the client should have a bigger max_allowed_packet.
*/
ulong max_allowed_packet=~0L;
ulong net_read_timeout= NET_READ_TIMEOUT; ulong net_read_timeout= NET_READ_TIMEOUT;
ulong net_write_timeout= NET_WRITE_TIMEOUT; ulong net_write_timeout= NET_WRITE_TIMEOUT;
#endif #endif
ulong net_buffer_length=8192; /* Default length. Enlarged if necessary */
#if defined(__WIN__) || defined(MSDOS) #ifdef __WIN__
#undef MYSQL_SERVER /* Win32 can't handle interrupts */ /* The following is because alarms doesn't work on windows. */
#undef MYSQL_SERVER
#endif #endif
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
#include "my_pthread.h" #include "my_pthread.h"
#include "thr_alarm.h"
void sql_print_error(const char *format,...); void sql_print_error(const char *format,...);
#define RETRY_COUNT mysqld_net_retry_count #define RETRY_COUNT mysqld_net_retry_count
extern ulong mysqld_net_retry_count; extern ulong mysqld_net_retry_count;
#else
#ifdef OS2 /* avoid name conflict */
#define thr_alarm_t thr_alarm_t_net
#define ALARM ALARM_net
#endif
typedef my_bool thr_alarm_t;
typedef my_bool ALARM;
#define thr_alarm_init(A) (*(A))=0
#define thr_alarm_in_use(A) (*(A) != 0)
#define thr_end_alarm(A)
#define thr_alarm(A,B,C) local_thr_alarm((A),(B),(C))
inline int local_thr_alarm(my_bool *A,int B __attribute__((unused)),ALARM *C __attribute__((unused)))
{
*A=1;
return 0;
}
#define thr_got_alarm(A) 0
#define RETRY_COUNT 1
#endif
#ifdef MYSQL_SERVER
extern ulong bytes_sent, bytes_received; extern ulong bytes_sent, bytes_received;
extern pthread_mutex_t LOCK_bytes_sent , LOCK_bytes_received; extern pthread_mutex_t LOCK_bytes_sent , LOCK_bytes_received;
extern void query_cache_insert(NET *net, const char *packet, ulong length); extern void query_cache_insert(NET *net, const char *packet, ulong length);
#else #else
#undef statistic_add #undef statistic_add
#define statistic_add(A,B,C) #define statistic_add(A,B,C)
#endif #define DONT_USE_THR_ALARM
#define RETRY_COUNT 1
#endif /* MYSQL_SERVER */
#include "thr_alarm.h"
#define TEST_BLOCKING 8 #define TEST_BLOCKING 8
#define MAX_THREE_BYTES 255L*255L*255L
ulong net_buffer_length=8192; /* Default length. Enlarged if necessary */
static int net_write_buff(NET *net,const char *packet,ulong len); static int net_write_buff(NET *net,const char *packet,ulong len);
#define MAX_THREE_BYTES 255L*255L*255L
/* Init with packet info */ /* Init with packet info */
...@@ -335,7 +322,7 @@ net_real_write(NET *net,const char *packet,ulong len) ...@@ -335,7 +322,7 @@ net_real_write(NET *net,const char *packet,ulong len)
long int length; long int length;
char *pos,*end; char *pos,*end;
thr_alarm_t alarmed; thr_alarm_t alarmed;
#if !defined(__WIN__) && !defined(__EMX__) && !defined(OS2) #if defined(MYSQL_SERVER)
ALARM alarm_buff; ALARM alarm_buff;
#endif #endif
uint retry_count=0; uint retry_count=0;
...@@ -522,7 +509,7 @@ my_real_read(NET *net, ulong *complen) ...@@ -522,7 +509,7 @@ my_real_read(NET *net, ulong *complen)
uint i,retry_count=0; uint i,retry_count=0;
ulong len=packet_error; ulong len=packet_error;
thr_alarm_t alarmed; thr_alarm_t alarmed;
#if (!defined(__WIN__) && !defined(__EMX__) && !defined(OS2)) || defined(MYSQL_SERVER) #if defined(MYSQL_SERVER)
ALARM alarm_buff; ALARM alarm_buff;
#endif #endif
my_bool net_blocking=vio_is_blocking(net->vio); my_bool net_blocking=vio_is_blocking(net->vio);
...@@ -775,7 +762,7 @@ my_net_read(NET *net) ...@@ -775,7 +762,7 @@ my_net_read(NET *net)
if (read_length != MAX_THREE_BYTES) /* last package */ if (read_length != MAX_THREE_BYTES) /* last package */
{ {
multi_byte_packet= 0; // No last zero length packet multi_byte_packet= 0; /* No last zero len packet */
break; break;
} }
multi_byte_packet= NET_HEADER_SIZE; multi_byte_packet= NET_HEADER_SIZE;
......
...@@ -6,6 +6,8 @@ dirty_close master; ...@@ -6,6 +6,8 @@ dirty_close master;
connection master1; connection master1;
select get_lock("lock",2); select get_lock("lock",2);
select release_lock("lock"); select release_lock("lock");
#ignore
disable_query_log;
let $1=2000; let $1=2000;
while ($1) while ($1)
{ {
...@@ -13,6 +15,7 @@ while ($1) ...@@ -13,6 +15,7 @@ while ($1)
do release_lock("lock"); do release_lock("lock");
dec $1; dec $1;
} }
enable_query_log;
save_master_pos; save_master_pos;
connection slave; connection slave;
sync_with_master; sync_with_master;
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include "mysys_priv.h" #include "mysys_priv.h"
#include <my_bitmap.h> #include <my_bitmap.h>
#include <assert.h> #include <assert.h>
#include <string.h> #include <m_string.h>
inline void bitmap_lock(MY_BITMAP* map) inline void bitmap_lock(MY_BITMAP* map)
{ {
......
...@@ -1539,7 +1539,8 @@ int Query_log_event::exec_event(struct st_master_info* mi) ...@@ -1539,7 +1539,8 @@ int Query_log_event::exec_event(struct st_master_info* mi)
{ {
int expected_error,actual_error = 0; int expected_error,actual_error = 0;
init_sql_alloc(&thd->mem_root, 8192,0); init_sql_alloc(&thd->mem_root, 8192,0);
thd->db = rewrite_db((char*)db); thd->db= rewrite_db((char*)db);
thd->db_length=strlen(thd->db);
if (db_ok(thd->db, replicate_do_db, replicate_ignore_db)) if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
{ {
thd->query = (char*)query; thd->query = (char*)query;
...@@ -1584,14 +1585,16 @@ int Query_log_event::exec_event(struct st_master_info* mi) ...@@ -1584,14 +1585,16 @@ int Query_log_event::exec_event(struct st_master_info* mi)
else else
{ {
// master could be inconsistent, abort and tell DBA to check/fix it // master could be inconsistent, abort and tell DBA to check/fix it
thd->db = thd->query = 0; thd->db= thd->query= 0;
thd->db_length=0;
thd->convert_set = 0; thd->convert_set = 0;
close_thread_tables(thd); close_thread_tables(thd);
free_root(&thd->mem_root,0); free_root(&thd->mem_root,0);
return 1; return 1;
} }
} }
thd->db = 0; // prevent db from being freed thd->db= 0; // prevent db from being freed
thd->db_length=0;
thd->query = 0; // just to be sure thd->query = 0; // just to be sure
// assume no convert for next query unless set explictly // assume no convert for next query unless set explictly
thd->convert_set = 0; thd->convert_set = 0;
...@@ -1612,7 +1615,7 @@ int Query_log_event::exec_event(struct st_master_info* mi) ...@@ -1612,7 +1615,7 @@ int Query_log_event::exec_event(struct st_master_info* mi)
int Load_log_event::exec_event(NET* net, struct st_master_info* mi) int Load_log_event::exec_event(NET* net, struct st_master_info* mi)
{ {
init_sql_alloc(&thd->mem_root, 8192,0); init_sql_alloc(&thd->mem_root, 8192,0);
thd->db = rewrite_db((char*)db); thd->db= rewrite_db((char*)db);
thd->query = 0; thd->query = 0;
thd->query_error = 0; thd->query_error = 0;
...@@ -1685,7 +1688,8 @@ int Load_log_event::exec_event(NET* net, struct st_master_info* mi) ...@@ -1685,7 +1688,8 @@ int Load_log_event::exec_event(NET* net, struct st_master_info* mi)
} }
thd->net.vio = 0; thd->net.vio = 0;
thd->db = 0;// prevent db from being freed thd->db= 0;// prevent db from being freed
thd->db_length=0;
close_thread_tables(thd); close_thread_tables(thd);
if (thd->query_error) if (thd->query_error)
{ {
......
...@@ -22,21 +22,15 @@ ...@@ -22,21 +22,15 @@
in case we decide to make them external at some point in case we decide to make them external at some point
*/ */
#ifdef EMBEDDED_LIBRARY
#define net_read_timeout net_read_timeout1
#define net_write_timeout net_write_timeout1
#endif
#if defined(__WIN__) #if defined(__WIN__)
#include <winsock.h> #include <winsock.h>
#include <odbcinst.h> #include <odbcinst.h> /* QQ: Is this really needed ? */
/* Disable alarms */ #define DONT_USE_THR_ALARM
typedef my_bool ALARM;
#define thr_alarm_init(A) (*(A))=0
#define thr_alarm_in_use(A) (*(A))
#define thr_end_alarm(A)
#define thr_alarm(A,B,C) local_thr_alarm((A),(B),(C))
inline int local_thr_alarm(my_bool *A,int B __attribute__((unused)),ALARM *C __attribute__((unused)))
{
*A=1;
return 0;
}
#define thr_got_alarm(A) 0
#endif #endif
#include <my_global.h> #include <my_global.h>
...@@ -53,12 +47,7 @@ inline int local_thr_alarm(my_bool *A,int B __attribute__((unused)),ALARM *C __a ...@@ -53,12 +47,7 @@ inline int local_thr_alarm(my_bool *A,int B __attribute__((unused)),ALARM *C __a
#include "mysqld_error.h" #include "mysqld_error.h"
#include "errmsg.h" #include "errmsg.h"
#ifdef EMBEDDED_LIBRARY #if defined( OS2) && defined(MYSQL_SERVER)
#define net_read_timeout net_read_timeout1
#define net_write_timeout net_write_timeout1
#endif
#if defined( OS2) && defined( MYSQL_SERVER)
#undef ER #undef ER
#define ER CER #define ER CER
#endif #endif
...@@ -82,18 +71,17 @@ extern "C" { // Because of SCO 3.2V4.2 ...@@ -82,18 +71,17 @@ extern "C" { // Because of SCO 3.2V4.2
#ifdef HAVE_SYS_SELECT_H #ifdef HAVE_SYS_SELECT_H
#include <sys/select.h> #include <sys/select.h>
#endif #endif
#endif #endif /*!defined(MSDOS) && !defined(__WIN__) */
#ifdef HAVE_SYS_UN_H #ifdef HAVE_SYS_UN_H
# include <sys/un.h> # include <sys/un.h>
#endif #endif
#if defined(THREAD) #if defined(THREAD)
#include <my_pthread.h> /* because of signal() */ #include <my_pthread.h> /* because of signal() */
#include <thr_alarm.h>
#endif #endif
#include <thr_alarm.h>
#ifndef INADDR_NONE #ifndef INADDR_NONE
#define INADDR_NONE -1 #define INADDR_NONE -1
#endif #endif
} }
static void mc_free_rows(MYSQL_DATA *cur); static void mc_free_rows(MYSQL_DATA *cur);
...@@ -1073,7 +1061,7 @@ static int mc_send_file_to_server(MYSQL *mysql, const char *filename) ...@@ -1073,7 +1061,7 @@ static int mc_send_file_to_server(MYSQL *mysql, const char *filename)
my_net_write(&mysql->net,"",0); // Server needs one packet my_net_write(&mysql->net,"",0); // Server needs one packet
net_flush(&mysql->net); net_flush(&mysql->net);
mysql->net.last_errno=EE_FILENOTFOUND; mysql->net.last_errno=EE_FILENOTFOUND;
snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1, my_snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1,
EE(mysql->net.last_errno),tmp_name, errno); EE(mysql->net.last_errno),tmp_name, errno);
goto err; goto err;
} }
...@@ -1098,7 +1086,7 @@ static int mc_send_file_to_server(MYSQL *mysql, const char *filename) ...@@ -1098,7 +1086,7 @@ static int mc_send_file_to_server(MYSQL *mysql, const char *filename)
if (readcount < 0) if (readcount < 0)
{ {
mysql->net.last_errno=EE_READ; /* the errmsg for not entire file read */ mysql->net.last_errno=EE_READ; /* the errmsg for not entire file read */
snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1, my_snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1,
tmp_name,errno); tmp_name,errno);
goto err; goto err;
} }
......
...@@ -41,68 +41,55 @@ ...@@ -41,68 +41,55 @@
#include <signal.h> #include <signal.h>
#include <errno.h> #include <errno.h>
/*
The following handles the differences when this is linked between the
client and the server.
This gives an error if a too big packet is found
The server can change this with the -O switch, but because the client
can't normally do this the client should have a bigger max_allowed_packet.
*/
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
ulong max_allowed_packet=65536; ulong max_allowed_packet=65536;
extern ulong net_read_timeout,net_write_timeout; extern ulong net_read_timeout,net_write_timeout;
extern uint test_flags; extern uint test_flags;
#else #else
ulong max_allowed_packet=16*1024*1024L;
/*
** Give error if a too big packet is found
** The server can change this with the -O switch, but because the client
** can't normally do this the client should have a bigger max_allowed_packet.
*/
ulong max_allowed_packet=~0L;
ulong net_read_timeout= NET_READ_TIMEOUT; ulong net_read_timeout= NET_READ_TIMEOUT;
ulong net_write_timeout= NET_WRITE_TIMEOUT; ulong net_write_timeout= NET_WRITE_TIMEOUT;
#endif #endif
ulong net_buffer_length=8192; /* Default length. Enlarged if necessary */
#if defined(__WIN__) || defined(MSDOS) #ifdef __WIN__
#undef MYSQL_SERVER /* Win32 can't handle interrupts */ /* The following is because alarms doesn't work on windows. */
#undef MYSQL_SERVER
#endif #endif
#ifdef MYSQL_SERVER #ifdef MYSQL_SERVER
#include "my_pthread.h" #include "my_pthread.h"
#include "thr_alarm.h"
void sql_print_error(const char *format,...); void sql_print_error(const char *format,...);
#define RETRY_COUNT mysqld_net_retry_count #define RETRY_COUNT mysqld_net_retry_count
extern ulong mysqld_net_retry_count; extern ulong mysqld_net_retry_count;
#else
#ifdef OS2 /* avoid name conflict */
#define thr_alarm_t thr_alarm_t_net
#define ALARM ALARM_net
#endif
typedef my_bool thr_alarm_t;
typedef my_bool ALARM;
#define thr_alarm_init(A) (*(A))=0
#define thr_alarm_in_use(A) (*(A) != 0)
#define thr_end_alarm(A)
#define thr_alarm(A,B,C) local_thr_alarm((A),(B),(C))
inline int local_thr_alarm(my_bool *A,int B __attribute__((unused)),ALARM *C __attribute__((unused)))
{
*A=1;
return 0;
}
#define thr_got_alarm(A) 0
#define RETRY_COUNT 1
#endif
#ifdef MYSQL_SERVER
extern ulong bytes_sent, bytes_received; extern ulong bytes_sent, bytes_received;
extern pthread_mutex_t LOCK_bytes_sent , LOCK_bytes_received; extern pthread_mutex_t LOCK_bytes_sent , LOCK_bytes_received;
extern void query_cache_insert(NET *net, const char *packet, ulong length); extern void query_cache_insert(NET *net, const char *packet, ulong length);
#else #else
#undef statistic_add #undef statistic_add
#define statistic_add(A,B,C) #define statistic_add(A,B,C)
#endif #define DONT_USE_THR_ALARM
#define RETRY_COUNT 1
#endif /* MYSQL_SERVER */
#include "thr_alarm.h"
#define TEST_BLOCKING 8 #define TEST_BLOCKING 8
#define MAX_THREE_BYTES 255L*255L*255L
ulong net_buffer_length=8192; /* Default length. Enlarged if necessary */
static int net_write_buff(NET *net,const char *packet,ulong len); static int net_write_buff(NET *net,const char *packet,ulong len);
#define MAX_THREE_BYTES 255L*255L*255L
/* Init with packet info */ /* Init with packet info */
...@@ -335,7 +322,7 @@ net_real_write(NET *net,const char *packet,ulong len) ...@@ -335,7 +322,7 @@ net_real_write(NET *net,const char *packet,ulong len)
long int length; long int length;
char *pos,*end; char *pos,*end;
thr_alarm_t alarmed; thr_alarm_t alarmed;
#if !defined(__WIN__) && !defined(__EMX__) && !defined(OS2) #if defined(MYSQL_SERVER)
ALARM alarm_buff; ALARM alarm_buff;
#endif #endif
uint retry_count=0; uint retry_count=0;
...@@ -522,7 +509,7 @@ my_real_read(NET *net, ulong *complen) ...@@ -522,7 +509,7 @@ my_real_read(NET *net, ulong *complen)
uint i,retry_count=0; uint i,retry_count=0;
ulong len=packet_error; ulong len=packet_error;
thr_alarm_t alarmed; thr_alarm_t alarmed;
#if (!defined(__WIN__) && !defined(__EMX__) && !defined(OS2)) || defined(MYSQL_SERVER) #if defined(MYSQL_SERVER)
ALARM alarm_buff; ALARM alarm_buff;
#endif #endif
my_bool net_blocking=vio_is_blocking(net->vio); my_bool net_blocking=vio_is_blocking(net->vio);
...@@ -775,7 +762,7 @@ my_net_read(NET *net) ...@@ -775,7 +762,7 @@ my_net_read(NET *net)
if (read_length != MAX_THREE_BYTES) /* last package */ if (read_length != MAX_THREE_BYTES) /* last package */
{ {
multi_byte_packet= 0; // No last zero length packet multi_byte_packet= 0; /* No last zero len packet */
break; break;
} }
multi_byte_packet= NET_HEADER_SIZE; multi_byte_packet= NET_HEADER_SIZE;
......
...@@ -132,7 +132,8 @@ int acl_init(bool dont_read_acl_tables) ...@@ -132,7 +132,8 @@ int acl_init(bool dont_read_acl_tables)
thd->mysys_var=my_thread_var; thd->mysys_var=my_thread_var;
thd->current_tablenr=0; thd->current_tablenr=0;
thd->open_tables=0; thd->open_tables=0;
thd->db=my_strdup("mysql",MYF(0)); thd->db= my_strdup("mysql",MYF(0));
thd->db_length=5; // Safety
bzero((char*) &tables,sizeof(tables)); bzero((char*) &tables,sizeof(tables));
tables[0].name=tables[0].real_name=(char*) "host"; tables[0].name=tables[0].real_name=(char*) "host";
tables[1].name=tables[1].real_name=(char*) "user"; tables[1].name=tables[1].real_name=(char*) "user";
...@@ -2120,7 +2121,8 @@ int grant_init (void) ...@@ -2120,7 +2121,8 @@ int grant_init (void)
thd->mysys_var=my_thread_var; thd->mysys_var=my_thread_var;
thd->current_tablenr=0; thd->current_tablenr=0;
thd->open_tables=0; thd->open_tables=0;
thd->db=my_strdup("mysql",MYF(0)); thd->db= my_strdup("mysql",MYF(0));
thd->db_length=5; // Safety
bzero((char*) &tables,sizeof(tables)); bzero((char*) &tables,sizeof(tables));
tables[0].name=tables[0].real_name= (char*) "tables_priv"; tables[0].name=tables[0].real_name= (char*) "tables_priv";
tables[1].name=tables[1].real_name= (char*) "columns_priv"; tables[1].name=tables[1].real_name= (char*) "columns_priv";
......
...@@ -752,8 +752,20 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used) ...@@ -752,8 +752,20 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used)
/* Check if another thread is processing the same query? */ /* Check if another thread is processing the same query? */
thd->query[thd->query_length] = (char) flags; thd->query[thd->query_length] = (char) flags;
if (thd->db_length)
{
memcpy(thd->query+thd->query_length+1, thd->db, thd->db_length);
DBUG_PRINT("qcache", ("database : %s length %u",
thd->db, thd->db_length));
}
else
{
DBUG_PRINT("qcache", ("No active database"));
}
Query_cache_block *competitor = (Query_cache_block *) Query_cache_block *competitor = (Query_cache_block *)
hash_search(&queries, (byte*) thd->query, thd->query_length+1); hash_search(&queries, (byte*) thd->query,
thd->query_length+1+thd->db_length);
DBUG_PRINT("qcache", ("competitor 0x%lx, flags %x", (ulong) competitor, DBUG_PRINT("qcache", ("competitor 0x%lx, flags %x", (ulong) competitor,
flags)); flags));
if (competitor == 0) if (competitor == 0)
...@@ -761,7 +773,7 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used) ...@@ -761,7 +773,7 @@ void Query_cache::store_query(THD *thd, TABLE_LIST *tables_used)
/* Query is not in cache and no one is working with it; Store it */ /* Query is not in cache and no one is working with it; Store it */
thd->query[thd->query_length] = (char) flags; thd->query[thd->query_length] = (char) flags;
Query_cache_block *query_block; Query_cache_block *query_block;
query_block= write_block_data(thd->query_length+1, query_block= write_block_data(thd->query_length+1+thd->db_length,
(gptr) thd->query, (gptr) thd->query,
ALIGN_SIZE(sizeof(Query_cache_query)), ALIGN_SIZE(sizeof(Query_cache_query)),
Query_cache_block::QUERY, tables, 1); Query_cache_block::QUERY, tables, 1);
...@@ -894,10 +906,21 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length) ...@@ -894,10 +906,21 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
flags |= (byte) thd->convert_set->number(); flags |= (byte) thd->convert_set->number();
DBUG_ASSERT(thd->convert_set->number() < 128); DBUG_ASSERT(thd->convert_set->number() < 128);
} }
sql[query_length] = (char) flags; sql[query_length] = (char) flags;
if (thd->db_length)
{
memcpy(sql+query_length+1, thd->db, thd->db_length);
DBUG_PRINT("qcache", ("database : %s length %u",
thd->db, thd->db_length));
}
else
{
DBUG_PRINT("qcache", ("No active database"));
}
query_block = (Query_cache_block *) hash_search(&queries, (byte*) sql, query_block = (Query_cache_block *) hash_search(&queries, (byte*) sql,
query_length+1); query_length+1+
thd->db_length);
sql[query_length] = '\0'; sql[query_length] = '\0';
/* Quick abort on unlocked data */ /* Quick abort on unlocked data */
...@@ -2450,10 +2473,21 @@ my_bool Query_cache::move_by_type(byte **border, ...@@ -2450,10 +2473,21 @@ my_bool Query_cache::move_by_type(byte **border,
Query_cache_block_table *nlist_root = new_block->table(0); Query_cache_block_table *nlist_root = new_block->table(0);
nlist_root->n = 0; nlist_root->n = 0;
nlist_root->next = (tnext == list_root ? nlist_root : tnext); if (tnext == list_root)
nlist_root->prev = (tprev == list_root ? nlist_root: tnext); {
nlist_root->next = nlist_root;
nlist_root->prev = nlist_root;
}
else
{
nlist_root->next = tnext;
tnext->prev = nlist_root; tnext->prev = nlist_root;
}
if (tprev != list_root)
{
nlist_root->prev = tnext;
tprev->next = nlist_root; tprev->next = nlist_root;
}
for (;tnext != nlist_root; tnext=tnext->next) for (;tnext != nlist_root; tnext=tnext->next)
tnext->parent = new_block->table(); tnext->parent = new_block->table();
*border += len; *border += len;
...@@ -2592,10 +2626,21 @@ void Query_cache::relink(Query_cache_block *oblock, ...@@ -2592,10 +2626,21 @@ void Query_cache::relink(Query_cache_block *oblock,
Query_cache_block *next, Query_cache_block *prev, Query_cache_block *next, Query_cache_block *prev,
Query_cache_block *pnext, Query_cache_block *pprev) Query_cache_block *pnext, Query_cache_block *pprev)
{ {
nblock->prev = (prev == oblock ? nblock : prev); //check pointer to himself if (prev == oblock) //check pointer to himself
nblock->next = (next == oblock ? nblock : next); {
nblock->prev = nblock;
nblock->next = nblock;
}
else
{
nblock->prev = prev;
prev->next=nblock; prev->next=nblock;
}
if (next != oblock)
{
nblock->next = next;
next->prev=nblock; next->prev=nblock;
}
nblock->pprev = pprev; // Physical pointer to himself have only 1 free block nblock->pprev = pprev; // Physical pointer to himself have only 1 free block
nblock->pnext = pnext; nblock->pnext = pnext;
pprev->pnext=nblock; pprev->pnext=nblock;
......
...@@ -85,7 +85,7 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0), ...@@ -85,7 +85,7 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0),
host_or_ip="unknown ip"; host_or_ip="unknown ip";
locked=killed=count_cuted_fields=some_tables_deleted=no_errors=password= locked=killed=count_cuted_fields=some_tables_deleted=no_errors=password=
query_start_used=safe_to_cache_query=0; query_start_used=safe_to_cache_query=0;
query_length=col_access=0; db_length=query_length=col_access=0;
query_error=0; query_error=0;
next_insert_id=last_insert_id=0; next_insert_id=last_insert_id=0;
open_tables=temporary_tables=handler_tables=0; open_tables=temporary_tables=handler_tables=0;
......
...@@ -288,6 +288,7 @@ class THD :public ilink { ...@@ -288,6 +288,7 @@ class THD :public ilink {
uint current_tablenr,tmp_table,cond_count,col_access; uint current_tablenr,tmp_table,cond_count,col_access;
uint server_status,open_options; uint server_status,open_options;
uint32 query_length; uint32 query_length;
uint32 db_length;
enum_tx_isolation tx_isolation, session_tx_isolation; enum_tx_isolation tx_isolation, session_tx_isolation;
char scramble[9]; char scramble[9];
uint8 query_cache_type; // type of query cache processing uint8 query_cache_type; // type of query cache processing
...@@ -400,6 +401,13 @@ class THD :public ilink { ...@@ -400,6 +401,13 @@ class THD :public ilink {
{ return strmake_root(&mem_root,str,size); } { return strmake_root(&mem_root,str,size); }
inline char *memdup(const char *str, uint size) inline char *memdup(const char *str, uint size)
{ return memdup_root(&mem_root,str,size); } { return memdup_root(&mem_root,str,size); }
inline char *memdup_w_gap(const char *str, uint size, uint gap)
{
gptr ptr;
if ((ptr=alloc_root(&mem_root,size+gap)))
memcpy(ptr,str,size);
return ptr;
}
}; };
......
...@@ -317,19 +317,19 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db, ...@@ -317,19 +317,19 @@ static long mysql_rm_known_files(THD *thd, MY_DIR *dirp, const char *db,
bool mysql_change_db(THD *thd,const char *name) bool mysql_change_db(THD *thd,const char *name)
{ {
int length; int length, db_length;
char *dbname=my_strdup((char*) name,MYF(MY_WME)); char *dbname=my_strdup((char*) name,MYF(MY_WME));
char path[FN_REFLEN]; char path[FN_REFLEN];
uint db_access; uint db_access;
DBUG_ENTER("mysql_change_db"); DBUG_ENTER("mysql_change_db");
if (!dbname || !(length=stripp_sp(dbname))) if (!dbname || !(db_length=stripp_sp(dbname)))
{ {
x_free(dbname); /* purecov: inspected */ x_free(dbname); /* purecov: inspected */
send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */ send_error(&thd->net,ER_NO_DB_ERROR); /* purecov: inspected */
DBUG_RETURN(1); /* purecov: inspected */ DBUG_RETURN(1); /* purecov: inspected */
} }
if ((length > NAME_LEN) || check_db_name(dbname)) if ((db_length > NAME_LEN) || check_db_name(dbname))
{ {
net_printf(&thd->net,ER_WRONG_DB_NAME, dbname); net_printf(&thd->net,ER_WRONG_DB_NAME, dbname);
x_free(dbname); x_free(dbname);
...@@ -369,6 +369,7 @@ bool mysql_change_db(THD *thd,const char *name) ...@@ -369,6 +369,7 @@ bool mysql_change_db(THD *thd,const char *name)
send_ok(&thd->net); send_ok(&thd->net);
x_free(thd->db); x_free(thd->db);
thd->db=dbname; thd->db=dbname;
thd->db_length=db_length;
thd->db_access=db_access; thd->db_access=db_access;
DBUG_RETURN(0); DBUG_RETURN(0);
} }
...@@ -127,6 +127,7 @@ static bool check_user(THD *thd,enum_server_command command, const char *user, ...@@ -127,6 +127,7 @@ static bool check_user(THD *thd,enum_server_command command, const char *user,
{ {
NET *net= &thd->net; NET *net= &thd->net;
thd->db=0; thd->db=0;
thd->db_length=0;
if (!(thd->user = my_strdup(user, MYF(0)))) if (!(thd->user = my_strdup(user, MYF(0))))
{ {
...@@ -632,7 +633,8 @@ pthread_handler_decl(handle_bootstrap,arg) ...@@ -632,7 +633,8 @@ pthread_handler_decl(handle_bootstrap,arg)
buff[length]=0; buff[length]=0;
thd->current_tablenr=0; thd->current_tablenr=0;
thd->query_length=length; thd->query_length=length;
thd->query= thd->memdup(buff,length+1); thd->query= thd->memdup_w_gap(buff, length+1, thd->db_length+1);
thd->query[length] = '\0';
thd->query_id=query_id++; thd->query_id=query_id++;
mysql_parse(thd,thd->query,length); mysql_parse(thd,thd->query,length);
close_thread_tables(thd); // Free tables close_thread_tables(thd); // Free tables
...@@ -807,6 +809,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -807,6 +809,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
/* Save user and privileges */ /* Save user and privileges */
uint save_master_access=thd->master_access; uint save_master_access=thd->master_access;
uint save_db_access= thd->db_access; uint save_db_access= thd->db_access;
uint save_db_length= thd->db_length;
char *save_user= thd->user; char *save_user= thd->user;
char *save_priv_user= thd->priv_user; char *save_priv_user= thd->priv_user;
char *save_db= thd->db; char *save_db= thd->db;
...@@ -823,6 +826,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -823,6 +826,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
thd->master_access=save_master_access; thd->master_access=save_master_access;
thd->db_access=save_db_access; thd->db_access=save_db_access;
thd->db=save_db; thd->db=save_db;
thd->db_length=save_db_length;
thd->user=save_user; thd->user=save_user;
thd->priv_user=save_priv_user; thd->priv_user=save_priv_user;
break; break;
...@@ -844,7 +848,9 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -844,7 +848,9 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
packet_length--; packet_length--;
} }
thd->query_length= packet_length; thd->query_length= packet_length;
if (!(thd->query= (char*) thd->memdup((gptr) (packet),packet_length+1))) if (!(thd->query= (char*) thd->memdup_w_gap((gptr) (packet),
packet_length+1,
thd->db_length+1)))
break; break;
thd->query[packet_length]=0; thd->query[packet_length]=0;
thd->packet.shrink(net_buffer_length); // Reclaim some memory thd->packet.shrink(net_buffer_length); // Reclaim some memory
...@@ -876,6 +882,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd, ...@@ -876,6 +882,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
thd->free_list=0; thd->free_list=0;
table_list.name=table_list.real_name=thd->strdup(packet); table_list.name=table_list.real_name=thd->strdup(packet);
packet=strend(packet)+1; packet=strend(packet)+1;
// command not cachable => no gap for data base name
if (!(thd->query=fields=thd->memdup(packet,thd->query_length+1))) if (!(thd->query=fields=thd->memdup(packet,thd->query_length+1)))
break; break;
mysql_log.write(thd,command,"%s %s",table_list.real_name,fields); mysql_log.write(thd,command,"%s %s",table_list.real_name,fields);
...@@ -1117,7 +1124,7 @@ mysql_execute_command(void) ...@@ -1117,7 +1124,7 @@ mysql_execute_command(void)
if (lex->sql_command == SQLCOM_SELECT) if (lex->sql_command == SQLCOM_SELECT)
{ {
lex->sql_command = SQLCOM_DO; lex->sql_command = SQLCOM_DO;
lex->insert_list = &lex->item_list; lex->insert_list = &select_lex->item_list;
} }
#endif #endif
} }
......
...@@ -139,7 +139,8 @@ void udf_init() ...@@ -139,7 +139,8 @@ void udf_init()
new_thd->version = refresh_version; //current_thd->version; new_thd->version = refresh_version; //current_thd->version;
new_thd->current_tablenr = 0; new_thd->current_tablenr = 0;
new_thd->open_tables = 0; new_thd->open_tables = 0;
new_thd->db = my_strdup("mysql", MYF(0)); new_thd->db= my_strdup("mysql", MYF(0));
new_thd->db_length=5;
bzero((gptr) &tables,sizeof(tables)); bzero((gptr) &tables,sizeof(tables));
tables.name = tables.real_name = (char*) "func"; tables.name = tables.real_name = (char*) "func";
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment