Below is the list of changes that have just been committed into a local
5.0 repository of dlenev. When dlenev does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.1819 05/03/15 13:26:36 dlenev@stripped +55 -0
WL#874 Extended LOAD DATA
Manual merge with with current tree.
sql/sql_yacc.yy
1.350 05/03/15 13:26:31 dlenev@stripped +1 -1
Manual merge
sql/sql_load.cc
1.75 05/03/15 13:26:31 dlenev@stripped +1 -2
Manual merge
sql/sql_lex.h
1.169 05/03/15 13:26:31 dlenev@stripped +6 -6
Manual merge
sql/share/errmsg.txt
1.15 05/03/15 13:26:31 dlenev@stripped +2 -2
Manual merge
sql/log_event.h
1.105 05/03/15 13:26:31 dlenev@stripped +1 -1
Manual merge
sql/log_event.cc
1.166 05/03/15 13:26:31 dlenev@stripped +6 -7
Manual merge
mysql-test/t/user_var.test
1.23 05/03/15 13:26:31 dlenev@stripped +1 -2
Manual merge
mysql-test/t/rpl_user_variables.test
1.11 05/03/15 13:26:31 dlenev@stripped +1 -2
Manual merge
mysql-test/t/rpl_log_pos.test
1.33 05/03/15 13:26:31 dlenev@stripped +1 -2
Manual merge
mysql-test/t/rpl_log.test
1.25 05/03/15 13:26:31 dlenev@stripped +3 -6
Manual merge
mysql-test/t/rpl_loaddata_rule_s.test
1.6 05/03/15 13:26:31 dlenev@stripped +1 -2
Manual merge
mysql-test/t/rpl_loaddata_rule_m.test
1.8 05/03/15 13:26:31 dlenev@stripped +1 -2
Manual merge
mysql-test/t/rpl_error_ignored_table.test
1.13 05/03/15 13:26:31 dlenev@stripped +1 -2
Manual merge
mysql-test/t/rpl_charset.test
1.15 05/03/15 13:26:31 dlenev@stripped +1 -4
Manual merge
mysql-test/t/mysqlbinlog2.test
1.4 05/03/15 13:26:31 dlenev@stripped +8 -16
Manual merge
mysql-test/t/mysqlbinlog.test
1.15 05/03/15 13:26:31 dlenev@stripped +2 -4
Manual merge
mysql-test/t/mix_innodb_myisam_binlog.test
1.13 05/03/15 13:26:31 dlenev@stripped +12 -24
Manual merge
mysql-test/t/ctype_ucs.test
1.26 05/03/15 13:26:31 dlenev@stripped +1 -2
Manual merge
mysql-test/r/user_var.result
1.28 05/03/15 13:26:31 dlenev@stripped +1 -7
Manual merge
mysql-test/r/rpl_user_variables.result
1.14 05/03/15 13:26:31 dlenev@stripped +1 -29
Manual merge
mysql-test/r/rpl_until.result
1.20 05/03/15 13:26:31 dlenev@stripped +13 -16
Manual merge
mysql-test/r/rpl_timezone.result
1.8 05/03/15 13:26:31 dlenev@stripped +0 -7
Manual merge
mysql-test/r/rpl_temporary.result
1.17 05/03/15 13:26:31 dlenev@stripped +0 -13
Manual merge
mysql-test/r/rpl_server_id2.result
1.8 05/03/15 13:26:31 dlenev@stripped +1 -2
Manual merge
mysql-test/r/rpl_server_id1.result
1.7 05/03/15 13:26:31 dlenev@stripped +1 -2
Manual merge
mysql-test/r/rpl_rotate_logs.result
1.66 05/03/15 13:26:31 dlenev@stripped +0 -4
Manual merge
mysql-test/r/rpl_reset_slave.result
1.13 05/03/15 13:26:31 dlenev@stripped +0 -3
Manual merge
mysql-test/r/rpl_replicate_do.result
1.28 05/03/15 13:26:31 dlenev@stripped +0 -1
Manual merge
mysql-test/r/rpl_relayrotate.result
1.16 05/03/15 13:26:31 dlenev@stripped +0 -1
Manual merge
mysql-test/r/rpl_max_relay_size.result
1.19 05/03/15 13:26:31 dlenev@stripped +0 -6
Manual merge
mysql-test/r/rpl_log_pos.result
1.42 05/03/15 13:26:31 dlenev@stripped +0 -4
Manual merge
mysql-test/r/rpl_log.result
1.56 05/03/15 13:26:31 dlenev@stripped +0 -51
Manual merge
mysql-test/r/rpl_loaddata_rule_s.result
1.7 05/03/15 13:26:31 dlenev@stripped +1 -2
Manual merge
mysql-test/r/rpl_loaddata_rule_m.result
1.13 05/03/15 13:26:31 dlenev@stripped +3 -8
Manual merge
mysql-test/r/rpl_loaddata.result
1.27 05/03/15 13:26:31 dlenev@stripped +0 -4
Manual merge
mysql-test/r/rpl_flush_tables.result
1.11 05/03/15 13:26:31 dlenev@stripped +0 -17
Manual merge
mysql-test/r/rpl_flush_log_loop.result
1.22 05/03/15 13:26:31 dlenev@stripped +1 -2
Manual merge
mysql-test/r/rpl_error_ignored_table.result
1.19 05/03/15 13:26:31 dlenev@stripped +0 -11
Manual merge
mysql-test/r/rpl_charset.result
1.18 05/03/15 13:26:31 dlenev@stripped +1 -6
Manual merge
mysql-test/r/rpl_change_master.result
1.16 05/03/15 13:26:31 dlenev@stripped +2 -4
Manual merge
mysql-test/r/rpl000015.result
1.34 05/03/15 13:26:31 dlenev@stripped +2 -4
Manual merge
mysql-test/r/mysqlbinlog.result
1.16 05/03/15 13:26:31 dlenev@stripped +0 -0
Manual merge
mysql-test/r/mix_innodb_myisam_binlog.result
1.20 05/03/15 13:26:31 dlenev@stripped +62 -121
Manual merge
mysql-test/r/insert_select.result
1.26 05/03/15 13:26:31 dlenev@stripped +3 -6
Manual merge
mysql-test/r/drop_temp_table.result
1.16 05/03/15 13:26:31 dlenev@stripped +0 -5
Manual merge
mysql-test/r/ctype_ucs.result
1.31 05/03/15 13:26:31 dlenev@stripped +3 -6
Manual merge
sql/sql_repl.h
1.37 05/03/15 11:53:53 dlenev@stripped +0 -0
Auto merged
sql/sql_repl.cc
1.133 05/03/15 11:53:53 dlenev@stripped +0 -0
Auto merged
sql/sql_parse.cc
1.419 05/03/15 11:53:52 dlenev@stripped +0 -0
Auto merged
sql/mysql_priv.h
1.276 05/03/15 11:53:52 dlenev@stripped +0 -0
Auto merged
sql/item_func.h
1.101 05/03/15 11:53:52 dlenev@stripped +0 -0
Auto merged
sql/item_func.cc
1.173 05/03/15 11:53:52 dlenev@stripped +0 -0
Auto merged
mysql-test/t/mysqldump.test
1.31 05/03/15 11:53:52 dlenev@stripped +0 -0
Auto merged
mysql-test/r/mysqldump.result
1.36 05/03/15 11:53:51 dlenev@stripped +0 -0
Auto merged
client/mysqlbinlog.cc
1.109 05/03/15 11:53:51 dlenev@stripped +0 -0
Auto merged
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: dlenev
# Host: brandersnatch.localdomain
# Root: /home/dlenev/src/mysql-5.0-874/RESYNC
--- 1.172/sql/item_func.cc Thu Mar 10 00:52:48 2005
+++ 1.173/sql/item_func.cc Tue Mar 15 11:53:52 2005
@@ -3294,12 +3294,28 @@
}
-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 @@
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 @@
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;
}
@@ -3875,6 +3901,71 @@
Item_func_get_user_var *other=(Item_func_get_user_var*) item;
return (name.length == other->name.length &&
!memcmp(name.str, other->name.str, name.length));
+}
+
+
+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)
+{
+ /* QQ: is coercible best derivation here ? */
+ if (::update_hash(entry, true, 0, 0, STRING_RESULT, cs,
+ DERIVATION_COERCIBLE))
+ 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_COERCIBLE))
+ 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;
+}
+
+
+void Item_user_var_as_out_param::print(String *str)
+{
+ str->append('@');
+ str->append(name.str,name.length);
}
--- 1.100/sql/item_func.h Thu Mar 10 00:52:48 2005
+++ 1.101/sql/item_func.h Tue Mar 15 11:53:52 2005
@@ -1131,6 +1131,34 @@
};
+/*
+ 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);
+ /* 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:
--- 1.165/sql/log_event.cc Wed Mar 2 18:39:58 2005
+++ 1.166/sql/log_event.cc Tue Mar 15 13:26:31 2005
@@ -272,6 +272,8 @@
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 @@
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 @@
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 @@
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(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 @@
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 @@
(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_data...)
+ */
+
/* variable-part: the status vars; only in MySQL 5.0 */
start= (char*) (buf+post_header_len);
@@ -1281,8 +1292,8 @@
*/
#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 @@
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 @@
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);
}
@@ -1413,6 +1430,12 @@
#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;
/*
Colleagues: please never free(thd->catalog) in MySQL. This would lead to
@@ -1444,8 +1467,8 @@
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 @@
}
/* 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 @@
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 @@
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 @@
"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;
}
@@ -1866,6 +1889,8 @@
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 +2096,9 @@
*/
#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 +2111,15 @@
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 +2127,10 @@
}
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 +2142,12 @@
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 +2196,18 @@
*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) */
@@ -2594,21 +2640,27 @@
else
{
char llbuff[22];
+ char *end;
enum enum_duplicates handle_dup;
bool ignore= 0;
+
/*
- 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.
+ QQ: Is it good idea to use my_alloca() here ?
*/
- if ((load_data_query= (char *) my_alloca(18 + strlen(fname) + 14 +
- strlen(tables.table_name) + 8)))
+ if (!(load_data_query= (char *)my_alloca(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;
+ /* Also QQ: what is best way to handle error here ? */
+ return 1;
}
+
+ 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 +2706,7 @@
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 +2716,13 @@
*/
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, TL_WRITE))
+ thd->query_error = 1;
if (thd->cuted_fields)
{
/* log_pos is the position of the LOAD event in the master log */
@@ -4016,8 +4073,8 @@
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 +4093,21 @@
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 +4119,18 @@
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;
@@ -4332,6 +4400,214 @@
}
#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, char 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);
+
+ if (fn_pos_start > q_len || fn_pos_end > q_len)
+ return;
+
+ file_id= uint4korr(buf + ELQ_FILE_ID_OFFSET);
+ dup_handling= *(buf + ELQ_DUP_HANDLING_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)= 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 fname for deletion in same buf buffer */
+ *fname_end= 0;
+
+ (void) my_delete(fname, MYF(MY_WME));
+
+ my_free(buf, MYF(MY_ALLOW_ZERO_PTR));
+ return error;
+}
+#endif
/**************************************************************************
--- 1.104/sql/log_event.h Wed Feb 23 20:26:33 2005
+++ 1.105/sql/log_event.h Tue Mar 15 13:26:31 2005
@@ -163,10 +163,12 @@
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 @@
#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 @@
/* 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 @@
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 @@
#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,9 @@
Log_event_type get_type_code() { return QUERY_EVENT; }
bool write(IO_CACHE* file);
bool is_valid() const { return query != 0; }
+
+ virtual ulong get_post_header_size_for_derived() { return 0; }
+ virtual bool write_post_header_for_derived(IO_CACHE* file) { return FALSE; }
};
#ifdef HAVE_REPLICATION
@@ -779,6 +798,10 @@
****************************************************************************/
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 +1335,7 @@
#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);
@@ -1393,6 +1417,84 @@
bool write(IO_CACHE* file);
const char* get_db() { return db; }
};
+
+
+/***************************************************************************
+
+ 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; }
+};
+
+
+#define LOAD_DUP_ERROR 0
+#define LOAD_DUP_IGNORE 1
+#define LOAD_DUP_REPLACE 2
+
+/****************************************************************************
+
+ 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
+ char dup_handling; // Type of duplicate 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, char 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
--- 1.275/sql/mysql_priv.h Mon Mar 14 16:47:37 2005
+++ 1.276/sql/mysql_priv.h Tue Mar 15 11:53:52 2005
@@ -942,8 +942,10 @@
/* 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, thr_lock_type lock_type);
int write_record(THD *thd, TABLE *table, COPY_INFO *info);
/* sql_manager.cc */
--- 1.108/client/mysqlbinlog.cc Wed Feb 23 21:14:25 2005
+++ 1.109/client/mysqlbinlog.cc Tue Mar 15 11:53:51 2005
@@ -101,6 +101,12 @@
class Load_log_processor
{
+ struct File_name_record
+ {
+ char *fname;
+ Create_file_log_event *event;
+ };
+
char target_dir_name[FN_REFLEN];
int target_dir_name_len;
DYNAMIC_ARRAY file_names;
@@ -144,7 +150,7 @@
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 +167,54 @@
}
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(ptr, sizeof(File_name_record));
}
}
}
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;
+ ptr= (File_name_record*)file_names.buffer + file_id;
+ if ((res= ptr->event))
+ bzero(ptr, sizeof(File_name_record));
+ return res;
+ }
+ char *grab_fname(uint file_id)
+ {
+ File_name_record *ptr;
+ char *res= 0;
+
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= (File_name_record*)file_names.buffer + file_id;
+ if (!ptr->event)
+ {
+ res= ptr->fname;
+ bzero(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_block(const char *bname, uint blen, const char *block,
+ uint block_len, uint file_id,
+ Create_file_log_event *ce);
};
@@ -265,22 +292,18 @@
}
-int Load_log_processor::process(Create_file_log_event *ce)
+int Load_log_processor::process_first_block(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_block");
- 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);
@@ -296,9 +319,21 @@
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 +341,35 @@
}
+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_block(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_block("SQL_LOAD", 8, 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) ?
+ ((File_name_record*)file_names.buffer +
+ ae->file_id)->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 +393,14 @@
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 +454,21 @@
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 +524,32 @@
*/
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);
}
--- 1.168/sql/sql_lex.h Thu Mar 10 00:52:43 2005
+++ 1.169/sql/sql_lex.h Tue Mar 15 13:26:31 2005
@@ -810,6 +810,12 @@
*/
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);
--- 1.74/sql/sql_load.cc Fri Feb 25 17:53:16 2005
+++ 1.75/sql/sql_load.cc Tue Mar 15 13:26:31 2005
@@ -72,18 +72,44 @@
};
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 ?
+ lock_type - what type of concurrency do we allow then we are inserting data
+
+ 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, thr_lock_type lock_type)
{
char name[FN_REFLEN];
File file;
@@ -130,48 +156,77 @@
my_error(ER_NON_UPDATABLE_TABLE, MYF(0), table_list->alias, "LOAD");
DBUG_RETURN(TRUE);
}
+ /*
+ Let us emit error if we are loading data to table which is used
+ in subselect in SET clause like we do it for INSERT.
+ (QQ: May be we can remove this restriction ?)
+ */
+ 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))
- DBUG_RETURN(TRUE);
- if (thd->dupp_field)
- {
- my_error(ER_FIELD_SPECIFIED_TWICE, MYF(0), thd->dupp_field->field_name);
+ 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 (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 +234,11 @@
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 +311,6 @@
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 +318,6 @@
}
#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 +334,6 @@
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 +350,13 @@
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 +431,19 @@
{
/*
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 +467,11 @@
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 +479,7 @@
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,9 +504,22 @@
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 */
@@ -483,6 +550,9 @@
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 @@
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,59 +621,91 @@
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)
+ {
+ Field *field= ((Item_field *)item)->field;
+ field->set_null();
+ 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);
+ }
+ 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)) {
--- 1.418/sql/sql_parse.cc Tue Mar 15 02:14:55 2005
+++ 1.419/sql/sql_parse.cc Tue Mar 15 11:53:52 2005
@@ -3341,7 +3341,13 @@
if (!lex->local_file)
{
- if (check_access(thd, privilege | FILE_ACL, first_table->db, 0, 0, 0))
+ /*
+ We should also check access to tables used in subselects.
+ QQ: Can we use check_one_table_access() here too ?
+ */
+ if (check_access(thd, privilege | FILE_ACL, first_table->db, 0, 0, 0) ||
+ first_table->next_global &&
+ check_table_access(thd, SELECT_ACL, first_table->next_global, 0))
goto error;
}
else
@@ -3356,8 +3362,8 @@
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, lex->lock_option);
break;
}
--- 1.349/sql/sql_yacc.yy Sun Mar 13 23:50:37 2005
+++ 1.350/sql/sql_yacc.yy Tue Mar 15 13:26:31 2005
@@ -686,7 +686,7 @@
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 @@
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 @@
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 @@
}
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,49 @@
/* 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;
+ }
+ opt_duplicate INTO
+ {
+ LEX *lex=Lex;
+ lex->fname_end= lex->ptr;
lex->field_list.empty();
+ lex->update_list.empty();
+ lex->value_list.empty();
}
- opt_duplicate INTO TABLE_SYM table_ident opt_field_term opt_line_term
- opt_ignore_lines opt_field_spec
+ TABLE_SYM table_ident opt_field_term opt_line_term
+ opt_ignore_lines opt_field_or_var_spec opt_load_data_set_spec
{
- if (!Select->add_table_to_list(YYTHD, $11, NULL, TL_OPTION_UPDATING))
+ if (!Select->add_table_to_list(YYTHD, $10, 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;
-
- }
- |
- LOAD DATA_SYM FROM MASTER_SYM
+ FROM MASTER_SYM
{
Lex->sql_command = SQLCOM_LOAD_MASTER_DATA;
};
@@ -6515,6 +6527,29 @@
DBUG_ASSERT(Lex->exchange != 0);
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 */
--- 1.14/sql/share/errmsg.txt Wed Mar 9 19:55:37 2005
+++ 1.15/sql/share/errmsg.txt Tue Mar 15 13:26:31 2005
@@ -5330,3 +5330,5 @@
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"
--- 1.30/mysql-test/r/ctype_ucs.result Wed Feb 23 21:29:44 2005
+++ 1.31/mysql-test/r/ctype_ucs.result Tue Mar 15 13:26:31 2005
@@ -523,10 +523,10 @@
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 98 User var 1 138 @`v`=_ucs2 0x006100620063 COLLATE ucs2_general_ci
+master-bin.000001 138 Query 1 228 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;
--- 1.25/mysql-test/t/ctype_ucs.test Thu Feb 17 16:00:29 2005
+++ 1.26/mysql-test/t/ctype_ucs.test Tue Mar 15 13:26:31 2005
@@ -338,7 +338,7 @@
set @v=convert('abc' using ucs2);
reset master;
insert into t2 values (@v);
-show binlog events from 96;
+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).
--- 1.15/mysql-test/r/mysqlbinlog.result Wed Feb 23 21:44:19 2005
+++ 1.16/mysql-test/r/mysqlbinlog.result Tue Mar 15 13:26:31 2005
@@ -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;
insert into t1 values ("Alas");
flush logs;
@@ -32,11 +31,14 @@
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-1-0' INTO table t1;
+SET TIMESTAMP=1000000000;
+load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD-2-0' INTO table t1;
+SET TIMESTAMP=1000000000;
+load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD-3-0' INTO table t1;
+SET TIMESTAMP=1000000000;
+load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD-4-0' INTO table t1;
ROLLBACK;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
@@ -91,11 +93,14 @@
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-1-2' INTO table t1;
+SET TIMESTAMP=1000000000;
+load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD-2-2' INTO table t1;
+SET TIMESTAMP=1000000000;
+load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD-3-2' INTO table t1;
+SET TIMESTAMP=1000000000;
+load data LOCAL INFILE 'MYSQL_TEST_DIR/var/tmp/SQL_LOAD-4-2' INTO table t1;
ROLLBACK;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
--- 1.14/mysql-test/t/mysqlbinlog.test Mon Feb 14 23:49:58 2005
+++ 1.15/mysql-test/t/mysqlbinlog.test Tue Mar 15 13:26:31 2005
@@ -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;
# simple query to show more in second binlog
insert into t1 values ("Alas");
flush logs;
@@ -61,7 +60,7 @@
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=225
$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 "--- --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=225 --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
--- 1.13/mysql-test/r/rpl_user_variables.result Wed Feb 16 19:33:52 2005
+++ 1.14/mysql-test/r/rpl_user_variables.result Tue Mar 15 13:26:31 2005
@@ -76,7 +76,7 @@
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
--- 1.10/mysql-test/t/rpl_user_variables.test Mon Feb 14 23:49:58 2005
+++ 1.11/mysql-test/t/rpl_user_variables.test Tue Mar 15 13:26:31 2005
@@ -46,7 +46,7 @@
connection slave;
sync_with_master;
select * from t1;
-show binlog events from 96;
+show binlog events from 98;
connection master;
drop table t1;
save_master_pos;
--- 1.19/mysql-test/r/mix_innodb_myisam_binlog.result Wed Mar 2 19:52:26 2005
+++ 1.20/mysql-test/r/mix_innodb_myisam_binlog.result Tue Mar 15 13:26:31 2005
@@ -6,12 +6,12 @@
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 @@
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 @@
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 @@
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 @@
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 351 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 @@
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 @@
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 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 @@
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;
--- 1.15/mysql-test/r/rpl_change_master.result Wed Mar 2 19:52:26 2005
+++ 1.16/mysql-test/r/rpl_change_master.result Tue Mar 15 13:26:31 2005
@@ -13,11 +13,11 @@
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
--- 1.17/mysql-test/r/rpl_charset.result Wed Feb 23 21:47:51 2005
+++ 1.18/mysql-test/r/rpl_charset.result Tue Mar 15 13:26:31 2005
@@ -103,7 +103,7 @@
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
--- 1.12/mysql-test/r/rpl_loaddata_rule_m.result Wed Feb 16 19:33:52 2005
+++ 1.13/mysql-test/r/rpl_loaddata_rule_m.result Tue Mar 15 13:26:31 2005
@@ -10,8 +10,8 @@
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 98 Query 1 200 drop database if exists mysqltest
+master-bin.000001 200 Query 1 294 create database mysqltest
drop database mysqltest;
--- 1.6/mysql-test/r/rpl_loaddata_rule_s.result Sun Jan 16 15:16:10 2005
+++ 1.7/mysql-test/r/rpl_loaddata_rule_s.result Tue Mar 15 13:26:31 2005
@@ -10,5 +10,5 @@
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
--- 1.6/mysql-test/r/rpl_server_id1.result Sun Jan 16 15:16:10 2005
+++ 1.7/mysql-test/r/rpl_server_id1.result Tue Mar 15 13:26:31 2005
@@ -10,7 +10,7 @@
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";
--- 1.7/mysql-test/r/rpl_server_id2.result Sun Jan 16 15:16:10 2005
+++ 1.8/mysql-test/r/rpl_server_id2.result Tue Mar 15 13:26:31 2005
@@ -10,7 +10,7 @@
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;
--- 1.12/mysql-test/t/mix_innodb_myisam_binlog.test Thu Feb 17 15:52:07 2005
+++ 1.13/mysql-test/t/mix_innodb_myisam_binlog.test Tue Mar 15 13:26:31 2005
@@ -27,7 +27,7 @@
--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 @@
rollback;
--replace_column 5 #
-show binlog events from 96;
+show binlog events from 98;
delete from t1;
delete from t2;
@@ -56,7 +56,7 @@
--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 @@
--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 @@
# 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 @@
--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 @@
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 @@
--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 @@
rollback;
--replace_column 5 #
-show binlog events from 96;
+show binlog events from 98;
delete from t1;
delete from t2;
@@ -173,7 +173,7 @@
--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 @@
--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
--- 1.3/mysql-test/t/mysqlbinlog2.test Sun Jan 16 15:16:10 2005
+++ 1.4/mysql-test/t/mysqlbinlog2.test Tue Mar 15 13:26:31 2005
@@ -46,11 +46,11 @@
--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 @@
--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 @@
--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 @@
--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.14/mysql-test/t/rpl_charset.test Wed Feb 23 02:48:31 2005
+++ 1.15/mysql-test/t/rpl_charset.test Tue Mar 15 13:26:31 2005
@@ -107,7 +107,7 @@
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)
--- 1.12/mysql-test/t/rpl_error_ignored_table.test Sun Jan 16 15:16:10 2005
+++ 1.13/mysql-test/t/rpl_error_ignored_table.test Tue Mar 15 13:26:31 2005
@@ -48,7 +48,7 @@
--error 0,1053;
reap;
connection master1;
-show binlog events from 96;
+show binlog events from 98;
save_master_pos;
connection slave;
# SQL slave thread should not have stopped (because table of the killed
--- 1.7/mysql-test/t/rpl_loaddata_rule_m.test Sun Jan 16 15:16:10 2005
+++ 1.8/mysql-test/t/rpl_loaddata_rule_m.test Tue Mar 15 13:26:31 2005
@@ -19,5 +19,8 @@
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).
+show binlog events from 98;
drop database mysqltest;
--- 1.5/mysql-test/t/rpl_loaddata_rule_s.test Sun Jan 16 15:16:10 2005
+++ 1.6/mysql-test/t/rpl_loaddata_rule_s.test Tue Mar 15 13:26:31 2005
@@ -17,4 +17,4 @@
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
--- 1.25/mysql-test/r/insert_select.result Wed Feb 16 19:33:51 2005
+++ 1.26/mysql-test/r/insert_select.result Tue Mar 15 13:26:31 2005
@@ -74,8 +74,8 @@
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 4 Format_desc 1 98 Server ver: VERSION, Binlog ver: 4
+master-bin.000001 98 Query 1 193 use `test`; insert into t1 select * from t2
select * from t1;
a
1
@@ -88,7 +88,7 @@
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 4 Format_desc 1 98 Server ver: VERSION, Binlog ver: 4
drop table t1;
create table t1 (a int not null);
create table t2 (a int not null);
--- 1.21/mysql-test/r/rpl_flush_log_loop.result Wed Feb 16 19:33:52 2005
+++ 1.22/mysql-test/r/rpl_flush_log_loop.result Tue Mar 15 13:26:31 2005
@@ -14,4 +14,4 @@
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 208 # # slave-bin.000001 Yes Yes 0 0 208 # None 0 No #
--- 1.35/mysql-test/r/mysqldump.result Wed Mar 9 15:37:15 2005
+++ 1.36/mysql-test/r/mysqldump.result Tue Mar 15 11:53:51 2005
@@ -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);
--- 1.30/mysql-test/t/mysqldump.test Wed Mar 9 15:37:15 2005
+++ 1.31/mysql-test/t/mysqldump.test Tue Mar 15 11:53:52 2005
@@ -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
--- 1.33/mysql-test/r/rpl000015.result Sun Jan 16 15:16:09 2005
+++ 1.34/mysql-test/r/rpl000015.result Tue Mar 15 13:26:31 2005
@@ -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 @@
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);
--- 1.27/mysql-test/r/user_var.result Wed Feb 23 21:57:49 2005
+++ 1.28/mysql-test/r/user_var.result Tue Mar 15 13:26:31 2005
@@ -176,7 +176,7 @@
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`)
--- 1.32/mysql-test/t/rpl_log_pos.test Sun Jan 16 15:16:10 2005
+++ 1.33/mysql-test/t/rpl_log_pos.test Tue Mar 15 13:26:31 2005
@@ -38,7 +38,7 @@
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;
--- 1.24/mysql-test/t/rpl_log.test Sun Jan 16 15:16:10 2005
+++ 1.25/mysql-test/t/rpl_log.test Tue Mar 15 13:26:31 2005
@@ -38,9 +38,9 @@
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.
--- 1.22/mysql-test/t/user_var.test Tue Feb 22 16:14:13 2005
+++ 1.23/mysql-test/t/user_var.test Tue Mar 15 13:26:31 2005
@@ -108,7 +108,7 @@
set @var1= "';aaa";
SET @var2=char(ascii('a'));
insert into t1 values (@var1),(@var2);
-show binlog events from 96;
+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).
--- 1.132/sql/sql_repl.cc Mon Mar 14 19:53:15 2005
+++ 1.133/sql/sql_repl.cc Tue Mar 15 11:53:53 2005
@@ -1511,17 +1511,16 @@
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);
}
--- 1.36/sql/sql_repl.h Mon Feb 14 20:45:30 2005
+++ 1.37/sql/sql_repl.h Tue Mar 15 11:53:53 2005
@@ -63,12 +63,7 @@
{
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);
| Thread |
|---|
| • bk commit into 5.0 tree (dlenev:1.1819) | dlenev | 15 Mar |