Cleanup of alarm macros.
Fixed data corruption bug in query cache. Made queries be dependent of the database in use. Docs/manual.texi: Update binary log reference client/mysql.cc: Removed warning include/thr_alarm.h: Cleanup of alarm macros. libmysql/libmysql.c: Portabiliy fix libmysql/net.c: Cleanup of alarm macros. mysql-test/t/rpl_get_lock.test: Fixed results after merge. mysys/my_bitmap.c: Removed warning. sql/log_event.cc: Use thd->db_length sql/mini_client.cc: Cleanup of alarm macros. sql/net_serv.cc: Cleanup of alarm macros. sql/sql_acl.cc: Use thd->db_length sql/sql_cache.cc: Store used database together with the query. sql/sql_class.cc: Use thd->db_length sql/sql_class.h: Use thd->db_length sql/sql_db.cc: Use thd->db_length sql/sql_parse.cc: Use thd->db_length sql/sql_udf.cc: Use thd->db_length
This commit is contained in:
parent
10863a3590
commit
9603291efd
@ -10200,7 +10200,7 @@ because it can't compile @code{.S} (assembler) files.
|
||||
The following configure line should work:
|
||||
|
||||
@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
|
||||
|
||||
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.
|
||||
If you supply an extension to @code{--log-bin=filename.extension}, the
|
||||
extension will be silenty removed.
|
||||
|
||||
To the binary log filename @code{mysqld} will append an extension that is a
|
||||
number that is incremented each time you execute @code{mysqladmin
|
||||
refresh}, execute @code{mysqladmin flush-logs}, execute the @code{FLUSH LOGS}
|
||||
statement or restart the server.
|
||||
To the binary log filename @code{mysqld} will append an extension that
|
||||
is a number that is incremented each time you execute @code{mysqladmin
|
||||
refresh}, execute @code{mysqladmin flush-logs}, execute the @code{FLUSH
|
||||
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
|
||||
to the binary log:
|
||||
|
@ -1717,7 +1717,6 @@ print_table_data_xml(MYSQL_RES *result)
|
||||
(void) tee_fputs("\n <row>\n", PAGER);
|
||||
for (uint i=0; i < mysql_num_fields(result); i++)
|
||||
{
|
||||
char *data;
|
||||
ulong *lengths=mysql_fetch_lengths(result);
|
||||
tee_fprintf(PAGER, "\t<%s>", (fields[i].name ?
|
||||
(fields[i].name[0] ? fields[i].name :
|
||||
|
@ -38,24 +38,23 @@ extern "C" {
|
||||
#define THR_SERVER_ALARM SIGALRM
|
||||
#endif
|
||||
|
||||
#if defined(DONT_USE_THR_ALARM)
|
||||
#if defined(DONT_USE_THR_ALARM) || !defined(THREAD)
|
||||
|
||||
#define USE_ALARM_THREAD
|
||||
#undef USE_ONE_SIGNAL_HAND
|
||||
|
||||
typedef struct st_thr_alarm_entry
|
||||
{
|
||||
uint crono;
|
||||
} thr_alarm_entry;
|
||||
typedef my_bool thr_alarm_t;
|
||||
typedef my_bool ALARM;
|
||||
|
||||
#define thr_alarm_init(A) (A)->crono=0
|
||||
#define thr_alarm_in_use(A) (A)->crono
|
||||
#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) ((*(A)=1)-1)
|
||||
/* The following should maybe be (*(A)) */
|
||||
#define thr_got_alarm(A) 0
|
||||
#define init_thr_alarm(A)
|
||||
#define thr_alarm_kill(A)
|
||||
#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
|
||||
#if defined(__WIN__)
|
||||
|
@ -2225,8 +2225,8 @@ send_file_to_server(MYSQL *mysql, const char *filename)
|
||||
my_net_write(&mysql->net,"",0); /* Server needs one packet */
|
||||
net_flush(&mysql->net);
|
||||
mysql->net.last_errno=EE_FILENOTFOUND;
|
||||
snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1,
|
||||
EE(mysql->net.last_errno),tmp_name, errno);
|
||||
my_snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1,
|
||||
EE(mysql->net.last_errno),tmp_name, errno);
|
||||
goto err;
|
||||
}
|
||||
|
||||
@ -2250,8 +2250,8 @@ send_file_to_server(MYSQL *mysql, const char *filename)
|
||||
if (readcount < 0)
|
||||
{
|
||||
mysql->net.last_errno=EE_READ; /* the errmsg for not entire file read */
|
||||
snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1,
|
||||
tmp_name,errno);
|
||||
my_snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1,
|
||||
tmp_name,errno);
|
||||
goto err;
|
||||
}
|
||||
result=0; /* Ok */
|
||||
|
@ -41,68 +41,55 @@
|
||||
#include <signal.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
|
||||
ulong max_allowed_packet=65536;
|
||||
extern ulong net_read_timeout,net_write_timeout;
|
||||
extern uint test_flags;
|
||||
#else
|
||||
|
||||
/*
|
||||
** 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 max_allowed_packet=16*1024*1024L;
|
||||
ulong net_read_timeout= NET_READ_TIMEOUT;
|
||||
ulong net_write_timeout= NET_WRITE_TIMEOUT;
|
||||
#endif
|
||||
ulong net_buffer_length=8192; /* Default length. Enlarged if necessary */
|
||||
|
||||
#if defined(__WIN__) || defined(MSDOS)
|
||||
#undef MYSQL_SERVER /* Win32 can't handle interrupts */
|
||||
#ifdef __WIN__
|
||||
/* The following is because alarms doesn't work on windows. */
|
||||
#undef MYSQL_SERVER
|
||||
#endif
|
||||
|
||||
#ifdef MYSQL_SERVER
|
||||
#include "my_pthread.h"
|
||||
#include "thr_alarm.h"
|
||||
void sql_print_error(const char *format,...);
|
||||
#define RETRY_COUNT 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 pthread_mutex_t LOCK_bytes_sent , LOCK_bytes_received;
|
||||
|
||||
extern void query_cache_insert(NET *net, const char *packet, ulong length);
|
||||
#else
|
||||
#undef statistic_add
|
||||
#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 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);
|
||||
|
||||
#define MAX_THREE_BYTES 255L*255L*255L
|
||||
|
||||
/* Init with packet info */
|
||||
|
||||
@ -335,7 +322,7 @@ net_real_write(NET *net,const char *packet,ulong len)
|
||||
long int length;
|
||||
char *pos,*end;
|
||||
thr_alarm_t alarmed;
|
||||
#if !defined(__WIN__) && !defined(__EMX__) && !defined(OS2)
|
||||
#if defined(MYSQL_SERVER)
|
||||
ALARM alarm_buff;
|
||||
#endif
|
||||
uint retry_count=0;
|
||||
@ -522,7 +509,7 @@ my_real_read(NET *net, ulong *complen)
|
||||
uint i,retry_count=0;
|
||||
ulong len=packet_error;
|
||||
thr_alarm_t alarmed;
|
||||
#if (!defined(__WIN__) && !defined(__EMX__) && !defined(OS2)) || defined(MYSQL_SERVER)
|
||||
#if defined(MYSQL_SERVER)
|
||||
ALARM alarm_buff;
|
||||
#endif
|
||||
my_bool net_blocking=vio_is_blocking(net->vio);
|
||||
@ -775,7 +762,7 @@ my_net_read(NET *net)
|
||||
|
||||
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;
|
||||
}
|
||||
multi_byte_packet= NET_HEADER_SIZE;
|
||||
|
@ -6,6 +6,8 @@ dirty_close master;
|
||||
connection master1;
|
||||
select get_lock("lock",2);
|
||||
select release_lock("lock");
|
||||
#ignore
|
||||
disable_query_log;
|
||||
let $1=2000;
|
||||
while ($1)
|
||||
{
|
||||
@ -13,6 +15,7 @@ while ($1)
|
||||
do release_lock("lock");
|
||||
dec $1;
|
||||
}
|
||||
enable_query_log;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
|
@ -25,7 +25,7 @@
|
||||
#include "mysys_priv.h"
|
||||
#include <my_bitmap.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <m_string.h>
|
||||
|
||||
inline void bitmap_lock(MY_BITMAP* map)
|
||||
{
|
||||
|
@ -1539,7 +1539,8 @@ int Query_log_event::exec_event(struct st_master_info* mi)
|
||||
{
|
||||
int expected_error,actual_error = 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))
|
||||
{
|
||||
thd->query = (char*)query;
|
||||
@ -1584,14 +1585,16 @@ int Query_log_event::exec_event(struct st_master_info* mi)
|
||||
else
|
||||
{
|
||||
// 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;
|
||||
close_thread_tables(thd);
|
||||
free_root(&thd->mem_root,0);
|
||||
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
|
||||
// assume no convert for next query unless set explictly
|
||||
thd->convert_set = 0;
|
||||
@ -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)
|
||||
{
|
||||
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_error = 0;
|
||||
|
||||
@ -1685,7 +1688,8 @@ int Load_log_event::exec_event(NET* net, struct st_master_info* mi)
|
||||
}
|
||||
|
||||
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);
|
||||
if (thd->query_error)
|
||||
{
|
||||
|
@ -22,21 +22,15 @@
|
||||
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__)
|
||||
#include <winsock.h>
|
||||
#include <odbcinst.h>
|
||||
/* Disable alarms */
|
||||
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
|
||||
#include <odbcinst.h> /* QQ: Is this really needed ? */
|
||||
#define DONT_USE_THR_ALARM
|
||||
#endif
|
||||
|
||||
#include <my_global.h>
|
||||
@ -53,12 +47,7 @@ inline int local_thr_alarm(my_bool *A,int B __attribute__((unused)),ALARM *C __a
|
||||
#include "mysqld_error.h"
|
||||
#include "errmsg.h"
|
||||
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
#define net_read_timeout net_read_timeout1
|
||||
#define net_write_timeout net_write_timeout1
|
||||
#endif
|
||||
|
||||
#if defined( OS2) && defined( MYSQL_SERVER)
|
||||
#if defined( OS2) && defined(MYSQL_SERVER)
|
||||
#undef ER
|
||||
#define ER CER
|
||||
#endif
|
||||
@ -82,18 +71,17 @@ extern "C" { // Because of SCO 3.2V4.2
|
||||
#ifdef HAVE_SYS_SELECT_H
|
||||
#include <sys/select.h>
|
||||
#endif
|
||||
#endif
|
||||
#endif /*!defined(MSDOS) && !defined(__WIN__) */
|
||||
#ifdef HAVE_SYS_UN_H
|
||||
# include <sys/un.h>
|
||||
#endif
|
||||
#if defined(THREAD)
|
||||
#include <my_pthread.h> /* because of signal() */
|
||||
#include <thr_alarm.h>
|
||||
#endif
|
||||
#include <thr_alarm.h>
|
||||
#ifndef INADDR_NONE
|
||||
#define INADDR_NONE -1
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
static void mc_free_rows(MYSQL_DATA *cur);
|
||||
@ -1073,8 +1061,8 @@ static int mc_send_file_to_server(MYSQL *mysql, const char *filename)
|
||||
my_net_write(&mysql->net,"",0); // Server needs one packet
|
||||
net_flush(&mysql->net);
|
||||
mysql->net.last_errno=EE_FILENOTFOUND;
|
||||
snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1,
|
||||
EE(mysql->net.last_errno),tmp_name, errno);
|
||||
my_snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1,
|
||||
EE(mysql->net.last_errno),tmp_name, errno);
|
||||
goto err;
|
||||
}
|
||||
|
||||
@ -1098,8 +1086,8 @@ static int mc_send_file_to_server(MYSQL *mysql, const char *filename)
|
||||
if (readcount < 0)
|
||||
{
|
||||
mysql->net.last_errno=EE_READ; /* the errmsg for not entire file read */
|
||||
snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1,
|
||||
tmp_name,errno);
|
||||
my_snprintf(mysql->net.last_error,sizeof(mysql->net.last_error)-1,
|
||||
tmp_name,errno);
|
||||
goto err;
|
||||
}
|
||||
result=0; // Ok
|
||||
|
@ -41,68 +41,55 @@
|
||||
#include <signal.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
|
||||
ulong max_allowed_packet=65536;
|
||||
extern ulong net_read_timeout,net_write_timeout;
|
||||
extern uint test_flags;
|
||||
#else
|
||||
|
||||
/*
|
||||
** 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 max_allowed_packet=16*1024*1024L;
|
||||
ulong net_read_timeout= NET_READ_TIMEOUT;
|
||||
ulong net_write_timeout= NET_WRITE_TIMEOUT;
|
||||
#endif
|
||||
ulong net_buffer_length=8192; /* Default length. Enlarged if necessary */
|
||||
|
||||
#if defined(__WIN__) || defined(MSDOS)
|
||||
#undef MYSQL_SERVER /* Win32 can't handle interrupts */
|
||||
#ifdef __WIN__
|
||||
/* The following is because alarms doesn't work on windows. */
|
||||
#undef MYSQL_SERVER
|
||||
#endif
|
||||
|
||||
#ifdef MYSQL_SERVER
|
||||
#include "my_pthread.h"
|
||||
#include "thr_alarm.h"
|
||||
void sql_print_error(const char *format,...);
|
||||
#define RETRY_COUNT 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 pthread_mutex_t LOCK_bytes_sent , LOCK_bytes_received;
|
||||
|
||||
extern void query_cache_insert(NET *net, const char *packet, ulong length);
|
||||
#else
|
||||
#undef statistic_add
|
||||
#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 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);
|
||||
|
||||
#define MAX_THREE_BYTES 255L*255L*255L
|
||||
|
||||
/* Init with packet info */
|
||||
|
||||
@ -335,7 +322,7 @@ net_real_write(NET *net,const char *packet,ulong len)
|
||||
long int length;
|
||||
char *pos,*end;
|
||||
thr_alarm_t alarmed;
|
||||
#if !defined(__WIN__) && !defined(__EMX__) && !defined(OS2)
|
||||
#if defined(MYSQL_SERVER)
|
||||
ALARM alarm_buff;
|
||||
#endif
|
||||
uint retry_count=0;
|
||||
@ -522,7 +509,7 @@ my_real_read(NET *net, ulong *complen)
|
||||
uint i,retry_count=0;
|
||||
ulong len=packet_error;
|
||||
thr_alarm_t alarmed;
|
||||
#if (!defined(__WIN__) && !defined(__EMX__) && !defined(OS2)) || defined(MYSQL_SERVER)
|
||||
#if defined(MYSQL_SERVER)
|
||||
ALARM alarm_buff;
|
||||
#endif
|
||||
my_bool net_blocking=vio_is_blocking(net->vio);
|
||||
@ -775,7 +762,7 @@ my_net_read(NET *net)
|
||||
|
||||
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;
|
||||
}
|
||||
multi_byte_packet= NET_HEADER_SIZE;
|
||||
|
@ -132,7 +132,8 @@ int acl_init(bool dont_read_acl_tables)
|
||||
thd->mysys_var=my_thread_var;
|
||||
thd->current_tablenr=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));
|
||||
tables[0].name=tables[0].real_name=(char*) "host";
|
||||
tables[1].name=tables[1].real_name=(char*) "user";
|
||||
@ -2120,7 +2121,8 @@ int grant_init (void)
|
||||
thd->mysys_var=my_thread_var;
|
||||
thd->current_tablenr=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));
|
||||
tables[0].name=tables[0].real_name= (char*) "tables_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)
|
||||
|
||||
/* Check if another thread is processing the same query? */
|
||||
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 *)
|
||||
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,
|
||||
flags));
|
||||
if (competitor == 0)
|
||||
@ -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 */
|
||||
thd->query[thd->query_length] = (char) flags;
|
||||
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,
|
||||
ALIGN_SIZE(sizeof(Query_cache_query)),
|
||||
Query_cache_block::QUERY, tables, 1);
|
||||
@ -894,10 +906,21 @@ Query_cache::send_result_to_client(THD *thd, char *sql, uint query_length)
|
||||
flags |= (byte) thd->convert_set->number();
|
||||
DBUG_ASSERT(thd->convert_set->number() < 128);
|
||||
}
|
||||
|
||||
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_length+1);
|
||||
query_length+1+
|
||||
thd->db_length);
|
||||
|
||||
sql[query_length] = '\0';
|
||||
|
||||
/* Quick abort on unlocked data */
|
||||
@ -2450,10 +2473,21 @@ my_bool Query_cache::move_by_type(byte **border,
|
||||
|
||||
Query_cache_block_table *nlist_root = new_block->table(0);
|
||||
nlist_root->n = 0;
|
||||
nlist_root->next = (tnext == list_root ? nlist_root : tnext);
|
||||
nlist_root->prev = (tprev == list_root ? nlist_root: tnext);
|
||||
tnext->prev = nlist_root;
|
||||
tprev->next = nlist_root;
|
||||
if (tnext == list_root)
|
||||
{
|
||||
nlist_root->next = nlist_root;
|
||||
nlist_root->prev = nlist_root;
|
||||
}
|
||||
else
|
||||
{
|
||||
nlist_root->next = tnext;
|
||||
tnext->prev = nlist_root;
|
||||
}
|
||||
if (tprev != list_root)
|
||||
{
|
||||
nlist_root->prev = tnext;
|
||||
tprev->next = nlist_root;
|
||||
}
|
||||
for (;tnext != nlist_root; tnext=tnext->next)
|
||||
tnext->parent = new_block->table();
|
||||
*border += len;
|
||||
@ -2592,10 +2626,21 @@ void Query_cache::relink(Query_cache_block *oblock,
|
||||
Query_cache_block *next, Query_cache_block *prev,
|
||||
Query_cache_block *pnext, Query_cache_block *pprev)
|
||||
{
|
||||
nblock->prev = (prev == oblock ? nblock : prev); //check pointer to himself
|
||||
nblock->next = (next == oblock ? nblock : next);
|
||||
prev->next=nblock;
|
||||
next->prev=nblock;
|
||||
if (prev == oblock) //check pointer to himself
|
||||
{
|
||||
nblock->prev = nblock;
|
||||
nblock->next = nblock;
|
||||
}
|
||||
else
|
||||
{
|
||||
nblock->prev = prev;
|
||||
prev->next=nblock;
|
||||
}
|
||||
if (next != oblock)
|
||||
{
|
||||
nblock->next = next;
|
||||
next->prev=nblock;
|
||||
}
|
||||
nblock->pprev = pprev; // Physical pointer to himself have only 1 free block
|
||||
nblock->pnext = pnext;
|
||||
pprev->pnext=nblock;
|
||||
|
@ -85,7 +85,7 @@ THD::THD():user_time(0),fatal_error(0),last_insert_id_used(0),
|
||||
host_or_ip="unknown ip";
|
||||
locked=killed=count_cuted_fields=some_tables_deleted=no_errors=password=
|
||||
query_start_used=safe_to_cache_query=0;
|
||||
query_length=col_access=0;
|
||||
db_length=query_length=col_access=0;
|
||||
query_error=0;
|
||||
next_insert_id=last_insert_id=0;
|
||||
open_tables=temporary_tables=handler_tables=0;
|
||||
|
@ -288,6 +288,7 @@ public:
|
||||
uint current_tablenr,tmp_table,cond_count,col_access;
|
||||
uint server_status,open_options;
|
||||
uint32 query_length;
|
||||
uint32 db_length;
|
||||
enum_tx_isolation tx_isolation, session_tx_isolation;
|
||||
char scramble[9];
|
||||
uint8 query_cache_type; // type of query cache processing
|
||||
@ -400,6 +401,13 @@ public:
|
||||
{ return strmake_root(&mem_root,str,size); }
|
||||
inline char *memdup(const char *str, uint 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,
|
||||
|
||||
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 path[FN_REFLEN];
|
||||
uint db_access;
|
||||
DBUG_ENTER("mysql_change_db");
|
||||
|
||||
if (!dbname || !(length=stripp_sp(dbname)))
|
||||
if (!dbname || !(db_length=stripp_sp(dbname)))
|
||||
{
|
||||
x_free(dbname); /* purecov: inspected */
|
||||
send_error(&thd->net,ER_NO_DB_ERROR); /* 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);
|
||||
x_free(dbname);
|
||||
@ -369,6 +369,7 @@ bool mysql_change_db(THD *thd,const char *name)
|
||||
send_ok(&thd->net);
|
||||
x_free(thd->db);
|
||||
thd->db=dbname;
|
||||
thd->db_length=db_length;
|
||||
thd->db_access=db_access;
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
@ -127,6 +127,7 @@ static bool check_user(THD *thd,enum_server_command command, const char *user,
|
||||
{
|
||||
NET *net= &thd->net;
|
||||
thd->db=0;
|
||||
thd->db_length=0;
|
||||
|
||||
if (!(thd->user = my_strdup(user, MYF(0))))
|
||||
{
|
||||
@ -632,7 +633,8 @@ pthread_handler_decl(handle_bootstrap,arg)
|
||||
buff[length]=0;
|
||||
thd->current_tablenr=0;
|
||||
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++;
|
||||
mysql_parse(thd,thd->query,length);
|
||||
close_thread_tables(thd); // Free tables
|
||||
@ -807,6 +809,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
||||
/* Save user and privileges */
|
||||
uint save_master_access=thd->master_access;
|
||||
uint save_db_access= thd->db_access;
|
||||
uint save_db_length= thd->db_length;
|
||||
char *save_user= thd->user;
|
||||
char *save_priv_user= thd->priv_user;
|
||||
char *save_db= thd->db;
|
||||
@ -823,6 +826,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
||||
thd->master_access=save_master_access;
|
||||
thd->db_access=save_db_access;
|
||||
thd->db=save_db;
|
||||
thd->db_length=save_db_length;
|
||||
thd->user=save_user;
|
||||
thd->priv_user=save_priv_user;
|
||||
break;
|
||||
@ -844,7 +848,9 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
||||
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;
|
||||
thd->query[packet_length]=0;
|
||||
thd->packet.shrink(net_buffer_length); // Reclaim some memory
|
||||
@ -876,6 +882,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
||||
thd->free_list=0;
|
||||
table_list.name=table_list.real_name=thd->strdup(packet);
|
||||
packet=strend(packet)+1;
|
||||
// command not cachable => no gap for data base name
|
||||
if (!(thd->query=fields=thd->memdup(packet,thd->query_length+1)))
|
||||
break;
|
||||
mysql_log.write(thd,command,"%s %s",table_list.real_name,fields);
|
||||
@ -1117,7 +1124,7 @@ mysql_execute_command(void)
|
||||
if (lex->sql_command == SQLCOM_SELECT)
|
||||
{
|
||||
lex->sql_command = SQLCOM_DO;
|
||||
lex->insert_list = &lex->item_list;
|
||||
lex->insert_list = &select_lex->item_list;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@ -139,7 +139,8 @@ void udf_init()
|
||||
new_thd->version = refresh_version; //current_thd->version;
|
||||
new_thd->current_tablenr = 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));
|
||||
tables.name = tables.real_name = (char*) "func";
|
||||
|
Loading…
x
Reference in New Issue
Block a user