mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Post-merge fixes, some quite complex. client/mysqlbinlog.cc and sql/log_event.cc
merged manually by guilhem. client/mysqlbinlog.cc: Post-merge fixes; manually merged by guilhem. include/mysqld_error.h: Post-merge fixes. mysql-test/r/drop_temp_table.result: Post-merge fixes. mysql-test/r/insert.result: Post-merge fixes. mysql-test/r/mysqlbinlog.result: Post-merge fixes. mysql-test/r/query_cache.result: Post-merge fixes. mysql-test/r/rpl_error_ignored_table.result: Post-merge fixes. mysql-test/r/rpl_relayrotate.result: Post-merge fixes. mysql-test/r/rpl_trunc_binlog.result: Post-merge fixes. mysql-test/r/sp-error.result: Post-merge fixes. mysql-test/r/sp.result: Post-merge fixes. mysql-test/r/system_mysql_db.result: Post-merge fixes. mysql-test/r/variables.result: Post-merge fixes. mysql-test/t/rpl_error_ignored_table.test: Post-merge fixes. mysql-test/t/sp-error.test: Post-merge fixes. sql/ha_innodb.cc: Post-merge fixes. sql/log_event.cc: Post-merge fixes; manually merged by guilhem. sql/set_var.cc: Post-merge fixes. sql/share/danish/errmsg.txt: Post-merge fixes. sql/share/dutch/errmsg.txt: Post-merge fixes. sql/share/english/errmsg.txt: Post-merge fixes. sql/share/estonian/errmsg.txt: Post-merge fixes. sql/sp.cc: Post-merge fixes. sql/sql_insert.cc: Post-merge fixes. sql/sql_table.cc: Post-merge fixes.
This commit is contained in:
@ -1,4 +1,4 @@
|
|||||||
/* 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;
|
|||||||
// 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;
|
|||||||
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,83 +175,275 @@ 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)
|
|
||||||
{
|
|
||||||
Create_file_log_event* ce= (ae->file_id < file_names.elements) ?
|
|
||||||
*((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
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
There is no Create_file event (a bad binlog or a big
|
|
||||||
--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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
const char *Load_log_processor::create_file(Create_file_log_event *ce)
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
if (my_net_write(net, "", 0) || net_flush(net))
|
||||||
|
{
|
||||||
|
sql_print_error("Failed sending the ack packet");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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
|
|
||||||
time. Fortunately this should never be the case.
|
|
||||||
|
|
||||||
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
|
|
||||||
names.
|
|
||||||
*/
|
|
||||||
for (;;)
|
|
||||||
{
|
{
|
||||||
sprintf(ptr,"-%x",version);
|
sql_print_error("Could not construct local filename %s%s",
|
||||||
if (access(tmp,F_OK))
|
target_dir_name,bname);
|
||||||
break;
|
DBUG_RETURN(-1);
|
||||||
/* If we have to try more than 1000 times, something is seriously wrong */
|
|
||||||
if (version++ > 1000)
|
|
||||||
{
|
|
||||||
die("Could not construct local filename %s%s",target_dir_name,bname);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ce->set_fname_outside_temp_buf(tmp,strlen(tmp));
|
ce->set_fname_outside_temp_buf(fname,strlen(fname));
|
||||||
return tmp;
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
There is no Create_file event (a bad binlog or a big
|
||||||
|
--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);
|
||||||
|
DBUG_RETURN(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Load_log_processor load_processor;
|
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)
|
||||||
|
{
|
||||||
|
if (!short_form)
|
||||||
|
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;
|
||||||
|
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)))
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
|
(*rec_count)++;
|
||||||
|
if (ev)
|
||||||
|
delete ev;
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct my_option my_long_options[] =
|
static struct my_option my_long_options[] =
|
||||||
{
|
{
|
||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
@ -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,...)
|
|||||||
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, ...)
|
|||||||
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");
|
|||||||
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)
|
|||||||
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()
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
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)
|
|||||||
}
|
}
|
||||||
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)
|
||||||
{
|
{
|
||||||
switch (ev->get_type_code())
|
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))
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
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",
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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 @@
|
|||||||
#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);
|
|||||||
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
|
|||||||
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");
|
|||||||
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");
|
|||||||
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;
|
|||||||
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;
|
|||||||
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");
|
|||||||
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;
|
|||||||
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
|
|||||||
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
|
|||||||
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);
|
|||||||
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;
|
|||||||
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
|
|||||||
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
|
|||||||
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;
|
|||||||
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()|
|
|||||||
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;
|
|||||||
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|
|
|||||||
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
|
|||||||
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;
|
|||||||
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;
|
|||||||
--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
|
|||||||
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|
|
|||||||
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
|
|||||||
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|
|
|||||||
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)
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
|||||||
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|
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
|||||||
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
|
|||||||
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|
|
|||||||
#
|
#
|
||||||
# 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|
|
|||||||
#
|
#
|
||||||
# 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
|
|||||||
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
|
|||||||
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
|
|||||||
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(
|
|||||||
|
|
||||||
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 */
|
||||||
|
|
||||||
|
372
sql/log_event.cc
372
sql/log_event.cc
@ -1,4 +1,4 @@
|
|||||||
/* 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)
|
|||||||
#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)
|
|||||||
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,
|
|||||||
|
|
||||||
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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
(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.
|
|
||||||
*/
|
|
||||||
else if (expected_error == actual_error ||
|
|
||||||
ignored_error_code(actual_error))
|
|
||||||
{
|
|
||||||
DBUG_PRINT("info",("error ignored"));
|
|
||||||
thd->query_error = 0;
|
|
||||||
*rli->last_slave_error = 0;
|
|
||||||
rli->last_slave_errno = 0;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
Other cases: mostly we expected no error and get one.
|
|
||||||
*/
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
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
|
|
||||||
above mysql_parse() computed. And we need to know the value of
|
|
||||||
"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
|
|
||||||
of "affected" in the binlog. So we can release 5.0.0 before effectively
|
|
||||||
logging "affected" and effectively comparing it.
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
End of sanity check. If the test was false, the query got a really bad
|
If we get the same error code as expected, or they should be ignored.
|
||||||
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
|
else if (expected_error == actual_error ||
|
||||||
things, and it has set thd->query_error to 1.
|
ignored_error_code(actual_error))
|
||||||
|
{
|
||||||
|
DBUG_PRINT("info",("error ignored"));
|
||||||
|
clear_all_errors(thd, rli);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Other cases: mostly we expected no error and get one.
|
||||||
|
*/
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
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
|
||||||
|
above mysql_parse() computed. And we need to know the value of
|
||||||
|
"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
|
||||||
|
of "affected" in the binlog. So we can release 5.0.0 before effectively
|
||||||
|
logging "affected" and effectively comparing it.
|
||||||
*/
|
*/
|
||||||
} /* 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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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)
|
|||||||
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 ");
|
||||||
|
pos= pretty_print_str(pos, sql_ex.enclosed, sql_ex.enclosed_len);
|
||||||
|
|
||||||
if (sql_ex.enclosed_len)
|
pos= strmov(pos, " ESCAPED BY ");
|
||||||
{
|
pos= pretty_print_str(pos, sql_ex.escaped, sql_ex.escaped_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);
|
|
||||||
}
|
|
||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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
|
|||||||
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
|
|||||||
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.enclosed)
|
if (sql_ex.opt_flags & OPT_ENCLOSED_FLAG)
|
||||||
{
|
fprintf(file," OPTIONALLY ");
|
||||||
if (sql_ex.opt_flags & OPT_ENCLOSED_FLAG)
|
fprintf(file, " ENCLOSED BY ");
|
||||||
fprintf(file," OPTIONALLY ");
|
pretty_print_str(file, sql_ex.enclosed, sql_ex.enclosed_len);
|
||||||
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);
|
fprintf(file," LINES TERMINATED BY ");
|
||||||
}
|
pretty_print_str(file, sql_ex.line_term, sql_ex.line_term_len);
|
||||||
|
|
||||||
bool line_lexem_added= false;
|
|
||||||
if (sql_ex.line_term)
|
|
||||||
{
|
|
||||||
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
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
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);
|
||||||
|
if (!use_rli_only_for_errors)
|
||||||
|
{
|
||||||
|
/* 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
|
||||||
|
}
|
||||||
|
|
||||||
/* Saved for InnoDB, see comment in Query_log_event::exec_event() */
|
/*
|
||||||
rli->future_group_master_log_pos= log_pos;
|
|
||||||
/*
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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))
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
358
sql/set_var.cc
358
sql/set_var.cc
@ -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=
|
|||||||
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);
|
|||||||
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");
|
|||||||
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",
|
|||||||
&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",
|
|||||||
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",
|
|||||||
&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",
|
|||||||
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",
|
|||||||
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);
|
||||||
@ -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",
|
|||||||
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[]=
|
|||||||
&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[]=
|
|||||||
&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[]=
|
|||||||
&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[]=
|
|||||||
&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[]=
|
|||||||
&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[]= {
|
|||||||
{"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[]= {
|
|||||||
{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[]= {
|
|||||||
{"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_block_size.name, (char*) &sys_key_cache_block_size,
|
|
||||||
SHOW_SYS},
|
|
||||||
{sys_key_cache_division_limit.name, (char*) &sys_key_cache_division_limit,
|
|
||||||
SHOW_SYS},
|
|
||||||
{sys_key_cache_age_threshold.name, (char*) &sys_key_cache_age_threshold,
|
{sys_key_cache_age_threshold.name, (char*) &sys_key_cache_age_threshold,
|
||||||
SHOW_SYS},
|
SHOW_SYS},
|
||||||
|
{sys_key_cache_block_size.name, (char*) &sys_key_cache_block_size,
|
||||||
|
SHOW_SYS},
|
||||||
|
{sys_key_cache_division_limit.name, (char*) &sys_key_cache_division_limit,
|
||||||
|
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[]= {
|
|||||||
{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[]= {
|
|||||||
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[]= {
|
|||||||
{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[]= {
|
|||||||
{"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[]= {
|
|||||||
{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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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;
|
||||||
@ -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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
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
|
|||||||
"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
|
|||||||
"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
|
|||||||
"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
|
|||||||
"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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 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)
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 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();
|
||||||
|
Reference in New Issue
Block a user