summaryrefslogtreecommitdiff
path: root/client/mysqltest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'client/mysqltest.cc')
-rw-r--r--client/mysqltest.cc307
1 files changed, 201 insertions, 106 deletions
diff --git a/client/mysqltest.cc b/client/mysqltest.cc
index 2a63ab61590..1fecd4fa7ac 100644
--- a/client/mysqltest.cc
+++ b/client/mysqltest.cc
@@ -68,7 +68,7 @@
#define MAX_COLUMNS 256
#define MAX_EMBEDDED_SERVER_ARGS 64
#define MAX_DELIMITER_LENGTH 16
-#define DEFAULT_MAX_CONN 128
+#define DEFAULT_MAX_CONN 64
/* Flags controlling send and reap */
#define QUERY_SEND_FLAG 1
@@ -134,6 +134,7 @@ static char TMPDIR[FN_REFLEN];
static char global_subst_from[200];
static char global_subst_to[200];
static char *global_subst= NULL;
+static MEM_ROOT require_file_root;
/* Block stack */
enum block_cmd {
@@ -243,7 +244,7 @@ HASH var_hash;
struct st_connection
{
- MYSQL mysql;
+ MYSQL *mysql;
/* Used when creating views and sp, to avoid implicit commit */
MYSQL* util_mysql;
char *name;
@@ -458,9 +459,9 @@ struct st_command
char *query, *query_buf,*first_argument,*last_argument,*end;
DYNAMIC_STRING content;
int first_word_len, query_len;
- my_bool abort_on_error;
+ my_bool abort_on_error, used_replace;
struct st_expected_errors expected_errors;
- char require_file[FN_REFLEN];
+ char *require_file;
enum enum_commands type;
};
@@ -488,7 +489,7 @@ VAR* var_init(VAR* v, const char *name, int name_len, const char *val,
void var_free(void* v);
VAR* var_get(const char *var_name, const char** var_name_end,
my_bool raw, my_bool ignore_not_existing);
-void eval_expr(VAR* v, const char *p, const char** p_end);
+void eval_expr(VAR* v, const char *p, const char** p_end, bool backtick= true);
my_bool match_delimiter(int c, const char *delim, uint length);
void dump_result_to_reject_file(char *buf, int size);
void dump_warning_messages();
@@ -748,8 +749,11 @@ pthread_handler_t send_one_query(void *arg)
{
struct st_connection *cn= (struct st_connection*)arg;
+ if (!cn->mysql)
+ return 0;
+
mysql_thread_init();
- VOID(mysql_send_query(&cn->mysql, cn->cur_query, cn->cur_query_len));
+ VOID(mysql_send_query(cn->mysql, cn->cur_query, cn->cur_query_len));
mysql_thread_end();
pthread_mutex_lock(&cn->mutex);
@@ -763,8 +767,11 @@ pthread_handler_t send_one_query(void *arg)
static int do_send_query(struct st_connection *cn, const char *q, int q_len,
int flags)
{
+ if (!cn->mysql)
+ die("Trying to send a query without a connection");
+
if (flags & QUERY_REAP_FLAG)
- return mysql_send_query(&cn->mysql, q, q_len);
+ return mysql_send_query(cn->mysql, q, q_len);
if (pthread_mutex_init(&cn->mutex, NULL) ||
pthread_cond_init(&cn->cond, NULL))
@@ -801,7 +808,7 @@ static void wait_query_thread_end(struct st_connection *con)
#else /*EMBEDDED_LIBRARY*/
-#define do_send_query(cn,q,q_len,flags) mysql_send_query(&cn->mysql, q, q_len)
+#define do_send_query(cn,q,q_len,flags) mysql_send_query(cn->mysql, q, q_len)
#endif /*EMBEDDED_LIBRARY*/
@@ -1113,8 +1120,9 @@ void handle_command_error(struct st_command *command, uint error,
int i;
if (command->abort_on_error)
- die("command \"%.*s\" failed with error %d",
- command->first_word_len, command->query, error);
+ die("command \"%.*s\" failed with error: %u my_errno: %d errno: %d",
+ command->first_word_len, command->query, error, my_errno,
+ sys_errno);
i= match_expected_error(command, error, NULL);
@@ -1126,8 +1134,8 @@ void handle_command_error(struct st_command *command, uint error,
DBUG_VOID_RETURN;
}
if (command->expected_errors.count > 0)
- die("command \"%.*s\" failed with wrong error: %u, errno: %d",
- command->first_word_len, command->query, error, sys_errno);
+ die("command \"%.*s\" failed with wrong error: %u my_errno: %d errno: %d",
+ command->first_word_len, command->query, error, my_errno, sys_errno);
}
else if (command->expected_errors.err[0].type == ERR_ERRNO &&
command->expected_errors.err[0].code.errnum != 0)
@@ -1149,7 +1157,8 @@ void close_connections()
if (next_con->stmt)
mysql_stmt_close(next_con->stmt);
next_con->stmt= 0;
- mysql_close(&next_con->mysql);
+ mysql_close(next_con->mysql);
+ next_con->mysql= 0;
if (next_con->util_mysql)
mysql_close(next_con->util_mysql);
my_free(next_con->name, MYF(MY_ALLOW_ZERO_PTR));
@@ -1220,25 +1229,23 @@ void free_used_memory()
free_all_replace();
my_free(opt_pass,MYF(MY_ALLOW_ZERO_PTR));
free_defaults(default_argv);
+ free_root(&require_file_root, MYF(0));
free_re();
#ifdef __WIN__
free_tmp_sh_file();
free_win_path_patterns();
#endif
-
- /* Only call mysql_server_end if mysql_server_init has been called */
- if (server_initialized)
- mysql_server_end();
-
- /* Don't use DBUG after mysql_server_end() */
- DBUG_VIOLATION_HELPER_LEAVE;
- return;
+ DBUG_VOID_RETURN;
}
static void cleanup_and_exit(int exit_code)
{
free_used_memory();
+
+ /* Only call mysql_server_end if mysql_server_init has been called */
+ if (server_initialized)
+ mysql_server_end();
my_end(my_end_arg);
if (!silent) {
@@ -1302,7 +1309,7 @@ void die(const char *fmt, ...)
been produced prior to the error
*/
if (cur_con && !cur_con->pending)
- show_warnings_before_error(&cur_con->mysql);
+ show_warnings_before_error(cur_con->mysql);
cleanup_and_exit(1);
}
@@ -1352,6 +1359,8 @@ void verbose_msg(const char *fmt, ...)
{
va_list args;
DBUG_ENTER("verbose_msg");
+ DBUG_PRINT("enter", ("format: %s", fmt));
+
if (!verbose)
DBUG_VOID_RETURN;
@@ -2009,7 +2018,7 @@ VAR *var_init(VAR *v, const char *name, int name_len, const char *val,
val_len = strlen(val) ;
val_alloc_len = val_len + 16; /* room to grow */
if (!(tmp_var=v) && !(tmp_var = (VAR*)my_malloc(sizeof(*tmp_var)
- + name_len+1, MYF(MY_WME))))
+ + name_len+2, MYF(MY_WME))))
die("Out of memory");
if (name != NULL)
@@ -2231,7 +2240,7 @@ void var_query_set(VAR *var, const char *query, const char** query_end)
*query_end : query + strlen(query));
MYSQL_RES *res;
MYSQL_ROW row;
- MYSQL* mysql = &cur_con->mysql;
+ MYSQL* mysql = cur_con->mysql;
DYNAMIC_STRING ds_query;
DBUG_ENTER("var_query_set");
LINT_INIT(res);
@@ -2281,7 +2290,8 @@ void var_query_set(VAR *var, const char *query, const char** query_end)
dynstr_append_mem(&result, "\t", 1);
}
end= result.str + result.length-1;
- eval_expr(var, result.str, (const char**) &end);
+ /* Evaluation should not recurse via backtick */
+ eval_expr(var, result.str, (const char**) &end, false);
dynstr_free(&result);
}
else
@@ -2319,7 +2329,7 @@ void var_set_query_get_value(struct st_command *command, VAR *var)
long row_no;
int col_no= -1;
MYSQL_RES* res;
- MYSQL* mysql= &cur_con->mysql;
+ MYSQL* mysql= cur_con->mysql;
static DYNAMIC_STRING ds_query;
static DYNAMIC_STRING ds_col;
@@ -2437,7 +2447,7 @@ void var_copy(VAR *dest, VAR *src)
}
-void eval_expr(VAR *v, const char *p, const char **p_end)
+void eval_expr(VAR *v, const char *p, const char **p_end, bool backtick)
{
DBUG_ENTER("eval_expr");
@@ -2462,7 +2472,7 @@ void eval_expr(VAR *v, const char *p, const char **p_end)
DBUG_VOID_RETURN;
}
- if (*p == '`')
+ if (*p == '`' && backtick)
{
var_query_set(v, p, p_end);
DBUG_VOID_RETURN;
@@ -3025,6 +3035,7 @@ void do_remove_files_wildcard(struct st_command *command)
{
int error= 0, sys_errno= 0;
uint i;
+ size_t directory_length;
MY_DIR *dir_info;
FILEINFO *file;
char dir_separator[2];
@@ -3055,8 +3066,8 @@ void do_remove_files_wildcard(struct st_command *command)
}
init_dynamic_string(&ds_file_to_remove, dirname, 1024, 1024);
dir_separator[0]= FN_LIBCHAR;
- dir_separator[1]= 0;
- dynstr_append(&ds_file_to_remove, dir_separator);
+ dynstr_append_mem(&ds_file_to_remove, dir_separator, 1);
+ directory_length= ds_file_to_remove.length;
/* Set default wild chars for wild_compare, is changed in embedded mode */
set_wild_chars(1);
@@ -3072,8 +3083,7 @@ void do_remove_files_wildcard(struct st_command *command)
if (ds_wild.length &&
wild_compare(file->name, ds_wild.str, 0))
continue;
- ds_file_to_remove.length= ds_directory.length + 1;
- ds_file_to_remove.str[ds_directory.length + 1]= 0;
+ ds_file_to_remove.length= directory_length;
dynstr_append(&ds_file_to_remove, file->name);
DBUG_PRINT("info", ("removing file: %s", ds_file_to_remove.str));
if ((error= (my_delete(ds_file_to_remove.str, MYF(MY_WME)) != 0)))
@@ -3338,7 +3348,7 @@ static int get_list_files(DYNAMIC_STRING *ds, const DYNAMIC_STRING *ds_dirname,
if (ds_wild && ds_wild->length &&
wild_compare(file->name, ds_wild->str, 0))
continue;
- dynstr_append(ds, file->name);
+ replace_dynstr_append(ds, file->name);
dynstr_append(ds, "\n");
}
set_wild_chars(0);
@@ -3368,6 +3378,7 @@ static void do_list_files(struct st_command *command)
{"file", ARG_STRING, FALSE, &ds_wild, "Filename (incl. wildcard)"}
};
DBUG_ENTER("do_list_files");
+ command->used_replace= 1;
check_command_args(command, command->first_argument,
list_files_args,
@@ -3409,6 +3420,7 @@ static void do_list_files_write_file_command(struct st_command *command,
{"file", ARG_STRING, FALSE, &ds_wild, "Filename (incl. wildcard)"}
};
DBUG_ENTER("do_list_files_write_file");
+ command->used_replace= 1;
check_command_args(command, command->first_argument,
list_files_args,
@@ -3749,7 +3761,7 @@ void do_send_quit(struct st_command *command)
if (!(con= find_connection_by_name(name)))
die("connection '%s' not found in connection pool", name);
- simple_command(&con->mysql,COM_QUIT,0,0,1);
+ simple_command(con->mysql,COM_QUIT,0,0,1);
DBUG_VOID_RETURN;
}
@@ -3773,7 +3785,7 @@ void do_send_quit(struct st_command *command)
void do_change_user(struct st_command *command)
{
- MYSQL *mysql = &cur_con->mysql;
+ MYSQL *mysql = cur_con->mysql;
/* static keyword to make the NetWare compiler happy. */
static DYNAMIC_STRING ds_user, ds_passwd, ds_db;
const struct command_arg change_user_args[] = {
@@ -3970,7 +3982,7 @@ int do_echo(struct st_command *command)
void do_wait_for_slave_to_stop(struct st_command *c __attribute__((unused)))
{
static int SLAVE_POLL_INTERVAL= 300000;
- MYSQL* mysql = &cur_con->mysql;
+ MYSQL* mysql = cur_con->mysql;
for (;;)
{
MYSQL_RES *UNINIT_VAR(res);
@@ -4000,7 +4012,7 @@ void do_sync_with_master2(struct st_command *command, long offset)
{
MYSQL_RES *res;
MYSQL_ROW row;
- MYSQL *mysql= &cur_con->mysql;
+ MYSQL *mysql= cur_con->mysql;
char query_buf[FN_REFLEN+128];
int timeout= 300; /* seconds */
@@ -4090,7 +4102,7 @@ int do_save_master_pos()
{
MYSQL_RES *res;
MYSQL_ROW row;
- MYSQL *mysql = &cur_con->mysql;
+ MYSQL *mysql = cur_con->mysql;
const char *query;
int rpl_parse;
DBUG_ENTER("do_save_master_pos");
@@ -4316,22 +4328,22 @@ void do_let(struct st_command *command)
int do_rpl_probe(struct st_command *command __attribute__((unused)))
{
DBUG_ENTER("do_rpl_probe");
- if (mysql_rpl_probe(&cur_con->mysql))
- die("Failed in mysql_rpl_probe(): '%s'", mysql_error(&cur_con->mysql));
+ if (mysql_rpl_probe(cur_con->mysql))
+ die("Failed in mysql_rpl_probe(): '%s'", mysql_error(cur_con->mysql));
DBUG_RETURN(0);
}
int do_enable_rpl_parse(struct st_command *command __attribute__((unused)))
{
- mysql_enable_rpl_parse(&cur_con->mysql);
+ mysql_enable_rpl_parse(cur_con->mysql);
return 0;
}
int do_disable_rpl_parse(struct st_command *command __attribute__((unused)))
{
- mysql_disable_rpl_parse(&cur_con->mysql);
+ mysql_disable_rpl_parse(cur_con->mysql);
return 0;
}
@@ -4507,7 +4519,7 @@ void do_shutdown_server(struct st_command *command)
{
int timeout=60, pid;
DYNAMIC_STRING ds_pidfile_name;
- MYSQL* mysql = &cur_con->mysql;
+ MYSQL* mysql = cur_con->mysql;
static DYNAMIC_STRING ds_timeout;
const struct command_arg shutdown_args[] = {
{"timeout", ARG_STRING, FALSE, &ds_timeout, "Timeout before killing server"}
@@ -4848,7 +4860,7 @@ void set_current_connection(struct st_connection *con)
cur_con= con;
/* Update $mysql_get_server_version to that of current connection */
var_set_int("$mysql_get_server_version",
- mysql_get_server_version(&con->mysql));
+ mysql_get_server_version(con->mysql));
/* Update $CURRENT_CONNECTION to the name of the current connection */
var_set_string("$CURRENT_CONNECTION", con->name);
}
@@ -4921,10 +4933,10 @@ void do_close_connection(struct st_command *command)
#ifndef EMBEDDED_LIBRARY
if (command->type == Q_DIRTY_CLOSE)
{
- if (con->mysql.net.vio)
+ if (con->mysql->net.vio)
{
- vio_delete(con->mysql.net.vio);
- con->mysql.net.vio = 0;
+ vio_delete(con->mysql->net.vio);
+ con->mysql->net.vio = 0;
}
}
#else
@@ -4939,14 +4951,15 @@ void do_close_connection(struct st_command *command)
mysql_stmt_close(con->stmt);
con->stmt= 0;
- mysql_close(&con->mysql);
+ mysql_close(con->mysql);
+ con->mysql= 0;
if (con->util_mysql)
mysql_close(con->util_mysql);
con->util_mysql= 0;
con->pending= FALSE;
- my_free(con->name, MYF(0));
+ my_free(con->name, MYF(MY_ALLOW_ZERO_PTR));
/*
When the connection is closed set name to "-closed_connection-"
@@ -5300,24 +5313,26 @@ void do_connect(struct st_command *command)
if (!(con_slot= find_connection_by_name("-closed_connection-")))
die("Connection limit exhausted, you can have max %d connections",
opt_max_connections);
+ my_free(con_slot->name, MYF(0));
+ con_slot->name= 0;
}
#ifdef EMBEDDED_LIBRARY
con_slot->query_done= 1;
con_slot->has_thread= FALSE;
#endif
- if (!mysql_init(&con_slot->mysql))
+ if (!(con_slot->mysql= mysql_init(0)))
die("Failed on mysql_init()");
if (opt_compress || con_compress)
- mysql_options(&con_slot->mysql, MYSQL_OPT_COMPRESS, NullS);
- mysql_options(&con_slot->mysql, MYSQL_OPT_LOCAL_INFILE, 0);
- mysql_options(&con_slot->mysql, MYSQL_SET_CHARSET_NAME,
+ mysql_options(con_slot->mysql, MYSQL_OPT_COMPRESS, NullS);
+ mysql_options(con_slot->mysql, MYSQL_OPT_LOCAL_INFILE, 0);
+ mysql_options(con_slot->mysql, MYSQL_SET_CHARSET_NAME,
charset_info->csname);
if (opt_charsets_dir)
- mysql_options(&con_slot->mysql, MYSQL_SET_CHARSET_DIR,
+ mysql_options(con_slot->mysql, MYSQL_SET_CHARSET_DIR,
opt_charsets_dir);
if (opt_connect_timeout >= 0)
- mysql_options(&con_slot->mysql, MYSQL_OPT_CONNECT_TIMEOUT,
+ mysql_options(con_slot->mysql, MYSQL_OPT_CONNECT_TIMEOUT,
&opt_connect_timeout);
#ifdef HAVE_OPENSSL
@@ -5328,12 +5343,12 @@ void do_connect(struct st_command *command)
if (con_ssl)
{
#ifdef HAVE_OPENSSL
- mysql_ssl_set(&con_slot->mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
+ mysql_ssl_set(con_slot->mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
opt_ssl_capath, opt_ssl_cipher);
#if MYSQL_VERSION_ID >= 50000
/* Turn on ssl_verify_server_cert only if host is "localhost" */
opt_ssl_verify_server_cert= !strcmp(ds_host.str, "localhost");
- mysql_options(&con_slot->mysql, MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
+ mysql_options(con_slot->mysql, MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
&opt_ssl_verify_server_cert);
#endif
#endif
@@ -5347,7 +5362,7 @@ void do_connect(struct st_command *command)
}
if (opt_protocol)
- mysql_options(&con_slot->mysql, MYSQL_OPT_PROTOCOL, (char*) &opt_protocol);
+ mysql_options(con_slot->mysql, MYSQL_OPT_PROTOCOL, (char*) &opt_protocol);
#ifdef HAVE_SMEM
if (con_shm)
@@ -5355,12 +5370,12 @@ void do_connect(struct st_command *command)
uint protocol= MYSQL_PROTOCOL_MEMORY;
if (!ds_shm.length)
die("Missing shared memory base name");
- 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_SHARED_MEMORY_BASE_NAME, ds_shm.str);
+ mysql_options(con_slot->mysql, MYSQL_OPT_PROTOCOL, &protocol);
}
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);
}
#endif
@@ -5373,7 +5388,7 @@ void do_connect(struct st_command *command)
if (ds_database.length && !strcmp(ds_database.str,"*NO-ONE*"))
dynstr_set(&ds_database, "");
- if (connect_n_handle_errors(command, &con_slot->mysql,
+ if (connect_n_handle_errors(command, con_slot->mysql,
ds_host.str,ds_user.str,
ds_password.str, ds_database.str,
con_port, ds_sock.str))
@@ -5500,7 +5515,9 @@ void do_block(enum block_cmd cmd, struct st_command* command)
if (*expr_start == '!')
{
not_expr= TRUE;
- expr_start++; /* Step past the '!' */
+ expr_start++; /* Step past the '!', then any whitespace */
+ while (*expr_start && my_isspace(charset_info, *expr_start))
+ expr_start++;
}
/* Find ending ')' */
expr_end= strrchr(expr_start, ')');
@@ -6084,7 +6101,7 @@ static struct my_option my_long_options[] =
{"max-connections", OPT_MAX_CONNECTIONS,
"Max number of open connections to server",
&opt_max_connections, &opt_max_connections, 0,
- GET_INT, REQUIRED_ARG, 128, 8, 5120, 0, 0, 0},
+ GET_INT, REQUIRED_ARG, DEFAULT_MAX_CONN, 8, 5120, 0, 0, 0},
{"password", 'p', "Password to use when connecting to server.",
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).",
@@ -6236,6 +6253,7 @@ get_one_option(int optid, const struct my_option *opt,
#ifndef DBUG_OFF
DBUG_PUSH(argument ? argument : "d:t:S:i:O,/tmp/mysqltest.trace");
debug_check_flag= 1;
+ debug_info_flag= 1;
#endif
break;
case 'r':
@@ -6351,7 +6369,7 @@ int parse_args(int argc, char **argv)
if (debug_info_flag)
my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO;
if (debug_check_flag)
- my_end_arg= MY_CHECK_ERROR;
+ my_end_arg|= MY_CHECK_ERROR;
if (global_subst != NULL)
{
@@ -6852,12 +6870,22 @@ void run_query_normal(struct st_connection *cn, struct st_command *command,
DYNAMIC_STRING *ds, DYNAMIC_STRING *ds_warnings)
{
MYSQL_RES *res= 0;
- MYSQL *mysql= &cn->mysql;
+ MYSQL *mysql= cn->mysql;
int err= 0, counter= 0;
DBUG_ENTER("run_query_normal");
DBUG_PRINT("enter",("flags: %d", flags));
DBUG_PRINT("enter", ("query: '%-.60s'", query));
+ if (!mysql)
+ {
+ /* Emulate old behaviour of sending something on a closed connection */
+ handle_error(command, 2006, "MySQL server has gone away",
+ "000000", ds);
+ cn->pending= FALSE;
+ var_set_errno(2006);
+ DBUG_VOID_RETURN;
+ }
+
if (flags & QUERY_SEND_FLAG)
{
/*
@@ -7057,7 +7085,7 @@ void handle_error(struct st_command *command,
DBUG_ENTER("handle_error");
- if (command->require_file[0])
+ if (command->require_file)
{
/*
The query after a "--require" failed. This is fine as long the server
@@ -7441,7 +7469,7 @@ int util_query(MYSQL* org_mysql, const char* query){
void run_query(struct st_connection *cn, struct st_command *command, int flags)
{
- MYSQL *mysql= &cn->mysql;
+ MYSQL *mysql= cn->mysql;
DYNAMIC_STRING *ds;
DYNAMIC_STRING *save_ds= NULL;
DYNAMIC_STRING ds_result;
@@ -7484,7 +7512,7 @@ void run_query(struct st_connection *cn, struct st_command *command, int flags)
Create a temporary dynamic string to contain the output from
this query.
*/
- if (command->require_file[0])
+ if (command->require_file)
{
init_dynamic_string(&ds_result, "", 1024, 1024);
ds= &ds_result;
@@ -7642,7 +7670,7 @@ void run_query(struct st_connection *cn, struct st_command *command, int flags)
mysql_errno(mysql), mysql_error(mysql));
}
- if (command->require_file[0])
+ if (command->require_file)
{
/* A result file was specified for _this_ query
and the output should be checked against an already
@@ -7724,6 +7752,16 @@ void init_re(void)
int match_re(my_regex_t *re, char *str)
{
+ while (my_isspace(charset_info, *str))
+ str++;
+ if (str[0] == '/' && str[1] == '*')
+ {
+ char *comm_end= strstr (str, "*/");
+ if (! comm_end)
+ die("Statement is unterminated comment");
+ str= comm_end + 2;
+ }
+
int err= my_regexec(re, str, (size_t)0, NULL, 0);
if (err == 0)
@@ -7862,13 +7900,16 @@ static void dump_backtrace(void)
{
struct st_connection *conn= cur_con;
- my_safe_print_str("read_command_buf", read_command_buf,
- sizeof(read_command_buf));
+ fprintf(stderr, "read_command_buf (%p): ", read_command_buf);
+ my_safe_print_str(read_command_buf, sizeof(read_command_buf));
+
if (conn)
{
- my_safe_print_str("conn->name", conn->name, conn->name_len);
+ fprintf(stderr, "conn->name (%p): ", conn->name);
+ my_safe_print_str(conn->name, conn->name_len);
#ifdef EMBEDDED_LIBRARY
- my_safe_print_str("conn->cur_query", conn->cur_query, conn->cur_query_len);
+ fprintf(stderr, "conn->cur_query (%p): ", conn->cur_query);
+ my_safe_print_str(conn->cur_query, conn->cur_query_len);
#endif
}
fputs("Attempting backtrace...\n", stderr);
@@ -7971,6 +8012,7 @@ int main(int argc, char **argv)
char save_file[FN_REFLEN];
bool empty_result= FALSE;
MY_INIT(argv[0]);
+ DBUG_ENTER("main");
save_file[0]= 0;
TMPDIR[0]= 0;
@@ -8002,8 +8044,8 @@ int main(int argc, char **argv)
my_init_dynamic_array(&q_lines, sizeof(struct st_command*), 1024, 1024);
- if (hash_init(&var_hash, charset_info,
- 1024, 0, 0, get_var_key, var_free, MYF(0)))
+ if (hash_init2(&var_hash, 64, charset_info,
+ 128, 0, 0, get_var_key, var_free, MYF(0)))
die("Variable hash initialization failed");
var_set_string("MYSQL_SERVER_VERSION", MYSQL_SERVER_VERSION);
@@ -8030,6 +8072,7 @@ int main(int argc, char **argv)
#endif
init_dynamic_string(&ds_res, "", 2048, 2048);
+ init_alloc_root(&require_file_root, 1024, 1024);
parse_args(argc, argv);
@@ -8053,6 +8096,14 @@ int main(int argc, char **argv)
var_set_int("$VIEW_PROTOCOL", view_protocol);
var_set_int("$CURSOR_PROTOCOL", cursor_protocol);
+ var_set_int("$ENABLED_QUERY_LOG", 1);
+ var_set_int("$ENABLED_ABORT_ON_ERROR", 1);
+ var_set_int("$ENABLED_RESULT_LOG", 1);
+ var_set_int("$ENABLED_CONNECT_LOG", 0);
+ var_set_int("$ENABLED_WARNINGS", 1);
+ var_set_int("$ENABLED_INFO", 0);
+ var_set_int("$ENABLED_METADATA", 0);
+
DBUG_PRINT("info",("result_file: '%s'",
result_file_name ? result_file_name : ""));
verbose_msg("Results saved in '%s'.",
@@ -8078,30 +8129,30 @@ int main(int argc, char **argv)
ps_protocol_enabled= 1;
st_connection *con= connections;
- if (!( mysql_init(&con->mysql)))
+ if (! (con->mysql= mysql_init(0)))
die("Failed in mysql_init()");
if (opt_compress)
- mysql_options(&con->mysql,MYSQL_OPT_COMPRESS,NullS);
- mysql_options(&con->mysql, MYSQL_OPT_LOCAL_INFILE, 0);
- mysql_options(&con->mysql, MYSQL_SET_CHARSET_NAME,
+ mysql_options(con->mysql,MYSQL_OPT_COMPRESS,NullS);
+ mysql_options(con->mysql, MYSQL_OPT_LOCAL_INFILE, 0);
+ mysql_options(con->mysql, MYSQL_SET_CHARSET_NAME,
charset_info->csname);
if (opt_charsets_dir)
- mysql_options(&con->mysql, MYSQL_SET_CHARSET_DIR,
+ mysql_options(con->mysql, MYSQL_SET_CHARSET_DIR,
opt_charsets_dir);
if (opt_protocol)
- mysql_options(&con->mysql,MYSQL_OPT_PROTOCOL,(char*)&opt_protocol);
+ mysql_options(con->mysql,MYSQL_OPT_PROTOCOL,(char*)&opt_protocol);
#ifdef HAVE_OPENSSL
if (opt_use_ssl)
{
- mysql_ssl_set(&con->mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
+ mysql_ssl_set(con->mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
opt_ssl_capath, opt_ssl_cipher);
#if MYSQL_VERSION_ID >= 50000
/* Turn on ssl_verify_server_cert only if host is "localhost" */
opt_ssl_verify_server_cert= opt_host && !strcmp(opt_host, "localhost");
- mysql_options(&con->mysql, MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
+ mysql_options(con->mysql, MYSQL_OPT_SSL_VERIFY_SERVER_CERT,
&opt_ssl_verify_server_cert);
#endif
}
@@ -8109,13 +8160,13 @@ int main(int argc, char **argv)
#ifdef HAVE_SMEM
if (shared_memory_base_name)
- mysql_options(&con->mysql,MYSQL_SHARED_MEMORY_BASE_NAME,shared_memory_base_name);
+ mysql_options(con->mysql,MYSQL_SHARED_MEMORY_BASE_NAME,shared_memory_base_name);
#endif
if (!(con->name = my_strdup("default", MYF(MY_WME))))
die("Out of memory");
- safe_connect(&con->mysql, con->name, opt_host, opt_user, opt_pass,
+ safe_connect(con->mysql, con->name, opt_host, opt_user, opt_pass,
opt_db, opt_port, unix_sock);
/* Use all time until exit if no explicit 'start_timer' */
@@ -8196,22 +8247,64 @@ int main(int argc, char **argv)
case Q_RPL_PROBE: do_rpl_probe(command); break;
case Q_ENABLE_RPL_PARSE: do_enable_rpl_parse(command); break;
case Q_DISABLE_RPL_PARSE: do_disable_rpl_parse(command); break;
- case Q_ENABLE_QUERY_LOG: disable_query_log=0; break;
- case Q_DISABLE_QUERY_LOG: disable_query_log=1; break;
- case Q_ENABLE_ABORT_ON_ERROR: abort_on_error=1; break;
- case Q_DISABLE_ABORT_ON_ERROR: abort_on_error=0; break;
- case Q_ENABLE_RESULT_LOG: disable_result_log=0; break;
- case Q_DISABLE_RESULT_LOG: disable_result_log=1; break;
- case Q_ENABLE_CONNECT_LOG: disable_connect_log=0; break;
- case Q_DISABLE_CONNECT_LOG: disable_connect_log=1; break;
- case Q_ENABLE_WARNINGS: disable_warnings=0; break;
- case Q_DISABLE_WARNINGS: disable_warnings=1; break;
case Q_ENABLE_PREPARE_WARNINGS: prepare_warnings_enabled=1; break;
case Q_DISABLE_PREPARE_WARNINGS: prepare_warnings_enabled=0; break;
- case Q_ENABLE_INFO: disable_info=0; break;
- case Q_DISABLE_INFO: disable_info=1; break;
- case Q_ENABLE_METADATA: display_metadata=1; break;
- case Q_DISABLE_METADATA: display_metadata=0; break;
+ case Q_ENABLE_QUERY_LOG:
+ disable_query_log= 0;
+ var_set_int("$ENABLED_QUERY_LOG", 1);
+ break;
+ case Q_DISABLE_QUERY_LOG:
+ disable_query_log= 1;
+ var_set_int("$ENABLED_QUERY_LOG", 0);
+ break;
+ case Q_ENABLE_ABORT_ON_ERROR:
+ abort_on_error= 1;
+ var_set_int("$ENABLED_ABORT_ON_ERROR", 1);
+ break;
+ case Q_DISABLE_ABORT_ON_ERROR:
+ abort_on_error= 0;
+ var_set_int("$ENABLED_ABORT_ON_ERROR", 0);
+ break;
+ case Q_ENABLE_RESULT_LOG:
+ disable_result_log= 0;
+ var_set_int("$ENABLED_RESULT_LOG", 1);
+ break;
+ case Q_DISABLE_RESULT_LOG:
+ disable_result_log=1;
+ var_set_int("$ENABLED_RESULT_LOG", 0);
+ break;
+ case Q_ENABLE_CONNECT_LOG:
+ disable_connect_log=0;
+ var_set_int("$ENABLED_CONNECT_LOG", 1);
+ break;
+ case Q_DISABLE_CONNECT_LOG:
+ disable_connect_log=1;
+ var_set_int("$ENABLED_CONNECT_LOG", 0);
+ break;
+ case Q_ENABLE_WARNINGS:
+ disable_warnings= 0;
+ var_set_int("$ENABLED_WARNINGS", 1);
+ break;
+ case Q_DISABLE_WARNINGS:
+ disable_warnings= 1;
+ var_set_int("$ENABLED_WARNINGS", 0);
+ break;
+ case Q_ENABLE_INFO:
+ disable_info= 0;
+ var_set_int("$ENABLED_INFO", 1);
+ break;
+ case Q_DISABLE_INFO:
+ disable_info= 1;
+ var_set_int("$ENABLED_INFO", 0);
+ break;
+ case Q_ENABLE_METADATA:
+ display_metadata= 1;
+ var_set_int("$ENABLED_METADATA", 1);
+ break;
+ case Q_DISABLE_METADATA:
+ display_metadata= 0;
+ var_set_int("$ENABLED_METADATA", 0);
+ break;
case Q_SOURCE: do_source(command); break;
case Q_SLEEP: do_sleep(command, 0); break;
case Q_REAL_SLEEP: do_sleep(command, 1); break;
@@ -8301,7 +8394,9 @@ int main(int argc, char **argv)
if (save_file[0])
{
- strmake(command->require_file, save_file, sizeof(save_file) - 1);
+ if (!(command->require_file= strdup_root(&require_file_root,
+ save_file)))
+ die("out of memory for require_file");
save_file[0]= 0;
}
run_query(cur_con, command, flags);
@@ -8370,11 +8465,11 @@ int main(int argc, char **argv)
command->last_argument= command->end;
break;
case Q_PING:
- handle_command_error(command, mysql_ping(&cur_con->mysql), -1);
+ handle_command_error(command, mysql_ping(cur_con->mysql), -1);
break;
case Q_SEND_SHUTDOWN:
handle_command_error(command,
- mysql_shutdown(&cur_con->mysql,
+ mysql_shutdown(cur_con->mysql,
SHUTDOWN_DEFAULT), -1);
break;
case Q_SHUTDOWN_SERVER:
@@ -8404,10 +8499,10 @@ int main(int argc, char **argv)
ps_protocol_enabled= ps_protocol;
break;
case Q_DISABLE_RECONNECT:
- set_reconnect(&cur_con->mysql, 0);
+ set_reconnect(cur_con->mysql, 0);
break;
case Q_ENABLE_RECONNECT:
- set_reconnect(&cur_con->mysql, 1);
+ set_reconnect(cur_con->mysql, 1);
/* Close any open statements - no reconnect, need new prepare */
close_statements();
break;
@@ -8475,7 +8570,7 @@ int main(int argc, char **argv)
memset(&saved_expected_errors, 0, sizeof(saved_expected_errors));
}
- if (command_executed != last_command_executed)
+ if (command_executed != last_command_executed || command->used_replace)
{
/*
As soon as any command has been executed,