mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
5f75c8f5b4
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.
134 lines
4.2 KiB
Text
134 lines
4.2 KiB
Text
# See if replication of a "LOAD DATA in an autoincrement column"
|
|
# Honours autoincrement values
|
|
# i.e. if the master and slave have the same sequence
|
|
#
|
|
# check replication of load data for temporary tables with additional
|
|
# parameters
|
|
#
|
|
# check if duplicate entries trigger an error (they should unless IGNORE or
|
|
# REPLACE was used on the master) (bug 571).
|
|
#
|
|
# check if START SLAVE, RESET SLAVE, CHANGE MASTER reset Last_slave_error and
|
|
# Last_slave_errno in SHOW SLAVE STATUS (1st and 3rd commands did not: bug 986)
|
|
|
|
source include/master-slave.inc;
|
|
|
|
connection slave;
|
|
reset master;
|
|
connection master;
|
|
|
|
create table t1(a int not null auto_increment, b int, primary key(a) );
|
|
load data infile '../../std_data/rpl_loaddata.dat' into table t1;
|
|
|
|
create temporary table t2 (day date,id int(9),category enum('a','b','c'),name varchar(60));
|
|
load data infile '../../std_data/rpl_loaddata2.dat' into table t2 fields terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by '\n##\n' starting by '>' ignore 1 lines;
|
|
|
|
create table t3 (day date,id int(9),category enum('a','b','c'),name varchar(60));
|
|
insert into t3 select * from t2;
|
|
|
|
save_master_pos;
|
|
connection slave;
|
|
sync_with_master;
|
|
|
|
select * from t1;
|
|
select * from t3;
|
|
# We want to be sure that LOAD DATA is in the slave's binlog.
|
|
# But we can't simply read this binlog, because as the slave has not been
|
|
# restarted for this test, the file_id is uncertain (would cause test
|
|
# failures). So instead, we test if the binlog looks long enough to
|
|
# contain LOAD DATA. Since 5.0.3 we assume that binlog of 1292 is ok.
|
|
# If LOAD DATA was not logged, the binlog would be shorter.
|
|
show master status;
|
|
|
|
connection master;
|
|
|
|
drop table t1;
|
|
drop table t2;
|
|
drop table t3;
|
|
create table t1(a int, b int, unique(b));
|
|
|
|
save_master_pos;
|
|
connection slave;
|
|
sync_with_master;
|
|
|
|
# See if slave stops when there's a duplicate entry for key error in LOAD DATA
|
|
|
|
insert into t1 values(1,10);
|
|
|
|
connection master;
|
|
load data infile '../../std_data/rpl_loaddata.dat' into table t1;
|
|
|
|
save_master_pos;
|
|
connection slave;
|
|
# The SQL slave thread should be stopped now.
|
|
wait_for_slave_to_stop;
|
|
|
|
# Skip the bad event and see if error is cleared in SHOW SLAVE STATUS by START
|
|
# SLAVE, even though we are not executing any event (as sql_slave_skip_counter
|
|
# takes us directly to the end of the relay log).
|
|
|
|
set global sql_slave_skip_counter=1;
|
|
start slave;
|
|
sync_with_master;
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
--replace_column 1 # 8 # 9 # 23 # 33 #
|
|
show slave status;
|
|
|
|
# Trigger error again to test CHANGE MASTER
|
|
|
|
connection master;
|
|
set sql_log_bin=0;
|
|
delete from t1;
|
|
set sql_log_bin=1;
|
|
load data infile '../../std_data/rpl_loaddata.dat' into table t1;
|
|
save_master_pos;
|
|
connection slave;
|
|
# The SQL slave thread should be stopped now.
|
|
# Exec_Master_Log_Pos should point to the start of Execute event
|
|
# for last load data.
|
|
wait_for_slave_to_stop;
|
|
|
|
# CHANGE MASTER and see if error is cleared in SHOW SLAVE STATUS.
|
|
stop slave;
|
|
change master to master_user='test';
|
|
change master to master_user='root';
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
--replace_column 1 # 8 # 9 # 23 # 33 #
|
|
show slave status;
|
|
|
|
# Trigger error again to test RESET SLAVE
|
|
|
|
set global sql_slave_skip_counter=1;
|
|
start slave;
|
|
sync_with_master;
|
|
connection master;
|
|
set sql_log_bin=0;
|
|
delete from t1;
|
|
set sql_log_bin=1;
|
|
load data infile '../../std_data/rpl_loaddata.dat' into table t1;
|
|
save_master_pos;
|
|
connection slave;
|
|
# The SQL slave thread should be stopped now.
|
|
wait_for_slave_to_stop;
|
|
|
|
# RESET SLAVE and see if error is cleared in SHOW SLAVE STATUS.
|
|
stop slave;
|
|
reset slave;
|
|
--replace_result $MASTER_MYPORT MASTER_PORT
|
|
--replace_column 1 # 8 # 9 # 23 # 33 #
|
|
show slave status;
|
|
|
|
# Finally, see if logging is done ok on master for a failing LOAD DATA INFILE
|
|
|
|
connection master;
|
|
reset master;
|
|
create table t2 (day date,id int(9),category enum('a','b','c'),name varchar(60),
|
|
unique(day));
|
|
--error 1062;
|
|
load data infile '../../std_data/rpl_loaddata2.dat' into table t2 fields
|
|
terminated by ',' optionally enclosed by '%' escaped by '@' lines terminated by
|
|
'\n##\n' starting by '>' ignore 1 lines;
|
|
# To test that there is Create_file & Delete_file, we test if the binlog is as
|
|
# long as expected (can't do SHOW BINLOG EVENTS because of varying file_id).
|
|
show master status;
|
|
drop table t2;
|