mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Merge mysql.com:/home/my/mysql-5.1
into mysql.com:/home/my/mysql-new BitKeeper/etc/ignore: auto-union BUILD/SETUP.sh: Auto merged CMakeLists.txt: Auto merged client/get_password.c: Auto merged client/mysqldump.c: Auto merged client/mysqltest.c: Auto merged cmd-line-utils/readline/bind.c: Auto merged cmd-line-utils/readline/display.c: Auto merged cmd-line-utils/readline/histexpand.c: Auto merged cmd-line-utils/readline/history.c: Auto merged cmd-line-utils/readline/readline.c: Auto merged cmd-line-utils/readline/text.c: Auto merged dbug/user.r: Auto merged extra/yassl/src/handshake.cpp: Auto merged include/config-win.h: Auto merged include/m_string.h: Auto merged include/my_global.h: Auto merged include/my_pthread.h: Auto merged include/mysql/plugin.h: Auto merged include/mysql_com.h: Auto merged include/thr_alarm.h: Auto merged libmysql/CMakeLists.txt: Auto merged libmysql/Makefile.shared: Auto merged libmysql/dll.c: Auto merged libmysql/get_password.c: Auto merged libmysql/libmysql.c: Auto merged libmysqld/Makefile.am: Auto merged mysql-test/lib/mtr_cases.pl: Auto merged mysql-test/mysql-test-run.pl: Auto merged mysql-test/r/alter_table.result: Auto merged mysql-test/r/change_user.result: Auto merged mysql-test/r/create.result: Auto merged mysql-test/r/innodb.result: Auto merged mysql-test/r/merge.result: Auto merged mysql-test/r/mix2_myisam.result: Auto merged mysql-test/r/mysqldump.result: Auto merged mysql-test/r/query_cache.result: Auto merged mysql-test/r/subselect.result: Auto merged mysql-test/valgrind.supp: Auto merged mysql-test/r/view.result: Auto merged mysql-test/suite/rpl/r/rpl_events.result: Auto merged mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test: Auto merged mysql-test/t/create.test: Auto merged mysql-test/t/mysqldump.test: Auto merged mysql-test/t/query_cache.test: Auto merged mysql-test/t/subselect.test: Auto merged mysql-test/t/variables.test: Auto merged mysql-test/t/view.test: Auto merged mysys/mf_iocache.c: Auto merged mysys/mf_tempfile.c: Auto merged mysys/my_atomic.c: Auto merged mysys/my_bit.c: Auto merged mysys/my_bitmap.c: Auto merged mysys/my_compress.c: Auto merged mysys/my_create.c: Auto merged mysys/my_delete.c: Auto merged mysys/my_error.c: Auto merged mysys/my_init.c: Auto merged mysys/my_open.c: Auto merged mysys/my_realloc.c: Auto merged mysys/my_rename.c: Auto merged mysys/my_symlink.c: Auto merged mysys/my_sync.c: Auto merged mysys/my_thr_init.c: Auto merged mysys/thr_alarm.c: Auto merged mysys/thr_lock.c: Auto merged scripts/make_binary_distribution.sh: Auto merged server-tools/instance-manager/mysql_connection.cc: Auto merged sql/CMakeLists.txt: Auto merged sql/Makefile.am: Auto merged sql/events.cc: Auto merged sql/field.cc: Auto merged sql/field.h: Auto merged sql/filesort.cc: Auto merged sql/gen_lex_hash.cc: Auto merged sql/ha_ndbcluster.cc: Auto merged sql/ha_partition.h: Auto merged sql/handler.h: Auto merged sql/item.cc: Auto merged sql/item.h: Auto merged sql/item_cmpfunc.cc: Auto merged sql/item_func.cc: Auto merged sql/item_func.h: Auto merged sql/item_strfunc.cc: Auto merged sql/item_strfunc.h: Auto merged sql/item_subselect.cc: Auto merged sql/lock.cc: Auto merged sql/log.cc: Auto merged sql/log_event.cc: Auto merged sql/net_serv.cc: Auto merged sql/opt_range.cc: Auto merged sql/partition_info.cc: Auto merged sql/rpl_injector.cc: Auto merged sql/set_var.cc: Auto merged sql/slave.cc: Auto merged sql/slave.h: Auto merged sql/sp_head.cc: Auto merged sql/sql_acl.cc: Auto merged sql/sql_base.cc: Auto merged sql/sql_cache.cc: Auto merged sql/sql_class.h: Auto merged sql/sql_delete.cc: Auto merged sql/sql_load.cc: Auto merged sql/sql_plugin.cc: Auto merged sql/sql_prepare.cc: Auto merged sql/sql_repl.cc: Auto merged sql/sql_test.cc: Auto merged sql/sql_union.cc: Auto merged sql/sql_update.cc: Auto merged sql/sql_yacc.yy: Auto merged sql/table.cc: Auto merged sql/table.h: Auto merged sql/unireg.cc: Auto merged sql/share/errmsg.txt: Auto merged storage/csv/ha_tina.cc: Auto merged storage/csv/ha_tina.h: Auto merged storage/myisam/CMakeLists.txt: Auto merged storage/myisam/ft_boolean_search.c: Auto merged storage/myisam/ft_eval.c: Auto merged storage/myisam/ft_nlq_search.c: Auto merged storage/myisam/ft_parser.c: Auto merged storage/myisam/ft_static.c: Auto merged storage/myisam/ft_stopwords.c: Auto merged storage/myisam/ft_test1.c: Auto merged storage/myisam/ft_update.c: Auto merged storage/myisam/ha_myisam.cc: Auto merged storage/myisam/mi_check.c: Auto merged storage/myisam/mi_create.c: Auto merged storage/myisam/mi_delete.c: Auto merged storage/myisam/mi_delete_all.c: Auto merged storage/myisam/mi_dynrec.c: Auto merged storage/myisam/mi_key.c: Auto merged storage/myisam/mi_packrec.c: Auto merged storage/myisam/mi_range.c: Auto merged storage/myisam/mi_search.c: Auto merged storage/myisam/mi_test1.c: Auto merged storage/myisam/mi_test2.c: Auto merged storage/myisam/mi_test3.c: Auto merged storage/myisam/mi_unique.c: Auto merged storage/myisam/mi_write.c: Auto merged storage/myisam/myisamchk.c: Auto merged storage/myisam/myisamdef.h: Auto merged storage/myisam/myisampack.c: Auto merged storage/myisam/sort.c: Auto merged storage/myisam/sp_test.c: Auto merged support-files/mysql.spec.sh: Auto merged tests/mysql_client_test.c: Auto merged configure.in: Manual merge dbug/dbug.c: Restore to original state in Maria tree The big diff comes from a wrong pull from 5.0 -> 5.1 after backporting dbug to 5.0 from 5.1 include/Makefile.am: Manual merge include/my_atomic.h: Ignore changes include/my_base.h: Manual merge include/my_dbug.h: Use orginal my_dbug.h from maria tree include/my_handler.h: Manual merge include/my_sys.h: Manual merge include/myisam.h: Manual merge mysql-test/lib/mtr_report.pl: Manual merge mysql-test/r/myisam.result: Manual merge mysql-test/suite/binlog/r/binlog_unsafe.result: Manual merge mysql-test/suite/binlog/t/binlog_unsafe.test: Manual merge mysql-test/suite/rpl/r/rpl_row_flsh_tbls.result: Manual merge mysql-test/suite/rpl/r/rpl_switch_stm_row_mixed.result: No changes mysql-test/suite/rpl/t/rpl_row_flsh_tbls.test: Manual merge mysql-test/t/change_user.test: Manual merge mysql-test/t/disabled.def: Manual merge mysql-test/t/merge.test: No changes mysql-test/t/myisam.test: Manual merge mysys/Makefile.am: Manual merge mysys/array.c: Manual merge mysys/mf_keycache.c: Manual merge mysys/my_getsystime.c: Manual merge mysys/my_handler.c: Manual merge mysys/my_pread.c: Manual merge mysys/safemalloc.c: Manual merge sql/ha_partition.cc: Manual merge sql/handler.cc: Manual merge sql/lex.h: Manual merge sql/mysql_priv.h: Manual merge sql/mysqld.cc: Manual merge sql/set_var.h: Manual merge sql/sql_class.cc: Manual merge sql/sql_insert.cc: Manual merge sql/sql_parse.cc: Manual merge sql/sql_select.cc: Manual merge sql/sql_show.cc: Manual merge sql/sql_table.cc: Manual merge storage/myisam/mi_checksum.c: No changes storage/myisam/mi_extra.c: Manual merge storage/myisam/mi_open.c: Manual merge storage/myisammrg/ha_myisammrg.cc: Manual merge strings/strmake.c: No changes
This commit is contained in:
753
mysql-test/include/commit.inc
Normal file
753
mysql-test/include/commit.inc
Normal file
@ -0,0 +1,753 @@
|
||||
## Bug#12713 (Error in a stored function called from a SELECT doesn't cause
|
||||
## ROLLBACK of statem)
|
||||
|
||||
##
|
||||
## Pre-Requisites :
|
||||
## - $engine_type should be set
|
||||
##
|
||||
|
||||
set sql_mode=no_engine_substitution;
|
||||
eval set storage_engine = $engine_type;
|
||||
set autocommit=1;
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
drop table if exists t2;
|
||||
drop table if exists t3;
|
||||
drop function if exists f2;
|
||||
drop procedure if exists bug12713_call;
|
||||
drop procedure if exists bug12713_dump_spvars;
|
||||
drop procedure if exists dummy;
|
||||
--enable_warnings
|
||||
|
||||
create table t1 (a int);
|
||||
create table t2 (a int unique);
|
||||
create table t3 (a int);
|
||||
|
||||
# a workaround for Bug#32633: Can not create any routine if
|
||||
# SQL_MODE=no_engine_substitution
|
||||
|
||||
set sql_mode=default;
|
||||
|
||||
insert into t1 (a) values (1), (2);
|
||||
insert into t3 (a) values (1), (2);
|
||||
|
||||
delimiter |;
|
||||
|
||||
## Cause a failure every time
|
||||
create function f2(x int) returns int
|
||||
begin
|
||||
insert into t2 (a) values (x);
|
||||
insert into t2 (a) values (x);
|
||||
return x;
|
||||
end|
|
||||
|
||||
delimiter ;|
|
||||
|
||||
set autocommit=0;
|
||||
|
||||
flush status;
|
||||
##============================================================================
|
||||
## Design notes
|
||||
##
|
||||
## In each case, statement rollback is expected.
|
||||
## for transactional engines, the rollback should be properly executed
|
||||
## for non transactional engines, the rollback may cause warnings.
|
||||
##
|
||||
## The test pattern is as follows
|
||||
## - insert 1000+N
|
||||
## - statement with a side effect, that fails to insert N twice
|
||||
## - a statement rollback is expected (expecting 1 row 1000+N only) in t2
|
||||
## - a rollback is performed
|
||||
## - expecting a clean table t2.
|
||||
##============================================================================
|
||||
|
||||
insert into t2 (a) values (1001);
|
||||
--error ER_DUP_ENTRY
|
||||
insert into t1 (a) values (f2(1));
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1002);
|
||||
--error ER_DUP_ENTRY
|
||||
insert into t3 (a) select f2(2) from t1;
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1003);
|
||||
--error ER_DUP_ENTRY
|
||||
update t1 set a= a + f2(3);
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1004);
|
||||
--error ER_DUP_ENTRY
|
||||
update t1, t3 set t1.a = 0, t3.a = 0 where (f2(4) = 4) and (t1.a = t3.a);
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1005);
|
||||
--error ER_DUP_ENTRY
|
||||
delete from t1 where (a = f2(5));
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1006);
|
||||
--error ER_DUP_ENTRY
|
||||
delete from t1, t3 using t1, t3 where (f2(6) = 6) ;
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1007);
|
||||
--error ER_DUP_ENTRY
|
||||
replace t1 values (f2(7));
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1008);
|
||||
--error ER_DUP_ENTRY
|
||||
replace into t3 (a) select f2(8) from t1;
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1009);
|
||||
--error ER_DUP_ENTRY
|
||||
select f2(9) from t1 ;
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1010);
|
||||
--error ER_DUP_ENTRY
|
||||
show databases where (f2(10) = 10);
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1011);
|
||||
--error ER_DUP_ENTRY
|
||||
show tables where (f2(11) = 11);
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1012);
|
||||
--error ER_DUP_ENTRY
|
||||
show triggers where (f2(12) = 12);
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1013);
|
||||
--error ER_DUP_ENTRY
|
||||
show table status where (f2(13) = 13);
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1014);
|
||||
--error ER_DUP_ENTRY
|
||||
show open tables where (f2(14) = 14);
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1015);
|
||||
--error ER_DUP_ENTRY
|
||||
show columns in mysql.proc where (f2(15) = 15);
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1016);
|
||||
--error ER_DUP_ENTRY
|
||||
show status where (f2(16) = 16);
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1017);
|
||||
--error ER_DUP_ENTRY
|
||||
show variables where (f2(17) = 17);
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1018);
|
||||
--error ER_DUP_ENTRY
|
||||
show charset where (f2(18) = 18);
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1019);
|
||||
--error ER_DUP_ENTRY
|
||||
show collation where (f2(19) = 19);
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
--echo # We need at least one procedure to make sure the WHERE clause is
|
||||
--echo # evaluated
|
||||
create procedure dummy() begin end;
|
||||
insert into t2 (a) values (1020);
|
||||
--error ER_DUP_ENTRY
|
||||
show procedure status where (f2(20) = 20);
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
drop procedure dummy;
|
||||
|
||||
insert into t2 (a) values (1021);
|
||||
--error ER_DUP_ENTRY
|
||||
show function status where (f2(21) = 21);
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1022);
|
||||
prepare stmt from "insert into t1 (a) values (f2(22))";
|
||||
--error ER_DUP_ENTRY
|
||||
execute stmt;
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
insert into t2 (a) values (1023);
|
||||
do (f2(23));
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
## Please note :
|
||||
## This will insert a record 1024 in t1 (statement commit)
|
||||
## This will insert a record 24 in t1 (statement commit)
|
||||
## then will rollback the second insert only (24) (statement rollback)
|
||||
## then will rollback the complete transaction (transaction rollback)
|
||||
|
||||
delimiter |;
|
||||
|
||||
create procedure bug12713_call ()
|
||||
begin
|
||||
insert into t2 (a) values (24);
|
||||
insert into t2 (a) values (24);
|
||||
end|
|
||||
|
||||
delimiter ;|
|
||||
|
||||
insert into t2 (a) values (1024);
|
||||
--error ER_DUP_ENTRY
|
||||
call bug12713_call();
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
--echo =======================================================================
|
||||
--echo Testing select_to_file
|
||||
--echo =======================================================================
|
||||
|
||||
insert into t2 (a) values (1025);
|
||||
|
||||
--replace_result $MYSQLTEST_VARDIR ..
|
||||
--error ER_DUP_ENTRY
|
||||
eval select f2(25) into outfile "$MYSQLTEST_VARDIR/tmp/dml.out" from t1;
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/dml.out
|
||||
|
||||
insert into t2 (a) values (1026);
|
||||
--replace_result $MYSQLTEST_VARDIR ..
|
||||
--error ER_DUP_ENTRY
|
||||
eval load data infile "../std_data_ln/words.dat" into table t1 (a) set a:=f2(26);
|
||||
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
--echo =======================================================================
|
||||
--echo Testing select_dumpvar
|
||||
--echo =======================================================================
|
||||
|
||||
insert into t2 (a) values (1027);
|
||||
--error ER_DUP_ENTRY
|
||||
select f2(27) into @foo;
|
||||
select * from t2;
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
--echo =======================================================================
|
||||
--echo Testing Select_fetch_into_spvars
|
||||
--echo =======================================================================
|
||||
|
||||
delimiter |;
|
||||
|
||||
create procedure bug12713_dump_spvars ()
|
||||
begin
|
||||
declare foo int;
|
||||
|
||||
declare continue handler for sqlexception
|
||||
begin
|
||||
select "Exception trapped";
|
||||
end;
|
||||
|
||||
select f2(28) into foo;
|
||||
select * from t2;
|
||||
end|
|
||||
|
||||
delimiter ;|
|
||||
|
||||
insert into t2 (a) values (1028);
|
||||
call bug12713_dump_spvars ();
|
||||
rollback;
|
||||
select * from t2;
|
||||
|
||||
--echo =======================================================================
|
||||
--echo Cleanup
|
||||
--echo =======================================================================
|
||||
|
||||
set autocommit=default;
|
||||
|
||||
drop table t1;
|
||||
drop table t2;
|
||||
drop table t3;
|
||||
drop function f2;
|
||||
drop procedure bug12713_call;
|
||||
drop procedure bug12713_dump_spvars;
|
||||
--echo #
|
||||
--echo # Bug#12713 Error in a stored function called from a SELECT doesn't
|
||||
--echo # cause ROLLBACK of statem
|
||||
--echo #
|
||||
--echo # Verify that two-phase commit is not issued for read-only
|
||||
--echo # transactions.
|
||||
--echo #
|
||||
--echo # Verify that two-phase commit is issued for read-write transactions,
|
||||
--echo # even if the change is done inside a stored function called from
|
||||
--echo # SELECT or SHOW statement.
|
||||
--echo #
|
||||
set autocommit=0;
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
drop table if exists t2;
|
||||
drop function if exists f1;
|
||||
drop procedure if exists p_verify_status_increment;
|
||||
--enable_warnings
|
||||
|
||||
# Save binlog_format in a user variable. References to system
|
||||
# variables are "unsafe", meaning they are written as rows instead of
|
||||
# as statements to the binlog, if the loggging mode is 'mixed'. But
|
||||
# we don't want p_verify_status_increment to affect the logging mode.
|
||||
# Hence, we save binlog_format in a user variable (which is not
|
||||
# unsafe) and use that inside p_verify_status_increment.
|
||||
set @binlog_format=@@global.binlog_format;
|
||||
|
||||
set sql_mode=no_engine_substitution;
|
||||
create table t1 (a int unique);
|
||||
create table t2 (a int) engine=myisam;
|
||||
set sql_mode=default;
|
||||
--echo #
|
||||
--echo # An auxiliary procedure to track Handler_prepare and Handler_commit
|
||||
--echo # statistics.
|
||||
--echo #
|
||||
delimiter |;
|
||||
create procedure
|
||||
p_verify_status_increment(commit_inc_mixed int, prepare_inc_mixed int,
|
||||
commit_inc_row int, prepare_inc_row int)
|
||||
begin
|
||||
declare commit_inc int;
|
||||
declare prepare_inc int;
|
||||
declare old_commit_count int default ifnull(@commit_count, 0);
|
||||
declare old_prepare_count int default ifnull(@prepare_count, 0);
|
||||
declare c_res int;
|
||||
# Use a cursor to have just one access to I_S instead of 2, it is very slow
|
||||
# and amounts for over 90% of test CPU time
|
||||
declare c cursor for
|
||||
select variable_value
|
||||
from information_schema.session_status
|
||||
where variable_name='Handler_commit' or variable_name='Handler_prepare'
|
||||
order by variable_name;
|
||||
|
||||
if @binlog_format = 'ROW' then
|
||||
set commit_inc= commit_inc_row;
|
||||
set prepare_inc= prepare_inc_row;
|
||||
else
|
||||
set commit_inc= commit_inc_mixed;
|
||||
set prepare_inc= prepare_inc_mixed;
|
||||
end if;
|
||||
|
||||
open c;
|
||||
fetch c into c_res;
|
||||
set @commit_count=c_res;
|
||||
fetch c into c_res;
|
||||
set @prepare_count=c_res;
|
||||
close c;
|
||||
|
||||
if old_commit_count + commit_inc <> @commit_count then
|
||||
select concat("Expected commit increment: ", commit_inc,
|
||||
" actual: ", @commit_count - old_commit_count)
|
||||
as 'ERROR';
|
||||
elseif old_prepare_count + prepare_inc <> @prepare_count then
|
||||
select concat("Expected prepare increment: ", prepare_inc,
|
||||
" actual: ", @prepare_count - old_prepare_count)
|
||||
as 'ERROR';
|
||||
else
|
||||
select '' as 'SUCCESS';
|
||||
end if;
|
||||
end|
|
||||
delimiter ;|
|
||||
--echo # Reset Handler_commit and Handler_prepare counters
|
||||
flush status;
|
||||
--echo #
|
||||
--echo # 1. Read-only statement: SELECT
|
||||
--echo #
|
||||
select * from t1;
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
|
||||
--echo # 2. Read-write statement: INSERT, insert 1 row.
|
||||
--echo #
|
||||
insert into t1 (a) values (1);
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
|
||||
--echo # 3. Read-write statement: UPDATE, update 1 row.
|
||||
--echo #
|
||||
update t1 set a=2;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
|
||||
--echo # 4. Read-write statement: UPDATE, update 0 rows, 1 row matches WHERE
|
||||
--echo #
|
||||
update t1 set a=2;
|
||||
call p_verify_status_increment(2, 2, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 2, 1, 0);
|
||||
|
||||
--echo # 5. Read-write statement: UPDATE, update 0 rows, 0 rows match WHERE
|
||||
--echo #
|
||||
--echo # In mixed replication mode, there is a read-only transaction
|
||||
--echo # in InnoDB and also the statement is written to the binary log.
|
||||
--echo # So we have two commits but no 2pc, since the first engine's
|
||||
--echo # transaction is read-only.
|
||||
--echo # In the row level replication mode, we only have the read-only
|
||||
--echo # transaction in InnoDB and nothing is written to the binary log.
|
||||
--echo #
|
||||
update t1 set a=3 where a=1;
|
||||
call p_verify_status_increment(2, 0, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 0, 1, 0);
|
||||
|
||||
--echo # 6. Read-write statement: DELETE, delete 0 rows.
|
||||
--echo #
|
||||
delete from t1 where a=1;
|
||||
call p_verify_status_increment(2, 0, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 0, 1, 0);
|
||||
|
||||
--echo # 7. Read-write statement: DELETE, delete 1 row.
|
||||
--echo #
|
||||
delete from t1 where a=2;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
|
||||
--echo # 8. Read-write statement: unqualified DELETE
|
||||
--echo #
|
||||
--echo # In statement or mixed replication mode, we call
|
||||
--echo # handler::ha_delete_all_rows() and write statement text
|
||||
--echo # to the binary log. This results in two read-write transactions.
|
||||
--echo # In row level replication mode, we do not call
|
||||
--echo # handler::ha_delete_all_rows(), but delete rows one by one.
|
||||
--echo # Since there are no rows, nothing is written to the binary log.
|
||||
--echo # Thus we have just one read-only transaction in InnoDB.
|
||||
delete from t1;
|
||||
call p_verify_status_increment(2, 2, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 2, 1, 0);
|
||||
|
||||
--echo # 9. Read-write statement: REPLACE, change 1 row.
|
||||
--echo #
|
||||
replace t1 set a=1;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
|
||||
--echo # 10. Read-write statement: REPLACE, change 0 rows.
|
||||
--echo #
|
||||
replace t1 set a=1;
|
||||
call p_verify_status_increment(2, 2, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 2, 1, 0);
|
||||
|
||||
--echo # 11. Read-write statement: IODKU, change 1 row.
|
||||
--echo #
|
||||
insert t1 set a=1 on duplicate key update a=a+1;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
select * from t1;
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
|
||||
--echo # 12. Read-write statement: IODKU, change 0 rows.
|
||||
--echo #
|
||||
insert t1 set a=2 on duplicate key update a=2;
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
|
||||
--echo # 13. Read-write statement: INSERT IGNORE, change 0 rows.
|
||||
--echo #
|
||||
insert ignore t1 set a=2;
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
|
||||
--echo # 14. Read-write statement: INSERT IGNORE, change 1 row.
|
||||
--echo #
|
||||
insert ignore t1 set a=1;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
--echo # 15. Read-write statement: UPDATE IGNORE, change 0 rows.
|
||||
--echo #
|
||||
update ignore t1 set a=2 where a=1;
|
||||
call p_verify_status_increment(2, 2, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 2, 1, 0);
|
||||
--echo #
|
||||
--echo # Create a stored function that modifies a
|
||||
--echo # non-transactional table. Demonstrate that changes in
|
||||
--echo # non-transactional tables do not affect the two phase commit
|
||||
--echo # algorithm.
|
||||
--echo #
|
||||
delimiter |;
|
||||
create function f1() returns int
|
||||
begin
|
||||
insert t2 set a=2;
|
||||
return 2;
|
||||
end|
|
||||
delimiter ;|
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
|
||||
--echo # 16. A function changes non-trans-table.
|
||||
--echo #
|
||||
--echo # For row-based logging, there is an extra commit for the
|
||||
--echo # non-transactional changes saved in the transaction cache to
|
||||
--echo # the binary log.
|
||||
--echo #
|
||||
select f1();
|
||||
call p_verify_status_increment(0, 0, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(0, 0, 1, 0);
|
||||
|
||||
--echo # 17. Read-only statement, a function changes non-trans-table.
|
||||
--echo #
|
||||
--echo # For row-based logging, there is an extra commit for the
|
||||
--echo # non-transactional changes saved in the transaction cache to
|
||||
--echo # the binary log.
|
||||
--echo #
|
||||
select f1() from t1;
|
||||
call p_verify_status_increment(1, 0, 2, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(1, 0, 2, 0);
|
||||
|
||||
--echo # 18. Read-write statement: UPDATE, change 0 (transactional) rows.
|
||||
--echo #
|
||||
select count(*) from t2;
|
||||
update t1 set a=2 where a=f1()+10;
|
||||
select count(*) from t2;
|
||||
call p_verify_status_increment(2, 0, 2, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 0, 2, 0);
|
||||
--echo #
|
||||
--echo # Replace the non-transactional table with a temporary
|
||||
--echo # transactional table. Demonstrate that a change to a temporary
|
||||
--echo # transactional table does not provoke 2-phase commit, although
|
||||
--echo # does trigger a commit and a binlog write (in statement mode).
|
||||
--echo #
|
||||
drop table t2;
|
||||
set sql_mode=no_engine_substitution;
|
||||
create temporary table t2 (a int);
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
set sql_mode=default;
|
||||
--echo # 19. A function changes temp-trans-table.
|
||||
--echo #
|
||||
select f1();
|
||||
--echo # Two commits because a binary log record is written
|
||||
call p_verify_status_increment(2, 0, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 0, 1, 0);
|
||||
|
||||
--echo # 20. Read-only statement, a function changes non-trans-table.
|
||||
--echo #
|
||||
select f1() from t1;
|
||||
--echo # Two commits because a binary log record is written
|
||||
call p_verify_status_increment(2, 0, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 0, 1, 0);
|
||||
|
||||
--echo # 21. Read-write statement: UPDATE, change 0 (transactional) rows.
|
||||
--echo #
|
||||
update t1 set a=2 where a=f1()+10;
|
||||
call p_verify_status_increment(2, 0, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 0, 1, 0);
|
||||
|
||||
--echo # 22. DDL: ALTER TEMPORARY TABLE, should not cause a 2pc
|
||||
--echo #
|
||||
alter table t2 add column b int default 5;
|
||||
--echo # A commit is done internally by ALTER.
|
||||
call p_verify_status_increment(2, 0, 2, 0);
|
||||
commit;
|
||||
--echo # There is nothing left to commit
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
|
||||
--echo # 23. DDL: RENAME TEMPORARY TABLE, does not start a transaction
|
||||
--echo
|
||||
--echo # No test because of Bug#8729 "rename table fails on temporary table"
|
||||
|
||||
--echo # 24. DDL: TRUNCATE TEMPORARY TABLE, does not start a transaction
|
||||
--echo
|
||||
truncate table t2;
|
||||
call p_verify_status_increment(2, 0, 2, 0);
|
||||
commit;
|
||||
--echo # There is nothing left to commit
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
|
||||
--echo # 25. Read-write statement: unqualified DELETE
|
||||
--echo
|
||||
delete from t2;
|
||||
call p_verify_status_increment(2, 0, 1, 0);
|
||||
commit;
|
||||
--echo # There is nothing left to commit
|
||||
call p_verify_status_increment(2, 0, 1, 0);
|
||||
|
||||
--echo # 25. DDL: DROP TEMPORARY TABLE, does not start a transaction
|
||||
--echo #
|
||||
drop temporary table t2;
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
|
||||
--echo # 26. Verify that SET AUTOCOMMIT issues an implicit commit
|
||||
--echo #
|
||||
insert t1 set a=3;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
set autocommit=1;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
rollback;
|
||||
select a from t1 where a=3;
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
delete from t1 where a=3;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
commit;
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
set autocommit=0;
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
insert t1 set a=3;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
--echo # Sic: not actually changing the value of autocommit
|
||||
set autocommit=0;
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
rollback;
|
||||
select a from t1 where a=3;
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
|
||||
--echo # 27. Savepoint management
|
||||
--echo #
|
||||
insert t1 set a=3;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
savepoint a;
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
insert t1 set a=4;
|
||||
--echo # Sic: a bug. Binlog did not register itself this time.
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
release savepoint a;
|
||||
rollback;
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
select a from t1 where a=3;
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
|
||||
--echo # 28. Read-write statement: DO
|
||||
--echo #
|
||||
create table t2 (a int);
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
do (select f1() from t1 where a=2);
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
commit;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
|
||||
--echo # 29. Read-write statement: MULTI-DELETE
|
||||
--echo #
|
||||
delete t1, t2 from t1 join t2 on (t1.a=t2.a) where t1.a=2;
|
||||
commit;
|
||||
call p_verify_status_increment(4, 4, 4, 4);
|
||||
|
||||
--echo # 30. Read-write statement: INSERT-SELECT, MULTI-UPDATE, REPLACE-SELECT
|
||||
--echo #
|
||||
insert into t2 select a from t1;
|
||||
commit;
|
||||
replace into t2 select a from t1;
|
||||
commit;
|
||||
call p_verify_status_increment(8, 8, 8, 8);
|
||||
#
|
||||
# Multi-update is one of the few remaining statements that still
|
||||
# locks the tables at prepare step (and hence starts the transaction.
|
||||
# Disable the PS protocol, since in this protocol we get a different
|
||||
# number of commmits (there is an extra commit after prepare
|
||||
#
|
||||
--disable_ps_protocol
|
||||
update t1, t2 set t1.a=4, t2.a=8 where t1.a=t2.a and t1.a=1;
|
||||
--enable_ps_protocol
|
||||
commit;
|
||||
call p_verify_status_increment(4, 4, 4, 4);
|
||||
|
||||
--echo # 31. DDL: various DDL with transactional tables
|
||||
--echo #
|
||||
--echo # Sic: no table is created.
|
||||
create table if not exists t2 (a int) select 6 union select 7;
|
||||
--echo # Sic: first commits the statement, and then the transaction.
|
||||
call p_verify_status_increment(4, 4, 4, 4);
|
||||
create table t3 select a from t2;
|
||||
call p_verify_status_increment(4, 4, 4, 4);
|
||||
alter table t3 add column (b int);
|
||||
call p_verify_status_increment(2, 0, 2, 0);
|
||||
alter table t3 rename t4;
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
rename table t4 to t3;
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
truncate table t3;
|
||||
call p_verify_status_increment(2, 2, 2, 2);
|
||||
create view v1 as select * from t2;
|
||||
call p_verify_status_increment(1, 0, 1, 0);
|
||||
check table t1;
|
||||
call p_verify_status_increment(3, 0, 3, 0);
|
||||
--echo # Sic: after this bug is fixed, CHECK leaves no pending transaction
|
||||
commit;
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
check table t1, t2, t3;
|
||||
call p_verify_status_increment(6, 0, 6, 0);
|
||||
commit;
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
drop view v1;
|
||||
call p_verify_status_increment(0, 0, 0, 0);
|
||||
|
||||
--echo #
|
||||
--echo # Cleanup
|
||||
--echo #
|
||||
drop table t1, t2, t3;
|
||||
drop procedure p_verify_status_increment;
|
||||
drop function f1;
|
56
mysql-test/include/connect2.inc
Normal file
56
mysql-test/include/connect2.inc
Normal file
@ -0,0 +1,56 @@
|
||||
# include/connect2.inc
|
||||
#
|
||||
# SUMMARY
|
||||
#
|
||||
# Make several attempts to connect.
|
||||
#
|
||||
# USAGE
|
||||
#
|
||||
# EXAMPLE
|
||||
#
|
||||
# connect.test
|
||||
#
|
||||
|
||||
--disable_query_log
|
||||
|
||||
let $wait_counter= 300;
|
||||
if ($wait_timeout)
|
||||
{
|
||||
let $wait_counter= `SELECT $wait_timeout * 10`;
|
||||
}
|
||||
# Reset $wait_timeout so that its value won't be used on subsequent
|
||||
# calls, and default will be used instead.
|
||||
let $wait_timeout= 0;
|
||||
|
||||
--echo # -- Establishing connection '$con_name' (user: $con_user_name)...
|
||||
|
||||
while ($wait_counter)
|
||||
{
|
||||
--disable_abort_on_error
|
||||
--disable_result_log
|
||||
--connect ($con_name,localhost,$con_user_name)
|
||||
--enable_result_log
|
||||
--enable_abort_on_error
|
||||
|
||||
let $error = $mysql_errno;
|
||||
|
||||
if (!$error)
|
||||
{
|
||||
let $wait_counter= 0;
|
||||
}
|
||||
if ($error)
|
||||
{
|
||||
real_sleep 0.1;
|
||||
dec $wait_counter;
|
||||
}
|
||||
}
|
||||
if ($error)
|
||||
{
|
||||
--echo # -- Error: can not establish connection '$con_name'.
|
||||
}
|
||||
if (!$error)
|
||||
{
|
||||
--echo # -- Connection '$con_name' has been established.
|
||||
}
|
||||
|
||||
--enable_query_log
|
@ -13,6 +13,8 @@
|
||||
|
||||
SET @safe_character_set_server= @@character_set_server;
|
||||
SET @safe_collation_server= @@collation_server;
|
||||
SET @safe_character_set_client= @@character_set_client;
|
||||
SET @safe_character_set_results= @@character_set_results;
|
||||
SET character_set_server= @test_character_set;
|
||||
SET collation_server= @test_collation;
|
||||
CREATE DATABASE d1;
|
||||
@ -62,8 +64,22 @@ select a sounds like a from t1;
|
||||
select 1 from t1 order by cast(a as char(1));
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug#27580 SPACE() function collation bug?
|
||||
#
|
||||
set names utf8;
|
||||
create table t1 (
|
||||
name varchar(10),
|
||||
level smallint unsigned);
|
||||
show create table t1;
|
||||
insert into t1 values ('string',1);
|
||||
select concat(name,space(level)), concat(name, repeat(' ',level)) from t1;
|
||||
drop table t1;
|
||||
|
||||
DROP DATABASE d1;
|
||||
# Restore settings
|
||||
USE test;
|
||||
SET character_set_server= @safe_character_set_server;
|
||||
SET collation_server= @safe_collation_server;
|
||||
SET character_set_client= @safe_character_set_client;
|
||||
SET character_set_results= @safe_character_set_results;
|
||||
|
40
mysql-test/include/ctype_german.inc
Normal file
40
mysql-test/include/ctype_german.inc
Normal file
@ -0,0 +1,40 @@
|
||||
#
|
||||
# Bug #27877 incorrect german order in utf8_general_ci
|
||||
#
|
||||
# Testing if "SHARP S" is equal to "S",
|
||||
# like in latin1_german1_ci, utf8_general_ci, ucs2_general_ci
|
||||
# Or if "SHART S" is equal to "SS",
|
||||
# like in latin1_german2_ci, utf8_unicode_ci, ucs2_unicode_ci
|
||||
#
|
||||
# Also testing A-uml, O-uml, U-uml
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
|
||||
#
|
||||
# Create a table with a varchar(x) column,
|
||||
# using current values of
|
||||
# @@character_set_connection and @@collation_connection.
|
||||
#
|
||||
|
||||
create table t1 as select repeat(' ', 64) as s1;
|
||||
select collation(s1) from t1;
|
||||
delete from t1;
|
||||
|
||||
#
|
||||
# Populate data
|
||||
#
|
||||
|
||||
insert into t1 values ('a'),('ae'),(_latin1 0xE4);
|
||||
insert into t1 values ('o'),('oe'),(_latin1 0xF6);
|
||||
insert into t1 values ('s'),('ss'),(_latin1 0xDF);
|
||||
insert into t1 values ('u'),('ue'),(_latin1 0xFC);
|
||||
|
||||
#
|
||||
# Check order
|
||||
#
|
||||
select s1, hex(s1) from t1 order by s1, binary s1;
|
||||
select group_concat(s1 order by binary s1) from t1 group by s1;
|
||||
drop table t1;
|
25
mysql-test/include/ctype_like_range_f1f2.inc
Normal file
25
mysql-test/include/ctype_like_range_f1f2.inc
Normal file
@ -0,0 +1,25 @@
|
||||
#
|
||||
# Bug#32510 LIKE search fails with indexed 'eucjpms' and 'ujis' char column
|
||||
#
|
||||
# Testing my_ctype_like_range_xxx
|
||||
# (used in LIKE optimization for an indexed column)
|
||||
#
|
||||
|
||||
# Create table using @@character_set_connection and @@collation_connection
|
||||
# for the string columns.
|
||||
|
||||
CREATE TABLE t1 AS
|
||||
SELECT 10 AS a, REPEAT('a',20) AS b, REPEAT('a',8) AS c, REPEAT('a',8) AS d;
|
||||
ALTER TABLE t1 ADD PRIMARY KEY(a), ADD KEY(b);
|
||||
|
||||
INSERT INTO t1 (a, b) VALUES (1, repeat(0xF1F2,5));
|
||||
INSERT INTO t1 (a, b) VALUES (2, repeat(0xF1F2,10));
|
||||
INSERT INTO t1 (a, b) VALUES (3, repeat(0xF1F2,11));
|
||||
INSERT INTO t1 (a, b) VALUES (4, repeat(0xF1F2,12));
|
||||
|
||||
# Check pattern (important for ucs2, utf16, utf32)
|
||||
SELECT hex(concat(repeat(0xF1F2, 10), '%'));
|
||||
|
||||
--echo 3 rows expected
|
||||
SELECT a, hex(b), c FROM t1 WHERE b LIKE concat(repeat(0xF1F2,10), '%');
|
||||
DROP TABLE t1;
|
@ -9,6 +9,10 @@ SHOW CREATE VIEW v1|
|
||||
|
||||
SHOW CREATE VIEW v2|
|
||||
|
||||
--echo
|
||||
|
||||
SHOW CREATE VIEW v3|
|
||||
|
||||
# - Check INFORMATION_SCHEMA;
|
||||
|
||||
--echo
|
||||
@ -20,6 +24,10 @@ SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE table_name = 'v1'|
|
||||
|
||||
SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE table_name = 'v2'|
|
||||
|
||||
--echo
|
||||
|
||||
SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE table_name = 'v3'|
|
||||
|
||||
# - Execute the views;
|
||||
|
||||
--echo
|
||||
@ -30,3 +38,7 @@ SELECT COLLATION(c1), COLLATION(c2) FROM v1|
|
||||
--echo
|
||||
|
||||
SELECT COLLATION(c1) FROM v2|
|
||||
|
||||
--echo
|
||||
|
||||
SELECT * FROM v3|
|
||||
|
122
mysql-test/include/diff_tables.inc
Normal file
122
mysql-test/include/diff_tables.inc
Normal file
@ -0,0 +1,122 @@
|
||||
# ==== Purpose ====
|
||||
#
|
||||
# Check if the two given tables (possibly residing on different
|
||||
# master/slave servers) are equal.
|
||||
#
|
||||
# ==== Usage ====
|
||||
#
|
||||
# The tables to check are given by the test language variables
|
||||
# $diff_table_1 and $diff_table_2. They must be of the
|
||||
# following form:
|
||||
#
|
||||
# [master:|slave:]database.table
|
||||
#
|
||||
# I.e., both database and table must be speicified. Optionally, you
|
||||
# can prefix the name with 'master:' (to read the table on master) or
|
||||
# with 'slave:' (to read the table on slave). If no prefix is given,
|
||||
# reads the table from the current connection. If one of these
|
||||
# variables has a prefix, both should have a prefix.
|
||||
#
|
||||
# ==== Side effects ====
|
||||
#
|
||||
# - Prints "Comparing tables $diff_table_1 and $diff_tables_2".
|
||||
#
|
||||
# - If the tables are different, prints the difference in a
|
||||
# system-specific format (unified diff if supported) and generates
|
||||
# an error.
|
||||
#
|
||||
# - If $diff_table_1 or $diff_table_2 begins with 'master:' or
|
||||
# 'slave:', it will stay connected to one of those hosts after
|
||||
# execution. The host is only guaranteed to remain unchanged if
|
||||
# none of $diff_table_1 or $diff_table_2 begins with 'master:' or
|
||||
# 'slave:'.
|
||||
#
|
||||
# ==== Bugs ====
|
||||
#
|
||||
# - It is currently not possible to use this for tables that are
|
||||
# supposed to be different, because if the files are different:
|
||||
# - 'diff' produces system-dependent output,
|
||||
# - the output includes the absolute path of the compared files,
|
||||
# - the output includes a timestamp.
|
||||
# To fix that, we'd probably have to use SQL to compute the
|
||||
# symmetric difference between the tables. I'm not sure how to do
|
||||
# that efficiently. If we implement this, it would be nice to
|
||||
# compare the table definitions too.
|
||||
#
|
||||
# - It actually compares the result of "SELECT * FROM table ORDER BY
|
||||
# col1, col2, ..., colN INTO OUTFILE 'file'". Hence, it is assumed
|
||||
# that the comparison orders for both tables are equal and that two
|
||||
# rows that are equal in the comparison order cannot differ, e.g.,
|
||||
# by character case.
|
||||
|
||||
|
||||
# ==== Save both tables to file ====
|
||||
|
||||
--echo Comparing tables $diff_table_1 and $diff_table_2
|
||||
disable_query_log;
|
||||
|
||||
--error 0,1
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/diff_table_1
|
||||
--error 0,1
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/diff_table_2
|
||||
|
||||
let $_diff_table=$diff_table_2;
|
||||
let $_diff_i=2;
|
||||
while ($_diff_i) {
|
||||
|
||||
# Parse out any leading "master:" or "slave:" from the table
|
||||
# specification and connect the appropriate server.
|
||||
let $_diff_conn_master=`SELECT SUBSTR('$_diff_table', 1, 7) = 'master:'`;
|
||||
if ($_diff_conn_master) {
|
||||
let $_diff_table=`SELECT SUBSTR('$_diff_table', 8)`;
|
||||
connection master;
|
||||
}
|
||||
let $_diff_conn_slave=`SELECT SUBSTR('$_diff_table', 1, 6) = 'slave:'`;
|
||||
if ($_diff_conn_slave) {
|
||||
let $_diff_table=`SELECT SUBSTR('$_diff_table', 7)`;
|
||||
connection slave;
|
||||
}
|
||||
|
||||
# Sanity-check the input.
|
||||
let $_diff_error= `SELECT '$_diff_table' NOT LIKE '_%._%'`;
|
||||
if ($_diff_error) {
|
||||
--echo !!!ERROR IN TEST: \$diff_table_$_diff_i='$_diff_table' is not in the form database.table
|
||||
exit;
|
||||
}
|
||||
|
||||
# We need the output files to be sorted (so that diff_files does not
|
||||
# think the files are different just because they are differently
|
||||
# ordered). To this end, we first generate a query that sorts the
|
||||
# table by all columns. Since ORDER BY accept column indices, we
|
||||
# just generate a comma-separated list of all numbers from 1 to the
|
||||
# number of columns in the table.
|
||||
let $_diff_column_index=`SELECT MAX(ordinal_position)
|
||||
FROM information_schema.columns
|
||||
WHERE CONCAT(table_schema, '.', table_name) =
|
||||
'$_diff_table'`;
|
||||
let $_diff_column_list=$_diff_column_index;
|
||||
dec $_diff_column_index;
|
||||
while ($_diff_column_index) {
|
||||
let $_diff_column_list=$_diff_column_index, $_diff_column_list;
|
||||
dec $_diff_column_index;
|
||||
}
|
||||
|
||||
# Now that we have the comma-separated list of columns, we can write
|
||||
# the table to a file.
|
||||
eval SELECT * FROM $_diff_table ORDER BY $_diff_column_list
|
||||
INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/diff_table_$_diff_i';
|
||||
|
||||
# Do the same for $diff_table_1.
|
||||
dec $_diff_i;
|
||||
let $_diff_table=$diff_table_1;
|
||||
}
|
||||
|
||||
|
||||
# ==== Compare the generated files ====
|
||||
|
||||
diff_files $MYSQLTEST_VARDIR/tmp/diff_table_1 $MYSQLTEST_VARDIR/tmp/diff_table_2;
|
||||
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/diff_table_1
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/diff_table_2
|
||||
|
||||
enable_query_log;
|
@ -1090,6 +1090,19 @@ SELECT * FROM t1 WHERE id=191 OR id IS NULL ORDER BY d;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug #34223: Assertion failed: (optp->var_type & 127) == 8,
|
||||
# file .\my_getopt.c, line 830
|
||||
#
|
||||
|
||||
set @my_innodb_autoextend_increment=@@global.innodb_autoextend_increment;
|
||||
set global innodb_autoextend_increment=8;
|
||||
set global innodb_autoextend_increment=@my_innodb_autoextend_increment;
|
||||
|
||||
set @my_innodb_commit_concurrency=@@global.innodb_commit_concurrency;
|
||||
set global innodb_commit_concurrency=0;
|
||||
set global innodb_commit_concurrency=@my_innodb_commit_concurrency;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
# Fix for BUG#19243 "wrong LAST_INSERT_ID() after ON DUPLICATE KEY
|
||||
@ -1410,4 +1423,33 @@ SELECT * FROM t1 WHERE tid = 1 AND vid = 3 ORDER BY idx DESC;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug#21704: Renaming column does not update FK definition.
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TABLE IF EXISTS t2;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1(id INT PRIMARY KEY)
|
||||
ENGINE=innodb;
|
||||
|
||||
CREATE TABLE t2(
|
||||
t1_id INT PRIMARY KEY,
|
||||
CONSTRAINT fk1 FOREIGN KEY (t1_id) REFERENCES t1(id))
|
||||
ENGINE=innodb;
|
||||
|
||||
--echo
|
||||
|
||||
--disable_result_log
|
||||
--error ER_ERROR_ON_RENAME
|
||||
ALTER TABLE t1 CHANGE id id2 INT;
|
||||
--enable_result_log
|
||||
|
||||
--echo
|
||||
|
||||
DROP TABLE t2;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
26
mysql-test/include/ndb_wait_connected.inc
Normal file
26
mysql-test/include/ndb_wait_connected.inc
Normal file
@ -0,0 +1,26 @@
|
||||
# Check that mysqld has reconnected to ndbd after
|
||||
# restart of ndbd
|
||||
#
|
||||
--disable_query_log
|
||||
--disable_result_log
|
||||
let $mysql_errno= 1;
|
||||
let $counter= 600;
|
||||
while ($mysql_errno)
|
||||
{
|
||||
--error 0,157
|
||||
CREATE TABLE ndb_wait_connected (a int primary key);
|
||||
if ($mysql_errno)
|
||||
{
|
||||
if (!$counter)
|
||||
{
|
||||
die Failed waiting for mysqld to reconnect to ndbd;
|
||||
}
|
||||
dec $counter;
|
||||
--sleep 0.1
|
||||
}
|
||||
}
|
||||
DROP TABLE ndb_wait_connected;
|
||||
--enable_query_log
|
||||
--enable_result_log
|
||||
|
||||
|
@ -1,4 +1,9 @@
|
||||
--let $binlog_start=106
|
||||
# $binlog_start can be set by caller or take a default value
|
||||
|
||||
if (!$binlog_start)
|
||||
{
|
||||
let $binlog_start=106;
|
||||
}
|
||||
--replace_result $binlog_start <binlog_start>
|
||||
--replace_column 2 # 4 # 5 #
|
||||
--replace_regex /\/\* xid=.* \*\//\/* XID *\// /table_id: [0-9]+/table_id: #/ /file_id=[0-9]+/file_id=#/
|
||||
|
33
mysql-test/include/wait_for_binlog_event.inc
Normal file
33
mysql-test/include/wait_for_binlog_event.inc
Normal file
@ -0,0 +1,33 @@
|
||||
# include/wait_for_binlog_event.inc
|
||||
#
|
||||
# SUMMARY
|
||||
#
|
||||
# Waits until SHOW BINLOG EVENTS has returned in last event a specified substring.
|
||||
#
|
||||
# USAGE
|
||||
#
|
||||
# let $wait_binlog_event= DROP;
|
||||
# --source include/wait_for_binlog_event.inc
|
||||
|
||||
let $_loop_count= 300;
|
||||
let $_last_event= ;
|
||||
let $_event_pos= 1;
|
||||
|
||||
while (`SELECT INSTR("$_last_event","$wait_binlog_event") = 0`)
|
||||
{
|
||||
dec $_loop_count;
|
||||
if (!$_loop_count)
|
||||
{
|
||||
SHOW BINLOG EVENTS;
|
||||
--die ERROR: failed while waiting for $wait_binlog_event in binlog
|
||||
}
|
||||
real_sleep 0.1;
|
||||
let $_event= query_get_value(SHOW BINLOG EVENTS, Info, $_event_pos);
|
||||
let $_last_event= $_event;
|
||||
while (`SELECT "$_event" != "No such row"`)
|
||||
{
|
||||
inc $_event_pos;
|
||||
let $_last_event= $_event;
|
||||
let $_event= query_get_value(SHOW BINLOG EVENTS, Info, $_event_pos);
|
||||
}
|
||||
}
|
@ -9,7 +9,10 @@
|
||||
# sql threads to stop
|
||||
# 3) If loops too long die.
|
||||
####################################################
|
||||
connection slave;
|
||||
if (!$keep_connection)
|
||||
{
|
||||
connection slave;
|
||||
}
|
||||
let $row_number= 1;
|
||||
let $run= 1;
|
||||
let $counter= 300;
|
||||
|
Reference in New Issue
Block a user