#At lp:maria based on revid:monty@askmonty.org-20091130124224-45xbn8nkmgnu1c2f 2778 Michael Widenius 2009-12-03 [merge] Merge with maria-5.1-federatedx; Antony's patch for federatedx modified: client/mysql.cc client/mysqlcheck.c client/mysqlslap.c client/mysqltest.cc configure.in mysql-test/lib/mtr_report.pm mysql-test/mysql-test-run.pl mysql-test/suite/federated/disabled.def mysql-test/suite/federated/federated_server.result mysql-test/suite/federated/federated_server.test storage/federatedx/ha_federatedx.cc unittest/mysys/Makefile.am per-file messages: 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 === modified file 'client/mysql.cc' --- a/client/mysql.cc 2009-11-16 20:49:51 +0000 +++ b/client/mysql.cc 2009-12-03 11:07:55 +0000 @@ -1281,7 +1281,6 @@ sig_handler handle_sigint(int sig) 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 */ if (!executing_query || (interrupted_query == 2)) { tee_fprintf(stdout, "Ctrl-C -- exit!\n"); @@ -1296,6 +1295,7 @@ sig_handler handle_sigint(int sig) goto err; } + /* First time try to kill the query, second time the connection */ interrupted_query++; /* mysqld < 5 does not understand KILL QUERY, skip to KILL CONNECTION */ @@ -1306,10 +1306,13 @@ sig_handler handle_sigint(int sig) sprintf(kill_buffer, "KILL %s%lu", (interrupted_query == 1) ? "QUERY " : "", 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_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; @@ -1322,7 +1325,6 @@ err: handler called mysql_end(). */ mysql_thread_end(); - return; #else mysql_end(sig); #endif @@ -2882,13 +2884,8 @@ com_help(String *buffer __attribute__((u return com_server_help(buffer,line,help_arg); } - put_info("\nFor information about MySQL products and services, visit:\n" - " http://www.mysql.com/\n" - "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("\nGeneral information about MariaDB can be found at\n" + "http://askmonty.org/wiki/index.php/Manual:Contents\n", INFO_INFO); put_info("List of all MySQL commands:", INFO_INFO); if (!named_cmds) put_info("Note that all text commands must be first on line and end with ';'",INFO_INFO); === modified file 'client/mysqlcheck.c' --- a/client/mysqlcheck.c 2009-09-28 06:24:19 +0000 +++ b/client/mysqlcheck.c 2009-12-03 11:07:55 +0000 @@ -857,7 +857,8 @@ int main(int argc, char **argv) if (!opt_write_binlog) { - if (disable_binlog()) { + if (disable_binlog()) + { first_error= 1; goto end; } === modified file 'client/mysqlslap.c' --- a/client/mysqlslap.c 2009-11-16 20:49:51 +0000 +++ b/client/mysqlslap.c 2009-12-03 11:07:55 +0000 @@ -472,11 +472,10 @@ void concurrency_loop(MYSQL *mysql, uint if (commit_rate) run_query(mysql, "SET AUTOCOMMIT=0", strlen("SET AUTOCOMMIT=0")); - if (pre_system) - if ((sysret= system(pre_system)) != 0) - fprintf(stderr, - "Warning: Execution of pre_system option returned %d.\n", - sysret); + if (pre_system && (sysret= system(pre_system)) != 0) + fprintf(stderr, + "Warning: Execution of pre_system option returned %d.\n", + sysret); /* Pre statements are always run after all other logic so they can @@ -490,11 +489,10 @@ void concurrency_loop(MYSQL *mysql, uint if (post_statements) run_statements(mysql, post_statements); - if (post_system) - if ((sysret= system(post_system)) != 0) - fprintf(stderr, - "Warning: Execution of post_system option returned %d.\n", - sysret); + if (post_system && (sysret= system(post_system)) != 0) + fprintf(stderr, + "Warning: Execution of post_system option returned %d.\n", + sysret); /* We are finished with this run */ if (auto_generate_sql_autoincrement || auto_generate_sql_guid_primary) drop_primary_key_list(); === modified file 'client/mysqltest.cc' --- a/client/mysqltest.cc 2009-11-16 20:49:51 +0000 +++ b/client/mysqltest.cc 2009-12-03 11:07:55 +0000 @@ -3497,9 +3497,10 @@ void do_diff_files(struct st_command *co if ((error= compare_files(ds_filename.str, ds_filename2.str)) && 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 - expected to fail. + /* + Compare of the two files failed, append them to output + 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); log_file.write(&ds_res); @@ -5013,7 +5014,8 @@ void do_connect(struct st_command *comma con_options= ds_options.str; while (*con_options) { - char* end; + size_t length; + char *end; /* Step past any spaces in beginning of option*/ while (*con_options && my_isspace(charset_info, *con_options)) con_options++; @@ -5021,13 +5023,14 @@ void do_connect(struct st_command *comma end= con_options; while (*end && !my_isspace(charset_info, *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; - else if (!strncmp(con_options, "COMPRESS", 8)) + else if (length == 8 && !strncmp(con_options, "COMPRESS", 8)) con_compress= 1; - else if (!strncmp(con_options, "PIPE", 4)) + else if (length == 4 && !strncmp(con_options, "PIPE", 4)) con_pipe= 1; - else if (!strncmp(con_options, "SHM", 3)) + else if (length == 3 && !strncmp(con_options, "SHM", 3)) con_shm= 1; else die("Illegal option to connect: %.*s", @@ -5096,14 +5099,13 @@ void do_connect(struct st_command *comma mysql_options(&con_slot->mysql, MYSQL_SHARED_MEMORY_BASE_NAME, ds_shm.str); 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, - shared_memory_base_name); + shared_memory_base_name); } #endif - /* Use default db name */ if (ds_database.length == 0) dynstr_set(&ds_database, opt_db); @@ -6879,10 +6881,8 @@ void run_query_stmt(MYSQL *mysql, struct MYSQL_STMT *stmt; DYNAMIC_STRING ds_prepare_warnings; DYNAMIC_STRING ds_execute_warnings; - ulonglong affected_rows; DBUG_ENTER("run_query_stmt"); DBUG_PRINT("query", ("'%-.60s'", query)); - LINT_INIT(affected_rows); /* 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 handle_no_error(command); if (!disable_result_log) { + ulonglong affected_rows; + LINT_INIT(affected_rows); + /* Not all statements creates a result set. If there is one we can now create another normal result set that contains the meta @@ -7026,39 +7029,33 @@ void run_query_stmt(MYSQL *mysql, struct Need to grab affected rows information before getting warnings here */ - { - ulonglong affected_rows; - LINT_INIT(affected_rows); + if (!disable_info) + affected_rows= mysql_affected_rows(mysql); - if (!disable_info) - affected_rows= mysql_affected_rows(mysql); + if (!disable_warnings) + { + /* 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 */ - - /* 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) - { - dynstr_append_mem(ds, "Warnings:\n", 10); - if (ds_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); - } + dynstr_append_mem(ds, "Warnings:\n", 10); + if (ds_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: @@ -7235,7 +7232,6 @@ void run_query(struct st_connection *cn, } dynstr_free(&query_str); - } if (sp_protocol_enabled && @@ -7662,6 +7658,7 @@ int main(int argc, char **argv) my_bool q_send_flag= 0, abort_flag= 0; uint command_executed= 0, last_command_executed= 0; char save_file[FN_REFLEN]; + bool empty_result= FALSE; MY_INIT(argv[0]); save_file[0]= 0; @@ -7819,6 +7816,7 @@ int main(int argc, char **argv) verbose_msg("Start processing test commands from '%s' ...", cur_file->file_name); while (!read_command(&command) && !abort_flag) { + my_bool ok_to_do; int current_line_inc = 1, processed = 0; if (command->type == Q_UNKNOWN || command->type == Q_COMMENT_WITH_COMMAND) get_command_type(command); @@ -7831,7 +7829,7 @@ int main(int argc, char **argv) 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 re-iterated over in a true context. This can only happen if there's @@ -8167,8 +8165,6 @@ int main(int argc, char **argv) if (parsing_disabled) die("Test ended with parsing disabled"); - my_bool empty_result= FALSE; - /* The whole test has been executed _sucessfully_. Time to compare result or save it to record file. === modified file 'configure.in' --- a/configure.in 2009-11-16 20:49:51 +0000 +++ b/configure.in 2009-12-03 11:07:55 +0000 @@ -15,7 +15,7 @@ AC_CANONICAL_SYSTEM # MySQL version number. # # 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]) PROTOCOL_VERSION=10 === modified file 'mysql-test/lib/mtr_report.pm' --- a/mysql-test/lib/mtr_report.pm 2009-11-16 20:49:51 +0000 +++ b/mysql-test/lib/mtr_report.pm 2009-12-03 11:07:55 +0000 @@ -388,7 +388,7 @@ MSG } 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) { === modified file 'mysql-test/mysql-test-run.pl' --- a/mysql-test/mysql-test-run.pl 2009-11-27 13:20:59 +0000 +++ b/mysql-test/mysql-test-run.pl 2009-12-03 11:07:55 +0000 @@ -201,10 +201,10 @@ my $opt_mark_progress; my $opt_sleep; -my $opt_testcase_timeout= 15; # minutes -my $opt_suite_timeout = 300; # minutes -my $opt_shutdown_timeout= 10; # seconds -my $opt_start_timeout = 180; # seconds +my $opt_testcase_timeout= 15; # 15 minutes +my $opt_suite_timeout = 360; # 6 hours +my $opt_shutdown_timeout= 10; # 10 seconds +my $opt_start_timeout = 180; # 180 seconds sub testcase_timeout { return $opt_testcase_timeout * 60; }; sub suite_timeout { return $opt_suite_timeout * 60; }; @@ -215,7 +215,7 @@ my $opt_start_dirty; my $start_only; my $opt_wait_all; my $opt_repeat= 1; -my $opt_retry= 3; +my $opt_retry= 1; my $opt_retry_failure= 2; my $opt_strace_client; @@ -612,8 +612,9 @@ sub run_test_server ($$$) { my $fake_test= My::Test::read_test($sock); my $test_list= join (" ", @{$fake_test->{testnames}}); push @$extra_warnings, $test_list; + my $report= $fake_test->{'warnings'}; 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; if ( !$opt_force ) { # Test failure due to warnings, force is off @@ -1318,6 +1319,8 @@ sub command_line_setup { { # Indicate that we are using debugger $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_failure= 1; @@ -2150,7 +2153,6 @@ sub environment_setup { # Create an environment variable to make it possible # to detect that valgrind is being used from test cases $ENV{'VALGRIND_TEST'}= $opt_valgrind; - } @@ -2907,8 +2909,8 @@ sub mysql_install_db { my $bootstrap_sql_file= "$opt_vardir/tmp/bootstrap.sql"; my $path_sql= my_find_file($install_basedir, - ["mysql", "sql/share", "share/mysql", - "share/mariadb", "share", "scripts"], + ["mysql", "sql/share", "share/mariadb", + "share/mysql", "share", "scripts"], "mysql_system_tables.sql", NOT_REQUIRED); @@ -3860,7 +3862,7 @@ sub extract_server_log ($$) { my ($error_log, $tname) = @_; # 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) or mtr_error("Could not open file '$error_log' for reading: $!"); @@ -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 TIME_ZONE failed with error:.*/, 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 ) { PAT: foreach my $pat ( @patterns ) @@ -4013,18 +4017,18 @@ sub extract_warning_lines ($) { next LINE if $line =~ $apat; } print $Fwarn $line; - ++$match_count; + push @$matched_lines, $line; last PAT; } } } $Fwarn = undef; # Close file - if ($match_count > 0 && + if (scalar(@$matched_lines) > 0 && 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 { - return []; + return ([], $matched_lines); } } @@ -4201,14 +4205,18 @@ sub check_warnings ($) { sub check_warnings_post_shutdown { my ($server_socket)= @_; my $testname_hash= { }; + my $report= ''; 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; + $report.= join('', @$match_lines); } my @warning_tests= keys(%$testname_hash); if (@warning_tests) { my $fake_test= My::Test->new(testnames => \@warning_tests); + $fake_test->{'warnings'}= $report; $fake_test->write_test($server_socket, 'WARNINGS'); } } === modified file 'mysql-test/suite/federated/disabled.def' --- a/mysql-test/suite/federated/disabled.def 2009-10-30 18:50:56 +0000 +++ b/mysql-test/suite/federated/disabled.def 2009-11-14 19:33:59 +0000 @@ -9,5 +9,4 @@ # Do not use any TAB characters for whitespace. # ############################################################################## -federated_server : needs fixup === modified file 'mysql-test/suite/federated/federated_server.result' --- a/mysql-test/suite/federated/federated_server.result 2009-10-30 18:50:56 +0000 +++ b/mysql-test/suite/federated/federated_server.result 2009-11-14 19:33:59 +0000 @@ -175,6 +175,8 @@ CREATE TABLE db_bogus.t1 ( ) ; 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 (HOST '127.0.0.1', DATABASE 'db_legitimate', @@ -211,15 +213,14 @@ id name alter server s1 options (database 'db_bogus'); flush tables; select * from federated.t1; -id name -2 this is bogus +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 drop server if exists 's1'; ERROR 42000: Access denied; you need the SUPER privilege for this operation create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', -USER 'root', -PASSWORD '', +USER 'test_fed', +PASSWORD 'foo', PORT SLAVE_PORT, SOCKET '', OWNER 'root'); @@ -228,8 +229,8 @@ drop server 's1'; create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', -USER 'root', -PASSWORD '', +USER 'test_fed', +PASSWORD 'foo', PORT SLAVE_PORT, SOCKET '', OWNER 'root'); @@ -237,6 +238,7 @@ flush tables; select * from federated.t1; id name 1 this is legitimate +drop user test_fed@localhost; drop database db_legitimate; drop database db_bogus; drop user guest_super@localhost; @@ -275,6 +277,6 @@ call p1(); drop procedure p1; drop server if exists s; DROP TABLE IF EXISTS federated.t1; -DROP DATABASE federated; +DROP DATABASE IF EXISTS federated; DROP TABLE IF EXISTS federated.t1; -DROP DATABASE federated; +DROP DATABASE IF EXISTS federated; === modified file 'mysql-test/suite/federated/federated_server.test' --- a/mysql-test/suite/federated/federated_server.test 2009-10-30 18:50:56 +0000 +++ b/mysql-test/suite/federated/federated_server.test 2009-11-14 19:33:59 +0000 @@ -239,6 +239,7 @@ alter server s1 options (database 'db_bo connection master; flush tables; +--error ER_QUERY_ON_FOREIGN_DATA_SOURCE select * from federated.t1; connection conn_select; @@ -249,8 +250,8 @@ drop server if exists 's1'; eval create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', - USER 'root', - PASSWORD '', + USER 'test_fed', + PASSWORD 'foo', PORT $SLAVE_MYPORT, SOCKET '', OWNER 'root'); @@ -261,8 +262,8 @@ drop server 's1'; eval create server 's1' foreign data wrapper 'mysql' options (HOST '127.0.0.1', DATABASE 'db_legitimate', - USER 'root', - PASSWORD '', + USER 'test_fed', + PASSWORD 'foo', PORT $SLAVE_MYPORT, SOCKET '', OWNER 'root'); @@ -273,6 +274,7 @@ select * from federated.t1; # clean up test connection slave; +drop user test_fed@localhost; drop database db_legitimate; drop database db_bogus; === modified file 'storage/federatedx/ha_federatedx.cc' --- a/storage/federatedx/ha_federatedx.cc 2009-11-16 20:49:51 +0000 +++ b/storage/federatedx/ha_federatedx.cc 2009-12-03 11:07:55 +0000 @@ -1,5 +1,5 @@ /* -Copyright (c) 2008, Patrick Galbraith +Copyright (c) 2008-2009, Patrick Galbraith & Antony Curtis All rights reserved. Redistribution and use in source and binary forms, with or without @@ -308,7 +308,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE */ -#define MYSQL_SERVER 1q +#define MYSQL_SERVER 1 #include "mysql_priv.h" #include <mysql/plugin.h> @@ -1627,7 +1627,13 @@ static int free_server(federatedx_txn *t { 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); @@ -1785,21 +1791,25 @@ int ha_federatedx::close(void) if (stored_result) retval= free_result(); - /* Disconnect from mysql. thd may be null during refresh */ - txn= thd ? get_txn(thd, true) : new federatedx_txn(); + /* Disconnect from mysql */ + 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); - DBUG_ASSERT(io == NULL); if ((error= free_share(txn, share))) retval= error; - - if (!thd) - delete txn; - } DBUG_RETURN(retval); } @@ -2793,14 +2803,16 @@ int ha_federatedx::rnd_end() int ha_federatedx::free_result() { int error; + federatedx_io *tmp_io= 0, **iop; 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 return error; } - io->free_result(stored_result); + (*iop)->free_result(stored_result); stored_result= 0; + txn->release(&tmp_io); return 0; } @@ -2985,7 +2997,7 @@ int ha_federatedx::info(uint flag) { char error_buffer[FEDERATEDX_QUERY_BUFFER_SIZE]; uint error_code; - federatedx_io *tmp_io= 0; + federatedx_io *tmp_io= 0, **iop= 0; DBUG_ENTER("ha_federatedx::info"); error_code= ER_QUERY_ON_FOREIGN_DATA_SOURCE; @@ -2993,7 +3005,7 @@ int ha_federatedx::info(uint flag) /* 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 ((error_code= txn->acquire(share, TRUE, &tmp_io))) + if (!*(iop= &io) && (error_code= txn->acquire(share, TRUE, (iop= &tmp_io)))) goto fail; } @@ -3006,13 +3018,13 @@ int ha_federatedx::info(uint flag) if (flag & HA_STATUS_CONST) 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)) goto error; } 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 @@ -3023,10 +3035,10 @@ int ha_federatedx::info(uint flag) DBUG_RETURN(0); error: - if (tmp_io) + if (iop && *iop) { 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); } else === modified file 'unittest/mysys/Makefile.am' --- a/unittest/mysys/Makefile.am 2009-11-26 08:44:38 +0000 +++ b/unittest/mysys/Makefile.am 2009-12-03 11:07:55 +0000 @@ -24,7 +24,7 @@ LDADD = $(top_builddir)/unittest/mytap $(top_builddir)/strings/libmystrings.a 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 # my_atomic-t is used to check thread functions, so it is safe to