Commit 82e910d1 authored by Michael Widenius's avatar Michael Widenius

Merge with maria-5.1-federatedx; A patch to fix bugs in federatedx and enable federated_server.test

Author: Antony Curtis
License: BSD


client/mysql.cc:
  Reset variable if CTRL-C was used to kill running query, so that the user can do it again
client/mysqlcheck.c:
  Indentation fix
client/mysqlslap.c:
  Indentation fixes
client/mysqltest.cc:
  Make testing of commands safer by also testing length
  Removed not used variable
  Fixed indentation to be as it was before last patch
mysql-test/lib/mtr_report.pm:
  Fixed typo
mysql-test/mysql-test-run.pl:
  Merge (Align code with default mysql-tes-run.pl)
mysql-test/suite/federated/disabled.def:
  Removed test case
storage/federatedx/ha_federatedx.cc:
  Removed my changes and applied Antony's instead
parents 4c14f9f2 fb8a529d
...@@ -1280,7 +1280,6 @@ sig_handler handle_sigint(int sig) ...@@ -1280,7 +1280,6 @@ sig_handler handle_sigint(int sig)
char kill_buffer[40]; char kill_buffer[40];
MYSQL *kill_mysql= NULL; MYSQL *kill_mysql= NULL;
/* terminate if no query being executed, or we already tried interrupting */
/* terminate if no query being executed, or we already tried interrupting */ /* terminate if no query being executed, or we already tried interrupting */
if (!executing_query || (interrupted_query == 2)) if (!executing_query || (interrupted_query == 2))
{ {
...@@ -1296,6 +1295,7 @@ sig_handler handle_sigint(int sig) ...@@ -1296,6 +1295,7 @@ sig_handler handle_sigint(int sig)
goto err; goto err;
} }
/* First time try to kill the query, second time the connection */
interrupted_query++; interrupted_query++;
/* mysqld < 5 does not understand KILL QUERY, skip to KILL CONNECTION */ /* mysqld < 5 does not understand KILL QUERY, skip to KILL CONNECTION */
...@@ -1306,10 +1306,13 @@ sig_handler handle_sigint(int sig) ...@@ -1306,10 +1306,13 @@ sig_handler handle_sigint(int sig)
sprintf(kill_buffer, "KILL %s%lu", sprintf(kill_buffer, "KILL %s%lu",
(interrupted_query == 1) ? "QUERY " : "", (interrupted_query == 1) ? "QUERY " : "",
mysql_thread_id(&mysql)); mysql_thread_id(&mysql));
tee_fprintf(stdout, "Ctrl-C -- sending \"%s\" to server ...\n", kill_buffer); if (verbose)
tee_fprintf(stdout, "Ctrl-C -- sending \"%s\" to server ...\n",
kill_buffer);
mysql_real_query(kill_mysql, kill_buffer, (uint) strlen(kill_buffer)); mysql_real_query(kill_mysql, kill_buffer, (uint) strlen(kill_buffer));
mysql_close(kill_mysql); mysql_close(kill_mysql);
tee_fprintf(stdout, "Ctrl-C -- query aborted.\n"); tee_fprintf(stdout, "Ctrl-C -- query killed. Continuing normally.\n");
interrupted_query= 0;
return; return;
...@@ -1322,7 +1325,6 @@ sig_handler handle_sigint(int sig) ...@@ -1322,7 +1325,6 @@ sig_handler handle_sigint(int sig)
handler called mysql_end(). handler called mysql_end().
*/ */
mysql_thread_end(); mysql_thread_end();
return;
#else #else
mysql_end(sig); mysql_end(sig);
#endif #endif
...@@ -2882,13 +2884,8 @@ com_help(String *buffer __attribute__((unused)), ...@@ -2882,13 +2884,8 @@ com_help(String *buffer __attribute__((unused)),
return com_server_help(buffer,line,help_arg); return com_server_help(buffer,line,help_arg);
} }
put_info("\nFor information about MySQL products and services, visit:\n" put_info("\nGeneral information about MariaDB can be found at\n"
" http://www.mysql.com/\n" "http://askmonty.org/wiki/index.php/Manual:Contents\n", INFO_INFO);
"For developer information, including the MySQL Reference Manual, "
"visit:\n"
" http://dev.mysql.com/\n"
"To buy MySQL Enterprise support, training, or other products, visit:\n"
" https://shop.mysql.com/\n", INFO_INFO);
put_info("List of all MySQL commands:", INFO_INFO); put_info("List of all MySQL commands:", INFO_INFO);
if (!named_cmds) if (!named_cmds)
put_info("Note that all text commands must be first on line and end with ';'",INFO_INFO); put_info("Note that all text commands must be first on line and end with ';'",INFO_INFO);
......
...@@ -857,7 +857,8 @@ int main(int argc, char **argv) ...@@ -857,7 +857,8 @@ int main(int argc, char **argv)
if (!opt_write_binlog) if (!opt_write_binlog)
{ {
if (disable_binlog()) { if (disable_binlog())
{
first_error= 1; first_error= 1;
goto end; goto end;
} }
......
...@@ -472,11 +472,10 @@ void concurrency_loop(MYSQL *mysql, uint current, option_string *eptr) ...@@ -472,11 +472,10 @@ void concurrency_loop(MYSQL *mysql, uint current, option_string *eptr)
if (commit_rate) if (commit_rate)
run_query(mysql, "SET AUTOCOMMIT=0", strlen("SET AUTOCOMMIT=0")); run_query(mysql, "SET AUTOCOMMIT=0", strlen("SET AUTOCOMMIT=0"));
if (pre_system) if (pre_system && (sysret= system(pre_system)) != 0)
if ((sysret= system(pre_system)) != 0) fprintf(stderr,
fprintf(stderr, "Warning: Execution of pre_system option returned %d.\n",
"Warning: Execution of pre_system option returned %d.\n", sysret);
sysret);
/* /*
Pre statements are always run after all other logic so they can Pre statements are always run after all other logic so they can
...@@ -490,11 +489,10 @@ void concurrency_loop(MYSQL *mysql, uint current, option_string *eptr) ...@@ -490,11 +489,10 @@ void concurrency_loop(MYSQL *mysql, uint current, option_string *eptr)
if (post_statements) if (post_statements)
run_statements(mysql, post_statements); run_statements(mysql, post_statements);
if (post_system) if (post_system && (sysret= system(post_system)) != 0)
if ((sysret= system(post_system)) != 0) fprintf(stderr,
fprintf(stderr, "Warning: Execution of post_system option returned %d.\n",
"Warning: Execution of post_system option returned %d.\n", sysret);
sysret);
/* We are finished with this run */ /* We are finished with this run */
if (auto_generate_sql_autoincrement || auto_generate_sql_guid_primary) if (auto_generate_sql_autoincrement || auto_generate_sql_guid_primary)
drop_primary_key_list(); drop_primary_key_list();
......
...@@ -3497,9 +3497,10 @@ void do_diff_files(struct st_command *command) ...@@ -3497,9 +3497,10 @@ void do_diff_files(struct st_command *command)
if ((error= compare_files(ds_filename.str, ds_filename2.str)) && if ((error= compare_files(ds_filename.str, ds_filename2.str)) &&
match_expected_error(command, error, NULL) < 0) match_expected_error(command, error, NULL) < 0)
{ {
/* Compare of the two files failed, append them to output /*
so the failure can be analyzed, but only if it was not Compare of the two files failed, append them to output
expected to fail. so the failure can be analyzed, but only if it was not
expected to fail.
*/ */
show_diff(&ds_res, ds_filename.str, ds_filename2.str); show_diff(&ds_res, ds_filename.str, ds_filename2.str);
log_file.write(&ds_res); log_file.write(&ds_res);
...@@ -5013,7 +5014,8 @@ void do_connect(struct st_command *command) ...@@ -5013,7 +5014,8 @@ void do_connect(struct st_command *command)
con_options= ds_options.str; con_options= ds_options.str;
while (*con_options) while (*con_options)
{ {
char* end; size_t length;
char *end;
/* Step past any spaces in beginning of option*/ /* Step past any spaces in beginning of option*/
while (*con_options && my_isspace(charset_info, *con_options)) while (*con_options && my_isspace(charset_info, *con_options))
con_options++; con_options++;
...@@ -5021,13 +5023,14 @@ void do_connect(struct st_command *command) ...@@ -5021,13 +5023,14 @@ void do_connect(struct st_command *command)
end= con_options; end= con_options;
while (*end && !my_isspace(charset_info, *end)) while (*end && !my_isspace(charset_info, *end))
end++; end++;
if (!strncmp(con_options, "SSL", 3)) length= (size_t) (end - con_options);
if (length == 3 && !strncmp(con_options, "SSL", 3))
con_ssl= 1; con_ssl= 1;
else if (!strncmp(con_options, "COMPRESS", 8)) else if (length == 8 && !strncmp(con_options, "COMPRESS", 8))
con_compress= 1; con_compress= 1;
else if (!strncmp(con_options, "PIPE", 4)) else if (length == 4 && !strncmp(con_options, "PIPE", 4))
con_pipe= 1; con_pipe= 1;
else if (!strncmp(con_options, "SHM", 3)) else if (length == 3 && !strncmp(con_options, "SHM", 3))
con_shm= 1; con_shm= 1;
else else
die("Illegal option to connect: %.*s", die("Illegal option to connect: %.*s",
...@@ -5096,14 +5099,13 @@ void do_connect(struct st_command *command) ...@@ -5096,14 +5099,13 @@ void do_connect(struct st_command *command)
mysql_options(&con_slot->mysql, MYSQL_SHARED_MEMORY_BASE_NAME, ds_shm.str); mysql_options(&con_slot->mysql, MYSQL_SHARED_MEMORY_BASE_NAME, ds_shm.str);
mysql_options(&con_slot->mysql, MYSQL_OPT_PROTOCOL, &protocol); mysql_options(&con_slot->mysql, MYSQL_OPT_PROTOCOL, &protocol);
} }
else if(shared_memory_base_name) else if (shared_memory_base_name)
{ {
mysql_options(&con_slot->mysql, MYSQL_SHARED_MEMORY_BASE_NAME, mysql_options(&con_slot->mysql, MYSQL_SHARED_MEMORY_BASE_NAME,
shared_memory_base_name); shared_memory_base_name);
} }
#endif #endif
/* Use default db name */ /* Use default db name */
if (ds_database.length == 0) if (ds_database.length == 0)
dynstr_set(&ds_database, opt_db); dynstr_set(&ds_database, opt_db);
...@@ -6879,10 +6881,8 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command, ...@@ -6879,10 +6881,8 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command,
MYSQL_STMT *stmt; MYSQL_STMT *stmt;
DYNAMIC_STRING ds_prepare_warnings; DYNAMIC_STRING ds_prepare_warnings;
DYNAMIC_STRING ds_execute_warnings; DYNAMIC_STRING ds_execute_warnings;
ulonglong affected_rows;
DBUG_ENTER("run_query_stmt"); DBUG_ENTER("run_query_stmt");
DBUG_PRINT("query", ("'%-.60s'", query)); DBUG_PRINT("query", ("'%-.60s'", query));
LINT_INIT(affected_rows);
/* /*
Init a new stmt if it's not already one created for this connection Init a new stmt if it's not already one created for this connection
...@@ -6981,6 +6981,9 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command, ...@@ -6981,6 +6981,9 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command,
handle_no_error(command); handle_no_error(command);
if (!disable_result_log) if (!disable_result_log)
{ {
ulonglong affected_rows;
LINT_INIT(affected_rows);
/* /*
Not all statements creates a result set. If there is one we can Not all statements creates a result set. If there is one we can
now create another normal result set that contains the meta now create another normal result set that contains the meta
...@@ -7026,39 +7029,33 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command, ...@@ -7026,39 +7029,33 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command,
Need to grab affected rows information before getting Need to grab affected rows information before getting
warnings here warnings here
*/ */
{ if (!disable_info)
ulonglong affected_rows; affected_rows= mysql_affected_rows(mysql);
LINT_INIT(affected_rows);
if (!disable_info) if (!disable_warnings)
affected_rows= mysql_affected_rows(mysql); {
/* Get the warnings from execute */
if (!disable_warnings) /* Append warnings to ds - if there are any */
if (append_warnings(&ds_execute_warnings, mysql) ||
ds_execute_warnings.length ||
ds_prepare_warnings.length ||
ds_warnings->length)
{ {
/* Get the warnings from execute */ dynstr_append_mem(ds, "Warnings:\n", 10);
if (ds_warnings->length)
/* Append warnings to ds - if there are any */ dynstr_append_mem(ds, ds_warnings->str,
if (append_warnings(&ds_execute_warnings, mysql) || ds_warnings->length);
ds_execute_warnings.length || if (ds_prepare_warnings.length)
ds_prepare_warnings.length || dynstr_append_mem(ds, ds_prepare_warnings.str,
ds_warnings->length) ds_prepare_warnings.length);
{ if (ds_execute_warnings.length)
dynstr_append_mem(ds, "Warnings:\n", 10); dynstr_append_mem(ds, ds_execute_warnings.str,
if (ds_warnings->length) ds_execute_warnings.length);
dynstr_append_mem(ds, ds_warnings->str,
ds_warnings->length);
if (ds_prepare_warnings.length)
dynstr_append_mem(ds, ds_prepare_warnings.str,
ds_prepare_warnings.length);
if (ds_execute_warnings.length)
dynstr_append_mem(ds, ds_execute_warnings.str,
ds_execute_warnings.length);
}
} }
if (!disable_info)
append_info(ds, affected_rows, mysql_info(mysql));
} }
if (!disable_info)
append_info(ds, affected_rows, mysql_info(mysql));
} }
end: end:
...@@ -7235,7 +7232,6 @@ void run_query(struct st_connection *cn, struct st_command *command, int flags) ...@@ -7235,7 +7232,6 @@ void run_query(struct st_connection *cn, struct st_command *command, int flags)
} }
dynstr_free(&query_str); dynstr_free(&query_str);
} }
if (sp_protocol_enabled && if (sp_protocol_enabled &&
...@@ -7662,6 +7658,7 @@ int main(int argc, char **argv) ...@@ -7662,6 +7658,7 @@ int main(int argc, char **argv)
my_bool q_send_flag= 0, abort_flag= 0; my_bool q_send_flag= 0, abort_flag= 0;
uint command_executed= 0, last_command_executed= 0; uint command_executed= 0, last_command_executed= 0;
char save_file[FN_REFLEN]; char save_file[FN_REFLEN];
bool empty_result= FALSE;
MY_INIT(argv[0]); MY_INIT(argv[0]);
save_file[0]= 0; save_file[0]= 0;
...@@ -7819,6 +7816,7 @@ int main(int argc, char **argv) ...@@ -7819,6 +7816,7 @@ int main(int argc, char **argv)
verbose_msg("Start processing test commands from '%s' ...", cur_file->file_name); verbose_msg("Start processing test commands from '%s' ...", cur_file->file_name);
while (!read_command(&command) && !abort_flag) while (!read_command(&command) && !abort_flag)
{ {
my_bool ok_to_do;
int current_line_inc = 1, processed = 0; int current_line_inc = 1, processed = 0;
if (command->type == Q_UNKNOWN || command->type == Q_COMMENT_WITH_COMMAND) if (command->type == Q_UNKNOWN || command->type == Q_COMMENT_WITH_COMMAND)
get_command_type(command); get_command_type(command);
...@@ -7831,7 +7829,7 @@ int main(int argc, char **argv) ...@@ -7831,7 +7829,7 @@ int main(int argc, char **argv)
command->type= Q_COMMENT; command->type= Q_COMMENT;
} }
my_bool ok_to_do= cur_block->ok; ok_to_do= cur_block->ok;
/* /*
Some commands need to be "done" the first time if they may get Some commands need to be "done" the first time if they may get
re-iterated over in a true context. This can only happen if there's re-iterated over in a true context. This can only happen if there's
...@@ -8167,8 +8165,6 @@ int main(int argc, char **argv) ...@@ -8167,8 +8165,6 @@ int main(int argc, char **argv)
if (parsing_disabled) if (parsing_disabled)
die("Test ended with parsing disabled"); die("Test ended with parsing disabled");
my_bool empty_result= FALSE;
/* /*
The whole test has been executed _sucessfully_. The whole test has been executed _sucessfully_.
Time to compare result or save it to record file. Time to compare result or save it to record file.
......
...@@ -15,7 +15,7 @@ AC_CANONICAL_SYSTEM ...@@ -15,7 +15,7 @@ AC_CANONICAL_SYSTEM
# MySQL version number. # MySQL version number.
# #
# Note: the following line must be parseable by win/configure.js:GetVersion() # Note: the following line must be parseable by win/configure.js:GetVersion()
AM_INIT_AUTOMAKE(mysql, 5.1.41-mariadb-beta) AM_INIT_AUTOMAKE(mysql, 5.1.41-MariaDB-beta)
AM_CONFIG_HEADER([include/config.h:config.h.in]) AM_CONFIG_HEADER([include/config.h:config.h.in])
PROTOCOL_VERSION=10 PROTOCOL_VERSION=10
......
...@@ -388,7 +388,7 @@ MSG ...@@ -388,7 +388,7 @@ MSG
} }
elsif (@$extra_warnings) elsif (@$extra_warnings)
{ {
mtr_error("There were errors/warnings in server logs after running test cases."); mtr_error("There where errors/warnings in server logs after running test cases.");
} }
elsif ($fail) elsif ($fail)
{ {
......
...@@ -201,10 +201,10 @@ my $opt_mark_progress; ...@@ -201,10 +201,10 @@ my $opt_mark_progress;
my $opt_sleep; my $opt_sleep;
my $opt_testcase_timeout= 15; # minutes my $opt_testcase_timeout= 15; # 15 minutes
my $opt_suite_timeout = 300; # minutes my $opt_suite_timeout = 360; # 6 hours
my $opt_shutdown_timeout= 10; # seconds my $opt_shutdown_timeout= 10; # 10 seconds
my $opt_start_timeout = 180; # seconds my $opt_start_timeout = 180; # 180 seconds
sub testcase_timeout { return $opt_testcase_timeout * 60; }; sub testcase_timeout { return $opt_testcase_timeout * 60; };
sub suite_timeout { return $opt_suite_timeout * 60; }; sub suite_timeout { return $opt_suite_timeout * 60; };
...@@ -215,7 +215,7 @@ my $opt_start_dirty; ...@@ -215,7 +215,7 @@ my $opt_start_dirty;
my $start_only; my $start_only;
my $opt_wait_all; my $opt_wait_all;
my $opt_repeat= 1; my $opt_repeat= 1;
my $opt_retry= 3; my $opt_retry= 1;
my $opt_retry_failure= 2; my $opt_retry_failure= 2;
my $opt_strace_client; my $opt_strace_client;
...@@ -612,8 +612,9 @@ sub run_test_server ($$$) { ...@@ -612,8 +612,9 @@ sub run_test_server ($$$) {
my $fake_test= My::Test::read_test($sock); my $fake_test= My::Test::read_test($sock);
my $test_list= join (" ", @{$fake_test->{testnames}}); my $test_list= join (" ", @{$fake_test->{testnames}});
push @$extra_warnings, $test_list; push @$extra_warnings, $test_list;
my $report= $fake_test->{'warnings'};
mtr_report("***Warnings generated in error logs during shutdown ". mtr_report("***Warnings generated in error logs during shutdown ".
"after running tests: $test_list"); "after running tests: $test_list\n\n$report");
$test_failure= 1; $test_failure= 1;
if ( !$opt_force ) { if ( !$opt_force ) {
# Test failure due to warnings, force is off # Test failure due to warnings, force is off
...@@ -1318,6 +1319,8 @@ sub command_line_setup { ...@@ -1318,6 +1319,8 @@ sub command_line_setup {
{ {
# Indicate that we are using debugger # Indicate that we are using debugger
$glob_debugger= 1; $glob_debugger= 1;
$opt_testcase_timeout= 60*60*24; # Don't abort debugging with timeout
$opt_suite_timeout= $opt_testcase_timeout;
$opt_retry= 1; $opt_retry= 1;
$opt_retry_failure= 1; $opt_retry_failure= 1;
...@@ -2150,7 +2153,6 @@ sub environment_setup { ...@@ -2150,7 +2153,6 @@ sub environment_setup {
# Create an environment variable to make it possible # Create an environment variable to make it possible
# to detect that valgrind is being used from test cases # to detect that valgrind is being used from test cases
$ENV{'VALGRIND_TEST'}= $opt_valgrind; $ENV{'VALGRIND_TEST'}= $opt_valgrind;
} }
...@@ -2907,8 +2909,8 @@ sub mysql_install_db { ...@@ -2907,8 +2909,8 @@ sub mysql_install_db {
my $bootstrap_sql_file= "$opt_vardir/tmp/bootstrap.sql"; my $bootstrap_sql_file= "$opt_vardir/tmp/bootstrap.sql";
my $path_sql= my_find_file($install_basedir, my $path_sql= my_find_file($install_basedir,
["mysql", "sql/share", "share/mysql", ["mysql", "sql/share", "share/mariadb",
"share/mariadb", "share", "scripts"], "share/mysql", "share", "scripts"],
"mysql_system_tables.sql", "mysql_system_tables.sql",
NOT_REQUIRED); NOT_REQUIRED);
...@@ -3860,7 +3862,7 @@ sub extract_server_log ($$) { ...@@ -3860,7 +3862,7 @@ sub extract_server_log ($$) {
my ($error_log, $tname) = @_; my ($error_log, $tname) = @_;
# Open the servers .err log file and read all lines # Open the servers .err log file and read all lines
# belonging to current tets into @lines # belonging to current test into @lines
my $Ferr = IO::File->new($error_log) my $Ferr = IO::File->new($error_log)
or mtr_error("Could not open file '$error_log' for reading: $!"); or mtr_error("Could not open file '$error_log' for reading: $!");
...@@ -3999,9 +4001,11 @@ sub extract_warning_lines ($) { ...@@ -3999,9 +4001,11 @@ sub extract_warning_lines ($) {
qr/Slave I\/O: Get master COLLATION_SERVER failed with error:.*/, qr/Slave I\/O: Get master COLLATION_SERVER failed with error:.*/,
qr/Slave I\/O: Get master TIME_ZONE failed with error:.*/, qr/Slave I\/O: Get master TIME_ZONE failed with error:.*/,
qr/Slave I\/O: error reconnecting to master '.*' - retry-time: [1-3] retries/, qr/Slave I\/O: error reconnecting to master '.*' - retry-time: [1-3] retries/,
qr/Error reading packet/,
qr/Slave: Can't drop database.* database doesn't exist/,
); );
my $match_count= 0; my $matched_lines= [];
LINE: foreach my $line ( @lines ) LINE: foreach my $line ( @lines )
{ {
PAT: foreach my $pat ( @patterns ) PAT: foreach my $pat ( @patterns )
...@@ -4013,18 +4017,18 @@ sub extract_warning_lines ($) { ...@@ -4013,18 +4017,18 @@ sub extract_warning_lines ($) {
next LINE if $line =~ $apat; next LINE if $line =~ $apat;
} }
print $Fwarn $line; print $Fwarn $line;
++$match_count; push @$matched_lines, $line;
last PAT; last PAT;
} }
} }
} }
$Fwarn = undef; # Close file $Fwarn = undef; # Close file
if ($match_count > 0 && if (scalar(@$matched_lines) > 0 &&
defined($last_warning_position->{$error_log}{test_names})) { defined($last_warning_position->{$error_log}{test_names})) {
return $last_warning_position->{$error_log}{test_names}; return ($last_warning_position->{$error_log}{test_names}, $matched_lines);
} else { } else {
return []; return ([], $matched_lines);
} }
} }
...@@ -4201,14 +4205,18 @@ sub check_warnings ($) { ...@@ -4201,14 +4205,18 @@ sub check_warnings ($) {
sub check_warnings_post_shutdown { sub check_warnings_post_shutdown {
my ($server_socket)= @_; my ($server_socket)= @_;
my $testname_hash= { }; my $testname_hash= { };
my $report= '';
foreach my $mysqld ( mysqlds()) foreach my $mysqld ( mysqlds())
{ {
my $testlist= extract_warning_lines($mysqld->value('#log-error')); my ($testlist, $match_lines)=
extract_warning_lines($mysqld->value('#log-error'));
$testname_hash->{$_}= 1 for @$testlist; $testname_hash->{$_}= 1 for @$testlist;
$report.= join('', @$match_lines);
} }
my @warning_tests= keys(%$testname_hash); my @warning_tests= keys(%$testname_hash);
if (@warning_tests) { if (@warning_tests) {
my $fake_test= My::Test->new(testnames => \@warning_tests); my $fake_test= My::Test->new(testnames => \@warning_tests);
$fake_test->{'warnings'}= $report;
$fake_test->write_test($server_socket, 'WARNINGS'); $fake_test->write_test($server_socket, 'WARNINGS');
} }
} }
......
...@@ -9,5 +9,4 @@ ...@@ -9,5 +9,4 @@
# Do not use any TAB characters for whitespace. # Do not use any TAB characters for whitespace.
# #
############################################################################## ##############################################################################
federated_server : needs fixup
...@@ -175,6 +175,8 @@ CREATE TABLE db_bogus.t1 ( ...@@ -175,6 +175,8 @@ CREATE TABLE db_bogus.t1 (
) )
; ;
INSERT INTO db_bogus.t1 VALUES ('2','this is bogus'); INSERT INTO db_bogus.t1 VALUES ('2','this is bogus');
create user test_fed@localhost identified by 'foo';
grant all on db_legitimate.* to test_fed@localhost;
create server 's1' foreign data wrapper 'mysql' options create server 's1' foreign data wrapper 'mysql' options
(HOST '127.0.0.1', (HOST '127.0.0.1',
DATABASE 'db_legitimate', DATABASE 'db_legitimate',
...@@ -211,15 +213,14 @@ id name ...@@ -211,15 +213,14 @@ id name
alter server s1 options (database 'db_bogus'); alter server s1 options (database 'db_bogus');
flush tables; flush tables;
select * from federated.t1; select * from federated.t1;
id name ERROR HY000: There was a problem processing the query on the foreign data source. Data source error: : 1044 : Access denied for user 'test_fed'@'localhost' to databa
2 this is bogus
drop server if exists 's1'; drop server if exists 's1';
ERROR 42000: Access denied; you need the SUPER privilege for this operation ERROR 42000: Access denied; you need the SUPER privilege for this operation
create server 's1' foreign data wrapper 'mysql' options create server 's1' foreign data wrapper 'mysql' options
(HOST '127.0.0.1', (HOST '127.0.0.1',
DATABASE 'db_legitimate', DATABASE 'db_legitimate',
USER 'root', USER 'test_fed',
PASSWORD '', PASSWORD 'foo',
PORT SLAVE_PORT, PORT SLAVE_PORT,
SOCKET '', SOCKET '',
OWNER 'root'); OWNER 'root');
...@@ -228,8 +229,8 @@ drop server 's1'; ...@@ -228,8 +229,8 @@ drop server 's1';
create server 's1' foreign data wrapper 'mysql' options create server 's1' foreign data wrapper 'mysql' options
(HOST '127.0.0.1', (HOST '127.0.0.1',
DATABASE 'db_legitimate', DATABASE 'db_legitimate',
USER 'root', USER 'test_fed',
PASSWORD '', PASSWORD 'foo',
PORT SLAVE_PORT, PORT SLAVE_PORT,
SOCKET '', SOCKET '',
OWNER 'root'); OWNER 'root');
...@@ -237,6 +238,7 @@ flush tables; ...@@ -237,6 +238,7 @@ flush tables;
select * from federated.t1; select * from federated.t1;
id name id name
1 this is legitimate 1 this is legitimate
drop user test_fed@localhost;
drop database db_legitimate; drop database db_legitimate;
drop database db_bogus; drop database db_bogus;
drop user guest_super@localhost; drop user guest_super@localhost;
...@@ -275,6 +277,6 @@ call p1(); ...@@ -275,6 +277,6 @@ call p1();
drop procedure p1; drop procedure p1;
drop server if exists s; drop server if exists s;
DROP TABLE IF EXISTS federated.t1; DROP TABLE IF EXISTS federated.t1;
DROP DATABASE federated; DROP DATABASE IF EXISTS federated;
DROP TABLE IF EXISTS federated.t1; DROP TABLE IF EXISTS federated.t1;
DROP DATABASE federated; DROP DATABASE IF EXISTS federated;
...@@ -239,6 +239,7 @@ alter server s1 options (database 'db_bogus'); ...@@ -239,6 +239,7 @@ alter server s1 options (database 'db_bogus');
connection master; connection master;
flush tables; flush tables;
--error ER_QUERY_ON_FOREIGN_DATA_SOURCE
select * from federated.t1; select * from federated.t1;
connection conn_select; connection conn_select;
...@@ -249,8 +250,8 @@ drop server if exists 's1'; ...@@ -249,8 +250,8 @@ drop server if exists 's1';
eval create server 's1' foreign data wrapper 'mysql' options eval create server 's1' foreign data wrapper 'mysql' options
(HOST '127.0.0.1', (HOST '127.0.0.1',
DATABASE 'db_legitimate', DATABASE 'db_legitimate',
USER 'root', USER 'test_fed',
PASSWORD '', PASSWORD 'foo',
PORT $SLAVE_MYPORT, PORT $SLAVE_MYPORT,
SOCKET '', SOCKET '',
OWNER 'root'); OWNER 'root');
...@@ -261,8 +262,8 @@ drop server 's1'; ...@@ -261,8 +262,8 @@ drop server 's1';
eval create server 's1' foreign data wrapper 'mysql' options eval create server 's1' foreign data wrapper 'mysql' options
(HOST '127.0.0.1', (HOST '127.0.0.1',
DATABASE 'db_legitimate', DATABASE 'db_legitimate',
USER 'root', USER 'test_fed',
PASSWORD '', PASSWORD 'foo',
PORT $SLAVE_MYPORT, PORT $SLAVE_MYPORT,
SOCKET '', SOCKET '',
OWNER 'root'); OWNER 'root');
...@@ -273,6 +274,7 @@ select * from federated.t1; ...@@ -273,6 +274,7 @@ select * from federated.t1;
# clean up test # clean up test
connection slave; connection slave;
drop user test_fed@localhost;
drop database db_legitimate; drop database db_legitimate;
drop database db_bogus; drop database db_bogus;
......
/* /*
Copyright (c) 2008, Patrick Galbraith Copyright (c) 2008-2009, Patrick Galbraith & Antony Curtis
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
...@@ -308,7 +308,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ...@@ -308,7 +308,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#define MYSQL_SERVER 1q #define MYSQL_SERVER 1
#include "mysql_priv.h" #include "mysql_priv.h"
#include <mysql/plugin.h> #include <mysql/plugin.h>
...@@ -1627,7 +1627,13 @@ static int free_server(federatedx_txn *txn, FEDERATEDX_SERVER *server) ...@@ -1627,7 +1627,13 @@ static int free_server(federatedx_txn *txn, FEDERATEDX_SERVER *server)
{ {
MEM_ROOT mem_root; MEM_ROOT mem_root;
txn->close(server); if (!txn)
{
federatedx_txn tmp_txn;
tmp_txn.close(server);
}
else
txn->close(server);
DBUG_ASSERT(server->io_count == 0); DBUG_ASSERT(server->io_count == 0);
...@@ -1785,21 +1791,25 @@ int ha_federatedx::close(void) ...@@ -1785,21 +1791,25 @@ int ha_federatedx::close(void)
if (stored_result) if (stored_result)
retval= free_result(); retval= free_result();
/* Disconnect from mysql. thd may be null during refresh */ /* Disconnect from mysql */
txn= thd ? get_txn(thd, true) : new federatedx_txn(); if (!thd || !(txn= get_txn(thd, true)))
{
federatedx_txn tmp_txn;
tmp_txn.release(&io);
if (txn) DBUG_ASSERT(io == NULL);
if ((error= free_share(&tmp_txn, share)))
retval= error;
}
else
{ {
txn->release(&io); txn->release(&io);
DBUG_ASSERT(io == NULL); DBUG_ASSERT(io == NULL);
if ((error= free_share(txn, share))) if ((error= free_share(txn, share)))
retval= error; retval= error;
if (!thd)
delete txn;
} }
DBUG_RETURN(retval); DBUG_RETURN(retval);
} }
...@@ -2793,14 +2803,16 @@ int ha_federatedx::rnd_end() ...@@ -2793,14 +2803,16 @@ int ha_federatedx::rnd_end()
int ha_federatedx::free_result() int ha_federatedx::free_result()
{ {
int error; int error;
federatedx_io *tmp_io= 0, **iop;
DBUG_ASSERT(stored_result); DBUG_ASSERT(stored_result);
if ((error= txn->acquire(share, FALSE, &io))) if (!*(iop= &io) && (error= txn->acquire(share, TRUE, (iop= &tmp_io))))
{ {
DBUG_ASSERT(0); // Fail when testing DBUG_ASSERT(0); // Fail when testing
return error; return error;
} }
io->free_result(stored_result); (*iop)->free_result(stored_result);
stored_result= 0; stored_result= 0;
txn->release(&tmp_io);
return 0; return 0;
} }
...@@ -2985,7 +2997,7 @@ int ha_federatedx::info(uint flag) ...@@ -2985,7 +2997,7 @@ int ha_federatedx::info(uint flag)
{ {
char error_buffer[FEDERATEDX_QUERY_BUFFER_SIZE]; char error_buffer[FEDERATEDX_QUERY_BUFFER_SIZE];
uint error_code; uint error_code;
federatedx_io *tmp_io= 0; federatedx_io *tmp_io= 0, **iop= 0;
DBUG_ENTER("ha_federatedx::info"); DBUG_ENTER("ha_federatedx::info");
error_code= ER_QUERY_ON_FOREIGN_DATA_SOURCE; error_code= ER_QUERY_ON_FOREIGN_DATA_SOURCE;
...@@ -2993,7 +3005,7 @@ int ha_federatedx::info(uint flag) ...@@ -2993,7 +3005,7 @@ int ha_federatedx::info(uint flag)
/* we want not to show table status if not needed to do so */ /* we want not to show table status if not needed to do so */
if (flag & (HA_STATUS_VARIABLE | HA_STATUS_CONST | HA_STATUS_AUTO)) if (flag & (HA_STATUS_VARIABLE | HA_STATUS_CONST | HA_STATUS_AUTO))
{ {
if ((error_code= txn->acquire(share, TRUE, &tmp_io))) if (!*(iop= &io) && (error_code= txn->acquire(share, TRUE, (iop= &tmp_io))))
goto fail; goto fail;
} }
...@@ -3006,13 +3018,13 @@ int ha_federatedx::info(uint flag) ...@@ -3006,13 +3018,13 @@ int ha_federatedx::info(uint flag)
if (flag & HA_STATUS_CONST) if (flag & HA_STATUS_CONST)
stats.block_size= 4096; stats.block_size= 4096;
if (tmp_io->table_metadata(&stats, share->table_name, if ((*iop)->table_metadata(&stats, share->table_name,
share->table_name_length, flag)) share->table_name_length, flag))
goto error; goto error;
} }
if (flag & HA_STATUS_AUTO) if (flag & HA_STATUS_AUTO)
stats.auto_increment_value= tmp_io->last_insert_id(); stats.auto_increment_value= (*iop)->last_insert_id();
/* /*
If ::info created it's own transaction, close it. This happens in case If ::info created it's own transaction, close it. This happens in case
...@@ -3023,10 +3035,10 @@ int ha_federatedx::info(uint flag) ...@@ -3023,10 +3035,10 @@ int ha_federatedx::info(uint flag)
DBUG_RETURN(0); DBUG_RETURN(0);
error: error:
if (tmp_io) if (iop && *iop)
{ {
my_sprintf(error_buffer, (error_buffer, ": %d : %s", my_sprintf(error_buffer, (error_buffer, ": %d : %s",
tmp_io->error_code(), tmp_io->error_str())); (*iop)->error_code(), (*iop)->error_str()));
my_error(error_code, MYF(0), error_buffer); my_error(error_code, MYF(0), error_buffer);
} }
else else
......
...@@ -24,7 +24,7 @@ LDADD = $(top_builddir)/unittest/mytap/libmytap.a \ ...@@ -24,7 +24,7 @@ LDADD = $(top_builddir)/unittest/mytap/libmytap.a \
$(top_builddir)/strings/libmystrings.a $(top_builddir)/strings/libmystrings.a
EXTRA_DIST = CMakeLists.txt EXTRA_DIST = CMakeLists.txt
noinst_PROGRAMS = bitmap-t base64-t lf-t waiting_threads-t noinst_PROGRAMS = bitmap-t base64-t my_atomic-t lf-t waiting_threads-t
if NEED_THREAD if NEED_THREAD
# my_atomic-t is used to check thread functions, so it is safe to # my_atomic-t is used to check thread functions, so it is safe to
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment