Commit bfb6add2 authored by unknown's avatar unknown

Merge bk-internal.mysql.com:/home/bk/mysql-4.0

into mysql.com:/my/mysql-4.0

parents b26fd7b9 3357bc7e
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
**********************************************************************/ **********************************************************************/
#define MTEST_VERSION "1.29" #define MTEST_VERSION "1.30"
#include <my_global.h> #include <my_global.h>
#include <mysql_embed.h> #include <mysql_embed.h>
...@@ -54,18 +54,15 @@ ...@@ -54,18 +54,15 @@
#include <m_ctype.h> #include <m_ctype.h>
#include <my_dir.h> #include <my_dir.h>
#include <hash.h> #include <hash.h>
#include <stdio.h>
#include <stdlib.h>
#include <my_getopt.h> #include <my_getopt.h>
#include <stdarg.h> #include <stdarg.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <violite.h> #include <violite.h>
#define MAX_QUERY 65536 #define MAX_QUERY 65536
#define MAX_COLUMNS 256
#define PAD_SIZE 128 #define PAD_SIZE 128
#define MAX_CONS 1024 #define MAX_CONS 128
#define MAX_INCLUDE_DEPTH 16 #define MAX_INCLUDE_DEPTH 16
#define LAZY_GUESS_BUF_SIZE 8192 #define LAZY_GUESS_BUF_SIZE 8192
#define INIT_Q_LINES 1024 #define INIT_Q_LINES 1024
...@@ -79,6 +76,11 @@ ...@@ -79,6 +76,11 @@
#endif #endif
#define MAX_SERVER_ARGS 20 #define MAX_SERVER_ARGS 20
/* Defines to make this look like MySQL 4.1 */
#define charset_info default_charset_info
#define my_isvar(A,B) isvar(B)
#define my_hash_insert(A,B) hash_insert((A), (B))
/* /*
Sometimes in a test the client starts before Sometimes in a test the client starts before
the server - to solve the problem, we try again the server - to solve the problem, we try again
...@@ -117,7 +119,6 @@ static FILE** cur_file; ...@@ -117,7 +119,6 @@ static FILE** cur_file;
static FILE** file_stack_end; static FILE** file_stack_end;
static uint lineno_stack[MAX_INCLUDE_DEPTH]; static uint lineno_stack[MAX_INCLUDE_DEPTH];
static char TMPDIR[FN_REFLEN]; static char TMPDIR[FN_REFLEN];
static int *block_ok_stack_end;
static int *cur_block, *block_stack_end; static int *cur_block, *block_stack_end;
static int block_stack[BLOCK_STACK_DEPTH]; static int block_stack[BLOCK_STACK_DEPTH];
...@@ -135,10 +136,10 @@ static const char *embedded_server_groups[] = { ...@@ -135,10 +136,10 @@ static const char *embedded_server_groups[] = {
NullS NullS
}; };
#include "sslopt-vars.h"
DYNAMIC_ARRAY q_lines; DYNAMIC_ARRAY q_lines;
#include "sslopt-vars.h"
typedef struct typedef struct
{ {
char file[FN_REFLEN]; char file[FN_REFLEN];
...@@ -180,7 +181,8 @@ typedef struct ...@@ -180,7 +181,8 @@ typedef struct
VAR var_reg[10]; VAR var_reg[10];
/*Perl/shell-like variable registers */ /*Perl/shell-like variable registers */
HASH var_hash; HASH var_hash;
int disable_query_log=0, disable_result_log=0; my_bool disable_query_log=0, disable_result_log=0, disable_warnings=0;
my_bool disable_info= 1; /* By default off */
struct connection cons[MAX_CONS]; struct connection cons[MAX_CONS];
struct connection* cur_con, *next_con, *cons_end; struct connection* cur_con, *next_con, *cons_end;
...@@ -200,7 +202,7 @@ Q_SYNC_WITH_MASTER, ...@@ -200,7 +202,7 @@ Q_SYNC_WITH_MASTER,
Q_SYNC_SLAVE_WITH_MASTER, Q_SYNC_SLAVE_WITH_MASTER,
Q_ERROR, Q_ERROR,
Q_SEND, Q_REAP, Q_SEND, Q_REAP,
Q_DIRTY_CLOSE, Q_REPLACE, Q_DIRTY_CLOSE, Q_REPLACE, Q_REPLACE_COLUMN,
Q_PING, Q_EVAL, Q_PING, Q_EVAL,
Q_RPL_PROBE, Q_ENABLE_RPL_PARSE, Q_RPL_PROBE, Q_ENABLE_RPL_PARSE,
Q_DISABLE_RPL_PARSE, Q_EVAL_RESULT, Q_DISABLE_RPL_PARSE, Q_EVAL_RESULT,
...@@ -209,6 +211,8 @@ Q_ENABLE_RESULT_LOG, Q_DISABLE_RESULT_LOG, ...@@ -209,6 +211,8 @@ Q_ENABLE_RESULT_LOG, Q_DISABLE_RESULT_LOG,
Q_SERVER_START, Q_SERVER_STOP,Q_REQUIRE_MANAGER, Q_SERVER_START, Q_SERVER_STOP,Q_REQUIRE_MANAGER,
Q_WAIT_FOR_SLAVE_TO_STOP, Q_WAIT_FOR_SLAVE_TO_STOP,
Q_REQUIRE_VERSION, Q_REQUIRE_VERSION,
Q_ENABLE_WARNINGS, Q_DISABLE_WARNINGS,
Q_ENABLE_INFO, Q_DISABLE_INFO,
Q_EXEC, Q_EXEC,
Q_UNKNOWN, /* Unknown command. */ Q_UNKNOWN, /* Unknown command. */
Q_COMMENT, /* Comments, ignored. */ Q_COMMENT, /* Comments, ignored. */
...@@ -260,6 +264,7 @@ const char *command_names[]= ...@@ -260,6 +264,7 @@ const char *command_names[]=
"reap", "reap",
"dirty_close", "dirty_close",
"replace_result", "replace_result",
"replace_column",
"ping", "ping",
"eval", "eval",
"rpl_probe", "rpl_probe",
...@@ -275,6 +280,10 @@ const char *command_names[]= ...@@ -275,6 +280,10 @@ const char *command_names[]=
"require_manager", "require_manager",
"wait_for_slave_to_stop", "wait_for_slave_to_stop",
"require_version", "require_version",
"enable_warnings",
"disable_warnings",
"enable_info",
"disable_info",
"exec", "exec",
0 0
}; };
...@@ -301,7 +310,7 @@ VAR* var_get(const char *var_name, const char** var_name_end, my_bool raw, ...@@ -301,7 +310,7 @@ VAR* var_get(const char *var_name, const char** var_name_end, my_bool raw,
int eval_expr(VAR* v, const char *p, const char** p_end); int eval_expr(VAR* v, const char *p, const char** p_end);
static int read_server_arguments(const char *name); static int read_server_arguments(const char *name);
/* Definitions for replace */ /* Definitions for replace result */
typedef struct st_pointer_array { /* when using array-strings */ typedef struct st_pointer_array { /* when using array-strings */
TYPELIB typelib; /* Pointer to strings */ TYPELIB typelib; /* Pointer to strings */
...@@ -329,6 +338,13 @@ static char *out_buff; ...@@ -329,6 +338,13 @@ static char *out_buff;
static uint out_length; static uint out_length;
static int eval_result = 0; static int eval_result = 0;
/* For column replace */
char *replace_column[MAX_COLUMNS];
uint max_replace_column= 0;
static void get_replace_column(struct st_query *q);
static void free_replace_column();
/* Disable functions that only exist in MySQL 4.0 */ /* Disable functions that only exist in MySQL 4.0 */
#if MYSQL_VERSION_ID < 40000 || defined(EMBEDDED_LIBRARY) #if MYSQL_VERSION_ID < 40000 || defined(EMBEDDED_LIBRARY)
void mysql_enable_rpl_parse(MYSQL* mysql __attribute__((unused))) {} void mysql_enable_rpl_parse(MYSQL* mysql __attribute__((unused))) {}
...@@ -339,7 +355,6 @@ int mysql_rpl_probe(MYSQL *mysql __attribute__((unused))) { return 1; } ...@@ -339,7 +355,6 @@ int mysql_rpl_probe(MYSQL *mysql __attribute__((unused))) { return 1; }
static void replace_dynstr_append_mem(DYNAMIC_STRING *ds, const char *val, static void replace_dynstr_append_mem(DYNAMIC_STRING *ds, const char *val,
int len); int len);
static void do_eval(DYNAMIC_STRING* query_eval, const char* query) static void do_eval(DYNAMIC_STRING* query_eval, const char* query)
{ {
const char* p; const char* p;
...@@ -434,6 +449,7 @@ static void free_used_memory() ...@@ -434,6 +449,7 @@ static void free_used_memory()
delete_dynamic(&q_lines); delete_dynamic(&q_lines);
dynstr_free(&ds_res); dynstr_free(&ds_res);
free_replace(); free_replace();
free_replace_column();
my_free(pass,MYF(MY_ALLOW_ZERO_PTR)); my_free(pass,MYF(MY_ALLOW_ZERO_PTR));
free_defaults(default_argv); free_defaults(default_argv);
mysql_server_end(); mysql_server_end();
...@@ -602,7 +618,7 @@ VAR* var_get(const char* var_name, const char** var_name_end, my_bool raw, ...@@ -602,7 +618,7 @@ VAR* var_get(const char* var_name, const char** var_name_end, my_bool raw,
{ {
const char* save_var_name = var_name, *end; const char* save_var_name = var_name, *end;
end = (var_name_end) ? *var_name_end : 0; end = (var_name_end) ? *var_name_end : 0;
while (isvar(*var_name) && var_name != end) while (my_isvar(charset_info,*var_name) && var_name != end)
++var_name; ++var_name;
if (var_name == save_var_name) if (var_name == save_var_name)
{ {
...@@ -647,7 +663,7 @@ static VAR* var_obtain(char* name, int len) ...@@ -647,7 +663,7 @@ static VAR* var_obtain(char* name, int len)
if ((v = (VAR*)hash_search(&var_hash, name, len))) if ((v = (VAR*)hash_search(&var_hash, name, len)))
return v; return v;
v = var_init(0, name, len, "", 0); v = var_init(0, name, len, "", 0);
hash_insert(&var_hash, (byte*)v); my_hash_insert(&var_hash, (byte*)v);
return v; return v;
} }
...@@ -700,13 +716,13 @@ int do_wait_for_slave_to_stop(struct st_query* q __attribute__((unused))) ...@@ -700,13 +716,13 @@ int do_wait_for_slave_to_stop(struct st_query* q __attribute__((unused)))
MYSQL* mysql = &cur_con->mysql; MYSQL* mysql = &cur_con->mysql;
for (;;) for (;;)
{ {
MYSQL_RES* res; MYSQL_RES *res;
MYSQL_ROW row; MYSQL_ROW row;
int done; int done;
LINT_INIT(res); LINT_INIT(res);
if (mysql_query(mysql,"show status like 'Slave_running'") if (mysql_query(mysql,"show status like 'Slave_running'") ||
|| !(res=mysql_store_result(mysql))) !(res=mysql_store_result(mysql)))
die("Query failed while probing slave for stop: %s", die("Query failed while probing slave for stop: %s",
mysql_error(mysql)); mysql_error(mysql));
if (!(row=mysql_fetch_row(res)) || !row[1]) if (!(row=mysql_fetch_row(res)) || !row[1])
...@@ -753,10 +769,8 @@ int do_server_op(struct st_query* q,const char* op) ...@@ -753,10 +769,8 @@ int do_server_op(struct st_query* q,const char* op)
com_p=strmov(com_p,"_exec "); com_p=strmov(com_p,"_exec ");
if (!*p) if (!*p)
die("Missing server name in server_%s\n",op); die("Missing server name in server_%s\n",op);
while (*p && !isspace(*p)) while (*p && !my_isspace(charset_info,*p))
{ *com_p++= *p++;
*com_p++=*p++;
}
*com_p++=' '; *com_p++=' ';
com_p=int10_to_str(manager_wait_timeout,com_p,10); com_p=int10_to_str(manager_wait_timeout,com_p,10);
*com_p++ = '\n'; *com_p++ = '\n';
...@@ -786,7 +800,7 @@ int do_require_version(struct st_query* q) ...@@ -786,7 +800,7 @@ int do_require_version(struct st_query* q)
if (!*p) if (!*p)
die("Missing version argument in require_version\n"); die("Missing version argument in require_version\n");
ver_arg = p; ver_arg = p;
while (*p && !isspace(*p)) while (*p && !my_isspace(charset_info,*p))
p++; p++;
*p = 0; *p = 0;
ver_arg_len = p - ver_arg; ver_arg_len = p - ver_arg;
...@@ -816,7 +830,7 @@ int do_source(struct st_query* q) ...@@ -816,7 +830,7 @@ int do_source(struct st_query* q)
if (!*p) if (!*p)
die("Missing file name in source\n"); die("Missing file name in source\n");
name = p; name = p;
while (*p && !isspace(*p)) while (*p && !my_isspace(charset_info,*p))
p++; p++;
*p = 0; *p = 0;
...@@ -848,7 +862,7 @@ int do_exec(struct st_query* q) ...@@ -848,7 +862,7 @@ int do_exec(struct st_query* q)
FILE *res_file; FILE *res_file;
char *cmd= q->first_argument; char *cmd= q->first_argument;
while (*cmd && isspace(*cmd)) while (*cmd && my_isspace(charset_info, *cmd))
cmd++; cmd++;
if (!*cmd) if (!*cmd)
die("Missing argument in exec\n"); die("Missing argument in exec\n");
...@@ -1075,7 +1089,8 @@ int do_sync_with_master2(const char* p) ...@@ -1075,7 +1089,8 @@ int do_sync_with_master2(const char* p)
mysql_errno(mysql), mysql_error(mysql)); mysql_errno(mysql), mysql_error(mysql));
if (!(last_result = res = mysql_store_result(mysql))) if (!(last_result = res = mysql_store_result(mysql)))
die("line %u: mysql_store_result() returned NULL", start_lineno); die("line %u: mysql_store_result() returned NULL for '%s'", start_lineno,
query_buf);
if (!(row = mysql_fetch_row(res))) if (!(row = mysql_fetch_row(res)))
die("line %u: empty result in %s", start_lineno, query_buf); die("line %u: empty result in %s", start_lineno, query_buf);
if (!row[0]) if (!row[0])
...@@ -1099,17 +1114,19 @@ int do_save_master_pos() ...@@ -1099,17 +1114,19 @@ int do_save_master_pos()
MYSQL_RES* res; MYSQL_RES* res;
MYSQL_ROW row; MYSQL_ROW row;
MYSQL* mysql = &cur_con->mysql; MYSQL* mysql = &cur_con->mysql;
const char *query;
int rpl_parse; int rpl_parse;
rpl_parse = mysql_rpl_parse_enabled(mysql); rpl_parse = mysql_rpl_parse_enabled(mysql);
mysql_disable_rpl_parse(mysql); mysql_disable_rpl_parse(mysql);
if (mysql_query(mysql, "show master status")) if (mysql_query(mysql, query= "show master status"))
die("At line %u: failed in show master status: %d: %s", start_lineno, die("At line %u: failed in show master status: %d: %s", start_lineno,
mysql_errno(mysql), mysql_error(mysql)); mysql_errno(mysql), mysql_error(mysql));
if (!(last_result =res = mysql_store_result(mysql))) if (!(last_result =res = mysql_store_result(mysql)))
die("line %u: mysql_store_result() retuned NULL", start_lineno); die("line %u: mysql_store_result() retuned NULL for '%s'", start_lineno,
query);
if (!(row = mysql_fetch_row(res))) if (!(row = mysql_fetch_row(res)))
die("line %u: empty result in show master status", start_lineno); die("line %u: empty result in show master status", start_lineno);
strnmov(master_pos.file, row[0], sizeof(master_pos.file)-1); strnmov(master_pos.file, row[0], sizeof(master_pos.file)-1);
...@@ -1130,11 +1147,11 @@ int do_let(struct st_query* q) ...@@ -1130,11 +1147,11 @@ int do_let(struct st_query* q)
if (!*p) if (!*p)
die("Missing variable name in let\n"); die("Missing variable name in let\n");
var_name = p; var_name = p;
while (*p && (*p != '=' || isspace(*p))) while (*p && (*p != '=' || my_isspace(charset_info,*p)))
p++; p++;
var_name_end = p; var_name_end = p;
if (*p == '=') p++; if (*p == '=') p++;
while (*p && isspace(*p)) while (*p && my_isspace(charset_info,*p))
p++; p++;
var_val_start = p; var_val_start = p;
return var_set(var_name, var_name_end, var_val_start, q->end); return var_set(var_name, var_name_end, var_val_start, q->end);
...@@ -1163,8 +1180,8 @@ int do_disable_rpl_parse(struct st_query* q __attribute__((unused))) ...@@ -1163,8 +1180,8 @@ int do_disable_rpl_parse(struct st_query* q __attribute__((unused)))
int do_sleep(struct st_query* q, my_bool real_sleep) int do_sleep(struct st_query* q, my_bool real_sleep)
{ {
char* p=q->first_argument; char *p=q->first_argument;
while (*p && isspace(*p)) while (*p && my_isspace(charset_info,*p))
p++; p++;
if (!*p) if (!*p)
die("Missing argument in sleep\n"); die("Missing argument in sleep\n");
...@@ -1180,7 +1197,7 @@ static void get_file_name(char *filename, struct st_query* q) ...@@ -1180,7 +1197,7 @@ static void get_file_name(char *filename, struct st_query* q)
char* p=q->first_argument; char* p=q->first_argument;
strnmov(filename, p, FN_REFLEN); strnmov(filename, p, FN_REFLEN);
/* Remove end space */ /* Remove end space */
while (p > filename && isspace(p[-1])) while (p > filename && my_isspace(charset_info,p[-1]))
p--; p--;
p[0]=0; p[0]=0;
} }
...@@ -1266,7 +1283,7 @@ static char *get_string(char **to_ptr, char **from_ptr, ...@@ -1266,7 +1283,7 @@ static char *get_string(char **to_ptr, char **from_ptr,
if (*from != ' ' && *from) if (*from != ' ' && *from)
die("Wrong string argument in %s\n", q->query); die("Wrong string argument in %s\n", q->query);
while (isspace(*from)) /* Point to next string */ while (my_isspace(charset_info,*from)) /* Point to next string */
from++; from++;
*to =0; /* End of string marker */ *to =0; /* End of string marker */
...@@ -1323,8 +1340,8 @@ static void get_replace(struct st_query *q) ...@@ -1323,8 +1340,8 @@ static void get_replace(struct st_query *q)
insert_pointer_name(&to_array,to); insert_pointer_name(&to_array,to);
} }
for (i=1,pos=word_end_chars ; i < 256 ; i++) for (i=1,pos=word_end_chars ; i < 256 ; i++)
if (isspace(i)) if (my_isspace(charset_info,i))
*pos++=i; *pos++= i;
*pos=0; /* End pointer */ *pos=0; /* End pointer */
if (!(glob_replace=init_replace((char**) from_array.typelib.type_names, if (!(glob_replace=init_replace((char**) from_array.typelib.type_names,
(char**) to_array.typelib.type_names, (char**) to_array.typelib.type_names,
...@@ -1360,7 +1377,7 @@ int select_connection(char *p) ...@@ -1360,7 +1377,7 @@ int select_connection(char *p)
if (!*p) if (!*p)
die("Missing connection name in connect\n"); die("Missing connection name in connect\n");
name = p; name = p;
while (*p && !isspace(*p)) while (*p && !my_isspace(charset_info,*p))
p++; p++;
*p = 0; *p = 0;
...@@ -1386,7 +1403,7 @@ int close_connection(struct st_query* q) ...@@ -1386,7 +1403,7 @@ int close_connection(struct st_query* q)
if (!*p) if (!*p)
die("Missing connection name in connect\n"); die("Missing connection name in connect\n");
name = p; name = p;
while (*p && !isspace(*p)) while (*p && !my_isspace(charset_info,*p))
p++; p++;
*p = 0; *p = 0;
...@@ -1394,6 +1411,7 @@ int close_connection(struct st_query* q) ...@@ -1394,6 +1411,7 @@ int close_connection(struct st_query* q)
{ {
if (!strcmp(con->name, name)) if (!strcmp(con->name, name))
{ {
#ifndef EMBEDDED_LIBRARY
if (q->type == Q_DIRTY_CLOSE) if (q->type == Q_DIRTY_CLOSE)
{ {
if (con->mysql.net.vio) if (con->mysql.net.vio)
...@@ -1402,7 +1420,7 @@ int close_connection(struct st_query* q) ...@@ -1402,7 +1420,7 @@ int close_connection(struct st_query* q)
con->mysql.net.vio = 0; con->mysql.net.vio = 0;
} }
} }
#endif
mysql_close(&con->mysql); mysql_close(&con->mysql);
DBUG_RETURN(0); DBUG_RETURN(0);
} }
...@@ -1422,11 +1440,13 @@ int close_connection(struct st_query* q) ...@@ -1422,11 +1440,13 @@ int close_connection(struct st_query* q)
char* safe_get_param(char* str, char** arg, const char* msg) char* safe_get_param(char* str, char** arg, const char* msg)
{ {
DBUG_ENTER("safe_get_param"); DBUG_ENTER("safe_get_param");
while (*str && isspace(*str)) str++; while (*str && my_isspace(charset_info,*str))
str++;
*arg = str; *arg = str;
for (; *str && *str != ',' && *str != ')' ; str++) for (; *str && *str != ',' && *str != ')' ; str++)
{ {
if (isspace(*str)) *str = 0; if (my_isspace(charset_info,*str))
*str = 0;
} }
if (!*str) if (!*str)
die(msg); die(msg);
...@@ -1474,7 +1494,6 @@ int do_connect(struct st_query* q) ...@@ -1474,7 +1494,6 @@ int do_connect(struct st_query* q)
char* p=q->first_argument; char* p=q->first_argument;
char buff[FN_REFLEN]; char buff[FN_REFLEN];
int con_port; int con_port;
int con_error;
int free_con_sock = 0; int free_con_sock = 0;
DBUG_ENTER("do_connect"); DBUG_ENTER("do_connect");
...@@ -1539,7 +1558,7 @@ int do_connect(struct st_query* q) ...@@ -1539,7 +1558,7 @@ int do_connect(struct st_query* q)
/* Special database to allow one to connect without a database name */ /* Special database to allow one to connect without a database name */
if (con_db && !strcmp(con_db,"*NO-ONE*")) if (con_db && !strcmp(con_db,"*NO-ONE*"))
con_db=0; con_db=0;
if ((con_error = safe_connect(&next_con->mysql, con_host, if ((safe_connect(&next_con->mysql, con_host,
con_user, con_pass, con_user, con_pass,
con_db, con_port, con_sock ? con_sock: 0))) con_db, con_port, con_sock ? con_sock: 0)))
die("Could not open connection '%s': %s", con_name, die("Could not open connection '%s': %s", con_name,
...@@ -1663,7 +1682,7 @@ int read_line(char* buf, int size) ...@@ -1663,7 +1682,7 @@ int read_line(char* buf, int size)
{ {
state = R_COMMENT; state = R_COMMENT;
} }
else if (isspace(c)) else if (my_isspace(charset_info,c))
{ {
if (c == '\n') if (c == '\n')
start_lineno= ++*lineno; /* Query hasn't started yet */ start_lineno= ++*lineno; /* Query hasn't started yet */
...@@ -1789,7 +1808,7 @@ int read_query(struct st_query** q_ptr) ...@@ -1789,7 +1808,7 @@ int read_query(struct st_query** q_ptr)
{ {
expected_errno = 0; expected_errno = 0;
p++; p++;
for (;isdigit(*p);p++) for (;my_isdigit(charset_info,*p);p++)
expected_errno = expected_errno * 10 + *p - '0'; expected_errno = expected_errno * 10 + *p - '0';
q->expected_errno[0] = expected_errno; q->expected_errno[0] = expected_errno;
q->expected_errno[1] = 0; q->expected_errno[1] = 0;
...@@ -1797,25 +1816,28 @@ int read_query(struct st_query** q_ptr) ...@@ -1797,25 +1816,28 @@ int read_query(struct st_query** q_ptr)
} }
} }
while (*p && isspace(*p)) p++ ; while (*p && my_isspace(charset_info,*p))
p++ ;
if (*p == '@') if (*p == '@')
{ {
p++; p++;
p1 = q->record_file; p1 = q->record_file;
while (!isspace(*p) && while (!my_isspace(charset_info,*p) &&
p1 < q->record_file + sizeof(q->record_file) - 1) p1 < q->record_file + sizeof(q->record_file) - 1)
*p1++ = *p++; *p1++ = *p++;
*p1 = 0; *p1 = 0;
} }
} }
while (*p && isspace(*p)) p++; while (*p && my_isspace(charset_info,*p))
p++;
if (!(q->query_buf=q->query=my_strdup(p,MYF(MY_WME)))) if (!(q->query_buf=q->query=my_strdup(p,MYF(MY_WME))))
die(NullS); die(NullS);
/* Calculate first word and first argument */ /* Calculate first word and first argument */
for (p=q->query; *p && !isspace(*p) ; p++) ; for (p=q->query; *p && !my_isspace(charset_info,*p) ; p++) ;
q->first_word_len = (uint) (p - q->query); q->first_word_len = (uint) (p - q->query);
while (*p && isspace(*p)) p++; while (*p && my_isspace(charset_info,*p))
p++;
q->first_argument=p; q->first_argument=p;
q->end = strend(q->query); q->end = strend(q->query);
parser.read_lines++; parser.read_lines++;
...@@ -1825,34 +1847,34 @@ int read_query(struct st_query** q_ptr) ...@@ -1825,34 +1847,34 @@ int read_query(struct st_query** q_ptr)
static struct my_option my_long_options[] = static struct my_option my_long_options[] =
{ {
{"debug", '#', "Output debug log. Often this is 'd:t:o,filename'", {"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.",
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
{"database", 'D', "Database to use.", (gptr*) &db, (gptr*) &db, 0, {"database", 'D', "Database to use.", (gptr*) &db, (gptr*) &db, 0,
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"basedir", 'b', "Basedir for tests", (gptr*) &opt_basedir, {"basedir", 'b', "Basedir for tests.", (gptr*) &opt_basedir,
(gptr*) &opt_basedir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, (gptr*) &opt_basedir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"big-test", 'B', "Define BIG_TEST to 1", (gptr*) &opt_big_test, {"big-test", 'B', "Define BIG_TEST to 1.", (gptr*) &opt_big_test,
(gptr*) &opt_big_test, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, (gptr*) &opt_big_test, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{"compress", 'C', "Use the compressed server/client protocol", {"compress", 'C', "Use the compressed server/client protocol.",
(gptr*) &opt_compress, (gptr*) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0, (gptr*) &opt_compress, (gptr*) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
0, 0, 0}, 0, 0, 0},
{"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, {"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG,
0, 0, 0, 0, 0, 0}, 0, 0, 0, 0, 0, 0},
{"host", 'h', "Connect to host.", (gptr*) &host, (gptr*) &host, 0, {"host", 'h', "Connect to host.", (gptr*) &host, (gptr*) &host, 0,
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"manager-user", OPT_MANAGER_USER, "Undocumented: Used for debugging", {"manager-user", OPT_MANAGER_USER, "Undocumented: Used for debugging.",
(gptr*) &manager_user, (gptr*) &manager_user, 0, GET_STR, REQUIRED_ARG, 0, (gptr*) &manager_user, (gptr*) &manager_user, 0, GET_STR, REQUIRED_ARG, 0,
0, 0, 0, 0, 0}, 0, 0, 0, 0, 0},
{"manager-host", OPT_MANAGER_HOST, "Undocumented: Used for debugging", {"manager-host", OPT_MANAGER_HOST, "Undocumented: Used for debugging.",
(gptr*) &manager_host, (gptr*) &manager_host, 0, GET_STR, REQUIRED_ARG, (gptr*) &manager_host, (gptr*) &manager_host, 0, GET_STR, REQUIRED_ARG,
0, 0, 0, 0, 0, 0}, 0, 0, 0, 0, 0, 0},
{"manager-password", OPT_MANAGER_PASSWD, "Undocumented: Used for debugging", {"manager-password", OPT_MANAGER_PASSWD, "Undocumented: Used for debugging.",
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"manager-port", OPT_MANAGER_PORT, "Undocumented: Used for debugging", {"manager-port", OPT_MANAGER_PORT, "Undocumented: Used for debugging.",
(gptr*) &manager_port, (gptr*) &manager_port, 0, GET_INT, REQUIRED_ARG, (gptr*) &manager_port, (gptr*) &manager_port, 0, GET_INT, REQUIRED_ARG,
MYSQL_MANAGER_PORT, 0, 0, 0, 0, 0}, MYSQL_MANAGER_PORT, 0, 0, 0, 0, 0},
{"manager-wait-timeout", OPT_MANAGER_WAIT_TIMEOUT, {"manager-wait-timeout", OPT_MANAGER_WAIT_TIMEOUT,
"Undocumented: Used for debugging", (gptr*) &manager_wait_timeout, "Undocumented: Used for debugging.", (gptr*) &manager_wait_timeout,
(gptr*) &manager_wait_timeout, 0, GET_INT, REQUIRED_ARG, 3, 0, 0, 0, 0, 0}, (gptr*) &manager_wait_timeout, 0, GET_INT, REQUIRED_ARG, 3, 0, 0, 0, 0, 0},
{"password", 'p', "Password to use when connecting to server.", {"password", 'p', "Password to use when connecting to server.",
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
...@@ -1865,16 +1887,16 @@ static struct my_option my_long_options[] = ...@@ -1865,16 +1887,16 @@ static struct my_option my_long_options[] =
{"result-file", 'R', "Read/Store result from/in this file.", {"result-file", 'R', "Read/Store result from/in this file.",
(gptr*) &result_file, (gptr*) &result_file, 0, GET_STR, REQUIRED_ARG, (gptr*) &result_file, (gptr*) &result_file, 0, GET_STR, REQUIRED_ARG,
0, 0, 0, 0, 0, 0}, 0, 0, 0, 0, 0, 0},
{"server-arg", 'A', "Send enbedded server this as a paramenter", {"server-arg", 'A', "Send enbedded server this as a paramenter.",
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"server-file", 'F', "Read embedded server arguments from file", {"server-file", 'F', "Read embedded server arguments from file.",
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"silent", 's', "Suppress all normal output. Synonym for --quiet.", {"silent", 's', "Suppress all normal output. Synonym for --quiet.",
(gptr*) &silent, (gptr*) &silent, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, (gptr*) &silent, (gptr*) &silent, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
{"skip-safemalloc", OPT_SKIP_SAFEMALLOC, {"skip-safemalloc", OPT_SKIP_SAFEMALLOC,
"Don't use the memory allocation checking", 0, 0, 0, GET_NO_ARG, NO_ARG, "Don't use the memory allocation checking.", 0, 0, 0, GET_NO_ARG, NO_ARG,
0, 0, 0, 0, 0, 0}, 0, 0, 0, 0, 0, 0},
{"sleep", 'T', "Sleep always this many seconds on sleep commands", {"sleep", 'T', "Sleep always this many seconds on sleep commands.",
(gptr*) &opt_sleep, (gptr*) &opt_sleep, 0, GET_INT, REQUIRED_ARG, 0, 0, 0, (gptr*) &opt_sleep, (gptr*) &opt_sleep, 0, GET_INT, REQUIRED_ARG, 0, 0, 0,
0, 0, 0}, 0, 0, 0},
{"socket", 'S', "Socket file to use for connection.", {"socket", 'S', "Socket file to use for connection.",
...@@ -1883,7 +1905,7 @@ static struct my_option my_long_options[] = ...@@ -1883,7 +1905,7 @@ static struct my_option my_long_options[] =
#include "sslopt-longopts.h" #include "sslopt-longopts.h"
{"test-file", 'x', "Read test from/in this file (default stdin).", {"test-file", 'x', "Read test from/in this file (default stdin).",
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"tmpdir", 't', "Temporary directory where sockets are put", {"tmpdir", 't', "Temporary directory where sockets are put.",
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, 0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
{"user", 'u', "User for login.", (gptr*) &user, (gptr*) &user, 0, GET_STR, {"user", 'u', "User for login.", (gptr*) &user, (gptr*) &user, 0, GET_STR,
REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
...@@ -1894,7 +1916,6 @@ static struct my_option my_long_options[] = ...@@ -1894,7 +1916,6 @@ static struct my_option my_long_options[] =
{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
}; };
static void print_version(void) static void print_version(void)
{ {
printf("%s Ver %s Distrib %s, for %s (%s)\n",my_progname,MTEST_VERSION, printf("%s Ver %s Distrib %s, for %s (%s)\n",my_progname,MTEST_VERSION,
...@@ -1995,12 +2016,10 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), ...@@ -1995,12 +2016,10 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
int parse_args(int argc, char **argv) int parse_args(int argc, char **argv)
{ {
int ho_error;
load_defaults("my",load_default_groups,&argc,&argv); load_defaults("my",load_default_groups,&argc,&argv);
default_argv= argv; default_argv= argv;
if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) if ((handle_options(&argc, &argv, my_long_options, get_one_option)))
exit(1); exit(1);
if (argc > 1) if (argc > 1)
...@@ -2067,6 +2086,45 @@ static void replace_dynstr_append_mem(DYNAMIC_STRING *ds, const char *val, ...@@ -2067,6 +2086,45 @@ static void replace_dynstr_append_mem(DYNAMIC_STRING *ds, const char *val,
} }
/*
Append all results to the dynamic string separated with '\t'
Values may be converted with 'replace_column'
*/
static void append_result(DYNAMIC_STRING *ds, MYSQL_RES *res)
{
MYSQL_ROW row;
uint num_fields= mysql_num_fields(res);
unsigned long *lengths;
while ((row = mysql_fetch_row(res)))
{
uint i;
lengths = mysql_fetch_lengths(res);
for (i = 0; i < num_fields; i++)
{
const char *val= row[i];
ulonglong len= lengths[i];
if (i < max_replace_column && replace_column[i])
{
val= replace_column[i];
len= strlen(val);
}
if (!val)
{
val= "NULL";
len= 4;
}
if (i)
dynstr_append_mem(ds, "\t", 1);
replace_dynstr_append_mem(ds, val, len);
}
dynstr_append_mem(ds, "\n", 1);
}
free_replace_column();
}
/* /*
* flags control the phased/stages of query execution to be performed * flags control the phased/stages of query execution to be performed
* if QUERY_SEND bit is on, the query will be sent. If QUERY_REAP is on * if QUERY_SEND bit is on, the query will be sent. If QUERY_REAP is on
...@@ -2076,12 +2134,7 @@ static void replace_dynstr_append_mem(DYNAMIC_STRING *ds, const char *val, ...@@ -2076,12 +2134,7 @@ static void replace_dynstr_append_mem(DYNAMIC_STRING *ds, const char *val,
int run_query(MYSQL* mysql, struct st_query* q, int flags) int run_query(MYSQL* mysql, struct st_query* q, int flags)
{ {
MYSQL_RES* res = 0; MYSQL_RES* res = 0;
MYSQL_FIELD* fields; int i, error = 0;
MYSQL_ROW row;
int num_fields,i, error = 0;
unsigned long* lengths;
char* val;
int len;
DYNAMIC_STRING *ds; DYNAMIC_STRING *ds;
DYNAMIC_STRING ds_tmp; DYNAMIC_STRING ds_tmp;
DYNAMIC_STRING eval_query; DYNAMIC_STRING eval_query;
...@@ -2153,19 +2206,17 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) ...@@ -2153,19 +2206,17 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
goto end; /* Ok */ goto end; /* Ok */
} }
} }
if (i) DBUG_PRINT("info",("i: %d expected_errors: %d", i, q->expected_errors));
{
replace_dynstr_append_mem(ds, mysql_error(mysql), replace_dynstr_append_mem(ds, mysql_error(mysql),
strlen(mysql_error(mysql))); strlen(mysql_error(mysql)));
dynstr_append_mem(ds,"\n",1); dynstr_append_mem(ds,"\n",1);
if (i)
{
verbose_msg("query '%s' failed with wrong errno %d instead of %d...", verbose_msg("query '%s' failed with wrong errno %d instead of %d...",
q->query, mysql_errno(mysql), q->expected_errno[0]); q->query, mysql_errno(mysql), q->expected_errno[0]);
error=1; error= 1;
goto end; goto end;
} }
replace_dynstr_append_mem(ds,mysql_error(mysql),
strlen(mysql_error(mysql)));
dynstr_append_mem(ds,"\n",1);
verbose_msg("query '%s' failed: %d: %s", q->query, mysql_errno(mysql), verbose_msg("query '%s' failed: %d: %s", q->query, mysql_errno(mysql),
mysql_error(mysql)); mysql_error(mysql));
/* /*
...@@ -2190,45 +2241,33 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) ...@@ -2190,45 +2241,33 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
goto end; goto end;
} }
if (!res)
goto end;
if (!disable_result_log) if (!disable_result_log)
{ {
fields = mysql_fetch_fields(res); if (res)
num_fields = mysql_num_fields(res); {
int num_fields= mysql_num_fields(res);
MYSQL_FIELD *fields= mysql_fetch_fields(res);
for (i = 0; i < num_fields; i++) for (i = 0; i < num_fields; i++)
{ {
if (i) if (i)
dynstr_append_mem(ds, "\t", 1); dynstr_append_mem(ds, "\t", 1);
dynstr_append(ds, fields[i].name); dynstr_append(ds, fields[i].name);
} }
dynstr_append_mem(ds, "\n", 1); dynstr_append_mem(ds, "\n", 1);
append_result(ds, res);
while ((row = mysql_fetch_row(res)))
{
lengths = mysql_fetch_lengths(res);
for (i = 0; i < num_fields; i++)
{
val = (char*)row[i];
len = lengths[i];
if (!val)
{
val = (char*)"NULL";
len = 4;
} }
if (i) if (!disable_info && mysql_info(mysql))
dynstr_append_mem(ds, "\t", 1); {
replace_dynstr_append_mem(ds, val, len); dynstr_append(ds, "info: ");
} dynstr_append(ds, mysql_info(mysql));
dynstr_append_mem(ds, "\n", 1); dynstr_append_mem(ds, "\n", 1);
} }
}
if (glob_replace) if (glob_replace)
free_replace(); free_replace();
}
if (record) if (record)
{ {
if (!q->record_file[0] && !result_file) if (!q->record_file[0] && !result_file)
...@@ -2273,7 +2312,7 @@ void get_query_type(struct st_query* q) ...@@ -2273,7 +2312,7 @@ void get_query_type(struct st_query* q)
q->type=(enum enum_commands) type; /* Found command */ q->type=(enum enum_commands) type; /* Found command */
} }
static byte* get_var_key(const byte* var, uint* len, static byte *get_var_key(const byte* var, uint* len,
my_bool __attribute__((unused)) t) my_bool __attribute__((unused)) t)
{ {
register char* key; register char* key;
...@@ -2282,11 +2321,11 @@ static byte* get_var_key(const byte* var, uint* len, ...@@ -2282,11 +2321,11 @@ static byte* get_var_key(const byte* var, uint* len,
return (byte*)key; return (byte*)key;
} }
static VAR* var_init(VAR* v, const char* name, int name_len, const char* val, static VAR *var_init(VAR *v, const char *name, int name_len, const char *val,
int val_len) int val_len)
{ {
int val_alloc_len; int val_alloc_len;
VAR* tmp_var; VAR *tmp_var;
if (!name_len && name) if (!name_len && name)
name_len = strlen(name); name_len = strlen(name);
if (!val_len && val) if (!val_len && val)
...@@ -2302,7 +2341,6 @@ static VAR* var_init(VAR* v, const char* name, int name_len, const char* val, ...@@ -2302,7 +2341,6 @@ static VAR* var_init(VAR* v, const char* name, int name_len, const char* val,
if (!(tmp_var->str_val = my_malloc(val_alloc_len+1, MYF(MY_WME)))) if (!(tmp_var->str_val = my_malloc(val_alloc_len+1, MYF(MY_WME))))
die("Out of memory"); die("Out of memory");
/* 'name' may be NULL here, but in this case name_len is 0 */
memcpy(tmp_var->name, name, name_len); memcpy(tmp_var->name, name, name_len);
if (val) if (val)
{ {
...@@ -2317,7 +2355,7 @@ static VAR* var_init(VAR* v, const char* name, int name_len, const char* val, ...@@ -2317,7 +2355,7 @@ static VAR* var_init(VAR* v, const char* name, int name_len, const char* val,
return tmp_var; return tmp_var;
} }
static void var_free(void* v) static void var_free(void *v)
{ {
my_free(((VAR*) v)->str_val, MYF(MY_WME)); my_free(((VAR*) v)->str_val, MYF(MY_WME));
if (((VAR*)v)->alloced) if (((VAR*)v)->alloced)
...@@ -2325,38 +2363,42 @@ static void var_free(void* v) ...@@ -2325,38 +2363,42 @@ static void var_free(void* v)
} }
static void var_from_env(const char* name, const char* def_val) static void var_from_env(const char *name, const char *def_val)
{ {
const char* tmp; const char *tmp;
VAR* v; VAR *v;
if (!(tmp = getenv(name))) if (!(tmp = getenv(name)))
tmp = def_val; tmp = def_val;
v = var_init(0, name, 0, tmp, 0); v = var_init(0, name, 0, tmp, 0);
hash_insert(&var_hash, (byte*)v); my_hash_insert(&var_hash, (byte*)v);
} }
static void init_var_hash() static void init_var_hash(MYSQL *mysql)
{ {
VAR* v; VAR *v;
DBUG_ENTER("init_var_hash"); DBUG_ENTER("init_var_hash");
if (hash_init(&var_hash, 1024, 0, 0, get_var_key, var_free, MYF(0))) if (hash_init(&var_hash,
1024, 0, 0, get_var_key, var_free, MYF(0)))
die("Variable hash initialization failed"); die("Variable hash initialization failed");
var_from_env("MASTER_MYPORT", "9306"); var_from_env("MASTER_MYPORT", "9306");
var_from_env("SLAVE_MYPORT", "9307"); var_from_env("SLAVE_MYPORT", "9307");
var_from_env("MYSQL_TEST_DIR", "/tmp"); var_from_env("MYSQL_TEST_DIR", "/tmp");
var_from_env("BIG_TEST", opt_big_test ? "1" : "0"); var_from_env("BIG_TEST", opt_big_test ? "1" : "0");
v=var_init(0,"MAX_TABLES", 0, (sizeof(ulong) == 4) ? "31" : "63",0); v= var_init(0,"MAX_TABLES", 0, (sizeof(ulong) == 4) ? "31" : "62",0);
hash_insert(&var_hash, (byte*)v); my_hash_insert(&var_hash, (byte*) v);
v= var_init(0,"SERVER_VERSION", 0, mysql_get_server_info(mysql), 0);
my_hash_insert(&var_hash, (byte*) v);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
int main(int argc, char** argv) int main(int argc, char **argv)
{ {
int error = 0; int error = 0;
struct st_query* q; struct st_query *q;
my_bool require_file=0, q_send_flag=0; my_bool require_file=0, q_send_flag=0;
char save_file[FN_REFLEN]; char save_file[FN_REFLEN];
MY_INIT(argv[0]); MY_INIT(argv[0]);
...@@ -2381,7 +2423,6 @@ int main(int argc, char** argv) ...@@ -2381,7 +2423,6 @@ int main(int argc, char** argv)
memset(block_stack, 0, sizeof(block_stack)); memset(block_stack, 0, sizeof(block_stack));
block_stack_end = block_stack + BLOCK_STACK_DEPTH; block_stack_end = block_stack + BLOCK_STACK_DEPTH;
memset(block_ok_stack, 0, sizeof(block_stack)); memset(block_ok_stack, 0, sizeof(block_stack));
block_ok_stack_end = block_ok_stack + BLOCK_STACK_DEPTH;
cur_block = block_stack; cur_block = block_stack;
block_ok = block_ok_stack; block_ok = block_ok_stack;
*block_ok = 1; *block_ok = 1;
...@@ -2391,7 +2432,6 @@ int main(int argc, char** argv) ...@@ -2391,7 +2432,6 @@ int main(int argc, char** argv)
embedded_server_args, embedded_server_args,
(char**) embedded_server_groups)) (char**) embedded_server_groups))
die("Can't initialize MySQL server"); die("Can't initialize MySQL server");
init_var_hash();
if (cur_file == file_stack) if (cur_file == file_stack)
*++cur_file = stdin; *++cur_file = stdin;
*lineno=1; *lineno=1;
...@@ -2410,14 +2450,14 @@ int main(int argc, char** argv) ...@@ -2410,14 +2450,14 @@ int main(int argc, char** argv)
opt_ssl_capath, opt_ssl_cipher); opt_ssl_capath, opt_ssl_cipher);
#endif #endif
cur_con->name = my_strdup("default", MYF(MY_WME)); if (!(cur_con->name = my_strdup("default", MYF(MY_WME))))
if (!cur_con->name)
die("Out of memory"); die("Out of memory");
if (safe_connect(&cur_con->mysql, host, if (safe_connect(&cur_con->mysql, host, user, pass, db, port, unix_sock))
user, pass, db, port, unix_sock))
die("Failed in mysql_real_connect(): %s", mysql_error(&cur_con->mysql)); die("Failed in mysql_real_connect(): %s", mysql_error(&cur_con->mysql));
init_var_hash(&cur_con->mysql);
while (!read_query(&q)) while (!read_query(&q))
{ {
int current_line_inc = 1, processed = 0; int current_line_inc = 1, processed = 0;
...@@ -2439,6 +2479,10 @@ int main(int argc, char** argv) ...@@ -2439,6 +2479,10 @@ int main(int argc, char** argv)
case Q_DISABLE_QUERY_LOG: disable_query_log=1; break; case Q_DISABLE_QUERY_LOG: disable_query_log=1; break;
case Q_ENABLE_RESULT_LOG: disable_result_log=0; break; case Q_ENABLE_RESULT_LOG: disable_result_log=0; break;
case Q_DISABLE_RESULT_LOG: disable_result_log=1; break; case Q_DISABLE_RESULT_LOG: disable_result_log=1; break;
case Q_ENABLE_WARNINGS: disable_warnings=0; break;
case Q_DISABLE_WARNINGS: disable_warnings=1; break;
case Q_ENABLE_INFO: disable_info=0; break;
case Q_DISABLE_INFO: disable_info=1; break;
case Q_SOURCE: do_source(q); break; case Q_SOURCE: do_source(q); break;
case Q_SLEEP: do_sleep(q, 0); break; case Q_SLEEP: do_sleep(q, 0); break;
case Q_REAL_SLEEP: do_sleep(q, 1); break; case Q_REAL_SLEEP: do_sleep(q, 1); break;
...@@ -2515,6 +2559,9 @@ int main(int argc, char** argv) ...@@ -2515,6 +2559,9 @@ int main(int argc, char** argv)
case Q_REPLACE: case Q_REPLACE:
get_replace(q); get_replace(q);
break; break;
case Q_REPLACE_COLUMN:
get_replace_column(q);
break;
case Q_SAVE_MASTER_POS: do_save_master_pos(); break; case Q_SAVE_MASTER_POS: do_save_master_pos(); break;
case Q_SYNC_WITH_MASTER: do_sync_with_master(q); break; case Q_SYNC_WITH_MASTER: do_sync_with_master(q); break;
case Q_SYNC_SLAVE_WITH_MASTER: case Q_SYNC_SLAVE_WITH_MASTER:
...@@ -2565,7 +2612,8 @@ int main(int argc, char** argv) ...@@ -2565,7 +2612,8 @@ int main(int argc, char** argv)
} }
dynstr_free(&ds_res); dynstr_free(&ds_res);
if (!silent) { if (!silent)
{
if (error) if (error)
printf("not ok\n"); printf("not ok\n");
else else
...@@ -2584,7 +2632,7 @@ int main(int argc, char** argv) ...@@ -2584,7 +2632,7 @@ int main(int argc, char** argv)
*/ */
static int read_server_arguments(const char* name) static int read_server_arguments(const char *name)
{ {
char argument[1024],buff[FN_REFLEN], *str=0; char argument[1024],buff[FN_REFLEN], *str=0;
FILE *file; FILE *file;
...@@ -3336,3 +3384,60 @@ static void free_replace_buffer(void) ...@@ -3336,3 +3384,60 @@ static void free_replace_buffer(void)
{ {
my_free(out_buff,MYF(MY_WME)); my_free(out_buff,MYF(MY_WME));
} }
/****************************************************************************
Replace results for a column
*****************************************************************************/
static void free_replace_column()
{
uint i;
for (i=0 ; i < max_replace_column ; i++)
{
if (replace_column[i])
{
my_free(replace_column[i], 0);
replace_column[i]= 0;
}
}
max_replace_column= 0;
}
/*
Get arguments for replace_columns. The syntax is:
replace-column column_number to_string [column_number to_string ...]
Where each argument may be quoted with ' or "
A argument may also be a variable, in which case the value of the
variable is replaced.
*/
static void get_replace_column(struct st_query *q)
{
char *from=q->first_argument;
char *buff,*start;
DBUG_ENTER("get_replace_columns");
free_replace_column();
if (!*from)
die("Missing argument in %s\n", q->query);
/* Allocate a buffer for results */
start=buff=my_malloc(strlen(from)+1,MYF(MY_WME | MY_FAE));
while (*from)
{
char *to;
uint column_number;
to= get_string(&buff, &from, q);
if (!(column_number= atoi(to)) || column_number > MAX_COLUMNS)
die("Wrong column number to replace_columns in %s\n", q->query);
if (!*from)
die("Wrong number of arguments to replace in %s\n", q->query);
to= get_string(&buff, &from, q);
my_free(replace_column[column_number-1], MY_ALLOW_ZERO_PTR);
replace_column[column_number-1]= my_strdup(to, MYF(MY_WME | MY_FAE));
set_if_bigger(max_replace_column, column_number);
}
my_free(start, MYF(0));
}
...@@ -167,7 +167,7 @@ extern char *my_strdup_with_length(const byte *from, uint length, ...@@ -167,7 +167,7 @@ extern char *my_strdup_with_length(const byte *from, uint length,
#if defined(_AIX) && !defined(__GNUC__) #if defined(_AIX) && !defined(__GNUC__)
#pragma alloca #pragma alloca
#endif /* _AIX */ #endif /* _AIX */
#if defined(__GNUC__) && !defined(HAVE_ALLOCA_H) #if defined(__GNUC__) && !defined(HAVE_ALLOCA_H) && ! defined(alloca)
#define alloca __builtin_alloca #define alloca __builtin_alloca
#endif /* GNUC */ #endif /* GNUC */
#define my_alloca(SZ) alloca((size_t) (SZ)) #define my_alloca(SZ) alloca((size_t) (SZ))
......
...@@ -1188,9 +1188,8 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info, ...@@ -1188,9 +1188,8 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info,
if (!rep_quick) if (!rep_quick)
{ {
/* Get real path for data file */ /* Get real path for data file */
fn_format(param->temp_filename,name,"", MI_NAME_DEXT,2+4+32);
if ((new_file=my_raid_create(fn_format(param->temp_filename, if ((new_file=my_raid_create(fn_format(param->temp_filename,
param->temp_filename,"", share->data_file_name, "",
DATA_TMP_EXT, 2+4), DATA_TMP_EXT, 2+4),
0,param->tmpfile_createflag, 0,param->tmpfile_createflag,
share->base.raid_type, share->base.raid_type,
...@@ -1861,11 +1860,9 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info, ...@@ -1861,11 +1860,9 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
if (!rep_quick) if (!rep_quick)
{ {
/* Get real path for data file */ /* Get real path for data file */
fn_format(param->temp_filename,name,"", MI_NAME_DEXT,2+4+32);
if ((new_file=my_raid_create(fn_format(param->temp_filename, if ((new_file=my_raid_create(fn_format(param->temp_filename,
param->temp_filename, "", share->data_file_name, "",
DATA_TMP_EXT, DATA_TMP_EXT, 2+4),
2+4),
0,param->tmpfile_createflag, 0,param->tmpfile_createflag,
share->base.raid_type, share->base.raid_type,
share->base.raid_chunks, share->base.raid_chunks,
...@@ -2225,9 +2222,8 @@ int mi_repair_parallel(MI_CHECK *param, register MI_INFO *info, ...@@ -2225,9 +2222,8 @@ int mi_repair_parallel(MI_CHECK *param, register MI_INFO *info,
if (!rep_quick) if (!rep_quick)
{ {
/* Get real path for data file */ /* Get real path for data file */
fn_format(param->temp_filename,name,"", MI_NAME_DEXT,2+4+32);
if ((new_file=my_raid_create(fn_format(param->temp_filename, if ((new_file=my_raid_create(fn_format(param->temp_filename,
param->temp_filename, "", share->data_file_name, "",
DATA_TMP_EXT, DATA_TMP_EXT,
2+4), 2+4),
0,param->tmpfile_createflag, 0,param->tmpfile_createflag,
......
...@@ -142,7 +142,7 @@ insert into t1 values (17); ...@@ -142,7 +142,7 @@ insert into t1 values (17);
handler t2 read first; handler t2 read first;
Unknown table 't2' in HANDLER Unknown table 't2' in HANDLER
handler t1 open as t2; handler t1 open as t2;
alter table t1 type=MyISAM; alter table t1 engine=MyISAM;
handler t2 read first; handler t2 read first;
Unknown table 't2' in HANDLER Unknown table 't2' in HANDLER
drop table t1; drop table t1;
......
...@@ -26,7 +26,7 @@ select @@global.max_relay_log_size; ...@@ -26,7 +26,7 @@ select @@global.max_relay_log_size;
start slave; start slave;
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
127.0.0.1 root MASTER_PORT 1 master-bin.001 50477 slave-relay-bin.004 9457 master-bin.001 Yes Yes 0 0 50477 9457 127.0.0.1 root MASTER_PORT 1 master-bin.001 50477 slave-relay-bin.004 9457 master-bin.001 Yes Yes 0 0 50477 #
stop slave; stop slave;
reset slave; reset slave;
set global max_relay_log_size=0; set global max_relay_log_size=0;
......
...@@ -16,13 +16,12 @@ create table t1 (s text); ...@@ -16,13 +16,12 @@ create table t1 (s text);
insert into t1 values('Could not break slave'),('Tried hard'); insert into t1 values('Could not break slave'),('Tried hard');
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
127.0.0.1 root MASTER_PORT 60 master-bin.001 417 slave-relay-bin.001 458 master-bin.001 Yes Yes 0 0 417 458 127.0.0.1 root MASTER_PORT 60 master-bin.001 417 slave-relay-bin.001 458 master-bin.001 Yes Yes 0 0 417 #
select * from t1; select * from t1;
s s
Could not break slave Could not break slave
Tried hard Tried hard
flush logs; flush logs;
drop table if exists t2;
create table t2(m int not null auto_increment primary key); create table t2(m int not null auto_increment primary key);
insert into t2 values (34),(67),(123); insert into t2 values (34),(67),(123);
flush logs; flush logs;
...@@ -48,7 +47,7 @@ master-bin.003 ...@@ -48,7 +47,7 @@ master-bin.003
insert into t2 values (65); insert into t2 values (65);
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
127.0.0.1 root MASTER_PORT 60 master-bin.003 290 slave-relay-bin.001 1073 master-bin.003 Yes Yes 0 0 290 1073 127.0.0.1 root MASTER_PORT 60 master-bin.003 290 slave-relay-bin.001 1073 master-bin.003 Yes Yes 0 0 290 #
select * from t2; select * from t2;
m m
34 34
...@@ -58,8 +57,10 @@ m ...@@ -58,8 +57,10 @@ m
1234 1234
create temporary table temp_table (a char(80) not null); create temporary table temp_table (a char(80) not null);
insert into temp_table values ("testing temporary tables part 2"); insert into temp_table values ("testing temporary tables part 2");
drop table if exists t3;
create table t3 (n int); create table t3 (n int);
select count(*) from t3 where n >= 4;
count(*)
100
create table t4 select * from temp_table; create table t4 select * from temp_table;
show master logs; show master logs;
Log_name Log_name
...@@ -73,7 +74,7 @@ a ...@@ -73,7 +74,7 @@ a
testing temporary tables part 2 testing temporary tables part 2
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
127.0.0.1 root MASTER_PORT 60 master-bin.004 2886 slave-relay-bin.001 7870 master-bin.004 Yes Yes 0 0 2886 7870 127.0.0.1 root MASTER_PORT 60 master-bin.004 2886 slave-relay-bin.001 7870 master-bin.004 Yes Yes 0 0 2886 #
lock tables t3 read; lock tables t3 read;
select count(*) from t3 where n >= 4; select count(*) from t3 where n >= 4;
count(*) count(*)
......
...@@ -10,4 +10,4 @@ reset slave; ...@@ -10,4 +10,4 @@ reset slave;
start slave; start slave;
show slave status; show slave status;
Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos Relay_log_space
127.0.0.1 root MASTER_PORT 1 master-bin.002 4 slave-relay-bin.002 161 master-bin.001 Yes No 0 Rolling back unfinished transaction (no COMMIT or ROLLBACK) from relay log. Probably cause is that the master died while writing the transaction to it's binary log. 0 79 317 127.0.0.1 root MASTER_PORT 1 master-bin.002 4 slave-relay-bin.002 161 master-bin.001 Yes No 0 Rolling back unfinished transaction (no COMMIT or ROLLBACK) from relay log. Probably cause is that the master died while writing the transaction to it's binary log. 0 79 #
...@@ -75,7 +75,7 @@ insert into t1 values (17); ...@@ -75,7 +75,7 @@ insert into t1 values (17);
--error 1109 --error 1109
handler t2 read first; handler t2 read first;
handler t1 open as t2; handler t1 open as t2;
alter table t1 type=MyISAM; alter table t1 engine=MyISAM;
--error 1109 --error 1109
handler t2 read first; handler t2 read first;
drop table t1; drop table t1;
......
...@@ -23,9 +23,9 @@ sleep 5; ...@@ -23,9 +23,9 @@ sleep 5;
show slave status; show slave status;
slave stop; slave stop;
change master to master_log_pos=173; change master to master_log_pos=173;
--replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT
slave start; slave start;
sleep 2; sleep 2;
--replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT
show slave status; show slave status;
connection master; connection master;
show master status; show master status;
......
...@@ -37,6 +37,7 @@ select @@global.max_relay_log_size; ...@@ -37,6 +37,7 @@ select @@global.max_relay_log_size;
start slave; start slave;
sync_with_master; sync_with_master;
--replace_result $MASTER_MYPORT MASTER_PORT 3306 MASTER_PORT 3334 MASTER_PORT --replace_result $MASTER_MYPORT MASTER_PORT 3306 MASTER_PORT 3334 MASTER_PORT
--replace_column 18 #
show slave status; show slave status;
stop slave; stop slave;
reset slave; reset slave;
......
...@@ -50,11 +50,11 @@ save_master_pos; ...@@ -50,11 +50,11 @@ save_master_pos;
connection slave; connection slave;
sync_with_master; sync_with_master;
--replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT
--replace_column 18 #
show slave status; show slave status;
select * from t1; select * from t1;
connection master; connection master;
flush logs; flush logs;
drop table if exists t2;
create table t2(m int not null auto_increment primary key); create table t2(m int not null auto_increment primary key);
insert into t2 values (34),(67),(123); insert into t2 values (34),(67),(123);
flush logs; flush logs;
...@@ -102,6 +102,7 @@ save_master_pos; ...@@ -102,6 +102,7 @@ save_master_pos;
connection slave; connection slave;
sync_with_master; sync_with_master;
--replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT
--replace_column 18 #
show slave status; show slave status;
select * from t2; select * from t2;
...@@ -113,7 +114,7 @@ connection master; ...@@ -113,7 +114,7 @@ connection master;
create temporary table temp_table (a char(80) not null); create temporary table temp_table (a char(80) not null);
insert into temp_table values ("testing temporary tables part 2"); insert into temp_table values ("testing temporary tables part 2");
let $1=100; let $1=100;
drop table if exists t3;
create table t3 (n int); create table t3 (n int);
disable_query_log; disable_query_log;
while ($1) while ($1)
...@@ -123,17 +124,17 @@ while ($1) ...@@ -123,17 +124,17 @@ while ($1)
dec $1; dec $1;
} }
enable_query_log; enable_query_log;
select count(*) from t3 where n >= 4;
create table t4 select * from temp_table; create table t4 select * from temp_table;
show master logs; show master logs;
show master status; show master status;
save_master_pos; save_master_pos;
connection slave; connection slave;
#slave stop;
#slave start;
sync_with_master; sync_with_master;
select * from t4; select * from t4;
--replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT --replace_result 3306 MASTER_PORT 9306 MASTER_PORT 3334 MASTER_PORT 3336 MASTER_PORT
--replace_column 18 #
show slave status; show slave status;
# because of concurrent insert, the table may not be up to date # because of concurrent insert, the table may not be up to date
# if we do not lock # if we do not lock
......
...@@ -21,4 +21,5 @@ start slave; ...@@ -21,4 +21,5 @@ start slave;
# can't sync_with_master so we must sleep # can't sync_with_master so we must sleep
sleep 3; sleep 3;
--replace_result $MASTER_MYPORT MASTER_PORT --replace_result $MASTER_MYPORT MASTER_PORT
--replace_column 18 #
show slave status; show slave status;
...@@ -72,6 +72,7 @@ int my_symlink(const char *content, const char *linkname, myf MyFlags) ...@@ -72,6 +72,7 @@ int my_symlink(const char *content, const char *linkname, myf MyFlags)
#else #else
int result; int result;
DBUG_ENTER("my_symlink"); DBUG_ENTER("my_symlink");
DBUG_PRINT("enter",("content: %s linkname: %s", content, linkname));
result= 0; result= 0;
if (symlink(content, linkname)) if (symlink(content, linkname))
......
...@@ -131,6 +131,7 @@ static SYMBOL symbols[] = { ...@@ -131,6 +131,7 @@ static SYMBOL symbols[] = {
{ "DYNAMIC", SYM(DYNAMIC_SYM),0,0}, { "DYNAMIC", SYM(DYNAMIC_SYM),0,0},
{ "END", SYM(END),0,0}, { "END", SYM(END),0,0},
{ "ELSE", SYM(ELSE),0,0}, { "ELSE", SYM(ELSE),0,0},
{ "ENGINE", SYM(TYPE_SYM),0,0}, /* Alias for TYPE= */
{ "ESCAPE", SYM(ESCAPE_SYM),0,0}, { "ESCAPE", SYM(ESCAPE_SYM),0,0},
{ "ESCAPED", SYM(ESCAPED),0,0}, { "ESCAPED", SYM(ESCAPED),0,0},
{ "ENABLE", SYM(ENABLE_SYM),0,0}, { "ENABLE", SYM(ENABLE_SYM),0,0},
......
...@@ -2593,8 +2593,8 @@ int main(int argc, char **argv) ...@@ -2593,8 +2593,8 @@ int main(int argc, char **argv)
{ {
char file_path[FN_REFLEN]; char file_path[FN_REFLEN];
my_path(file_path, argv[0], ""); /* Find name in path */ my_path(file_path, argv[0], ""); /* Find name in path */
fn_format(file_path,argv[0],file_path,"",MY_REPLACE_DIR+ fn_format(file_path,argv[0],file_path,"",
MY_UNPACK_FILENAME | MY_RESOLVE_SYMLINKS); MY_REPLACE_DIR | MY_UNPACK_FILENAME | MY_RESOLVE_SYMLINKS);
if (argc == 2) if (argc == 2)
{ {
if (!default_service_handling(argv, MYSQL_SERVICENAME, MYSQL_SERVICENAME, if (!default_service_handling(argv, MYSQL_SERVICENAME, MYSQL_SERVICENAME,
......
...@@ -35,8 +35,6 @@ ...@@ -35,8 +35,6 @@
it can be compiled with the UNSIGNED and/or LONGLONG flag set it can be compiled with the UNSIGNED and/or LONGLONG flag set
*/ */
#define strtoll glob_strtoll /* Fix for True64 */
#include <my_global.h> #include <my_global.h>
#include "m_string.h" #include "m_string.h"
#include "m_ctype.h" #include "m_ctype.h"
......
...@@ -16,8 +16,9 @@ ...@@ -16,8 +16,9 @@
/* This is defines strtoll() if neaded */ /* This is defines strtoll() if neaded */
#define strtoll glob_strtoll /* Fix for True64 */
#include <my_global.h> #include <my_global.h>
#include <m_string.h>
#if !defined(HAVE_STRTOLL) && defined(HAVE_LONG_LONG) #if !defined(HAVE_STRTOLL) && defined(HAVE_LONG_LONG)
#define USE_LONGLONG #define USE_LONGLONG
#include "strto.c" #include "strto.c"
......
...@@ -17,7 +17,6 @@ ...@@ -17,7 +17,6 @@
/* This is defines strtoull() */ /* This is defines strtoull() */
#include <my_global.h> #include <my_global.h>
#include <m_string.h>
#if !defined(HAVE_STRTOULL) && defined(HAVE_LONG_LONG) #if !defined(HAVE_STRTOULL) && defined(HAVE_LONG_LONG)
#define USE_UNSIGNED #define USE_UNSIGNED
#define USE_LONGLONG #define USE_LONGLONG
......
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