Commit 65ca2521 authored by Michael Widenius's avatar Michael Widenius

Merge

parents 27f4f67b 82e910d1
...@@ -1279,7 +1279,6 @@ sig_handler handle_sigint(int sig) ...@@ -1279,7 +1279,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))
{ {
...@@ -1295,6 +1294,7 @@ sig_handler handle_sigint(int sig) ...@@ -1295,6 +1294,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 */
...@@ -1305,10 +1305,13 @@ sig_handler handle_sigint(int sig) ...@@ -1305,10 +1305,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;
...@@ -1321,7 +1324,6 @@ err: ...@@ -1321,7 +1324,6 @@ err:
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
...@@ -2881,13 +2883,8 @@ com_help(String *buffer __attribute__((unused)), ...@@ -2881,13 +2883,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,8 +472,7 @@ void concurrency_loop(MYSQL *mysql, uint current, option_string *eptr) ...@@ -472,8 +472,7 @@ 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);
...@@ -490,8 +489,7 @@ void concurrency_loop(MYSQL *mysql, uint current, option_string *eptr) ...@@ -490,8 +489,7 @@ 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);
......
...@@ -3497,7 +3497,8 @@ void do_diff_files(struct st_command *command) ...@@ -3497,7 +3497,8 @@ 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 /*
Compare of the two files failed, append them to output
so the failure can be analyzed, but only if it was not so the failure can be analyzed, but only if it was not
expected to fail. expected to fail.
*/ */
...@@ -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,10 +7029,6 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command, ...@@ -7026,10 +7029,6 @@ 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
*/ */
{
ulonglong affected_rows;
LINT_INIT(affected_rows);
if (!disable_info) if (!disable_info)
affected_rows= mysql_affected_rows(mysql); affected_rows= mysql_affected_rows(mysql);
...@@ -7055,11 +7054,9 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command, ...@@ -7055,11 +7054,9 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command,
ds_execute_warnings.length); ds_execute_warnings.length);
} }
} }
if (!disable_info) if (!disable_info)
append_info(ds, affected_rows, mysql_info(mysql)); append_info(ds, affected_rows, mysql_info(mysql));
} }
}
end: end:
if (!disable_warnings) if (!disable_warnings)
...@@ -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.
......
...@@ -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; };
...@@ -1319,6 +1319,8 @@ sub command_line_setup { ...@@ -1319,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;
...@@ -2151,7 +2153,6 @@ sub environment_setup { ...@@ -2151,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;
} }
...@@ -2908,8 +2909,8 @@ sub mysql_install_db { ...@@ -2908,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);
...@@ -3861,7 +3862,7 @@ sub extract_server_log ($$) { ...@@ -3861,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: $!");
......
...@@ -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,6 +1627,12 @@ static int free_server(federatedx_txn *txn, FEDERATEDX_SERVER *server) ...@@ -1627,6 +1627,12 @@ static int free_server(federatedx_txn *txn, FEDERATEDX_SERVER *server)
{ {
MEM_ROOT mem_root; MEM_ROOT mem_root;
if (!txn)
{
federatedx_txn tmp_txn;
tmp_txn.close(server);
}
else
txn->close(server); 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;
if (txn) tmp_txn.release(&io);
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