Commit d42b1458 authored by pem@mysql.comhem.se's avatar pem@mysql.comhem.se

Post-merge fixes, some quite complex. client/mysqlbinlog.cc and sql/log_event.cc

merged manually by guilhem.
parent dfd59e29
/* Copyright (C) 2001-2003 MySQL AB /* Copyright (C) 2001-2004 MySQL AB
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -49,9 +49,9 @@ ulong server_id = 0; ...@@ -49,9 +49,9 @@ ulong server_id = 0;
// needed by net_serv.c // needed by net_serv.c
ulong bytes_sent = 0L, bytes_received = 0L; ulong bytes_sent = 0L, bytes_received = 0L;
ulong mysqld_net_retry_count = 10L; ulong mysqld_net_retry_count = 10L;
ulong open_files_limit;
uint test_flags = 0; uint test_flags = 0;
static uint opt_protocol= 0; static uint opt_protocol= 0;
static FILE *result_file; static FILE *result_file;
#ifndef DBUG_OFF #ifndef DBUG_OFF
...@@ -75,42 +75,70 @@ static short binlog_flags = 0; ...@@ -75,42 +75,70 @@ static short binlog_flags = 0;
static MYSQL* mysql = NULL; static MYSQL* mysql = NULL;
static const char* dirname_for_local_load= 0; static const char* dirname_for_local_load= 0;
static void dump_local_log_entries(const char* logname); /*
static void dump_remote_log_entries(const char* logname); check_header() will set the pointer below.
static void dump_log_entries(const char* logname); Why do we need here a pointer on an event instead of an event ?
static void dump_remote_file(NET* net, const char* fname); This is because the event will be created (alloced) in read_log_event()
(which returns a pointer) in check_header().
*/
Format_description_log_event* description_event;
static int dump_local_log_entries(const char* logname);
static int dump_remote_log_entries(const char* logname);
static int dump_log_entries(const char* logname);
static int dump_remote_file(NET* net, const char* fname);
static void die(const char* fmt, ...); static void die(const char* fmt, ...);
static MYSQL* safe_connect(); static MYSQL* safe_connect();
class Load_log_processor class Load_log_processor
{ {
char target_dir_name[MY_NFILE]; char target_dir_name[FN_REFLEN];
int target_dir_name_len; int target_dir_name_len;
DYNAMIC_ARRAY file_names; DYNAMIC_ARRAY file_names;
const char *create_file(Create_file_log_event *ce); /*
void append_to_file(const char* fname, int flags, Looking for new uniquie filename that doesn't exist yet by
gptr data, uint size) adding postfix -%x
SYNOPSIS
create_unique_file()
filename buffer for filename
file_name_end tail of buffer that should be changed
should point to a memory enough to printf("-%x",..)
RETURN VALUES
values less than 0 - can't find new filename
values great or equal 0 - created file with found filename
*/
File create_unique_file(char *filename, char *file_name_end)
{ {
File file; File res;
if (((file= my_open(fname,flags,MYF(MY_WME))) < 0) || /* If we have to try more than 1000 times, something is seriously wrong */
my_write(file,(byte*) data,size,MYF(MY_WME|MY_NABP)) || for (uint version= 0; version<1000; version++)
my_close(file,MYF(MY_WME))) {
exit(1); sprintf(file_name_end,"-%x",version);
if ((res= my_create(filename,0,
O_CREAT|O_EXCL|O_BINARY|O_WRONLY,MYF(0)))!=-1)
return res;
}
return -1;
} }
public: public:
Load_log_processor() Load_log_processor() {}
{
init_dynamic_array(&file_names,sizeof(Create_file_log_event*),
100,100 CALLER_INFO);
}
~Load_log_processor() ~Load_log_processor()
{ {
destroy(); destroy();
delete_dynamic(&file_names); delete_dynamic(&file_names);
} }
int init()
{
return init_dynamic_array(&file_names,sizeof(Create_file_log_event*),
100,100 CALLER_INFO);
}
void init_by_dir_name(const char *dir) void init_by_dir_name(const char *dir)
{ {
...@@ -147,82 +175,274 @@ public: ...@@ -147,82 +175,274 @@ public:
*ptr= 0; *ptr= 0;
return res; return res;
} }
void process(Create_file_log_event *ce) int process(Create_file_log_event *ce);
{ int process(Append_block_log_event *ae);
const char *fname= create_file(ce); File prepare_new_file_for_old_format(Load_log_event *le, char *filename);
append_to_file(fname,O_CREAT|O_EXCL|O_BINARY|O_WRONLY,ce->block, int load_old_format_file(NET* net, const char *server_fname,
ce->block_len); uint server_fname_len, File file);
} };
void process(Append_block_log_event *ae)
File Load_log_processor::prepare_new_file_for_old_format(Load_log_event *le,
char *filename)
{
uint len;
char *tail;
File file;
fn_format(filename, le->fname, target_dir_name, "", 1);
len= strlen(filename);
tail= filename + len;
if ((file= create_unique_file(filename,tail)) < 0)
{
sql_print_error("Could not construct local filename %s",filename);
return -1;
}
le->set_fname_outside_temp_buf(filename,len+strlen(tail));
return file;
}
int Load_log_processor::load_old_format_file(NET* net, const char*server_fname,
uint server_fname_len, File file)
{
char buf[FN_REFLEN+1];
buf[0] = 0;
memcpy(buf + 1, server_fname, server_fname_len + 1);
if (my_net_write(net, buf, server_fname_len +2) || net_flush(net))
{
sql_print_error("Failed requesting the remote dump of %s", server_fname);
return -1;
}
for (;;)
{
uint packet_len = my_net_read(net);
if (packet_len == 0)
{ {
Create_file_log_event* ce= (ae->file_id < file_names.elements) ? if (my_net_write(net, "", 0) || net_flush(net))
*((Create_file_log_event**)file_names.buffer + ae->file_id) : 0;
if (ce)
append_to_file(ce->fname,O_APPEND|O_BINARY|O_WRONLY, ae->block,
ae->block_len);
else
{ {
/* sql_print_error("Failed sending the ack packet");
There is no Create_file event (a bad binlog or a big return -1;
--position). Assuming it's a big --position, we just do nothing and
print a warning.
*/
fprintf(stderr,"Warning: ignoring Append_block as there is no \
Create_file event for file_id: %u\n",ae->file_id);
} }
/*
we just need to send something, as the server will read but
not examine the packet - this is because mysql_load() sends
an OK when it is done
*/
break;
} }
}; else if (packet_len == packet_error)
{
sql_print_error("Failed reading a packet during the dump of %s ",
server_fname);
return -1;
}
if (my_write(file, (byte*) net->read_pos, packet_len,MYF(MY_WME|MY_NABP)))
return -1;
}
return 0;
}
const char *Load_log_processor::create_file(Create_file_log_event *ce) int Load_log_processor::process(Create_file_log_event *ce)
{ {
const char *bname= ce->fname+dirname_length(ce->fname); const char *bname= ce->fname+dirname_length(ce->fname);
uint blen= ce->fname_len - (bname-ce->fname); uint blen= ce->fname_len - (bname-ce->fname);
uint full_len= target_dir_name_len + blen + 9 + 9 + 1; uint full_len= target_dir_name_len + blen + 9 + 9 + 1;
uint version= 0; int error= 0;
char *tmp, *ptr; char *fname, *ptr;
File file;
DBUG_ENTER("Load_log_processor::process");
if (!(tmp= my_malloc(full_len,MYF(MY_WME))) || if (set_dynamic(&file_names,(gptr)&ce,ce->file_id))
set_dynamic(&file_names,(gptr)&ce,ce->file_id))
{ {
die("Could not construct local filename %s%s",target_dir_name,bname); sql_print_error("Could not construct local filename %s%s",
return 0; target_dir_name,bname);
DBUG_RETURN(-1);
} }
if (!(fname= my_malloc(full_len,MYF(MY_WME))))
DBUG_RETURN(-1);
memcpy(tmp, target_dir_name, target_dir_name_len); memcpy(fname, target_dir_name, target_dir_name_len);
ptr= tmp+ target_dir_name_len; ptr= fname + target_dir_name_len;
memcpy(ptr,bname,blen); memcpy(ptr,bname,blen);
ptr+= blen; ptr+= blen;
ptr+= my_sprintf(ptr,(ptr,"-%x",ce->file_id)); ptr+= my_sprintf(ptr,(ptr,"-%x",ce->file_id));
/* if ((file= create_unique_file(fname,ptr)) < 0)
Note that this code has a possible race condition if there was was {
many simultaneous clients running which tried to create files at the same sql_print_error("Could not construct local filename %s%s",
time. Fortunately this should never be the case. target_dir_name,bname);
DBUG_RETURN(-1);
}
ce->set_fname_outside_temp_buf(fname,strlen(fname));
if (my_write(file,(byte*) ce->block,ce->block_len,MYF(MY_WME|MY_NABP)))
error= -1;
if (my_close(file, MYF(MY_WME)))
error= -1;
DBUG_RETURN(error);
}
int Load_log_processor::process(Append_block_log_event *ae)
{
DBUG_ENTER("Load_log_processor::process");
Create_file_log_event* ce= ((ae->file_id < file_names.elements) ?
*((Create_file_log_event**)file_names.buffer +
ae->file_id) :
0);
if (ce)
{
File file;
int error= 0;
if (((file= my_open(ce->fname,
O_APPEND|O_BINARY|O_WRONLY,MYF(MY_WME))) < 0))
DBUG_RETURN(-1);
if (my_write(file,(byte*)ae->block,ae->block_len,MYF(MY_WME|MY_NABP)))
error= -1;
if (my_close(file,MYF(MY_WME)))
error= -1;
DBUG_RETURN(error);
}
A better way to do this would be to use 'create_tmp_file() and avoid this /*
race condition altogether on the expense of getting more cryptic file There is no Create_file event (a bad binlog or a big
names. --position). Assuming it's a big --position, we just do nothing and
print a warning.
*/ */
for (;;) fprintf(stderr,"Warning: ignoring Append_block as there is no \
Create_file event for file_id: %u\n",ae->file_id);
DBUG_RETURN(-1);
}
Load_log_processor load_processor;
int process_event(ulonglong *rec_count, LAST_EVENT_INFO *last_event_info,
Log_event *ev, my_off_t pos)
{
char ll_buff[21];
DBUG_ENTER("process_event");
if ((*rec_count) >= offset)
{ {
sprintf(ptr,"-%x",version); if (!short_form)
if (access(tmp,F_OK)) fprintf(result_file, "# at %s\n",llstr(pos,ll_buff));
switch (ev->get_type_code()) {
case QUERY_EVENT:
if (one_database)
{
const char * log_dbname = ((Query_log_event*)ev)->db;
if ((log_dbname != NULL) && (strcmp(log_dbname, database)))
goto end;
}
ev->print(result_file, short_form, last_event_info);
break; break;
/* If we have to try more than 1000 times, something is seriously wrong */ case CREATE_FILE_EVENT:
if (version++ > 1000)
{ {
die("Could not construct local filename %s%s",target_dir_name,bname); Create_file_log_event* ce= (Create_file_log_event*)ev;
return 0; if (one_database)
{
/*
We test if this event has to be ignored. If yes, we don't save
this event; this will have the good side-effect of ignoring all
related Append_block and Exec_load.
Note that Load event from 3.23 is not tested.
*/
const char * log_dbname = ce->db;
if ((log_dbname != NULL) && (strcmp(log_dbname, database)))
goto end; // Next event
}
/*
We print the event, but with a leading '#': this is just to inform
the user of the original command; the command we want to execute
will be a derivation of this original command (we will change the
filename and use LOCAL), prepared in the 'case EXEC_LOAD_EVENT'
below.
*/
ce->print(result_file, short_form, last_event_info, TRUE);
// If this binlog is not 3.23 ; why this test??
if (description_event->binlog_version >= 3)
{
if (load_processor.process(ce))
break; // Error
ev= 0;
}
break;
}
case APPEND_BLOCK_EVENT:
ev->print(result_file, short_form, last_event_info);
if (load_processor.process((Append_block_log_event*) ev))
break; // Error
break;
case EXEC_LOAD_EVENT:
{
ev->print(result_file, short_form, last_event_info);
Execute_load_log_event *exv= (Execute_load_log_event*)ev;
Create_file_log_event *ce= load_processor.grab_event(exv->file_id);
/*
if ce is 0, it probably means that we have not seen the Create_file
event (a bad binlog, or most probably --position is after the
Create_file event). Print a warning comment.
*/
if (ce)
{
ce->print(result_file, short_form, last_event_info, TRUE);
my_free((char*)ce->fname,MYF(MY_WME));
delete ce;
}
else
fprintf(stderr,"Warning: ignoring Exec_load as there is no \
Create_file event for file_id: %u\n",exv->file_id);
break;
}
case FORMAT_DESCRIPTION_EVENT:
delete description_event;
description_event= (Format_description_log_event*) ev;
ev->print(result_file, short_form, last_event_info);
/*
We don't want this event to be deleted now, so let's hide it (I
(Guilhem) should later see if this triggers a non-serious Valgrind
error). Not serious error, because we will free description_event
later.
*/
ev= 0;
break;
case ROTATE_EVENT:
/* see comments in sql/slave.cc:process_io_rotate() */
if (description_event->binlog_version >= 4)
{
delete description_event;
/* start from format 3 (MySQL 4.0) again */
description_event= new Format_description_log_event(3);
if (!description_event || !description_event->is_valid())
die("Invalid Format_description log event; could be out of memory");
}
ev->print(result_file, short_form, last_event_info);
break;
default:
ev->print(result_file, short_form, last_event_info);
} }
} }
ce->set_fname_outside_temp_buf(tmp,strlen(tmp));
return tmp;
}
end:
(*rec_count)++;
if (ev)
delete ev;
DBUG_RETURN(0);
}
Load_log_processor load_processor;
static struct my_option my_long_options[] = static struct my_option my_long_options[] =
{ {
...@@ -259,18 +479,22 @@ static struct my_option my_long_options[] = ...@@ -259,18 +479,22 @@ static struct my_option my_long_options[] =
{"read-from-remote-server", 'R', "Read binary logs from a MySQL server", {"read-from-remote-server", 'R', "Read binary logs from a MySQL server",
(gptr*) &remote_opt, (gptr*) &remote_opt, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, (gptr*) &remote_opt, (gptr*) &remote_opt, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
0, 0}, 0, 0},
{"open_files_limit", OPT_OPEN_FILES_LIMIT,
"Used to reserve file descriptors for usage by this program",
(gptr*) &open_files_limit, (gptr*) &open_files_limit, 0, GET_ULONG,
REQUIRED_ARG, MY_NFILE, 8, OS_FILE_LIMIT, 0, 1, 0},
{"short-form", 's', "Just show the queries, no extra info.", {"short-form", 's', "Just show the queries, no extra info.",
(gptr*) &short_form, (gptr*) &short_form, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, (gptr*) &short_form, (gptr*) &short_form, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
0, 0}, 0, 0},
{"socket", 'S', "Socket file to use for connection.", {"socket", 'S', "Socket file to use for connection.",
(gptr*) &sock, (gptr*) &sock, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, (gptr*) &sock, (gptr*) &sock, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0,
0, 0}, 0, 0},
{"user", 'u', "Connect to the remote server as username.", {"user", 'u', "Connect to the remote server as username.",
(gptr*) &user, (gptr*) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, (gptr*) &user, (gptr*) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0,
0, 0}, 0, 0},
{"local-load", 'l', "Prepare files for local load in directory.", {"local-load", 'l', "Prepare local temporary files for LOAD DATA INFILE in the specified directory.",
(gptr*) &dirname_for_local_load, (gptr*) &dirname_for_local_load, 0, (gptr*) &dirname_for_local_load, (gptr*) &dirname_for_local_load, 0,
GET_STR_ALLOC, OPT_ARG, 0, 0, 0, 0, 0, 0}, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"version", 'V', "Print version and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, {"version", 'V', "Print version and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
0, 0, 0, 0, 0}, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} {0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
...@@ -290,6 +514,10 @@ void sql_print_error(const char *format,...) ...@@ -290,6 +514,10 @@ void sql_print_error(const char *format,...)
static void cleanup() static void cleanup()
{ {
my_free(pass,MYF(MY_ALLOW_ZERO_PTR)); my_free(pass,MYF(MY_ALLOW_ZERO_PTR));
my_free((char*) database, MYF(MY_ALLOW_ZERO_PTR));
my_free((char*) host, MYF(MY_ALLOW_ZERO_PTR));
my_free((char*) user, MYF(MY_ALLOW_ZERO_PTR));
my_free((char*) dirname_for_local_load, MYF(MY_ALLOW_ZERO_PTR));
} }
static void die(const char* fmt, ...) static void die(const char* fmt, ...)
...@@ -301,12 +529,13 @@ static void die(const char* fmt, ...) ...@@ -301,12 +529,13 @@ static void die(const char* fmt, ...)
fprintf(stderr, "\n"); fprintf(stderr, "\n");
va_end(args); va_end(args);
cleanup(); cleanup();
my_end(0);
exit(1); exit(1);
} }
static void print_version() static void print_version()
{ {
printf("%s Ver 2.5 for %s at %s\n", my_progname, SYSTEM_TYPE, MACHINE_TYPE); printf("%s Ver 3.1 for %s at %s\n", my_progname, SYSTEM_TYPE, MACHINE_TYPE);
} }
...@@ -325,37 +554,6 @@ the mysql command line client\n\n"); ...@@ -325,37 +554,6 @@ the mysql command line client\n\n");
my_print_variables(my_long_options); my_print_variables(my_long_options);
} }
static void dump_remote_file(NET* net, const char* fname)
{
char buf[FN_REFLEN+1];
uint len = (uint) strlen(fname);
buf[0] = 0;
memcpy(buf + 1, fname, len + 1);
if(my_net_write(net, buf, len +2) || net_flush(net))
die("Failed requesting the remote dump of %s", fname);
for(;;)
{
uint packet_len = my_net_read(net);
if(packet_len == 0)
{
if(my_net_write(net, "", 0) || net_flush(net))
die("Failed sending the ack packet");
// we just need to send something, as the server will read but
// not examine the packet - this is because mysql_load() sends an OK when it is done
break;
}
else if(packet_len == packet_error)
die("Failed reading a packet during the dump of %s ", fname);
if(!short_form)
(void)my_fwrite(result_file, (byte*) net->read_pos, packet_len,MYF(0));
}
fflush(result_file);
}
extern "C" my_bool extern "C" my_bool
get_one_option(int optid, const struct my_option *opt __attribute__((unused)), get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
char *argument) char *argument)
...@@ -430,6 +628,7 @@ static int parse_args(int *argc, char*** argv) ...@@ -430,6 +628,7 @@ static int parse_args(int *argc, char*** argv)
static MYSQL* safe_connect() static MYSQL* safe_connect()
{ {
MYSQL *local_mysql = mysql_init(NULL); MYSQL *local_mysql = mysql_init(NULL);
if (!local_mysql) if (!local_mysql)
die("Failed on mysql_init"); die("Failed on mysql_init");
...@@ -441,12 +640,11 @@ static MYSQL* safe_connect() ...@@ -441,12 +640,11 @@ static MYSQL* safe_connect()
return local_mysql; return local_mysql;
} }
static void dump_log_entries(const char* logname) static int dump_log_entries(const char* logname)
{ {
if (remote_opt) if (remote_opt)
dump_remote_log_entries(logname); return dump_remote_log_entries(logname);
else return dump_local_log_entries(logname);
dump_local_log_entries(logname);
} }
/* /*
...@@ -509,24 +707,26 @@ static int check_master_version(MYSQL* mysql, ...@@ -509,24 +707,26 @@ static int check_master_version(MYSQL* mysql,
} }
/* static int dump_remote_log_entries(const char* logname)
I thought I'd wait for both dump_*_log_entries to be merged, but it's not
yet, so I must update this one too.
*/
static void dump_remote_log_entries(const char* logname)
{ {
char buf[128]; char buf[128];
LAST_EVENT_INFO last_event_info; LAST_EVENT_INFO last_event_info;
uint len; uint len, logname_len;
NET* net = &mysql->net; NET* net = &mysql->net;
Format_description_log_event* description_event; DBUG_ENTER("dump_remote_log_entries");
if (check_master_version(mysql, &description_event)) if (check_master_version(mysql, &description_event))
die("Could not find server version"); {
fprintf(stderr, "Could not find server version");
DBUG_RETURN(1);
}
if (!description_event || !description_event->is_valid()) if (!description_event || !description_event->is_valid())
die("Invalid Format_description log event; could be out of memory"); {
fprintf(stderr, "Invalid Format_description log event; \
could be out of memory");
DBUG_RETURN(1);
}
if (!position) if (!position)
position = BIN_LOG_HEADER_SIZE; position = BIN_LOG_HEADER_SIZE;
...@@ -537,58 +737,109 @@ static void dump_remote_log_entries(const char* logname) ...@@ -537,58 +737,109 @@ static void dump_remote_log_entries(const char* logname)
} }
int4store(buf, position); int4store(buf, position);
int2store(buf + BIN_LOG_HEADER_SIZE, binlog_flags); int2store(buf + BIN_LOG_HEADER_SIZE, binlog_flags);
len = (uint) strlen(logname); logname_len = (uint) strlen(logname);
int4store(buf + 6, 0); int4store(buf + 6, 0);
memcpy(buf + 10, logname,len); memcpy(buf + 10, logname, logname_len);
if (simple_command(mysql, COM_BINLOG_DUMP, buf, len + 10, 1)) if (simple_command(mysql, COM_BINLOG_DUMP, buf, logname_len + 10, 1))
die("Error sending the log dump command"); {
fprintf(stderr,"Got fatal error sending the log dump command\n");
DBUG_RETURN(1);
}
my_off_t old_off= position;
ulonglong rec_count= 0;
char fname[FN_REFLEN+1];
for (;;) for (;;)
{ {
const char *error; const char *error;
len = net_safe_read(mysql); len = net_safe_read(mysql);
if (len == packet_error) if (len == packet_error)
die("Error reading packet from server: %s", mysql_error(mysql)); {
fprintf(stderr, "Got error reading packet from server: %s\n",
mysql_error(mysql));
DBUG_RETURN(1);
}
if (len < 8 && net->read_pos[0] == 254) if (len < 8 && net->read_pos[0] == 254)
break; // end of data break; // end of data
DBUG_PRINT("info",( "len= %u, net->read_pos[5] = %d\n", DBUG_PRINT("info",( "len= %u, net->read_pos[5] = %d\n",
len, net->read_pos[5])); len, net->read_pos[5]));
Log_event *ev = Log_event::read_log_event((const char*) net->read_pos + 1 , Log_event *ev = Log_event::read_log_event((const char*) net->read_pos + 1 ,
len - 1, &error, description_event); len - 1, &error,
if (ev) description_event);
if (!ev)
{
fprintf(stderr, "Could not construct log event object\n");
DBUG_RETURN(1);
}
Log_event_type type= ev->get_type_code();
if (description_event->binlog_version >=3 || (type != LOAD_EVENT && type != CREATE_FILE_EVENT))
{ {
switch (ev->get_type_code()) /*
If this is a Rotate event, maybe it's the end of the requested binlog;
in this case we are done (stop transfer).
This is suitable for binlogs, not relay logs (but for now we don't read
relay logs remotely because the server is not able to do that). If one
day we read relay logs remotely, then we will have a problem with the
detection below: relay logs contain Rotate events which are about the
binlogs, so which would trigger the end-detection below.
*/
if (type == ROTATE_EVENT)
{ {
case FORMAT_DESCRIPTION_EVENT: Rotate_log_event *rev= (Rotate_log_event *)ev;
delete description_event; /*
description_event= (Format_description_log_event*) ev; If this is a fake Rotate event, and not about our log, we can stop
ev->print(result_file, short_form, &last_event_info); transfer. If this a real Rotate event (so it's not about our log,
break; it's in our log describing the next log), we print it (because it's
case ROTATE_EVENT: part of our log) and then we will stop when we receive the fake one
/* see comments in sql/slave.cc:process_io_rotate() */ soon.
if (description_event->binlog_version >= 4) */
if (rev->when == 0)
{ {
delete description_event; if ((rev->ident_len != logname_len) ||
/* start from format 3 (MySQL 4.0) again */ memcmp(rev->new_log_ident, logname, logname_len))
description_event= new Format_description_log_event(3); DBUG_RETURN(0);
if (!description_event || !description_event->is_valid()) /*
die("Invalid Format_description log event; could be out of memory"); Otherwise, this is a fake Rotate for our log, at the very beginning
for sure. Skip it.
*/
continue;
} }
ev->print(result_file, short_form, &last_event_info);
delete ev;
break;
case LOAD_EVENT:
dump_remote_file(net, ((Load_log_event*)ev)->fname);
/* fall through */
default:
ev->print(result_file, short_form, &last_event_info);
delete ev;
} }
if (process_event(&rec_count,&last_event_info,ev,old_off))
DBUG_RETURN(1);
} }
else else
die("Could not construct log event object"); {
Load_log_event *le= (Load_log_event*)ev;
const char *old_fname= le->fname;
uint old_len= le->fname_len;
File file;
if ((file= load_processor.prepare_new_file_for_old_format(le,fname)) < 0)
DBUG_RETURN(1);
if (process_event(&rec_count,&last_event_info,ev,old_off))
{
my_close(file,MYF(MY_WME));
DBUG_RETURN(1);
}
if (load_processor.load_old_format_file(net,old_fname,old_len,file))
{
my_close(file,MYF(MY_WME));
DBUG_RETURN(1);
}
my_close(file,MYF(MY_WME));
}
/*
Let's adjust offset for remote log as for local log to produce
similar text. As we don't print the fake Rotate event, all events are
real so we can simply add the length.
*/
old_off+= len-1;
} }
delete description_event; DBUG_RETURN(0);
} }
...@@ -687,35 +938,32 @@ at offset %lu ; this could be a log format error or read error", ...@@ -687,35 +938,32 @@ at offset %lu ; this could be a log format error or read error",
} }
static void dump_local_log_entries(const char* logname) static int dump_local_log_entries(const char* logname)
{ {
File fd = -1; File fd = -1;
IO_CACHE cache,*file= &cache; IO_CACHE cache,*file= &cache;
ulonglong rec_count = 0; ulonglong rec_count = 0;
LAST_EVENT_INFO last_event_info; LAST_EVENT_INFO last_event_info;
byte tmp_buff[BIN_LOG_HEADER_SIZE]; byte tmp_buff[BIN_LOG_HEADER_SIZE];
/* int error= 0;
check_header() will set the pointer below.
Why do we need here a pointer on an event instead of an event ?
This is because the event will be created (alloced) in read_log_event()
(which returns a pointer) in check_header().
*/
Format_description_log_event* description_event;
if (logname && logname[0] != '-') if (logname && logname[0] != '-')
{ {
if ((fd = my_open(logname, O_RDONLY | O_BINARY, MYF(MY_WME))) < 0) if ((fd = my_open(logname, O_RDONLY | O_BINARY, MYF(MY_WME))) < 0)
exit(1); return 1;
if (init_io_cache(file, fd, 0, READ_CACHE, (my_off_t) position, 0, if (init_io_cache(file, fd, 0, READ_CACHE, (my_off_t) position, 0,
MYF(MY_WME | MY_NABP))) MYF(MY_WME | MY_NABP)))
exit(1); {
my_close(fd, MYF(MY_WME));
return 1;
}
check_header(file, &description_event); check_header(file, &description_event);
} }
else // reading from stdin; TODO: check that it works else // reading from stdin; TODO: check that it works
{ {
if (init_io_cache(file, fileno(result_file), 0, READ_CACHE, (my_off_t) 0, if (init_io_cache(file, fileno(result_file), 0, READ_CACHE, (my_off_t) 0,
0, MYF(MY_WME | MY_NABP | MY_DONT_CHECK_FILESIZE))) 0, MYF(MY_WME | MY_NABP | MY_DONT_CHECK_FILESIZE)))
exit(1); return 1;
check_header(file, &description_event); check_header(file, &description_event);
if (position) if (position)
{ {
...@@ -726,7 +974,10 @@ static void dump_local_log_entries(const char* logname) ...@@ -726,7 +974,10 @@ static void dump_local_log_entries(const char* logname)
{ {
tmp=min(length,sizeof(buff)); tmp=min(length,sizeof(buff));
if (my_b_read(file, buff, (uint) tmp)) if (my_b_read(file, buff, (uint) tmp))
exit(1); {
error= 1;
goto end;
}
} }
} }
file->pos_in_file=position; file->pos_in_file=position;
...@@ -736,8 +987,11 @@ static void dump_local_log_entries(const char* logname) ...@@ -736,8 +987,11 @@ static void dump_local_log_entries(const char* logname)
if (!description_event || !description_event->is_valid()) if (!description_event || !description_event->is_valid())
die("Invalid Format_description log event; could be out of memory"); die("Invalid Format_description log event; could be out of memory");
if (!position) if (!position && my_b_read(file, tmp_buff, BIN_LOG_HEADER_SIZE))
my_b_read(file, tmp_buff, BIN_LOG_HEADER_SIZE); // Skip header {
error= 1;
goto end;
}
for (;;) for (;;)
{ {
char llbuff[21]; char llbuff[21];
...@@ -747,123 +1001,37 @@ static void dump_local_log_entries(const char* logname) ...@@ -747,123 +1001,37 @@ static void dump_local_log_entries(const char* logname)
if (!ev) if (!ev)
{ {
if (file->error) if (file->error)
die("\ fprintf(stderr,
Could not read entry at offset %s : Error in log format or read error", "Could not read entry at offset %s:"
llstr(old_off,llbuff)); "Error in log format or read error\n",
llstr(old_off,llbuff));
error= 1;
// file->error == 0 means EOF, that's OK, we break in this case // file->error == 0 means EOF, that's OK, we break in this case
break; break;
} }
if (rec_count >= offset) if (process_event(&rec_count,&last_event_info,ev,old_off))
{ {
if (!short_form) error= 1;
fprintf(result_file, "# at %s\n",llstr(old_off,llbuff)); break;
}
switch (ev->get_type_code()) {
case QUERY_EVENT:
if (one_database)
{
const char * log_dbname = ((Query_log_event*)ev)->db;
if ((log_dbname != NULL) && (strcmp(log_dbname, database)))
{
rec_count++;
delete ev;
continue; // next
}
}
ev->print(result_file, short_form, &last_event_info);
break;
case CREATE_FILE_EVENT:
{
Create_file_log_event* ce= (Create_file_log_event*)ev;
if (one_database)
{
/*
We test if this event has to be ignored. If yes, we don't save this
event; this will have the good side-effect of ignoring all related
Append_block and Exec_load.
Note that Load event from 3.23 is not tested.
*/
const char * log_dbname = ce->db;
if ((log_dbname != NULL) && (strcmp(log_dbname, database)))
{
rec_count++;
delete ev;
continue; // next
}
}
/*
We print the event, but with a leading '#': this is just to inform
the user of the original command; the command we want to execute
will be a derivation of this original command (we will change the
filename and use LOCAL), prepared in the 'case EXEC_LOAD_EVENT'
below.
*/
ce->print(result_file, short_form, &last_event_info, true);
load_processor.process(ce);
ev= 0;
break;
}
case APPEND_BLOCK_EVENT:
ev->print(result_file, short_form, &last_event_info);
load_processor.process((Append_block_log_event*)ev);
break;
case EXEC_LOAD_EVENT:
{
ev->print(result_file, short_form, &last_event_info);
Execute_load_log_event *exv= (Execute_load_log_event*)ev;
Create_file_log_event *ce= load_processor.grab_event(exv->file_id);
/*
if ce is 0, it probably means that we have not seen the Create_file
event (a bad binlog, or most probably --position is after the
Create_file event). Print a warning comment.
*/
if (ce)
{
ce->print(result_file, short_form, &last_event_info,true);
my_free((char*)ce->fname,MYF(MY_WME));
delete ce;
}
else
fprintf(stderr,"Warning: ignoring Exec_load as there is no \
Create_file event for file_id: %u\n",exv->file_id);
break;
}
case FORMAT_DESCRIPTION_EVENT:
delete description_event;
description_event= (Format_description_log_event*) ev;
ev->print(result_file, short_form, &last_event_info);
break;
case ROTATE_EVENT:
/* see comments in sql/slave.cc:process_io_rotate() */
if (description_event->binlog_version >= 4)
{
delete description_event;
/* start from format 3 (MySQL 4.0) again */
description_event= new Format_description_log_event(3);
if (!description_event || !description_event->is_valid())
die("Invalid Format_description log event; could be out of memory");
}
ev->print(result_file, short_form, &last_event_info);
break;
default:
ev->print(result_file, short_form, &last_event_info);
}
}
rec_count++;
if (ev && ev->get_type_code()!=FORMAT_DESCRIPTION_EVENT)
delete ev; /* otherwise, deleted in the end */
} }
end:
if (fd >= 0) if (fd >= 0)
my_close(fd, MYF(MY_WME)); my_close(fd, MYF(MY_WME));
end_io_cache(file); end_io_cache(file);
delete description_event; delete description_event;
return error;
} }
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
static char **defaults_argv; static char **defaults_argv;
int exit_value;
MY_INIT(argv[0]); MY_INIT(argv[0]);
DBUG_ENTER("main");
DBUG_PROCESS(argv[0]);
parse_args(&argc, (char***)&argv); parse_args(&argc, (char***)&argv);
defaults_argv=argv; defaults_argv=argv;
...@@ -872,9 +1040,10 @@ int main(int argc, char** argv) ...@@ -872,9 +1040,10 @@ int main(int argc, char** argv)
{ {
usage(); usage();
free_defaults(defaults_argv); free_defaults(defaults_argv);
return -1; exit(1);
} }
my_set_max_open_files(open_files_limit);
if (remote_opt) if (remote_opt)
mysql = safe_connect(); mysql = safe_connect();
...@@ -884,16 +1053,28 @@ int main(int argc, char** argv) ...@@ -884,16 +1053,28 @@ int main(int argc, char** argv)
{ {
if (init_tmpdir(&tmpdir, 0)) if (init_tmpdir(&tmpdir, 0))
exit(1); exit(1);
dirname_for_local_load= my_tmpdir(&tmpdir); dirname_for_local_load= my_strdup(my_tmpdir(&tmpdir), MY_WME);
} }
if (load_processor.init())
exit(1);
if (dirname_for_local_load) if (dirname_for_local_load)
load_processor.init_by_dir_name(dirname_for_local_load); load_processor.init_by_dir_name(dirname_for_local_load);
else else
load_processor.init_by_cur_dir(); load_processor.init_by_cur_dir();
exit_value= 0;
fprintf(result_file,
"/*!40019 SET @@session.max_insert_delayed_threads=0*/;\n");
while (--argc >= 0) while (--argc >= 0)
dump_log_entries(*(argv++)); {
if (dump_log_entries(*(argv++)))
{
exit_value=1;
break;
}
}
if (tmpdir.list) if (tmpdir.list)
free_tmpdir(&tmpdir); free_tmpdir(&tmpdir);
if (result_file != stdout) if (result_file != stdout)
...@@ -902,8 +1083,10 @@ int main(int argc, char** argv) ...@@ -902,8 +1083,10 @@ int main(int argc, char** argv)
mysql_close(mysql); mysql_close(mysql);
cleanup(); cleanup();
free_defaults(defaults_argv); free_defaults(defaults_argv);
my_free_open_file_info();
my_end(0); my_end(0);
return 0; exit(exit_value);
DBUG_RETURN(exit_value); // Keep compilers happy
} }
/* /*
......
...@@ -311,41 +311,41 @@ ...@@ -311,41 +311,41 @@
#define ER_TRUNCATED_WRONG_VALUE 1292 #define ER_TRUNCATED_WRONG_VALUE 1292
#define ER_TOO_MUCH_AUTO_TIMESTAMP_COLS 1293 #define ER_TOO_MUCH_AUTO_TIMESTAMP_COLS 1293
#define ER_INVALID_ON_UPDATE 1294 #define ER_INVALID_ON_UPDATE 1294
#define ER_SP_NO_RECURSIVE_CREATE 1294 #define ER_SP_NO_RECURSIVE_CREATE 1295
#define ER_SP_ALREADY_EXISTS 1295 #define ER_SP_ALREADY_EXISTS 1296
#define ER_SP_DOES_NOT_EXIST 1296 #define ER_SP_DOES_NOT_EXIST 1297
#define ER_SP_DROP_FAILED 1297 #define ER_SP_DROP_FAILED 1298
#define ER_SP_STORE_FAILED 1298 #define ER_SP_STORE_FAILED 1299
#define ER_SP_LILABEL_MISMATCH 1299 #define ER_SP_LILABEL_MISMATCH 1300
#define ER_SP_LABEL_REDEFINE 1300 #define ER_SP_LABEL_REDEFINE 1301
#define ER_SP_LABEL_MISMATCH 1301 #define ER_SP_LABEL_MISMATCH 1302
#define ER_SP_UNINIT_VAR 1302 #define ER_SP_UNINIT_VAR 1303
#define ER_SP_BADSELECT 1303 #define ER_SP_BADSELECT 1304
#define ER_SP_BADRETURN 1304 #define ER_SP_BADRETURN 1305
#define ER_SP_BADSTATEMENT 1305 #define ER_SP_BADSTATEMENT 1306
#define ER_UPDATE_LOG_DEPRECATED_IGNORED 1306 #define ER_UPDATE_LOG_DEPRECATED_IGNORED 1307
#define ER_UPDATE_LOG_DEPRECATED_TRANSLATED 1307 #define ER_UPDATE_LOG_DEPRECATED_TRANSLATED 1308
#define ER_QUERY_INTERRUPTED 1308 #define ER_QUERY_INTERRUPTED 1309
#define ER_SP_WRONG_NO_OF_ARGS 1309 #define ER_SP_WRONG_NO_OF_ARGS 1310
#define ER_SP_COND_MISMATCH 1310 #define ER_SP_COND_MISMATCH 1311
#define ER_SP_NORETURN 1311 #define ER_SP_NORETURN 1312
#define ER_SP_NORETURNEND 1312 #define ER_SP_NORETURNEND 1313
#define ER_SP_BAD_CURSOR_QUERY 1313 #define ER_SP_BAD_CURSOR_QUERY 1314
#define ER_SP_BAD_CURSOR_SELECT 1314 #define ER_SP_BAD_CURSOR_SELECT 1315
#define ER_SP_CURSOR_MISMATCH 1315 #define ER_SP_CURSOR_MISMATCH 1316
#define ER_SP_CURSOR_ALREADY_OPEN 1316 #define ER_SP_CURSOR_ALREADY_OPEN 1317
#define ER_SP_CURSOR_NOT_OPEN 1317 #define ER_SP_CURSOR_NOT_OPEN 1318
#define ER_SP_UNDECLARED_VAR 1318 #define ER_SP_UNDECLARED_VAR 1319
#define ER_SP_WRONG_NO_OF_FETCH_ARGS 1319 #define ER_SP_WRONG_NO_OF_FETCH_ARGS 1320
#define ER_SP_FETCH_NO_DATA 1320 #define ER_SP_FETCH_NO_DATA 1321
#define ER_SP_DUP_PARAM 1321 #define ER_SP_DUP_PARAM 1322
#define ER_SP_DUP_VAR 1322 #define ER_SP_DUP_VAR 1323
#define ER_SP_DUP_COND 1323 #define ER_SP_DUP_COND 1324
#define ER_SP_DUP_CURS 1324 #define ER_SP_DUP_CURS 1325
#define ER_SP_CANT_ALTER 1325 #define ER_SP_CANT_ALTER 1326
#define ER_SP_SUBSELECT_NYI 1326 #define ER_SP_SUBSELECT_NYI 1327
#define ER_SP_NO_USE 1327 #define ER_SP_NO_USE 1328
#define ER_SP_VARCOND_AFTER_CURSHNDLR 1328 #define ER_SP_VARCOND_AFTER_CURSHNDLR 1329
#define ER_SP_CURSOR_AFTER_HANDLER 1329 #define ER_SP_CURSOR_AFTER_HANDLER 1330
#define ER_SP_CASE_NOT_FOUND 1330 #define ER_SP_CASE_NOT_FOUND 1331
#define ER_ERROR_MESSAGES 331 #define ER_ERROR_MESSAGES 332
...@@ -9,6 +9,10 @@ select get_lock("a",10); ...@@ -9,6 +9,10 @@ select get_lock("a",10);
get_lock("a",10) get_lock("a",10)
1 1
show binlog events; show binlog events;
master-bin.000001 246 Query 1 246 use `drop-temp+table-test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `drop-temp+table-test`.`table:name` Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 375 Query 1 375 use `drop-temp+table-test`; DO RELEASE_LOCK("a") master-bin.000001 4 Format_desc 1 95 Server ver: VERSION, Binlog ver: 4
master-bin.000001 95 Query 1 190 use `test`; create database `drop-temp+table-test`
master-bin.000001 190 Query 1 306 use `drop-temp+table-test`; create temporary table `table:name` (a int)
master-bin.000001 306 Query 1 457 use `drop-temp+table-test`; DROP /*!40005 TEMPORARY */ TABLE IF EXISTS `drop-temp+table-test`.`table:name`
master-bin.000001 457 Query 1 550 use `drop-temp+table-test`; DO RELEASE_LOCK("a")
drop database `drop-temp+table-test`; drop database `drop-temp+table-test`;
...@@ -324,6 +324,7 @@ f_double_u 0 ...@@ -324,6 +324,7 @@ f_double_u 0
f_float_u 0 f_float_u 0
f_double_15_1_u 0.0 f_double_15_1_u 0.0
f_float_3_1_u 0.0 f_float_3_1_u 0.0
use test;
drop table if exists t1,t2,t3; drop table if exists t1,t2,t3;
create table t1(id1 int not null auto_increment primary key, t char(12)); create table t1(id1 int not null auto_increment primary key, t char(12));
create table t2(id2 int not null, t char(12)); create table t2(id2 int not null, t char(12));
......
...@@ -14,6 +14,7 @@ insert into t1 values ("Alas"); ...@@ -14,6 +14,7 @@ insert into t1 values ("Alas");
flush logs; flush logs;
--- Local -- --- Local --
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
use test; use test;
SET TIMESTAMP=1000000000; SET TIMESTAMP=1000000000;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1;
...@@ -26,13 +27,14 @@ insert into t1 values ("abirvalg"); ...@@ -26,13 +27,14 @@ insert into t1 values ("abirvalg");
SET INSERT_ID=1; SET INSERT_ID=1;
SET TIMESTAMP=1000000000; SET TIMESTAMP=1000000000;
insert into t2 values (); insert into t2 values ();
LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-1-0' INTO TABLE t1 FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-1-0' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word);
LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-2-0' INTO TABLE t1 FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-2-0' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word);
LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-3-0' INTO TABLE t1 FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-3-0' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word);
LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-4-0' INTO TABLE t1 FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-4-0' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word);
LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-5-0' INTO TABLE t1 FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word); LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-5-0' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word);
--- Broken LOAD DATA -- --- Broken LOAD DATA --
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
use test; use test;
SET TIMESTAMP=1000000000; SET TIMESTAMP=1000000000;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1;
...@@ -40,9 +42,11 @@ SET @@session.sql_mode=0; ...@@ -40,9 +42,11 @@ SET @@session.sql_mode=0;
insert into t1 values ("Alas"); insert into t1 values ("Alas");
--- --database -- --- --database --
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
SET INSERT_ID=1; SET INSERT_ID=1;
--- --position -- --- --position --
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
use test; use test;
SET TIMESTAMP=1000000000; SET TIMESTAMP=1000000000;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1;
...@@ -50,6 +54,7 @@ SET @@session.sql_mode=0; ...@@ -50,6 +54,7 @@ SET @@session.sql_mode=0;
insert into t1 values ("Alas"); insert into t1 values ("Alas");
--- Remote -- --- Remote --
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
use test; use test;
SET TIMESTAMP=1000000000; SET TIMESTAMP=1000000000;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1;
...@@ -62,10 +67,14 @@ insert into t1 values ("abirvalg"); ...@@ -62,10 +67,14 @@ insert into t1 values ("abirvalg");
SET INSERT_ID=1; SET INSERT_ID=1;
SET TIMESTAMP=1000000000; SET TIMESTAMP=1000000000;
insert into t2 values (); insert into t2 values ();
SET TIMESTAMP=1000000000; LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-1-1' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word);
insert into t1 values ("Alas"); LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-2-1' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word);
LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-3-1' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word);
LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-4-1' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word);
LOAD DATA LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/words.dat-5-1' INTO TABLE `t1` FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY '' (word);
--- Broken LOAD DATA -- --- Broken LOAD DATA --
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
use test; use test;
SET TIMESTAMP=1000000000; SET TIMESTAMP=1000000000;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1;
...@@ -73,22 +82,11 @@ SET @@session.sql_mode=0; ...@@ -73,22 +82,11 @@ SET @@session.sql_mode=0;
insert into t1 values ("Alas"); insert into t1 values ("Alas");
--- --database -- --- --database --
use test; /*!40019 SET @@session.max_insert_delayed_threads=0*/;
SET TIMESTAMP=1000000000;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1;
SET @@session.sql_mode=0;
create table t1 (word varchar(20));
SET TIMESTAMP=1000000000;
create table t2 (id int auto_increment not null primary key);
SET TIMESTAMP=1000000000;
insert into t1 values ("abirvalg");
SET INSERT_ID=1; SET INSERT_ID=1;
SET TIMESTAMP=1000000000;
insert into t2 values ();
SET TIMESTAMP=1000000000;
insert into t1 values ("Alas");
--- --position -- --- --position --
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
use test; use test;
SET TIMESTAMP=1000000000; SET TIMESTAMP=1000000000;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1;
......
...@@ -857,7 +857,7 @@ Variable_name Value ...@@ -857,7 +857,7 @@ Variable_name Value
Qcache_queries_in_cache 0 Qcache_queries_in_cache 0
show status like "Qcache_inserts"; show status like "Qcache_inserts";
Variable_name Value Variable_name Value
Qcache_inserts 9 Qcache_inserts 11
show status like "Qcache_hits"; show status like "Qcache_hits";
Variable_name Value Variable_name Value
Qcache_hits 6 Qcache_hits 6
...@@ -870,7 +870,7 @@ Variable_name Value ...@@ -870,7 +870,7 @@ Variable_name Value
Qcache_queries_in_cache 1 Qcache_queries_in_cache 1
show status like "Qcache_inserts"; show status like "Qcache_inserts";
Variable_name Value Variable_name Value
Qcache_inserts 10 Qcache_inserts 12
show status like "Qcache_hits"; show status like "Qcache_hits";
Variable_name Value Variable_name Value
Qcache_hits 7 Qcache_hits 7
......
...@@ -9,7 +9,7 @@ insert into t1 values (1),(1); ...@@ -9,7 +9,7 @@ insert into t1 values (1),(1);
ERROR 23000: Duplicate entry '1' for key 1 ERROR 23000: Duplicate entry '1' for key 1
show slave status; show slave status;
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 213 slave-relay-bin.000002 257 master-bin.000001 Yes Yes test.t3,test.t1,test.t2 0 0 213 257 None 0 No # # 127.0.0.1 root MASTER_PORT 1 master-bin.000001 273 # # master-bin.000001 Yes Yes test.t3,test.t1,test.t2 0 0 273 # None 0 No #
show tables like 't1'; show tables like 't1';
Tables_in_test (t1) Tables_in_test (t1)
drop table t1; drop table t1;
...@@ -26,14 +26,14 @@ select (@id := id) - id from t3; ...@@ -26,14 +26,14 @@ select (@id := id) - id from t3;
0 0
kill @id; kill @id;
drop table t2,t3; drop table t2,t3;
show binlog events from 79; show binlog events from 95;
Log_name Pos Event_type Server_id Orig_log_pos Info Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 79 Query 1 79 use `test`; create table t1 (a int primary key) master-bin.000001 95 Query 1 187 use `test`; create table t1 (a int primary key)
master-bin.000001 149 Query 1 149 use `test`; insert into t1 values (1),(1) master-bin.000001 187 Query 1 273 use `test`; insert into t1 values (1),(1)
master-bin.000001 213 Query 1 213 use `test`; drop table t1 master-bin.000001 273 Query 1 343 use `test`; drop table t1
master-bin.000001 261 Query 1 261 use `test`; create table t2 (a int primary key) master-bin.000001 343 Query 1 435 use `test`; create table t2 (a int primary key)
master-bin.000001 331 Query 1 331 use `test`; insert into t2 values(1) master-bin.000001 435 Query 1 516 use `test`; insert into t2 values(1)
master-bin.000001 390 Query 1 390 use `test`; create table t3 (id int) master-bin.000001 516 Query 1 597 use `test`; create table t3 (id int)
master-bin.000001 449 Query 1 449 use `test`; insert into t3 values(connection_id()) master-bin.000001 597 Query 1 692 use `test`; insert into t3 values(connection_id())
master-bin.000001 522 Query 1 522 use `test`; update t2 set a = a + 1 + get_lock('crash_lock%20C', 10) master-bin.000001 692 Query 1 805 use `test`; update t2 set a = a + 1 + get_lock('crash_lock%20C', 10)
master-bin.000001 613 Query 1 613 use `test`; drop table t2,t3 master-bin.000001 805 Query 1 878 use `test`; drop table t2,t3
...@@ -16,6 +16,9 @@ master_pos_wait('master-bin.001',3000)>=0 ...@@ -16,6 +16,9 @@ master_pos_wait('master-bin.001',3000)>=0
select max(a) from t1; select max(a) from t1;
max(a) max(a)
8000 8000
show slave status;
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 687207 # # master-bin.000001 Yes Yes 0 0 687207 # None 0 No #
show status like "binlog_cache_use"; show status like "binlog_cache_use";
Variable_name Value Variable_name Value
Binlog_cache_use 1 Binlog_cache_use 1
...@@ -31,7 +34,4 @@ Binlog_cache_use 2 ...@@ -31,7 +34,4 @@ Binlog_cache_use 2
show status like "binlog_cache_disk_use"; show status like "binlog_cache_disk_use";
Variable_name Value Variable_name Value
Binlog_cache_disk_use 1 Binlog_cache_disk_use 1
show slave status;
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 687207 # # master-bin.000001 Yes Yes 0 0 687207 # None 0 No #
drop table t1; drop table t1;
...@@ -10,4 +10,4 @@ reset slave; ...@@ -10,4 +10,4 @@ reset slave;
start slave; start slave;
show slave status; show slave status;
Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_Do_DB Replicate_Ignore_DB Replicate_Do_Table Replicate_Ignore_Table Replicate_Wild_Do_Table Replicate_Wild_Ignore_Table Last_Errno Last_Error Skip_Counter Exec_Master_Log_Pos Relay_Log_Space Until_Condition Until_Log_File Until_Log_Pos Master_SSL_Allowed Master_SSL_CA_File Master_SSL_CA_Path Master_SSL_Cert Master_SSL_Cipher Master_SSL_Key Seconds_Behind_Master
# 127.0.0.1 root MASTER_PORT 1 master-bin.000002 4 slave-relay-bin.000002 123 master-bin.000001 Yes No 0 Rolling back unfinished transaction (no COMMIT or ROLLBACK) from relay log. A probable cause is that the master died while writing the transaction to its binary log. 0 79 326 None 0 No # # 127.0.0.1 root MASTER_PORT 1 master-bin.000002 4 # # master-bin.000001 Yes No 0 Rolling back unfinished transaction (no COMMIT or ROLLBACK) from relay log. A probable cause is that the master died while writing the transaction to its binary log. 0 79 # None 0 No #
...@@ -35,7 +35,7 @@ call foo()| ...@@ -35,7 +35,7 @@ call foo()|
ERROR 42000: PROCEDURE foo does not exist ERROR 42000: PROCEDURE foo does not exist
drop procedure if exists foo| drop procedure if exists foo|
Warnings: Warnings:
Warning 1292 PROCEDURE foo does not exist Warning 1297 PROCEDURE foo does not exist
show create procedure foo| show create procedure foo|
ERROR 42000: PROCEDURE foo does not exist ERROR 42000: PROCEDURE foo does not exist
create procedure foo() create procedure foo()
...@@ -71,7 +71,7 @@ declare y int; ...@@ -71,7 +71,7 @@ declare y int;
set x = y; set x = y;
end| end|
Warnings: Warnings:
Warning 1298 Referring to uninitialized variable y Warning 1303 Referring to uninitialized variable y
drop procedure foo| drop procedure foo|
create procedure foo() create procedure foo()
return 42| return 42|
......
...@@ -1048,7 +1048,7 @@ drop table if exists t3| ...@@ -1048,7 +1048,7 @@ drop table if exists t3|
create table t3 (s1 smallint)| create table t3 (s1 smallint)|
insert into t3 values (123456789012)| insert into t3 values (123456789012)|
Warnings: Warnings:
Warning 1263 Data truncated, out of range for column 's1' at row 1 Warning 1264 Data truncated, out of range for column 's1' at row 1
create procedure bug2780() create procedure bug2780()
begin begin
declare exit handler for sqlwarning set @x = 1; declare exit handler for sqlwarning set @x = 1;
......
...@@ -8,6 +8,7 @@ help_keyword ...@@ -8,6 +8,7 @@ help_keyword
help_relation help_relation
help_topic help_topic
host host
proc
tables_priv tables_priv
user user
show create table db; show create table db;
......
...@@ -364,7 +364,7 @@ set sql_log_bin=1; ...@@ -364,7 +364,7 @@ set sql_log_bin=1;
set sql_log_off=1; set sql_log_off=1;
set sql_log_update=1; set sql_log_update=1;
Warnings: Warnings:
Note 1302 The update log is deprecated and replaced by the binary log. SET SQL_LOG_UPDATE has been ignored. Note 1307 The update log is deprecated and replaced by the binary log. SET SQL_LOG_UPDATE has been ignored.
set sql_low_priority_updates=1; set sql_low_priority_updates=1;
set sql_max_join_size=200; set sql_max_join_size=200;
select @@sql_max_join_size,@@max_join_size; select @@sql_max_join_size,@@max_join_size;
......
...@@ -48,7 +48,7 @@ connection master; ...@@ -48,7 +48,7 @@ connection master;
--error 0,1053; --error 0,1053;
reap; reap;
connection master1; connection master1;
show binlog events from 79; show binlog events from 95;
save_master_pos; save_master_pos;
connection slave; connection slave;
# SQL slave thread should not have stopped (because table of the killed # SQL slave thread should not have stopped (because table of the killed
......
...@@ -32,18 +32,18 @@ create function func1() returns int ...@@ -32,18 +32,18 @@ create function func1() returns int
return 42| return 42|
# Can't create recursively # Can't create recursively
--error 1290 --error 1295
create procedure foo() create procedure foo()
create procedure bar() set @x=3| create procedure bar() set @x=3|
--error 1290 --error 1295
create procedure foo() create procedure foo()
create function bar() returns double return 2.3| create function bar() returns double return 2.3|
# Already exists # Already exists
--error 1291 --error 1296
create procedure proc1() create procedure proc1()
set @x = 42| set @x = 42|
--error 1291 --error 1296
create function func1() returns int create function func1() returns int
return 42| return 42|
...@@ -51,39 +51,39 @@ drop procedure proc1| ...@@ -51,39 +51,39 @@ drop procedure proc1|
drop function func1| drop function func1|
# Does not exist # Does not exist
--error 1292 --error 1297
alter procedure foo| alter procedure foo|
--error 1292 --error 1297
alter function foo| alter function foo|
--error 1292 --error 1297
drop procedure foo| drop procedure foo|
--error 1292 --error 1297
drop function foo| drop function foo|
--error 1292 --error 1297
call foo()| call foo()|
drop procedure if exists foo| drop procedure if exists foo|
--error 1292 --error 1297
show create procedure foo| show create procedure foo|
# LEAVE/ITERATE with no match # LEAVE/ITERATE with no match
--error 1295 --error 1300
create procedure foo() create procedure foo()
foo: loop foo: loop
leave bar; leave bar;
end loop| end loop|
--error 1295 --error 1300
create procedure foo() create procedure foo()
foo: loop foo: loop
iterate bar; iterate bar;
end loop| end loop|
--error 1295 --error 1300
create procedure foo() create procedure foo()
foo: begin foo: begin
iterate foo; iterate foo;
end| end|
# Redefining label # Redefining label
--error 1296 --error 1301
create procedure foo() create procedure foo()
foo: loop foo: loop
foo: loop foo: loop
...@@ -92,7 +92,7 @@ foo: loop ...@@ -92,7 +92,7 @@ foo: loop
end loop foo| end loop foo|
# End label mismatch # End label mismatch
--error 1297 --error 1302
create procedure foo() create procedure foo()
foo: loop foo: loop
set @x=2; set @x=2;
...@@ -107,12 +107,12 @@ end| ...@@ -107,12 +107,12 @@ end|
drop procedure foo| drop procedure foo|
# RETURN in FUNCTION only # RETURN in FUNCTION only
--error 1300 --error 1305
create procedure foo() create procedure foo()
return 42| return 42|
# Doesn't allow queries in FUNCTIONs (for now :-( ) # Doesn't allow queries in FUNCTIONs (for now :-( )
--error 1301 --error 1306
create function foo() returns int create function foo() returns int
begin begin
declare x int; declare x int;
...@@ -126,19 +126,19 @@ create procedure p(x int) ...@@ -126,19 +126,19 @@ create procedure p(x int)
create function f(x int) returns int create function f(x int) returns int
return x+42| return x+42|
--error 1305 --error 1310
call p()| call p()|
--error 1305 --error 1310
call p(1, 2)| call p(1, 2)|
--error 1305 --error 1310
select f()| select f()|
--error 1305 --error 1310
select f(1, 2)| select f(1, 2)|
drop procedure p| drop procedure p|
drop function f| drop function f|
--error 1306 --error 1311
create procedure p(val int, out res int) create procedure p(val int, out res int)
begin begin
declare x int default 0; declare x int default 0;
...@@ -152,7 +152,7 @@ begin ...@@ -152,7 +152,7 @@ begin
end if; end if;
end| end|
--error 1306 --error 1311
create procedure p(val int, out res int) create procedure p(val int, out res int)
begin begin
declare x int default 0; declare x int default 0;
...@@ -167,7 +167,7 @@ begin ...@@ -167,7 +167,7 @@ begin
end if; end if;
end| end|
--error 1307 --error 1312
create function f(val int) returns int create function f(val int) returns int
begin begin
declare x int; declare x int;
...@@ -185,12 +185,12 @@ begin ...@@ -185,12 +185,12 @@ begin
end if; end if;
end| end|
--error 1308 --error 1313
select f(10)| select f(10)|
drop function f| drop function f|
--error 1309 --error 1314
create procedure p() create procedure p()
begin begin
declare c cursor for insert into test.t1 values ("foo", 42); declare c cursor for insert into test.t1 values ("foo", 42);
...@@ -199,7 +199,7 @@ begin ...@@ -199,7 +199,7 @@ begin
close c; close c;
end| end|
--error 1310 --error 1315
create procedure p() create procedure p()
begin begin
declare x int; declare x int;
...@@ -209,7 +209,7 @@ begin ...@@ -209,7 +209,7 @@ begin
close c; close c;
end| end|
--error 1311 --error 1316
create procedure p() create procedure p()
begin begin
declare c cursor for select * from test.t; declare c cursor for select * from test.t;
...@@ -231,7 +231,7 @@ begin ...@@ -231,7 +231,7 @@ begin
open c; open c;
close c; close c;
end| end|
--error 1312 --error 1317
call p()| call p()|
drop procedure p| drop procedure p|
...@@ -243,11 +243,11 @@ begin ...@@ -243,11 +243,11 @@ begin
close c; close c;
close c; close c;
end| end|
--error 1313 --error 1318
call p()| call p()|
drop procedure p| drop procedure p|
--error 1292 --error 1297
alter procedure bar3 sql security invoker| alter procedure bar3 sql security invoker|
--error 1059 --error 1059
alter procedure bar3 name alter procedure bar3 name
...@@ -261,7 +261,7 @@ drop table if exists t1| ...@@ -261,7 +261,7 @@ drop table if exists t1|
create table t1 (val int, x float)| create table t1 (val int, x float)|
insert into t1 values (42, 3.1), (19, 1.2)| insert into t1 values (42, 3.1), (19, 1.2)|
--error 1314 --error 1319
create procedure p() create procedure p()
begin begin
declare x int; declare x int;
...@@ -281,7 +281,7 @@ begin ...@@ -281,7 +281,7 @@ begin
fetch c into x; fetch c into x;
close c; close c;
end| end|
--error 1315 --error 1320
call p()| call p()|
drop procedure p| drop procedure p|
...@@ -296,34 +296,34 @@ begin ...@@ -296,34 +296,34 @@ begin
fetch c into x, y, z; fetch c into x, y, z;
close c; close c;
end| end|
--error 1315 --error 1320
call p()| call p()|
drop procedure p| drop procedure p|
--error 1317 --error 1322
create procedure p(in x int, x char(10)) create procedure p(in x int, x char(10))
begin begin
end| end|
--error 1317 --error 1322
create function p(x int, x char(10)) create function p(x int, x char(10))
begin begin
end| end|
--error 1318 --error 1323
create procedure p() create procedure p()
begin begin
declare x float; declare x float;
declare x int; declare x int;
end| end|
--error 1319 --error 1324
create procedure p() create procedure p()
begin begin
declare c condition for 1064; declare c condition for 1064;
declare c condition for 1065; declare c condition for 1065;
end| end|
--error 1320 --error 1325
create procedure p() create procedure p()
begin begin
declare c cursor for select * from t1; declare c cursor for select * from t1;
...@@ -331,18 +331,18 @@ begin ...@@ -331,18 +331,18 @@ begin
end| end|
# USE is not allowed # USE is not allowed
--error 1323 --error 1328
create procedure u() create procedure u()
use sptmp| use sptmp|
# Enforced standard order of declarations # Enforced standard order of declarations
--error 1324 --error 1329
create procedure p() create procedure p()
begin begin
declare c cursor for select * from t1; declare c cursor for select * from t1;
declare x int; declare x int;
end| end|
--error 1324 --error 1329
create procedure p() create procedure p()
begin begin
declare x int; declare x int;
...@@ -350,7 +350,7 @@ begin ...@@ -350,7 +350,7 @@ begin
declare foo condition for sqlstate '42S99'; declare foo condition for sqlstate '42S99';
end| end|
--error 1325 --error 1330
create procedure p() create procedure p()
begin begin
declare x int; declare x int;
...@@ -375,13 +375,13 @@ drop procedure bug1965| ...@@ -375,13 +375,13 @@ drop procedure bug1965|
# #
# BUG#1966 # BUG#1966
# #
--error 1314 --error 1319
select 1 into a| select 1 into a|
# #
# BUG#336 # BUG#336
# #
--error 1322 --error 1327
create procedure bug336(id char(16)) create procedure bug336(id char(16))
begin begin
declare x int; declare x int;
...@@ -391,7 +391,7 @@ end| ...@@ -391,7 +391,7 @@ end|
# #
# BUG#1654 # BUG#1654
# #
--error 1301 --error 1306
create function bug1654() create function bug1654()
returns int returns int
return (select sum(t.data) from test.t2 t)| return (select sum(t.data) from test.t2 t)|
...@@ -429,7 +429,7 @@ begin ...@@ -429,7 +429,7 @@ begin
fetch c1 into v1; fetch c1 into v1;
end| end|
--error 1313 --error 1318
call bug2259()| call bug2259()|
drop procedure bug2259| drop procedure bug2259|
...@@ -485,7 +485,7 @@ begin ...@@ -485,7 +485,7 @@ begin
end case; end case;
return 2; return 2;
end| end|
--error 1326 --error 1331
select bug3287()| select bug3287()|
drop function bug3287| drop function bug3287|
...@@ -496,7 +496,7 @@ when 0 then ...@@ -496,7 +496,7 @@ when 0 then
when 1 then when 1 then
insert into test.t1 values (x, 1.1); insert into test.t1 values (x, 1.1);
end case| end case|
--error 1326 --error 1331
call bug3287(2)| call bug3287(2)|
drop procedure bug3287| drop procedure bug3287|
......
...@@ -2019,10 +2019,10 @@ build_template( ...@@ -2019,10 +2019,10 @@ build_template(
if (templ_type == ROW_MYSQL_REC_FIELDS && if (templ_type == ROW_MYSQL_REC_FIELDS &&
((prebuilt->read_just_key && !index_contains_field) || ((prebuilt->read_just_key && !index_contains_field) ||
(!(fetch_all_in_key && index_contains_field) (!(fetch_all_in_key && index_contains_field) &&
!(fetch_primary_key_cols && !(fetch_primary_key_cols &&
dict_table_col_in_clustered_key(index->table, i) && dict_table_col_in_clustered_key(index->table, i)) &&
thd->query_id != field->query_id))) { thd->query_id != field->query_id))) {
/* This field is not needed in the query, skip it */ /* This field is not needed in the query, skip it */
......
/* Copyright (C) 2000-2003 MySQL AB /* Copyright (C) 2000-2004 MySQL AB
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
...@@ -56,11 +56,21 @@ static void pretty_print_str(FILE* file, char* str, int len) ...@@ -56,11 +56,21 @@ static void pretty_print_str(FILE* file, char* str, int len)
#endif /* MYSQL_CLIENT */ #endif /* MYSQL_CLIENT */
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
static void clear_all_errors(THD *thd, struct st_relay_log_info *rli)
{
thd->query_error = 0;
thd->clear_error();
*rli->last_slave_error = 0;
rli->last_slave_errno = 0;
}
/* /*
ignored_error_code() Ignore error code specified on command line
*/ */
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
inline int ignored_error_code(int err_code) inline int ignored_error_code(int err_code)
{ {
return ((err_code == ER_SLAVE_IGNORED_TABLE) || return ((err_code == ER_SLAVE_IGNORED_TABLE) ||
...@@ -73,7 +83,7 @@ inline int ignored_error_code(int err_code) ...@@ -73,7 +83,7 @@ inline int ignored_error_code(int err_code)
pretty_print_str() pretty_print_str()
*/ */
#ifndef MYSQL_CLIENT #if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
static char *pretty_print_str(char *packet, char *str, int len) static char *pretty_print_str(char *packet, char *str, int len)
{ {
char *end= str + len; char *end= str + len;
...@@ -349,6 +359,8 @@ Log_event::Log_event(const char* buf, ...@@ -349,6 +359,8 @@ Log_event::Log_event(const char* buf,
int Log_event::exec_event(struct st_relay_log_info* rli) int Log_event::exec_event(struct st_relay_log_info* rli)
{ {
DBUG_ENTER("Log_event::exec_event");
/* /*
rli is null when (as far as I (Guilhem) know) rli is null when (as far as I (Guilhem) know)
the caller is the caller is
...@@ -401,7 +413,7 @@ int Log_event::exec_event(struct st_relay_log_info* rli) ...@@ -401,7 +413,7 @@ int Log_event::exec_event(struct st_relay_log_info* rli)
rli->last_master_timestamp= when; rli->last_master_timestamp= when;
} }
} }
return 0; DBUG_RETURN(0);
} }
...@@ -1047,7 +1059,9 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg, ...@@ -1047,7 +1059,9 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
0 : LOG_EVENT_THREAD_SPECIFIC_F, using_trans), 0 : LOG_EVENT_THREAD_SPECIFIC_F, using_trans),
data_buf(0), query(query_arg), catalog(thd_arg->catalog), data_buf(0), query(query_arg), catalog(thd_arg->catalog),
db(thd_arg->db), q_len((uint32) query_length), db(thd_arg->db), q_len((uint32) query_length),
error_code(thd_arg->killed != THD::NOT_KILLED ? thd->killed_errno() : thd_arg->net.last_errno), error_code((thd_arg->killed != THD::NOT_KILLED) ?
((thd_arg->system_thread & SYSTEM_THREAD_DELAYED_INSERT) ?
0 : thd->killed_errno()) : thd_arg->net.last_errno),
thread_id(thd_arg->thread_id), thread_id(thd_arg->thread_id),
/* save the original thread id; we already know the server id */ /* save the original thread id; we already know the server id */
slave_proxy_id(thd_arg->variables.pseudo_thread_id), slave_proxy_id(thd_arg->variables.pseudo_thread_id),
...@@ -1340,7 +1354,12 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) ...@@ -1340,7 +1354,12 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
END of the current log event (COMMIT). We save it in rli so that InnoDB can END of the current log event (COMMIT). We save it in rli so that InnoDB can
access it. access it.
*/ */
#if MYSQL_VERSION_ID < 50000
rli->future_group_master_log_pos= log_pos + get_event_len();
#else
rli->future_group_master_log_pos= log_pos; rli->future_group_master_log_pos= log_pos;
#endif
clear_all_errors(thd, rli);
if (db_ok(thd->db, replicate_do_db, replicate_ignore_db)) if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
{ {
...@@ -1350,9 +1369,9 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) ...@@ -1350,9 +1369,9 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
VOID(pthread_mutex_lock(&LOCK_thread_count)); VOID(pthread_mutex_lock(&LOCK_thread_count));
thd->query_id = query_id++; thd->query_id = query_id++;
VOID(pthread_mutex_unlock(&LOCK_thread_count)); VOID(pthread_mutex_unlock(&LOCK_thread_count));
thd->query_error= 0; // clear error
thd->clear_error();
thd->variables.pseudo_thread_id= thread_id; // for temp tables thd->variables.pseudo_thread_id= thread_id; // for temp tables
mysql_log.write(thd,COM_QUERY,"%s",thd->query);
DBUG_PRINT("query",("%s",thd->query));
if (flags2_inited) if (flags2_inited)
/* /*
...@@ -1378,97 +1397,105 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) ...@@ -1378,97 +1397,105 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
(ulong) ((thd->variables.sql_mode & MODE_NO_DIR_IN_CREATE) | (ulong) ((thd->variables.sql_mode & MODE_NO_DIR_IN_CREATE) |
(sql_mode & ~(ulong) MODE_NO_DIR_IN_CREATE)); (sql_mode & ~(ulong) MODE_NO_DIR_IN_CREATE));
/* if (ignored_error_code((expected_error= error_code)) ||
Sanity check to make sure the master did not get a really bad
error on the query (for example, if the query on the master was killed, we
don't want to play it on the slave, because we don't know how much of it
we have to play).
*/
if (ignored_error_code((expected_error = error_code)) ||
!check_expected_error(thd,rli,expected_error)) !check_expected_error(thd,rli,expected_error))
{
mysql_log.write(thd,COM_QUERY,"%s",thd->query);
DBUG_PRINT("query",("%s",thd->query));
mysql_parse(thd, thd->query, q_len); mysql_parse(thd, thd->query, q_len);
else
{
/* /*
If we expected a non-zero error code, and we don't get the same error The query got a really bad error on the master (thread killed etc),
code, and none of them should be ignored. which could be inconsistent. Parse it to test the table names: if the
replicate-*-do|ignore-table rules say "this query must be ignored" then
we exit gracefully; otherwise we warn about the bad error and tell DBA
to check/fix it.
*/ */
DBUG_PRINT("info",("expected_error: %d last_errno: %d", if (mysql_test_parse_for_slave(thd, thd->query, q_len))
expected_error, thd->net.last_errno)); clear_all_errors(thd, rli); /* Can ignore query */
if ((expected_error != (actual_error= thd->net.last_errno)) && else
expected_error &&
!ignored_error_code(actual_error) &&
!ignored_error_code(expected_error))
{ {
slave_print_error(rli, 0, slave_print_error(rli,expected_error,
"\ "\
Query '%s' partially completed on the master (error on master: %d) \
and was aborted. There is a chance that your master is inconsistent at this \
point. If you are sure that your master is ok, run this query manually on the \
slave and then restart the slave with SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; \
START SLAVE; .", thd->query, expected_error);
thd->query_error= 1;
}
goto end;
}
/*
If we expected a non-zero error code, and we don't get the same error
code, and none of them should be ignored.
*/
DBUG_PRINT("info",("expected_error: %d last_errno: %d",
expected_error, thd->net.last_errno));
if ((expected_error != (actual_error= thd->net.last_errno)) &&
expected_error &&
!ignored_error_code(actual_error) &&
!ignored_error_code(expected_error))
{
slave_print_error(rli, 0,
"\
Query '%s' caused different errors on master and slave. \ Query '%s' caused different errors on master and slave. \
Error on master: '%s' (%d), Error on slave: '%s' (%d). \ Error on master: '%s' (%d), Error on slave: '%s' (%d). \
Default database: '%s'", Default database: '%s'",
query, query,
ER_SAFE(expected_error), ER_SAFE(expected_error),
expected_error, expected_error,
actual_error ? thd->net.last_error: "no error", actual_error ? thd->net.last_error: "no error",
actual_error, actual_error,
print_slave_db_safe(db)); print_slave_db_safe(db));
thd->query_error= 1; thd->query_error= 1;
} }
/* /*
If we get the same error code as expected, or they should be ignored. If we get the same error code as expected, or they should be ignored.
*/ */
else if (expected_error == actual_error || else if (expected_error == actual_error ||
ignored_error_code(actual_error)) ignored_error_code(actual_error))
{ {
DBUG_PRINT("info",("error ignored")); DBUG_PRINT("info",("error ignored"));
thd->query_error = 0; clear_all_errors(thd, rli);
*rli->last_slave_error = 0; }
rli->last_slave_errno = 0; /*
} Other cases: mostly we expected no error and get one.
/* */
Other cases: mostly we expected no error and get one. else if (thd->query_error || thd->is_fatal_error)
*/ {
else if (thd->query_error || thd->is_fatal_error) slave_print_error(rli,actual_error,
"Error '%s' on query '%s'. Default database: '%s'",
(actual_error ? thd->net.last_error :
"unexpected success or fatal error"),
query,
print_slave_db_safe(db));
thd->query_error= 1;
}
/*
TODO: compare the values of "affected rows" around here. Something
like:
if ((uint32) affected_in_event != (uint32) affected_on_slave)
{ {
slave_print_error(rli,actual_error, sql_print_error("Slave: did not get the expected number of affected \
"Error '%s' on query '%s'. Default database: '%s'", rows running query from master - expected %d, got %d (this numbers \
(actual_error ? thd->net.last_error : should have matched modulo 4294967296).", 0, ...);
"unexpected success or fatal error"), thd->query_error = 1;
query,
print_slave_db_safe(db));
thd->query_error= 1;
} }
/* We may also want an option to tell the slave to ignore "affected"
TODO: compare the values of "affected rows" around here. Something mismatch. This mismatch could be implemented with a new ER_ code, and
like: to ignore it you would use --slave-skip-errors...
if ((uint32) affected_in_event != (uint32) affected_on_slave)
{
sql_print_error("Slave: did not get the expected number of affected \
rows running query from master - expected %d, got %d (this numbers \
should have matched modulo 4294967296).", 0, ...);
thd->query_error = 1;
}
We may also want an option to tell the slave to ignore "affected"
mismatch. This mismatch could be implemented with a new ER_ code, and
to ignore it you would use --slave-skip-errors...
To do the comparison we need to know the value of "affected" which the To do the comparison we need to know the value of "affected" which the
above mysql_parse() computed. And we need to know the value of above mysql_parse() computed. And we need to know the value of
"affected" in the master's binlog. Both will be implemented later. The "affected" in the master's binlog. Both will be implemented later. The
important thing is that we now have the format ready to log the values important thing is that we now have the format ready to log the values
of "affected" in the binlog. So we can release 5.0.0 before effectively of "affected" in the binlog. So we can release 5.0.0 before effectively
logging "affected" and effectively comparing it. logging "affected" and effectively comparing it.
*/
}
/*
End of sanity check. If the test was false, the query got a really bad
error on the master, which could be inconsistent. check_expected_error()
already printed the message to stderr and rli, to tell the DBA to fix
things, and it has set thd->query_error to 1.
*/ */
} /* End of if (db_ok(... */ } /* End of if (db_ok(... */
end:
VOID(pthread_mutex_lock(&LOCK_thread_count)); VOID(pthread_mutex_lock(&LOCK_thread_count));
/* /*
Probably we have set thd->query, thd->db, thd->catalog to point to places Probably we have set thd->query, thd->db, thd->catalog to point to places
...@@ -1634,7 +1661,7 @@ int Start_log_event_v3::exec_event(struct st_relay_log_info* rli) ...@@ -1634,7 +1661,7 @@ int Start_log_event_v3::exec_event(struct st_relay_log_info* rli)
{ {
slave_print_error(rli, 0, "\ slave_print_error(rli, 0, "\
Rolling back unfinished transaction (no COMMIT or ROLLBACK) from relay log. \ Rolling back unfinished transaction (no COMMIT or ROLLBACK) from relay log. \
Probably cause is that the master died while writing the transaction to it's \ A probable cause is that the master died while writing the transaction to its \
binary log."); binary log.");
return(1); return(1);
} }
...@@ -1924,7 +1951,7 @@ void Load_log_event::pack_info(Protocol *protocol) ...@@ -1924,7 +1951,7 @@ void Load_log_event::pack_info(Protocol *protocol)
18 + fname_len + 2 + // "LOAD DATA INFILE 'file''" 18 + fname_len + 2 + // "LOAD DATA INFILE 'file''"
7 + // LOCAL 7 + // LOCAL
9 + // " REPLACE or IGNORE " 9 + // " REPLACE or IGNORE "
11 + table_name_len + // "INTO TABLE table" 13 + table_name_len*2 + // "INTO TABLE `table`"
21 + sql_ex.field_term_len*4 + 2 + // " FIELDS TERMINATED BY 'str'" 21 + sql_ex.field_term_len*4 + 2 + // " FIELDS TERMINATED BY 'str'"
23 + sql_ex.enclosed_len*4 + 2 + // " OPTIONALLY ENCLOSED BY 'str'" 23 + sql_ex.enclosed_len*4 + 2 + // " OPTIONALLY ENCLOSED BY 'str'"
12 + sql_ex.escaped_len*4 + 2 + // " ESCAPED BY 'str'" 12 + sql_ex.escaped_len*4 + 2 + // " ESCAPED BY 'str'"
...@@ -1955,42 +1982,25 @@ void Load_log_event::pack_info(Protocol *protocol) ...@@ -1955,42 +1982,25 @@ void Load_log_event::pack_info(Protocol *protocol)
else if (sql_ex.opt_flags & IGNORE_FLAG) else if (sql_ex.opt_flags & IGNORE_FLAG)
pos= strmov(pos, " IGNORE "); pos= strmov(pos, " IGNORE ");
pos= strmov(pos ,"INTO TABLE "); pos= strmov(pos ,"INTO TABLE `");
memcpy(pos, table_name, table_name_len); memcpy(pos, table_name, table_name_len);
pos+= table_name_len; pos+= table_name_len;
if (sql_ex.field_term_len) /* We have to create all optinal fields as the default is not empty */
{ pos= strmov(pos, "` FIELDS TERMINATED BY ");
pos= strmov(pos, " FIELDS TERMINATED BY "); pos= pretty_print_str(pos, sql_ex.field_term, sql_ex.field_term_len);
pos= pretty_print_str(pos, sql_ex.field_term, sql_ex.field_term_len); if (sql_ex.opt_flags & OPT_ENCLOSED_FLAG)
} pos= strmov(pos, " OPTIONALLY ");
pos= strmov(pos, " ENCLOSED BY ");
if (sql_ex.enclosed_len) pos= pretty_print_str(pos, sql_ex.enclosed, sql_ex.enclosed_len);
{
if (sql_ex.opt_flags & OPT_ENCLOSED_FLAG)
pos= strmov(pos, " OPTIONALLY ");
pos= strmov(pos, " ENCLOSED BY ");
pos= pretty_print_str(pos, sql_ex.enclosed, sql_ex.enclosed_len);
}
if (sql_ex.escaped_len) pos= strmov(pos, " ESCAPED BY ");
{ pos= pretty_print_str(pos, sql_ex.escaped, sql_ex.escaped_len);
pos= strmov(pos, " ESCAPED BY ");
pos= pretty_print_str(pos, sql_ex.escaped, sql_ex.escaped_len);
}
bool line_lexem_added= false;
if (sql_ex.line_term_len)
{
pos= strmov(pos, " LINES TERMINATED BY ");
pos= pretty_print_str(pos, sql_ex.line_term, sql_ex.line_term_len);
line_lexem_added= true;
}
pos= strmov(pos, " LINES TERMINATED BY ");
pos= pretty_print_str(pos, sql_ex.line_term, sql_ex.line_term_len);
if (sql_ex.line_start_len) if (sql_ex.line_start_len)
{ {
if (!line_lexem_added)
pos= strmov(pos," LINES");
pos= strmov(pos, " STARTING BY "); pos= strmov(pos, " STARTING BY ");
pos= pretty_print_str(pos, sql_ex.line_start, sql_ex.line_start_len); pos= pretty_print_str(pos, sql_ex.line_start, sql_ex.line_start_len);
} }
...@@ -2079,7 +2089,7 @@ Load_log_event::Load_log_event(THD *thd_arg, sql_exchange *ex, ...@@ -2079,7 +2089,7 @@ Load_log_event::Load_log_event(THD *thd_arg, sql_exchange *ex,
num_fields(0),fields(0), num_fields(0),fields(0),
field_lens(0),field_block_len(0), field_lens(0),field_block_len(0),
table_name(table_name_arg ? table_name_arg : ""), table_name(table_name_arg ? table_name_arg : ""),
db(db_arg), fname(ex->file_name) db(db_arg), fname(ex->file_name), local_fname(FALSE)
{ {
time_t end_time; time_t end_time;
time(&end_time); time(&end_time);
...@@ -2161,22 +2171,24 @@ Load_log_event::Load_log_event(THD *thd_arg, sql_exchange *ex, ...@@ -2161,22 +2171,24 @@ Load_log_event::Load_log_event(THD *thd_arg, sql_exchange *ex,
Load_log_event::Load_log_event(const char *buf, uint event_len, Load_log_event::Load_log_event(const char *buf, uint event_len,
const Format_description_log_event *description_event) const Format_description_log_event *description_event)
:Log_event(buf, description_event),num_fields(0),fields(0), :Log_event(buf, description_event), num_fields(0), fields(0),
field_lens(0),field_block_len(0), field_lens(0),field_block_len(0),
table_name(0),db(0),fname(0) table_name(0), db(0), fname(0), local_fname(FALSE)
{ {
if (!event_len) // derived class, will call copy_log_event() itself DBUG_ENTER("Load_log_event");
return;
/* /*
I (Guilhem) manually tested replication of LOAD DATA INFILE for 3.23->5.0, I (Guilhem) manually tested replication of LOAD DATA INFILE for 3.23->5.0,
4.0->5.0 and 5.0->5.0 and it works. 4.0->5.0 and 5.0->5.0 and it works.
*/ */
copy_log_event(buf, event_len, if (event_len)
((buf[EVENT_TYPE_OFFSET] == LOAD_EVENT) ? copy_log_event(buf, event_len,
LOAD_HEADER_LEN + ((buf[EVENT_TYPE_OFFSET] == LOAD_EVENT) ?
description_event->common_header_len : LOAD_HEADER_LEN +
LOAD_HEADER_LEN + LOG_EVENT_HEADER_LEN), description_event->common_header_len :
description_event); LOAD_HEADER_LEN + LOG_EVENT_HEADER_LEN),
description_event);
/* otherwise it's a derived class, will call copy_log_event() itself */
DBUG_VOID_RETURN;
} }
...@@ -2188,6 +2200,7 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len, ...@@ -2188,6 +2200,7 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len,
int body_offset, int body_offset,
const Format_description_log_event *description_event) const Format_description_log_event *description_event)
{ {
DBUG_ENTER("Load_log_event::copy_log_event");
uint data_len; uint data_len;
char* buf_end = (char*)buf + event_len; char* buf_end = (char*)buf + event_len;
/* this is the beginning of the post-header */ /* this is the beginning of the post-header */
...@@ -2200,19 +2213,19 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len, ...@@ -2200,19 +2213,19 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len,
num_fields = uint4korr(data_head + L_NUM_FIELDS_OFFSET); num_fields = uint4korr(data_head + L_NUM_FIELDS_OFFSET);
if ((int) event_len < body_offset) if ((int) event_len < body_offset)
return 1; DBUG_RETURN(1);
/* /*
Sql_ex.init() on success returns the pointer to the first byte after Sql_ex.init() on success returns the pointer to the first byte after
the sql_ex structure, which is the start of field lengths array. the sql_ex structure, which is the start of field lengths array.
*/ */
if (!(field_lens=(uchar*)sql_ex.init((char*)buf + body_offset, if (!(field_lens= (uchar*)sql_ex.init((char*)buf + body_offset,
buf_end, buf_end,
buf[EVENT_TYPE_OFFSET] != LOAD_EVENT))) buf[EVENT_TYPE_OFFSET] != LOAD_EVENT)))
return 1; DBUG_RETURN(1);
data_len = event_len - body_offset; data_len = event_len - body_offset;
if (num_fields > data_len) // simple sanity check against corruption if (num_fields > data_len) // simple sanity check against corruption
return 1; DBUG_RETURN(1);
for (uint i = 0; i < num_fields; i++) for (uint i = 0; i < num_fields; i++)
field_block_len += (uint)field_lens[i] + 1; field_block_len += (uint)field_lens[i] + 1;
...@@ -2228,7 +2241,7 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len, ...@@ -2228,7 +2241,7 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len,
DATA INFILE in a completely different way (as a plain-text query) since 4.1 DATA INFILE in a completely different way (as a plain-text query) since 4.1
or 5.0 (Dmitri's WL#874) or 5.0 (Dmitri's WL#874)
*/ */
return 0; DBUG_RETURN(0);
} }
...@@ -2246,6 +2259,7 @@ void Load_log_event::print(FILE* file, bool short_form, LAST_EVENT_INFO* last_ev ...@@ -2246,6 +2259,7 @@ void Load_log_event::print(FILE* file, bool short_form, LAST_EVENT_INFO* last_ev
void Load_log_event::print(FILE* file, bool short_form, LAST_EVENT_INFO* last_event_info, void Load_log_event::print(FILE* file, bool short_form, LAST_EVENT_INFO* last_event_info,
bool commented) bool commented)
{ {
DBUG_ENTER("Load_log_event::print");
if (!short_form) if (!short_form)
{ {
print_header(file); print_header(file);
...@@ -2276,43 +2290,27 @@ void Load_log_event::print(FILE* file, bool short_form, LAST_EVENT_INFO* last_ev ...@@ -2276,43 +2290,27 @@ void Load_log_event::print(FILE* file, bool short_form, LAST_EVENT_INFO* last_ev
else if (sql_ex.opt_flags & IGNORE_FLAG) else if (sql_ex.opt_flags & IGNORE_FLAG)
fprintf(file," IGNORE "); fprintf(file," IGNORE ");
fprintf(file, "INTO TABLE %s ", table_name); fprintf(file, "INTO TABLE `%s`", table_name);
if (sql_ex.field_term) fprintf(file, " FIELDS TERMINATED BY ");
{ pretty_print_str(file, sql_ex.field_term, sql_ex.field_term_len);
fprintf(file, " FIELDS TERMINATED BY ");
pretty_print_str(file, sql_ex.field_term, sql_ex.field_term_len); if (sql_ex.opt_flags & OPT_ENCLOSED_FLAG)
} fprintf(file," OPTIONALLY ");
fprintf(file, " ENCLOSED BY ");
if (sql_ex.enclosed) pretty_print_str(file, sql_ex.enclosed, sql_ex.enclosed_len);
{
if (sql_ex.opt_flags & OPT_ENCLOSED_FLAG)
fprintf(file," OPTIONALLY ");
fprintf(file, " ENCLOSED BY ");
pretty_print_str(file, sql_ex.enclosed, sql_ex.enclosed_len);
}
if (sql_ex.escaped) fprintf(file, " ESCAPED BY ");
{ pretty_print_str(file, sql_ex.escaped, sql_ex.escaped_len);
fprintf(file, " ESCAPED BY ");
pretty_print_str(file, sql_ex.escaped, sql_ex.escaped_len);
}
bool line_lexem_added= false; fprintf(file," LINES TERMINATED BY ");
if (sql_ex.line_term) pretty_print_str(file, sql_ex.line_term, sql_ex.line_term_len);
{
fprintf(file," LINES TERMINATED BY ");
pretty_print_str(file, sql_ex.line_term, sql_ex.line_term_len);
line_lexem_added= true;
}
if (sql_ex.line_start) if (sql_ex.line_start)
{ {
if (!line_lexem_added)
fprintf(file," LINES");
fprintf(file," STARTING BY "); fprintf(file," STARTING BY ");
pretty_print_str(file, sql_ex.line_start, sql_ex.line_start_len); pretty_print_str(file, sql_ex.line_start, sql_ex.line_start_len);
} }
if ((long) skip_lines > 0) if ((long) skip_lines > 0)
fprintf(file, " IGNORE %ld LINES", (long) skip_lines); fprintf(file, " IGNORE %ld LINES", (long) skip_lines);
...@@ -2333,6 +2331,7 @@ void Load_log_event::print(FILE* file, bool short_form, LAST_EVENT_INFO* last_ev ...@@ -2333,6 +2331,7 @@ void Load_log_event::print(FILE* file, bool short_form, LAST_EVENT_INFO* last_ev
} }
fprintf(file, ";\n"); fprintf(file, ";\n");
DBUG_VOID_RETURN;
} }
#endif /* MYSQL_CLIENT */ #endif /* MYSQL_CLIENT */
...@@ -2389,10 +2388,18 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, ...@@ -2389,10 +2388,18 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
DBUG_ASSERT(thd->query == 0); DBUG_ASSERT(thd->query == 0);
thd->query = 0; // Should not be needed thd->query = 0; // Should not be needed
thd->query_error = 0; thd->query_error = 0;
clear_all_errors(thd, rli);
/* Saved for InnoDB, see comment in Query_log_event::exec_event() */ if (!use_rli_only_for_errors)
rli->future_group_master_log_pos= log_pos; {
/* /* Saved for InnoDB, see comment in Query_log_event::exec_event() */
#if MYSQL_VERSION_ID < 50000
rli->future_group_master_log_pos= log_pos + get_event_len();
#else
rli->future_group_master_log_pos= log_pos;
#endif
}
/*
We test replicate_*_db rules. Note that we have already prepared the file We test replicate_*_db rules. Note that we have already prepared the file
to load, even if we are going to ignore and delete it now. So it is to load, even if we are going to ignore and delete it now. So it is
possible that we did a lot of disk writes for nothing. In other words, a possible that we did a lot of disk writes for nothing. In other words, a
...@@ -2417,6 +2424,7 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli, ...@@ -2417,6 +2424,7 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
tables.alias = tables.real_name = (char*)table_name; tables.alias = tables.real_name = (char*)table_name;
tables.lock_type = TL_WRITE; tables.lock_type = TL_WRITE;
tables.updating= 1; tables.updating= 1;
// the table will be opened in mysql_load // the table will be opened in mysql_load
if (table_rules_on && !tables_ok(thd, &tables)) if (table_rules_on && !tables_ok(thd, &tables))
{ {
...@@ -2598,12 +2606,13 @@ Rotate_log_event::Rotate_log_event(const char* buf, uint event_len, ...@@ -2598,12 +2606,13 @@ Rotate_log_event::Rotate_log_event(const char* buf, uint event_len,
const Format_description_log_event* description_event) const Format_description_log_event* description_event)
:Log_event(buf, description_event) ,new_log_ident(NULL),alloced(0) :Log_event(buf, description_event) ,new_log_ident(NULL),alloced(0)
{ {
DBUG_ENTER("Rotate_log_event::Rotate_log_event(char*,...)");
// The caller will ensure that event_len is what we have at EVENT_LEN_OFFSET // The caller will ensure that event_len is what we have at EVENT_LEN_OFFSET
uint8 header_size= description_event->common_header_len; uint8 header_size= description_event->common_header_len;
uint8 post_header_len= description_event->post_header_len[ROTATE_EVENT-1]; uint8 post_header_len= description_event->post_header_len[ROTATE_EVENT-1];
uint ident_offset; uint ident_offset;
if (event_len < header_size) if (event_len < header_size)
return; DBUG_VOID_RETURN;
buf += header_size; buf += header_size;
pos = post_header_len ? uint8korr(buf + R_POS_OFFSET) : 4; pos = post_header_len ? uint8korr(buf + R_POS_OFFSET) : 4;
ident_len = (uint)(event_len - ident_len = (uint)(event_len -
...@@ -2614,8 +2623,9 @@ Rotate_log_event::Rotate_log_event(const char* buf, uint event_len, ...@@ -2614,8 +2623,9 @@ Rotate_log_event::Rotate_log_event(const char* buf, uint event_len,
ident_offset, ident_offset,
(uint) ident_len, (uint) ident_len,
MYF(MY_WME)))) MYF(MY_WME))))
return; DBUG_VOID_RETURN;
alloced = 1; alloced = 1;
DBUG_VOID_RETURN;
} }
...@@ -3098,6 +3108,10 @@ int User_var_log_event::exec_event(struct st_relay_log_info* rli) ...@@ -3098,6 +3108,10 @@ int User_var_log_event::exec_event(struct st_relay_log_info* rli)
} }
} }
Item_func_set_user_var e(user_var_name, it); Item_func_set_user_var e(user_var_name, it);
/*
Item_func_set_user_var can't substitute something else on its place =>
0 can be passed as last argument (reference on item)
*/
e.fix_fields(thd, 0, 0); e.fix_fields(thd, 0, 0);
e.update_hash(val, val_len, type, charset, DERIVATION_NONE); e.update_hash(val, val_len, type, charset, DERIVATION_NONE);
free_root(&thd->mem_root,0); free_root(&thd->mem_root,0);
...@@ -3330,10 +3344,12 @@ Create_file_log_event(THD* thd_arg, sql_exchange* ex, ...@@ -3330,10 +3344,12 @@ Create_file_log_event(THD* thd_arg, sql_exchange* ex,
char* block_arg, uint block_len_arg, bool using_trans) char* block_arg, uint block_len_arg, bool using_trans)
:Load_log_event(thd_arg,ex,db_arg,table_name_arg,fields_arg,handle_dup, :Load_log_event(thd_arg,ex,db_arg,table_name_arg,fields_arg,handle_dup,
using_trans), using_trans),
fake_base(0),block(block_arg),block_len(block_len_arg), fake_base(0), block(block_arg), event_buf(0), block_len(block_len_arg),
file_id(thd_arg->file_id = mysql_bin_log.next_file_id()) file_id(thd_arg->file_id = mysql_bin_log.next_file_id())
{ {
DBUG_ENTER("Create_file_log_event");
sql_ex.force_new_format(); sql_ex.force_new_format();
DBUG_VOID_RETURN;
} }
#endif /* !MYSQL_CLIENT */ #endif /* !MYSQL_CLIENT */
...@@ -3389,18 +3405,20 @@ Create_file_log_event::Create_file_log_event(const char* buf, uint len, ...@@ -3389,18 +3405,20 @@ Create_file_log_event::Create_file_log_event(const char* buf, uint len,
const Format_description_log_event* description_event) const Format_description_log_event* description_event)
:Load_log_event(buf,0,description_event),fake_base(0),block(0),inited_from_old(0) :Load_log_event(buf,0,description_event),fake_base(0),block(0),inited_from_old(0)
{ {
DBUG_ENTER("Create_file_log_event::Create_file_log_event(char*,...)");
uint block_offset; uint block_offset;
uint header_len= description_event->common_header_len; uint header_len= description_event->common_header_len;
uint8 load_header_len= description_event->post_header_len[LOAD_EVENT-1]; uint8 load_header_len= description_event->post_header_len[LOAD_EVENT-1];
uint8 create_file_header_len= description_event->post_header_len[CREATE_FILE_EVENT-1]; uint8 create_file_header_len= description_event->post_header_len[CREATE_FILE_EVENT-1];
if (copy_log_event(buf,len, if (!(event_buf= my_memdup((byte*) buf, len, MYF(MY_WME))) ||
copy_log_event(event_buf,len,
((buf[EVENT_TYPE_OFFSET] == LOAD_EVENT) ? ((buf[EVENT_TYPE_OFFSET] == LOAD_EVENT) ?
load_header_len + header_len : load_header_len + header_len :
(fake_base ? (header_len+load_header_len) : (fake_base ? (header_len+load_header_len) :
(header_len+load_header_len) + (header_len+load_header_len) +
create_file_header_len)), create_file_header_len)),
description_event)) description_event))
return; DBUG_VOID_RETURN;
if (description_event->binlog_version!=1) if (description_event->binlog_version!=1)
{ {
file_id= uint4korr(buf + file_id= uint4korr(buf +
...@@ -3429,6 +3447,7 @@ Create_file_log_event::Create_file_log_event(const char* buf, uint len, ...@@ -3429,6 +3447,7 @@ Create_file_log_event::Create_file_log_event(const char* buf, uint len,
sql_ex.force_new_format(); sql_ex.force_new_format();
inited_from_old = 1; inited_from_old = 1;
} }
DBUG_VOID_RETURN;
} }
...@@ -3582,15 +3601,17 @@ Append_block_log_event::Append_block_log_event(const char* buf, uint len, ...@@ -3582,15 +3601,17 @@ Append_block_log_event::Append_block_log_event(const char* buf, uint len,
const Format_description_log_event* description_event) const Format_description_log_event* description_event)
:Log_event(buf, description_event),block(0) :Log_event(buf, description_event),block(0)
{ {
DBUG_ENTER("Append_block_log_event::Append_block_log_event(char*,...)");
uint8 common_header_len= description_event->common_header_len; uint8 common_header_len= description_event->common_header_len;
uint8 append_block_header_len= uint8 append_block_header_len=
description_event->post_header_len[APPEND_BLOCK_EVENT-1]; description_event->post_header_len[APPEND_BLOCK_EVENT-1];
uint total_header_len= common_header_len+append_block_header_len; uint total_header_len= common_header_len+append_block_header_len;
if (len < total_header_len) if (len < total_header_len)
return; DBUG_VOID_RETURN;
file_id= uint4korr(buf + common_header_len + AB_FILE_ID_OFFSET); file_id= uint4korr(buf + common_header_len + AB_FILE_ID_OFFSET);
block= (char*)buf + total_header_len; block= (char*)buf + total_header_len;
block_len= len - total_header_len; block_len= len - total_header_len;
DBUG_VOID_RETURN;
} }
...@@ -3653,6 +3674,7 @@ int Append_block_log_event::exec_event(struct st_relay_log_info* rli) ...@@ -3653,6 +3674,7 @@ int Append_block_log_event::exec_event(struct st_relay_log_info* rli)
char *p= slave_load_file_stem(fname, file_id, server_id); char *p= slave_load_file_stem(fname, file_id, server_id);
int fd; int fd;
int error = 1; int error = 1;
DBUG_ENTER("Append_block_log_event::exec_event");
memcpy(p, ".data", 6); memcpy(p, ".data", 6);
if ((fd = my_open(fname, O_WRONLY|O_APPEND|O_BINARY, MYF(MY_WME))) < 0) if ((fd = my_open(fname, O_WRONLY|O_APPEND|O_BINARY, MYF(MY_WME))) < 0)
...@@ -3670,7 +3692,7 @@ int Append_block_log_event::exec_event(struct st_relay_log_info* rli) ...@@ -3670,7 +3692,7 @@ int Append_block_log_event::exec_event(struct st_relay_log_info* rli)
err: err:
if (fd >= 0) if (fd >= 0)
my_close(fd, MYF(0)); my_close(fd, MYF(0));
return error ? error : Log_event::exec_event(rli); DBUG_RETURN(error ? error : Log_event::exec_event(rli));
} }
#endif #endif
...@@ -3880,6 +3902,12 @@ int Execute_load_log_event::exec_event(struct st_relay_log_info* rli) ...@@ -3880,6 +3902,12 @@ int Execute_load_log_event::exec_event(struct st_relay_log_info* rli)
lev->exec_event is the place where the table is loaded (it calls lev->exec_event is the place where the table is loaded (it calls
mysql_load()). mysql_load()).
*/ */
#if MYSQL_VERSION_ID < 50000
rli->future_group_master_log_pos= log_pos + get_event_len();
#else
rli->future_group_master_log_pos= log_pos;
#endif
if (lev->exec_event(0,rli,1)) if (lev->exec_event(0,rli,1))
{ {
/* /*
......
...@@ -19,18 +19,18 @@ ...@@ -19,18 +19,18 @@
To add a new variable, one has to do the following: To add a new variable, one has to do the following:
- If the variable is thread specific, add it to 'system_variables' struct.
If not, add it to mysqld.cc and an declaration in 'mysql_priv.h'
- Don't forget to initialize new fields in global_system_variables and
max_system_variables!
- Use one of the 'sys_var... classes from set_var.h or write a specific - Use one of the 'sys_var... classes from set_var.h or write a specific
one for the variable type. one for the variable type.
- Define it in the 'variable definition list' in this file. - Define it in the 'variable definition list' in this file.
- If the variable should be changeable or one should be able to access it - If the variable should be changeable or one should be able to access it
with @@variable_name, it should be added to the 'list of all variables' with @@variable_name, it should be added to the 'list of all variables'
list in this file. list (sys_variables) in this file.
- If the variable is thread specific, add it to 'system_variables' struct.
If not, add it to mysqld.cc and an declaration in 'mysql_priv.h'
- If the variable should be changed from the command line, add a definition - If the variable should be changed from the command line, add a definition
of it in the my_option structure list in mysqld.dcc of it in the my_option structure list in mysqld.dcc
- Don't forget to initialize new fields in global_system_variables and
max_system_variables!
- If the variable should show up in 'show variables' add it to the - If the variable should show up in 'show variables' add it to the
init_vars[] struct in this file init_vars[] struct in this file
...@@ -73,16 +73,21 @@ TYPELIB delay_key_write_typelib= ...@@ -73,16 +73,21 @@ TYPELIB delay_key_write_typelib=
array_elements(delay_key_write_type_names)-1, "", delay_key_write_type_names array_elements(delay_key_write_type_names)-1, "", delay_key_write_type_names
}; };
static bool sys_check_charset(THD *thd, set_var *var); static int sys_check_charset(THD *thd, set_var *var);
static bool sys_update_charset(THD *thd, set_var *var); static bool sys_update_charset(THD *thd, set_var *var);
static void sys_set_default_charset(THD *thd, enum_var_type type); static void sys_set_default_charset(THD *thd, enum_var_type type);
static int sys_check_ftb_syntax(THD *thd, set_var *var);
static bool sys_update_ftb_syntax(THD *thd, set_var * var);
static void sys_default_ftb_syntax(THD *thd, enum_var_type type);
static bool sys_update_init_connect(THD*, set_var*); static bool sys_update_init_connect(THD*, set_var*);
static void sys_default_init_connect(THD*, enum_var_type type); static void sys_default_init_connect(THD*, enum_var_type type);
static bool sys_update_init_slave(THD*, set_var*); static bool sys_update_init_slave(THD*, set_var*);
static void sys_default_init_slave(THD*, enum_var_type type); static void sys_default_init_slave(THD*, enum_var_type type);
static bool set_option_bit(THD *thd, set_var *var); static bool set_option_bit(THD *thd, set_var *var);
static bool set_option_autocommit(THD *thd, set_var *var); static bool set_option_autocommit(THD *thd, set_var *var);
static int check_log_update(THD *thd, set_var *var);
static bool set_log_update(THD *thd, set_var *var); static bool set_log_update(THD *thd, set_var *var);
static int check_pseudo_thread_id(THD *thd, set_var *var);
static bool set_log_bin(THD *thd, set_var *var); static bool set_log_bin(THD *thd, set_var *var);
static void fix_low_priority_updates(THD *thd, enum_var_type type); static void fix_low_priority_updates(THD *thd, enum_var_type type);
static void fix_tx_isolation(THD *thd, enum_var_type type); static void fix_tx_isolation(THD *thd, enum_var_type type);
...@@ -97,6 +102,8 @@ static void fix_myisam_max_sort_file_size(THD *thd, enum_var_type type); ...@@ -97,6 +102,8 @@ static void fix_myisam_max_sort_file_size(THD *thd, enum_var_type type);
static void fix_max_binlog_size(THD *thd, enum_var_type type); static void fix_max_binlog_size(THD *thd, enum_var_type type);
static void fix_max_relay_log_size(THD *thd, enum_var_type type); static void fix_max_relay_log_size(THD *thd, enum_var_type type);
static void fix_max_connections(THD *thd, enum_var_type type); static void fix_max_connections(THD *thd, enum_var_type type);
static void fix_thd_mem_root(THD *thd, enum_var_type type);
static void fix_trans_mem_root(THD *thd, enum_var_type type);
static KEY_CACHE *create_key_cache(const char *name, uint length); static KEY_CACHE *create_key_cache(const char *name, uint length);
void fix_sql_mode_var(THD *thd, enum_var_type type); void fix_sql_mode_var(THD *thd, enum_var_type type);
static byte *get_error_count(THD *thd); static byte *get_error_count(THD *thd);
...@@ -117,13 +124,8 @@ sys_var_character_set_server sys_character_set_server("character_set_server"); ...@@ -117,13 +124,8 @@ sys_var_character_set_server sys_character_set_server("character_set_server");
sys_var_str sys_charset_system("character_set_system", sys_var_str sys_charset_system("character_set_system",
sys_check_charset, sys_check_charset,
sys_update_charset, sys_update_charset,
sys_set_default_charset); sys_set_default_charset,
sys_var_str sys_init_connect("init_connect", 0, (char *)my_charset_utf8_general_ci.name);
sys_update_init_connect,
sys_default_init_connect);
sys_var_str sys_init_slave("init_slave", 0,
sys_update_init_slave,
sys_default_init_slave);
sys_var_character_set_database sys_character_set_database("character_set_database"); sys_var_character_set_database sys_character_set_database("character_set_database");
sys_var_character_set_client sys_character_set_client("character_set_client"); sys_var_character_set_client sys_character_set_client("character_set_client");
sys_var_character_set_connection sys_character_set_connection("character_set_connection"); sys_var_character_set_connection sys_character_set_connection("character_set_connection");
...@@ -149,6 +151,17 @@ sys_var_long_ptr sys_expire_logs_days("expire_logs_days", ...@@ -149,6 +151,17 @@ sys_var_long_ptr sys_expire_logs_days("expire_logs_days",
&expire_logs_days); &expire_logs_days);
sys_var_bool_ptr sys_flush("flush", &myisam_flush); sys_var_bool_ptr sys_flush("flush", &myisam_flush);
sys_var_long_ptr sys_flush_time("flush_time", &flush_time); sys_var_long_ptr sys_flush_time("flush_time", &flush_time);
sys_var_str sys_ft_boolean_syntax("ft_boolean_syntax",
sys_check_ftb_syntax,
sys_update_ftb_syntax,
sys_default_ftb_syntax,
ft_boolean_syntax);
sys_var_str sys_init_connect("init_connect", 0,
sys_update_init_connect,
sys_default_init_connect,0);
sys_var_str sys_init_slave("init_slave", 0,
sys_update_init_slave,
sys_default_init_slave,0);
sys_var_thd_ulong sys_interactive_timeout("interactive_timeout", sys_var_thd_ulong sys_interactive_timeout("interactive_timeout",
&SV::net_interactive_timeout); &SV::net_interactive_timeout);
sys_var_thd_ulong sys_join_buffer_size("join_buffer_size", sys_var_thd_ulong sys_join_buffer_size("join_buffer_size",
...@@ -188,26 +201,25 @@ sys_var_long_ptr sys_max_connections("max_connections", ...@@ -188,26 +201,25 @@ sys_var_long_ptr sys_max_connections("max_connections",
fix_max_connections); fix_max_connections);
sys_var_long_ptr sys_max_connect_errors("max_connect_errors", sys_var_long_ptr sys_max_connect_errors("max_connect_errors",
&max_connect_errors); &max_connect_errors);
sys_var_long_ptr sys_max_delayed_threads("max_delayed_threads", sys_var_thd_ulong sys_max_insert_delayed_threads("max_insert_delayed_threads",
&max_insert_delayed_threads, &SV::max_insert_delayed_threads);
fix_max_connections); sys_var_thd_ulong sys_max_delayed_threads("max_delayed_threads",
&SV::max_insert_delayed_threads,
0, fix_max_connections);
sys_var_thd_ulong sys_max_error_count("max_error_count", sys_var_thd_ulong sys_max_error_count("max_error_count",
&SV::max_error_count); &SV::max_error_count);
sys_var_thd_ulong sys_max_heap_table_size("max_heap_table_size", sys_var_thd_ulong sys_max_heap_table_size("max_heap_table_size",
&SV::max_heap_table_size); &SV::max_heap_table_size);
/* sys_var_thd_ulong sys_pseudo_thread_id("pseudo_thread_id",
sys_pseudo_thread_id has its own class (instead of sys_var_thd_ulong) because &SV::pseudo_thread_id,
we want a check() function. check_pseudo_thread_id, 0);
*/
sys_var_pseudo_thread_id sys_pseudo_thread_id("pseudo_thread_id",
&SV::pseudo_thread_id);
sys_var_thd_ha_rows sys_max_join_size("max_join_size", sys_var_thd_ha_rows sys_max_join_size("max_join_size",
&SV::max_join_size, &SV::max_join_size,
fix_max_join_size); fix_max_join_size);
sys_var_thd_ulong sys_max_seeks_for_key("max_seeks_for_key", sys_var_thd_ulong sys_max_seeks_for_key("max_seeks_for_key",
&SV::max_seeks_for_key); &SV::max_seeks_for_key);
sys_var_thd_ulong sys_max_length_for_sort_data("max_length_for_sort_data", sys_var_thd_ulong sys_max_length_for_sort_data("max_length_for_sort_data",
&SV::max_length_for_sort_data); &SV::max_length_for_sort_data);
#ifndef TO_BE_DELETED /* Alias for max_join_size */ #ifndef TO_BE_DELETED /* Alias for max_join_size */
sys_var_thd_ha_rows sys_sql_max_join_size("sql_max_join_size", sys_var_thd_ha_rows sys_sql_max_join_size("sql_max_join_size",
&SV::max_join_size, &SV::max_join_size,
...@@ -232,13 +244,13 @@ sys_var_thd_ulong sys_net_buffer_length("net_buffer_length", ...@@ -232,13 +244,13 @@ sys_var_thd_ulong sys_net_buffer_length("net_buffer_length",
&SV::net_buffer_length); &SV::net_buffer_length);
sys_var_thd_ulong sys_net_read_timeout("net_read_timeout", sys_var_thd_ulong sys_net_read_timeout("net_read_timeout",
&SV::net_read_timeout, &SV::net_read_timeout,
fix_net_read_timeout); 0, fix_net_read_timeout);
sys_var_thd_ulong sys_net_write_timeout("net_write_timeout", sys_var_thd_ulong sys_net_write_timeout("net_write_timeout",
&SV::net_write_timeout, &SV::net_write_timeout,
fix_net_write_timeout); 0, fix_net_write_timeout);
sys_var_thd_ulong sys_net_retry_count("net_retry_count", sys_var_thd_ulong sys_net_retry_count("net_retry_count",
&SV::net_retry_count, &SV::net_retry_count,
fix_net_retry_count); 0, fix_net_retry_count);
sys_var_thd_bool sys_new_mode("new", &SV::new_mode); sys_var_thd_bool sys_new_mode("new", &SV::new_mode);
sys_var_thd_bool sys_old_passwords("old_passwords", &SV::old_passwords); sys_var_thd_bool sys_old_passwords("old_passwords", &SV::old_passwords);
sys_var_thd_ulong sys_preload_buff_size("preload_buffer_size", sys_var_thd_ulong sys_preload_buff_size("preload_buffer_size",
...@@ -261,13 +273,17 @@ sys_var_long_ptr sys_query_cache_size("query_cache_size", ...@@ -261,13 +273,17 @@ sys_var_long_ptr sys_query_cache_size("query_cache_size",
sys_var_thd_ulong sys_range_alloc_block_size("range_alloc_block_size", sys_var_thd_ulong sys_range_alloc_block_size("range_alloc_block_size",
&SV::range_alloc_block_size); &SV::range_alloc_block_size);
sys_var_thd_ulong sys_query_alloc_block_size("query_alloc_block_size", sys_var_thd_ulong sys_query_alloc_block_size("query_alloc_block_size",
&SV::query_alloc_block_size); &SV::query_alloc_block_size,
0, fix_thd_mem_root);
sys_var_thd_ulong sys_query_prealloc_size("query_prealloc_size", sys_var_thd_ulong sys_query_prealloc_size("query_prealloc_size",
&SV::query_prealloc_size); &SV::query_prealloc_size,
0, fix_thd_mem_root);
sys_var_thd_ulong sys_trans_alloc_block_size("transaction_alloc_block_size", sys_var_thd_ulong sys_trans_alloc_block_size("transaction_alloc_block_size",
&SV::trans_alloc_block_size); &SV::trans_alloc_block_size,
0, fix_trans_mem_root);
sys_var_thd_ulong sys_trans_prealloc_size("transaction_prealloc_size", sys_var_thd_ulong sys_trans_prealloc_size("transaction_prealloc_size",
&SV::trans_prealloc_size); &SV::trans_prealloc_size,
0, fix_trans_mem_root);
#ifdef HAVE_QUERY_CACHE #ifdef HAVE_QUERY_CACHE
sys_var_long_ptr sys_query_cache_limit("query_cache_limit", sys_var_long_ptr sys_query_cache_limit("query_cache_limit",
...@@ -278,6 +294,9 @@ sys_var_long_ptr sys_query_cache_min_res_unit("query_cache_min_res_unit", ...@@ -278,6 +294,9 @@ sys_var_long_ptr sys_query_cache_min_res_unit("query_cache_min_res_unit",
sys_var_thd_enum sys_query_cache_type("query_cache_type", sys_var_thd_enum sys_query_cache_type("query_cache_type",
&SV::query_cache_type, &SV::query_cache_type,
&query_cache_type_typelib); &query_cache_type_typelib);
sys_var_thd_bool
sys_query_cache_wlock_invalidate("query_cache_wlock_invalidate",
&SV::query_cache_wlock_invalidate);
#endif /* HAVE_QUERY_CACHE */ #endif /* HAVE_QUERY_CACHE */
sys_var_bool_ptr sys_secure_auth("secure_auth", &opt_secure_auth); sys_var_bool_ptr sys_secure_auth("secure_auth", &opt_secure_auth);
sys_var_long_ptr sys_server_id("server_id",&server_id); sys_var_long_ptr sys_server_id("server_id",&server_id);
...@@ -313,7 +332,7 @@ sys_var_thd_ulong sys_net_wait_timeout("wait_timeout", ...@@ -313,7 +332,7 @@ sys_var_thd_ulong sys_net_wait_timeout("wait_timeout",
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
sys_var_long_ptr sys_innodb_max_dirty_pages_pct("innodb_max_dirty_pages_pct", sys_var_long_ptr sys_innodb_max_dirty_pages_pct("innodb_max_dirty_pages_pct",
&srv_max_buf_pool_modified_pct); &srv_max_buf_pool_modified_pct);
#endif #endif
/* Time/date/datetime formats */ /* Time/date/datetime formats */
...@@ -329,50 +348,52 @@ sys_var_thd_date_time_format sys_datetime_format("datetime_format", ...@@ -329,50 +348,52 @@ sys_var_thd_date_time_format sys_datetime_format("datetime_format",
/* Variables that are bits in THD */ /* Variables that are bits in THD */
static sys_var_thd_bit sys_autocommit("autocommit", static sys_var_thd_bit sys_autocommit("autocommit", 0,
set_option_autocommit, set_option_autocommit,
OPTION_NOT_AUTOCOMMIT, OPTION_NOT_AUTOCOMMIT,
1); 1);
static sys_var_thd_bit sys_big_tables("big_tables", static sys_var_thd_bit sys_big_tables("big_tables", 0,
set_option_bit, set_option_bit,
OPTION_BIG_TABLES); OPTION_BIG_TABLES);
#ifndef TO_BE_DELETED /* Alias for big_tables */ #ifndef TO_BE_DELETED /* Alias for big_tables */
static sys_var_thd_bit sys_sql_big_tables("sql_big_tables", static sys_var_thd_bit sys_sql_big_tables("sql_big_tables", 0,
set_option_bit, set_option_bit,
OPTION_BIG_TABLES); OPTION_BIG_TABLES);
#endif #endif
static sys_var_thd_bit sys_big_selects("sql_big_selects", static sys_var_thd_bit sys_big_selects("sql_big_selects", 0,
set_option_bit, set_option_bit,
OPTION_BIG_SELECTS); OPTION_BIG_SELECTS);
static sys_var_thd_bit sys_log_off("sql_log_off", static sys_var_thd_bit sys_log_off("sql_log_off", 0,
set_option_bit, set_option_bit,
OPTION_LOG_OFF); OPTION_LOG_OFF);
static sys_var_thd_bit sys_log_update("sql_log_update", static sys_var_thd_bit sys_log_update("sql_log_update",
check_log_update,
set_log_update, set_log_update,
OPTION_UPDATE_LOG); OPTION_UPDATE_LOG);
static sys_var_thd_bit sys_log_binlog("sql_log_bin", static sys_var_thd_bit sys_log_binlog("sql_log_bin",
set_log_bin, check_log_update,
OPTION_BIN_LOG); set_log_bin,
static sys_var_thd_bit sys_sql_warnings("sql_warnings", OPTION_BIN_LOG);
static sys_var_thd_bit sys_sql_warnings("sql_warnings", 0,
set_option_bit, set_option_bit,
OPTION_WARNINGS); OPTION_WARNINGS);
static sys_var_thd_bit sys_auto_is_null("sql_auto_is_null", static sys_var_thd_bit sys_auto_is_null("sql_auto_is_null", 0,
set_option_bit, set_option_bit,
OPTION_AUTO_IS_NULL); OPTION_AUTO_IS_NULL);
static sys_var_thd_bit sys_safe_updates("sql_safe_updates", static sys_var_thd_bit sys_safe_updates("sql_safe_updates", 0,
set_option_bit, set_option_bit,
OPTION_SAFE_UPDATES); OPTION_SAFE_UPDATES);
static sys_var_thd_bit sys_buffer_results("sql_buffer_result", static sys_var_thd_bit sys_buffer_results("sql_buffer_result", 0,
set_option_bit, set_option_bit,
OPTION_BUFFER_RESULT); OPTION_BUFFER_RESULT);
static sys_var_thd_bit sys_quote_show_create("sql_quote_show_create", static sys_var_thd_bit sys_quote_show_create("sql_quote_show_create", 0,
set_option_bit, set_option_bit,
OPTION_QUOTE_SHOW_CREATE); OPTION_QUOTE_SHOW_CREATE);
static sys_var_thd_bit sys_foreign_key_checks("foreign_key_checks", static sys_var_thd_bit sys_foreign_key_checks("foreign_key_checks", 0,
set_option_bit, set_option_bit,
OPTION_NO_FOREIGN_KEY_CHECKS, OPTION_NO_FOREIGN_KEY_CHECKS,
1); 1);
static sys_var_thd_bit sys_unique_checks("unique_checks", static sys_var_thd_bit sys_unique_checks("unique_checks", 0,
set_option_bit, set_option_bit,
OPTION_RELAXED_UNIQUE_CHECKS, OPTION_RELAXED_UNIQUE_CHECKS,
1); 1);
...@@ -407,6 +428,16 @@ static sys_var_thd_ulong sys_default_week_format("default_week_format", ...@@ -407,6 +428,16 @@ static sys_var_thd_ulong sys_default_week_format("default_week_format",
sys_var_thd_ulong sys_group_concat_max_len("group_concat_max_len", sys_var_thd_ulong sys_group_concat_max_len("group_concat_max_len",
&SV::group_concat_max_len); &SV::group_concat_max_len);
/* Read only variables */
sys_var_const_str sys_os("version_compile_os", SYSTEM_TYPE);
/* Global read-only variable describing server license */
sys_var_const_str sys_license("license", LICENSE);
/* /*
List of all variables for initialisation and storage in hash List of all variables for initialisation and storage in hash
This is sorted in alphabetical order to make it easy to add new variables This is sorted in alphabetical order to make it easy to add new variables
...@@ -445,6 +476,7 @@ sys_var *sys_variables[]= ...@@ -445,6 +476,7 @@ sys_var *sys_variables[]=
&sys_expire_logs_days, &sys_expire_logs_days,
&sys_flush, &sys_flush,
&sys_flush_time, &sys_flush_time,
&sys_ft_boolean_syntax,
&sys_foreign_key_checks, &sys_foreign_key_checks,
&sys_group_concat_max_len, &sys_group_concat_max_len,
&sys_identity, &sys_identity,
...@@ -458,6 +490,7 @@ sys_var *sys_variables[]= ...@@ -458,6 +490,7 @@ sys_var *sys_variables[]=
&sys_key_cache_division_limit, &sys_key_cache_division_limit,
&sys_key_cache_age_threshold, &sys_key_cache_age_threshold,
&sys_last_insert_id, &sys_last_insert_id,
&sys_license,
&sys_local_infile, &sys_local_infile,
&sys_log_binlog, &sys_log_binlog,
&sys_log_off, &sys_log_off,
...@@ -472,6 +505,7 @@ sys_var *sys_variables[]= ...@@ -472,6 +505,7 @@ sys_var *sys_variables[]=
&sys_max_connections, &sys_max_connections,
&sys_max_delayed_threads, &sys_max_delayed_threads,
&sys_max_error_count, &sys_max_error_count,
&sys_max_insert_delayed_threads,
&sys_max_heap_table_size, &sys_max_heap_table_size,
&sys_max_join_size, &sys_max_join_size,
&sys_max_length_for_sort_data, &sys_max_length_for_sort_data,
...@@ -501,6 +535,7 @@ sys_var *sys_variables[]= ...@@ -501,6 +535,7 @@ sys_var *sys_variables[]=
&sys_query_cache_limit, &sys_query_cache_limit,
&sys_query_cache_min_res_unit, &sys_query_cache_min_res_unit,
&sys_query_cache_type, &sys_query_cache_type,
&sys_query_cache_wlock_invalidate,
#endif /* HAVE_QUERY_CACHE */ #endif /* HAVE_QUERY_CACHE */
&sys_quote_show_create, &sys_quote_show_create,
&sys_rand_seed1, &sys_rand_seed1,
...@@ -539,6 +574,7 @@ sys_var *sys_variables[]= ...@@ -539,6 +574,7 @@ sys_var *sys_variables[]=
&sys_trans_alloc_block_size, &sys_trans_alloc_block_size,
&sys_trans_prealloc_size, &sys_trans_prealloc_size,
&sys_tx_isolation, &sys_tx_isolation,
&sys_os,
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
&sys_innodb_max_dirty_pages_pct, &sys_innodb_max_dirty_pages_pct,
#endif #endif
...@@ -556,22 +592,22 @@ struct show_var_st init_vars[]= { ...@@ -556,22 +592,22 @@ struct show_var_st init_vars[]= {
{"basedir", mysql_home, SHOW_CHAR}, {"basedir", mysql_home, SHOW_CHAR},
#ifdef HAVE_BERKELEY_DB #ifdef HAVE_BERKELEY_DB
{"bdb_cache_size", (char*) &berkeley_cache_size, SHOW_LONG}, {"bdb_cache_size", (char*) &berkeley_cache_size, SHOW_LONG},
{"bdb_log_buffer_size", (char*) &berkeley_log_buffer_size, SHOW_LONG},
{"bdb_home", (char*) &berkeley_home, SHOW_CHAR_PTR}, {"bdb_home", (char*) &berkeley_home, SHOW_CHAR_PTR},
{"bdb_max_lock", (char*) &berkeley_max_lock, SHOW_LONG},
{"bdb_logdir", (char*) &berkeley_logdir, SHOW_CHAR_PTR}, {"bdb_logdir", (char*) &berkeley_logdir, SHOW_CHAR_PTR},
{"bdb_log_buffer_size", (char*) &berkeley_log_buffer_size, SHOW_LONG},
{"bdb_max_lock", (char*) &berkeley_max_lock, SHOW_LONG},
{"bdb_shared_data", (char*) &berkeley_shared_data, SHOW_BOOL}, {"bdb_shared_data", (char*) &berkeley_shared_data, SHOW_BOOL},
{"bdb_tmpdir", (char*) &berkeley_tmpdir, SHOW_CHAR_PTR}, {"bdb_tmpdir", (char*) &berkeley_tmpdir, SHOW_CHAR_PTR},
#endif #endif
{sys_binlog_cache_size.name,(char*) &sys_binlog_cache_size, SHOW_SYS}, {sys_binlog_cache_size.name,(char*) &sys_binlog_cache_size, SHOW_SYS},
{sys_bulk_insert_buff_size.name,(char*) &sys_bulk_insert_buff_size,SHOW_SYS}, {sys_bulk_insert_buff_size.name,(char*) &sys_bulk_insert_buff_size,SHOW_SYS},
{sys_character_set_server.name, (char*) &sys_character_set_server,SHOW_SYS},
{sys_charset_system.name, (char*) &sys_charset_system, SHOW_SYS},
{sys_character_set_database.name, (char*) &sys_character_set_database,SHOW_SYS},
{sys_character_set_client.name,(char*) &sys_character_set_client, SHOW_SYS}, {sys_character_set_client.name,(char*) &sys_character_set_client, SHOW_SYS},
{sys_character_set_connection.name,(char*) &sys_character_set_connection,SHOW_SYS}, {sys_character_set_connection.name,(char*) &sys_character_set_connection,SHOW_SYS},
{"character-sets-dir", mysql_charsets_dir, SHOW_CHAR}, {sys_character_set_database.name, (char*) &sys_character_set_database,SHOW_SYS},
{sys_character_set_results.name,(char*) &sys_character_set_results, SHOW_SYS}, {sys_character_set_results.name,(char*) &sys_character_set_results, SHOW_SYS},
{sys_character_set_server.name, (char*) &sys_character_set_server,SHOW_SYS},
{sys_charset_system.name, (char*) &sys_charset_system, SHOW_SYS},
{"character_sets_dir", mysql_charsets_dir, SHOW_CHAR},
{sys_collation_connection.name,(char*) &sys_collation_connection, SHOW_SYS}, {sys_collation_connection.name,(char*) &sys_collation_connection, SHOW_SYS},
{sys_collation_database.name,(char*) &sys_collation_database, SHOW_SYS}, {sys_collation_database.name,(char*) &sys_collation_database, SHOW_SYS},
{sys_collation_server.name,(char*) &sys_collation_server, SHOW_SYS}, {sys_collation_server.name,(char*) &sys_collation_server, SHOW_SYS},
...@@ -588,37 +624,36 @@ struct show_var_st init_vars[]= { ...@@ -588,37 +624,36 @@ struct show_var_st init_vars[]= {
{sys_expire_logs_days.name, (char*) &sys_expire_logs_days, SHOW_SYS}, {sys_expire_logs_days.name, (char*) &sys_expire_logs_days, SHOW_SYS},
{sys_flush.name, (char*) &sys_flush, SHOW_SYS}, {sys_flush.name, (char*) &sys_flush, SHOW_SYS},
{sys_flush_time.name, (char*) &sys_flush_time, SHOW_SYS}, {sys_flush_time.name, (char*) &sys_flush_time, SHOW_SYS},
{"ft_boolean_syntax", (char*) ft_boolean_syntax, SHOW_CHAR}, {sys_ft_boolean_syntax.name,(char*) &ft_boolean_syntax, SHOW_CHAR},
{"ft_min_word_len", (char*) &ft_min_word_len, SHOW_LONG},
{"ft_max_word_len", (char*) &ft_max_word_len, SHOW_LONG}, {"ft_max_word_len", (char*) &ft_max_word_len, SHOW_LONG},
{"ft_min_word_len", (char*) &ft_min_word_len, SHOW_LONG},
{"ft_query_expansion_limit",(char*) &ft_query_expansion_limit, SHOW_LONG}, {"ft_query_expansion_limit",(char*) &ft_query_expansion_limit, SHOW_LONG},
{"ft_stopword_file", (char*) &ft_stopword_file, SHOW_CHAR_PTR}, {"ft_stopword_file", (char*) &ft_stopword_file, SHOW_CHAR_PTR},
{sys_group_concat_max_len.name, (char*) &sys_group_concat_max_len, SHOW_SYS},
{"have_bdb", (char*) &have_berkeley_db, SHOW_HAVE}, {"have_bdb", (char*) &have_berkeley_db, SHOW_HAVE},
{"have_crypt", (char*) &have_crypt, SHOW_HAVE},
{"have_compress", (char*) &have_compress, SHOW_HAVE}, {"have_compress", (char*) &have_compress, SHOW_HAVE},
{"have_crypt", (char*) &have_crypt, SHOW_HAVE},
{"have_innodb", (char*) &have_innodb, SHOW_HAVE}, {"have_innodb", (char*) &have_innodb, SHOW_HAVE},
{"have_isam", (char*) &have_isam, SHOW_HAVE}, {"have_isam", (char*) &have_isam, SHOW_HAVE},
{"have_raid", (char*) &have_raid, SHOW_HAVE},
{"have_symlink", (char*) &have_symlink, SHOW_HAVE},
{"have_openssl", (char*) &have_openssl, SHOW_HAVE}, {"have_openssl", (char*) &have_openssl, SHOW_HAVE},
{"have_query_cache", (char*) &have_query_cache, SHOW_HAVE}, {"have_query_cache", (char*) &have_query_cache, SHOW_HAVE},
{"init_file", (char*) &opt_init_file, SHOW_CHAR_PTR}, {"have_raid", (char*) &have_raid, SHOW_HAVE},
{"have_symlink", (char*) &have_symlink, SHOW_HAVE},
{"init_connect", (char*) &sys_init_connect, SHOW_SYS}, {"init_connect", (char*) &sys_init_connect, SHOW_SYS},
{"init_file", (char*) &opt_init_file, SHOW_CHAR_PTR},
{"init_slave", (char*) &sys_init_slave, SHOW_SYS}, {"init_slave", (char*) &sys_init_slave, SHOW_SYS},
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
{"innodb_additional_mem_pool_size", (char*) &innobase_additional_mem_pool_size, SHOW_LONG }, {"innodb_additional_mem_pool_size", (char*) &innobase_additional_mem_pool_size, SHOW_LONG },
{"innodb_buffer_pool_size", (char*) &innobase_buffer_pool_size, SHOW_LONG },
{"innodb_buffer_pool_awe_mem_mb", (char*) &innobase_buffer_pool_awe_mem_mb, SHOW_LONG }, {"innodb_buffer_pool_awe_mem_mb", (char*) &innobase_buffer_pool_awe_mem_mb, SHOW_LONG },
{"innodb_buffer_pool_size", (char*) &innobase_buffer_pool_size, SHOW_LONG },
{"innodb_data_file_path", (char*) &innobase_data_file_path, SHOW_CHAR_PTR}, {"innodb_data_file_path", (char*) &innobase_data_file_path, SHOW_CHAR_PTR},
{"innodb_data_home_dir", (char*) &innobase_data_home_dir, SHOW_CHAR_PTR}, {"innodb_data_home_dir", (char*) &innobase_data_home_dir, SHOW_CHAR_PTR},
{"innodb_file_io_threads", (char*) &innobase_file_io_threads, SHOW_LONG },
{"innodb_open_files", (char*) &innobase_open_files, SHOW_LONG },
{"innodb_force_recovery", (char*) &innobase_force_recovery, SHOW_LONG },
{"innodb_thread_concurrency", (char*) &innobase_thread_concurrency, SHOW_LONG },
{"innodb_flush_log_at_trx_commit", (char*) &innobase_flush_log_at_trx_commit, SHOW_INT},
{"innodb_fast_shutdown", (char*) &innobase_fast_shutdown, SHOW_MY_BOOL}, {"innodb_fast_shutdown", (char*) &innobase_fast_shutdown, SHOW_MY_BOOL},
{"innodb_file_io_threads", (char*) &innobase_file_io_threads, SHOW_LONG },
{"innodb_file_per_table", (char*) &innobase_file_per_table, SHOW_MY_BOOL}, {"innodb_file_per_table", (char*) &innobase_file_per_table, SHOW_MY_BOOL},
{"innodb_flush_log_at_trx_commit", (char*) &innobase_flush_log_at_trx_commit, SHOW_INT},
{"innodb_flush_method", (char*) &innobase_unix_file_flush_method, SHOW_CHAR_PTR}, {"innodb_flush_method", (char*) &innobase_unix_file_flush_method, SHOW_CHAR_PTR},
{"innodb_force_recovery", (char*) &innobase_force_recovery, SHOW_LONG },
{"innodb_lock_wait_timeout", (char*) &innobase_lock_wait_timeout, SHOW_LONG }, {"innodb_lock_wait_timeout", (char*) &innobase_lock_wait_timeout, SHOW_LONG },
{"innodb_log_arch_dir", (char*) &innobase_log_arch_dir, SHOW_CHAR_PTR}, {"innodb_log_arch_dir", (char*) &innobase_log_arch_dir, SHOW_CHAR_PTR},
{"innodb_log_archive", (char*) &innobase_log_archive, SHOW_MY_BOOL}, {"innodb_log_archive", (char*) &innobase_log_archive, SHOW_MY_BOOL},
...@@ -626,60 +661,67 @@ struct show_var_st init_vars[]= { ...@@ -626,60 +661,67 @@ struct show_var_st init_vars[]= {
{"innodb_log_file_size", (char*) &innobase_log_file_size, SHOW_LONG}, {"innodb_log_file_size", (char*) &innobase_log_file_size, SHOW_LONG},
{"innodb_log_files_in_group", (char*) &innobase_log_files_in_group, SHOW_LONG}, {"innodb_log_files_in_group", (char*) &innobase_log_files_in_group, SHOW_LONG},
{"innodb_log_group_home_dir", (char*) &innobase_log_group_home_dir, SHOW_CHAR_PTR}, {"innodb_log_group_home_dir", (char*) &innobase_log_group_home_dir, SHOW_CHAR_PTR},
{"innodb_mirrored_log_groups", (char*) &innobase_mirrored_log_groups, SHOW_LONG},
{sys_innodb_max_dirty_pages_pct.name, (char*) &sys_innodb_max_dirty_pages_pct, SHOW_SYS}, {sys_innodb_max_dirty_pages_pct.name, (char*) &sys_innodb_max_dirty_pages_pct, SHOW_SYS},
{"innodb_mirrored_log_groups", (char*) &innobase_mirrored_log_groups, SHOW_LONG},
{"innodb_open_files", (char*) &innobase_open_files, SHOW_LONG },
{"innodb_thread_concurrency", (char*) &innobase_thread_concurrency, SHOW_LONG },
#endif #endif
{sys_interactive_timeout.name,(char*) &sys_interactive_timeout, SHOW_SYS}, {sys_interactive_timeout.name,(char*) &sys_interactive_timeout, SHOW_SYS},
{sys_join_buffer_size.name, (char*) &sys_join_buffer_size, SHOW_SYS}, {sys_join_buffer_size.name, (char*) &sys_join_buffer_size, SHOW_SYS},
{sys_key_buffer_size.name, (char*) &sys_key_buffer_size, SHOW_SYS}, {sys_key_buffer_size.name, (char*) &sys_key_buffer_size, SHOW_SYS},
{sys_key_cache_age_threshold.name, (char*) &sys_key_cache_age_threshold,
SHOW_SYS},
{sys_key_cache_block_size.name, (char*) &sys_key_cache_block_size, {sys_key_cache_block_size.name, (char*) &sys_key_cache_block_size,
SHOW_SYS}, SHOW_SYS},
{sys_key_cache_division_limit.name, (char*) &sys_key_cache_division_limit, {sys_key_cache_division_limit.name, (char*) &sys_key_cache_division_limit,
SHOW_SYS}, SHOW_SYS},
{sys_key_cache_age_threshold.name, (char*) &sys_key_cache_age_threshold,
SHOW_SYS},
{"language", language, SHOW_CHAR}, {"language", language, SHOW_CHAR},
{"large_files_support", (char*) &opt_large_files, SHOW_BOOL}, {"large_files_support", (char*) &opt_large_files, SHOW_BOOL},
{sys_license.name, (char*) &sys_license, SHOW_SYS},
{sys_local_infile.name, (char*) &sys_local_infile, SHOW_SYS}, {sys_local_infile.name, (char*) &sys_local_infile, SHOW_SYS},
#ifdef HAVE_MLOCKALL #ifdef HAVE_MLOCKALL
{"locked_in_memory", (char*) &locked_in_memory, SHOW_BOOL}, {"locked_in_memory", (char*) &locked_in_memory, SHOW_BOOL},
#endif #endif
{"log", (char*) &opt_log, SHOW_BOOL}, {"log", (char*) &opt_log, SHOW_BOOL},
{"log_update", (char*) &opt_update_log, SHOW_BOOL},
{"log_bin", (char*) &opt_bin_log, SHOW_BOOL}, {"log_bin", (char*) &opt_bin_log, SHOW_BOOL},
{"log_error", (char*) log_error_file, SHOW_CHAR},
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
{"log_slave_updates", (char*) &opt_log_slave_updates, SHOW_MY_BOOL}, {"log_slave_updates", (char*) &opt_log_slave_updates, SHOW_MY_BOOL},
#endif #endif
{"log_slow_queries", (char*) &opt_slow_log, SHOW_BOOL}, {"log_slow_queries", (char*) &opt_slow_log, SHOW_BOOL},
{"log_update", (char*) &opt_update_log, SHOW_BOOL},
{sys_log_warnings.name, (char*) &sys_log_warnings, SHOW_SYS}, {sys_log_warnings.name, (char*) &sys_log_warnings, SHOW_SYS},
{sys_long_query_time.name, (char*) &sys_long_query_time, SHOW_SYS}, {sys_long_query_time.name, (char*) &sys_long_query_time, SHOW_SYS},
{sys_low_priority_updates.name, (char*) &sys_low_priority_updates, SHOW_SYS}, {sys_low_priority_updates.name, (char*) &sys_low_priority_updates, SHOW_SYS},
{"lower_case_table_names", (char*) &lower_case_table_names, SHOW_MY_BOOL}, {"lower_case_file_system", (char*) &lower_case_file_system, SHOW_BOOL},
{"lower_case_table_names", (char*) &lower_case_table_names, SHOW_INT},
{sys_max_allowed_packet.name,(char*) &sys_max_allowed_packet, SHOW_SYS}, {sys_max_allowed_packet.name,(char*) &sys_max_allowed_packet, SHOW_SYS},
{sys_max_binlog_cache_size.name,(char*) &sys_max_binlog_cache_size, SHOW_SYS}, {sys_max_binlog_cache_size.name,(char*) &sys_max_binlog_cache_size, SHOW_SYS},
{sys_max_binlog_size.name, (char*) &sys_max_binlog_size, SHOW_SYS}, {sys_max_binlog_size.name, (char*) &sys_max_binlog_size, SHOW_SYS},
{sys_max_connections.name, (char*) &sys_max_connections, SHOW_SYS},
{sys_max_connect_errors.name, (char*) &sys_max_connect_errors, SHOW_SYS}, {sys_max_connect_errors.name, (char*) &sys_max_connect_errors, SHOW_SYS},
{sys_max_error_count.name, (char*) &sys_max_error_count, SHOW_SYS}, {sys_max_connections.name, (char*) &sys_max_connections, SHOW_SYS},
{sys_max_delayed_threads.name,(char*) &sys_max_delayed_threads, SHOW_SYS}, {sys_max_delayed_threads.name,(char*) &sys_max_delayed_threads, SHOW_SYS},
{sys_max_error_count.name, (char*) &sys_max_error_count, SHOW_SYS},
{sys_max_heap_table_size.name,(char*) &sys_max_heap_table_size, SHOW_SYS}, {sys_max_heap_table_size.name,(char*) &sys_max_heap_table_size, SHOW_SYS},
{sys_max_insert_delayed_threads.name,
(char*) &sys_max_insert_delayed_threads, SHOW_SYS},
{sys_max_join_size.name, (char*) &sys_max_join_size, SHOW_SYS}, {sys_max_join_size.name, (char*) &sys_max_join_size, SHOW_SYS},
{sys_max_relay_log_size.name, (char*) &sys_max_relay_log_size, SHOW_SYS},
{sys_max_seeks_for_key.name, (char*) &sys_max_seeks_for_key, SHOW_SYS},
{sys_max_length_for_sort_data.name, (char*) &sys_max_length_for_sort_data, {sys_max_length_for_sort_data.name, (char*) &sys_max_length_for_sort_data,
SHOW_SYS}, SHOW_SYS},
{sys_max_relay_log_size.name, (char*) &sys_max_relay_log_size, SHOW_SYS},
{sys_max_seeks_for_key.name, (char*) &sys_max_seeks_for_key, SHOW_SYS},
{sys_max_sort_length.name, (char*) &sys_max_sort_length, SHOW_SYS}, {sys_max_sort_length.name, (char*) &sys_max_sort_length, SHOW_SYS},
{sys_max_user_connections.name,(char*) &sys_max_user_connections, SHOW_SYS},
{sys_max_tmp_tables.name, (char*) &sys_max_tmp_tables, SHOW_SYS}, {sys_max_tmp_tables.name, (char*) &sys_max_tmp_tables, SHOW_SYS},
{sys_max_user_connections.name,(char*) &sys_max_user_connections, SHOW_SYS},
{sys_max_write_lock_count.name, (char*) &sys_max_write_lock_count,SHOW_SYS}, {sys_max_write_lock_count.name, (char*) &sys_max_write_lock_count,SHOW_SYS},
{sys_myisam_max_extra_sort_file_size.name, {sys_myisam_max_extra_sort_file_size.name,
(char*) &sys_myisam_max_extra_sort_file_size, (char*) &sys_myisam_max_extra_sort_file_size,
SHOW_SYS}, SHOW_SYS},
{sys_myisam_max_sort_file_size.name, (char*) &sys_myisam_max_sort_file_size, {sys_myisam_max_sort_file_size.name, (char*) &sys_myisam_max_sort_file_size,
SHOW_SYS}, SHOW_SYS},
{"myisam_recover_options", (char*) &myisam_recover_options_str, SHOW_CHAR_PTR},
{sys_myisam_repair_threads.name, (char*) &sys_myisam_repair_threads, {sys_myisam_repair_threads.name, (char*) &sys_myisam_repair_threads,
SHOW_SYS}, SHOW_SYS},
{"myisam_recover_options", (char*) &myisam_recover_options_str, SHOW_CHAR_PTR},
{sys_myisam_sort_buffer_size.name, (char*) &sys_myisam_sort_buffer_size, SHOW_SYS}, {sys_myisam_sort_buffer_size.name, (char*) &sys_myisam_sort_buffer_size, SHOW_SYS},
#ifdef __NT__ #ifdef __NT__
{"named_pipe", (char*) &opt_enable_named_pipe, SHOW_MY_BOOL}, {"named_pipe", (char*) &opt_enable_named_pipe, SHOW_MY_BOOL},
...@@ -692,10 +734,9 @@ struct show_var_st init_vars[]= { ...@@ -692,10 +734,9 @@ struct show_var_st init_vars[]= {
{sys_old_passwords.name, (char*) &sys_old_passwords, SHOW_SYS}, {sys_old_passwords.name, (char*) &sys_old_passwords, SHOW_SYS},
{"open_files_limit", (char*) &open_files_limit, SHOW_LONG}, {"open_files_limit", (char*) &open_files_limit, SHOW_LONG},
{"pid_file", (char*) pidfile_name, SHOW_CHAR}, {"pid_file", (char*) pidfile_name, SHOW_CHAR},
{"log_error", (char*) log_error_file, SHOW_CHAR},
{"port", (char*) &mysqld_port, SHOW_INT}, {"port", (char*) &mysqld_port, SHOW_INT},
{"protocol_version", (char*) &protocol_version, SHOW_INT},
{sys_preload_buff_size.name, (char*) &sys_preload_buff_size, SHOW_SYS}, {sys_preload_buff_size.name, (char*) &sys_preload_buff_size, SHOW_SYS},
{"protocol_version", (char*) &protocol_version, SHOW_INT},
{sys_query_alloc_block_size.name, (char*) &sys_query_alloc_block_size, {sys_query_alloc_block_size.name, (char*) &sys_query_alloc_block_size,
SHOW_SYS}, SHOW_SYS},
#ifdef HAVE_QUERY_CACHE #ifdef HAVE_QUERY_CACHE
...@@ -704,7 +745,6 @@ struct show_var_st init_vars[]= { ...@@ -704,7 +745,6 @@ struct show_var_st init_vars[]= {
SHOW_SYS}, SHOW_SYS},
{sys_query_cache_size.name, (char*) &sys_query_cache_size, SHOW_SYS}, {sys_query_cache_size.name, (char*) &sys_query_cache_size, SHOW_SYS},
{sys_query_cache_type.name, (char*) &sys_query_cache_type, SHOW_SYS}, {sys_query_cache_type.name, (char*) &sys_query_cache_type, SHOW_SYS},
{"secure_auth", (char*) &sys_secure_auth, SHOW_SYS},
#endif /* HAVE_QUERY_CACHE */ #endif /* HAVE_QUERY_CACHE */
{sys_query_prealloc_size.name, (char*) &sys_query_prealloc_size, SHOW_SYS}, {sys_query_prealloc_size.name, (char*) &sys_query_prealloc_size, SHOW_SYS},
{sys_range_alloc_block_size.name, (char*) &sys_range_alloc_block_size, {sys_range_alloc_block_size.name, (char*) &sys_range_alloc_block_size,
...@@ -716,18 +756,18 @@ struct show_var_st init_vars[]= { ...@@ -716,18 +756,18 @@ struct show_var_st init_vars[]= {
{sys_relay_log_purge.name, (char*) &sys_relay_log_purge, SHOW_SYS}, {sys_relay_log_purge.name, (char*) &sys_relay_log_purge, SHOW_SYS},
#endif #endif
{sys_rpl_recovery_rank.name,(char*) &sys_rpl_recovery_rank, SHOW_SYS}, {sys_rpl_recovery_rank.name,(char*) &sys_rpl_recovery_rank, SHOW_SYS},
{"secure_auth", (char*) &sys_secure_auth, SHOW_SYS},
#ifdef HAVE_SMEM #ifdef HAVE_SMEM
{"shared_memory", (char*) &opt_enable_shared_memory, SHOW_MY_BOOL}, {"shared_memory", (char*) &opt_enable_shared_memory, SHOW_MY_BOOL},
{"shared_memory_base_name", (char*) &shared_memory_base_name, SHOW_CHAR_PTR}, {"shared_memory_base_name", (char*) &shared_memory_base_name, SHOW_CHAR_PTR},
#endif #endif
{sys_server_id.name, (char*) &sys_server_id, SHOW_SYS}, {sys_server_id.name, (char*) &sys_server_id, SHOW_SYS},
#ifdef HAVE_REPLICATION
{sys_slave_net_timeout.name,(char*) &sys_slave_net_timeout, SHOW_SYS},
#endif
{sys_readonly.name, (char*) &sys_readonly, SHOW_SYS},
{"skip_external_locking", (char*) &my_disable_locking, SHOW_MY_BOOL}, {"skip_external_locking", (char*) &my_disable_locking, SHOW_MY_BOOL},
{"skip_networking", (char*) &opt_disable_networking, SHOW_BOOL}, {"skip_networking", (char*) &opt_disable_networking, SHOW_BOOL},
{"skip_show_database", (char*) &opt_skip_show_db, SHOW_BOOL}, {"skip_show_database", (char*) &opt_skip_show_db, SHOW_BOOL},
#ifdef HAVE_REPLICATION
{sys_slave_net_timeout.name,(char*) &sys_slave_net_timeout, SHOW_SYS},
#endif
{sys_slow_launch_time.name, (char*) &sys_slow_launch_time, SHOW_SYS}, {sys_slow_launch_time.name, (char*) &sys_slow_launch_time, SHOW_SYS},
#ifdef HAVE_SYS_UN_H #ifdef HAVE_SYS_UN_H
{"socket", (char*) &mysqld_unix_port, SHOW_CHAR_PTR}, {"socket", (char*) &mysqld_unix_port, SHOW_CHAR_PTR},
...@@ -742,7 +782,6 @@ struct show_var_st init_vars[]= { ...@@ -742,7 +782,6 @@ struct show_var_st init_vars[]= {
{"thread_concurrency", (char*) &concurrency, SHOW_LONG}, {"thread_concurrency", (char*) &concurrency, SHOW_LONG},
#endif #endif
{"thread_stack", (char*) &thread_stack, SHOW_LONG}, {"thread_stack", (char*) &thread_stack, SHOW_LONG},
{sys_tx_isolation.name, (char*) &sys_tx_isolation, SHOW_SYS},
{sys_time_format.name, (char*) &sys_time_format, SHOW_SYS}, {sys_time_format.name, (char*) &sys_time_format, SHOW_SYS},
#ifdef HAVE_TZNAME #ifdef HAVE_TZNAME
{"timezone", time_zone, SHOW_CHAR}, {"timezone", time_zone, SHOW_CHAR},
...@@ -752,13 +791,14 @@ struct show_var_st init_vars[]= { ...@@ -752,13 +791,14 @@ struct show_var_st init_vars[]= {
{sys_trans_alloc_block_size.name, (char*) &sys_trans_alloc_block_size, {sys_trans_alloc_block_size.name, (char*) &sys_trans_alloc_block_size,
SHOW_SYS}, SHOW_SYS},
{sys_trans_prealloc_size.name, (char*) &sys_trans_prealloc_size, SHOW_SYS}, {sys_trans_prealloc_size.name, (char*) &sys_trans_prealloc_size, SHOW_SYS},
{sys_tx_isolation.name, (char*) &sys_tx_isolation, SHOW_SYS},
{"version", server_version, SHOW_CHAR}, {"version", server_version, SHOW_CHAR},
#ifdef HAVE_BERKELEY_DB #ifdef HAVE_BERKELEY_DB
{"version_bdb", (char*) DB_VERSION_STRING, SHOW_CHAR}, {"version_bdb", (char*) DB_VERSION_STRING, SHOW_CHAR},
#endif #endif
{"version_comment", (char*) MYSQL_COMPILATION_COMMENT, SHOW_CHAR}, {"version_comment", (char*) MYSQL_COMPILATION_COMMENT, SHOW_CHAR},
{"version_compile_machine", (char*) MACHINE_TYPE, SHOW_CHAR}, {"version_compile_machine", (char*) MACHINE_TYPE, SHOW_CHAR},
{"version_compile_os", (char*) SYSTEM_TYPE, SHOW_CHAR}, {sys_os.name, (char*) &sys_os, SHOW_SYS},
{sys_net_wait_timeout.name, (char*) &sys_net_wait_timeout, SHOW_SYS}, {sys_net_wait_timeout.name, (char*) &sys_net_wait_timeout, SHOW_SYS},
{NullS, NullS, SHOW_LONG} {NullS, NullS, SHOW_LONG}
}; };
...@@ -770,6 +810,18 @@ bool sys_var::check(THD *thd, set_var *var) ...@@ -770,6 +810,18 @@ bool sys_var::check(THD *thd, set_var *var)
return 0; return 0;
} }
bool sys_var_str::check(THD *thd, set_var *var)
{
int res;
if (!check_func)
return 0;
if ((res=(*check_func)(thd, var)) < 0)
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name,
var->value->str_value.ptr());
return res;
}
/* /*
Functions to check and update variables Functions to check and update variables
*/ */
...@@ -786,15 +838,12 @@ bool sys_var::check(THD *thd, set_var *var) ...@@ -786,15 +838,12 @@ bool sys_var::check(THD *thd, set_var *var)
bool update_sys_var_str(sys_var_str *var_str, rw_lock_t *var_mutex, bool update_sys_var_str(sys_var_str *var_str, rw_lock_t *var_mutex,
set_var *var) set_var *var)
{ {
char *res= 0, *old_value; char *res= 0, *old_value=(char *)(var ? var->value->str_value.ptr() : 0);
uint new_length= 0; uint new_length= (var ? var->value->str_value.length() : 0);
/* If the string is "", delete old init command */ if (!old_value)
if (var && (new_length= var->value->str_value.length())) old_value= (char*) "";
{ if (!(res= my_strdup_with_length(old_value, new_length, MYF(0))))
if (!(res= my_strdup_with_length((byte*) var->value->str_value.ptr(), return 1;
new_length, MYF(0))))
return 1;
}
/* /*
Replace the old value in such a way that the any thread using Replace the old value in such a way that the any thread using
the value will work. the value will work.
...@@ -832,13 +881,37 @@ static void sys_default_init_slave(THD* thd, enum_var_type type) ...@@ -832,13 +881,37 @@ static void sys_default_init_slave(THD* thd, enum_var_type type)
update_sys_var_str(&sys_init_slave, &LOCK_sys_init_slave, 0); update_sys_var_str(&sys_init_slave, &LOCK_sys_init_slave, 0);
} }
static int sys_check_ftb_syntax(THD *thd, set_var *var)
{
if (thd->master_access & SUPER_ACL)
return ft_boolean_check_syntax_string((byte*) var->value->str_value.c_ptr()) ?
-1 : 0;
else
{
my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0), "SUPER");
return 1;
}
}
static bool sys_update_ftb_syntax(THD *thd, set_var * var)
{
strmake(ft_boolean_syntax, var->value->str_value.c_ptr(),
sizeof(ft_boolean_syntax)-1);
return 0;
}
static void sys_default_ftb_syntax(THD *thd, enum_var_type type)
{
strmake(ft_boolean_syntax, opt_ft_boolean_syntax,
sizeof(ft_boolean_syntax)-1);
}
/* /*
The following 3 functions need to be changed in 4.1 when we allow The following 3 functions need to be changed in 4.1 when we allow
one to change character sets one to change character sets
*/ */
static bool sys_check_charset(THD *thd, set_var *var) static int sys_check_charset(THD *thd, set_var *var)
{ {
return 0; return 0;
} }
...@@ -1014,7 +1087,26 @@ static void fix_max_relay_log_size(THD *thd, enum_var_type type) ...@@ -1014,7 +1087,26 @@ static void fix_max_relay_log_size(THD *thd, enum_var_type type)
static void fix_max_connections(THD *thd, enum_var_type type) static void fix_max_connections(THD *thd, enum_var_type type)
{ {
resize_thr_alarm(max_connections + max_insert_delayed_threads + 10); resize_thr_alarm(max_connections +
global_system_variables.max_insert_delayed_threads + 10);
}
static void fix_thd_mem_root(THD *thd, enum_var_type type)
{
if (type != OPT_GLOBAL)
reset_root_defaults(&thd->mem_root,
thd->variables.query_alloc_block_size,
thd->variables.query_prealloc_size);
}
static void fix_trans_mem_root(THD *thd, enum_var_type type)
{
if (type != OPT_GLOBAL)
reset_root_defaults(&thd->transaction.mem_root,
thd->variables.trans_alloc_block_size,
thd->variables.trans_prealloc_size);
} }
bool sys_var_long_ptr::update(THD *thd, set_var *var) bool sys_var_long_ptr::update(THD *thd, set_var *var)
...@@ -1082,6 +1174,11 @@ byte *sys_var_enum::value_ptr(THD *thd, enum_var_type type, LEX_STRING *base) ...@@ -1082,6 +1174,11 @@ byte *sys_var_enum::value_ptr(THD *thd, enum_var_type type, LEX_STRING *base)
return (byte*) enum_names->type_names[*value]; return (byte*) enum_names->type_names[*value];
} }
bool sys_var_thd_ulong::check(THD *thd, set_var *var)
{
return (sys_var_thd::check(thd, var) ||
(check_func && (*check_func)(thd, var)));
}
bool sys_var_thd_ulong::update(THD *thd, set_var *var) bool sys_var_thd_ulong::update(THD *thd, set_var *var)
{ {
...@@ -1333,9 +1430,8 @@ Item *sys_var::item(THD *thd, enum_var_type var_type, LEX_STRING *base) ...@@ -1333,9 +1430,8 @@ Item *sys_var::item(THD *thd, enum_var_type var_type, LEX_STRING *base)
{ {
if (var_type != OPT_DEFAULT) if (var_type != OPT_DEFAULT)
{ {
net_printf(thd, net_printf(thd, ER_INCORRECT_GLOBAL_LOCAL_VAR,
var_type == OPT_GLOBAL ? ER_LOCAL_VARIABLE : name, var_type == OPT_GLOBAL ? "SESSION" : "GLOBAL");
ER_GLOBAL_VARIABLE, name);
return 0; return 0;
} }
/* As there was no local variable, return the global value */ /* As there was no local variable, return the global value */
...@@ -1412,6 +1508,11 @@ byte *sys_var_thd_enum::value_ptr(THD *thd, enum_var_type type, ...@@ -1412,6 +1508,11 @@ byte *sys_var_thd_enum::value_ptr(THD *thd, enum_var_type type,
return (byte*) enum_names->type_names[tmp]; return (byte*) enum_names->type_names[tmp];
} }
bool sys_var_thd_bit::check(THD *thd, set_var *var)
{
return (check_enum(thd, var, &bool_typelib) ||
(check_func && (*check_func)(thd, var)));
}
bool sys_var_thd_bit::update(THD *thd, set_var *var) bool sys_var_thd_bit::update(THD *thd, set_var *var)
{ {
...@@ -1580,7 +1681,10 @@ bool sys_var_collation::check(THD *thd, set_var *var) ...@@ -1580,7 +1681,10 @@ bool sys_var_collation::check(THD *thd, set_var *var)
String str(buff,sizeof(buff), system_charset_info), *res; String str(buff,sizeof(buff), system_charset_info), *res;
if (!(res=var->value->val_str(&str))) if (!(res=var->value->val_str(&str)))
res= &my_empty_string; {
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name, "NULL");
return 1;
}
if (!(tmp=get_charset_by_name(res->c_ptr(),MYF(0)))) if (!(tmp=get_charset_by_name(res->c_ptr(),MYF(0))))
{ {
...@@ -1602,7 +1706,7 @@ bool sys_var_character_set::check(THD *thd, set_var *var) ...@@ -1602,7 +1706,7 @@ bool sys_var_character_set::check(THD *thd, set_var *var)
{ {
if (!nullable) if (!nullable)
{ {
my_error(ER_UNKNOWN_CHARACTER_SET, MYF(0), "NULL"); my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), name, "NULL");
return 1; return 1;
} }
tmp= NULL; tmp= NULL;
...@@ -1876,7 +1980,7 @@ byte *sys_var_key_cache_param::value_ptr(THD *thd, enum_var_type type, ...@@ -1876,7 +1980,7 @@ byte *sys_var_key_cache_param::value_ptr(THD *thd, enum_var_type type,
key_cache= &zero_key_cache; key_cache= &zero_key_cache;
return (byte*) key_cache + offset ; return (byte*) key_cache + offset ;
} }
bool sys_var_key_buffer_size::update(THD *thd, set_var *var) bool sys_var_key_buffer_size::update(THD *thd, set_var *var)
{ {
...@@ -1971,14 +2075,14 @@ bool sys_var_key_cache_long::update(THD *thd, set_var *var) ...@@ -1971,14 +2075,14 @@ bool sys_var_key_cache_long::update(THD *thd, set_var *var)
pthread_mutex_lock(&LOCK_global_system_variables); pthread_mutex_lock(&LOCK_global_system_variables);
KEY_CACHE *key_cache= get_key_cache(base_name); KEY_CACHE *key_cache= get_key_cache(base_name);
if (!key_cache && !(key_cache= create_key_cache(base_name->str, if (!key_cache && !(key_cache= create_key_cache(base_name->str,
base_name->length))) base_name->length)))
{ {
error= 1; error= 1;
goto end; goto end;
} }
/* /*
Abort if some other thread is changing the key cache Abort if some other thread is changing the key cache
TODO: This should be changed so that we wait until the previous TODO: This should be changed so that we wait until the previous
...@@ -2080,28 +2184,12 @@ byte *sys_var_insert_id::value_ptr(THD *thd, enum_var_type type, ...@@ -2080,28 +2184,12 @@ byte *sys_var_insert_id::value_ptr(THD *thd, enum_var_type type,
return (byte*) &thd->current_insert_id; return (byte*) &thd->current_insert_id;
} }
bool sys_var_pseudo_thread_id::check(THD *thd, set_var *var)
{
var->save_result.ulonglong_value= var->value->val_int();
#ifndef NO_EMBEDDED_ACCESS_CHECKS
if (thd->master_access & SUPER_ACL)
return 0;
else
{
my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0), "SUPER");
return 1;
}
#else
return 0;
#endif
}
#ifdef HAVE_REPLICATION #ifdef HAVE_REPLICATION
bool sys_var_slave_skip_counter::check(THD *thd, set_var *var) bool sys_var_slave_skip_counter::check(THD *thd, set_var *var)
{ {
int result= 0; int result= 0;
LOCK_ACTIVE_MI; pthread_mutex_lock(&LOCK_active_mi);
pthread_mutex_lock(&active_mi->rli.run_lock); pthread_mutex_lock(&active_mi->rli.run_lock);
if (active_mi->rli.slave_running) if (active_mi->rli.slave_running)
{ {
...@@ -2109,7 +2197,7 @@ bool sys_var_slave_skip_counter::check(THD *thd, set_var *var) ...@@ -2109,7 +2197,7 @@ bool sys_var_slave_skip_counter::check(THD *thd, set_var *var)
result=1; result=1;
} }
pthread_mutex_unlock(&active_mi->rli.run_lock); pthread_mutex_unlock(&active_mi->rli.run_lock);
UNLOCK_ACTIVE_MI; pthread_mutex_unlock(&LOCK_active_mi);
var->save_result.ulong_value= (ulong) var->value->val_int(); var->save_result.ulong_value= (ulong) var->value->val_int();
return result; return result;
} }
...@@ -2117,7 +2205,7 @@ bool sys_var_slave_skip_counter::check(THD *thd, set_var *var) ...@@ -2117,7 +2205,7 @@ bool sys_var_slave_skip_counter::check(THD *thd, set_var *var)
bool sys_var_slave_skip_counter::update(THD *thd, set_var *var) bool sys_var_slave_skip_counter::update(THD *thd, set_var *var)
{ {
LOCK_ACTIVE_MI; pthread_mutex_lock(&LOCK_active_mi);
pthread_mutex_lock(&active_mi->rli.run_lock); pthread_mutex_lock(&active_mi->rli.run_lock);
/* /*
The following test should normally never be true as we test this The following test should normally never be true as we test this
...@@ -2131,7 +2219,7 @@ bool sys_var_slave_skip_counter::update(THD *thd, set_var *var) ...@@ -2131,7 +2219,7 @@ bool sys_var_slave_skip_counter::update(THD *thd, set_var *var)
pthread_mutex_unlock(&active_mi->rli.data_lock); pthread_mutex_unlock(&active_mi->rli.data_lock);
} }
pthread_mutex_unlock(&active_mi->rli.run_lock); pthread_mutex_unlock(&active_mi->rli.run_lock);
UNLOCK_ACTIVE_MI; pthread_mutex_unlock(&LOCK_active_mi);
return 0; return 0;
} }
#endif /* HAVE_REPLICATION */ #endif /* HAVE_REPLICATION */
...@@ -2194,6 +2282,17 @@ static bool set_option_autocommit(THD *thd, set_var *var) ...@@ -2194,6 +2282,17 @@ static bool set_option_autocommit(THD *thd, set_var *var)
return 0; return 0;
} }
static int check_log_update(THD *thd, set_var *var)
{
#ifndef NO_EMBEDDED_ACCESS_CHECKS
if (!(thd->master_access & SUPER_ACL))
{
my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0), "SUPER");
return 1;
}
#endif
return 0;
}
static bool set_log_update(THD *thd, set_var *var) static bool set_log_update(THD *thd, set_var *var)
{ {
...@@ -2228,6 +2327,21 @@ static bool set_log_bin(THD *thd, set_var *var) ...@@ -2228,6 +2327,21 @@ static bool set_log_bin(THD *thd, set_var *var)
return 0; return 0;
} }
static int check_pseudo_thread_id(THD *thd, set_var *var)
{
var->save_result.ulonglong_value= var->value->val_int();
#ifndef NO_EMBEDDED_ACCESS_CHECKS
if (thd->master_access & SUPER_ACL)
return 0;
else
{
my_error(ER_SPECIFIC_ACCESS_DENIED_ERROR, MYF(0), "SUPER");
return 1;
}
#else
return 0;
#endif
}
static byte *get_warning_count(THD *thd) static byte *get_warning_count(THD *thd)
{ {
...@@ -2460,7 +2574,7 @@ int set_var_user::check(THD *thd) ...@@ -2460,7 +2574,7 @@ int set_var_user::check(THD *thd)
{ {
/* /*
Item_func_set_user_var can't substitute something else on its place => Item_func_set_user_var can't substitute something else on its place =>
0 can be passed as last argument 0 can be passed as last argument (reference on item)
*/ */
return (user_var_item->fix_fields(thd, 0, (Item**) 0) || return (user_var_item->fix_fields(thd, 0, (Item**) 0) ||
user_var_item->check()) ? -1 : 0; user_var_item->check()) ? -1 : 0;
......
...@@ -301,35 +301,6 @@ character-set=latin1 ...@@ -301,35 +301,6 @@ character-set=latin1
"Truncated wrong %-.32s value: '%-.128s'" "Truncated wrong %-.32s value: '%-.128s'"
"Incorrect table definition; There can only be one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause" "Incorrect table definition; There can only be one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause"
"Invalid ON UPDATE clause for '%-.64s' field", "Invalid ON UPDATE clause for '%-.64s' field",
"Row %ld was truncated; It contained more data than there where input columns",
"Data truncated, NULL supplied to NOT NULL column '%s' at row %ld",
"Data truncated, out of range for column '%s' at row %ld",
"Data truncated for column '%s' at row %ld",
"Using storage engine %s for table '%s'",
"Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s'",
"Can't drop one or more of the requested users",
"Can't revoke all privileges, grant for one or more of the requested users",
"Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s'",
"Illegal mix of collations for operation '%s'",
"Variable '%-.64s' is not a variable component (Can't be used as XXXX.variable_name)",
"Unknown collation: '%-.64s'",
"SSL parameters in CHANGE MASTER are ignored because this MySQL slave was compiled without SSL support. They can be used later when MySQL slave with SSL will be started.",
"Server is running in --secure-auth mode, but '%s@%s' has a password in the old format; please change the password to the new format",
"Field or reference '%-.64s%s%-.64s%s%-.64s' of SELECT #%d was resolved in SELECT #%d",
"Wrong parameter or combination of parameters for START SLAVE UNTIL",
"It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart",
"SQL thread is not to be started so UNTIL options are ignored",
"Incorrect index name '%-.100s'",
"Incorrect catalog name '%-.100s'",
"Query cache failed to set size %lu, new query cache size is %lu",
"Column '%-.64s' cannot be part of FULLTEXT index",
"Unknown key cache '%-.100s'",
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
"Unknown table engine '%s'",
"'%s' is deprecated. Use '%s' instead.",
"The target table %-.100s of the %s is not updatable.",
"The '%s' feature was disabled. You need MySQL built with '%s' define to have it working"
"MySQL is started in --skip-grant-tables mode. You can't use this command"
"Can't create a %s from within another stored routine" "Can't create a %s from within another stored routine"
"%s %s already exists" "%s %s already exists"
"%s %s does not exist" "%s %s does not exist"
......
...@@ -309,35 +309,6 @@ character-set=latin1 ...@@ -309,35 +309,6 @@ character-set=latin1
"Truncated wrong %-.32s value: '%-.128s'" "Truncated wrong %-.32s value: '%-.128s'"
"Incorrect table definition; There can only be one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause" "Incorrect table definition; There can only be one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause"
"Invalid ON UPDATE clause for '%-.64s' field", "Invalid ON UPDATE clause for '%-.64s' field",
"Row %ld was truncated; It contained more data than there where input columns",
"Data truncated, NULL supplied to NOT NULL column '%s' at row %ld",
"Data truncated, out of range for column '%s' at row %ld",
"Data truncated for column '%s' at row %ld",
"Using storage engine %s for table '%s'",
"Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s'",
"Can't drop one or more of the requested users",
"Can't revoke all privileges, grant for one or more of the requested users",
"Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s'",
"Illegal mix of collations for operation '%s'",
"Variable '%-.64s' is not a variable component (Can't be used as XXXX.variable_name)",
"Unknown collation: '%-.64s'",
"SSL parameters in CHANGE MASTER are ignored because this MySQL slave was compiled without SSL support. They can be used later when MySQL slave with SSL will be started.",
"Server is running in --secure-auth mode, but '%s@%s' has a password in the old format; please change the password to the new format",
"Field or reference '%-.64s%s%-.64s%s%-.64s' of SELECT #%d was resolved in SELECT #%d",
"Wrong parameter or combination of parameters for START SLAVE UNTIL",
"It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart",
"SQL thread is not to be started so UNTIL options are ignored",
"Incorrect index name '%-.100s'",
"Incorrect catalog name '%-.100s'",
"Query cache failed to set size %lu, new query cache size is %lu",
"Column '%-.64s' cannot be part of FULLTEXT index",
"Unknown key cache '%-.100s'",
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
"Unknown table engine '%s'",
"'%s' is deprecated. Use '%s' instead.",
"The target table %-.100s of the %s is not updatable.",
"The '%s' feature was disabled. You need MySQL built with '%s' define to have it working"
"MySQL is started in --skip-grant-tables mode. You can't use this command"
"Can't create a %s from within another stored routine" "Can't create a %s from within another stored routine"
"%s %s already exists" "%s %s already exists"
"%s %s does not exist" "%s %s does not exist"
......
...@@ -298,40 +298,6 @@ character-set=latin1 ...@@ -298,40 +298,6 @@ character-set=latin1
"Truncated wrong %-.32s value: '%-.128s'" "Truncated wrong %-.32s value: '%-.128s'"
"Incorrect table definition; There can only be one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause" "Incorrect table definition; There can only be one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause"
"Invalid ON UPDATE clause for '%-.64s' field", "Invalid ON UPDATE clause for '%-.64s' field",
"ZLIB: Not enough memory available for zlib",
"ZLIB: Not enough room in the output buffer for zlib (probably, length of uncompressed data was corrupted)",
"ZLIB: Input data was corrupted for zlib",
"%d line(s) was(were) cut by group_concat()",
"Row %ld doesn't contain data for all columns",
"Row %ld was truncated; It contained more data than there where input columns",
"Data truncated, NULL supplied to NOT NULL column '%s' at row %ld",
"Data truncated, out of range for column '%s' at row %ld",
"Data truncated for column '%s' at row %ld",
"Using storage engine %s for table '%s'",
"Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s'",
"Can't drop one or more of the requested users",
"Can't revoke all privileges, grant for one or more of the requested users",
"Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s'",
"Illegal mix of collations for operation '%s'",
"Variable '%-.64s' is not a variable component (Can't be used as XXXX.variable_name)",
"Unknown collation: '%-.64s'",
"SSL parameters in CHANGE MASTER are ignored because this MySQL slave was compiled without SSL support. They can be used later when MySQL slave with SSL will be started.",
"Server is running in --secure-auth mode, but '%s@%s' has a password in the old format; please change the password to the new format",
"Field or reference '%-.64s%s%-.64s%s%-.64s' of SELECT #%d was resolved in SELECT #%d",
"Wrong parameter or combination of parameters for START SLAVE UNTIL",
"It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL. Otherwise you will get problems if you get an unexpected slave's mysqld restart",
"SQL thread is not to be started so UNTIL options are ignored",
"Incorrect index name '%-.100s'",
"Incorrect catalog name '%-.100s'",
"Query cache failed to set size %lu, new query cache size is %lu",
"Column '%-.64s' cannot be part of FULLTEXT index",
"Unknown key cache '%-.100s'",
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
"Unknown table engine '%s'",
"'%s' is deprecated. Use '%s' instead.",
"The target table %-.100s of the %s is not updatable.",
"The '%s' feature was disabled. You need MySQL built with '%s' define to have it working",
"MySQL is started in --skip-grant-tables mode. You can't use this command"
"Can't create a %s from within another stored routine" "Can't create a %s from within another stored routine"
"%s %s already exists" "%s %s already exists"
"%s %s does not exist" "%s %s does not exist"
......
...@@ -303,35 +303,6 @@ character-set=latin7 ...@@ -303,35 +303,6 @@ character-set=latin7
"Truncated wrong %-.32s value: '%-.128s'" "Truncated wrong %-.32s value: '%-.128s'"
"Incorrect table definition; There can only be one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause" "Incorrect table definition; There can only be one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause"
"Invalid ON UPDATE clause for '%-.64s' field", "Invalid ON UPDATE clause for '%-.64s' field",
"Row %ld was truncated; It contained more data than there where input columns",
"Data truncated, NULL supplied to NOT NULL column '%s' at row %ld",
"Data truncated, out of range for column '%s' at row %ld",
"Data truncated for column '%s' at row %ld",
"Using storage engine %s for table '%s'",
"Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s'",
"Can't drop one or more of the requested users",
"Can't revoke all privileges, grant for one or more of the requested users",
"Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s'",
"Illegal mix of collations for operation '%s'",
"Variable '%-.64s' is not a variable component (Can't be used as XXXX.variable_name)",
"Unknown collation: '%-.64s'",
"SSL parameters in CHANGE MASTER are ignored because this MySQL slave was compiled without SSL support. They can be used later when MySQL slave with SSL will be started.",
"Server is running in --secure-auth mode, but '%s@%s' has a password in the old format; please change the password to the new format",
"Field or reference '%-.64s%s%-.64s%s%-.64s' of SELECT #%d was resolved in SELECT #%d",
"Wrong parameter or combination of parameters for START SLAVE UNTIL",
"It is recommended to run with --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL, otherwise you are not safe in case of unexpected slave's mysqld restart",
"SQL thread is not to be started so UNTIL options are ignored",
"Incorrect index name '%-.100s'",
"Incorrect catalog name '%-.100s'",
"Query cache failed to set size %lu, new query cache size is %lu",
"Column '%-.64s' cannot be part of FULLTEXT index",
"Unknown key cache '%-.100s'",
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
"Unknown table engine '%s'",
"'%s' is deprecated. Use '%s' instead.",
"The target table %-.100s of the %s is not updatable.",
"The '%s' feature was disabled. You need MySQL built with '%s' define to have it working"
"MySQL is started in --skip-grant-tables mode. You can't use this command"
"Can't create a %s from within another stored routine" "Can't create a %s from within another stored routine"
"%s %s already exists" "%s %s already exists"
"%s %s does not exist" "%s %s does not exist"
......
...@@ -548,7 +548,7 @@ db_show_routine_status(THD *thd, int type, const char *wild) ...@@ -548,7 +548,7 @@ db_show_routine_status(THD *thd, int type, const char *wild)
} }
/* Init fields */ /* Init fields */
setup_tables(&tables, 0); setup_tables(&tables);
for (used_field= &used_fields[0]; for (used_field= &used_fields[0];
used_field->field_name; used_field->field_name;
used_field++) used_field++)
......
...@@ -1351,7 +1351,7 @@ bool delayed_insert::handle_inserts(void) ...@@ -1351,7 +1351,7 @@ bool delayed_insert::handle_inserts(void)
on this table until all entries has been processed on this table until all entries has been processed
*/ */
if (group_count++ >= max_rows && (row= rows.head()) && if (group_count++ >= max_rows && (row= rows.head()) &&
(!(row->log_query & DELAYED_LOG_BIN && using_bin_log) || (!(row->log_query & using_bin_log) ||
row->query)) row->query))
{ {
group_count=0; group_count=0;
......
...@@ -1982,7 +1982,6 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table, ...@@ -1982,7 +1982,6 @@ int mysql_create_like_table(THD* thd, TABLE_LIST* table,
} }
// Must be written before unlock // Must be written before unlock
mysql_update_log.write(thd,thd->query, thd->query_length);
if (mysql_bin_log.is_open()) if (mysql_bin_log.is_open())
{ {
thd->clear_error(); thd->clear_error();
......
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