mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge
This commit is contained in:
@ -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)
|
|||||||
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)
|
|||||||
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:
|
|||||||
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)),
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
Need to grab affected rows information before getting
|
Need to grab affected rows information before getting
|
||||||
warnings here
|
warnings here
|
||||||
*/
|
*/
|
||||||
|
if (!disable_info)
|
||||||
|
affected_rows= mysql_affected_rows(mysql);
|
||||||
|
|
||||||
|
if (!disable_warnings)
|
||||||
{
|
{
|
||||||
ulonglong affected_rows;
|
/* Get the warnings from execute */
|
||||||
LINT_INIT(affected_rows);
|
|
||||||
|
|
||||||
if (!disable_info)
|
/* Append warnings to ds - if there are any */
|
||||||
affected_rows= mysql_affected_rows(mysql);
|
if (append_warnings(&ds_execute_warnings, mysql) ||
|
||||||
|
ds_execute_warnings.length ||
|
||||||
if (!disable_warnings)
|
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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
|
|||||||
}
|
}
|
||||||
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;
|
|||||||
|
|
||||||
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 {
|
|||||||
{
|
{
|
||||||
# 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 {
|
|||||||
# 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 {
|
|||||||
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 ($$) {
|
|||||||
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 @@
|
|||||||
# 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 (
|
|||||||
)
|
)
|
||||||
;
|
;
|
||||||
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
|
|||||||
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';
|
|||||||
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;
|
|||||||
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();
|
|||||||
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');
|
|||||||
|
|
||||||
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';
|
|||||||
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';
|
|||||||
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;
|
|||||||
|
|
||||||
# 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;
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
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.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
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()
|
|||||||
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)
|
|||||||
{
|
{
|
||||||
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)
|
|||||||
/* 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)
|
|||||||
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)
|
|||||||
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 \
|
|||||||
$(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
|
||||||
|
Reference in New Issue
Block a user