List:Internals« Previous MessageNext Message »
From:dlenev Date:March 15 2005 11:26am
Subject:bk commit into 5.0 tree (dlenev:1.1819)
View as plain text  
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)dlenev15 Mar