Commit 361067e9 authored by monty@donna.mysql.com's avatar monty@donna.mysql.com

Extended mysqltest with --commands and 'require'

Fixed test results.
Added mysqld variable 'have_isam'
parent 988a98c3
...@@ -183,3 +183,4 @@ mysqld.S ...@@ -183,3 +183,4 @@ mysqld.S
mysqld.sym mysqld.sym
.snprj/* .snprj/*
sql-bench/output/* sql-bench/output/*
sql-bench/Results-linux/ATIS-mysql_bdb-Linux_2.2.14_my_SMP_i686
...@@ -20271,7 +20271,7 @@ differ somewhat: ...@@ -20271,7 +20271,7 @@ differ somewhat:
| flush | OFF | | flush | OFF |
| flush_time | 0 | | flush_time | 0 |
| have_bdb | YES | | have_bdb | YES |
| have_gemeni | NO | | have_gemini | NO |
| have_innobase | YES | | have_innobase | YES |
| have_raid | YES | | have_raid | YES |
| have_ssl | NO | | have_ssl | NO |
...@@ -20449,9 +20449,9 @@ very little resources. ...@@ -20449,9 +20449,9 @@ very little resources.
@item @code{have_bdb} @item @code{have_bdb}
@code{YES} if @code{mysqld} supports Berkeley DB tables. @code{DISABLED} @code{YES} if @code{mysqld} supports Berkeley DB tables. @code{DISABLED}
if @code{--skip-bdb} is used. if @code{--skip-bdb} is used.
@item @code{have_gemeni} @item @code{have_gemini}
@code{YES} if @code{mysqld} supports Gemeni tables. @code{DISABLED} @code{YES} if @code{mysqld} supports Gemini tables. @code{DISABLED}
if @code{--skip-gemeni} is used. if @code{--skip-gemini} is used.
@item @code{have_innobase} @item @code{have_innobase}
@code{YES} if @code{mysqld} supports Innobase tables. @code{DISABLED} @code{YES} if @code{mysqld} supports Innobase tables. @code{DISABLED}
if @code{--skip-innobase} is used. if @code{--skip-innobase} is used.
...@@ -40052,7 +40052,7 @@ though, so Version 3.23 is not released as a stable version yet. ...@@ -40052,7 +40052,7 @@ though, so Version 3.23 is not released as a stable version yet.
@item @item
Added option @code{--safe-show-databases}. Added option @code{--safe-show-databases}.
@item @item
Added @code{have_bdb}, @code{have_gemeni}, @code{have_innobase}, Added @code{have_bdb}, @code{have_gemini}, @code{have_innobase},
@code{have_raid} and @code{have_ssl} to @code{SHOW VARIABLES} to make it @code{have_raid} and @code{have_ssl} to @code{SHOW VARIABLES} to make it
easy to test for supported extensions. easy to test for supported extensions.
@item @item
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
* *
**/ **/
#define MTEST_VERSION "1.0" #define MTEST_VERSION "1.1"
#include "global.h" #include "global.h"
#include "my_sys.h" #include "my_sys.h"
...@@ -42,12 +42,12 @@ ...@@ -42,12 +42,12 @@
#include <errno.h> #include <errno.h>
#define MAX_QUERY 16384 #define MAX_QUERY 16384
#define PAD_SIZE 128 #define PAD_SIZE 128
#define MAX_CONS 1024 #define MAX_CONS 1024
#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
#define MIN_VAR_ALLOC 32 #define MIN_VAR_ALLOC 32
#define BLOCK_STACK_DEPTH 32 #define BLOCK_STACK_DEPTH 32
int record = 0, verbose = 0, silent = 0; int record = 0, verbose = 0, silent = 0;
...@@ -100,21 +100,31 @@ VAR var_reg[10]; ...@@ -100,21 +100,31 @@ VAR var_reg[10];
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;
/* this should really be called command*/ /* this should really be called command */
struct query struct query
{ {
char q[MAX_QUERY]; char q[MAX_QUERY];
int has_result_set;
int first_word_len; int first_word_len;
int abort_on_error; my_bool abort_on_error, require_file;
uint expected_errno; uint expected_errno;
char record_file[FN_REFLEN]; char record_file[FN_REFLEN];
enum {Q_CONNECTION, Q_QUERY, Q_CONNECT, /* Add new commands before Q_UNKNOWN */
Q_SLEEP, Q_INC, Q_DEC,Q_SOURCE, enum { Q_CONNECTION=1, Q_QUERY, Q_CONNECT,
Q_DISCONNECT,Q_LET, Q_ECHO, Q_WHILE, Q_END_BLOCK, Q_SLEEP, Q_INC, Q_DEC,Q_SOURCE,
Q_SYSTEM, Q_UNKNOWN} type; Q_DISCONNECT,Q_LET, Q_ECHO, Q_WHILE, Q_END_BLOCK,
Q_SYSTEM, Q_RESULT, Q_REQUIRE,
Q_UNKNOWN, Q_COMMENT, Q_COMMENT_WITH_COMMAND} type;
}; };
const char *command_names[] = {
"connection", "query","connect","sleep","inc","dec","source","disconnect",
"let","echo","while","end","system","result", "require",0
};
TYPELIB command_typelib= {array_elements(command_names),"",
command_names};
#define DS_CHUNK 16384 #define DS_CHUNK 16384
typedef struct dyn_string typedef struct dyn_string
...@@ -131,11 +141,53 @@ void dyn_string_append(DYN_STRING* ds, const char* str, int len); ...@@ -131,11 +141,53 @@ void dyn_string_append(DYN_STRING* ds, const char* str, int len);
int dyn_string_cmp(DYN_STRING* ds, const char* fname); int dyn_string_cmp(DYN_STRING* ds, const char* fname);
void reject_dump(const char* record_file, char* buf, int size); void reject_dump(const char* record_file, char* buf, int size);
static void die(const char* fmt, ...);
int close_connection(struct query* q); int close_connection(struct query* q);
VAR* var_get(char* var_name, char* var_name_end, int raw); VAR* var_get(char* var_name, char* var_name_end, int raw);
void verbose_msg(const char* fmt, ...);
static void close_cons()
{
for(--next_con; next_con >= cons; --next_con)
{
mysql_close(&next_con->mysql);
my_free(next_con->name, MYF(MY_ALLOW_ZERO_PTR));
}
}
static void die(const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
fprintf(stderr, "%s: ", my_progname);
vfprintf(stderr, fmt, args);
fprintf(stderr, "\n");
va_end(args);
close_cons();
exit(1);
}
static void abort_not_supported_test()
{
fprintf(stderr, "This test is not supported by this installation\n");
if (!silent)
printf("skipped\n");
close_cons();
exit(2);
}
static void verbose_msg(const char* fmt, ...)
{
va_list args;
if (!verbose) return;
va_start(args, fmt);
fprintf(stderr, "%s: ", my_progname);
vfprintf(stderr, fmt, args);
fprintf(stderr, "\n");
va_end(args);
}
void init_parser() void init_parser()
{ {
...@@ -145,9 +197,9 @@ void init_parser() ...@@ -145,9 +197,9 @@ void init_parser()
int hex_val(int c) int hex_val(int c)
{ {
if(isdigit(c)) if (isdigit(c))
return c - '0'; return c - '0';
else if((c = tolower(c)) >= 'a' && c <= 'f') else if ((c = tolower(c)) >= 'a' && c <= 'f')
return c - 'a' + 10; return c - 'a' + 10;
else else
return -1; return -1;
...@@ -155,7 +207,7 @@ int hex_val(int c) ...@@ -155,7 +207,7 @@ int hex_val(int c)
void dyn_string_init(DYN_STRING* ds) void dyn_string_init(DYN_STRING* ds)
{ {
if(!(ds->str = (char*)my_malloc(DS_CHUNK, MYF(0)))) if (!(ds->str = (char*)my_malloc(DS_CHUNK, MYF(0))))
die("Out of memory"); die("Out of memory");
ds->len = 0; ds->len = 0;
ds->max_len = DS_CHUNK; ds->max_len = DS_CHUNK;
...@@ -170,14 +222,14 @@ void dyn_string_end(DYN_STRING* ds) ...@@ -170,14 +222,14 @@ void dyn_string_end(DYN_STRING* ds)
void dyn_string_append(DYN_STRING* ds, const char* str, int len) void dyn_string_append(DYN_STRING* ds, const char* str, int len)
{ {
int new_len; int new_len;
if(!len) if (!len)
len = strlen(str); len = strlen(str);
new_len = ds->len + len; new_len = ds->len + len;
if(new_len > ds->max_len) if (new_len > ds->max_len)
{ {
int new_alloc_len = (new_len & ~(DS_CHUNK-1)) + DS_CHUNK; int new_alloc_len = (new_len & ~(DS_CHUNK-1)) + DS_CHUNK;
char* tmp = (char*) my_malloc(new_alloc_len, MYF(0)); char* tmp = (char*) my_malloc(new_alloc_len, MYF(0));
if(!tmp) if (!tmp)
die("Out of memory"); die("Out of memory");
memcpy(tmp, ds->str, ds->len); memcpy(tmp, ds->str, ds->len);
memcpy(tmp + ds->len, str, len); memcpy(tmp + ds->len, str, len);
...@@ -192,21 +244,23 @@ void dyn_string_append(DYN_STRING* ds, const char* str, int len) ...@@ -192,21 +244,23 @@ void dyn_string_append(DYN_STRING* ds, const char* str, int len)
ds->len += len; ds->len += len;
} }
} }
int dyn_string_cmp(DYN_STRING* ds, const char* fname) int dyn_string_cmp(DYN_STRING* ds, const char* fname)
{ {
MY_STAT stat_info; MY_STAT stat_info;
char *tmp; char *tmp;
int res; int res;
int fd; int fd;
if(!my_stat(fname, &stat_info, MYF(MY_WME))) if (!my_stat(fname, &stat_info, MYF(MY_WME)))
die("Could not stat %s: errno =%d", fname, errno); die("Could not stat %s: errno =%d", fname, errno);
if(stat_info.st_size != ds->len) if (stat_info.st_size != ds->len)
return 2; return 2;
if(!(tmp = (char*) my_malloc(ds->len, MYF(0)))) if (!(tmp = (char*) my_malloc(ds->len, MYF(0))))
die("Out of memory"); die("Out of memory");
if((fd = my_open(fname, O_RDONLY, MYF(MY_WME))) < 0) if ((fd = my_open(fname, O_RDONLY, MYF(MY_WME))) < 0)
die("Could not open %s: errno = %d", fname, errno); die("Could not open %s: errno = %d", fname, errno);
if(my_read(fd, (byte*)tmp, stat_info.st_size, MYF(MY_WME|MY_NABP))) if (my_read(fd, (byte*)tmp, stat_info.st_size, MYF(MY_WME|MY_NABP)))
die("read failed"); die("read failed");
res = (memcmp(tmp, ds->str, stat_info.st_size)) ? 1 : 0; res = (memcmp(tmp, ds->str, stat_info.st_size)) ? 1 : 0;
my_free((gptr)tmp, MYF(0)); my_free((gptr)tmp, MYF(0));
...@@ -214,25 +268,30 @@ int dyn_string_cmp(DYN_STRING* ds, const char* fname) ...@@ -214,25 +268,30 @@ int dyn_string_cmp(DYN_STRING* ds, const char* fname)
return res; return res;
} }
int check_result(DYN_STRING* ds, const char* fname) static int check_result(DYN_STRING* ds, const char* fname,
my_bool require_option)
{ {
int error = 0; int error = 0;
switch(dyn_string_cmp(ds, fname)) int res=dyn_string_cmp(ds, fname);
{
case 0: if (res && require_option)
break; /* ok */ abort_not_supported_test();
case 2: switch (res)
verbose_msg("Result length mismatch"); {
error = 1; case 0:
break; break; /* ok */
case 1: case 2:
verbose_msg("Result content mismatch"); verbose_msg("Result length mismatch");
error = 1; error = 1;
break; break;
default: /* impossible */ case 1:
die("Unknown error code from dyn_string_cmp()"); verbose_msg("Result content mismatch");
} error = 1;
if(error) break;
default: /* impossible */
die("Unknown error code from dyn_string_cmp()");
}
if (error)
reject_dump(fname, ds->str, ds->len); reject_dump(fname, ds->str, ds->len);
return error; return error;
} }
...@@ -241,26 +300,26 @@ VAR* var_get(char* var_name, char* var_name_end, int raw) ...@@ -241,26 +300,26 @@ VAR* var_get(char* var_name, char* var_name_end, int raw)
{ {
int digit; int digit;
VAR* v; VAR* v;
if(*var_name++ != '$') if (*var_name++ != '$')
{ {
--var_name; --var_name;
goto err; goto err;
} }
digit = *var_name - '0'; digit = *var_name - '0';
if(!(digit < 10 && digit >= 0)) if (!(digit < 10 && digit >= 0))
{ {
--var_name; --var_name;
goto err; goto err;
} }
v = var_reg + digit; v = var_reg + digit;
if(!raw && v->int_dirty) if (!raw && v->int_dirty)
{ {
sprintf(v->str_val, "%d", v->int_val); sprintf(v->str_val, "%d", v->int_val);
v->int_dirty = 0; v->int_dirty = 0;
} }
return v; return v;
err: err:
if(var_name_end) if (var_name_end)
*var_name_end = 0; *var_name_end = 0;
die("Unsupported variable name: %s", var_name); die("Unsupported variable name: %s", var_name);
return 0; return 0;
...@@ -272,23 +331,23 @@ int var_set(char* var_name, char* var_name_end, char* var_val, ...@@ -272,23 +331,23 @@ int var_set(char* var_name, char* var_name_end, char* var_val,
int digit; int digit;
int val_len; int val_len;
VAR* v; VAR* v;
if(*var_name++ != '$') if (*var_name++ != '$')
{ {
--var_name; --var_name;
*var_name_end = 0; *var_name_end = 0;
die("Variable name in %s does not start with '$'", var_name); die("Variable name in %s does not start with '$'", var_name);
} }
digit = *var_name - '0'; digit = *var_name - '0';
if(!(digit < 10 && digit >= 0)) if (!(digit < 10 && digit >= 0))
{ {
*var_name_end = 0; *var_name_end = 0;
die("Unsupported variable name: %s", var_name); die("Unsupported variable name: %s", var_name);
} }
v = var_reg + digit; v = var_reg + digit;
if(v->alloced_len < (val_len = (int)(var_val_end - var_val)+1)) if (v->alloced_len < (val_len = (int)(var_val_end - var_val)+1))
{ {
v->alloced_len = (val_len < MIN_VAR_ALLOC) ? MIN_VAR_ALLOC : val_len; v->alloced_len = (val_len < MIN_VAR_ALLOC) ? MIN_VAR_ALLOC : val_len;
if(!(v->str_val = if (!(v->str_val =
v->str_val ? my_realloc(v->str_val, v->alloced_len, MYF(MY_WME)) : v->str_val ? my_realloc(v->str_val, v->alloced_len, MYF(MY_WME)) :
my_malloc(v->alloced_len, MYF(MY_WME)))) my_malloc(v->alloced_len, MYF(MY_WME))))
die("Out of memory"); die("Out of memory");
...@@ -302,9 +361,9 @@ int var_set(char* var_name, char* var_name_end, char* var_val, ...@@ -302,9 +361,9 @@ int var_set(char* var_name, char* var_name_end, char* var_val,
int open_file(const char* name) int open_file(const char* name)
{ {
if(*cur_file && ++cur_file == file_stack_end) if (*cur_file && ++cur_file == file_stack_end)
die("Source directives are nesting too deep"); die("Source directives are nesting too deep");
if(!(*cur_file = fopen(name, "r"))) if (!(*cur_file = my_fopen(name, O_RDONLY, MYF(MY_WME))))
die("Could not read '%s': errno %d\n", name, errno); die("Could not read '%s': errno %d\n", name, errno);
return 0; return 0;
...@@ -315,7 +374,7 @@ int do_source(struct query* q) ...@@ -315,7 +374,7 @@ int do_source(struct query* q)
char* p, *name; char* p, *name;
p = (char*)q->q + q->first_word_len; p = (char*)q->q + q->first_word_len;
while(*p && isspace(*p)) p++; while(*p && isspace(*p)) p++;
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 && !isspace(*p))
...@@ -329,9 +388,9 @@ int do_source(struct query* q) ...@@ -329,9 +388,9 @@ int do_source(struct query* q)
int eval_expr(VAR* v, char* p, char* p_end) int eval_expr(VAR* v, char* p, char* p_end)
{ {
VAR* vp; VAR* vp;
if(*p == '$') if (*p == '$')
{ {
if((vp = var_get(p,p_end,0))) if ((vp = var_get(p,p_end,0)))
{ {
memcpy(v, vp, sizeof(VAR)); memcpy(v, vp, sizeof(VAR));
return 0; return 0;
...@@ -344,7 +403,7 @@ int eval_expr(VAR* v, char* p, char* p_end) ...@@ -344,7 +403,7 @@ int eval_expr(VAR* v, char* p, char* p_end)
return 0; return 0;
} }
if(p_end) if (p_end)
*p_end = 0; *p_end = 0;
die("Invalid expr: %s", p); die("Invalid expr: %s", p);
return 1; return 1;
...@@ -381,14 +440,14 @@ int do_system(struct query* q) ...@@ -381,14 +440,14 @@ int do_system(struct query* q)
p = (char*)q->q + q->first_word_len; p = (char*)q->q + q->first_word_len;
while(*p && isspace(*p)) p++; while(*p && isspace(*p)) p++;
eval_expr(&v, p, 0); /* NULL terminated */ eval_expr(&v, p, 0); /* NULL terminated */
if(v.str_val_len > 1) if (v.str_val_len > 1)
{ {
char expr_buf[512]; char expr_buf[512];
if((uint)v.str_val_len > sizeof(expr_buf) - 1) if ((uint)v.str_val_len > sizeof(expr_buf) - 1)
v.str_val_len = sizeof(expr_buf) - 1; v.str_val_len = sizeof(expr_buf) - 1;
memcpy(expr_buf, v.str_val, v.str_val_len); memcpy(expr_buf, v.str_val, v.str_val_len);
expr_buf[v.str_val_len] = 0; expr_buf[v.str_val_len] = 0;
if(system(expr_buf) && q->abort_on_error) if (system(expr_buf) && q->abort_on_error)
die("system command '%s' failed", expr_buf); die("system command '%s' failed", expr_buf);
} }
return 0; return 0;
...@@ -401,7 +460,7 @@ int do_echo(struct query* q) ...@@ -401,7 +460,7 @@ int do_echo(struct query* q)
p = (char*)q->q + q->first_word_len; p = (char*)q->q + q->first_word_len;
while(*p && isspace(*p)) p++; while(*p && isspace(*p)) p++;
eval_expr(&v, p, 0); /* NULL terminated */ eval_expr(&v, p, 0); /* NULL terminated */
if(v.str_val_len > 1) if (v.str_val_len > 1)
{ {
fflush(stdout); fflush(stdout);
write(1, v.str_val, v.str_val_len - 1); write(1, v.str_val, v.str_val_len - 1);
...@@ -415,13 +474,13 @@ int do_let(struct query* q) ...@@ -415,13 +474,13 @@ int do_let(struct query* q)
char* p, *var_name, *var_name_end, *var_val_start; char* p, *var_name, *var_name_end, *var_val_start;
p = (char*)q->q + q->first_word_len; p = (char*)q->q + q->first_word_len;
while(*p && isspace(*p)) p++; while(*p && isspace(*p)) p++;
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 != '=' || isspace(*p)))
p++; p++;
var_name_end = p; var_name_end = p;
if(*p == '=') p++; if (*p == '=') p++;
while(*p && isspace(*p)) while(*p && isspace(*p))
p++; p++;
var_val_start = p; var_val_start = p;
...@@ -437,37 +496,48 @@ int do_sleep(struct query* q) ...@@ -437,37 +496,48 @@ int do_sleep(struct query* q)
int dec_mul = 1000000; int dec_mul = 1000000;
p = (char*)q->q + q->first_word_len; p = (char*)q->q + q->first_word_len;
while(*p && isspace(*p)) p++; while(*p && isspace(*p)) p++;
if(!*p) if (!*p)
die("Missing agument in sleep\n"); die("Missing argument in sleep\n");
arg = p; arg = p;
t.tv_sec = atoi(arg); t.tv_sec = atoi(arg);
t.tv_usec = 0; t.tv_usec = 0;
while(*p && *p != '.' && !isspace(*p)) while(*p && *p != '.' && !isspace(*p))
p++; p++;
if(*p == '.') if (*p == '.')
{ {
char c; char c;
char *p_end; char *p_end;
p++; p++;
p_end = p + 6; p_end = p + 6;
for(;p <= p_end; ++p) for(;p <= p_end; ++p)
{ {
c = *p - '0'; c = *p - '0';
if(c < 10 && c >= 0) if (c < 10 && c >= 0)
{ {
t.tv_usec = t.tv_usec * 10 + c; t.tv_usec = t.tv_usec * 10 + c;
dec_mul /= 10; dec_mul /= 10;
} }
else else
break; break;
}
} }
}
*p = 0; *p = 0;
t.tv_usec *= dec_mul; t.tv_usec *= dec_mul;
return select(0,0,0,0, &t); return select(0,0,0,0, &t);
} }
static void get_file_name(char *filename, struct query* q)
{
char *p = (char*) q->q + q->first_word_len;
while(*p && isspace(*p)) p++;
strnmov(filename, p, FN_REFLEN);
/* Remove end space */
while (p > filename && isspace(p[-1]))
p--;
p[0]=0;
}
int select_connection(struct query* q) int select_connection(struct query* q)
{ {
...@@ -475,7 +545,7 @@ int select_connection(struct query* q) ...@@ -475,7 +545,7 @@ int select_connection(struct query* q)
struct connection *con; struct connection *con;
p = (char*)q->q + q->first_word_len; p = (char*)q->q + q->first_word_len;
while(*p && isspace(*p)) p++; while(*p && isspace(*p)) 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 && !isspace(*p))
...@@ -483,7 +553,7 @@ int select_connection(struct query* q) ...@@ -483,7 +553,7 @@ int select_connection(struct query* q)
*p = 0; *p = 0;
for(con = cons; con < next_con; con++) for(con = cons; con < next_con; con++)
if(!strcmp(con->name, name)) if (!strcmp(con->name, name))
{ {
cur_con = con; cur_con = con;
return 0; return 0;
...@@ -499,7 +569,7 @@ int close_connection(struct query* q) ...@@ -499,7 +569,7 @@ int close_connection(struct query* q)
struct connection *con; struct connection *con;
p = (char*)q->q + q->first_word_len; p = (char*)q->q + q->first_word_len;
while(*p && isspace(*p)) p++; while(*p && isspace(*p)) 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 && !isspace(*p))
...@@ -507,7 +577,7 @@ int close_connection(struct query* q) ...@@ -507,7 +577,7 @@ int close_connection(struct query* q)
*p = 0; *p = 0;
for(con = cons; con < next_con; con++) for(con = cons; con < next_con; con++)
if(!strcmp(con->name, name)) if (!strcmp(con->name, name))
{ {
mysql_close(&con->mysql); mysql_close(&con->mysql);
return 0; return 0;
...@@ -529,10 +599,10 @@ char* safe_get_param(char* str, char** arg, const char* msg) ...@@ -529,10 +599,10 @@ char* safe_get_param(char* str, char** arg, const char* msg)
*arg = str; *arg = str;
while(*str && *str != ',' && *str != ')') while(*str && *str != ',' && *str != ')')
{ {
if(isspace(*str)) *str = 0; if (isspace(*str)) *str = 0;
str++; str++;
} }
if(!*str) if (!*str)
die(msg); die(msg);
*str++ = 0; *str++ = 0;
...@@ -548,7 +618,7 @@ int do_connect(struct query* q) ...@@ -548,7 +618,7 @@ int do_connect(struct query* q)
p = q->q + q->first_word_len; p = q->q + q->first_word_len;
while(*p && isspace(*p)) p++; while(*p && isspace(*p)) p++;
if(*p != '(') if (*p != '(')
die("Syntax error in connect - expeected '(' found '%c'", *p); die("Syntax error in connect - expeected '(' found '%c'", *p);
p++; p++;
p = safe_get_param(p, &con_name, "missing connection name"); p = safe_get_param(p, &con_name, "missing connection name");
...@@ -558,17 +628,17 @@ int do_connect(struct query* q) ...@@ -558,17 +628,17 @@ int do_connect(struct query* q)
p = safe_get_param(p, &con_db, "missing connection db"); p = safe_get_param(p, &con_db, "missing connection db");
p = safe_get_param(p, &con_port_str, "missing connection port"); p = safe_get_param(p, &con_port_str, "missing connection port");
p = safe_get_param(p, &con_sock, "missing connection scoket"); p = safe_get_param(p, &con_sock, "missing connection scoket");
if(next_con == cons_end) if (next_con == cons_end)
die("Connection limit exhausted - incread MAX_CONS in mysqltest.c"); die("Connection limit exhausted - incread MAX_CONS in mysqltest.c");
if(!mysql_init(&next_con->mysql)) if (!mysql_init(&next_con->mysql))
die("Failed on mysql_init()"); die("Failed on mysql_init()");
if(!mysql_real_connect(&next_con->mysql, con_host, con_user, con_pass, if (!mysql_real_connect(&next_con->mysql, con_host, con_user, con_pass,
con_db, atoi(con_port_str), con_sock, 0)) con_db, atoi(con_port_str), con_sock, 0))
die("Could not open connection '%s': %s", con_name, die("Could not open connection '%s': %s", con_name,
mysql_error(&next_con->mysql)); mysql_error(&next_con->mysql));
if(!(next_con->name = my_strdup(con_name, MYF(MY_WME)))) if (!(next_con->name = my_strdup(con_name, MYF(MY_WME))))
die("Out of memory"); die("Out of memory");
cur_con = next_con++; cur_con = next_con++;
...@@ -578,13 +648,13 @@ int do_connect(struct query* q) ...@@ -578,13 +648,13 @@ int do_connect(struct query* q)
int do_done(struct query* q) int do_done(struct query* q)
{ {
q->type = Q_END_BLOCK; q->type = Q_END_BLOCK;
if(cur_block == block_stack) if (cur_block == block_stack)
die("Stray '}' - end of block before beginning"); die("Stray '}' - end of block before beginning");
if(block_ok) if (block_ok)
parser.current_line = *--cur_block; parser.current_line = *--cur_block;
else else
{ {
if(!--false_block_depth) if (!--false_block_depth)
block_ok = 1; block_ok = 1;
++parser.current_line; ++parser.current_line;
} }
...@@ -596,22 +666,22 @@ int do_while(struct query* q) ...@@ -596,22 +666,22 @@ int do_while(struct query* q)
char *p = q->q + q->first_word_len; char *p = q->q + q->first_word_len;
char* expr_start, *expr_end; char* expr_start, *expr_end;
VAR v; VAR v;
if(cur_block == block_stack_end) if (cur_block == block_stack_end)
die("Nesting too deep"); die("Nesting too deep");
if(!block_ok) if (!block_ok)
{ {
++false_block_depth; ++false_block_depth;
return 0; return 0;
} }
expr_start = strchr(p, '('); expr_start = strchr(p, '(');
if(!expr_start) if (!expr_start)
die("missing '(' in while"); die("missing '(' in while");
expr_end = strrchr(expr_start, ')'); expr_end = strrchr(expr_start, ')');
if(!expr_end) if (!expr_end)
die("missing ')' in while"); die("missing ')' in while");
eval_expr(&v, ++expr_start, --expr_end); eval_expr(&v, ++expr_start, --expr_end);
*cur_block++ = parser.current_line++; *cur_block++ = parser.current_line++;
if(!v.int_val) if (!v.int_val)
{ {
block_ok = 0; block_ok = 0;
false_block_depth = 1; false_block_depth = 1;
...@@ -619,14 +689,6 @@ int do_while(struct query* q) ...@@ -619,14 +689,6 @@ int do_while(struct query* q)
return 0; return 0;
} }
void close_cons()
{
for(--next_con; next_con >= cons; --next_con)
{
mysql_close(&next_con->mysql);
my_free(next_con->name, MYF(MY_ALLOW_ZERO_PTR));
}
}
int safe_copy_unescape(char* dest, char* src, int size) int safe_copy_unescape(char* dest, char* src, int size)
{ {
...@@ -642,7 +704,7 @@ int safe_copy_unescape(char* dest, char* src, int size) ...@@ -642,7 +704,7 @@ int safe_copy_unescape(char* dest, char* src, int size)
switch(state) switch(state)
{ {
case ST_NORMAL: case ST_NORMAL:
if(c == '\\') if (c == '\\')
{ {
state = ST_ESCAPED; state = ST_ESCAPED;
} }
...@@ -650,7 +712,7 @@ int safe_copy_unescape(char* dest, char* src, int size) ...@@ -650,7 +712,7 @@ int safe_copy_unescape(char* dest, char* src, int size)
*p_dest++ = c; *p_dest++ = c;
break; break;
case ST_ESCAPED: case ST_ESCAPED:
if((val = hex_val(c)) > 0) if ((val = hex_val(c)) > 0)
{ {
*p_dest = val; *p_dest = val;
state = ST_HEX2; state = ST_HEX2;
...@@ -662,7 +724,7 @@ int safe_copy_unescape(char* dest, char* src, int size) ...@@ -662,7 +724,7 @@ int safe_copy_unescape(char* dest, char* src, int size)
} }
break; break;
case ST_HEX2: case ST_HEX2:
if((val = hex_val(c)) > 0) if ((val = hex_val(c)) > 0)
{ {
*p_dest = (*p_dest << 4) + val; *p_dest = (*p_dest << 4) + val;
p_dest++; p_dest++;
...@@ -683,118 +745,118 @@ int safe_copy_unescape(char* dest, char* src, int size) ...@@ -683,118 +745,118 @@ int safe_copy_unescape(char* dest, char* src, int size)
int read_line(char* buf, int size) int read_line(char* buf, int size)
{ {
int c; int c;
char* p = buf, *buf_end = buf + size; char* p = buf, *buf_end = buf + size-1;
int no_save = 0; int no_save = 0;
enum {R_NORMAL, R_Q1, R_ESC_Q_Q1, R_ESC_Q_Q2, enum {R_NORMAL, R_Q1, R_ESC_Q_Q1, R_ESC_Q_Q2,
R_ESC_SLASH_Q1, R_ESC_SLASH_Q2, R_ESC_SLASH_Q1, R_ESC_SLASH_Q2,
R_Q2, R_COMMENT, R_LINE_START} state = R_LINE_START; R_Q2, R_COMMENT, R_LINE_START} state = R_LINE_START;
for(; p < buf_end ;) for (; p < buf_end ;)
{
no_save = 0;
c = fgetc(*cur_file);
if (feof(*cur_file))
{ {
no_save = 0; my_fclose(*cur_file,MYF(0));
c = fgetc(*cur_file);
if(feof(*cur_file))
{
fclose(*cur_file);
if(cur_file == file_stack) if (cur_file == file_stack)
return 1; return 1;
else else
{ {
cur_file--; cur_file--;
continue; continue;
} }
} }
switch(state)
{
case R_NORMAL:
if(c == ';' || c == '{') /* '{' allows some interesting syntax
* but we don't care, as long as the
* correct sytnax gets parsed right */
{
*p = 0;
return 0;
}
else if(c == '\'')
state = R_Q1;
else if(c == '"')
state = R_Q2;
else if(c == '\n')
state = R_LINE_START;
break;
case R_COMMENT:
no_save = 1;
if(c == '\n')
state = R_LINE_START;
break;
case R_LINE_START: switch(state) {
if(c == '#') case R_NORMAL:
{ if (c == ';' || c == '{') /* '{' allows some interesting syntax
state = R_COMMENT; * but we don't care, as long as the
no_save = 1; * correct sytnax gets parsed right */
} {
else if(isspace(c)) *p = 0;
no_save = 1; return 0;
else if(c == '}') }
{ else if (c == '\'')
*buf++ = '}'; state = R_Q1;
*buf = 0; else if (c == '"')
return 0; state = R_Q2;
} else if (c == '\n')
else if(c == ';' || c == '{') state = R_LINE_START;
{
*p = 0;
return 0;
}
else
state = R_NORMAL;
break;
case R_Q1: break;
if(c == '\'') case R_COMMENT:
state = R_ESC_Q_Q1; if (c == '\n')
else if(c == '\\') {
state = R_ESC_SLASH_Q1; *p=0;
break; return 0;
case R_ESC_Q_Q1: }
if(c == ';') break;
{ case R_LINE_START:
*p = 0; if (c == '#' || c == '-')
return 0; {
} state = R_COMMENT;
if(c != '\'') }
state = R_NORMAL; else if (isspace(c))
break; no_save = 1;
case R_ESC_SLASH_Q1: else if (c == '}')
state = R_Q1; {
break; *buf++ = '}';
*buf = 0;
return 0;
}
else if (c == ';' || c == '{')
{
*p = 0;
return 0;
}
else
state = R_NORMAL;
break;
case R_Q2: case R_Q1:
if(c == '"') if (c == '\'')
state = R_ESC_Q_Q2; state = R_ESC_Q_Q1;
else if(c == '\\') else if (c == '\\')
state = R_ESC_SLASH_Q2; state = R_ESC_SLASH_Q1;
break; break;
case R_ESC_Q_Q2: case R_ESC_Q_Q1:
if(c == ';') if (c == ';')
{ {
*p = 0; *p = 0;
return 0; return 0;
} }
if(c != '"') if (c != '\'')
state = R_NORMAL; state = R_NORMAL;
break; break;
case R_ESC_SLASH_Q2: case R_ESC_SLASH_Q1:
state = R_Q2; state = R_Q1;
break; break;
}
if(!no_save) case R_Q2:
*p++ = c; if (c == '"')
state = R_ESC_Q_Q2;
else if (c == '\\')
state = R_ESC_SLASH_Q2;
break;
case R_ESC_Q_Q2:
if (c == ';')
{
*p = 0;
return 0;
}
if (c != '"')
state = R_NORMAL;
break;
case R_ESC_SLASH_Q2:
state = R_Q2;
break;
} }
if (!no_save)
*p++ = c;
}
*p=0; /* Always end with \0 */
return feof(*cur_file); return feof(*cur_file);
} }
...@@ -804,58 +866,69 @@ int read_query(struct query** q_ptr) ...@@ -804,58 +866,69 @@ int read_query(struct query** q_ptr)
char* p = buf,* p1 ; char* p = buf,* p1 ;
int c, expected_errno; int c, expected_errno;
struct query* q; struct query* q;
if(parser.current_line < parser.read_lines) if (parser.current_line < parser.read_lines)
{ {
get_dynamic(&q_lines, (gptr)q_ptr, parser.current_line) ; get_dynamic(&q_lines, (gptr)q_ptr, parser.current_line) ;
return 0; return 0;
} }
if(!(*q_ptr=q=(struct query*)my_malloc(sizeof(*q), MYF(MY_WME))) if (!(*q_ptr=q=(struct query*)my_malloc(sizeof(*q), MYF(MY_WME)))
|| insert_dynamic(&q_lines, (gptr)&q) || insert_dynamic(&q_lines, (gptr)&q)
) )
die("Out of memory"); die("Out of memory");
q->record_file[0] = 0; q->record_file[0] = 0;
q->require_file=0;
q->abort_on_error = 1; q->abort_on_error = 1;
q->has_result_set = 0;
q->first_word_len = 0; q->first_word_len = 0;
q->expected_errno = 0; q->expected_errno = 0;
q->type = Q_UNKNOWN; q->type = Q_UNKNOWN;
if(read_line(buf, sizeof(buf))) if (read_line(buf, sizeof(buf)))
return 1; return 1;
if(*p == '!')
if (*p == '#')
{
q->type = Q_COMMENT;
}
else if (p[0] == '-' && p[1] == '-')
{
q->type = Q_COMMENT_WITH_COMMAND;
p+=2; /* To calculate first word */
}
else
{
if (*p == '!')
{ {
q->abort_on_error = 0; q->abort_on_error = 0;
p++; p++;
if(*p == '$') if (*p == '$')
{ {
expected_errno = 0; expected_errno = 0;
p++; p++;
for(;isdigit(*p);p++) for (;isdigit(*p);p++)
expected_errno = expected_errno * 10 + *p - '0'; expected_errno = expected_errno * 10 + *p - '0';
q->expected_errno = expected_errno; q->expected_errno = expected_errno;
} }
} }
while(*p && isspace(*p)) p++ ; while(*p && isspace(*p)) p++ ;
if(*p == '@') if (*p == '@')
{ {
q->has_result_set = 1;
p++; p++;
p1 = q->record_file; p1 = q->record_file;
while(!isspace(c = *p) && while(!isspace(c = *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 && isspace(*p)) p++;
/* Calculate first word */
p1 = q->q; p1 = q->q;
while(*p && !isspace(*p)) while(*p && !isspace(*p))
*p1++ = *p++; *p1++ = *p++;
q->first_word_len = p1 - q->q; q->first_word_len = p1 - q->q;
strcpy(p1, p); strmov(p1, p);
parser.read_lines++; parser.read_lines++;
return 0; return 0;
} }
...@@ -878,31 +951,6 @@ struct option long_options[] = ...@@ -878,31 +951,6 @@ struct option long_options[] =
{0, 0,0,0} {0, 0,0,0}
}; };
void die(const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
fprintf(stderr, "%s: ", my_progname);
vfprintf(stderr, fmt, args);
fprintf(stderr, "\n");
va_end(args);
close_cons();
exit(1);
}
void verbose_msg(const char* fmt, ...)
{
va_list args;
if(!verbose) return;
va_start(args, fmt);
fprintf(stderr, "%s: ", my_progname);
vfprintf(stderr, fmt, args);
fprintf(stderr, "\n");
va_end(args);
}
static void print_version(void) static void print_version(void)
{ {
...@@ -957,7 +1005,7 @@ int parse_args(int argc, char **argv) ...@@ -957,7 +1005,7 @@ int parse_args(int argc, char **argv)
case 'R': case 'R':
result_file = optarg; result_file = optarg;
break; break;
case 'p': case 'p':
if (optarg) if (optarg)
{ {
my_free(pass,MYF(MY_ALLOW_ZERO_PTR)); my_free(pass,MYF(MY_ALLOW_ZERO_PTR));
...@@ -990,7 +1038,7 @@ int parse_args(int argc, char **argv) ...@@ -990,7 +1038,7 @@ int parse_args(int argc, char **argv)
exit(0); exit(0);
default: default:
usage(); usage();
exit(0); exit(1);
} }
} }
...@@ -1002,10 +1050,7 @@ int parse_args(int argc, char **argv) ...@@ -1002,10 +1050,7 @@ int parse_args(int argc, char **argv)
exit(1); exit(1);
} }
if (argc == 1) if (argc == 1)
{ db= *argv;
my_free(db,MYF(MY_ALLOW_ZERO_PTR));
db=my_strdup(*argv,MYF(MY_WME));
}
if (tty_password) if (tty_password)
pass=get_tty_password(NullS); pass=get_tty_password(NullS);
...@@ -1024,9 +1069,9 @@ char* safe_str_append(char* buf, const char* str, int size) ...@@ -1024,9 +1069,9 @@ char* safe_str_append(char* buf, const char* str, int size)
void str_to_file(const char* fname, char* str, int size) void str_to_file(const char* fname, char* str, int size)
{ {
int fd; int fd;
if((fd = my_open(fname, O_WRONLY|O_CREAT, MYF(MY_WME | MY_FFNF))) < 0) if ((fd = my_open(fname, O_WRONLY|O_CREAT, MYF(MY_WME | MY_FFNF))) < 0)
die("Could not open %s: errno = %d", fname, errno); die("Could not open %s: errno = %d", fname, errno);
if(my_write(fd, (byte*)str, size, MYF(MY_WME|MY_FNABP))) if (my_write(fd, (byte*)str, size, MYF(MY_WME|MY_FNABP)))
die("write failed"); die("write failed");
my_close(fd, MYF(0)); my_close(fd, MYF(0));
} }
...@@ -1042,6 +1087,7 @@ void reject_dump(const char* record_file, char* buf, int size) ...@@ -1042,6 +1087,7 @@ void reject_dump(const char* record_file, char* buf, int size)
str_to_file(reject_file, buf, size); str_to_file(reject_file, buf, size);
} }
int run_query(MYSQL* mysql, struct query* q) int run_query(MYSQL* mysql, struct query* q)
{ {
MYSQL_RES* res = 0; MYSQL_RES* res = 0;
...@@ -1055,66 +1101,69 @@ int run_query(MYSQL* mysql, struct query* q) ...@@ -1055,66 +1101,69 @@ int run_query(MYSQL* mysql, struct query* q)
DYN_STRING ds_tmp; DYN_STRING ds_tmp;
dyn_string_init(&ds_tmp); dyn_string_init(&ds_tmp);
if( q->record_file[0]) if ( q->record_file[0])
{ {
ds = &ds_tmp; ds = &ds_tmp;
} }
if(mysql_query(mysql, q->q)) if (mysql_query(mysql, q->q))
{
if (q->require_file)
abort_not_supported_test();
if (q->abort_on_error)
die("query '%s' failed: %s", q->q, mysql_error(mysql));
else
{ {
if(q->abort_on_error) if (q->expected_errno)
die("query '%s' failed: %s", q->q, mysql_error(mysql)); {
else error = (q->expected_errno != mysql_errno(mysql));
{ if (error)
if(q->expected_errno) verbose_msg("query '%s' failed with wrong errno\
{
error = (q->expected_errno != mysql_errno(mysql));
if(error)
verbose_msg("query '%s' failed with wrong errno\
%d instead of %d", q->q, mysql_errno(mysql), q->expected_errno); %d instead of %d", q->q, mysql_errno(mysql), q->expected_errno);
goto end; goto end;
} }
verbose_msg("query '%s' failed: %s", q->q, mysql_error(mysql));
/* if we do not abort on error, failure to run the query does
not fail the whole test case
*/
goto end;
}
}
if(q->expected_errno) verbose_msg("query '%s' failed: %s", q->q, mysql_error(mysql));
{ /* if we do not abort on error, failure to run the query does
error = 1; not fail the whole test case
verbose_msg("query '%s' succeeded - should have failed with errno %d", */
q->q, q->expected_errno);
goto end; goto end;
} }
}
if (q->expected_errno)
{
error = 1;
verbose_msg("query '%s' succeeded - should have failed with errno %d",
q->q, q->expected_errno);
goto end;
}
if(!(res = mysql_store_result(mysql)) && mysql_field_count(mysql)) if (!(res = mysql_store_result(mysql)) && mysql_field_count(mysql))
{
if (q->require_file)
abort_not_supported_test();
if (q->abort_on_error)
die("failed in mysql_store_result for query '%s'", q->q);
else
{ {
if(q->abort_on_error) verbose_msg("failed in mysql_store_result for query '%s'", q->q);
die("failed in mysql_store_result for query '%s'", q->q); error = 1;
else goto end;
{
verbose_msg("failed in mysql_store_result for query '%s'", q->q);
error = 1;
goto end;
}
} }
}
if(!res) goto end; if (!res) goto end;
fields = mysql_fetch_fields(res); fields = mysql_fetch_fields(res);
num_fields = mysql_num_fields(res); num_fields = mysql_num_fields(res);
for( i = 0; i < num_fields; i++) for( i = 0; i < num_fields; i++)
{ {
dyn_string_append(ds, fields[i].name, 0); if (i)
dyn_string_append(ds, "\t", 1); dyn_string_append(ds, "\t", 1);
} dyn_string_append(ds, fields[i].name, 0);
}
dyn_string_append(ds, "\n", 1); dyn_string_append(ds, "\n", 1);
...@@ -1123,111 +1172,71 @@ int run_query(MYSQL* mysql, struct query* q) ...@@ -1123,111 +1172,71 @@ int run_query(MYSQL* mysql, struct query* q)
{ {
lengths = mysql_fetch_lengths(res); lengths = mysql_fetch_lengths(res);
for(i = 0; i < num_fields; i++) for(i = 0; i < num_fields; i++)
{ {
val = (char*)row[i]; val = (char*)row[i];
len = lengths[i]; len = lengths[i];
if(!val) if (!val)
{ {
val = (char*)"NULL"; val = (char*)"NULL";
len = 4; len = 4;
} }
dyn_string_append(ds, val, len); if (i)
dyn_string_append(ds, "\t", 1); dyn_string_append(ds, "\t", 1);
} dyn_string_append(ds, val, len);
}
dyn_string_append(ds, "\n", 1); dyn_string_append(ds, "\n", 1);
} }
if(record) if (record)
{ {
if(!q->record_file[0] && !result_file) if (!q->record_file[0] && !result_file)
die("Missing result file"); die("Missing result file");
if(!result_file) if (!result_file)
str_to_file(q->record_file, ds->str, ds->len); str_to_file(q->record_file, ds->str, ds->len);
} }
else if(q->record_file[0]) else if (q->record_file[0])
{ {
error = check_result(ds, q->record_file); error = check_result(ds, q->record_file, q->require_file);
} }
end: end:
if(res) mysql_free_result(res); if (res) mysql_free_result(res);
return error; return error;
} }
int check_first_word(struct query* q, const char* word, int len)
{
const char* p, *p1, *end;
if(len != q->first_word_len)
return 0;
p = word;
end = p + len;
p1 = q->q;
for(; p < end; p++, p1++)
if(tolower(*p) != tolower(*p1))
return 0;
return 1;
}
void get_query_type(struct query* q) void get_query_type(struct query* q)
{ {
if(*q->q == '}') char save;
{ uint type;
q->type = Q_END_BLOCK; if (*q->q == '}')
return; {
} q->type = Q_END_BLOCK;
q->type = Q_QUERY; return;
switch(q->first_word_len) }
{ if (q->type != Q_COMMENT_WITH_COMMAND)
case 3: q->type = Q_QUERY;
if(check_first_word(q, "inc", 3))
q->type = Q_INC; save=q->q[q->first_word_len];
else if(check_first_word(q, "dec", 3)) q->q[q->first_word_len]=0;
q->type = Q_DEC; type=find_type(q->q, &command_typelib, 0);
else if(check_first_word(q, "let", 3)) q->q[q->first_word_len]=save;
q->type = Q_LET; if (type > 0)
break; q->type=type; /* Found command */
case 4:
if(check_first_word(q, "echo", 4))
q->type = Q_ECHO;
break;
case 5:
if(check_first_word(q, "sleep", 5))
q->type = Q_SLEEP;
else if(check_first_word(q, "while", 5))
q->type = Q_WHILE;
break;
case 6:
if(check_first_word(q, "source", 6))
q->type = Q_SOURCE;
else if(check_first_word(q, "system", 6))
q->type = Q_SYSTEM;
break;
case 7:
if(check_first_word(q, "connect", 7))
q->type = Q_CONNECT;
break;
case 10:
if(check_first_word(q, "connection", 10))
q->type = Q_CONNECTION;
else if(check_first_word(q, "disconnect", 10))
q->type = Q_DISCONNECT;
break;
}
} }
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
int error = 0; int error = 0;
struct query* q; struct query* q;
my_bool require_file=0;
char save_file[FN_REFLEN];
save_file[0]=0;
MY_INIT(argv[0]); MY_INIT(argv[0]);
memset(cons, 0, sizeof(cons)); memset(cons, 0, sizeof(cons));
...@@ -1245,73 +1254,90 @@ int main(int argc, char** argv) ...@@ -1245,73 +1254,90 @@ int main(int argc, char** argv)
cur_block = block_stack; cur_block = block_stack;
dyn_string_init(&ds_res); dyn_string_init(&ds_res);
parse_args(argc, argv); parse_args(argc, argv);
if(!*cur_file) if (!*cur_file)
*cur_file = stdin; *cur_file = stdin;
if (!( mysql_init(&cur_con->mysql)))
if(!( mysql_init(&cur_con->mysql)))
die("Failed in mysql_init()"); die("Failed in mysql_init()");
mysql_options(&cur_con->mysql, MYSQL_READ_DEFAULT_GROUP, "mysql"); mysql_options(&cur_con->mysql, MYSQL_READ_DEFAULT_GROUP, "mysql");
cur_con->name = my_strdup("default", MYF(MY_WME)); cur_con->name = my_strdup("default", MYF(MY_WME));
if(!cur_con->name) if (!cur_con->name)
die("Out of memory"); die("Out of memory");
if(!mysql_real_connect(&cur_con->mysql, host, if (!mysql_real_connect(&cur_con->mysql, host,
user, pass, db, port, unix_sock, user, pass, db, port, unix_sock,
0)) 0))
die("Failed in mysql_real_connect(): %s", mysql_error(&cur_con->mysql)); die("Failed in mysql_real_connect(): %s", mysql_error(&cur_con->mysql));
for(;!read_query(&q);) for(;!read_query(&q);)
{
int current_line_inc = 1, processed = 0;
if (q->type == Q_UNKNOWN || q->type == Q_COMMENT_WITH_COMMAND)
get_query_type(q);
if (block_ok)
{ {
int current_line_inc = 1, processed = 0; processed = 1;
if(q->type == Q_UNKNOWN) switch (q->type) {
get_query_type(q); case Q_CONNECT: do_connect(q); break;
if(block_ok) case Q_CONNECTION: select_connection(q); break;
{ case Q_DISCONNECT: close_connection(q); break;
processed = 1; case Q_SOURCE: do_source(q); break;
switch(q->type) case Q_SLEEP: do_sleep(q); break;
{ case Q_INC: do_inc(q); break;
case Q_CONNECT: do_connect(q); break; case Q_DEC: do_dec(q); break;
case Q_CONNECTION: select_connection(q); break; case Q_ECHO: do_echo(q); break;
case Q_DISCONNECT: close_connection(q); break; case Q_SYSTEM: do_system(q); break;
case Q_SOURCE: do_source(q); break; case Q_LET: do_let(q); break;
case Q_SLEEP: do_sleep(q); break; case Q_QUERY:
case Q_INC: do_inc(q); break; {
case Q_DEC: do_dec(q); break; if (save_file[0])
case Q_ECHO: do_echo(q); break;
case Q_SYSTEM: do_system(q); break;
case Q_LET: do_let(q); break;
case Q_QUERY: error |= run_query(&cur_con->mysql, q); break;
default: processed = 0; break;
}
}
if(!processed)
{ {
current_line_inc = 0; strmov(q->record_file,save_file);
switch(q->type) q->require_file=require_file;
{ save_file[0]=0;
case Q_WHILE: do_while(q); break;
case Q_END_BLOCK: do_done(q); break;
default: current_line_inc = 1; break;
}
} }
error |= run_query(&cur_con->mysql, q); break;
}
case Q_RESULT:
get_file_name(save_file,q);
require_file=0;
break;
case Q_REQUIRE:
get_file_name(save_file,q);
require_file=1;
break;
case Q_COMMENT: /* Ignore row */
case Q_COMMENT_WITH_COMMAND:
default: processed = 0; break;
}
}
parser.current_line += current_line_inc; if (!processed)
{
current_line_inc = 0;
switch(q->type)
{
case Q_WHILE: do_while(q); break;
case Q_END_BLOCK: do_done(q); break;
default: current_line_inc = 1; break;
}
} }
parser.current_line += current_line_inc;
}
close_cons(); close_cons();
if(result_file && ds_res.len) if (result_file && ds_res.len)
{ {
if(!record) if(!record)
error |= check_result(&ds_res, result_file); error |= check_result(&ds_res, result_file, q->require_file);
else else
str_to_file(result_file, ds_res.str, ds_res.len); str_to_file(result_file, ds_res.str, ds_res.len);
} }
dyn_string_end(&ds_res); dyn_string_end(&ds_res);
if (!silent) { if (!silent) {
......
...@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script. ...@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
AC_INIT(sql/mysqld.cc) AC_INIT(sql/mysqld.cc)
AC_CANONICAL_SYSTEM AC_CANONICAL_SYSTEM
# The Docs Makefile.am parses this line! # The Docs Makefile.am parses this line!
AM_INIT_AUTOMAKE(mysql, 3.23.29a-gamma) AM_INIT_AUTOMAKE(mysql, 3.23.30-gamma)
AM_CONFIG_HEADER(config.h) AM_CONFIG_HEADER(config.h)
PROTOCOL_VERSION=10 PROTOCOL_VERSION=10
......
...@@ -393,7 +393,7 @@ static int examine_log(my_string file_name, char **table_names) ...@@ -393,7 +393,7 @@ static int examine_log(my_string file_name, char **table_names)
char *pos,*to; char *pos,*to;
/* Fix if old DOS files to new format */ /* Fix if old DOS files to new format */
for (pos=file_info.name; pos=strchr(pos,'\\') ; pos++) for (pos=file_info.name; (pos=strchr(pos,'\\')) ; pos++)
*pos= '/'; *pos= '/';
pos=file_info.name; pos=file_info.name;
......
-- require r/have_bdb.require
show variables like "have_bdb";
-- require r/have_isam.require
show variables like "have_isam";
...@@ -189,6 +189,10 @@ fail_inc () { ...@@ -189,6 +189,10 @@ fail_inc () {
TOT_FAIL=`$EXPR $TOT_FAIL + 1` TOT_FAIL=`$EXPR $TOT_FAIL + 1`
} }
skip_inc () {
TOT_SKIP=`$EXPR $TOT_SKIP + 1`
}
total_inc () { total_inc () {
TOT_TEST=`$EXPR $TOT_TEST + 1` TOT_TEST=`$EXPR $TOT_TEST + 1`
} }
...@@ -463,9 +467,14 @@ run_testcase () ...@@ -463,9 +467,14 @@ run_testcase ()
$SETCOLOR_NORMAL && $ECHO -n "$pname $timestr" $SETCOLOR_NORMAL && $ECHO -n "$pname $timestr"
total_inc
if [ $res != 0 ]; then if [ $res == 0 ]; then
total_inc
pass_inc
echo "$RES_SPACE [ pass ]"
else
if [ $res == 1 ]; then
total_inc
fail_inc fail_inc
echo "$RES_SPACE [ fail ]" echo "$RES_SPACE [ fail ]"
$ECHO "failed output" $ECHO "failed output"
...@@ -481,12 +490,12 @@ run_testcase () ...@@ -481,12 +490,12 @@ run_testcase ()
echo "Restarting mysqld" echo "Restarting mysqld"
mysql_restart mysql_restart
echo "Resuming Tests" echo "Resuming Tests"
else else
pass_inc pass_inc
echo "$RES_SPACE [ pass ]" echo "$RES_SPACE [ skipped ]"
fi
fi fi
fi fi
} }
...@@ -525,7 +534,8 @@ then ...@@ -525,7 +534,8 @@ then
done done
fi fi
else else
tf=$TESTDIR/$1.$TESTSUFFIX tname=`$BASENAME $1 .test`
tf=$TESTDIR/$tname.$TESTSUFFIX
if [ -f $tf ] ; then if [ -f $tf ] ; then
run_testcase $tf run_testcase $tf
else else
......
id code name id code name
1 1 Tim 1 1 Tim
2 1 Monty 2 1 Monty
3 2 David 3 2 David
4 2 Erik 4 2 Erik
5 3 Sasha 5 3 Sasha
6 3 Jeremy 6 3 Jeremy
7 4 Matt 7 4 Matt
id code name id code name
2 1 Monty 2 1 Monty
3 2 David 3 2 David
4 2 Erik 4 2 Erik
5 3 Sasha 5 3 Sasha
6 3 Jeremy 6 3 Jeremy
7 4 Matt 7 4 Matt
8 1 Sinisa 8 1 Sinisa
id code name id code name
3 2 David 3 2 David
4 2 Erik 4 2 Erik
5 3 Sasha 5 3 Sasha
6 3 Jeremy 6 3 Jeremy
7 4 Matt 7 4 Matt
8 1 Sinisa 8 1 Sinisa
12 1 Ralph 12 1 Ralph
gesuchnr benutzer_id
1 1
2 1
encrypt('foo', 'ff') encrypt('foo', 'ff')
ffTU0fyIP09Z. ffTU0fyIP09Z.
0<=>0 0.0<=>0.0 "A"<=>"A" NULL<=>NULL 0<=>0 0.0<=>0.0 "A"<=>"A" NULL<=>NULL
1 1 1 1 1 1 1 1
1<=>0 0<=>NULL NULL<=>0 1<=>0 0<=>NULL NULL<=>0
0 0 0 0 0 0
1.0<=>0.0 0.0<=>NULL NULL<=>0.0 1.0<=>0.0 0.0<=>NULL NULL<=>0.0
0 0 0 0 0 0
"A"<=>"B" "A"<=>NULL NULL<=>"A" "A"<=>"B" "A"<=>NULL NULL<=>"A"
0 0 0 0 0 0
id value id value t1.value<=>t2.value id value id value t1.value<=>t2.value
1 NULL 1 NULL 1 1 NULL 1 NULL 1
id value id value
1 NULL 1 NULL
id value id value
1 NULL 1 NULL
id value id value
a MATCH (message) AGAINST ('steve') a MATCH (message) AGAINST ('steve')
4 0.90587321329654 4 0.90587321329654
7 0.89568988462614 7 0.89568988462614
a MATCH (message) AGAINST ('steve') a MATCH (message) AGAINST ('steve')
4 0.90587321329654 4 0.90587321329654
7 0.89568988462614 7 0.89568988462614
a MATCH (message) AGAINST ('steve') a MATCH (message) AGAINST ('steve')
7 0.89568988462614 7 0.89568988462614
4 0.90587321329654 4 0.90587321329654
a MATCH (message) AGAINST ('steve') a MATCH (message) AGAINST ('steve')
7 0.89568988462614 7 0.89568988462614
a rel a rel
1 0 1 0
2 0 2 0
3 0 3 0
5 0 5 0
6 0 6 0
7 0.89568988462614 7 0.89568988462614
4 0.90587321329654 4 0.90587321329654
a MATCH b AGAINST ('lala lkjh') a MATCH b AGAINST ('lala lkjh')
1 0.67003110026735 1 0.67003110026735
2 0 2 0
3 0 3 0
a MATCH c AGAINST ('lala lkjh') a MATCH c AGAINST ('lala lkjh')
1 0 1 0
2 0.67756324121582 2 0.67756324121582
3 0 3 0
a MATCH b,c AGAINST ('lala lkjh') a MATCH b,c AGAINST ('lala lkjh')
1 0.64840710366884 1 0.64840710366884
2 0.66266459031789 2 0.66266459031789
3 0 3 0
Variable_name Value
have_bdb YES
Variable_name Value
have_isam YES
id domain id domain
1 mysql.com 1 mysql.com
2 hotmail.com 2 hotmail.com
3 aol.com 3 aol.com
incr othr incr othr
1 10 1 10
2 24 2 24
4 33 4 33
3 53 3 53
sum(length(word)) sum(length(word))
71 71
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.words check status OK test.words check status OK
name age id name age id
Andy 31 00000001 Andy 31 00000001
Jacob 2 00000002 Jacob 2 00000002
Caleb 1 00000003 Caleb 1 00000003
unix_timestamp(t) unix_timestamp(t)
200006 200006
Variable_name Value Variable_name Value
Slave_open_temp_tables 0 Slave_open_temp_tables 0
Variable_name Value Variable_name Value
Slave_open_temp_tables 0 Slave_open_temp_tables 0
File Position Binlog_do_db Binlog_ignore_db File Position Binlog_do_db Binlog_ignore_db
master-bin.001 73 master-bin.001 73
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db
127.0.0.1 root 9306 1 73 Yes 127.0.0.1 root 9306 1 73 Yes
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db
127.0.0.1 root 9306 1 73 No 127.0.0.1 root 9306 1 73 No
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db
127.0.0.1 root 9306 1 73 Yes 127.0.0.1 root 9306 1 73 Yes
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db
127.0.0.1 root 9306 1 173 Yes 127.0.0.1 root 9306 1 173 Yes
File Position Binlog_do_db Binlog_ignore_db File Position Binlog_do_db Binlog_ignore_db
master-bin.001 73 master-bin.001 73
n n
1 1
2 2
3 3
File Position Binlog_do_db Binlog_ignore_db File Position Binlog_do_db Binlog_ignore_db
master-bin.001 73 master-bin.001 73
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db
0 0 0 No 0 0 0 No
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db
127.0.0.1 test 3306 60 4 No 127.0.0.1 test 3306 60 4 No
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db
127.0.0.1 root 9306 60 4 No 127.0.0.1 root 9306 60 4 No
Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db Master_Host Master_User Master_Port Connect_retry Log_File Pos Slave_Running Replicate_do_db Replicate_ignore_db
127.0.0.1 root 9306 60 4 Yes 127.0.0.1 root 9306 60 4 Yes
n n
10 10
45 45
90 90
s s
Could not break slave Could not break slave
Tried hard Tried hard
Log_name Log_name
master-bin.001 master-bin.001
master-bin.002 master-bin.002
master-bin.003 master-bin.003
Log_name Log_name
master-bin.003 master-bin.003
m m
34 34
67 67
123 123
65 65
n score n score
4 10 4 10
2 20 2 20
1+1 1-1 1+1*2 8/5 8%5 MOD(8,5) MOD(8,5)|0 -(1+1)*-2 SIGN(-5) 1+1 1-1 1+1*2 8/5 8%5 MOD(8,5) MOD(8,5)|0 -(1+1)*-2 SIGN(-5)
2 0 3 1.60 3 3 3 4 -1 2 0 3 1.60 3 3 3 4 -1
FLOOR(5.5) FLOOR(-5.5) CEILING(5.5) CEILING(-5.5) ROUND(5.5) ROUND(-5.5) FLOOR(5.5) FLOOR(-5.5) CEILING(5.5) CEILING(-5.5) ROUND(5.5) ROUND(-5.5)
5 -6 6 -5 6 -6 5 -6 6 -5 6 -6
ROUND(5.64,1) ROUND(5.64,2) ROUND(5.64,-1) ROUND(5.64,-2) ROUND(5.64,1) ROUND(5.64,2) ROUND(5.64,-1) ROUND(5.64,-2)
5.6 5.64 10 0 5.6 5.64 10 0
TRUNCATE(52.64,1) TRUNCATE(52.64,2) TRUNCATE(52.64,-1) TRUNCATE(52.64,-2) TRUNCATE(52.64,1) TRUNCATE(52.64,2) TRUNCATE(52.64,-1) TRUNCATE(52.64,-2)
52.6 52.64 50 0 52.6 52.64 50 0
ABS(-10) LOG(EXP(10)) EXP(LOG(SQRT(10))*2) POW(10,LOG10(10)) RAND(999999) RAND() POWER(2,4) ABS(-10) LOG(EXP(10)) EXP(LOG(SQRT(10))*2) POW(10,LOG10(10)) RAND(999999) RAND() POWER(2,4)
10 10.000000 10.000000 10.000000 0.18435012473199 0.76373626176616 16.000000 10 10.000000 10.000000 10.000000 0.18435012473199 0.76373626176616 16.000000
PI() SIN(PI()/2) COS(PI()/2) TAN(PI()) COT(1) ASIN(1) ACOS(0) ATAN(1) PI() SIN(PI()/2) COS(PI()/2) TAN(PI()) COT(1) ASIN(1) ACOS(0) ATAN(1)
3.141593 1.000000 0.000000 -0.000000 0.64209262 1.570796 1.570796 0.785398 3.141593 1.000000 0.000000 -0.000000 0.64209262 1.570796 1.570796 0.785398
1 | (1+1) 5 & 3 BIT_COUNT(7) 1 | (1+1) 5 & 3 BIT_COUNT(7)
3 1 3 3 1 3
1 << 32 1 << 63 1 << 64 4 >> 2 4 >> 63 1<< 63 >> 60 1 << 32 1 << 63 1 << 64 4 >> 2 4 >> 63 1<< 63 >> 60
4294967296 -9223372036854775808 0 1 0 8 4294967296 -9223372036854775808 0 1 0 8
10 10.0 10. .1e+2 100.0e-1 10 10.0 10. .1e+2 100.0e-1
10 10.0 10 10 10 10 10.0 10 10 10
6e-05 -6e-05 --6e-05 -6e-05+1.000000 6e-05 -6e-05 --6e-05 -6e-05+1.000000
6e-05 -6e-05 6e-05 0.99994 6e-05 -6e-05 6e-05 0.99994
0 256 00000000000000065536 2147483647 -2147483648 2147483648 +4294967296 0 256 00000000000000065536 2147483647 -2147483648 2147483648 +4294967296
0 256 65536 2147483647 -2147483648 2147483648 4294967296 0 256 65536 2147483647 -2147483648 2147483648 4294967296
922337203685477580 92233720368547758000 922337203685477580 92233720368547758000
922337203685477580 92233720368547758080 922337203685477580 92233720368547758080
-922337203685477580 -92233720368547758000 -922337203685477580 -92233720368547758000
-922337203685477580 -92233720368547758080 -922337203685477580 -92233720368547758080
9223372036854775807 -009223372036854775808 9223372036854775807 -009223372036854775808
9223372036854775807 -9223372036854775808 9223372036854775807 -9223372036854775808
+9999999999999999999 -9999999999999999999 +9999999999999999999 -9999999999999999999
10000000000000000000 -10000000000000000000 10000000000000000000 -10000000000000000000
DEGREES(PI()) RADIANS(360) DEGREES(PI()) RADIANS(360)
180 6.2831853071796 180 6.2831853071796
0=0 1>0 1>=1 1<0 1<=0 1!=0 STRCMP("abc","abcd") STRCMP("b","a") STRCMP("a","a") 0=0 1>0 1>=1 1<0 1<=0 1!=0 STRCMP("abc","abcd") STRCMP("b","a") STRCMP("a","a")
1 1 1 0 0 1 -1 1 0 1 1 1 0 0 1 -1 1 0
"a"<"b" "a"<="b" "b">="a" "b">"a" "a"="A" "a"<>"b" "a"<"b" "a"<="b" "b">="a" "b">"a" "a"="A" "a"<>"b"
1 1 1 1 1 1 1 1 1 1 1 1
"a "="A" "A "="a" "a " <= "A b" "a "="A" "A "="a" "a " <= "A b"
1 1 1 1 1 1
"abc" LIKE "a%" "abc" NOT LIKE "%d%" "a%" LIKE "a\%" "abc%" LIKE "a%\%" "abcd" LIKE "a%b_%d" "a" LIKE "%%a" "abcde" LIKE "a%_e" "abc" LIKE "abc%" "abc" LIKE "a%" "abc" NOT LIKE "%d%" "a%" LIKE "a\%" "abc%" LIKE "a%\%" "abcd" LIKE "a%b_%d" "a" LIKE "%%a" "abcde" LIKE "a%_e" "abc" LIKE "abc%"
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
"a" LIKE "%%b" "a" LIKE "%%ab" "ab" LIKE "a\%" "ab" LIKE "_" "ab" LIKE "ab_" "abc" LIKE "%_d" "abc" LIKE "abc%d" "a" LIKE "%%b" "a" LIKE "%%ab" "ab" LIKE "a\%" "ab" LIKE "_" "ab" LIKE "ab_" "abc" LIKE "%_d" "abc" LIKE "abc%d"
0 0 0 0 0 0 0 0 0 0 0 0 0 0
'?' LIKE '|%' '?' LIKE '|%' ESCAPE '|' '%' LIKE '|%' '%' LIKE '|%' ESCAPE '|' '%' LIKE '%' '?' LIKE '|%' '?' LIKE '|%' ESCAPE '|' '%' LIKE '|%' '%' LIKE '|%' ESCAPE '|' '%' LIKE '%'
0 0 0 1 1 0 0 0 1 1
'abc' LIKE '%c' 'abcabc' LIKE '%c' "ab" LIKE "" "ab" LIKE "a" "ab" LIKE "ab" 'abc' LIKE '%c' 'abcabc' LIKE '%c' "ab" LIKE "" "ab" LIKE "a" "ab" LIKE "ab"
1 1 0 0 1 1 1 0 0 1
"Det här är svenska" REGEXP "h[[:alpha:]]+r" "aba" REGEXP "^(a|b)*$" "Det här är svenska" REGEXP "h[[:alpha:]]+r" "aba" REGEXP "^(a|b)*$"
1 1 1 1
"aba" REGEXP CONCAT("^","a") "aba" REGEXP CONCAT("^","a")
1 1
!0 NOT 0=1 !(0=0) 1 AND 1 1 && 0 0 OR 1 1 || NULL 1=1 OR 1=1 AND 1=0 !0 NOT 0=1 !(0=0) 1 AND 1 1 && 0 0 OR 1 1 || NULL 1=1 OR 1=1 AND 1=0
1 1 0 1 0 1 1 1 1 1 0 1 0 1 1 1
IF(0,"ERROR","this") IF(1,"is","ERROR") IF(NULL,"ERROR","a") IF(1,2,3)|0 IF(1,2.0,3.0)+0 IF(0,"ERROR","this") IF(1,"is","ERROR") IF(NULL,"ERROR","a") IF(1,2,3)|0 IF(1,2.0,3.0)+0
this is a 2 2.0 this is a 2 2.0
id elt(two.val,'one','two') id elt(two.val,'one','two')
1 one 1 one
2 one 2 one
4 two 4 two
id elt(two.val,'one','two') id elt(two.val,'one','two')
1 one 1 one
2 one 2 one
4 two 4 two
key_link_id link key_link_id link
NULL NULL NULL NULL
Table Create Table Table Create Table
test CREATE TABLE `test` ( test CREATE TABLE `test` (
`test_set` set('val1','val2','val3') NOT NULL default '', `test_set` set('val1','val2','val3') NOT NULL default '',
`name` char(20) default 'O''Brien' `name` char(20) default 'O''Brien'
) TYPE=MyISAM COMMENT='it''s a table' ) TYPE=MyISAM COMMENT='it''s a table'
Variable_name Value Variable_name Value
Slave_running ON Slave_running ON
Variable_name Value Variable_name Value
Slave_running OFF Slave_running OFF
-- source include/have_bdb.inc
drop table if exists t1; drop table if exists t1;
create table t1 (id int unsigned not null auto_increment, code tinyint unsigned not null, name char(20) not null, primary key (id), key (code), unique (name)) type=bdb; create table t1 (id int unsigned not null auto_increment, code tinyint unsigned not null, name char(20) not null, primary key (id), key (code), unique (name)) type=bdb;
...@@ -10,3 +12,19 @@ update ignore t1 set id = id + 10, name = 'Ralph' where id < 4; ...@@ -10,3 +12,19 @@ update ignore t1 set id = id + 10, name = 'Ralph' where id < 4;
select id, code, name from t1 order by id; select id, code, name from t1 order by id;
drop table t1; drop table t1;
#
# Test replace
#
CREATE TABLE t1 (
gesuchnr int(11) DEFAULT '0' NOT NULL,
benutzer_id int(11) DEFAULT '0' NOT NULL,
PRIMARY KEY (gesuchnr,benutzer_id)
) type=BDB;
replace into t1 (gesuchnr,benutzer_id) values (2,1);
replace into t1 (gesuchnr,benutzer_id) values (1,1);
replace into t1 (gesuchnr,benutzer_id) values (1,1);
select * from t1;
drop table t1;
connect (master,localhost,root,,test,0,var/tmp/mysql.sock);
connect (master1,localhost,root,,test,0,var/tmp/mysql.sock);
connect (slave,localhost,root,,test,0,var/tmp/mysql-slave.sock);
connect (slave1,localhost,root,,test,0,var/tmp/mysql-slave.sock);
connection slave;
!slave stop;
connection master;
reset master;
connection slave;
reset slave;
!slave start;
-- source include/have_isam.inc
# #
# Test of REPLACE with ISAM and MyISAM and BDB # Test of REPLACE with ISAM and MyISAM and HEAP
# #
drop table if exists t1; drop table if exists t1;
...@@ -15,8 +17,6 @@ replace into t1 (gesuchnr,benutzer_id) values (1,1); ...@@ -15,8 +17,6 @@ replace into t1 (gesuchnr,benutzer_id) values (1,1);
replace into t1 (gesuchnr,benutzer_id) values (1,1); replace into t1 (gesuchnr,benutzer_id) values (1,1);
alter table t1 type=myisam; alter table t1 type=myisam;
replace into t1 (gesuchnr,benutzer_id) values (1,1); replace into t1 (gesuchnr,benutzer_id) values (1,1);
alter table t1 type=bdb;
replace into t1 (gesuchnr,benutzer_id) values (1,1);
alter table t1 type=heap; alter table t1 type=heap;
replace into t1 (gesuchnr,benutzer_id) values (1,1); replace into t1 (gesuchnr,benutzer_id) values (1,1);
drop table t1; drop table t1;
...@@ -330,7 +330,7 @@ static struct option long_options[] = ...@@ -330,7 +330,7 @@ static struct option long_options[] =
static void usage(int version) static void usage(int version)
{ {
printf("%s Ver 3.1 Distrib %s, for %s (%s)\n", printf("%s Ver 3.2 Distrib %s, for %s (%s)\n",
my_progname, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE); my_progname, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE);
if (version) if (version)
return; return;
...@@ -350,7 +350,7 @@ static void usage(int version) ...@@ -350,7 +350,7 @@ static void usage(int version)
} }
static uint best_type; static uint best_type;
static ulong best_t1,best_t2; static ulong best_t1,best_t2, best_start_value;
static int get_options(int argc, char **argv) static int get_options(int argc, char **argv)
{ {
...@@ -510,8 +510,10 @@ int main(int argc,char **argv) ...@@ -510,8 +510,10 @@ int main(int argc,char **argv)
best_mod=function_mod; best_add=function_plus; best_mod=function_mod; best_add=function_plus;
best_functype=function_type; best_functype=function_type;
best_t1=t1; best_t2=t2; best_type=type; best_t1=t1; best_t2=t2; best_type=type;
printf("\nstart_value=%ldL; best_t1=%ldL; best_t2=%ldL; best_type=%d; /* mode=%d add=%d func_type: %d */\n", best_start_value=start_value;
start_value,best_t1,best_t2,best_type,best_mod,best_add,best_functype); printf("\nstart_value=%ldL; best_t1=%ldL; best_t2=%ldL; best_type=%d; /* mode=%d add=%d type: %d */\n",
best_start_value,best_t1,best_t2,best_type,best_mod,best_add,
best_functype);
} }
} }
} }
...@@ -537,8 +539,8 @@ printf("/* This code is generated by gen_lex_hash.cc that seeks for a perfect\nh ...@@ -537,8 +539,8 @@ printf("/* This code is generated by gen_lex_hash.cc that seeks for a perfect\nh
print_arrays(); print_arrays();
printf("/* start_value=%ldL; best_t1=%ldL; best_t2=%ldL; best_type=%d; */ /* mode=%d add=%d type: %d */\n\n", printf("/* start_value=%ldL; best_t1=%ldL; best_t2=%ldL; best_type=%d; */ /* mode=%d add=%d t ype: %d */\n\n",
start_value, best_t1, best_t2,best_type, best_start_value, best_t1, best_t2, best_type,
best_mod, best_add, best_functype); best_mod, best_add, best_functype);
printf("inline SYMBOL *get_hash_symbol(const char *s,unsigned int length,bool function)\n\ printf("inline SYMBOL *get_hash_symbol(const char *s,unsigned int length,bool function)\n\
......
...@@ -89,7 +89,7 @@ static DB_ENV *db_env; ...@@ -89,7 +89,7 @@ static DB_ENV *db_env;
static HASH bdb_open_tables; static HASH bdb_open_tables;
const char *berkeley_lock_names[] = const char *berkeley_lock_names[] =
{ "DEFAULT", "OLDEST","RANDOM","YOUNGEST" }; { "DEFAULT", "OLDEST","RANDOM","YOUNGEST",0 };
u_int32_t berkeley_lock_types[]= u_int32_t berkeley_lock_types[]=
{ DB_LOCK_DEFAULT, DB_LOCK_OLDEST, DB_LOCK_RANDOM }; { DB_LOCK_DEFAULT, DB_LOCK_OLDEST, DB_LOCK_RANDOM };
TYPELIB berkeley_lock_typelib= {array_elements(berkeley_lock_names),"", TYPELIB berkeley_lock_typelib= {array_elements(berkeley_lock_names),"",
......
...@@ -91,7 +91,7 @@ class ha_berkeley: public handler ...@@ -91,7 +91,7 @@ class ha_berkeley: public handler
HA_BLOB_KEY | HA_NOT_EXACT_COUNT | HA_BLOB_KEY | HA_NOT_EXACT_COUNT |
HA_PRIMARY_KEY_IN_READ_INDEX | HA_DROP_BEFORE_CREATE | HA_PRIMARY_KEY_IN_READ_INDEX | HA_DROP_BEFORE_CREATE |
HA_AUTO_PART_KEY), HA_AUTO_PART_KEY),
last_dup_key((uint) -1),version(0) last_dup_key((uint) -1),version(0),using_ignore(0)
{ {
} }
~ha_berkeley() {} ~ha_berkeley() {}
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#define NO_HASH /* Not yet implemented */ #define NO_HASH /* Not yet implemented */
#endif #endif
#if defined(HAVE_BERKELEY_DB) || defined(HAVE_INNOBASE_DB) || defined(HAVE_GEMENI_DB) #if defined(HAVE_BERKELEY_DB) || defined(HAVE_INNOBASE_DB) || defined(HAVE_GEMINI_DB)
#define USING_TRANSACTIONS #define USING_TRANSACTIONS
#endif #endif
...@@ -121,7 +121,7 @@ enum row_type { ROW_TYPE_DEFAULT, ROW_TYPE_FIXED, ROW_TYPE_DYNAMIC, ...@@ -121,7 +121,7 @@ enum row_type { ROW_TYPE_DEFAULT, ROW_TYPE_FIXED, ROW_TYPE_DYNAMIC,
typedef struct st_thd_trans { typedef struct st_thd_trans {
void *bdb_tid; void *bdb_tid;
void *innobase_tid; void *innobase_tid;
void *gemeni_tid; void *gemini_tid;
} THD_TRANS; } THD_TRANS;
typedef struct st_ha_create_information typedef struct st_ha_create_information
......
...@@ -151,16 +151,21 @@ SHOW_COMP_OPTION have_berkeley_db=SHOW_OPTION_YES; ...@@ -151,16 +151,21 @@ SHOW_COMP_OPTION have_berkeley_db=SHOW_OPTION_YES;
#else #else
SHOW_COMP_OPTION have_berkeley_db=SHOW_OPTION_NO; SHOW_COMP_OPTION have_berkeley_db=SHOW_OPTION_NO;
#endif #endif
#ifdef HAVE_GEMENI_DB #ifdef HAVE_GEMINI_DB
SHOW_COMP_OPTION have_gemeni=SHOW_OPTION_YES; SHOW_COMP_OPTION have_gemini=SHOW_OPTION_YES;
#else #else
SHOW_COMP_OPTION have_gemeni=SHOW_OPTION_NO; SHOW_COMP_OPTION have_gemini=SHOW_OPTION_NO;
#endif #endif
#ifdef HAVE_INNOBASE_DB #ifdef HAVE_INNOBASE_DB
SHOW_COMP_OPTION have_innobase=SHOW_OPTION_YES; SHOW_COMP_OPTION have_innobase=SHOW_OPTION_YES;
#else #else
SHOW_COMP_OPTION have_innobase=SHOW_OPTION_NO; SHOW_COMP_OPTION have_innobase=SHOW_OPTION_NO;
#endif #endif
#ifndef NO_ISAM
SHOW_COMP_OPTION have_isam=SHOW_OPTION_YES;
#else
SHOW_COMP_OPTION have_isam=SHOW_OPTION_NO;
#endif
#ifdef USE_RAID #ifdef USE_RAID
SHOW_COMP_OPTION have_raid=SHOW_OPTION_YES; SHOW_COMP_OPTION have_raid=SHOW_OPTION_YES;
#else #else
...@@ -1077,26 +1082,26 @@ inline static __volatile__ void trace_stack() ...@@ -1077,26 +1082,26 @@ inline static __volatile__ void trace_stack()
uchar **stack_bottom; uchar **stack_bottom;
uchar** ebp; uchar** ebp;
LINT_INIT(ebp); LINT_INIT(ebp);
fprintf(stderr, "Attemping backtrace, please send the info below to\ fprintf(stderr, "Attemping backtrace, please send the info below to \
bugs@lists.mysql.com. If you see no messages after this, something \ bugs@lists.mysql.com. If you see no messages after this, something \
went terribly wrong - report this anyway\n"); went terribly wrong - report this anyway\n");
THD* thd = current_thd; THD* thd = current_thd;
uint frame_count = 0; uint frame_count = 0;
__asm __volatile__ ("movl %%ebp,%0" __asm __volatile__ ("movl %%ebp,%0"
:"=r"(ebp) :"=r"(ebp)
:"r"(ebp)); :"r"(ebp));
if(!ebp) if (!ebp)
{ {
fprintf(stderr, "frame pointer (ebp) is NULL, did you compile with \ fprintf(stderr, "frame pointer (ebp) is NULL, did you compile with \
-fomit-frame-pointer? Aborting backtrace\n"); -fomit-frame-pointer? Aborting backtrace\n");
return; return;
} }
if(!thd) if (!thd)
{ {
fprintf(stderr, "Cannot determine thread, ebp=%p, aborting backtrace\n", fprintf(stderr, "Cannot determine thread, ebp=%p, aborting backtrace\n",
ebp); ebp);
return; return;
} }
stack_bottom = (uchar**)thd->thread_stack; stack_bottom = (uchar**)thd->thread_stack;
if(ebp > stack_bottom || ebp < stack_bottom - thread_stack) if(ebp > stack_bottom || ebp < stack_bottom - thread_stack)
{ {
...@@ -1107,20 +1112,20 @@ inline static __volatile__ void trace_stack() ...@@ -1107,20 +1112,20 @@ inline static __volatile__ void trace_stack()
fprintf(stderr, "stack range sanity check, ok, backtrace follows\n"); fprintf(stderr, "stack range sanity check, ok, backtrace follows\n");
while(ebp < stack_bottom) while (ebp < stack_bottom)
{
uchar** new_ebp = (uchar**)*ebp;
fprintf(stderr, "%p\n", frame_count == SIGRETURN_FRAME_COUNT ?
*(ebp+17) : *(ebp+1));
if (new_ebp <= ebp )
{ {
uchar** new_ebp = (uchar**)*ebp; fprintf(stderr, "New value of ebp failed sanity check\
fprintf(stderr, "%p\n", frame_count == SIGRETURN_FRAME_COUNT ?
*(ebp+17) : *(ebp+1));
if(new_ebp <= ebp )
{
fprintf(stderr, "New value of ebp failed sanity check\
terminating backtrace\n"); terminating backtrace\n");
return; return;
}
ebp = new_ebp;
++frame_count;
} }
ebp = new_ebp;
++frame_count;
}
fprintf(stderr, "stack trace successful\n"); fprintf(stderr, "stack trace successful\n");
} }
...@@ -1133,31 +1138,27 @@ static sig_handler handle_segfault(int sig) ...@@ -1133,31 +1138,27 @@ static sig_handler handle_segfault(int sig)
// but since we have got SIGSEGV already, things are a mess // but since we have got SIGSEGV already, things are a mess
// so not having the mutex is not as bad as possibly using a buggy // so not having the mutex is not as bad as possibly using a buggy
// mutex - so we keep things simple // mutex - so we keep things simple
if(segfaulted) if (segfaulted)
return; return;
segfaulted = 1; segfaulted = 1;
fprintf(stderr,"\ fprintf(stderr,"\
mysqld got signal %s in thread %d; \n\ mysqld got signal %d;\n\
The manual section 'Debugging a MySQL server' tells you how to use a \n\ The manual section 'Debugging a MySQL server' tells you how to use a \n\
debugger on the core file to produce a backtrace that may help you find out\n\ debugger on the core file to produce a backtrace that may help you find out\n\
why mysqld died\n",sys_siglist[sig],getpid()); why mysqld died\n",sig);
#if defined(HAVE_LINUXTHREADS) && defined(__i386__) #if defined(HAVE_LINUXTHREADS)
#ifdef __i386__
trace_stack(); trace_stack();
#endif #endif /* __i386__ */
#ifdef HAVE_LINUXTHREADS
if (test_flags & TEST_CORE_ON_SIGNAL) if (test_flags & TEST_CORE_ON_SIGNAL)
write_core(sig); write_core(sig);
else #endif /* HAVE_LINUXTHREADS */
exit(1); exit(1);
#else
exit(1); /* abort everything */
#endif
} }
#ifdef HAVE_LINUXTHREADS
/* Produce a core for the thread */ /* Produce a core for the thread */
#ifdef HAVE_LINUXTHREADS
static sig_handler write_core(int sig) static sig_handler write_core(int sig)
{ {
signal(sig, SIG_DFL); signal(sig, SIG_DFL);
...@@ -1756,7 +1757,7 @@ The server will not act as a slave"); ...@@ -1756,7 +1757,7 @@ The server will not act as a slave");
if (master_host) if (master_host)
{ {
pthread_t hThread; pthread_t hThread;
if(!opt_skip_slave_start && if (!opt_skip_slave_start &&
pthread_create(&hThread, &connection_attrib, handle_slave, 0)) pthread_create(&hThread, &connection_attrib, handle_slave, 0))
sql_print_error("Warning: Can't create thread to handle slave"); sql_print_error("Warning: Can't create thread to handle slave");
else if(opt_skip_slave_start) else if(opt_skip_slave_start)
...@@ -2623,8 +2624,9 @@ struct show_var_st init_vars[]= { ...@@ -2623,8 +2624,9 @@ struct show_var_st init_vars[]= {
{"flush", (char*) &myisam_flush, SHOW_MY_BOOL}, {"flush", (char*) &myisam_flush, SHOW_MY_BOOL},
{"flush_time", (char*) &flush_time, SHOW_LONG}, {"flush_time", (char*) &flush_time, SHOW_LONG},
{"have_bdb", (char*) &have_berkeley_db, SHOW_HAVE}, {"have_bdb", (char*) &have_berkeley_db, SHOW_HAVE},
{"have_gemeni", (char*) &have_gemeni, SHOW_HAVE}, {"have_gemini", (char*) &have_gemini, SHOW_HAVE},
{"have_innobase", (char*) &have_innobase, SHOW_HAVE}, {"have_innobase", (char*) &have_innobase, SHOW_HAVE},
{"have_isam", (char*) &have_isam, SHOW_HAVE},
{"have_raid", (char*) &have_raid, SHOW_HAVE}, {"have_raid", (char*) &have_raid, SHOW_HAVE},
{"have_ssl", (char*) &have_ssl, SHOW_HAVE}, {"have_ssl", (char*) &have_ssl, SHOW_HAVE},
{"init_file", (char*) &opt_init_file, SHOW_CHAR_PTR}, {"init_file", (char*) &opt_init_file, SHOW_CHAR_PTR},
...@@ -3101,7 +3103,7 @@ static void get_options(int argc,char **argv) ...@@ -3101,7 +3103,7 @@ static void get_options(int argc,char **argv)
{ {
char* key = optarg,*p, *val; char* key = optarg,*p, *val;
p = strstr(optarg, "->"); p = strstr(optarg, "->");
if(!p) if (!p)
{ {
fprintf(stderr, fprintf(stderr,
"bad syntax in replicate-rewrite-db - missing ->\n"); "bad syntax in replicate-rewrite-db - missing ->\n");
...@@ -3118,7 +3120,7 @@ static void get_options(int argc,char **argv) ...@@ -3118,7 +3120,7 @@ static void get_options(int argc,char **argv)
*val = 0; *val = 0;
val += 2; val += 2;
while(*val && isspace(*val)) *val++; while(*val && isspace(*val)) *val++;
if(!*val) if (!*val)
{ {
fprintf(stderr, fprintf(stderr,
"bad syntax in replicate-rewrite-db - empty TO db\n"); "bad syntax in replicate-rewrite-db - empty TO db\n");
...@@ -3144,7 +3146,7 @@ static void get_options(int argc,char **argv) ...@@ -3144,7 +3146,7 @@ static void get_options(int argc,char **argv)
} }
case (int)OPT_REPLICATE_DO_TABLE: case (int)OPT_REPLICATE_DO_TABLE:
{ {
if(!do_table_inited) if (!do_table_inited)
init_table_rule_hash(&replicate_do_table, &do_table_inited); init_table_rule_hash(&replicate_do_table, &do_table_inited);
if(add_table_rule(&replicate_do_table, optarg)) if(add_table_rule(&replicate_do_table, optarg))
{ {
...@@ -3156,7 +3158,7 @@ static void get_options(int argc,char **argv) ...@@ -3156,7 +3158,7 @@ static void get_options(int argc,char **argv)
} }
case (int)OPT_REPLICATE_WILD_DO_TABLE: case (int)OPT_REPLICATE_WILD_DO_TABLE:
{ {
if(!wild_do_table_inited) if (!wild_do_table_inited)
init_table_rule_array(&replicate_wild_do_table, init_table_rule_array(&replicate_wild_do_table,
&wild_do_table_inited); &wild_do_table_inited);
if(add_wild_table_rule(&replicate_wild_do_table, optarg)) if(add_wild_table_rule(&replicate_wild_do_table, optarg))
...@@ -3169,7 +3171,7 @@ static void get_options(int argc,char **argv) ...@@ -3169,7 +3171,7 @@ static void get_options(int argc,char **argv)
} }
case (int)OPT_REPLICATE_WILD_IGNORE_TABLE: case (int)OPT_REPLICATE_WILD_IGNORE_TABLE:
{ {
if(!wild_ignore_table_inited) if (!wild_ignore_table_inited)
init_table_rule_array(&replicate_wild_ignore_table, init_table_rule_array(&replicate_wild_ignore_table,
&wild_ignore_table_inited); &wild_ignore_table_inited);
if(add_wild_table_rule(&replicate_wild_ignore_table, optarg)) if(add_wild_table_rule(&replicate_wild_ignore_table, optarg))
...@@ -3182,7 +3184,7 @@ static void get_options(int argc,char **argv) ...@@ -3182,7 +3184,7 @@ static void get_options(int argc,char **argv)
} }
case (int)OPT_REPLICATE_IGNORE_TABLE: case (int)OPT_REPLICATE_IGNORE_TABLE:
{ {
if(!ignore_table_inited) if (!ignore_table_inited)
init_table_rule_hash(&replicate_ignore_table, &ignore_table_inited); init_table_rule_hash(&replicate_ignore_table, &ignore_table_inited);
if(add_table_rule(&replicate_ignore_table, optarg)) if(add_table_rule(&replicate_ignore_table, optarg))
{ {
......
...@@ -301,7 +301,7 @@ public: ...@@ -301,7 +301,7 @@ public:
{ {
return (transaction.all.bdb_tid != 0 || return (transaction.all.bdb_tid != 0 ||
transaction.all.innobase_tid != 0 || transaction.all.innobase_tid != 0 ||
transaction.all.gemeni_tid != 0); transaction.all.gemini_tid != 0);
} }
inline gptr alloc(unsigned int size) { return alloc_root(&mem_root,size); } inline gptr alloc(unsigned int size) { return alloc_root(&mem_root,size); }
inline gptr calloc(unsigned int size) inline gptr calloc(unsigned int size)
......
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