Commit b1cb5b6f authored by monty@hundin.mysql.fi's avatar monty@hundin.mysql.fi

Portability fixes.

Let myisamchk generate a new checksum for compressed data.
Don't unconditionally force filenames to lower case on windows.
Update mysqltest to match 4.0 source (to get some of the new bug fixes into 3.23)
parent bfbc3252
...@@ -1523,7 +1523,7 @@ Apart from the following links, you can find and download a lot of ...@@ -1523,7 +1523,7 @@ Apart from the following links, you can find and download a lot of
@subheading Tutorials and Manuals @subheading Tutorials and Manuals
@table @asis @table @asis
@item @uref{http://netgraft.com/~mbac/research/mysqlmyths.html, MySQL Myths Debunked} @item @uref{http://michael.bacarella.com/research/mysqlmyths.html, MySQL Myths Debunked}
@strong{MySQL} used in the real world. @strong{MySQL} used in the real world.
@item @uref{http://www.4t2.com/mysql} @item @uref{http://www.4t2.com/mysql}
...@@ -10030,6 +10030,12 @@ make_install ...@@ -10030,6 +10030,12 @@ make_install
and @strong{mysqld} should be ready to run. and @strong{mysqld} should be ready to run.
On Ia64 the @strong{MySQL} client binaries are using shared
libraries. This means that if you install our binary distribution in
some other place than @file{/usr/local/mysql} you need to either modify
@file{/etc/ld.so.conf} or add the path to the directory where you have
@file{libmysqlclient.so} to the @code{LD_LIBRARY_PATH} environment
variable. @xref{Link errors}.
@node Windows, Solaris, Linux, Operating System Specific Notes @node Windows, Solaris, Linux, Operating System Specific Notes
@subsection Windows Notes @subsection Windows Notes
...@@ -10635,7 +10641,7 @@ CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" \ ...@@ -10635,7 +10641,7 @@ CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" \
If you have a ultra sparc, you can get 4 % more performance by adding If you have a ultra sparc, you can get 4 % more performance by adding
"-mcpu=v8 -Wa,-xarch=v8plusa" to CFLAGS and CXXFLAGS. "-mcpu=v8 -Wa,-xarch=v8plusa" to CFLAGS and CXXFLAGS.
If you have the Sun Workshop (SunPro) 4.2 (or newer) compiler, you can If you have Sun Workshop (Fortre) 5.3 (or newer) compiler, you can
run @code{configure} like this: run @code{configure} like this:
@example @example
...@@ -10644,6 +10650,15 @@ CXX=CC CXXFLAGS="-noex -xO4 -mt" \ ...@@ -10644,6 +10650,15 @@ CXX=CC CXXFLAGS="-noex -xO4 -mt" \
./configure --prefix=/usr/local/mysql --enable-assembler ./configure --prefix=/usr/local/mysql --enable-assembler
@end example @end example
In the MySQL benchmarks, we got a 6 % speedup on an Ultrasparc when
using Sun Workshop 5.3 compared to using gcc with -mcpu flags.
If you get a problem with @code{fdatasync} or @code{sched_yield},
you can fix this by adding @code{LIBS=-lrt} to the configure line
The following paragraph is only relevant for older compilers than
WorkShop 5.3:
You may also have to edit the @code{configure} script to change this line: You may also have to edit the @code{configure} script to change this line:
@example @example
...@@ -15496,7 +15511,7 @@ With this option, ...@@ -15496,7 +15511,7 @@ With this option,
@code{SHOW DATABASES} returns only those databases for which the user has @code{SHOW DATABASES} returns only those databases for which the user has
some kind of privilege. some kind of privilege.
@item @code{--safe-user-create} @item --safe-user-create
If this is enabled, an user can't create new users with the @code{GRANT} If this is enabled, an user can't create new users with the @code{GRANT}
command, if the user doesn't have @code{INSERT} privilege to the command, if the user doesn't have @code{INSERT} privilege to the
@code{mysql.user} table. If you want to give a user access to just create @code{mysql.user} table. If you want to give a user access to just create
...@@ -21385,7 +21400,7 @@ mysql> show variables like "have_%"; ...@@ -21385,7 +21400,7 @@ mysql> show variables like "have_%";
| have_bdb | YES | | have_bdb | YES |
| have_innodb | NO | | have_innodb | NO |
| have_isam | YES | | have_isam | YES |
| have_raid | YES | | have_raid | NO |
| have_ssl | NO | | have_ssl | NO |
+---------------+-------+ +---------------+-------+
@end example @end example
...@@ -46291,9 +46306,6 @@ Added prototypes for @code{my_thread_init()} and @code{my_thread_end()} to ...@@ -46291,9 +46306,6 @@ Added prototypes for @code{my_thread_init()} and @code{my_thread_end()} to
@item @item
Added option @code{--safe-user-create} to @code{mysqld}. Added option @code{--safe-user-create} to @code{mysqld}.
@item @item
Added options to the @code{--ansi} startup options to let the user
decide which @code{ansi} options one to enable.
@item
Fixed bug in @code{SELECT DISTINCT ... HAVING} that casued error message Fixed bug in @code{SELECT DISTINCT ... HAVING} that casued error message
@code{Can't find record in '#...} @code{Can't find record in '#...}
@end itemize @end itemize
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
**********************************************************************/ **********************************************************************/
#define MTEST_VERSION "1.8" #define MTEST_VERSION "1.10"
#include <global.h> #include <global.h>
#include <my_sys.h> #include <my_sys.h>
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
static int record = 0, verbose = 0, silent = 0, opt_sleep=0; static int record = 0, verbose = 0, silent = 0, opt_sleep=0;
static char *db = 0, *pass=0; static char *db = 0, *pass=0;
const char* user = 0, *host = 0, *unix_sock = 0; const char* user = 0, *host = 0, *unix_sock = 0;
static int port = 0; static int port = 0, opt_big_test=0;
static uint start_lineno, *lineno; static uint start_lineno, *lineno;
static char **default_argv; static char **default_argv;
...@@ -95,9 +95,13 @@ static FILE** cur_file; ...@@ -95,9 +95,13 @@ 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 block_stack[BLOCK_STACK_DEPTH];
static int *cur_block, *block_stack_end; static int *cur_block, *block_stack_end;
static int block_stack[BLOCK_STACK_DEPTH];
static int block_ok_stack[BLOCK_STACK_DEPTH];
static uint global_expected_errno[MAX_EXPECTED_ERRORS]; static uint global_expected_errno[MAX_EXPECTED_ERRORS];
DYNAMIC_ARRAY q_lines; DYNAMIC_ARRAY q_lines;
...@@ -121,7 +125,7 @@ typedef struct ...@@ -121,7 +125,7 @@ typedef struct
PARSER parser; PARSER parser;
MASTER_POS master_pos; MASTER_POS master_pos;
int block_ok = 1; /* set to 0 if the current block should not be executed */ int* block_ok; /* set to 0 if the current block should not be executed */
int false_block_depth = 0; int false_block_depth = 0;
const char* result_file = 0; /* if set, all results are concated and const char* result_file = 0; /* if set, all results are concated and
compared against this file*/ compared against this file*/
...@@ -159,6 +163,8 @@ Q_SYNC_WITH_MASTER, Q_ERROR, ...@@ -159,6 +163,8 @@ Q_SYNC_WITH_MASTER, Q_ERROR,
Q_SEND, Q_REAP, Q_SEND, Q_REAP,
Q_DIRTY_CLOSE, Q_REPLACE, Q_DIRTY_CLOSE, Q_REPLACE,
Q_PING, Q_EVAL, Q_PING, Q_EVAL,
Q_RPL_PROBE, Q_ENABLE_RPL_PARSE,
Q_DISABLE_RPL_PARSE, Q_EVAL_RESULT,
Q_UNKNOWN, /* Unknown command. */ Q_UNKNOWN, /* Unknown command. */
Q_COMMENT, /* Comments, ignored. */ Q_COMMENT, /* Comments, ignored. */
Q_COMMENT_WITH_COMMAND Q_COMMENT_WITH_COMMAND
...@@ -167,7 +173,7 @@ Q_COMMENT_WITH_COMMAND ...@@ -167,7 +173,7 @@ Q_COMMENT_WITH_COMMAND
/* this should really be called command */ /* this should really be called command */
struct st_query struct st_query
{ {
char *query, *query_buf,*first_argument; char *query, *query_buf,*first_argument,*end;
int first_word_len; int first_word_len;
my_bool abort_on_error, require_file; my_bool abort_on_error, require_file;
uint expected_errno[MAX_EXPECTED_ERRORS]; uint expected_errno[MAX_EXPECTED_ERRORS];
...@@ -188,6 +194,8 @@ const char *command_names[] = { ...@@ -188,6 +194,8 @@ const char *command_names[] = {
"send", "reap", "send", "reap",
"dirty_close", "replace_result", "dirty_close", "replace_result",
"ping", "eval", "ping", "eval",
"rpl_probe", "enable_rpl_parse",
"disable_rpl_parse", "eval_result",
0 0
}; };
...@@ -199,7 +207,7 @@ static void die(const char* fmt, ...); ...@@ -199,7 +207,7 @@ static void die(const char* fmt, ...);
static void init_var_hash(); static void init_var_hash();
static byte* get_var_key(const byte* rec, uint* len, static byte* get_var_key(const byte* rec, uint* len,
my_bool __attribute__((unused)) t); my_bool __attribute__((unused)) t);
static VAR* var_init(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);
static void var_free(void* v); static void var_free(void* v);
...@@ -230,10 +238,21 @@ void free_pointer_array(POINTER_ARRAY *pa); ...@@ -230,10 +238,21 @@ void free_pointer_array(POINTER_ARRAY *pa);
static int initialize_replace_buffer(void); static int initialize_replace_buffer(void);
static void free_replace_buffer(void); static void free_replace_buffer(void);
static void do_eval(DYNAMIC_STRING* query_eval, const char* query); static void do_eval(DYNAMIC_STRING* query_eval, const char* query);
void str_to_file(const char* fname, char* str, int size);
struct st_replace *glob_replace; struct st_replace *glob_replace;
static char *out_buff; static char *out_buff;
static uint out_length; static uint out_length;
static int eval_result = 0;
/* Disable functions that only exist in MySQL 4.0 */
#if MYSQL_VERSION_ID < 40000
static void mysql_enable_rpl_parse(MYSQL* mysql) {}
static void mysql_disable_rpl_parse(MYSQL* mysql) {}
static int mysql_rpl_parse_enabled(MYSQL* mysql) { return 1; }
static int mysql_rpl_probe(MYSQL *mysql) { return 1; }
#endif
static void do_eval(DYNAMIC_STRING* query_eval, const char* query) static void do_eval(DYNAMIC_STRING* query_eval, const char* query)
{ {
...@@ -290,7 +309,7 @@ static void close_files() ...@@ -290,7 +309,7 @@ static void close_files()
{ {
do do
{ {
if (*cur_file != stdin) if (*cur_file != stdin && *cur_file)
my_fclose(*cur_file,MYF(0)); my_fclose(*cur_file,MYF(0));
} while (cur_file-- != file_stack); } while (cur_file-- != file_stack);
} }
...@@ -352,7 +371,9 @@ static void abort_not_supported_test() ...@@ -352,7 +371,9 @@ static void abort_not_supported_test()
static void verbose_msg(const char* fmt, ...) static void verbose_msg(const char* fmt, ...)
{ {
va_list args; va_list args;
if (!verbose) return; DBUG_ENTER("verbose_msg");
if (!verbose)
DBUG_VOID_RETURN;
va_start(args, fmt); va_start(args, fmt);
...@@ -360,6 +381,7 @@ static void verbose_msg(const char* fmt, ...) ...@@ -360,6 +381,7 @@ static void verbose_msg(const char* fmt, ...)
vfprintf(stderr, fmt, args); vfprintf(stderr, fmt, args);
fprintf(stderr, "\n"); fprintf(stderr, "\n");
va_end(args); va_end(args);
DBUG_VOID_RETURN;
} }
...@@ -382,25 +404,53 @@ int hex_val(int c) ...@@ -382,25 +404,53 @@ int hex_val(int c)
int dyn_string_cmp(DYNAMIC_STRING* ds, const char* fname) int dyn_string_cmp(DYNAMIC_STRING* ds, const char* fname)
{ {
MY_STAT stat_info; MY_STAT stat_info;
char *tmp; char *tmp, *res_ptr;
char eval_file[FN_REFLEN];
int res; int res;
uint res_len;
int fd; int fd;
DYNAMIC_STRING res_ds;
DBUG_ENTER("dyn_string_cmp"); DBUG_ENTER("dyn_string_cmp");
if (!my_stat(fname, &stat_info, MYF(MY_WME))) if (!my_stat(fname, &stat_info, MYF(MY_WME)))
die(NullS); die(NullS);
if (stat_info.st_size != ds->length) if (!eval_result && stat_info.st_size != ds->length)
DBUG_RETURN(2); DBUG_RETURN(2);
if (!(tmp = (char*) my_malloc(ds->length, MYF(MY_WME)))) if (!(tmp = (char*) my_malloc(stat_info.st_size + 1, MYF(MY_WME))))
die(NullS); die(NullS);
if ((fd = my_open(fname, O_RDONLY, MYF(MY_WME))) < 0) if ((fd = my_open(fname, O_RDONLY, MYF(MY_WME))) < 0)
die(NullS); die(NullS);
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(NullS); die(NullS);
res = (memcmp(tmp, ds->str, stat_info.st_size)) ? 1 : 0; tmp[stat_info.st_size] = 0;
init_dynamic_string(&res_ds, "", 0, 65536);
if (eval_result)
{
do_eval(&res_ds, tmp);
res_ptr = res_ds.str;
if((res_len = res_ds.length) != ds->length)
{
res = 2;
goto err;
}
}
else
{
res_ptr = tmp;
res_len = stat_info.st_size;
}
res = (memcmp(res_ptr, ds->str, res_len)) ? 1 : 0;
err:
if(res && eval_result)
str_to_file(fn_format(eval_file, fname, "", ".eval",2), res_ptr,
res_len);
my_free((gptr) tmp, MYF(0)); my_free((gptr) tmp, MYF(0));
my_close(fd, MYF(MY_WME)); my_close(fd, MYF(MY_WME));
dynstr_free(&res_ds);
DBUG_RETURN(res); DBUG_RETURN(res);
} }
...@@ -446,12 +496,12 @@ VAR* var_get(const char* var_name, const char** var_name_end, int raw) ...@@ -446,12 +496,12 @@ VAR* var_get(const char* var_name, const char** var_name_end, int 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(isalnum(*var_name) || *var_name == '_') while (isvar(*var_name))
{ {
if(end && var_name == end) if(end && var_name == end)
break; break;
++var_name; ++var_name;
} }
if(var_name == save_var_name) if(var_name == save_var_name)
die("Empty variable"); die("Empty variable");
...@@ -488,7 +538,7 @@ static VAR* var_obtain(char* name, int len) ...@@ -488,7 +538,7 @@ static VAR* var_obtain(char* name, int len)
VAR* v; VAR* v;
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(name, len, "", 0); v = var_init(0, name, len, "", 0);
hash_insert(&var_hash, (byte*)v); hash_insert(&var_hash, (byte*)v);
return v; return v;
} }
...@@ -497,7 +547,6 @@ int var_set(char* var_name, char* var_name_end, char* var_val, ...@@ -497,7 +547,6 @@ int var_set(char* var_name, char* var_name_end, char* var_val,
char* var_val_end) char* var_val_end)
{ {
int digit; int digit;
int val_len;
VAR* v; VAR* v;
if (*var_name++ != '$') if (*var_name++ != '$')
{ {
...@@ -512,21 +561,8 @@ int var_set(char* var_name, char* var_name_end, char* var_val, ...@@ -512,21 +561,8 @@ int var_set(char* var_name, char* var_name_end, char* var_val,
} }
else else
v = var_reg + digit; v = var_reg + digit;
if (v->alloced_len < (val_len = (int)(var_val_end - var_val)+1))
{ return eval_expr(v, var_val, (const char**)&var_val_end);
v->alloced_len = (val_len < MIN_VAR_ALLOC) ? MIN_VAR_ALLOC : val_len;
if (!(v->str_val =
v->str_val ? my_realloc(v->str_val, v->alloced_len, MYF(MY_WME)) :
my_malloc(v->alloced_len, MYF(MY_WME))))
die("Out of memory");
}
val_len--;
memcpy(v->str_val, var_val, val_len);
v->str_val_len = val_len;
v->str_val[val_len] = 0;
v->int_val = atoi(v->str_val);
v->int_dirty=0;
return 0;
} }
int open_file(const char* name) int open_file(const char* name)
...@@ -554,6 +590,35 @@ int do_source(struct st_query* q) ...@@ -554,6 +590,35 @@ int do_source(struct st_query* q)
return open_file(name); return open_file(name);
} }
int var_query_set(VAR* v, const char* p, const char** p_end)
{
char* end = (char*)((p_end && *p_end) ? *p_end : p + strlen(p));
MYSQL_RES *res;
MYSQL_ROW row;
MYSQL* mysql = &cur_con->mysql;
LINT_INIT(res);
while (end > p && *end != '`')
--end;
if (p == end)
die("Syntax error in query, missing '`'");
++p;
if (mysql_real_query(mysql, p, (int)(end - p)) ||
!(res = mysql_store_result(mysql)))
{
*end = 0;
die("Error running query '%s': %s", p, mysql_error(mysql));
}
if ((row = mysql_fetch_row(res)) && row[0])
eval_expr(v, row[0], 0);
else
eval_expr(v, "", 0);
mysql_free_result(res);
return 0;
}
int eval_expr(VAR* v, const char* p, const char** p_end) int eval_expr(VAR* v, const char* p, const char** p_end)
{ {
...@@ -566,10 +631,27 @@ int eval_expr(VAR* v, const char* p, const char** p_end) ...@@ -566,10 +631,27 @@ int eval_expr(VAR* v, const char* p, const char** p_end)
return 0; return 0;
} }
} }
else if(*p == '`')
{
return var_query_set(v, p, p_end);
}
else else
{ {
v->str_val = (char*)p; int new_val_len = (p_end && *p_end) ?
v->str_val_len = (p_end && *p_end) ? (int) (*p_end - p) : (int) strlen(p); (int) (*p_end - p) : (int) strlen(p);
if (new_val_len + 1 >= v->alloced_len)
{
v->alloced_len = (new_val_len < MIN_VAR_ALLOC - 1) ?
MIN_VAR_ALLOC : new_val_len + 1;
if (!(v->str_val =
v->str_val ? my_realloc(v->str_val, v->alloced_len,
MYF(MY_WME)) :
my_malloc(v->alloced_len, MYF(MY_WME))))
die("Out of memory");
}
v->str_val_len = new_val_len;
memcpy(v->str_val, p, new_val_len);
v->str_val[new_val_len] = 0;
v->int_val=atoi(p); v->int_val=atoi(p);
v->int_dirty=0; v->int_dirty=0;
return 0; return 0;
...@@ -605,6 +687,7 @@ int do_system(struct st_query* q) ...@@ -605,6 +687,7 @@ int do_system(struct st_query* q)
{ {
char* p=q->first_argument; char* p=q->first_argument;
VAR v; VAR v;
var_init(&v, 0, 0, 0, 0);
eval_expr(&v, p, 0); /* NULL terminated */ eval_expr(&v, p, 0); /* NULL terminated */
if (v.str_val_len) if (v.str_val_len)
{ {
...@@ -624,6 +707,7 @@ int do_echo(struct st_query* q) ...@@ -624,6 +707,7 @@ int do_echo(struct st_query* q)
{ {
char* p=q->first_argument; char* p=q->first_argument;
VAR v; VAR v;
var_init(&v,0,0,0,0);
eval_expr(&v, p, 0); /* NULL terminated */ eval_expr(&v, p, 0); /* NULL terminated */
if (v.str_val_len) if (v.str_val_len)
{ {
...@@ -642,6 +726,11 @@ int do_sync_with_master(struct st_query* q) ...@@ -642,6 +726,11 @@ int do_sync_with_master(struct st_query* q)
char query_buf[FN_REFLEN+128]; char query_buf[FN_REFLEN+128];
int offset = 0; int offset = 0;
char* p = q->first_argument; char* p = q->first_argument;
int rpl_parse;
rpl_parse = mysql_rpl_parse_enabled(mysql);
mysql_disable_rpl_parse(mysql);
if(*p) if(*p)
offset = atoi(p); offset = atoi(p);
...@@ -658,7 +747,10 @@ int do_sync_with_master(struct st_query* q) ...@@ -658,7 +747,10 @@ int do_sync_with_master(struct st_query* q)
if(!row[0]) if(!row[0])
die("Error on slave while syncing with master"); die("Error on slave while syncing with master");
mysql_free_result(res); mysql_free_result(res);
if(rpl_parse)
mysql_enable_rpl_parse(mysql);
return 0; return 0;
} }
...@@ -667,6 +759,11 @@ int do_save_master_pos() ...@@ -667,6 +759,11 @@ 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;
int rpl_parse;
rpl_parse = mysql_rpl_parse_enabled(mysql);
mysql_disable_rpl_parse(mysql);
if(mysql_query(mysql, "show master status")) if(mysql_query(mysql, "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));
...@@ -678,6 +775,9 @@ int do_save_master_pos() ...@@ -678,6 +775,9 @@ int do_save_master_pos()
strncpy(master_pos.file, row[0], sizeof(master_pos.file)); strncpy(master_pos.file, row[0], sizeof(master_pos.file));
master_pos.pos = strtoul(row[1], (char**) 0, 10); master_pos.pos = strtoul(row[1], (char**) 0, 10);
mysql_free_result(res); mysql_free_result(res);
if(rpl_parse)
mysql_enable_rpl_parse(mysql);
return 0; return 0;
} }
...@@ -697,11 +797,29 @@ int do_let(struct st_query* q) ...@@ -697,11 +797,29 @@ int do_let(struct st_query* q)
while(*p && isspace(*p)) while(*p && isspace(*p))
p++; p++;
var_val_start = p; var_val_start = p;
while(*p && !isspace(*p)) return var_set(var_name, var_name_end, var_val_start, q->end);
p++; }
return var_set(var_name, var_name_end, var_val_start, p);
int do_rpl_probe(struct st_query* __attribute__((unused)) q)
{
if(mysql_rpl_probe(&cur_con->mysql))
die("Failed in mysql_rpl_probe(): %s", mysql_error(&cur_con->mysql));
return 0;
}
int do_enable_rpl_parse(struct st_query* __attribute__((unused)) q)
{
mysql_enable_rpl_parse(&cur_con->mysql);
return 0;
} }
int do_disable_rpl_parse(struct st_query* __attribute__((unused)) q)
{
mysql_disable_rpl_parse(&cur_con->mysql);
return 0;
}
int do_sleep(struct st_query* q) int do_sleep(struct st_query* q)
{ {
char* p=q->first_argument; char* p=q->first_argument;
...@@ -1015,7 +1133,8 @@ int do_connect(struct st_query* q) ...@@ -1015,7 +1133,8 @@ int do_connect(struct st_query* q)
if (!mysql_init(&next_con->mysql)) if (!mysql_init(&next_con->mysql))
die("Failed on mysql_init()"); die("Failed on mysql_init()");
con_sock=fn_format(buff, con_sock, TMPDIR, "",0); if (con_sock)
con_sock=fn_format(buff, con_sock, TMPDIR, "",0);
if (!con_db[0]) if (!con_db[0])
con_db=db; con_db=db;
con_error = 1; con_error = 1;
...@@ -1047,13 +1166,14 @@ int do_done(struct st_query* q) ...@@ -1047,13 +1166,14 @@ int do_done(struct st_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)
block_ok = 1;
++parser.current_line; ++parser.current_line;
--cur_block;
} }
return 0; return 0;
} }
...@@ -1063,13 +1183,17 @@ int do_while(struct st_query* q) ...@@ -1063,13 +1183,17 @@ int do_while(struct st_query* q)
char* p=q->first_argument; char* p=q->first_argument;
const char* expr_start, *expr_end; const char* expr_start, *expr_end;
VAR v; VAR v;
var_init(&v,0,0,0,0);
if (cur_block == block_stack_end) if (cur_block == block_stack_end)
die("Nesting too deeply"); die("Nesting too deeply");
if (!block_ok) if (!*block_ok)
{ {
++false_block_depth; ++false_block_depth;
*++block_ok = 0;
*cur_block++ = parser.current_line++;
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");
...@@ -1080,9 +1204,11 @@ int do_while(struct st_query* q) ...@@ -1080,9 +1204,11 @@ int do_while(struct st_query* q)
*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++;
} }
else
*++block_ok = 1;
return 0; return 0;
} }
...@@ -1346,7 +1472,7 @@ int read_query(struct st_query** q_ptr) ...@@ -1346,7 +1472,7 @@ int read_query(struct st_query** q_ptr)
q->first_word_len = (uint) (p - q->query); q->first_word_len = (uint) (p - q->query);
while (*p && isspace(*p)) p++; while (*p && isspace(*p)) p++;
q->first_argument=p; q->first_argument=p;
q->end = strend(q->query);
parser.read_lines++; parser.read_lines++;
return 0; return 0;
} }
...@@ -1356,6 +1482,7 @@ struct option long_options[] = ...@@ -1356,6 +1482,7 @@ struct option long_options[] =
{ {
{"debug", optional_argument, 0, '#'}, {"debug", optional_argument, 0, '#'},
{"database", required_argument, 0, 'D'}, {"database", required_argument, 0, 'D'},
{"big-test", no_argument, 0, 'B'},
{"help", no_argument, 0, '?'}, {"help", no_argument, 0, '?'},
{"host", required_argument, 0, 'h'}, {"host", required_argument, 0, 'h'},
{"password", optional_argument, 0, 'p'}, {"password", optional_argument, 0, 'p'},
...@@ -1366,6 +1493,7 @@ struct option long_options[] = ...@@ -1366,6 +1493,7 @@ struct option long_options[] =
{"silent", no_argument, 0, 'q'}, {"silent", no_argument, 0, 'q'},
{"sleep", required_argument, 0, 'T'}, {"sleep", required_argument, 0, 'T'},
{"socket", required_argument, 0, 'S'}, {"socket", required_argument, 0, 'S'},
{"test-file", required_argument, 0, 'x'},
{"tmpdir", required_argument, 0, 't'}, {"tmpdir", required_argument, 0, 't'},
{"user", required_argument, 0, 'u'}, {"user", required_argument, 0, 'u'},
{"verbose", no_argument, 0, 'v'}, {"verbose", no_argument, 0, 'v'},
...@@ -1398,6 +1526,7 @@ void usage() ...@@ -1398,6 +1526,7 @@ void usage()
-u, --user=... User for login.\n\ -u, --user=... User for login.\n\
-p[password], --password[=...]\n\ -p[password], --password[=...]\n\
Password to use when connecting to server.\n\ Password to use when connecting to server.\n\
-B, --big-test Define BIG_TEST to 1\n\
-D, --database=... Database to use.\n\ -D, --database=... Database to use.\n\
-P, --port=... Port number to use for connection.\n\ -P, --port=... Port number to use for connection.\n\
-S, --socket=... Socket file to use for connection.\n\ -S, --socket=... Socket file to use for connection.\n\
...@@ -1405,6 +1534,7 @@ void usage() ...@@ -1405,6 +1534,7 @@ void usage()
-T, --sleep=# Sleep always this many seconds on sleep commands\n\ -T, --sleep=# Sleep always this many seconds on sleep commands\n\
-r, --record Record output of test_file into result file.\n\ -r, --record Record output of test_file into result file.\n\
-R, --result-file=... Read/Store result from/in this file.\n\ -R, --result-file=... Read/Store result from/in this file.\n\
-x, --test-file=... Read test from/in this file (default stdin).\n\
-v, --verbose Write more.\n\ -v, --verbose Write more.\n\
-q, --quiet, --silent Suppress all normal output.\n\ -q, --quiet, --silent Suppress all normal output.\n\
-V, --version Output version information and exit.\n\ -V, --version Output version information and exit.\n\
...@@ -1419,7 +1549,7 @@ int parse_args(int argc, char **argv) ...@@ -1419,7 +1549,7 @@ int parse_args(int argc, char **argv)
load_defaults("my",load_default_groups,&argc,&argv); load_defaults("my",load_default_groups,&argc,&argv);
default_argv= argv; default_argv= argv;
while((c = getopt_long(argc, argv, "h:p::u:P:D:S:R:t:T:#:?rvVq", while((c = getopt_long(argc, argv, "h:p::u:BP:D:S:R:x:t:T:#:?rvVq",
long_options, &option_index)) != EOF) long_options, &option_index)) != EOF)
{ {
switch(c) { switch(c) {
...@@ -1438,6 +1568,10 @@ int parse_args(int argc, char **argv) ...@@ -1438,6 +1568,10 @@ int parse_args(int argc, char **argv)
case 'R': case 'R':
result_file = optarg; result_file = optarg;
break; break;
case 'x':
if (!(*cur_file = my_fopen(optarg, O_RDONLY, MYF(MY_WME))))
die("Could not open %s: errno = %d", optarg, errno);
break;
case 'p': case 'p':
if (optarg) if (optarg)
{ {
...@@ -1448,6 +1582,9 @@ int parse_args(int argc, char **argv) ...@@ -1448,6 +1582,9 @@ int parse_args(int argc, char **argv)
else else
tty_password=1; tty_password=1;
break; break;
case 'B':
opt_big_test=1;
break;
case 'P': case 'P':
port = atoi(optarg); port = atoi(optarg);
break; break;
...@@ -1522,10 +1659,12 @@ void reject_dump(const char* record_file, char* buf, int size) ...@@ -1522,10 +1659,12 @@ void reject_dump(const char* record_file, char* buf, int size)
str_to_file(fn_format(reject_file, record_file,"",".reject",2), buf, size); str_to_file(fn_format(reject_file, record_file,"",".reject",2), buf, size);
} }
/* 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
* the result will be read - for regular query, both bits must be on * the result will be read - for regular query, both bits must be on
*/ */
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;
...@@ -1568,7 +1707,8 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) ...@@ -1568,7 +1707,8 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
if(!(flags & QUERY_REAP)) if(!(flags & QUERY_REAP))
return 0; return 0;
if (mysql_read_query_result(mysql)) if (mysql_read_query_result(mysql) ||
(!(res = mysql_store_result(mysql)) && mysql_field_count(mysql)))
{ {
if (q->require_file) if (q->require_file)
abort_not_supported_test(); abort_not_supported_test();
...@@ -1584,17 +1724,25 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) ...@@ -1584,17 +1724,25 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
} }
if (i) if (i)
{ {
verbose_msg("query '%s' failed with wrong errno\ verbose_msg("query '%s' failed with wrong errno %d instead of %d...",
%d instead of %d...", q->query, mysql_errno(mysql), q->expected_errno[0]); q->query, mysql_errno(mysql), q->expected_errno[0]);
error=1;
goto end; goto end;
} }
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));
/* if we do not abort on error, failure to run the query does /*
if we do not abort on error, failure to run the query does
not fail the whole test case not fail the whole test case
*/ */
goto end; goto end;
} }
/*{
verbose_msg("failed in mysql_store_result for query '%s' (%d)", query,
mysql_errno(mysql));
error = 1;
goto end;
}*/
} }
if (q->expected_errno[0]) if (q->expected_errno[0])
...@@ -1605,23 +1753,6 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags) ...@@ -1605,23 +1753,6 @@ int run_query(MYSQL* mysql, struct st_query* q, int flags)
goto end; goto end;
} }
if (!(res = mysql_store_result(mysql)) && mysql_field_count(mysql))
{
if (q->require_file)
abort_not_supported_test();
if (q->abort_on_error)
die("At line %u: Failed in mysql_store_result for query '%s' (%d)",
start_lineno, query, mysql_errno(mysql));
else
{
verbose_msg("failed in mysql_store_result for query '%s' (%d)", query,
mysql_errno(mysql));
error = 1;
goto end;
}
}
if (!res) goto end; if (!res) goto end;
fields = mysql_fetch_fields(res); fields = mysql_fetch_fields(res);
...@@ -1718,33 +1849,39 @@ static byte* get_var_key(const byte* var, uint* len, ...@@ -1718,33 +1849,39 @@ static byte* get_var_key(const byte* var, uint* len,
return (byte*)key; return (byte*)key;
} }
static VAR* var_init(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) if(!name_len && name)
name_len = strlen(name); name_len = strlen(name);
if(!val_len) if(!val_len && val)
val_len = strlen(val) ; val_len = strlen(val) ;
val_alloc_len = val_len + 16; /* room to grow */ val_alloc_len = val_len + 16; /* room to grow */
if(!(tmp_var = (VAR*)my_malloc(sizeof(*tmp_var) + val_alloc_len if(!(tmp_var=v) && !(tmp_var = (VAR*)my_malloc(sizeof(*tmp_var)
+ name_len, MYF(MY_WME)))) + name_len, MYF(MY_WME))))
die("Out of memory"); die("Out of memory");
tmp_var->name = (char*)tmp_var + sizeof(*tmp_var);
tmp_var->str_val = tmp_var->name + name_len; tmp_var->name = (name) ? (char*)tmp_var + sizeof(*tmp_var) : 0;
if(!(tmp_var->str_val = my_malloc(val_alloc_len, MYF(MY_WME))))
die("Out of memory");
memcpy(tmp_var->name, name, name_len); memcpy(tmp_var->name, name, name_len);
memcpy(tmp_var->str_val, val, val_len + 1); if(val)
memcpy(tmp_var->str_val, val, val_len + 1);
tmp_var->name_len = name_len; tmp_var->name_len = name_len;
tmp_var->str_val_len = val_len; tmp_var->str_val_len = val_len;
tmp_var->alloced_len = val_alloc_len; tmp_var->alloced_len = val_alloc_len;
tmp_var->int_val = atoi(val); tmp_var->int_val = (val) ? atoi(val) : 0;
tmp_var->int_dirty = 0; tmp_var->int_dirty = 0;
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(v, MYF(MY_WME)); my_free(v, MYF(MY_WME));
} }
...@@ -1756,17 +1893,19 @@ static void var_from_env(const char* name, const char* def_val) ...@@ -1756,17 +1893,19 @@ static void var_from_env(const char* name, const char* def_val)
if(!(tmp = getenv(name))) if(!(tmp = getenv(name)))
tmp = def_val; tmp = def_val;
v = var_init(name, 0, tmp, 0); v = var_init(0, name, 0, tmp, 0);
hash_insert(&var_hash, (byte*)v); hash_insert(&var_hash, (byte*)v);
} }
static void init_var_hash() static void 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", ""); var_from_env("MYSQL_TEST_DIR", "/tmp");
var_from_env("BIG_TEST", opt_big_test ? "1" : "0");
} }
int main(int argc, char** argv) int main(int argc, char** argv)
...@@ -1793,7 +1932,11 @@ int main(int argc, char** argv) ...@@ -1793,7 +1932,11 @@ int main(int argc, char** argv)
INIT_Q_LINES); INIT_Q_LINES);
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));
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 = 1;
init_dynamic_string(&ds_res, "", 0, 65536); init_dynamic_string(&ds_res, "", 0, 65536);
parse_args(argc, argv); parse_args(argc, argv);
init_var_hash(); init_var_hash();
...@@ -1817,7 +1960,7 @@ int main(int argc, char** argv) ...@@ -1817,7 +1960,7 @@ int main(int argc, char** argv)
int current_line_inc = 1, processed = 0; int current_line_inc = 1, processed = 0;
if (q->type == Q_UNKNOWN || q->type == Q_COMMENT_WITH_COMMAND) if (q->type == Q_UNKNOWN || q->type == Q_COMMENT_WITH_COMMAND)
get_query_type(q); get_query_type(q);
if (block_ok) if (*block_ok)
{ {
processed = 1; processed = 1;
switch (q->type) { switch (q->type) {
...@@ -1826,6 +1969,9 @@ int main(int argc, char** argv) ...@@ -1826,6 +1969,9 @@ int main(int argc, char** argv)
case Q_DISCONNECT: case Q_DISCONNECT:
case Q_DIRTY_CLOSE: case Q_DIRTY_CLOSE:
close_connection(q); break; close_connection(q); break;
case Q_RPL_PROBE: do_rpl_probe(q); break;
case Q_ENABLE_RPL_PARSE: do_enable_rpl_parse(q); break;
case Q_DISABLE_RPL_PARSE: do_disable_rpl_parse(q); break;
case Q_SOURCE: do_source(q); break; case Q_SOURCE: do_source(q); break;
case Q_SLEEP: do_sleep(q); break; case Q_SLEEP: do_sleep(q); break;
case Q_INC: do_inc(q); break; case Q_INC: do_inc(q); break;
...@@ -1833,6 +1979,7 @@ int main(int argc, char** argv) ...@@ -1833,6 +1979,7 @@ int main(int argc, char** argv)
case Q_ECHO: do_echo(q); break; case Q_ECHO: do_echo(q); break;
case Q_SYSTEM: do_system(q); break; case Q_SYSTEM: do_system(q); break;
case Q_LET: do_let(q); break; case Q_LET: do_let(q); break;
case Q_EVAL_RESULT: eval_result = 1; break;
case Q_EVAL: case Q_EVAL:
if (q->query == q->query_buf) if (q->query == q->query_buf)
q->query += q->first_word_len; q->query += q->first_word_len;
...@@ -1893,7 +2040,7 @@ int main(int argc, char** argv) ...@@ -1893,7 +2040,7 @@ int main(int argc, char** argv)
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_COMMENT: /* Ignore row */ case Q_COMMENT: /* Ignore row */
case Q_COMMENT_WITH_COMMAND: case Q_COMMENT_WITH_COMMAND:
case Q_PING: case Q_PING:
(void) mysql_ping(&cur_con->mysql); (void) mysql_ping(&cur_con->mysql);
break; break;
......
...@@ -287,7 +287,6 @@ inline double ulonglong2double(ulonglong value) ...@@ -287,7 +287,6 @@ inline double ulonglong2double(ulonglong value)
#define FN_ROOTDIR "\\" #define FN_ROOTDIR "\\"
#define FN_NETWORK_DRIVES /* Uses \\ to indicate network drives */ #define FN_NETWORK_DRIVES /* Uses \\ to indicate network drives */
#define FN_NO_CASE_SENCE /* Files are not case-sensitive */ #define FN_NO_CASE_SENCE /* Files are not case-sensitive */
#define FN_LOWER_CASE TRUE /* Files are represented in lower case */
#define MY_NFILE 1024 #define MY_NFILE 1024
#define DO_NOT_REMOVE_THREAD_WRAPPERS #define DO_NOT_REMOVE_THREAD_WRAPPERS
......
...@@ -11,7 +11,9 @@ Created 1/20/1994 Heikki Tuuri ...@@ -11,7 +11,9 @@ Created 1/20/1994 Heikki Tuuri
#include "univ.i" #include "univ.i"
#include <time.h> #include <time.h>
#ifndef MYSQL_SERVER
#include <ctype.h> #include <ctype.h>
#endif
typedef time_t ib_time_t; typedef time_t ib_time_t;
......
...@@ -73,7 +73,7 @@ int _mi_read_cache(IO_CACHE *info, byte *buff, my_off_t pos, uint length, ...@@ -73,7 +73,7 @@ int _mi_read_cache(IO_CACHE *info, byte *buff, my_off_t pos, uint length,
if (!(flag & READING_HEADER) || info->error == -1 || if (!(flag & READING_HEADER) || info->error == -1 ||
(uint) info->error+in_buff_length < 3) (uint) info->error+in_buff_length < 3)
{ {
if (!my_errno) if (!my_errno || my_errno == -1)
my_errno=HA_ERR_WRONG_IN_RECORD; my_errno=HA_ERR_WRONG_IN_RECORD;
DBUG_RETURN(1); DBUG_RETURN(1);
} }
...@@ -87,7 +87,7 @@ int _mi_read_cache(IO_CACHE *info, byte *buff, my_off_t pos, uint length, ...@@ -87,7 +87,7 @@ int _mi_read_cache(IO_CACHE *info, byte *buff, my_off_t pos, uint length,
if (!(flag & READING_HEADER) || (int) read_length == -1 || if (!(flag & READING_HEADER) || (int) read_length == -1 ||
read_length+in_buff_length < 3) read_length+in_buff_length < 3)
{ {
if (!my_errno) if (!my_errno || my_errno == -1)
my_errno=HA_ERR_WRONG_IN_RECORD; my_errno=HA_ERR_WRONG_IN_RECORD;
DBUG_RETURN(1); DBUG_RETURN(1);
} }
......
...@@ -708,7 +708,7 @@ int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend) ...@@ -708,7 +708,7 @@ int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend)
puts("- check record links"); puts("- check record links");
} }
if (!(record= (byte*) my_alloca(info->s->base.pack_reclength))) if (!(record= (byte*) my_malloc(info->s->base.pack_reclength,MYF(0))))
{ {
mi_check_print_error(param,"Not Enough memory"); mi_check_print_error(param,"Not Enough memory");
DBUG_RETURN(-1); DBUG_RETURN(-1);
...@@ -924,8 +924,9 @@ int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend) ...@@ -924,8 +924,9 @@ int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend)
if (block_info.rec_len < (uint) info->s->min_pack_length || if (block_info.rec_len < (uint) info->s->min_pack_length ||
block_info.rec_len > (uint) info->s->max_pack_length) block_info.rec_len > (uint) info->s->max_pack_length)
{ {
mi_check_print_error(param,"Found block with wrong recordlength: %d at %s", mi_check_print_error(param,
block_info.rec_len, llstr(start_recpos,llbuff)); "Found block with wrong recordlength: %d at %s",
block_info.rec_len, llstr(start_recpos,llbuff));
got_error=1; got_error=1;
break; break;
} }
...@@ -934,7 +935,8 @@ int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend) ...@@ -934,7 +935,8 @@ int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend)
goto err; goto err;
if (_mi_pack_rec_unpack(info,record,info->rec_buff,block_info.rec_len)) if (_mi_pack_rec_unpack(info,record,info->rec_buff,block_info.rec_len))
{ {
mi_check_print_error(param,"Found wrong record at %s", llstr(start_recpos,llbuff)); mi_check_print_error(param,"Found wrong record at %s",
llstr(start_recpos,llbuff));
got_error=1; got_error=1;
} }
if (static_row_size) if (static_row_size)
...@@ -1082,12 +1084,12 @@ int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend) ...@@ -1082,12 +1084,12 @@ int chk_data_link(MI_CHECK *param, MI_INFO *info,int extend)
printf("Lost space: %12s Linkdata: %10s\n", printf("Lost space: %12s Linkdata: %10s\n",
llstr(empty,llbuff),llstr(link_used,llbuff2)); llstr(empty,llbuff),llstr(link_used,llbuff2));
} }
my_afree((gptr) record); my_free((gptr) record,MYF(0));
DBUG_RETURN (error); DBUG_RETURN (error);
err: err:
mi_check_print_error(param,"got error: %d when reading datafile",my_errno); mi_check_print_error(param,"got error: %d when reading datafile at record: %s",my_errno, llstr(records,llbuff));
err2: err2:
my_afree((gptr) record); my_free((gptr) record,MYF(0));
param->retry_without_quick=1; param->retry_without_quick=1;
DBUG_RETURN(1); DBUG_RETURN(1);
} /* chk_data_link */ } /* chk_data_link */
...@@ -1188,7 +1190,7 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info, ...@@ -1188,7 +1190,7 @@ int mi_repair(MI_CHECK *param, register MI_INFO *info,
del=info->state->del; del=info->state->del;
info->state->records=info->state->del=share->state.split=0; info->state->records=info->state->del=share->state.split=0;
info->state->empty=0; info->state->empty=0;
if (sort_info->new_data_file_type != COMPRESSED_RECORD && !rep_quick) if (!rep_quick)
share->state.checksum=0; share->state.checksum=0;
info->update= (short) (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); info->update= (short) (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
for (i=0 ; i < info->s->base.keys ; i++) for (i=0 ; i < info->s->base.keys ; i++)
...@@ -1866,8 +1868,7 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info, ...@@ -1866,8 +1868,7 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
sort_param.sort_info=sort_info; sort_param.sort_info=sort_info;
del=info->state->del; del=info->state->del;
if (sort_info->new_data_file_type != COMPRESSED_RECORD && if (! rep_quick)
! rep_quick)
share->state.checksum=0; share->state.checksum=0;
rec_per_key_part= param->rec_per_key_part; rec_per_key_part= param->rec_per_key_part;
...@@ -2414,6 +2415,7 @@ static int sort_get_next_record(SORT_INFO *sort_info) ...@@ -2414,6 +2415,7 @@ static int sort_get_next_record(SORT_INFO *sort_info)
llstr(sort_info->pos,llbuff)); llstr(sort_info->pos,llbuff));
continue; continue;
} }
info->checksum=mi_checksum(info,sort_info->record);
if (!sort_info->fix_datafile) if (!sort_info->fix_datafile)
sort_info->filepos=sort_info->pos; sort_info->filepos=sort_info->pos;
sort_info->max_pos=(sort_info->pos=block_info.filepos+ sort_info->max_pos=(sort_info->pos=block_info.filepos+
...@@ -2492,6 +2494,7 @@ int sort_write_record(SORT_INFO *sort_info) ...@@ -2492,6 +2494,7 @@ int sort_write_record(SORT_INFO *sort_info)
DBUG_RETURN(1); DBUG_RETURN(1);
} }
sort_info->filepos+=block_length; sort_info->filepos+=block_length;
info->s->state.checksum+=info->checksum;
break; break;
case COMPRESSED_RECORD: case COMPRESSED_RECORD:
reclength=info->packed_length; reclength=info->packed_length;
...@@ -2504,6 +2507,7 @@ int sort_write_record(SORT_INFO *sort_info) ...@@ -2504,6 +2507,7 @@ int sort_write_record(SORT_INFO *sort_info)
mi_check_print_error(param,"%d when writing to datafile",my_errno); mi_check_print_error(param,"%d when writing to datafile",my_errno);
DBUG_RETURN(1); DBUG_RETURN(1);
} }
info->s->state.checksum+=info->checksum;
sort_info->filepos+=reclength+length; sort_info->filepos+=reclength+length;
break; break;
} }
......
...@@ -962,7 +962,7 @@ int _mi_read_rnd_pack_record(MI_INFO *info, byte *buf, ...@@ -962,7 +962,7 @@ int _mi_read_rnd_pack_record(MI_INFO *info, byte *buf,
b_type=_mi_pack_get_block_info(info,&block_info,info->dfile,filepos, b_type=_mi_pack_get_block_info(info,&block_info,info->dfile,filepos,
info->rec_buff); info->rec_buff);
if (b_type) if (b_type)
goto err; goto err; /* Error code is already set */
#ifndef DBUG_OFF #ifndef DBUG_OFF
if (block_info.rec_len > share->max_pack_length) if (block_info.rec_len > share->max_pack_length)
{ {
......
...@@ -201,7 +201,7 @@ static struct option long_options[] = ...@@ -201,7 +201,7 @@ static struct option long_options[] =
static void print_version(void) static void print_version(void)
{ {
printf("%s Ver 1.49 for %s at %s\n",my_progname,SYSTEM_TYPE, printf("%s Ver 1.50 for %s at %s\n",my_progname,SYSTEM_TYPE,
MACHINE_TYPE); MACHINE_TYPE);
} }
...@@ -953,7 +953,7 @@ static void descript(MI_CHECK *param, register MI_INFO *info, my_string name) ...@@ -953,7 +953,7 @@ static void descript(MI_CHECK *param, register MI_INFO *info, my_string name)
share->base.raid_chunks, share->base.raid_chunks,
share->base.raid_chunksize); share->base.raid_chunksize);
} }
if (share->options & HA_OPTION_CHECKSUM) if (share->options & (HA_OPTION_CHECKSUM | HA_OPTION_COMPRESS_RECORD))
printf("Checksum: %23s\n",llstr(info->s->state.checksum,llbuff)); printf("Checksum: %23s\n",llstr(info->s->state.checksum,llbuff));
; ;
if (share->options & HA_OPTION_DELAY_KEY_WRITE) if (share->options & HA_OPTION_DELAY_KEY_WRITE)
......
...@@ -693,7 +693,7 @@ drop table t1; ...@@ -693,7 +693,7 @@ drop table t1;
create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(30),primary key (id,id2),index index_id3 (id3)) type=bdb; create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(30),primary key (id,id2),index index_id3 (id3)) type=bdb;
insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL'); insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL');
LOCK TABLES t1 WRITE; LOCK TABLES t1 WRITE;
--error 690 --error 1062
insert into t1 values (99,1,2,'D'),(1,1,2,'D'); insert into t1 values (99,1,2,'D'),(1,1,2,'D');
select id from t1; select id from t1;
select id from t1; select id from t1;
...@@ -704,7 +704,7 @@ create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(3 ...@@ -704,7 +704,7 @@ create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(3
insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL'); insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL');
LOCK TABLES t1 WRITE; LOCK TABLES t1 WRITE;
begin; begin;
--error 690 --error 1062
insert into t1 values (99,1,2,'D'),(1,1,2,'D'); insert into t1 values (99,1,2,'D'),(1,1,2,'D');
select id from t1; select id from t1;
insert ignore into t1 values (100,1,2,'D'),(1,1,99,'D'); insert ignore into t1 values (100,1,2,'D'),(1,1,99,'D');
......
...@@ -10,7 +10,8 @@ create table t1 (a int); ...@@ -10,7 +10,8 @@ create table t1 (a int);
!$1054 select count(test.t1.b) from t1; !$1054 select count(test.t1.b) from t1;
!$1109 select count(not_existing_database.t1) from t1; !$1109 select count(not_existing_database.t1) from t1;
!$1109 select count(not_existing_database.t1.a) from t1; !$1109 select count(not_existing_database.t1.a) from t1;
!$1044 select count(not_existing_database.t1.a) from not_existing_database.t1; --error 1044,1146
select count(not_existing_database.t1.a) from not_existing_database.t1;
!$1054 select 1 from t1 order by 2; !$1054 select 1 from t1 order by 2;
!$1054 select 1 from t1 group by 2; !$1054 select 1 from t1 group by 2;
!$1054 select 1 from t1 order by t1.b; !$1054 select 1 from t1 order by t1.b;
......
...@@ -73,11 +73,15 @@ CREATE TABLE t3 ( ...@@ -73,11 +73,15 @@ CREATE TABLE t3 (
); );
--error 1210 --error 1210
select * from t2 having MATCH inhalt AGAINST (t1.id); select * from t2 where MATCH inhalt AGAINST (t2.inhalt);
--error 1210 --error 1210
select * from t2 having MATCH ticket AGAINST ('foobar'); select * from t2 where MATCH inhalt AGAINST (t2.inhalt);
--error 1191
select * from t2 where MATCH ticket AGAINST ('foobar');
--error 1210 --error 1210
select * from t2,t3 having MATCH (t2.inhalt,t3.inhalt) AGAINST ('foobar'); select * from t2,t3 where MATCH (t2.inhalt,t3.inhalt) AGAINST ('foobar');
drop table t1,t2,t3; drop table t1,t2,t3;
...@@ -414,8 +414,8 @@ drop table t1; ...@@ -414,8 +414,8 @@ drop table t1;
# #
CREATE TABLE t1 (a int unsigned NOT NULL) type=innodb; CREATE TABLE t1 (a int unsigned NOT NULL) type=innodb;
--error 1031 # Can't test this in 3.23
INSERT DELAYED INTO t1 VALUES (1); # INSERT DELAYED INTO t1 VALUES (1);
INSERT INTO t1 VALUES (1); INSERT INTO t1 VALUES (1);
SELECT * FROM t1; SELECT * FROM t1;
DROP TABLE t1; DROP TABLE t1;
...@@ -437,7 +437,7 @@ drop table t1; ...@@ -437,7 +437,7 @@ drop table t1;
create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(30),primary key (id,id2),index index_id3 (id3)) type=innodb; create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(30),primary key (id,id2),index index_id3 (id3)) type=innodb;
insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL'); insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL');
LOCK TABLES t1 WRITE; LOCK TABLES t1 WRITE;
--error 690 --error 1062
insert into t1 values (99,1,2,'D'),(1,1,2,'D'); insert into t1 values (99,1,2,'D'),(1,1,2,'D');
select id from t1; select id from t1;
select id from t1; select id from t1;
...@@ -448,7 +448,7 @@ create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(3 ...@@ -448,7 +448,7 @@ create table t1 (id int NOT NULL,id2 int NOT NULL,id3 int NOT NULL,dummy1 char(3
insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL'); insert into t1 values (0,0,0,'ABCDEFGHIJ'),(2,2,2,'BCDEFGHIJK'),(1,1,1,'CDEFGHIJKL');
LOCK TABLES t1 WRITE; LOCK TABLES t1 WRITE;
begin; begin;
--error 690 --error 1062
insert into t1 values (99,1,2,'D'),(1,1,2,'D'); insert into t1 values (99,1,2,'D'),(1,1,2,'D');
select id from t1; select id from t1;
insert ignore into t1 values (100,1,2,'D'),(1,1,99,'D'); insert ignore into t1 values (100,1,2,'D'),(1,1,99,'D');
......
connect (con1,localhost,boo,,); connect (con1,localhost,boo,,);
connection con1; connection con1;
-- error 1064; -- error 1064,1102
drop database AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; drop database AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;
...@@ -955,7 +955,7 @@ int ha_gemini::handleIndexEntry(const byte * record, dsmRecid_t recid, ...@@ -955,7 +955,7 @@ int ha_gemini::handleIndexEntry(const byte * record, dsmRecid_t recid,
thd = current_thd; thd = current_thd;
key_info=table->key_info+keynr; key_info=table->key_info+keynr;
thereIsAnull = false; thereIsAnull = FALSE;
rc = createKeyString(record, key_info, theKey.akey.keystr, rc = createKeyString(record, key_info, theKey.akey.keystr,
sizeof(theKey.apad),&keyStringLen, sizeof(theKey.apad),&keyStringLen,
(short)pindexNumbers[keynr], (short)pindexNumbers[keynr],
...@@ -1067,7 +1067,7 @@ int ha_gemini::createKeyString(const byte * record, KEY *pkeyinfo, ...@@ -1067,7 +1067,7 @@ int ha_gemini::createKeyString(const byte * record, KEY *pkeyinfo,
isNull = record[key_part->null_offset] & key_part->null_bit; isNull = record[key_part->null_offset] & key_part->null_bit;
if(isNull) if(isNull)
*thereIsAnull = true; *thereIsAnull = TRUE;
rc = gemFieldToIdxComponent(pos, rc = gemFieldToIdxComponent(pos,
(unsigned long) key_part_length, (unsigned long) key_part_length,
...@@ -1107,7 +1107,7 @@ int ha_gemini::update_row(const byte * old_record, byte * new_record) ...@@ -1107,7 +1107,7 @@ int ha_gemini::update_row(const byte * old_record, byte * new_record)
} }
for (uint keynr=0 ; keynr < table->keys ; keynr++) for (uint keynr=0 ; keynr < table->keys ; keynr++)
{ {
if(key_cmp(keynr,old_record, new_record,false)) if(key_cmp(keynr,old_record, new_record,FALSE))
{ {
error = handleIndexEntry(old_record,lastRowid,KEY_DELETE,keynr); error = handleIndexEntry(old_record,lastRowid,KEY_DELETE,keynr);
if(error) if(error)
...@@ -2430,8 +2430,8 @@ int ha_gemini::analyze(THD* thd, HA_CHECK_OPT* check_opt) ...@@ -2430,8 +2430,8 @@ int ha_gemini::analyze(THD* thd, HA_CHECK_OPT* check_opt)
uint saveIsolation; uint saveIsolation;
dsmMask_t saveLockMode; dsmMask_t saveLockMode;
check_opt->quick = true; check_opt->quick = TRUE;
check_opt->optimize = true; // Tells check not to get table lock check_opt->optimize = TRUE; // Tells check not to get table lock
saveLockMode = lockMode; saveLockMode = lockMode;
saveIsolation = thd->gemini.tx_isolation; saveIsolation = thd->gemini.tx_isolation;
thd->gemini.tx_isolation = ISO_READ_UNCOMMITTED; thd->gemini.tx_isolation = ISO_READ_UNCOMMITTED;
...@@ -2503,7 +2503,7 @@ int ha_gemini::check(THD* thd, HA_CHECK_OPT* check_opt) ...@@ -2503,7 +2503,7 @@ int ha_gemini::check(THD* thd, HA_CHECK_OPT* check_opt)
error = fetch_row(thd->gemini.context,buf); error = fetch_row(thd->gemini.context,buf);
if(!error) if(!error)
{ {
if(key_cmp(i,buf,indexBuf,false)) if(key_cmp(i,buf,indexBuf,FALSE))
{ {
gemini_msg((dsmContext_t *)thd->gemini.context, gemini_msg((dsmContext_t *)thd->gemini.context,
...@@ -2534,7 +2534,7 @@ int ha_gemini::check(THD* thd, HA_CHECK_OPT* check_opt) ...@@ -2534,7 +2534,7 @@ int ha_gemini::check(THD* thd, HA_CHECK_OPT* check_opt)
} }
} }
key_cmp(i,indexBuf,prevBuf,true); key_cmp(i,indexBuf,prevBuf,TRUE);
bcopy((void *)indexBuf,(void *)prevBuf,table->rec_buff_length); bcopy((void *)indexBuf,(void *)prevBuf,table->rec_buff_length);
if(!error) if(!error)
......
...@@ -177,19 +177,19 @@ ...@@ -177,19 +177,19 @@
"Can't write, because of unique constraint, to table '%-.64s'", "Can't write, because of unique constraint, to table '%-.64s'",
"BLOB column '%-.64s' used in key specification without a key length", "BLOB column '%-.64s' used in key specification without a key length",
"All parts of a PRIMARY KEY must be NOT NULL; If you need NULL in a key, use UNIQUE instead", "All parts of a PRIMARY KEY must be NOT NULL; If you need NULL in a key, use UNIQUE instead",
"Result consisted of more than one row", "Tulemis on rohkem kui ks kirje",
"This table type requires a primary key", "This table type requires a primary key",
"Antud MySQL ei ole kompileeritud RAID-i toega", "Antud MySQL ei ole kompileeritud RAID-i toega",
"You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column", "You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column",
"Key '%-.64s' doesn't exist in table '%-.64s'", "Key '%-.64s' doesn't exist in table '%-.64s'",
"Can't open table", "Ei suuda tabelit avada",
"The handler for the table doesn't support check/repair", "See tabelitp ei toeta kske CHECK/REPAIR",
"You are not allowed to execute this command in a transaction", "Puudub igus selle transaktsiooniksu andmiseks",
"Got error %d during COMMIT", "Sain vea %d COMMIT ksu titmisel",
"Got error %d during ROLLBACK", "Sain vea %d ROLLBACK ksu titmisel",
"Got error %d during FLUSH_LOGS", "Sain vea %d FLUSH_LOGS ksu titmisel",
"Got error %d during CHECKPOINT", "Sain vea %d CHECKPOINT ksu titmisel",
"Aborted connection %ld to db: '%-.64s' user: '%-.32s' host: `%-.64s' (%-.64s)", "hendus %ld katkestatud andmebaas: '%-.64s' kasutaja: '%-.32s' masin: `%-.64s' (%-.64s)",
"The handler for the table does not support binary table dump", "The handler for the table does not support binary table dump",
"Binlog closed while trying to FLUSH MASTER", "Binlog closed while trying to FLUSH MASTER",
"Failed rebuilding the index of dumped table '%-.64s'", "Failed rebuilding the index of dumped table '%-.64s'",
...@@ -198,9 +198,9 @@ ...@@ -198,9 +198,9 @@
"Net error writing to master", "Net error writing to master",
"Can't find FULLTEXT index matching the column list", "Can't find FULLTEXT index matching the column list",
"Can't execute the given command because you have active locked tables or an active transaction", "Can't execute the given command because you have active locked tables or an active transaction",
"Unknown system variable '%-.64'", "Tundmatu ssteemne muutja '%-.64'",
"Table '%-.64s' is marked as crashed and should be repaired", "Tabel '%-.64s' on mrgitud vigaseks ja tuleb parandada",
"Table '%-.64s' is marked as crashed and last (automatic?) repair failed", "Tabel '%-.64s' on mrgitud vigaseks ja viimane (automaatne?) parandamiskatse ebannestus",
"Warning: Some non-transactional changed tables couldn't be rolled back", "Warning: Some non-transactional changed tables couldn't be rolled back",
"Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again', "Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage. Increase this mysqld variable and try again',
"This operation cannot be performed with a running slave, run SLAVE STOP first", "This operation cannot be performed with a running slave, run SLAVE STOP first",
......
...@@ -205,11 +205,11 @@ ...@@ -205,11 +205,11 @@
"Kunde inte initializera replications-strukturerna. Kontrollera privilegerna för 'master.info'", "Kunde inte initializera replications-strukturerna. Kontrollera privilegerna för 'master.info'",
"Kunde inte starta en tråd för replikering", "Kunde inte starta en tråd för replikering",
"Användare '%-.64s' har redan 'max_user_connections' aktiva inloggningar", "Användare '%-.64s' har redan 'max_user_connections' aktiva inloggningar",
"Du kan endast använda konstant-uttryck med SET", "Man kan endast använda konstant-uttryck med SET",
"Lock wait timeout exceeded", "Fick inte ett lås i tid",
"The total number of locks exceeds the lock table size", "Antal lås överskrider antalet reserverade lås",
"Update locks cannot be acquired during a READ UNCOMMITTED transaction", "Updaterings-lås kan inte göras när man använder READ UNCOMMITTED",
"DROP DATABASE not allowed while thread is holding global read lock", "DROP DATABASE är inte tillåtet när man har ett globalt läs-lås",
"CREATE DATABASE not allowed while thread is holding global read lock", "CREATE DATABASE är inte tillåtet när man har ett globalt läs-lås",
"Felaktiga argument till %s", "Felaktiga argument till %s",
"%-.32s@%-.64s is not allowed to create new users", "%-.32s@%-.64s har inte rättigheter att skapa nya användare",
...@@ -2667,7 +2667,7 @@ TABLE_LIST *add_table_to_list(Table_ident *table, LEX_STRING *alias, ...@@ -2667,7 +2667,7 @@ TABLE_LIST *add_table_to_list(Table_ident *table, LEX_STRING *alias,
DBUG_RETURN(0); DBUG_RETURN(0);
} }
#ifdef FN_LOWER_CASE #ifdef FN_NO_CASE_SENCE
if (!alias) /* Alias is case sensitive */ if (!alias) /* Alias is case sensitive */
if (!(alias_str=sql_strmake(alias_str,table->table.length))) if (!(alias_str=sql_strmake(alias_str,table->table.length)))
DBUG_RETURN(0); DBUG_RETURN(0);
......
...@@ -1125,7 +1125,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -1125,7 +1125,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
{ {
strmov(new_name_buff,new_name); strmov(new_name_buff,new_name);
fn_same(new_name_buff,table_name,3); fn_same(new_name_buff,table_name,3);
#ifdef FN_LOWER_CASE #ifdef FN_NO_CASE_SENCE
if (lower_case_table_names) if (lower_case_table_names)
casedn_str(new_name); casedn_str(new_name);
if ((lower_case_table_names && if ((lower_case_table_names &&
...@@ -1709,7 +1709,7 @@ copy_data_between_tables(TABLE *from,TABLE *to, ...@@ -1709,7 +1709,7 @@ copy_data_between_tables(TABLE *from,TABLE *to,
/* Turn off recovery logging since rollback of an /* Turn off recovery logging since rollback of an
alter table is to delete the new table so there alter table is to delete the new table so there
is no need to log the changes to it. */ is no need to log the changes to it. */
error = ha_recovery_logging(thd,false); error = ha_recovery_logging(thd,FALSE);
if (error) if (error)
{ {
error = 1; error = 1;
...@@ -1761,7 +1761,7 @@ copy_data_between_tables(TABLE *from,TABLE *to, ...@@ -1761,7 +1761,7 @@ copy_data_between_tables(TABLE *from,TABLE *to,
if (to->file->activate_all_index(thd)) if (to->file->activate_all_index(thd))
error=1; error=1;
tmp_error = ha_recovery_logging(thd,true); tmp_error = ha_recovery_logging(thd,TRUE);
/* /*
Ensure that the new table is saved properly to disk so that we Ensure that the new table is saved properly to disk so that we
can do a rename can do a rename
...@@ -1773,7 +1773,7 @@ copy_data_between_tables(TABLE *from,TABLE *to, ...@@ -1773,7 +1773,7 @@ copy_data_between_tables(TABLE *from,TABLE *to,
if (to->file->external_lock(thd,F_UNLCK)) if (to->file->external_lock(thd,F_UNLCK))
error=1; error=1;
err: err:
tmp_error = ha_recovery_logging(thd,true); tmp_error = ha_recovery_logging(thd,TRUE);
free_io_cache(from); free_io_cache(from);
*copied= found_count; *copied= found_count;
*deleted=delete_count; *deleted=delete_count;
......
...@@ -189,7 +189,10 @@ TEST_join(JOIN *join) ...@@ -189,7 +189,10 @@ TEST_join(JOIN *join)
void mysql_print_status(THD *thd) void mysql_print_status(THD *thd)
{ {
char current_dir[FN_REFLEN];
printf("\nStatus information:\n\n"); printf("\nStatus information:\n\n");
my_getwd(current_dir, sizeof(current_dir),MYF(0));
printf("Current dir: %s\n", current_dir);
if (thd) if (thd)
thd->proc_info="locks"; thd->proc_info="locks";
thr_print_locks(); // Write some debug info thr_print_locks(); // Write some debug info
......
...@@ -42,13 +42,13 @@ ...@@ -42,13 +42,13 @@
#include "my_sys.h" /* defines errno */ #include "my_sys.h" /* defines errno */
#include <errno.h> #include <errno.h>
#ifdef LONGLONG #ifdef USE_LONGLONG
#define UTYPE_MAX (~(ulonglong) 0) #define UTYPE_MAX (~(ulonglong) 0)
#define TYPE_MIN LONGLONG_MIN #define TYPE_MIN LONGLONG_MIN
#define TYPE_MAX LONGLONG_MAX #define TYPE_MAX LONGLONG_MAX
#define longtype longlong #define longtype longlong
#define ulongtype ulonglong #define ulongtype ulonglong
#ifdef UNSIGNED #ifdef USE_UNSIGNED
#define function ulongtype strtoull #define function ulongtype strtoull
#else #else
#define function longtype strtoll #define function longtype strtoll
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
#define TYPE_MAX LONG_MAX #define TYPE_MAX LONG_MAX
#define longtype long #define longtype long
#define ulongtype unsigned long #define ulongtype unsigned long
#ifdef UNSIGNED #ifdef USE_UNSIGNED
#define function ulongtype strtoul #define function ulongtype strtoul
#else #else
#define function longtype strtol #define function longtype strtol
...@@ -170,7 +170,7 @@ function (const char *nptr,char **endptr,int base) ...@@ -170,7 +170,7 @@ function (const char *nptr,char **endptr,int base)
if (endptr != NULL) if (endptr != NULL)
*endptr = (char *) s; *endptr = (char *) s;
#ifndef UNSIGNED #ifndef USE_UNSIGNED
/* Check for a value that is within the range of /* Check for a value that is within the range of
`unsigned long int', but outside the range of `long int'. */ `unsigned long int', but outside the range of `long int'. */
if (negative) if (negative)
...@@ -185,7 +185,7 @@ function (const char *nptr,char **endptr,int base) ...@@ -185,7 +185,7 @@ function (const char *nptr,char **endptr,int base)
if (overflow) if (overflow)
{ {
my_errno=ERANGE; my_errno=ERANGE;
#ifdef UNSIGNED #ifdef USE_UNSIGNED
return UTYPE_MAX; return UTYPE_MAX;
#else #else
return negative ? TYPE_MIN : TYPE_MAX; return negative ? TYPE_MIN : TYPE_MAX;
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#include <global.h> #include <global.h>
#include <m_string.h> #include <m_string.h>
#if !defined(HAVE_STRTOULL) && defined(HAVE_LONG_LONG) #if !defined(HAVE_STRTOLL) && defined(HAVE_LONG_LONG)
#define LONGLONG #define USE_LONGLONG
#include "strto.c" #include "strto.c"
#endif #endif
...@@ -19,6 +19,6 @@ ...@@ -19,6 +19,6 @@
#include <global.h> #include <global.h>
#if !defined(MSDOS) && !defined(HAVE_STRTOUL) #if !defined(MSDOS) && !defined(HAVE_STRTOUL)
#define UNSIGNED #define USE_UNSIGNED
#include "strto.c" #include "strto.c"
#endif #endif
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#include <global.h> #include <global.h>
#include <m_string.h> #include <m_string.h>
#if !defined(HAVE_STRTOULL) && defined(HAVE_LONG_LONG) #if !defined(HAVE_STRTOULL) && defined(HAVE_LONG_LONG)
#define UNSIGNED #define USE_UNSIGNED
#define LONGLONG #define USE_LONGLONG
#include "strto.c" #include "strto.c"
#endif #endif
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