• unknown's avatar
    WL#874 "Extended LOAD DATA". · 5f75c8f5
    unknown authored
    Now one can use user variables as target for data loaded from file
    (besides table's columns). Also LOAD DATA got new SET-clause in which
    one can specify values for table columns as expressions.
    
    For example the following is possible:
    LOAD DATA INFILE 'words.dat' INTO TABLE t1 (a, @b) SET c = @b + 1;
    
    This patch also implements new way of replicating LOAD DATA.
    Now we do it similarly to other queries.
    We store LOAD DATA query in new Execute_load_query event
    (which is last in the sequence of events representing LOAD DATA).
    When we are executing this event we simply rewrite part of query which
    holds name of file (we use name of temporary file) and then execute it
    as usual query. In the beggining of this sequence we use Begin_load_query
    event which is almost identical to Append_file event
    
    
    client/mysqlbinlog.cc:
      Added support of two new binary log events Begin_load_query_log_event and
      Execute_load_query_log_Event which are used to replicate LOAD DATA INFILE.
    mysql-test/r/ctype_ucs.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results and made it more robust for future similar 
      changes.
    mysql-test/r/insert_select.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results and made it more robust for future similar 
      changes.
    mysql-test/r/loaddata.result:
      Added tests for new LOAD DATA features.
    mysql-test/r/mix_innodb_myisam_binlog.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results (don't dare to get rid from binlog positions
      completely since it seems that this test uses them).
    mysql-test/r/mysqlbinlog.result:
      New approach for binlogging of LOAD DATA statement. Now we store it as
      usual query and rewrite part in which file is specified when needed.
      So now mysqlbinlog output for LOAD DATA much more closer to its initial
      form. Updated test'd results accordingly.
    mysql-test/r/mysqldump.result:
      Made test more robust to other tests failures.
    mysql-test/r/rpl000015.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly.
    mysql-test/r/rpl_change_master.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results.
    mysql-test/r/rpl_charset.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly
    mysql-test/r/rpl_deadlock.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly
    mysql-test/r/rpl_error_ignored_table.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results and made it more robust for future similar 
      changes.
    mysql-test/r/rpl_flush_log_loop.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly.
    mysql-test/r/rpl_flush_tables.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results and made it more robust for future similar 
      changes.
    mysql-test/r/rpl_loaddata.result:
      New way of replicating LOAD DATA. Now we do it similarly to other
      queries. We store LOAD DATA query in new Execute_load_query event
      (which is last in the sequence of events representing LOAD DATA).
      When we are executing this event we simply rewrite part of query which
      holds name of file (we use name of temporary file) and then execute it
      as usual query. In the beggining of this sequence we use Begin_load_query
      event which is almost identical to Append_file event...
      
      Updated test's results wwith new binlog positions.
    mysql-test/r/rpl_loaddata_rule_m.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results and made it more robust for future similar 
      changes.
      Since now LOAD DATA is replicated much in the same way as usual query
      --binlog_do/ignore_db work for it inthe same way as for usual queries.
    mysql-test/r/rpl_loaddata_rule_s.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly.
    mysql-test/r/rpl_loaddatalocal.result:
      Added nice test for case when it is important that LOAD DATA LOCAL
      ignores duplicates.
    mysql-test/r/rpl_log.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly (don't dare to get rid from binlog 
      positions completely since it seems that this test uses them).
    mysql-test/r/rpl_log_pos.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly.
    mysql-test/r/rpl_max_relay_size.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly.
    mysql-test/r/rpl_multi_query.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly.
    mysql-test/r/rpl_relayrotate.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly.
    mysql-test/r/rpl_replicate_do.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly.
    mysql-test/r/rpl_reset_slave.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly.
    mysql-test/r/rpl_rotate_logs.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly.
    mysql-test/r/rpl_server_id1.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly.
    mysql-test/r/rpl_server_id2.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly.
    mysql-test/r/rpl_temporary.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results and made it more robust for future similar 
      changes.
    mysql-test/r/rpl_timezone.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results and made it more robust for future similar 
      changes.
    mysql-test/r/rpl_until.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results accordingly and tweaked test a bit to bring it
      back to good shape.
    mysql-test/r/rpl_user_variables.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results and made it more robust for future similar 
      changes.
    mysql-test/r/user_var.result:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test's results and made it more robust for future similar 
      changes.
    mysql-test/t/ctype_ucs.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly and made it more robust for future similar
      changes.
    mysql-test/t/insert_select.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly and made it more robust for future similar
      changes.
    mysql-test/t/loaddata.test:
      Added test cases for new LOAD DATA functionality.
    mysql-test/t/mix_innodb_myisam_binlog.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly.
    mysql-test/t/mysqlbinlog.test:
      New way of replicating LOAD DATA local. Now we do it similarly to other
      queries. We store LOAD DATA query in new Execute_load_query event
      (which is last in the sequence of events representing LOAD DATA).
      When we are executing this event we simply rewrite part of query which
      holds name of file (we use name of temporary file) and then execute it
      as usual query. In the beggining of this sequence we use Begin_load_query
      event which is almost identical to Append_file event...
      
      Thus we need new binlog positions for LOAD DATA events.
    mysql-test/t/mysqlbinlog2.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly.
    mysql-test/t/mysqldump.test:
      Made test more robust for failures of other tests.
    mysql-test/t/rpl_charset.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly.
    mysql-test/t/rpl_deadlock.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly.
    mysql-test/t/rpl_error_ignored_table.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly and made it more robust for future similar
      changes.
    mysql-test/t/rpl_flush_tables.test:
      Addition of two new types of binary log events shifted binlog positions.
      Made test more robust for future similar changes.
    mysql-test/t/rpl_loaddata.test:
      New way of replicating LOAD DATA. Now we do it similarly to other
      queries. We store LOAD DATA query in new Execute_load_query event
      (which is last in the sequence of events representing LOAD DATA).
      When we are executing this event we simply rewrite part of query which
      holds name of file (we use name of temporary file) and then execute it
      as usual query. In the beggining of this sequence we use Begin_load_query
      event which is almost identical to Append_file event...
      
      Apropritely updated comments in test.
    mysql-test/t/rpl_loaddata_rule_m.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly and made it more robust for future similar 
      changes.
      Since now LOAD DATA is replicated much in the same way as usual query
      --binlog_do/ignore_db work for it inthe same way as for usual queries.
    mysql-test/t/rpl_loaddata_rule_s.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly.
    mysql-test/t/rpl_loaddatalocal.test:
      Added nice test for case when it is important that LOAD DATA LOCAL
      ignores duplicates.
    mysql-test/t/rpl_log.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly (don't dare to get rid from binlog positions
      completely since it seems that this test uses them).
    mysql-test/t/rpl_log_pos.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly.
    mysql-test/t/rpl_multi_query.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly.
    mysql-test/t/rpl_temporary.test:
      Addition of two new types of binary log events shifted binlog positions.
      Made test more robust for future similar changes.
    mysql-test/t/rpl_timezone.test:
      Addition of two new types of binary log events shifted binlog positions.
      Made test more robust for future similar changes.
    mysql-test/t/rpl_until.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly and tweaked it a bit to bring it back to good
      shape.
    mysql-test/t/rpl_user_variables.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly and made it more robust for future similar
      changes.
    mysql-test/t/user_var.test:
      Addition of two new types of binary log events shifted binlog positions.
      Updated test accordingly and made it more robust for future similar
      changes.
    sql/item_func.cc:
      Added Item_user_var_as_out_param class that represents user variable
      which used as out parameter in LOAD DATA.
      
      Moved code from Item_func_set_user_var::update_hash() function to
      separate static function to be able to reuse it in this new class.
    sql/item_func.h:
      Added Item_user_var_as_out_param class that represents user variable
      which used as out parameter in LOAD DATA.
    sql/log_event.cc:
      New way of replicating LOAD DATA. Now we do it similarly to other
      queries. We store LOAD DATA query in new Execute_load_query event
      (which is last in the sequence of events representing LOAD DATA).
      When we are executing this event we simply rewrite part of query which
      holds name of file (we use name of temporary file) and then execute it
      as usual query. In the beggining of this sequence we use Begin_load_query
      event which is almost identical to Append_file event.
    sql/log_event.h:
      New way of replicating LOAD DATA. Now we do it similarly to other
      queries. We store LOAD DATA query in new Execute_load_query event
      (which is last in the sequence of events representing LOAD DATA).
      When we are executing this event we simply rewrite part of query which
      holds name of file (we use name of temporary file) and then execute it
      as usual query. In the beggining of this sequence we use Begin_load_query
      event which is almost identical to Append_file event.
    sql/mysql_priv.h:
      Now mysql_load() has two more arguments. They are needed to pass list of
      columns and corresponding expressions from new LOAD DATA's SET clause.
    sql/share/errmsg.txt:
      Added new error message which is used to forbid loading of data from
      fixed length rows to variables.
    sql/sql_lex.h:
      Added LEX::fname_start/fname_end members. 
      They are pointers to part of LOAD DATA statement which should be
      rewritten during replication (file name + little extra).
    sql/sql_load.cc:
      Added support for extended LOAD DATA. 
      Now one can use user variables as target for data loaded from file 
      (besides table's columns). Also LOAD DATA got new SET-clause in which
      one can specify values for table columns as expressions.
      
      Updated mysql_load()/read_fixed_length()/read_sep_field() to support
      this functionality (now they can read data from file to both columns and
      variables and assign do calculations and assignments specified in SET
      clause).
      
      We also use new approach for LOAD DATA binlogging/replication.
    sql/sql_parse.cc:
      mysql_execute_command():
        Since now we have SET clause in LOAD DATA we should also check
        permissions for tables used in its expressions. Also mysql_load()
        has two more arguments to pass information about this clause.
    sql/sql_repl.cc:
      New way of replicating LOAD DATA. Now we do it similarly to other
      queries. We store LOAD DATA query in new Execute_load_query event
      (which is last in the sequence of events representing LOAD DATA).
      When we are executing this event we simply rewrite part of query which
      holds name of file (we use name of temporary file) and then execute it
      as usual query. In the beggining of this sequence we use Begin_load_query
      event which is almost identical to Append_file event.
    sql/sql_repl.h:
      struct st_load_file_info:
        Removed memebers which are no longer needed for LOAD DATA binnlogging.
    sql/sql_yacc.yy:
      Added support for extended LOAD DATA syntax. Now one can use
      user variables as target for data loaded from file (besides table's 
      columns). Also LOAD DATA got new SET-clause in which one can specify
      values for table columns as expressions.
      
      For example the following is possible:
      LOAD DATA INFILE 'words.dat' INTO TABLE t1 (a, @b) SET c = @b + 1;
      
      Also now we save pointers to the beginning and to the end of part of 
      LOAD DATA statement which should be rewritten during replication.
    5f75c8f5
rpl_error_ignored_table.test 1.63 KB
# Test for 
# Bug #797: If a query is ignored on slave (replicate-ignore-table) the slave
# still checks that it has the same error as on the master.

source include/master-slave.inc;
connection master;
create table t1 (a int primary key);
# generate an error that goes to the binlog
--error 1062;
insert into t1 values (1),(1);
save_master_pos;
connection slave;
# as the t1 table is ignored on the slave, the slave should be able to sync
sync_with_master;
# The port number is different when doing the release build with
# Do-compile, hence we have to replace the port number here accordingly
--replace_result $MASTER_MYPORT MASTER_PORT
--replace_column 1 # 8 # 9 # 23 # 33 #
show slave status;
# check that the table has been ignored, because otherwise the test is nonsense
show tables like 't1';
connection master;
drop table t1;
save_master_pos;
connection slave;
sync_with_master;

# Now test that even critical errors (connection killed)
# are ignored if rules allow it.
# The "kill" idea was copied from rpl000001.test.

connection master1;
select get_lock('crash_lock%20C', 10);

connection master;
create table t2 (a int primary key);
insert into t2 values(1);
create table t3 (id int);
insert into t3 values(connection_id());
send update t2 set a = a + 1 + get_lock('crash_lock%20C', 10);

connection master1;
real_sleep 2;
select (@id := id) - id from t3;
kill @id;
drop table t2,t3;
connection master;
--error 0,1053;
reap;
connection master1;
--replace_column 2 # 5 #
show binlog events from 98;
save_master_pos;
connection slave;
# SQL slave thread should not have stopped (because table of the killed
# query is in the ignore list).
sync_with_master;