Merge ramayana.hindu.god:/home/tsmith/m/bk/51
into ramayana.hindu.god:/home/tsmith/m/bk/maint/51 configure.in: Auto merged mysql-test/Makefile.am: Auto merged mysql-test/mysql-test-run.pl: Auto merged scripts/Makefile.am: Auto merged scripts/mysql_system_tables_data.sql: Auto merged scripts/mysqld_safe.sh: Auto merged sql/sql_select.cc: Auto merged storage/innobase/handler/ha_innodb.cc: Auto merged
This commit is contained in:
commit
17c19299af
@ -692,9 +692,14 @@ 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
|
||||
{"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},
|
||||
{"port", 'P', "Port number to use for connection or 0 for default to, in "
|
||||
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
|
||||
#if MYSQL_PORT_DEFAULT == 0
|
||||
"/etc/services, "
|
||||
#endif
|
||||
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
|
||||
(uchar**) &opt_mysql_port,
|
||||
(uchar**) &opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"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},
|
||||
|
@ -96,8 +96,13 @@ 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
|
||||
{"port", 'P', "Port number to use for connection.", 0,
|
||||
0, 0, GET_STR, REQUIRED_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, "
|
||||
#if MYSQL_PORT_DEFAULT == 0
|
||||
"/etc/services, "
|
||||
#endif
|
||||
"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).",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
@ -462,7 +467,11 @@ static int run_query(const char *query, DYNAMIC_STRING *ds_res,
|
||||
|
||||
if (my_write(fd, (uchar*) query, strlen(query),
|
||||
MYF(MY_FNABP | MY_WME)))
|
||||
{
|
||||
my_close(fd, MYF(0));
|
||||
my_delete(query_file_path, MYF(0));
|
||||
die("Failed to write to '%s'", query_file_path);
|
||||
}
|
||||
|
||||
ret= run_tool(mysql_path,
|
||||
ds_res,
|
||||
|
@ -173,7 +173,13 @@ 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
|
||||
{"port", 'P', "Port number to use for connection.", (uchar**) &tcp_port,
|
||||
{"port", 'P', "Port number to use for connection or 0 for default to, in "
|
||||
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
|
||||
#if MYSQL_PORT_DEFAULT == 0
|
||||
"/etc/services, "
|
||||
#endif
|
||||
"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).",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
|
@ -760,9 +760,14 @@ static struct my_option my_long_options[] =
|
||||
0, GET_ULL, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"password", 'p', "Password to connect to remote server.",
|
||||
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"port", 'P', "Use port to connect to the remote server.",
|
||||
(uchar**) &port, (uchar**) &port, 0, GET_INT, REQUIRED_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, "
|
||||
#if MYSQL_PORT_DEFAULT == 0
|
||||
"/etc/services, "
|
||||
#endif
|
||||
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
|
||||
(uchar**) &port, (uchar**) &port, 0, GET_INT, REQUIRED_ARG,
|
||||
0, 0, 0, 0, 0, 0},
|
||||
{"position", 'j', "Deprecated. Use --start-position instead.",
|
||||
(uchar**) &start_position, (uchar**) &start_position, 0, GET_ULL,
|
||||
REQUIRED_ARG, BIN_LOG_HEADER_SIZE, BIN_LOG_HEADER_SIZE,
|
||||
|
@ -142,7 +142,13 @@ 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
|
||||
{"port", 'P', "Port number to use for connection.", (uchar**) &opt_mysql_port,
|
||||
{"port", 'P', "Port number to use for connection or 0 for default to, in "
|
||||
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
|
||||
#if MYSQL_PORT_DEFAULT == 0
|
||||
"/etc/services, "
|
||||
#endif
|
||||
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
|
||||
(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).",
|
||||
|
@ -1888,7 +1888,7 @@ static uint dump_events_for_db(char *db)
|
||||
if (create_delimiter(row[3], delimiter, sizeof(delimiter)) == NULL)
|
||||
{
|
||||
fprintf(stderr, "%s: Warning: Can't create delimiter for event '%s'\n",
|
||||
event_name, my_progname);
|
||||
my_progname, event_name);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
@ -4369,6 +4369,18 @@ static int start_transaction(MYSQL *mysql_con)
|
||||
need the REPEATABLE READ level (not anything lower, for example READ
|
||||
COMMITTED would give one new consistent read per dumped table).
|
||||
*/
|
||||
if ((mysql_get_server_version(mysql_con) < 40100) && opt_master_data)
|
||||
{
|
||||
fprintf(stderr, "-- %s: the combination of --single-transaction and "
|
||||
"--master-data requires a MySQL server version of at least 4.1 "
|
||||
"(current server's version is %s). %s\n",
|
||||
ignore_errors ? "Warning" : "Error",
|
||||
mysql_con->server_version ? mysql_con->server_version : "unknown",
|
||||
ignore_errors ? "Continuing due to --force, backup may not be consistent across all tables!" : "Aborting.");
|
||||
if (!ignore_errors)
|
||||
exit(EX_MYSQLERR);
|
||||
}
|
||||
|
||||
return (mysql_query_with_error_report(mysql_con, 0,
|
||||
"SET SESSION TRANSACTION ISOLATION "
|
||||
"LEVEL REPEATABLE READ") ||
|
||||
|
@ -137,7 +137,13 @@ 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
|
||||
{"port", 'P', "Port number to use for connection.", (uchar**) &opt_mysql_port,
|
||||
{"port", 'P', "Port number to use for connection or 0 for default to, in "
|
||||
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
|
||||
#if MYSQL_PORT_DEFAULT == 0
|
||||
"/etc/services, "
|
||||
#endif
|
||||
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
|
||||
(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).",
|
||||
|
@ -196,7 +196,13 @@ static struct my_option my_long_options[] =
|
||||
{"password", 'p',
|
||||
"Password to use when connecting to server. If password is not given it's asked from the tty.",
|
||||
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"port", 'P', "Port number to use for connection.", (uchar**) &opt_mysql_port,
|
||||
{"port", 'P', "Port number to use for connection or 0 for default to, in "
|
||||
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
|
||||
#if MYSQL_PORT_DEFAULT == 0
|
||||
"/etc/services, "
|
||||
#endif
|
||||
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
|
||||
(uchar**) &opt_mysql_port,
|
||||
(uchar**) &opt_mysql_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0,
|
||||
0},
|
||||
#ifdef __WIN__
|
||||
|
@ -1563,10 +1563,22 @@ void check_result(DYNAMIC_STRING* ds)
|
||||
and then show the diff
|
||||
*/
|
||||
char reject_file[FN_REFLEN];
|
||||
str_to_file(fn_format(reject_file, result_file_name, opt_logdir, ".reject",
|
||||
*opt_logdir ? MY_REPLACE_DIR | MY_REPLACE_EXT :
|
||||
MY_REPLACE_EXT),
|
||||
ds->str, ds->length);
|
||||
size_t reject_length;
|
||||
dirname_part(reject_file, result_file_name, &reject_length);
|
||||
|
||||
if (access(reject_file, W_OK) == 0)
|
||||
{
|
||||
/* Result file directory is writable, save reject file there */
|
||||
fn_format(reject_file, result_file_name, NULL,
|
||||
".reject", MY_REPLACE_EXT);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Put reject file in opt_logdir */
|
||||
fn_format(reject_file, result_file_name, opt_logdir,
|
||||
".reject", MY_REPLACE_DIR | MY_REPLACE_EXT);
|
||||
}
|
||||
str_to_file(reject_file, ds->str, ds->length);
|
||||
|
||||
dynstr_set(ds, NULL); /* Don't create a .log file */
|
||||
|
||||
@ -4946,7 +4958,13 @@ static struct my_option my_long_options[] =
|
||||
GET_INT, REQUIRED_ARG, 500, 1, 10000, 0, 0, 0},
|
||||
{"password", 'p', "Password to use when connecting to server.",
|
||||
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"port", 'P', "Port number to use for connection.", (uchar**) &opt_port,
|
||||
{"port", 'P', "Port number to use for connection or 0 for default to, in "
|
||||
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
|
||||
#if MYSQL_PORT_DEFAULT == 0
|
||||
"/etc/services, "
|
||||
#endif
|
||||
"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",
|
||||
(uchar**) &ps_protocol, (uchar**) &ps_protocol, 0,
|
||||
|
29
configure.in
29
configure.in
@ -676,7 +676,34 @@ AC_ARG_WITH(tcp-port,
|
||||
[ --with-tcp-port=port-number
|
||||
Which port to use for MySQL services (default 3306)],
|
||||
[ MYSQL_TCP_PORT=$withval ],
|
||||
[ MYSQL_TCP_PORT=$MYSQL_TCP_PORT_DEFAULT ]
|
||||
[ MYSQL_TCP_PORT=$MYSQL_TCP_PORT_DEFAULT
|
||||
# if we actually defaulted (as opposed to the pathological case of
|
||||
# --with-tcp-port=<MYSQL_TCP_PORT_DEFAULT> which might in theory
|
||||
# happen if whole batch of servers was built from a script), set
|
||||
# the default to zero to indicate that; we don't lose information
|
||||
# that way, because 0 obviously indicates that we can get the
|
||||
# default value from MYSQL_TCP_PORT. this seems really evil, but
|
||||
# testing for MYSQL_TCP_PORT==MYSQL_TCP_PORT_DEFAULT would make a
|
||||
# a port of MYSQL_TCP_PORT_DEFAULT magic even if the builder did not
|
||||
# intend it to mean "use the default, in fact, look up a good default
|
||||
# from /etc/services if you can", but really, really meant 3306 when
|
||||
# they passed in 3306. When they pass in a specific value, let them
|
||||
# have it; don't second guess user and think we know better, this will
|
||||
# just make people cross. this makes the the logic work like this
|
||||
# (which is complicated enough):
|
||||
#
|
||||
# - if a port was set during build, use that as a default.
|
||||
#
|
||||
# - otherwise, try to look up a port in /etc/services; if that fails,
|
||||
# use MYSQL_TCP_PORT_DEFAULT (at the time of this writing 3306)
|
||||
#
|
||||
# - allow the MYSQL_TCP_PORT environment variable to override that.
|
||||
#
|
||||
# - allow command-line parameters to override all of the above.
|
||||
#
|
||||
# the top-most MYSQL_TCP_PORT_DEFAULT is read from win/configure.js,
|
||||
# so don't mess with that.
|
||||
MYSQL_TCP_PORT_DEFAULT=0 ]
|
||||
)
|
||||
AC_SUBST(MYSQL_TCP_PORT)
|
||||
# We might want to document the assigned port in the manual.
|
||||
|
4
debian/po/ca.po
vendored
4
debian/po/ca.po
vendored
@ -162,9 +162,9 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Please also read http://www.mysql.com/doc/en/Upgrade.html"
|
||||
#~ msgid "Please also read http://dev.mysql.com/doc/mysql/en/upgrade.html"
|
||||
#~ msgstr ""
|
||||
#~ "Feu una ullada al document: http://www.mysql.com/doc/en/Upgrade.html"
|
||||
#~ "Feu una ullada al document: http://dev.mysql.com/doc/mysql/en/upgrade.html"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid ""
|
||||
|
4
debian/po/cs.po
vendored
4
debian/po/cs.po
vendored
@ -213,8 +213,8 @@ msgstr ""
|
||||
#~ "se tabulky mohly narušit! Tento skript také rozšiřuje tabulky privilegií, "
|
||||
#~ "ovšem neměl by uživatelům přidat více práv, než měli dosud."
|
||||
|
||||
#~ msgid "Please also read http://www.mysql.com/doc/en/Upgrade.html"
|
||||
#~ msgstr "Také si přečtěte http://www.mysql.com/doc/en/Upgrade.html"
|
||||
#~ msgid "Please also read http://dev.mysql.com/doc/mysql/en/upgrade.html"
|
||||
#~ msgstr "Také si přečtěte http://dev.mysql.com/doc/mysql/en/upgrade.html"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "MySQL will only install if you have a non-numeric hostname that is "
|
||||
|
4
debian/po/da.po
vendored
4
debian/po/da.po
vendored
@ -215,8 +215,8 @@ msgstr ""
|
||||
#~ "kan blive ødelagt! Dette script forbedrer også rettighedstabellerne, men "
|
||||
#~ "burde ikke give nogen bruger flere rettigheder, end han havde tidligere,"
|
||||
|
||||
#~ msgid "Please also read http://www.mysql.com/doc/en/Upgrade.html"
|
||||
#~ msgstr "Læs også http://www.mysql.com/doc/en/Upgrade.html"
|
||||
#~ msgid "Please also read http://dev.mysql.com/doc/mysql/en/upgrade.html"
|
||||
#~ msgstr "Læs også http://dev.mysql.com/doc/mysql/en/upgrade.html"
|
||||
|
||||
#~ msgid "Install Hints"
|
||||
#~ msgstr "Installationstips"
|
||||
|
4
debian/po/gl.po
vendored
4
debian/po/gl.po
vendored
@ -211,8 +211,8 @@ msgstr ""
|
||||
#~ "privilexios, pero non se supón que vaia dar a ningún usuario máis "
|
||||
#~ "dereitos dos que tiña antes."
|
||||
|
||||
#~ msgid "Please also read http://www.mysql.com/doc/en/Upgrade.html"
|
||||
#~ msgstr "Lea tamén http://www.mysql.com/doc/en/Upgrade.html"
|
||||
#~ msgid "Please also read http://dev.mysql.com/doc/mysql/en/upgrade.html"
|
||||
#~ msgstr "Lea tamén http://dev.mysql.com/doc/mysql/en/upgrade.html"
|
||||
|
||||
#~ msgid "Install Hints"
|
||||
#~ msgstr "Consellos de instalación"
|
||||
|
4
debian/po/ja.po
vendored
4
debian/po/ja.po
vendored
@ -274,5 +274,5 @@ msgstr ""
|
||||
#~ "す。スクリプトは、どのようなユーザに対しても、以前に保持していた以上の権限"
|
||||
#~ "を与えるようにはなっていません。"
|
||||
|
||||
#~ msgid "Please also read http://www.mysql.com/doc/en/Upgrade.html"
|
||||
#~ msgstr "http://www.mysql.com/doc/ja/Upgrade.html も参照してください"
|
||||
#~ msgid "Please also read http://dev.mysql.com/doc/mysql/en/upgrade.html"
|
||||
#~ msgstr "http://dev.mysql.com/doc/mysql/ja/upgrade.html も参照してください"
|
||||
|
4
debian/po/pt_BR.po
vendored
4
debian/po/pt_BR.po
vendored
@ -205,8 +205,8 @@ msgstr ""
|
||||
#~ "atribuirá a nenhum usuário mais direitos do que os mesmos já possuíam "
|
||||
#~ "anteriormente."
|
||||
|
||||
#~ msgid "Please also read http://www.mysql.com/doc/en/Upgrade.html"
|
||||
#~ msgstr "Por favor, leia http://www.mysql.com/doc/en/Upgrade.html"
|
||||
#~ msgid "Please also read http://dev.mysql.com/doc/mysql/en/upgrade.html"
|
||||
#~ msgstr "Por favor, leia http://dev.mysql.com/doc/mysql/en/upgrade.html"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Install Hints"
|
||||
|
4
debian/po/sv.po
vendored
4
debian/po/sv.po
vendored
@ -165,8 +165,8 @@ msgstr "S
|
||||
#~ "tabellerna vara skadade! Detta skript utökar även privilegietabellerna "
|
||||
#~ "men är inte tänkte att ge någon användare mer befogenhet än vad han hade "
|
||||
#~ "tidigare,"
|
||||
#~ msgid "Please also read http://www.mysql.com/doc/en/Upgrade.html"
|
||||
#~ msgstr "Läs även http://www.mysql.com/doc/en/Upgrade.html"
|
||||
#~ msgid "Please also read http://dev.mysql.com/doc/mysql/en/upgrade.html"
|
||||
#~ msgstr "Läs även http://dev.mysql.com/doc/mysql/en/upgrade.html"
|
||||
#~ msgid "Install Hints"
|
||||
#~ msgstr "Installationstips"
|
||||
#~ msgid ""
|
||||
|
4
debian/po/tr.po
vendored
4
debian/po/tr.po
vendored
@ -162,8 +162,8 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Please also read http://www.mysql.com/doc/en/Upgrade.html"
|
||||
#~ msgstr "Lütfen http://www.mysql.com/doc/en/Upgrade.html belgesini okuyun"
|
||||
#~ msgid "Please also read http://dev.mysql.com/doc/mysql/en/upgrade.html"
|
||||
#~ msgstr "Lütfen http://dev.mysql.com/doc/mysql/en/upgrade.html belgesini okuyun"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid ""
|
||||
|
@ -167,6 +167,7 @@ int main(int argc, char *argv[])
|
||||
DBUG_ENTER("main");
|
||||
|
||||
charsets_dir= DEFAULT_CHARSET_DIR;
|
||||
my_umask_dir= 0777;
|
||||
if (get_options(&argc, &argv))
|
||||
DBUG_RETURN(1);
|
||||
if (!(row_count= parse_input_file(TXTFILE, &error_head, &lang_head)))
|
||||
|
@ -854,8 +854,8 @@ typedef SOCKET_SIZE_TYPE size_socket;
|
||||
#define DBL_MAX 1.79769313486231470e+308
|
||||
#define FLT_MAX ((float)3.40282346638528860e+38)
|
||||
#endif
|
||||
#ifndef SSIZE_MAX
|
||||
#define SSIZE_MAX ((~((size_t) 0)) / 2)
|
||||
#ifndef SIZE_T_MAX
|
||||
#define SIZE_T_MAX ~((size_t) 0)
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_FINITE
|
||||
|
@ -15,6 +15,7 @@
|
||||
#define FRM_VER @DOT_FRM_VERSION@
|
||||
#define MYSQL_VERSION_ID @MYSQL_VERSION_ID@
|
||||
#define MYSQL_PORT @MYSQL_TCP_PORT@
|
||||
#define MYSQL_PORT_DEFAULT @MYSQL_TCP_PORT_DEFAULT@
|
||||
#define MYSQL_UNIX_ADDR "@MYSQL_UNIX_ADDR@"
|
||||
#define MYSQL_CONFIG_NAME "my"
|
||||
#define MYSQL_COMPILATION_COMMENT "@COMPILATION_COMMENT@"
|
||||
|
@ -133,10 +133,23 @@ int STDCALL mysql_server_init(int argc __attribute__((unused)),
|
||||
{
|
||||
struct servent *serv_ptr;
|
||||
char *env;
|
||||
if ((serv_ptr = getservbyname("mysql", "tcp")))
|
||||
mysql_port = (uint) ntohs((ushort) serv_ptr->s_port);
|
||||
if ((env = getenv("MYSQL_TCP_PORT")))
|
||||
mysql_port =(uint) atoi(env);
|
||||
|
||||
/*
|
||||
if builder specifically requested a default port, use that
|
||||
(even if it coincides with our factory default).
|
||||
only if they didn't do we check /etc/services (and, failing
|
||||
on that, fall back to the factory default of 3306).
|
||||
either default can be overridden by the environment variable
|
||||
MYSQL_TCP_PORT, which in turn can be overridden with command
|
||||
line options.
|
||||
*/
|
||||
|
||||
#if MYSQL_PORT_DEFAULT == 0
|
||||
if ((serv_ptr = getservbyname("mysql", "tcp")))
|
||||
mysql_port = (uint) ntohs((ushort) serv_ptr->s_port);
|
||||
#endif
|
||||
if ((env = getenv("MYSQL_TCP_PORT")))
|
||||
mysql_port =(uint) atoi(env);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@ -4679,7 +4692,7 @@ int cli_read_binary_rows(MYSQL_STMT *stmt)
|
||||
NET *net;
|
||||
|
||||
DBUG_ENTER("cli_read_binary_rows");
|
||||
|
||||
|
||||
if (!mysql)
|
||||
{
|
||||
set_stmt_error(stmt, CR_SERVER_LOST, unknown_sqlstate);
|
||||
|
@ -154,6 +154,7 @@ SUFFIXES = .sh
|
||||
-e 's!@''PERL''@!@PERL@!' \
|
||||
-e 's!@''VERSION''@!@VERSION@!' \
|
||||
-e 's!@''MYSQL_TCP_PORT''@!@MYSQL_TCP_PORT@!' \
|
||||
-e 's!@''MYSQL_TCP_PORT_DEFAULT''@!@MYSQL_TCP_PORT_DEFAULT@!' \
|
||||
-e 's!@''MYSQL_BASE_VERSION''@!@MYSQL_BASE_VERSION@!' \
|
||||
-e 's!@''MYSQL_UNIX_ADDR''@!@MYSQL_UNIX_ADDR@!' \
|
||||
-e 's!@''MYSQL_TCP_PORT''@!@MYSQL_TCP_PORT@!' \
|
||||
|
@ -51,6 +51,15 @@ SELECT c1 as want1result from t1 where c1 like 'locatio%';
|
||||
SELECT c1 as want1result from t1 where c1 like 'location%';
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug #31070: crash during conversion of charsets
|
||||
#
|
||||
create table t1 (a set('a') not null);
|
||||
insert into t1 values (),();
|
||||
select cast(a as char(1)) from t1;
|
||||
select a sounds like a from t1;
|
||||
drop table t1;
|
||||
|
||||
DROP DATABASE d1;
|
||||
# Restore settings
|
||||
USE test;
|
||||
|
@ -1,4 +1,5 @@
|
||||
--require r/windows.require
|
||||
disable_query_log;
|
||||
select convert(@@version_compile_os using latin1) IN ("Win32","Win64","Windows") as "TRUE";
|
||||
enable_query_log;
|
||||
if (`select convert(@@version_compile_os using latin1) IN ("Win32","Win64","Windows") = 0`)
|
||||
{
|
||||
skip Need windows;
|
||||
}
|
||||
|
||||
|
@ -28,6 +28,26 @@ sub collect_one_test_case ($$$$$$$$$);
|
||||
|
||||
sub mtr_options_from_test_file($$);
|
||||
|
||||
my $do_test;
|
||||
my $skip_test;
|
||||
|
||||
sub init_pattern {
|
||||
my ($from, $what)= @_;
|
||||
if ( $from =~ /[a-z0-9]/ ) {
|
||||
# Does not contain any regex, make the pattern match
|
||||
# beginning of string
|
||||
$from= "^$from";
|
||||
}
|
||||
else {
|
||||
# Check that pattern is a valid regex
|
||||
eval { "" =~/$from/; 1 } or
|
||||
mtr_error("Invalid regex '$from' passed to $what\nPerl says: $@");
|
||||
}
|
||||
return $from;
|
||||
}
|
||||
|
||||
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# Collect information about test cases we are to run
|
||||
@ -35,6 +55,9 @@ sub mtr_options_from_test_file($$);
|
||||
##############################################################################
|
||||
|
||||
sub collect_test_cases ($) {
|
||||
$do_test= init_pattern($::opt_do_test, "--do-test");
|
||||
$skip_test= init_pattern($::opt_skip_test, "--skip-test");
|
||||
|
||||
my $suites= shift; # Semicolon separated list of test suites
|
||||
my $cases = []; # Array of hash
|
||||
|
||||
@ -48,13 +71,14 @@ sub collect_test_cases ($) {
|
||||
{
|
||||
# Check that the tests specified was found
|
||||
# in at least one suite
|
||||
foreach my $tname ( @::opt_cases )
|
||||
foreach my $test_name_spec ( @::opt_cases )
|
||||
{
|
||||
my $found= 0;
|
||||
my ($sname, $tname, $extension)= split_testname($test_name_spec);
|
||||
foreach my $test ( @$cases )
|
||||
{
|
||||
if ( $test->{'name'} eq $tname ||
|
||||
mtr_match_extension($test->{'name'}, $tname) )
|
||||
# test->{name} is always in suite.name format
|
||||
if ( $test->{name} =~ /.*\.$tname/ )
|
||||
{
|
||||
$found= 1;
|
||||
}
|
||||
@ -144,6 +168,45 @@ sub collect_test_cases ($) {
|
||||
|
||||
}
|
||||
|
||||
# Valid extensions and their corresonding component id
|
||||
my %exts = ( 'test' => 'mysqld',
|
||||
'imtest' => 'im'
|
||||
);
|
||||
|
||||
|
||||
# Returns (suitename, testname, extension)
|
||||
sub split_testname {
|
||||
my ($test_name)= @_;
|
||||
|
||||
# Get rid of directory part and split name on .'s
|
||||
my @parts= split(/\./, basename($test_name));
|
||||
|
||||
if (@parts == 1){
|
||||
# Only testname given, ex: alias
|
||||
return (undef , $parts[0], undef);
|
||||
} elsif (@parts == 2) {
|
||||
# Either testname.test or suite.testname given
|
||||
# Ex. main.alias or alias.test
|
||||
|
||||
if (defined $exts{$parts[1]})
|
||||
{
|
||||
return (undef , $parts[0], $parts[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
return ($parts[0], $parts[1], undef);
|
||||
}
|
||||
|
||||
} elsif (@parts == 3) {
|
||||
# Fully specified suitename.testname.test
|
||||
# ex main.alias.test
|
||||
return ( $parts[0], $parts[1], $parts[2]);
|
||||
}
|
||||
|
||||
mtr_error("Illegal format of test name: $test_name");
|
||||
}
|
||||
|
||||
|
||||
sub collect_one_suite($$)
|
||||
{
|
||||
my $suite= shift; # Test suite name
|
||||
@ -151,19 +214,16 @@ sub collect_one_suite($$)
|
||||
|
||||
mtr_verbose("Collecting: $suite");
|
||||
|
||||
my $testdir;
|
||||
my $resdir;
|
||||
my $suitedir= "$::glob_mysql_test_dir"; # Default
|
||||
if ( $suite ne "main" )
|
||||
{
|
||||
$suitedir= mtr_path_exists("$suitedir/suite/$suite",
|
||||
"$suitedir/$suite");
|
||||
mtr_verbose("suitedir: $suitedir");
|
||||
}
|
||||
|
||||
if ( $suite eq "main" )
|
||||
{
|
||||
$testdir= "$::glob_mysql_test_dir/t";
|
||||
$resdir= "$::glob_mysql_test_dir/r";
|
||||
}
|
||||
else
|
||||
{
|
||||
$testdir= "$::glob_mysql_test_dir/suite/$suite/t";
|
||||
$resdir= "$::glob_mysql_test_dir/suite/$suite/r";
|
||||
}
|
||||
my $testdir= "$suitedir/t";
|
||||
my $resdir= "$suitedir/r";
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# Build a hash of disabled testcases for this suite
|
||||
@ -192,77 +252,55 @@ sub collect_one_suite($$)
|
||||
|
||||
if ( @::opt_cases )
|
||||
{
|
||||
# Collect in specified order, no sort
|
||||
foreach my $tname2 ( @::opt_cases )
|
||||
# Collect in specified order
|
||||
foreach my $test_name_spec ( @::opt_cases )
|
||||
{
|
||||
my $tname= $tname2; # Don't modify @::opt_cases !
|
||||
my $elem= undef;
|
||||
my $component_id= undef;
|
||||
my ($sname, $tname, $extension)= split_testname($test_name_spec);
|
||||
|
||||
# Get rid of directory part (path). Leave the extension since it is used
|
||||
# to understand type of the test.
|
||||
# The test name parts have now been defined
|
||||
#print " suite_name: $sname\n";
|
||||
#print " tname: $tname\n";
|
||||
#print " extension: $extension\n";
|
||||
|
||||
$tname = basename($tname);
|
||||
# Check cirrect suite if suitename is defined
|
||||
next if (defined $sname and $suite ne $sname);
|
||||
|
||||
# Get rid of suite part
|
||||
$tname =~ s/^$suite\.//;
|
||||
|
||||
# Check if the extenstion has been specified.
|
||||
|
||||
if ( mtr_match_extension($tname, "test") )
|
||||
my $component_id;
|
||||
if ( defined $extension )
|
||||
{
|
||||
$elem= $tname;
|
||||
$tname=~ s/\.test$//;
|
||||
$component_id= 'mysqld';
|
||||
}
|
||||
elsif ( mtr_match_extension($tname, "imtest") )
|
||||
{
|
||||
$elem= $tname;
|
||||
$tname =~ s/\.imtest$//;
|
||||
$component_id= 'im';
|
||||
}
|
||||
|
||||
# If target component is known, check that the specified test case
|
||||
# exists.
|
||||
#
|
||||
# Otherwise, try to guess the target component.
|
||||
|
||||
if ( $component_id )
|
||||
{
|
||||
if ( ! -f "$testdir/$elem")
|
||||
my $full_name= "$testdir/$tname.$extension";
|
||||
# Extension was specified, check if the test exists
|
||||
if ( ! -f $full_name)
|
||||
{
|
||||
mtr_error("Test case $tname ($testdir/$elem) is not found");
|
||||
# This is only an error if suite was specified, otherwise it
|
||||
# could exist in another suite
|
||||
mtr_error("Test '$full_name' was not found in suite '$sname'")
|
||||
if $sname;
|
||||
|
||||
next;
|
||||
}
|
||||
$component_id= $exts{$extension};
|
||||
}
|
||||
else
|
||||
{
|
||||
my $mysqld_test_exists = -f "$testdir/$tname.test";
|
||||
my $im_test_exists = -f "$testdir/$tname.imtest";
|
||||
# No extension was specified
|
||||
my ($ext, $component);
|
||||
while (($ext, $component)= each %exts) {
|
||||
my $full_name= "$testdir/$tname.$ext";
|
||||
|
||||
if ( $mysqld_test_exists and $im_test_exists )
|
||||
{
|
||||
mtr_error("Ambiguous test case name ($tname)");
|
||||
}
|
||||
elsif ( ! $mysqld_test_exists and ! $im_test_exists )
|
||||
{
|
||||
# Silently skip, could exist in another suite
|
||||
next;
|
||||
}
|
||||
elsif ( $mysqld_test_exists )
|
||||
{
|
||||
$elem= "$tname.test";
|
||||
$component_id= 'mysqld';
|
||||
}
|
||||
elsif ( $im_test_exists )
|
||||
{
|
||||
$elem= "$tname.imtest";
|
||||
$component_id= 'im';
|
||||
}
|
||||
if ( ! -f $full_name ) {
|
||||
next;
|
||||
}
|
||||
$component_id= $component;
|
||||
$extension= $ext;
|
||||
}
|
||||
# Test not found here, could exist in other suite
|
||||
next unless $component_id;
|
||||
}
|
||||
|
||||
collect_one_test_case($testdir,$resdir,$suite,$tname,
|
||||
$elem,$cases,\%disabled,$component_id,
|
||||
$suite_opts);
|
||||
"$tname.$extension",$cases,\%disabled,
|
||||
$component_id,$suite_opts);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -288,8 +326,7 @@ sub collect_one_suite($$)
|
||||
}
|
||||
|
||||
# Skip tests that does not match the --do-test= filter
|
||||
next if $::opt_do_test and
|
||||
! defined mtr_match_prefix($elem,$::opt_do_test);
|
||||
next if ($do_test and not $tname =~ /$do_test/o);
|
||||
|
||||
collect_one_test_case($testdir,$resdir,$suite,$tname,
|
||||
$elem,$cases,\%disabled,$component_id,
|
||||
@ -333,7 +370,7 @@ sub collect_one_test_case($$$$$$$$$) {
|
||||
|
||||
|
||||
my $tinfo= {};
|
||||
$tinfo->{'name'}= "$suite.$tname";
|
||||
$tinfo->{'name'}= basename($suite) . ".$tname";
|
||||
$tinfo->{'result_file'}= "$resdir/$tname.result";
|
||||
$tinfo->{'component_id'} = $component_id;
|
||||
push(@$cases, $tinfo);
|
||||
@ -342,7 +379,7 @@ sub collect_one_test_case($$$$$$$$$) {
|
||||
# Skip some tests but include in list, just mark them to skip
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
if ( $::opt_skip_test and defined mtr_match_prefix($tname,$::opt_skip_test) )
|
||||
if ( $skip_test and $tname =~ /$skip_test/o )
|
||||
{
|
||||
$tinfo->{'skip'}= 1;
|
||||
return;
|
||||
|
@ -196,7 +196,7 @@ sub mtr_report_stats ($) {
|
||||
"of what went wrong.\n",
|
||||
"If you want to report this error, please read first ",
|
||||
"the documentation at\n",
|
||||
"http://www.mysql.com/doc/en/MySQL_test_suite.html\n";
|
||||
"http://dev.mysql.com/doc/mysql/en/mysql-test-suite.html\n";
|
||||
}
|
||||
if (!$::opt_extern)
|
||||
{
|
||||
|
@ -23,7 +23,16 @@ USE_MANAGER=0
|
||||
MY_TZ=GMT-3
|
||||
TZ=$MY_TZ; export TZ # for UNIX_TIMESTAMP tests to work
|
||||
LOCAL_SOCKET=@MYSQL_UNIX_ADDR@
|
||||
MYSQL_TCP_PORT=@MYSQL_TCP_PORT@
|
||||
|
||||
if [ -z "$MYSQL_TCP_PORT" ]; then
|
||||
MYSQL_TCP_PORT=@MYSQL_TCP_PORT@
|
||||
if [ @MYSQL_TCP_PORT_DEFAULT@ -eq 0 ]; then
|
||||
ESP=`getent services mysql/tcp`
|
||||
if [ $? -eq 0 ]; then
|
||||
MYSQL_TCP_PORT=`echo "$ESP"|sed -e's-^[a-z]*[ ]*\([0-9]*\)/[a-z]*$-\1-g'`
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
umask 022
|
||||
|
||||
@ -981,7 +990,7 @@ show_failed_diff ()
|
||||
$DIFF -c $result_file $reject_file
|
||||
echo "-------------------------------------------------------"
|
||||
echo "Please follow the instructions outlined at"
|
||||
echo "http://dev.mysql.com/doc/mysql/en/reporting-mysqltest-bugs.html"
|
||||
echo "http://forge.mysql.com/wiki/MySQL_Internals_Porting#Debugging_a_MySQL_Server"
|
||||
echo "to find the reason to this problem and how to report this."
|
||||
echo ""
|
||||
fi
|
||||
|
@ -1354,6 +1354,7 @@ sub datadir_list_setup () {
|
||||
|
||||
sub collect_mysqld_features () {
|
||||
my $found_variable_list_start= 0;
|
||||
my $tmpdir= tempdir(CLEANUP => 0); # Directory removed by this function
|
||||
|
||||
#
|
||||
# Execute "mysqld --help --verbose" to get a list
|
||||
@ -1364,7 +1365,7 @@ sub collect_mysqld_features () {
|
||||
#
|
||||
# --datadir must exist, mysqld will chdir into it
|
||||
#
|
||||
my $list= `$exe_mysqld --no-defaults --datadir=$path_language --language=$path_language --skip-grant-tables --verbose --help`;
|
||||
my $list= `$exe_mysqld --no-defaults --datadir=$tmpdir --language=$path_language --skip-grant-tables --verbose --help`;
|
||||
|
||||
foreach my $line (split('\n', $list))
|
||||
{
|
||||
@ -1419,7 +1420,7 @@ sub collect_mysqld_features () {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rmtree($tmpdir);
|
||||
mtr_error("Could not find version of MySQL") unless $mysql_version_id;
|
||||
mtr_error("Could not find variabes list") unless $found_variable_list_start;
|
||||
|
||||
@ -3743,6 +3744,11 @@ sub mysqld_arguments ($$$$) {
|
||||
mtr_add_arg($args, "%s--language=%s", $prefix, $path_language);
|
||||
mtr_add_arg($args, "%s--tmpdir=$opt_tmpdir", $prefix);
|
||||
|
||||
# Increase default connect_timeout to avoid intermittent
|
||||
# disconnects when test servers are put under load
|
||||
# see BUG#28359
|
||||
mtr_add_arg($args, "%s--connect-timeout=60", $prefix);
|
||||
|
||||
if ( $opt_valgrind_mysqld )
|
||||
{
|
||||
mtr_add_arg($args, "%s--skip-safemalloc", $prefix);
|
||||
@ -5039,7 +5045,7 @@ sub valgrind_arguments {
|
||||
}
|
||||
|
||||
# Add valgrind options, can be overriden by user
|
||||
mtr_add_arg($args, '%s', $_) for (split(' ', $opt_valgrind_options));
|
||||
mtr_add_arg($args, '%s', $opt_valgrind_options);
|
||||
|
||||
mtr_add_arg($args, $$exe);
|
||||
|
||||
@ -5112,14 +5118,18 @@ Options to control what test suites or cases to run
|
||||
skip-ndb[cluster] Skip all tests that need cluster
|
||||
skip-ndb[cluster]-slave Skip all tests that need a slave cluster
|
||||
ndb-extra Run extra tests from ndb directory
|
||||
do-test=PREFIX Run test cases which name are prefixed with PREFIX
|
||||
do-test=PREFIX or REGEX
|
||||
Run test cases which name are prefixed with PREFIX
|
||||
or fulfills REGEX
|
||||
skip-test=PREFIX or REGEX
|
||||
Skip test cases which name are prefixed with PREFIX
|
||||
or fulfills REGEX
|
||||
start-from=PREFIX Run test cases starting from test prefixed with PREFIX
|
||||
suite[s]=NAME1,..,NAMEN Collect tests in suites from the comma separated
|
||||
list of suite names.
|
||||
The default is: "$opt_suites"
|
||||
skip-rpl Skip the replication test cases.
|
||||
skip-im Don't start IM, and skip the IM test cases
|
||||
skip-test=PREFIX Skip test cases which name are prefixed with PREFIX
|
||||
big-test Set the environment variable BIG_TEST, which can be
|
||||
checked from test cases.
|
||||
|
||||
|
@ -11124,10 +11124,11 @@ auto fld1 companynr fld3 fld4 fld5 fld6
|
||||
SELECT COUNT(auto) FROM t2;
|
||||
COUNT(auto)
|
||||
1213
|
||||
INSERT DELAYED INTO t2 VALUES (4,011403,37,'intercepted','audiology','tinily','');
|
||||
INSERT DELAYED INTO t2 VALUES (99999,011403,37,'the','delayed','insert','');
|
||||
INSERT INTO t2 VALUES (100000,000001,00,'after','delayed','insert','');
|
||||
SELECT COUNT(auto) FROM t2;
|
||||
COUNT(auto)
|
||||
1214
|
||||
1215
|
||||
ALTER TABLE t2 DROP COLUMN fld6;
|
||||
SHOW CREATE TABLE t2;
|
||||
Table Create Table
|
||||
@ -11139,7 +11140,7 @@ t2 CREATE TABLE `t2` (
|
||||
`fld4` char(35) NOT NULL DEFAULT '',
|
||||
`fld5` char(35) NOT NULL DEFAULT ''
|
||||
) ENGINE=ARCHIVE DEFAULT CHARSET=latin1
|
||||
SELECT * FROM t2;
|
||||
SELECT * FROM t2 WHERE auto != 100000;
|
||||
auto fld1 companynr fld3 fld4 fld5
|
||||
1 000001 00 Omaha teethe neat
|
||||
2 011401 37 breaking dreaded Steinberg
|
||||
@ -12354,7 +12355,7 @@ auto fld1 companynr fld3 fld4 fld5
|
||||
2 011401 37 breaking dreaded Steinberg
|
||||
3 011402 37 Romans scholastics jarring
|
||||
4 011403 37 intercepted audiology tinily
|
||||
4 011403 37 intercepted audiology tinily
|
||||
99999 011403 37 the delayed insert
|
||||
CREATE TABLE `t5` (
|
||||
`a` int(11) NOT NULL auto_increment,
|
||||
b char(12),
|
||||
|
@ -52,6 +52,19 @@ SELECT c1 as want1result from t1 where c1 like 'location%';
|
||||
want1result
|
||||
location
|
||||
DROP TABLE t1;
|
||||
create table t1 (a set('a') not null);
|
||||
insert into t1 values (),();
|
||||
Warnings:
|
||||
Warning 1364 Field 'a' doesn't have a default value
|
||||
select cast(a as char(1)) from t1;
|
||||
cast(a as char(1))
|
||||
|
||||
|
||||
select a sounds like a from t1;
|
||||
a sounds like a
|
||||
1
|
||||
1
|
||||
drop table t1;
|
||||
DROP DATABASE d1;
|
||||
USE test;
|
||||
SET character_set_server= @safe_character_set_server;
|
||||
|
@ -52,6 +52,19 @@ SELECT c1 as want1result from t1 where c1 like 'location%';
|
||||
want1result
|
||||
location
|
||||
DROP TABLE t1;
|
||||
create table t1 (a set('a') not null);
|
||||
insert into t1 values (),();
|
||||
Warnings:
|
||||
Warning 1364 Field 'a' doesn't have a default value
|
||||
select cast(a as char(1)) from t1;
|
||||
cast(a as char(1))
|
||||
|
||||
|
||||
select a sounds like a from t1;
|
||||
a sounds like a
|
||||
1
|
||||
1
|
||||
drop table t1;
|
||||
DROP DATABASE d1;
|
||||
USE test;
|
||||
SET character_set_server= @safe_character_set_server;
|
||||
|
@ -52,6 +52,19 @@ SELECT c1 as want1result from t1 where c1 like 'location%';
|
||||
want1result
|
||||
location
|
||||
DROP TABLE t1;
|
||||
create table t1 (a set('a') not null);
|
||||
insert into t1 values (),();
|
||||
Warnings:
|
||||
Warning 1364 Field 'a' doesn't have a default value
|
||||
select cast(a as char(1)) from t1;
|
||||
cast(a as char(1))
|
||||
|
||||
|
||||
select a sounds like a from t1;
|
||||
a sounds like a
|
||||
1
|
||||
1
|
||||
drop table t1;
|
||||
DROP DATABASE d1;
|
||||
USE test;
|
||||
SET character_set_server= @safe_character_set_server;
|
||||
|
@ -52,6 +52,19 @@ SELECT c1 as want1result from t1 where c1 like 'location%';
|
||||
want1result
|
||||
location
|
||||
DROP TABLE t1;
|
||||
create table t1 (a set('a') not null);
|
||||
insert into t1 values (),();
|
||||
Warnings:
|
||||
Warning 1364 Field 'a' doesn't have a default value
|
||||
select cast(a as char(1)) from t1;
|
||||
cast(a as char(1))
|
||||
|
||||
|
||||
select a sounds like a from t1;
|
||||
a sounds like a
|
||||
1
|
||||
1
|
||||
drop table t1;
|
||||
DROP DATABASE d1;
|
||||
USE test;
|
||||
SET character_set_server= @safe_character_set_server;
|
||||
|
@ -2587,6 +2587,19 @@ SELECT c1 as want1result from t1 where c1 like 'location%';
|
||||
want1result
|
||||
location
|
||||
DROP TABLE t1;
|
||||
create table t1 (a set('a') not null);
|
||||
insert into t1 values (),();
|
||||
Warnings:
|
||||
Warning 1364 Field 'a' doesn't have a default value
|
||||
select cast(a as char(1)) from t1;
|
||||
cast(a as char(1))
|
||||
|
||||
|
||||
select a sounds like a from t1;
|
||||
a sounds like a
|
||||
1
|
||||
1
|
||||
drop table t1;
|
||||
DROP DATABASE d1;
|
||||
USE test;
|
||||
SET character_set_server= @safe_character_set_server;
|
||||
|
@ -1210,6 +1210,9 @@ SELECT * FROM test.t1;
|
||||
f1 f2
|
||||
1 1
|
||||
2 2
|
||||
REVOKE UPDATE (f1) ON `test`.`t1` FROM 'mysqltest_1'@'localhost';
|
||||
REVOKE SELECT ON `test`.* FROM 'mysqltest_1'@'localhost';
|
||||
REVOKE ALL ON db27878.* FROM 'mysqltest_1'@'localhost';
|
||||
DROP DATABASE db27878;
|
||||
use test;
|
||||
DROP TABLE t1;
|
||||
|
@ -16,3 +16,125 @@ delete from mysql.db where user like 'mysqltest\_%';
|
||||
delete from mysql.tables_priv where user like 'mysqltest\_%';
|
||||
delete from mysql.columns_priv where user like 'mysqltest\_%';
|
||||
flush privileges;
|
||||
grant select on test.* to CUser@localhost;
|
||||
grant select on test.* to CUser@LOCALHOST;
|
||||
flush privileges;
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
user host
|
||||
CUser LOCALHOST
|
||||
CUser localhost
|
||||
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser' order by 1,2;
|
||||
user host db select_priv
|
||||
CUser LOCALHOST test Y
|
||||
CUser localhost test Y
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'LOCALHOST';
|
||||
flush privileges;
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
user host
|
||||
CUser LOCALHOST
|
||||
CUser localhost
|
||||
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser' order by 1,2;
|
||||
user host db select_priv
|
||||
CUser localhost test Y
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'localhost';
|
||||
flush privileges;
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
user host
|
||||
CUser LOCALHOST
|
||||
CUser localhost
|
||||
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser' order by 1,2;
|
||||
user host db select_priv
|
||||
DROP USER CUser@localhost;
|
||||
DROP USER CUser@LOCALHOST;
|
||||
create table t1 (a int);
|
||||
grant select on test.t1 to CUser@localhost;
|
||||
grant select on test.t1 to CUser@LOCALHOST;
|
||||
flush privileges;
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
user host
|
||||
CUser LOCALHOST
|
||||
CUser localhost
|
||||
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||
user host db Table_name Table_priv Column_priv
|
||||
CUser LOCALHOST test t1 Select
|
||||
CUser localhost test t1 Select
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'LOCALHOST';
|
||||
flush privileges;
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
user host
|
||||
CUser LOCALHOST
|
||||
CUser localhost
|
||||
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||
user host db Table_name Table_priv Column_priv
|
||||
CUser localhost test t1 Select
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'localhost';
|
||||
flush privileges;
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
user host
|
||||
CUser LOCALHOST
|
||||
CUser localhost
|
||||
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||
user host db Table_name Table_priv Column_priv
|
||||
DROP USER CUser@localhost;
|
||||
DROP USER CUser@LOCALHOST;
|
||||
grant select(a) on test.t1 to CUser@localhost;
|
||||
grant select(a) on test.t1 to CUser@LOCALHOST;
|
||||
flush privileges;
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
user host
|
||||
CUser LOCALHOST
|
||||
CUser localhost
|
||||
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||
user host db Table_name Table_priv Column_priv
|
||||
CUser LOCALHOST test t1 Select
|
||||
CUser localhost test t1 Select
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'LOCALHOST';
|
||||
flush privileges;
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
user host
|
||||
CUser LOCALHOST
|
||||
CUser localhost
|
||||
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||
user host db Table_name Table_priv Column_priv
|
||||
CUser localhost test t1 Select
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'localhost';
|
||||
flush privileges;
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
user host
|
||||
CUser LOCALHOST
|
||||
CUser localhost
|
||||
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||
user host db Table_name Table_priv Column_priv
|
||||
DROP USER CUser@localhost;
|
||||
DROP USER CUser@LOCALHOST;
|
||||
drop table t1;
|
||||
grant select on test.* to CUser2@localhost;
|
||||
grant select on test.* to CUser2@LOCALHOST;
|
||||
flush privileges;
|
||||
SELECT user, host FROM mysql.user where user = 'CUser2' order by 1,2;
|
||||
user host
|
||||
CUser2 LOCALHOST
|
||||
CUser2 localhost
|
||||
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser2' order by 1,2;
|
||||
user host db select_priv
|
||||
CUser2 LOCALHOST test Y
|
||||
CUser2 localhost test Y
|
||||
REVOKE SELECT ON test.* FROM 'CUser2'@'LOCALHOST';
|
||||
flush privileges;
|
||||
SELECT user, host FROM mysql.user where user = 'CUser2' order by 1,2;
|
||||
user host
|
||||
CUser2 LOCALHOST
|
||||
CUser2 localhost
|
||||
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser2' order by 1,2;
|
||||
user host db select_priv
|
||||
CUser2 localhost test Y
|
||||
REVOKE SELECT ON test.* FROM 'CUser2'@'localhost';
|
||||
flush privileges;
|
||||
SELECT user, host FROM mysql.user where user = 'CUser2' order by 1,2;
|
||||
user host
|
||||
CUser2 LOCALHOST
|
||||
CUser2 localhost
|
||||
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser2' order by 1,2;
|
||||
user host db select_priv
|
||||
DROP USER CUser2@localhost;
|
||||
DROP USER CUser2@LOCALHOST;
|
||||
|
2153
mysql-test/r/named_pipe.result
Normal file
2153
mysql-test/r/named_pipe.result
Normal file
File diff suppressed because it is too large
Load Diff
@ -1267,4 +1267,24 @@ ALTER TABLE general_log PARTITION BY RANGE (TO_DAYS(event_time))
|
||||
ERROR HY000: Incorrect usage of PARTITION and log table
|
||||
ALTER TABLE general_log ENGINE = CSV;
|
||||
SET GLOBAL general_log = default;
|
||||
use test;
|
||||
create table t2 (b int);
|
||||
create table t1 (b int)
|
||||
PARTITION BY RANGE (t2.b) (
|
||||
PARTITION p1 VALUES LESS THAN (10),
|
||||
PARTITION p2 VALUES LESS THAN (20)
|
||||
) select * from t2;
|
||||
ERROR 42S22: Unknown column 't2.b' in 'partition function'
|
||||
create table t1 (a int)
|
||||
PARTITION BY RANGE (b) (
|
||||
PARTITION p1 VALUES LESS THAN (10),
|
||||
PARTITION p2 VALUES LESS THAN (20)
|
||||
) select * from t2;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) DEFAULT NULL,
|
||||
`b` int(11) DEFAULT NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (b) (PARTITION p1 VALUES LESS THAN (10) ENGINE = MyISAM, PARTITION p2 VALUES LESS THAN (20) ENGINE = MyISAM) */
|
||||
drop table t1, t2;
|
||||
End of 5.1 tests
|
||||
|
2155
mysql-test/r/shm.result
Normal file
2155
mysql-test/r/shm.result
Normal file
File diff suppressed because it is too large
Load Diff
@ -427,6 +427,22 @@ f1
|
||||
Warnings:
|
||||
Warning 1292 Incorrect datetime value: '2007010100000' for column 'f1' at row 1
|
||||
drop table t1;
|
||||
create table t1 (f1 time);
|
||||
insert into t1 set f1 = '45:44:44';
|
||||
insert into t1 set f1 = '15:44:44';
|
||||
select * from t1 where (convert(f1,datetime)) != 1;
|
||||
f1
|
||||
15:44:44
|
||||
Warnings:
|
||||
Warning 1292 Incorrect datetime value: '0000-00-00 45:44:44'
|
||||
drop table t1;
|
||||
create table t1 (a tinyint);
|
||||
insert into t1 values (), (), ();
|
||||
select sum(a) from t1 group by convert(a, datetime);
|
||||
sum(a)
|
||||
NULL
|
||||
drop table t1;
|
||||
End of 5.0 tests
|
||||
set @org_mode=@@sql_mode;
|
||||
create table t1 (da date default '1962-03-03 23:33:34', dt datetime default '1962-03-03');
|
||||
Warnings:
|
||||
|
@ -683,6 +683,7 @@ select * from t1;
|
||||
a b
|
||||
123.12345 123.1
|
||||
drop table t1;
|
||||
End of 4.1 tests
|
||||
CREATE TABLE t1
|
||||
(EMPNUM CHAR(3) NOT NULL,
|
||||
HOURS DECIMAL(5));
|
||||
@ -799,3 +800,10 @@ SELECT ROUND(qty,3), dps, ROUND(qty,dps) FROM t1;
|
||||
ROUND(qty,3) dps ROUND(qty,dps)
|
||||
1.133 3 1.133
|
||||
DROP TABLE t1;
|
||||
create table t1 (f1 decimal(6,6),f2 decimal(6,6) zerofill);
|
||||
insert into t1 values (-0.123456,0.123456);
|
||||
select group_concat(f1),group_concat(f2) from t1;
|
||||
group_concat(f1) group_concat(f2)
|
||||
-0.123456 0.123456
|
||||
drop table t1;
|
||||
End of 5.0 tests
|
||||
|
@ -286,6 +286,8 @@ select * from information_schema.session_variables where variable_name like 'net
|
||||
VARIABLE_NAME VARIABLE_VALUE
|
||||
NET_BUFFER_LENGTH 1024
|
||||
set net_buffer_length=2000000000;
|
||||
Warnings:
|
||||
Warning 1292 Truncated incorrect net_buffer_length value: '2000000000'
|
||||
show variables like 'net_buffer_length';
|
||||
Variable_name Value
|
||||
net_buffer_length 1048576
|
||||
|
@ -1,2 +0,0 @@
|
||||
mysqld is alive
|
||||
End of 5.0 tests.
|
@ -1012,3 +1012,14 @@ select ExtractValue('<a>a</a>', '/a[@x=@y0123456789_0123456789_0123456789_012345
|
||||
ERROR HY000: XPATH error: comparison of two nodesets is not supported: '=@y0123456789_0123456789_0123456'
|
||||
select ExtractValue('<a>a</a>', '/a[@x=$y0123456789_0123456789_0123456789_0123456789]');
|
||||
ERROR HY000: Unknown XPATH variable at: '$y0123456789_0123456789_01234567'
|
||||
select updatexml(NULL, 1, 1), updatexml(1, NULL, 1), updatexml(1, 1, NULL);
|
||||
updatexml(NULL, 1, 1) updatexml(1, NULL, 1) updatexml(1, 1, NULL)
|
||||
NULL NULL NULL
|
||||
select updatexml(NULL, NULL, 1), updatexml(1, NULL, NULL),
|
||||
updatexml(NULL, 1, NULL);
|
||||
updatexml(NULL, NULL, 1) updatexml(1, NULL, NULL) updatexml(NULL, 1, NULL)
|
||||
NULL NULL NULL
|
||||
select updatexml(NULL, NULL, NULL);
|
||||
updatexml(NULL, NULL, NULL)
|
||||
NULL
|
||||
End of 5.1 tests
|
||||
|
@ -1351,8 +1351,16 @@ SELECT * FROM t2;
|
||||
|
||||
# Test INSERT DELAYED and wait until the table has one more record
|
||||
SELECT COUNT(auto) FROM t2;
|
||||
INSERT DELAYED INTO t2 VALUES (4,011403,37,'intercepted','audiology','tinily','');
|
||||
while (`SELECT COUNT(auto)!=1214 FROM t2`)
|
||||
INSERT DELAYED INTO t2 VALUES (99999,011403,37,'the','delayed','insert','');
|
||||
|
||||
# Insert another record since in Archive delayed values are only
|
||||
# guaranteed to materialize based on either:
|
||||
# 1) A new row showing up from a normal insert
|
||||
# 2) A flush table has occurred.
|
||||
INSERT INTO t2 VALUES (100000,000001,00,'after','delayed','insert','');
|
||||
|
||||
# Wait for the delayed insert to appear
|
||||
while (`SELECT COUNT(auto)!=1215 FROM t2`)
|
||||
{
|
||||
sleep 0.1;
|
||||
}
|
||||
@ -1361,7 +1369,7 @@ SELECT COUNT(auto) FROM t2;
|
||||
# Adding test for ALTER TABLE
|
||||
ALTER TABLE t2 DROP COLUMN fld6;
|
||||
SHOW CREATE TABLE t2;
|
||||
SELECT * FROM t2;
|
||||
SELECT * FROM t2 WHERE auto != 100000;
|
||||
|
||||
|
||||
# Adding tests for autoincrement
|
||||
|
@ -1257,6 +1257,9 @@ UPDATE v1 SET f2 = 4;
|
||||
SELECT * FROM test.t1;
|
||||
disconnect user1;
|
||||
connection default;
|
||||
REVOKE UPDATE (f1) ON `test`.`t1` FROM 'mysqltest_1'@'localhost';
|
||||
REVOKE SELECT ON `test`.* FROM 'mysqltest_1'@'localhost';
|
||||
REVOKE ALL ON db27878.* FROM 'mysqltest_1'@'localhost';
|
||||
DROP DATABASE db27878;
|
||||
use test;
|
||||
DROP TABLE t1;
|
||||
|
@ -34,3 +34,103 @@ delete from mysql.db where user like 'mysqltest\_%';
|
||||
delete from mysql.tables_priv where user like 'mysqltest\_%';
|
||||
delete from mysql.columns_priv where user like 'mysqltest\_%';
|
||||
flush privileges;
|
||||
|
||||
#
|
||||
# Bug: #19828 Case sensitivity in Grant/Revoke
|
||||
#
|
||||
|
||||
grant select on test.* to CUser@localhost;
|
||||
grant select on test.* to CUser@LOCALHOST;
|
||||
flush privileges;
|
||||
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser' order by 1,2;
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'LOCALHOST';
|
||||
flush privileges;
|
||||
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser' order by 1,2;
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'localhost';
|
||||
flush privileges;
|
||||
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser' order by 1,2;
|
||||
|
||||
DROP USER CUser@localhost;
|
||||
DROP USER CUser@LOCALHOST;
|
||||
|
||||
#### table grants
|
||||
create table t1 (a int);
|
||||
grant select on test.t1 to CUser@localhost;
|
||||
grant select on test.t1 to CUser@LOCALHOST;
|
||||
flush privileges;
|
||||
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'LOCALHOST';
|
||||
flush privileges;
|
||||
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'localhost';
|
||||
flush privileges;
|
||||
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||
|
||||
DROP USER CUser@localhost;
|
||||
DROP USER CUser@LOCALHOST;
|
||||
|
||||
### column grants
|
||||
|
||||
grant select(a) on test.t1 to CUser@localhost;
|
||||
grant select(a) on test.t1 to CUser@LOCALHOST;
|
||||
flush privileges;
|
||||
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'LOCALHOST';
|
||||
flush privileges;
|
||||
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||
|
||||
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'CUser'@'localhost';
|
||||
flush privileges;
|
||||
|
||||
SELECT user, host FROM mysql.user where user = 'CUser' order by 1,2;
|
||||
SELECT user, host, db, Table_name, Table_priv, Column_priv FROM mysql.tables_priv where user = 'CUser' order by 1,2;
|
||||
|
||||
DROP USER CUser@localhost;
|
||||
DROP USER CUser@LOCALHOST;
|
||||
|
||||
drop table t1;
|
||||
|
||||
# revoke on a specific DB only
|
||||
|
||||
grant select on test.* to CUser2@localhost;
|
||||
grant select on test.* to CUser2@LOCALHOST;
|
||||
flush privileges;
|
||||
|
||||
SELECT user, host FROM mysql.user where user = 'CUser2' order by 1,2;
|
||||
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser2' order by 1,2;
|
||||
|
||||
REVOKE SELECT ON test.* FROM 'CUser2'@'LOCALHOST';
|
||||
flush privileges;
|
||||
|
||||
SELECT user, host FROM mysql.user where user = 'CUser2' order by 1,2;
|
||||
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser2' order by 1,2;
|
||||
|
||||
REVOKE SELECT ON test.* FROM 'CUser2'@'localhost';
|
||||
flush privileges;
|
||||
|
||||
SELECT user, host FROM mysql.user where user = 'CUser2' order by 1,2;
|
||||
SELECT user, host, db, select_priv FROM mysql.db where user = 'CUser2' order by 1,2;
|
||||
|
||||
DROP USER CUser2@localhost;
|
||||
DROP USER CUser2@LOCALHOST;
|
||||
|
@ -1435,7 +1435,10 @@ select "this will be executed";
|
||||
--exec $MYSQL_TEST -x $MYSQLTEST_VARDIR/tmp/query.sql -R $MYSQLTEST_VARDIR/tmp/zero_length_file.result > /dev/null 2>&1
|
||||
|
||||
remove_file $MYSQLTEST_VARDIR/tmp/zero_length_file.result;
|
||||
--error 0,1
|
||||
remove_file $MYSQLTEST_VARDIR/log/zero_length_file.reject;
|
||||
--error 0,1
|
||||
remove_file $MYSQL_TEST_DIR/r/zero_length_file.reject;
|
||||
|
||||
#
|
||||
# Test that a test file that does not generate any output fails.
|
||||
|
1
mysql-test/t/named_pipe-master.opt
Normal file
1
mysql-test/t/named_pipe-master.opt
Normal file
@ -0,0 +1 @@
|
||||
--loose-enable-named-pipe
|
14
mysql-test/t/named_pipe.test
Normal file
14
mysql-test/t/named_pipe.test
Normal file
@ -0,0 +1,14 @@
|
||||
# We currently only have named pipe support on windows, so
|
||||
# in order to optimize things we skip this test on all
|
||||
# other platforms
|
||||
--source include/windows.inc
|
||||
|
||||
# Only run this test if named pipe is avaliable
|
||||
let $nmp= query_get_value("SHOW VARIABLES LIKE 'named_pipe'", Value, 1);
|
||||
if (`SELECT '$nmp' != 'ON'`){
|
||||
skip No named pipe support;
|
||||
}
|
||||
|
||||
# Source select test case
|
||||
-- source include/common-tests.inc
|
||||
|
@ -1493,10 +1493,30 @@ ALTER TABLE general_log PARTITION BY RANGE (TO_DAYS(event_time))
|
||||
(PARTITION p0 VALUES LESS THAN (733144), PARTITION p1 VALUES LESS THAN (3000000));
|
||||
ALTER TABLE general_log ENGINE = CSV;
|
||||
SET GLOBAL general_log = default;
|
||||
use test;
|
||||
|
||||
#
|
||||
# Bug #27084 partitioning by list seems failing when using case
|
||||
# BUG #18198: Case no longer supported, test case removed
|
||||
#
|
||||
|
||||
#
|
||||
# Bug #29444: crash with partition refering to table in create-select
|
||||
#
|
||||
|
||||
create table t2 (b int);
|
||||
--error 1054
|
||||
create table t1 (b int)
|
||||
PARTITION BY RANGE (t2.b) (
|
||||
PARTITION p1 VALUES LESS THAN (10),
|
||||
PARTITION p2 VALUES LESS THAN (20)
|
||||
) select * from t2;
|
||||
create table t1 (a int)
|
||||
PARTITION BY RANGE (b) (
|
||||
PARTITION p1 VALUES LESS THAN (10),
|
||||
PARTITION p2 VALUES LESS THAN (20)
|
||||
) select * from t2;
|
||||
show create table t1;
|
||||
drop table t1, t2;
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -1 +1 @@
|
||||
--skip-grant-tables --loose-shared-memory-base-name=HeyMrBaseNameXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --loose-shared-memory=1
|
||||
--skip-grant-tables --loose-shared-memory-base-name=HeyMrBaseNameXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX$MTR_BUILD_THREAD --loose-shared-memory=1
|
19
mysql-test/t/shm.test
Normal file
19
mysql-test/t/shm.test
Normal file
@ -0,0 +1,19 @@
|
||||
# We currently only have shm support on windows, so in order
|
||||
# to optimize things we skip this test on all other platforms
|
||||
--source include/windows.inc
|
||||
|
||||
# Only run this test if shared memory is avaliable
|
||||
let $shm= query_get_value("SHOW VARIABLES LIKE 'shared_memory'", Value, 1);
|
||||
if (`SELECT '$shm' != 'ON'`){
|
||||
skip No shm support;
|
||||
}
|
||||
|
||||
# Source select test case
|
||||
-- source include/common-tests.inc
|
||||
|
||||
#
|
||||
# Bug #24924: shared-memory-base-name that is too long causes buffer overflow
|
||||
#
|
||||
--exec $MYSQLADMIN --no-defaults --user=root --host=127.0.0.1 --port=$MASTER_MYPORT --shared-memory-base-name=HeyMrBaseNameXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ping
|
||||
|
||||
--echo End of 5.0 tests.
|
@ -283,6 +283,26 @@ select * from t1 where f1 between 2002010 and 20070101000000;
|
||||
select * from t1 where f1 between 20020101 and 2007010100000;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #31253: crash comparing datetime to double
|
||||
# Should return 1st row only. Crashes if NULL propagation fails.
|
||||
#
|
||||
create table t1 (f1 time);
|
||||
insert into t1 set f1 = '45:44:44';
|
||||
insert into t1 set f1 = '15:44:44';
|
||||
select * from t1 where (convert(f1,datetime)) != 1;
|
||||
drop table t1;
|
||||
|
||||
#
|
||||
# Bug #31249: problem with convert(..., datetime)
|
||||
#
|
||||
create table t1 (a tinyint);
|
||||
insert into t1 values (), (), ();
|
||||
select sum(a) from t1 group by convert(a, datetime);
|
||||
drop table t1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
||||
#
|
||||
# Test of storing datetime into date fields
|
||||
#
|
||||
|
@ -278,7 +278,7 @@ update t1 set b=a;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
# End of 4.1 tests
|
||||
--echo End of 4.1 tests
|
||||
|
||||
#
|
||||
# Test for BUG#8397: decimal type in subselects (Item_cache_decimal)
|
||||
@ -408,3 +408,14 @@ INSERT INTO t1 VALUES (1.1325,3);
|
||||
SELECT ROUND(qty,3), dps, ROUND(qty,dps) FROM t1;
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug #31227: memory overrun with decimal (6,6) and zerofill and group_concat
|
||||
# valgrind will complain about this (the group_concat(f2)) on unpatched mysqld.
|
||||
#
|
||||
create table t1 (f1 decimal(6,6),f2 decimal(6,6) zerofill);
|
||||
insert into t1 values (-0.123456,0.123456);
|
||||
select group_concat(f1),group_concat(f2) from t1;
|
||||
drop table t1;
|
||||
|
||||
--echo End of 5.0 tests
|
||||
|
@ -161,6 +161,7 @@ select * from information_schema.session_variables where variable_name like 'net
|
||||
set net_buffer_length=1;
|
||||
show variables like 'net_buffer_length';
|
||||
select * from information_schema.session_variables where variable_name like 'net_buffer_length';
|
||||
--warning 1292
|
||||
set net_buffer_length=2000000000;
|
||||
show variables like 'net_buffer_length';
|
||||
select * from information_schema.session_variables where variable_name like 'net_buffer_length';
|
||||
|
@ -1,9 +0,0 @@
|
||||
# Windows-specific tests
|
||||
--source include/windows.inc
|
||||
|
||||
#
|
||||
# Bug #24924: shared-memory-base-name that is too long causes buffer overflow
|
||||
#
|
||||
--exec $MYSQLADMIN --no-defaults --user=root --host=127.0.0.1 --port=$MASTER_MYPORT --shared-memory-base-name=HeyMrBaseNameXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ping
|
||||
|
||||
--echo End of 5.0 tests.
|
@ -533,3 +533,14 @@ select UpdateXML('<a>a</a>',repeat('a b ',1000),'');
|
||||
select ExtractValue('<a>a</a>', '/a[@x=@y0123456789_0123456789_0123456789_0123456789]');
|
||||
--error 1105
|
||||
select ExtractValue('<a>a</a>', '/a[@x=$y0123456789_0123456789_0123456789_0123456789]');
|
||||
|
||||
#
|
||||
# Bug #31438: updatexml still crashes
|
||||
#
|
||||
|
||||
select updatexml(NULL, 1, 1), updatexml(1, NULL, 1), updatexml(1, 1, NULL);
|
||||
select updatexml(NULL, NULL, 1), updatexml(1, NULL, NULL),
|
||||
updatexml(NULL, 1, NULL);
|
||||
select updatexml(NULL, NULL, NULL);
|
||||
|
||||
--echo End of 5.1 tests
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <my_sys.h>
|
||||
#include <mysys_err.h>
|
||||
#include <my_getopt.h>
|
||||
#include <errno.h>
|
||||
|
||||
static void default_reporter(enum loglevel level, const char *format, ...);
|
||||
my_error_reporter my_getopt_error_reporter= &default_reporter;
|
||||
@ -730,7 +731,15 @@ static longlong eval_num_suffix(char *argument, int *error, char *option_name)
|
||||
longlong num;
|
||||
|
||||
*error= 0;
|
||||
errno= 0;
|
||||
num= strtoll(argument, &endchar, 10);
|
||||
if (errno == ERANGE)
|
||||
{
|
||||
my_getopt_error_reporter(ERROR_LEVEL,
|
||||
"Incorrect integer value: '%s'", argument);
|
||||
*error= 1;
|
||||
return 0;
|
||||
}
|
||||
if (*endchar == 'k' || *endchar == 'K')
|
||||
num*= 1024L;
|
||||
else if (*endchar == 'm' || *endchar == 'M')
|
||||
@ -767,7 +776,14 @@ static longlong getopt_ll(char *arg, const struct my_option *optp, int *err)
|
||||
num= eval_num_suffix(arg, err, (char*) optp->name);
|
||||
if (num > 0 && (ulonglong) num > (ulonglong) optp->max_value &&
|
||||
optp->max_value) /* if max value is not set -> no upper limit */
|
||||
{
|
||||
char buf[22];
|
||||
my_getopt_error_reporter(WARNING_LEVEL,
|
||||
"Truncated incorrect %s value: '%s'",
|
||||
optp->name, llstr(num, buf));
|
||||
|
||||
num= (ulonglong) optp->max_value;
|
||||
}
|
||||
num= ((num - optp->sub_size) / block_size);
|
||||
num= (longlong) (num * block_size);
|
||||
return max(num, optp->min_value);
|
||||
|
@ -299,7 +299,7 @@ int handle_rtc_failure(int err_type, const char *file, int line,
|
||||
|
||||
return 0; /* Error is handled */
|
||||
}
|
||||
#pragma runtime_checks("", on)
|
||||
#pragma runtime_checks("", restore)
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -175,7 +175,7 @@ void report_stats()
|
||||
log_msg("\nThe .out and .err files in %s may give you some\n", result_dir);
|
||||
log_msg("hint of what went wrong.\n");
|
||||
log_msg("\nIf you want to report this error, please first read the documentation\n");
|
||||
log_msg("at: http://www.mysql.com/doc/en/MySQL_test_suite.html\n");
|
||||
log_msg("at: http://dev.mysql.com/doc/mysql/en/mysql-test-suite.html\n");
|
||||
}
|
||||
|
||||
log_msg("\n%.02f total minutes elapsed in the test cases\n\n", total_time / 60);
|
||||
@ -1169,7 +1169,8 @@ void setup(char *file)
|
||||
setenv("MYSQL_BINLOG", file_path, 1);
|
||||
setenv("MASTER_MYPORT", "9306", 1);
|
||||
setenv("SLAVE_MYPORT", "9307", 1);
|
||||
setenv("MYSQL_TCP_PORT", "3306", 1);
|
||||
snprintf(file_path, PATH_MAX*2, "%d", MYSQL_PORT);
|
||||
setenv("MYSQL_TCP_PORT", file_path, 1);
|
||||
snprintf(file_path, PATH_MAX*2, "%s/mysql_client_test --no-defaults --testcase--user=root --port=%u ", bin_dir, master_port);
|
||||
setenv("MYSQL_CLIENT_TEST",file_path,1);
|
||||
snprintf(file_path, PATH_MAX*2, "%s/mysql --no-defaults --user=root --port=%u ", bin_dir, master_port);
|
||||
|
@ -189,7 +189,7 @@ void start_defaults(int argc, char *argv[])
|
||||
snprintf(address, PATH_MAX, "0.0.0.0");
|
||||
|
||||
// port
|
||||
snprintf(port, PATH_MAX, "3306");
|
||||
snprintf(port, PATH_MAX, "%d", MYSQL_PORT);
|
||||
|
||||
// default option
|
||||
default_option[0]= NULL;
|
||||
|
@ -169,6 +169,7 @@ SUFFIXES = .sh
|
||||
-e 's!@''MYSQLD_DEFAULT_SWITCHES''@!@MYSQLD_DEFAULT_SWITCHES@!' \
|
||||
-e 's!@''MYSQL_UNIX_ADDR''@!@MYSQL_UNIX_ADDR@!' \
|
||||
-e 's!@''MYSQL_TCP_PORT''@!@MYSQL_TCP_PORT@!' \
|
||||
-e 's!@''MYSQL_TCP_PORT_DEFAULT''@!@MYSQL_TCP_PORT_DEFAULT@!' \
|
||||
-e 's!@''TARGET_LINUX''@!@TARGET_LINUX@!' \
|
||||
-e "s!@""CONF_COMMAND""@!@CONF_COMMAND@!" \
|
||||
-e 's!@''MYSQLD_USER''@!@MYSQLD_USER@!' \
|
||||
|
@ -92,9 +92,14 @@ fix_path pkgincludedir include/mysql include
|
||||
|
||||
version='@VERSION@'
|
||||
socket='@MYSQL_UNIX_ADDR@'
|
||||
port='@MYSQL_TCP_PORT@'
|
||||
ldflags='@LDFLAGS@'
|
||||
|
||||
if [ @MYSQL_TCP_PORT_DEFAULT@ -eq 0 ]; then
|
||||
port=0
|
||||
else
|
||||
port=@MYSQL_TCP_PORT@
|
||||
fi
|
||||
|
||||
# Create options
|
||||
# We intentionally add a space to the beginning and end of lib strings, simplifies replace later
|
||||
libs=" $ldflags -L$pkglibdir -lmysqlclient @ZLIB_DEPS@ @NON_THREADED_LIBS@"
|
||||
|
@ -25,6 +25,7 @@ sql_only=0
|
||||
basedir="@prefix@"
|
||||
verbose=0
|
||||
args=""
|
||||
# no elaborate fallback here; with no argument, it will happen in "mysql"
|
||||
port=""
|
||||
socket=""
|
||||
database="mysql"
|
||||
|
@ -14,8 +14,9 @@ DROP TABLE tmp_db;
|
||||
-- Fill "users" table with default users allowing root access
|
||||
-- from local machine if "users" table didn't exist before
|
||||
CREATE TEMPORARY TABLE tmp_user LIKE user;
|
||||
set @hostname= @@hostname;
|
||||
INSERT INTO tmp_user VALUES ('localhost','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
|
||||
REPLACE INTO tmp_user VALUES (@@hostname,'root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
|
||||
REPLACE INTO tmp_user VALUES (@hostname,'root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
|
||||
REPLACE INTO tmp_user VALUES ('127.0.0.1','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0);
|
||||
INSERT INTO tmp_user (host,user) VALUES ('localhost','');
|
||||
INSERT INTO tmp_user (host,user) VALUES (@@hostname,'');
|
||||
|
@ -396,7 +396,7 @@ then
|
||||
does not exist or is not executable. Please cd to the mysql installation
|
||||
directory and restart this script from there as follows:
|
||||
./bin/mysqld_safe&
|
||||
See http://dev.mysql.com/doc/mysql/en/mysqld_safe.html for more information"
|
||||
See http://dev.mysql.com/doc/mysql/en/mysqld-safe.html for more information"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
#include "portability.h"
|
||||
|
||||
/* IM-wide platform-independent defines */
|
||||
#define SERVER_DEFAULT_PORT 3306
|
||||
#define SERVER_DEFAULT_PORT MYSQL_PORT
|
||||
#define DEFAULT_MONITORING_INTERVAL 20
|
||||
#define DEFAULT_PORT 2273
|
||||
/* three-week timeout should be enough */
|
||||
|
@ -272,6 +272,7 @@ my_decimal *Item::val_decimal_from_date(my_decimal *decimal_value)
|
||||
if (get_date(<ime, TIME_FUZZY_DATE))
|
||||
{
|
||||
my_decimal_set_zero(decimal_value);
|
||||
null_value= 1; // set NULL, stop processing
|
||||
return 0;
|
||||
}
|
||||
return date2my_decimal(<ime, decimal_value);
|
||||
@ -3859,7 +3860,9 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
|
||||
context->first_name_resolution_table,
|
||||
context->last_name_resolution_table,
|
||||
reference,
|
||||
IGNORE_EXCEPT_NON_UNIQUE,
|
||||
thd->lex->use_only_table_context ?
|
||||
REPORT_ALL_ERRORS :
|
||||
IGNORE_EXCEPT_NON_UNIQUE,
|
||||
!any_privileges,
|
||||
TRUE)) ==
|
||||
not_found_field)
|
||||
|
@ -847,7 +847,9 @@ public:
|
||||
}
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
Item_typecast_maybe_null::fix_length_and_dec();
|
||||
collation.set(&my_charset_bin);
|
||||
maybe_null= 1;
|
||||
max_length= MAX_DATETIME_FULL_WIDTH * MY_CHARSET_BIN_MB_MAXLEN;
|
||||
decimals= DATETIME_DEC;
|
||||
}
|
||||
bool result_as_longlong() { return TRUE; }
|
||||
|
@ -2580,7 +2580,8 @@ void Item_xml_str_func::fix_length_and_dec()
|
||||
return;
|
||||
}
|
||||
|
||||
xp= args[1]->val_str(&tmp);
|
||||
if (!(xp= args[1]->val_str(&tmp)))
|
||||
return;
|
||||
my_xpath_init(&xpath);
|
||||
xpath.cs= collation.collation;
|
||||
xpath.debug= 0;
|
||||
|
@ -68,24 +68,43 @@ int decimal_operation_results(int result)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Converting decimal to string
|
||||
/**
|
||||
@brief Converting decimal to string
|
||||
|
||||
SYNOPSIS
|
||||
my_decimal2string()
|
||||
@details Convert given my_decimal to String; allocate buffer as needed.
|
||||
|
||||
return
|
||||
E_DEC_OK
|
||||
E_DEC_TRUNCATED
|
||||
E_DEC_OVERFLOW
|
||||
E_DEC_OOM
|
||||
@param[in] mask what problems to warn on (mask of E_DEC_* values)
|
||||
@param[in] d the decimal to print
|
||||
@param[in] fixed_prec overall number of digits if ZEROFILL, 0 otherwise
|
||||
@param[in] fixed_dec number of decimal places (if fixed_prec != 0)
|
||||
@param[in] filler what char to pad with (ZEROFILL et al.)
|
||||
@param[out] *str where to store the resulting string
|
||||
|
||||
@return error coce
|
||||
@retval E_DEC_OK
|
||||
@retval E_DEC_TRUNCATED
|
||||
@retval E_DEC_OVERFLOW
|
||||
@retval E_DEC_OOM
|
||||
*/
|
||||
|
||||
int my_decimal2string(uint mask, const my_decimal *d,
|
||||
uint fixed_prec, uint fixed_dec,
|
||||
char filler, String *str)
|
||||
{
|
||||
int length= (fixed_prec ? (fixed_prec + 1) : my_decimal_string_length(d));
|
||||
/*
|
||||
Calculate the size of the string: For DECIMAL(a,b), fixed_prec==a
|
||||
holds true iff the type is also ZEROFILL, which in turn implies
|
||||
UNSIGNED. Hence the buffer for a ZEROFILLed value is the length
|
||||
the user requested, plus one for a possible decimal point, plus
|
||||
one if the user only wanted decimal places, but we force a leading
|
||||
zero on them. Because the type is implicitly UNSIGNED, we do not
|
||||
need to reserve a character for the sign. For all other cases,
|
||||
fixed_prec will be 0, and my_decimal_string_length() will be called
|
||||
instead to calculate the required size of the buffer.
|
||||
*/
|
||||
int length= (fixed_prec
|
||||
? (fixed_prec + ((fixed_prec == fixed_dec) ? 1 : 0) + 1)
|
||||
: my_decimal_string_length(d));
|
||||
int result;
|
||||
if (str->alloc(length))
|
||||
return check_result(mask, E_DEC_OOM);
|
||||
|
@ -327,8 +327,13 @@ protected:
|
||||
#define PRECISION_FOR_DOUBLE 53
|
||||
#define PRECISION_FOR_FLOAT 24
|
||||
|
||||
/*
|
||||
Default time to wait before aborting a new client connection
|
||||
that does not respond to "initial server greeting" timely
|
||||
*/
|
||||
#define CONNECT_TIMEOUT 10
|
||||
|
||||
/* The following can also be changed from the command line */
|
||||
#define CONNECT_TIMEOUT 5 // Do not wait long for connect
|
||||
#define DEFAULT_CONCURRENCY 10
|
||||
#define DELAYED_LIMIT 100 /* pause after xxx inserts */
|
||||
#define DELAYED_QUEUE_SIZE 1000
|
||||
|
@ -1361,8 +1361,21 @@ static void set_ports()
|
||||
{ // Get port if not from commandline
|
||||
struct servent *serv_ptr;
|
||||
mysqld_port= MYSQL_PORT;
|
||||
|
||||
/*
|
||||
if builder specifically requested a default port, use that
|
||||
(even if it coincides with our factory default).
|
||||
only if they didn't do we check /etc/services (and, failing
|
||||
on that, fall back to the factory default of 3306).
|
||||
either default can be overridden by the environment variable
|
||||
MYSQL_TCP_PORT, which in turn can be overridden with command
|
||||
line options.
|
||||
*/
|
||||
|
||||
#if MYSQL_PORT_DEFAULT == 0
|
||||
if ((serv_ptr= getservbyname("mysql", "tcp")))
|
||||
mysqld_port= ntohs((u_short) serv_ptr->s_port); /* purecov: inspected */
|
||||
#endif
|
||||
if ((env = getenv("MYSQL_TCP_PORT")))
|
||||
mysqld_port= (uint) atoi(env); /* purecov: inspected */
|
||||
}
|
||||
@ -2216,7 +2229,7 @@ bytes of memory\n", ((ulong) dflt_key_cache->key_cache_mem_size +
|
||||
You seem to be running 32-bit Linux and have %d concurrent connections.\n\
|
||||
If you have not changed STACK_SIZE in LinuxThreads and built the binary \n\
|
||||
yourself, LinuxThreads is quite likely to steal a part of the global heap for\n\
|
||||
the thread stack. Please read http://www.mysql.com/doc/en/Linux.html\n\n",
|
||||
the thread stack. Please read http://dev.mysql.com/doc/mysql/en/linux.html\n\n",
|
||||
thread_count);
|
||||
}
|
||||
#endif /* HAVE_LINUXTHREADS */
|
||||
@ -2236,7 +2249,7 @@ Some pointers may be invalid and cause the dump to abort...\n");
|
||||
fprintf(stderr, "thd->thread_id=%lu\n", (ulong) thd->thread_id);
|
||||
}
|
||||
fprintf(stderr, "\
|
||||
The manual page at http://www.mysql.com/doc/en/Crashing.html contains\n\
|
||||
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains\n\
|
||||
information that should help you find out what is causing the crash.\n");
|
||||
fflush(stderr);
|
||||
#endif /* HAVE_STACKTRACE */
|
||||
@ -5625,7 +5638,13 @@ master-ssl",
|
||||
{"pid-file", OPT_PID_FILE, "Pid file used by safe_mysqld.",
|
||||
(uchar**) &pidfile_name_ptr, (uchar**) &pidfile_name_ptr, 0, GET_STR,
|
||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"port", 'P', "Port number to use for connection.", (uchar**) &mysqld_port,
|
||||
{"port", 'P', "Port number to use for connection or 0 for default to, in "
|
||||
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
|
||||
#if MYSQL_PORT_DEFAULT == 0
|
||||
"/etc/services, "
|
||||
#endif
|
||||
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
|
||||
(uchar**) &mysqld_port,
|
||||
(uchar**) &mysqld_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"port-open-timeout", OPT_PORT_OPEN_TIMEOUT,
|
||||
"Maximum time in seconds to wait for the port to become free. "
|
||||
@ -5969,7 +5988,7 @@ log and this option does nothing anymore.",
|
||||
(uchar**) &dflt_key_cache_var.param_buff_size,
|
||||
(uchar**) 0,
|
||||
0, (GET_ULL | GET_ASK_ADDR),
|
||||
REQUIRED_ARG, KEY_CACHE_SIZE, MALLOC_OVERHEAD, ~(ulong) 0, MALLOC_OVERHEAD,
|
||||
REQUIRED_ARG, KEY_CACHE_SIZE, MALLOC_OVERHEAD, SIZE_T_MAX, MALLOC_OVERHEAD,
|
||||
IO_SIZE, 0},
|
||||
{"key_cache_age_threshold", OPT_KEY_CACHE_AGE_THRESHOLD,
|
||||
"This characterizes the number of hits a hot block has to be untouched until it is considered aged enough to be downgraded to a warm block. This specifies the percentage ratio of that number of hits to the total number of blocks in key cache",
|
||||
@ -6244,7 +6263,7 @@ The minimum value for this variable is 4096.",
|
||||
"Each thread that does a sequential scan allocates a buffer of this size for each table it scans. If you do many sequential scans, you may want to increase this value.",
|
||||
(uchar**) &global_system_variables.read_buff_size,
|
||||
(uchar**) &max_system_variables.read_buff_size,0, GET_ULONG, REQUIRED_ARG,
|
||||
128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, SSIZE_MAX, MALLOC_OVERHEAD, IO_SIZE,
|
||||
128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, INT_MAX32, MALLOC_OVERHEAD, IO_SIZE,
|
||||
0},
|
||||
{"read_only", OPT_READONLY,
|
||||
"Make all non-temporary tables read-only, with the exception for replication (slave) threads and users with the SUPER privilege",
|
||||
@ -6256,12 +6275,12 @@ The minimum value for this variable is 4096.",
|
||||
(uchar**) &global_system_variables.read_rnd_buff_size,
|
||||
(uchar**) &max_system_variables.read_rnd_buff_size, 0,
|
||||
GET_ULONG, REQUIRED_ARG, 256*1024L, IO_SIZE*2+MALLOC_OVERHEAD,
|
||||
SSIZE_MAX, MALLOC_OVERHEAD, IO_SIZE, 0},
|
||||
INT_MAX32, MALLOC_OVERHEAD, IO_SIZE, 0},
|
||||
{"record_buffer", OPT_RECORD_BUFFER,
|
||||
"Alias for read_buffer_size",
|
||||
(uchar**) &global_system_variables.read_buff_size,
|
||||
(uchar**) &max_system_variables.read_buff_size,0, GET_ULONG, REQUIRED_ARG,
|
||||
128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, SSIZE_MAX, MALLOC_OVERHEAD, IO_SIZE, 0},
|
||||
128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, INT_MAX32, MALLOC_OVERHEAD, IO_SIZE, 0},
|
||||
#ifdef HAVE_REPLICATION
|
||||
{"relay_log_purge", OPT_RELAY_LOG_PURGE,
|
||||
"0 = do not purge relay logs. 1 = purge them as soon as they are no more needed.",
|
||||
|
@ -1188,16 +1188,31 @@ bool sys_var_thd_ulong::check(THD *thd, set_var *var)
|
||||
bool sys_var_thd_ulong::update(THD *thd, set_var *var)
|
||||
{
|
||||
ulonglong tmp= var->save_result.ulonglong_value;
|
||||
char buf[22];
|
||||
bool truncated= false;
|
||||
|
||||
/* Don't use bigger value than given with --maximum-variable-name=.. */
|
||||
if ((ulong) tmp > max_system_variables.*offset)
|
||||
{
|
||||
truncated= true;
|
||||
llstr(tmp, buf);
|
||||
tmp= max_system_variables.*offset;
|
||||
}
|
||||
|
||||
#if SIZEOF_LONG == 4
|
||||
/* Avoid overflows on 32 bit systems */
|
||||
if (tmp > (ulonglong) ~(ulong) 0)
|
||||
{
|
||||
truncated= true;
|
||||
llstr(tmp, buf);
|
||||
tmp= ((ulonglong) ~(ulong) 0);
|
||||
}
|
||||
#endif
|
||||
if (truncated)
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_TRUNCATED_WRONG_VALUE,
|
||||
ER(ER_TRUNCATED_WRONG_VALUE), name,
|
||||
buf);
|
||||
|
||||
if (option_limits)
|
||||
tmp= (ulong) getopt_ull_limit_value(tmp, option_limits);
|
||||
|
@ -1264,7 +1264,7 @@ static void acl_update_db(const char *user, const char *host, const char *db,
|
||||
{
|
||||
if (!acl_db->host.hostname && !host[0] ||
|
||||
acl_db->host.hostname &&
|
||||
!my_strcasecmp(system_charset_info, host, acl_db->host.hostname))
|
||||
!strcmp(host, acl_db->host.hostname))
|
||||
{
|
||||
if (!acl_db->db && !db[0] ||
|
||||
acl_db->db && !strcmp(db,acl_db->db))
|
||||
@ -4494,6 +4494,13 @@ bool mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
||||
if (!(host=acl_db->host.hostname))
|
||||
host= "";
|
||||
|
||||
/*
|
||||
We do not make SHOW GRANTS case-sensitive here (like REVOKE),
|
||||
but make it case-insensitive because that's the way they are
|
||||
actually applied, and showing fewer privileges than are applied
|
||||
would be wrong from a security point of view.
|
||||
*/
|
||||
|
||||
if (!strcmp(lex_user->user.str,user) &&
|
||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||
{
|
||||
@ -4529,8 +4536,8 @@ bool mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
||||
db.append(lex_user->user.str, lex_user->user.length,
|
||||
system_charset_info);
|
||||
db.append (STRING_WITH_LEN("'@'"));
|
||||
db.append(lex_user->host.str, lex_user->host.length,
|
||||
system_charset_info);
|
||||
// host and lex_user->host are equal except for case
|
||||
db.append(host, strlen(host), system_charset_info);
|
||||
db.append ('\'');
|
||||
if (want_access & GRANT_ACL)
|
||||
db.append(STRING_WITH_LEN(" WITH GRANT OPTION"));
|
||||
@ -4557,6 +4564,13 @@ bool mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
||||
if (!(host= grant_table->host.hostname))
|
||||
host= "";
|
||||
|
||||
/*
|
||||
We do not make SHOW GRANTS case-sensitive here (like REVOKE),
|
||||
but make it case-insensitive because that's the way they are
|
||||
actually applied, and showing fewer privileges than are applied
|
||||
would be wrong from a security point of view.
|
||||
*/
|
||||
|
||||
if (!strcmp(lex_user->user.str,user) &&
|
||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||
{
|
||||
@ -4637,8 +4651,8 @@ bool mysql_show_grants(THD *thd,LEX_USER *lex_user)
|
||||
global.append(lex_user->user.str, lex_user->user.length,
|
||||
system_charset_info);
|
||||
global.append(STRING_WITH_LEN("'@'"));
|
||||
global.append(lex_user->host.str,lex_user->host.length,
|
||||
system_charset_info);
|
||||
// host and lex_user->host are equal except for case
|
||||
global.append(host, strlen(host), system_charset_info);
|
||||
global.append('\'');
|
||||
if (table_access & GRANT_ACL)
|
||||
global.append(STRING_WITH_LEN(" WITH GRANT OPTION"));
|
||||
@ -4693,6 +4707,13 @@ static int show_routine_grants(THD* thd, LEX_USER *lex_user, HASH *hash,
|
||||
if (!(host= grant_proc->host.hostname))
|
||||
host= "";
|
||||
|
||||
/*
|
||||
We do not make SHOW GRANTS case-sensitive here (like REVOKE),
|
||||
but make it case-insensitive because that's the way they are
|
||||
actually applied, and showing fewer privileges than are applied
|
||||
would be wrong from a security point of view.
|
||||
*/
|
||||
|
||||
if (!strcmp(lex_user->user.str,user) &&
|
||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||
{
|
||||
@ -4736,8 +4757,8 @@ static int show_routine_grants(THD* thd, LEX_USER *lex_user, HASH *hash,
|
||||
global.append(lex_user->user.str, lex_user->user.length,
|
||||
system_charset_info);
|
||||
global.append(STRING_WITH_LEN("'@'"));
|
||||
global.append(lex_user->host.str,lex_user->host.length,
|
||||
system_charset_info);
|
||||
// host and lex_user->host are equal except for case
|
||||
global.append(host, strlen(host), system_charset_info);
|
||||
global.append('\'');
|
||||
if (proc_access & GRANT_ACL)
|
||||
global.append(STRING_WITH_LEN(" WITH GRANT OPTION"));
|
||||
@ -5713,7 +5734,7 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
|
||||
host= "";
|
||||
|
||||
if (!strcmp(lex_user->user.str,user) &&
|
||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||
!strcmp(lex_user->host.str, host))
|
||||
{
|
||||
if (!replace_db_table(tables[1].table, acl_db->db, *lex_user,
|
||||
~(ulong)0, 1))
|
||||
@ -5745,7 +5766,7 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
|
||||
host= "";
|
||||
|
||||
if (!strcmp(lex_user->user.str,user) &&
|
||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||
!strcmp(lex_user->host.str, host))
|
||||
{
|
||||
if (replace_table_table(thd,grant_table,tables[2].table,*lex_user,
|
||||
grant_table->db,
|
||||
@ -5791,7 +5812,7 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
|
||||
host= "";
|
||||
|
||||
if (!strcmp(lex_user->user.str,user) &&
|
||||
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
|
||||
!strcmp(lex_user->host.str, host))
|
||||
{
|
||||
if (!replace_routine_table(thd,grant_proc,tables[4].table,*lex_user,
|
||||
grant_proc->db,
|
||||
|
@ -2725,8 +2725,11 @@ void THD::restore_sub_statement_state(Sub_statement_state *backup)
|
||||
|
||||
void mark_transaction_to_rollback(THD *thd, bool all)
|
||||
{
|
||||
thd->is_fatal_sub_stmt_error= TRUE;
|
||||
thd->transaction_rollback_request= all;
|
||||
if (thd)
|
||||
{
|
||||
thd->is_fatal_sub_stmt_error= TRUE;
|
||||
thd->transaction_rollback_request= all;
|
||||
}
|
||||
}
|
||||
/***************************************************************************
|
||||
Handling of XA id cacheing
|
||||
|
@ -338,6 +338,7 @@ void lex_start(THD *thd)
|
||||
lex->query_tables= 0;
|
||||
lex->reset_query_tables_list(FALSE);
|
||||
lex->expr_allows_subselect= TRUE;
|
||||
lex->use_only_table_context= FALSE;
|
||||
|
||||
lex->name.str= 0;
|
||||
lex->name.length= 0;
|
||||
|
@ -1693,6 +1693,14 @@ typedef struct st_lex : public Query_tables_list
|
||||
*/
|
||||
const char *fname_start;
|
||||
const char *fname_end;
|
||||
|
||||
/**
|
||||
During name resolution search only in the table list given by
|
||||
Name_resolution_context::first_name_resolution_table and
|
||||
Name_resolution_context::last_name_resolution_table
|
||||
(see Item_field::fix_fields()).
|
||||
*/
|
||||
bool use_only_table_context;
|
||||
|
||||
LEX_STRING view_body_utf8;
|
||||
|
||||
|
@ -902,6 +902,7 @@ bool fix_fields_part_func(THD *thd, Item* func_expr, TABLE *table,
|
||||
const char *save_where;
|
||||
char* db_name;
|
||||
char db_name_string[FN_REFLEN];
|
||||
bool save_use_only_table_context;
|
||||
DBUG_ENTER("fix_fields_part_func");
|
||||
|
||||
if (part_info->fixed)
|
||||
@ -958,8 +959,14 @@ bool fix_fields_part_func(THD *thd, Item* func_expr, TABLE *table,
|
||||
This is a tricky call to prepare for since it can have a large number
|
||||
of interesting side effects, both desirable and undesirable.
|
||||
*/
|
||||
|
||||
save_use_only_table_context= thd->lex->use_only_table_context;
|
||||
thd->lex->use_only_table_context= TRUE;
|
||||
|
||||
error= func_expr->fix_fields(thd, (Item**)0);
|
||||
|
||||
thd->lex->use_only_table_context= save_use_only_table_context;
|
||||
|
||||
context->table_list= save_table_list;
|
||||
context->first_name_resolution_table= save_first_table;
|
||||
context->last_name_resolution_table= save_last_table;
|
||||
|
@ -14370,13 +14370,31 @@ calc_group_buffer(JOIN *join,ORDER *group)
|
||||
group_item->decimals);
|
||||
break;
|
||||
case STRING_RESULT:
|
||||
{
|
||||
enum enum_field_types type= group_item->field_type();
|
||||
/*
|
||||
Group strings are taken as varstrings and require an length field.
|
||||
A field is not yet created by create_tmp_field()
|
||||
and the sizes should match up.
|
||||
As items represented as DATE/TIME fields in the group buffer
|
||||
have STRING_RESULT result type, we increase the length
|
||||
by 8 as maximum pack length of such fields.
|
||||
*/
|
||||
key_length+= group_item->max_length + HA_KEY_BLOB_LENGTH;
|
||||
if (type == MYSQL_TYPE_TIME ||
|
||||
type == MYSQL_TYPE_DATE ||
|
||||
type == MYSQL_TYPE_DATETIME ||
|
||||
type == MYSQL_TYPE_TIMESTAMP)
|
||||
{
|
||||
key_length+= 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
Group strings are taken as varstrings and require an length field.
|
||||
A field is not yet created by create_tmp_field()
|
||||
and the sizes should match up.
|
||||
*/
|
||||
key_length+= group_item->max_length + HA_KEY_BLOB_LENGTH;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
/* This case should never be choosen */
|
||||
DBUG_ASSERT(0);
|
||||
|
@ -1106,11 +1106,12 @@ char * is_const(UDF_INIT *initid, UDF_ARGS *args __attribute__((unused)),
|
||||
}
|
||||
|
||||
|
||||
|
||||
my_bool check_const_len_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
||||
{
|
||||
if (args->arg_count != 1)
|
||||
{
|
||||
strmov(message, "IS_CONST accepts only one argument");
|
||||
strmov(message, "CHECK_CONST_LEN accepts only one argument");
|
||||
return 1;
|
||||
}
|
||||
if (args->args[0] == 0)
|
||||
@ -1140,5 +1141,4 @@ char * check_const_len(UDF_INIT *initid, UDF_ARGS *args __attribute__((unused)),
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif /* HAVE_DLOPEN */
|
||||
|
@ -17,7 +17,7 @@
|
||||
@mainpage NDB API Programmers' Guide
|
||||
|
||||
This guide assumes a basic familiarity with MySQL Cluster concepts found
|
||||
on http://dev.mysql.com/doc/mysql/en/NDBCluster.html .
|
||||
on http://dev.mysql.com/doc/mysql/en/mysql-cluster.html.
|
||||
Some of the fundamental ones are also described in section @ref secConcepts.
|
||||
|
||||
The NDB API is a MySQL Cluster application interface
|
||||
|
@ -6272,12 +6272,12 @@ my_mb_wc_big5(CHARSET_INFO *cs __attribute__((unused)),
|
||||
my_wc_t *pwc,const uchar *s,const uchar *e)
|
||||
{
|
||||
|
||||
int hi=s[0];
|
||||
int hi;
|
||||
|
||||
if (s >= e)
|
||||
return MY_CS_TOOSMALL;
|
||||
|
||||
if (hi<0x80)
|
||||
if ((hi= s[0]) < 0x80)
|
||||
{
|
||||
pwc[0]=hi;
|
||||
return 1;
|
||||
|
@ -8614,12 +8614,12 @@ my_mb_wc_euc_kr(CHARSET_INFO *cs __attribute__((unused)),
|
||||
my_wc_t *pwc, const uchar *s, const uchar *e)
|
||||
{
|
||||
|
||||
int hi=s[0];
|
||||
int hi;
|
||||
|
||||
if (s >= e)
|
||||
return MY_CS_TOOSMALL;
|
||||
|
||||
if (hi<0x80)
|
||||
if ((hi= s[0]) < 0x80)
|
||||
{
|
||||
pwc[0]=hi;
|
||||
return 1;
|
||||
|
@ -5664,12 +5664,10 @@ my_mb_wc_gb2312(CHARSET_INFO *cs __attribute__((unused)),
|
||||
my_wc_t *pwc, const uchar *s, const uchar *e){
|
||||
int hi;
|
||||
|
||||
hi=(int) s[0];
|
||||
|
||||
if (s >= e)
|
||||
return MY_CS_TOOSMALL;
|
||||
|
||||
if (hi<0x80)
|
||||
if ((hi= s[0]) < 0x80)
|
||||
{
|
||||
pwc[0]=hi;
|
||||
return 1;
|
||||
|
@ -4527,12 +4527,12 @@ mb:
|
||||
static int
|
||||
my_mb_wc_sjis(CHARSET_INFO *cs __attribute__((unused)),
|
||||
my_wc_t *pwc, const uchar *s, const uchar *e){
|
||||
int hi=s[0];
|
||||
int hi;
|
||||
|
||||
if (s >= e)
|
||||
return MY_CS_TOOSMALL;
|
||||
|
||||
if (hi < 0x80)
|
||||
if ((hi= s[0]) < 0x80)
|
||||
{
|
||||
pwc[0]=hi;
|
||||
return 1;
|
||||
|
@ -16475,7 +16475,13 @@ static struct my_option client_test_long_options[] =
|
||||
{"password", 'p',
|
||||
"Password to use when connecting to server. If password is not given it's asked from the tty.",
|
||||
0, 0, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"port", 'P', "Port number to use for connection", (uchar **) &opt_port,
|
||||
{"port", 'P', "Port number to use for connection or 0 for default to, in "
|
||||
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
|
||||
#if MYSQL_PORT_DEFAULT == 0
|
||||
"/etc/services, "
|
||||
#endif
|
||||
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
|
||||
(uchar **) &opt_port,
|
||||
(uchar **) &opt_port, 0, GET_UINT, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"server-arg", 'A', "Send embedded server this as a parameter.",
|
||||
0, 0, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
|
@ -44,7 +44,7 @@ int main(int argc, char **argv)
|
||||
"../SSL/MySQL-client-cert.pem",
|
||||
"../SSL/MySQL-ca-cert.pem", 0, 0);
|
||||
#endif
|
||||
if (!(sock = mysql_real_connect(&mysql,"127.0.0.1",0,0,argv[1],3306,NULL,0)))
|
||||
if (!(sock = mysql_real_connect(&mysql,"127.0.0.1",0,0,argv[1],MYSQL_PORT,NULL,0)))
|
||||
{
|
||||
fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(&mysql));
|
||||
perror("");
|
||||
|
@ -103,7 +103,13 @@ static struct my_option my_long_options[] =
|
||||
(uchar**) &verbose, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"query", 'Q', "Query to execute in each threads", (uchar**) &query,
|
||||
(uchar**) &query, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"port", 'P', "Port number to use for connection", (uchar**) &tcp_port,
|
||||
{"port", 'P', "Port number to use for connection or 0 for default to, in "
|
||||
"order of preference, my.cnf, $MYSQL_TCP_PORT, "
|
||||
#if MYSQL_PORT_DEFAULT == 0
|
||||
"/etc/services, "
|
||||
#endif
|
||||
"built-in default (" STRINGIFY_ARG(MYSQL_PORT) ").",
|
||||
(uchar**) &tcp_port,
|
||||
(uchar**) &tcp_port, 0, GET_UINT, REQUIRED_ARG, MYSQL_PORT, 0, 0, 0, 0, 0},
|
||||
{"socket", 'S', "Socket file to use for connection", (uchar**) &unix_socket,
|
||||
(uchar**) &unix_socket, 0, GET_STR_ALLOC, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
|
@ -31,6 +31,7 @@ try
|
||||
configureInTS.Close();
|
||||
var default_comment = "Source distribution";
|
||||
var default_port = GetValue(configureIn, "MYSQL_TCP_PORT_DEFAULT");
|
||||
var actual_port = 0;
|
||||
|
||||
var configfile = fso.CreateTextFile("win\\configure.data", true);
|
||||
for (i=0; i < args.Count(); i++)
|
||||
@ -59,10 +60,41 @@ try
|
||||
default_comment = parts[1];
|
||||
break;
|
||||
case "MYSQL_TCP_PORT":
|
||||
default_port = parts[1];
|
||||
actual_port = parts[1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (actual_port == 0)
|
||||
{
|
||||
// if we actually defaulted (as opposed to the pathological case of
|
||||
// --with-tcp-port=<MYSQL_TCP_PORT_DEFAULT> which might in theory
|
||||
// happen if whole batch of servers was built from a script), set
|
||||
// the default to zero to indicate that; we don't lose information
|
||||
// that way, because 0 obviously indicates that we can get the
|
||||
// default value from MYSQL_TCP_PORT. this seems really evil, but
|
||||
// testing for MYSQL_TCP_PORT==MYSQL_TCP_PORT_DEFAULT would make a
|
||||
// a port of MYSQL_TCP_PORT_DEFAULT magic even if the builder did not
|
||||
// intend it to mean "use the default, in fact, look up a good default
|
||||
// from /etc/services if you can", but really, really meant 3306 when
|
||||
// they passed in 3306. When they pass in a specific value, let them
|
||||
// have it; don't second guess user and think we know better, this will
|
||||
// just make people cross. this makes the the logic work like this
|
||||
// (which is complicated enough):
|
||||
//
|
||||
// - if a port was set during build, use that as a default.
|
||||
//
|
||||
// - otherwise, try to look up a port in /etc/services; if that fails,
|
||||
// use MYSQL_TCP_PORT_DEFAULT (at the time of this writing 3306)
|
||||
//
|
||||
// - allow the MYSQL_TCP_PORT environment variable to override that.
|
||||
//
|
||||
// - allow command-line parameters to override all of the above.
|
||||
//
|
||||
// the top-most MYSQL_TCP_PORT_DEFAULT is read from win/configure.js,
|
||||
// so don't mess with that.
|
||||
actual_port = default_port;
|
||||
default_port = 0;
|
||||
}
|
||||
|
||||
configfile.WriteLine("SET (COMPILATION_COMMENT \"" +
|
||||
default_comment + "\")");
|
||||
@ -71,7 +103,8 @@ try
|
||||
GetValue(configureIn, "PROTOCOL_VERSION") + "\")");
|
||||
configfile.WriteLine("SET (DOT_FRM_VERSION \"" +
|
||||
GetValue(configureIn, "DOT_FRM_VERSION") + "\")");
|
||||
configfile.WriteLine("SET (MYSQL_TCP_PORT \"" + default_port + "\")");
|
||||
configfile.WriteLine("SET (MYSQL_TCP_PORT_DEFAULT \"" + default_port + "\")");
|
||||
configfile.WriteLine("SET (MYSQL_TCP_PORT \"" + actual_port + "\")");
|
||||
configfile.WriteLine("SET (MYSQL_UNIX_ADDR \"" +
|
||||
GetValue(configureIn, "MYSQL_UNIX_ADDR_DEFAULT") + "\")");
|
||||
var version = GetVersion(configureIn);
|
||||
|
Loading…
x
Reference in New Issue
Block a user