mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
Merge pgalbraith@bk-internal.mysql.com:/home/bk/mysql-5.0
into krsna.:/home/patg/test/mysql-5.0
This commit is contained in:
commit
a3869dd811
83 changed files with 1626 additions and 628 deletions
|
@ -1106,3 +1106,4 @@ vio/test-ssl
|
|||
vio/test-sslclient
|
||||
vio/test-sslserver
|
||||
vio/viotest-ssl
|
||||
VC++Files/client/mysql_amd64.dsp
|
||||
|
|
|
@ -2154,7 +2154,7 @@ print_table_data_xml(MYSQL_RES *result)
|
|||
for (uint i=0; i < mysql_num_fields(result); i++)
|
||||
{
|
||||
tee_fprintf(PAGER, "\t<field name=\"");
|
||||
xmlencode_print(fields[i].name, strlen(fields[i].name));
|
||||
xmlencode_print(fields[i].name, (uint) strlen(fields[i].name));
|
||||
tee_fprintf(PAGER, "\">");
|
||||
xmlencode_print(cur[i], lengths[i]);
|
||||
tee_fprintf(PAGER, "</field>\n");
|
||||
|
|
|
@ -103,6 +103,22 @@ class Load_log_processor
|
|||
{
|
||||
char target_dir_name[FN_REFLEN];
|
||||
int target_dir_name_len;
|
||||
|
||||
/*
|
||||
When we see first event corresponding to some LOAD DATA statement in
|
||||
binlog, we create temporary file to store data to be loaded.
|
||||
We add name of this file to file_names array using its file_id as index.
|
||||
If we have Create_file event (i.e. we have binary log in pre-5.0.3
|
||||
format) we also store save event object to be able which is needed to
|
||||
emit LOAD DATA statement when we will meet Exec_load_data event.
|
||||
If we have Begin_load_query event we simply store 0 in
|
||||
File_name_record::event field.
|
||||
*/
|
||||
struct File_name_record
|
||||
{
|
||||
char *fname;
|
||||
Create_file_log_event *event;
|
||||
};
|
||||
DYNAMIC_ARRAY file_names;
|
||||
|
||||
/*
|
||||
|
@ -144,7 +160,7 @@ public:
|
|||
|
||||
int init()
|
||||
{
|
||||
return init_dynamic_array(&file_names,sizeof(Create_file_log_event*),
|
||||
return init_dynamic_array(&file_names, sizeof(File_name_record),
|
||||
100,100 CALLER_INFO);
|
||||
}
|
||||
|
||||
|
@ -161,33 +177,91 @@ public:
|
|||
}
|
||||
void destroy()
|
||||
{
|
||||
Create_file_log_event **ptr= (Create_file_log_event**)file_names.buffer;
|
||||
Create_file_log_event **end= ptr + file_names.elements;
|
||||
File_name_record *ptr= (File_name_record *)file_names.buffer;
|
||||
File_name_record *end= ptr + file_names.elements;
|
||||
for (; ptr<end; ptr++)
|
||||
{
|
||||
if (*ptr)
|
||||
if (ptr->fname)
|
||||
{
|
||||
my_free((char*)(*ptr)->fname,MYF(MY_WME));
|
||||
delete *ptr;
|
||||
*ptr= 0;
|
||||
my_free(ptr->fname, MYF(MY_WME));
|
||||
delete ptr->event;
|
||||
bzero((char *)ptr, sizeof(File_name_record));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Obtain Create_file event for LOAD DATA statement by its file_id.
|
||||
|
||||
SYNOPSIS
|
||||
grab_event()
|
||||
file_id - file_id identifiying LOAD DATA statement
|
||||
|
||||
DESCRIPTION
|
||||
Checks whenever we have already seen Create_file event for this file_id.
|
||||
If yes then returns pointer to it and removes it from array describing
|
||||
active temporary files. Since this moment caller is responsible for
|
||||
freeing memory occupied by this event and associated file name.
|
||||
|
||||
RETURN VALUES
|
||||
Pointer to Create_file event or 0 if there was no such event
|
||||
with this file_id.
|
||||
*/
|
||||
Create_file_log_event *grab_event(uint file_id)
|
||||
{
|
||||
File_name_record *ptr;
|
||||
Create_file_log_event *res;
|
||||
|
||||
if (file_id >= file_names.elements)
|
||||
return 0;
|
||||
Create_file_log_event **ptr=
|
||||
(Create_file_log_event**)file_names.buffer + file_id;
|
||||
Create_file_log_event *res= *ptr;
|
||||
*ptr= 0;
|
||||
ptr= dynamic_element(&file_names, file_id, File_name_record*);
|
||||
if ((res= ptr->event))
|
||||
bzero((char *)ptr, sizeof(File_name_record));
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
Obtain file name of temporary file for LOAD DATA statement by its file_id.
|
||||
|
||||
SYNOPSIS
|
||||
grab_fname()
|
||||
file_id - file_id identifiying LOAD DATA statement
|
||||
|
||||
DESCRIPTION
|
||||
Checks whenever we have already seen Begin_load_query event for this
|
||||
file_id. If yes then returns file name of corresponding temporary file.
|
||||
Removes record about this file from the array of active temporary files.
|
||||
Since this moment caller is responsible for freeing memory occupied by
|
||||
this name.
|
||||
|
||||
RETURN VALUES
|
||||
String with name of temporary file or 0 if we have not seen Begin_load_query
|
||||
event with this file_id.
|
||||
*/
|
||||
char *grab_fname(uint file_id)
|
||||
{
|
||||
File_name_record *ptr;
|
||||
char *res= 0;
|
||||
|
||||
if (file_id >= file_names.elements)
|
||||
return 0;
|
||||
ptr= dynamic_element(&file_names, file_id, File_name_record*);
|
||||
if (!ptr->event)
|
||||
{
|
||||
res= ptr->fname;
|
||||
bzero((char *)ptr, sizeof(File_name_record));
|
||||
}
|
||||
return res;
|
||||
}
|
||||
int process(Create_file_log_event *ce);
|
||||
int process(Begin_load_query_log_event *ce);
|
||||
int process(Append_block_log_event *ae);
|
||||
File prepare_new_file_for_old_format(Load_log_event *le, char *filename);
|
||||
int load_old_format_file(NET* net, const char *server_fname,
|
||||
uint server_fname_len, File file);
|
||||
int process_first_event(const char *bname, uint blen, const char *block,
|
||||
uint block_len, uint file_id,
|
||||
Create_file_log_event *ce);
|
||||
};
|
||||
|
||||
|
||||
|
@ -265,22 +339,42 @@ int Load_log_processor::load_old_format_file(NET* net, const char*server_fname,
|
|||
}
|
||||
|
||||
|
||||
int Load_log_processor::process(Create_file_log_event *ce)
|
||||
/*
|
||||
Process first event in the sequence of events representing LOAD DATA
|
||||
statement.
|
||||
|
||||
SYNOPSIS
|
||||
process_first_event()
|
||||
bname - base name for temporary file to be created
|
||||
blen - base name length
|
||||
block - first block of data to be loaded
|
||||
block_len - first block length
|
||||
file_id - identifies LOAD DATA statement
|
||||
ce - pointer to Create_file event object if we are processing
|
||||
this type of event.
|
||||
|
||||
DESCRIPTION
|
||||
Creates temporary file to be used in LOAD DATA and writes first block of
|
||||
data to it. Registers its file name (and optional Create_file event)
|
||||
in the array of active temporary files.
|
||||
|
||||
RETURN VALUES
|
||||
0 - success
|
||||
non-0 - error
|
||||
*/
|
||||
|
||||
int Load_log_processor::process_first_event(const char *bname, uint blen,
|
||||
const char *block, uint block_len,
|
||||
uint file_id,
|
||||
Create_file_log_event *ce)
|
||||
{
|
||||
const char *bname= ce->fname+dirname_length(ce->fname);
|
||||
uint blen= ce->fname_len - (bname-ce->fname);
|
||||
uint full_len= target_dir_name_len + blen + 9 + 9 + 1;
|
||||
int error= 0;
|
||||
char *fname, *ptr;
|
||||
File file;
|
||||
DBUG_ENTER("Load_log_processor::process");
|
||||
File_name_record rec;
|
||||
DBUG_ENTER("Load_log_processor::process_first_event");
|
||||
|
||||
if (set_dynamic(&file_names,(gptr)&ce,ce->file_id))
|
||||
{
|
||||
sql_print_error("Could not construct local filename %s%s",
|
||||
target_dir_name,bname);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
if (!(fname= my_malloc(full_len,MYF(MY_WME))))
|
||||
DBUG_RETURN(-1);
|
||||
|
||||
|
@ -288,7 +382,7 @@ int Load_log_processor::process(Create_file_log_event *ce)
|
|||
ptr= fname + target_dir_name_len;
|
||||
memcpy(ptr,bname,blen);
|
||||
ptr+= blen;
|
||||
ptr+= my_sprintf(ptr,(ptr,"-%x",ce->file_id));
|
||||
ptr+= my_sprintf(ptr, (ptr, "-%x", file_id));
|
||||
|
||||
if ((file= create_unique_file(fname,ptr)) < 0)
|
||||
{
|
||||
|
@ -296,9 +390,21 @@ int Load_log_processor::process(Create_file_log_event *ce)
|
|||
target_dir_name,bname);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
ce->set_fname_outside_temp_buf(fname,strlen(fname));
|
||||
|
||||
if (my_write(file,(byte*) ce->block,ce->block_len,MYF(MY_WME|MY_NABP)))
|
||||
rec.fname= fname;
|
||||
rec.event= ce;
|
||||
|
||||
if (set_dynamic(&file_names, (gptr)&rec, file_id))
|
||||
{
|
||||
sql_print_error("Could not construct local filename %s%s",
|
||||
target_dir_name, bname);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
if (ce)
|
||||
ce->set_fname_outside_temp_buf(fname, strlen(fname));
|
||||
|
||||
if (my_write(file, (byte*)block, block_len, MYF(MY_WME|MY_NABP)))
|
||||
error= -1;
|
||||
if (my_close(file, MYF(MY_WME)))
|
||||
error= -1;
|
||||
|
@ -306,19 +412,35 @@ int Load_log_processor::process(Create_file_log_event *ce)
|
|||
}
|
||||
|
||||
|
||||
int Load_log_processor::process(Create_file_log_event *ce)
|
||||
{
|
||||
const char *bname= ce->fname + dirname_length(ce->fname);
|
||||
uint blen= ce->fname_len - (bname-ce->fname);
|
||||
|
||||
return process_first_event(bname, blen, ce->block, ce->block_len,
|
||||
ce->file_id, ce);
|
||||
}
|
||||
|
||||
|
||||
int Load_log_processor::process(Begin_load_query_log_event *blqe)
|
||||
{
|
||||
return process_first_event("SQL_LOAD_MB", 11, blqe->block, blqe->block_len,
|
||||
blqe->file_id, 0);
|
||||
}
|
||||
|
||||
|
||||
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);
|
||||
const char* fname= ((ae->file_id < file_names.elements) ?
|
||||
dynamic_element(&file_names, ae->file_id,
|
||||
File_name_record*)->fname : 0);
|
||||
|
||||
if (ce)
|
||||
if (fname)
|
||||
{
|
||||
File file;
|
||||
int error= 0;
|
||||
if (((file= my_open(ce->fname,
|
||||
if (((file= my_open(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)))
|
||||
|
@ -342,6 +464,14 @@ Create_file event for file_id: %u\n",ae->file_id);
|
|||
Load_log_processor load_processor;
|
||||
|
||||
|
||||
static bool check_database(const char *log_dbname)
|
||||
{
|
||||
return one_database &&
|
||||
(log_dbname != NULL) &&
|
||||
strcmp(log_dbname, database);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Process an event
|
||||
|
||||
|
@ -395,29 +525,21 @@ int process_event(LAST_EVENT_INFO *last_event_info, Log_event *ev,
|
|||
|
||||
switch (ev_type) {
|
||||
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;
|
||||
}
|
||||
if (check_database(((Query_log_event*)ev)->db))
|
||||
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 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.
|
||||
*/
|
||||
if (check_database(ce->db))
|
||||
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
|
||||
|
@ -473,6 +595,32 @@ Create_file event for file_id: %u\n",exv->file_id);
|
|||
*/
|
||||
ev= 0;
|
||||
break;
|
||||
case BEGIN_LOAD_QUERY_EVENT:
|
||||
ev->print(result_file, short_form, last_event_info);
|
||||
load_processor.process((Begin_load_query_log_event*) ev);
|
||||
break;
|
||||
case EXECUTE_LOAD_QUERY_EVENT:
|
||||
{
|
||||
Execute_load_query_log_event *exlq= (Execute_load_query_log_event*)ev;
|
||||
char *fname= load_processor.grab_fname(exlq->file_id);
|
||||
|
||||
if (check_database(exlq->db))
|
||||
{
|
||||
if (fname)
|
||||
my_free(fname, MYF(MY_WME));
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (fname)
|
||||
{
|
||||
exlq->print(result_file, short_form, last_event_info, fname);
|
||||
my_free(fname, MYF(MY_WME));
|
||||
}
|
||||
else
|
||||
fprintf(stderr,"Warning: ignoring Execute_load_query as there is no \
|
||||
Begin_load_query event for file_id: %u\n", exlq->file_id);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
ev->print(result_file, short_form, last_event_info);
|
||||
}
|
||||
|
|
|
@ -401,11 +401,20 @@ sym_tab_add_null_lit() */
|
|||
|
||||
struct dtype_struct{
|
||||
ulint mtype; /* main data type */
|
||||
ulint prtype; /* precise type; MySQL data type */
|
||||
ulint prtype; /* precise type; MySQL data type, charset code,
|
||||
flags to indicate nullability, signedness,
|
||||
whether this is a binary string, whether this
|
||||
is a true VARCHAR where MySQL uses 2 bytes to
|
||||
store the length */
|
||||
|
||||
/* the remaining fields do not affect alphabetical ordering: */
|
||||
|
||||
ulint len; /* length */
|
||||
ulint len; /* length; for MySQL data this is
|
||||
field->pack_length(), except that for a
|
||||
>= 5.0.3 type true VARCHAR this is the
|
||||
maximum byte length of the string data
|
||||
(in addition to the string, MySQL uses 1 or
|
||||
2 bytes to store the string length) */
|
||||
ulint prec; /* precision */
|
||||
|
||||
ulint mbminlen; /* minimum length of a character, in bytes */
|
||||
|
|
|
@ -2018,7 +2018,8 @@ Converts a key value stored in MySQL format to an Innobase dtuple. The last
|
|||
field of the key value may be just a prefix of a fixed length field: hence
|
||||
the parameter key_len. But currently we do not allow search keys where the
|
||||
last field is only a prefix of the full key field len and print a warning if
|
||||
such appears. */
|
||||
such appears. A counterpart of this function is
|
||||
ha_innobase::store_key_val_for_row() in ha_innodb.cc. */
|
||||
|
||||
void
|
||||
row_sel_convert_mysql_key_to_innobase(
|
||||
|
@ -2099,10 +2100,10 @@ row_sel_convert_mysql_key_to_innobase(
|
|||
type = dfield_get_type(dfield)->mtype;
|
||||
|
||||
/* Calculate data length and data field total length */
|
||||
|
||||
|
||||
if (type == DATA_BLOB) {
|
||||
/* The key field is a column prefix of a BLOB or
|
||||
TEXT type column */
|
||||
TEXT */
|
||||
|
||||
ut_a(field->prefix_len > 0);
|
||||
|
||||
|
@ -2118,9 +2119,10 @@ row_sel_convert_mysql_key_to_innobase(
|
|||
data_len = key_ptr[data_offset]
|
||||
+ 256 * key_ptr[data_offset + 1];
|
||||
data_field_len = data_offset + 2 + field->prefix_len;
|
||||
|
||||
data_offset += 2;
|
||||
|
||||
/* now that we know the length, we store the column
|
||||
/* Now that we know the length, we store the column
|
||||
value like it would be a fixed char field */
|
||||
|
||||
} else if (field->prefix_len > 0) {
|
||||
|
@ -2142,6 +2144,18 @@ row_sel_convert_mysql_key_to_innobase(
|
|||
data_field_len = data_offset + data_len;
|
||||
}
|
||||
|
||||
if (dtype_get_mysql_type(dfield_get_type(dfield))
|
||||
== DATA_MYSQL_TRUE_VARCHAR) {
|
||||
/* In a MySQL key value format, a true VARCHAR is
|
||||
always preceded by 2 bytes of a length field.
|
||||
dfield_get_type(dfield)->len returns the maximum
|
||||
'payload' len in bytes. That does not include the
|
||||
2 bytes that tell the actual data length. */
|
||||
|
||||
data_len += 2;
|
||||
data_field_len += 2;
|
||||
}
|
||||
|
||||
/* Storing may use at most data_len bytes of buf */
|
||||
|
||||
if (!is_null) {
|
||||
|
|
|
@ -1541,12 +1541,14 @@ run_testcase ()
|
|||
disable_test $tname "$comment"
|
||||
return
|
||||
fi
|
||||
comment=`$GREP "^$tname *: *" $TESTDIR/disabled.def`;
|
||||
if [ -n "$comment" ]
|
||||
then
|
||||
comment=`echo $comment | sed 's/^[^:]*: *//'`
|
||||
disable_test $tname "$comment"
|
||||
return
|
||||
if [ -f "$TESTDIR/disabled.def" ] ; then
|
||||
comment=`$GREP "^$tname *: *" $TESTDIR/disabled.def`;
|
||||
if [ -n "$comment" ]
|
||||
then
|
||||
comment=`echo $comment | sed 's/^[^:]*: *//'`
|
||||
disable_test $tname "$comment"
|
||||
return
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ "x$USE_EMBEDDED_SERVER" != "x1" ] ; then
|
||||
|
|
|
@ -523,10 +523,10 @@ create table t2 (c char(30)) charset=ucs2;
|
|||
set @v=convert('abc' using ucs2);
|
||||
reset master;
|
||||
insert into t2 values (@v);
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 User var 1 136 @`v`=_ucs2 0x006100620063 COLLATE ucs2_general_ci
|
||||
master-bin.000001 136 Query 1 226 use `test`; insert into t2 values (@v)
|
||||
master-bin.000001 # User var 1 # @`v`=_ucs2 0x006100620063 COLLATE ucs2_general_ci
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t2 values (@v)
|
||||
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
ROLLBACK;
|
||||
|
|
|
@ -178,7 +178,7 @@ teststring
|
|||
teststring
|
||||
explain select * from t1 order by text1;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 index NULL key1 32 NULL 3 Using index
|
||||
1 SIMPLE t1 index NULL key1 34 NULL 3 Using index
|
||||
alter table t1 modify text1 char(32) binary not null;
|
||||
select * from t1 order by text1;
|
||||
text1
|
||||
|
|
|
@ -1466,13 +1466,13 @@ Error 1146 Table 'test.t4' doesn't exist
|
|||
checksum table t1, t2, t3;
|
||||
Table Checksum
|
||||
test.t1 2948697075
|
||||
test.t2 968604391
|
||||
test.t3 968604391
|
||||
test.t2 1157260244
|
||||
test.t3 1157260244
|
||||
checksum table t1, t2, t3 extended;
|
||||
Table Checksum
|
||||
test.t1 3092701434
|
||||
test.t2 968604391
|
||||
test.t3 968604391
|
||||
test.t2 1157260244
|
||||
test.t3 1157260244
|
||||
drop table t1,t2,t3;
|
||||
create table t1 (id int, name char(10) not null, name2 char(10) not null) engine=innodb;
|
||||
insert into t1 values(1,'first','fff'),(2,'second','sss'),(3,'third','ttt');
|
||||
|
@ -1809,6 +1809,6 @@ show variables like "innodb_thread_sleep_delay";
|
|||
Variable_name Value
|
||||
innodb_thread_sleep_delay 10000
|
||||
create table t1 (v varchar(16384)) engine=innodb;
|
||||
ERROR 42000: Column length too big for column 'v' (max = 255); use BLOB instead
|
||||
drop table t1;
|
||||
create table t1 (a bit, key(a)) engine=innodb;
|
||||
ERROR 42000: The storage engine for the table doesn't support BIT FIELD
|
||||
|
|
|
@ -74,8 +74,8 @@ insert into t1 select * from t2;
|
|||
ERROR 23000: Duplicate entry '2' for key 1
|
||||
show binlog events;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 96 Query 1 191 use `test`; insert into t1 select * from t2
|
||||
master-bin.000001 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t1 select * from t2
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
|
@ -88,7 +88,7 @@ create table t2(unique(a)) select a from t1;
|
|||
ERROR 23000: Duplicate entry '1' for key 1
|
||||
show binlog events;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4
|
||||
drop table t1;
|
||||
create table t1 (a int not null);
|
||||
create table t2 (a int not null);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
drop table if exists t1;
|
||||
drop table if exists t1, t2;
|
||||
create table t1 (a date, b date, c date not null, d date);
|
||||
load data infile '../../std_data/loaddata1.dat' into table t1 fields terminated by ',';
|
||||
Warnings:
|
||||
|
@ -66,3 +66,57 @@ a b
|
|||
3 row 3
|
||||
0
|
||||
drop table t1;
|
||||
create table t1 (a int default 100, b int, c varchar(60));
|
||||
load data infile '../../std_data/rpl_loaddata.dat' into table t1 (a, @b) set b=@b+10, c=concat("b=",@b);
|
||||
select * from t1;
|
||||
a b c
|
||||
NULL 20 b=10
|
||||
NULL 25 b=15
|
||||
truncate table t1;
|
||||
load data infile '../../std_data/rpl_loaddata.dat' into table t1 (a, @b) set c= if(a is null,"oops",a);
|
||||
select * from t1;
|
||||
a b c
|
||||
NULL NULL oops
|
||||
NULL NULL oops
|
||||
truncate table t1;
|
||||
set @c:=123;
|
||||
load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@a, b) set c= if(@a is null,@c,b);
|
||||
select * from t1;
|
||||
a b c
|
||||
100 10 123
|
||||
100 15 123
|
||||
load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@a, @b);
|
||||
select * from t1;
|
||||
a b c
|
||||
100 10 123
|
||||
100 15 123
|
||||
100 NULL NULL
|
||||
100 NULL NULL
|
||||
select @a, @b;
|
||||
@a @b
|
||||
NULL 15
|
||||
truncate table t1;
|
||||
load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (a, b) set c="Wow";
|
||||
select * from t1;
|
||||
a b c
|
||||
1 2 Wow
|
||||
3 4 Wow
|
||||
5 6 Wow
|
||||
truncate table t1;
|
||||
load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (a, b) set c=concat(a,"+",b,"+",@c,"+",b,"+",if(c is null,"NIL",c));
|
||||
select * from t1;
|
||||
a b c
|
||||
1 2 1+2+123+2+NIL
|
||||
3 4 3+4+123+4+NIL
|
||||
5 6 5+6+123+6+NIL
|
||||
load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (a, @b);
|
||||
ERROR HY000: Can't load value from file with fixed size rows to variable
|
||||
create table t2 (num int primary key, str varchar(10));
|
||||
insert into t2 values (10,'Ten'), (15,'Fifteen');
|
||||
truncate table t1;
|
||||
load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@dummy,@n) set a= @n, c= (select str from t2 where num=@n);
|
||||
select * from t1;
|
||||
a b c
|
||||
10 NULL Ten
|
||||
15 NULL Fifteen
|
||||
drop table t1, t2;
|
||||
|
|
|
@ -6,12 +6,12 @@ begin;
|
|||
insert into t1 values(1);
|
||||
insert into t2 select * from t1;
|
||||
commit;
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 165 Query 1 # use `test`; insert into t1 values(1)
|
||||
master-bin.000001 253 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 348 Xid 1 # COMMIT /* xid=7 */
|
||||
master-bin.000001 98 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 167 Query 1 # use `test`; insert into t1 values(1)
|
||||
master-bin.000001 255 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 350 Xid 1 # COMMIT /* xid=7 */
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
reset master;
|
||||
|
@ -21,12 +21,12 @@ insert into t2 select * from t1;
|
|||
rollback;
|
||||
Warnings:
|
||||
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 165 Query 1 # use `test`; insert into t1 values(2)
|
||||
master-bin.000001 253 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 348 Query 1 # use `test`; ROLLBACK
|
||||
master-bin.000001 98 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 167 Query 1 # use `test`; insert into t1 values(2)
|
||||
master-bin.000001 255 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 350 Query 1 # use `test`; ROLLBACK
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
reset master;
|
||||
|
@ -39,15 +39,15 @@ rollback to savepoint my_savepoint;
|
|||
Warnings:
|
||||
Warning 1196 Some non-transactional changed tables couldn't be rolled back
|
||||
commit;
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 165 Query 1 # use `test`; insert into t1 values(3)
|
||||
master-bin.000001 253 Query 1 # use `test`; savepoint my_savepoint
|
||||
master-bin.000001 339 Query 1 # use `test`; insert into t1 values(4)
|
||||
master-bin.000001 427 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 522 Query 1 # use `test`; rollback to savepoint my_savepoint
|
||||
master-bin.000001 620 Xid 1 # COMMIT /* xid=24 */
|
||||
master-bin.000001 98 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 167 Query 1 # use `test`; insert into t1 values(3)
|
||||
master-bin.000001 255 Query 1 # use `test`; savepoint my_savepoint
|
||||
master-bin.000001 341 Query 1 # use `test`; insert into t1 values(4)
|
||||
master-bin.000001 429 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 524 Query 1 # use `test`; rollback to savepoint my_savepoint
|
||||
master-bin.000001 622 Xid 1 # COMMIT /* xid=24 */
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
reset master;
|
||||
|
@ -65,16 +65,16 @@ select a from t1 order by a;
|
|||
a
|
||||
5
|
||||
7
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 165 Query 1 # use `test`; insert into t1 values(5)
|
||||
master-bin.000001 253 Query 1 # use `test`; savepoint my_savepoint
|
||||
master-bin.000001 339 Query 1 # use `test`; insert into t1 values(6)
|
||||
master-bin.000001 427 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 522 Query 1 # use `test`; rollback to savepoint my_savepoint
|
||||
master-bin.000001 620 Query 1 # use `test`; insert into t1 values(7)
|
||||
master-bin.000001 708 Xid 1 # COMMIT /* xid=36 */
|
||||
master-bin.000001 98 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 167 Query 1 # use `test`; insert into t1 values(5)
|
||||
master-bin.000001 255 Query 1 # use `test`; savepoint my_savepoint
|
||||
master-bin.000001 341 Query 1 # use `test`; insert into t1 values(6)
|
||||
master-bin.000001 429 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 524 Query 1 # use `test`; rollback to savepoint my_savepoint
|
||||
master-bin.000001 622 Query 1 # use `test`; insert into t1 values(7)
|
||||
master-bin.000001 710 Xid 1 # COMMIT /* xid=36 */
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
reset master;
|
||||
|
@ -87,43 +87,43 @@ insert into t2 select * from t1;
|
|||
select get_lock("a",10);
|
||||
get_lock("a",10)
|
||||
1
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 165 Query 1 # use `test`; insert into t1 values(8)
|
||||
master-bin.000001 253 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 348 Query 1 # use `test`; ROLLBACK
|
||||
master-bin.000001 98 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 167 Query 1 # use `test`; insert into t1 values(8)
|
||||
master-bin.000001 255 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 350 Query 1 # use `test`; ROLLBACK
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
reset master;
|
||||
insert into t1 values(9);
|
||||
insert into t2 select * from t1;
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 # use `test`; insert into t1 values(9)
|
||||
master-bin.000001 184 Xid 1 # COMMIT /* xid=59 */
|
||||
master-bin.000001 211 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 98 Query 1 # use `test`; insert into t1 values(9)
|
||||
master-bin.000001 186 Xid 1 # COMMIT /* xid=59 */
|
||||
master-bin.000001 213 Query 1 # use `test`; insert into t2 select * from t1
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
reset master;
|
||||
insert into t1 values(10);
|
||||
begin;
|
||||
insert into t2 select * from t1;
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 # use `test`; insert into t1 values(10)
|
||||
master-bin.000001 185 Xid 1 # COMMIT /* xid=65 */
|
||||
master-bin.000001 212 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 98 Query 1 # use `test`; insert into t1 values(10)
|
||||
master-bin.000001 187 Xid 1 # COMMIT /* xid=65 */
|
||||
master-bin.000001 214 Query 1 # use `test`; insert into t2 select * from t1
|
||||
insert into t1 values(11);
|
||||
commit;
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 # use `test`; insert into t1 values(10)
|
||||
master-bin.000001 185 Xid 1 # COMMIT /* xid=65 */
|
||||
master-bin.000001 212 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 307 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 376 Query 1 # use `test`; insert into t1 values(11)
|
||||
master-bin.000001 465 Xid 1 # COMMIT /* xid=67 */
|
||||
master-bin.000001 98 Query 1 # use `test`; insert into t1 values(10)
|
||||
master-bin.000001 187 Xid 1 # COMMIT /* xid=65 */
|
||||
master-bin.000001 214 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 309 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 378 Query 1 # use `test`; insert into t1 values(11)
|
||||
master-bin.000001 467 Xid 1 # COMMIT /* xid=67 */
|
||||
alter table t2 engine=INNODB;
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
|
@ -132,12 +132,12 @@ begin;
|
|||
insert into t1 values(12);
|
||||
insert into t2 select * from t1;
|
||||
commit;
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 165 Query 1 # use `test`; insert into t1 values(12)
|
||||
master-bin.000001 254 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 349 Xid 1 # COMMIT /* xid=77 */
|
||||
master-bin.000001 98 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 167 Query 1 # use `test`; insert into t1 values(12)
|
||||
master-bin.000001 256 Query 1 # use `test`; insert into t2 select * from t1
|
||||
master-bin.000001 351 Xid 1 # COMMIT /* xid=77 */
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
reset master;
|
||||
|
@ -145,7 +145,7 @@ begin;
|
|||
insert into t1 values(13);
|
||||
insert into t2 select * from t1;
|
||||
rollback;
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
|
@ -157,11 +157,11 @@ insert into t1 values(15);
|
|||
insert into t2 select * from t1;
|
||||
rollback to savepoint my_savepoint;
|
||||
commit;
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 165 Query 1 # use `test`; insert into t1 values(14)
|
||||
master-bin.000001 254 Xid 1 # COMMIT /* xid=93 */
|
||||
master-bin.000001 98 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 167 Query 1 # use `test`; insert into t1 values(14)
|
||||
master-bin.000001 256 Xid 1 # COMMIT /* xid=93 */
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
reset master;
|
||||
|
@ -177,12 +177,12 @@ select a from t1 order by a;
|
|||
a
|
||||
16
|
||||
18
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 165 Query 1 # use `test`; insert into t1 values(16)
|
||||
master-bin.000001 254 Query 1 # use `test`; insert into t1 values(18)
|
||||
master-bin.000001 343 Xid 1 # COMMIT /* xid=104 */
|
||||
master-bin.000001 98 Query 1 # use `test`; BEGIN
|
||||
master-bin.000001 167 Query 1 # use `test`; insert into t1 values(16)
|
||||
master-bin.000001 256 Query 1 # use `test`; insert into t1 values(18)
|
||||
master-bin.000001 345 Xid 1 # COMMIT /* xid=104 */
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
alter table t2 type=MyISAM;
|
||||
|
|
|
@ -9,7 +9,6 @@ load data infile '../../std_data/words.dat' into table t1;
|
|||
load data infile '../../std_data/words.dat' into table t1;
|
||||
load data infile '../../std_data/words.dat' into table t1;
|
||||
load data infile '../../std_data/words.dat' into table t1;
|
||||
load data infile '../../std_data/words.dat' into table t1;
|
||||
insert into t1 values ("Alas");
|
||||
flush logs;
|
||||
|
||||
|
@ -32,11 +31,14 @@ insert into t1 values ("abirvalg");
|
|||
SET INSERT_ID=1;
|
||||
SET TIMESTAMP=1000000000;
|
||||
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-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-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);
|
||||
SET TIMESTAMP=1000000000;
|
||||
load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-1-0' INTO table t1;
|
||||
SET TIMESTAMP=1000000000;
|
||||
load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-2-0' INTO table t1;
|
||||
SET TIMESTAMP=1000000000;
|
||||
load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-3-0' INTO table t1;
|
||||
SET TIMESTAMP=1000000000;
|
||||
load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-4-0' INTO table t1;
|
||||
ROLLBACK;
|
||||
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
|
||||
|
||||
|
@ -91,11 +93,14 @@ insert into t1 values ("abirvalg");
|
|||
SET INSERT_ID=1;
|
||||
SET TIMESTAMP=1000000000;
|
||||
insert into t2 values ();
|
||||
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);
|
||||
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);
|
||||
SET TIMESTAMP=1000000000;
|
||||
load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-1-2' INTO table t1;
|
||||
SET TIMESTAMP=1000000000;
|
||||
load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-2-2' INTO table t1;
|
||||
SET TIMESTAMP=1000000000;
|
||||
load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-3-2' INTO table t1;
|
||||
SET TIMESTAMP=1000000000;
|
||||
load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD_MB-4-2' INTO table t1;
|
||||
ROLLBACK;
|
||||
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
DROP TABLE IF EXISTS t1, `"t"1`, t1aa,t2aa;
|
||||
DROP TABLE IF EXISTS t1, `"t"1`, t1aa, t2, t2aa;
|
||||
drop database if exists mysqldump_test_db;
|
||||
drop view if exists v1;
|
||||
CREATE TABLE t1(a int);
|
||||
|
|
|
@ -70,7 +70,7 @@ def test t9 t9 c18 c18 1 4 1 Y 32768 0 63
|
|||
def test t9 t9 c19 c19 1 1 1 Y 32768 0 63
|
||||
def test t9 t9 c20 c20 254 1 1 Y 0 0 8
|
||||
def test t9 t9 c21 c21 254 10 10 Y 0 0 8
|
||||
def test t9 t9 c22 c22 254 30 30 Y 0 0 8
|
||||
def test t9 t9 c22 c22 253 30 30 Y 0 0 8
|
||||
def test t9 t9 c23 c23 252 255 8 Y 144 0 63
|
||||
def test t9 t9 c24 c24 252 255 8 Y 16 0 8
|
||||
def test t9 t9 c25 c25 252 65535 4 Y 144 0 63
|
||||
|
@ -1691,8 +1691,8 @@ affected rows: 3
|
|||
info: Records: 3 Duplicates: 0 Warnings: 0
|
||||
select a,b from t2 order by a ;
|
||||
a b
|
||||
3 duplicate
|
||||
4 duplicate
|
||||
3 duplicate
|
||||
4 duplicate
|
||||
103 three
|
||||
delete from t2 ;
|
||||
prepare stmt1 from ' insert into t2 (b,a)
|
||||
|
@ -1710,8 +1710,8 @@ affected rows: 3
|
|||
info: Records: 3 Duplicates: 0 Warnings: 0
|
||||
select a,b from t2 order by a ;
|
||||
a b
|
||||
3 duplicate
|
||||
4 duplicate
|
||||
3 duplicate
|
||||
4 duplicate
|
||||
103 three
|
||||
drop table t2;
|
||||
drop table if exists t5 ;
|
||||
|
|
|
@ -178,9 +178,9 @@ insert into t1 values ('','empt',2,2),
|
|||
('dddd','d--d',2,2);
|
||||
select * from t1 force index(key1, key2) where key1 < 3 or key2 < 3;
|
||||
pk1 pk2 key1 key2
|
||||
empt 2 2
|
||||
a a--a 2 2
|
||||
bb b--b 2 2
|
||||
ccc c--c 2 2
|
||||
dddd d--d 2 2
|
||||
empt 2 2
|
||||
drop table t1;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
reset master;
|
||||
show master status;
|
||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||
master-bin.000001 96
|
||||
master-bin.000001 98
|
||||
reset slave;
|
||||
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
|
||||
|
@ -17,7 +17,7 @@ Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File
|
|||
start slave;
|
||||
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_PORT 7 master-bin.000001 96 # # master-bin.000001 Yes Yes 0 0 96 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 7 master-bin.000001 98 # # master-bin.000001 Yes Yes 0 0 98 # None 0 No #
|
||||
drop table if exists t1;
|
||||
create table t1 (n int);
|
||||
insert into t1 values (10),(45),(90);
|
||||
|
|
|
@ -13,11 +13,11 @@ insert into t1 values(2);
|
|||
stop slave;
|
||||
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 358 # # master-bin.000001 No No 0 0 182 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 360 # # master-bin.000001 No No 0 0 184 # None 0 No #
|
||||
change master to master_user='root';
|
||||
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 182 # # master-bin.000001 No No 0 0 182 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 184 # # master-bin.000001 No No 0 0 184 # None 0 No #
|
||||
start slave;
|
||||
select * from t1;
|
||||
n
|
||||
|
|
|
@ -103,7 +103,7 @@ a b
|
|||
1 cp850_general_ci
|
||||
drop database mysqltest2;
|
||||
drop database mysqltest3;
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query 1 # drop database if exists mysqltest2
|
||||
master-bin.000001 # Query 1 # drop database if exists mysqltest3
|
||||
|
|
|
@ -39,9 +39,9 @@ a
|
|||
22
|
||||
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 19116 # # master-bin.000001 Yes Yes 0 0 19116 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 19118 # # master-bin.000001 Yes Yes 0 0 19118 # None 0 No #
|
||||
stop slave;
|
||||
change master to master_log_pos=534;
|
||||
change master to master_log_pos=536;
|
||||
begin;
|
||||
select * from t2 for update;
|
||||
a
|
||||
|
@ -57,10 +57,10 @@ a
|
|||
22
|
||||
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 19116 # # master-bin.000001 Yes Yes 0 0 19116 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 19118 # # master-bin.000001 Yes Yes 0 0 19118 # None 0 No #
|
||||
set global max_relay_log_size=0;
|
||||
stop slave;
|
||||
change master to master_log_pos=534;
|
||||
change master to master_log_pos=536;
|
||||
begin;
|
||||
select * from t2 for update;
|
||||
a
|
||||
|
@ -77,5 +77,5 @@ a
|
|||
22
|
||||
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 19116 # # master-bin.000001 Yes Yes 0 0 19116 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 19118 # # master-bin.000001 Yes Yes 0 0 19118 # None 0 No #
|
||||
drop table t1,t2;
|
||||
|
|
|
@ -9,7 +9,7 @@ insert into t1 values (1),(1);
|
|||
ERROR 23000: Duplicate entry '1' for key 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_PORT 1 master-bin.000001 288 # # master-bin.000001 Yes Yes test.t3,test.t1,test.t2 0 0 288 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 290 # # master-bin.000001 Yes Yes test.t3,test.t1,test.t2 0 0 290 # None 0 No #
|
||||
show tables like 't1';
|
||||
Tables_in_test (t1)
|
||||
drop table t1;
|
||||
|
@ -26,14 +26,14 @@ select (@id := id) - id from t3;
|
|||
0
|
||||
kill @id;
|
||||
drop table t2,t3;
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 195 use `test`; create table t1 (a int primary key)
|
||||
master-bin.000001 195 Query 1 288 use `test`; insert into t1 values (1),(1)
|
||||
master-bin.000001 288 Query 1 365 use `test`; drop table t1
|
||||
master-bin.000001 365 Query 1 464 use `test`; create table t2 (a int primary key)
|
||||
master-bin.000001 464 Query 1 552 use `test`; insert into t2 values(1)
|
||||
master-bin.000001 552 Query 1 640 use `test`; create table t3 (id int)
|
||||
master-bin.000001 640 Query 1 742 use `test`; insert into t3 values(connection_id())
|
||||
master-bin.000001 742 Query 1 862 use `test`; update t2 set a = a + 1 + get_lock('crash_lock%20C', 10)
|
||||
master-bin.000001 862 Query 1 942 use `test`; drop table t2,t3
|
||||
master-bin.000001 # Query 1 # use `test`; create table t1 (a int primary key)
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t1 values (1),(1)
|
||||
master-bin.000001 # Query 1 # use `test`; drop table t1
|
||||
master-bin.000001 # Query 1 # use `test`; create table t2 (a int primary key)
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t2 values(1)
|
||||
master-bin.000001 # Query 1 # use `test`; create table t3 (id int)
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t3 values(connection_id())
|
||||
master-bin.000001 # Query 1 # use `test`; update t2 set a = a + 1 + get_lock('crash_lock%20C', 10)
|
||||
master-bin.000001 # Query 1 # use `test`; drop table t2,t3
|
||||
|
|
|
@ -14,4 +14,4 @@ start slave;
|
|||
flush logs;
|
||||
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 SLAVE_PORT 60 slave-bin.000001 207 # # slave-bin.000001 Yes Yes 0 0 207 # None 0 No #
|
||||
# 127.0.0.1 root SLAVE_PORT 60 slave-bin.000001 209 # # slave-bin.000001 Yes Yes 0 0 209 # None 0 No #
|
||||
|
|
|
@ -14,27 +14,27 @@ rename table t1 to t5, t2 to t1;
|
|||
flush no_write_to_binlog tables;
|
||||
show binlog events;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 4 Format_desc 1 96 Server ver: SERVER_VERSION, Binlog ver: 4
|
||||
master-bin.000001 96 Query 1 183 use `test`; create table t1 (a int)
|
||||
master-bin.000001 183 Query 1 273 use `test`; insert into t1 values (10)
|
||||
master-bin.000001 273 Query 1 360 use `test`; create table t2 (a int)
|
||||
master-bin.000001 360 Query 1 470 use `test`; create table t3 (a int) engine=merge union(t1)
|
||||
master-bin.000001 470 Query 1 557 use `test`; create table t4 (a int)
|
||||
master-bin.000001 557 Query 1 652 use `test`; insert into t4 select * from t3
|
||||
master-bin.000001 652 Query 1 747 use `test`; rename table t1 to t5, t2 to t1
|
||||
master-bin.000001 # Format_desc 1 # Server ver: SERVER_VERSION, Binlog ver: 4
|
||||
master-bin.000001 # Query 1 # use `test`; create table t1 (a int)
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t1 values (10)
|
||||
master-bin.000001 # Query 1 # use `test`; create table t2 (a int)
|
||||
master-bin.000001 # Query 1 # use `test`; create table t3 (a int) engine=merge union(t1)
|
||||
master-bin.000001 # Query 1 # use `test`; create table t4 (a int)
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t4 select * from t3
|
||||
master-bin.000001 # Query 1 # use `test`; rename table t1 to t5, t2 to t1
|
||||
select * from t3;
|
||||
a
|
||||
flush tables;
|
||||
show binlog events;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 4 Format_desc 1 96 Server ver: SERVER_VERSION, Binlog ver: 4
|
||||
master-bin.000001 96 Query 1 183 use `test`; create table t1 (a int)
|
||||
master-bin.000001 183 Query 1 273 use `test`; insert into t1 values (10)
|
||||
master-bin.000001 273 Query 1 360 use `test`; create table t2 (a int)
|
||||
master-bin.000001 360 Query 1 470 use `test`; create table t3 (a int) engine=merge union(t1)
|
||||
master-bin.000001 470 Query 1 557 use `test`; create table t4 (a int)
|
||||
master-bin.000001 557 Query 1 652 use `test`; insert into t4 select * from t3
|
||||
master-bin.000001 652 Query 1 747 use `test`; rename table t1 to t5, t2 to t1
|
||||
master-bin.000001 747 Query 1 823 use `test`; flush tables
|
||||
master-bin.000001 # Format_desc 1 # Server ver: SERVER_VERSION, Binlog ver: 4
|
||||
master-bin.000001 # Query 1 # use `test`; create table t1 (a int)
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t1 values (10)
|
||||
master-bin.000001 # Query 1 # use `test`; create table t2 (a int)
|
||||
master-bin.000001 # Query 1 # use `test`; create table t3 (a int) engine=merge union(t1)
|
||||
master-bin.000001 # Query 1 # use `test`; create table t4 (a int)
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t4 select * from t3
|
||||
master-bin.000001 # Query 1 # use `test`; rename table t1 to t5, t2 to t1
|
||||
master-bin.000001 # Query 1 # use `test`; flush tables
|
||||
select * from t3;
|
||||
a
|
||||
|
|
|
@ -22,7 +22,7 @@ day id category name
|
|||
2003-03-22 2416 a bbbbb
|
||||
show master status;
|
||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||
slave-bin.000001 1097
|
||||
slave-bin.000001 1292
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
drop table t3;
|
||||
|
@ -33,7 +33,7 @@ set global sql_slave_skip_counter=1;
|
|||
start slave;
|
||||
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_PORT 1 master-bin.000001 1560 # # master-bin.000001 Yes Yes 0 0 1560 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 1800 # # master-bin.000001 Yes Yes 0 0 1800 # None 0 No #
|
||||
set sql_log_bin=0;
|
||||
delete from t1;
|
||||
set sql_log_bin=1;
|
||||
|
@ -43,7 +43,7 @@ change master to master_user='test';
|
|||
change master to master_user='root';
|
||||
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_PORT 1 master-bin.000001 1668 # # master-bin.000001 No No 0 0 1668 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 1835 # # master-bin.000001 No No 0 0 1835 # None 0 No #
|
||||
set global sql_slave_skip_counter=1;
|
||||
start slave;
|
||||
set sql_log_bin=0;
|
||||
|
@ -64,5 +64,5 @@ terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by
|
|||
ERROR 23000: Duplicate entry '2003-03-22' for key 1
|
||||
show master status;
|
||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||
master-bin.000001 537
|
||||
master-bin.000001 441
|
||||
drop table t2;
|
||||
|
|
|
@ -10,8 +10,10 @@ create database mysqltest;
|
|||
create table t1(a int, b int, unique(b));
|
||||
use mysqltest;
|
||||
load data infile '../../std_data/rpl_loaddata.dat' into table test.t1;
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 198 drop database if exists mysqltest
|
||||
master-bin.000001 198 Query 1 292 create database mysqltest
|
||||
master-bin.000001 # Query 1 # drop database if exists mysqltest
|
||||
master-bin.000001 # Query 1 # create database mysqltest
|
||||
master-bin.000001 # Begin_load_query 1 # ;file_id=1;block_len=12
|
||||
master-bin.000001 # Execute_load_query 1 # use `mysqltest`; load data infile '../../std_data/rpl_loaddata.dat' into table test.t1 ;file_id=1
|
||||
drop database mysqltest;
|
||||
|
|
|
@ -10,5 +10,5 @@ load data infile '../../std_data/rpl_loaddata.dat' into table test.t1;
|
|||
select count(*) from t1;
|
||||
count(*)
|
||||
2
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
|
|
|
@ -12,3 +12,20 @@ select a,count(*) from t1 group by a;
|
|||
a count(*)
|
||||
1 10000
|
||||
drop table t1;
|
||||
create table t1(a int);
|
||||
insert into t1 values (1), (2), (2), (3);
|
||||
select * into outfile '../../var/master-data/rpl_loaddatalocal.select_outfile' from t1;
|
||||
drop table t1;
|
||||
create table t1(a int primary key);
|
||||
load data local infile './var/master-data/rpl_loaddatalocal.select_outfile' into table t1;
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
select * from t1;
|
||||
a
|
||||
1
|
||||
2
|
||||
3
|
||||
drop table t1;
|
||||
|
|
|
@ -19,25 +19,25 @@ count(*)
|
|||
drop table t1;
|
||||
show binlog events;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 96 Query 1 218 use `test`; create table t1(n int not null auto_increment primary key)
|
||||
master-bin.000001 218 Intvar 1 246 INSERT_ID=1
|
||||
master-bin.000001 246 Query 1 338 use `test`; insert into t1 values (NULL)
|
||||
master-bin.000001 338 Query 1 415 use `test`; drop table t1
|
||||
master-bin.000001 415 Query 1 519 use `test`; create table t1 (word char(20) not null)
|
||||
master-bin.000001 519 Create_file 1 1189 db=test;table=t1;file_id=1;block_len=581
|
||||
master-bin.000001 1189 Exec_load 1 1212 ;file_id=1
|
||||
master-bin.000001 1212 Query 1 1289 use `test`; drop table t1
|
||||
show binlog events from 96 limit 1;
|
||||
master-bin.000001 4 Format_desc 1 98 Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 98 Query 1 220 use `test`; create table t1(n int not null auto_increment primary key)
|
||||
master-bin.000001 220 Intvar 1 248 INSERT_ID=1
|
||||
master-bin.000001 248 Query 1 340 use `test`; insert into t1 values (NULL)
|
||||
master-bin.000001 340 Query 1 417 use `test`; drop table t1
|
||||
master-bin.000001 417 Query 1 521 use `test`; create table t1 (word char(20) not null)
|
||||
master-bin.000001 521 Begin_load_query 1 1125 ;file_id=1;block_len=581
|
||||
master-bin.000001 1125 Execute_load_query 1 1274 use `test`; load data infile '../../std_data/words.dat' into table t1 ignore 1 lines ;file_id=1
|
||||
master-bin.000001 1274 Query 1 1351 use `test`; drop table t1
|
||||
show binlog events from 98 limit 1;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 218 use `test`; create table t1(n int not null auto_increment primary key)
|
||||
show binlog events from 96 limit 2;
|
||||
master-bin.000001 98 Query 1 220 use `test`; create table t1(n int not null auto_increment primary key)
|
||||
show binlog events from 98 limit 2;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 Query 1 218 use `test`; create table t1(n int not null auto_increment primary key)
|
||||
master-bin.000001 218 Intvar 1 246 INSERT_ID=1
|
||||
show binlog events from 96 limit 2,1;
|
||||
master-bin.000001 98 Query 1 220 use `test`; create table t1(n int not null auto_increment primary key)
|
||||
master-bin.000001 220 Intvar 1 248 INSERT_ID=1
|
||||
show binlog events from 98 limit 2,1;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 246 Query 1 338 use `test`; insert into t1 values (NULL)
|
||||
master-bin.000001 248 Query 1 340 use `test`; insert into t1 values (NULL)
|
||||
flush logs;
|
||||
create table t5 (a int);
|
||||
drop table t5;
|
||||
|
@ -49,24 +49,24 @@ insert into t1 values (1);
|
|||
drop table t1;
|
||||
show binlog events;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 96 Query 1 218 use `test`; create table t1(n int not null auto_increment primary key)
|
||||
master-bin.000001 218 Intvar 1 246 INSERT_ID=1
|
||||
master-bin.000001 246 Query 1 338 use `test`; insert into t1 values (NULL)
|
||||
master-bin.000001 338 Query 1 415 use `test`; drop table t1
|
||||
master-bin.000001 415 Query 1 519 use `test`; create table t1 (word char(20) not null)
|
||||
master-bin.000001 519 Create_file 1 1189 db=test;table=t1;file_id=1;block_len=581
|
||||
master-bin.000001 1189 Exec_load 1 1212 ;file_id=1
|
||||
master-bin.000001 1212 Query 1 1289 use `test`; drop table t1
|
||||
master-bin.000001 1289 Rotate 1 1333 master-bin.000002;pos=4
|
||||
master-bin.000001 4 Format_desc 1 98 Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 98 Query 1 220 use `test`; create table t1(n int not null auto_increment primary key)
|
||||
master-bin.000001 220 Intvar 1 248 INSERT_ID=1
|
||||
master-bin.000001 248 Query 1 340 use `test`; insert into t1 values (NULL)
|
||||
master-bin.000001 340 Query 1 417 use `test`; drop table t1
|
||||
master-bin.000001 417 Query 1 521 use `test`; create table t1 (word char(20) not null)
|
||||
master-bin.000001 521 Begin_load_query 1 1125 ;file_id=1;block_len=581
|
||||
master-bin.000001 1125 Execute_load_query 1 1274 use `test`; load data infile '../../std_data/words.dat' into table t1 ignore 1 lines ;file_id=1
|
||||
master-bin.000001 1274 Query 1 1351 use `test`; drop table t1
|
||||
master-bin.000001 1351 Rotate 1 1395 master-bin.000002;pos=4
|
||||
show binlog events in 'master-bin.000002';
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000002 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000002 96 Query 1 183 use `test`; create table t5 (a int)
|
||||
master-bin.000002 183 Query 1 260 use `test`; drop table t5
|
||||
master-bin.000002 260 Query 1 347 use `test`; create table t1 (n int)
|
||||
master-bin.000002 347 Query 1 436 use `test`; insert into t1 values (1)
|
||||
master-bin.000002 436 Query 1 513 use `test`; drop table t1
|
||||
master-bin.000002 4 Format_desc 1 98 Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000002 98 Query 1 185 use `test`; create table t5 (a int)
|
||||
master-bin.000002 185 Query 1 262 use `test`; drop table t5
|
||||
master-bin.000002 262 Query 1 349 use `test`; create table t1 (n int)
|
||||
master-bin.000002 349 Query 1 438 use `test`; insert into t1 values (1)
|
||||
master-bin.000002 438 Query 1 515 use `test`; drop table t1
|
||||
show binary logs;
|
||||
Log_name
|
||||
master-bin.000001
|
||||
|
@ -78,26 +78,26 @@ slave-bin.000001
|
|||
slave-bin.000002
|
||||
show binlog events in 'slave-bin.000001' from 4;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
slave-bin.000001 4 Format_desc 2 96 Server ver: VERSION, Binlog ver: 4
|
||||
slave-bin.000001 96 Query 1 218 use `test`; create table t1(n int not null auto_increment primary key)
|
||||
slave-bin.000001 218 Intvar 1 246 INSERT_ID=1
|
||||
slave-bin.000001 246 Query 1 338 use `test`; insert into t1 values (NULL)
|
||||
slave-bin.000001 338 Query 1 415 use `test`; drop table t1
|
||||
slave-bin.000001 415 Query 1 519 use `test`; create table t1 (word char(20) not null)
|
||||
slave-bin.000001 519 Create_file 1 1198 db=test;table=t1;file_id=1;block_len=581
|
||||
slave-bin.000001 1198 Exec_load 1 1221 ;file_id=1
|
||||
slave-bin.000001 1221 Query 1 1298 use `test`; drop table t1
|
||||
slave-bin.000001 1298 Query 1 1385 use `test`; create table t5 (a int)
|
||||
slave-bin.000001 1385 Query 1 1462 use `test`; drop table t5
|
||||
slave-bin.000001 1462 Rotate 2 1505 slave-bin.000002;pos=4
|
||||
slave-bin.000001 4 Format_desc 2 98 Server ver: VERSION, Binlog ver: 4
|
||||
slave-bin.000001 98 Query 1 220 use `test`; create table t1(n int not null auto_increment primary key)
|
||||
slave-bin.000001 220 Intvar 1 248 INSERT_ID=1
|
||||
slave-bin.000001 248 Query 1 340 use `test`; insert into t1 values (NULL)
|
||||
slave-bin.000001 340 Query 1 417 use `test`; drop table t1
|
||||
slave-bin.000001 417 Query 1 521 use `test`; create table t1 (word char(20) not null)
|
||||
slave-bin.000001 521 Begin_load_query 1 1125 ;file_id=1;block_len=581
|
||||
slave-bin.000001 1125 Execute_load_query 1 1283 use `test`; load data INFILE '../../var/tmp/SQL_LOAD-2-1-1.data' INTO table t1 ignore 1 lines ;file_id=1
|
||||
slave-bin.000001 1283 Query 1 1360 use `test`; drop table t1
|
||||
slave-bin.000001 1360 Query 1 1447 use `test`; create table t5 (a int)
|
||||
slave-bin.000001 1447 Query 1 1524 use `test`; drop table t5
|
||||
slave-bin.000001 1524 Rotate 2 1567 slave-bin.000002;pos=4
|
||||
show binlog events in 'slave-bin.000002' from 4;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
slave-bin.000002 4 Format_desc 2 96 Server ver: VERSION, Binlog ver: 4
|
||||
slave-bin.000002 96 Query 1 183 use `test`; create table t1 (n int)
|
||||
slave-bin.000002 183 Query 1 272 use `test`; insert into t1 values (1)
|
||||
slave-bin.000002 272 Query 1 349 use `test`; drop table t1
|
||||
slave-bin.000002 4 Format_desc 2 98 Server ver: VERSION, Binlog ver: 4
|
||||
slave-bin.000002 98 Query 1 185 use `test`; create table t1 (n int)
|
||||
slave-bin.000002 185 Query 1 274 use `test`; insert into t1 values (1)
|
||||
slave-bin.000002 274 Query 1 351 use `test`; drop table t1
|
||||
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_PORT 1 master-bin.000002 513 # # master-bin.000002 Yes Yes 0 0 513 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000002 515 # # master-bin.000002 Yes Yes 0 0 515 # None 0 No #
|
||||
show binlog events in 'slave-bin.000005' from 4;
|
||||
ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Could not find target log
|
||||
|
|
|
@ -6,10 +6,10 @@ drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
|||
start slave;
|
||||
show master status;
|
||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||
master-bin.000001 96
|
||||
master-bin.000001 98
|
||||
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_PORT 1 master-bin.000001 96 # # master-bin.000001 Yes Yes 0 0 96 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 98 # # master-bin.000001 Yes Yes 0 0 98 # None 0 No #
|
||||
stop slave;
|
||||
change master to master_log_pos=73;
|
||||
start slave;
|
||||
|
@ -30,13 +30,13 @@ Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File
|
|||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 173 # # master-bin.000001 No Yes 0 0 173 # None 0 No #
|
||||
show master status;
|
||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||
master-bin.000001 96
|
||||
master-bin.000001 98
|
||||
create table if not exists t1 (n int);
|
||||
drop table if exists t1;
|
||||
create table t1 (n int);
|
||||
insert into t1 values (1),(2),(3);
|
||||
stop slave;
|
||||
change master to master_log_pos=96;
|
||||
change master to master_log_pos=98;
|
||||
start slave;
|
||||
select * from t1;
|
||||
n
|
||||
|
|
|
@ -16,7 +16,7 @@ select @@global.max_relay_log_size;
|
|||
start slave;
|
||||
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_PORT 1 master-bin.000001 73752 # # master-bin.000001 Yes Yes 0 0 73752 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73754 # # master-bin.000001 Yes Yes 0 0 73754 # None 0 No #
|
||||
stop slave;
|
||||
reset slave;
|
||||
set global max_relay_log_size=(5*4096);
|
||||
|
@ -26,7 +26,7 @@ select @@global.max_relay_log_size;
|
|||
start slave;
|
||||
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_PORT 1 master-bin.000001 73752 # # master-bin.000001 Yes Yes 0 0 73752 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73754 # # master-bin.000001 Yes Yes 0 0 73754 # None 0 No #
|
||||
stop slave;
|
||||
reset slave;
|
||||
set global max_relay_log_size=0;
|
||||
|
@ -36,7 +36,7 @@ select @@global.max_relay_log_size;
|
|||
start slave;
|
||||
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_PORT 1 master-bin.000001 73752 # # master-bin.000001 Yes Yes 0 0 73752 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73754 # # master-bin.000001 Yes Yes 0 0 73754 # None 0 No #
|
||||
stop slave;
|
||||
reset slave;
|
||||
flush logs;
|
||||
|
@ -49,13 +49,13 @@ flush logs;
|
|||
create table t1 (a int);
|
||||
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_PORT 1 master-bin.000001 73839 # # master-bin.000001 Yes Yes 0 0 73839 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73841 # # master-bin.000001 Yes Yes 0 0 73841 # None 0 No #
|
||||
flush logs;
|
||||
drop table t1;
|
||||
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_PORT 1 master-bin.000001 73916 # # master-bin.000001 Yes Yes 0 0 73916 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 73918 # # master-bin.000001 Yes Yes 0 0 73918 # None 0 No #
|
||||
flush logs;
|
||||
show master status;
|
||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||
master-bin.000002 96
|
||||
master-bin.000002 98
|
||||
|
|
|
@ -19,7 +19,7 @@ n
|
|||
3
|
||||
4
|
||||
5
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 # Query 1 # drop database if exists mysqltest
|
||||
master-bin.000001 # Query 1 # create database mysqltest
|
||||
|
|
|
@ -18,5 +18,5 @@ max(a)
|
|||
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 743186 # # master-bin.000001 Yes Yes 0 0 743186 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 743188 # # master-bin.000001 Yes Yes 0 0 743188 # None 0 No #
|
||||
drop table t1;
|
||||
|
|
|
@ -28,4 +28,4 @@ ERROR 42S02: Table 'test.t11' doesn't exist
|
|||
drop table if exists t1,t2,t11;
|
||||
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_PORT 1 master-bin.000001 1618 # # master-bin.000001 Yes Yes test.t1 0 0 1618 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 1668 # # master-bin.000001 Yes Yes test.t1 0 0 1668 # None 0 No #
|
||||
|
|
|
@ -6,12 +6,12 @@ drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
|||
start slave;
|
||||
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_PORT 1 master-bin.000001 96 # # master-bin.000001 Yes Yes 0 0 96 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 98 # # master-bin.000001 Yes Yes 0 0 98 # None 0 No #
|
||||
stop slave;
|
||||
change master to master_user='test';
|
||||
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 test MASTER_PORT 1 master-bin.000001 96 # # master-bin.000001 No No 0 0 96 # None 0 No #
|
||||
# 127.0.0.1 test MASTER_PORT 1 master-bin.000001 98 # # master-bin.000001 No No 0 0 98 # None 0 No #
|
||||
reset slave;
|
||||
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
|
||||
|
@ -19,7 +19,7 @@ Slave_IO_State Master_Host Master_User Master_Port Connect_Retry Master_Log_File
|
|||
start slave;
|
||||
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_PORT 1 master-bin.000001 96 # # master-bin.000001 Yes Yes 0 0 96 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 1 master-bin.000001 98 # # master-bin.000001 Yes Yes 0 0 98 # None 0 No #
|
||||
stop slave;
|
||||
reset slave;
|
||||
start slave;
|
||||
|
|
|
@ -16,7 +16,7 @@ create table t1 (s text);
|
|||
insert into t1 values('Could not break slave'),('Tried hard');
|
||||
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_PORT 60 master-bin.000001 550 # # master-bin.000001 Yes Yes 0 0 550 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 60 master-bin.000001 552 # # master-bin.000001 Yes Yes 0 0 552 # None 0 No #
|
||||
select * from t1;
|
||||
s
|
||||
Could not break slave
|
||||
|
@ -57,7 +57,7 @@ master-bin.000003
|
|||
insert into t2 values (65);
|
||||
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_PORT 60 master-bin.000003 498 # # master-bin.000003 Yes Yes 0 0 498 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 60 master-bin.000003 500 # # master-bin.000003 Yes Yes 0 0 500 # None 0 No #
|
||||
select * from t2;
|
||||
m
|
||||
34
|
||||
|
@ -79,13 +79,13 @@ master-bin.000004
|
|||
master-bin.000005
|
||||
show master status;
|
||||
File Position Binlog_Do_DB Binlog_Ignore_DB
|
||||
master-bin.000005 2051
|
||||
master-bin.000005 2146
|
||||
select * from t4;
|
||||
a
|
||||
testing temporary tables part 2
|
||||
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_PORT 60 master-bin.000005 2051 # # master-bin.000005 Yes Yes 0 0 2051 # None 0 No #
|
||||
# 127.0.0.1 root MASTER_PORT 60 master-bin.000005 2146 # # master-bin.000005 Yes Yes 0 0 2146 # None 0 No #
|
||||
lock tables t3 read;
|
||||
select count(*) from t3 where n >= 4;
|
||||
count(*)
|
||||
|
|
|
@ -10,7 +10,7 @@ stop slave;
|
|||
change master to master_port=SLAVE_PORT;
|
||||
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 SLAVE_PORT 1 4 slave-relay-bin.000001 4 No No # 0 0 0 96 None 0 No NULL
|
||||
127.0.0.1 root SLAVE_PORT 1 4 slave-relay-bin.000001 4 No No # 0 0 0 98 None 0 No NULL
|
||||
start slave;
|
||||
insert into t1 values (1);
|
||||
show status like "slave_running";
|
||||
|
|
|
@ -10,7 +10,7 @@ stop slave;
|
|||
change master to master_port=SLAVE_PORT;
|
||||
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 SLAVE_PORT 1 4 slave-relay-bin.000001 4 No No # 0 0 0 96 None 0 No NULL
|
||||
127.0.0.1 root SLAVE_PORT 1 4 slave-relay-bin.000001 4 No No # 0 0 0 98 None 0 No NULL
|
||||
start slave;
|
||||
insert into t1 values (1);
|
||||
select * from t1;
|
||||
|
|
|
@ -38,19 +38,19 @@ f
|
|||
7
|
||||
show binlog events;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 96 Query 1 186 use `test`; drop table if exists t1,t2
|
||||
master-bin.000001 186 Query 1 272 use `test`; create table t1(f int)
|
||||
master-bin.000001 272 Query 1 358 use `test`; create table t2(f int)
|
||||
master-bin.000001 358 Query 1 484 use `test`; insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)
|
||||
master-bin.000001 484 Query 1 580 use `test`; create temporary table t3(f int)
|
||||
master-bin.000001 580 Query 1 685 use `test`; insert into t3 select * from t1 where f<6
|
||||
master-bin.000001 685 Query 1 781 use `test`; create temporary table t3(f int)
|
||||
master-bin.000001 781 Query 1 883 use `test`; insert into t2 select count(*) from t3
|
||||
master-bin.000001 883 Query 1 989 use `test`; insert into t3 select * from t1 where f>=4
|
||||
master-bin.000001 989 Query 1 1076 use `test`; drop temporary table t3
|
||||
master-bin.000001 1076 Query 1 1178 use `test`; insert into t2 select count(*) from t3
|
||||
master-bin.000001 1178 Query 1 1265 use `test`; drop temporary table t3
|
||||
master-bin.000001 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 # Query 1 # use `test`; drop table if exists t1,t2
|
||||
master-bin.000001 # Query 1 # use `test`; create table t1(f int)
|
||||
master-bin.000001 # Query 1 # use `test`; create table t2(f int)
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)
|
||||
master-bin.000001 # Query 1 # use `test`; create temporary table t3(f int)
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t3 select * from t1 where f<6
|
||||
master-bin.000001 # Query 1 # use `test`; create temporary table t3(f int)
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t2 select count(*) from t3
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t3 select * from t1 where f>=4
|
||||
master-bin.000001 # Query 1 # use `test`; drop temporary table t3
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t2 select count(*) from t3
|
||||
master-bin.000001 # Query 1 # use `test`; drop temporary table t3
|
||||
drop table t1, t2;
|
||||
use test;
|
||||
SET TIMESTAMP=1040323920;
|
||||
|
|
|
@ -32,13 +32,13 @@ t
|
|||
2004-06-11 09:39:02
|
||||
show binlog events;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 96 Query 1 189 use `test`; create table t1 (t timestamp)
|
||||
master-bin.000001 189 Query 1 281 use `test`; create table t2 (t char(32))
|
||||
master-bin.000001 281 Query 1 373 use `test`; SET ONE_SHOT TIME_ZONE='UTC'
|
||||
master-bin.000001 373 Query 1 497 use `test`; insert into t1 values ('20040101000000'), ('20040611093902')
|
||||
master-bin.000001 497 Query 1 575 use `test`; delete from t1
|
||||
master-bin.000001 575 Query 1 699 use `test`; insert into t1 values ('20040101000000'), ('20040611093902')
|
||||
master-bin.000001 # Format_desc 1 # Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 # Query 1 # use `test`; create table t1 (t timestamp)
|
||||
master-bin.000001 # Query 1 # use `test`; create table t2 (t char(32))
|
||||
master-bin.000001 # Query 1 # use `test`; SET ONE_SHOT TIME_ZONE='UTC'
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t1 values ('20040101000000'), ('20040611093902')
|
||||
master-bin.000001 # Query 1 # use `test`; delete from t1
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t1 values ('20040101000000'), ('20040611093902')
|
||||
set time_zone='MET';
|
||||
insert into t2 (select t from t1);
|
||||
select * from t1;
|
||||
|
|
|
@ -14,15 +14,15 @@ insert into t2 values (3),(4);
|
|||
drop table t2;
|
||||
show binlog events;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 4 Format_desc 1 96 Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 96 Query 1 218 use `test`; create table t1(n int not null auto_increment primary key)
|
||||
master-bin.000001 218 Query 1 319 use `test`; insert into t1 values (1),(2),(3),(4)
|
||||
master-bin.000001 319 Query 1 396 use `test`; drop table t1
|
||||
master-bin.000001 396 Query 1 518 use `test`; create table t2(n int not null auto_increment primary key)
|
||||
master-bin.000001 518 Query 1 611 use `test`; insert into t2 values (1),(2)
|
||||
master-bin.000001 611 Query 1 704 use `test`; insert into t2 values (3),(4)
|
||||
master-bin.000001 704 Query 1 781 use `test`; drop table t2
|
||||
start slave until master_log_file='master-bin.000001', master_log_pos=304;
|
||||
master-bin.000001 4 Format_desc 1 98 Server ver: VERSION, Binlog ver: 4
|
||||
master-bin.000001 98 Query 1 220 use `test`; create table t1(n int not null auto_increment primary key)
|
||||
master-bin.000001 220 Query 1 321 use `test`; insert into t1 values (1),(2),(3),(4)
|
||||
master-bin.000001 321 Query 1 398 use `test`; drop table t1
|
||||
master-bin.000001 398 Query 1 520 use `test`; create table t2(n int not null auto_increment primary key)
|
||||
master-bin.000001 520 Query 1 613 use `test`; insert into t2 values (1),(2)
|
||||
master-bin.000001 613 Query 1 706 use `test`; insert into t2 values (3),(4)
|
||||
master-bin.000001 706 Query 1 783 use `test`; drop table t2
|
||||
start slave until master_log_file='master-bin.000001', master_log_pos=321;
|
||||
select * from t1;
|
||||
n
|
||||
1
|
||||
|
@ -31,7 +31,7 @@ n
|
|||
4
|
||||
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 781 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 319 # Master master-bin.000001 304 No #
|
||||
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 783 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 321 # Master master-bin.000001 321 No #
|
||||
start slave until master_log_file='master-no-such-bin.000001', master_log_pos=291;
|
||||
select * from t1;
|
||||
n
|
||||
|
@ -41,21 +41,21 @@ n
|
|||
4
|
||||
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 781 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 319 # Master master-no-such-bin.000001 291 No #
|
||||
start slave until relay_log_file='slave-relay-bin.000004', relay_log_pos=710;
|
||||
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 783 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 321 # Master master-no-such-bin.000001 291 No #
|
||||
start slave until relay_log_file='slave-relay-bin.000004', relay_log_pos=751;
|
||||
select * from t2;
|
||||
n
|
||||
1
|
||||
2
|
||||
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 781 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 611 # Relay slave-relay-bin.000004 710 No #
|
||||
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 783 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 613 # Relay slave-relay-bin.000004 751 No #
|
||||
start slave;
|
||||
stop slave;
|
||||
start slave until master_log_file='master-bin.000001', master_log_pos=710;
|
||||
start slave until master_log_file='master-bin.000001', master_log_pos=783;
|
||||
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 781 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 781 # Master master-bin.000001 710 No #
|
||||
# 127.0.0.1 root MASTER_MYPORT 1 master-bin.000001 783 slave-relay-bin.000004 # master-bin.000001 Yes No 0 0 783 # Master master-bin.000001 783 No #
|
||||
start slave until master_log_file='master-bin', master_log_pos=561;
|
||||
ERROR HY000: Incorrect parameter or combination of parameters for START SLAVE UNTIL
|
||||
start slave until master_log_file='master-bin.000001', master_log_pos=561, relay_log_pos=12;
|
||||
|
@ -67,6 +67,6 @@ ERROR HY000: Incorrect parameter or combination of parameters for START SLAVE UN
|
|||
start slave until relay_log_file='slave-relay-bin.000002', master_log_pos=561;
|
||||
ERROR HY000: Incorrect parameter or combination of parameters for START SLAVE UNTIL
|
||||
start slave sql_thread;
|
||||
start slave until master_log_file='master-bin.000001', master_log_pos=710;
|
||||
start slave until master_log_file='master-bin.000001', master_log_pos=783;
|
||||
Warnings:
|
||||
Note 1254 Slave is already running
|
||||
|
|
|
@ -76,35 +76,35 @@ abcn1n2
|
|||
NULL
|
||||
NULL
|
||||
NULL
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
slave-bin.000001 96 Query 1 187 use `test`; create table t1(n char(30))
|
||||
slave-bin.000001 187 User var 2 230 @`i1`=12345678901234
|
||||
slave-bin.000001 230 User var 2 273 @`i2`=-12345678901234
|
||||
slave-bin.000001 273 User var 2 316 @`i3`=0
|
||||
slave-bin.000001 316 User var 2 359 @`i4`=-1
|
||||
slave-bin.000001 359 Query 1 471 use `test`; insert into t1 values (@i1), (@i2), (@i3), (@i4)
|
||||
slave-bin.000001 471 User var 2 510 @`r1`=12.5
|
||||
slave-bin.000001 510 User var 2 549 @`r2`=-12.5
|
||||
slave-bin.000001 549 Query 1 647 use `test`; insert into t1 values (@r1), (@r2)
|
||||
slave-bin.000001 647 User var 2 696 @`s1`=_latin1 0x5468697320697320612074657374 COLLATE latin1_swedish_ci
|
||||
slave-bin.000001 696 User var 2 731 @`s2`=_latin1 "" COLLATE latin1_swedish_ci
|
||||
slave-bin.000001 731 User var 2 773 @`s3`=_latin1 0x61626327646566 COLLATE latin1_swedish_ci
|
||||
slave-bin.000001 773 User var 2 815 @`s4`=_latin1 0x6162635C646566 COLLATE latin1_swedish_ci
|
||||
slave-bin.000001 815 User var 2 857 @`s5`=_latin1 0x61626327646566 COLLATE latin1_swedish_ci
|
||||
slave-bin.000001 857 Query 1 976 use `test`; insert into t1 values (@s1), (@s2), (@s3), (@s4), (@s5)
|
||||
slave-bin.000001 976 User var 2 1002 @`n1`=NULL
|
||||
slave-bin.000001 1002 Query 1 1093 use `test`; insert into t1 values (@n1)
|
||||
slave-bin.000001 1093 User var 2 1119 @`n2`=NULL
|
||||
slave-bin.000001 1119 Query 1 1210 use `test`; insert into t1 values (@n2)
|
||||
slave-bin.000001 1210 Query 1 1327 use `test`; insert into t1 values (@a:=0), (@a:=@a+1), (@a:=@a+1)
|
||||
slave-bin.000001 1327 User var 2 1369 @`a`=2
|
||||
slave-bin.000001 1369 Query 1 1470 use `test`; insert into t1 values (@a+(@b:=@a+1))
|
||||
slave-bin.000001 1470 User var 2 1507 @`q`=_latin1 0x616263 COLLATE latin1_swedish_ci
|
||||
slave-bin.000001 1507 Query 1 1640 use `test`; insert t1 values (@q), (@q:=concat(@q, 'n1')), (@q:=concat(@q, 'n2'))
|
||||
slave-bin.000001 1640 User var 2 1682 @`a`=5
|
||||
slave-bin.000001 1682 Query 1 1777 use `test`; insert into t1 values (@a),(@a)
|
||||
slave-bin.000001 1777 User var 2 1802 @`a`=NULL
|
||||
slave-bin.000001 1802 Query 1 1904 use `test`; insert into t1 values (@a),(@a),(@a*5)
|
||||
slave-bin.000001 # Query 1 # use `test`; create table t1(n char(30))
|
||||
slave-bin.000001 # User var 2 # @`i1`=12345678901234
|
||||
slave-bin.000001 # User var 2 # @`i2`=-12345678901234
|
||||
slave-bin.000001 # User var 2 # @`i3`=0
|
||||
slave-bin.000001 # User var 2 # @`i4`=-1
|
||||
slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@i1), (@i2), (@i3), (@i4)
|
||||
slave-bin.000001 # User var 2 # @`r1`=12.5
|
||||
slave-bin.000001 # User var 2 # @`r2`=-12.5
|
||||
slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@r1), (@r2)
|
||||
slave-bin.000001 # User var 2 # @`s1`=_latin1 0x5468697320697320612074657374 COLLATE latin1_swedish_ci
|
||||
slave-bin.000001 # User var 2 # @`s2`=_latin1 "" COLLATE latin1_swedish_ci
|
||||
slave-bin.000001 # User var 2 # @`s3`=_latin1 0x61626327646566 COLLATE latin1_swedish_ci
|
||||
slave-bin.000001 # User var 2 # @`s4`=_latin1 0x6162635C646566 COLLATE latin1_swedish_ci
|
||||
slave-bin.000001 # User var 2 # @`s5`=_latin1 0x61626327646566 COLLATE latin1_swedish_ci
|
||||
slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@s1), (@s2), (@s3), (@s4), (@s5)
|
||||
slave-bin.000001 # User var 2 # @`n1`=NULL
|
||||
slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@n1)
|
||||
slave-bin.000001 # User var 2 # @`n2`=NULL
|
||||
slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@n2)
|
||||
slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@a:=0), (@a:=@a+1), (@a:=@a+1)
|
||||
slave-bin.000001 # User var 2 # @`a`=2
|
||||
slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@a+(@b:=@a+1))
|
||||
slave-bin.000001 # User var 2 # @`q`=_latin1 0x616263 COLLATE latin1_swedish_ci
|
||||
slave-bin.000001 # Query 1 # use `test`; insert t1 values (@q), (@q:=concat(@q, 'n1')), (@q:=concat(@q, 'n2'))
|
||||
slave-bin.000001 # User var 2 # @`a`=5
|
||||
slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@a),(@a)
|
||||
slave-bin.000001 # User var 2 # @`a`=NULL
|
||||
slave-bin.000001 # Query 1 # use `test`; insert into t1 values (@a),(@a),(@a*5)
|
||||
drop table t1;
|
||||
stop slave;
|
||||
|
|
|
@ -122,10 +122,10 @@ EXPLAIN SELECT t2.*, t4.DOCTYPENAME, t1.CONTENTSIZE,t1.MIMETYPE FROM t2 INNER JO
|
|||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY t1 system PRIMARY NULL NULL NULL 0 const row not found
|
||||
1 PRIMARY t2 ALL DDOCTYPEID_IDX NULL NULL NULL 9 Using where
|
||||
1 PRIMARY t4 eq_ref PRIMARY PRIMARY 32 test.t2.DOCTYPEID 1
|
||||
2 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY,FFOLDERID_IDX PRIMARY 32 func 1 Using index; Using where
|
||||
3 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY,FFOLDERID_IDX PRIMARY 32 func 1 Using index; Using where
|
||||
4 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY,FFOLDERID_IDX PRIMARY 32 func 1 Using index; Using where
|
||||
5 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY,FFOLDERID_IDX PRIMARY 32 func 1 Using index; Using where
|
||||
6 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY,FFOLDERID_IDX,CMFLDRPARNT_IDX PRIMARY 32 func 1 Using index; Using where
|
||||
1 PRIMARY t4 eq_ref PRIMARY PRIMARY 34 test.t2.DOCTYPEID 1
|
||||
2 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY,FFOLDERID_IDX PRIMARY 34 func 1 Using index; Using where
|
||||
3 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY,FFOLDERID_IDX PRIMARY 34 func 1 Using index; Using where
|
||||
4 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY,FFOLDERID_IDX PRIMARY 34 func 1 Using index; Using where
|
||||
5 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY,FFOLDERID_IDX PRIMARY 34 func 1 Using index; Using where
|
||||
6 DEPENDENT SUBQUERY t3 unique_subquery PRIMARY,FFOLDERID_IDX,CMFLDRPARNT_IDX PRIMARY 34 func 1 Using index; Using where
|
||||
drop table t1, t2, t3, t4;
|
||||
|
|
|
@ -176,13 +176,13 @@ INSERT INTO t1 VALUES(@`a b`);
|
|||
set @var1= "';aaa";
|
||||
SET @var2=char(ascii('a'));
|
||||
insert into t1 values (@var1),(@var2);
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
Log_name Pos Event_type Server_id End_log_pos Info
|
||||
master-bin.000001 96 User var 1 137 @`a b`=_latin1 0x68656C6C6F COLLATE latin1_swedish_ci
|
||||
master-bin.000001 137 Query 1 230 use `test`; INSERT INTO t1 VALUES(@`a b`)
|
||||
master-bin.000001 230 User var 1 272 @`var1`=_latin1 0x273B616161 COLLATE latin1_swedish_ci
|
||||
master-bin.000001 272 User var 1 310 @`var2`=_latin1 0x61 COLLATE latin1_swedish_ci
|
||||
master-bin.000001 310 Query 1 411 use `test`; insert into t1 values (@var1),(@var2)
|
||||
master-bin.000001 # User var 1 # @`a b`=_latin1 0x68656C6C6F COLLATE latin1_swedish_ci
|
||||
master-bin.000001 # Query 1 # use `test`; INSERT INTO t1 VALUES(@`a b`)
|
||||
master-bin.000001 # User var 1 # @`var1`=_latin1 0x273B616161 COLLATE latin1_swedish_ci
|
||||
master-bin.000001 # User var 1 # @`var2`=_latin1 0x61 COLLATE latin1_swedish_ci
|
||||
master-bin.000001 # Query 1 # use `test`; insert into t1 values (@var1),(@var2)
|
||||
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
|
||||
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
|
||||
ROLLBACK;
|
||||
|
|
3
mysql-test/std_data/loaddata5.dat
Normal file
3
mysql-test/std_data/loaddata5.dat
Normal file
|
@ -0,0 +1,3 @@
|
|||
1 2
|
||||
3 4
|
||||
5 6
|
|
@ -338,7 +338,8 @@ create table t2 (c char(30)) charset=ucs2;
|
|||
set @v=convert('abc' using ucs2);
|
||||
reset master;
|
||||
insert into t2 values (@v);
|
||||
show binlog events from 96;
|
||||
--replace_column 2 # 5 #
|
||||
show binlog events from 98;
|
||||
# more important than SHOW BINLOG EVENTS, mysqlbinlog (where we
|
||||
# absolutely need variables names to be quoted and strings to be
|
||||
# escaped).
|
||||
|
|
|
@ -10,11 +10,3 @@
|
|||
#
|
||||
##############################################################################
|
||||
|
||||
ndb_alter_table : NDB team needs to fix
|
||||
ndb_autodiscover : NDB team needs to fix
|
||||
ndb_autodiscover2 : NDB team needs to fix
|
||||
ndb_cache_multi : NDB team needs to fix
|
||||
ndb_cache_multi2 : NDB team needs to fix
|
||||
ndb_multi : NDB team needs to fix
|
||||
ndb_restore : NDB team needs to fix
|
||||
|
||||
|
|
|
@ -1291,8 +1291,8 @@ show variables like "innodb_thread_sleep_delay";
|
|||
#eval set storage_engine=$default;
|
||||
|
||||
# InnoDB specific varchar tests
|
||||
--error 1074
|
||||
create table t1 (v varchar(16384)) engine=innodb;
|
||||
drop table t1;
|
||||
|
||||
# The following should be moved to type_bit.test when innodb will support it
|
||||
--error 1178
|
||||
|
|
|
@ -85,6 +85,7 @@ insert into t1 select * from t2;
|
|||
# verify the binlog :
|
||||
let $VERSION=`select version()`;
|
||||
--replace_result $VERSION VERSION
|
||||
--replace_column 2 # 5 #
|
||||
show binlog events;
|
||||
select * from t1;
|
||||
drop table t1, t2;
|
||||
|
@ -99,6 +100,7 @@ create table t2(unique(a)) select a from t1;
|
|||
# The above should produce an error, *and* not appear in the binlog
|
||||
let $VERSION=`select version()`;
|
||||
--replace_result $VERSION VERSION
|
||||
--replace_column 2 # 5 #
|
||||
show binlog events;
|
||||
drop table t1;
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
#
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
drop table if exists t1, t2;
|
||||
--enable_warnings
|
||||
|
||||
create table t1 (a date, b date, c date not null, d date);
|
||||
|
@ -31,3 +31,46 @@ load data infile '../../std_data/loaddata4.dat' into table t1 fields terminated
|
|||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Let us test extended LOAD DATA features
|
||||
#
|
||||
create table t1 (a int default 100, b int, c varchar(60));
|
||||
# we can do something like this
|
||||
load data infile '../../std_data/rpl_loaddata.dat' into table t1 (a, @b) set b=@b+10, c=concat("b=",@b);
|
||||
select * from t1;
|
||||
truncate table t1;
|
||||
# we can use filled fields in expressions
|
||||
# we also assigning NULL value to field with non-NULL default here
|
||||
load data infile '../../std_data/rpl_loaddata.dat' into table t1 (a, @b) set c= if(a is null,"oops",a);
|
||||
select * from t1;
|
||||
truncate table t1;
|
||||
# we even can use variables in set clause, and missed columns will be set
|
||||
# with default values
|
||||
set @c:=123;
|
||||
load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@a, b) set c= if(@a is null,@c,b);
|
||||
select * from t1;
|
||||
# let us test side-effect of such load
|
||||
load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@a, @b);
|
||||
select * from t1;
|
||||
select @a, @b;
|
||||
truncate table t1;
|
||||
# now going to test fixed field-row file format
|
||||
load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (a, b) set c="Wow";
|
||||
select * from t1;
|
||||
truncate table t1;
|
||||
# this also should work
|
||||
load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (a, b) set c=concat(a,"+",b,"+",@c,"+",b,"+",if(c is null,"NIL",c));
|
||||
select * from t1;
|
||||
# and this should bark
|
||||
--error 1409
|
||||
load data infile '../../std_data/loaddata5.dat' into table t1 fields terminated by '' enclosed by '' (a, @b);
|
||||
|
||||
# Now let us test LOAD DATA with subselect
|
||||
create table t2 (num int primary key, str varchar(10));
|
||||
insert into t2 values (10,'Ten'), (15,'Fifteen');
|
||||
truncate table t1;
|
||||
load data infile '../../std_data/rpl_loaddata.dat' into table t1 (@dummy,@n) set a= @n, c= (select str from t2 where num=@n);
|
||||
select * from t1;
|
||||
|
||||
# cleanup
|
||||
drop table t1, t2;
|
||||
|
|
|
@ -27,7 +27,7 @@ commit;
|
|||
|
||||
--replace_column 5 #
|
||||
--replace_result "xid=12" "xid=7"
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
|
@ -40,7 +40,7 @@ insert into t2 select * from t1;
|
|||
rollback;
|
||||
|
||||
--replace_column 5 #
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
|
@ -56,7 +56,7 @@ commit;
|
|||
|
||||
--replace_column 5 #
|
||||
--replace_result "xid=45" "xid=24"
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
|
@ -74,7 +74,7 @@ select a from t1 order by a; # check that savepoints work :)
|
|||
|
||||
--replace_column 5 #
|
||||
--replace_result "xid=67" "xid=36"
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
|
||||
# and when ROLLBACK is not explicit?
|
||||
delete from t1;
|
||||
|
@ -95,7 +95,7 @@ connection con2;
|
|||
# logging has been done, we use a user lock.
|
||||
select get_lock("a",10);
|
||||
--replace_column 5 #
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
|
||||
# and when not in a transact1on?
|
||||
delete from t1;
|
||||
|
@ -107,7 +107,7 @@ insert into t2 select * from t1;
|
|||
|
||||
--replace_column 5 #
|
||||
--replace_result "xid=116" "xid=59"
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
|
||||
# Check that when the query updat1ng the MyISAM table is the first in the
|
||||
# transaction, we log it immediately.
|
||||
|
@ -120,13 +120,13 @@ begin;
|
|||
insert into t2 select * from t1;
|
||||
--replace_column 5 #
|
||||
--replace_result "xid=130" "xid=65"
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
insert into t1 values(11);
|
||||
commit;
|
||||
|
||||
--replace_column 5 #
|
||||
--replace_result "xid=130" "xid=65" "xid=133" "xid=67"
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
|
||||
|
||||
# Check that things work like before this BEGIN/ROLLBACK code was added,
|
||||
|
@ -145,7 +145,7 @@ commit;
|
|||
|
||||
--replace_column 5 #
|
||||
--replace_result "xid=152" "xid=77"
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
|
@ -157,7 +157,7 @@ insert into t2 select * from t1;
|
|||
rollback;
|
||||
|
||||
--replace_column 5 #
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
|
@ -173,7 +173,7 @@ commit;
|
|||
|
||||
--replace_column 5 #
|
||||
--replace_result "xid=184" "xid=93"
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
|
@ -191,7 +191,7 @@ select a from t1 order by a; # check that savepoints work :)
|
|||
|
||||
--replace_column 5 #
|
||||
--replace_result "xid=205" "xid=104"
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
|
||||
# Test for BUG#5714, where a MyISAM update in the transaction used to
|
||||
# release row-level locks in InnoDB
|
||||
|
|
|
@ -24,7 +24,6 @@ load data infile '../../std_data/words.dat' into table t1;
|
|||
load data infile '../../std_data/words.dat' into table t1;
|
||||
load data infile '../../std_data/words.dat' into table t1;
|
||||
load data infile '../../std_data/words.dat' into table t1;
|
||||
load data infile '../../std_data/words.dat' into table t1;
|
||||
# simple query to show more in second binlog
|
||||
insert into t1 values ("Alas");
|
||||
flush logs;
|
||||
|
@ -61,7 +60,7 @@ select "--- --database --" as "";
|
|||
select "--- --position --" as "";
|
||||
--enable_query_log
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||
--exec $MYSQL_BINLOG --short-form --local-load=$MYSQL_TEST_DIR/var/tmp/ --position=119 $MYSQL_TEST_DIR/var/log/master-bin.000002
|
||||
--exec $MYSQL_BINLOG --short-form --local-load=$MYSQL_TEST_DIR/var/tmp/ --position=232 $MYSQL_TEST_DIR/var/log/master-bin.000002
|
||||
|
||||
# These are tests for remote binlog.
|
||||
# They should return the same as previous test.
|
||||
|
@ -93,7 +92,7 @@ select "--- --database --" as "";
|
|||
select "--- --position --" as "";
|
||||
--enable_query_log
|
||||
--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR
|
||||
--exec $MYSQL_BINLOG --short-form --local-load=$MYSQL_TEST_DIR/var/tmp/ --read-from-remote-server --position=119 --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000002
|
||||
--exec $MYSQL_BINLOG --short-form --local-load=$MYSQL_TEST_DIR/var/tmp/ --read-from-remote-server --position=232 --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000002
|
||||
|
||||
# Bug#7853 (mysqlbinlog does not accept input from stdin)
|
||||
--disable_query_log
|
||||
|
|
|
@ -46,11 +46,11 @@ select "--- offset --" as "";
|
|||
--disable_query_log
|
||||
select "--- start-position --" as "";
|
||||
--enable_query_log
|
||||
--exec $MYSQL_BINLOG --short-form --start-position=602 $MYSQL_TEST_DIR/var/log/master-bin.000001
|
||||
--exec $MYSQL_BINLOG --short-form --start-position=604 $MYSQL_TEST_DIR/var/log/master-bin.000001
|
||||
--disable_query_log
|
||||
select "--- stop-position --" as "";
|
||||
--enable_query_log
|
||||
--exec $MYSQL_BINLOG --short-form --stop-position=602 $MYSQL_TEST_DIR/var/log/master-bin.000001
|
||||
--exec $MYSQL_BINLOG --short-form --stop-position=604 $MYSQL_TEST_DIR/var/log/master-bin.000001
|
||||
--disable_query_log
|
||||
select "--- start-datetime --" as "";
|
||||
--enable_query_log
|
||||
|
@ -75,11 +75,11 @@ select "--- offset --" as "";
|
|||
--disable_query_log
|
||||
select "--- start-position --" as "";
|
||||
--enable_query_log
|
||||
--exec $MYSQL_BINLOG --short-form --start-position=602 $MYSQL_TEST_DIR/var/log/master-bin.000001 $MYSQL_TEST_DIR/var/log/master-bin.000002
|
||||
--exec $MYSQL_BINLOG --short-form --start-position=604 $MYSQL_TEST_DIR/var/log/master-bin.000001 $MYSQL_TEST_DIR/var/log/master-bin.000002
|
||||
--disable_query_log
|
||||
select "--- stop-position --" as "";
|
||||
--enable_query_log
|
||||
--exec $MYSQL_BINLOG --short-form --stop-position=124 $MYSQL_TEST_DIR/var/log/master-bin.000001 $MYSQL_TEST_DIR/var/log/master-bin.000002
|
||||
--exec $MYSQL_BINLOG --short-form --stop-position=126 $MYSQL_TEST_DIR/var/log/master-bin.000001 $MYSQL_TEST_DIR/var/log/master-bin.000002
|
||||
--disable_query_log
|
||||
select "--- start-datetime --" as "";
|
||||
--enable_query_log
|
||||
|
@ -102,11 +102,11 @@ select "--- offset --" as "";
|
|||
--disable_query_log
|
||||
select "--- start-position --" as "";
|
||||
--enable_query_log
|
||||
--exec $MYSQL_BINLOG --short-form --start-position=602 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001
|
||||
--exec $MYSQL_BINLOG --short-form --start-position=604 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001
|
||||
--disable_query_log
|
||||
select "--- stop-position --" as "";
|
||||
--enable_query_log
|
||||
--exec $MYSQL_BINLOG --short-form --stop-position=602 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001
|
||||
--exec $MYSQL_BINLOG --short-form --stop-position=604 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001
|
||||
--disable_query_log
|
||||
select "--- start-datetime --" as "";
|
||||
--enable_query_log
|
||||
|
@ -129,11 +129,11 @@ select "--- offset --" as "";
|
|||
--disable_query_log
|
||||
select "--- start-position --" as "";
|
||||
--enable_query_log
|
||||
--exec $MYSQL_BINLOG --short-form --start-position=602 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 master-bin.000002
|
||||
--exec $MYSQL_BINLOG --short-form --start-position=604 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 master-bin.000002
|
||||
--disable_query_log
|
||||
select "--- stop-position --" as "";
|
||||
--enable_query_log
|
||||
--exec $MYSQL_BINLOG --short-form --stop-position=124 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 master-bin.000002
|
||||
--exec $MYSQL_BINLOG --short-form --stop-position=126 --read-from-remote-server --user=root --host=127.0.0.1 --port=$MASTER_MYPORT master-bin.000001 master-bin.000002
|
||||
--disable_query_log
|
||||
select "--- start-datetime --" as "";
|
||||
--enable_query_log
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1, `"t"1`, t1aa,t2aa;
|
||||
DROP TABLE IF EXISTS t1, `"t"1`, t1aa, t2, t2aa;
|
||||
drop database if exists mysqldump_test_db;
|
||||
drop view if exists v1;
|
||||
--enable_warnings
|
||||
|
|
|
@ -107,7 +107,7 @@ connection master;
|
|||
drop database mysqltest2;
|
||||
drop database mysqltest3;
|
||||
--replace_column 2 # 5 #
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
sync_slave_with_master;
|
||||
|
||||
# Check that we can change global.collation_server (since 5.0.3)
|
||||
|
|
|
@ -68,7 +68,7 @@ show slave status;
|
|||
# 2) Test lock wait timeout
|
||||
|
||||
stop slave;
|
||||
change master to master_log_pos=534; # the BEGIN log event
|
||||
change master to master_log_pos=536; # the BEGIN log event
|
||||
begin;
|
||||
select * from t2 for update; # hold lock
|
||||
start slave;
|
||||
|
@ -89,7 +89,7 @@ set global max_relay_log_size=0;
|
|||
|
||||
# This is really copy-paste of 2) of above
|
||||
stop slave;
|
||||
change master to master_log_pos=534;
|
||||
change master to master_log_pos=536;
|
||||
begin;
|
||||
select * from t2 for update;
|
||||
start slave;
|
||||
|
|
|
@ -48,7 +48,8 @@ connection master;
|
|||
--error 0,1053;
|
||||
reap;
|
||||
connection master1;
|
||||
show binlog events from 96;
|
||||
--replace_column 2 # 5 #
|
||||
show binlog events from 98;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
# SQL slave thread should not have stopped (because table of the killed
|
||||
|
|
|
@ -18,6 +18,7 @@ rename table t1 to t5, t2 to t1;
|
|||
flush no_write_to_binlog tables;
|
||||
# Check that it's not in the binlog.
|
||||
--replace_result $SERVER_VERSION SERVER_VERSION
|
||||
--replace_column 2 # 5 #
|
||||
show binlog events;
|
||||
# Check that the master is not confused.
|
||||
select * from t3;
|
||||
|
@ -25,6 +26,7 @@ select * from t3;
|
|||
flush tables;
|
||||
# Check that it's in the binlog.
|
||||
--replace_result $SERVER_VERSION SERVER_VERSION
|
||||
--replace_column 2 # 5 #
|
||||
show binlog events;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
|
|
|
@ -36,8 +36,7 @@ select * from t3;
|
|||
# But we can't simply read this binlog, because as the slave has not been
|
||||
# restarted for this test, the file_id is uncertain (would cause test
|
||||
# failures). So instead, we test if the binlog looks long enough to
|
||||
# contain LOAD DATA. That is, I (Guilhem) have done SHOW BINLOG EVENTS on my
|
||||
# machine, saw that the binlog is of size 1068 (in 5.0.0) when things go fine.
|
||||
# contain LOAD DATA. Since 5.0.3 we assume that binlog of 1292 is ok.
|
||||
# If LOAD DATA was not logged, the binlog would be shorter.
|
||||
show master status;
|
||||
|
||||
|
@ -84,7 +83,9 @@ set sql_log_bin=1;
|
|||
load data infile '../../std_data/rpl_loaddata.dat' into table t1;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
# The SQL slave thread should be stopped now.
|
||||
# The SQL slave thread should be stopped now.
|
||||
# Exec_Master_Log_Pos should point to the start of Execute event
|
||||
# for last load data.
|
||||
wait_for_slave_to_stop;
|
||||
|
||||
# CHANGE MASTER and see if error is cleared in SHOW SLAVE STATUS.
|
||||
|
|
|
@ -19,5 +19,9 @@ create database mysqltest;
|
|||
create table t1(a int, b int, unique(b));
|
||||
use mysqltest;
|
||||
load data infile '../../std_data/rpl_loaddata.dat' into table test.t1;
|
||||
show binlog events from 96; # should be nothing
|
||||
# Starting from 5.0.3 LOAD DATA is replicated much in the same way as ordinary
|
||||
# query so "show binlog ..." should show two events (before 5.0.3 no events
|
||||
# were returned).
|
||||
--replace_column 2 # 5 #
|
||||
show binlog events from 98;
|
||||
drop database mysqltest;
|
||||
|
|
|
@ -17,4 +17,4 @@ save_master_pos;
|
|||
connection slave;
|
||||
sync_with_master;
|
||||
select count(*) from t1; # check that LOAD was replicated
|
||||
show binlog events from 96; # should be nothing
|
||||
show binlog events from 98; # should be nothing
|
||||
|
|
|
@ -34,3 +34,27 @@ drop table t1;
|
|||
save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
|
||||
#
|
||||
# Now let us test how well we replicate LOAD DATA LOCAL in situation when
|
||||
# we met duplicates in tables to which we are adding rows.
|
||||
# (It supposed that LOAD DATA LOCAL ignores such errors)
|
||||
#
|
||||
connection master;
|
||||
create table t1(a int);
|
||||
insert into t1 values (1), (2), (2), (3);
|
||||
select * into outfile '../../var/master-data/rpl_loaddatalocal.select_outfile' from t1;
|
||||
drop table t1;
|
||||
create table t1(a int primary key);
|
||||
load data local infile './var/master-data/rpl_loaddatalocal.select_outfile' into table t1;
|
||||
system rm ./var/master-data/rpl_loaddatalocal.select_outfile ;
|
||||
select * from t1;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
select * from t1;
|
||||
connection master;
|
||||
drop table t1;
|
||||
save_master_pos;
|
||||
connection slave;
|
||||
sync_with_master;
|
||||
|
|
|
@ -38,9 +38,9 @@ select count(*) from t1;
|
|||
drop table t1;
|
||||
--replace_result $VERSION VERSION
|
||||
show binlog events;
|
||||
show binlog events from 96 limit 1;
|
||||
show binlog events from 96 limit 2;
|
||||
show binlog events from 96 limit 2,1;
|
||||
show binlog events from 98 limit 1;
|
||||
show binlog events from 98 limit 2;
|
||||
show binlog events from 98 limit 2,1;
|
||||
flush logs;
|
||||
|
||||
# We need an extra update before doing save_master_pos.
|
||||
|
|
|
@ -38,7 +38,7 @@ insert into t1 values (1),(2),(3);
|
|||
save_master_pos;
|
||||
connection slave;
|
||||
stop slave;
|
||||
change master to master_log_pos=96;
|
||||
change master to master_log_pos=98;
|
||||
start slave;
|
||||
sync_with_master;
|
||||
select * from t1;
|
||||
|
|
|
@ -24,6 +24,6 @@ sync_slave_with_master;
|
|||
select * from mysqltest.t1;
|
||||
connection master;
|
||||
--replace_column 2 # 5 #
|
||||
show binlog events from 96;
|
||||
show binlog events from 98;
|
||||
drop database mysqltest;
|
||||
sync_slave_with_master;
|
||||
|
|
|
@ -82,6 +82,7 @@ drop temporary table t3;
|
|||
select * from t2;
|
||||
|
||||
--replace_result $VERSION VERSION
|
||||
--replace_column 2 # 5 #
|
||||
show binlog events;
|
||||
|
||||
drop table t1, t2;
|
||||
|
|
|
@ -32,6 +32,7 @@ select * from t1;
|
|||
connection master;
|
||||
# We should not see SET ONE_SHOT time_zone before second insert
|
||||
--replace_result $VERSION VERSION
|
||||
--replace_column 2 # 5 #
|
||||
show binlog events;
|
||||
|
||||
#
|
||||
|
|
|
@ -24,7 +24,7 @@ show binlog events;
|
|||
|
||||
# try to replicate all queries until drop of t1
|
||||
connection slave;
|
||||
start slave until master_log_file='master-bin.000001', master_log_pos=304;
|
||||
start slave until master_log_file='master-bin.000001', master_log_pos=321;
|
||||
sleep 2;
|
||||
# here table should be still not deleted
|
||||
select * from t1;
|
||||
|
@ -42,7 +42,7 @@ sleep 2;
|
|||
show slave status;
|
||||
|
||||
# try replicate all until second insert to t2;
|
||||
start slave until relay_log_file='slave-relay-bin.000004', relay_log_pos=710;
|
||||
start slave until relay_log_file='slave-relay-bin.000004', relay_log_pos=751;
|
||||
sleep 4;
|
||||
select * from t2;
|
||||
--replace_result $MASTER_MYPORT MASTER_MYPORT
|
||||
|
@ -58,7 +58,7 @@ sync_with_master;
|
|||
stop slave;
|
||||
|
||||
# this should stop immediately as we are already there
|
||||
start slave until master_log_file='master-bin.000001', master_log_pos=710;
|
||||
start slave until master_log_file='master-bin.000001', master_log_pos=783;
|
||||
# 2 is not enough when running with valgrind
|
||||
real_sleep 4
|
||||
# here the sql slave thread should be stopped
|
||||
|
@ -77,6 +77,6 @@ start slave until master_log_file='master-bin.000001';
|
|||
start slave until relay_log_file='slave-relay-bin.000002';
|
||||
--error 1277
|
||||
start slave until relay_log_file='slave-relay-bin.000002', master_log_pos=561;
|
||||
|
||||
# Warning should be given for second command
|
||||
start slave sql_thread;
|
||||
start slave until master_log_file='master-bin.000001', master_log_pos=710;
|
||||
start slave until master_log_file='master-bin.000001', master_log_pos=783;
|
||||
|
|
|
@ -46,7 +46,8 @@ save_master_pos;
|
|||
connection slave;
|
||||
sync_with_master;
|
||||
select * from t1;
|
||||
show binlog events from 96;
|
||||
--replace_column 2 # 5 #
|
||||
show binlog events from 98;
|
||||
connection master;
|
||||
drop table t1;
|
||||
save_master_pos;
|
||||
|
|
|
@ -108,7 +108,8 @@ INSERT INTO t1 VALUES(@`a b`);
|
|||
set @var1= "';aaa";
|
||||
SET @var2=char(ascii('a'));
|
||||
insert into t1 values (@var1),(@var2);
|
||||
show binlog events from 96;
|
||||
--replace_column 2 # 5 #
|
||||
show binlog events from 98;
|
||||
# more important than SHOW BINLOG EVENTS, mysqlbinlog (where we
|
||||
# absolutely need variables names to be quoted and strings to be
|
||||
# escaped).
|
||||
|
|
|
@ -14,8 +14,10 @@
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
|
||||
#ifdef __sgi
|
||||
/* define on IRIX to get posix compliant vsnprintf */
|
||||
#define _XOPEN_SOURCE 500
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <basestring_vsnprintf.h>
|
||||
#include <my_config.h>
|
||||
|
|
|
@ -2920,6 +2920,7 @@ calc_row_difference(
|
|||
ulint o_len;
|
||||
ulint n_len;
|
||||
ulint col_pack_len;
|
||||
byte* new_mysql_row_col;
|
||||
byte* o_ptr;
|
||||
byte* n_ptr;
|
||||
byte* buf;
|
||||
|
@ -2948,10 +2949,17 @@ calc_row_difference(
|
|||
o_ptr = (byte*) old_row + get_field_offset(table, field);
|
||||
n_ptr = (byte*) new_row + get_field_offset(table, field);
|
||||
|
||||
/* Use new_mysql_row_col and col_pack_len save the values */
|
||||
|
||||
new_mysql_row_col = n_ptr;
|
||||
col_pack_len = field->pack_length();
|
||||
|
||||
o_len = col_pack_len;
|
||||
n_len = col_pack_len;
|
||||
|
||||
/* We use o_ptr and n_ptr to dig up the actual data for
|
||||
comparison. */
|
||||
|
||||
field_mysql_type = field->type();
|
||||
|
||||
col_type = get_innobase_type_from_mysql_type(field);
|
||||
|
@ -3017,13 +3025,11 @@ calc_row_difference(
|
|||
&dfield,
|
||||
(byte*)buf,
|
||||
TRUE,
|
||||
n_ptr,
|
||||
new_mysql_row_col,
|
||||
col_pack_len,
|
||||
prebuilt->table->comp);
|
||||
ufield->new_val.data =
|
||||
dfield_get_data(&dfield);
|
||||
ufield->new_val.len =
|
||||
dfield_get_len(&dfield);
|
||||
ufield->new_val.data = dfield.data;
|
||||
ufield->new_val.len = dfield.len;
|
||||
} else {
|
||||
ufield->new_val.data = NULL;
|
||||
ufield->new_val.len = UNIV_SQL_NULL;
|
||||
|
@ -4031,7 +4037,11 @@ create_index(
|
|||
col_type = get_innobase_type_from_mysql_type(key_part->field);
|
||||
|
||||
if (DATA_BLOB == col_type
|
||||
|| key_part->length < field->pack_length()) {
|
||||
|| (key_part->length < field->pack_length()
|
||||
&& field->type() != MYSQL_TYPE_VARCHAR)
|
||||
|| (field->type() == MYSQL_TYPE_VARCHAR
|
||||
&& key_part->length < field->pack_length()
|
||||
- ((Field_varstring*)field)->length_bytes)) {
|
||||
|
||||
prefix_len = key_part->length;
|
||||
|
||||
|
|
117
sql/item_func.cc
117
sql/item_func.cc
|
@ -3294,12 +3294,28 @@ Item_func_set_user_var::fix_length_and_dec()
|
|||
}
|
||||
|
||||
|
||||
bool Item_func_set_user_var::update_hash(void *ptr, uint length,
|
||||
Item_result type,
|
||||
CHARSET_INFO *cs,
|
||||
Derivation dv)
|
||||
/*
|
||||
Set value to user variable.
|
||||
|
||||
SYNOPSYS
|
||||
update_hash()
|
||||
entry - pointer to structure representing variable
|
||||
set_null - should we set NULL value ?
|
||||
ptr - pointer to buffer with new value
|
||||
length - length of new value
|
||||
type - type of new value
|
||||
cs - charset info for new value
|
||||
dv - derivation for new value
|
||||
|
||||
RETURN VALUE
|
||||
False - success, True - failure
|
||||
*/
|
||||
|
||||
static bool
|
||||
update_hash(user_var_entry *entry, bool set_null, void *ptr, uint length,
|
||||
Item_result type, CHARSET_INFO *cs, Derivation dv)
|
||||
{
|
||||
if ((null_value=args[0]->null_value))
|
||||
if (set_null)
|
||||
{
|
||||
char *pos= (char*) entry+ ALIGN_SIZE(sizeof(user_var_entry));
|
||||
if (entry->value && entry->value != pos)
|
||||
|
@ -3332,7 +3348,7 @@ bool Item_func_set_user_var::update_hash(void *ptr, uint length,
|
|||
entry->value=0;
|
||||
if (!(entry->value=(char*) my_realloc(entry->value, length,
|
||||
MYF(MY_ALLOW_ZERO_PTR))))
|
||||
goto err;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (type == STRING_RESULT)
|
||||
|
@ -3348,11 +3364,21 @@ bool Item_func_set_user_var::update_hash(void *ptr, uint length,
|
|||
entry->collation.set(cs, dv);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
err:
|
||||
current_thd->fatal_error(); // Probably end of memory
|
||||
null_value= 1;
|
||||
return 1;
|
||||
|
||||
bool
|
||||
Item_func_set_user_var::update_hash(void *ptr, uint length, Item_result type,
|
||||
CHARSET_INFO *cs, Derivation dv)
|
||||
{
|
||||
if (::update_hash(entry, (null_value= args[0]->null_value),
|
||||
ptr, length, type, cs, dv))
|
||||
{
|
||||
current_thd->fatal_error(); // Probably end of memory
|
||||
null_value= 1;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -3878,6 +3904,77 @@ bool Item_func_get_user_var::eq(const Item *item, bool binary_cmp) const
|
|||
}
|
||||
|
||||
|
||||
bool Item_user_var_as_out_param::fix_fields(THD *thd, TABLE_LIST *tables,
|
||||
Item **ref)
|
||||
{
|
||||
DBUG_ASSERT(fixed == 0);
|
||||
if (Item::fix_fields(thd, tables, ref) ||
|
||||
!(entry= get_variable(&thd->user_vars, name, 1)))
|
||||
return TRUE;
|
||||
entry->type= STRING_RESULT;
|
||||
/*
|
||||
Let us set the same collation which is used for loading
|
||||
of fields in LOAD DATA INFILE.
|
||||
(Since Item_user_var_as_out_param is used only there).
|
||||
*/
|
||||
entry->collation.set(thd->variables.collation_database);
|
||||
entry->update_query_id= thd->query_id;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
void Item_user_var_as_out_param::set_null_value(CHARSET_INFO* cs)
|
||||
{
|
||||
if (::update_hash(entry, TRUE, 0, 0, STRING_RESULT, cs,
|
||||
DERIVATION_IMPLICIT))
|
||||
current_thd->fatal_error(); // Probably end of memory
|
||||
}
|
||||
|
||||
|
||||
void Item_user_var_as_out_param::set_value(const char *str, uint length,
|
||||
CHARSET_INFO* cs)
|
||||
{
|
||||
if (::update_hash(entry, FALSE, (void*)str, length, STRING_RESULT, cs,
|
||||
DERIVATION_IMPLICIT))
|
||||
current_thd->fatal_error(); // Probably end of memory
|
||||
}
|
||||
|
||||
|
||||
double Item_user_var_as_out_param::val_real()
|
||||
{
|
||||
DBUG_ASSERT(0);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
|
||||
longlong Item_user_var_as_out_param::val_int()
|
||||
{
|
||||
DBUG_ASSERT(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
String* Item_user_var_as_out_param::val_str(String *str)
|
||||
{
|
||||
DBUG_ASSERT(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
my_decimal* Item_user_var_as_out_param::val_decimal(my_decimal *decimal_buffer)
|
||||
{
|
||||
DBUG_ASSERT(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void Item_user_var_as_out_param::print(String *str)
|
||||
{
|
||||
str->append('@');
|
||||
str->append(name.str,name.length);
|
||||
}
|
||||
|
||||
|
||||
longlong Item_func_inet_aton::val_int()
|
||||
{
|
||||
DBUG_ASSERT(fixed == 1);
|
||||
|
|
|
@ -1131,6 +1131,35 @@ public:
|
|||
};
|
||||
|
||||
|
||||
/*
|
||||
This item represents user variable used as out parameter (e.g in LOAD DATA),
|
||||
and it is supposed to be used only for this purprose. So it is simplified
|
||||
a lot. Actually you should never obtain its value.
|
||||
|
||||
The only two reasons for this thing being an Item is possibility to store it
|
||||
in List<Item> and desire to place this code somewhere near other functions
|
||||
working with user variables.
|
||||
*/
|
||||
class Item_user_var_as_out_param :public Item
|
||||
{
|
||||
LEX_STRING name;
|
||||
user_var_entry *entry;
|
||||
public:
|
||||
Item_user_var_as_out_param(LEX_STRING a) : name(a) {}
|
||||
/* We should return something different from FIELD_ITEM here */
|
||||
enum Type type() const { return STRING_ITEM;}
|
||||
double val_real();
|
||||
longlong val_int();
|
||||
String *val_str(String *str);
|
||||
my_decimal *val_decimal(my_decimal *decimal_buffer);
|
||||
/* fix_fields() binds variable name with its entry structure */
|
||||
bool fix_fields(THD *thd, struct st_table_list *tables, Item **ref);
|
||||
void print(String *str);
|
||||
void set_null_value(CHARSET_INFO* cs);
|
||||
void set_value(const char *str, uint length, CHARSET_INFO* cs);
|
||||
};
|
||||
|
||||
|
||||
class Item_func_inet_aton : public Item_int_func
|
||||
{
|
||||
public:
|
||||
|
|
403
sql/log_event.cc
403
sql/log_event.cc
|
@ -272,6 +272,8 @@ const char* Log_event::get_type_str()
|
|||
case XID_EVENT: return "Xid";
|
||||
case USER_VAR_EVENT: return "User var";
|
||||
case FORMAT_DESCRIPTION_EVENT: return "Format_desc";
|
||||
case BEGIN_LOAD_QUERY_EVENT: return "Begin_load_query";
|
||||
case EXECUTE_LOAD_QUERY_EVENT: return "Execute_load_query";
|
||||
default: return "Unknown"; /* impossible */
|
||||
}
|
||||
}
|
||||
|
@ -783,10 +785,10 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len,
|
|||
|
||||
switch(buf[EVENT_TYPE_OFFSET]) {
|
||||
case QUERY_EVENT:
|
||||
ev = new Query_log_event(buf, event_len, description_event);
|
||||
ev = new Query_log_event(buf, event_len, description_event, QUERY_EVENT);
|
||||
break;
|
||||
case LOAD_EVENT:
|
||||
ev = new Create_file_log_event(buf, event_len, description_event);
|
||||
ev = new Load_log_event(buf, event_len, description_event);
|
||||
break;
|
||||
case NEW_LOAD_EVENT:
|
||||
ev = new Load_log_event(buf, event_len, description_event);
|
||||
|
@ -832,6 +834,12 @@ Log_event* Log_event::read_log_event(const char* buf, uint event_len,
|
|||
case FORMAT_DESCRIPTION_EVENT:
|
||||
ev = new Format_description_log_event(buf, event_len, description_event);
|
||||
break;
|
||||
case BEGIN_LOAD_QUERY_EVENT:
|
||||
ev = new Begin_load_query_log_event(buf, event_len, description_event);
|
||||
break;
|
||||
case EXECUTE_LOAD_QUERY_EVENT:
|
||||
ev = new Execute_load_query_log_event(buf, event_len, description_event);
|
||||
break;
|
||||
default:
|
||||
DBUG_PRINT("error",("Unknown evernt code: %d",(int) buf[EVENT_TYPE_OFFSET]));
|
||||
ev= NULL;
|
||||
|
@ -1085,10 +1093,13 @@ bool Query_log_event::write(IO_CACHE* file)
|
|||
Calculate length of whole event
|
||||
The "1" below is the \0 in the db's length
|
||||
*/
|
||||
event_length= (uint) (start-buf) + db_len + 1 + q_len;
|
||||
event_length= (uint) (start-buf) + get_post_header_size_for_derived() + db_len + 1 + q_len;
|
||||
|
||||
return (write_header(file, event_length) ||
|
||||
my_b_safe_write(file, (byte*) buf, (uint) (start-buf)) ||
|
||||
my_b_safe_write(file, (byte*) buf, QUERY_HEADER_LEN) ||
|
||||
write_post_header_for_derived(file) ||
|
||||
my_b_safe_write(file, (byte*) start_of_status,
|
||||
(uint) (start-start_of_status)) ||
|
||||
my_b_safe_write(file, (db) ? (byte*) db : (byte*)"", db_len + 1) ||
|
||||
my_b_safe_write(file, (byte*) query, q_len)) ? 1 : 0;
|
||||
}
|
||||
|
@ -1150,7 +1161,8 @@ Query_log_event::Query_log_event(THD* thd_arg, const char* query_arg,
|
|||
*/
|
||||
|
||||
Query_log_event::Query_log_event(const char* buf, uint event_len,
|
||||
const Format_description_log_event *description_event)
|
||||
const Format_description_log_event *description_event,
|
||||
Log_event_type event_type)
|
||||
:Log_event(buf, description_event), data_buf(0), query(NullS), catalog(NullS),
|
||||
db(NullS), catalog_len(0), status_vars_len(0),
|
||||
flags2_inited(0), sql_mode_inited(0), charset_inited(0),
|
||||
|
@ -1163,7 +1175,7 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
|
|||
DBUG_ENTER("Query_log_event::Query_log_event(char*,...)");
|
||||
|
||||
common_header_len= description_event->common_header_len;
|
||||
post_header_len= description_event->post_header_len[QUERY_EVENT-1];
|
||||
post_header_len= description_event->post_header_len[event_type-1];
|
||||
DBUG_PRINT("info",("event_len=%ld, common_header_len=%d, post_header_len=%d",
|
||||
event_len, common_header_len, post_header_len));
|
||||
|
||||
|
@ -1196,13 +1208,12 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
|
|||
(uint) status_vars_len));
|
||||
tmp-= 2;
|
||||
}
|
||||
/* we have parsed everything we know in the post header */
|
||||
#ifndef DBUG_OFF
|
||||
if (tmp) /* this is probably a master newer than us */
|
||||
DBUG_PRINT("info", ("Query_log_event has longer post header than we know\
|
||||
(%d more bytes)", tmp));
|
||||
#endif
|
||||
|
||||
/*
|
||||
We have parsed everything we know in the post header for QUERY_EVENT,
|
||||
the rest of post header is either comes from older version MySQL or
|
||||
dedicated to derived events (e.g. Execute_load_query...)
|
||||
*/
|
||||
|
||||
/* variable-part: the status vars; only in MySQL 5.0 */
|
||||
|
||||
start= (char*) (buf+post_header_len);
|
||||
|
@ -1281,8 +1292,8 @@ Query_log_event::Query_log_event(const char* buf, uint event_len,
|
|||
*/
|
||||
|
||||
#ifdef MYSQL_CLIENT
|
||||
void Query_log_event::print(FILE* file, bool short_form,
|
||||
LAST_EVENT_INFO* last_event_info)
|
||||
void Query_log_event::print_query_header(FILE* file, bool short_form,
|
||||
LAST_EVENT_INFO* last_event_info)
|
||||
{
|
||||
// TODO: print the catalog ??
|
||||
char buff[40],*end; // Enough for SET TIMESTAMP
|
||||
|
@ -1292,8 +1303,8 @@ void Query_log_event::print(FILE* file, bool short_form,
|
|||
if (!short_form)
|
||||
{
|
||||
print_header(file);
|
||||
fprintf(file, "\tQuery\tthread_id=%lu\texec_time=%lu\terror_code=%d\n",
|
||||
(ulong) thread_id, (ulong) exec_time, error_code);
|
||||
fprintf(file, "\t%s\tthread_id=%lu\texec_time=%lu\terror_code=%d\n",
|
||||
get_type_str(), (ulong) thread_id, (ulong) exec_time, error_code);
|
||||
}
|
||||
|
||||
if (!(flags & LOG_EVENT_SUPPRESS_USE_F) && db)
|
||||
|
@ -1399,7 +1410,13 @@ void Query_log_event::print(FILE* file, bool short_form,
|
|||
memcpy(last_event_info->charset, charset, 6);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Query_log_event::print(FILE* file, bool short_form,
|
||||
LAST_EVENT_INFO* last_event_info)
|
||||
{
|
||||
print_query_header(file, short_form, last_event_info);
|
||||
my_fwrite(file, (byte*) query, q_len, MYF(MY_NABP | MY_WME));
|
||||
fputs(";\n", file);
|
||||
}
|
||||
|
@ -1412,6 +1429,12 @@ void Query_log_event::print(FILE* file, bool short_form,
|
|||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
int Query_log_event::exec_event(struct st_relay_log_info* rli)
|
||||
{
|
||||
return exec_event(rli, query, q_len);
|
||||
}
|
||||
|
||||
|
||||
int Query_log_event::exec_event(struct st_relay_log_info* rli, const char *query_arg, uint32 q_len_arg)
|
||||
{
|
||||
int expected_error,actual_error= 0;
|
||||
/*
|
||||
|
@ -1444,8 +1467,8 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
|
|||
if (db_ok(thd->db, replicate_do_db, replicate_ignore_db))
|
||||
{
|
||||
thd->set_time((time_t)when);
|
||||
thd->query_length= q_len;
|
||||
thd->query = (char*)query;
|
||||
thd->query_length= q_len_arg;
|
||||
thd->query= (char*)query_arg;
|
||||
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
||||
thd->query_id = next_query_id();
|
||||
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
||||
|
@ -1506,7 +1529,7 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
|
|||
}
|
||||
|
||||
/* Execute the query (note that we bypass dispatch_command()) */
|
||||
mysql_parse(thd, thd->query, q_len);
|
||||
mysql_parse(thd, thd->query, thd->query_length);
|
||||
|
||||
}
|
||||
else
|
||||
|
@ -1518,7 +1541,7 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli)
|
|||
we exit gracefully; otherwise we warn about the bad error and tell DBA
|
||||
to check/fix it.
|
||||
*/
|
||||
if (mysql_test_parse_for_slave(thd, thd->query, q_len))
|
||||
if (mysql_test_parse_for_slave(thd, thd->query, thd->query_length))
|
||||
clear_all_errors(thd, rli); /* Can ignore query */
|
||||
else
|
||||
{
|
||||
|
@ -1560,7 +1583,7 @@ Default database: '%s'. Query: '%s'",
|
|||
expected_error,
|
||||
actual_error ? thd->net.last_error: "no error",
|
||||
actual_error,
|
||||
print_slave_db_safe(db), query);
|
||||
print_slave_db_safe(db), query_arg);
|
||||
thd->query_error= 1;
|
||||
}
|
||||
/*
|
||||
|
@ -1581,7 +1604,7 @@ Default database: '%s'. Query: '%s'",
|
|||
"Error '%s' on query. Default database: '%s'. Query: '%s'",
|
||||
(actual_error ? thd->net.last_error :
|
||||
"unexpected success or fatal error"),
|
||||
print_slave_db_safe(thd->db), query);
|
||||
print_slave_db_safe(thd->db), query_arg);
|
||||
thd->query_error= 1;
|
||||
}
|
||||
|
||||
|
@ -1828,11 +1851,6 @@ int Start_log_event_v3::exec_event(struct st_relay_log_info* rli)
|
|||
server starts or when FLUSH LOGS), or to create artificial events to parse
|
||||
binlogs from MySQL 3.23 or 4.x.
|
||||
When in a client, only the 2nd use is possible.
|
||||
|
||||
TODO
|
||||
Update this code with the new event for LOAD DATA, once they are pushed (in
|
||||
4.1 or 5.0). If it's in 5.0, only the "case 4" block should be updated.
|
||||
|
||||
*/
|
||||
|
||||
Format_description_log_event::
|
||||
|
@ -1866,6 +1884,8 @@ Format_description_log_event(uint8 binlog_ver, const char* server_ver)
|
|||
post_header_len[DELETE_FILE_EVENT-1]= DELETE_FILE_HEADER_LEN;
|
||||
post_header_len[NEW_LOAD_EVENT-1]= post_header_len[LOAD_EVENT-1];
|
||||
post_header_len[FORMAT_DESCRIPTION_EVENT-1]= FORMAT_DESCRIPTION_HEADER_LEN;
|
||||
post_header_len[BEGIN_LOAD_QUERY_EVENT-1]= post_header_len[APPEND_BLOCK_EVENT-1];
|
||||
post_header_len[EXECUTE_LOAD_QUERY_EVENT-1]= EXECUTE_LOAD_QUERY_HEADER_LEN;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -2071,12 +2091,9 @@ int Format_description_log_event::exec_event(struct st_relay_log_info* rli)
|
|||
*/
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Load_log_event::pack_info(Protocol *protocol)
|
||||
uint Load_log_event::get_query_buffer_length()
|
||||
{
|
||||
char *buf, *pos;
|
||||
uint buf_len;
|
||||
|
||||
buf_len=
|
||||
return
|
||||
5 + db_len + 3 + // "use DB; "
|
||||
18 + fname_len + 2 + // "LOAD DATA INFILE 'file''"
|
||||
7 + // LOCAL
|
||||
|
@ -2089,11 +2106,15 @@ void Load_log_event::pack_info(Protocol *protocol)
|
|||
19 + sql_ex.line_start_len*4 + 2 + // " LINES STARTING BY 'str'"
|
||||
15 + 22 + // " IGNORE xxx LINES"
|
||||
3 + (num_fields-1)*2 + field_block_len; // " (field1, field2, ...)"
|
||||
}
|
||||
|
||||
if (!(buf= my_malloc(buf_len, MYF(MY_WME))))
|
||||
return;
|
||||
pos= buf;
|
||||
if (db && db_len)
|
||||
|
||||
void Load_log_event::print_query(bool need_db, char *buf,
|
||||
char **end, char **fn_start, char **fn_end)
|
||||
{
|
||||
char *pos= buf;
|
||||
|
||||
if (need_db && db && db_len)
|
||||
{
|
||||
pos= strmov(pos, "use `");
|
||||
memcpy(pos, db, db_len);
|
||||
|
@ -2101,6 +2122,10 @@ void Load_log_event::pack_info(Protocol *protocol)
|
|||
}
|
||||
|
||||
pos= strmov(pos, "LOAD DATA ");
|
||||
|
||||
if (fn_start)
|
||||
*fn_start= pos;
|
||||
|
||||
if (check_fname_outside_temp_buf())
|
||||
pos= strmov(pos, "LOCAL ");
|
||||
pos= strmov(pos, "INFILE '");
|
||||
|
@ -2112,7 +2137,12 @@ void Load_log_event::pack_info(Protocol *protocol)
|
|||
else if (sql_ex.opt_flags & IGNORE_FLAG)
|
||||
pos= strmov(pos, " IGNORE ");
|
||||
|
||||
pos= strmov(pos ,"INTO TABLE `");
|
||||
pos= strmov(pos ,"INTO");
|
||||
|
||||
if (fn_end)
|
||||
*fn_end= pos;
|
||||
|
||||
pos= strmov(pos ," TABLE `");
|
||||
memcpy(pos, table_name, table_name_len);
|
||||
pos+= table_name_len;
|
||||
|
||||
|
@ -2161,7 +2191,18 @@ void Load_log_event::pack_info(Protocol *protocol)
|
|||
*pos++= ')';
|
||||
}
|
||||
|
||||
protocol->store(buf, pos-buf, &my_charset_bin);
|
||||
*end= pos;
|
||||
}
|
||||
|
||||
|
||||
void Load_log_event::pack_info(Protocol *protocol)
|
||||
{
|
||||
char *buf, *end;
|
||||
|
||||
if (!(buf= my_malloc(get_query_buffer_length(), MYF(MY_WME))))
|
||||
return;
|
||||
print_query(TRUE, buf, &end, 0, 0);
|
||||
protocol->store(buf, end-buf, &my_charset_bin);
|
||||
my_free(buf, MYF(0));
|
||||
}
|
||||
#endif /* defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) */
|
||||
|
@ -2368,11 +2409,6 @@ int Load_log_event::copy_log_event(const char *buf, ulong event_len,
|
|||
fname_len = strlen(fname);
|
||||
// null termination is accomplished by the caller doing buf[event_len]=0
|
||||
|
||||
/*
|
||||
In 5.0 this event will have the same format, as we are planning to log LOAD
|
||||
DATA INFILE in a completely different way (as a plain-text query) since 4.1
|
||||
or 5.0 (Dmitri's WL#874)
|
||||
*/
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
@ -2532,7 +2568,6 @@ void Load_log_event::set_fields(const char* affected_db,
|
|||
int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
||||
bool use_rli_only_for_errors)
|
||||
{
|
||||
char *load_data_query= 0;
|
||||
thd->db_length= db_len;
|
||||
thd->db= (char*) rewrite_db(db, &thd->db_length);
|
||||
DBUG_ASSERT(thd->query == 0);
|
||||
|
@ -2594,21 +2629,30 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
|||
else
|
||||
{
|
||||
char llbuff[22];
|
||||
char *end;
|
||||
enum enum_duplicates handle_dup;
|
||||
bool ignore= 0;
|
||||
char *load_data_query;
|
||||
|
||||
/*
|
||||
Make a simplified LOAD DATA INFILE query, for the information of the
|
||||
user in SHOW PROCESSLIST. Note that db is known in the 'db' column.
|
||||
Forge LOAD DATA INFILE query which will be used in SHOW PROCESS LIST
|
||||
and written to slave's binlog if binlogging is on.
|
||||
*/
|
||||
if ((load_data_query= (char *) my_alloca(18 + strlen(fname) + 14 +
|
||||
strlen(tables.table_name) + 8)))
|
||||
if (!(load_data_query= (char *)thd->alloc(get_query_buffer_length() + 1)))
|
||||
{
|
||||
thd->query_length= (uint)(strxmov(load_data_query,
|
||||
"LOAD DATA INFILE '", fname,
|
||||
"' INTO TABLE `", tables.table_name,
|
||||
"` <...>", NullS) - load_data_query);
|
||||
thd->query= load_data_query;
|
||||
/*
|
||||
This will set thd->fatal_error in case of OOM. So we surely will notice
|
||||
that something is wrong.
|
||||
*/
|
||||
goto error;
|
||||
}
|
||||
|
||||
print_query(FALSE, load_data_query, &end, (char **)&thd->lex->fname_start,
|
||||
(char **)&thd->lex->fname_end);
|
||||
*end= 0;
|
||||
thd->query_length= end - load_data_query;
|
||||
thd->query= load_data_query;
|
||||
|
||||
if (sql_ex.opt_flags & REPLACE_FLAG)
|
||||
handle_dup= DUP_REPLACE;
|
||||
else if (sql_ex.opt_flags & IGNORE_FLAG)
|
||||
|
@ -2654,6 +2698,7 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
|||
List<Item> field_list;
|
||||
set_fields(thd->db,field_list);
|
||||
thd->variables.pseudo_thread_id= thread_id;
|
||||
List<Item> set_fields;
|
||||
if (net)
|
||||
{
|
||||
// mysql_load will use thd->net to read the file
|
||||
|
@ -2663,9 +2708,13 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
|||
*/
|
||||
thd->net.pkt_nr = net->pkt_nr;
|
||||
}
|
||||
if (mysql_load(thd, &ex, &tables, field_list, handle_dup, ignore,
|
||||
net != 0, TL_WRITE))
|
||||
thd->query_error = 1;
|
||||
/*
|
||||
It is safe to use set_fields twice because we are not going to
|
||||
update it inside mysql_load().
|
||||
*/
|
||||
if (mysql_load(thd, &ex, &tables, field_list, set_fields, set_fields,
|
||||
handle_dup, ignore, net != 0))
|
||||
thd->query_error= 1;
|
||||
if (thd->cuted_fields)
|
||||
{
|
||||
/* log_pos is the position of the LOAD event in the master log */
|
||||
|
@ -2691,7 +2740,8 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
|||
if (net)
|
||||
skip_load_data_infile(net);
|
||||
}
|
||||
|
||||
|
||||
error:
|
||||
thd->net.vio = 0;
|
||||
char *save_db= thd->db;
|
||||
VOID(pthread_mutex_lock(&LOCK_thread_count));
|
||||
|
@ -2700,8 +2750,6 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
|||
thd->query_length= thd->db_length= 0;
|
||||
VOID(pthread_mutex_unlock(&LOCK_thread_count));
|
||||
close_thread_tables(thd);
|
||||
if (load_data_query)
|
||||
my_afree(load_data_query);
|
||||
if (thd->query_error)
|
||||
{
|
||||
/* this err/sql_errno code is copy-paste from net_send_error() */
|
||||
|
@ -4016,8 +4064,8 @@ void Append_block_log_event::print(FILE* file, bool short_form,
|
|||
return;
|
||||
print_header(file);
|
||||
fputc('\n', file);
|
||||
fprintf(file, "#Append_block: file_id: %d block_len: %d\n",
|
||||
file_id, block_len);
|
||||
fprintf(file, "#%s: file_id: %d block_len: %d\n",
|
||||
get_type_str(), file_id, block_len);
|
||||
}
|
||||
#endif /* MYSQL_CLIENT */
|
||||
|
||||
|
@ -4036,14 +4084,21 @@ void Append_block_log_event::pack_info(Protocol *protocol)
|
|||
block_len));
|
||||
protocol->store(buf, length, &my_charset_bin);
|
||||
}
|
||||
#endif /* defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) */
|
||||
|
||||
|
||||
/*
|
||||
Append_block_log_event::get_open_mode()
|
||||
*/
|
||||
|
||||
int Append_block_log_event::get_open_mode() const
|
||||
{
|
||||
return O_WRONLY | O_APPEND | O_BINARY;
|
||||
}
|
||||
|
||||
/*
|
||||
Append_block_log_event::exec_event()
|
||||
*/
|
||||
|
||||
#if defined( HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
int Append_block_log_event::exec_event(struct st_relay_log_info* rli)
|
||||
{
|
||||
char proc_info[17+FN_REFLEN+10], *fname= proc_info+17;
|
||||
|
@ -4055,14 +4110,18 @@ int Append_block_log_event::exec_event(struct st_relay_log_info* rli)
|
|||
memcpy(p, ".data", 6);
|
||||
strnmov(proc_info, "Making temp file ", 17); // no end 0
|
||||
thd->proc_info= proc_info;
|
||||
if ((fd = my_open(fname, O_WRONLY|O_APPEND|O_BINARY, MYF(MY_WME))) < 0)
|
||||
if ((fd = my_open(fname, get_open_mode(), MYF(MY_WME))) < 0)
|
||||
{
|
||||
slave_print_error(rli,my_errno, "Error in Append_block event: could not open file '%s'", fname);
|
||||
slave_print_error(rli, my_errno,
|
||||
"Error in %s event: could not open file '%s'",
|
||||
get_type_str(), fname);
|
||||
goto err;
|
||||
}
|
||||
if (my_write(fd, (byte*) block, block_len, MYF(MY_WME+MY_NABP)))
|
||||
{
|
||||
slave_print_error(rli,my_errno, "Error in Append_block event: write to '%s' failed", fname);
|
||||
slave_print_error(rli, my_errno,
|
||||
"Error in %s event: write to '%s' failed",
|
||||
get_type_str(), fname);
|
||||
goto err;
|
||||
}
|
||||
error=0;
|
||||
|
@ -4334,6 +4393,216 @@ err:
|
|||
#endif /* defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT) */
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
Begin_load_query_log_event methods
|
||||
**************************************************************************/
|
||||
|
||||
#ifndef MYSQL_CLIENT
|
||||
Begin_load_query_log_event::
|
||||
Begin_load_query_log_event(THD* thd_arg, const char* db_arg, char* block_arg,
|
||||
uint block_len_arg, bool using_trans)
|
||||
:Append_block_log_event(thd_arg, db_arg, block_arg, block_len_arg,
|
||||
using_trans)
|
||||
{
|
||||
file_id= thd_arg->file_id= mysql_bin_log.next_file_id();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Begin_load_query_log_event::
|
||||
Begin_load_query_log_event(const char* buf, uint len,
|
||||
const Format_description_log_event* desc_event)
|
||||
:Append_block_log_event(buf, len, desc_event)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
#if defined( HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
int Begin_load_query_log_event::get_open_mode() const
|
||||
{
|
||||
return O_CREAT | O_WRONLY | O_BINARY | O_TRUNC;
|
||||
}
|
||||
#endif /* defined( HAVE_REPLICATION) && !defined(MYSQL_CLIENT) */
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
Execute_load_query_log_event methods
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#ifndef MYSQL_CLIENT
|
||||
Execute_load_query_log_event::
|
||||
Execute_load_query_log_event(THD* thd_arg, const char* query_arg,
|
||||
ulong query_length_arg, uint fn_pos_start_arg,
|
||||
uint fn_pos_end_arg,
|
||||
enum_load_dup_handling dup_handling_arg,
|
||||
bool using_trans, bool suppress_use):
|
||||
Query_log_event(thd_arg, query_arg, query_length_arg, using_trans,
|
||||
suppress_use),
|
||||
file_id(thd_arg->file_id), fn_pos_start(fn_pos_start_arg),
|
||||
fn_pos_end(fn_pos_end_arg), dup_handling(dup_handling_arg)
|
||||
{
|
||||
}
|
||||
#endif /* !MYSQL_CLIENT */
|
||||
|
||||
|
||||
Execute_load_query_log_event::
|
||||
Execute_load_query_log_event(const char* buf, uint event_len,
|
||||
const Format_description_log_event* desc_event):
|
||||
Query_log_event(buf, event_len, desc_event, EXECUTE_LOAD_QUERY_EVENT),
|
||||
file_id(0), fn_pos_start(0), fn_pos_end(0)
|
||||
{
|
||||
if (!Query_log_event::is_valid())
|
||||
return;
|
||||
|
||||
buf+= desc_event->common_header_len;
|
||||
|
||||
fn_pos_start= uint4korr(buf + ELQ_FN_POS_START_OFFSET);
|
||||
fn_pos_end= uint4korr(buf + ELQ_FN_POS_END_OFFSET);
|
||||
dup_handling= (enum_load_dup_handling)(*(buf + ELQ_DUP_HANDLING_OFFSET));
|
||||
|
||||
if (fn_pos_start > q_len || fn_pos_end > q_len ||
|
||||
dup_handling > LOAD_DUP_REPLACE)
|
||||
return;
|
||||
|
||||
file_id= uint4korr(buf + ELQ_FILE_ID_OFFSET);
|
||||
}
|
||||
|
||||
|
||||
ulong Execute_load_query_log_event::get_post_header_size_for_derived()
|
||||
{
|
||||
return EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN;
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
Execute_load_query_log_event::write_post_header_for_derived(IO_CACHE* file)
|
||||
{
|
||||
char buf[EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN];
|
||||
int4store(buf, file_id);
|
||||
int4store(buf + 4, fn_pos_start);
|
||||
int4store(buf + 4 + 4, fn_pos_end);
|
||||
*(buf + 4 + 4 + 4)= (char)dup_handling;
|
||||
return my_b_safe_write(file, (byte*) buf, EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN);
|
||||
}
|
||||
|
||||
|
||||
#ifdef MYSQL_CLIENT
|
||||
void Execute_load_query_log_event::print(FILE* file, bool short_form,
|
||||
LAST_EVENT_INFO* last_event_info)
|
||||
{
|
||||
print(file, short_form, last_event_info, 0);
|
||||
}
|
||||
|
||||
|
||||
void Execute_load_query_log_event::print(FILE* file, bool short_form,
|
||||
LAST_EVENT_INFO* last_event_info,
|
||||
const char *local_fname)
|
||||
{
|
||||
print_query_header(file, short_form, last_event_info);
|
||||
|
||||
if (local_fname)
|
||||
{
|
||||
my_fwrite(file, (byte*) query, fn_pos_start, MYF(MY_NABP | MY_WME));
|
||||
fprintf(file, " LOCAL INFILE \'");
|
||||
fprintf(file, local_fname);
|
||||
fprintf(file, "\'");
|
||||
if (dup_handling == LOAD_DUP_REPLACE)
|
||||
fprintf(file, " REPLACE");
|
||||
fprintf(file, " INTO");
|
||||
my_fwrite(file, (byte*) query + fn_pos_end, q_len-fn_pos_end,
|
||||
MYF(MY_NABP | MY_WME));
|
||||
fprintf(file, ";\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
my_fwrite(file, (byte*) query, q_len, MYF(MY_NABP | MY_WME));
|
||||
fprintf(file, ";\n");
|
||||
}
|
||||
|
||||
if (!short_form)
|
||||
fprintf(file, "# file_id: %d \n", file_id);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(HAVE_REPLICATION) && !defined(MYSQL_CLIENT)
|
||||
void Execute_load_query_log_event::pack_info(Protocol *protocol)
|
||||
{
|
||||
char *buf, *pos;
|
||||
if (!(buf= my_malloc(9 + db_len + q_len + 10 + 21, MYF(MY_WME))))
|
||||
return;
|
||||
pos= buf;
|
||||
if (db && db_len)
|
||||
{
|
||||
pos= strmov(buf, "use `");
|
||||
memcpy(pos, db, db_len);
|
||||
pos= strmov(pos+db_len, "`; ");
|
||||
}
|
||||
if (query && q_len)
|
||||
{
|
||||
memcpy(pos, query, q_len);
|
||||
pos+= q_len;
|
||||
}
|
||||
pos= strmov(pos, " ;file_id=");
|
||||
pos= int10_to_str((long) file_id, pos, 10);
|
||||
protocol->store(buf, pos-buf, &my_charset_bin);
|
||||
my_free(buf, MYF(MY_ALLOW_ZERO_PTR));
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
Execute_load_query_log_event::exec_event(struct st_relay_log_info* rli)
|
||||
{
|
||||
char *p;
|
||||
char *buf;
|
||||
char *fname;
|
||||
char *fname_end;
|
||||
int error;
|
||||
|
||||
/* Replace filename and LOCAL keyword in query before executing it */
|
||||
if (!(buf = my_malloc(q_len + 1 - (fn_pos_end - fn_pos_start) +
|
||||
(FN_REFLEN + 10) + 10 + 8 + 5, MYF(MY_WME))))
|
||||
{
|
||||
slave_print_error(rli, my_errno, "Not enough memory");
|
||||
return 1;
|
||||
}
|
||||
|
||||
p= buf;
|
||||
memcpy(p, query, fn_pos_start);
|
||||
p+= fn_pos_start;
|
||||
fname= (p= strmake(p, " INFILE \'", 9));
|
||||
p= slave_load_file_stem(p, file_id, server_id);
|
||||
fname_end= (p= strmake(p, ".data", 5));
|
||||
*(p++)='\'';
|
||||
switch (dup_handling)
|
||||
{
|
||||
case LOAD_DUP_IGNORE:
|
||||
p= strmake(p, " IGNORE", 7);
|
||||
break;
|
||||
case LOAD_DUP_REPLACE:
|
||||
p= strmake(p, " REPLACE", 8);
|
||||
break;
|
||||
default:
|
||||
/* Ordinary load data */
|
||||
break;
|
||||
}
|
||||
p= strmake(p, " INTO", 5);
|
||||
p= strmake(p, query+fn_pos_end, q_len-fn_pos_end);
|
||||
|
||||
error= Query_log_event::exec_event(rli, buf, p-buf);
|
||||
|
||||
/* Forging file name for deletion in same buffer */
|
||||
*fname_end= 0;
|
||||
|
||||
(void) my_delete(fname, MYF(MY_WME));
|
||||
|
||||
my_free(buf, MYF(MY_ALLOW_ZERO_PTR));
|
||||
return error;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
sql_ex_info methods
|
||||
**************************************************************************/
|
||||
|
|
126
sql/log_event.h
126
sql/log_event.h
|
@ -163,10 +163,12 @@ struct sql_ex_info
|
|||
|
||||
See the #defines below for the format specifics.
|
||||
|
||||
The events which really update data are Query_log_event and
|
||||
Load_log_event/Create_file_log_event/Execute_load_log_event (these 3 act
|
||||
together to replicate LOAD DATA INFILE, with the help of
|
||||
Append_block_log_event which prepares temporary files to load into the table).
|
||||
The events which really update data are Query_log_event,
|
||||
Execute_load_query_log_event and old Load_log_event and
|
||||
Execute_load_log_event events (Execute_load_query is used together with
|
||||
Begin_load_query and Append_block events to replicate LOAD DATA INFILE.
|
||||
Create_file/Append_block/Execute_load (which includes Load_log_event)
|
||||
were used to replicate LOAD DATA before the 5.0.3).
|
||||
|
||||
****************************************************************************/
|
||||
|
||||
|
@ -194,6 +196,8 @@ struct sql_ex_info
|
|||
#define EXEC_LOAD_HEADER_LEN 4
|
||||
#define DELETE_FILE_HEADER_LEN 4
|
||||
#define FORMAT_DESCRIPTION_HEADER_LEN (START_V3_HEADER_LEN+1+LOG_EVENT_TYPES)
|
||||
#define EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN (4 + 4 + 4 + 1)
|
||||
#define EXECUTE_LOAD_QUERY_HEADER_LEN (QUERY_HEADER_LEN + EXECUTE_LOAD_QUERY_EXTRA_HEADER_LEN)
|
||||
|
||||
/*
|
||||
Event header offsets;
|
||||
|
@ -284,6 +288,12 @@ struct sql_ex_info
|
|||
/* DF = "Delete File" */
|
||||
#define DF_FILE_ID_OFFSET 0
|
||||
|
||||
/* ELQ = "Execute Load Query" */
|
||||
#define ELQ_FILE_ID_OFFSET QUERY_HEADER_LEN
|
||||
#define ELQ_FN_POS_START_OFFSET ELQ_FILE_ID_OFFSET + 4
|
||||
#define ELQ_FN_POS_END_OFFSET ELQ_FILE_ID_OFFSET + 8
|
||||
#define ELQ_DUP_HANDLING_OFFSET ELQ_FILE_ID_OFFSET + 12
|
||||
|
||||
/* 4 bytes which all binlogs should begin with */
|
||||
#define BINLOG_MAGIC "\xfe\x62\x69\x6e"
|
||||
|
||||
|
@ -387,6 +397,8 @@ enum Log_event_type
|
|||
RAND_EVENT, USER_VAR_EVENT,
|
||||
FORMAT_DESCRIPTION_EVENT,
|
||||
XID_EVENT,
|
||||
BEGIN_LOAD_QUERY_EVENT,
|
||||
EXECUTE_LOAD_QUERY_EVENT,
|
||||
|
||||
/*
|
||||
add new events here - right above this comment!
|
||||
|
@ -711,13 +723,17 @@ public:
|
|||
#ifdef HAVE_REPLICATION
|
||||
void pack_info(Protocol* protocol);
|
||||
int exec_event(struct st_relay_log_info* rli);
|
||||
int exec_event(struct st_relay_log_info* rli, const char *query_arg,
|
||||
uint32 q_len_arg);
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
void print_query_header(FILE* file, bool short_form = 0, LAST_EVENT_INFO* last_event_info= 0);
|
||||
void print(FILE* file, bool short_form = 0, LAST_EVENT_INFO* last_event_info= 0);
|
||||
#endif
|
||||
|
||||
Query_log_event(const char* buf, uint event_len,
|
||||
const Format_description_log_event *description_event);
|
||||
const Format_description_log_event *description_event,
|
||||
Log_event_type event_type);
|
||||
~Query_log_event()
|
||||
{
|
||||
if (data_buf)
|
||||
|
@ -728,6 +744,14 @@ public:
|
|||
Log_event_type get_type_code() { return QUERY_EVENT; }
|
||||
bool write(IO_CACHE* file);
|
||||
bool is_valid() const { return query != 0; }
|
||||
|
||||
/*
|
||||
Returns number of bytes additionaly written to post header by derived
|
||||
events (so far it is only Execute_load_query event).
|
||||
*/
|
||||
virtual ulong get_post_header_size_for_derived() { return 0; }
|
||||
/* Writes derived event-specific part of post header. */
|
||||
virtual bool write_post_header_for_derived(IO_CACHE* file) { return FALSE; }
|
||||
};
|
||||
|
||||
#ifdef HAVE_REPLICATION
|
||||
|
@ -779,6 +803,10 @@ public:
|
|||
****************************************************************************/
|
||||
class Load_log_event: public Log_event
|
||||
{
|
||||
private:
|
||||
uint get_query_buffer_length();
|
||||
void print_query(bool need_db, char *buf, char **end,
|
||||
char **fn_start, char **fn_end);
|
||||
protected:
|
||||
int copy_log_event(const char *buf, ulong event_len,
|
||||
int body_offset, const Format_description_log_event* description_event);
|
||||
|
@ -1312,6 +1340,7 @@ public:
|
|||
#ifdef HAVE_REPLICATION
|
||||
int exec_event(struct st_relay_log_info* rli);
|
||||
void pack_info(Protocol* protocol);
|
||||
virtual int get_open_mode() const;
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
void print(FILE* file, bool short_form = 0, LAST_EVENT_INFO* last_event_info= 0);
|
||||
|
@ -1395,6 +1424,93 @@ public:
|
|||
};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
|
||||
Begin load query Log Event class
|
||||
|
||||
Event for the first block of file to be loaded, its only difference from
|
||||
Append_block event is that this event creates or truncates existing file
|
||||
before writing data.
|
||||
|
||||
****************************************************************************/
|
||||
class Begin_load_query_log_event: public Append_block_log_event
|
||||
{
|
||||
public:
|
||||
#ifndef MYSQL_CLIENT
|
||||
Begin_load_query_log_event(THD* thd_arg, const char *db_arg,
|
||||
char* block_arg, uint block_len_arg,
|
||||
bool using_trans);
|
||||
#ifdef HAVE_REPLICATION
|
||||
Begin_load_query_log_event(THD* thd);
|
||||
int get_open_mode() const;
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#endif
|
||||
Begin_load_query_log_event(const char* buf, uint event_len,
|
||||
const Format_description_log_event* description_event);
|
||||
~Begin_load_query_log_event() {}
|
||||
Log_event_type get_type_code() { return BEGIN_LOAD_QUERY_EVENT; }
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Elements of this enum describe how LOAD DATA handles duplicates.
|
||||
*/
|
||||
enum enum_load_dup_handling { LOAD_DUP_ERROR= 0, LOAD_DUP_IGNORE,
|
||||
LOAD_DUP_REPLACE };
|
||||
|
||||
/****************************************************************************
|
||||
|
||||
Execute load query Log Event class
|
||||
|
||||
Event responsible for LOAD DATA execution, it similar to Query_log_event
|
||||
but before executing the query it substitutes original filename in LOAD DATA
|
||||
query with name of temporary file.
|
||||
|
||||
****************************************************************************/
|
||||
class Execute_load_query_log_event: public Query_log_event
|
||||
{
|
||||
public:
|
||||
uint file_id; // file_id of temporary file
|
||||
uint fn_pos_start; // pointer to the part of the query that should
|
||||
// be substituted
|
||||
uint fn_pos_end; // pointer to the end of this part of query
|
||||
/*
|
||||
We have to store type of duplicate handling explicitly, because
|
||||
for LOAD DATA it also depends on LOCAL option. And this part
|
||||
of query will be rewritten during replication so this information
|
||||
may be lost...
|
||||
*/
|
||||
enum_load_dup_handling dup_handling;
|
||||
|
||||
#ifndef MYSQL_CLIENT
|
||||
Execute_load_query_log_event(THD* thd, const char* query_arg,
|
||||
ulong query_length, uint fn_pos_start_arg,
|
||||
uint fn_pos_end_arg,
|
||||
enum_load_dup_handling dup_handling_arg,
|
||||
bool using_trans, bool suppress_use);
|
||||
#ifdef HAVE_REPLICATION
|
||||
void pack_info(Protocol* protocol);
|
||||
int exec_event(struct st_relay_log_info* rli);
|
||||
#endif /* HAVE_REPLICATION */
|
||||
#else
|
||||
void print(FILE* file, bool short_form = 0,
|
||||
LAST_EVENT_INFO* last_event_info= 0);
|
||||
/* Prints the query as LOAD DATA LOCAL and with rewritten filename */
|
||||
void print(FILE* file, bool short_form, LAST_EVENT_INFO* last_event_info,
|
||||
const char *local_fname);
|
||||
#endif
|
||||
Execute_load_query_log_event(const char* buf, uint event_len,
|
||||
const Format_description_log_event *description_event);
|
||||
~Execute_load_query_log_event() {}
|
||||
|
||||
Log_event_type get_type_code() { return EXECUTE_LOAD_QUERY_EVENT; }
|
||||
bool is_valid() const { return Query_log_event::is_valid() && file_id != 0; }
|
||||
|
||||
ulong get_post_header_size_for_derived();
|
||||
bool write_post_header_for_derived(IO_CACHE* file);
|
||||
};
|
||||
|
||||
|
||||
#ifdef MYSQL_CLIENT
|
||||
class Unknown_log_event: public Log_event
|
||||
{
|
||||
|
|
|
@ -942,8 +942,10 @@ bool eval_const_cond(COND *cond);
|
|||
|
||||
/* sql_load.cc */
|
||||
bool mysql_load(THD *thd, sql_exchange *ex, TABLE_LIST *table_list,
|
||||
List<Item> &fields, enum enum_duplicates handle_duplicates,
|
||||
bool ignore, bool local_file, thr_lock_type lock_type);
|
||||
List<Item> &fields_vars, List<Item> &set_fields,
|
||||
List<Item> &set_values_list,
|
||||
enum enum_duplicates handle_duplicates, bool ignore,
|
||||
bool local_file);
|
||||
int write_record(THD *thd, TABLE *table, COPY_INFO *info);
|
||||
|
||||
/* sql_manager.cc */
|
||||
|
|
|
@ -5330,3 +5330,5 @@ ER_SP_BAD_SQLSTATE 42000
|
|||
eng "Bad SQLSTATE: '%s'"
|
||||
ER_STARTUP
|
||||
eng "%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d %s"
|
||||
ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR
|
||||
eng "Can't load value from file with fixed size rows to variable"
|
||||
|
|
|
@ -810,6 +810,12 @@ typedef struct st_lex
|
|||
*/
|
||||
TABLE_LIST **query_tables_own_last;
|
||||
|
||||
/*
|
||||
Pointers to part of LOAD DATA statement that should be rewritten
|
||||
during replication ("LOCAL 'filename' REPLACE INTO" part).
|
||||
*/
|
||||
uchar *fname_start, *fname_end;
|
||||
|
||||
st_lex() :result(0), sql_command(SQLCOM_END), query_tables_own_last(0)
|
||||
{
|
||||
extern byte *sp_lex_sp_key(const byte *ptr, uint *plen, my_bool first);
|
||||
|
|
272
sql/sql_load.cc
272
sql/sql_load.cc
|
@ -72,18 +72,43 @@ public:
|
|||
};
|
||||
|
||||
static int read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
|
||||
List<Item> &fields, READ_INFO &read_info,
|
||||
List<Item> &fields_vars, List<Item> &set_fields,
|
||||
List<Item> &set_values, READ_INFO &read_info,
|
||||
ulong skip_lines,
|
||||
bool ignore_check_option_errors);
|
||||
static int read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
|
||||
List<Item> &fields, READ_INFO &read_info,
|
||||
List<Item> &fields_vars, List<Item> &set_fields,
|
||||
List<Item> &set_values, READ_INFO &read_info,
|
||||
String &enclosed, ulong skip_lines,
|
||||
bool ignore_check_option_errors);
|
||||
|
||||
|
||||
/*
|
||||
Execute LOAD DATA query
|
||||
|
||||
SYNOPSYS
|
||||
mysql_load()
|
||||
thd - current thread
|
||||
ex - sql_exchange object representing source file and its parsing rules
|
||||
table_list - list of tables to which we are loading data
|
||||
fields_vars - list of fields and variables to which we read
|
||||
data from file
|
||||
set_fields - list of fields mentioned in set clause
|
||||
set_values - expressions to assign to fields in previous list
|
||||
handle_duplicates - indicates whenever we should emit error or
|
||||
replace row if we will meet duplicates.
|
||||
ignore - - indicates whenever we should ignore duplicates
|
||||
read_file_from_client - is this LOAD DATA LOCAL ?
|
||||
|
||||
RETURN VALUES
|
||||
TRUE - error / FALSE - success
|
||||
*/
|
||||
|
||||
bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
||||
List<Item> &fields, enum enum_duplicates handle_duplicates,
|
||||
bool ignore,
|
||||
bool read_file_from_client,thr_lock_type lock_type)
|
||||
List<Item> &fields_vars, List<Item> &set_fields,
|
||||
List<Item> &set_values,
|
||||
enum enum_duplicates handle_duplicates, bool ignore,
|
||||
bool read_file_from_client)
|
||||
{
|
||||
char name[FN_REFLEN];
|
||||
File file;
|
||||
|
@ -117,7 +142,6 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
|||
MYF(0));
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
table_list->lock_type= lock_type;
|
||||
if (open_and_lock_tables(thd, table_list))
|
||||
DBUG_RETURN(TRUE);
|
||||
if (setup_tables(thd, table_list, &unused_conds,
|
||||
|
@ -130,48 +154,80 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
|||
my_error(ER_NON_UPDATABLE_TABLE, MYF(0), table_list->alias, "LOAD");
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
/*
|
||||
Let us emit an error if we are loading data to table which is used
|
||||
in subselect in SET clause like we do it for INSERT.
|
||||
|
||||
The main thing to fix to remove this restriction is to ensure that the
|
||||
table is marked to be 'used for insert' in which case we should never
|
||||
mark this table as as 'const table' (ie, one that has only one row).
|
||||
*/
|
||||
if (unique_table(table_list, table_list->next_global))
|
||||
{
|
||||
my_error(ER_UPDATE_TABLE_USED, MYF(0), table_list->table_name);
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
||||
table= table_list->table;
|
||||
transactional_table= table->file->has_transactions();
|
||||
|
||||
if (!fields.elements)
|
||||
if (!fields_vars.elements)
|
||||
{
|
||||
Field **field;
|
||||
for (field=table->field; *field ; field++)
|
||||
fields.push_back(new Item_field(*field));
|
||||
fields_vars.push_back(new Item_field(*field));
|
||||
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
|
||||
/*
|
||||
Let us also prepare SET clause, altough it is probably empty
|
||||
in this case.
|
||||
*/
|
||||
if (setup_fields(thd, 0, table_list, set_fields, 1, 0, 0) ||
|
||||
setup_fields(thd, 0, table_list, set_values, 1, 0, 0))
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
else
|
||||
{ // Part field list
|
||||
thd->dupp_field=0;
|
||||
/* TODO: use this conds for 'WITH CHECK OPTIONS' */
|
||||
if (setup_fields(thd, 0, table_list, fields, 1, 0, 0))
|
||||
if (setup_fields(thd, 0, table_list, fields_vars, 1, 0, 0) ||
|
||||
setup_fields(thd, 0, table_list, set_fields, 1, 0, 0) ||
|
||||
check_that_all_fields_are_given_values(thd, table))
|
||||
DBUG_RETURN(TRUE);
|
||||
if (thd->dupp_field)
|
||||
{
|
||||
my_error(ER_FIELD_SPECIFIED_TWICE, MYF(0), thd->dupp_field->field_name);
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
if (check_that_all_fields_are_given_values(thd, table))
|
||||
/*
|
||||
Check whenever TIMESTAMP field with auto-set feature specified
|
||||
explicitly.
|
||||
*/
|
||||
if (table->timestamp_field &&
|
||||
table->timestamp_field->query_id == thd->query_id)
|
||||
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
|
||||
/*
|
||||
Fix the expressions in SET clause. This should be done after
|
||||
check_that_all_fields_are_given_values() and setting use_timestamp
|
||||
since it may update query_id for some fields.
|
||||
*/
|
||||
if (setup_fields(thd, 0, table_list, set_values, 1, 0, 0))
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
||||
uint tot_length=0;
|
||||
bool use_blobs=0,use_timestamp=0;
|
||||
List_iterator_fast<Item> it(fields);
|
||||
bool use_blobs= 0, use_vars= 0;
|
||||
List_iterator_fast<Item> it(fields_vars);
|
||||
Item *item;
|
||||
|
||||
Item_field *field;
|
||||
while ((field=(Item_field*) it++))
|
||||
while ((item= it++))
|
||||
{
|
||||
if (field->field->flags & BLOB_FLAG)
|
||||
if (item->type() == Item::FIELD_ITEM)
|
||||
{
|
||||
use_blobs=1;
|
||||
tot_length+=256; // Will be extended if needed
|
||||
Field *field= ((Item_field*)item)->field;
|
||||
if (field->flags & BLOB_FLAG)
|
||||
{
|
||||
use_blobs= 1;
|
||||
tot_length+= 256; // Will be extended if needed
|
||||
}
|
||||
else
|
||||
tot_length+= field->field_length;
|
||||
}
|
||||
else
|
||||
tot_length+=field->field->field_length;
|
||||
if (!field_term->length() && !(field->field->flags & NOT_NULL_FLAG))
|
||||
field->field->set_notnull();
|
||||
if (field->field == table->timestamp_field)
|
||||
use_timestamp=1;
|
||||
use_vars= 1;
|
||||
}
|
||||
if (use_blobs && !ex->line_term->length() && !field_term->length())
|
||||
{
|
||||
|
@ -179,6 +235,11 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
|||
MYF(0));
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
if (use_vars && !field_term->length() && !enclosed->length())
|
||||
{
|
||||
my_error(ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR, MYF(0));
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
||||
/* We can't give an error in the middle when using LOCAL files */
|
||||
if (read_file_from_client && handle_duplicates == DUP_ERROR)
|
||||
|
@ -251,12 +312,6 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
|||
if (mysql_bin_log.is_open())
|
||||
{
|
||||
lf_info.thd = thd;
|
||||
lf_info.ex = ex;
|
||||
lf_info.db = db;
|
||||
lf_info.table_name = table_list->table_name;
|
||||
lf_info.fields = &fields;
|
||||
lf_info.ignore= ignore;
|
||||
lf_info.handle_dup = handle_duplicates;
|
||||
lf_info.wrote_create_file = 0;
|
||||
lf_info.last_pos_in_file = HA_POS_ERROR;
|
||||
lf_info.log_delayed= transactional_table;
|
||||
|
@ -264,8 +319,6 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
|||
}
|
||||
#endif /*!EMBEDDED_LIBRARY*/
|
||||
|
||||
restore_record(table, s->default_values);
|
||||
|
||||
thd->count_cuted_fields= CHECK_FIELD_WARN; /* calc cuted fields */
|
||||
thd->cuted_fields=0L;
|
||||
/* Skip lines if there is a line terminator */
|
||||
|
@ -282,8 +335,6 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
|||
|
||||
if (!(error=test(read_info.error)))
|
||||
{
|
||||
if (use_timestamp)
|
||||
table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET;
|
||||
|
||||
table->next_number_field=table->found_next_number_field;
|
||||
if (ignore ||
|
||||
|
@ -300,12 +351,13 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
|||
MODE_STRICT_ALL_TABLES)));
|
||||
|
||||
if (!field_term->length() && !enclosed->length())
|
||||
error= read_fixed_length(thd, info, table_list, fields,read_info,
|
||||
error= read_fixed_length(thd, info, table_list, fields_vars,
|
||||
set_fields, set_values, read_info,
|
||||
skip_lines, ignore);
|
||||
else
|
||||
error= read_sep_field(thd, info, table_list, fields, read_info,
|
||||
*enclosed, skip_lines,
|
||||
ignore);
|
||||
error= read_sep_field(thd, info, table_list, fields_vars,
|
||||
set_fields, set_values, read_info,
|
||||
*enclosed, skip_lines, ignore);
|
||||
if (table->file->end_bulk_insert())
|
||||
error=1; /* purecov: inspected */
|
||||
ha_enable_transaction(thd, TRUE);
|
||||
|
@ -380,13 +432,19 @@ bool mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
|||
{
|
||||
/*
|
||||
As already explained above, we need to call end_io_cache() or the last
|
||||
block will be logged only after Execute_load_log_event (which is wrong),
|
||||
when read_info is destroyed.
|
||||
block will be logged only after Execute_load_query_log_event (which is
|
||||
wrong), when read_info is destroyed.
|
||||
*/
|
||||
read_info.end_io_cache();
|
||||
if (lf_info.wrote_create_file)
|
||||
{
|
||||
Execute_load_log_event e(thd, db, transactional_table);
|
||||
Execute_load_query_log_event e(thd, thd->query, thd->query_length,
|
||||
(char*)thd->lex->fname_start - (char*)thd->query,
|
||||
(char*)thd->lex->fname_end - (char*)thd->query,
|
||||
(handle_duplicates == DUP_REPLACE) ? LOAD_DUP_REPLACE :
|
||||
(ignore ? LOAD_DUP_IGNORE :
|
||||
LOAD_DUP_ERROR),
|
||||
transactional_table, FALSE);
|
||||
mysql_bin_log.write(&e);
|
||||
}
|
||||
}
|
||||
|
@ -410,10 +468,11 @@ err:
|
|||
|
||||
static int
|
||||
read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
|
||||
List<Item> &fields, READ_INFO &read_info, ulong skip_lines,
|
||||
bool ignore_check_option_errors)
|
||||
List<Item> &fields_vars, List<Item> &set_fields,
|
||||
List<Item> &set_values, READ_INFO &read_info,
|
||||
ulong skip_lines, bool ignore_check_option_errors)
|
||||
{
|
||||
List_iterator_fast<Item> it(fields);
|
||||
List_iterator_fast<Item> it(fields_vars);
|
||||
Item_field *sql_field;
|
||||
TABLE *table= table_list->table;
|
||||
ulonglong id;
|
||||
|
@ -421,11 +480,7 @@ read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
|
|||
DBUG_ENTER("read_fixed_length");
|
||||
|
||||
id= 0;
|
||||
|
||||
/* No fields can be null in this format. mark all fields as not null */
|
||||
while ((sql_field= (Item_field*) it++))
|
||||
sql_field->field->set_notnull();
|
||||
|
||||
|
||||
while (!read_info.read_fixed_length())
|
||||
{
|
||||
if (thd->killed)
|
||||
|
@ -450,16 +505,28 @@ read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
|
|||
read_info.row_end[0]=0;
|
||||
#endif
|
||||
no_trans_update= !table->file->has_transactions();
|
||||
|
||||
restore_record(table, s->default_values);
|
||||
/*
|
||||
There is no variables in fields_vars list in this format so
|
||||
this conversion is safe.
|
||||
*/
|
||||
while ((sql_field= (Item_field*) it++))
|
||||
{
|
||||
Field *field= sql_field->field;
|
||||
/*
|
||||
No fields specified in fields_vars list can be null in this format.
|
||||
Mark field as not null, we should do this for each row because of
|
||||
restore_record...
|
||||
*/
|
||||
field->set_notnull();
|
||||
|
||||
if (pos == read_info.row_end)
|
||||
{
|
||||
thd->cuted_fields++; /* Not enough fields */
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_WARN_TOO_FEW_RECORDS,
|
||||
ER(ER_WARN_TOO_FEW_RECORDS), thd->row_count);
|
||||
field->reset();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -483,6 +550,9 @@ read_fixed_length(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
|
|||
ER(ER_WARN_TOO_MANY_RECORDS), thd->row_count);
|
||||
}
|
||||
|
||||
if (fill_record(thd, set_fields, set_values, ignore_check_option_errors))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
switch (table_list->view_check_option(thd,
|
||||
ignore_check_option_errors)) {
|
||||
case VIEW_CHECK_SKIP:
|
||||
|
@ -527,12 +597,13 @@ continue_loop:;
|
|||
|
||||
static int
|
||||
read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
|
||||
List<Item> &fields, READ_INFO &read_info,
|
||||
List<Item> &fields_vars, List<Item> &set_fields,
|
||||
List<Item> &set_values, READ_INFO &read_info,
|
||||
String &enclosed, ulong skip_lines,
|
||||
bool ignore_check_option_errors)
|
||||
{
|
||||
List_iterator_fast<Item> it(fields);
|
||||
Item_field *sql_field;
|
||||
List_iterator_fast<Item> it(fields_vars);
|
||||
Item *item;
|
||||
TABLE *table= table_list->table;
|
||||
uint enclosed_length;
|
||||
ulonglong id;
|
||||
|
@ -550,60 +621,95 @@ read_sep_field(THD *thd, COPY_INFO &info, TABLE_LIST *table_list,
|
|||
thd->send_kill_message();
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
while ((sql_field=(Item_field*) it++))
|
||||
|
||||
restore_record(table, s->default_values);
|
||||
|
||||
while ((item= it++))
|
||||
{
|
||||
uint length;
|
||||
byte *pos;
|
||||
|
||||
if (read_info.read_field())
|
||||
break;
|
||||
|
||||
/* If this line is to be skipped we don't want to fill field or var */
|
||||
if (skip_lines)
|
||||
continue;
|
||||
|
||||
pos=read_info.row_start;
|
||||
length=(uint) (read_info.row_end-pos);
|
||||
Field *field=sql_field->field;
|
||||
|
||||
if (!read_info.enclosed &&
|
||||
(enclosed_length && length == 4 && !memcmp(pos,"NULL",4)) ||
|
||||
(length == 1 && read_info.found_null))
|
||||
{
|
||||
field->reset();
|
||||
field->set_null();
|
||||
if (!field->maybe_null())
|
||||
{
|
||||
if (field->type() == FIELD_TYPE_TIMESTAMP)
|
||||
((Field_timestamp*) field)->set_time();
|
||||
else if (field != table->next_number_field)
|
||||
field->set_warning((uint) MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_WARN_NULL_TO_NOTNULL, 1);
|
||||
if (item->type() == Item::FIELD_ITEM)
|
||||
{
|
||||
Field *field= ((Item_field *)item)->field;
|
||||
field->reset();
|
||||
field->set_null();
|
||||
if (!field->maybe_null())
|
||||
{
|
||||
if (field->type() == FIELD_TYPE_TIMESTAMP)
|
||||
((Field_timestamp*) field)->set_time();
|
||||
else if (field != table->next_number_field)
|
||||
field->set_warning((uint) MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_WARN_NULL_TO_NOTNULL, 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
((Item_user_var_as_out_param *)item)->set_null_value(
|
||||
read_info.read_charset);
|
||||
continue;
|
||||
}
|
||||
field->set_notnull();
|
||||
read_info.row_end[0]=0; // Safe to change end marker
|
||||
field->store((char*) read_info.row_start,length,read_info.read_charset);
|
||||
|
||||
if (item->type() == Item::FIELD_ITEM)
|
||||
{
|
||||
Field *field= ((Item_field *)item)->field;
|
||||
field->set_notnull();
|
||||
read_info.row_end[0]=0; // Safe to change end marker
|
||||
field->store((char*) pos, length, read_info.read_charset);
|
||||
}
|
||||
else
|
||||
((Item_user_var_as_out_param *)item)->set_value((char*) pos, length,
|
||||
read_info.read_charset);
|
||||
}
|
||||
if (read_info.error)
|
||||
break;
|
||||
if (skip_lines)
|
||||
{
|
||||
if (!--skip_lines)
|
||||
thd->cuted_fields= 0L; // Reset warnings
|
||||
skip_lines--;
|
||||
continue;
|
||||
}
|
||||
if (sql_field)
|
||||
{ // Last record
|
||||
if (sql_field == (Item_field*) fields.head())
|
||||
if (item)
|
||||
{
|
||||
/* Have not read any field, thus input file is simply ended */
|
||||
if (item == fields_vars.head())
|
||||
break;
|
||||
for (; sql_field ; sql_field=(Item_field*) it++)
|
||||
for (; item ; item= it++)
|
||||
{
|
||||
sql_field->field->set_null();
|
||||
sql_field->field->reset();
|
||||
thd->cuted_fields++;
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_WARN_TOO_FEW_RECORDS,
|
||||
ER(ER_WARN_TOO_FEW_RECORDS), thd->row_count);
|
||||
if (item->type() == Item::FIELD_ITEM)
|
||||
{
|
||||
/*
|
||||
QQ: We probably should not throw warning for each field.
|
||||
But how about intention to always have the same number
|
||||
of warnings in THD::cuted_fields (and get rid of cuted_fields
|
||||
in the end ?)
|
||||
*/
|
||||
thd->cuted_fields++;
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_WARN_TOO_FEW_RECORDS,
|
||||
ER(ER_WARN_TOO_FEW_RECORDS), thd->row_count);
|
||||
}
|
||||
else
|
||||
((Item_user_var_as_out_param *)item)->set_null_value(
|
||||
read_info.read_charset);
|
||||
}
|
||||
}
|
||||
|
||||
if (fill_record(thd, set_fields, set_values, ignore_check_option_errors))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
switch (table_list->view_check_option(thd,
|
||||
ignore_check_option_errors)) {
|
||||
case VIEW_CHECK_SKIP:
|
||||
|
|
|
@ -3337,14 +3337,10 @@ unsent_create_error:
|
|||
{
|
||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||
uint privilege= (lex->duplicates == DUP_REPLACE ?
|
||||
INSERT_ACL | DELETE_ACL : INSERT_ACL);
|
||||
INSERT_ACL | DELETE_ACL : INSERT_ACL) |
|
||||
(lex->local_file ? 0 : FILE_ACL);
|
||||
|
||||
if (!lex->local_file)
|
||||
{
|
||||
if (check_access(thd, privilege | FILE_ACL, first_table->db, 0, 0, 0))
|
||||
goto error;
|
||||
}
|
||||
else
|
||||
if (lex->local_file)
|
||||
{
|
||||
if (!(thd->client_capabilities & CLIENT_LOCAL_FILES) ||
|
||||
! opt_local_infile)
|
||||
|
@ -3352,12 +3348,14 @@ unsent_create_error:
|
|||
my_message(ER_NOT_ALLOWED_COMMAND, ER(ER_NOT_ALLOWED_COMMAND), MYF(0));
|
||||
goto error;
|
||||
}
|
||||
if (check_one_table_access(thd, privilege, all_tables))
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (check_one_table_access(thd, privilege, all_tables))
|
||||
goto error;
|
||||
|
||||
res= mysql_load(thd, lex->exchange, first_table, lex->field_list,
|
||||
lex->duplicates, lex->ignore, (bool) lex->local_file,
|
||||
lex->lock_option);
|
||||
lex->update_list, lex->value_list, lex->duplicates,
|
||||
lex->ignore, (bool) lex->local_file);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -1511,17 +1511,16 @@ int log_loaded_block(IO_CACHE* file)
|
|||
lf_info->last_pos_in_file = file->pos_in_file;
|
||||
if (lf_info->wrote_create_file)
|
||||
{
|
||||
Append_block_log_event a(lf_info->thd, lf_info->db, buffer, block_len,
|
||||
lf_info->log_delayed);
|
||||
Append_block_log_event a(lf_info->thd, lf_info->thd->db, buffer,
|
||||
block_len, lf_info->log_delayed);
|
||||
mysql_bin_log.write(&a);
|
||||
}
|
||||
else
|
||||
{
|
||||
Create_file_log_event c(lf_info->thd,lf_info->ex,lf_info->db,
|
||||
lf_info->table_name, *lf_info->fields,
|
||||
lf_info->handle_dup, lf_info->ignore, buffer,
|
||||
block_len, lf_info->log_delayed);
|
||||
mysql_bin_log.write(&c);
|
||||
Begin_load_query_log_event b(lf_info->thd, lf_info->thd->db,
|
||||
buffer, block_len,
|
||||
lf_info->log_delayed);
|
||||
mysql_bin_log.write(&b);
|
||||
lf_info->wrote_create_file = 1;
|
||||
DBUG_SYNC_POINT("debug_lock.created_file_event",10);
|
||||
}
|
||||
|
|
|
@ -63,12 +63,7 @@ typedef struct st_load_file_info
|
|||
{
|
||||
THD* thd;
|
||||
my_off_t last_pos_in_file;
|
||||
sql_exchange* ex;
|
||||
List <Item> *fields;
|
||||
enum enum_duplicates handle_dup;
|
||||
char* db;
|
||||
char* table_name;
|
||||
bool wrote_create_file, log_delayed, ignore;
|
||||
bool wrote_create_file, log_delayed;
|
||||
} LOAD_FILE_INFO;
|
||||
|
||||
int log_loaded_block(IO_CACHE* file);
|
||||
|
|
|
@ -686,7 +686,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
|||
text_string opt_gconcat_separator
|
||||
|
||||
%type <num>
|
||||
type int_type real_type order_dir opt_field_spec lock_option
|
||||
type int_type real_type order_dir lock_option
|
||||
udf_type if_exists opt_local opt_table_options table_options
|
||||
table_option opt_if_not_exists opt_no_write_to_binlog opt_var_type
|
||||
opt_var_ident_type delete_option opt_temporary all_or_any opt_distinct
|
||||
|
@ -714,6 +714,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
|||
signed_literal now_or_signed_literal opt_escape
|
||||
sp_opt_default
|
||||
simple_ident_nospvar simple_ident_q
|
||||
field_or_var
|
||||
|
||||
%type <item_num>
|
||||
NUM_literal
|
||||
|
@ -809,6 +810,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
|||
prepare prepare_src execute deallocate
|
||||
statement sp_suid opt_view_list view_list or_replace algorithm
|
||||
sp_c_chistics sp_a_chistics sp_chistic sp_c_chistic xa
|
||||
load_data opt_field_or_var_spec fields_or_vars opt_load_data_set_spec
|
||||
END_OF_INPUT
|
||||
|
||||
%type <NONE> call sp_proc_stmts sp_proc_stmts1 sp_proc_stmt
|
||||
|
@ -5703,11 +5705,6 @@ insert_field_spec:
|
|||
}
|
||||
ident_eq_list;
|
||||
|
||||
opt_field_spec:
|
||||
/* empty */ { }
|
||||
| '(' fields ')' { }
|
||||
| '(' ')' { };
|
||||
|
||||
fields:
|
||||
fields ',' insert_ident { Lex->field_list.push_back($3); }
|
||||
| insert_ident { Lex->field_list.push_back($1); };
|
||||
|
@ -6409,34 +6406,53 @@ use: USE_SYM ident
|
|||
|
||||
/* import, export of files */
|
||||
|
||||
load: LOAD DATA_SYM load_data_lock opt_local INFILE TEXT_STRING_sys
|
||||
load: LOAD DATA_SYM
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
lex->fname_start= lex->ptr;
|
||||
}
|
||||
load_data
|
||||
{}
|
||||
|
|
||||
LOAD TABLE_SYM table_ident FROM MASTER_SYM
|
||||
{
|
||||
Lex->sql_command = SQLCOM_LOAD_MASTER_TABLE;
|
||||
if (!Select->add_table_to_list(YYTHD, $3, NULL, TL_OPTION_UPDATING))
|
||||
YYABORT;
|
||||
};
|
||||
|
||||
load_data:
|
||||
load_data_lock opt_local INFILE TEXT_STRING_sys
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
lex->sql_command= SQLCOM_LOAD;
|
||||
lex->lock_option= $3;
|
||||
lex->local_file= $4;
|
||||
lex->lock_option= $1;
|
||||
lex->local_file= $2;
|
||||
lex->duplicates= DUP_ERROR;
|
||||
lex->ignore= 0;
|
||||
if (!(lex->exchange= new sql_exchange($6.str,0)))
|
||||
if (!(lex->exchange= new sql_exchange($4.str, 0)))
|
||||
YYABORT;
|
||||
lex->field_list.empty();
|
||||
}
|
||||
opt_duplicate INTO TABLE_SYM table_ident opt_field_term opt_line_term
|
||||
opt_ignore_lines opt_field_spec
|
||||
{
|
||||
if (!Select->add_table_to_list(YYTHD, $11, NULL, TL_OPTION_UPDATING))
|
||||
YYABORT;
|
||||
}
|
||||
|
|
||||
LOAD TABLE_SYM table_ident FROM MASTER_SYM
|
||||
{
|
||||
Lex->sql_command = SQLCOM_LOAD_MASTER_TABLE;
|
||||
if (!Select->add_table_to_list(YYTHD, $3, NULL, TL_OPTION_UPDATING))
|
||||
YYABORT;
|
||||
|
||||
}
|
||||
opt_duplicate INTO
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
lex->fname_end= lex->ptr;
|
||||
}
|
||||
TABLE_SYM table_ident
|
||||
{
|
||||
LEX *lex=Lex;
|
||||
if (!Select->add_table_to_list(YYTHD, $10, NULL, TL_OPTION_UPDATING,
|
||||
lex->lock_option))
|
||||
YYABORT;
|
||||
lex->field_list.empty();
|
||||
lex->update_list.empty();
|
||||
lex->value_list.empty();
|
||||
}
|
||||
opt_field_term opt_line_term opt_ignore_lines opt_field_or_var_spec
|
||||
opt_load_data_set_spec
|
||||
{}
|
||||
|
|
||||
LOAD DATA_SYM FROM MASTER_SYM
|
||||
FROM MASTER_SYM
|
||||
{
|
||||
Lex->sql_command = SQLCOM_LOAD_MASTER_DATA;
|
||||
};
|
||||
|
@ -6516,6 +6532,29 @@ opt_ignore_lines:
|
|||
Lex->exchange->skip_lines= atol($2.str);
|
||||
};
|
||||
|
||||
opt_field_or_var_spec:
|
||||
/* empty */ { }
|
||||
| '(' fields_or_vars ')' { }
|
||||
| '(' ')' { };
|
||||
|
||||
fields_or_vars:
|
||||
fields_or_vars ',' field_or_var
|
||||
{ Lex->field_list.push_back($3); }
|
||||
| field_or_var
|
||||
{ Lex->field_list.push_back($1); }
|
||||
;
|
||||
|
||||
field_or_var:
|
||||
simple_ident_nospvar {$$= $1;}
|
||||
| '@' ident_or_text
|
||||
{ $$= new Item_user_var_as_out_param($2); }
|
||||
;
|
||||
|
||||
opt_load_data_set_spec:
|
||||
/* empty */ { }
|
||||
| SET insert_update_list { };
|
||||
|
||||
|
||||
/* Common definitions */
|
||||
|
||||
text_literal:
|
||||
|
|
Loading…
Reference in a new issue