Manual merge from mysql-trunk-merge.
Conflicts: - client/mysql.cc - client/mysqldump.c - configure.in - mysql-test/r/csv.result - mysql-test/r/func_time.result - mysql-test/r/show_check.result - mysql-test/r/sp-error.result - mysql-test/r/sp.result - mysql-test/r/sp_trans.result - mysql-test/r/type_blob.result - mysql-test/r/type_timestamp.result - mysql-test/r/warnings.result - mysql-test/suite/rpl/r/rpl_sp.result - sql/mysql_priv.h - sql/mysqld.cc - sql/sp.cc - sql/sql_base.cc - sql/sql_table.cc - sql/sql_trigger.cc - sql/sql_view.cc - sql/table.h - sql/share/errmsg.txt - mysql-test/suite/sys_vars/r/log_bin_trust_routine_creators_basic.result
This commit is contained in:
commit
04b8cb1882
@ -1365,7 +1365,7 @@ static struct my_option my_long_options[] =
|
||||
{"help", 'I', "Synonym for -?", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
|
||||
0, 0, 0, 0, 0},
|
||||
#ifdef __NETWARE__
|
||||
{"autoclose", OPT_AUTO_CLOSE, "Auto close the screen on exit for Netware.",
|
||||
{"autoclose", OPT_AUTO_CLOSE, "Automatically close the screen on exit for Netware.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"auto-rehash", OPT_AUTO_REHASH,
|
||||
@ -1379,15 +1379,15 @@ static struct my_option my_long_options[] =
|
||||
"Automatically switch to vertical output mode if the result is wider than the terminal width.",
|
||||
(uchar**) &auto_vertical_output, (uchar**) &auto_vertical_output, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"batch", 'B',
|
||||
"Don't use history file. Disable interactive behavior. (Enables --silent)", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
"Don't use history file. Disable interactive behavior. (Enables --silent.)", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"character-sets-dir", OPT_CHARSETS_DIR,
|
||||
"Directory where character sets are.", (uchar**) &charsets_dir,
|
||||
"Directory for character set files.", (uchar**) &charsets_dir,
|
||||
(uchar**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"column-type-info", OPT_COLUMN_TYPES, "Display column type information.",
|
||||
(uchar**) &column_types_flag, (uchar**) &column_types_flag,
|
||||
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"comments", 'c', "Preserve comments. Send comments to the server."
|
||||
" The default is --skip-comments (discard comments), enable with --comments",
|
||||
" The default is --skip-comments (discard comments), enable with --comments.",
|
||||
(uchar**) &preserve_comments, (uchar**) &preserve_comments,
|
||||
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"compress", 'C', "Use compression in server/client protocol.",
|
||||
@ -1395,10 +1395,10 @@ static struct my_option my_long_options[] =
|
||||
0, 0, 0},
|
||||
|
||||
#ifdef DBUG_OFF
|
||||
{"debug", '#', "This is a non-debug version. Catch this and exit",
|
||||
{"debug", '#', "This is a non-debug version. Catch this and exit.",
|
||||
0,0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#else
|
||||
{"debug", '#', "Output debug log", (uchar**) &default_dbug_option,
|
||||
{"debug", '#', "Output debug log.", (uchar**) &default_dbug_option,
|
||||
(uchar**) &default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.",
|
||||
@ -1413,12 +1413,12 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"delimiter", OPT_DELIMITER, "Delimiter to be used.", (uchar**) &delimiter_str,
|
||||
(uchar**) &delimiter_str, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"execute", 'e', "Execute command and quit. (Disables --force and history file)", 0,
|
||||
{"execute", 'e', "Execute command and quit. (Disables --force and history file.)", 0,
|
||||
0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"vertical", 'E', "Print the output of a query (rows) vertically.",
|
||||
(uchar**) &vertical, (uchar**) &vertical, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0,
|
||||
0},
|
||||
{"force", 'f', "Continue even if we get an sql error.",
|
||||
{"force", 'f', "Continue even if we get an SQL error.",
|
||||
(uchar**) &ignore_errors, (uchar**) &ignore_errors, 0, GET_BOOL, NO_ARG, 0, 0,
|
||||
0, 0, 0, 0},
|
||||
{"named-commands", 'G',
|
||||
@ -1441,7 +1441,7 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) ¤t_host, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"html", 'H', "Produce HTML output.", (uchar**) &opt_html, (uchar**) &opt_html,
|
||||
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"xml", 'X', "Produce XML output", (uchar**) &opt_xml, (uchar**) &opt_xml, 0,
|
||||
{"xml", 'X', "Produce XML output.", (uchar**) &opt_xml, (uchar**) &opt_xml, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"line-numbers", OPT_LINE_NUMBERS, "Write line numbers for errors.",
|
||||
(uchar**) &line_numbers, (uchar**) &line_numbers, 0, GET_BOOL,
|
||||
@ -1456,7 +1456,7 @@ static struct my_option my_long_options[] =
|
||||
{"skip-column-names", 'N',
|
||||
"Don't write column names in results.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"sigint-ignore", OPT_SIGINT_IGNORE, "Ignore SIGINT (CTRL-C)",
|
||||
{"sigint-ignore", OPT_SIGINT_IGNORE, "Ignore SIGINT (CTRL-C).",
|
||||
(uchar**) &opt_sigint_ignore, (uchar**) &opt_sigint_ignore, 0, GET_BOOL,
|
||||
NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"one-database", 'o',
|
||||
@ -1464,7 +1464,7 @@ static struct my_option my_long_options[] =
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifdef USE_POPEN
|
||||
{"pager", OPT_PAGER,
|
||||
"Pager to use to display results. If you don't supply an option the default pager is taken from your ENV variable PAGER. Valid pagers are less, more, cat [> filename], etc. See interactive help (\\h) also. This option does not work in batch mode. Disable with --disable-pager. This option is disabled by default.",
|
||||
"Pager to use to display results. If you don't supply an option, the default pager is taken from your ENV variable PAGER. Valid pagers are less, more, cat [> filename], etc. See interactive help (\\h) also. This option does not work in batch mode. Disable with --disable-pager. This option is disabled by default.",
|
||||
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"password", 'p',
|
||||
@ -1485,7 +1485,7 @@ static struct my_option my_long_options[] =
|
||||
{"prompt", OPT_PROMPT, "Set the mysql prompt to this value.",
|
||||
(uchar**) ¤t_prompt, (uchar**) ¤t_prompt, 0, GET_STR_ALLOC,
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).",
|
||||
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol to use for connection (tcp, socket, pipe, memory).",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"quick", 'q',
|
||||
"Don't cache result, print it row by row. This may slow down the server if the output is suspended. Doesn't use history file.",
|
||||
@ -1502,7 +1502,7 @@ static struct my_option my_long_options[] =
|
||||
"Base name of shared memory.", (uchar**) &shared_memory_base_name, (uchar**) &shared_memory_base_name,
|
||||
0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"socket", 'S', "Socket file to use for connection.",
|
||||
{"socket", 'S', "The socket file to use for connection.",
|
||||
(uchar**) &opt_mysql_unix_port, (uchar**) &opt_mysql_unix_port, 0, GET_STR_ALLOC,
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#include "sslopt-longopts.h"
|
||||
@ -1533,26 +1533,26 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, 0, 0, 3600*12, 0,
|
||||
0, 0},
|
||||
{"max_allowed_packet", OPT_MAX_ALLOWED_PACKET,
|
||||
"Max packet length to send to, or receive from server",
|
||||
"The maximum packet length to send to or receive from server.",
|
||||
(uchar**) &opt_max_allowed_packet, (uchar**) &opt_max_allowed_packet, 0,
|
||||
GET_ULONG, REQUIRED_ARG, 16 *1024L*1024L, 4096,
|
||||
(longlong) 2*1024L*1024L*1024L, MALLOC_OVERHEAD, 1024, 0},
|
||||
{"net_buffer_length", OPT_NET_BUFFER_LENGTH,
|
||||
"Buffer for TCP/IP and socket communication",
|
||||
"The buffer size for TCP/IP and socket communication.",
|
||||
(uchar**) &opt_net_buffer_length, (uchar**) &opt_net_buffer_length, 0, GET_ULONG,
|
||||
REQUIRED_ARG, 16384, 1024, 512*1024*1024L, MALLOC_OVERHEAD, 1024, 0},
|
||||
{"select_limit", OPT_SELECT_LIMIT,
|
||||
"Automatic limit for SELECT when using --safe-updates",
|
||||
"Automatic limit for SELECT when using --safe-updates.",
|
||||
(uchar**) &select_limit,
|
||||
(uchar**) &select_limit, 0, GET_ULONG, REQUIRED_ARG, 1000L, 1, ULONG_MAX,
|
||||
0, 1, 0},
|
||||
{"max_join_size", OPT_MAX_JOIN_SIZE,
|
||||
"Automatic limit for rows in a join when using --safe-updates",
|
||||
"Automatic limit for rows in a join when using --safe-updates.",
|
||||
(uchar**) &max_join_size,
|
||||
(uchar**) &max_join_size, 0, GET_ULONG, REQUIRED_ARG, 1000000L, 1, ULONG_MAX,
|
||||
0, 1, 0},
|
||||
{"secure-auth", OPT_SECURE_AUTH, "Refuse client connecting to server if it"
|
||||
" uses old (pre-4.1.1) protocol", (uchar**) &opt_secure_auth,
|
||||
" uses old (pre-4.1.1) protocol.", (uchar**) &opt_secure_auth,
|
||||
(uchar**) &opt_secure_auth, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"server-arg", OPT_SERVER_ARG, "Send embedded server this as a parameter.",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
|
@ -63,21 +63,21 @@ static struct my_option my_long_options[]=
|
||||
{
|
||||
{"help", '?', "Display this help message and exit.", 0, 0, 0, GET_NO_ARG,
|
||||
NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"basedir", 'b', "Not used by mysql_upgrade. Only for backward compatibilty",
|
||||
{"basedir", 'b', "Not used by mysql_upgrade. Only for backward compatibility.",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"character-sets-dir", OPT_CHARSETS_DIR,
|
||||
"Directory where character sets are.", 0,
|
||||
"Directory for character set files.", 0,
|
||||
0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"compress", OPT_COMPRESS, "Use compression in server/client protocol.",
|
||||
(uchar**)¬_used, (uchar**)¬_used, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"datadir", 'd',
|
||||
"Not used by mysql_upgrade. Only for backward compatibilty",
|
||||
"Not used by mysql_upgrade. Only for backward compatibility.",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifdef DBUG_OFF
|
||||
{"debug", '#', "This is a non-debug version. Catch this and exit",
|
||||
{"debug", '#', "This is a non-debug version. Catch this and exit.",
|
||||
0, 0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#else
|
||||
{"debug", '#', "Output debug log", (uchar* *) & default_dbug_option,
|
||||
{"debug", '#', "Output debug log.", (uchar* *) & default_dbug_option,
|
||||
(uchar* *) & default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.",
|
||||
@ -95,7 +95,7 @@ static struct my_option my_long_options[]=
|
||||
{"host",'h', "Connect to host.", 0,
|
||||
0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"password", 'p',
|
||||
"Password to use when connecting to server. If password is not given"
|
||||
"Password to use when connecting to server. If password is not given,"
|
||||
" it's solicited on the tty.", (uchar**) &opt_password,(uchar**) &opt_password,
|
||||
0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifdef __WIN__
|
||||
@ -110,17 +110,17 @@ static struct my_option my_long_options[]=
|
||||
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"protocol", OPT_MYSQL_PROTOCOL,
|
||||
"The protocol of connection (tcp,socket,pipe,memory).",
|
||||
"The protocol to use for connection (tcp, socket, pipe, memory).",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifdef HAVE_SMEM
|
||||
{"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME,
|
||||
"Base name of shared memory.", 0,
|
||||
0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"socket", 'S', "Socket file to use for connection.",
|
||||
{"socket", 'S', "The socket file to use for connection.",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#include <sslopt-longopts.h>
|
||||
{"tmpdir", 't', "Directory for temporary files",
|
||||
{"tmpdir", 't', "Directory for temporary files.",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"upgrade-system-tables", 's', "Only upgrade the system tables "
|
||||
"do not try to upgrade the data.",
|
||||
@ -128,7 +128,7 @@ static struct my_option my_long_options[]=
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"user", 'u', "User for login if not current user.", (uchar**) &opt_user,
|
||||
(uchar**) &opt_user, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"verbose", 'v', "Display more output about the process",
|
||||
{"verbose", 'v', "Display more output about the process.",
|
||||
(uchar**) &opt_verbose, (uchar**) &opt_verbose, 0,
|
||||
GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
||||
{"write-binlog", OPT_WRITE_BINLOG,
|
||||
@ -233,7 +233,7 @@ get_one_option(int optid, const struct my_option *opt,
|
||||
case '?':
|
||||
printf("%s Ver %s Distrib %s, for %s (%s)\n",
|
||||
my_progname, VER, MYSQL_SERVER_VERSION, SYSTEM_TYPE, MACHINE_TYPE);
|
||||
puts("MySQL utility for upgrading databases to new MySQL versions\n");
|
||||
puts("MySQL utility for upgrading databases to new MySQL versions.\n");
|
||||
my_print_help(my_long_options);
|
||||
exit(0);
|
||||
break;
|
||||
|
@ -117,7 +117,7 @@ static TYPELIB command_typelib=
|
||||
static struct my_option my_long_options[] =
|
||||
{
|
||||
#ifdef __NETWARE__
|
||||
{"autoclose", OPT_AUTO_CLOSE, "Auto close the screen on exit for Netware.",
|
||||
{"autoclose", OPT_AUTO_CLOSE, "Automatically close the screen on exit for Netware.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"count", 'c',
|
||||
@ -128,7 +128,7 @@ static struct my_option my_long_options[] =
|
||||
{"debug", '#', "Output debug log. Often this is 'd:t:o,filename'.",
|
||||
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit .",
|
||||
{"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.",
|
||||
(uchar**) &debug_check_flag, (uchar**) &debug_check_flag, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"debug-info", OPT_DEBUG_INFO, "Print some debug info at exit.",
|
||||
@ -142,7 +142,7 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &opt_compress, (uchar**) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
||||
0, 0, 0},
|
||||
{"character-sets-dir", OPT_CHARSETS_DIR,
|
||||
"Directory where character sets are.", (uchar**) &charsets_dir,
|
||||
"Directory for character set files.", (uchar**) &charsets_dir,
|
||||
(uchar**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"default-character-set", OPT_DEFAULT_CHARSET,
|
||||
"Set the default character set.", (uchar**) &default_charset,
|
||||
@ -168,10 +168,10 @@ static struct my_option my_long_options[] =
|
||||
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
|
||||
(uchar**) &tcp_port,
|
||||
(uchar**) &tcp_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).",
|
||||
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol to use for connection (tcp, socket, pipe, memory).",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"relative", 'r',
|
||||
"Show difference between current and previous values when used with -i. Currently works only with extended-status.",
|
||||
"Show difference between current and previous values when used with -i. Currently only works with extended-status.",
|
||||
(uchar**) &opt_relative, (uchar**) &opt_relative, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
||||
0, 0, 0},
|
||||
{"set-variable", 'O',
|
||||
@ -184,10 +184,10 @@ static struct my_option my_long_options[] =
|
||||
#endif
|
||||
{"silent", 's', "Silently exit if one can't connect to server.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"socket", 'S', "Socket file to use for connection.",
|
||||
{"socket", 'S', "The socket file to use for connection.",
|
||||
(uchar**) &unix_port, (uchar**) &unix_port, 0, GET_STR, REQUIRED_ARG, 0, 0, 0,
|
||||
0, 0, 0},
|
||||
{"sleep", 'i', "Execute commands again and again with a sleep between.",
|
||||
{"sleep", 'i', "Execute commands repeatedly with a sleep between.",
|
||||
(uchar**) &interval, (uchar**) &interval, 0, GET_INT, REQUIRED_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
#include <sslopt-longopts.h>
|
||||
|
@ -1005,7 +1005,7 @@ static struct my_option my_long_options[] =
|
||||
{"help", '?', "Display this help and exit.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifdef __NETWARE__
|
||||
{"autoclose", OPT_AUTO_CLOSE, "Auto close the screen on exit for Netware.",
|
||||
{"autoclose", OPT_AUTO_CLOSE, "Automatically close the screen on exit for Netware.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"base64-output", OPT_BASE64_OUTPUT_MODE,
|
||||
@ -1029,7 +1029,7 @@ static struct my_option my_long_options[] =
|
||||
SET @`a`:=_cp850 0x4DFC6C6C6572 COLLATE `cp850_general_ci`;
|
||||
*/
|
||||
{"character-sets-dir", OPT_CHARSETS_DIR,
|
||||
"Directory where character sets are.", (uchar**) &charsets_dir,
|
||||
"Directory for character set files.", (uchar**) &charsets_dir,
|
||||
(uchar**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"database", 'd', "List entries for just this database (local log only).",
|
||||
(uchar**) &database, (uchar**) &database, 0, GET_STR_ALLOC, REQUIRED_ARG,
|
||||
@ -1078,9 +1078,9 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &port, (uchar**) &port, 0, GET_INT, REQUIRED_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"protocol", OPT_MYSQL_PROTOCOL,
|
||||
"The protocol of connection (tcp,socket,pipe,memory).",
|
||||
"The protocol to use for connection (tcp, socket, pipe, memory).",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"read-from-remote-server", 'R', "Read binary logs from a MySQL server",
|
||||
{"read-from-remote-server", 'R', "Read binary logs from a MySQL server.",
|
||||
(uchar**) &remote_opt, (uchar**) &remote_opt, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"result-file", 'r', "Direct output to a given file.", 0, 0, 0, GET_STR,
|
||||
@ -1104,7 +1104,7 @@ static struct my_option my_long_options[] =
|
||||
"using --base64-output=never instead.",
|
||||
(uchar**) &short_form, (uchar**) &short_form, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"socket", 'S', "Socket file to use for connection.",
|
||||
{"socket", 'S', "The socket file to use for connection.",
|
||||
(uchar**) &sock, (uchar**) &sock, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"start-datetime", OPT_START_DATETIME,
|
||||
@ -1146,12 +1146,12 @@ that may lead to an endless loop.",
|
||||
(uchar**) &user, (uchar**) &user, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"verbose", 'v', "Reconstruct SQL statements out of row events. "
|
||||
"-v -v adds comments on column data types",
|
||||
"-v -v adds comments on column data types.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"version", 'V', "Print version and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
|
||||
0, 0, 0, 0, 0},
|
||||
{"open_files_limit", OPT_OPEN_FILES_LIMIT,
|
||||
"Used to reserve file descriptors for usage by this program",
|
||||
"Used to reserve file descriptors for use by this program.",
|
||||
(uchar**) &open_files_limit, (uchar**) &open_files_limit, 0, GET_ULONG,
|
||||
REQUIRED_ARG, MY_NFILE, 8, OS_FILE_LIMIT, 0, 1, 0},
|
||||
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
|
||||
@ -1250,11 +1250,11 @@ static void usage()
|
||||
print_version();
|
||||
puts("By Monty and Sasha, for your professional use\n\
|
||||
This software comes with NO WARRANTY: This is free software,\n\
|
||||
and you are welcome to modify and redistribute it under the GPL license\n");
|
||||
and you are welcome to modify and redistribute it under the GPL license.\n");
|
||||
|
||||
printf("\
|
||||
Dumps a MySQL binary log in a format usable for viewing or for piping to\n\
|
||||
the mysql command line client\n\n");
|
||||
the mysql command line client.\n\n");
|
||||
printf("Usage: %s [options] log-files\n", my_progname);
|
||||
my_print_help(my_long_options);
|
||||
my_print_variables(my_long_options);
|
||||
|
@ -53,7 +53,7 @@ enum operations { DO_CHECK, DO_REPAIR, DO_ANALYZE, DO_OPTIMIZE, DO_UPGRADE };
|
||||
static struct my_option my_long_options[] =
|
||||
{
|
||||
{"all-databases", 'A',
|
||||
"Check all the databases. This will be same as --databases with all databases selected.",
|
||||
"Check all the databases. This is the same as --databases with all databases selected.",
|
||||
(uchar**) &opt_alldbs, (uchar**) &opt_alldbs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"analyze", 'a', "Analyze given tables.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0,
|
||||
@ -63,7 +63,7 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &opt_all_in_1, (uchar**) &opt_all_in_1, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
||||
0, 0, 0},
|
||||
#ifdef __NETWARE__
|
||||
{"autoclose", OPT_AUTO_CLOSE, "Auto close the screen on exit for Netware.",
|
||||
{"autoclose", OPT_AUTO_CLOSE, "Automatically close the screen on exit for Netware.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"auto-repair", OPT_AUTO_REPAIR,
|
||||
@ -71,7 +71,7 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &opt_auto_repair, (uchar**) &opt_auto_repair, 0, GET_BOOL, NO_ARG, 0,
|
||||
0, 0, 0, 0, 0},
|
||||
{"character-sets-dir", OPT_CHARSETS_DIR,
|
||||
"Directory where character sets are.", (uchar**) &charsets_dir,
|
||||
"Directory for character set files.", (uchar**) &charsets_dir,
|
||||
(uchar**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"check", 'c', "Check table for errors.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0,
|
||||
0, 0, 0, 0},
|
||||
@ -85,7 +85,7 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &opt_compress, (uchar**) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
||||
0, 0, 0},
|
||||
{"databases", 'B',
|
||||
"To check several databases. Note the difference in usage; In this case no tables are given. All name arguments are regarded as databasenames.",
|
||||
"Check several databases. Note the difference in usage; in this case no tables are given. All name arguments are regarded as database names.",
|
||||
(uchar**) &opt_databases, (uchar**) &opt_databases, 0, GET_BOOL, NO_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
#ifdef DBUG_OFF
|
||||
@ -113,7 +113,7 @@ static struct my_option my_long_options[] =
|
||||
{"fix-table-names", OPT_FIX_TABLE_NAMES, "Fix table names.",
|
||||
(uchar**) &opt_fix_table_names, (uchar**) &opt_fix_table_names,
|
||||
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"force", 'f', "Continue even if we get an sql-error.",
|
||||
{"force", 'f', "Continue even if we get an SQL error.",
|
||||
(uchar**) &ignore_errors, (uchar**) &ignore_errors, 0, GET_BOOL, NO_ARG, 0, 0,
|
||||
0, 0, 0, 0},
|
||||
{"extended", 'e',
|
||||
@ -134,7 +134,7 @@ static struct my_option my_long_options[] =
|
||||
{"optimize", 'o', "Optimize table.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"password", 'p',
|
||||
"Password to use when connecting to server. If password is not given it's solicited on the tty.",
|
||||
"Password to use when connecting to server. If password is not given, it's solicited on the tty.",
|
||||
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifdef __WIN__
|
||||
{"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, GET_NO_ARG,
|
||||
@ -149,7 +149,7 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &opt_mysql_port,
|
||||
(uchar**) &opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0,
|
||||
0},
|
||||
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).",
|
||||
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol to use for connection (tcp, socket, pipe, memory).",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"quick", 'q',
|
||||
"If you are using this option with CHECK TABLE, it prevents the check from scanning the rows to check for wrong links. This is the fastest check. If you are using this option with REPAIR TABLE, it will try to repair only the index tree. This is the fastest repair method for a table.",
|
||||
@ -165,7 +165,7 @@ static struct my_option my_long_options[] =
|
||||
#endif
|
||||
{"silent", 's', "Print only error messages.", (uchar**) &opt_silent,
|
||||
(uchar**) &opt_silent, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"socket", 'S', "Socket file to use for connection.",
|
||||
{"socket", 'S', "The socket file to use for connection.",
|
||||
(uchar**) &opt_mysql_unix_port, (uchar**) &opt_mysql_unix_port, 0, GET_STR,
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#include <sslopt-longopts.h>
|
||||
@ -221,14 +221,14 @@ static void print_version(void)
|
||||
static void usage(void)
|
||||
{
|
||||
print_version();
|
||||
puts("By Jani Tolonen, 2001-04-20, MySQL Development Team\n");
|
||||
puts("By Jani Tolonen, 2001-04-20, MySQL Development Team.\n");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n");
|
||||
puts("and you are welcome to modify and redistribute it under the GPL license.\n");
|
||||
puts("This program can be used to CHECK (-c,-m,-C), REPAIR (-r), ANALYZE (-a)");
|
||||
puts("This program can be used to CHECK (-c, -m, -C), REPAIR (-r), ANALYZE (-a),");
|
||||
puts("or OPTIMIZE (-o) tables. Some of the options (like -e or -q) can be");
|
||||
puts("used at the same time. Not all options are supported by all storage engines.");
|
||||
puts("Please consult the MySQL manual for latest information about the");
|
||||
puts("above. The options -c,-r,-a and -o are exclusive to each other, which");
|
||||
puts("above. The options -c, -r, -a, and -o are exclusive to each other, which");
|
||||
puts("means that the last option will be used, if several was specified.\n");
|
||||
puts("The option -c will be used by default, if none was specified. You");
|
||||
puts("can change the default behavior by making a symbolic link, or");
|
||||
|
@ -196,13 +196,13 @@ static struct my_option my_long_options[] =
|
||||
"Do not dump any tablespace information.",
|
||||
(uchar**) &opt_notspcs, (uchar**) &opt_notspcs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"add-drop-database", OPT_DROP_DATABASE, "Add a 'DROP DATABASE' before each create.",
|
||||
{"add-drop-database", OPT_DROP_DATABASE, "Add a DROP DATABASE before each create.",
|
||||
(uchar**) &opt_drop_database, (uchar**) &opt_drop_database, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0,
|
||||
0},
|
||||
{"add-drop-table", OPT_DROP, "Add a 'drop table' before each create.",
|
||||
{"add-drop-table", OPT_DROP, "Add a DROP TABLE before each create.",
|
||||
(uchar**) &opt_drop, (uchar**) &opt_drop, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0,
|
||||
0},
|
||||
{"add-locks", OPT_LOCKS, "Add locks around insert statements.",
|
||||
{"add-locks", OPT_LOCKS, "Add locks around INSERT statements.",
|
||||
(uchar**) &opt_lock, (uchar**) &opt_lock, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0,
|
||||
0},
|
||||
{"allow-keywords", OPT_KEYWORDS,
|
||||
@ -213,11 +213,11 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &opt_slave_apply, (uchar**) &opt_slave_apply, 0, GET_BOOL, NO_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
#ifdef __NETWARE__
|
||||
{"autoclose", OPT_AUTO_CLOSE, "Auto close the screen on exit for Netware.",
|
||||
{"autoclose", OPT_AUTO_CLOSE, "Automatically close the screen on exit for Netware.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"character-sets-dir", OPT_CHARSETS_DIR,
|
||||
"Directory where character sets are.", (uchar**) &charsets_dir,
|
||||
"Directory for character set files.", (uchar**) &charsets_dir,
|
||||
(uchar**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"comments", 'i', "Write additional information.",
|
||||
(uchar**) &opt_comments, (uchar**) &opt_comments, 0, GET_BOOL, NO_ARG,
|
||||
@ -227,7 +227,7 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &opt_compatible_mode_str, (uchar**) &opt_compatible_mode_str, 0,
|
||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"compact", OPT_COMPACT,
|
||||
"Give less verbose output (useful for debugging). Disables structure comments and header/footer constructs. Enables options --skip-add-drop-table --skip-add-locks --skip-comments --skip-disable-keys --skip-set-charset",
|
||||
"Give less verbose output (useful for debugging). Disables structure comments and header/footer constructs. Enables options --skip-add-drop-table --skip-add-locks --skip-comments --skip-disable-keys --skip-set-charset.",
|
||||
(uchar**) &opt_compact, (uchar**) &opt_compact, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"complete-insert", 'c', "Use complete insert statements.",
|
||||
@ -241,14 +241,14 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &create_options, (uchar**) &create_options, 0, GET_BOOL, NO_ARG, 1,
|
||||
0, 0, 0, 0, 0},
|
||||
{"databases", 'B',
|
||||
"To dump several databases. Note the difference in usage; In this case no tables are given. All name arguments are regarded as databasenames. 'USE db_name;' will be included in the output.",
|
||||
"Dump several databases. Note the difference in usage; in this case no tables are given. All name arguments are regarded as database names. 'USE db_name;' will be included in the output.",
|
||||
(uchar**) &opt_databases, (uchar**) &opt_databases, 0, GET_BOOL, NO_ARG, 0, 0,
|
||||
0, 0, 0, 0},
|
||||
#ifdef DBUG_OFF
|
||||
{"debug", '#', "This is a non-debug version. Catch this and exit",
|
||||
{"debug", '#', "This is a non-debug version. Catch this and exit.",
|
||||
0,0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#else
|
||||
{"debug", '#', "Output debug log", (uchar**) &default_dbug_option,
|
||||
{"debug", '#', "Output debug log.", (uchar**) &default_dbug_option,
|
||||
(uchar**) &default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"debug-check", OPT_DEBUG_CHECK, "Check memory and open file usage at exit.",
|
||||
@ -260,7 +260,7 @@ static struct my_option my_long_options[] =
|
||||
{"default-character-set", OPT_DEFAULT_CHARSET,
|
||||
"Set the default character set.", (uchar**) &default_charset,
|
||||
(uchar**) &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"delayed-insert", OPT_DELAYED, "Insert rows with INSERT DELAYED; ",
|
||||
{"delayed-insert", OPT_DELAYED, "Insert rows with INSERT DELAYED.",
|
||||
(uchar**) &opt_delayed, (uchar**) &opt_delayed, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"delete-master-logs", OPT_DELETE_MASTER_LOGS,
|
||||
@ -291,16 +291,21 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &extended_insert, (uchar**) &extended_insert, 0, GET_BOOL, NO_ARG,
|
||||
1, 0, 0, 0, 0, 0},
|
||||
{"fields-terminated-by", OPT_FTB,
|
||||
"Fields in the textfile are terminated by ...", (uchar**) &fields_terminated,
|
||||
(uchar**) &fields_terminated, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
"Fields in the output file are terminated by the given string.",
|
||||
(uchar**) &fields_terminated, (uchar**) &fields_terminated, 0,
|
||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"fields-enclosed-by", OPT_ENC,
|
||||
"Fields in the importfile are enclosed by ...", (uchar**) &enclosed,
|
||||
(uchar**) &enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0 ,0, 0},
|
||||
"Fields in the output file are enclosed by the given character.",
|
||||
(uchar**) &enclosed, (uchar**) &enclosed, 0,
|
||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0 ,0, 0},
|
||||
{"fields-optionally-enclosed-by", OPT_O_ENC,
|
||||
"Fields in the i.file are opt. enclosed by ...", (uchar**) &opt_enclosed,
|
||||
(uchar**) &opt_enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0 ,0, 0},
|
||||
{"fields-escaped-by", OPT_ESC, "Fields in the i.file are escaped by ...",
|
||||
(uchar**) &escaped, (uchar**) &escaped, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
"Fields in the output file are optionally enclosed by the given character.",
|
||||
(uchar**) &opt_enclosed, (uchar**) &opt_enclosed, 0,
|
||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0 ,0, 0},
|
||||
{"fields-escaped-by", OPT_ESC,
|
||||
"Fields in the output file are escaped by the given character.",
|
||||
(uchar**) &escaped, (uchar**) &escaped, 0,
|
||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"flush-logs", 'F', "Flush logs file in server before starting dump. "
|
||||
"Note that if you dump many databases at once (using the option "
|
||||
"--databases= or --all-databases), the logs will be flushed for "
|
||||
@ -309,7 +314,7 @@ static struct my_option my_long_options[] =
|
||||
"in this case the logs will be flushed only once, corresponding "
|
||||
"to the moment all tables are locked. So if you want your dump and "
|
||||
"the log flush to happen at the same exact moment you should use "
|
||||
"--lock-all-tables or --master-data with --flush-logs",
|
||||
"--lock-all-tables or --master-data with --flush-logs.",
|
||||
(uchar**) &flush_logs, (uchar**) &flush_logs, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"flush-privileges", OPT_ESC, "Emit a FLUSH PRIVILEGES statement "
|
||||
@ -318,7 +323,7 @@ static struct my_option my_long_options[] =
|
||||
"that depends on the data in the mysql database for proper restore. ",
|
||||
(uchar**) &flush_privileges, (uchar**) &flush_privileges, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"force", 'f', "Continue even if we get an sql-error.",
|
||||
{"force", 'f', "Continue even if we get an SQL error.",
|
||||
(uchar**) &ignore_errors, (uchar**) &ignore_errors, 0, GET_BOOL, NO_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"help", '?', "Display this help message and exit.", 0, 0, 0, GET_NO_ARG,
|
||||
@ -331,7 +336,8 @@ static struct my_option my_long_options[] =
|
||||
{"ignore-table", OPT_IGNORE_TABLE,
|
||||
"Do not dump the specified table. To specify more than one table to ignore, "
|
||||
"use the directive multiple times, once for each table. Each table must "
|
||||
"be specified with both database and table names, e.g. --ignore-table=database.table",
|
||||
"be specified with both database and table names, e.g., "
|
||||
"--ignore-table=database.table.",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"include-master-host-port", OPT_MYSQLDUMP_INCLUDE_MASTER_HOST_PORT,
|
||||
"Adds 'MASTER_HOST=<host>, MASTER_PORT=<port>' to 'CHANGE MASTER TO..' in dump produced with --dump-slave.",
|
||||
@ -342,7 +348,8 @@ static struct my_option my_long_options[] =
|
||||
{"insert-ignore", OPT_INSERT_IGNORE, "Insert rows with INSERT IGNORE.",
|
||||
(uchar**) &opt_ignore, (uchar**) &opt_ignore, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"lines-terminated-by", OPT_LTB, "Lines in the i.file are terminated by ...",
|
||||
{"lines-terminated-by", OPT_LTB,
|
||||
"Lines in the output file are terminated by the given string.",
|
||||
(uchar**) &lines_terminated, (uchar**) &lines_terminated, 0, GET_STR,
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"lock-all-tables", 'x', "Locks all tables across all databases. This "
|
||||
@ -361,17 +368,19 @@ static struct my_option my_long_options[] =
|
||||
" to 2, that command will be prefixed with a comment symbol. "
|
||||
"This option will turn --lock-all-tables on, unless "
|
||||
"--single-transaction is specified too (in which case a "
|
||||
"global read lock is only taken a short time at the beginning of the dump "
|
||||
"- don't forget to read about --single-transaction below). In all cases "
|
||||
"any action on logs will happen at the exact moment of the dump."
|
||||
"global read lock is only taken a short time at the beginning of the dump; "
|
||||
"don't forget to read about --single-transaction below). In all cases, "
|
||||
"any action on logs will happen at the exact moment of the dump. "
|
||||
"Option automatically turns --lock-tables off.",
|
||||
(uchar**) &opt_master_data, (uchar**) &opt_master_data, 0,
|
||||
GET_UINT, OPT_ARG, 0, 0, MYSQL_OPT_MASTER_DATA_COMMENTED_SQL, 0, 0, 0},
|
||||
{"max_allowed_packet", OPT_MAX_ALLOWED_PACKET, "",
|
||||
{"max_allowed_packet", OPT_MAX_ALLOWED_PACKET,
|
||||
"The maximum packet length to send to or receive from server.",
|
||||
(uchar**) &opt_max_allowed_packet, (uchar**) &opt_max_allowed_packet, 0,
|
||||
GET_ULONG, REQUIRED_ARG, 24*1024*1024, 4096,
|
||||
(longlong) 2L*1024L*1024L*1024L, MALLOC_OVERHEAD, 1024, 0},
|
||||
{"net_buffer_length", OPT_NET_BUFFER_LENGTH, "",
|
||||
{"net_buffer_length", OPT_NET_BUFFER_LENGTH,
|
||||
"The buffer size for TCP/IP and socket communication.",
|
||||
(uchar**) &opt_net_buffer_length, (uchar**) &opt_net_buffer_length, 0,
|
||||
GET_ULONG, REQUIRED_ARG, 1024*1024L-1025, 4096, 16*1024L*1024L,
|
||||
MALLOC_OVERHEAD-1024, 1024, 0},
|
||||
@ -380,9 +389,11 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &opt_autocommit, (uchar**) &opt_autocommit, 0, GET_BOOL, NO_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"no-create-db", 'n',
|
||||
"'CREATE DATABASE /*!32312 IF NOT EXISTS*/ db_name;' will not be put in the output. The above line will be added otherwise, if --databases or --all-databases option was given.}.",
|
||||
(uchar**) &opt_create_db, (uchar**) &opt_create_db, 0, GET_BOOL, NO_ARG, 0, 0,
|
||||
0, 0, 0, 0},
|
||||
"Suppress the CREATE DATABASE ... IF EXISTS statement that normally is "
|
||||
"output for each dumped database if --all-databases or --databases is "
|
||||
"given.",
|
||||
(uchar**) &opt_create_db, (uchar**) &opt_create_db, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"no-create-info", 't', "Don't write table creation info.",
|
||||
(uchar**) &opt_no_create_info, (uchar**) &opt_no_create_info, 0, GET_BOOL,
|
||||
NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
@ -406,8 +417,9 @@ static struct my_option my_long_options[] =
|
||||
{"port", 'P', "Port number to use for connection.", (uchar**) &opt_mysql_port,
|
||||
(uchar**) &opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0,
|
||||
0},
|
||||
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"protocol", OPT_MYSQL_PROTOCOL,
|
||||
"The protocol to use for connection (tcp, socket, pipe, memory).",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"quick", 'q', "Don't buffer query, dump directly to stdout.",
|
||||
(uchar**) &quick, (uchar**) &quick, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
||||
{"quote-names",'Q', "Quote table and column names with backticks (`).",
|
||||
@ -454,18 +466,20 @@ static struct my_option my_long_options[] =
|
||||
{"skip-opt", OPT_SKIP_OPTIMIZATION,
|
||||
"Disable --opt. Disables --add-drop-table, --add-locks, --create-options, --quick, --extended-insert, --lock-tables, --set-charset, and --disable-keys.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"socket", 'S', "Socket file to use for connection.",
|
||||
(uchar**) &opt_mysql_unix_port, (uchar**) &opt_mysql_unix_port, 0, GET_STR,
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"socket", 'S', "The socket file to use for connection.",
|
||||
(uchar**) &opt_mysql_unix_port, (uchar**) &opt_mysql_unix_port, 0,
|
||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#include <sslopt-longopts.h>
|
||||
{"tab",'T',
|
||||
"Creates tab separated textfile for each table to given path. (creates .sql and .txt files). NOTE: This only works if mysqldump is run on the same machine as the mysqld daemon.",
|
||||
"Create tab-separated textfile for each table to given path. (Create .sql "
|
||||
"and .txt files.) NOTE: This only works if mysqldump is run on the same "
|
||||
"machine as the mysqld server.",
|
||||
(uchar**) &path, (uchar**) &path, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"tables", OPT_TABLES, "Overrides option --databases (-B).",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"triggers", OPT_TRIGGERS, "Dump triggers for each dumped table",
|
||||
(uchar**) &opt_dump_triggers, (uchar**) &opt_dump_triggers, 0, GET_BOOL,
|
||||
NO_ARG, 1, 0, 0, 0, 0, 0},
|
||||
{"triggers", OPT_TRIGGERS, "Dump triggers for each dumped table.",
|
||||
(uchar**) &opt_dump_triggers, (uchar**) &opt_dump_triggers, 0, GET_BOOL,
|
||||
NO_ARG, 1, 0, 0, 0, 0, 0},
|
||||
{"tz-utc", OPT_TZ_UTC,
|
||||
"SET TIME_ZONE='+00:00' at top of dump to allow dumping of TIMESTAMP data when a server has data in different time zones or data is being moved between servers with different time zones.",
|
||||
(uchar**) &opt_tz_utc, (uchar**) &opt_tz_utc, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
||||
@ -478,7 +492,7 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &verbose, (uchar**) &verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"version",'V', "Output version information and exit.", 0, 0, 0,
|
||||
GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"where", 'w', "Dump only selected records; QUOTES mandatory!",
|
||||
{"where", 'w', "Dump only selected records. Quotes are mandatory.",
|
||||
(uchar**) &where, (uchar**) &where, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"xml", 'X', "Dump a database as well formed XML.", 0, 0, 0, GET_NO_ARG,
|
||||
NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
@ -572,9 +586,9 @@ static void short_usage_sub(void)
|
||||
static void usage(void)
|
||||
{
|
||||
print_version();
|
||||
puts("By Igor Romanenko, Monty, Jani & Sinisa");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
|
||||
puts("Dumping definition and data mysql database or table");
|
||||
puts("By Igor Romanenko, Monty, Jani & Sinisa.");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license.\n");
|
||||
puts("Dumping structure and contents of MySQL databases and tables.");
|
||||
short_usage_sub();
|
||||
print_defaults("my",load_default_groups);
|
||||
my_print_help(my_long_options);
|
||||
|
@ -68,11 +68,11 @@ static char *shared_memory_base_name=0;
|
||||
static struct my_option my_long_options[] =
|
||||
{
|
||||
#ifdef __NETWARE__
|
||||
{"autoclose", OPT_AUTO_CLOSE, "Auto close the screen on exit for Netware.",
|
||||
{"autoclose", OPT_AUTO_CLOSE, "Automatically close the screen on exit for Netware.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"character-sets-dir", OPT_CHARSETS_DIR,
|
||||
"Directory where character sets are.", (uchar**) &charsets_dir,
|
||||
"Directory for character set files.", (uchar**) &charsets_dir,
|
||||
(uchar**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"default-character-set", OPT_DEFAULT_CHARSET,
|
||||
"Set the default character set.", (uchar**) &default_charset,
|
||||
@ -95,18 +95,22 @@ static struct my_option my_long_options[] =
|
||||
{"delete", 'd', "First delete all rows from table.", (uchar**) &opt_delete,
|
||||
(uchar**) &opt_delete, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"fields-terminated-by", OPT_FTB,
|
||||
"Fields in the textfile are terminated by ...", (uchar**) &fields_terminated,
|
||||
(uchar**) &fields_terminated, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
"Fields in the input file are terminated by the given string.",
|
||||
(uchar**) &fields_terminated, (uchar**) &fields_terminated, 0,
|
||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"fields-enclosed-by", OPT_ENC,
|
||||
"Fields in the importfile are enclosed by ...", (uchar**) &enclosed,
|
||||
(uchar**) &enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
"Fields in the import file are enclosed by the given character.",
|
||||
(uchar**) &enclosed, (uchar**) &enclosed, 0,
|
||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"fields-optionally-enclosed-by", OPT_O_ENC,
|
||||
"Fields in the i.file are opt. enclosed by ...", (uchar**) &opt_enclosed,
|
||||
(uchar**) &opt_enclosed, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"fields-escaped-by", OPT_ESC, "Fields in the i.file are escaped by ...",
|
||||
"Fields in the input file are optionally enclosed by the given character.",
|
||||
(uchar**) &opt_enclosed, (uchar**) &opt_enclosed, 0,
|
||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"fields-escaped-by", OPT_ESC,
|
||||
"Fields in the input file are escaped by the given character.",
|
||||
(uchar**) &escaped, (uchar**) &escaped, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"force", 'f', "Continue even if we get an sql-error.",
|
||||
{"force", 'f', "Continue even if we get an SQL error.",
|
||||
(uchar**) &ignore_errors, (uchar**) &ignore_errors, 0, GET_BOOL, NO_ARG, 0, 0,
|
||||
0, 0, 0, 0},
|
||||
{"help", '?', "Displays this help and exits.", 0, 0, 0, GET_NO_ARG, NO_ARG,
|
||||
@ -118,7 +122,8 @@ static struct my_option my_long_options[] =
|
||||
{"ignore-lines", OPT_IGN_LINES, "Ignore first n lines of data infile.",
|
||||
(uchar**) &opt_ignore_lines, (uchar**) &opt_ignore_lines, 0, GET_LL,
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"lines-terminated-by", OPT_LTB, "Lines in the i.file are terminated by ...",
|
||||
{"lines-terminated-by", OPT_LTB,
|
||||
"Lines in the input file are terminated by the given string.",
|
||||
(uchar**) &lines_terminated, (uchar**) &lines_terminated, 0, GET_STR,
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"local", 'L', "Read all files through the client.", (uchar**) &opt_local_file,
|
||||
@ -145,7 +150,7 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &opt_mysql_port,
|
||||
(uchar**) &opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0,
|
||||
0},
|
||||
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).",
|
||||
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol to use for connection (tcp, socket, pipe, memory).",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"replace", 'r', "If duplicate unique key was found, replace old row.",
|
||||
(uchar**) &replace, (uchar**) &replace, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
@ -156,7 +161,7 @@ static struct my_option my_long_options[] =
|
||||
#endif
|
||||
{"silent", 's', "Be more silent.", (uchar**) &silent, (uchar**) &silent, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"socket", 'S', "Socket file to use for connection.",
|
||||
{"socket", 'S', "The socket file to use for connection.",
|
||||
(uchar**) &opt_mysql_unix_port, (uchar**) &opt_mysql_unix_port, 0, GET_STR,
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#include <sslopt-longopts.h>
|
||||
@ -193,7 +198,7 @@ static void usage(void)
|
||||
{
|
||||
print_version();
|
||||
puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license.\n");
|
||||
printf("\
|
||||
Loads tables from text files in various formats. The base name of the\n\
|
||||
text file must be the name of the table that should be used.\n\
|
||||
|
@ -162,17 +162,17 @@ int main(int argc, char **argv)
|
||||
static struct my_option my_long_options[] =
|
||||
{
|
||||
#ifdef __NETWARE__
|
||||
{"autoclose", OPT_AUTO_CLOSE, "Auto close the screen on exit for Netware.",
|
||||
{"autoclose", OPT_AUTO_CLOSE, "Automatically close the screen on exit for Netware.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"character-sets-dir", 'c', "Directory where character sets are.",
|
||||
{"character-sets-dir", 'c', "Directory for character set files.",
|
||||
(uchar**) &charsets_dir, (uchar**) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0,
|
||||
0, 0, 0, 0, 0},
|
||||
{"default-character-set", OPT_DEFAULT_CHARSET,
|
||||
"Set the default character set.", (uchar**) &default_charset,
|
||||
(uchar**) &default_charset, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"count", OPT_COUNT,
|
||||
"Show number of rows per table (may be slow for not MyISAM tables)",
|
||||
"Show number of rows per table (may be slow for non-MyISAM tables).",
|
||||
(uchar**) &opt_count, (uchar**) &opt_count, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
||||
0, 0, 0},
|
||||
{"compress", 'C', "Use compression in server/client protocol.",
|
||||
@ -196,7 +196,8 @@ static struct my_option my_long_options[] =
|
||||
{"keys", 'k', "Show keys for table.", (uchar**) &opt_show_keys,
|
||||
(uchar**) &opt_show_keys, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"password", 'p',
|
||||
"Password to use when connecting to server. If password is not given it's asked from the tty.",
|
||||
"Password to use when connecting to server. If password is not given, it's "
|
||||
"solicited on the tty.",
|
||||
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"port", 'P', "Port number to use for connection or 0 for default to, in "
|
||||
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
|
||||
@ -211,7 +212,8 @@ static struct my_option my_long_options[] =
|
||||
{"pipe", 'W', "Use named pipes to connect to server.", 0, 0, 0, GET_NO_ARG,
|
||||
NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"protocol", OPT_MYSQL_PROTOCOL, "The protocol of connection (tcp,socket,pipe,memory).",
|
||||
{"protocol", OPT_MYSQL_PROTOCOL,
|
||||
"The protocol to use for connection (tcp, socket, pipe, memory).",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifdef HAVE_SMEM
|
||||
{"shared-memory-base-name", OPT_SHARED_MEMORY_BASE_NAME,
|
||||
@ -221,7 +223,7 @@ static struct my_option my_long_options[] =
|
||||
{"show-table-type", 't', "Show table type column.",
|
||||
(uchar**) &opt_table_type, (uchar**) &opt_table_type, 0, GET_BOOL,
|
||||
NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"socket", 'S', "Socket file to use for connection.",
|
||||
{"socket", 'S', "The socket file to use for connection.",
|
||||
(uchar**) &opt_mysql_unix_port, (uchar**) &opt_mysql_unix_port, 0, GET_STR,
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#include <sslopt-longopts.h>
|
||||
@ -230,7 +232,8 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &user, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"verbose", 'v',
|
||||
"More verbose output; You can use this multiple times to get even more verbose output.",
|
||||
"More verbose output; you can use this multiple times to get even more "
|
||||
"verbose output.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG,
|
||||
NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
@ -252,16 +255,16 @@ static void usage(void)
|
||||
{
|
||||
print_version();
|
||||
puts("Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
|
||||
puts("Shows the structure of a mysql database (databases,tables and columns)\n");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license.\n");
|
||||
puts("Shows the structure of a MySQL database (databases, tables, and columns).\n");
|
||||
printf("Usage: %s [OPTIONS] [database [table [column]]]\n",my_progname);
|
||||
puts("\n\
|
||||
If last argument contains a shell or SQL wildcard (*,?,% or _) then only\n\
|
||||
what\'s matched by the wildcard is shown.\n\
|
||||
If no database is given then all matching databases are shown.\n\
|
||||
If no table is given then all matching tables in database are shown\n\
|
||||
If no column is given then all matching columns and columntypes in table\n\
|
||||
are shown");
|
||||
If no table is given, then all matching tables in database are shown.\n\
|
||||
If no column is given, then all matching columns and column types in table\n\
|
||||
are shown.");
|
||||
print_defaults("my",load_default_groups);
|
||||
my_print_help(my_long_options);
|
||||
my_print_variables(my_long_options);
|
||||
|
@ -616,8 +616,8 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &num_of_query, (uchar**) &num_of_query, 0,
|
||||
GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"only-print", OPT_MYSQL_ONLY_PRINT,
|
||||
"This causes mysqlslap to not connect to the databases, but instead print "
|
||||
"out what it would have done instead.",
|
||||
"Do not connect to the databases, but instead print out what would have "
|
||||
"been done.",
|
||||
(uchar**) &opt_only_print, (uchar**) &opt_only_print, 0, GET_BOOL, NO_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"password", 'p',
|
||||
@ -651,7 +651,7 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &pre_system,
|
||||
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"protocol", OPT_MYSQL_PROTOCOL,
|
||||
"The protocol of connection (tcp,socket,pipe,memory).",
|
||||
"The protocol to use for connection (tcp, socket, pipe, memory).",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"query", 'q', "Query to run or file containing query to run.",
|
||||
(uchar**) &user_supplied_query, (uchar**) &user_supplied_query,
|
||||
@ -665,7 +665,7 @@ static struct my_option my_long_options[] =
|
||||
{"silent", 's', "Run program in silent mode - no output.",
|
||||
(uchar**) &opt_silent, (uchar**) &opt_silent, 0, GET_BOOL, NO_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"socket", 'S', "Socket file to use for connection.",
|
||||
{"socket", 'S', "The socket file to use for connection.",
|
||||
(uchar**) &opt_mysql_unix_port, (uchar**) &opt_mysql_unix_port, 0, GET_STR,
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#include <sslopt-longopts.h>
|
||||
@ -696,8 +696,8 @@ static void usage(void)
|
||||
{
|
||||
print_version();
|
||||
puts("Copyright (C) 2005 MySQL AB");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license\n");
|
||||
puts("Run a query multiple times against the server\n");
|
||||
puts("This software comes with ABSOLUTELY NO WARRANTY. This is free software,\nand you are welcome to modify and redistribute it under the GPL license.\n");
|
||||
puts("Run a query multiple times against the server.\n");
|
||||
printf("Usage: %s [OPTIONS]\n",my_progname);
|
||||
print_defaults("my",load_default_groups);
|
||||
my_print_help(my_long_options);
|
||||
|
@ -5882,7 +5882,7 @@ static struct my_option my_long_options[] =
|
||||
{"basedir", 'b', "Basedir for tests.", (uchar**) &opt_basedir,
|
||||
(uchar**) &opt_basedir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"character-sets-dir", OPT_CHARSETS_DIR,
|
||||
"Directory where character sets are.", (uchar**) &opt_charsets_dir,
|
||||
"Directory for character set files.", (uchar**) &opt_charsets_dir,
|
||||
(uchar**) &opt_charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"compress", 'C', "Use the compressed server/client protocol.",
|
||||
(uchar**) &opt_compress, (uchar**) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
||||
@ -5912,11 +5912,11 @@ static struct my_option my_long_options[] =
|
||||
{"logdir", OPT_LOG_DIR, "Directory for log files", (uchar**) &opt_logdir,
|
||||
(uchar**) &opt_logdir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"mark-progress", OPT_MARK_PROGRESS,
|
||||
"Write linenumber and elapsed time to <testname>.progress ",
|
||||
"Write line number and elapsed time to <testname>.progress.",
|
||||
(uchar**) &opt_mark_progress, (uchar**) &opt_mark_progress, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"max-connect-retries", OPT_MAX_CONNECT_RETRIES,
|
||||
"Max number of connection attempts when connecting to server",
|
||||
"Maximum number of attempts to connect to server.",
|
||||
(uchar**) &opt_max_connect_retries, (uchar**) &opt_max_connect_retries, 0,
|
||||
GET_INT, REQUIRED_ARG, 500, 1, 10000, 0, 0, 0},
|
||||
{"max-connections", OPT_MAX_CONNECTIONS,
|
||||
@ -5933,14 +5933,15 @@ static struct my_option my_long_options[] =
|
||||
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
|
||||
(uchar**) &opt_port,
|
||||
(uchar**) &opt_port, 0, GET_INT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"ps-protocol", OPT_PS_PROTOCOL, "Use prepared statements protocol for communication",
|
||||
{"ps-protocol", OPT_PS_PROTOCOL,
|
||||
"Use prepared-statement protocol for communication.",
|
||||
(uchar**) &ps_protocol, (uchar**) &ps_protocol, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"quiet", 's', "Suppress all normal output.", (uchar**) &silent,
|
||||
(uchar**) &silent, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"record", 'r', "Record output of test_file into result file.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"result-file", 'R', "Read/Store result from/in this file.",
|
||||
{"result-file", 'R', "Read/store result from/in this file.",
|
||||
(uchar**) &result_file_name, (uchar**) &result_file_name, 0,
|
||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"result-format-version", OPT_RESULT_FORMAT_VERSION,
|
||||
@ -5961,23 +5962,23 @@ static struct my_option my_long_options[] =
|
||||
{"skip-safemalloc", OPT_SKIP_SAFEMALLOC,
|
||||
"Don't use the memory allocation checking.", 0, 0, 0, GET_NO_ARG, NO_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"sleep", 'T', "Sleep always this many seconds on sleep commands.",
|
||||
{"sleep", 'T', "Always sleep this many seconds on sleep commands.",
|
||||
(uchar**) &opt_sleep, (uchar**) &opt_sleep, 0, GET_INT, REQUIRED_ARG, -1, -1, 0,
|
||||
0, 0, 0},
|
||||
{"socket", 'S', "Socket file to use for connection.",
|
||||
{"socket", 'S', "The socket file to use for connection.",
|
||||
(uchar**) &unix_sock, (uchar**) &unix_sock, 0, GET_STR, REQUIRED_ARG, 0, 0, 0,
|
||||
0, 0, 0},
|
||||
{"sp-protocol", OPT_SP_PROTOCOL, "Use stored procedures for select",
|
||||
{"sp-protocol", OPT_SP_PROTOCOL, "Use stored procedures for select.",
|
||||
(uchar**) &sp_protocol, (uchar**) &sp_protocol, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#include "sslopt-longopts.h"
|
||||
{"tail-lines", OPT_TAIL_LINES,
|
||||
"Number of lines of the resul to include in a failure report",
|
||||
"Number of lines of the result to include in a failure report.",
|
||||
(uchar**) &opt_tail_lines, (uchar**) &opt_tail_lines, 0,
|
||||
GET_INT, REQUIRED_ARG, 0, 0, 10000, 0, 0, 0},
|
||||
{"test-file", 'x', "Read test from/in this file (default stdin).",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"timer-file", 'm', "File where the timing in micro seconds is stored.",
|
||||
{"timer-file", 'm', "File where the timing in microseconds is stored.",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"tmpdir", 't', "Temporary directory where sockets are put.",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
@ -5987,7 +5988,7 @@ static struct my_option my_long_options[] =
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"version", 'V', "Output version information and exit.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"view-protocol", OPT_VIEW_PROTOCOL, "Use views for select",
|
||||
{"view-protocol", OPT_VIEW_PROTOCOL, "Use views for select.",
|
||||
(uchar**) &view_protocol, (uchar**) &view_protocol, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"connect_timeout", OPT_CONNECT_TIMEOUT,
|
||||
|
@ -109,8 +109,8 @@ extern int _rl_is_mbchar_matched PARAMS((char *, int, int, char *, int));
|
||||
extern wchar_t _rl_char_value PARAMS((char *, int));
|
||||
extern int _rl_walphabetic PARAMS((wchar_t));
|
||||
|
||||
#define _rl_to_wupper(wc) (iswlower (wc) ? towupper (wc) : (wc))
|
||||
#define _rl_to_wlower(wc) (iswupper (wc) ? towlower (wc) : (wc))
|
||||
#define _rl_to_wupper(wc) (iswlower (wc) ? (wchar_t)towupper (wc) : (wc))
|
||||
#define _rl_to_wlower(wc) (iswupper (wc) ? (wchar_t)towlower (wc) : (wc))
|
||||
|
||||
#define MB_NEXTCHAR(b,s,c,f) \
|
||||
((MB_CUR_MAX > 1 && rl_byte_oriented == 0) \
|
||||
|
@ -614,7 +614,7 @@ rl_arrow_keys (count, c)
|
||||
#ifdef HANDLE_MULTIBYTE
|
||||
static char pending_bytes[MB_LEN_MAX];
|
||||
static int pending_bytes_length = 0;
|
||||
static mbstate_t ps = {0};
|
||||
static mbstate_t ps;
|
||||
#endif
|
||||
|
||||
/* Insert the character C at the current location, moving point forward.
|
||||
|
@ -19,6 +19,11 @@ dnl Process this file with autoconf to produce a configure script.
|
||||
# Minimum Autoconf version required.
|
||||
AC_PREREQ(2.59)
|
||||
|
||||
# Various people throughout the community may parse configure.in to
|
||||
# get the MySQL version from the source branch. If the formatting
|
||||
# of this line is going to be changed, please announce the change to
|
||||
# internals@lists.mysql.com in advance of pushing the change.
|
||||
#
|
||||
# Remember to also update version.c in ndb.
|
||||
# When changing major version number please also check switch statement
|
||||
# in client/mysqlbinlog.cc:check_master_version().
|
||||
|
@ -64,7 +64,7 @@ enum YasslError {
|
||||
enum Library { yaSSL_Lib = 0, CryptoLib, SocketLib };
|
||||
enum { MAX_ERROR_SZ = 80 };
|
||||
|
||||
void SetErrorString(YasslError, char*);
|
||||
void SetErrorString(unsigned long, char*);
|
||||
|
||||
/* remove for now, if go back to exceptions use this wrapper
|
||||
// Base class for all yaSSL exceptions
|
||||
|
@ -991,7 +991,7 @@ char* ERR_error_string(unsigned long errNumber, char* buffer)
|
||||
static char* msg = (char*)"Please supply a buffer for error string";
|
||||
|
||||
if (buffer) {
|
||||
SetErrorString(YasslError(errNumber), buffer);
|
||||
SetErrorString(errNumber, buffer);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
|
@ -55,7 +55,7 @@ Library Error::get_lib() const
|
||||
*/
|
||||
|
||||
|
||||
void SetErrorString(YasslError error, char* buffer)
|
||||
void SetErrorString(unsigned long error, char* buffer)
|
||||
{
|
||||
using namespace TaoCrypt;
|
||||
const int max = MAX_ERROR_SZ; // shorthand
|
||||
|
@ -219,6 +219,19 @@ connect (conn2,localhost,root,,*NO-ONE*);
|
||||
-- echo ### assertion: works without stating the default database
|
||||
-- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||
-- eval $UPPER_STMT_HEAD LOCAL INFILE '$MYSQLTEST_VARDIR/std_data/loaddata5.dat' INTO TABLE $db1.t1
|
||||
|
||||
# We cannot disconnect right away because when inserting
|
||||
# concurrently in a MyISAM table, the server is sending an OK
|
||||
# to the client before updating the table state (where the
|
||||
# number of records is kept). See: BUG#37521 and BUG#29334.
|
||||
# So we need to wait, otherwise we would be having sporadic
|
||||
# failures as reported here: BUG#50451.
|
||||
|
||||
# 12 = 3 rows per each LOAD DATA executed x 4
|
||||
-- let $count= 12
|
||||
-- let $table= $db1.t1
|
||||
--source include/wait_until_rows_count.inc
|
||||
|
||||
-- echo ### disconnect and switch back to master connection
|
||||
-- disconnect conn2
|
||||
-- connection master
|
||||
|
@ -185,14 +185,6 @@ INSERT INTO global_suppressions VALUES
|
||||
("Master server does not support or not configured semi-sync replication, fallback to asynchronous"),
|
||||
(": The MySQL server is running with the --secure-backup-file-priv option so it cannot execute this statement"),
|
||||
("Slave: Unknown table 't1' Error_code: 1051"),
|
||||
/*
|
||||
Transient network failures that cause warnings on reconnect.
|
||||
BUG#47743 and BUG#47983.
|
||||
*/
|
||||
("Slave I/O: Get master SERVER_ID failed with error:.*"),
|
||||
("Slave I/O: Get master clock failed with error:.*"),
|
||||
("Slave I/O: Get master COLLATION_SERVER failed with error:.*"),
|
||||
("Slave I/O: Get master TIME_ZONE failed with error:.*"),
|
||||
|
||||
/* Messages from valgrind */
|
||||
("==[0-9]*== Memcheck,"),
|
||||
|
4
mysql-test/include/not_binlog_format_row.inc
Normal file
4
mysql-test/include/not_binlog_format_row.inc
Normal file
@ -0,0 +1,4 @@
|
||||
if (`SELECT @@binlog_format = 'ROW'`)
|
||||
{
|
||||
skip Test cannot run with binlog_format row;
|
||||
}
|
@ -12739,3 +12739,12 @@ Table Op Msg_type Msg_text
|
||||
test.t1 repair Error Table upgrade required. Please do "REPAIR TABLE `t1`" or dump/reload to fix it!
|
||||
test.t1 repair error Corrupt
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# BUG#48757 - missing .ARZ file causes server crash
|
||||
#
|
||||
CREATE TABLE t1(a INT) ENGINE=ARCHIVE;
|
||||
FLUSH TABLE t1;
|
||||
SELECT * FROM t1;
|
||||
ERROR HY000: Can't find file: 't1' (errno: 2)
|
||||
DROP TABLE t1;
|
||||
ERROR 42S02: Unknown table 't1'
|
||||
|
@ -4,23 +4,23 @@ create table t4(n int);
|
||||
backup table t4 to '../../bogus';
|
||||
Table Op Msg_type Msg_text
|
||||
test.t4 backup error Failed copying .frm file (errno: X)
|
||||
test.t4 backup Warning The syntax 'BACKUP TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t4 backup Warning 'BACKUP TABLE' is deprecated and will be removed in a future release. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t4 backup Error Can't create/write to file 'MYSQLTEST_VARDIR/bogus/t4.frm' (Errcode: X)
|
||||
test.t4 backup status Operation failed
|
||||
backup table t4 to '../../tmp';
|
||||
Table Op Msg_type Msg_text
|
||||
test.t4 backup Warning The syntax 'BACKUP TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t4 backup Warning 'BACKUP TABLE' is deprecated and will be removed in a future release. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t4 backup status OK
|
||||
backup table t4 to '../../tmp';
|
||||
Table Op Msg_type Msg_text
|
||||
test.t4 backup error Failed copying .frm file (errno: X)
|
||||
test.t4 backup Warning The syntax 'BACKUP TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t4 backup Warning 'BACKUP TABLE' is deprecated and will be removed in a future release. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t4 backup Error Can't create/write to file 'MYSQLTEST_VARDIR/tmp/t4.frm' (Errcode: X)
|
||||
test.t4 backup status Operation failed
|
||||
drop table t4;
|
||||
restore table t4 from '../../tmp';
|
||||
Table Op Msg_type Msg_text
|
||||
test.t4 restore Warning The syntax 'RESTORE TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t4 restore Warning 'RESTORE TABLE' is deprecated and will be removed in a future release. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t4 restore status OK
|
||||
select count(*) from t4;
|
||||
count(*)
|
||||
@ -29,18 +29,18 @@ create table t1(n int);
|
||||
insert into t1 values (23),(45),(67);
|
||||
backup table t1 to '../../tmp';
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 backup Warning The syntax 'BACKUP TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t1 backup Warning 'BACKUP TABLE' is deprecated and will be removed in a future release. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t1 backup status OK
|
||||
drop table t1;
|
||||
restore table t1 from '../../bogus';
|
||||
Table Op Msg_type Msg_text
|
||||
t1 restore error Failed copying .frm file
|
||||
Warnings:
|
||||
Warning 1287 The syntax 'RESTORE TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
Warning 1287 'RESTORE TABLE' is deprecated and will be removed in a future release. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
Error 29 File 'MYSQLTEST_VARDIR/bogus/t1.frm' not found (Errcode: X)
|
||||
restore table t1 from '../../tmp';
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 restore Warning The syntax 'RESTORE TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t1 restore Warning 'RESTORE TABLE' is deprecated and will be removed in a future release. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t1 restore status OK
|
||||
select n from t1;
|
||||
n
|
||||
@ -53,13 +53,13 @@ insert into t2 values (123),(145),(167);
|
||||
insert into t3 values (223),(245),(267);
|
||||
backup table t2,t3 to '../../tmp';
|
||||
Table Op Msg_type Msg_text
|
||||
test.t2 backup Warning The syntax 'BACKUP TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t2 backup Warning 'BACKUP TABLE' is deprecated and will be removed in a future release. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t2 backup status OK
|
||||
test.t3 backup status OK
|
||||
drop table t1,t2,t3;
|
||||
restore table t1,t2,t3 from '../../tmp';
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 restore Warning The syntax 'RESTORE TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t1 restore Warning 'RESTORE TABLE' is deprecated and will be removed in a future release. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t1 restore status OK
|
||||
test.t2 restore status OK
|
||||
test.t3 restore status OK
|
||||
@ -81,14 +81,14 @@ k
|
||||
drop table t1,t2,t3,t4;
|
||||
restore table t1 from '../../tmp';
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 restore Warning The syntax 'RESTORE TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t1 restore Warning 'RESTORE TABLE' is deprecated and will be removed in a future release. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t1 restore status OK
|
||||
rename table t1 to t5;
|
||||
lock tables t5 write;
|
||||
backup table t5 to '../../tmp';
|
||||
unlock tables;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t5 backup Warning The syntax 'BACKUP TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t5 backup Warning 'BACKUP TABLE' is deprecated and will be removed in a future release. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t5 backup status OK
|
||||
drop table t5;
|
||||
DROP TABLE IF EXISTS `t+1`;
|
||||
@ -96,12 +96,12 @@ CREATE TABLE `t+1` (c1 INT);
|
||||
INSERT INTO `t+1` VALUES (1), (2), (3);
|
||||
BACKUP TABLE `t+1` TO '../../tmp';
|
||||
Table Op Msg_type Msg_text
|
||||
test.t+1 backup Warning The syntax 'BACKUP TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t+1 backup Warning 'BACKUP TABLE' is deprecated and will be removed in a future release. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t+1 backup status OK
|
||||
DROP TABLE `t+1`;
|
||||
RESTORE TABLE `t+1` FROM '../../tmp';
|
||||
Table Op Msg_type Msg_text
|
||||
test.t+1 restore Warning The syntax 'RESTORE TABLE' is deprecated and will be removed in MySQL 6.0. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t+1 restore Warning 'RESTORE TABLE' is deprecated and will be removed in a future release. Please use MySQL Administrator (mysqldump, mysql) instead
|
||||
test.t+1 restore status OK
|
||||
SELECT * FROM `t+1`;
|
||||
c1
|
||||
|
32
mysql-test/r/bug39022.result
Normal file
32
mysql-test/r/bug39022.result
Normal file
@ -0,0 +1,32 @@
|
||||
#
|
||||
# Bug #39022: Mysql randomly crashing in lock_sec_rec_cons_read_sees
|
||||
#
|
||||
CREATE TABLE t1(a TINYINT NOT NULL,b TINYINT,PRIMARY KEY(b)) ENGINE=innodb;
|
||||
CREATE TABLE t2(d TINYINT NOT NULL,UNIQUE KEY(d)) ENGINE=innodb;
|
||||
INSERT INTO t1 VALUES (13,0),(8,1),(9,2),(6,3),
|
||||
(11,5),(11,6),(7,7),(7,8),(4,9),(6,10),(3,11),(11,12),
|
||||
(12,13),(7,14);
|
||||
INSERT INTO t2 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
|
||||
(11),(12),(13),(14);
|
||||
# in thread1
|
||||
START TRANSACTION;
|
||||
# in thread2
|
||||
REPLACE INTO t2 VALUES (-17);
|
||||
SELECT d FROM t2,t1 WHERE d=(SELECT MAX(a) FROM t1 WHERE t1.a > t2.d);
|
||||
d
|
||||
# in thread1
|
||||
REPLACE INTO t1(a,b) VALUES (67,20);
|
||||
# in thread2
|
||||
COMMIT;
|
||||
START TRANSACTION;
|
||||
REPLACE INTO t1(a,b) VALUES (65,-50);
|
||||
REPLACE INTO t2 VALUES (-91);
|
||||
SELECT d FROM t2,t1 WHERE d=(SELECT MAX(a) FROM t1 WHERE t1.a > t2.d);
|
||||
# in thread1
|
||||
# should not crash
|
||||
SELECT d FROM t2,t1 WHERE d=(SELECT MAX(a) FROM t1 WHERE t1.a > t2.d);
|
||||
ERROR 40001: Deadlock found when trying to get lock; try restarting transaction
|
||||
# in thread2
|
||||
d
|
||||
# in thread1;
|
||||
DROP TABLE t1,t2;
|
@ -5394,19 +5394,26 @@ select * from t1;
|
||||
ERROR HY000: File 'MYSQLD_DATADIR/test/t1.CSV' not found (Errcode: 2)
|
||||
unlock tables;
|
||||
drop table t1;
|
||||
create table t1(a enum ('a') not null) engine=csv;
|
||||
insert into t1 values (2);
|
||||
CREATE TABLE t1 (e enum('foo','bar') NOT NULL) ENGINE = CSV;
|
||||
INSERT INTO t1 VALUES();
|
||||
INSERT INTO t1 VALUES(default);
|
||||
INSERT INTO t1 VALUES(0);
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'a' at row 1
|
||||
select * from t1 limit 1;
|
||||
ERROR HY000: Table 't1' is marked as crashed and should be repaired
|
||||
repair table t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 repair Warning Data truncated for column 'a' at row 1
|
||||
test.t1 repair status OK
|
||||
select * from t1 limit 1;
|
||||
a
|
||||
drop table t1;
|
||||
Warning 1265 Data truncated for column 'e' at row 1
|
||||
INSERT INTO t1 VALUES(3);
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'e' at row 1
|
||||
INSERT INTO t1 VALUES(-1);
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'e' at row 1
|
||||
SELECT * FROM t1;
|
||||
e
|
||||
foo
|
||||
foo
|
||||
|
||||
|
||||
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Test for the following cases
|
||||
# 1) integers and strings enclosed in quotes
|
||||
|
@ -180,7 +180,6 @@ insert into bug20691 values (2, 3, 5, '0007-01-01', 11, 13, 17, '0019-01-01 00:0
|
||||
insert into bug20691 values (DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, 4);
|
||||
Warnings:
|
||||
Warning 1364 Field 'a' doesn't have a default value
|
||||
Warning 1364 Field 'b' doesn't have a default value
|
||||
Warning 1364 Field 'c' doesn't have a default value
|
||||
Warning 1364 Field 'd' doesn't have a default value
|
||||
Warning 1364 Field 'e' doesn't have a default value
|
||||
@ -193,7 +192,7 @@ a b c d e f g h i x
|
||||
two large 00:00:05 0007-01-01 11 13 17 0019-01-01 00:00:00 23 1
|
||||
small 00:00:00 0000-00-00 0 0000-00-00 00:00:00 0 2
|
||||
two large 00:00:05 0007-01-01 11 13 17 0019-01-01 00:00:00 23 3
|
||||
00:00:00 0000-00-00 0 0000-00-00 00:00:00 0 4
|
||||
small 00:00:00 0000-00-00 0 0000-00-00 00:00:00 0 4
|
||||
drop table bug20691;
|
||||
create table t1 (id int not null);
|
||||
insert into t1 values(default);
|
||||
|
@ -611,6 +611,26 @@ WHERE t3.a=t1.a AND MATCH(b2) AGAINST('scargill' IN BOOLEAN MODE)
|
||||
count(*)
|
||||
0
|
||||
DROP TABLE t1,t2,t3;
|
||||
CREATE TABLE t1 (a VARCHAR(4), FULLTEXT(a));
|
||||
INSERT INTO t1 VALUES
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('awrd'),('cwrd'),
|
||||
('awrd');
|
||||
SELECT COUNT(*) FROM t1 WHERE MATCH(a) AGAINST("+awrd bwrd* +cwrd*" IN BOOLEAN MODE);
|
||||
COUNT(*)
|
||||
0
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #49445: Assertion failed: 0, file .\item_row.cc, line 55 with
|
||||
# fulltext search and row op
|
||||
|
@ -986,6 +986,23 @@ GROUP BY t1.a
|
||||
1
|
||||
1
|
||||
DROP TABLE t1, t2;
|
||||
CREATE TABLE t1 (f1 INT);
|
||||
INSERT INTO t1 VALUES (),();
|
||||
EXPLAIN EXTENDED SELECT 1 FROM
|
||||
(SELECT DISTINCT GROUP_CONCAT(td.f1) FROM t1,t1 AS td GROUP BY td.f1) AS d,t1;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY <derived2> system NULL NULL NULL NULL 1 100.00
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 2 100.00
|
||||
2 DERIVED t1 ALL NULL NULL NULL NULL 2 100.00 Using temporary; Using filesort; Distinct
|
||||
2 DERIVED td ALL NULL NULL NULL NULL 2 100.00 Distinct; Using join buffer
|
||||
Warnings:
|
||||
Note 1003 select 1 AS `1` from `test`.`t1`
|
||||
SELECT 1 FROM
|
||||
(SELECT DISTINCT GROUP_CONCAT(td.f1) FROM t1,t1 AS td GROUP BY td.f1) AS d,t1;
|
||||
1
|
||||
1
|
||||
1
|
||||
DROP TABLE t1;
|
||||
End of 5.0 tests
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
CREATE TABLE t1 (a VARCHAR(6), b INT);
|
||||
|
@ -1704,3 +1704,91 @@ COUNT(i)
|
||||
1
|
||||
DROP TABLE t1;
|
||||
SET @@sql_mode = @old_sql_mode;
|
||||
#
|
||||
# Bug #45640: optimizer bug produces wrong results
|
||||
#
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
INSERT INTO t1 VALUES (4, 40), (1, 10), (2, 20), (2, 20), (3, 30);
|
||||
# should return 4 ordered records:
|
||||
SELECT (SELECT t1.a) aa, COUNT(DISTINCT b) FROM t1 GROUP BY aa;
|
||||
aa COUNT(DISTINCT b)
|
||||
1 1
|
||||
2 1
|
||||
3 1
|
||||
4 1
|
||||
SELECT (SELECT (SELECT t1.a)) aa, COUNT(DISTINCT b) FROM t1 GROUP BY aa;
|
||||
aa COUNT(DISTINCT b)
|
||||
1 1
|
||||
2 1
|
||||
3 1
|
||||
4 1
|
||||
SELECT (SELECT t1.a) aa, COUNT(DISTINCT b) FROM t1 GROUP BY aa+0;
|
||||
aa COUNT(DISTINCT b)
|
||||
1 1
|
||||
2 1
|
||||
3 1
|
||||
4 1
|
||||
# should return the same result in a reverse order:
|
||||
SELECT (SELECT t1.a) aa, COUNT(DISTINCT b) FROM t1 GROUP BY -aa;
|
||||
aa COUNT(DISTINCT b)
|
||||
4 1
|
||||
3 1
|
||||
2 1
|
||||
1 1
|
||||
# execution plan should not use temporary table:
|
||||
EXPLAIN EXTENDED
|
||||
SELECT (SELECT t1.a) aa, COUNT(DISTINCT b) FROM t1 GROUP BY aa+0;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 5 100.00 Using filesort
|
||||
2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1276 Field or reference 'test.t1.a' of SELECT #2 was resolved in SELECT #1
|
||||
Note 1003 select (select `test`.`t1`.`a` AS `a`) AS `aa`,count(distinct `test`.`t1`.`b`) AS `COUNT(DISTINCT b)` from `test`.`t1` group by ((select `test`.`t1`.`a` AS `a`) + 0)
|
||||
EXPLAIN EXTENDED
|
||||
SELECT (SELECT t1.a) aa, COUNT(DISTINCT b) FROM t1 GROUP BY -aa;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 PRIMARY t1 ALL NULL NULL NULL NULL 5 100.00 Using filesort
|
||||
2 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1276 Field or reference 'test.t1.a' of SELECT #2 was resolved in SELECT #1
|
||||
Note 1003 select (select `test`.`t1`.`a` AS `a`) AS `aa`,count(distinct `test`.`t1`.`b`) AS `COUNT(DISTINCT b)` from `test`.`t1` group by -((select `test`.`t1`.`a` AS `a`))
|
||||
# should return only one record
|
||||
SELECT (SELECT tt.a FROM t1 tt LIMIT 1) aa, COUNT(DISTINCT b) FROM t1
|
||||
GROUP BY aa;
|
||||
aa COUNT(DISTINCT b)
|
||||
4 4
|
||||
CREATE TABLE t2 SELECT DISTINCT a FROM t1;
|
||||
# originally reported queries (1st two columns of next two query
|
||||
# results should be same):
|
||||
SELECT (SELECT t2.a FROM t2 WHERE t2.a = t1.a) aa, b, COUNT(DISTINCT b)
|
||||
FROM t1 GROUP BY aa, b;
|
||||
aa b COUNT(DISTINCT b)
|
||||
1 10 1
|
||||
2 20 1
|
||||
3 30 1
|
||||
4 40 1
|
||||
SELECT (SELECT t2.a FROM t2 WHERE t2.a = t1.a) aa, b, COUNT( b)
|
||||
FROM t1 GROUP BY aa, b;
|
||||
aa b COUNT( b)
|
||||
1 10 1
|
||||
2 20 2
|
||||
3 30 1
|
||||
4 40 1
|
||||
# ORDER BY for sure:
|
||||
SELECT (SELECT t2.a FROM t2 WHERE t2.a = t1.a) aa, b, COUNT(DISTINCT b)
|
||||
FROM t1 GROUP BY aa, b ORDER BY -aa, -b;
|
||||
aa b COUNT(DISTINCT b)
|
||||
4 40 1
|
||||
3 30 1
|
||||
2 20 1
|
||||
1 10 1
|
||||
SELECT (SELECT t2.a FROM t2 WHERE t2.a = t1.a) aa, b, COUNT( b)
|
||||
FROM t1 GROUP BY aa, b ORDER BY -aa, -b;
|
||||
aa b COUNT( b)
|
||||
4 40 1
|
||||
3 30 1
|
||||
2 20 2
|
||||
1 10 1
|
||||
DROP TABLE t1, t2;
|
||||
#
|
||||
# End of 5.1 tests
|
||||
|
@ -2524,6 +2524,19 @@ SELECT a, MAX(b) FROM t WHERE b GROUP BY a;
|
||||
a MAX(b)
|
||||
2 1
|
||||
DROP TABLE t;
|
||||
CREATE TABLE t1(a INT NOT NULL, b INT NOT NULL, KEY (b));
|
||||
INSERT INTO t1 VALUES(1,1),(2,1);
|
||||
ANALYZE TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 analyze status OK
|
||||
SELECT 1 AS c, b FROM t1 WHERE b IN (1,2) GROUP BY c, b;
|
||||
c b
|
||||
1 1
|
||||
SELECT a FROM t1 WHERE b=1;
|
||||
a
|
||||
1
|
||||
2
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
#
|
||||
# WL#3220 (Loose index scan for COUNT DISTINCT)
|
||||
|
@ -2276,6 +2276,14 @@ END|
|
||||
DROP PROCEDURE p1;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
# Bug #49324: more valgrind errors in test_if_skip_sort_order
|
||||
#
|
||||
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=innodb ;
|
||||
#should not cause valgrind warnings
|
||||
SELECT 1 FROM t1 JOIN t1 a USING(a) GROUP BY t1.a,t1.a;
|
||||
1
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
#
|
||||
# Test for bug #39932 "create table fails if column for FK is in different
|
||||
|
@ -1128,3 +1128,20 @@ EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1, t2;
|
||||
CREATE TABLE t1(a CHAR(9),b INT,KEY(b),KEY(a)) ENGINE=MYISAM;
|
||||
CREATE TABLE t2(a CHAR(9),b INT,KEY(b),KEY(a)) ENGINE=MYISAM;
|
||||
INSERT INTO t1 VALUES ('1',null),(null,null);
|
||||
INSERT INTO t2 VALUES ('1',null),(null,null);
|
||||
CREATE TABLE mm1(a CHAR(9),b INT,KEY(b),KEY(a))
|
||||
ENGINE=MERGE UNION=(t1,t2);
|
||||
SELECT t1.a FROM mm1,t1;
|
||||
a
|
||||
NULL
|
||||
1
|
||||
NULL
|
||||
1
|
||||
NULL
|
||||
1
|
||||
NULL
|
||||
1
|
||||
DROP TABLE t1, t2, mm1;
|
||||
|
@ -634,4 +634,15 @@ select count(*) from t3 /* must be 1 */;
|
||||
count(*)
|
||||
1
|
||||
drop table t1, t2, t3;
|
||||
#
|
||||
# Bug#49534: multitable IGNORE update with sql_safe_updates error
|
||||
# causes debug assertion
|
||||
#
|
||||
CREATE TABLE t1( a INT, KEY( a ) );
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
SET SESSION sql_safe_updates = 1;
|
||||
# Must not cause failed assertion
|
||||
UPDATE IGNORE t1, t1 t1a SET t1.a = 1 WHERE t1a.a = 1;
|
||||
ERROR HY000: You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
|
||||
DROP TABLE t1;
|
||||
end of tests
|
||||
|
@ -1870,6 +1870,19 @@ CHECKSUM TABLE t1 EXTENDED;
|
||||
Table Checksum
|
||||
test.t1 467455460
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# BUG#48438 - crash with error in unioned query against merge table and view...
|
||||
#
|
||||
SET GLOBAL table_open_cache=3;
|
||||
CREATE TABLE t1(a INT);
|
||||
SELECT 1 FROM t1 AS a1, t1 AS a2, t1 AS a3, t1 AS a4 FOR UPDATE;
|
||||
1
|
||||
SELECT TABLE_ROWS, DATA_LENGTH FROM INFORMATION_SCHEMA.TABLES
|
||||
WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1';
|
||||
TABLE_ROWS DATA_LENGTH
|
||||
0 0
|
||||
DROP TABLE t1;
|
||||
SET GLOBAL table_open_cache=DEFAULT;
|
||||
End of 5.0 tests
|
||||
create table t1 (a int not null, key `a` (a) key_block_size=1024);
|
||||
show create table t1;
|
||||
@ -2315,4 +2328,17 @@ CHECK TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# BUG#49628 - corrupt table after legal SQL, LONGTEXT column
|
||||
#
|
||||
CREATE TABLE t1(a INT, b LONGTEXT, UNIQUE(a));
|
||||
REPLACE INTO t1 VALUES
|
||||
(1, REPEAT('a', 129015)),(1, NULL),
|
||||
(2, NULL),(3, NULL),(4, NULL),(5, NULL),(6, NULL),(7, NULL),
|
||||
(1, REPEAT('b', 129016)),(1, NULL),
|
||||
(1, REPEAT('c', 129015)),(1, REPEAT('d', 129015));
|
||||
CHECK TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
|
@ -1,8 +1,8 @@
|
||||
The following options may be given as the first argument:
|
||||
--print-defaults Print the program argument list and exit
|
||||
--no-defaults Don't read default options from any options file
|
||||
--defaults-file=# Only read default options from the given file #
|
||||
--defaults-extra-file=# Read this file after the global files are read
|
||||
--print-defaults Print the program argument list and exit.
|
||||
--no-defaults Don't read default options from any option file.
|
||||
--defaults-file=# Only read default options from the given file #.
|
||||
--defaults-extra-file=# Read this file after the global files are read.
|
||||
|
||||
--abort-slave-event-count=#
|
||||
Option used by mysql-test for debugging and testing of
|
||||
@ -60,7 +60,7 @@ The following options may be given as the first argument:
|
||||
NDBCLUSTER table
|
||||
--binlog-ignore-db=name
|
||||
Tells the master that updates to the given database
|
||||
should not be logged tothe binary log.
|
||||
should not be logged to the binary log.
|
||||
--binlog-row-event-max-size=#
|
||||
The maximum size of a row-based binary log event in
|
||||
bytes. Rows will be grouped into events smaller than this
|
||||
@ -90,7 +90,7 @@ The following options may be given as the first argument:
|
||||
NEVER, AUTO, ALWAYS
|
||||
--connect-timeout=# The number of seconds the mysqld server is waiting for a
|
||||
connect packet before responding with 'Bad handshake'
|
||||
--console Write error output on screen; Don't remove the console
|
||||
--console Write error output on screen; don't remove the console
|
||||
window on windows.
|
||||
--core-file Write core on errors.
|
||||
-h, --datadir=name Path to the database root directory
|
||||
@ -132,7 +132,7 @@ The following options may be given as the first argument:
|
||||
Enable the event scheduler. Possible values are ON, OFF,
|
||||
and DISABLED (keep the event scheduler completely
|
||||
deactivated, it cannot be activated run-time)
|
||||
-T, --exit-info[=#] Used for debugging; Use at your own risk!
|
||||
-T, --exit-info[=#] Used for debugging. Use at your own risk.
|
||||
--expire-logs-days=#
|
||||
If non-zero, binary logs will be purged after
|
||||
expire_logs_days days; possible purges happen at startup
|
||||
@ -157,7 +157,7 @@ The following options may be given as the first argument:
|
||||
Number of best matches to use for query expansion
|
||||
--ft-stopword-file=name
|
||||
Use stopwords from this file instead of built-in list
|
||||
--gdb Set up signals usable for debugging
|
||||
--gdb Set up signals usable for debugging.
|
||||
--general-log Log connections and queries to a table or log file.
|
||||
Defaults logging to a file hostname.log or a table
|
||||
mysql.general_logif --log-output=TABLE is used
|
||||
@ -254,7 +254,7 @@ The following options may be given as the first argument:
|
||||
log if it is open.
|
||||
--log-tc=name Path to transaction coordinator log (used for
|
||||
transactions that affect more than one storage engine,
|
||||
when binary log is disabled)
|
||||
when binary log is disabled).
|
||||
--log-tc-size=# Size of transaction coordinator log.
|
||||
-W, --log-warnings[=#]
|
||||
Log some not critical warnings to the log file
|
||||
@ -372,10 +372,11 @@ The following options may be given as the first argument:
|
||||
--old-passwords Use old password encryption method (needed for 4.0 and
|
||||
older clients)
|
||||
--old-style-user-limits
|
||||
Enable old-style user limits (before 5.0.3 user resources
|
||||
were counted per each user+host vs. per account)
|
||||
--one-thread (deprecated): Only use one thread (for debugging under
|
||||
Linux). Use thread-handling=no-threads instead
|
||||
Enable old-style user limits (before 5.0.3, user
|
||||
resources were counted per each user+host vs. per
|
||||
account).
|
||||
--one-thread (Deprecated): Only use one thread (for debugging under
|
||||
Linux). Use thread-handling=no-threads instead.
|
||||
--open-files-limit=#
|
||||
If this is not 0, then mysqld will use this value to
|
||||
reserve file descriptors to use with setrlimit(). If this
|
||||
@ -447,7 +448,7 @@ The following options may be given as the first argument:
|
||||
(3306), whatever comes first
|
||||
--port-open-timeout=#
|
||||
Maximum time in seconds to wait for the port to become
|
||||
free. (Default: no wait)
|
||||
free. (Default: No wait).
|
||||
--preload-buffer-size=#
|
||||
The size of the buffer that is allocated when preloading
|
||||
indexes
|
||||
@ -590,14 +591,15 @@ The following options may be given as the first argument:
|
||||
--server-id=# Uniquely identifies the server instance in the community
|
||||
of replication partners
|
||||
--show-slave-auth-info
|
||||
Show user and password in SHOW SLAVE HOSTS on this master
|
||||
Show user and password in SHOW SLAVE HOSTS on this
|
||||
master.
|
||||
--skip-grant-tables Start without grant tables. This gives all users FULL
|
||||
ACCESS to all tables!
|
||||
ACCESS to all tables.
|
||||
--skip-host-cache Don't cache host names.
|
||||
--skip-name-resolve Don't resolve hostnames. All hostnames are IP's or
|
||||
'localhost'.
|
||||
--skip-networking Don't allow connection with TCP/IP
|
||||
--skip-new Don't use new, possible wrong routines.
|
||||
--skip-new Don't use new, possibly wrong routines.
|
||||
--skip-show-database
|
||||
Don't allow 'SHOW DATABASE' commands
|
||||
--skip-slave-start If set, slave is not autostarted.
|
||||
@ -716,7 +718,7 @@ The following options may be given as the first argument:
|
||||
Enable symbolic link support. Deprecated option; use
|
||||
--symbolic-links instead.
|
||||
-u, --user=name Run mysqld daemon as user.
|
||||
-v, --verbose Used with --help option for detailed help
|
||||
-v, --verbose Used with --help option for detailed help.
|
||||
-V, --version Output version information and exit.
|
||||
--wait-timeout=# The number of seconds the server waits for activity on a
|
||||
connection before closing it
|
||||
|
2
mysql-test/r/no_binlog.result
Normal file
2
mysql-test/r/no_binlog.result
Normal file
@ -0,0 +1,2 @@
|
||||
SHOW BINARY LOGS;
|
||||
ERROR HY000: You are not using binary logging
|
57
mysql-test/r/partition_debug_sync.result
Normal file
57
mysql-test/r/partition_debug_sync.result
Normal file
@ -0,0 +1,57 @@
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
#
|
||||
# Bug#42438: Crash ha_partition::change_table_ptr
|
||||
# Test when remove partitioning is done while drop table is waiting
|
||||
# for the table.
|
||||
# Con 1
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
CREATE TABLE t1
|
||||
(a INTEGER,
|
||||
b INTEGER NOT NULL,
|
||||
KEY (b))
|
||||
ENGINE = MYISAM
|
||||
/*!50100 PARTITION BY RANGE (a)
|
||||
(PARTITION p0 VALUES LESS THAN (2),
|
||||
PARTITION p1 VALUES LESS THAN (20),
|
||||
PARTITION p2 VALUES LESS THAN (100),
|
||||
PARTITION p3 VALUES LESS THAN MAXVALUE ) */;
|
||||
SET DEBUG_SYNC= 'alter_table_before_create_table_no_lock SIGNAL removing_partitioning WAIT_FOR waiting_for_alter';
|
||||
SET DEBUG_SYNC= 'alter_table_before_main_binlog SIGNAL partitioning_removed';
|
||||
ALTER TABLE t1 REMOVE PARTITIONING;
|
||||
# Con default
|
||||
SET DEBUG_SYNC= 'now WAIT_FOR removing_partitioning';
|
||||
SET DEBUG_SYNC= 'waiting_for_table SIGNAL waiting_for_alter';
|
||||
SET DEBUG_SYNC= 'rm_table_part2_before_delete_table WAIT_FOR partitioning_removed';
|
||||
DROP TABLE IF EXISTS t1;
|
||||
# Con 1
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
#
|
||||
# Bug#42438: Crash ha_partition::change_table_ptr
|
||||
# Test when remove partitioning is failing due to drop table is already
|
||||
# in progress.
|
||||
CREATE TABLE t2
|
||||
(a INTEGER,
|
||||
b INTEGER NOT NULL,
|
||||
KEY (b))
|
||||
ENGINE = MYISAM
|
||||
/*!50100 PARTITION BY RANGE (a)
|
||||
(PARTITION p0 VALUES LESS THAN (2),
|
||||
PARTITION p1 VALUES LESS THAN (20),
|
||||
PARTITION p2 VALUES LESS THAN (100),
|
||||
PARTITION p3 VALUES LESS THAN MAXVALUE ) */;
|
||||
SET DEBUG_SYNC= 'before_lock_tables_takes_lock SIGNAL removing_partitions WAIT_FOR waiting_for_alter';
|
||||
SET DEBUG_SYNC= 'alter_table_before_rename_result_table WAIT_FOR delete_done';
|
||||
ALTER TABLE t2 REMOVE PARTITIONING;
|
||||
# Con default
|
||||
SET DEBUG_SYNC= 'now WAIT_FOR removing_partitions';
|
||||
SET DEBUG_SYNC= 'waiting_for_table SIGNAL waiting_for_alter';
|
||||
SET DEBUG_SYNC= 'rm_table_part2_before_binlog SIGNAL delete_done';
|
||||
DROP TABLE IF EXISTS t2;
|
||||
# Con 1
|
||||
ERROR 42S02: Table 'test.t2' doesn't exist
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
# Con default
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
End of 5.1 tests
|
@ -44,4 +44,33 @@ SELECT f2 ();
|
||||
f2 ()
|
||||
NULL
|
||||
DROP SCHEMA testdb;
|
||||
USE test;
|
||||
#
|
||||
# Bug#50423: Crash on second call of a procedure dropping a trigger
|
||||
#
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TRIGGER IF EXISTS tr1;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
CREATE TABLE t1 (f1 INTEGER);
|
||||
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @aux = 1;
|
||||
CREATE PROCEDURE p1 () DROP TRIGGER tr1;
|
||||
CALL p1 ();
|
||||
CALL p1 ();
|
||||
ERROR HY000: Trigger does not exist
|
||||
DROP TABLE t1;
|
||||
DROP PROCEDURE p1;
|
||||
#
|
||||
# Bug#50423: Crash on second call of a procedure dropping a trigger
|
||||
#
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TRIGGER IF EXISTS tr1;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
CREATE TABLE t1 (f1 INTEGER);
|
||||
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @aux = 1;
|
||||
CREATE PROCEDURE p1 () DROP TRIGGER tr1;
|
||||
CALL p1 ();
|
||||
CALL p1 ();
|
||||
ERROR HY000: Trigger does not exist
|
||||
DROP TABLE t1;
|
||||
DROP PROCEDURE p1;
|
||||
End of 5.1 tests
|
||||
|
@ -270,6 +270,17 @@ SELECT RELEASE_LOCK('Bug44521');
|
||||
RELEASE_LOCK('Bug44521')
|
||||
1
|
||||
DROP PROCEDURE p;
|
||||
CREATE TABLE t1(a int);
|
||||
INSERT INTO t1 VALUES (1);
|
||||
CREATE FUNCTION f1 (inp TEXT) RETURNS INT NO SQL RETURN sleep(60);
|
||||
CREATE VIEW v1 AS SELECT f1('a') FROM t1;
|
||||
SELECT * FROM v1;;
|
||||
SELECT * FROM v1;
|
||||
ERROR 70100: Query execution was interrupted
|
||||
ERROR 70100: Query execution was interrupted
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
DROP FUNCTION f1;
|
||||
# ------------------------------------------------------------------
|
||||
# -- End of 5.1 tests
|
||||
# ------------------------------------------------------------------
|
||||
|
@ -4886,4 +4886,16 @@ FROM t1,t1 a
|
||||
);
|
||||
1
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug #45989 take 2 : memory leak after explain encounters an
|
||||
# error in the query
|
||||
#
|
||||
CREATE TABLE t1(a LONGTEXT);
|
||||
INSERT INTO t1 VALUES (repeat('a',@@global.max_allowed_packet));
|
||||
INSERT INTO t1 VALUES (repeat('b',@@global.max_allowed_packet));
|
||||
EXPLAIN EXTENDED SELECT DISTINCT 1 FROM t1,
|
||||
(SELECT DISTINCTROW a AS away FROM t1 GROUP BY a WITH ROLLUP) AS d1
|
||||
WHERE t1.a = d1.a;
|
||||
ERROR 42S22: Unknown column 'd1.a' in 'where clause'
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests.
|
||||
|
@ -785,4 +785,19 @@ t1 CREATE TABLE `t1` (
|
||||
KEY `a` (`a`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
drop table t1;
|
||||
#
|
||||
# Bug#50591 bit(31) causes Duplicate entry '1-NULL' for key 'group_key'
|
||||
#
|
||||
CREATE TABLE t1(a INT, b BIT(7) NOT NULL);
|
||||
INSERT INTO t1 VALUES (NULL, 0),(NULL, 0);
|
||||
SELECT SUM(a) FROM t1 GROUP BY b, a;
|
||||
SUM(a)
|
||||
NULL
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(a INT, b BIT(7) NOT NULL, c BIT(8) NOT NULL);
|
||||
INSERT INTO t1 VALUES (NULL, 0, 0),(NULL, 0, 0);
|
||||
SELECT SUM(a) FROM t1 GROUP BY c, b, a;
|
||||
SUM(a)
|
||||
NULL
|
||||
DROP TABLE t1;
|
||||
End of 5.1 tests
|
||||
|
@ -3956,6 +3956,36 @@ CREATE VIEW v1 AS SELECT a FROM t1;
|
||||
ALTER TABLE v1;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Bug#48449: hang on show create view after upgrading when
|
||||
# view contains function of view
|
||||
#
|
||||
DROP VIEW IF EXISTS v1,v2;
|
||||
DROP TABLE IF EXISTS t1,t2;
|
||||
DROP FUNCTION IF EXISTS f1;
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE TABLE t2 (a INT);
|
||||
CREATE FUNCTION f1() RETURNS INT
|
||||
BEGIN
|
||||
SELECT a FROM v2 INTO @a;
|
||||
RETURN @a;
|
||||
END//
|
||||
# Trigger pre-locking when opening v2.
|
||||
CREATE VIEW v1 AS SELECT f1() FROM t1;
|
||||
SHOW CREATE VIEW v1;
|
||||
View Create View character_set_client collation_connection
|
||||
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `f1`() AS `f1()` from `t1` latin1 latin1_swedish_ci
|
||||
Warnings:
|
||||
Note 1599 View `test`.`v2` has no creation context
|
||||
DROP VIEW v1,v2;
|
||||
DROP TABLE t1,t2;
|
||||
DROP FUNCTION f1;
|
||||
CREATE TABLE t1(f1 INT);
|
||||
INSERT INTO t1 VALUES ();
|
||||
CREATE VIEW v1 AS SELECT 1 FROM t1 WHERE
|
||||
ROW(1,1) >= ROW(1, (SELECT 1 FROM t1 WHERE f1 >= ANY ( SELECT '1' )));
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
# -----------------------------------------------------------------
|
||||
# -- End of 5.1 tests.
|
||||
# -----------------------------------------------------------------
|
||||
|
@ -1237,3 +1237,14 @@ SELECT a FROM v2;
|
||||
a
|
||||
DROP USER mysqluser1;
|
||||
DROP DATABASE mysqltest1;
|
||||
USE test;
|
||||
#
|
||||
# Bug#47734: Assertion failed: ! is_set() when locking a view with non-existing definer
|
||||
#
|
||||
DROP VIEW IF EXISTS v1;
|
||||
CREATE DEFINER=`unknown`@`unknown` SQL SECURITY DEFINER VIEW v1 AS SELECT 1;
|
||||
Warnings:
|
||||
Note 1449 The user specified as a definer ('unknown'@'unknown') does not exist
|
||||
LOCK TABLES v1 READ;
|
||||
ERROR HY000: The user specified as a definer ('unknown'@'unknown') does not exist
|
||||
DROP VIEW v1;
|
||||
|
12
mysql-test/std_data/bug48449.frm
Normal file
12
mysql-test/std_data/bug48449.frm
Normal file
@ -0,0 +1,12 @@
|
||||
TYPE=VIEW
|
||||
query=select `test`.`t2`.`a` AS `a` from `test`.`t2`
|
||||
md5=5e6eaf216e7b016fcedfd4e1113517af
|
||||
updatable=1
|
||||
algorithm=0
|
||||
definer_user=root
|
||||
definer_host=localhost
|
||||
suid=2
|
||||
with_check_option=0
|
||||
timestamp=2010-01-01 15:00:00
|
||||
create-version=1
|
||||
source=select * from t2
|
@ -46,3 +46,46 @@ include/stop_slave.inc
|
||||
SET GLOBAL long_query_time= @old_long_query_time;
|
||||
SET GLOBAL log_output= @old_log_output;
|
||||
include/start_slave.inc
|
||||
stop slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
reset master;
|
||||
reset slave;
|
||||
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
|
||||
start slave;
|
||||
SET @old_log_output= @@log_output;
|
||||
SET GLOBAL log_output= 'TABLE';
|
||||
SET GLOBAL long_query_time= 2;
|
||||
SET @old_long_query_time= @@long_query_time;
|
||||
SET SESSION long_query_time= 2;
|
||||
TRUNCATE mysql.slow_log;
|
||||
include/stop_slave.inc
|
||||
SET @old_log_output= @@log_output;
|
||||
SET GLOBAL log_output= 'TABLE';
|
||||
SET @old_long_query_time= @@long_query_time;
|
||||
SET GLOBAL long_query_time= 2;
|
||||
TRUNCATE mysql.slow_log;
|
||||
include/start_slave.inc
|
||||
CREATE TABLE t1 (a int, b int);
|
||||
********************************************************************
|
||||
**** INSERT one row that exceeds long_query_time
|
||||
**** Outcome: query ends up in both master and slave slow log
|
||||
********************************************************************
|
||||
INSERT INTO t1 values(1, sleep(3));
|
||||
### Assertion is good. Both Master and Slave exhibit the
|
||||
### same number of queries in slow log: 1
|
||||
TRUNCATE mysql.slow_log;
|
||||
TRUNCATE mysql.slow_log;
|
||||
********************************************************************
|
||||
**** Now do inserts again, but first add an index to the table.
|
||||
**** Outcome: Note that the slave contains the same one entry (as
|
||||
**** the master does) whereas before the patch it did not.
|
||||
********************************************************************
|
||||
ALTER TABLE t1 ADD INDEX id1(a);
|
||||
INSERT INTO t1 values(1, sleep(3));
|
||||
### Assertion is good. Both Master and Slave exhibit the
|
||||
### same number of queries in slow log: 1
|
||||
SET @@global.log_output= @old_log_output;
|
||||
SET @@global.long_query_time= @old_long_query_time;
|
||||
DROP TABLE t1;
|
||||
SET @@global.log_output= @old_log_output;
|
||||
SET @@global.long_query_time= @old_long_query_time;
|
||||
|
@ -4,6 +4,7 @@
|
||||
# if the path of the load data file is a symbolic link.
|
||||
#
|
||||
--source include/master-slave.inc
|
||||
--source include/not_windows.inc
|
||||
--source include/have_binlog_format_statement.inc
|
||||
|
||||
create table t1(a int not null auto_increment, b int, primary key(a) );
|
||||
|
@ -191,3 +191,119 @@ source include/start_slave.inc;
|
||||
|
||||
disconnect extra;
|
||||
disconnect extra2;
|
||||
|
||||
#
|
||||
# BUG#50620: Adding an index to a table prevents slave from logging into slow log
|
||||
#
|
||||
|
||||
-- source include/master-slave-reset.inc
|
||||
|
||||
-- connection master
|
||||
SET @old_log_output= @@log_output;
|
||||
SET GLOBAL log_output= 'TABLE';
|
||||
SET GLOBAL long_query_time= 2;
|
||||
SET @old_long_query_time= @@long_query_time;
|
||||
SET SESSION long_query_time= 2;
|
||||
TRUNCATE mysql.slow_log;
|
||||
-- connection slave
|
||||
|
||||
-- source include/stop_slave.inc
|
||||
SET @old_log_output= @@log_output;
|
||||
SET GLOBAL log_output= 'TABLE';
|
||||
SET @old_long_query_time= @@long_query_time;
|
||||
SET GLOBAL long_query_time= 2;
|
||||
TRUNCATE mysql.slow_log;
|
||||
-- source include/start_slave.inc
|
||||
|
||||
let $slow_query= INSERT INTO t1 values(1, sleep(3));
|
||||
|
||||
-- connection master
|
||||
CREATE TABLE t1 (a int, b int);
|
||||
|
||||
-- echo ********************************************************************
|
||||
-- echo **** INSERT one row that exceeds long_query_time
|
||||
-- echo **** Outcome: query ends up in both master and slave slow log
|
||||
-- echo ********************************************************************
|
||||
|
||||
-- disable_warnings
|
||||
-- eval $slow_query
|
||||
-- enable_warnings
|
||||
|
||||
let $master_slow_query= `SELECT count(*) = 1 FROM mysql.slow_log WHERE sql_text like '$slow_query'`;
|
||||
-- sync_slave_with_master
|
||||
let $slave_slow_query= `SELECT count(*) = 1 FROM mysql.slow_log WHERE sql_text like '$slow_query'`;
|
||||
|
||||
if (`SELECT $master_slow_query != $slave_slow_query`)
|
||||
{
|
||||
-- connection master
|
||||
-- echo ***********************************************
|
||||
-- echo ** DUMPING MASTER SLOW LOG CONTENTS
|
||||
-- echo ***********************************************
|
||||
SELECT * FROM mysql.slow_log;
|
||||
|
||||
-- connection slave
|
||||
-- echo ***********************************************
|
||||
-- echo ** DUMPING SLAVE SLOW LOG CONTENTS
|
||||
-- echo ***********************************************
|
||||
SELECT * FROM mysql.slow_log;
|
||||
|
||||
-- die "Assertion failed! Master and slave slow log contents differ. Bailing out!"
|
||||
}
|
||||
|
||||
if (`SELECT $master_slow_query = $slave_slow_query`)
|
||||
{
|
||||
-- echo ### Assertion is good. Both Master and Slave exhibit the
|
||||
-- echo ### same number of queries in slow log: $master_slow_query
|
||||
}
|
||||
|
||||
TRUNCATE mysql.slow_log;
|
||||
-- connection master
|
||||
TRUNCATE mysql.slow_log;
|
||||
|
||||
-- echo ********************************************************************
|
||||
-- echo **** Now do inserts again, but first add an index to the table.
|
||||
-- echo **** Outcome: Note that the slave contains the same one entry (as
|
||||
-- echo **** the master does) whereas before the patch it did not.
|
||||
-- echo ********************************************************************
|
||||
|
||||
ALTER TABLE t1 ADD INDEX id1(a);
|
||||
|
||||
-- disable_warnings
|
||||
-- eval $slow_query
|
||||
-- enable_warnings
|
||||
|
||||
let $master_slow_query= `SELECT count(*) = 1 FROM mysql.slow_log WHERE sql_text like '$slow_query'`;
|
||||
-- sync_slave_with_master
|
||||
let $slave_slow_query= `SELECT count(*) = 1 FROM mysql.slow_log WHERE sql_text like '$slow_query'`;
|
||||
|
||||
if (`SELECT $master_slow_query != $slave_slow_query`)
|
||||
{
|
||||
-- connection master
|
||||
-- echo ***********************************************
|
||||
-- echo ** DUMPING MASTER SLOW LOG CONTENTS
|
||||
-- echo ***********************************************
|
||||
SELECT * FROM mysql.slow_log;
|
||||
|
||||
-- connection slave
|
||||
-- echo ***********************************************
|
||||
-- echo ** DUMPING SLAVE SLOW LOG CONTENTS
|
||||
-- echo ***********************************************
|
||||
SELECT * FROM mysql.slow_log;
|
||||
|
||||
-- die "Assertion failed! Master and slave slow log contents differ. Bailing out!"
|
||||
}
|
||||
|
||||
if (`SELECT $master_slow_query = $slave_slow_query`)
|
||||
{
|
||||
-- echo ### Assertion is good. Both Master and Slave exhibit the
|
||||
-- echo ### same number of queries in slow log: $master_slow_query
|
||||
}
|
||||
|
||||
-- connection master
|
||||
SET @@global.log_output= @old_log_output;
|
||||
SET @@global.long_query_time= @old_long_query_time;
|
||||
DROP TABLE t1;
|
||||
|
||||
-- sync_slave_with_master
|
||||
SET @@global.log_output= @old_log_output;
|
||||
SET @@global.long_query_time= @old_long_query_time;
|
||||
|
@ -20,5 +20,21 @@ sleep(2)
|
||||
SELECT count(*) > 0 FROM mysql.slow_log;
|
||||
count(*) > 0
|
||||
1
|
||||
'Bug#47905 stored procedures not logged correctly to slow query log'
|
||||
TRUNCATE mysql.slow_log;
|
||||
CREATE PROCEDURE p_test()
|
||||
BEGIN
|
||||
select sleep(2);
|
||||
select 1;
|
||||
END//
|
||||
CALL p_test();
|
||||
sleep(2)
|
||||
0
|
||||
1
|
||||
1
|
||||
SELECT count(*) > 0 FROM mysql.slow_log;
|
||||
count(*) > 0
|
||||
1
|
||||
DROP PROCEDURE p_test;
|
||||
SET @@global.log_output = @global_log_output;
|
||||
SET @global.slow_query_log = @global_slow_query_log;
|
||||
|
@ -31,6 +31,27 @@ SELECT sleep(2);
|
||||
|
||||
SELECT count(*) > 0 FROM mysql.slow_log;
|
||||
|
||||
|
||||
#==========================================================================
|
||||
--echo 'Bug#47905 stored procedures not logged correctly to slow query log'
|
||||
#==========================================================================
|
||||
# assumes logging to table turned on with long_query_time=1 as above
|
||||
|
||||
TRUNCATE mysql.slow_log;
|
||||
|
||||
DELIMITER //;
|
||||
CREATE PROCEDURE p_test()
|
||||
BEGIN
|
||||
select sleep(2);
|
||||
select 1;
|
||||
END//
|
||||
DELIMITER ;//
|
||||
|
||||
CALL p_test();
|
||||
SELECT count(*) > 0 FROM mysql.slow_log;
|
||||
DROP PROCEDURE p_test;
|
||||
|
||||
|
||||
#restore
|
||||
SET @@global.log_output = @global_log_output;
|
||||
SET @global.slow_query_log = @global_slow_query_log;
|
||||
|
@ -1658,3 +1658,14 @@ INSERT INTO t1 (col1, col2) VALUES (1, "value");
|
||||
REPAIR TABLE t1;
|
||||
DROP TABLE t1;
|
||||
remove_file $MYSQLD_DATADIR/test/t1.ARM;
|
||||
|
||||
--echo #
|
||||
--echo # BUG#48757 - missing .ARZ file causes server crash
|
||||
--echo #
|
||||
CREATE TABLE t1(a INT) ENGINE=ARCHIVE;
|
||||
FLUSH TABLE t1;
|
||||
--remove_file $MYSQLD_DATADIR/test/t1.ARZ
|
||||
--error ER_FILE_NOT_FOUND
|
||||
SELECT * FROM t1;
|
||||
--error ER_BAD_TABLE_ERROR
|
||||
DROP TABLE t1;
|
||||
|
63
mysql-test/t/bug39022.test
Normal file
63
mysql-test/t/bug39022.test
Normal file
@ -0,0 +1,63 @@
|
||||
-- source include/have_log_bin.inc
|
||||
-- source include/have_innodb.inc
|
||||
-- source include/not_binlog_format_row.inc
|
||||
|
||||
--echo #
|
||||
--echo # Bug #39022: Mysql randomly crashing in lock_sec_rec_cons_read_sees
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(a TINYINT NOT NULL,b TINYINT,PRIMARY KEY(b)) ENGINE=innodb;
|
||||
CREATE TABLE t2(d TINYINT NOT NULL,UNIQUE KEY(d)) ENGINE=innodb;
|
||||
INSERT INTO t1 VALUES (13,0),(8,1),(9,2),(6,3),
|
||||
(11,5),(11,6),(7,7),(7,8),(4,9),(6,10),(3,11),(11,12),
|
||||
(12,13),(7,14);
|
||||
INSERT INTO t2 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),
|
||||
(11),(12),(13),(14);
|
||||
|
||||
connect (thread1, localhost, root,,);
|
||||
connect (thread2, localhost, root,,);
|
||||
|
||||
connection thread1;
|
||||
--echo # in thread1
|
||||
START TRANSACTION;
|
||||
|
||||
connection thread2;
|
||||
--echo # in thread2
|
||||
REPLACE INTO t2 VALUES (-17);
|
||||
SELECT d FROM t2,t1 WHERE d=(SELECT MAX(a) FROM t1 WHERE t1.a > t2.d);
|
||||
|
||||
connection thread1;
|
||||
--echo # in thread1
|
||||
REPLACE INTO t1(a,b) VALUES (67,20);
|
||||
|
||||
connection thread2;
|
||||
--echo # in thread2
|
||||
COMMIT;
|
||||
START TRANSACTION;
|
||||
REPLACE INTO t1(a,b) VALUES (65,-50);
|
||||
REPLACE INTO t2 VALUES (-91);
|
||||
send;
|
||||
SELECT d FROM t2,t1 WHERE d=(SELECT MAX(a) FROM t1 WHERE t1.a > t2.d); #waits
|
||||
|
||||
connection thread1;
|
||||
--echo # in thread1
|
||||
|
||||
--echo # should not crash
|
||||
--error ER_LOCK_DEADLOCK
|
||||
SELECT d FROM t2,t1 WHERE d=(SELECT MAX(a) FROM t1 WHERE t1.a > t2.d); #crashes
|
||||
|
||||
connection thread2;
|
||||
--echo # in thread2
|
||||
REAP;
|
||||
|
||||
disconnect thread2;
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
||||
connection thread1;
|
||||
--echo # in thread1;
|
||||
disconnect thread1;
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
||||
connection default;
|
||||
|
||||
DROP TABLE t1,t2;
|
@ -1807,17 +1807,17 @@ unlock tables;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug#41441 repair csv table crashes debug server
|
||||
# Bug#33717 INSERT...(default) fails for enum. Crashes CSV tables, loads spaces for MyISAM
|
||||
#
|
||||
# Note: The test should be removed after Bug#33717 is fixed
|
||||
CREATE TABLE t1 (e enum('foo','bar') NOT NULL) ENGINE = CSV;
|
||||
INSERT INTO t1 VALUES();
|
||||
INSERT INTO t1 VALUES(default);
|
||||
INSERT INTO t1 VALUES(0);
|
||||
INSERT INTO t1 VALUES(3);
|
||||
INSERT INTO t1 VALUES(-1);
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
create table t1(a enum ('a') not null) engine=csv;
|
||||
insert into t1 values (2);
|
||||
--error ER_CRASHED_ON_USAGE
|
||||
select * from t1 limit 1;
|
||||
repair table t1;
|
||||
select * from t1 limit 1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #40814 CSV engine does not parse \X characters when they occur in unquoted fields
|
||||
|
@ -553,6 +553,27 @@ SELECT count(*) FROM t1 WHERE
|
||||
|
||||
DROP TABLE t1,t2,t3;
|
||||
|
||||
#
|
||||
# BUG#50351 - ft_min_word_len=2 Causes query to hang
|
||||
#
|
||||
CREATE TABLE t1 (a VARCHAR(4), FULLTEXT(a));
|
||||
INSERT INTO t1 VALUES
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),
|
||||
('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('cwrd'),('awrd'),('cwrd'),
|
||||
('awrd');
|
||||
SELECT COUNT(*) FROM t1 WHERE MATCH(a) AGAINST("+awrd bwrd* +cwrd*" IN BOOLEAN MODE);
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #49445: Assertion failed: 0, file .\item_row.cc, line 55 with
|
||||
|
@ -693,6 +693,21 @@ SELECT 1 FROM t1 WHERE t1.a NOT IN
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
#
|
||||
# Bug #49487: crash with explain extended and group_concat in a derived table
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (f1 INT);
|
||||
INSERT INTO t1 VALUES (),();
|
||||
|
||||
EXPLAIN EXTENDED SELECT 1 FROM
|
||||
(SELECT DISTINCT GROUP_CONCAT(td.f1) FROM t1,t1 AS td GROUP BY td.f1) AS d,t1;
|
||||
|
||||
SELECT 1 FROM
|
||||
(SELECT DISTINCT GROUP_CONCAT(td.f1) FROM t1,t1 AS td GROUP BY td.f1) AS d,t1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
#
|
||||
|
@ -1159,3 +1159,53 @@ SELECT COUNT(i) FROM t1 WHERE i > 1;
|
||||
DROP TABLE t1;
|
||||
SET @@sql_mode = @old_sql_mode;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #45640: optimizer bug produces wrong results
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1 (a INT, b INT);
|
||||
INSERT INTO t1 VALUES (4, 40), (1, 10), (2, 20), (2, 20), (3, 30);
|
||||
|
||||
--echo # should return 4 ordered records:
|
||||
SELECT (SELECT t1.a) aa, COUNT(DISTINCT b) FROM t1 GROUP BY aa;
|
||||
|
||||
SELECT (SELECT (SELECT t1.a)) aa, COUNT(DISTINCT b) FROM t1 GROUP BY aa;
|
||||
|
||||
SELECT (SELECT t1.a) aa, COUNT(DISTINCT b) FROM t1 GROUP BY aa+0;
|
||||
|
||||
--echo # should return the same result in a reverse order:
|
||||
SELECT (SELECT t1.a) aa, COUNT(DISTINCT b) FROM t1 GROUP BY -aa;
|
||||
|
||||
--echo # execution plan should not use temporary table:
|
||||
EXPLAIN EXTENDED
|
||||
SELECT (SELECT t1.a) aa, COUNT(DISTINCT b) FROM t1 GROUP BY aa+0;
|
||||
|
||||
EXPLAIN EXTENDED
|
||||
SELECT (SELECT t1.a) aa, COUNT(DISTINCT b) FROM t1 GROUP BY -aa;
|
||||
|
||||
--echo # should return only one record
|
||||
SELECT (SELECT tt.a FROM t1 tt LIMIT 1) aa, COUNT(DISTINCT b) FROM t1
|
||||
GROUP BY aa;
|
||||
|
||||
CREATE TABLE t2 SELECT DISTINCT a FROM t1;
|
||||
|
||||
--echo # originally reported queries (1st two columns of next two query
|
||||
--echo # results should be same):
|
||||
|
||||
SELECT (SELECT t2.a FROM t2 WHERE t2.a = t1.a) aa, b, COUNT(DISTINCT b)
|
||||
FROM t1 GROUP BY aa, b;
|
||||
SELECT (SELECT t2.a FROM t2 WHERE t2.a = t1.a) aa, b, COUNT( b)
|
||||
FROM t1 GROUP BY aa, b;
|
||||
|
||||
--echo # ORDER BY for sure:
|
||||
|
||||
SELECT (SELECT t2.a FROM t2 WHERE t2.a = t1.a) aa, b, COUNT(DISTINCT b)
|
||||
FROM t1 GROUP BY aa, b ORDER BY -aa, -b;
|
||||
SELECT (SELECT t2.a FROM t2 WHERE t2.a = t1.a) aa, b, COUNT( b)
|
||||
FROM t1 GROUP BY aa, b ORDER BY -aa, -b;
|
||||
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
--echo #
|
||||
|
||||
--echo # End of 5.1 tests
|
||||
|
@ -1044,6 +1044,16 @@ SELECT a, MAX(b) FROM t WHERE b GROUP BY a;
|
||||
|
||||
DROP TABLE t;
|
||||
|
||||
#
|
||||
# BUG#49902 - SELECT returns incorrect results
|
||||
#
|
||||
CREATE TABLE t1(a INT NOT NULL, b INT NOT NULL, KEY (b));
|
||||
INSERT INTO t1 VALUES(1,1),(2,1);
|
||||
ANALYZE TABLE t1;
|
||||
SELECT 1 AS c, b FROM t1 WHERE b IN (1,2) GROUP BY c, b;
|
||||
SELECT a FROM t1 WHERE b=1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
|
||||
|
@ -536,6 +536,16 @@ DROP PROCEDURE p1;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug #49324: more valgrind errors in test_if_skip_sort_order
|
||||
--echo #
|
||||
CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=innodb ;
|
||||
--echo #should not cause valgrind warnings
|
||||
SELECT 1 FROM t1 JOIN t1 a USING(a) GROUP BY t1.a,t1.a;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
|
||||
|
@ -804,3 +804,15 @@ DEALLOCATE PREPARE stmt;
|
||||
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
#
|
||||
# Bug#45195 valgrind warnings about uninitialized values in store_record_in_cache()
|
||||
#
|
||||
CREATE TABLE t1(a CHAR(9),b INT,KEY(b),KEY(a)) ENGINE=MYISAM;
|
||||
CREATE TABLE t2(a CHAR(9),b INT,KEY(b),KEY(a)) ENGINE=MYISAM;
|
||||
INSERT INTO t1 VALUES ('1',null),(null,null);
|
||||
INSERT INTO t2 VALUES ('1',null),(null,null);
|
||||
CREATE TABLE mm1(a CHAR(9),b INT,KEY(b),KEY(a))
|
||||
ENGINE=MERGE UNION=(t1,t2);
|
||||
SELECT t1.a FROM mm1,t1;
|
||||
DROP TABLE t1, t2, mm1;
|
||||
|
@ -638,5 +638,17 @@ drop table t1, t2, t3;
|
||||
# Add further tests from here
|
||||
#
|
||||
|
||||
--echo #
|
||||
--echo # Bug#49534: multitable IGNORE update with sql_safe_updates error
|
||||
--echo # causes debug assertion
|
||||
--echo #
|
||||
CREATE TABLE t1( a INT, KEY( a ) );
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
SET SESSION sql_safe_updates = 1;
|
||||
--echo # Must not cause failed assertion
|
||||
--error ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE
|
||||
UPDATE IGNORE t1, t1 t1a SET t1.a = 1 WHERE t1a.a = 1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo end of tests
|
||||
|
@ -1200,6 +1200,17 @@ CHECKSUM TABLE t1 EXTENDED;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # BUG#48438 - crash with error in unioned query against merge table and view...
|
||||
--echo #
|
||||
SET GLOBAL table_open_cache=3;
|
||||
CREATE TABLE t1(a INT);
|
||||
SELECT 1 FROM t1 AS a1, t1 AS a2, t1 AS a3, t1 AS a4 FOR UPDATE;
|
||||
SELECT TABLE_ROWS, DATA_LENGTH FROM INFORMATION_SCHEMA.TABLES
|
||||
WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1';
|
||||
DROP TABLE t1;
|
||||
SET GLOBAL table_open_cache=DEFAULT;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
|
||||
@ -1565,5 +1576,18 @@ SET myisam_sort_buffer_size=@@global.myisam_sort_buffer_size;
|
||||
CHECK TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # BUG#49628 - corrupt table after legal SQL, LONGTEXT column
|
||||
--echo #
|
||||
CREATE TABLE t1(a INT, b LONGTEXT, UNIQUE(a));
|
||||
REPLACE INTO t1 VALUES
|
||||
(1, REPEAT('a', 129015)),(1, NULL),
|
||||
(2, NULL),(3, NULL),(4, NULL),(5, NULL),(6, NULL),(7, NULL),
|
||||
(1, REPEAT('b', 129016)),(1, NULL),
|
||||
(1, REPEAT('c', 129015)),(1, REPEAT('d', 129015));
|
||||
CHECK TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
||||
|
6
mysql-test/t/no_binlog.test
Normal file
6
mysql-test/t/no_binlog.test
Normal file
@ -0,0 +1,6 @@
|
||||
-- source include/not_embedded.inc
|
||||
|
||||
# BUG#50780: 'show binary logs' debug assertion when binary logging is disabled
|
||||
|
||||
-- error ER_NO_BINARY_LOGGING
|
||||
SHOW BINARY LOGS;
|
81
mysql-test/t/partition_debug_sync.test
Normal file
81
mysql-test/t/partition_debug_sync.test
Normal file
@ -0,0 +1,81 @@
|
||||
#--disable_abort_on_error
|
||||
#
|
||||
# Test for the partition storage engine which require DEBUG_SYNC feature to
|
||||
# Created by Mattias Jonsson
|
||||
#
|
||||
--source include/have_partition.inc
|
||||
--source include/have_debug_sync.inc
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1, t2;
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
--enable_warnings
|
||||
|
||||
--echo #
|
||||
--echo # Bug#42438: Crash ha_partition::change_table_ptr
|
||||
--echo # Test when remove partitioning is done while drop table is waiting
|
||||
--echo # for the table.
|
||||
connect(con1, localhost, root,,);
|
||||
--echo # Con 1
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
CREATE TABLE t1
|
||||
(a INTEGER,
|
||||
b INTEGER NOT NULL,
|
||||
KEY (b))
|
||||
ENGINE = MYISAM
|
||||
/*!50100 PARTITION BY RANGE (a)
|
||||
(PARTITION p0 VALUES LESS THAN (2),
|
||||
PARTITION p1 VALUES LESS THAN (20),
|
||||
PARTITION p2 VALUES LESS THAN (100),
|
||||
PARTITION p3 VALUES LESS THAN MAXVALUE ) */;
|
||||
SET DEBUG_SYNC= 'alter_table_before_create_table_no_lock SIGNAL removing_partitioning WAIT_FOR waiting_for_alter';
|
||||
SET DEBUG_SYNC= 'alter_table_before_main_binlog SIGNAL partitioning_removed';
|
||||
--send ALTER TABLE t1 REMOVE PARTITIONING
|
||||
connection default;
|
||||
--echo # Con default
|
||||
SET DEBUG_SYNC= 'now WAIT_FOR removing_partitioning';
|
||||
SET DEBUG_SYNC= 'waiting_for_table SIGNAL waiting_for_alter';
|
||||
SET DEBUG_SYNC= 'rm_table_part2_before_delete_table WAIT_FOR partitioning_removed';
|
||||
DROP TABLE IF EXISTS t1;
|
||||
--echo # Con 1
|
||||
connection con1;
|
||||
--reap
|
||||
connection default;
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
connection con1;
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
|
||||
--echo #
|
||||
--echo # Bug#42438: Crash ha_partition::change_table_ptr
|
||||
--echo # Test when remove partitioning is failing due to drop table is already
|
||||
--echo # in progress.
|
||||
CREATE TABLE t2
|
||||
(a INTEGER,
|
||||
b INTEGER NOT NULL,
|
||||
KEY (b))
|
||||
ENGINE = MYISAM
|
||||
/*!50100 PARTITION BY RANGE (a)
|
||||
(PARTITION p0 VALUES LESS THAN (2),
|
||||
PARTITION p1 VALUES LESS THAN (20),
|
||||
PARTITION p2 VALUES LESS THAN (100),
|
||||
PARTITION p3 VALUES LESS THAN MAXVALUE ) */;
|
||||
SET DEBUG_SYNC= 'before_lock_tables_takes_lock SIGNAL removing_partitions WAIT_FOR waiting_for_alter';
|
||||
SET DEBUG_SYNC= 'alter_table_before_rename_result_table WAIT_FOR delete_done';
|
||||
--send ALTER TABLE t2 REMOVE PARTITIONING
|
||||
connection default;
|
||||
--echo # Con default
|
||||
SET DEBUG_SYNC= 'now WAIT_FOR removing_partitions';
|
||||
SET DEBUG_SYNC= 'waiting_for_table SIGNAL waiting_for_alter';
|
||||
SET DEBUG_SYNC= 'rm_table_part2_before_binlog SIGNAL delete_done';
|
||||
DROP TABLE IF EXISTS t2;
|
||||
--echo # Con 1
|
||||
connection con1;
|
||||
--error ER_NO_SUCH_TABLE
|
||||
--reap
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
disconnect con1;
|
||||
connection default;
|
||||
--echo # Con default
|
||||
SET DEBUG_SYNC= 'RESET';
|
||||
|
||||
--echo End of 5.1 tests
|
@ -57,5 +57,48 @@ SELECT f2 ();
|
||||
|
||||
DROP SCHEMA testdb;
|
||||
|
||||
USE test;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#50423: Crash on second call of a procedure dropping a trigger
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TRIGGER IF EXISTS tr1;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1 (f1 INTEGER);
|
||||
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @aux = 1;
|
||||
CREATE PROCEDURE p1 () DROP TRIGGER tr1;
|
||||
|
||||
CALL p1 ();
|
||||
--error ER_TRG_DOES_NOT_EXIST
|
||||
CALL p1 ();
|
||||
|
||||
DROP TABLE t1;
|
||||
DROP PROCEDURE p1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#50423: Crash on second call of a procedure dropping a trigger
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP TABLE IF EXISTS t1;
|
||||
DROP TRIGGER IF EXISTS tr1;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1 (f1 INTEGER);
|
||||
CREATE TRIGGER tr1 BEFORE INSERT ON t1 FOR EACH ROW SET @aux = 1;
|
||||
CREATE PROCEDURE p1 () DROP TRIGGER tr1;
|
||||
|
||||
CALL p1 ();
|
||||
--error ER_TRG_DOES_NOT_EXIST
|
||||
CALL p1 ();
|
||||
|
||||
DROP TABLE t1;
|
||||
DROP PROCEDURE p1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -413,6 +413,43 @@ let $wait_condition=
|
||||
--source include/wait_condition.inc
|
||||
DROP PROCEDURE p;
|
||||
|
||||
#
|
||||
# Bug#47736 killing a select from a view when the view is processing a function, asserts
|
||||
#
|
||||
CREATE TABLE t1(a int);
|
||||
INSERT INTO t1 VALUES (1);
|
||||
CREATE FUNCTION f1 (inp TEXT) RETURNS INT NO SQL RETURN sleep(60);
|
||||
CREATE VIEW v1 AS SELECT f1('a') FROM t1;
|
||||
|
||||
--connect (con1, localhost, root,,)
|
||||
--let $ID_1= `SELECT connection_id()`
|
||||
--send SELECT * FROM v1;
|
||||
|
||||
--connect (con2, localhost, root,,)
|
||||
--let $ID_2= `SELECT connection_id()`
|
||||
--send SELECT * FROM v1
|
||||
|
||||
--connection default
|
||||
--disable_query_log
|
||||
--eval KILL QUERY $ID_2
|
||||
--eval KILL QUERY $ID_1
|
||||
--enable_query_log
|
||||
|
||||
--connection con1
|
||||
--error ER_QUERY_INTERRUPTED
|
||||
--reap
|
||||
--connection con2
|
||||
--error ER_QUERY_INTERRUPTED
|
||||
--reap
|
||||
|
||||
--connection default
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
DROP FUNCTION f1;
|
||||
--disconnect con1
|
||||
--disconnect con2
|
||||
|
||||
|
||||
--echo # ------------------------------------------------------------------
|
||||
--echo # -- End of 5.1 tests
|
||||
--echo # ------------------------------------------------------------------
|
||||
|
@ -3820,4 +3820,21 @@ SELECT 1 FROM t1 WHERE a <> SOME
|
||||
);
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug #45989 take 2 : memory leak after explain encounters an
|
||||
--echo # error in the query
|
||||
--echo #
|
||||
|
||||
CREATE TABLE t1(a LONGTEXT);
|
||||
INSERT INTO t1 VALUES (repeat('a',@@global.max_allowed_packet));
|
||||
INSERT INTO t1 VALUES (repeat('b',@@global.max_allowed_packet));
|
||||
|
||||
--error ER_BAD_FIELD_ERROR
|
||||
EXPLAIN EXTENDED SELECT DISTINCT 1 FROM t1,
|
||||
(SELECT DISTINCTROW a AS away FROM t1 GROUP BY a WITH ROLLUP) AS d1
|
||||
WHERE t1.a = d1.a;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo End of 5.1 tests.
|
||||
|
@ -425,4 +425,17 @@ select hex(a) from t1;
|
||||
show create table t1;
|
||||
drop table t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#50591 bit(31) causes Duplicate entry '1-NULL' for key 'group_key'
|
||||
--echo #
|
||||
CREATE TABLE t1(a INT, b BIT(7) NOT NULL);
|
||||
INSERT INTO t1 VALUES (NULL, 0),(NULL, 0);
|
||||
SELECT SUM(a) FROM t1 GROUP BY b, a;
|
||||
DROP TABLE t1;
|
||||
|
||||
CREATE TABLE t1(a INT, b BIT(7) NOT NULL, c BIT(8) NOT NULL);
|
||||
INSERT INTO t1 VALUES (NULL, 0, 0),(NULL, 0, 0);
|
||||
SELECT SUM(a) FROM t1 GROUP BY c, b, a;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -3906,6 +3906,52 @@ ALTER TABLE v1;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#48449: hang on show create view after upgrading when
|
||||
--echo # view contains function of view
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP VIEW IF EXISTS v1,v2;
|
||||
DROP TABLE IF EXISTS t1,t2;
|
||||
DROP FUNCTION IF EXISTS f1;
|
||||
--enable_warnings
|
||||
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE TABLE t2 (a INT);
|
||||
|
||||
delimiter //;
|
||||
CREATE FUNCTION f1() RETURNS INT
|
||||
BEGIN
|
||||
SELECT a FROM v2 INTO @a;
|
||||
RETURN @a;
|
||||
END//
|
||||
delimiter ;//
|
||||
|
||||
--echo # Trigger pre-locking when opening v2.
|
||||
CREATE VIEW v1 AS SELECT f1() FROM t1;
|
||||
|
||||
let $MYSQLD_DATADIR= `SELECT @@datadir`;
|
||||
copy_file std_data/bug48449.frm $MYSQLD_DATADIR/test/v2.frm;
|
||||
|
||||
SHOW CREATE VIEW v1;
|
||||
|
||||
DROP VIEW v1,v2;
|
||||
DROP TABLE t1,t2;
|
||||
DROP FUNCTION f1;
|
||||
|
||||
|
||||
#
|
||||
# Bug#48294 assertion when creating a view based on some row() construct in select query
|
||||
#
|
||||
CREATE TABLE t1(f1 INT);
|
||||
INSERT INTO t1 VALUES ();
|
||||
|
||||
CREATE VIEW v1 AS SELECT 1 FROM t1 WHERE
|
||||
ROW(1,1) >= ROW(1, (SELECT 1 FROM t1 WHERE f1 >= ANY ( SELECT '1' )));
|
||||
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo # -----------------------------------------------------------------
|
||||
--echo # -- End of 5.1 tests.
|
||||
|
@ -1532,3 +1532,17 @@ SELECT a FROM v2;
|
||||
--disconnect mysqluser1
|
||||
DROP USER mysqluser1;
|
||||
DROP DATABASE mysqltest1;
|
||||
USE test;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#47734: Assertion failed: ! is_set() when locking a view with non-existing definer
|
||||
--echo #
|
||||
|
||||
--disable_warnings
|
||||
DROP VIEW IF EXISTS v1;
|
||||
--enable_warnings
|
||||
|
||||
CREATE DEFINER=`unknown`@`unknown` SQL SECURITY DEFINER VIEW v1 AS SELECT 1;
|
||||
--error ER_NO_SUCH_USER
|
||||
LOCK TABLES v1 READ;
|
||||
DROP VIEW v1;
|
||||
|
@ -1028,10 +1028,10 @@ void print_defaults(const char *conf_file, const char **groups)
|
||||
}
|
||||
}
|
||||
puts("\nThe following options may be given as the first argument:\n\
|
||||
--print-defaults Print the program argument list and exit\n\
|
||||
--no-defaults Don't read default options from any options file\n\
|
||||
--defaults-file=# Only read default options from the given file #\n\
|
||||
--defaults-extra-file=# Read this file after the global files are read");
|
||||
--print-defaults Print the program argument list and exit.\n\
|
||||
--no-defaults Don't read default options from any option file.\n\
|
||||
--defaults-file=# Only read default options from the given file #.\n\
|
||||
--defaults-extra-file=# Read this file after the global files are read.");
|
||||
}
|
||||
|
||||
#include <help_end.h>
|
||||
|
11
sql/field.cc
11
sql/field.cc
@ -1779,11 +1779,10 @@ uint Field::fill_cache_field(CACHE_FIELD *copy)
|
||||
uint store_length;
|
||||
copy->str=ptr;
|
||||
copy->length=pack_length();
|
||||
copy->blob_field=0;
|
||||
copy->field= this;
|
||||
if (flags & BLOB_FLAG)
|
||||
{
|
||||
copy->blob_field=(Field_blob*) this;
|
||||
copy->strip=0;
|
||||
copy->type= CACHE_BLOB;
|
||||
copy->length-= table->s->blob_ptr_size;
|
||||
return copy->length;
|
||||
}
|
||||
@ -1791,15 +1790,15 @@ uint Field::fill_cache_field(CACHE_FIELD *copy)
|
||||
(type() == MYSQL_TYPE_STRING && copy->length >= 4 &&
|
||||
copy->length < 256))
|
||||
{
|
||||
copy->strip=1; /* Remove end space */
|
||||
copy->type= CACHE_STRIPPED;
|
||||
store_length= 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
copy->strip=0;
|
||||
copy->type= 0;
|
||||
store_length= 0;
|
||||
}
|
||||
return copy->length+ store_length;
|
||||
return copy->length + store_length;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1803,13 +1803,23 @@ void ha_partition::update_create_info(HA_CREATE_INFO *create_info)
|
||||
|
||||
void ha_partition::change_table_ptr(TABLE *table_arg, TABLE_SHARE *share)
|
||||
{
|
||||
handler **file_array= m_file;
|
||||
handler **file_array;
|
||||
table= table_arg;
|
||||
table_share= share;
|
||||
do
|
||||
/*
|
||||
m_file can be NULL when using an old cached table in DROP TABLE, when the
|
||||
table just has REMOVED PARTITIONING, see Bug#42438
|
||||
*/
|
||||
if (m_file)
|
||||
{
|
||||
(*file_array)->change_table_ptr(table_arg, share);
|
||||
} while (*(++file_array));
|
||||
file_array= m_file;
|
||||
DBUG_ASSERT(*file_array);
|
||||
do
|
||||
{
|
||||
(*file_array)->change_table_ptr(table_arg, share);
|
||||
} while (*(++file_array));
|
||||
}
|
||||
|
||||
if (m_added_file && m_added_file[0])
|
||||
{
|
||||
/* if in middle of a drop/rename etc */
|
||||
@ -6226,7 +6236,13 @@ void ha_partition::print_error(int error, myf errflag)
|
||||
thd->lex->sql_command != SQLCOM_TRUNCATE)
|
||||
m_part_info->print_no_partition_found(table);
|
||||
else
|
||||
m_file[m_last_part]->print_error(error, errflag);
|
||||
{
|
||||
/* In case m_file has not been initialized, like in bug#42438 */
|
||||
if (m_file)
|
||||
m_file[m_last_part]->print_error(error, errflag);
|
||||
else
|
||||
handler::print_error(error, errflag);
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
@ -6236,7 +6252,12 @@ bool ha_partition::get_error_message(int error, String *buf)
|
||||
DBUG_ENTER("ha_partition::get_error_message");
|
||||
|
||||
/* Should probably look for my own errors first */
|
||||
DBUG_RETURN(m_file[m_last_part]->get_error_message(error, buf));
|
||||
|
||||
/* In case m_file has not been initialized, like in bug#42438 */
|
||||
if (m_file)
|
||||
DBUG_RETURN(m_file[m_last_part]->get_error_message(error, buf));
|
||||
DBUG_RETURN(handler::get_error_message(error, buf));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
33
sql/item.cc
33
sql/item.cc
@ -4467,17 +4467,33 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
|
||||
It's not an Item_field in the select list so we must make a new
|
||||
Item_ref to point to the Item in the select list and replace the
|
||||
Item_field created by the parser with the new Item_ref.
|
||||
|
||||
NOTE: If we are fixing an alias reference inside ORDER/GROUP BY
|
||||
item tree, then we use new Item_ref as an intermediate value
|
||||
to resolve referenced item only.
|
||||
In this case the new Item_ref item is unused.
|
||||
*/
|
||||
Item_ref *rf= new Item_ref(context, db_name,table_name,field_name);
|
||||
if (!rf)
|
||||
return 1;
|
||||
thd->change_item_tree(reference, rf);
|
||||
|
||||
bool save_group_fix_field= thd->lex->current_select->group_fix_field;
|
||||
/*
|
||||
Because Item_ref never substitutes itself with other items
|
||||
in Item_ref::fix_fields(), we can safely use the original
|
||||
pointer to it even after fix_fields()
|
||||
*/
|
||||
return rf->fix_fields(thd, reference) || rf->check_cols(1);
|
||||
No need for recursive resolving of aliases.
|
||||
*/
|
||||
thd->lex->current_select->group_fix_field= 0;
|
||||
|
||||
bool ret= rf->fix_fields(thd, (Item **) &rf) || rf->check_cols(1);
|
||||
thd->lex->current_select->group_fix_field= save_group_fix_field;
|
||||
if (ret)
|
||||
return TRUE;
|
||||
|
||||
if (save_group_fix_field && alias_name_used)
|
||||
thd->change_item_tree(reference, *rf->ref);
|
||||
else
|
||||
thd->change_item_tree(reference, rf);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -5312,7 +5328,7 @@ int Item::save_in_field(Field *field, bool no_conversions)
|
||||
field->set_notnull();
|
||||
error=field->store(nr, unsigned_flag);
|
||||
}
|
||||
return error ? error : (field->table->in_use->is_error() ? 2 : 0);
|
||||
return error ? error : (field->table->in_use->is_error() ? 1 : 0);
|
||||
}
|
||||
|
||||
|
||||
@ -6704,7 +6720,8 @@ int Item_default_value::save_in_field(Field *field_arg, bool no_conversions)
|
||||
{
|
||||
if (!arg)
|
||||
{
|
||||
if (field_arg->flags & NO_DEFAULT_VALUE_FLAG)
|
||||
if (field_arg->flags & NO_DEFAULT_VALUE_FLAG &&
|
||||
field_arg->real_type() != MYSQL_TYPE_ENUM)
|
||||
{
|
||||
if (field_arg->reset())
|
||||
{
|
||||
|
@ -918,6 +918,7 @@ public:
|
||||
virtual bool change_context_processor(uchar *context) { return 0; }
|
||||
virtual bool reset_query_id_processor(uchar *query_id_arg) { return 0; }
|
||||
virtual bool is_expensive_processor(uchar *arg) { return 0; }
|
||||
virtual bool find_item_processor(uchar *arg) { return this == (void *) arg; }
|
||||
virtual bool register_field_in_read_map(uchar *arg) { return 0; }
|
||||
|
||||
virtual bool cache_const_expr_analyzer(uchar **arg);
|
||||
@ -2316,7 +2317,10 @@ public:
|
||||
return ref ? (*ref)->real_item() : this;
|
||||
}
|
||||
bool walk(Item_processor processor, bool walk_subquery, uchar *arg)
|
||||
{ return (*ref)->walk(processor, walk_subquery, arg); }
|
||||
{
|
||||
return (*ref)->walk(processor, walk_subquery, arg) ||
|
||||
(this->*processor)(arg);
|
||||
}
|
||||
virtual void print(String *str, enum_query_type query_type);
|
||||
bool result_as_longlong()
|
||||
{
|
||||
|
@ -71,7 +71,12 @@ bool Item_row::fix_fields(THD *thd, Item **ref)
|
||||
Item *item= *arg;
|
||||
used_tables_cache |= item->used_tables();
|
||||
const_item_cache&= item->const_item() && !with_null;
|
||||
if (const_item_cache)
|
||||
/*
|
||||
Some subqueries transformations aren't done in the view_prepare_mode thus
|
||||
is_null() will fail. So we skip is_null() calculation for CREATE VIEW as
|
||||
not necessary.
|
||||
*/
|
||||
if (const_item_cache && !thd->lex->view_prepare_mode)
|
||||
{
|
||||
if (item->cols() > 1)
|
||||
with_null|= item->null_inside();
|
||||
|
@ -3395,6 +3395,8 @@ String* Item_func_group_concat::val_str(String* str)
|
||||
|
||||
void Item_func_group_concat::print(String *str, enum_query_type query_type)
|
||||
{
|
||||
/* orig_args is not filled with valid values until fix_fields() */
|
||||
Item **pargs= fixed ? orig_args : args;
|
||||
str->append(STRING_WITH_LEN("group_concat("));
|
||||
if (distinct)
|
||||
str->append(STRING_WITH_LEN("distinct "));
|
||||
@ -3402,7 +3404,7 @@ void Item_func_group_concat::print(String *str, enum_query_type query_type)
|
||||
{
|
||||
if (i)
|
||||
str->append(',');
|
||||
args[i]->print(str, query_type);
|
||||
pargs[i]->print(str, query_type);
|
||||
}
|
||||
if (arg_count_order)
|
||||
{
|
||||
|
@ -3275,6 +3275,18 @@ int Query_log_event::do_apply_event(Relay_log_info const *rli,
|
||||
const char* found_semicolon= NULL;
|
||||
mysql_parse(thd, thd->query(), thd->query_length(), &found_semicolon);
|
||||
log_slow_statement(thd);
|
||||
|
||||
/*
|
||||
Resetting the enable_slow_log thd variable.
|
||||
|
||||
We need to reset it back to the opt_log_slow_slave_statements
|
||||
value after the statement execution (and slow logging
|
||||
is done). It might have changed if the statement was an
|
||||
admin statement (in which case, down in mysql_parse execution
|
||||
thd->enable_slow_log is set to the value of
|
||||
opt_log_slow_admin_statements).
|
||||
*/
|
||||
thd->enable_slow_log= opt_log_slow_slave_statements;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -8900,7 +8912,7 @@ static bool record_compare(TABLE *table)
|
||||
DBUG_DUMP("record[1]", table->record[1], table->s->reclength);
|
||||
|
||||
bool result= FALSE;
|
||||
uchar saved_x[2], saved_filler[2];
|
||||
uchar saved_x[2]= {0, 0}, saved_filler[2]= {0, 0};
|
||||
|
||||
if (table->s->null_bytes > 0)
|
||||
{
|
||||
|
@ -304,7 +304,7 @@ static bool record_compare(TABLE *table)
|
||||
*/
|
||||
|
||||
bool result= FALSE;
|
||||
uchar saved_x[2], saved_filler[2];
|
||||
uchar saved_x[2]= {0, 0}, saved_filler[2]= {0, 0};
|
||||
|
||||
if (table->s->null_bytes > 0)
|
||||
{
|
||||
|
@ -1192,7 +1192,7 @@ int setup_group(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
||||
List<Item> &fields, List<Item> &all_fields, ORDER *order,
|
||||
bool *hidden_group_fields);
|
||||
bool fix_inner_refs(THD *thd, List<Item> &all_fields, SELECT_LEX *select,
|
||||
Item **ref_pointer_array);
|
||||
Item **ref_pointer_array, ORDER *group_list= NULL);
|
||||
|
||||
bool handle_select(THD *thd, LEX *lex, select_result *result,
|
||||
ulong setup_tables_done_option);
|
||||
|
@ -5689,8 +5689,9 @@ pthread_handler_t handle_connections_namedpipes(void *arg)
|
||||
create_new_thread(thd);
|
||||
}
|
||||
CloseHandle(connectOverlapped.hEvent);
|
||||
DBUG_LEAVE;
|
||||
decrement_handler_count();
|
||||
DBUG_RETURN(0);
|
||||
return 0;
|
||||
}
|
||||
#endif /* _WIN32 */
|
||||
|
||||
@ -5926,9 +5927,9 @@ error:
|
||||
if (handle_connect_file_map) CloseHandle(handle_connect_file_map);
|
||||
if (event_connect_answer) CloseHandle(event_connect_answer);
|
||||
if (smem_event_connect_request) CloseHandle(smem_event_connect_request);
|
||||
|
||||
DBUG_LEAVE;
|
||||
decrement_handler_count();
|
||||
DBUG_RETURN(0);
|
||||
return 0;
|
||||
}
|
||||
#endif /* HAVE_SMEM */
|
||||
#endif /* EMBEDDED_LIBRARY */
|
||||
@ -5973,7 +5974,7 @@ struct my_option my_long_options[]=
|
||||
"Tells the master it should log updates for the specified database, and exclude all others not explicitly mentioned.",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"binlog-ignore-db", OPT_BINLOG_IGNORE_DB,
|
||||
"Tells the master that updates to the given database should not be logged tothe binary log.",
|
||||
"Tells the master that updates to the given database should not be logged to the binary log.",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"binlog-row-event-max-size", 0,
|
||||
"The maximum size of a row-based binary log event in bytes. Rows will be "
|
||||
@ -6009,7 +6010,7 @@ struct my_option my_long_options[]=
|
||||
{"collation-server", 0, "Set the default collation.",
|
||||
(uchar**) &default_collation_name, (uchar**) &default_collation_name,
|
||||
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
|
||||
{"console", OPT_CONSOLE, "Write error output on screen; Don't remove the console window on windows.",
|
||||
{"console", OPT_CONSOLE, "Write error output on screen; don't remove the console window on windows.",
|
||||
(uchar**) &opt_console, (uchar**) &opt_console, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
||||
0, 0, 0},
|
||||
{"core-file", OPT_WANT_CORE, "Write core on errors.", 0, 0, 0, GET_NO_ARG,
|
||||
@ -6042,7 +6043,7 @@ struct my_option my_long_options[]=
|
||||
0, 0, 0, 0},
|
||||
#endif /* HAVE_STACK_TRACE_ON_SEGV */
|
||||
/* See how it's handled in get_one_option() */
|
||||
{"exit-info", 'T', "Used for debugging; Use at your own risk!", 0, 0, 0,
|
||||
{"exit-info", 'T', "Used for debugging. Use at your own risk.", 0, 0, 0,
|
||||
GET_LONG, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"external-locking", 0, "Use system (external) locking (disabled by default). With this option enabled you can run myisamchk to test (not repair) tables while the MySQL server is running. Disable with --skip-external-locking.",
|
||||
(uchar**) &opt_external_locking, (uchar**) &opt_external_locking,
|
||||
@ -6050,7 +6051,7 @@ struct my_option my_long_options[]=
|
||||
/* We must always support the next option to make scripts like mysqltest
|
||||
easier to do */
|
||||
{"gdb", 0,
|
||||
"Set up signals usable for debugging",
|
||||
"Set up signals usable for debugging.",
|
||||
(uchar**) &opt_debugging, (uchar**) &opt_debugging,
|
||||
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifdef HAVE_LARGE_PAGE_OPTION
|
||||
@ -6111,7 +6112,7 @@ struct my_option my_long_options[]=
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"log-tc", 0,
|
||||
"Path to transaction coordinator log (used for transactions that affect "
|
||||
"more than one storage engine, when binary log is disabled)",
|
||||
"more than one storage engine, when binary log is disabled).",
|
||||
(uchar**) &opt_tc_log_file, (uchar**) &opt_tc_log_file, 0, GET_STR,
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifdef HAVE_MMAP
|
||||
@ -6141,15 +6142,17 @@ thread is in the master's binlogs.",
|
||||
{"memlock", 0, "Lock mysqld in memory.", (uchar**) &locked_in_memory,
|
||||
(uchar**) &locked_in_memory, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"one-thread", OPT_ONE_THREAD,
|
||||
"(deprecated): Only use one thread (for debugging under Linux). Use thread-handling=no-threads instead",
|
||||
"(Deprecated): Only use one thread (for debugging under Linux). Use "
|
||||
"thread-handling=no-threads instead.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"old-style-user-limits", 0,
|
||||
"Enable old-style user limits (before 5.0.3 user resources were counted per each user+host vs. per account)",
|
||||
"Enable old-style user limits (before 5.0.3, user resources were counted "
|
||||
"per each user+host vs. per account).",
|
||||
(uchar**) &opt_old_style_user_limits, (uchar**) &opt_old_style_user_limits,
|
||||
0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"port-open-timeout", 0,
|
||||
"Maximum time in seconds to wait for the port to become free. "
|
||||
"(Default: no wait)", (uchar**) &mysqld_port_timeout,
|
||||
"(Default: No wait).", (uchar**) &mysqld_port_timeout,
|
||||
(uchar**) &mysqld_port_timeout, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"replicate-do-db", OPT_REPLICATE_DO_DB,
|
||||
"Tells the slave thread to restrict replication to the specified database. To specify more than one database, use the directive multiple times, once for each database. Note that this will only work if you do not use cross-database queries such as UPDATE some_db.some_table SET foo='bar' while having selected a different or no database. If you need cross database updates to work, make sure you have 3.23.28 or later, and use replicate-wild-do-table=db_name.%.",
|
||||
@ -6196,12 +6199,12 @@ Can't be set to 1 if --log-slave-updates is used.",
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"show-slave-auth-info", 0,
|
||||
"Show user and password in SHOW SLAVE HOSTS on this master",
|
||||
"Show user and password in SHOW SLAVE HOSTS on this master.",
|
||||
(uchar**) &opt_show_slave_auth_info, (uchar**) &opt_show_slave_auth_info, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifndef DISABLE_GRANT_OPTIONS
|
||||
{"skip-grant-tables", 0,
|
||||
"Start without grant tables. This gives all users FULL ACCESS to all tables!",
|
||||
"Start without grant tables. This gives all users FULL ACCESS to all tables.",
|
||||
(uchar**) &opt_noacl, (uchar**) &opt_noacl, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0,
|
||||
0},
|
||||
#endif
|
||||
@ -6210,7 +6213,7 @@ Can't be set to 1 if --log-slave-updates is used.",
|
||||
{"skip-name-resolve", OPT_SKIP_RESOLVE,
|
||||
"Don't resolve hostnames. All hostnames are IP's or 'localhost'.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"skip-new", OPT_SKIP_NEW, "Don't use new, possible wrong routines.",
|
||||
{"skip-new", OPT_SKIP_NEW, "Don't use new, possibly wrong routines.",
|
||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"skip-slave-start", 0,
|
||||
"If set, slave is not autostarted.", (uchar**) &opt_skip_slave_start,
|
||||
@ -6282,7 +6285,7 @@ Can't be set to 1 if --log-slave-updates is used.",
|
||||
IF_PURIFY(0,1), 0, 0, 0, 0, 0},
|
||||
{"user", 'u', "Run mysqld daemon as user.", 0, 0, 0, GET_STR, REQUIRED_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"verbose", 'v', "Used with --help option for detailed help",
|
||||
{"verbose", 'v', "Used with --help option for detailed help.",
|
||||
(uchar**) &opt_verbose, (uchar**) &opt_verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||
0, 0},
|
||||
{"version", 'V', "Output version information and exit.", 0, 0, 0, GET_NO_ARG,
|
||||
@ -6894,27 +6897,27 @@ static void usage(void)
|
||||
default_collation_name= (char*) default_charset_info->name;
|
||||
print_version();
|
||||
puts("\
|
||||
Copyright (C) 2000-2008 MySQL AB, by Monty and others\n\
|
||||
Copyright (C) 2000-2008 MySQL AB, by Monty and others.\n\
|
||||
Copyright (C) 2008,2009 Sun Microsystems, Inc.\n\
|
||||
This software comes with ABSOLUTELY NO WARRANTY. This is free software,\n\
|
||||
and you are welcome to modify and redistribute it under the GPL license\n\n\
|
||||
Starts the MySQL database server\n");
|
||||
Starts the MySQL database server.\n");
|
||||
|
||||
printf("Usage: %s [OPTIONS]\n", my_progname);
|
||||
if (!opt_verbose)
|
||||
puts("\nFor more help options (several pages), use mysqld --verbose --help");
|
||||
puts("\nFor more help options (several pages), use mysqld --verbose --help.");
|
||||
else
|
||||
{
|
||||
#ifdef __WIN__
|
||||
puts("NT and Win32 specific options:\n\
|
||||
--install Install the default service (NT)\n\
|
||||
--install-manual Install the default service started manually (NT)\n\
|
||||
--install service_name Install an optional service (NT)\n\
|
||||
--install-manual service_name Install an optional service started manually (NT)\n\
|
||||
--remove Remove the default service from the service list (NT)\n\
|
||||
--remove service_name Remove the service_name from the service list (NT)\n\
|
||||
--enable-named-pipe Only to be used for the default server (NT)\n\
|
||||
--standalone Dummy option to start as a standalone server (NT)\
|
||||
--install Install the default service (NT).\n\
|
||||
--install-manual Install the default service started manually (NT).\n\
|
||||
--install service_name Install an optional service (NT).\n\
|
||||
--install-manual service_name Install an optional service started manually (NT).\n\
|
||||
--remove Remove the default service from the service list (NT).\n\
|
||||
--remove service_name Remove the service_name from the service list (NT).\n\
|
||||
--enable-named-pipe Only to be used for the default server (NT).\n\
|
||||
--standalone Dummy option to start as a standalone server (NT).\
|
||||
");
|
||||
puts("");
|
||||
#endif
|
||||
|
@ -1198,11 +1198,7 @@ QUICK_RANGE_SELECT::~QUICK_RANGE_SELECT()
|
||||
if (file)
|
||||
{
|
||||
range_end();
|
||||
if (head->key_read)
|
||||
{
|
||||
head->key_read= 0;
|
||||
file->extra(HA_EXTRA_NO_KEYREAD);
|
||||
}
|
||||
head->set_keyread(FALSE);
|
||||
if (free_file)
|
||||
{
|
||||
DBUG_PRINT("info", ("Freeing separate handler 0x%lx (free: %d)", (long) file,
|
||||
@ -1404,10 +1400,7 @@ end:
|
||||
head->file= file;
|
||||
/* We don't have to set 'head->keyread' here as the 'file' is unique */
|
||||
if (!head->no_keyread)
|
||||
{
|
||||
head->key_read= 1;
|
||||
head->mark_columns_used_by_index(index);
|
||||
}
|
||||
head->prepare_for_position();
|
||||
head->file= org_file;
|
||||
bitmap_copy(&column_bitmap, head->read_set);
|
||||
@ -8344,7 +8337,7 @@ int QUICK_INDEX_MERGE_SELECT::read_keys_and_merge()
|
||||
DBUG_ENTER("QUICK_INDEX_MERGE_SELECT::read_keys_and_merge");
|
||||
|
||||
/* We're going to just read rowids. */
|
||||
file->extra(HA_EXTRA_KEYREAD);
|
||||
head->set_keyread(TRUE);
|
||||
head->prepare_for_position();
|
||||
|
||||
cur_quick_it.rewind();
|
||||
@ -8420,7 +8413,7 @@ int QUICK_INDEX_MERGE_SELECT::read_keys_and_merge()
|
||||
delete unique;
|
||||
doing_pk_scan= FALSE;
|
||||
/* index_merge currently doesn't support "using index" at all */
|
||||
file->extra(HA_EXTRA_NO_KEYREAD);
|
||||
head->set_keyread(FALSE);
|
||||
init_read_record(&read_record, thd, head, (SQL_SELECT*) 0, 1 , 1, TRUE);
|
||||
DBUG_RETURN(result);
|
||||
}
|
||||
@ -10838,7 +10831,7 @@ int QUICK_GROUP_MIN_MAX_SELECT::reset(void)
|
||||
int result;
|
||||
DBUG_ENTER("QUICK_GROUP_MIN_MAX_SELECT::reset");
|
||||
|
||||
file->extra(HA_EXTRA_KEYREAD); /* We need only the key attributes */
|
||||
head->set_keyread(TRUE); /* We need only the key attributes */
|
||||
if ((result= file->ha_index_init(index,1)))
|
||||
DBUG_RETURN(result);
|
||||
if (quick_prefix_select && quick_prefix_select->reset())
|
||||
|
@ -325,11 +325,7 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
|
||||
if (!error && reckey_in_range(0, &ref, item_field->field,
|
||||
conds, range_fl, prefix_len))
|
||||
error= HA_ERR_KEY_NOT_FOUND;
|
||||
if (table->key_read)
|
||||
{
|
||||
table->key_read= 0;
|
||||
table->file->extra(HA_EXTRA_NO_KEYREAD);
|
||||
}
|
||||
table->set_keyread(FALSE);
|
||||
table->file->ha_index_end();
|
||||
if (error)
|
||||
{
|
||||
@ -415,11 +411,7 @@ int opt_sum_query(TABLE_LIST *tables, List<Item> &all_fields,COND *conds)
|
||||
if (!error && reckey_in_range(1, &ref, item_field->field,
|
||||
conds, range_fl, prefix_len))
|
||||
error= HA_ERR_KEY_NOT_FOUND;
|
||||
if (table->key_read)
|
||||
{
|
||||
table->key_read=0;
|
||||
table->file->extra(HA_EXTRA_NO_KEYREAD);
|
||||
}
|
||||
table->set_keyread(FALSE);
|
||||
table->file->ha_index_end();
|
||||
if (error)
|
||||
{
|
||||
@ -880,10 +872,7 @@ static bool find_key_for_maxmin(bool max_fl, TABLE_REF *ref,
|
||||
converted (for example to upper case)
|
||||
*/
|
||||
if (field->part_of_key.is_set(idx))
|
||||
{
|
||||
table->key_read= 1;
|
||||
table->file->extra(HA_EXTRA_KEYREAD);
|
||||
}
|
||||
table->set_keyread(TRUE);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
@ -184,8 +184,9 @@ sp_head *sp_cache_lookup(sp_cache **cp, sp_name *name)
|
||||
sp_cache_invalidate()
|
||||
|
||||
NOTE
|
||||
This is called when a VIEW definition is modifed. We can't destroy sp_head
|
||||
objects here as one may modify VIEW definitions from prelocking-free SPs.
|
||||
This is called when a VIEW definition is created or modified (and in some
|
||||
other contexts). We can't destroy sp_head objects here as one may modify
|
||||
VIEW definitions from prelocking-free SPs.
|
||||
*/
|
||||
|
||||
void sp_cache_invalidate()
|
||||
|
@ -1848,6 +1848,8 @@ sp_head::execute_procedure(THD *thd, List<Item> *args)
|
||||
{
|
||||
bool err_status= FALSE;
|
||||
uint params = m_pcont->context_var_count();
|
||||
/* Query start time may be reset in a multi-stmt SP; keep this for later. */
|
||||
ulonglong utime_before_sp_exec= thd->utime_after_lock;
|
||||
sp_rcontext *save_spcont, *octx;
|
||||
sp_rcontext *nctx = NULL;
|
||||
bool save_enable_slow_log= false;
|
||||
@ -2054,6 +2056,7 @@ sp_head::execute_procedure(THD *thd, List<Item> *args)
|
||||
|
||||
delete nctx;
|
||||
thd->spcont= save_spcont;
|
||||
thd->utime_after_lock= utime_before_sp_exec;
|
||||
|
||||
DBUG_RETURN(err_status);
|
||||
}
|
||||
|
@ -2225,6 +2225,7 @@ void wait_for_condition(THD *thd, mysql_mutex_t *mutex, mysql_cond_t *cond)
|
||||
proc_info=thd->proc_info;
|
||||
thd_proc_info(thd, "Waiting for table");
|
||||
DBUG_ENTER("wait_for_condition");
|
||||
DEBUG_SYNC(thd, "waiting_for_table");
|
||||
if (!thd->killed)
|
||||
mysql_cond_wait(cond, mutex);
|
||||
|
||||
|
@ -612,10 +612,10 @@ bool THD::handle_condition(uint sql_errno,
|
||||
|
||||
for (Internal_error_handler *error_handler= m_internal_handler;
|
||||
error_handler;
|
||||
error_handler= m_internal_handler->m_prev_internal_handler)
|
||||
error_handler= error_handler->m_prev_internal_handler)
|
||||
{
|
||||
if (error_handler-> handle_condition(this, sql_errno, sqlstate, level, msg,
|
||||
cond_hdl))
|
||||
if (error_handler->handle_condition(this, sql_errno, sqlstate, level, msg,
|
||||
cond_hdl))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
@ -625,10 +625,12 @@ bool THD::handle_condition(uint sql_errno,
|
||||
}
|
||||
|
||||
|
||||
void THD::pop_internal_handler()
|
||||
Internal_error_handler *THD::pop_internal_handler()
|
||||
{
|
||||
DBUG_ASSERT(m_internal_handler != NULL);
|
||||
Internal_error_handler *popped_handler= m_internal_handler;
|
||||
m_internal_handler= m_internal_handler->m_prev_internal_handler;
|
||||
return popped_handler;
|
||||
}
|
||||
|
||||
|
||||
|
@ -2584,7 +2584,7 @@ public:
|
||||
/**
|
||||
Remove the error handler last pushed.
|
||||
*/
|
||||
void pop_internal_handler();
|
||||
Internal_error_handler *pop_internal_handler();
|
||||
|
||||
/**
|
||||
Raise an exception condition.
|
||||
|
@ -1675,6 +1675,7 @@ void st_select_lex::init_query()
|
||||
having= prep_having= where= prep_where= 0;
|
||||
olap= UNSPECIFIED_OLAP_TYPE;
|
||||
having_fix_field= 0;
|
||||
group_fix_field= 0;
|
||||
context.select_lex= this;
|
||||
context.init();
|
||||
/*
|
||||
|
@ -677,6 +677,8 @@ public:
|
||||
bool braces; /* SELECT ... UNION (SELECT ... ) <- this braces */
|
||||
/* TRUE when having fix field called in processing of this SELECT */
|
||||
bool having_fix_field;
|
||||
/* TRUE when GROUP BY fix field called in processing of this SELECT */
|
||||
bool group_fix_field;
|
||||
/* List of references to fields referenced from inner selects */
|
||||
List<Item_outer_ref> inner_refs_list;
|
||||
/* Number of Item_sum-derived objects in this SELECT */
|
||||
|
@ -290,6 +290,7 @@ bool handle_select(THD *thd, LEX *lex, select_result *result,
|
||||
all_fields List of all fields used in select
|
||||
select Current select
|
||||
ref_pointer_array Array of references to Items used in current select
|
||||
group_list GROUP BY list (is NULL by default)
|
||||
|
||||
DESCRIPTION
|
||||
The function serves 3 purposes - adds fields referenced from inner
|
||||
@ -308,6 +309,8 @@ bool handle_select(THD *thd, LEX *lex, select_result *result,
|
||||
function is aggregated in the select where the outer field was
|
||||
resolved or in some more inner select then the Item_direct_ref
|
||||
class should be used.
|
||||
Also it should be used if we are grouping by a subquery containing
|
||||
the outer field.
|
||||
The resolution is done here and not at the fix_fields() stage as
|
||||
it can be done only after sum functions are fixed and pulled up to
|
||||
selects where they are have to be aggregated.
|
||||
@ -324,7 +327,7 @@ bool handle_select(THD *thd, LEX *lex, select_result *result,
|
||||
|
||||
bool
|
||||
fix_inner_refs(THD *thd, List<Item> &all_fields, SELECT_LEX *select,
|
||||
Item **ref_pointer_array)
|
||||
Item **ref_pointer_array, ORDER *group_list)
|
||||
{
|
||||
Item_outer_ref *ref;
|
||||
bool res= FALSE;
|
||||
@ -374,6 +377,22 @@ fix_inner_refs(THD *thd, List<Item> &all_fields, SELECT_LEX *select,
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
Check if GROUP BY item trees contain the outer ref:
|
||||
in this case we have to use Item_direct_ref instead of Item_ref.
|
||||
*/
|
||||
for (ORDER *group= group_list; group; group= group->next)
|
||||
{
|
||||
if ((*group->item)->walk(&Item::find_item_processor, TRUE,
|
||||
(uchar *) ref))
|
||||
{
|
||||
direct_ref= TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
new_ref= direct_ref ?
|
||||
new Item_direct_ref(ref->context, item_ref, ref->table_name,
|
||||
ref->field_name, ref->alias_name_used) :
|
||||
@ -580,7 +599,8 @@ JOIN::prepare(Item ***rref_pointer_array,
|
||||
}
|
||||
|
||||
if (select_lex->inner_refs_list.elements &&
|
||||
fix_inner_refs(thd, all_fields, select_lex, ref_pointer_array))
|
||||
fix_inner_refs(thd, all_fields, select_lex, ref_pointer_array,
|
||||
group_list))
|
||||
DBUG_RETURN(-1);
|
||||
|
||||
if (group_list)
|
||||
@ -2334,7 +2354,13 @@ JOIN::destroy()
|
||||
tab->cleanup();
|
||||
}
|
||||
tmp_join->tmp_join= 0;
|
||||
tmp_table_param.copy_field= 0;
|
||||
/*
|
||||
We need to clean up tmp_table_param for reusable JOINs (having non-zero
|
||||
and different from self tmp_join) because it's not being cleaned up
|
||||
anywhere else (as we need to keep the join is reusable).
|
||||
*/
|
||||
tmp_table_param.cleanup();
|
||||
tmp_table_param.copy_field= tmp_join->tmp_table_param.copy_field= 0;
|
||||
DBUG_RETURN(tmp_join->destroy());
|
||||
}
|
||||
cond_equal= 0;
|
||||
@ -5939,6 +5965,12 @@ JOIN::make_simple_join(JOIN *parent, TABLE *tmp_table)
|
||||
const_table_map= 0;
|
||||
tmp_table_param.field_count= tmp_table_param.sum_func_count=
|
||||
tmp_table_param.func_count= 0;
|
||||
/*
|
||||
We need to destruct the copy_field (allocated in create_tmp_table())
|
||||
before setting it to 0 if the join is not "reusable".
|
||||
*/
|
||||
if (!tmp_join || tmp_join != this)
|
||||
tmp_table_param.cleanup();
|
||||
tmp_table_param.copy_field= tmp_table_param.copy_field_end=0;
|
||||
first_record= sort_and_group=0;
|
||||
send_records= (ha_rows) 0;
|
||||
@ -6709,10 +6741,7 @@ make_join_readinfo(JOIN *join, ulonglong options)
|
||||
case JT_CONST: // Only happens with left join
|
||||
if (table->covering_keys.is_set(tab->ref.key) &&
|
||||
!table->no_keyread)
|
||||
{
|
||||
table->key_read=1;
|
||||
table->file->extra(HA_EXTRA_KEYREAD);
|
||||
}
|
||||
table->set_keyread(TRUE);
|
||||
break;
|
||||
case JT_ALL:
|
||||
/*
|
||||
@ -6773,10 +6802,7 @@ make_join_readinfo(JOIN *join, ulonglong options)
|
||||
if (tab->select && tab->select->quick &&
|
||||
tab->select->quick->index != MAX_KEY && //not index_merge
|
||||
table->covering_keys.is_set(tab->select->quick->index))
|
||||
{
|
||||
table->key_read=1;
|
||||
table->file->extra(HA_EXTRA_KEYREAD);
|
||||
}
|
||||
table->set_keyread(TRUE);
|
||||
else if (!table->covering_keys.is_clear_all() &&
|
||||
!(tab->select && tab->select->quick))
|
||||
{ // Only read index tree
|
||||
@ -6860,11 +6886,7 @@ void JOIN_TAB::cleanup()
|
||||
limit= 0;
|
||||
if (table)
|
||||
{
|
||||
if (table->key_read)
|
||||
{
|
||||
table->key_read= 0;
|
||||
table->file->extra(HA_EXTRA_NO_KEYREAD);
|
||||
}
|
||||
table->set_keyread(FALSE);
|
||||
table->file->ha_index_or_rnd_end();
|
||||
/*
|
||||
We need to reset this for next select
|
||||
@ -9953,7 +9975,11 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
||||
KEY_PART_INFO *key_part_info;
|
||||
Item **copy_func;
|
||||
MI_COLUMNDEF *recinfo;
|
||||
uint total_uneven_bit_length= 0;
|
||||
/*
|
||||
total_uneven_bit_length is uneven bit length for visible fields
|
||||
hidden_uneven_bit_length is uneven bit length for hidden fields
|
||||
*/
|
||||
uint total_uneven_bit_length= 0, hidden_uneven_bit_length= 0;
|
||||
bool force_copy_fields= param->force_copy_fields;
|
||||
/* Treat sum functions as normal ones when loose index scan is used. */
|
||||
save_sum_fields|= param->precomputed_group_by;
|
||||
@ -10232,6 +10258,14 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
||||
*/
|
||||
param->hidden_field_count= fieldnr;
|
||||
null_count= 0;
|
||||
/*
|
||||
On last hidden field we store uneven bit length in
|
||||
hidden_uneven_bit_length and proceed calculation of
|
||||
uneven bits for visible fields into
|
||||
total_uneven_bit_length variable.
|
||||
*/
|
||||
hidden_uneven_bit_length= total_uneven_bit_length;
|
||||
total_uneven_bit_length= 0;
|
||||
}
|
||||
}
|
||||
DBUG_ASSERT(fieldnr == (uint) (reg_field - table->field));
|
||||
@ -10277,7 +10311,8 @@ create_tmp_table(THD *thd,TMP_TABLE_PARAM *param,List<Item> &fields,
|
||||
else
|
||||
null_count++;
|
||||
}
|
||||
hidden_null_pack_length=(hidden_null_count+7)/8;
|
||||
hidden_null_pack_length= (hidden_null_count + 7 +
|
||||
hidden_uneven_bit_length) / 8;
|
||||
null_pack_length= (hidden_null_pack_length +
|
||||
(null_count + total_uneven_bit_length + 7) / 8);
|
||||
reclength+=null_pack_length;
|
||||
@ -11691,21 +11726,45 @@ flush_cached_records(JOIN *join,JOIN_TAB *join_tab,bool skip_last)
|
||||
return NESTED_LOOP_KILLED; // Aborted by user /* purecov: inspected */
|
||||
}
|
||||
SQL_SELECT *select=join_tab->select;
|
||||
if (rc == NESTED_LOOP_OK &&
|
||||
(!join_tab->cache.select || !join_tab->cache.select->skip_record()))
|
||||
if (rc == NESTED_LOOP_OK)
|
||||
{
|
||||
uint i;
|
||||
reset_cache_read(&join_tab->cache);
|
||||
for (i=(join_tab->cache.records- (skip_last ? 1 : 0)) ; i-- > 0 ;)
|
||||
bool consider_record= !join_tab->cache.select ||
|
||||
!join_tab->cache.select->skip_record();
|
||||
|
||||
/*
|
||||
Check for error: skip_record() can execute code by calling
|
||||
Item_subselect::val_*. We need to check for errors (if any)
|
||||
after such call.
|
||||
*/
|
||||
if (join->thd->is_error())
|
||||
{
|
||||
read_cached_record(join_tab);
|
||||
if (!select || !select->skip_record())
|
||||
reset_cache_write(&join_tab->cache);
|
||||
return NESTED_LOOP_ERROR;
|
||||
}
|
||||
|
||||
if (consider_record)
|
||||
{
|
||||
uint i;
|
||||
reset_cache_read(&join_tab->cache);
|
||||
for (i=(join_tab->cache.records- (skip_last ? 1 : 0)) ; i-- > 0 ;)
|
||||
{
|
||||
rc= (join_tab->next_select)(join,join_tab+1,0);
|
||||
if (rc != NESTED_LOOP_OK && rc != NESTED_LOOP_NO_MORE_ROWS)
|
||||
read_cached_record(join_tab);
|
||||
if (!select || !select->skip_record())
|
||||
{
|
||||
reset_cache_write(&join_tab->cache);
|
||||
return rc;
|
||||
/*
|
||||
Check for error: skip_record() can execute code by calling
|
||||
Item_subselect::val_*. We need to check for errors (if any)
|
||||
after such call.
|
||||
*/
|
||||
if (join->thd->is_error())
|
||||
rc= NESTED_LOOP_ERROR;
|
||||
else
|
||||
rc= (join_tab->next_select)(join,join_tab+1,0);
|
||||
if (rc != NESTED_LOOP_OK && rc != NESTED_LOOP_NO_MORE_ROWS)
|
||||
{
|
||||
reset_cache_write(&join_tab->cache);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -11790,16 +11849,11 @@ join_read_const_table(JOIN_TAB *tab, POSITION *pos)
|
||||
!table->no_keyread &&
|
||||
(int) table->reginfo.lock_type <= (int) TL_READ_HIGH_PRIORITY)
|
||||
{
|
||||
table->key_read=1;
|
||||
table->file->extra(HA_EXTRA_KEYREAD);
|
||||
table->set_keyread(TRUE);
|
||||
tab->index= tab->ref.key;
|
||||
}
|
||||
error=join_read_const(tab);
|
||||
if (table->key_read)
|
||||
{
|
||||
table->key_read=0;
|
||||
table->file->extra(HA_EXTRA_NO_KEYREAD);
|
||||
}
|
||||
table->set_keyread(FALSE);
|
||||
if (error)
|
||||
{
|
||||
tab->info="unique row not found";
|
||||
@ -12152,12 +12206,8 @@ join_read_first(JOIN_TAB *tab)
|
||||
{
|
||||
int error;
|
||||
TABLE *table=tab->table;
|
||||
if (!table->key_read && table->covering_keys.is_set(tab->index) &&
|
||||
!table->no_keyread)
|
||||
{
|
||||
table->key_read=1;
|
||||
table->file->extra(HA_EXTRA_KEYREAD);
|
||||
}
|
||||
if (table->covering_keys.is_set(tab->index) && !table->no_keyread)
|
||||
table->set_keyread(TRUE);
|
||||
tab->table->status=0;
|
||||
tab->read_record.read_record=join_read_next;
|
||||
tab->read_record.table=table;
|
||||
@ -12191,12 +12241,8 @@ join_read_last(JOIN_TAB *tab)
|
||||
{
|
||||
TABLE *table=tab->table;
|
||||
int error;
|
||||
if (!table->key_read && table->covering_keys.is_set(tab->index) &&
|
||||
!table->no_keyread)
|
||||
{
|
||||
table->key_read=1;
|
||||
table->file->extra(HA_EXTRA_KEYREAD);
|
||||
}
|
||||
if (table->covering_keys.is_set(tab->index) && !table->no_keyread)
|
||||
table->set_keyread(TRUE);
|
||||
tab->table->status=0;
|
||||
tab->read_record.read_record=join_read_prev;
|
||||
tab->read_record.table=table;
|
||||
@ -12963,7 +13009,7 @@ static int test_if_order_by_key(ORDER *order, TABLE *table, uint idx,
|
||||
key_part_end=key_part+table->key_info[idx].key_parts;
|
||||
key_part_map const_key_parts=table->const_key_parts[idx];
|
||||
int reverse=0;
|
||||
my_bool on_primary_key= FALSE;
|
||||
my_bool on_pk_suffix= FALSE;
|
||||
DBUG_ENTER("test_if_order_by_key");
|
||||
|
||||
for (; order ; order=order->next, const_key_parts>>=1)
|
||||
@ -12985,11 +13031,12 @@ static int test_if_order_by_key(ORDER *order, TABLE *table, uint idx,
|
||||
key as a suffix to the secondary keys. If it has continue to check
|
||||
the primary key as a suffix.
|
||||
*/
|
||||
if (!on_primary_key &&
|
||||
if (!on_pk_suffix &&
|
||||
(table->file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX) &&
|
||||
table->s->primary_key != MAX_KEY)
|
||||
table->s->primary_key != MAX_KEY &&
|
||||
table->s->primary_key != idx)
|
||||
{
|
||||
on_primary_key= TRUE;
|
||||
on_pk_suffix= TRUE;
|
||||
key_part= table->key_info[table->s->primary_key].key_part;
|
||||
key_part_end=key_part+table->key_info[table->s->primary_key].key_parts;
|
||||
const_key_parts=table->const_key_parts[table->s->primary_key];
|
||||
@ -13021,7 +13068,7 @@ static int test_if_order_by_key(ORDER *order, TABLE *table, uint idx,
|
||||
reverse=flag; // Remember if reverse
|
||||
key_part++;
|
||||
}
|
||||
if (on_primary_key)
|
||||
if (on_pk_suffix)
|
||||
{
|
||||
uint used_key_parts_secondary= table->key_info[idx].key_parts;
|
||||
uint used_key_parts_pk=
|
||||
@ -13510,8 +13557,15 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
|
||||
select_limit= table_records;
|
||||
if (group)
|
||||
{
|
||||
rec_per_key= used_key_parts ? keyinfo->rec_per_key[used_key_parts-1]
|
||||
: 1;
|
||||
/*
|
||||
Used_key_parts can be larger than keyinfo->key_parts
|
||||
when using a secondary index clustered with a primary
|
||||
key (e.g. as in Innodb).
|
||||
See Bug #28591 for details.
|
||||
*/
|
||||
rec_per_key= used_key_parts &&
|
||||
used_key_parts <= keyinfo->key_parts ?
|
||||
keyinfo->rec_per_key[used_key_parts-1] : 1;
|
||||
set_if_bigger(rec_per_key, 1);
|
||||
/*
|
||||
With a grouping query each group containing on average
|
||||
@ -13612,11 +13666,8 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
|
||||
If ref_key used index tree reading only ('Using index' in EXPLAIN),
|
||||
and best_key doesn't, then revert the decision.
|
||||
*/
|
||||
if (!table->covering_keys.is_set(best_key) && table->key_read)
|
||||
{
|
||||
table->key_read= 0;
|
||||
table->file->extra(HA_EXTRA_NO_KEYREAD);
|
||||
}
|
||||
if (!table->covering_keys.is_set(best_key))
|
||||
table->set_keyread(FALSE);
|
||||
if (!quick_created)
|
||||
{
|
||||
tab->index= best_key;
|
||||
@ -13629,10 +13680,7 @@ test_if_skip_sort_order(JOIN_TAB *tab,ORDER *order,ha_rows select_limit,
|
||||
select->quick= 0;
|
||||
}
|
||||
if (table->covering_keys.is_set(best_key))
|
||||
{
|
||||
table->key_read=1;
|
||||
table->file->extra(HA_EXTRA_KEYREAD);
|
||||
}
|
||||
table->set_keyread(TRUE);
|
||||
table->file->ha_index_or_rnd_end();
|
||||
if (join->select_options & SELECT_DESCRIBE)
|
||||
{
|
||||
@ -13806,11 +13854,8 @@ create_sort_index(THD *thd, JOIN *join, ORDER *order,
|
||||
We can only use 'Only index' if quick key is same as ref_key
|
||||
and in index_merge 'Only index' cannot be used
|
||||
*/
|
||||
if (table->key_read && ((uint) tab->ref.key != select->quick->index))
|
||||
{
|
||||
table->key_read=0;
|
||||
table->file->extra(HA_EXTRA_NO_KEYREAD);
|
||||
}
|
||||
if (((uint) tab->ref.key != select->quick->index))
|
||||
table->set_keyread(FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -13866,11 +13911,7 @@ create_sort_index(THD *thd, JOIN *join, ORDER *order,
|
||||
tab->type=JT_ALL; // Read with normal read_record
|
||||
tab->read_first_record= join_init_read_record;
|
||||
tab->join->examined_rows+=examined_rows;
|
||||
if (table->key_read) // Restore if we used indexes
|
||||
{
|
||||
table->key_read=0;
|
||||
table->file->extra(HA_EXTRA_NO_KEYREAD);
|
||||
}
|
||||
table->set_keyread(FALSE); // Restore if we used indexes
|
||||
DBUG_RETURN(table->sort.found_records == HA_POS_ERROR);
|
||||
err:
|
||||
DBUG_RETURN(-1);
|
||||
@ -14307,7 +14348,7 @@ join_init_cache(THD *thd,JOIN_TAB *tables,uint table_count)
|
||||
{
|
||||
used_fields--;
|
||||
length+=field->fill_cache_field(copy);
|
||||
if (copy->blob_field)
|
||||
if (copy->type == CACHE_BLOB)
|
||||
(*blob_ptr++)=copy;
|
||||
if (field->real_maybe_null())
|
||||
null_fields++;
|
||||
@ -14322,8 +14363,8 @@ join_init_cache(THD *thd,JOIN_TAB *tables,uint table_count)
|
||||
{ /* must copy null bits */
|
||||
copy->str= tables[i].table->null_flags;
|
||||
copy->length= tables[i].table->s->null_bytes;
|
||||
copy->strip=0;
|
||||
copy->blob_field=0;
|
||||
copy->type=0;
|
||||
copy->field=0;
|
||||
length+=copy->length;
|
||||
copy++;
|
||||
cache->fields++;
|
||||
@ -14333,8 +14374,8 @@ join_init_cache(THD *thd,JOIN_TAB *tables,uint table_count)
|
||||
{
|
||||
copy->str= (uchar*) &tables[i].table->null_row;
|
||||
copy->length=sizeof(tables[i].table->null_row);
|
||||
copy->strip=0;
|
||||
copy->blob_field=0;
|
||||
copy->type=0;
|
||||
copy->field=0;
|
||||
length+=copy->length;
|
||||
copy++;
|
||||
cache->fields++;
|
||||
@ -14359,9 +14400,10 @@ used_blob_length(CACHE_FIELD **ptr)
|
||||
uint length,blob_length;
|
||||
for (length=0 ; *ptr ; ptr++)
|
||||
{
|
||||
(*ptr)->blob_length=blob_length=(*ptr)->blob_field->get_length();
|
||||
Field_blob *field_blob= (Field_blob *) (*ptr)->field;
|
||||
(*ptr)->blob_length=blob_length= field_blob->get_length();
|
||||
length+=blob_length;
|
||||
(*ptr)->blob_field->get_ptr(&(*ptr)->str);
|
||||
field_blob->get_ptr(&(*ptr)->str);
|
||||
}
|
||||
return length;
|
||||
}
|
||||
@ -14390,30 +14432,35 @@ store_record_in_cache(JOIN_CACHE *cache)
|
||||
cache->records++;
|
||||
for (copy=cache->field ; copy < end_field; copy++)
|
||||
{
|
||||
if (copy->blob_field)
|
||||
if (copy->type == CACHE_BLOB)
|
||||
{
|
||||
Field_blob *blob_field= (Field_blob *) copy->field;
|
||||
if (last_record)
|
||||
{
|
||||
copy->blob_field->get_image(pos, copy->length+sizeof(char*),
|
||||
copy->blob_field->charset());
|
||||
blob_field->get_image(pos, copy->length+sizeof(char*),
|
||||
blob_field->charset());
|
||||
pos+=copy->length+sizeof(char*);
|
||||
}
|
||||
else
|
||||
{
|
||||
copy->blob_field->get_image(pos, copy->length, // blob length
|
||||
copy->blob_field->charset());
|
||||
blob_field->get_image(pos, copy->length, // blob length
|
||||
blob_field->charset());
|
||||
memcpy(pos+copy->length,copy->str,copy->blob_length); // Blob data
|
||||
pos+=copy->length+copy->blob_length;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (copy->strip)
|
||||
if (copy->type == CACHE_STRIPPED)
|
||||
{
|
||||
uchar *str,*end;
|
||||
for (str=copy->str,end= str+copy->length;
|
||||
end > str && end[-1] == ' ' ;
|
||||
end--) ;
|
||||
Field *field= copy->field;
|
||||
if (field && field->maybe_null() && field->is_null())
|
||||
end= str= copy->str;
|
||||
else
|
||||
for (str=copy->str,end= str+copy->length;
|
||||
end > str && end[-1] == ' ' ;
|
||||
end--) ;
|
||||
length=(uint) (end-str);
|
||||
memcpy(pos+2, str, length);
|
||||
int2store(pos, length);
|
||||
@ -14462,23 +14509,24 @@ read_cached_record(JOIN_TAB *tab)
|
||||
copy < end_field;
|
||||
copy++)
|
||||
{
|
||||
if (copy->blob_field)
|
||||
if (copy->type == CACHE_BLOB)
|
||||
{
|
||||
Field_blob *blob_field= (Field_blob *) copy->field;
|
||||
if (last_record)
|
||||
{
|
||||
copy->blob_field->set_image(pos, copy->length+sizeof(char*),
|
||||
copy->blob_field->charset());
|
||||
blob_field->set_image(pos, copy->length+sizeof(char*),
|
||||
blob_field->charset());
|
||||
pos+=copy->length+sizeof(char*);
|
||||
}
|
||||
else
|
||||
{
|
||||
copy->blob_field->set_ptr(pos, pos+copy->length);
|
||||
pos+=copy->length+copy->blob_field->get_length();
|
||||
blob_field->set_ptr(pos, pos+copy->length);
|
||||
pos+=copy->length + blob_field->get_length();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (copy->strip)
|
||||
if (copy->type == CACHE_STRIPPED)
|
||||
{
|
||||
length= uint2korr(pos);
|
||||
memcpy(copy->str, pos+2, length);
|
||||
@ -14689,11 +14737,29 @@ find_order_in_list(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
||||
|
||||
We check order_item->fixed because Item_func_group_concat can put
|
||||
arguments for which fix_fields already was called.
|
||||
|
||||
group_fix_field= TRUE is to resolve aliases from the SELECT list
|
||||
without creating of Item_ref-s: JOIN::exec() wraps aliased items
|
||||
in SELECT list with Item_copy items. To re-evaluate such a tree
|
||||
that includes Item_copy items we have to refresh Item_copy caches,
|
||||
but:
|
||||
- filesort() never refresh Item_copy items,
|
||||
- end_send_group() checks every record for group boundary by the
|
||||
test_if_group_changed function that obtain data from these
|
||||
Item_copy items, but the copy_fields function that
|
||||
refreshes Item copy items is called after group boundaries only -
|
||||
that is a vicious circle.
|
||||
So we prevent inclusion of Item_copy items.
|
||||
*/
|
||||
if (!order_item->fixed &&
|
||||
bool save_group_fix_field= thd->lex->current_select->group_fix_field;
|
||||
if (is_group_field)
|
||||
thd->lex->current_select->group_fix_field= TRUE;
|
||||
bool ret= (!order_item->fixed &&
|
||||
(order_item->fix_fields(thd, order->item) ||
|
||||
(order_item= *order->item)->check_cols(1) ||
|
||||
thd->is_fatal_error))
|
||||
thd->is_fatal_error));
|
||||
thd->lex->current_select->group_fix_field= save_group_fix_field;
|
||||
if (ret)
|
||||
return TRUE; /* Wrong field. */
|
||||
|
||||
uint el= all_fields.elements;
|
||||
|
@ -98,6 +98,10 @@ typedef struct st_table_ref
|
||||
} TABLE_REF;
|
||||
|
||||
|
||||
|
||||
#define CACHE_BLOB 1 /* blob field */
|
||||
#define CACHE_STRIPPED 2 /* field stripped of trailing spaces */
|
||||
|
||||
/**
|
||||
CACHE_FIELD and JOIN_CACHE is used on full join to cache records in outer
|
||||
table
|
||||
@ -106,8 +110,8 @@ typedef struct st_table_ref
|
||||
typedef struct st_cache_field {
|
||||
uchar *str;
|
||||
uint length, blob_length;
|
||||
Field_blob *blob_field;
|
||||
bool strip;
|
||||
Field *field;
|
||||
uint type; /**< category of the of the copied field (CACHE_BLOB et al.) */
|
||||
} CACHE_FIELD;
|
||||
|
||||
|
||||
@ -361,7 +365,25 @@ public:
|
||||
*/
|
||||
bool no_const_tables;
|
||||
|
||||
JOIN *tmp_join; ///< copy of this JOIN to be used with temporary tables
|
||||
/**
|
||||
Copy of this JOIN to be used with temporary tables.
|
||||
|
||||
tmp_join is used when the JOIN needs to be "reusable" (e.g. in a subquery
|
||||
that gets re-executed several times) and we know will use temporary tables
|
||||
for materialization. The materialization to a temporary table overwrites the
|
||||
JOIN structure to point to the temporary table after the materialization is
|
||||
done. This is where tmp_join is used : it's a copy of the JOIN before the
|
||||
materialization and is used in restoring before re-execution by overwriting
|
||||
the current JOIN structure with the saved copy.
|
||||
Because of this we should pay extra care of not freeing up helper structures
|
||||
that are referenced by the original contents of the JOIN. We can check for
|
||||
this by making sure the "current" join is not the temporary copy, e.g.
|
||||
!tmp_join || tmp_join != join
|
||||
|
||||
We should free these sub-structures at JOIN::destroy() if the "current" join
|
||||
has a copy is not that copy.
|
||||
*/
|
||||
JOIN *tmp_join;
|
||||
ROLLUP rollup; ///< Used with rollup
|
||||
|
||||
bool select_distinct; ///< Set if SELECT DISTINCT
|
||||
@ -724,10 +746,11 @@ public:
|
||||
we need to check for errors executing it and react accordingly
|
||||
*/
|
||||
if (!res && table->in_use->is_error())
|
||||
res= 2;
|
||||
res= 1; /* STORE_KEY_FATAL */
|
||||
dbug_tmp_restore_column_map(table->write_set, old_map);
|
||||
null_key= to_field->is_null() || item->null_value;
|
||||
return (err != 0 || res > 2 ? STORE_KEY_FATAL : (store_key_result) res);
|
||||
return ((err != 0 || res < 0 || res > 2) ? STORE_KEY_FATAL :
|
||||
(store_key_result) res);
|
||||
}
|
||||
};
|
||||
|
||||
@ -756,17 +779,17 @@ protected:
|
||||
if ((res= item->save_in_field(to_field, 1)))
|
||||
{
|
||||
if (!err)
|
||||
err= res;
|
||||
err= res < 0 ? 1 : res; /* 1=STORE_KEY_FATAL */
|
||||
}
|
||||
/*
|
||||
Item::save_in_field() may call Item::val_xxx(). And if this is a subquery
|
||||
we need to check for errors executing it and react accordingly
|
||||
*/
|
||||
if (!err && to_field->table->in_use->is_error())
|
||||
err= 2;
|
||||
err= 1; /* STORE_KEY_FATAL */
|
||||
}
|
||||
null_key= to_field->is_null() || item->null_value;
|
||||
return (err > 2 ? STORE_KEY_FATAL : (store_key_result) err);
|
||||
return (err > 2 ? STORE_KEY_FATAL : (store_key_result) err);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1896,22 +1896,11 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
|
||||
mysql_ha_rm_tables(thd, tables);
|
||||
|
||||
/*
|
||||
If we have the table in the definition cache, we don't have to check the
|
||||
.frm file to find if the table is a normal table (not view) and what
|
||||
engine to use.
|
||||
*/
|
||||
/* Disable drop of enabled log tables, must be done before name locking */
|
||||
mysql_mutex_lock(&LOCK_open);
|
||||
for (table= tables; table; table= table->next_local)
|
||||
{
|
||||
TABLE_SHARE *share;
|
||||
table->db_type= NULL;
|
||||
if ((share= get_cached_table_share(table->db, table->table_name)))
|
||||
table->db_type= share->db_type();
|
||||
|
||||
/* Disable drop of enabled log tables */
|
||||
if (share && (share->table_category == TABLE_CATEGORY_LOG) &&
|
||||
check_if_log_table(table->db_length, table->db,
|
||||
if (check_if_log_table(table->db_length, table->db,
|
||||
table->table_name_length, table->table_name, 1))
|
||||
{
|
||||
mysql_mutex_unlock(&LOCK_open);
|
||||
@ -1974,7 +1963,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
{
|
||||
char *db=table->db;
|
||||
handlerton *table_type;
|
||||
enum legacy_db_type frm_db_type;
|
||||
enum legacy_db_type frm_db_type= DB_TYPE_UNKNOWN;
|
||||
|
||||
DBUG_PRINT("table", ("table_l: '%s'.'%s' table: 0x%lx s: 0x%lx",
|
||||
table->db, table->table_name, (long) table->table,
|
||||
@ -2042,7 +2031,6 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
built_query.append("`,");
|
||||
}
|
||||
|
||||
table_type= table->db_type;
|
||||
if (!drop_temporary)
|
||||
{
|
||||
if (thd->locked_tables_mode)
|
||||
@ -2072,10 +2060,10 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
TODO: Investigate what should be done to remove this lock completely.
|
||||
Is exclusive meta-data lock enough ?
|
||||
*/
|
||||
DEBUG_SYNC(thd, "rm_table_part2_before_delete_table");
|
||||
mysql_mutex_lock(&LOCK_open);
|
||||
if (drop_temporary ||
|
||||
((table_type == NULL &&
|
||||
access(path, F_OK) &&
|
||||
((access(path, F_OK) &&
|
||||
ha_create_table_from_engine(thd, db, alias)) ||
|
||||
(!drop_view &&
|
||||
mysql_frm_type(thd, path, &frm_db_type) != FRMTYPE_TABLE)))
|
||||
@ -2091,15 +2079,25 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
else
|
||||
{
|
||||
char *end;
|
||||
if (table_type == NULL)
|
||||
/*
|
||||
Cannot use the db_type from the table, since that might have changed
|
||||
while waiting for the exclusive name lock. We are under LOCK_open,
|
||||
so reading from the frm-file is safe.
|
||||
*/
|
||||
if (frm_db_type == DB_TYPE_UNKNOWN)
|
||||
{
|
||||
mysql_frm_type(thd, path, &frm_db_type);
|
||||
table_type= ha_resolve_by_legacy_type(thd, frm_db_type);
|
||||
mysql_frm_type(thd, path, &frm_db_type);
|
||||
DBUG_PRINT("info", ("frm_db_type %d from %s", frm_db_type, path));
|
||||
}
|
||||
table_type= ha_resolve_by_legacy_type(thd, frm_db_type);
|
||||
// Remove extension for delete
|
||||
*(end= path + path_length - reg_ext_length)= '\0';
|
||||
DBUG_PRINT("info", ("deleting table of type %d",
|
||||
(table_type ? table_type->db_type : 0)));
|
||||
error= ha_delete_table(thd, table_type, path, db, table->table_name,
|
||||
!dont_log_query);
|
||||
|
||||
/* No error if non existent table and 'IF EXIST' clause or view */
|
||||
if ((error == ENOENT || error == HA_ERR_NO_SUCH_TABLE) &&
|
||||
(if_exists || table_type == NULL))
|
||||
{
|
||||
@ -2141,6 +2139,7 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
|
||||
table->table_name););
|
||||
|
||||
}
|
||||
DEBUG_SYNC(thd, "rm_table_part2_before_binlog");
|
||||
thd->thread_specific_used|= tmp_table_deleted;
|
||||
error= 0;
|
||||
if (wrong_tables.length())
|
||||
@ -7128,6 +7127,7 @@ view_err:
|
||||
else
|
||||
create_info->data_file_name=create_info->index_file_name=0;
|
||||
|
||||
DEBUG_SYNC(thd, "alter_table_before_create_table_no_lock");
|
||||
/*
|
||||
Create a table with a temporary name.
|
||||
With create_info->frm_only == 1 this creates a .frm file only.
|
||||
@ -7337,6 +7337,7 @@ view_err:
|
||||
close_temporary_table(thd, new_table, 1, 0);
|
||||
new_table= 0;
|
||||
}
|
||||
DEBUG_SYNC(thd, "alter_table_before_rename_result_table");
|
||||
|
||||
/*
|
||||
Data is copied. Now we:
|
||||
@ -7479,6 +7480,7 @@ view_err:
|
||||
thd_proc_info(thd, "end");
|
||||
|
||||
DBUG_EXECUTE_IF("sleep_alter_before_main_binlog", my_sleep(6000000););
|
||||
DEBUG_SYNC(thd, "alter_table_before_main_binlog");
|
||||
|
||||
ha_binlog_log_query(thd, create_info->db_type, LOGCOM_ALTER_TABLE,
|
||||
thd->query(), thd->query_length(),
|
||||
|
@ -330,6 +330,7 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
|
||||
String stmt_query;
|
||||
bool lock_upgrade_done= FALSE;
|
||||
MDL_ticket *mdl_ticket= NULL;
|
||||
Query_tables_list backup;
|
||||
|
||||
DBUG_ENTER("mysql_create_or_drop_trigger");
|
||||
|
||||
@ -393,6 +394,12 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create)
|
||||
{
|
||||
bool if_exists= thd->lex->drop_if_exists;
|
||||
|
||||
/*
|
||||
Protect the query table list from the temporary and potentially
|
||||
destructive changes necessary to open the trigger's table.
|
||||
*/
|
||||
thd->lex->reset_n_backup_query_tables_list(&backup);
|
||||
|
||||
if (add_table_for_trigger(thd, thd->lex->spname, if_exists, & tables))
|
||||
goto end;
|
||||
|
||||
@ -522,6 +529,10 @@ end:
|
||||
if (thd->locked_tables_mode && tables && lock_upgrade_done)
|
||||
mdl_ticket->downgrade_exclusive_lock(MDL_SHARED_NO_READ_WRITE);
|
||||
|
||||
/* Restore the query table list. Used only for drop trigger. */
|
||||
if (!create)
|
||||
thd->lex->restore_backup_query_tables_list(&backup);
|
||||
|
||||
if (thd->global_read_lock.has_protection())
|
||||
thd->global_read_lock.start_waiting_global_read_lock(thd);
|
||||
|
||||
@ -1636,10 +1647,6 @@ bool add_table_for_trigger(THD *thd,
|
||||
if (load_table_name_for_trigger(thd, trg_name, &trn_path, &tbl_name))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
/* We need to reset statement table list to be PS/SP friendly. */
|
||||
lex->query_tables= 0;
|
||||
lex->query_tables_last= &lex->query_tables;
|
||||
|
||||
*table= sp_add_to_query_tables(thd, lex, trg_name->m_db.str,
|
||||
tbl_name.str, TL_IGNORE);
|
||||
|
||||
|
@ -400,10 +400,7 @@ int mysql_update(THD *thd,
|
||||
matching rows before updating the table!
|
||||
*/
|
||||
if (used_index < MAX_KEY && old_covering_keys.is_set(used_index))
|
||||
{
|
||||
table->key_read=1;
|
||||
table->mark_columns_used_by_index(used_index);
|
||||
}
|
||||
else
|
||||
{
|
||||
table->use_all_columns();
|
||||
@ -852,11 +849,7 @@ int mysql_update(THD *thd,
|
||||
err:
|
||||
delete select;
|
||||
free_underlaid_joins(thd, select_lex);
|
||||
if (table->key_read)
|
||||
{
|
||||
table->key_read=0;
|
||||
table->file->extra(HA_EXTRA_NO_KEYREAD);
|
||||
}
|
||||
table->set_keyread(FALSE);
|
||||
thd->abort_on_warning= 0;
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
@ -1192,6 +1185,57 @@ reopen_tables:
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Implementation of the safe update options during UPDATE IGNORE. This syntax
|
||||
causes an UPDATE statement to ignore all errors. In safe update mode,
|
||||
however, we must never ignore the ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE. There
|
||||
is a special hook in my_message_sql that will otherwise delete all errors
|
||||
when the IGNORE option is specified.
|
||||
|
||||
In the future, all IGNORE handling should be used with this class and all
|
||||
traces of the hack outlined below should be removed.
|
||||
|
||||
- The parser detects IGNORE option and sets thd->lex->ignore= 1
|
||||
|
||||
- In JOIN::optimize, if this is set, then
|
||||
thd->lex->current_select->no_error gets set.
|
||||
|
||||
- In my_message_sql(), if the flag above is set then any error is
|
||||
unconditionally converted to a warning.
|
||||
|
||||
We are moving in the direction of using Internal_error_handler subclasses
|
||||
to do all such error tweaking, please continue this effort if new bugs
|
||||
appear.
|
||||
*/
|
||||
class Safe_dml_handler : public Internal_error_handler {
|
||||
|
||||
private:
|
||||
bool m_handled_error;
|
||||
|
||||
public:
|
||||
explicit Safe_dml_handler() : m_handled_error(FALSE) {}
|
||||
|
||||
bool handle_condition(THD *thd,
|
||||
uint sql_errno,
|
||||
const char* sqlstate,
|
||||
MYSQL_ERROR::enum_warning_level level,
|
||||
const char* msg,
|
||||
MYSQL_ERROR ** cond_hdl)
|
||||
{
|
||||
if (level == MYSQL_ERROR::WARN_LEVEL_ERROR &&
|
||||
sql_errno == ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE)
|
||||
{
|
||||
thd->stmt_da->set_error_status(thd, sql_errno, msg, sqlstate);
|
||||
m_handled_error= TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
bool handled_error() { return m_handled_error; }
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
Setup multi-update handling and call SELECT to do the join
|
||||
*/
|
||||
@ -1224,18 +1268,36 @@ bool mysql_multi_update(THD *thd,
|
||||
MODE_STRICT_ALL_TABLES));
|
||||
|
||||
List<Item> total_list;
|
||||
|
||||
Safe_dml_handler handler;
|
||||
bool using_handler= thd->variables.option_bits & OPTION_SAFE_UPDATES;
|
||||
if (using_handler)
|
||||
thd->push_internal_handler(&handler);
|
||||
|
||||
res= mysql_select(thd, &select_lex->ref_pointer_array,
|
||||
table_list, select_lex->with_wild,
|
||||
total_list,
|
||||
conds, 0, (ORDER *) NULL, (ORDER *)NULL, (Item *) NULL,
|
||||
(ORDER *)NULL,
|
||||
options | SELECT_NO_JOIN_CACHE | SELECT_NO_UNLOCK |
|
||||
OPTION_SETUP_TABLES_DONE,
|
||||
*result, unit, select_lex);
|
||||
DBUG_PRINT("info",("res: %d report_error: %d", res,
|
||||
(int) thd->is_error()));
|
||||
table_list, select_lex->with_wild,
|
||||
total_list,
|
||||
conds, 0, (ORDER *) NULL, (ORDER *)NULL, (Item *) NULL,
|
||||
(ORDER *)NULL,
|
||||
options | SELECT_NO_JOIN_CACHE | SELECT_NO_UNLOCK |
|
||||
OPTION_SETUP_TABLES_DONE,
|
||||
*result, unit, select_lex);
|
||||
|
||||
if (using_handler)
|
||||
{
|
||||
Internal_error_handler *top_handler;
|
||||
top_handler= thd->pop_internal_handler();
|
||||
DBUG_ASSERT(&handler == top_handler);
|
||||
}
|
||||
|
||||
DBUG_PRINT("info",("res: %d report_error: %d", res, (int) thd->is_error()));
|
||||
res|= thd->is_error();
|
||||
if (unlikely(res))
|
||||
/*
|
||||
Todo: remove below code and make Safe_dml_handler do error processing
|
||||
instead. That way we can return the actual error instead of
|
||||
ER_UNKNOWN_ERROR.
|
||||
*/
|
||||
if (unlikely(res) && (!using_handler || !handler.handled_error()))
|
||||
{
|
||||
/* If we had a another error reported earlier then this will be ignored */
|
||||
(*result)->send_error(ER_UNKNOWN_ERROR, ER(ER_UNKNOWN_ERROR));
|
||||
|
@ -405,17 +405,14 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views,
|
||||
|
||||
view= lex->unlink_first_table(&link_to_local);
|
||||
|
||||
if (mode != VIEW_CREATE_NEW)
|
||||
if (mode == VIEW_ALTER && fill_defined_view_parts(thd, view))
|
||||
{
|
||||
if (mode == VIEW_ALTER &&
|
||||
fill_defined_view_parts(thd, view))
|
||||
{
|
||||
res= TRUE;
|
||||
goto err;
|
||||
}
|
||||
sp_cache_invalidate();
|
||||
res= TRUE;
|
||||
goto err;
|
||||
}
|
||||
|
||||
sp_cache_invalidate();
|
||||
|
||||
if (!lex->definer)
|
||||
{
|
||||
/*
|
||||
|
@ -3410,7 +3410,7 @@ bool TABLE_LIST::prep_check_option(THD *thd, uint8 check_opt_type)
|
||||
|
||||
void TABLE_LIST::hide_view_error(THD *thd)
|
||||
{
|
||||
if (thd->get_internal_handler())
|
||||
if (thd->killed || thd->get_internal_handler())
|
||||
return;
|
||||
/* Hide "Unknown column" or "Unknown function" error */
|
||||
DBUG_ASSERT(thd->is_error());
|
||||
@ -4421,7 +4421,7 @@ void TABLE::mark_columns_used_by_index(uint index)
|
||||
MY_BITMAP *bitmap= &tmp_set;
|
||||
DBUG_ENTER("TABLE::mark_columns_used_by_index");
|
||||
|
||||
(void) file->extra(HA_EXTRA_KEYREAD);
|
||||
set_keyread(TRUE);
|
||||
bitmap_clear_all(bitmap);
|
||||
mark_columns_used_by_index_no_reset(index, bitmap);
|
||||
column_bitmaps_set(bitmap, bitmap);
|
||||
@ -4444,8 +4444,7 @@ void TABLE::restore_column_maps_after_mark_index()
|
||||
{
|
||||
DBUG_ENTER("TABLE::restore_column_maps_after_mark_index");
|
||||
|
||||
key_read= 0;
|
||||
(void) file->extra(HA_EXTRA_NO_KEYREAD);
|
||||
set_keyread(FALSE);
|
||||
default_column_bitmaps();
|
||||
file->column_bitmaps_signal();
|
||||
DBUG_VOID_RETURN;
|
||||
|
15
sql/table.h
15
sql/table.h
@ -950,6 +950,21 @@ public:
|
||||
*/
|
||||
inline bool needs_reopen()
|
||||
{ return !db_stat || m_needs_reopen; }
|
||||
|
||||
inline void set_keyread(bool flag)
|
||||
{
|
||||
DBUG_ASSERT(file);
|
||||
if (flag && !key_read)
|
||||
{
|
||||
key_read= 1;
|
||||
file->extra(HA_EXTRA_KEYREAD);
|
||||
}
|
||||
else if (!flag && key_read)
|
||||
{
|
||||
key_read= 0;
|
||||
file->extra(HA_EXTRA_NO_KEYREAD);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -384,6 +384,9 @@ ARCHIVE_SHARE *ha_archive::get_share(const char *table_name, int *rc)
|
||||
*/
|
||||
if (!(azopen(&archive_tmp, share->data_file_name, O_RDONLY|O_BINARY)))
|
||||
{
|
||||
*rc= my_errno ? my_errno : -1;
|
||||
mysql_mutex_unlock(&archive_mutex);
|
||||
my_free(share, MYF(0));
|
||||
DBUG_RETURN(NULL);
|
||||
}
|
||||
stats.auto_increment_value= archive_tmp.auto_increment + 1;
|
||||
@ -533,16 +536,18 @@ int ha_archive::open(const char *name, int mode, uint open_options)
|
||||
For now we have to refuse to open such table to avoid
|
||||
potential data loss.
|
||||
*/
|
||||
if ((rc == HA_ERR_CRASHED_ON_USAGE && !(open_options & HA_OPEN_FOR_REPAIR))
|
||||
|| rc == HA_ERR_TABLE_NEEDS_UPGRADE)
|
||||
switch (rc)
|
||||
{
|
||||
/* purecov: begin inspected */
|
||||
case 0:
|
||||
break;
|
||||
case HA_ERR_CRASHED_ON_USAGE:
|
||||
if (open_options & HA_OPEN_FOR_REPAIR)
|
||||
break;
|
||||
/* fall through */
|
||||
case HA_ERR_TABLE_NEEDS_UPGRADE:
|
||||
free_share();
|
||||
DBUG_RETURN(rc);
|
||||
/* purecov: end */
|
||||
}
|
||||
else if (rc == HA_ERR_OUT_OF_MEM)
|
||||
{
|
||||
/* fall through */
|
||||
default:
|
||||
DBUG_RETURN(rc);
|
||||
}
|
||||
|
||||
|
@ -784,9 +784,21 @@ int ha_tina::find_current_row(uchar *buf)
|
||||
|
||||
if (read_all || bitmap_is_set(table->read_set, (*field)->field_index))
|
||||
{
|
||||
bool is_enum= ((*field)->real_type() == MYSQL_TYPE_ENUM);
|
||||
/*
|
||||
Here CHECK_FIELD_WARN checks that all values in the csv file are valid
|
||||
which is normally the case, if they were written by
|
||||
INSERT -> ha_tina::write_row. '0' values on ENUM fields are considered
|
||||
invalid by Field_enum::store() but it can store them on INSERT anyway.
|
||||
Thus, for enums we silence the warning, as it doesn't really mean
|
||||
an invalid value.
|
||||
*/
|
||||
if ((*field)->store(buffer.ptr(), buffer.length(), buffer.charset(),
|
||||
CHECK_FIELD_WARN))
|
||||
goto err;
|
||||
is_enum ? CHECK_FIELD_IGNORE : CHECK_FIELD_WARN))
|
||||
{
|
||||
if (!is_enum)
|
||||
goto err;
|
||||
}
|
||||
if ((*field)->flags & BLOB_FLAG)
|
||||
{
|
||||
Field_blob *blob= *(Field_blob**) field;
|
||||
|
@ -437,8 +437,18 @@ static int _ft2_search(FTB *ftb, FTB_WORD *ftbw, my_bool init_search)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* going up to the first-level tree to continue search there */
|
||||
/*
|
||||
Going up to the first-level tree to continue search there.
|
||||
Only done when performing prefix search.
|
||||
|
||||
Key buffer data pointer as well as docid[0] may be smaller
|
||||
than values we got while searching first-level tree. Thus
|
||||
they must be restored to original values to avoid dead-loop,
|
||||
when subsequent search for a bigger value eventually ends up
|
||||
in this same second-level tree.
|
||||
*/
|
||||
_mi_dpointer(info, (uchar*) (lastkey_buf+HA_FT_WLEN), ftbw->key_root);
|
||||
ftbw->docid[0]= ftbw->key_root;
|
||||
ftbw->key_root=info->s->state.key_root[ftb->keynr];
|
||||
ftbw->keyinfo=info->s->keyinfo+ftb->keynr;
|
||||
ftbw->off=0;
|
||||
|
@ -936,8 +936,16 @@ static int update_dynamic_record(MI_INFO *info, my_off_t filepos, uchar *record,
|
||||
}
|
||||
|
||||
if (block_info.next_filepos != HA_OFFSET_ERROR)
|
||||
{
|
||||
/*
|
||||
delete_dynamic_record() may change data file position.
|
||||
IO cache must be notified as it may still have cached
|
||||
data, which has to be flushed later.
|
||||
*/
|
||||
info->rec_cache.seek_not_done= 1;
|
||||
if (delete_dynamic_record(info,block_info.next_filepos,1))
|
||||
goto err;
|
||||
}
|
||||
DBUG_RETURN(0);
|
||||
err:
|
||||
DBUG_RETURN(1);
|
||||
|
@ -325,8 +325,8 @@ void mi_update_status(void* param)
|
||||
(long) info->s->state.state.data_file_length));
|
||||
#endif
|
||||
info->s->state.state= *info->state;
|
||||
info->state= &info->s->state.state;
|
||||
}
|
||||
info->state= &info->s->state.state;
|
||||
info->append_insert_at_end= 0;
|
||||
|
||||
/*
|
||||
|
@ -528,6 +528,7 @@ fi
|
||||
if expr "$CC" : ".*icc.*" > /dev/null ;
|
||||
then
|
||||
%define WITH_LIBGCC 0
|
||||
:
|
||||
elif expr "$CC" : ".*gcc.*" > /dev/null ;
|
||||
then
|
||||
libgcc=`$CC $CFLAGS --print-libgcc-file`
|
||||
@ -537,9 +538,11 @@ then
|
||||
install -m 644 $libgcc $RBR%{_libdir}/mysql/libmygcc.a
|
||||
else
|
||||
%define WITH_LIBGCC 0
|
||||
:
|
||||
fi
|
||||
else
|
||||
%define WITH_LIBGCC 0
|
||||
:
|
||||
fi
|
||||
|
||||
##############################################################################
|
||||
@ -854,6 +857,14 @@ fi
|
||||
%attr(755, root, root) %{_bindir}/resolve_stack_dump
|
||||
%attr(755, root, root) %{_bindir}/resolveip
|
||||
|
||||
%attr(755, root, root) %{_libdir}/mysql/plugin/ha_example.so*
|
||||
%attr(755, root, root) %{_libdir}/mysql/plugin/semisync_master.so*
|
||||
%attr(755, root, root) %{_libdir}/mysql/plugin/semisync_slave.so*
|
||||
|
||||
%if %{WITH_TCMALLOC}
|
||||
%attr(755, root, root) %{_libdir}/mysql/%{malloc_lib_target}
|
||||
%endif
|
||||
|
||||
%attr(755, root, root) %{_sbindir}/mysqld
|
||||
%attr(755, root, root) %{_sbindir}/mysqld-debug
|
||||
%attr(755, root, root) %{_sbindir}/rcmysql
|
||||
|
Loading…
x
Reference in New Issue
Block a user