mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
* tests which use MERGE or INSERT DELAYED should run only
with engines which support that * temporarily adding option --global-subst to mysqltest so that the full testsuite can be run using Maria tables without failing on trivial differences (like diff in the engine clause of SHOW CREATE TABLE) * using recognizable tags for todos of the Maria team client/mysqltest.c: temporarily adding option --global-subst: its argument is X,Y. It replaces all occurrences of X by Y into mysqltest's result before the comparison with the expected result is done. This serves for when a test is run with --default-storage-engine=X where X is not MyISAM: tests using SHOW CREATE TABLE will always fail because SHOW CREATE TABLE prints X instead of MyISAM. With --global-subst=X,MyISAM , such trivial differences are eliminated and test may be reported as passing. For example, --global-subst=MARIA,MyISAM This is not good enough for merging into main trees! just for running many tests and finding bugs now! mysql-test/mysql-test-run.pl: new option --mysqltest to pass options to mysqltest (like we have --mysqld). Used for example like this: ./mtr --mysqltest=--global-subst=MARIA,MyISAM mysql-test/r/merge.result: update mysql-test/t/delayed.test: run test only with engines which support INSERT DELAYED mysql-test/t/merge.test: run test only with MyISAM tables, as they are required by MERGE sql/sql_delete.cc: recognizable tag sql/table.cc: recognizable tag storage/maria/ha_maria.cc: recognizable tag storage/maria/ma_check.c: recognizable tag storage/maria/ma_create.c: recognizable tag
This commit is contained in:
@ -69,7 +69,8 @@
|
|||||||
enum {
|
enum {
|
||||||
OPT_SKIP_SAFEMALLOC=OPT_MAX_CLIENT_OPTION,
|
OPT_SKIP_SAFEMALLOC=OPT_MAX_CLIENT_OPTION,
|
||||||
OPT_PS_PROTOCOL, OPT_SP_PROTOCOL, OPT_CURSOR_PROTOCOL, OPT_VIEW_PROTOCOL,
|
OPT_PS_PROTOCOL, OPT_SP_PROTOCOL, OPT_CURSOR_PROTOCOL, OPT_VIEW_PROTOCOL,
|
||||||
OPT_MAX_CONNECT_RETRIES, OPT_MARK_PROGRESS, OPT_LOG_DIR
|
OPT_MAX_CONNECT_RETRIES, OPT_MARK_PROGRESS, OPT_LOG_DIR,
|
||||||
|
OPT_GLOBAL_SUBST
|
||||||
};
|
};
|
||||||
|
|
||||||
static int record= 0, opt_sleep= -1;
|
static int record= 0, opt_sleep= -1;
|
||||||
@ -105,6 +106,9 @@ static char delimiter[MAX_DELIMITER_LENGTH]= ";";
|
|||||||
static uint delimiter_length= 1;
|
static uint delimiter_length= 1;
|
||||||
|
|
||||||
static char TMPDIR[FN_REFLEN];
|
static char TMPDIR[FN_REFLEN];
|
||||||
|
static char global_subst_from[200];
|
||||||
|
static char global_subst_to[200];
|
||||||
|
static char *global_subst= NULL;
|
||||||
|
|
||||||
/* Block stack */
|
/* Block stack */
|
||||||
enum block_cmd {
|
enum block_cmd {
|
||||||
@ -788,6 +792,7 @@ void free_used_memory()
|
|||||||
my_free(opt_pass,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(opt_pass,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
free_defaults(default_argv);
|
free_defaults(default_argv);
|
||||||
free_re();
|
free_re();
|
||||||
|
my_free(global_subst, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
#ifdef __WIN__
|
#ifdef __WIN__
|
||||||
free_tmp_sh_file();
|
free_tmp_sh_file();
|
||||||
free_win_path_patterns();
|
free_win_path_patterns();
|
||||||
@ -1088,6 +1093,40 @@ void check_result(DYNAMIC_STRING* ds)
|
|||||||
break; /* ok */
|
break; /* ok */
|
||||||
case RESULT_LENGTH_MISMATCH:
|
case RESULT_LENGTH_MISMATCH:
|
||||||
dump_result_to_reject_file(ds->str, ds->length);
|
dump_result_to_reject_file(ds->str, ds->length);
|
||||||
|
if (global_subst)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
@todo MARIA_HACK
|
||||||
|
This serves for when a test is run with --default-storage-engine=X
|
||||||
|
where X is not MyISAM: tests using SHOW CREATE TABLE will always fail
|
||||||
|
because SHOW CREATE TABLE prints X instead of MyISAM. With
|
||||||
|
--global-subst=X,MyISAM , such trivial differences are eliminated and
|
||||||
|
test may be reported as passing.
|
||||||
|
--global-subst is only a quick way to run a lot of existing tests
|
||||||
|
with Maria and find bugs; it is not good enough for reaching the main
|
||||||
|
trees when Maria is merged into them. It relies on hard-coded path of
|
||||||
|
"replace", on existence of "cmp". It's just horrible but it works for
|
||||||
|
devs using a bk tree in a GNU-based system, which is what we have in
|
||||||
|
the team.
|
||||||
|
--global-subst should be removed.
|
||||||
|
*/
|
||||||
|
char reject_file[FN_REFLEN];
|
||||||
|
char sys_com[50 + FN_REFLEN];
|
||||||
|
fn_format(reject_file, result_file_name, "", ".reject",
|
||||||
|
MY_REPLACE_EXT);
|
||||||
|
sprintf(sys_com, "../extra/replace %s %s -- %s >/dev/null",
|
||||||
|
global_subst_from, global_subst_to, reject_file);
|
||||||
|
if (system(sys_com))
|
||||||
|
die("replace failed");
|
||||||
|
sprintf(sys_com, "cmp %s %s >/dev/null",
|
||||||
|
reject_file, result_file_name);
|
||||||
|
if (!system(sys_com))
|
||||||
|
{
|
||||||
|
/* test is ok in fact */
|
||||||
|
my_delete(reject_file, MYF(0));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
die("Result length mismatch");
|
die("Result length mismatch");
|
||||||
break;
|
break;
|
||||||
case RESULT_CONTENT_MISMATCH:
|
case RESULT_CONTENT_MISMATCH:
|
||||||
@ -4430,6 +4469,11 @@ static struct my_option my_long_options[] =
|
|||||||
{"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.",
|
{"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.",
|
||||||
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
#endif
|
#endif
|
||||||
|
{"global-subst", OPT_GLOBAL_SUBST, "argument should be 'X,Y' ;"
|
||||||
|
" substitute string X with another Y accross the whole test's current"
|
||||||
|
" result before comparing with expected result file",
|
||||||
|
(uchar**) &global_subst, (uchar**) &global_subst, 0,
|
||||||
|
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"host", 'h', "Connect to host.", (uchar**) &opt_host, (uchar**) &opt_host, 0,
|
{"host", 'h', "Connect to host.", (uchar**) &opt_host, (uchar**) &opt_host, 0,
|
||||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"include", 'i', "Include SQL before each test case.", (uchar**) &opt_include,
|
{"include", 'i', "Include SQL before each test case.", (uchar**) &opt_include,
|
||||||
@ -4673,6 +4717,16 @@ int parse_args(int argc, char **argv)
|
|||||||
if (tty_password)
|
if (tty_password)
|
||||||
opt_pass= get_tty_password(NullS); /* purify tested */
|
opt_pass= get_tty_password(NullS); /* purify tested */
|
||||||
|
|
||||||
|
if (global_subst != NULL)
|
||||||
|
{
|
||||||
|
char *comma= strstr(global_subst, ",");
|
||||||
|
if (comma == NULL)
|
||||||
|
die("wrong --global-subst, must be X,Y");
|
||||||
|
memcpy(global_subst_from, global_subst, (comma-global_subst));
|
||||||
|
global_subst_from[comma-global_subst]= 0;
|
||||||
|
memcpy(global_subst_to, comma+1, strlen(comma));
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,6 +167,7 @@ our $opt_small_bench= 0;
|
|||||||
our $opt_big_test= 0;
|
our $opt_big_test= 0;
|
||||||
|
|
||||||
our @opt_extra_mysqld_opt;
|
our @opt_extra_mysqld_opt;
|
||||||
|
our @opt_extra_mysqltest_opt;
|
||||||
|
|
||||||
our $opt_compress;
|
our $opt_compress;
|
||||||
our $opt_ssl;
|
our $opt_ssl;
|
||||||
@ -558,6 +559,9 @@ sub command_line_setup () {
|
|||||||
# Extra options used when starting mysqld
|
# Extra options used when starting mysqld
|
||||||
'mysqld=s' => \@opt_extra_mysqld_opt,
|
'mysqld=s' => \@opt_extra_mysqld_opt,
|
||||||
|
|
||||||
|
# Extra options used when starting mysqld
|
||||||
|
'mysqltest=s' => \@opt_extra_mysqltest_opt,
|
||||||
|
|
||||||
# Run test on running server
|
# Run test on running server
|
||||||
'extern' => \$opt_extern,
|
'extern' => \$opt_extern,
|
||||||
'ndb-connectstring=s' => \$opt_ndbconnectstring,
|
'ndb-connectstring=s' => \$opt_ndbconnectstring,
|
||||||
@ -4794,6 +4798,11 @@ sub run_mysqltest ($) {
|
|||||||
mtr_add_arg($args, "--skip-ssl");
|
mtr_add_arg($args, "--skip-ssl");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach my $arg ( @opt_extra_mysqltest_opt )
|
||||||
|
{
|
||||||
|
mtr_add_arg($args, "%s", $arg);
|
||||||
|
}
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
# If embedded server, we create server args to give mysqltest to pass on
|
# If embedded server, we create server args to give mysqltest to pass on
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
set global storage_engine=myisam;
|
||||||
|
set session storage_engine=myisam;
|
||||||
drop table if exists t1,t2,t3,t4,t5,t6;
|
drop table if exists t1,t2,t3,t4,t5,t6;
|
||||||
drop database if exists mysqltest;
|
drop database if exists mysqltest;
|
||||||
create table t1 (a int not null primary key auto_increment, message char(20));
|
create table t1 (a int not null primary key auto_increment, message char(20));
|
||||||
|
@ -5,6 +5,15 @@
|
|||||||
# (Can't be tested with purify :( )
|
# (Can't be tested with purify :( )
|
||||||
#
|
#
|
||||||
|
|
||||||
|
# limit the test to engines which support INSERT DELAYED
|
||||||
|
disable_query_log;
|
||||||
|
--require r/true.require
|
||||||
|
select @@global.storage_engine in
|
||||||
|
("memory","myisam","archive","blackhole") and
|
||||||
|
@@session.storage_engine in
|
||||||
|
("memory","myisam","archive","blackhole") as `TRUE`;
|
||||||
|
enable_query_log;
|
||||||
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
drop table if exists t1;
|
drop table if exists t1;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
@ -2,6 +2,11 @@
|
|||||||
# test of MERGE TABLES
|
# test of MERGE TABLES
|
||||||
#
|
#
|
||||||
|
|
||||||
|
# MERGE tables require MyISAM tables
|
||||||
|
let $default=`select @@global.storage_engine`;
|
||||||
|
set global storage_engine=myisam;
|
||||||
|
set session storage_engine=myisam;
|
||||||
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
drop table if exists t1,t2,t3,t4,t5,t6;
|
drop table if exists t1,t2,t3,t4,t5,t6;
|
||||||
drop database if exists mysqltest;
|
drop database if exists mysqltest;
|
||||||
@ -512,3 +517,9 @@ CHECK TABLE tm1;
|
|||||||
DROP TABLE tm1, t1, t2;
|
DROP TABLE tm1, t1, t2;
|
||||||
|
|
||||||
--echo End of 5.0 tests
|
--echo End of 5.0 tests
|
||||||
|
|
||||||
|
--disable_result_log
|
||||||
|
--disable_query_log
|
||||||
|
eval set global storage_engine=$default;
|
||||||
|
--enable_result_log
|
||||||
|
--enable_query_log
|
||||||
|
@ -923,11 +923,11 @@ bool mysql_truncate(THD *thd, TABLE_LIST *table_list, bool dont_send_ok)
|
|||||||
table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK);
|
table->file->info(HA_STATUS_AUTO | HA_STATUS_NO_LOCK);
|
||||||
|
|
||||||
#ifdef WITH_MARIA_STORAGE_ENGINE
|
#ifdef WITH_MARIA_STORAGE_ENGINE
|
||||||
/*
|
/**
|
||||||
A hack until BUG#30309 is fixed.
|
@todo MARIA_HACK until BUG#30309 is fixed.
|
||||||
Had to make this, otherwise tests "temp_table.test" and "truncate.test"
|
Had to make this, otherwise tests "temp_table.test" and "truncate.test"
|
||||||
crashes server at shutdown when using Maria tables: a temporary table is
|
crashes server at shutdown when using Maria tables: a temporary table
|
||||||
correctly created as non-transactional but then, when truncated, is
|
is correctly created as non-transactional but then, when truncated, is
|
||||||
recreated as transactional.
|
recreated as transactional.
|
||||||
*/
|
*/
|
||||||
if (table_type->db_type == DB_TYPE_MARIA)
|
if (table_type->db_type == DB_TYPE_MARIA)
|
||||||
|
@ -2425,9 +2425,10 @@ void update_create_info_from_table(HA_CREATE_INFO *create_info, TABLE *table)
|
|||||||
create_info->row_type= share->row_type;
|
create_info->row_type= share->row_type;
|
||||||
create_info->default_table_charset= share->table_charset;
|
create_info->default_table_charset= share->table_charset;
|
||||||
create_info->table_charset= 0;
|
create_info->table_charset= 0;
|
||||||
/*
|
/**
|
||||||
See hack in mysql_truncate(); when this is properly fixed, the if() below
|
@todo MARIA_HACK
|
||||||
can be removed, the assignment can always be made.
|
See hack in mysql_truncate(); when this is properly fixed, the if() below
|
||||||
|
can be removed, the assignment can always be made.
|
||||||
*/
|
*/
|
||||||
if (create_info->transactional == HA_CHOICE_UNDEF)
|
if (create_info->transactional == HA_CHOICE_UNDEF)
|
||||||
create_info->transactional= share->transactional;
|
create_info->transactional= share->transactional;
|
||||||
|
@ -746,7 +746,8 @@ int ha_maria::open(const char *name, int mode, uint test_if_locked)
|
|||||||
if (!(file= maria_open(name, mode, test_if_locked | HA_OPEN_FROM_SQL_LAYER)))
|
if (!(file= maria_open(name, mode, test_if_locked | HA_OPEN_FROM_SQL_LAYER)))
|
||||||
return (my_errno ? my_errno : -1);
|
return (my_errno ? my_errno : -1);
|
||||||
|
|
||||||
/*
|
/**
|
||||||
|
@todo ASK_MONTY
|
||||||
This is a protection for the case of a frm and MAI containing incompatible
|
This is a protection for the case of a frm and MAI containing incompatible
|
||||||
table definitions (as in BUG#25908). This was merged from MyISAM.
|
table definitions (as in BUG#25908). This was merged from MyISAM.
|
||||||
But it breaks maria.test and ps_maria.test ("incorrect key file") if the
|
But it breaks maria.test and ps_maria.test ("incorrect key file") if the
|
||||||
@ -2160,7 +2161,8 @@ int ha_maria::create(const char *name, register TABLE *table_arg,
|
|||||||
create_info.data_file_name= ha_create_info->data_file_name;
|
create_info.data_file_name= ha_create_info->data_file_name;
|
||||||
create_info.index_file_name= ha_create_info->index_file_name;
|
create_info.index_file_name= ha_create_info->index_file_name;
|
||||||
#ifdef ASK_MONTY
|
#ifdef ASK_MONTY
|
||||||
/*
|
/**
|
||||||
|
@todo ASK_MONTY
|
||||||
Where "transactional" in the frm and in the engine can go out of sync.
|
Where "transactional" in the frm and in the engine can go out of sync.
|
||||||
Don't we want to do, after the setting, this test:
|
Don't we want to do, after the setting, this test:
|
||||||
if (!create_info.transactional &&
|
if (!create_info.transactional &&
|
||||||
|
@ -2047,9 +2047,10 @@ int maria_repair(HA_CHECK *param, register MARIA_HA *info,
|
|||||||
}
|
}
|
||||||
_ma_reset_status(sort_info.new_info);
|
_ma_reset_status(sort_info.new_info);
|
||||||
#ifdef ASK_MONTY /* cf maria_create() */
|
#ifdef ASK_MONTY /* cf maria_create() */
|
||||||
/*
|
/**
|
||||||
without this call, a REPAIR on an empty table leaves the data file of
|
@todo ASK_MONTY
|
||||||
size 0, which sounds reasonable.
|
without this call, a REPAIR on an empty table leaves the data file of
|
||||||
|
size 0, which sounds reasonable.
|
||||||
*/
|
*/
|
||||||
if (_ma_initialize_data_file(sort_info.new_info->s, new_file))
|
if (_ma_initialize_data_file(sort_info.new_info->s, new_file))
|
||||||
goto err;
|
goto err;
|
||||||
@ -2272,20 +2273,19 @@ err:
|
|||||||
llstr(sort_param.start_recpos,llbuff));
|
llstr(sort_param.start_recpos,llbuff));
|
||||||
if (sort_info.new_info && sort_info.new_info != sort_info.info)
|
if (sort_info.new_info && sort_info.new_info != sort_info.info)
|
||||||
{
|
{
|
||||||
#ifdef ASK_MONTY
|
/**
|
||||||
/*
|
@todo ASK_MONTY
|
||||||
grepping for "dfile.file="
|
grepping for "dfile.file="
|
||||||
shows several places (ma_check.c, ma_panic.c, ma_extra.c) where we
|
shows several places (ma_check.c, ma_panic.c, ma_extra.c) where we
|
||||||
modify dfile.file without modifying share->bitmap.file.file; those
|
modify dfile.file without modifying share->bitmap.file.file; those
|
||||||
sound like bugs because the two variables are normally copies of each
|
sound like bugs because the two variables are normally copies of each
|
||||||
other in BLOCK_RECORD (and in other record formats it does not hurt to
|
other in BLOCK_RECORD (and in other record formats it does not hurt
|
||||||
change the unused share->bitmap.file.file).
|
to change the unused share->bitmap.file.file).
|
||||||
It does matter, because if we close dfile.file, set dfile.file to -1,
|
It does matter, because if we close dfile.file, set dfile.file to -1,
|
||||||
but leave bitmap.file.file to its positive value, maria_close() will
|
but leave bitmap.file.file to its positive value, maria_close() will
|
||||||
close a file which it is not allowed to (maybe even a file in another
|
close a file which it is not allowed to (maybe even a file in another
|
||||||
engine or mysqld!).
|
engine or mysqld!).
|
||||||
*/
|
*/
|
||||||
#endif
|
|
||||||
sort_info.new_info->dfile.file= -1;
|
sort_info.new_info->dfile.file= -1;
|
||||||
maria_close(sort_info.new_info);
|
maria_close(sort_info.new_info);
|
||||||
}
|
}
|
||||||
|
@ -1041,7 +1041,8 @@ int maria_create(const char *name, enum data_file_type datafile_type,
|
|||||||
goto err;
|
goto err;
|
||||||
errpos=3;
|
errpos=3;
|
||||||
|
|
||||||
/*
|
/**
|
||||||
|
@todo ASK_MONTY
|
||||||
QQ: this sets data_file_length from 0 to 8192, but we wrote the state
|
QQ: this sets data_file_length from 0 to 8192, but we wrote the state
|
||||||
already to the index file (because:
|
already to the index file (because:
|
||||||
- log record is built from index header so state must be written before
|
- log record is built from index header so state must be written before
|
||||||
|
Reference in New Issue
Block a user