Commit 98f9b507 authored by tsmith@quadxeon.mysql.com's avatar tsmith@quadxeon.mysql.com

Merge tsmith@bk-internal.mysql.com:/home/bk/mysql-4.1-runtime

into  quadxeon.mysql.com:/benchmarks/ext3/TOSAVE/tsmith/bk/maint/mrg0306/41
parents 14e1ed36 0f95450e
...@@ -1067,3 +1067,4 @@ vio/viotest-ssl ...@@ -1067,3 +1067,4 @@ vio/viotest-ssl
include/check_abi include/check_abi
include/mysql_h.ic include/mysql_h.ic
mysql-test/r/blackhole.log mysql-test/r/blackhole.log
mysql-test/lib/init_db.sql
/* Copyright (C) 2000 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/*
echo is a replacement for the "echo" command builtin to cmd.exe
on Windows, to get a Unix eqvivalent behaviour when running commands
like:
$> echo "hello" | mysql
The windows "echo" would have sent "hello" to mysql while
Unix echo will send hello without the enclosing hyphens
This is a very advanced high tech program so take care when
you change it and remember to valgrind it before production
use.
*/
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
for (i= 1; i < argc; i++)
{
fprintf(stdout, "%s", argv[i]);
if (i < argc - 1)
fprintf(stdout, " ");
}
fprintf(stdout, "\n");
return 0;
}
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
Holyfoot Holyfoot
*/ */
#define MTEST_VERSION "3.1" #define MTEST_VERSION "3.2"
#include <my_global.h> #include <my_global.h>
#include <mysql_embed.h> #include <mysql_embed.h>
...@@ -61,6 +61,11 @@ ...@@ -61,6 +61,11 @@
# endif # endif
#endif #endif
/* Use cygwin for --exec and --system before 5.0 */
#if MYSQL_VERSION_ID < 50000
#define USE_CYGWIN
#endif
#define MAX_VAR_NAME_LENGTH 256 #define MAX_VAR_NAME_LENGTH 256
#define MAX_COLUMNS 256 #define MAX_COLUMNS 256
#define MAX_EMBEDDED_SERVER_ARGS 64 #define MAX_EMBEDDED_SERVER_ARGS 64
...@@ -103,7 +108,7 @@ static my_bool disable_query_log= 0, disable_result_log= 0; ...@@ -103,7 +108,7 @@ static my_bool disable_query_log= 0, disable_result_log= 0;
static my_bool disable_warnings= 0, disable_ps_warnings= 0; static my_bool disable_warnings= 0, disable_ps_warnings= 0;
static my_bool disable_info= 1; static my_bool disable_info= 1;
static my_bool abort_on_error= 1; static my_bool abort_on_error= 1;
static my_bool is_windows= 0;
static char **default_argv; static char **default_argv;
static const char *load_default_groups[]= { "mysqltest", "client", 0 }; static const char *load_default_groups[]= { "mysqltest", "client", 0 };
static char line_buffer[MAX_DELIMITER_LENGTH], *line_buffer_pos= line_buffer; static char line_buffer[MAX_DELIMITER_LENGTH], *line_buffer_pos= line_buffer;
...@@ -273,7 +278,7 @@ enum enum_commands { ...@@ -273,7 +278,7 @@ enum enum_commands {
Q_DISABLE_PARSING, Q_ENABLE_PARSING, Q_DISABLE_PARSING, Q_ENABLE_PARSING,
Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST, Q_REPLACE_REGEX, Q_REMOVE_FILE, Q_FILE_EXIST,
Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT, Q_WRITE_FILE, Q_COPY_FILE, Q_PERL, Q_DIE, Q_EXIT,
Q_CHMOD_FILE, Q_CHMOD_FILE, Q_APPEND_FILE, Q_CAT_FILE, Q_DIFF_FILES,
Q_UNKNOWN, /* Unknown command. */ Q_UNKNOWN, /* Unknown command. */
Q_COMMENT, /* Comments, ignored. */ Q_COMMENT, /* Comments, ignored. */
...@@ -357,6 +362,9 @@ const char *command_names[]= ...@@ -357,6 +362,9 @@ const char *command_names[]=
/* Don't execute any more commands, compare result */ /* Don't execute any more commands, compare result */
"exit", "exit",
"chmod", "chmod",
"append_file",
"cat_file",
"diff_files",
0 0
}; };
...@@ -407,6 +415,8 @@ TYPELIB command_typelib= {array_elements(command_names),"", ...@@ -407,6 +415,8 @@ TYPELIB command_typelib= {array_elements(command_names),"",
DYNAMIC_STRING ds_res, ds_progress, ds_warning_messages; DYNAMIC_STRING ds_res, ds_progress, ds_warning_messages;
char builtin_echo[FN_REFLEN];
void die(const char *fmt, ...) void die(const char *fmt, ...)
ATTRIBUTE_FORMAT(printf, 1, 2); ATTRIBUTE_FORMAT(printf, 1, 2);
void abort_not_supported_test(const char *fmt, ...) void abort_not_supported_test(const char *fmt, ...)
...@@ -415,6 +425,8 @@ void verbose_msg(const char *fmt, ...) ...@@ -415,6 +425,8 @@ void verbose_msg(const char *fmt, ...)
ATTRIBUTE_FORMAT(printf, 1, 2); ATTRIBUTE_FORMAT(printf, 1, 2);
void warning_msg(const char *fmt, ...) void warning_msg(const char *fmt, ...)
ATTRIBUTE_FORMAT(printf, 1, 2); ATTRIBUTE_FORMAT(printf, 1, 2);
void log_msg(const char *fmt, ...)
ATTRIBUTE_FORMAT(printf, 1, 2);
VAR* var_from_env(const char *, const char *); VAR* var_from_env(const char *, const char *);
VAR* var_init(VAR* v, const char *name, int name_len, const char *val, VAR* var_init(VAR* v, const char *name, int name_len, const char *val,
...@@ -432,6 +444,7 @@ void dump_progress(); ...@@ -432,6 +444,7 @@ void dump_progress();
void do_eval(DYNAMIC_STRING *query_eval, const char *query, void do_eval(DYNAMIC_STRING *query_eval, const char *query,
const char *query_end, my_bool pass_through_escape_chars); const char *query_end, my_bool pass_through_escape_chars);
void str_to_file(const char *fname, char *str, int size); void str_to_file(const char *fname, char *str, int size);
void str_to_file2(const char *fname, char *str, int size, my_bool append);
#ifdef __WIN__ #ifdef __WIN__
void free_tmp_sh_file(); void free_tmp_sh_file();
...@@ -578,6 +591,7 @@ void do_eval(DYNAMIC_STRING *query_eval, const char *query, ...@@ -578,6 +591,7 @@ void do_eval(DYNAMIC_STRING *query_eval, const char *query,
dynstr_append_mem(query_eval, p, 1); dynstr_append_mem(query_eval, p, 1);
break; break;
default: default:
escaped= 0;
dynstr_append_mem(query_eval, p, 1); dynstr_append_mem(query_eval, p, 1);
break; break;
} }
...@@ -913,10 +927,10 @@ void warning_msg(const char *fmt, ...) ...@@ -913,10 +927,10 @@ void warning_msg(const char *fmt, ...)
dynstr_append_mem(&ds_warning_messages, dynstr_append_mem(&ds_warning_messages,
buff, len); buff, len);
} }
#ifndef __WIN__
len= vsnprintf(buff, sizeof(buff), fmt, args); len= my_vsnprintf(buff, sizeof(buff), fmt, args);
dynstr_append_mem(&ds_warning_messages, buff, len); dynstr_append_mem(&ds_warning_messages, buff, len);
#endif
dynstr_append(&ds_warning_messages, "\n"); dynstr_append(&ds_warning_messages, "\n");
va_end(args); va_end(args);
...@@ -924,6 +938,25 @@ void warning_msg(const char *fmt, ...) ...@@ -924,6 +938,25 @@ void warning_msg(const char *fmt, ...)
} }
void log_msg(const char *fmt, ...)
{
va_list args;
char buff[512];
size_t len;
DBUG_ENTER("log_msg");
memset(buff, 0, sizeof(buff));
va_start(args, fmt);
len= my_vsnprintf(buff, sizeof(buff)-1, fmt, args);
va_end(args);
dynstr_append_mem(&ds_res, buff, len);
dynstr_append(&ds_res, "\n");
DBUG_VOID_RETURN;
}
/* /*
Compare content of the string ds to content of file fname Compare content of the string ds to content of file fname
*/ */
...@@ -1497,29 +1530,36 @@ void do_source(struct st_command *command) ...@@ -1497,29 +1530,36 @@ void do_source(struct st_command *command)
} }
#ifdef __WIN__ #if defined __WIN__
#ifdef USE_CYGWIN
/* Variables used for temporary sh files used for emulating Unix on Windows */ /* Variables used for temporary sh files used for emulating Unix on Windows */
char tmp_sh_name[64], tmp_sh_cmd[70]; char tmp_sh_name[64], tmp_sh_cmd[70];
#endif
void init_tmp_sh_file() void init_tmp_sh_file()
{ {
#ifdef USE_CYGWIN
/* Format a name for the tmp sh file that is unique for this process */ /* Format a name for the tmp sh file that is unique for this process */
my_snprintf(tmp_sh_name, sizeof(tmp_sh_name), "tmp_%d.sh", getpid()); my_snprintf(tmp_sh_name, sizeof(tmp_sh_name), "tmp_%d.sh", getpid());
/* Format the command to execute in order to run the script */ /* Format the command to execute in order to run the script */
my_snprintf(tmp_sh_cmd, sizeof(tmp_sh_cmd), "sh %s", tmp_sh_name); my_snprintf(tmp_sh_cmd, sizeof(tmp_sh_cmd), "sh %s", tmp_sh_name);
#endif
} }
void free_tmp_sh_file() void free_tmp_sh_file()
{ {
#ifdef USE_CYGWIN
my_delete(tmp_sh_name, MYF(0)); my_delete(tmp_sh_name, MYF(0));
#endif
} }
#endif #endif
FILE* my_popen(DYNAMIC_STRING *ds_cmd, const char *mode) FILE* my_popen(DYNAMIC_STRING *ds_cmd, const char *mode)
{ {
#ifdef __WIN__ #if defined __WIN__ && defined USE_CYGWIN
/* Dump the command into a sh script file and execute with popen */ /* Dump the command into a sh script file and execute with popen */
str_to_file(tmp_sh_name, ds_cmd->str, ds_cmd->length); str_to_file(tmp_sh_name, ds_cmd->str, ds_cmd->length);
return popen(tmp_sh_cmd, mode); return popen(tmp_sh_cmd, mode);
...@@ -1529,6 +1569,64 @@ FILE* my_popen(DYNAMIC_STRING *ds_cmd, const char *mode) ...@@ -1529,6 +1569,64 @@ FILE* my_popen(DYNAMIC_STRING *ds_cmd, const char *mode)
} }
static void init_builtin_echo(void)
{
#ifdef __WIN__
/* Look for "echo.exe" in same dir as mysqltest was started from */
dirname_part(builtin_echo, my_progname);
fn_format(builtin_echo, ".\\echo.exe",
builtin_echo, "", MYF(MY_REPLACE_DIR));
/* Make sure echo.exe exists */
if (access(builtin_echo, F_OK) != 0)
builtin_echo[0]= 0;
return;
#else
builtin_echo[0]= 0;
return;
#endif
}
/*
Replace a substring
SYNOPSIS
replace
ds_str The string to search and perform the replace in
search_str The string to search for
search_len Length of the string to search for
replace_str The string to replace with
replace_len Length of the string to replace with
RETURN
0 String replaced
1 Could not find search_str in str
*/
static int replace(DYNAMIC_STRING *ds_str,
const char *search_str, ulong search_len,
const char *replace_str, ulong replace_len)
{
DYNAMIC_STRING ds_tmp;
const char *start= strstr(ds_str->str, search_str);
if (!start)
return 1;
init_dynamic_string(&ds_tmp, "",
ds_str->length + replace_len, 256);
dynstr_append_mem(&ds_tmp, ds_str->str, start - ds_str->str);
dynstr_append_mem(&ds_tmp, replace_str, replace_len);
dynstr_append(&ds_tmp, start + search_len);
dynstr_set(ds_str, ds_tmp.str);
dynstr_free(&ds_tmp);
return 0;
}
/* /*
Execute given command. Execute given command.
...@@ -1547,13 +1645,13 @@ FILE* my_popen(DYNAMIC_STRING *ds_cmd, const char *mode) ...@@ -1547,13 +1645,13 @@ FILE* my_popen(DYNAMIC_STRING *ds_cmd, const char *mode)
NOTE NOTE
Although mysqltest is executed from cygwin shell, the command will be Although mysqltest is executed from cygwin shell, the command will be
executed in "cmd.exe". Thus commands like "rm" etc can NOT be used, use executed in "cmd.exe". Thus commands like "rm" etc can NOT be used, use
system for those commands. mysqltest commmand(s) like "remove_file" for that
*/ */
void do_exec(struct st_command *command) void do_exec(struct st_command *command)
{ {
int error; int error;
char buf[1024]; char buf[512];
FILE *res_file; FILE *res_file;
char *cmd= command->first_argument; char *cmd= command->first_argument;
DYNAMIC_STRING ds_cmd; DYNAMIC_STRING ds_cmd;
...@@ -1569,10 +1667,28 @@ void do_exec(struct st_command *command) ...@@ -1569,10 +1667,28 @@ void do_exec(struct st_command *command)
init_dynamic_string(&ds_cmd, 0, command->query_len+256, 256); init_dynamic_string(&ds_cmd, 0, command->query_len+256, 256);
/* Eval the command, thus replacing all environment variables */ /* Eval the command, thus replacing all environment variables */
do_eval(&ds_cmd, cmd, command->end, TRUE); do_eval(&ds_cmd, cmd, command->end, !is_windows);
/* Check if echo should be replaced with "builtin" echo */
if (builtin_echo[0] && strncmp(cmd, "echo", 4) == 0)
{
/* Replace echo with our "builtin" echo */
replace(&ds_cmd, "echo", 4, builtin_echo, strlen(builtin_echo));
}
#ifdef __WIN__
#ifndef USE_CYGWIN
/* Replace /dev/null with NUL */
while(replace(&ds_cmd, "/dev/null", 9, "NUL", 3) == 0)
;
/* Replace "closed stdout" with non existing output fd */
while(replace(&ds_cmd, ">&-", 3, ">&4", 3) == 0)
;
#endif
#endif
DBUG_PRINT("info", ("Executing '%s' as '%s'", DBUG_PRINT("info", ("Executing '%s' as '%s'",
command->first_argument, cmd)); command->first_argument, ds_cmd.str));
if (!(res_file= my_popen(&ds_cmd, "r")) && command->abort_on_error) if (!(res_file= my_popen(&ds_cmd, "r")) && command->abort_on_error)
die("popen(\"%s\", \"r\") failed", command->first_argument); die("popen(\"%s\", \"r\") failed", command->first_argument);
...@@ -1596,7 +1712,11 @@ void do_exec(struct st_command *command) ...@@ -1596,7 +1712,11 @@ void do_exec(struct st_command *command)
my_bool ok= 0; my_bool ok= 0;
if (command->abort_on_error) if (command->abort_on_error)
{
log_msg("exec of '%s failed, error: %d, status: %d, errno: %d",
ds_cmd.str, error, status, errno);
die("command \"%s\" failed", command->first_argument); die("command \"%s\" failed", command->first_argument);
}
DBUG_PRINT("info", DBUG_PRINT("info",
("error: %d, status: %d", error, status)); ("error: %d, status: %d", error, status));
...@@ -1620,6 +1740,8 @@ void do_exec(struct st_command *command) ...@@ -1620,6 +1740,8 @@ void do_exec(struct st_command *command)
command->expected_errors.err[0].code.errnum != 0) command->expected_errors.err[0].code.errnum != 0)
{ {
/* Error code we wanted was != 0, i.e. not an expected success */ /* Error code we wanted was != 0, i.e. not an expected success */
log_msg("exec of '%s failed, error: %d, errno: %d",
ds_cmd.str, error, errno);
die("command \"%s\" succeeded - should have failed with errno %d...", die("command \"%s\" succeeded - should have failed with errno %d...",
command->first_argument, command->expected_errors.err[0].code.errnum); command->first_argument, command->expected_errors.err[0].code.errnum);
} }
...@@ -1690,7 +1812,7 @@ int do_modify_var(struct st_command *command, ...@@ -1690,7 +1812,7 @@ int do_modify_var(struct st_command *command,
int my_system(DYNAMIC_STRING* ds_cmd) int my_system(DYNAMIC_STRING* ds_cmd)
{ {
#ifdef __WIN__ #if defined __WIN__ && defined USE_CYGWIN
/* Dump the command into a sh script file and execute with system */ /* Dump the command into a sh script file and execute with system */
str_to_file(tmp_sh_name, ds_cmd->str, ds_cmd->length); str_to_file(tmp_sh_name, ds_cmd->str, ds_cmd->length);
return system(tmp_sh_cmd); return system(tmp_sh_cmd);
...@@ -1724,7 +1846,16 @@ void do_system(struct st_command *command) ...@@ -1724,7 +1846,16 @@ void do_system(struct st_command *command)
init_dynamic_string(&ds_cmd, 0, command->query_len + 64, 256); init_dynamic_string(&ds_cmd, 0, command->query_len + 64, 256);
/* Eval the system command, thus replacing all environment variables */ /* Eval the system command, thus replacing all environment variables */
do_eval(&ds_cmd, command->first_argument, command->end, TRUE); do_eval(&ds_cmd, command->first_argument, command->end, !is_windows);
#ifdef __WIN__
#ifndef USE_CYGWIN
/* Replace /dev/null with NUL */
while(replace(&ds_cmd, "/dev/null", 9, "NUL", 3) == 0)
;
#endif
#endif
DBUG_PRINT("info", ("running system command '%s' as '%s'", DBUG_PRINT("info", ("running system command '%s' as '%s'",
command->first_argument, ds_cmd.str)); command->first_argument, ds_cmd.str));
...@@ -1945,6 +2076,38 @@ void read_until_delimiter(DYNAMIC_STRING *ds, ...@@ -1945,6 +2076,38 @@ void read_until_delimiter(DYNAMIC_STRING *ds,
} }
void do_write_file_command(struct st_command *command, my_bool append)
{
static DYNAMIC_STRING ds_content;
static DYNAMIC_STRING ds_filename;
static DYNAMIC_STRING ds_delimiter;
const struct command_arg write_file_args[] = {
"filename", ARG_STRING, TRUE, &ds_filename, "File to write to",
"delimiter", ARG_STRING, FALSE, &ds_delimiter, "Delimiter to read until"
};
DBUG_ENTER("do_write_file");
check_command_args(command,
command->first_argument,
write_file_args,
sizeof(write_file_args)/sizeof(struct command_arg),
' ');
/* If no delimiter was provided, use EOF */
if (ds_delimiter.length == 0)
dynstr_set(&ds_delimiter, "EOF");
init_dynamic_string(&ds_content, "", 1024, 1024);
read_until_delimiter(&ds_content, &ds_delimiter);
DBUG_PRINT("info", ("Writing to file: %s", ds_filename.str));
str_to_file2(ds_filename.str, ds_content.str, ds_content.length, append);
dynstr_free(&ds_content);
dynstr_free(&ds_filename);
dynstr_free(&ds_delimiter);
DBUG_VOID_RETURN;
}
/* /*
SYNOPSIS SYNOPSIS
do_write_file do_write_file
...@@ -1974,36 +2137,174 @@ void read_until_delimiter(DYNAMIC_STRING *ds, ...@@ -1974,36 +2137,174 @@ void read_until_delimiter(DYNAMIC_STRING *ds,
void do_write_file(struct st_command *command) void do_write_file(struct st_command *command)
{ {
static DYNAMIC_STRING ds_content; do_write_file_command(command, FALSE);
}
/*
SYNOPSIS
do_append_file
command called command
DESCRIPTION
append_file <file_name> [<delimiter>];
<what to write line 1>
<...>
< what to write line n>
EOF
--append_file <file_name>;
<what to write line 1>
<...>
< what to write line n>
EOF
Append everything between the "append_file" command
and 'delimiter' to "file_name"
Default <delimiter> is EOF
*/
void do_append_file(struct st_command *command)
{
do_write_file_command(command, TRUE);
}
/*
SYNOPSIS
do_cat_file
command called command
DESCRIPTION
cat_file <file_name>;
Print the given file to result log
*/
void do_cat_file(struct st_command *command)
{
int fd;
uint len;
char buff[512];
static DYNAMIC_STRING ds_filename; static DYNAMIC_STRING ds_filename;
static DYNAMIC_STRING ds_delimiter; const struct command_arg cat_file_args[] = {
const struct command_arg write_file_args[] = { "filename", ARG_STRING, TRUE, &ds_filename, "File to read from"
"filename", ARG_STRING, TRUE, &ds_filename, "File to write to",
"delimiter", ARG_STRING, FALSE, &ds_delimiter, "Delimiter to read until"
}; };
DBUG_ENTER("do_write_file"); DBUG_ENTER("do_cat_file");
check_command_args(command, check_command_args(command,
command->first_argument, command->first_argument,
write_file_args, cat_file_args,
sizeof(write_file_args)/sizeof(struct command_arg), sizeof(cat_file_args)/sizeof(struct command_arg),
' '); ' ');
/* If no delimiter was provided, use EOF */ DBUG_PRINT("info", ("Reading from, file: %s", ds_filename.str));
if (ds_delimiter.length == 0)
dynstr_set(&ds_delimiter, "EOF");
init_dynamic_string(&ds_content, "", 1024, 1024); if ((fd= my_open(ds_filename.str, O_RDONLY, MYF(0))) < 0)
read_until_delimiter(&ds_content, &ds_delimiter); die("Failed to open file %s", ds_filename.str);
DBUG_PRINT("info", ("Writing to file: %s", ds_filename.str)); while((len= my_read(fd, (byte*)&buff,
str_to_file(ds_filename.str, ds_content.str, ds_content.length); sizeof(buff), MYF(0))) > 0)
dynstr_free(&ds_content); {
char *p= buff, *start= buff;
while (p < buff+len)
{
/* Convert cr/lf to lf */
if (*p == '\r' && *(p+1) && *(p+1)== '\n')
{
/* Add fake newline instead of cr and output the line */
*p= '\n';
p++; /* Step past the "fake" newline */
dynstr_append_mem(&ds_res, start, p-start);
p++; /* Step past the "fake" newline */
start= p;
}
else
p++;
}
/* Output any chars that migh be left */
dynstr_append_mem(&ds_res, start, p-start);
}
my_close(fd, MYF(0));
dynstr_free(&ds_filename); dynstr_free(&ds_filename);
dynstr_free(&ds_delimiter);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
/*
SYNOPSIS
do_diff_files
command called command
DESCRIPTION
diff_files <file1> <file2>;
Fails if the two files differ.
*/
void do_diff_files(struct st_command *command)
{
int error= 0;
int fd, fd2;
uint len, len2;
char buff[512], buff2[512];
static DYNAMIC_STRING ds_filename;
static DYNAMIC_STRING ds_filename2;
const struct command_arg diff_file_args[] = {
"file1", ARG_STRING, TRUE, &ds_filename, "First file to diff",
"file2", ARG_STRING, TRUE, &ds_filename2, "Second file to diff"
};
DBUG_ENTER("do_diff_files");
check_command_args(command,
command->first_argument,
diff_file_args,
sizeof(diff_file_args)/sizeof(struct command_arg),
' ');
if ((fd= my_open(ds_filename.str, O_RDONLY, MYF(0))) < 0)
die("Failed to open first file %s", ds_filename.str);
if ((fd2= my_open(ds_filename2.str, O_RDONLY, MYF(0))) < 0)
{
my_close(fd, MYF(0));
die("Failed to open second file %s", ds_filename2.str);
}
while((len= my_read(fd, (byte*)&buff,
sizeof(buff), MYF(0))) > 0)
{
if ((len2= my_read(fd2, (byte*)&buff2,
sizeof(buff2), MYF(0))) != len)
{
/* File 2 was smaller */
error= 1;
break;
}
if ((memcmp(buff, buff2, len)))
{
/* Content of this part differed */
error= 1;
break;
}
}
if (my_read(fd2, (byte*)&buff2,
sizeof(buff2), MYF(0)) > 0)
{
/* File 1 was smaller */
error= 1;
}
my_close(fd, MYF(0));
my_close(fd2, MYF(0));
dynstr_free(&ds_filename);
dynstr_free(&ds_filename2);
handle_command_error(command, error);
DBUG_VOID_RETURN;
}
/* /*
SYNOPSIS SYNOPSIS
do_perl do_perl
...@@ -4153,21 +4454,22 @@ int parse_args(int argc, char **argv) ...@@ -4153,21 +4454,22 @@ int parse_args(int argc, char **argv)
return 0; return 0;
} }
/* /*
Write the content of str into file Write the content of str into file
SYNOPSIS SYNOPSIS
str_to_file str_to_file2
fname - name of file to truncate/create and write to fname - name of file to truncate/create and write to
str - content to write to file str - content to write to file
size - size of content witten to file size - size of content witten to file
append - append to file instead of overwriting old file
*/ */
void str_to_file(const char *fname, char *str, int size) void str_to_file2(const char *fname, char *str, int size, my_bool append)
{ {
int fd; int fd;
char buff[FN_REFLEN]; char buff[FN_REFLEN];
int flags= O_WRONLY | O_CREAT;
if (!test_if_hard_path(fname)) if (!test_if_hard_path(fname))
{ {
strxmov(buff, opt_basedir, fname, NullS); strxmov(buff, opt_basedir, fname, NullS);
...@@ -4175,14 +4477,33 @@ void str_to_file(const char *fname, char *str, int size) ...@@ -4175,14 +4477,33 @@ void str_to_file(const char *fname, char *str, int size)
} }
fn_format(buff, fname, "", "", MY_UNPACK_FILENAME); fn_format(buff, fname, "", "", MY_UNPACK_FILENAME);
if ((fd= my_open(buff, O_WRONLY | O_CREAT | O_TRUNC, if (!append)
flags|= O_TRUNC;
if ((fd= my_open(buff, flags,
MYF(MY_WME | MY_FFNF))) < 0) MYF(MY_WME | MY_FFNF))) < 0)
die("Could not open %s: errno = %d", buff, errno); die("Could not open %s: errno = %d", buff, errno);
if (append && my_seek(fd, 0, SEEK_END, MYF(0)) == MY_FILEPOS_ERROR)
die("Could not find end of file %s: errno = %d", buff, 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));
} }
/*
Write the content of str into file
SYNOPSIS
str_to_file
fname - name of file to truncate/create and write to
str - content to write to file
size - size of content witten to file
*/
void str_to_file(const char *fname, char *str, int size)
{
str_to_file2(fname, str, size, FALSE);
}
void dump_result_to_reject_file(char *buf, int size) void dump_result_to_reject_file(char *buf, int size)
{ {
...@@ -5020,8 +5341,9 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command, ...@@ -5020,8 +5341,9 @@ void run_query_stmt(MYSQL *mysql, struct st_command *command,
/* /*
If we got here the statement succeeded and was expected to do so, If we got here the statement succeeded and was expected to do so,
get data. Note that this can still give errors found during execution! get data. Note that this can still give errors found during execution!
Store the result of the query if if will return any fields
*/ */
if (mysql_stmt_store_result(stmt)) if (mysql_stmt_field_count(stmt) && mysql_stmt_store_result(stmt))
{ {
handle_error(command, mysql_stmt_errno(stmt), handle_error(command, mysql_stmt_errno(stmt),
mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt), ds); mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt), ds);
...@@ -5613,7 +5935,11 @@ int main(int argc, char **argv) ...@@ -5613,7 +5935,11 @@ int main(int argc, char **argv)
parser.current_line= parser.read_lines= 0; parser.current_line= parser.read_lines= 0;
memset(&var_reg, 0, sizeof(var_reg)); memset(&var_reg, 0, sizeof(var_reg));
init_builtin_echo();
#ifdef __WIN__ #ifdef __WIN__
#ifndef USE_CYGWIN
is_windows= 1;
#endif
init_tmp_sh_file(); init_tmp_sh_file();
init_win_path_patterns(); init_win_path_patterns();
#endif #endif
...@@ -5747,6 +6073,9 @@ int main(int argc, char **argv) ...@@ -5747,6 +6073,9 @@ int main(int argc, char **argv)
case Q_REMOVE_FILE: do_remove_file(command); break; case Q_REMOVE_FILE: do_remove_file(command); break;
case Q_FILE_EXIST: do_file_exist(command); break; case Q_FILE_EXIST: do_file_exist(command); break;
case Q_WRITE_FILE: do_write_file(command); break; case Q_WRITE_FILE: do_write_file(command); break;
case Q_APPEND_FILE: do_append_file(command); break;
case Q_DIFF_FILES: do_diff_files(command); break;
case Q_CAT_FILE: do_cat_file(command); break;
case Q_COPY_FILE: do_copy_file(command); break; case Q_COPY_FILE: do_copy_file(command); break;
case Q_CHMOD_FILE: do_chmod_file(command); break; case Q_CHMOD_FILE: do_chmod_file(command); break;
case Q_PERL: do_perl(command); break; case Q_PERL: do_perl(command); break;
......
...@@ -35,7 +35,7 @@ testdir = $(benchdir_root)/mysql-test ...@@ -35,7 +35,7 @@ testdir = $(benchdir_root)/mysql-test
EXTRA_SCRIPTS = mysql-test-run-shell.sh install_test_db.sh \ EXTRA_SCRIPTS = mysql-test-run-shell.sh install_test_db.sh \
valgrind.supp $(PRESCRIPTS) valgrind.supp $(PRESCRIPTS)
EXTRA_DIST = $(EXTRA_SCRIPTS) EXTRA_DIST = $(EXTRA_SCRIPTS)
GENSCRIPTS = mysql-test-run-shell mysql-test-run install_test_db mtr GENSCRIPTS = mysql-test-run-shell mysql-test-run install_test_db mtr lib/init_db.sql
PRESCRIPTS = mysql-test-run.pl PRESCRIPTS = mysql-test-run.pl
test_SCRIPTS = $(GENSCRIPTS) $(PRESCRIPTS) test_SCRIPTS = $(GENSCRIPTS) $(PRESCRIPTS)
test_DATA = std_data/client-key.pem \ test_DATA = std_data/client-key.pem \
...@@ -119,6 +119,11 @@ mysql-test-run: ...@@ -119,6 +119,11 @@ mysql-test-run:
$(RM) -f mysql-test-run $(RM) -f mysql-test-run
$(LN_S) mysql-test-run.pl mysql-test-run $(LN_S) mysql-test-run.pl mysql-test-run
# Build init_db.sql by executing mysql_create_system_tables
lib/init_db.sql:
$(top_builddir)/scripts/mysql_create_system_tables \
test . \@HOSTNAME\@ > lib/init_db.sql
SUFFIXES = .sh SUFFIXES = .sh
.sh: .sh:
......
CREATE DATABASE mysql;
CREATE DATABASE test;
USE mysql;
CREATE TABLE db (Host char(60) binary DEFAULT '' NOT NULL,Db char(64) binary DEFAULT '' NOT NULL,User char(16) binary DEFAULT '' NOT NULL,Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,References_priv enum('N','Y') DEFAULT 'N' NOT NULL,Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,PRIMARY KEY Host (Host,Db,User),KEY User (User)) engine=MyISAM CHARACTER SET utf8 COLLATE utf8_bin comment='Database privileges';
INSERT INTO db VALUES ('%','test','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
CREATE TABLE host (Host char(60) binary DEFAULT '' NOT NULL,Db char(64) binary DEFAULT '' NOT NULL,Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,References_priv enum('N','Y') DEFAULT 'N' NOT NULL,Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,PRIMARY KEY Host (Host,Db)) engine=MyISAM CHARACTER SET utf8 COLLATE utf8_bin comment='Host privileges; Merged with database privileges';
CREATE TABLE user (Host char(60) binary DEFAULT '' NOT NULL,User char(16) binary DEFAULT '' NOT NULL,Password char(41) binary DEFAULT '' NOT NULL,Select_priv enum('N','Y') DEFAULT 'N' NOT NULL,Insert_priv enum('N','Y') DEFAULT 'N' NOT NULL,Update_priv enum('N','Y') DEFAULT 'N' NOT NULL,Delete_priv enum('N','Y') DEFAULT 'N' NOT NULL,Create_priv enum('N','Y') DEFAULT 'N' NOT NULL,Drop_priv enum('N','Y') DEFAULT 'N' NOT NULL,Reload_priv enum('N','Y') DEFAULT 'N' NOT NULL,Shutdown_priv enum('N','Y') DEFAULT 'N' NOT NULL,Process_priv enum('N','Y') DEFAULT 'N' NOT NULL,File_priv enum('N','Y') DEFAULT 'N' NOT NULL,Grant_priv enum('N','Y') DEFAULT 'N' NOT NULL,References_priv enum('N','Y') DEFAULT 'N' NOT NULL,Index_priv enum('N','Y') DEFAULT 'N' NOT NULL,Alter_priv enum('N','Y') DEFAULT 'N' NOT NULL,Show_db_priv enum('N','Y') DEFAULT 'N' NOT NULL,Super_priv enum('N','Y') DEFAULT 'N' NOT NULL,Create_tmp_table_priv enum('N','Y') DEFAULT 'N' NOT NULL,Lock_tables_priv enum('N','Y') DEFAULT 'N' NOT NULL,Execute_priv enum('N','Y') DEFAULT 'N' NOT NULL,Repl_slave_priv enum('N','Y') DEFAULT 'N' NOT NULL,Repl_client_priv enum('N','Y') DEFAULT 'N' NOT NULL,ssl_type enum('','ANY','X509', 'SPECIFIED') DEFAULT '' NOT NULL,ssl_cipher BLOB NOT NULL,x509_issuer BLOB NOT NULL,x509_subject BLOB NOT NULL,max_questions int(11) unsigned DEFAULT 0 NOT NULL,max_updates int(11) unsigned DEFAULT 0 NOT NULL,max_connections int(11) unsigned DEFAULT 0 NOT NULL,PRIMARY KEY Host (Host,User)) engine=MyISAM CHARACTER SET utf8 COLLATE utf8_bin comment='Users and global privileges';
INSERT INTO user VALUES ('%','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
INSERT INTO user VALUES ('localhost','','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
INSERT INTO user VALUES ('%','','','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','','','','',0,0,0);
CREATE TABLE func (name char(64) binary DEFAULT '' NOT NULL,ret tinyint(1) DEFAULT '0' NOT NULL,dl char(128) DEFAULT '' NOT NULL,type enum ('function','aggregate') NOT NULL,PRIMARY KEY (name)) engine=MyISAM CHARACTER SET utf8 COLLATE utf8_bin comment='User defined functions';
CREATE TABLE tables_priv (Host char(60) binary DEFAULT '' NOT NULL,Db char(64) binary DEFAULT '' NOT NULL,User char(16) binary DEFAULT '' NOT NULL,Table_name char(64) binary DEFAULT '' NOT NULL,Grantor char(77) DEFAULT '' NOT NULL,Timestamp timestamp(14),Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') DEFAULT '' NOT NULL,Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,PRIMARY KEY (Host,Db,User,Table_name),KEY Grantor (Grantor)) engine=MyISAM CHARACTER SET utf8 COLLATE utf8_bin comment='Table privileges';
CREATE TABLE columns_priv (Host char(60) binary DEFAULT '' NOT NULL,Db char(64) binary DEFAULT '' NOT NULL,User char(16) binary DEFAULT '' NOT NULL,Table_name char(64) binary DEFAULT '' NOT NULL,Column_name char(64) binary DEFAULT '' NOT NULL,Timestamp timestamp(14),Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL,PRIMARY KEY (Host,Db,User,Table_name,Column_name)) engine=MyISAM CHARACTER SET utf8 COLLATE utf8_bin comment='Column privileges';
CREATE TABLE help_topic (help_topic_id int unsigned not null,name varchar(64) not null,help_category_id smallint unsigned not null,description text not null,example text not null,url varchar(128) not null,primary key (help_topic_id),unique index (name)) engine=MyISAM CHARACTER SET utf8 comment='help topics';
CREATE TABLE help_category (help_category_id smallint unsigned not null,name varchar(64) not null,parent_category_id smallint unsigned null,url varchar(128) not null,primary key (help_category_id),unique index (name)) engine=MyISAM CHARACTER SET utf8 comment='help categories';
CREATE TABLE help_keyword (help_keyword_id int unsigned not null,name varchar(64) not null,primary key (help_keyword_id),unique index (name)) engine=MyISAM CHARACTER SET utf8 comment='help keywords';
CREATE TABLE help_relation (help_topic_id int unsigned not null references help_topic,help_keyword_id int unsigned not null references help_keyword,primary key (help_keyword_id, help_topic_id)) engine=MyISAM CHARACTER SET utf8 comment='keyword-topic relation';
CREATE TABLE time_zone_name (Name char(64) NOT NULL,Time_zone_id int unsigned NOT NULL,PRIMARY KEY Name (Name)) engine=MyISAM CHARACTER SET utf8 comment='Time zone names';
INSERT INTO time_zone_name (Name, Time_Zone_id) VALUES ('MET', 1), ('UTC', 2), ('Universal', 2), ('Europe/Moscow',3), ('leap/Europe/Moscow',4), ('Japan', 5);
CREATE TABLE time_zone (Time_zone_id int unsigned NOT NULL auto_increment,Use_leap_seconds enum('Y','N') DEFAULT 'N' NOT NULL,PRIMARY KEY TzId (Time_zone_id)) engine=MyISAM CHARACTER SET utf8 comment='Time zones';
INSERT INTO time_zone (Time_zone_id, Use_leap_seconds) VALUES (1,'N'), (2,'N'), (3,'N'), (4,'Y'), (5,'N');
CREATE TABLE time_zone_transition (Time_zone_id int unsigned NOT NULL,Transition_time bigint signed NOT NULL,Transition_type_id int unsigned NOT NULL,PRIMARY KEY TzIdTranTime (Time_zone_id, Transition_time)) engine=MyISAM CHARACTER SET utf8 comment='Time zone transitions';
INSERT INTO time_zone_transition (Time_zone_id, Transition_time, Transition_type_id) VALUES (1, -1693706400, 0) ,(1, -1680483600, 1),(1, -1663455600, 2) ,(1, -1650150000, 3),(1, -1632006000, 2) ,(1, -1618700400, 3),(1, -938905200, 2) ,(1, -857257200, 3),(1, -844556400, 2) ,(1, -828226800, 3),(1, -812502000, 2) ,(1, -796777200, 3),(1, 228877200, 2) ,(1, 243997200, 3),(1, 260326800, 2) ,(1, 276051600, 3),(1, 291776400, 2) ,(1, 307501200, 3),(1, 323830800, 2) ,(1, 338950800, 3),(1, 354675600, 2) ,(1, 370400400, 3),(1, 386125200, 2) ,(1, 401850000, 3),(1, 417574800, 2) ,(1, 433299600, 3),(1, 449024400, 2) ,(1, 465354000, 3),(1, 481078800, 2) ,(1, 496803600, 3),(1, 512528400, 2) ,(1, 528253200, 3),(1, 543978000, 2) ,(1, 559702800, 3),(1, 575427600, 2) ,(1, 591152400, 3),(1, 606877200, 2) ,(1, 622602000, 3),(1, 638326800, 2) ,(1, 654656400, 3),(1, 670381200, 2) ,(1, 686106000, 3),(1, 701830800, 2) ,(1, 717555600, 3),(1, 733280400, 2) ,(1, 749005200, 3),(1, 764730000, 2) ,(1, 780454800, 3),(1, 796179600, 2) ,(1, 811904400, 3),(1, 828234000, 2) ,(1, 846378000, 3),(1, 859683600, 2) ,(1, 877827600, 3),(1, 891133200, 2) ,(1, 909277200, 3),(1, 922582800, 2) ,(1, 941331600, 3),(1, 954032400, 2) ,(1, 972781200, 3),(1, 985482000, 2) ,(1, 1004230800, 3),(1, 1017536400, 2) ,(1, 1035680400, 3),(1, 1048986000, 2) ,(1, 1067130000, 3),(1, 1080435600, 2) ,(1, 1099184400, 3),(1, 1111885200, 2) ,(1, 1130634000, 3),(1, 1143334800, 2) ,(1, 1162083600, 3),(1, 1174784400, 2) ,(1, 1193533200, 3),(1, 1206838800, 2) ,(1, 1224982800, 3),(1, 1238288400, 2) ,(1, 1256432400, 3),(1, 1269738000, 2) ,(1, 1288486800, 3),(1, 1301187600, 2) ,(1, 1319936400, 3),(1, 1332637200, 2) ,(1, 1351386000, 3),(1, 1364691600, 2) ,(1, 1382835600, 3),(1, 1396141200, 2) ,(1, 1414285200, 3),(1, 1427590800, 2) ,(1, 1445734800, 3),(1, 1459040400, 2) ,(1, 1477789200, 3),(1, 1490490000, 2) ,(1, 1509238800, 3),(1, 1521939600, 2) ,(1, 1540688400, 3),(1, 1553994000, 2) ,(1, 1572138000, 3),(1, 1585443600, 2) ,(1, 1603587600, 3),(1, 1616893200, 2) ,(1, 1635642000, 3),(1, 1648342800, 2) ,(1, 1667091600, 3),(1, 1679792400, 2) ,(1, 1698541200, 3),(1, 1711846800, 2) ,(1, 1729990800, 3),(1, 1743296400, 2) ,(1, 1761440400, 3),(1, 1774746000, 2) ,(1, 1792890000, 3),(1, 1806195600, 2) ,(1, 1824944400, 3),(1, 1837645200, 2) ,(1, 1856394000, 3),(1, 1869094800, 2) ,(1, 1887843600, 3),(1, 1901149200, 2) ,(1, 1919293200, 3),(1, 1932598800, 2) ,(1, 1950742800, 3),(1, 1964048400, 2) ,(1, 1982797200, 3),(1, 1995498000, 2) ,(1, 2014246800, 3),(1, 2026947600, 2) ,(1, 2045696400, 3),(1, 2058397200, 2) ,(1, 2077146000, 3),(1, 2090451600, 2) ,(1, 2108595600, 3),(1, 2121901200, 2) ,(1, 2140045200, 3),(3, -1688265000, 2) ,(3, -1656819048, 1),(3, -1641353448, 2) ,(3, -1627965048, 3),(3, -1618716648, 1) ,(3, -1596429048, 3),(3, -1593829848, 5) ,(3, -1589860800, 4),(3, -1542427200, 5) ,(3, -1539493200, 6),(3, -1525323600, 5) ,(3, -1522728000, 4),(3, -1491188400, 7) ,(3, -1247536800, 4),(3, 354920400, 5) ,(3, 370728000, 4),(3, 386456400, 5) ,(3, 402264000, 4),(3, 417992400, 5) ,(3, 433800000, 4),(3, 449614800, 5) ,(3, 465346800, 8),(3, 481071600, 9) ,(3, 496796400, 8),(3, 512521200, 9) ,(3, 528246000, 8),(3, 543970800, 9) ,(3, 559695600, 8),(3, 575420400, 9) ,(3, 591145200, 8),(3, 606870000, 9) ,(3, 622594800, 8),(3, 638319600, 9) ,(3, 654649200, 8),(3, 670374000, 10) ,(3, 686102400, 11),(3, 695779200, 8) ,(3, 701812800, 5),(3, 717534000, 4) ,(3, 733273200, 9),(3, 748998000, 8) ,(3, 764722800, 9),(3, 780447600, 8) ,(3, 796172400, 9),(3, 811897200, 8) ,(3, 828226800, 9),(3, 846370800, 8) ,(3, 859676400, 9),(3, 877820400, 8) ,(3, 891126000, 9),(3, 909270000, 8) ,(3, 922575600, 9),(3, 941324400, 8) ,(3, 954025200, 9),(3, 972774000, 8) ,(3, 985474800, 9),(3, 1004223600, 8) ,(3, 1017529200, 9),(3, 1035673200, 8) ,(3, 1048978800, 9),(3, 1067122800, 8) ,(3, 1080428400, 9),(3, 1099177200, 8) ,(3, 1111878000, 9),(3, 1130626800, 8) ,(3, 1143327600, 9),(3, 1162076400, 8) ,(3, 1174777200, 9),(3, 1193526000, 8) ,(3, 1206831600, 9),(3, 1224975600, 8) ,(3, 1238281200, 9),(3, 1256425200, 8) ,(3, 1269730800, 9),(3, 1288479600, 8) ,(3, 1301180400, 9),(3, 1319929200, 8) ,(3, 1332630000, 9),(3, 1351378800, 8) ,(3, 1364684400, 9),(3, 1382828400, 8) ,(3, 1396134000, 9),(3, 1414278000, 8) ,(3, 1427583600, 9),(3, 1445727600, 8) ,(3, 1459033200, 9),(3, 1477782000, 8) ,(3, 1490482800, 9),(3, 1509231600, 8) ,(3, 1521932400, 9),(3, 1540681200, 8) ,(3, 1553986800, 9),(3, 1572130800, 8) ,(3, 1585436400, 9),(3, 1603580400, 8) ,(3, 1616886000, 9),(3, 1635634800, 8) ,(3, 1648335600, 9),(3, 1667084400, 8) ,(3, 1679785200, 9),(3, 1698534000, 8) ,(3, 1711839600, 9),(3, 1729983600, 8) ,(3, 1743289200, 9),(3, 1761433200, 8) ,(3, 1774738800, 9),(3, 1792882800, 8) ,(3, 1806188400, 9),(3, 1824937200, 8) ,(3, 1837638000, 9),(3, 1856386800, 8) ,(3, 1869087600, 9),(3, 1887836400, 8) ,(3, 1901142000, 9),(3, 1919286000, 8) ,(3, 1932591600, 9),(3, 1950735600, 8) ,(3, 1964041200, 9),(3, 1982790000, 8) ,(3, 1995490800, 9),(3, 2014239600, 8) ,(3, 2026940400, 9),(3, 2045689200, 8) ,(3, 2058390000, 9),(3, 2077138800, 8) ,(3, 2090444400, 9),(3, 2108588400, 8) ,(3, 2121894000, 9),(3, 2140038000, 8),(4, -1688265000, 2) ,(4, -1656819048, 1),(4, -1641353448, 2) ,(4, -1627965048, 3),(4, -1618716648, 1) ,(4, -1596429048, 3),(4, -1593829848, 5) ,(4, -1589860800, 4),(4, -1542427200, 5) ,(4, -1539493200, 6),(4, -1525323600, 5) ,(4, -1522728000, 4),(4, -1491188400, 7) ,(4, -1247536800, 4),(4, 354920409, 5) ,(4, 370728010, 4),(4, 386456410, 5) ,(4, 402264011, 4),(4, 417992411, 5) ,(4, 433800012, 4),(4, 449614812, 5) ,(4, 465346812, 8),(4, 481071612, 9) ,(4, 496796413, 8),(4, 512521213, 9) ,(4, 528246013, 8),(4, 543970813, 9) ,(4, 559695613, 8),(4, 575420414, 9) ,(4, 591145214, 8),(4, 606870014, 9) ,(4, 622594814, 8),(4, 638319615, 9) ,(4, 654649215, 8),(4, 670374016, 10) ,(4, 686102416, 11),(4, 695779216, 8) ,(4, 701812816, 5),(4, 717534017, 4) ,(4, 733273217, 9),(4, 748998018, 8) ,(4, 764722818, 9),(4, 780447619, 8) ,(4, 796172419, 9),(4, 811897219, 8) ,(4, 828226820, 9),(4, 846370820, 8) ,(4, 859676420, 9),(4, 877820421, 8) ,(4, 891126021, 9),(4, 909270021, 8) ,(4, 922575622, 9),(4, 941324422, 8) ,(4, 954025222, 9),(4, 972774022, 8) ,(4, 985474822, 9),(4, 1004223622, 8) ,(4, 1017529222, 9),(4, 1035673222, 8) ,(4, 1048978822, 9),(4, 1067122822, 8) ,(4, 1080428422, 9),(4, 1099177222, 8) ,(4, 1111878022, 9),(4, 1130626822, 8) ,(4, 1143327622, 9),(4, 1162076422, 8) ,(4, 1174777222, 9),(4, 1193526022, 8) ,(4, 1206831622, 9),(4, 1224975622, 8) ,(4, 1238281222, 9),(4, 1256425222, 8) ,(4, 1269730822, 9),(4, 1288479622, 8) ,(4, 1301180422, 9),(4, 1319929222, 8) ,(4, 1332630022, 9),(4, 1351378822, 8) ,(4, 1364684422, 9),(4, 1382828422, 8) ,(4, 1396134022, 9),(4, 1414278022, 8) ,(4, 1427583622, 9),(4, 1445727622, 8) ,(4, 1459033222, 9),(4, 1477782022, 8) ,(4, 1490482822, 9),(4, 1509231622, 8) ,(4, 1521932422, 9),(4, 1540681222, 8) ,(4, 1553986822, 9),(4, 1572130822, 8) ,(4, 1585436422, 9),(4, 1603580422, 8) ,(4, 1616886022, 9),(4, 1635634822, 8) ,(4, 1648335622, 9),(4, 1667084422, 8) ,(4, 1679785222, 9),(4, 1698534022, 8) ,(4, 1711839622, 9),(4, 1729983622, 8) ,(4, 1743289222, 9),(4, 1761433222, 8) ,(4, 1774738822, 9),(4, 1792882822, 8) ,(4, 1806188422, 9),(4, 1824937222, 8) ,(4, 1837638022, 9),(4, 1856386822, 8) ,(4, 1869087622, 9),(4, 1887836422, 8) ,(4, 1901142022, 9),(4, 1919286022, 8) ,(4, 1932591622, 9),(4, 1950735622, 8) ,(4, 1964041222, 9),(4, 1982790022, 8) ,(4, 1995490822, 9),(4, 2014239622, 8) ,(4, 2026940422, 9),(4, 2045689222, 8) ,(4, 2058390022, 9),(4, 2077138822, 8) ,(4, 2090444422, 9),(4, 2108588422, 8) ,(4, 2121894022, 9),(4, 2140038022, 8);
CREATE TABLE time_zone_transition_type (Time_zone_id int unsigned NOT NULL,Transition_type_id int unsigned NOT NULL,Offset int signed DEFAULT 0 NOT NULL,Is_DST tinyint unsigned DEFAULT 0 NOT NULL,Abbreviation char(8) DEFAULT '' NOT NULL,PRIMARY KEY TzIdTrTId (Time_zone_id, Transition_type_id)) engine=MyISAM CHARACTER SET utf8 comment='Time zone transition types';
INSERT INTO time_zone_transition_type (Time_zone_id,Transition_type_id, Offset, Is_DST, Abbreviation) VALUES (1, 0, 7200, 1, 'MEST') ,(1, 1, 3600, 0, 'MET') ,(1, 2, 7200, 1, 'MEST') ,(1, 3, 3600, 0, 'MET') ,(2, 0, 0, 0, 'UTC') ,(3, 0, 9000, 0, 'MMT') ,(3, 1, 12648, 1, 'MST') ,(3, 2, 9048, 0, 'MMT') ,(3, 3, 16248, 1, 'MDST') ,(3, 4, 10800, 0, 'MSK') ,(3, 5, 14400, 1, 'MSD') ,(3, 6, 18000, 1, 'MSD') ,(3, 7, 7200, 0, 'EET') ,(3, 8, 10800, 0, 'MSK') ,(3, 9, 14400, 1, 'MSD') ,(3, 10, 10800, 1, 'EEST') ,(3, 11, 7200, 0, 'EET') ,(4, 0, 9000, 0, 'MMT') ,(4, 1, 12648, 1, 'MST') ,(4, 2, 9048, 0, 'MMT') ,(4, 3, 16248, 1, 'MDST') ,(4, 4, 10800, 0, 'MSK') ,(4, 5, 14400, 1, 'MSD') ,(4, 6, 18000, 1, 'MSD') ,(4, 7, 7200, 0, 'EET') ,(4, 8, 10800, 0, 'MSK') ,(4, 9, 14400, 1, 'MSD') ,(4, 10, 10800, 1, 'EEST') ,(4, 11, 7200, 0, 'EET') ,(5, 0, 32400, 0, 'CJT') ,(5, 1, 32400, 0, 'JST');
CREATE TABLE time_zone_leap_second (Transition_time bigint signed NOT NULL,Correction int signed NOT NULL,PRIMARY KEY TranTime (Transition_time)) engine=MyISAM CHARACTER SET utf8 comment='Leap seconds information for time zones';
INSERT INTO time_zone_leap_second (Transition_time, Correction) VALUES (78796800, 1) ,(94694401, 2) ,(126230402, 3) ,(157766403, 4) ,(189302404, 5) ,(220924805, 6) ,(252460806, 7) ,(283996807, 8) ,(315532808, 9) ,(362793609, 10) ,(394329610, 11) ,(425865611, 12) ,(489024012, 13) ,(567993613, 14) ,(631152014, 15) ,(662688015, 16) ,(709948816, 17) ,(741484817, 18) ,(773020818, 19) ,(820454419, 20) ,(867715220, 21) ,(915148821, 22);
use mysql;
set table_type=myisam;
CREATE TABLE db (
Host char(60) binary DEFAULT '' NOT NULL,
Db char(64) binary DEFAULT '' NOT NULL,
User char(16) binary DEFAULT '' NOT NULL,
Select_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Insert_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Update_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Delete_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Create_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Drop_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Grant_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
References_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Index_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Alter_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Create_tmp_table_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Lock_tables_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
PRIMARY KEY Host (Host,Db,User),
KEY User (User)
) engine=MyISAM
CHARACTER SET utf8 COLLATE utf8_bin
comment='Database privileges';
INSERT INTO db VALUES ('%','test' ,'','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
INSERT INTO db VALUES ('%','test\_%','','Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y');
CREATE TABLE host (
Host char(60) binary DEFAULT '' NOT NULL,
Db char(64) binary DEFAULT '' NOT NULL,
Select_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Insert_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Update_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Delete_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Create_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Drop_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Grant_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
References_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Index_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Alter_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Create_tmp_table_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Lock_tables_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
PRIMARY KEY Host (Host,Db)
) engine=MyISAM
CHARACTER SET utf8 COLLATE utf8_bin
comment='Host privileges; Merged with database privileges';
CREATE TABLE user (
Host char(60) binary DEFAULT '' NOT NULL,
User char(16) binary DEFAULT '' NOT NULL,
Password char(41) binary DEFAULT '' NOT NULL,
Select_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Insert_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Update_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Delete_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Create_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Drop_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Reload_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Shutdown_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Process_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
File_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Grant_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
References_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Index_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Alter_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Show_db_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Super_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Create_tmp_table_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Lock_tables_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Execute_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Repl_slave_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Repl_client_priv enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
ssl_type enum('','ANY','X509', 'SPECIFIED') COLLATE utf8_general_ci DEFAULT '' NOT NULL,
ssl_cipher BLOB NOT NULL,
x509_issuer BLOB NOT NULL,
x509_subject BLOB NOT NULL,
max_questions int(11) unsigned DEFAULT 0 NOT NULL,
max_updates int(11) unsigned DEFAULT 0 NOT NULL,
max_connections int(11) unsigned DEFAULT 0 NOT NULL,
PRIMARY KEY Host (Host,User)
) engine=MyISAM
CHARACTER SET utf8 COLLATE utf8_bin
comment='Users and global privileges';
INSERT INTO user VALUES ('localhost' ,'root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
INSERT INTO user VALUES ('@HOSTNAME@%','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
REPLACE INTO user VALUES ('127.0.0.1' ,'root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0);
INSERT INTO user (host,user) VALUES ('localhost','');
INSERT INTO user (host,user) VALUES ('@HOSTNAME@%','');
CREATE TABLE func (
name char(64) binary DEFAULT '' NOT NULL,
ret tinyint(1) DEFAULT '0' NOT NULL,
dl char(128) DEFAULT '' NOT NULL,
type enum ('function','aggregate') COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (name)
) engine=MyISAM
CHARACTER SET utf8 COLLATE utf8_bin
comment='User defined functions';
CREATE TABLE tables_priv (
Host char(60) binary DEFAULT '' NOT NULL,
Db char(64) binary DEFAULT '' NOT NULL,
User char(16) binary DEFAULT '' NOT NULL,
Table_name char(64) binary DEFAULT '' NOT NULL,
Grantor char(77) DEFAULT '' NOT NULL,
Timestamp timestamp(14),
Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter') COLLATE utf8_general_ci DEFAULT '' NOT NULL,
Column_priv set('Select','Insert','Update','References') COLLATE utf8_general_ci DEFAULT '' NOT NULL,
PRIMARY KEY (Host,Db,User,Table_name),KEY Grantor (Grantor)
) engine=MyISAM
CHARACTER SET utf8 COLLATE utf8_bin
comment='Table privileges';
CREATE TABLE columns_priv (
Host char(60) binary DEFAULT '' NOT NULL,
Db char(64) binary DEFAULT '' NOT NULL,
User char(16) binary DEFAULT '' NOT NULL,
Table_name char(64) binary DEFAULT '' NOT NULL,
Column_name char(64) binary DEFAULT '' NOT NULL,
Timestamp timestamp(14),
Column_priv set('Select','Insert','Update','References') COLLATE utf8_general_ci DEFAULT '' NOT NULL,
PRIMARY KEY (Host,Db,User,Table_name,Column_name)
) engine=MyISAM
CHARACTER SET utf8 COLLATE utf8_bin
comment='Column privileges';
CREATE TABLE help_topic (
help_topic_id int unsigned not null,
name varchar(64) not null,
help_category_id smallint unsigned not null,
description text not null,
example text not null,
url varchar(128) not null,
primary key (help_topic_id),
unique index (name)
) engine=MyISAM
CHARACTER SET utf8
comment='help topics';
CREATE TABLE help_category (
help_category_id smallint unsigned not null,
name varchar(64) not null,
parent_category_id smallint unsigned null,
url varchar(128) not null,
primary key (help_category_id),unique index (name)
) engine=MyISAM
CHARACTER SET utf8
comment='help categories';
CREATE TABLE help_keyword (
help_keyword_id int unsigned not null,
name varchar(64) not null,
primary key (help_keyword_id),unique index (name)
) engine=MyISAM
CHARACTER SET utf8
comment='help keywords';
CREATE TABLE help_relation (
help_topic_id int unsigned not null references help_topic,
help_keyword_id int unsigned not null references help_keyword,
primary key (help_keyword_id, help_topic_id)
) engine=MyISAM
CHARACTER SET utf8
comment='keyword-topic relation';
CREATE TABLE time_zone_name (
Name char(64) NOT NULL,
Time_zone_id int unsigned NOT NULL,
PRIMARY KEY Name (Name)
) engine=MyISAM
CHARACTER SET utf8
comment='Time zone names';
INSERT INTO time_zone_name (Name, Time_Zone_id) VALUES
('MET', 1), ('UTC', 2), ('Universal', 2),
('Europe/Moscow',3), ('leap/Europe/Moscow',4),
('Japan', 5);
CREATE TABLE time_zone (
Time_zone_id int unsigned NOT NULL auto_increment,
Use_leap_seconds enum('Y','N') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
PRIMARY KEY TzId (Time_zone_id)
) engine=MyISAM
CHARACTER SET utf8
comment='Time zones';
INSERT INTO time_zone (Time_zone_id, Use_leap_seconds)
VALUES (1,'N'), (2,'N'), (3,'N'), (4,'Y'), (5,'N');
CREATE TABLE time_zone_transition (
Time_zone_id int unsigned NOT NULL,
Transition_time bigint signed NOT NULL,
Transition_type_id int unsigned NOT NULL,
PRIMARY KEY TzIdTranTime (Time_zone_id, Transition_time)
) engine=MyISAM
CHARACTER SET utf8
comment='Time zone transitions';
INSERT INTO time_zone_transition
(Time_zone_id, Transition_time, Transition_type_id)
VALUES
(1, -1693706400, 0) ,(1, -1680483600, 1)
,(1, -1663455600, 2) ,(1, -1650150000, 3)
,(1, -1632006000, 2) ,(1, -1618700400, 3)
,(1, -938905200, 2) ,(1, -857257200, 3)
,(1, -844556400, 2) ,(1, -828226800, 3)
,(1, -812502000, 2) ,(1, -796777200, 3)
,(1, 228877200, 2) ,(1, 243997200, 3)
,(1, 260326800, 2) ,(1, 276051600, 3)
,(1, 291776400, 2) ,(1, 307501200, 3)
,(1, 323830800, 2) ,(1, 338950800, 3)
,(1, 354675600, 2) ,(1, 370400400, 3)
,(1, 386125200, 2) ,(1, 401850000, 3)
,(1, 417574800, 2) ,(1, 433299600, 3)
,(1, 449024400, 2) ,(1, 465354000, 3)
,(1, 481078800, 2) ,(1, 496803600, 3)
,(1, 512528400, 2) ,(1, 528253200, 3)
,(1, 543978000, 2) ,(1, 559702800, 3)
,(1, 575427600, 2) ,(1, 591152400, 3)
,(1, 606877200, 2) ,(1, 622602000, 3)
,(1, 638326800, 2) ,(1, 654656400, 3)
,(1, 670381200, 2) ,(1, 686106000, 3)
,(1, 701830800, 2) ,(1, 717555600, 3)
,(1, 733280400, 2) ,(1, 749005200, 3)
,(1, 764730000, 2) ,(1, 780454800, 3)
,(1, 796179600, 2) ,(1, 811904400, 3)
,(1, 828234000, 2) ,(1, 846378000, 3)
,(1, 859683600, 2) ,(1, 877827600, 3)
,(1, 891133200, 2) ,(1, 909277200, 3)
,(1, 922582800, 2) ,(1, 941331600, 3)
,(1, 954032400, 2) ,(1, 972781200, 3)
,(1, 985482000, 2) ,(1, 1004230800, 3)
,(1, 1017536400, 2) ,(1, 1035680400, 3)
,(1, 1048986000, 2) ,(1, 1067130000, 3)
,(1, 1080435600, 2) ,(1, 1099184400, 3)
,(1, 1111885200, 2) ,(1, 1130634000, 3)
,(1, 1143334800, 2) ,(1, 1162083600, 3)
,(1, 1174784400, 2) ,(1, 1193533200, 3)
,(1, 1206838800, 2) ,(1, 1224982800, 3)
,(1, 1238288400, 2) ,(1, 1256432400, 3)
,(1, 1269738000, 2) ,(1, 1288486800, 3)
,(1, 1301187600, 2) ,(1, 1319936400, 3)
,(1, 1332637200, 2) ,(1, 1351386000, 3)
,(1, 1364691600, 2) ,(1, 1382835600, 3)
,(1, 1396141200, 2) ,(1, 1414285200, 3)
,(1, 1427590800, 2) ,(1, 1445734800, 3)
,(1, 1459040400, 2) ,(1, 1477789200, 3)
,(1, 1490490000, 2) ,(1, 1509238800, 3)
,(1, 1521939600, 2) ,(1, 1540688400, 3)
,(1, 1553994000, 2) ,(1, 1572138000, 3)
,(1, 1585443600, 2) ,(1, 1603587600, 3)
,(1, 1616893200, 2) ,(1, 1635642000, 3)
,(1, 1648342800, 2) ,(1, 1667091600, 3)
,(1, 1679792400, 2) ,(1, 1698541200, 3)
,(1, 1711846800, 2) ,(1, 1729990800, 3)
,(1, 1743296400, 2) ,(1, 1761440400, 3)
,(1, 1774746000, 2) ,(1, 1792890000, 3)
,(1, 1806195600, 2) ,(1, 1824944400, 3)
,(1, 1837645200, 2) ,(1, 1856394000, 3)
,(1, 1869094800, 2) ,(1, 1887843600, 3)
,(1, 1901149200, 2) ,(1, 1919293200, 3)
,(1, 1932598800, 2) ,(1, 1950742800, 3)
,(1, 1964048400, 2) ,(1, 1982797200, 3)
,(1, 1995498000, 2) ,(1, 2014246800, 3)
,(1, 2026947600, 2) ,(1, 2045696400, 3)
,(1, 2058397200, 2) ,(1, 2077146000, 3)
,(1, 2090451600, 2) ,(1, 2108595600, 3)
,(1, 2121901200, 2) ,(1, 2140045200, 3)
,(3, -1688265000, 2) ,(3, -1656819048, 1)
,(3, -1641353448, 2) ,(3, -1627965048, 3)
,(3, -1618716648, 1) ,(3, -1596429048, 3)
,(3, -1593829848, 5) ,(3, -1589860800, 4)
,(3, -1542427200, 5) ,(3, -1539493200, 6)
,(3, -1525323600, 5) ,(3, -1522728000, 4)
,(3, -1491188400, 7) ,(3, -1247536800, 4)
,(3, 354920400, 5) ,(3, 370728000, 4)
,(3, 386456400, 5) ,(3, 402264000, 4)
,(3, 417992400, 5) ,(3, 433800000, 4)
,(3, 449614800, 5) ,(3, 465346800, 8)
,(3, 481071600, 9) ,(3, 496796400, 8)
,(3, 512521200, 9) ,(3, 528246000, 8)
,(3, 543970800, 9) ,(3, 559695600, 8)
,(3, 575420400, 9) ,(3, 591145200, 8)
,(3, 606870000, 9) ,(3, 622594800, 8)
,(3, 638319600, 9) ,(3, 654649200, 8)
,(3, 670374000, 10) ,(3, 686102400, 11)
,(3, 695779200, 8) ,(3, 701812800, 5)
,(3, 717534000, 4) ,(3, 733273200, 9)
,(3, 748998000, 8) ,(3, 764722800, 9)
,(3, 780447600, 8) ,(3, 796172400, 9)
,(3, 811897200, 8) ,(3, 828226800, 9)
,(3, 846370800, 8) ,(3, 859676400, 9)
,(3, 877820400, 8) ,(3, 891126000, 9)
,(3, 909270000, 8) ,(3, 922575600, 9)
,(3, 941324400, 8) ,(3, 954025200, 9)
,(3, 972774000, 8) ,(3, 985474800, 9)
,(3, 1004223600, 8) ,(3, 1017529200, 9)
,(3, 1035673200, 8) ,(3, 1048978800, 9)
,(3, 1067122800, 8) ,(3, 1080428400, 9)
,(3, 1099177200, 8) ,(3, 1111878000, 9)
,(3, 1130626800, 8) ,(3, 1143327600, 9)
,(3, 1162076400, 8) ,(3, 1174777200, 9)
,(3, 1193526000, 8) ,(3, 1206831600, 9)
,(3, 1224975600, 8) ,(3, 1238281200, 9)
,(3, 1256425200, 8) ,(3, 1269730800, 9)
,(3, 1288479600, 8) ,(3, 1301180400, 9)
,(3, 1319929200, 8) ,(3, 1332630000, 9)
,(3, 1351378800, 8) ,(3, 1364684400, 9)
,(3, 1382828400, 8) ,(3, 1396134000, 9)
,(3, 1414278000, 8) ,(3, 1427583600, 9)
,(3, 1445727600, 8) ,(3, 1459033200, 9)
,(3, 1477782000, 8) ,(3, 1490482800, 9)
,(3, 1509231600, 8) ,(3, 1521932400, 9)
,(3, 1540681200, 8) ,(3, 1553986800, 9)
,(3, 1572130800, 8) ,(3, 1585436400, 9)
,(3, 1603580400, 8) ,(3, 1616886000, 9)
,(3, 1635634800, 8) ,(3, 1648335600, 9)
,(3, 1667084400, 8) ,(3, 1679785200, 9)
,(3, 1698534000, 8) ,(3, 1711839600, 9)
,(3, 1729983600, 8) ,(3, 1743289200, 9)
,(3, 1761433200, 8) ,(3, 1774738800, 9)
,(3, 1792882800, 8) ,(3, 1806188400, 9)
,(3, 1824937200, 8) ,(3, 1837638000, 9)
,(3, 1856386800, 8) ,(3, 1869087600, 9)
,(3, 1887836400, 8) ,(3, 1901142000, 9)
,(3, 1919286000, 8) ,(3, 1932591600, 9)
,(3, 1950735600, 8) ,(3, 1964041200, 9)
,(3, 1982790000, 8) ,(3, 1995490800, 9)
,(3, 2014239600, 8) ,(3, 2026940400, 9)
,(3, 2045689200, 8) ,(3, 2058390000, 9)
,(3, 2077138800, 8) ,(3, 2090444400, 9)
,(3, 2108588400, 8) ,(3, 2121894000, 9)
,(3, 2140038000, 8)
,(4, -1688265000, 2) ,(4, -1656819048, 1)
,(4, -1641353448, 2) ,(4, -1627965048, 3)
,(4, -1618716648, 1) ,(4, -1596429048, 3)
,(4, -1593829848, 5) ,(4, -1589860800, 4)
,(4, -1542427200, 5) ,(4, -1539493200, 6)
,(4, -1525323600, 5) ,(4, -1522728000, 4)
,(4, -1491188400, 7) ,(4, -1247536800, 4)
,(4, 354920409, 5) ,(4, 370728010, 4)
,(4, 386456410, 5) ,(4, 402264011, 4)
,(4, 417992411, 5) ,(4, 433800012, 4)
,(4, 449614812, 5) ,(4, 465346812, 8)
,(4, 481071612, 9) ,(4, 496796413, 8)
,(4, 512521213, 9) ,(4, 528246013, 8)
,(4, 543970813, 9) ,(4, 559695613, 8)
,(4, 575420414, 9) ,(4, 591145214, 8)
,(4, 606870014, 9) ,(4, 622594814, 8)
,(4, 638319615, 9) ,(4, 654649215, 8)
,(4, 670374016, 10) ,(4, 686102416, 11)
,(4, 695779216, 8) ,(4, 701812816, 5)
,(4, 717534017, 4) ,(4, 733273217, 9)
,(4, 748998018, 8) ,(4, 764722818, 9)
,(4, 780447619, 8) ,(4, 796172419, 9)
,(4, 811897219, 8) ,(4, 828226820, 9)
,(4, 846370820, 8) ,(4, 859676420, 9)
,(4, 877820421, 8) ,(4, 891126021, 9)
,(4, 909270021, 8) ,(4, 922575622, 9)
,(4, 941324422, 8) ,(4, 954025222, 9)
,(4, 972774022, 8) ,(4, 985474822, 9)
,(4, 1004223622, 8) ,(4, 1017529222, 9)
,(4, 1035673222, 8) ,(4, 1048978822, 9)
,(4, 1067122822, 8) ,(4, 1080428422, 9)
,(4, 1099177222, 8) ,(4, 1111878022, 9)
,(4, 1130626822, 8) ,(4, 1143327622, 9)
,(4, 1162076422, 8) ,(4, 1174777222, 9)
,(4, 1193526022, 8) ,(4, 1206831622, 9)
,(4, 1224975622, 8) ,(4, 1238281222, 9)
,(4, 1256425222, 8) ,(4, 1269730822, 9)
,(4, 1288479622, 8) ,(4, 1301180422, 9)
,(4, 1319929222, 8) ,(4, 1332630022, 9)
,(4, 1351378822, 8) ,(4, 1364684422, 9)
,(4, 1382828422, 8) ,(4, 1396134022, 9)
,(4, 1414278022, 8) ,(4, 1427583622, 9)
,(4, 1445727622, 8) ,(4, 1459033222, 9)
,(4, 1477782022, 8) ,(4, 1490482822, 9)
,(4, 1509231622, 8) ,(4, 1521932422, 9)
,(4, 1540681222, 8) ,(4, 1553986822, 9)
,(4, 1572130822, 8) ,(4, 1585436422, 9)
,(4, 1603580422, 8) ,(4, 1616886022, 9)
,(4, 1635634822, 8) ,(4, 1648335622, 9)
,(4, 1667084422, 8) ,(4, 1679785222, 9)
,(4, 1698534022, 8) ,(4, 1711839622, 9)
,(4, 1729983622, 8) ,(4, 1743289222, 9)
,(4, 1761433222, 8) ,(4, 1774738822, 9)
,(4, 1792882822, 8) ,(4, 1806188422, 9)
,(4, 1824937222, 8) ,(4, 1837638022, 9)
,(4, 1856386822, 8) ,(4, 1869087622, 9)
,(4, 1887836422, 8) ,(4, 1901142022, 9)
,(4, 1919286022, 8) ,(4, 1932591622, 9)
,(4, 1950735622, 8) ,(4, 1964041222, 9)
,(4, 1982790022, 8) ,(4, 1995490822, 9)
,(4, 2014239622, 8) ,(4, 2026940422, 9)
,(4, 2045689222, 8) ,(4, 2058390022, 9)
,(4, 2077138822, 8) ,(4, 2090444422, 9)
,(4, 2108588422, 8) ,(4, 2121894022, 9)
,(4, 2140038022, 8)
,(5, -1009875600, 1);
CREATE TABLE time_zone_transition_type (
Time_zone_id int unsigned NOT NULL,
Transition_type_id int unsigned NOT NULL,
Offset int signed DEFAULT 0 NOT NULL,
Is_DST tinyint unsigned DEFAULT 0 NOT NULL,
Abbreviation char(8) DEFAULT '' NOT NULL,
PRIMARY KEY TzIdTrTId (Time_zone_id, Transition_type_id)
) engine=MyISAM
CHARACTER SET utf8
comment='Time zone transition types';
INSERT INTO time_zone_transition_type (
Time_zone_id,Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
(1, 0, 7200, 1, 'MEST') ,(1, 1, 3600, 0, 'MET')
,(1, 2, 7200, 1, 'MEST') ,(1, 3, 3600, 0, 'MET')
,(2, 0, 0, 0, 'UTC')
,(3, 0, 9000, 0, 'MMT') ,(3, 1, 12648, 1, 'MST')
,(3, 2, 9048, 0, 'MMT') ,(3, 3, 16248, 1, 'MDST')
,(3, 4, 10800, 0, 'MSK') ,(3, 5, 14400, 1, 'MSD')
,(3, 6, 18000, 1, 'MSD') ,(3, 7, 7200, 0, 'EET')
,(3, 8, 10800, 0, 'MSK') ,(3, 9, 14400, 1, 'MSD')
,(3, 10, 10800, 1, 'EEST') ,(3, 11, 7200, 0, 'EET')
,(4, 0, 9000, 0, 'MMT') ,(4, 1, 12648, 1, 'MST')
,(4, 2, 9048, 0, 'MMT') ,(4, 3, 16248, 1, 'MDST')
,(4, 4, 10800, 0, 'MSK') ,(4, 5, 14400, 1, 'MSD')
,(4, 6, 18000, 1, 'MSD') ,(4, 7, 7200, 0, 'EET')
,(4, 8, 10800, 0, 'MSK') ,(4, 9, 14400, 1, 'MSD')
,(4, 10, 10800, 1, 'EEST') ,(4, 11, 7200, 0, 'EET')
,(5, 0, 32400, 0, 'CJT') ,(5, 1, 32400, 0, 'JST');
CREATE TABLE time_zone_leap_second (
Transition_time bigint signed NOT NULL,
Correction int signed NOT NULL,
PRIMARY KEY TranTime (Transition_time)
) engine=MyISAM
CHARACTER SET utf8
comment='Leap seconds information for time zones';
INSERT INTO time_zone_leap_second (
Transition_time, Correction) VALUES
(78796800, 1) ,(94694401, 2) ,(126230402, 3)
,(157766403, 4) ,(189302404, 5) ,(220924805, 6)
,(252460806, 7) ,(283996807, 8) ,(315532808, 9)
,(362793609, 10) ,(394329610, 11) ,(425865611, 12)
,(489024012, 13) ,(567993613, 14) ,(631152014, 15)
,(662688015, 16) ,(709948816, 17) ,(741484817, 18)
,(773020818, 19) ,(820454419, 20) ,(867715220, 21)
,(915148821, 22);
...@@ -8,6 +8,7 @@ use strict; ...@@ -8,6 +8,7 @@ use strict;
sub mtr_full_hostname (); sub mtr_full_hostname ();
sub mtr_short_hostname (); sub mtr_short_hostname ();
sub mtr_native_path($);
sub mtr_init_args ($); sub mtr_init_args ($);
sub mtr_add_arg ($$@); sub mtr_add_arg ($$@);
sub mtr_path_exists(@); sub mtr_path_exists(@);
...@@ -49,6 +50,22 @@ sub mtr_short_hostname () { ...@@ -49,6 +50,22 @@ sub mtr_short_hostname () {
return $hostname; return $hostname;
} }
# Convert path to OS native format
sub mtr_native_path($)
{
my $path= shift;
# MySQL version before 5.0 still use cygwin, no need
# to convert path
return $path
if ($::mysql_version_id < 50000);
$path=~ s/\//\\/g
if ($::glob_win32);
return $path;
}
# FIXME move to own lib # FIXME move to own lib
sub mtr_init_args ($) { sub mtr_init_args ($) {
......
...@@ -8,7 +8,7 @@ use Socket; ...@@ -8,7 +8,7 @@ use Socket;
use Errno; use Errno;
use strict; use strict;
use POSIX 'WNOHANG'; use POSIX qw(WNOHANG SIGHUP);
sub mtr_run ($$$$$$;$); sub mtr_run ($$$$$$;$);
sub mtr_spawn ($$$$$$;$); sub mtr_spawn ($$$$$$;$);
...@@ -125,19 +125,18 @@ sub spawn_impl ($$$$$$$$) { ...@@ -125,19 +125,18 @@ sub spawn_impl ($$$$$$$$) {
{ {
if ( $! == $!{EAGAIN} ) # See "perldoc Errno" if ( $! == $!{EAGAIN} ) # See "perldoc Errno"
{ {
mtr_debug("Got EAGAIN from fork(), sleep 1 second and redo"); mtr_warning("Got EAGAIN from fork(), sleep 1 second and redo");
sleep(1); sleep(1);
redo FORK; redo FORK;
} }
else
{ mtr_error("$path ($pid) can't be forked, error: $!");
mtr_error("$path ($pid) can't be forked");
}
} }
if ( $pid ) if ( $pid )
{ {
spawn_parent_impl($pid,$mode,$path); return spawn_parent_impl($pid,$mode,$path);
} }
else else
{ {
...@@ -202,8 +201,11 @@ sub spawn_impl ($$$$$$$$) { ...@@ -202,8 +201,11 @@ sub spawn_impl ($$$$$$$$) {
{ {
mtr_child_error("failed to execute \"$path\": $!"); mtr_child_error("failed to execute \"$path\": $!");
} }
mtr_error("Should never come here 1!");
} }
mtr_error("Should never come here 2!");
} }
mtr_error("Should never come here 3!");
} }
...@@ -216,12 +218,21 @@ sub spawn_parent_impl { ...@@ -216,12 +218,21 @@ sub spawn_parent_impl {
{ {
if ( $mode eq 'run' ) if ( $mode eq 'run' )
{ {
# Simple run of command, we wait for it to return # Simple run of command, wait blocking for it to return
my $ret_pid= waitpid($pid,0); my $ret_pid= waitpid($pid,0);
if ( $ret_pid != $pid ) if ( $ret_pid != $pid )
{ {
mtr_error("waitpid($pid, 0) returned $ret_pid " . # The "simple" waitpid has failed, print debug info
"when waiting for '$path'"); # and try to handle the error
mtr_warning("waitpid($pid, 0) returned $ret_pid " .
"when waiting for '$path', error: '$!'");
if ( $ret_pid == -1 )
{
# waitpid returned -1, that would indicate the process
# no longer exist and waitpid couldn't wait for it.
return 1;
}
mtr_error("Error handling failed");
} }
return mtr_process_exit_status($?); return mtr_process_exit_status($?);
...@@ -1089,12 +1100,6 @@ sub mtr_kill_processes ($) { ...@@ -1089,12 +1100,6 @@ sub mtr_kill_processes ($) {
# #
############################################################################## ##############################################################################
# FIXME something is wrong, we sometimes terminate with "Hangup" written
# to tty, and no STDERR output telling us why.
# FIXME for some reason, setting HUP to 'IGNORE' will cause exit() to
# write out "Hangup", and maybe loose some output. We insert a sleep...
sub mtr_exit ($) { sub mtr_exit ($) {
my $code= shift; my $code= shift;
mtr_timer_stop_all($::glob_timers); mtr_timer_stop_all($::glob_timers);
...@@ -1106,7 +1111,7 @@ sub mtr_exit ($) { ...@@ -1106,7 +1111,7 @@ sub mtr_exit ($) {
# set ourselves as the group leader at startup (with # set ourselves as the group leader at startup (with
# POSIX::setpgrp(0,0)), but then care must be needed to always do # POSIX::setpgrp(0,0)), but then care must be needed to always do
# proper child process cleanup. # proper child process cleanup.
kill('HUP', -$$) if !$::glob_win32_perl and $$ == getpgrp(); POSIX::kill(SIGHUP, -$$) if !$::glob_win32_perl and $$ == getpgrp();
exit($code); exit($code);
} }
......
...@@ -347,6 +347,7 @@ sub stop_all_servers (); ...@@ -347,6 +347,7 @@ sub stop_all_servers ();
sub run_mysqltest ($); sub run_mysqltest ($);
sub usage ($); sub usage ($);
###################################################################### ######################################################################
# #
# Main program # Main program
...@@ -1518,7 +1519,8 @@ sub executable_setup () { ...@@ -1518,7 +1519,8 @@ sub executable_setup () {
sub generate_cmdline_mysqldump ($) { sub generate_cmdline_mysqldump ($) {
my($mysqld) = @_; my($mysqld) = @_;
return return
"$exe_mysqldump --no-defaults -uroot " . mtr_native_path($exe_mysqldump) .
" --no-defaults -uroot " .
"--port=$mysqld->{'port'} " . "--port=$mysqld->{'port'} " .
"--socket=$mysqld->{'path_sock'} --password="; "--socket=$mysqld->{'path_sock'} --password=";
} }
...@@ -1624,7 +1626,7 @@ sub environment_setup () { ...@@ -1624,7 +1626,7 @@ sub environment_setup () {
my $deb_version; my $deb_version;
if ( $opt_valgrind and -d $debug_libraries_path and if ( $opt_valgrind and -d $debug_libraries_path and
(! -e '/etc/debian_version' or (! -e '/etc/debian_version' or
($deb_version= mtr_grab_file('/etc/debian_version')) == 0 or ($deb_version= mtr_grab_file('/etc/debian_version')) !~ /^[0-9]+\.[0-9]$/ or
$deb_version > 3.1 ) ) $deb_version > 3.1 ) )
{ {
push(@ld_library_paths, $debug_libraries_path); push(@ld_library_paths, $debug_libraries_path);
...@@ -1721,9 +1723,10 @@ sub environment_setup () { ...@@ -1721,9 +1723,10 @@ sub environment_setup () {
# Setup env so childs can execute mysqlcheck # Setup env so childs can execute mysqlcheck
# ---------------------------------------------------- # ----------------------------------------------------
my $cmdline_mysqlcheck= my $cmdline_mysqlcheck=
"$exe_mysqlcheck --no-defaults -uroot " . mtr_native_path($exe_mysqlcheck) .
"--port=$master->[0]->{'port'} " . " --no-defaults -uroot " .
"--socket=$master->[0]->{'path_sock'} --password="; "--port=$master->[0]->{'port'} " .
"--socket=$master->[0]->{'path_sock'} --password=";
if ( $opt_debug ) if ( $opt_debug )
{ {
...@@ -1755,7 +1758,8 @@ sub environment_setup () { ...@@ -1755,7 +1758,8 @@ sub environment_setup () {
if ( $exe_mysqlslap ) if ( $exe_mysqlslap )
{ {
my $cmdline_mysqlslap= my $cmdline_mysqlslap=
"$exe_mysqlslap -uroot " . mtr_native_path($exe_mysqlslap) .
" -uroot " .
"--port=$master->[0]->{'port'} " . "--port=$master->[0]->{'port'} " .
"--socket=$master->[0]->{'path_sock'} --password= " . "--socket=$master->[0]->{'path_sock'} --password= " .
"--lock-directory=$opt_tmpdir"; "--lock-directory=$opt_tmpdir";
...@@ -1772,7 +1776,8 @@ sub environment_setup () { ...@@ -1772,7 +1776,8 @@ sub environment_setup () {
# Setup env so childs can execute mysqlimport # Setup env so childs can execute mysqlimport
# ---------------------------------------------------- # ----------------------------------------------------
my $cmdline_mysqlimport= my $cmdline_mysqlimport=
"$exe_mysqlimport -uroot " . mtr_native_path($exe_mysqlimport) .
" -uroot " .
"--port=$master->[0]->{'port'} " . "--port=$master->[0]->{'port'} " .
"--socket=$master->[0]->{'path_sock'} --password="; "--socket=$master->[0]->{'path_sock'} --password=";
...@@ -1788,7 +1793,8 @@ sub environment_setup () { ...@@ -1788,7 +1793,8 @@ sub environment_setup () {
# Setup env so childs can execute mysqlshow # Setup env so childs can execute mysqlshow
# ---------------------------------------------------- # ----------------------------------------------------
my $cmdline_mysqlshow= my $cmdline_mysqlshow=
"$exe_mysqlshow -uroot " . mtr_native_path($exe_mysqlshow) .
" -uroot " .
"--port=$master->[0]->{'port'} " . "--port=$master->[0]->{'port'} " .
"--socket=$master->[0]->{'path_sock'} --password="; "--socket=$master->[0]->{'path_sock'} --password=";
...@@ -1803,7 +1809,7 @@ sub environment_setup () { ...@@ -1803,7 +1809,7 @@ sub environment_setup () {
# Setup env so childs can execute mysqlbinlog # Setup env so childs can execute mysqlbinlog
# ---------------------------------------------------- # ----------------------------------------------------
my $cmdline_mysqlbinlog= my $cmdline_mysqlbinlog=
"$exe_mysqlbinlog" . mtr_native_path($exe_mysqlbinlog) .
" --no-defaults --local-load=$opt_tmpdir"; " --no-defaults --local-load=$opt_tmpdir";
if ( $mysql_version_id >= 50000 ) if ( $mysql_version_id >= 50000 )
{ {
...@@ -1821,7 +1827,8 @@ sub environment_setup () { ...@@ -1821,7 +1827,8 @@ sub environment_setup () {
# Setup env so childs can execute mysql # Setup env so childs can execute mysql
# ---------------------------------------------------- # ----------------------------------------------------
my $cmdline_mysql= my $cmdline_mysql=
"$exe_mysql --no-defaults --host=localhost --user=root --password= " . mtr_native_path($exe_mysql) .
" --no-defaults --host=localhost --user=root --password= " .
"--port=$master->[0]->{'port'} " . "--port=$master->[0]->{'port'} " .
"--socket=$master->[0]->{'path_sock'} ". "--socket=$master->[0]->{'path_sock'} ".
"--character-sets-dir=$path_charsetsdir"; "--character-sets-dir=$path_charsetsdir";
...@@ -1850,17 +1857,17 @@ sub environment_setup () { ...@@ -1850,17 +1857,17 @@ sub environment_setup () {
# ---------------------------------------------------- # ----------------------------------------------------
# Setup env so childs can execute my_print_defaults # Setup env so childs can execute my_print_defaults
# ---------------------------------------------------- # ----------------------------------------------------
$ENV{'MYSQL_MY_PRINT_DEFAULTS'}= $exe_my_print_defaults; $ENV{'MYSQL_MY_PRINT_DEFAULTS'}= mtr_native_path($exe_my_print_defaults);
# ---------------------------------------------------- # ----------------------------------------------------
# Setup env so childs can execute mysqladmin # Setup env so childs can execute mysqladmin
# ---------------------------------------------------- # ----------------------------------------------------
$ENV{'MYSQLADMIN'}= $exe_mysqladmin; $ENV{'MYSQLADMIN'}= mtr_native_path($exe_mysqladmin);
# ---------------------------------------------------- # ----------------------------------------------------
# Setup env so childs can execute perror # Setup env so childs can execute perror
# ---------------------------------------------------- # ----------------------------------------------------
$ENV{'MY_PERROR'}= $exe_perror; $ENV{'MY_PERROR'}= mtr_native_path($exe_perror);
# ---------------------------------------------------- # ----------------------------------------------------
# Add the path where mysqld will find udf_example.so # Add the path where mysqld will find udf_example.so
...@@ -2018,6 +2025,16 @@ sub remove_stale_vardir () { ...@@ -2018,6 +2025,16 @@ sub remove_stale_vardir () {
mtr_verbose("Removing $opt_vardir/"); mtr_verbose("Removing $opt_vardir/");
rmtree("$opt_vardir/"); rmtree("$opt_vardir/");
} }
if ( $opt_mem )
{
# A symlink from var/ to $opt_mem will be set up
# remove the $opt_mem dir to assure the symlink
# won't point at an old directory
mtr_verbose("Removing $opt_mem");
rmtree($opt_mem);
}
} }
else else
{ {
...@@ -3634,7 +3651,7 @@ sub mysqld_arguments ($$$$$) { ...@@ -3634,7 +3651,7 @@ sub mysqld_arguments ($$$$$) {
if ( $mysql_version_id <= 50106 ) if ( $mysql_version_id <= 50106 )
{ {
# Force mysqld to use log files up until 5.1.6 # Force mysqld to use log files up until 5.1.6
mtr_add_arg($args, "%s--log=%s", $prefix, $master->[0]->{'path_mylog'}); mtr_add_arg($args, "%s--log=%s", $prefix, $slave->[0]->{'path_mylog'});
} }
else else
{ {
...@@ -4516,7 +4533,8 @@ sub run_mysqltest ($) { ...@@ -4516,7 +4533,8 @@ sub run_mysqltest ($) {
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# export MYSQL_TEST variable containing <path>/mysqltest <args> # export MYSQL_TEST variable containing <path>/mysqltest <args>
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
$ENV{'MYSQL_TEST'}= "$exe_mysqltest " . join(" ", @$args); $ENV{'MYSQL_TEST'}=
mtr_native_path($exe_mysqltest) . " " . join(" ", @$args);
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
# Add arguments that should not go into the MYSQL_TEST env var # Add arguments that should not go into the MYSQL_TEST env var
......
...@@ -229,9 +229,7 @@ a ...@@ -229,9 +229,7 @@ a
10000 10000
select microsecond(19971231235959.01) as a; select microsecond(19971231235959.01) as a;
a a
0 10000
Warnings:
Warning 1292 Truncated incorrect time value: '19971231235959.01'
select date_add("1997-12-31",INTERVAL "10.09" SECOND_MICROSECOND) as a; select date_add("1997-12-31",INTERVAL "10.09" SECOND_MICROSECOND) as a;
a a
1997-12-31 00:00:10.090000 1997-12-31 00:00:10.090000
......
...@@ -854,4 +854,8 @@ H ...@@ -854,4 +854,8 @@ H
select last_day('0000-00-00'); select last_day('0000-00-00');
last_day('0000-00-00') last_day('0000-00-00')
NULL NULL
select isnull(week(now() + 0)), isnull(week(now() + 0.2)),
week(20061108), week(20061108.01), week(20061108085411.000002);
isnull(week(now() + 0)) isnull(week(now() + 0.2)) week(20061108) week(20061108.01) week(20061108085411.000002)
0 0 45 45 45
End of 4.1 tests End of 4.1 tests
...@@ -578,7 +578,7 @@ create table t1 select POINT(1,3); ...@@ -578,7 +578,7 @@ create table t1 select POINT(1,3);
show create table t1; show create table t1;
Table Create Table Table Create Table
t1 CREATE TABLE `t1` ( t1 CREATE TABLE `t1` (
`POINT(1,3)` longblob NOT NULL `POINT(1,3)` longblob
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
CREATE TABLE `t1` (`object_id` bigint(20) unsigned NOT NULL default '0', `geo` CREATE TABLE `t1` (`object_id` bigint(20) unsigned NOT NULL default '0', `geo`
...@@ -677,3 +677,45 @@ load data infile '../../std_data/bad_gis_data.dat' into table t1; ...@@ -677,3 +677,45 @@ load data infile '../../std_data/bad_gis_data.dat' into table t1;
ERROR 01000: Data truncated; NULL supplied to NOT NULL column 'b' at row 1 ERROR 01000: Data truncated; NULL supplied to NOT NULL column 'b' at row 1
alter table t1 enable keys; alter table t1 enable keys;
drop table t1; drop table t1;
create table t1 (a int, b blob);
insert into t1 values (1, ''), (2, NULL), (3, '1');
select * from t1;
a b
1
2 NULL
3 1
select
geometryfromtext(b) IS NULL, geometryfromwkb(b) IS NULL, astext(b) IS NULL,
aswkb(b) IS NULL, geometrytype(b) IS NULL, centroid(b) IS NULL,
envelope(b) IS NULL, startpoint(b) IS NULL, endpoint(b) IS NULL,
exteriorring(b) IS NULL, pointn(b, 1) IS NULL, geometryn(b, 1) IS NULL,
interiorringn(b, 1) IS NULL, multipoint(b) IS NULL, isempty(b) IS NULL,
issimple(b) IS NULL, isclosed(b) IS NULL, dimension(b) IS NULL,
numgeometries(b) IS NULL, numinteriorrings(b) IS NULL, numpoints(b) IS NULL,
area(b) IS NULL, glength(b) IS NULL, srid(b) IS NULL, x(b) IS NULL,
y(b) IS NULL
from t1;
geometryfromtext(b) IS NULL geometryfromwkb(b) IS NULL astext(b) IS NULL aswkb(b) IS NULL geometrytype(b) IS NULL centroid(b) IS NULL envelope(b) IS NULL startpoint(b) IS NULL endpoint(b) IS NULL exteriorring(b) IS NULL pointn(b, 1) IS NULL geometryn(b, 1) IS NULL interiorringn(b, 1) IS NULL multipoint(b) IS NULL isempty(b) IS NULL issimple(b) IS NULL isclosed(b) IS NULL dimension(b) IS NULL numgeometries(b) IS NULL numinteriorrings(b) IS NULL numpoints(b) IS NULL area(b) IS NULL glength(b) IS NULL srid(b) IS NULL x(b) IS NULL y(b) IS NULL
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
select
within(b, b) IS NULL, contains(b, b) IS NULL, overlaps(b, b) IS NULL,
equals(b, b) IS NULL, disjoint(b, b) IS NULL, touches(b, b) IS NULL,
intersects(b, b) IS NULL, crosses(b, b) IS NULL
from t1;
within(b, b) IS NULL contains(b, b) IS NULL overlaps(b, b) IS NULL equals(b, b) IS NULL disjoint(b, b) IS NULL touches(b, b) IS NULL intersects(b, b) IS NULL crosses(b, b) IS NULL
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
select
point(b, b) IS NULL, linestring(b) IS NULL, polygon(b) IS NULL, multipoint(b) IS NULL,
multilinestring(b) IS NULL, multipolygon(b) IS NULL,
geometrycollection(b) IS NULL
from t1;
point(b, b) IS NULL linestring(b) IS NULL polygon(b) IS NULL multipoint(b) IS NULL multilinestring(b) IS NULL multipolygon(b) IS NULL geometrycollection(b) IS NULL
0 1 1 1 1 1 1
1 1 1 1 1 1 1
0 1 1 1 1 1 1
drop table t1;
End of 4.1 tests
...@@ -210,7 +210,6 @@ source database ...@@ -210,7 +210,6 @@ source database
"MySQL: The world's most popular ;open source database" "MySQL: The world's most popular ;open source database"
echo message echo message echo message echo message
mysqltest: At line 1: Empty variable
mysqltest: At line 1: command "false" failed mysqltest: At line 1: command "false" failed
mysqltest: At line 1: Missing argument in exec mysqltest: At line 1: Missing argument in exec
MySQL MySQL
...@@ -507,8 +506,10 @@ drop table t1; ...@@ -507,8 +506,10 @@ drop table t1;
mysqltest: At line 1: Missing required argument 'filename' to command 'remove_file' mysqltest: At line 1: Missing required argument 'filename' to command 'remove_file'
mysqltest: At line 1: Missing required argument 'filename' to command 'write_file' mysqltest: At line 1: Missing required argument 'filename' to command 'write_file'
mysqltest: At line 1: End of file encountered before 'EOF' delimiter was found mysqltest: At line 1: End of file encountered before 'EOF' delimiter was found
mysqltest: At line 1: End of line junk detected: "write_file filename "; Some data
" for cat_file command
of mysqltest
mysqltest: At line 1: Failed to open file non_existing_file
mysqltest: At line 1: Missing required argument 'filename' to command 'file_exists' mysqltest: At line 1: Missing required argument 'filename' to command 'file_exists'
mysqltest: At line 1: Missing required argument 'from_file' to command 'copy_file' mysqltest: At line 1: Missing required argument 'from_file' to command 'copy_file'
mysqltest: At line 1: Missing required argument 'to_file' to command 'copy_file' mysqltest: At line 1: Missing required argument 'to_file' to command 'copy_file'
......
...@@ -847,6 +847,30 @@ num (select num + 2 FROM t1 LIMIT 1) ...@@ -847,6 +847,30 @@ num (select num + 2 FROM t1 LIMIT 1)
SELECT a.a + 1 AS num FROM t1 a JOIN t1 b ON num = b.a; SELECT a.a + 1 AS num FROM t1 a JOIN t1 b ON num = b.a;
ERROR 42S22: Unknown column 'num' in 'on clause' ERROR 42S22: Unknown column 'num' in 'on clause'
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE bug25126 (
val int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY
);
UPDATE bug25126 SET MissingCol = MissingCol;
ERROR 42S22: Unknown column 'MissingCol' in 'field list'
UPDATE bug25126 SET val = val ORDER BY MissingCol;
ERROR 42S22: Unknown column 'MissingCol' in 'order clause'
UPDATE bug25126 SET val = val ORDER BY val;
UPDATE bug25126 SET val = 1 ORDER BY val;
UPDATE bug25126 SET val = 1 ORDER BY MissingCol;
ERROR 42S22: Unknown column 'MissingCol' in 'order clause'
UPDATE bug25126 SET val = 1 ORDER BY val, MissingCol;
ERROR 42S22: Unknown column 'MissingCol' in 'order clause'
UPDATE bug25126 SET val = MissingCol ORDER BY MissingCol;
ERROR 42S22: Unknown column 'MissingCol' in 'order clause'
UPDATE bug25126 SET MissingCol = 1 ORDER BY val, MissingCol;
ERROR 42S22: Unknown column 'MissingCol' in 'order clause'
UPDATE bug25126 SET MissingCol = 1 ORDER BY MissingCol;
ERROR 42S22: Unknown column 'MissingCol' in 'order clause'
UPDATE bug25126 SET MissingCol = val ORDER BY MissingCol;
ERROR 42S22: Unknown column 'MissingCol' in 'order clause'
UPDATE bug25126 SET MissingCol = MissingCol ORDER BY MissingCol;
ERROR 42S22: Unknown column 'MissingCol' in 'order clause'
DROP TABLE bug25126;
CREATE TABLE t1 (a int); CREATE TABLE t1 (a int);
SELECT p.a AS val, q.a AS val1 FROM t1 p, t1 q ORDER BY val > 1; SELECT p.a AS val, q.a AS val1 FROM t1 p, t1 q ORDER BY val > 1;
val val1 val val1
......
...@@ -492,4 +492,11 @@ union ...@@ -492,4 +492,11 @@ union
select last_day('0000-00-00'); select last_day('0000-00-00');
#
# Bug 23616: datetime functions with double argumets
#
select isnull(week(now() + 0)), isnull(week(now() + 0.2)),
week(20061108), week(20061108.01), week(20061108085411.000002);
--echo End of 4.1 tests --echo End of 4.1 tests
...@@ -377,4 +377,38 @@ load data infile '../../std_data/bad_gis_data.dat' into table t1; ...@@ -377,4 +377,38 @@ load data infile '../../std_data/bad_gis_data.dat' into table t1;
alter table t1 enable keys; alter table t1 enable keys;
drop table t1; drop table t1;
# End of 4.1 tests #
# Bug #26038: is null and bad data
#
create table t1 (a int, b blob);
insert into t1 values (1, ''), (2, NULL), (3, '1');
select * from t1;
select
geometryfromtext(b) IS NULL, geometryfromwkb(b) IS NULL, astext(b) IS NULL,
aswkb(b) IS NULL, geometrytype(b) IS NULL, centroid(b) IS NULL,
envelope(b) IS NULL, startpoint(b) IS NULL, endpoint(b) IS NULL,
exteriorring(b) IS NULL, pointn(b, 1) IS NULL, geometryn(b, 1) IS NULL,
interiorringn(b, 1) IS NULL, multipoint(b) IS NULL, isempty(b) IS NULL,
issimple(b) IS NULL, isclosed(b) IS NULL, dimension(b) IS NULL,
numgeometries(b) IS NULL, numinteriorrings(b) IS NULL, numpoints(b) IS NULL,
area(b) IS NULL, glength(b) IS NULL, srid(b) IS NULL, x(b) IS NULL,
y(b) IS NULL
from t1;
select
within(b, b) IS NULL, contains(b, b) IS NULL, overlaps(b, b) IS NULL,
equals(b, b) IS NULL, disjoint(b, b) IS NULL, touches(b, b) IS NULL,
intersects(b, b) IS NULL, crosses(b, b) IS NULL
from t1;
select
point(b, b) IS NULL, linestring(b) IS NULL, polygon(b) IS NULL, multipoint(b) IS NULL,
multilinestring(b) IS NULL, multipolygon(b) IS NULL,
geometrycollection(b) IS NULL
from t1;
drop table t1;
--echo End of 4.1 tests
...@@ -552,8 +552,8 @@ echo ; ...@@ -552,8 +552,8 @@ echo ;
# Illegal use of echo # Illegal use of echo
--error 1 #--error 1
--exec echo "echo \$;" | $MYSQL_TEST 2>&1 #--exec echo "echo \$;" | $MYSQL_TEST 2>&1
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
...@@ -1469,8 +1469,8 @@ remove_file non_existing_file; ...@@ -1469,8 +1469,8 @@ remove_file non_existing_file;
--error 1 --error 1
--exec echo "write_file filename ;" | $MYSQL_TEST 2>&1 --exec echo "write_file filename ;" | $MYSQL_TEST 2>&1
--error 1 #--error 1
--exec echo "write_file filename \";" | $MYSQL_TEST 2>&1 #--exec echo "write_file filename \";" | $MYSQL_TEST 2>&1
write_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp; write_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
Content for test_file1 Content for test_file1
...@@ -1484,6 +1484,74 @@ END_DELIMITER ...@@ -1484,6 +1484,74 @@ END_DELIMITER
file_exists $MYSQLTEST_VARDIR/tmp/test_file1.tmp; file_exists $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
remove_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp; remove_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
# ----------------------------------------------------------------------------
# test for append_file
# ----------------------------------------------------------------------------
write_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
Content for test_file1
EOF
file_exists $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
append_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
Appended text
EOF
file_exists $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
remove_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
append_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
Appended text on nonexisting file
EOF
# ----------------------------------------------------------------------------
# test for cat_file
# ----------------------------------------------------------------------------
--write_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp
Some data
for cat_file command
of mysqltest
EOF
cat_file $MYSQLTEST_VARDIR/tmp/test_file1.tmp;
--error 1
--exec echo "cat_file non_existing_file;" | $MYSQL_TEST 2>&1
# ----------------------------------------------------------------------------
# test for diff_files
# ----------------------------------------------------------------------------
--write_file $MYSQLTEST_VARDIR/tmp/diff1.tmp
Some data
for diff_file command
of mysqltest
EOF
--write_file $MYSQLTEST_VARDIR/tmp/diff2.tmp
Some data
for diff_file command
of mysqltest
EOF
--write_file $MYSQLTEST_VARDIR/tmp/diff3.tmp
Some other data
for diff_file command
of mysqltest
EOF
# Compare equal files
--diff_files $MYSQLTEST_VARDIR/tmp/diff1.tmp $MYSQLTEST_VARDIR/tmp/diff2.tmp
--diff_files $MYSQLTEST_VARDIR/tmp/diff2.tmp $MYSQLTEST_VARDIR/tmp/diff1.tmp
# Compare files that differ
--error 1
--diff_files $MYSQLTEST_VARDIR/tmp/diff3.tmp $MYSQLTEST_VARDIR/tmp/diff2.tmp
--error 1
--diff_files $MYSQLTEST_VARDIR/tmp/diff1.tmp $MYSQLTEST_VARDIR/tmp/diff3.tmp
# Compare equal files, again...
--diff_files $MYSQLTEST_VARDIR/tmp/diff1.tmp $MYSQLTEST_VARDIR/tmp/diff2.tmp
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
# test for file_exist # test for file_exist
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
......
...@@ -575,6 +575,35 @@ SELECT a + 1 AS num, (select num + 2 FROM t1 LIMIT 1) FROM t1; ...@@ -575,6 +575,35 @@ SELECT a + 1 AS num, (select num + 2 FROM t1 LIMIT 1) FROM t1;
SELECT a.a + 1 AS num FROM t1 a JOIN t1 b ON num = b.a; SELECT a.a + 1 AS num FROM t1 a JOIN t1 b ON num = b.a;
DROP TABLE t1; DROP TABLE t1;
#
# Bug#25126: Reference to non-existant column in UPDATE...ORDER BY...
# crashes server
#
CREATE TABLE bug25126 (
val int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY
);
--error 1054
UPDATE bug25126 SET MissingCol = MissingCol;
--error 1054
UPDATE bug25126 SET val = val ORDER BY MissingCol;
UPDATE bug25126 SET val = val ORDER BY val;
UPDATE bug25126 SET val = 1 ORDER BY val;
--error 1054
UPDATE bug25126 SET val = 1 ORDER BY MissingCol;
--error 1054
UPDATE bug25126 SET val = 1 ORDER BY val, MissingCol;
--error 1054
UPDATE bug25126 SET val = MissingCol ORDER BY MissingCol;
--error 1054
UPDATE bug25126 SET MissingCol = 1 ORDER BY val, MissingCol;
--error 1054
UPDATE bug25126 SET MissingCol = 1 ORDER BY MissingCol;
--error 1054
UPDATE bug25126 SET MissingCol = val ORDER BY MissingCol;
--error 1054
UPDATE bug25126 SET MissingCol = MissingCol ORDER BY MissingCol;
DROP TABLE bug25126;
# #
# Bug #25427: crash when order by expression contains a name # Bug #25427: crash when order by expression contains a name
# that cannot be resolved unambiguously # that cannot be resolved unambiguously
......
...@@ -145,7 +145,7 @@ str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time, ...@@ -145,7 +145,7 @@ str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time,
digits= (uint) (pos-str); digits= (uint) (pos-str);
start_loop= 0; /* Start of scan loop */ start_loop= 0; /* Start of scan loop */
date_len[format_position[0]]= 0; /* Length of year field */ date_len[format_position[0]]= 0; /* Length of year field */
if (pos == end) if (pos == end || *pos == '.')
{ {
/* Found date in internal format (only numbers like YYYYMMDD) */ /* Found date in internal format (only numbers like YYYYMMDD) */
year_length= (digits == 4 || digits == 8 || digits >= 14) ? 4 : 2; year_length= (digits == 4 || digits == 8 || digits >= 14) ? 4 : 2;
......
...@@ -142,7 +142,8 @@ sql_yacc.o: sql_yacc.cc sql_yacc.h $(HEADERS) ...@@ -142,7 +142,8 @@ sql_yacc.o: sql_yacc.cc sql_yacc.h $(HEADERS)
# this avoid the rebuild of the built files in a source dist # this avoid the rebuild of the built files in a source dist
lex_hash.h: gen_lex_hash.cc lex.h lex_hash.h: gen_lex_hash.cc lex.h
$(MAKE) $(AM_MAKEFLAGS) gen_lex_hash$(EXEEXT) $(MAKE) $(AM_MAKEFLAGS) gen_lex_hash$(EXEEXT)
./gen_lex_hash$(EXEEXT) > $@ ./gen_lex_hash$(EXEEXT) > $@-t
$(MV) $@-t $@
# For testing of udf_example.so; Works on platforms with gcc # For testing of udf_example.so; Works on platforms with gcc
# (This is not part of our build process but only provided as an example) # (This is not part of our build process but only provided as an example)
......
...@@ -1774,7 +1774,18 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) ...@@ -1774,7 +1774,18 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref)
use the field from the Item_field in the select list and leave use the field from the Item_field in the select list and leave
the Item_field instance in place. the Item_field instance in place.
*/ */
set_field((*((Item_field**)res))->field);
Field *field= (*((Item_field**)res))->field;
if (field == NULL)
{
/* The column to which we link isn't valid. */
my_error(ER_BAD_FIELD_ERROR, MYF(0), (*res)->name,
current_thd->where);
return(1);
}
set_field(field);
return 0; return 0;
} }
else else
......
...@@ -30,6 +30,7 @@ void Item_geometry_func::fix_length_and_dec() ...@@ -30,6 +30,7 @@ void Item_geometry_func::fix_length_and_dec()
collation.set(&my_charset_bin); collation.set(&my_charset_bin);
decimals=0; decimals=0;
max_length=MAX_BLOB_WIDTH; max_length=MAX_BLOB_WIDTH;
maybe_null= 1;
} }
...@@ -109,6 +110,7 @@ String *Item_func_as_wkt::val_str(String *str) ...@@ -109,6 +110,7 @@ String *Item_func_as_wkt::val_str(String *str)
void Item_func_as_wkt::fix_length_and_dec() void Item_func_as_wkt::fix_length_and_dec()
{ {
max_length=MAX_BLOB_WIDTH; max_length=MAX_BLOB_WIDTH;
maybe_null= 1;
} }
...@@ -356,7 +358,8 @@ String *Item_func_spatial_collection::val_str(String *str) ...@@ -356,7 +358,8 @@ String *Item_func_spatial_collection::val_str(String *str)
for (i= 0; i < arg_count; ++i) for (i= 0; i < arg_count; ++i)
{ {
String *res= args[i]->val_str(&arg_value); String *res= args[i]->val_str(&arg_value);
if (args[i]->null_value) uint32 len;
if (args[i]->null_value || ((len= res->length()) < WKB_HEADER_SIZE))
goto err; goto err;
if (coll_type == Geometry::wkb_geometrycollection) if (coll_type == Geometry::wkb_geometrycollection)
...@@ -365,13 +368,12 @@ String *Item_func_spatial_collection::val_str(String *str) ...@@ -365,13 +368,12 @@ String *Item_func_spatial_collection::val_str(String *str)
In the case of GeometryCollection we don't need any checkings In the case of GeometryCollection we don't need any checkings
for item types, so just copy them into target collection for item types, so just copy them into target collection
*/ */
if (str->append(res->ptr(), res->length(), (uint32) 512)) if (str->append(res->ptr(), len, (uint32) 512))
goto err; goto err;
} }
else else
{ {
enum Geometry::wkbType wkb_type; enum Geometry::wkbType wkb_type;
uint32 len=res->length();
const char *data= res->ptr() + 1; const char *data= res->ptr() + 1;
/* /*
...@@ -379,8 +381,6 @@ String *Item_func_spatial_collection::val_str(String *str) ...@@ -379,8 +381,6 @@ String *Item_func_spatial_collection::val_str(String *str)
are of specific type, let's do this checking now are of specific type, let's do this checking now
*/ */
if (len < 5)
goto err;
wkb_type= (Geometry::wkbType) uint4korr(data); wkb_type= (Geometry::wkbType) uint4korr(data);
data+= 4; data+= 4;
len-= 5; len-= 5;
...@@ -502,9 +502,13 @@ longlong Item_func_spatial_rel::val_int() ...@@ -502,9 +502,13 @@ longlong Item_func_spatial_rel::val_int()
longlong Item_func_isempty::val_int() longlong Item_func_isempty::val_int()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
String tmp; String tmp;
null_value=0; String *swkb= args[0]->val_str(&tmp);
return args[0]->null_value ? 1 : 0; Geometry_buffer buffer;
null_value= args[0]->null_value ||
!(Geometry::construct(&buffer, swkb->ptr(), swkb->length()));
return null_value ? 1 : 0;
} }
...@@ -512,10 +516,11 @@ longlong Item_func_issimple::val_int() ...@@ -512,10 +516,11 @@ longlong Item_func_issimple::val_int()
{ {
DBUG_ASSERT(fixed == 1); DBUG_ASSERT(fixed == 1);
String tmp; String tmp;
String *wkb=args[0]->val_str(&tmp); String *swkb= args[0]->val_str(&tmp);
Geometry_buffer buffer;
if ((null_value= (!wkb || args[0]->null_value)))
return 0; null_value= args[0]->null_value ||
!(Geometry::construct(&buffer, swkb->ptr(), swkb->length()));
/* TODO: Ramil or Holyfoot, add real IsSimple calculation */ /* TODO: Ramil or Holyfoot, add real IsSimple calculation */
return 0; return 0;
} }
......
...@@ -33,6 +33,7 @@ class Item_geometry_func: public Item_str_func ...@@ -33,6 +33,7 @@ class Item_geometry_func: public Item_str_func
Item_geometry_func(List<Item> &list) :Item_str_func(list) {} Item_geometry_func(List<Item> &list) :Item_str_func(list) {}
void fix_length_and_dec(); void fix_length_and_dec();
enum_field_types field_type() const { return MYSQL_TYPE_GEOMETRY; } enum_field_types field_type() const { return MYSQL_TYPE_GEOMETRY; }
bool is_null() { (void) val_int(); return null_value; }
}; };
class Item_func_geometry_from_text: public Item_geometry_func class Item_func_geometry_from_text: public Item_geometry_func
...@@ -80,6 +81,7 @@ class Item_func_geometry_type: public Item_str_func ...@@ -80,6 +81,7 @@ class Item_func_geometry_type: public Item_str_func
void fix_length_and_dec() void fix_length_and_dec()
{ {
max_length=20; // "GeometryCollection" is the most long max_length=20; // "GeometryCollection" is the most long
maybe_null= 1;
}; };
}; };
...@@ -221,6 +223,8 @@ class Item_func_spatial_rel: public Item_bool_func2 ...@@ -221,6 +223,8 @@ class Item_func_spatial_rel: public Item_bool_func2
} }
} }
void print(String *str) { Item_func::print(str); } void print(String *str) { Item_func::print(str); }
void fix_length_and_dec() { maybe_null= 1; }
bool is_null() { (void) val_int(); return null_value; }
}; };
class Item_func_isempty: public Item_bool_func class Item_func_isempty: public Item_bool_func
...@@ -230,6 +234,7 @@ class Item_func_isempty: public Item_bool_func ...@@ -230,6 +234,7 @@ class Item_func_isempty: public Item_bool_func
longlong val_int(); longlong val_int();
optimize_type select_optimize() const { return OPTIMIZE_NONE; } optimize_type select_optimize() const { return OPTIMIZE_NONE; }
const char *func_name() const { return "isempty"; } const char *func_name() const { return "isempty"; }
void fix_length_and_dec() { maybe_null= 1; }
}; };
class Item_func_issimple: public Item_bool_func class Item_func_issimple: public Item_bool_func
...@@ -239,6 +244,7 @@ class Item_func_issimple: public Item_bool_func ...@@ -239,6 +244,7 @@ class Item_func_issimple: public Item_bool_func
longlong val_int(); longlong val_int();
optimize_type select_optimize() const { return OPTIMIZE_NONE; } optimize_type select_optimize() const { return OPTIMIZE_NONE; }
const char *func_name() const { return "issimple"; } const char *func_name() const { return "issimple"; }
void fix_length_and_dec() { maybe_null= 1; }
}; };
class Item_func_isclosed: public Item_bool_func class Item_func_isclosed: public Item_bool_func
...@@ -248,6 +254,7 @@ class Item_func_isclosed: public Item_bool_func ...@@ -248,6 +254,7 @@ class Item_func_isclosed: public Item_bool_func
longlong val_int(); longlong val_int();
optimize_type select_optimize() const { return OPTIMIZE_NONE; } optimize_type select_optimize() const { return OPTIMIZE_NONE; }
const char *func_name() const { return "isclosed"; } const char *func_name() const { return "isclosed"; }
void fix_length_and_dec() { maybe_null= 1; }
}; };
class Item_func_dimension: public Item_int_func class Item_func_dimension: public Item_int_func
...@@ -257,7 +264,7 @@ class Item_func_dimension: public Item_int_func ...@@ -257,7 +264,7 @@ class Item_func_dimension: public Item_int_func
Item_func_dimension(Item *a): Item_int_func(a) {} Item_func_dimension(Item *a): Item_int_func(a) {}
longlong val_int(); longlong val_int();
const char *func_name() const { return "dimension"; } const char *func_name() const { return "dimension"; }
void fix_length_and_dec() { max_length=10; } void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
}; };
class Item_func_x: public Item_real_func class Item_func_x: public Item_real_func
...@@ -267,6 +274,11 @@ class Item_func_x: public Item_real_func ...@@ -267,6 +274,11 @@ class Item_func_x: public Item_real_func
Item_func_x(Item *a): Item_real_func(a) {} Item_func_x(Item *a): Item_real_func(a) {}
double val(); double val();
const char *func_name() const { return "x"; } const char *func_name() const { return "x"; }
void fix_length_and_dec()
{
Item_real_func::fix_length_and_dec();
maybe_null= 1;
}
}; };
...@@ -277,6 +289,11 @@ class Item_func_y: public Item_real_func ...@@ -277,6 +289,11 @@ class Item_func_y: public Item_real_func
Item_func_y(Item *a): Item_real_func(a) {} Item_func_y(Item *a): Item_real_func(a) {}
double val(); double val();
const char *func_name() const { return "y"; } const char *func_name() const { return "y"; }
void fix_length_and_dec()
{
Item_real_func::fix_length_and_dec();
maybe_null= 1;
}
}; };
...@@ -287,7 +304,7 @@ class Item_func_numgeometries: public Item_int_func ...@@ -287,7 +304,7 @@ class Item_func_numgeometries: public Item_int_func
Item_func_numgeometries(Item *a): Item_int_func(a) {} Item_func_numgeometries(Item *a): Item_int_func(a) {}
longlong val_int(); longlong val_int();
const char *func_name() const { return "numgeometries"; } const char *func_name() const { return "numgeometries"; }
void fix_length_and_dec() { max_length=10; } void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
}; };
...@@ -298,7 +315,7 @@ class Item_func_numinteriorring: public Item_int_func ...@@ -298,7 +315,7 @@ class Item_func_numinteriorring: public Item_int_func
Item_func_numinteriorring(Item *a): Item_int_func(a) {} Item_func_numinteriorring(Item *a): Item_int_func(a) {}
longlong val_int(); longlong val_int();
const char *func_name() const { return "numinteriorrings"; } const char *func_name() const { return "numinteriorrings"; }
void fix_length_and_dec() { max_length=10; } void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
}; };
...@@ -309,7 +326,7 @@ class Item_func_numpoints: public Item_int_func ...@@ -309,7 +326,7 @@ class Item_func_numpoints: public Item_int_func
Item_func_numpoints(Item *a): Item_int_func(a) {} Item_func_numpoints(Item *a): Item_int_func(a) {}
longlong val_int(); longlong val_int();
const char *func_name() const { return "numpoints"; } const char *func_name() const { return "numpoints"; }
void fix_length_and_dec() { max_length=10; } void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
}; };
...@@ -320,6 +337,11 @@ class Item_func_area: public Item_real_func ...@@ -320,6 +337,11 @@ class Item_func_area: public Item_real_func
Item_func_area(Item *a): Item_real_func(a) {} Item_func_area(Item *a): Item_real_func(a) {}
double val(); double val();
const char *func_name() const { return "area"; } const char *func_name() const { return "area"; }
void fix_length_and_dec()
{
Item_real_func::fix_length_and_dec();
maybe_null= 1;
}
}; };
...@@ -330,6 +352,11 @@ class Item_func_glength: public Item_real_func ...@@ -330,6 +352,11 @@ class Item_func_glength: public Item_real_func
Item_func_glength(Item *a): Item_real_func(a) {} Item_func_glength(Item *a): Item_real_func(a) {}
double val(); double val();
const char *func_name() const { return "glength"; } const char *func_name() const { return "glength"; }
void fix_length_and_dec()
{
Item_real_func::fix_length_and_dec();
maybe_null= 1;
}
}; };
...@@ -340,7 +367,7 @@ class Item_func_srid: public Item_int_func ...@@ -340,7 +367,7 @@ class Item_func_srid: public Item_int_func
Item_func_srid(Item *a): Item_int_func(a) {} Item_func_srid(Item *a): Item_int_func(a) {}
longlong val_int(); longlong val_int();
const char *func_name() const { return "srid"; } const char *func_name() const { return "srid"; }
void fix_length_and_dec() { max_length= 10; } void fix_length_and_dec() { max_length= 10; maybe_null= 1; }
}; };
#define GEOM_NEW(obj_constructor) new obj_constructor #define GEOM_NEW(obj_constructor) new obj_constructor
......
...@@ -1933,7 +1933,10 @@ static void check_data_home(const char *path) ...@@ -1933,7 +1933,10 @@ static void check_data_home(const char *path)
extern "C" sig_handler handle_segfault(int sig) extern "C" sig_handler handle_segfault(int sig)
{ {
time_t curr_time;
struct tm tm;
THD *thd=current_thd; THD *thd=current_thd;
/* /*
Strictly speaking, one needs a mutex here Strictly speaking, one needs a mutex here
but since we have got SIGSEGV already, things are a mess but since we have got SIGSEGV already, things are a mess
...@@ -1947,11 +1950,17 @@ extern "C" sig_handler handle_segfault(int sig) ...@@ -1947,11 +1950,17 @@ extern "C" sig_handler handle_segfault(int sig)
} }
segfaulted = 1; segfaulted = 1;
curr_time= time(NULL);
localtime_r(&curr_time, &tm);
fprintf(stderr,"\ fprintf(stderr,"\
mysqld got signal %d;\n\ %02d%02d%02d %2d:%02d:%02d - mysqld got signal %d;\n\
This could be because you hit a bug. It is also possible that this binary\n\ This could be because you hit a bug. It is also possible that this binary\n\
or one of the libraries it was linked against is corrupt, improperly built,\n\ or one of the libraries it was linked against is corrupt, improperly built,\n\
or misconfigured. This error can also be caused by malfunctioning hardware.\n", or misconfigured. This error can also be caused by malfunctioning hardware.\n",
tm.tm_year % 100, tm.tm_mon+1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec,
sig); sig);
fprintf(stderr, "\ fprintf(stderr, "\
We will try our best to scrape up some info that will hopefully help diagnose\n\ We will try our best to scrape up some info that will hopefully help diagnose\n\
......
...@@ -210,23 +210,24 @@ static uint32 wkb_get_uint(const char *ptr, Geometry::wkbByteOrder bo) ...@@ -210,23 +210,24 @@ static uint32 wkb_get_uint(const char *ptr, Geometry::wkbByteOrder bo)
} }
int Geometry::create_from_wkb(Geometry_buffer *buffer, Geometry *Geometry::create_from_wkb(Geometry_buffer *buffer,
const char *wkb, uint32 len, String *res) const char *wkb, uint32 len, String *res)
{ {
uint32 geom_type; uint32 geom_type;
Geometry *geom; Geometry *geom;
if (len < WKB_HEADER_SIZE) if (len < WKB_HEADER_SIZE)
return 1; return NULL;
geom_type= wkb_get_uint(wkb+1, (wkbByteOrder)wkb[0]); geom_type= wkb_get_uint(wkb+1, (wkbByteOrder)wkb[0]);
if (!(geom= create_by_typeid(buffer, (int) geom_type)) || if (!(geom= create_by_typeid(buffer, (int) geom_type)) ||
res->reserve(WKB_HEADER_SIZE, 512)) res->reserve(WKB_HEADER_SIZE, 512))
return 1; return NULL;
res->q_append((char) wkb_ndr); res->q_append((char) wkb_ndr);
res->q_append(geom_type); res->q_append(geom_type);
return geom->init_from_wkb(wkb+WKB_HEADER_SIZE, len - WKB_HEADER_SIZE,
(wkbByteOrder) wkb[0], res); return geom->init_from_wkb(wkb + WKB_HEADER_SIZE, len - WKB_HEADER_SIZE,
(wkbByteOrder) wkb[0], res) ? geom : NULL;
} }
......
...@@ -244,8 +244,8 @@ class Geometry ...@@ -244,8 +244,8 @@ class Geometry
static Geometry *create_from_wkt(Geometry_buffer *buffer, static Geometry *create_from_wkt(Geometry_buffer *buffer,
Gis_read_stream *trs, String *wkt, Gis_read_stream *trs, String *wkt,
bool init_stream=1); bool init_stream=1);
static int create_from_wkb(Geometry_buffer *buffer, static Geometry *create_from_wkb(Geometry_buffer *buffer, const char *wkb,
const char *wkb, uint32 len, String *res); uint32 len, String *res);
int as_wkt(String *wkt, const char **end) int as_wkt(String *wkt, const char **end)
{ {
uint32 len= get_class_info()->m_name.length; uint32 len= get_class_info()->m_name.length;
......
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