mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 02:30:06 +01:00
Merge.
This commit is contained in:
commit
d48b4a83a2
401 changed files with 2094 additions and 5378 deletions
|
@ -1140,3 +1140,4 @@ libmysqld/gcalc_tools.cc
|
||||||
sql/share/errmsg.sys
|
sql/share/errmsg.sys
|
||||||
sql/share/mysql
|
sql/share/mysql
|
||||||
install_manifest.txt
|
install_manifest.txt
|
||||||
|
sql/db.opt
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
And many others
|
And many others
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MTEST_VERSION "3.3"
|
#define MTEST_VERSION "3.4"
|
||||||
|
|
||||||
#include "client_priv.h"
|
#include "client_priv.h"
|
||||||
#include <mysql_version.h>
|
#include <mysql_version.h>
|
||||||
|
@ -78,6 +78,8 @@ static my_bool non_blocking_api_enabled= 0;
|
||||||
#define MAX_DELIMITER_LENGTH 16
|
#define MAX_DELIMITER_LENGTH 16
|
||||||
#define DEFAULT_MAX_CONN 64
|
#define DEFAULT_MAX_CONN 64
|
||||||
|
|
||||||
|
#define DIE_BUFF_SIZE 8192
|
||||||
|
|
||||||
/* Flags controlling send and reap */
|
/* Flags controlling send and reap */
|
||||||
#define QUERY_SEND_FLAG 1
|
#define QUERY_SEND_FLAG 1
|
||||||
#define QUERY_REAP_FLAG 2
|
#define QUERY_REAP_FLAG 2
|
||||||
|
@ -106,6 +108,7 @@ static int opt_port= 0;
|
||||||
static int opt_max_connect_retries;
|
static int opt_max_connect_retries;
|
||||||
static int opt_result_format_version;
|
static int opt_result_format_version;
|
||||||
static int opt_max_connections= DEFAULT_MAX_CONN;
|
static int opt_max_connections= DEFAULT_MAX_CONN;
|
||||||
|
static int error_count= 0;
|
||||||
static my_bool opt_compress= 0, silent= 0, verbose= 0;
|
static my_bool opt_compress= 0, silent= 0, verbose= 0;
|
||||||
static my_bool debug_info_flag= 0, debug_check_flag= 0;
|
static my_bool debug_info_flag= 0, debug_check_flag= 0;
|
||||||
static my_bool tty_password= 0;
|
static my_bool tty_password= 0;
|
||||||
|
@ -122,7 +125,7 @@ static my_bool disable_connect_log= 1;
|
||||||
static my_bool disable_warnings= 0, disable_column_names= 0;
|
static my_bool disable_warnings= 0, disable_column_names= 0;
|
||||||
static my_bool prepare_warnings_enabled= 0;
|
static my_bool prepare_warnings_enabled= 0;
|
||||||
static my_bool disable_info= 1;
|
static my_bool disable_info= 1;
|
||||||
static my_bool abort_on_error= 1;
|
static my_bool abort_on_error= 1, opt_continue_on_error= 0;
|
||||||
static my_bool server_initialized= 0;
|
static my_bool server_initialized= 0;
|
||||||
static my_bool is_windows= 0;
|
static my_bool is_windows= 0;
|
||||||
static char **default_argv;
|
static char **default_argv;
|
||||||
|
@ -559,14 +562,15 @@ const char *from, int len);
|
||||||
|
|
||||||
static void cleanup_and_exit(int exit_code) __attribute__((noreturn));
|
static void cleanup_and_exit(int exit_code) __attribute__((noreturn));
|
||||||
|
|
||||||
void die(const char *fmt, ...)
|
void really_die(const char *msg) __attribute__((noreturn));
|
||||||
ATTRIBUTE_FORMAT(printf, 1, 2) __attribute__((noreturn));
|
void report_or_die(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
|
||||||
void abort_not_supported_test(const char *fmt, ...)
|
void die(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2)
|
||||||
ATTRIBUTE_FORMAT(printf, 1, 2) __attribute__((noreturn));
|
__attribute__((noreturn));
|
||||||
void verbose_msg(const char *fmt, ...)
|
static void make_error_message(char *buf, size_t len, const char *fmt, va_list args);
|
||||||
ATTRIBUTE_FORMAT(printf, 1, 2);
|
void abort_not_supported_test(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2)
|
||||||
void log_msg(const char *fmt, ...)
|
__attribute__((noreturn));
|
||||||
ATTRIBUTE_FORMAT(printf, 1, 2);
|
void verbose_msg(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
|
||||||
|
void log_msg(const char *fmt, ...) ATTRIBUTE_FORMAT(printf, 1, 2);
|
||||||
|
|
||||||
VAR* var_from_env(const char *, const char *);
|
VAR* var_from_env(const char *, const char *);
|
||||||
VAR* var_init(VAR* v, const char *name, int name_len, const char *val,
|
VAR* var_init(VAR* v, const char *name, int name_len, const char *val,
|
||||||
|
@ -983,7 +987,10 @@ void do_eval(DYNAMIC_STRING *query_eval, const char *query,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!(v= var_get(p, &p, 0, 0)))
|
if (!(v= var_get(p, &p, 0, 0)))
|
||||||
die("Bad variable in eval");
|
{
|
||||||
|
report_or_die( "Bad variable in eval");
|
||||||
|
return;
|
||||||
|
}
|
||||||
dynstr_append_mem(query_eval, v->str_val, v->str_val_len);
|
dynstr_append_mem(query_eval, v->str_val, v->str_val_len);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1270,9 +1277,13 @@ void handle_command_error(struct st_command *command, uint error,
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (command->abort_on_error)
|
if (command->abort_on_error)
|
||||||
die("command \"%.*s\" failed with error: %u my_errno: %d errno: %d",
|
{
|
||||||
|
report_or_die("command \"%.*s\" failed with error: %u my_errno: %d "
|
||||||
|
"errno: %d",
|
||||||
command->first_word_len, command->query, error, my_errno,
|
command->first_word_len, command->query, error, my_errno,
|
||||||
sys_errno);
|
sys_errno);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
i= match_expected_error(command, error, NULL);
|
i= match_expected_error(command, error, NULL);
|
||||||
|
|
||||||
|
@ -1285,14 +1296,17 @@ void handle_command_error(struct st_command *command, uint error,
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
if (command->expected_errors.count > 0)
|
if (command->expected_errors.count > 0)
|
||||||
die("command \"%.*s\" failed with wrong error: %u my_errno: %d errno: %d",
|
report_or_die("command \"%.*s\" failed with wrong error: %u "
|
||||||
command->first_word_len, command->query, error, my_errno, sys_errno);
|
"my_errno: %d errno: %d",
|
||||||
|
command->first_word_len, command->query, error, my_errno,
|
||||||
|
sys_errno);
|
||||||
}
|
}
|
||||||
else if (command->expected_errors.err[0].type == ERR_ERRNO &&
|
else if (command->expected_errors.err[0].type == ERR_ERRNO &&
|
||||||
command->expected_errors.err[0].code.errnum != 0)
|
command->expected_errors.err[0].code.errnum != 0)
|
||||||
{
|
{
|
||||||
/* Error code we wanted was != 0, i.e. not an expected success */
|
/* Error code we wanted was != 0, i.e. not an expected success */
|
||||||
die("command \"%.*s\" succeeded - should have failed with errno %d...",
|
report_or_die("command \"%.*s\" succeeded - should have failed with "
|
||||||
|
"errno %d...",
|
||||||
command->first_word_len, command->query,
|
command->first_word_len, command->query,
|
||||||
command->expected_errors.err[0].code.errnum);
|
command->expected_errors.err[0].code.errnum);
|
||||||
}
|
}
|
||||||
|
@ -1437,50 +1451,59 @@ static void cleanup_and_exit(int exit_code)
|
||||||
exit(exit_code);
|
exit(exit_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_file_stack()
|
size_t print_file_stack(char *s, const char *end)
|
||||||
{
|
{
|
||||||
|
char *start= s;
|
||||||
struct st_test_file* err_file= cur_file;
|
struct st_test_file* err_file= cur_file;
|
||||||
if (err_file == file_stack)
|
if (err_file == file_stack)
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
err_file--;
|
err_file--;
|
||||||
fprintf(stderr, "included from %s at line %d:\n",
|
s+= my_snprintf(s, end - s, "included from %s at line %d:\n",
|
||||||
err_file->file_name, err_file->lineno);
|
err_file->file_name, err_file->lineno);
|
||||||
if (err_file == file_stack)
|
if (err_file == file_stack)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return s - start;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void make_error_message(char *buf, size_t len, const char *fmt, va_list args)
|
||||||
|
{
|
||||||
|
char *s= buf, *end= buf + len;
|
||||||
|
s+= my_snprintf(s, end - s, "mysqltest: ");
|
||||||
|
if (cur_file && cur_file != file_stack)
|
||||||
|
{
|
||||||
|
s+= my_snprintf(s, end - s, "In included file \"%s\": \n",
|
||||||
|
cur_file->file_name);
|
||||||
|
s+= print_file_stack(s, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start_lineno > 0)
|
||||||
|
s+= my_snprintf(s, end -s, "At line %u: ", start_lineno);
|
||||||
|
if (!fmt)
|
||||||
|
fmt= "unknown error";
|
||||||
|
|
||||||
|
s+= my_vsnprintf(s, end - s, fmt, args);
|
||||||
|
s+= my_snprintf(s, end -s, "\n", start_lineno);
|
||||||
}
|
}
|
||||||
|
|
||||||
void die(const char *fmt, ...)
|
void die(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
static int dying= 0;
|
char buff[DIE_BUFF_SIZE];
|
||||||
va_list args;
|
va_list args;
|
||||||
DBUG_ENTER("die");
|
va_start(args, fmt);
|
||||||
DBUG_PRINT("enter", ("start_lineno: %d", start_lineno));
|
make_error_message(buff, sizeof(buff), fmt, args);
|
||||||
|
really_die(buff);
|
||||||
|
}
|
||||||
|
|
||||||
|
void really_die(const char *msg)
|
||||||
|
{
|
||||||
|
static int dying= 0;
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
/* Print the error message */
|
fprintf(stderr, "%s", msg);
|
||||||
fprintf(stderr, "mysqltest: ");
|
|
||||||
if (cur_file && cur_file != file_stack)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "In included file \"%s\": \n",
|
|
||||||
cur_file->file_name);
|
|
||||||
print_file_stack();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (start_lineno > 0)
|
|
||||||
fprintf(stderr, "At line %u: ", start_lineno);
|
|
||||||
if (fmt)
|
|
||||||
{
|
|
||||||
va_start(args, fmt);
|
|
||||||
vfprintf(stderr, fmt, args);
|
|
||||||
va_end(args);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
fprintf(stderr, "unknown error");
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1504,6 +1527,28 @@ void die(const char *fmt, ...)
|
||||||
cleanup_and_exit(1);
|
cleanup_and_exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void report_or_die(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list args;
|
||||||
|
DBUG_ENTER("report_or_die");
|
||||||
|
|
||||||
|
char buff[DIE_BUFF_SIZE];
|
||||||
|
|
||||||
|
va_start(args, fmt);
|
||||||
|
make_error_message(buff, sizeof(buff), fmt, args);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
if (opt_continue_on_error)
|
||||||
|
{
|
||||||
|
/* Just log the error and continue */
|
||||||
|
replace_dynstr_append(&ds_res, buff);
|
||||||
|
error_count++;
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
really_die(buff);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void abort_not_supported_test(const char *fmt, ...)
|
void abort_not_supported_test(const char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
@ -1516,7 +1561,10 @@ void abort_not_supported_test(const char *fmt, ...)
|
||||||
file_stack->file_name);
|
file_stack->file_name);
|
||||||
fprintf(stderr, "Detected in file %s at line %d\n",
|
fprintf(stderr, "Detected in file %s at line %d\n",
|
||||||
cur_file->file_name, cur_file->lineno);
|
cur_file->file_name, cur_file->lineno);
|
||||||
print_file_stack();
|
|
||||||
|
char buff[DIE_BUFF_SIZE];
|
||||||
|
print_file_stack(buff, buff + sizeof(buff));
|
||||||
|
fprintf(stderr, "%s", buff);
|
||||||
|
|
||||||
/* Print error message */
|
/* Print error message */
|
||||||
va_start(args, fmt);
|
va_start(args, fmt);
|
||||||
|
@ -1648,7 +1696,10 @@ static int run_command(char* cmd,
|
||||||
DBUG_PRINT("enter", ("cmd: %s", cmd));
|
DBUG_PRINT("enter", ("cmd: %s", cmd));
|
||||||
|
|
||||||
if (!(res_file= popen(cmd, "r")))
|
if (!(res_file= popen(cmd, "r")))
|
||||||
die("popen(\"%s\", \"r\") failed", cmd);
|
{
|
||||||
|
report_or_die("popen(\"%s\", \"r\") failed", cmd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
while (fgets(buf, sizeof(buf), res_file))
|
while (fgets(buf, sizeof(buf), res_file))
|
||||||
{
|
{
|
||||||
|
@ -1748,7 +1799,10 @@ static int diff_check(const char *diff_name)
|
||||||
if (!(res_file= popen(buf, "r")))
|
if (!(res_file= popen(buf, "r")))
|
||||||
die("popen(\"%s\", \"r\") failed", buf);
|
die("popen(\"%s\", \"r\") failed", buf);
|
||||||
|
|
||||||
/* if diff is not present, nothing will be in stdout to increment have_diff */
|
/*
|
||||||
|
if diff is not present, nothing will be in stdout to increment
|
||||||
|
have_diff
|
||||||
|
*/
|
||||||
if (fgets(buf, sizeof(buf), res_file))
|
if (fgets(buf, sizeof(buf), res_file))
|
||||||
have_diff= 1;
|
have_diff= 1;
|
||||||
|
|
||||||
|
@ -2061,7 +2115,7 @@ int dyn_string_cmp(DYNAMIC_STRING* ds, const char *fname)
|
||||||
|
|
||||||
void check_result()
|
void check_result()
|
||||||
{
|
{
|
||||||
const char* mess= "Result content mismatch\n";
|
const char *mess= 0;
|
||||||
|
|
||||||
DBUG_ENTER("check_result");
|
DBUG_ENTER("check_result");
|
||||||
DBUG_ASSERT(result_file_name);
|
DBUG_ASSERT(result_file_name);
|
||||||
|
@ -2069,9 +2123,13 @@ void check_result()
|
||||||
|
|
||||||
switch (compare_files(log_file.file_name(), result_file_name)) {
|
switch (compare_files(log_file.file_name(), result_file_name)) {
|
||||||
case RESULT_OK:
|
case RESULT_OK:
|
||||||
break; /* ok */
|
if (!error_count)
|
||||||
|
break; /* ok */
|
||||||
|
mess= "Got errors while running test";
|
||||||
|
/* Fallthrough */
|
||||||
case RESULT_LENGTH_MISMATCH:
|
case RESULT_LENGTH_MISMATCH:
|
||||||
mess= "Result length mismatch\n";
|
if (!mess)
|
||||||
|
mess= "Result length mismatch\n";
|
||||||
/* Fallthrough */
|
/* Fallthrough */
|
||||||
case RESULT_CONTENT_MISMATCH:
|
case RESULT_CONTENT_MISMATCH:
|
||||||
{
|
{
|
||||||
|
@ -2081,6 +2139,10 @@ void check_result()
|
||||||
*/
|
*/
|
||||||
char reject_file[FN_REFLEN];
|
char reject_file[FN_REFLEN];
|
||||||
size_t reject_length;
|
size_t reject_length;
|
||||||
|
|
||||||
|
if (!mess)
|
||||||
|
mess= "Result content mismatch\n";
|
||||||
|
|
||||||
dirname_part(reject_file, result_file_name, &reject_length);
|
dirname_part(reject_file, result_file_name, &reject_length);
|
||||||
|
|
||||||
if (access(reject_file, W_OK) == 0)
|
if (access(reject_file, W_OK) == 0)
|
||||||
|
@ -2180,8 +2242,8 @@ static int strip_surrounding(char* str, char c1, char c2)
|
||||||
static void strip_parentheses(struct st_command *command)
|
static void strip_parentheses(struct st_command *command)
|
||||||
{
|
{
|
||||||
if (strip_surrounding(command->first_argument, '(', ')'))
|
if (strip_surrounding(command->first_argument, '(', ')'))
|
||||||
die("%.*s - argument list started with '%c' must be ended with '%c'",
|
die("%.*s - argument list started with '%c' must be ended with '%c'",
|
||||||
command->first_word_len, command->query, '(', ')');
|
command->first_word_len, command->query, '(', ')');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2518,8 +2580,8 @@ void var_query_set(VAR *var, const char *query, const char** query_end)
|
||||||
|
|
||||||
if (mysql_real_query(mysql, ds_query.str, ds_query.length))
|
if (mysql_real_query(mysql, ds_query.str, ds_query.length))
|
||||||
{
|
{
|
||||||
handle_error (curr_command, mysql_errno(mysql), mysql_error(mysql),
|
handle_error(curr_command, mysql_errno(mysql), mysql_error(mysql),
|
||||||
mysql_sqlstate(mysql), &ds_res);
|
mysql_sqlstate(mysql), &ds_res);
|
||||||
/* If error was acceptable, return empty string */
|
/* If error was acceptable, return empty string */
|
||||||
dynstr_free(&ds_query);
|
dynstr_free(&ds_query);
|
||||||
eval_expr(var, "", 0);
|
eval_expr(var, "", 0);
|
||||||
|
@ -2527,7 +2589,12 @@ void var_query_set(VAR *var, const char *query, const char** query_end)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(res= mysql_store_result(mysql)))
|
if (!(res= mysql_store_result(mysql)))
|
||||||
die("Query '%s' didn't return a result set", ds_query.str);
|
{
|
||||||
|
report_or_die("Query '%s' didn't return a result set", ds_query.str);
|
||||||
|
dynstr_free(&ds_query);
|
||||||
|
eval_expr(var, "", 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
dynstr_free(&ds_query);
|
dynstr_free(&ds_query);
|
||||||
|
|
||||||
if ((row= mysql_fetch_row(res)) && row[0])
|
if ((row= mysql_fetch_row(res)) && row[0])
|
||||||
|
@ -2696,16 +2763,23 @@ void var_set_query_get_value(struct st_command *command, VAR *var)
|
||||||
/* Run the query */
|
/* Run the query */
|
||||||
if (mysql_real_query(mysql, ds_query.str, ds_query.length))
|
if (mysql_real_query(mysql, ds_query.str, ds_query.length))
|
||||||
{
|
{
|
||||||
handle_error (curr_command, mysql_errno(mysql), mysql_error(mysql),
|
handle_error(curr_command, mysql_errno(mysql), mysql_error(mysql),
|
||||||
mysql_sqlstate(mysql), &ds_res);
|
mysql_sqlstate(mysql), &ds_res);
|
||||||
/* If error was acceptable, return empty string */
|
/* If error was acceptable, return empty string */
|
||||||
dynstr_free(&ds_query);
|
dynstr_free(&ds_query);
|
||||||
|
dynstr_free(&ds_col);
|
||||||
eval_expr(var, "", 0);
|
eval_expr(var, "", 0);
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(res= mysql_store_result(mysql)))
|
if (!(res= mysql_store_result(mysql)))
|
||||||
die("Query '%s' didn't return a result set", ds_query.str);
|
{
|
||||||
|
report_or_die("Query '%s' didn't return a result set", ds_query.str);
|
||||||
|
dynstr_free(&ds_query);
|
||||||
|
dynstr_free(&ds_col);
|
||||||
|
eval_expr(var, "", 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
/* Find column number from the given column name */
|
/* Find column number from the given column name */
|
||||||
|
@ -2725,8 +2799,11 @@ void var_set_query_get_value(struct st_command *command, VAR *var)
|
||||||
if (col_no == -1)
|
if (col_no == -1)
|
||||||
{
|
{
|
||||||
mysql_free_result(res);
|
mysql_free_result(res);
|
||||||
die("Could not find column '%s' in the result of '%s'",
|
report_or_die("Could not find column '%s' in the result of '%s'",
|
||||||
ds_col.str, ds_query.str);
|
ds_col.str, ds_query.str);
|
||||||
|
dynstr_free(&ds_query);
|
||||||
|
dynstr_free(&ds_col);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
DBUG_PRINT("info", ("Found column %d with name '%s'",
|
DBUG_PRINT("info", ("Found column %d with name '%s'",
|
||||||
i, fields[i].name));
|
i, fields[i].name));
|
||||||
|
@ -3165,7 +3242,10 @@ void do_exec(struct st_command *command)
|
||||||
while (*cmd && my_isspace(charset_info, *cmd))
|
while (*cmd && my_isspace(charset_info, *cmd))
|
||||||
cmd++;
|
cmd++;
|
||||||
if (!*cmd)
|
if (!*cmd)
|
||||||
die("Missing argument in exec");
|
{
|
||||||
|
report_or_die("Missing argument in exec");
|
||||||
|
return;
|
||||||
|
}
|
||||||
command->last_argument= command->end;
|
command->last_argument= command->end;
|
||||||
|
|
||||||
init_dynamic_string(&ds_cmd, 0, command->query_len+256, 256);
|
init_dynamic_string(&ds_cmd, 0, command->query_len+256, 256);
|
||||||
|
@ -3197,10 +3277,12 @@ void do_exec(struct st_command *command)
|
||||||
DBUG_PRINT("info", ("Executing '%s' as '%s'",
|
DBUG_PRINT("info", ("Executing '%s' as '%s'",
|
||||||
command->first_argument, ds_cmd.str));
|
command->first_argument, ds_cmd.str));
|
||||||
|
|
||||||
if (!(res_file= my_popen(&ds_cmd, "r")) && command->abort_on_error)
|
if (!(res_file= my_popen(&ds_cmd, "r")))
|
||||||
{
|
{
|
||||||
dynstr_free(&ds_cmd);
|
dynstr_free(&ds_cmd);
|
||||||
die("popen(\"%s\", \"r\") failed", command->first_argument);
|
if (command->abort_on_error)
|
||||||
|
report_or_die("popen(\"%s\", \"r\") failed", command->first_argument);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ds_result= &ds_res;
|
ds_result= &ds_res;
|
||||||
|
@ -3237,11 +3319,12 @@ void do_exec(struct st_command *command)
|
||||||
|
|
||||||
if (command->abort_on_error)
|
if (command->abort_on_error)
|
||||||
{
|
{
|
||||||
log_msg("exec of '%s' failed, error: %d, status: %d, errno: %d",
|
report_or_die("exec of '%s' failed, error: %d, status: %d, errno: %d\n"
|
||||||
ds_cmd.str, error, status, errno);
|
"Output from before failure:\n%s\n",
|
||||||
|
ds_cmd.str, error, status, errno,
|
||||||
|
ds_res.str);
|
||||||
dynstr_free(&ds_cmd);
|
dynstr_free(&ds_cmd);
|
||||||
die("command \"%s\" failed\n\nOutput from before failure:\n%s\n",
|
return;
|
||||||
command->first_argument, ds_res.str);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_PRINT("info",
|
DBUG_PRINT("info",
|
||||||
|
@ -3256,8 +3339,8 @@ void do_exec(struct st_command *command)
|
||||||
{
|
{
|
||||||
dynstr_free(&ds_cmd);
|
dynstr_free(&ds_cmd);
|
||||||
if (command->expected_errors.count > 0)
|
if (command->expected_errors.count > 0)
|
||||||
die("command \"%s\" failed with wrong error: %d",
|
report_or_die("command \"%s\" failed with wrong error: %d",
|
||||||
command->first_argument, status);
|
command->first_argument, status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (command->expected_errors.err[0].type == ERR_ERRNO &&
|
else if (command->expected_errors.err[0].type == ERR_ERRNO &&
|
||||||
|
@ -3267,8 +3350,10 @@ void do_exec(struct st_command *command)
|
||||||
log_msg("exec of '%s failed, error: %d, errno: %d",
|
log_msg("exec of '%s failed, error: %d, errno: %d",
|
||||||
ds_cmd.str, error, errno);
|
ds_cmd.str, error, errno);
|
||||||
dynstr_free(&ds_cmd);
|
dynstr_free(&ds_cmd);
|
||||||
die("command \"%s\" succeeded - should have failed with errno %d...",
|
report_or_die("command \"%s\" succeeded - should have failed with "
|
||||||
command->first_argument, command->expected_errors.err[0].code.errnum);
|
"errno %d...",
|
||||||
|
command->first_argument,
|
||||||
|
command->expected_errors.err[0].code.errnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
dynstr_free(&ds_cmd);
|
dynstr_free(&ds_cmd);
|
||||||
|
@ -3302,7 +3387,8 @@ int do_modify_var(struct st_command *command,
|
||||||
const char *p= command->first_argument;
|
const char *p= command->first_argument;
|
||||||
VAR* v;
|
VAR* v;
|
||||||
if (!*p)
|
if (!*p)
|
||||||
die("Missing argument to %.*s", command->first_word_len, command->query);
|
die("Missing argument to %.*s", command->first_word_len,
|
||||||
|
command->query);
|
||||||
if (*p != '$')
|
if (*p != '$')
|
||||||
die("The argument to %.*s must be a variable (start with $)",
|
die("The argument to %.*s must be a variable (start with $)",
|
||||||
command->first_word_len, command->query);
|
command->first_word_len, command->query);
|
||||||
|
@ -3368,7 +3454,10 @@ void do_system(struct st_command *command)
|
||||||
DBUG_ENTER("do_system");
|
DBUG_ENTER("do_system");
|
||||||
|
|
||||||
if (strlen(command->first_argument) == 0)
|
if (strlen(command->first_argument) == 0)
|
||||||
die("Missing arguments to system, nothing to do!");
|
{
|
||||||
|
report_or_die("Missing arguments to system, nothing to do!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
init_dynamic_string(&ds_cmd, 0, command->query_len + 64, 256);
|
init_dynamic_string(&ds_cmd, 0, command->query_len + 64, 256);
|
||||||
|
|
||||||
|
@ -3389,12 +3478,14 @@ void do_system(struct st_command *command)
|
||||||
if (my_system(&ds_cmd))
|
if (my_system(&ds_cmd))
|
||||||
{
|
{
|
||||||
if (command->abort_on_error)
|
if (command->abort_on_error)
|
||||||
die("system command '%s' failed", command->first_argument);
|
report_or_die("system command '%s' failed", command->first_argument);
|
||||||
|
else
|
||||||
/* If ! abort_on_error, log message and continue */
|
{
|
||||||
dynstr_append(&ds_res, "system command '");
|
/* If ! abort_on_error, log message and continue */
|
||||||
replace_dynstr_append(&ds_res, command->first_argument);
|
dynstr_append(&ds_res, "system command '");
|
||||||
dynstr_append(&ds_res, "' failed\n");
|
replace_dynstr_append(&ds_res, command->first_argument);
|
||||||
|
dynstr_append(&ds_res, "' failed\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
command->last_argument= command->end;
|
command->last_argument= command->end;
|
||||||
|
@ -3941,12 +4032,12 @@ void read_until_delimiter(DYNAMIC_STRING *ds,
|
||||||
No characters except \n are allowed on
|
No characters except \n are allowed on
|
||||||
the same line as the command
|
the same line as the command
|
||||||
*/
|
*/
|
||||||
die("Trailing characters found after command");
|
report_or_die("Trailing characters found after command");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (feof(cur_file->file))
|
if (feof(cur_file->file))
|
||||||
die("End of file encountered before '%s' delimiter was found",
|
report_or_die("End of file encountered before '%s' delimiter was found",
|
||||||
ds_delimiter->str);
|
ds_delimiter->str);
|
||||||
|
|
||||||
if (match_delimiter(c, ds_delimiter->str, ds_delimiter->length))
|
if (match_delimiter(c, ds_delimiter->str, ds_delimiter->length))
|
||||||
{
|
{
|
||||||
|
@ -4350,8 +4441,13 @@ void do_perl(struct st_command *command)
|
||||||
/* Format the "perl <filename>" command */
|
/* Format the "perl <filename>" command */
|
||||||
my_snprintf(buf, sizeof(buf), "perl %s", temp_file_path);
|
my_snprintf(buf, sizeof(buf), "perl %s", temp_file_path);
|
||||||
|
|
||||||
if (!(res_file= popen(buf, "r")) && command->abort_on_error)
|
if (!(res_file= popen(buf, "r")))
|
||||||
die("popen(\"%s\", \"r\") failed", buf);
|
{
|
||||||
|
if (command->abort_on_error)
|
||||||
|
die("popen(\"%s\", \"r\") failed", buf);
|
||||||
|
dynstr_free(&ds_delimiter);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
while (fgets(buf, sizeof(buf), res_file))
|
while (fgets(buf, sizeof(buf), res_file))
|
||||||
{
|
{
|
||||||
|
@ -4506,14 +4602,14 @@ void do_sync_with_master2(struct st_command *command, long offset)
|
||||||
information is not initialized, the arguments are
|
information is not initialized, the arguments are
|
||||||
incorrect, or an error has occured
|
incorrect, or an error has occured
|
||||||
*/
|
*/
|
||||||
die("%.*s failed: '%s' returned NULL "\
|
die("%.*s failed: '%s' returned NULL " \
|
||||||
"indicating slave SQL thread failure",
|
"indicating slave SQL thread failure",
|
||||||
command->first_word_len, command->query, query_buf);
|
command->first_word_len, command->query, query_buf);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result == -1)
|
if (result == -1)
|
||||||
die("%.*s failed: '%s' returned -1 "\
|
die("%.*s failed: '%s' returned -1 " \
|
||||||
"indicating timeout after %d seconds",
|
"indicating timeout after %d seconds",
|
||||||
command->first_word_len, command->query, query_buf, timeout);
|
command->first_word_len, command->query, query_buf, timeout);
|
||||||
else
|
else
|
||||||
|
@ -4808,7 +4904,8 @@ int do_sleep(struct st_command *command, my_bool real_sleep)
|
||||||
while (my_isspace(charset_info, *p))
|
while (my_isspace(charset_info, *p))
|
||||||
p++;
|
p++;
|
||||||
if (!*p)
|
if (!*p)
|
||||||
die("Missing argument to %.*s", command->first_word_len, command->query);
|
die("Missing argument to %.*s", command->first_word_len,
|
||||||
|
command->query);
|
||||||
sleep_start= p;
|
sleep_start= p;
|
||||||
/* Check that arg starts with a digit, not handled by my_strtod */
|
/* Check that arg starts with a digit, not handled by my_strtod */
|
||||||
if (!my_isdigit(charset_info, *sleep_start))
|
if (!my_isdigit(charset_info, *sleep_start))
|
||||||
|
@ -4880,16 +4977,21 @@ int query_get_string(MYSQL* mysql, const char* query,
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
|
|
||||||
if (mysql_query(mysql, query))
|
if (mysql_query(mysql, query))
|
||||||
die("'%s' failed: %d %s", query,
|
{
|
||||||
mysql_errno(mysql), mysql_error(mysql));
|
report_or_die("'%s' failed: %d %s", query,
|
||||||
|
mysql_errno(mysql), mysql_error(mysql));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
if ((res= mysql_store_result(mysql)) == NULL)
|
if ((res= mysql_store_result(mysql)) == NULL)
|
||||||
die("Failed to store result: %d %s",
|
{
|
||||||
mysql_errno(mysql), mysql_error(mysql));
|
report_or_die("Failed to store result: %d %s",
|
||||||
|
mysql_errno(mysql), mysql_error(mysql));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if ((row= mysql_fetch_row(res)) == NULL)
|
if ((row= mysql_fetch_row(res)) == NULL)
|
||||||
{
|
{
|
||||||
mysql_free_result(res);
|
mysql_free_result(res);
|
||||||
ds= 0;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
init_dynamic_string(ds, (row[column] ? row[column] : "NULL"), ~0, 32);
|
init_dynamic_string(ds, (row[column] ? row[column] : "NULL"), ~0, 32);
|
||||||
|
@ -5161,7 +5263,7 @@ void do_get_errcodes(struct st_command *command)
|
||||||
while (*p && p != end)
|
while (*p && p != end)
|
||||||
{
|
{
|
||||||
if (!my_isdigit(charset_info, *p))
|
if (!my_isdigit(charset_info, *p))
|
||||||
die("Invalid argument to error: '%s' - "\
|
die("Invalid argument to error: '%s' - " \
|
||||||
"the errno may only consist of digits[0-9]",
|
"the errno may only consist of digits[0-9]",
|
||||||
command->first_argument);
|
command->first_argument);
|
||||||
p++;
|
p++;
|
||||||
|
@ -6084,7 +6186,7 @@ void do_block(enum block_cmd cmd, struct st_command* command)
|
||||||
eval_expr(&v2, curr_ptr, &expr_end);
|
eval_expr(&v2, curr_ptr, &expr_end);
|
||||||
|
|
||||||
if ((operand!=EQ_OP && operand!=NE_OP) && ! (v.is_int && v2.is_int))
|
if ((operand!=EQ_OP && operand!=NE_OP) && ! (v.is_int && v2.is_int))
|
||||||
die ("Only == and != are supported for string values");
|
die("Only == and != are supported for string values");
|
||||||
|
|
||||||
/* Now we overwrite the first variable with 0 or 1 (for false or true) */
|
/* Now we overwrite the first variable with 0 or 1 (for false or true) */
|
||||||
|
|
||||||
|
@ -6442,7 +6544,7 @@ int read_line(char *buf, int size)
|
||||||
*p++= c;
|
*p++= c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
die("The input buffer is too small for this query.x\n" \
|
die("The input buffer is too small for this query.x\n" \
|
||||||
"check your query or increase MAX_QUERY and recompile");
|
"check your query or increase MAX_QUERY and recompile");
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
@ -6675,6 +6777,12 @@ static struct my_option my_long_options[] =
|
||||||
{"compress", 'C', "Use the compressed server/client protocol.",
|
{"compress", 'C', "Use the compressed server/client protocol.",
|
||||||
&opt_compress, &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
&opt_compress, &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
||||||
0, 0, 0},
|
0, 0, 0},
|
||||||
|
{"continue-on-error", 0,
|
||||||
|
"Continue test even if we got an error. "
|
||||||
|
"This is mostly useful when testing a storage engine to see what from a test file it can execute, "
|
||||||
|
"or to find all syntax errors in a newly created big test file",
|
||||||
|
&opt_continue_on_error, &opt_continue_on_error, 0,
|
||||||
|
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"cursor-protocol", 0, "Use cursors for prepared statements.",
|
{"cursor-protocol", 0, "Use cursors for prepared statements.",
|
||||||
&cursor_protocol, &cursor_protocol, 0,
|
&cursor_protocol, &cursor_protocol, 0,
|
||||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
|
@ -7006,7 +7114,8 @@ int parse_args(int argc, char **argv)
|
||||||
{
|
{
|
||||||
/* Check that the result file exists */
|
/* Check that the result file exists */
|
||||||
if (result_file_name && access(result_file_name, F_OK) != 0)
|
if (result_file_name && access(result_file_name, F_OK) != 0)
|
||||||
die("The specified result file '%s' does not exist", result_file_name);
|
die("The specified result file '%s' does not exist",
|
||||||
|
result_file_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -7333,8 +7442,8 @@ void append_stmt_result(DYNAMIC_STRING *ds, MYSQL_STMT *stmt,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error != MYSQL_NO_DATA)
|
if (error != MYSQL_NO_DATA)
|
||||||
die("mysql_fetch didn't end with MYSQL_NO_DATA from statement: error: %d",
|
die("mysql_fetch didn't end with MYSQL_NO_DATA from statement: "
|
||||||
error);
|
"error: %d", error);
|
||||||
if (mysql_stmt_fetch(stmt) != MYSQL_NO_DATA)
|
if (mysql_stmt_fetch(stmt) != MYSQL_NO_DATA)
|
||||||
die("mysql_fetch didn't end with MYSQL_NO_DATA from statement: %d %s",
|
die("mysql_fetch didn't end with MYSQL_NO_DATA from statement: %d %s",
|
||||||
mysql_stmt_errno(stmt), mysql_stmt_error(stmt));
|
mysql_stmt_errno(stmt), mysql_stmt_error(stmt));
|
||||||
|
@ -7666,7 +7775,8 @@ static int match_expected_error(struct st_command *command,
|
||||||
NULL is quite likely, but not in conjunction with a SQL-state expect!
|
NULL is quite likely, but not in conjunction with a SQL-state expect!
|
||||||
*/
|
*/
|
||||||
if (unlikely(err_sqlstate == NULL))
|
if (unlikely(err_sqlstate == NULL))
|
||||||
die("expecting a SQL-state (%s) from query '%s' which cannot produce one...",
|
die("expecting a SQL-state (%s) from query '%s' which cannot "
|
||||||
|
"produce one...",
|
||||||
command->expected_errors.err[i].code.sqlstate, command->query);
|
command->expected_errors.err[i].code.sqlstate, command->query);
|
||||||
|
|
||||||
if (strncmp(command->expected_errors.err[i].code.sqlstate,
|
if (strncmp(command->expected_errors.err[i].code.sqlstate,
|
||||||
|
@ -7720,7 +7830,11 @@ void handle_error(struct st_command *command,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (command->abort_on_error)
|
if (command->abort_on_error)
|
||||||
die("query '%s' failed: %d: %s", command->query, err_errno, err_error);
|
{
|
||||||
|
report_or_die("query '%s' failed: %d: %s", command->query, err_errno,
|
||||||
|
err_error);
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
DBUG_PRINT("info", ("expected_errors.count: %d",
|
DBUG_PRINT("info", ("expected_errors.count: %d",
|
||||||
command->expected_errors.count));
|
command->expected_errors.count));
|
||||||
|
@ -7766,13 +7880,15 @@ void handle_error(struct st_command *command,
|
||||||
if (command->expected_errors.count > 0)
|
if (command->expected_errors.count > 0)
|
||||||
{
|
{
|
||||||
if (command->expected_errors.err[0].type == ERR_ERRNO)
|
if (command->expected_errors.err[0].type == ERR_ERRNO)
|
||||||
die("query '%s' failed with wrong errno %d: '%s', instead of %d...",
|
report_or_die("query '%s' failed with wrong errno %d: '%s', instead of "
|
||||||
command->query, err_errno, err_error,
|
"%d...",
|
||||||
command->expected_errors.err[0].code.errnum);
|
command->query, err_errno, err_error,
|
||||||
|
command->expected_errors.err[0].code.errnum);
|
||||||
else
|
else
|
||||||
die("query '%s' failed with wrong sqlstate %s: '%s', instead of %s...",
|
report_or_die("query '%s' failed with wrong sqlstate %s: '%s', "
|
||||||
command->query, err_sqlstate, err_error,
|
"instead of %s...",
|
||||||
command->expected_errors.err[0].code.sqlstate);
|
command->query, err_sqlstate, err_error,
|
||||||
|
command->expected_errors.err[0].code.sqlstate);
|
||||||
}
|
}
|
||||||
|
|
||||||
revert_properties();
|
revert_properties();
|
||||||
|
@ -7799,15 +7915,17 @@ void handle_no_error(struct st_command *command)
|
||||||
command->expected_errors.err[0].code.errnum != 0)
|
command->expected_errors.err[0].code.errnum != 0)
|
||||||
{
|
{
|
||||||
/* Error code we wanted was != 0, i.e. not an expected success */
|
/* Error code we wanted was != 0, i.e. not an expected success */
|
||||||
die("query '%s' succeeded - should have failed with errno %d...",
|
report_or_die("query '%s' succeeded - should have failed with errno %d...",
|
||||||
command->query, command->expected_errors.err[0].code.errnum);
|
command->query, command->expected_errors.err[0].code.errnum);
|
||||||
}
|
}
|
||||||
else if (command->expected_errors.err[0].type == ERR_SQLSTATE &&
|
else if (command->expected_errors.err[0].type == ERR_SQLSTATE &&
|
||||||
strcmp(command->expected_errors.err[0].code.sqlstate,"00000") != 0)
|
strcmp(command->expected_errors.err[0].code.sqlstate,"00000") != 0)
|
||||||
{
|
{
|
||||||
/* SQLSTATE we wanted was != "00000", i.e. not an expected success */
|
/* SQLSTATE we wanted was != "00000", i.e. not an expected success */
|
||||||
die("query '%s' succeeded - should have failed with sqlstate %s...",
|
report_or_die("query '%s' succeeded - should have failed with "
|
||||||
command->query, command->expected_errors.err[0].code.sqlstate);
|
"sqlstate %s...",
|
||||||
|
command->query,
|
||||||
|
command->expected_errors.err[0].code.sqlstate);
|
||||||
}
|
}
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
}
|
}
|
||||||
|
@ -8105,10 +8223,10 @@ void run_query(struct st_connection *cn, struct st_command *command, int flags)
|
||||||
DBUG_ENTER("run_query");
|
DBUG_ENTER("run_query");
|
||||||
|
|
||||||
if (cn->pending && (flags & QUERY_SEND_FLAG))
|
if (cn->pending && (flags & QUERY_SEND_FLAG))
|
||||||
die ("Cannot run query on connection between send and reap");
|
die("Cannot run query on connection between send and reap");
|
||||||
|
|
||||||
if (!(flags & QUERY_SEND_FLAG) && !cn->pending)
|
if (!(flags & QUERY_SEND_FLAG) && !cn->pending)
|
||||||
die ("Cannot reap on a connection without pending send");
|
die("Cannot reap on a connection without pending send");
|
||||||
|
|
||||||
init_dynamic_string(&ds_warnings, NULL, 0, 256);
|
init_dynamic_string(&ds_warnings, NULL, 0, 256);
|
||||||
ds_warn= &ds_warnings;
|
ds_warn= &ds_warnings;
|
||||||
|
@ -8293,13 +8411,14 @@ void run_query(struct st_connection *cn, struct st_command *command, int flags)
|
||||||
if (sp_created)
|
if (sp_created)
|
||||||
{
|
{
|
||||||
if (util_query(mysql, "DROP PROCEDURE mysqltest_tmp_sp "))
|
if (util_query(mysql, "DROP PROCEDURE mysqltest_tmp_sp "))
|
||||||
die("Failed to drop sp: %d: %s", mysql_errno(mysql), mysql_error(mysql));
|
report_or_die("Failed to drop sp: %d: %s", mysql_errno(mysql),
|
||||||
|
mysql_error(mysql));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (view_created)
|
if (view_created)
|
||||||
{
|
{
|
||||||
if (util_query(mysql, "DROP VIEW mysqltest_tmp_v "))
|
if (util_query(mysql, "DROP VIEW mysqltest_tmp_v "))
|
||||||
die("Failed to drop view: %d: %s",
|
report_or_die("Failed to drop view: %d: %s",
|
||||||
mysql_errno(mysql), mysql_error(mysql));
|
mysql_errno(mysql), mysql_error(mysql));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8463,9 +8582,10 @@ void get_command_type(struct st_command* command)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* -- "comment" that didn't contain a mysqltest command */
|
/* -- "comment" that didn't contain a mysqltest command */
|
||||||
die("Found line beginning with -- that didn't contain "\
|
report_or_die("Found line beginning with -- that didn't contain " \
|
||||||
"a valid mysqltest command, check your syntax or "\
|
"a valid mysqltest command, check your syntax or " \
|
||||||
"use # if you intended to write a comment");
|
"use # if you intended to write a comment");
|
||||||
|
command->type= Q_COMMENT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9190,7 +9310,7 @@ int main(int argc, char **argv)
|
||||||
if (parsing_disabled == 0)
|
if (parsing_disabled == 0)
|
||||||
parsing_disabled= 1;
|
parsing_disabled= 1;
|
||||||
else
|
else
|
||||||
die("Parsing is already disabled");
|
report_or_die("Parsing is already disabled");
|
||||||
break;
|
break;
|
||||||
case Q_ENABLE_PARSING:
|
case Q_ENABLE_PARSING:
|
||||||
/*
|
/*
|
||||||
|
@ -9200,7 +9320,7 @@ int main(int argc, char **argv)
|
||||||
if (parsing_disabled == 1)
|
if (parsing_disabled == 1)
|
||||||
parsing_disabled= 0;
|
parsing_disabled= 0;
|
||||||
else
|
else
|
||||||
die("Parsing is already enabled");
|
report_or_die("Parsing is already enabled");
|
||||||
break;
|
break;
|
||||||
case Q_DIE:
|
case Q_DIE:
|
||||||
/* Abort test with error code and error message */
|
/* Abort test with error code and error message */
|
||||||
|
@ -9404,7 +9524,8 @@ void do_get_replace_column(struct st_command *command)
|
||||||
if (!(column_number= atoi(to)) || column_number > MAX_COLUMNS)
|
if (!(column_number= atoi(to)) || column_number > MAX_COLUMNS)
|
||||||
die("Wrong column number to replace_column in '%s'", command->query);
|
die("Wrong column number to replace_column in '%s'", command->query);
|
||||||
if (!*from)
|
if (!*from)
|
||||||
die("Wrong number of arguments to replace_column in '%s'", command->query);
|
die("Wrong number of arguments to replace_column in '%s'",
|
||||||
|
command->query);
|
||||||
to= get_string(&buff, &from, command);
|
to= get_string(&buff, &from, command);
|
||||||
my_free(replace_column[column_number-1]);
|
my_free(replace_column[column_number-1]);
|
||||||
replace_column[column_number-1]= my_strdup(to, MYF(MY_WME | MY_FAE));
|
replace_column[column_number-1]= my_strdup(to, MYF(MY_WME | MY_FAE));
|
||||||
|
|
|
@ -19,6 +19,15 @@ INCLUDE(CheckCCompilerFlag)
|
||||||
MACRO(SET_MYSQL_MAINTAINER_GNU_C_OPTIONS)
|
MACRO(SET_MYSQL_MAINTAINER_GNU_C_OPTIONS)
|
||||||
SET(MY_MAINTAINER_WARNINGS
|
SET(MY_MAINTAINER_WARNINGS
|
||||||
"-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing")
|
"-Wall -Wextra -Wunused -Wwrite-strings -Wno-strict-aliasing")
|
||||||
|
|
||||||
|
CHECK_C_COMPILER_FLAG("-Wno-missing-field-initializers"
|
||||||
|
HAVE_NO_MISSING_FIELD_INITIALIZERS)
|
||||||
|
|
||||||
|
IF (HAVE_NO_MISSING_FIELD_INITIALIZERS)
|
||||||
|
SET(MY_MAINTAINER_WARNINGS
|
||||||
|
"${MY_MAINTAINER_WARNINGS} -Wno-missing-field-initializers")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
CHECK_C_COMPILER_FLAG("-Wdeclaration-after-statement"
|
CHECK_C_COMPILER_FLAG("-Wdeclaration-after-statement"
|
||||||
HAVE_DECLARATION_AFTER_STATEMENT)
|
HAVE_DECLARATION_AFTER_STATEMENT)
|
||||||
IF(HAVE_DECLARATION_AFTER_STATEMENT)
|
IF(HAVE_DECLARATION_AFTER_STATEMENT)
|
||||||
|
|
|
@ -126,10 +126,12 @@ ENDIF()
|
||||||
IF(MSVC)
|
IF(MSVC)
|
||||||
# Tiny version is used to identify the build, it can be set with cmake -DTINY_VERSION=<number>
|
# Tiny version is used to identify the build, it can be set with cmake -DTINY_VERSION=<number>
|
||||||
# to bzr revno for example (in the CI builds)
|
# to bzr revno for example (in the CI builds)
|
||||||
SET(TINY_VERSION "0" CACHE INTERNAL "")
|
IF(NOT TINY_VERSION)
|
||||||
|
SET(TINY_VERSION "0")
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
GET_FILENAME_COMPONENT(MYSQL_CMAKE_SCRIPT_DIR ${CMAKE_CURRENT_LIST_FILE} PATH)
|
GET_FILENAME_COMPONENT(MYSQL_CMAKE_SCRIPT_DIR ${CMAKE_CURRENT_LIST_FILE} PATH)
|
||||||
|
|
||||||
SET(FILETYPE VFT_APP)
|
SET(FILETYPE VFT_APP)
|
||||||
CONFIGURE_FILE(${MYSQL_CMAKE_SCRIPT_DIR}/versioninfo.rc.in
|
CONFIGURE_FILE(${MYSQL_CMAKE_SCRIPT_DIR}/versioninfo.rc.in
|
||||||
${CMAKE_BINARY_DIR}/versioninfo_exe.rc)
|
${CMAKE_BINARY_DIR}/versioninfo_exe.rc)
|
||||||
|
@ -137,7 +139,7 @@ IF(MSVC)
|
||||||
SET(FILETYPE VFT_DLL)
|
SET(FILETYPE VFT_DLL)
|
||||||
CONFIGURE_FILE(${MYSQL_CMAKE_SCRIPT_DIR}/versioninfo.rc.in
|
CONFIGURE_FILE(${MYSQL_CMAKE_SCRIPT_DIR}/versioninfo.rc.in
|
||||||
${CMAKE_BINARY_DIR}/versioninfo_dll.rc)
|
${CMAKE_BINARY_DIR}/versioninfo_dll.rc)
|
||||||
|
|
||||||
FUNCTION(ADD_VERSION_INFO target target_type sources_var)
|
FUNCTION(ADD_VERSION_INFO target target_type sources_var)
|
||||||
IF("${target_type}" MATCHES "SHARED" OR "${target_type}" MATCHES "MODULE")
|
IF("${target_type}" MATCHES "SHARED" OR "${target_type}" MATCHES "MODULE")
|
||||||
SET(rcfile ${CMAKE_BINARY_DIR}/versioninfo_dll.rc)
|
SET(rcfile ${CMAKE_BINARY_DIR}/versioninfo_dll.rc)
|
||||||
|
|
|
@ -23,6 +23,15 @@
|
||||||
# The below was used for really old versions of FreeBSD, roughly: before 5.1.9
|
# The below was used for really old versions of FreeBSD, roughly: before 5.1.9
|
||||||
# ADD_DEFINITIONS(-DHAVE_BROKEN_REALPATH)
|
# ADD_DEFINITIONS(-DHAVE_BROKEN_REALPATH)
|
||||||
|
|
||||||
|
# Find libexecinfo (library that contains backtrace_symbols etc)
|
||||||
|
INCLUDE_DIRECTORIES(/usr/local/include)
|
||||||
|
SET(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} /usr/local/include )
|
||||||
|
SET(ENV{LIB} "$ENV{LIB}:/usr/local/lib")
|
||||||
|
FIND_LIBRARY(EXECINFO NAMES execinfo)
|
||||||
|
IF(EXECINFO)
|
||||||
|
SET(LIBEXECINFO ${EXECINFO})
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
# Use atomic builtins
|
# Use atomic builtins
|
||||||
IF(CMAKE_SIZEOF_VOID_P EQUAL 4 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "i386")
|
IF(CMAKE_SIZEOF_VOID_P EQUAL 4 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "i386")
|
||||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686")
|
||||||
|
|
|
@ -589,6 +589,8 @@
|
||||||
#cmakedefine WITH_MYISAM_STORAGE_ENGINE 1
|
#cmakedefine WITH_MYISAM_STORAGE_ENGINE 1
|
||||||
#cmakedefine WITH_MYISAMMRG_STORAGE_ENGINE 1
|
#cmakedefine WITH_MYISAMMRG_STORAGE_ENGINE 1
|
||||||
#cmakedefine WITH_HEAP_STORAGE_ENGINE 1
|
#cmakedefine WITH_HEAP_STORAGE_ENGINE 1
|
||||||
|
#cmakedefine WITH_INNOBASE_STORAGE_ENGINE 1
|
||||||
|
#cmakedefine WITH_XTRADB_STORAGE_ENGINE 1
|
||||||
#cmakedefine WITH_CSV_STORAGE_ENGINE 1
|
#cmakedefine WITH_CSV_STORAGE_ENGINE 1
|
||||||
#cmakedefine WITH_PARTITION_STORAGE_ENGINE 1
|
#cmakedefine WITH_PARTITION_STORAGE_ENGINE 1
|
||||||
#cmakedefine WITH_PERFSCHEMA_STORAGE_ENGINE 1
|
#cmakedefine WITH_PERFSCHEMA_STORAGE_ENGINE 1
|
||||||
|
|
|
@ -147,7 +147,7 @@ IF(UNIX)
|
||||||
FIND_PACKAGE(Threads)
|
FIND_PACKAGE(Threads)
|
||||||
|
|
||||||
SET(CMAKE_REQUIRED_LIBRARIES
|
SET(CMAKE_REQUIRED_LIBRARIES
|
||||||
${LIBM} ${LIBNSL} ${LIBBIND} ${LIBCRYPT} ${LIBSOCKET} ${LIBDL} ${CMAKE_THREAD_LIBS_INIT} ${LIBRT})
|
${LIBM} ${LIBNSL} ${LIBBIND} ${LIBCRYPT} ${LIBSOCKET} ${LIBDL} ${CMAKE_THREAD_LIBS_INIT} ${LIBRT} ${LIBEXECINFO})
|
||||||
|
|
||||||
IF(CMAKE_REQUIRED_LIBRARIES)
|
IF(CMAKE_REQUIRED_LIBRARIES)
|
||||||
LIST(REMOVE_DUPLICATES CMAKE_REQUIRED_LIBRARIES)
|
LIST(REMOVE_DUPLICATES CMAKE_REQUIRED_LIBRARIES)
|
||||||
|
|
|
@ -38,10 +38,10 @@ int func1()
|
||||||
|
|
||||||
int main (int argc, char *argv[])
|
int main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
#ifdef DBUG_OFF
|
#ifdef DBUG_OFF
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
#else
|
||||||
|
int i;
|
||||||
if (argc == 1)
|
if (argc == 1)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -83,4 +83,5 @@ int main (int argc, char *argv[])
|
||||||
DBUG_SET(""); /* to not have my_end() in the traces */
|
DBUG_SET(""); /* to not have my_end() in the traces */
|
||||||
my_end(0);
|
my_end(0);
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif /* DBUG_OFF */
|
||||||
}
|
}
|
||||||
|
|
3
debian/libmariadbclient-dev.files
vendored
3
debian/libmariadbclient-dev.files
vendored
|
@ -1,6 +1,5 @@
|
||||||
usr/bin/mysql_config
|
usr/bin/mysql_config
|
||||||
usr/include/mysql/*.h
|
usr/include/mysql
|
||||||
usr/include/mysql/psi/*.h
|
|
||||||
usr/lib/libmysqlclient.a
|
usr/lib/libmysqlclient.a
|
||||||
usr/lib/libmysqlclient_r.a
|
usr/lib/libmysqlclient_r.a
|
||||||
usr/lib/libmysqlservices.a
|
usr/lib/libmysqlservices.a
|
||||||
|
|
4
debian/libmariadbclient-dev.links
vendored
4
debian/libmariadbclient-dev.links
vendored
|
@ -1,2 +1,2 @@
|
||||||
usr/lib/libmysqlclient.so.16 usr/lib/libmysqlclient.so
|
usr/lib/libmysqlclient.so.18 usr/lib/libmysqlclient.so
|
||||||
usr/lib/libmysqlclient_r.so.16 usr/lib/libmysqlclient_r.so
|
usr/lib/libmysqlclient_r.so.18 usr/lib/libmysqlclient_r.so
|
||||||
|
|
|
@ -67,7 +67,7 @@ static struct my_option my_long_options[] =
|
||||||
{"defaults-extra-file", 'e',
|
{"defaults-extra-file", 'e',
|
||||||
"Read this file after the global config file and before the config "
|
"Read this file after the global config file and before the config "
|
||||||
"file in the users home directory; should be the first option",
|
"file in the users home directory; should be the first option",
|
||||||
&my_defaults_extra_file, &my_defaults_extra_file, 0,
|
(void *)&my_defaults_extra_file, (void *)&my_defaults_extra_file, 0,
|
||||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"defaults-group-suffix", 'g',
|
{"defaults-group-suffix", 'g',
|
||||||
"In addition to the given groups, read also groups with this suffix",
|
"In addition to the given groups, read also groups with this suffix",
|
||||||
|
@ -75,8 +75,8 @@ static struct my_option my_long_options[] =
|
||||||
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"extra-file", 'e',
|
{"extra-file", 'e',
|
||||||
"Deprecated. Synonym for --defaults-extra-file.",
|
"Deprecated. Synonym for --defaults-extra-file.",
|
||||||
&my_defaults_extra_file,
|
(void *)&my_defaults_extra_file,
|
||||||
&my_defaults_extra_file, 0, GET_STR,
|
(void *)&my_defaults_extra_file, 0, GET_STR,
|
||||||
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"no-defaults", 'n', "Return an empty string (useful for scripts).",
|
{"no-defaults", 'n', "Return an empty string (useful for scripts).",
|
||||||
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
|
|
|
@ -14,11 +14,11 @@
|
||||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
SET(HEADERS_GEN_CONFIGURE
|
SET(HEADERS_GEN_CONFIGURE
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/mysql_version.h
|
mysql_version.h
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/my_config.h
|
my_config.h
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/mysqld_ername.h
|
mysqld_ername.h
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/mysqld_error.h
|
mysqld_error.h
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/sql_state.h
|
sql_state.h
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(HEADERS
|
SET(HEADERS
|
||||||
|
@ -49,8 +49,19 @@ SET(HEADERS
|
||||||
m_ctype.h
|
m_ctype.h
|
||||||
my_attribute.h
|
my_attribute.h
|
||||||
my_compiler.h
|
my_compiler.h
|
||||||
${HEADERS_GEN_CONFIGURE}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
INSTALL(FILES ${HEADERS} DESTINATION ${INSTALL_INCLUDEDIR} COMPONENT Development)
|
INSTALL(FILES ${HEADERS} DESTINATION ${INSTALL_INCLUDEDIR} COMPONENT Development)
|
||||||
|
FOREACH(f ${HEADERS_GEN_CONFIGURE})
|
||||||
|
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${f} DESTINATION ${INSTALL_INCLUDEDIR} COMPONENT Development PERMISSIONS OWNER_READ GROUP_READ WORLD_READ)
|
||||||
|
ENDFOREACH(f)
|
||||||
INSTALL(DIRECTORY mysql/ DESTINATION ${INSTALL_INCLUDEDIR} COMPONENT Development FILES_MATCHING PATTERN "*.h")
|
INSTALL(DIRECTORY mysql/ DESTINATION ${INSTALL_INCLUDEDIR} COMPONENT Development FILES_MATCHING PATTERN "*.h")
|
||||||
|
|
||||||
|
STRING(REPLACE "." "\\." EXCL_RE "${HEADERS};${HEADERS_GEN_CONFIGURE}")
|
||||||
|
STRING(REPLACE ";" "|" EXCL_RE "${EXCL_RE}")
|
||||||
|
|
||||||
|
INSTALL(DIRECTORY . DESTINATION ${INSTALL_INCLUDEDIR}/private COMPONENT Development
|
||||||
|
FILES_MATCHING PATTERN "*.h"
|
||||||
|
PATTERN CMakeFiles EXCLUDE
|
||||||
|
PATTERN mysql EXCLUDE
|
||||||
|
REGEX "\\./(${EXCL_RE}$)" EXCLUDE)
|
||||||
|
|
|
@ -24,7 +24,6 @@ extern "C" {
|
||||||
#include <my_base.h>
|
#include <my_base.h>
|
||||||
#include <my_sys.h>
|
#include <my_sys.h>
|
||||||
#include <m_ctype.h>
|
#include <m_ctype.h>
|
||||||
#include "../storage/maria/ma_pagecache.h"
|
|
||||||
#include "my_compare.h"
|
#include "my_compare.h"
|
||||||
#include "ft_global.h"
|
#include "ft_global.h"
|
||||||
#include <myisamchk.h>
|
#include <myisamchk.h>
|
||||||
|
@ -268,7 +267,6 @@ extern my_bool maria_flush, maria_single_user, maria_page_checksums;
|
||||||
extern my_bool maria_delay_key_write;
|
extern my_bool maria_delay_key_write;
|
||||||
extern my_off_t maria_max_temp_length;
|
extern my_off_t maria_max_temp_length;
|
||||||
extern ulong maria_bulk_insert_tree_size, maria_data_pointer_size;
|
extern ulong maria_bulk_insert_tree_size, maria_data_pointer_size;
|
||||||
extern PAGECACHE maria_pagecache_var, *maria_pagecache;
|
|
||||||
extern MY_TMPDIR *maria_tmpdir;
|
extern MY_TMPDIR *maria_tmpdir;
|
||||||
/*
|
/*
|
||||||
This is used to check if a symlink points into the mysql data home,
|
This is used to check if a symlink points into the mysql data home,
|
||||||
|
@ -353,69 +351,6 @@ typedef struct st_maria_bit_buff
|
||||||
uint error;
|
uint error;
|
||||||
} MARIA_BIT_BUFF;
|
} MARIA_BIT_BUFF;
|
||||||
|
|
||||||
|
|
||||||
typedef struct st_maria_sort_info
|
|
||||||
{
|
|
||||||
/* sync things */
|
|
||||||
mysql_mutex_t mutex;
|
|
||||||
mysql_cond_t cond;
|
|
||||||
MARIA_HA *info, *new_info;
|
|
||||||
HA_CHECK *param;
|
|
||||||
char *buff;
|
|
||||||
SORT_KEY_BLOCKS *key_block, *key_block_end;
|
|
||||||
SORT_FT_BUF *ft_buf;
|
|
||||||
my_off_t filelength, dupp, buff_length;
|
|
||||||
pgcache_page_no_t page;
|
|
||||||
ha_rows max_records;
|
|
||||||
uint current_key, total_keys;
|
|
||||||
uint got_error, threads_running;
|
|
||||||
myf myf_rw;
|
|
||||||
enum data_file_type new_data_file_type, org_data_file_type;
|
|
||||||
} MARIA_SORT_INFO;
|
|
||||||
|
|
||||||
typedef struct st_maria_sort_param
|
|
||||||
{
|
|
||||||
pthread_t thr;
|
|
||||||
IO_CACHE read_cache, tempfile, tempfile_for_exceptions;
|
|
||||||
DYNAMIC_ARRAY buffpek;
|
|
||||||
MARIA_BIT_BUFF bit_buff; /* For parallel repair of packrec. */
|
|
||||||
|
|
||||||
MARIA_KEYDEF *keyinfo;
|
|
||||||
MARIA_SORT_INFO *sort_info;
|
|
||||||
HA_KEYSEG *seg;
|
|
||||||
uchar **sort_keys;
|
|
||||||
uchar *rec_buff;
|
|
||||||
void *wordlist, *wordptr;
|
|
||||||
MEM_ROOT wordroot;
|
|
||||||
uchar *record;
|
|
||||||
MY_TMPDIR *tmpdir;
|
|
||||||
|
|
||||||
/*
|
|
||||||
The next two are used to collect statistics, see maria_update_key_parts for
|
|
||||||
description.
|
|
||||||
*/
|
|
||||||
ulonglong unique[HA_MAX_KEY_SEG+1];
|
|
||||||
ulonglong notnull[HA_MAX_KEY_SEG+1];
|
|
||||||
|
|
||||||
MARIA_RECORD_POS pos,max_pos,filepos,start_recpos, current_filepos;
|
|
||||||
uint key, key_length,real_key_length,sortbuff_size;
|
|
||||||
uint maxbuffers, keys, find_length, sort_keys_length;
|
|
||||||
my_bool fix_datafile, master;
|
|
||||||
my_bool calc_checksum; /* calculate table checksum */
|
|
||||||
size_t rec_buff_size;
|
|
||||||
|
|
||||||
int (*key_cmp)(struct st_maria_sort_param *, const void *, const void *);
|
|
||||||
int (*key_read)(struct st_maria_sort_param *, uchar *);
|
|
||||||
int (*key_write)(struct st_maria_sort_param *, const uchar *);
|
|
||||||
void (*lock_in_memory)(HA_CHECK *);
|
|
||||||
int (*write_keys)(struct st_maria_sort_param *, register uchar **,
|
|
||||||
uint , struct st_buffpek *, IO_CACHE *);
|
|
||||||
uint (*read_to_buffer)(IO_CACHE *,struct st_buffpek *, uint);
|
|
||||||
int (*write_key)(struct st_maria_sort_param *, IO_CACHE *,uchar *,
|
|
||||||
uint, uint);
|
|
||||||
} MARIA_SORT_PARAM;
|
|
||||||
|
|
||||||
|
|
||||||
/* functions in maria_check */
|
/* functions in maria_check */
|
||||||
void maria_chk_init(HA_CHECK *param);
|
void maria_chk_init(HA_CHECK *param);
|
||||||
void maria_chk_init_for_check(HA_CHECK *param, MARIA_HA *info);
|
void maria_chk_init_for_check(HA_CHECK *param, MARIA_HA *info);
|
||||||
|
@ -443,7 +378,6 @@ int maria_filecopy(HA_CHECK *param, File to, File from, my_off_t start,
|
||||||
my_off_t length, const char *type);
|
my_off_t length, const char *type);
|
||||||
int maria_movepoint(MARIA_HA *info, uchar *record, my_off_t oldpos,
|
int maria_movepoint(MARIA_HA *info, uchar *record, my_off_t oldpos,
|
||||||
my_off_t newpos, uint prot_key);
|
my_off_t newpos, uint prot_key);
|
||||||
int maria_write_data_suffix(MARIA_SORT_INFO *sort_info, my_bool fix_datafile);
|
|
||||||
int maria_test_if_almost_full(MARIA_HA *info);
|
int maria_test_if_almost_full(MARIA_HA *info);
|
||||||
int maria_recreate_table(HA_CHECK *param, MARIA_HA **org_info, char *filename);
|
int maria_recreate_table(HA_CHECK *param, MARIA_HA **org_info, char *filename);
|
||||||
int maria_disable_indexes(MARIA_HA *info);
|
int maria_disable_indexes(MARIA_HA *info);
|
||||||
|
@ -456,10 +390,6 @@ my_bool maria_test_if_sort_rep(MARIA_HA *info, ha_rows rows, ulonglong key_map,
|
||||||
int maria_init_bulk_insert(MARIA_HA *info, ulong cache_size, ha_rows rows);
|
int maria_init_bulk_insert(MARIA_HA *info, ulong cache_size, ha_rows rows);
|
||||||
void maria_flush_bulk_insert(MARIA_HA *info, uint inx);
|
void maria_flush_bulk_insert(MARIA_HA *info, uint inx);
|
||||||
void maria_end_bulk_insert(MARIA_HA *info);
|
void maria_end_bulk_insert(MARIA_HA *info);
|
||||||
int maria_assign_to_pagecache(MARIA_HA *info, ulonglong key_map,
|
|
||||||
PAGECACHE *key_cache);
|
|
||||||
void maria_change_pagecache(PAGECACHE *old_key_cache,
|
|
||||||
PAGECACHE *new_key_cache);
|
|
||||||
int maria_preload(MARIA_HA *info, ulonglong key_map, my_bool ignore_leaves);
|
int maria_preload(MARIA_HA *info, ulonglong key_map, my_bool ignore_leaves);
|
||||||
void maria_versioning(MARIA_HA *info, my_bool versioning);
|
void maria_versioning(MARIA_HA *info, my_bool versioning);
|
||||||
void maria_ignore_trids(MARIA_HA *info);
|
void maria_ignore_trids(MARIA_HA *info);
|
||||||
|
|
|
@ -28,6 +28,10 @@ INSTALL(
|
||||||
PATTERN ".cvsignore" EXCLUDE
|
PATTERN ".cvsignore" EXCLUDE
|
||||||
PATTERN "*.am" EXCLUDE
|
PATTERN "*.am" EXCLUDE
|
||||||
PATTERN "*.in" EXCLUDE
|
PATTERN "*.in" EXCLUDE
|
||||||
|
PATTERN "*.vcxproj" EXCLUDE
|
||||||
|
PATTERN "*.vcxproj.filters" EXCLUDE
|
||||||
|
PATTERN "*.vcxproj.user" EXCLUDE
|
||||||
|
PATTERN "CTest" EXCLUDE
|
||||||
)
|
)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,8 @@ loose-performance-schema-max-table-handles=1000
|
||||||
|
|
||||||
binlog-direct-non-transactional-updates
|
binlog-direct-non-transactional-updates
|
||||||
|
|
||||||
|
default-storage-engine=myisam
|
||||||
|
|
||||||
# here, at the end of [mysqld] group mtr will automatically disable
|
# here, at the end of [mysqld] group mtr will automatically disable
|
||||||
# all optional plugins.
|
# all optional plugins.
|
||||||
|
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
# Created by Horst Hunger 2008-04-15
|
|
||||||
# see also have_64bit_ulong.inc
|
|
||||||
|
|
||||||
--disable_query_log
|
|
||||||
--disable_warnings
|
|
||||||
let $save = `SELECT @@pseudo_thread_id`;
|
|
||||||
SET @@pseudo_thread_id = 4294967296;
|
|
||||||
let $mach32 = `SELECT @@pseudo_thread_id <= 4294967295`;
|
|
||||||
eval SET @@pseudo_thread_id = $save;
|
|
||||||
--enable_warnings
|
|
||||||
--enable_query_log
|
|
||||||
if (!$mach32)
|
|
||||||
{
|
|
||||||
skip Need a 32 bit unsigned long;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,14 +0,0 @@
|
||||||
# Created by Horst Hunger 2008-04-15
|
|
||||||
# see also have_32bit_ulong.inc
|
|
||||||
|
|
||||||
--disable_query_log
|
|
||||||
let $save = `SELECT @@pseudo_thread_id`;
|
|
||||||
SET @@pseudo_thread_id = 4294967296;
|
|
||||||
let $mach64 = `SELECT @@pseudo_thread_id > 4294967295`;
|
|
||||||
eval SET @@pseudo_thread_id = $save;
|
|
||||||
--enable_query_log
|
|
||||||
if (!$mach64)
|
|
||||||
{
|
|
||||||
skip Need a 64 unsigned long ;
|
|
||||||
}
|
|
||||||
|
|
|
@ -25,6 +25,8 @@ use strict;
|
||||||
use base qw(Exporter);
|
use base qw(Exporter);
|
||||||
our @EXPORT= qw(collect_option collect_test_cases);
|
our @EXPORT= qw(collect_option collect_test_cases);
|
||||||
|
|
||||||
|
use Carp;
|
||||||
|
|
||||||
use mtr_report;
|
use mtr_report;
|
||||||
use mtr_match;
|
use mtr_match;
|
||||||
|
|
||||||
|
@ -103,12 +105,12 @@ sub collect_test_cases ($$$$) {
|
||||||
|
|
||||||
# If not reordering, we also shouldn't group by suites, unless
|
# If not reordering, we also shouldn't group by suites, unless
|
||||||
# no test cases were named.
|
# no test cases were named.
|
||||||
# This also effects some logic in the loop following this.
|
# This also affects some logic in the loop following this.
|
||||||
if ($opt_reorder or !@$opt_cases)
|
if ($opt_reorder or !@$opt_cases)
|
||||||
{
|
{
|
||||||
foreach my $suite (split(",", $suites))
|
foreach my $suite (split(",", $suites))
|
||||||
{
|
{
|
||||||
push(@$cases, collect_one_suite($suite, $opt_cases));
|
push(@$cases, collect_suite_name($suite, $opt_cases));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,7 +138,7 @@ sub collect_test_cases ($$$$) {
|
||||||
$sname= "main" if !$opt_reorder and !$sname;
|
$sname= "main" if !$opt_reorder and !$sname;
|
||||||
mtr_error("Could not find '$tname' in '$suites' suite(s)") unless $sname;
|
mtr_error("Could not find '$tname' in '$suites' suite(s)") unless $sname;
|
||||||
# If suite was part of name, find it there, may come with combinations
|
# If suite was part of name, find it there, may come with combinations
|
||||||
my @this_case = collect_one_suite($sname, [ $test_name_spec ]);
|
my @this_case = collect_suite_name($sname, [ $test_name_spec ]);
|
||||||
if (@this_case)
|
if (@this_case)
|
||||||
{
|
{
|
||||||
push (@$cases, @this_case);
|
push (@$cases, @this_case);
|
||||||
|
@ -310,55 +312,74 @@ sub parse_disabled {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub collect_one_suite
|
#
|
||||||
|
# processes one user-specified suite name.
|
||||||
|
# it could contain wildcards, e.g engines/*
|
||||||
|
#
|
||||||
|
sub collect_suite_name
|
||||||
{
|
{
|
||||||
my $suitename= shift; # Test suite name
|
my $suitename= shift; # Test suite name
|
||||||
my $opt_cases= shift;
|
my $opt_cases= shift;
|
||||||
my $over;
|
my $over;
|
||||||
|
my %suites;
|
||||||
|
|
||||||
($suitename, $over) = split '-', $suitename;
|
($suitename, $over) = split '-', $suitename;
|
||||||
|
|
||||||
mtr_verbose("Collecting: $suitename");
|
|
||||||
|
|
||||||
my $suitedir= $::glob_mysql_test_dir; # Default
|
|
||||||
my @overlays = ();
|
|
||||||
if ( $suitename ne "main" )
|
if ( $suitename ne "main" )
|
||||||
{
|
{
|
||||||
# Allow suite to be path to "some dir" if $suitename has at least
|
# Allow suite to be path to "some dir" if $suitename has at least
|
||||||
# one directory part
|
# one directory part
|
||||||
if ( -d $suitename and splitdir($suitename) > 1 ){
|
if ( -d $suitename and splitdir($suitename) > 1 ) {
|
||||||
$suitedir= $suitename;
|
$suites{$suitename} = [ $suitename ];
|
||||||
mtr_report(" - from '$suitedir'");
|
mtr_report(" - from '$suitename'");
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@overlays = my_find_dir(dirname($::glob_mysql_test_dir),
|
my @dirs = my_find_dir(dirname($::glob_mysql_test_dir),
|
||||||
["mysql-test/suite",
|
["mysql-test/suite",
|
||||||
"storage/*/mysql-test",
|
"storage/*/mysql-test",
|
||||||
"plugin/*/mysql-test"],
|
"plugin/*/mysql-test"],
|
||||||
[$suitename]);
|
[$suitename]);
|
||||||
#
|
#
|
||||||
# XXX at the moment, for simplicity, we will not fully support one plugin
|
# if $suitename contained wildcards, we'll have many suites and
|
||||||
# overlaying a suite of another plugin. Only suites in the main
|
# their overlays here. Let's group them appropriately.
|
||||||
# mysql-test directory can be safely overlayed. To be fixed, when needed.
|
|
||||||
# To fix it we'll need a smarter overlay detection (that is, detection of
|
|
||||||
# what is an overlay and what is the "original" suite) than simply
|
|
||||||
# "prefer directories with more files".
|
|
||||||
#
|
#
|
||||||
|
for (@dirs) {
|
||||||
if ($overlays[0] !~ m@/mysql-test/suite/$suitename$@) {
|
m@^.*/mysql-test/(?:suite/)?(.*)$@ or confess $_;
|
||||||
# prefer directories with more files
|
push @{$suites{$1}}, $_;
|
||||||
@overlays = sort { scalar(<$a/*>) <=> scalar(<$b/*>) } @overlays;
|
|
||||||
}
|
}
|
||||||
$suitedir = shift @overlays;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@overlays = my_find_dir(dirname($::glob_mysql_test_dir),
|
$suites{$suitename} = [ $::glob_mysql_test_dir,
|
||||||
["storage/*/mysql-test",
|
my_find_dir(dirname($::glob_mysql_test_dir),
|
||||||
"plugin/*/mysql-test"],
|
["storage/*/mysql-test",
|
||||||
['main'], NOT_REQUIRED);
|
"plugin/*/mysql-test"],
|
||||||
|
['main'], NOT_REQUIRED) ];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my @cases;
|
||||||
|
while (my ($name, $dirs) = each %suites) {
|
||||||
|
#
|
||||||
|
# XXX at the moment, for simplicity, we will not fully support one
|
||||||
|
# plugin overlaying a suite of another plugin. Only suites in the main
|
||||||
|
# mysql-test directory can be safely overlayed. To be fixed, when
|
||||||
|
# needed. To fix it we'll need a smarter overlay detection (that is,
|
||||||
|
# detection of what is an overlay and what is the "original" suite)
|
||||||
|
# than simply "prefer directories with more files".
|
||||||
|
#
|
||||||
|
if ($dirs->[0] !~ m@/mysql-test/suite/$name$@) {
|
||||||
|
# prefer directories with more files
|
||||||
|
@$dirs = sort { scalar(<$a/*>) <=> scalar(<$b/*>) } @$dirs;
|
||||||
|
}
|
||||||
|
push @cases, collect_one_suite($opt_cases, $name, $over, @$dirs);
|
||||||
|
}
|
||||||
|
return @cases;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub collect_one_suite {
|
||||||
|
my ($opt_cases, $suitename, $over, $suitedir, @overlays) = @_;
|
||||||
|
|
||||||
|
mtr_verbose("Collecting: $suitename");
|
||||||
mtr_verbose("suitedir: $suitedir");
|
mtr_verbose("suitedir: $suitedir");
|
||||||
mtr_verbose("overlays: @overlays") if @overlays;
|
mtr_verbose("overlays: @overlays") if @overlays;
|
||||||
|
|
||||||
|
@ -380,7 +401,7 @@ sub collect_one_suite
|
||||||
local %file_combinations = ();
|
local %file_combinations = ();
|
||||||
local %file_in_overlay = ();
|
local %file_in_overlay = ();
|
||||||
|
|
||||||
die unless m@/(?:storage|plugin)/(\w+)/mysql-test/\w+$@;
|
confess $_ unless m@/(?:storage|plugin)/(\w+)/mysql-test/[\w/]*\w$@;
|
||||||
next unless defined $over and ($over eq '' or $over eq $1);
|
next unless defined $over and ($over eq '' or $over eq $1);
|
||||||
push @cases,
|
push @cases,
|
||||||
# don't add cases that take *all* data from the parent suite
|
# don't add cases that take *all* data from the parent suite
|
||||||
|
@ -396,7 +417,7 @@ sub process_suite {
|
||||||
|
|
||||||
if ($overname) {
|
if ($overname) {
|
||||||
$parent = $suites{$basename};
|
$parent = $suites{$basename};
|
||||||
die unless $parent;
|
confess unless $parent;
|
||||||
$suitename = $basename . '-' . $overname;
|
$suitename = $basename . '-' . $overname;
|
||||||
} else {
|
} else {
|
||||||
$suitename = $basename;
|
$suitename = $basename;
|
||||||
|
@ -544,7 +565,7 @@ sub make_combinations($@)
|
||||||
if ($combinations[0]->{skip}) {
|
if ($combinations[0]->{skip}) {
|
||||||
$test->{skip} = 1;
|
$test->{skip} = 1;
|
||||||
$test->{comment} = $combinations[0]->{skip} unless $test->{comment};
|
$test->{comment} = $combinations[0]->{skip} unless $test->{comment};
|
||||||
die unless @combinations == 1;
|
confess unless @combinations == 1;
|
||||||
return ($test);
|
return ($test);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,8 @@ BEGIN {
|
||||||
|
|
||||||
use lib "lib";
|
use lib "lib";
|
||||||
|
|
||||||
use Cwd;
|
use Cwd ;
|
||||||
|
use Cwd 'realpath';
|
||||||
use Getopt::Long;
|
use Getopt::Long;
|
||||||
use My::File::Path; # Patched version of File::Path
|
use My::File::Path; # Patched version of File::Path
|
||||||
use File::Basename;
|
use File::Basename;
|
||||||
|
@ -163,11 +164,14 @@ our $opt_vs_config = $ENV{'MTR_VS_CONFIG'};
|
||||||
|
|
||||||
my $DEFAULT_SUITES= join(',', map { "$_-" } qw(
|
my $DEFAULT_SUITES= join(',', map { "$_-" } qw(
|
||||||
main
|
main
|
||||||
|
archive
|
||||||
binlog
|
binlog
|
||||||
|
csv
|
||||||
federated
|
federated
|
||||||
funcs_1
|
funcs_1
|
||||||
funcs_2
|
funcs_2
|
||||||
handler
|
handler
|
||||||
|
heap
|
||||||
innodb
|
innodb
|
||||||
maria
|
maria
|
||||||
optimizer_unfixed_bugs
|
optimizer_unfixed_bugs
|
||||||
|
@ -226,7 +230,7 @@ my %opts_extern;
|
||||||
sub using_extern { return (keys %opts_extern > 0);};
|
sub using_extern { return (keys %opts_extern > 0);};
|
||||||
|
|
||||||
our $opt_fast= 0;
|
our $opt_fast= 0;
|
||||||
our $opt_force;
|
our $opt_force= 0;
|
||||||
our $opt_mem= $ENV{'MTR_MEM'};
|
our $opt_mem= $ENV{'MTR_MEM'};
|
||||||
our $opt_clean_vardir= $ENV{'MTR_CLEAN_VARDIR'};
|
our $opt_clean_vardir= $ENV{'MTR_CLEAN_VARDIR'};
|
||||||
|
|
||||||
|
@ -1037,8 +1041,14 @@ sub ignore_option {
|
||||||
# Setup any paths that are $opt_vardir related
|
# Setup any paths that are $opt_vardir related
|
||||||
sub set_vardir {
|
sub set_vardir {
|
||||||
my ($vardir)= @_;
|
my ($vardir)= @_;
|
||||||
|
if(IS_WINDOWS)
|
||||||
$opt_vardir= $vardir;
|
{
|
||||||
|
$opt_vardir= $vardir;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$opt_vardir= realpath($vardir);
|
||||||
|
}
|
||||||
|
|
||||||
$path_vardir_trace= $opt_vardir;
|
$path_vardir_trace= $opt_vardir;
|
||||||
# Chop off any "c:", DBUG likes a unix path ex: c:/src/... => /src/...
|
# Chop off any "c:", DBUG likes a unix path ex: c:/src/... => /src/...
|
||||||
|
@ -1126,7 +1136,7 @@ sub command_line_setup {
|
||||||
'defaults-extra-file=s' => \&collect_option,
|
'defaults-extra-file=s' => \&collect_option,
|
||||||
|
|
||||||
# Control what test suites or cases to run
|
# Control what test suites or cases to run
|
||||||
'force' => \$opt_force,
|
'force+' => \$opt_force,
|
||||||
'with-ndbcluster-only' => \&collect_option,
|
'with-ndbcluster-only' => \&collect_option,
|
||||||
'include-ndbcluster' => \$opt_include_ndbcluster,
|
'include-ndbcluster' => \$opt_include_ndbcluster,
|
||||||
'skip-ndbcluster|skip-ndb' => \$opt_skip_ndbcluster,
|
'skip-ndbcluster|skip-ndb' => \$opt_skip_ndbcluster,
|
||||||
|
@ -5846,6 +5856,11 @@ sub start_mysqltest ($) {
|
||||||
mtr_add_arg($args, "%s", $_) for @args_saved;
|
mtr_add_arg($args, "%s", $_) for @args_saved;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($opt_force > 1)
|
||||||
|
{
|
||||||
|
mtr_add_arg($args, "--continue-on-error");
|
||||||
|
}
|
||||||
|
|
||||||
my $suite = $tinfo->{suite};
|
my $suite = $tinfo->{suite};
|
||||||
if ($suite->{parent}) {
|
if ($suite->{parent}) {
|
||||||
mtr_add_arg($args, "--overlay-dir=%s/", $suite->{dir});
|
mtr_add_arg($args, "--overlay-dir=%s/", $suite->{dir});
|
||||||
|
@ -6275,7 +6290,11 @@ Options to control directories to use
|
||||||
|
|
||||||
Options to control what test suites or cases to run
|
Options to control what test suites or cases to run
|
||||||
|
|
||||||
force Continue to run the suite after failure
|
force Continue after a failure. When specified once, a
|
||||||
|
failure in a test file will abort this test file, and
|
||||||
|
the execution will continue from the next test file.
|
||||||
|
When specified twice, execution will continue executing
|
||||||
|
the failed test file from the next command.
|
||||||
with-ndbcluster-only Run only tests that include "ndb" in the filename
|
with-ndbcluster-only Run only tests that include "ndb" in the filename
|
||||||
skip-ndb[cluster] Skip all tests that need cluster. Default.
|
skip-ndb[cluster] Skip all tests that need cluster. Default.
|
||||||
include-ndb[cluster] Enable all tests that need cluster
|
include-ndb[cluster] Enable all tests that need cluster
|
||||||
|
|
10
mysql-test/r/aborted_clients.result
Normal file
10
mysql-test/r/aborted_clients.result
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
FLUSH STATUS;
|
||||||
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='aborted_clients';
|
||||||
|
VARIABLE_VALUE
|
||||||
|
0
|
||||||
|
KILL CONNECTION_ID();
|
||||||
|
ERROR 70100: Connection was killed
|
||||||
|
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME='aborted_clients';
|
||||||
|
VARIABLE_VALUE
|
||||||
|
1
|
||||||
|
FLUSH STATUS;
|
1
mysql-test/r/default_storage_engine.result
Normal file
1
mysql-test/r/default_storage_engine.result
Normal file
|
@ -0,0 +1 @@
|
||||||
|
"all ok"
|
|
@ -2044,6 +2044,59 @@ a
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
set optimizer_switch=@save968720_optimizer_switch;
|
set optimizer_switch=@save968720_optimizer_switch;
|
||||||
#
|
#
|
||||||
|
# LP BUG#978847 Server crashes in Item_ref::real_item on
|
||||||
|
# INSERT .. SELECT with FROM subquery and derived_merge=ON
|
||||||
|
SET @save978847_optimizer_switch=@@optimizer_switch;
|
||||||
|
SET optimizer_switch = 'derived_merge=on';
|
||||||
|
CREATE TABLE t1 ( a INT, b INT );
|
||||||
|
INSERT INTO t1 VALUES (2,1),(3,2);
|
||||||
|
select * from t1;
|
||||||
|
a b
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
INSERT INTO t1 SELECT * FROM
|
||||||
|
( SELECT * FROM t1 ) AS alias;
|
||||||
|
select * from t1;
|
||||||
|
a b
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
prepare stmt1 from 'INSERT INTO t1 SELECT SQL_BIG_RESULT * FROM
|
||||||
|
( SELECT * FROM t1 ) AS alias';
|
||||||
|
execute stmt1;
|
||||||
|
select * from t1;
|
||||||
|
a b
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
execute stmt1;
|
||||||
|
select * from t1;
|
||||||
|
a b
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
2 1
|
||||||
|
3 2
|
||||||
|
drop table t1;
|
||||||
|
set optimizer_switch=@save978847_optimizer_switch;
|
||||||
|
#
|
||||||
# end of 5.3 tests
|
# end of 5.3 tests
|
||||||
#
|
#
|
||||||
set optimizer_switch=@exit_optimizer_switch;
|
set optimizer_switch=@exit_optimizer_switch;
|
||||||
|
|
5
mysql-test/r/flush-innodb.result
Normal file
5
mysql-test/r/flush-innodb.result
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
FLUSH TABLES WITH READ LOCK AND DISABLE CHECKPOINT;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
CREATE TABLE t1 ( m MEDIUMTEXT ) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES ( REPEAT('i',1048576) );
|
||||||
|
DROP TABLE t1;
|
|
@ -434,3 +434,21 @@ ST_WITHIN( MULTIPOINTFROMTEXT(' MULTIPOINT( 2 9 , 2 9 , 4 9 , 9 1 ) ') , POLYGON
|
||||||
SELECT ST_INTERSECTS( GeomFromText('MULTILINESTRING( ( 4030 3045 , 3149 2461 , 3004 3831 , 3775 2976 ) )') , GeomFromText('LINESTRING(3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29,3039.07 3175.05,3039.07 3175.05,3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29)') );
|
SELECT ST_INTERSECTS( GeomFromText('MULTILINESTRING( ( 4030 3045 , 3149 2461 , 3004 3831 , 3775 2976 ) )') , GeomFromText('LINESTRING(3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29,3039.07 3175.05,3039.07 3175.05,3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29)') );
|
||||||
ST_INTERSECTS( GeomFromText('MULTILINESTRING( ( 4030 3045 , 3149 2461 , 3004 3831 , 3775 2976 ) )') , GeomFromText('LINESTRING(3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29,3039.07 3175.05,3039.07 3175.05,3058.41 3187.91,3081.52 3153.19,
|
ST_INTERSECTS( GeomFromText('MULTILINESTRING( ( 4030 3045 , 3149 2461 , 3004 3831 , 3775 2976 ) )') , GeomFromText('LINESTRING(3058.41 3187.91,3081.52 3153.19,3042.99 3127.57,3019.89 3162.29,3039.07 3175.05,3039.07 3175.05,3058.41 3187.91,3081.52 3153.19,
|
||||||
1
|
1
|
||||||
|
select ASTEXT(ST_BUFFER(ST_GEOMCOLLFROMTEXT(' GEOMETRYCOLLECTION(LINESTRING(100 100, 31 10, 77 80), POLYGON((0 0,4 7,1 1,0 0)), POINT(20 20))'), -3));
|
||||||
|
ASTEXT(ST_BUFFER(ST_GEOMCOLLFROMTEXT(' GEOMETRYCOLLECTION(LINESTRING(100 100, 31 10, 77 80), POLYGON((0 0,4 7,1 1,0 0)), POINT(20 20))'), -3))
|
||||||
|
POLYGON((3.999999999999999 6.999999999999998,4 7,3.999999999999999 6.999999999999998))
|
||||||
|
SELECT ST_NUMPOINTS(ST_EXTERIORRING(ST_BUFFER( POLYGONFROMTEXT( 'POLYGON( ( 0.0 -3.0,
|
||||||
|
-2.910427500435995 0.727606875108998,
|
||||||
|
-0.910427500435995 8.727606875108998,
|
||||||
|
7.664100588675687 1.503849116986468,
|
||||||
|
1.664100588675687 -2.496150883013531,
|
||||||
|
0.0 -3.0
|
||||||
|
))' ), 3 )));
|
||||||
|
ST_NUMPOINTS(ST_EXTERIORRING(ST_BUFFER( POLYGONFROMTEXT( 'POLYGON( ( 0.0 -3.0,
|
||||||
|
-2.910427500435995 0.727606875108998,
|
||||||
|
-0.910427500435995 8.727606875108998,
|
||||||
|
7.664100588675687 1.503849116986468,
|
||||||
|
1.664100588675687 -2.496150883013531,
|
||||||
|
0.0 -3.0
|
||||||
|
))' ),
|
||||||
|
136
|
||||||
|
|
|
@ -1976,6 +1976,53 @@ Warning 1292 Truncated incorrect DOUBLE value: 'g'
|
||||||
Warning 1292 Truncated incorrect DOUBLE value: 'v'
|
Warning 1292 Truncated incorrect DOUBLE value: 'v'
|
||||||
SET SESSION SQL_MODE=default;
|
SET SESSION SQL_MODE=default;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
|
# LP bug#967242 Wrong result (extra rows, not grouped) with JOIN, AND in ON condition, multi-part key, GROUP BY, OR in WHERE
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 ( a VARCHAR(1) ) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES ('x');
|
||||||
|
CREATE TABLE t2 ( b INT, c VARCHAR(1), KEY (c, b) ) ENGINE=MyISAM;
|
||||||
|
INSERT INTO t2 VALUES
|
||||||
|
(4, 'd'),(8, 'g'),(3, 'x'),(3, 'f'),
|
||||||
|
(0, 'p'),(3, 'j'),(8, 'c');
|
||||||
|
SELECT t2_1.b as zzz
|
||||||
|
FROM t1 JOIN t2 AS t2_1 JOIN t2 AS t2_2
|
||||||
|
ON (t2_2.b = t2_1.b ) AND (t2_2.c = t2_1.c )
|
||||||
|
WHERE
|
||||||
|
rand() + 1 > 0 OR
|
||||||
|
a = t2_1.c
|
||||||
|
GROUP BY zzz;
|
||||||
|
zzz
|
||||||
|
0
|
||||||
|
3
|
||||||
|
4
|
||||||
|
8
|
||||||
|
SELECT t2_1.b as zzz
|
||||||
|
FROM t1 JOIN t2 AS t2_1 JOIN t2 AS t2_2
|
||||||
|
ON (t2_2.b = t2_1.b ) AND (t2_2.c = t2_1.c )
|
||||||
|
WHERE
|
||||||
|
1 > 0 OR
|
||||||
|
a = t2_1.c
|
||||||
|
GROUP BY zzz;
|
||||||
|
zzz
|
||||||
|
0
|
||||||
|
3
|
||||||
|
4
|
||||||
|
8
|
||||||
|
SELECT t2_1.b as zzz
|
||||||
|
FROM t1 JOIN t2 AS t2_1 JOIN t2 AS t2_2
|
||||||
|
ON (t2_2.b = t2_1.b ) AND (t2_2.c = t2_1.c )
|
||||||
|
WHERE
|
||||||
|
t2_1.b + 1 > 0 OR
|
||||||
|
a = t2_1.c
|
||||||
|
GROUP BY zzz;
|
||||||
|
zzz
|
||||||
|
0
|
||||||
|
3
|
||||||
|
4
|
||||||
|
8
|
||||||
|
#TODO: in merge with 5.3 add original test suite
|
||||||
|
drop table t1, t2;
|
||||||
# End of 5.2 tests
|
# End of 5.2 tests
|
||||||
#
|
#
|
||||||
# lp:872702: Crash in add_ref_to_table_cond() when grouping by a PK
|
# lp:872702: Crash in add_ref_to_table_cond() when grouping by a PK
|
||||||
|
|
5
mysql-test/r/in_datetime_241.result
Normal file
5
mysql-test/r/in_datetime_241.result
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
CREATE TABLE t1 ( a DATE );
|
||||||
|
SELECT * FROM t1 WHERE ( SELECT a FROM t1 ) IN ('2012-04-25','2012-04-26');
|
||||||
|
a
|
||||||
|
DROP TABLE t1;
|
|
@ -13,9 +13,26 @@ FILES
|
||||||
GLOBAL_STATUS
|
GLOBAL_STATUS
|
||||||
GLOBAL_VARIABLES
|
GLOBAL_VARIABLES
|
||||||
INDEX_STATISTICS
|
INDEX_STATISTICS
|
||||||
|
INNODB_BUFFER_POOL_PAGES
|
||||||
|
INNODB_BUFFER_POOL_PAGES_BLOB
|
||||||
|
INNODB_BUFFER_POOL_PAGES_INDEX
|
||||||
|
INNODB_CMP
|
||||||
INNODB_CMPMEM
|
INNODB_CMPMEM
|
||||||
|
INNODB_CMPMEM_RESET
|
||||||
|
INNODB_CMP_RESET
|
||||||
|
INNODB_INDEX_STATS
|
||||||
INNODB_LOCKS
|
INNODB_LOCKS
|
||||||
|
INNODB_LOCK_WAITS
|
||||||
|
INNODB_RSEG
|
||||||
|
INNODB_SYS_COLUMNS
|
||||||
|
INNODB_SYS_FIELDS
|
||||||
|
INNODB_SYS_FOREIGN
|
||||||
|
INNODB_SYS_FOREIGN_COLS
|
||||||
INNODB_SYS_INDEXES
|
INNODB_SYS_INDEXES
|
||||||
|
INNODB_SYS_STATS
|
||||||
|
INNODB_SYS_TABLES
|
||||||
|
INNODB_SYS_TABLESTATS
|
||||||
|
INNODB_TABLE_STATS
|
||||||
INNODB_TRX
|
INNODB_TRX
|
||||||
KEY_CACHES
|
KEY_CACHES
|
||||||
KEY_COLUMN_USAGE
|
KEY_COLUMN_USAGE
|
||||||
|
@ -68,9 +85,26 @@ FILES TABLE_SCHEMA
|
||||||
GLOBAL_STATUS VARIABLE_NAME
|
GLOBAL_STATUS VARIABLE_NAME
|
||||||
GLOBAL_VARIABLES VARIABLE_NAME
|
GLOBAL_VARIABLES VARIABLE_NAME
|
||||||
INDEX_STATISTICS TABLE_SCHEMA
|
INDEX_STATISTICS TABLE_SCHEMA
|
||||||
|
INNODB_BUFFER_POOL_PAGES page_type
|
||||||
|
INNODB_BUFFER_POOL_PAGES_BLOB space_id
|
||||||
|
INNODB_BUFFER_POOL_PAGES_INDEX index_id
|
||||||
|
INNODB_CMP page_size
|
||||||
INNODB_CMPMEM page_size
|
INNODB_CMPMEM page_size
|
||||||
|
INNODB_CMPMEM_RESET page_size
|
||||||
|
INNODB_CMP_RESET page_size
|
||||||
|
INNODB_INDEX_STATS table_schema
|
||||||
INNODB_LOCKS lock_id
|
INNODB_LOCKS lock_id
|
||||||
|
INNODB_LOCK_WAITS requesting_trx_id
|
||||||
|
INNODB_RSEG rseg_id
|
||||||
|
INNODB_SYS_COLUMNS TABLE_ID
|
||||||
|
INNODB_SYS_FIELDS INDEX_ID
|
||||||
|
INNODB_SYS_FOREIGN ID
|
||||||
|
INNODB_SYS_FOREIGN_COLS ID
|
||||||
INNODB_SYS_INDEXES INDEX_ID
|
INNODB_SYS_INDEXES INDEX_ID
|
||||||
|
INNODB_SYS_STATS INDEX_ID
|
||||||
|
INNODB_SYS_TABLES SCHEMA
|
||||||
|
INNODB_SYS_TABLESTATS SCHEMA
|
||||||
|
INNODB_TABLE_STATS table_schema
|
||||||
INNODB_TRX trx_id
|
INNODB_TRX trx_id
|
||||||
KEY_CACHES KEY_CACHE_NAME
|
KEY_CACHES KEY_CACHE_NAME
|
||||||
KEY_COLUMN_USAGE CONSTRAINT_SCHEMA
|
KEY_COLUMN_USAGE CONSTRAINT_SCHEMA
|
||||||
|
@ -123,9 +157,26 @@ FILES TABLE_SCHEMA
|
||||||
GLOBAL_STATUS VARIABLE_NAME
|
GLOBAL_STATUS VARIABLE_NAME
|
||||||
GLOBAL_VARIABLES VARIABLE_NAME
|
GLOBAL_VARIABLES VARIABLE_NAME
|
||||||
INDEX_STATISTICS TABLE_SCHEMA
|
INDEX_STATISTICS TABLE_SCHEMA
|
||||||
|
INNODB_BUFFER_POOL_PAGES page_type
|
||||||
|
INNODB_BUFFER_POOL_PAGES_BLOB space_id
|
||||||
|
INNODB_BUFFER_POOL_PAGES_INDEX index_id
|
||||||
|
INNODB_CMP page_size
|
||||||
INNODB_CMPMEM page_size
|
INNODB_CMPMEM page_size
|
||||||
|
INNODB_CMPMEM_RESET page_size
|
||||||
|
INNODB_CMP_RESET page_size
|
||||||
|
INNODB_INDEX_STATS table_schema
|
||||||
INNODB_LOCKS lock_id
|
INNODB_LOCKS lock_id
|
||||||
|
INNODB_LOCK_WAITS requesting_trx_id
|
||||||
|
INNODB_RSEG rseg_id
|
||||||
|
INNODB_SYS_COLUMNS TABLE_ID
|
||||||
|
INNODB_SYS_FIELDS INDEX_ID
|
||||||
|
INNODB_SYS_FOREIGN ID
|
||||||
|
INNODB_SYS_FOREIGN_COLS ID
|
||||||
INNODB_SYS_INDEXES INDEX_ID
|
INNODB_SYS_INDEXES INDEX_ID
|
||||||
|
INNODB_SYS_STATS INDEX_ID
|
||||||
|
INNODB_SYS_TABLES SCHEMA
|
||||||
|
INNODB_SYS_TABLESTATS SCHEMA
|
||||||
|
INNODB_TABLE_STATS table_schema
|
||||||
INNODB_TRX trx_id
|
INNODB_TRX trx_id
|
||||||
KEY_CACHES KEY_CACHE_NAME
|
KEY_CACHES KEY_CACHE_NAME
|
||||||
KEY_COLUMN_USAGE CONSTRAINT_SCHEMA
|
KEY_COLUMN_USAGE CONSTRAINT_SCHEMA
|
||||||
|
@ -184,9 +235,26 @@ FILES information_schema.FILES 1
|
||||||
GLOBAL_STATUS information_schema.GLOBAL_STATUS 1
|
GLOBAL_STATUS information_schema.GLOBAL_STATUS 1
|
||||||
GLOBAL_VARIABLES information_schema.GLOBAL_VARIABLES 1
|
GLOBAL_VARIABLES information_schema.GLOBAL_VARIABLES 1
|
||||||
INDEX_STATISTICS information_schema.INDEX_STATISTICS 1
|
INDEX_STATISTICS information_schema.INDEX_STATISTICS 1
|
||||||
|
INNODB_BUFFER_POOL_PAGES information_schema.INNODB_BUFFER_POOL_PAGES 1
|
||||||
|
INNODB_BUFFER_POOL_PAGES_BLOB information_schema.INNODB_BUFFER_POOL_PAGES_BLOB 1
|
||||||
|
INNODB_BUFFER_POOL_PAGES_INDEX information_schema.INNODB_BUFFER_POOL_PAGES_INDEX 1
|
||||||
|
INNODB_CMP information_schema.INNODB_CMP 1
|
||||||
INNODB_CMPMEM information_schema.INNODB_CMPMEM 1
|
INNODB_CMPMEM information_schema.INNODB_CMPMEM 1
|
||||||
|
INNODB_CMPMEM_RESET information_schema.INNODB_CMPMEM_RESET 1
|
||||||
|
INNODB_CMP_RESET information_schema.INNODB_CMP_RESET 1
|
||||||
|
INNODB_INDEX_STATS information_schema.INNODB_INDEX_STATS 1
|
||||||
INNODB_LOCKS information_schema.INNODB_LOCKS 1
|
INNODB_LOCKS information_schema.INNODB_LOCKS 1
|
||||||
|
INNODB_LOCK_WAITS information_schema.INNODB_LOCK_WAITS 1
|
||||||
|
INNODB_RSEG information_schema.INNODB_RSEG 1
|
||||||
|
INNODB_SYS_COLUMNS information_schema.INNODB_SYS_COLUMNS 1
|
||||||
|
INNODB_SYS_FIELDS information_schema.INNODB_SYS_FIELDS 1
|
||||||
|
INNODB_SYS_FOREIGN information_schema.INNODB_SYS_FOREIGN 1
|
||||||
|
INNODB_SYS_FOREIGN_COLS information_schema.INNODB_SYS_FOREIGN_COLS 1
|
||||||
INNODB_SYS_INDEXES information_schema.INNODB_SYS_INDEXES 1
|
INNODB_SYS_INDEXES information_schema.INNODB_SYS_INDEXES 1
|
||||||
|
INNODB_SYS_STATS information_schema.INNODB_SYS_STATS 1
|
||||||
|
INNODB_SYS_TABLES information_schema.INNODB_SYS_TABLES 1
|
||||||
|
INNODB_SYS_TABLESTATS information_schema.INNODB_SYS_TABLESTATS 1
|
||||||
|
INNODB_TABLE_STATS information_schema.INNODB_TABLE_STATS 1
|
||||||
INNODB_TRX information_schema.INNODB_TRX 1
|
INNODB_TRX information_schema.INNODB_TRX 1
|
||||||
KEY_CACHES information_schema.KEY_CACHES 1
|
KEY_CACHES information_schema.KEY_CACHES 1
|
||||||
KEY_COLUMN_USAGE information_schema.KEY_COLUMN_USAGE 1
|
KEY_COLUMN_USAGE information_schema.KEY_COLUMN_USAGE 1
|
||||||
|
@ -228,9 +296,26 @@ Database: information_schema
|
||||||
| GLOBAL_STATUS |
|
| GLOBAL_STATUS |
|
||||||
| GLOBAL_VARIABLES |
|
| GLOBAL_VARIABLES |
|
||||||
| INDEX_STATISTICS |
|
| INDEX_STATISTICS |
|
||||||
|
| INNODB_BUFFER_POOL_PAGES |
|
||||||
|
| INNODB_BUFFER_POOL_PAGES_BLOB |
|
||||||
|
| INNODB_BUFFER_POOL_PAGES_INDEX |
|
||||||
|
| INNODB_CMP |
|
||||||
| INNODB_CMPMEM |
|
| INNODB_CMPMEM |
|
||||||
|
| INNODB_CMPMEM_RESET |
|
||||||
|
| INNODB_CMP_RESET |
|
||||||
|
| INNODB_INDEX_STATS |
|
||||||
| INNODB_LOCKS |
|
| INNODB_LOCKS |
|
||||||
|
| INNODB_LOCK_WAITS |
|
||||||
|
| INNODB_RSEG |
|
||||||
|
| INNODB_SYS_COLUMNS |
|
||||||
|
| INNODB_SYS_FIELDS |
|
||||||
|
| INNODB_SYS_FOREIGN |
|
||||||
|
| INNODB_SYS_FOREIGN_COLS |
|
||||||
| INNODB_SYS_INDEXES |
|
| INNODB_SYS_INDEXES |
|
||||||
|
| INNODB_SYS_STATS |
|
||||||
|
| INNODB_SYS_TABLES |
|
||||||
|
| INNODB_SYS_TABLESTATS |
|
||||||
|
| INNODB_TABLE_STATS |
|
||||||
| INNODB_TRX |
|
| INNODB_TRX |
|
||||||
| KEY_CACHES |
|
| KEY_CACHES |
|
||||||
| KEY_COLUMN_USAGE |
|
| KEY_COLUMN_USAGE |
|
||||||
|
@ -273,9 +358,26 @@ Database: INFORMATION_SCHEMA
|
||||||
| GLOBAL_STATUS |
|
| GLOBAL_STATUS |
|
||||||
| GLOBAL_VARIABLES |
|
| GLOBAL_VARIABLES |
|
||||||
| INDEX_STATISTICS |
|
| INDEX_STATISTICS |
|
||||||
|
| INNODB_BUFFER_POOL_PAGES |
|
||||||
|
| INNODB_BUFFER_POOL_PAGES_BLOB |
|
||||||
|
| INNODB_BUFFER_POOL_PAGES_INDEX |
|
||||||
|
| INNODB_CMP |
|
||||||
| INNODB_CMPMEM |
|
| INNODB_CMPMEM |
|
||||||
|
| INNODB_CMPMEM_RESET |
|
||||||
|
| INNODB_CMP_RESET |
|
||||||
|
| INNODB_INDEX_STATS |
|
||||||
| INNODB_LOCKS |
|
| INNODB_LOCKS |
|
||||||
|
| INNODB_LOCK_WAITS |
|
||||||
|
| INNODB_RSEG |
|
||||||
|
| INNODB_SYS_COLUMNS |
|
||||||
|
| INNODB_SYS_FIELDS |
|
||||||
|
| INNODB_SYS_FOREIGN |
|
||||||
|
| INNODB_SYS_FOREIGN_COLS |
|
||||||
| INNODB_SYS_INDEXES |
|
| INNODB_SYS_INDEXES |
|
||||||
|
| INNODB_SYS_STATS |
|
||||||
|
| INNODB_SYS_TABLES |
|
||||||
|
| INNODB_SYS_TABLESTATS |
|
||||||
|
| INNODB_TABLE_STATS |
|
||||||
| INNODB_TRX |
|
| INNODB_TRX |
|
||||||
| KEY_CACHES |
|
| KEY_CACHES |
|
||||||
| KEY_COLUMN_USAGE |
|
| KEY_COLUMN_USAGE |
|
||||||
|
@ -309,5 +411,5 @@ Wildcard: inf_rmation_schema
|
||||||
| information_schema |
|
| information_schema |
|
||||||
SELECT table_schema, count(*) FROM information_schema.TABLES WHERE table_schema IN ('mysql', 'INFORMATION_SCHEMA', 'test', 'mysqltest') AND table_name<>'ndb_binlog_index' AND table_name<>'ndb_apply_status' GROUP BY TABLE_SCHEMA;
|
SELECT table_schema, count(*) FROM information_schema.TABLES WHERE table_schema IN ('mysql', 'INFORMATION_SCHEMA', 'test', 'mysqltest') AND table_name<>'ndb_binlog_index' AND table_name<>'ndb_apply_status' GROUP BY TABLE_SCHEMA;
|
||||||
table_schema count(*)
|
table_schema count(*)
|
||||||
information_schema 40
|
information_schema 57
|
||||||
mysql 26
|
mysql 26
|
||||||
|
|
|
@ -31,18 +31,18 @@
|
||||||
4 4
|
4 4
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
-Handler_icp_attempts 2
|
-Handler_icp_attempts 2
|
||||||
-Handler_icp_match 1
|
-Handler_icp_match 1
|
||||||
+Handler_icp_attempts 0
|
+Handler_icp_attempts 0
|
||||||
+Handler_icp_match 0
|
+Handler_icp_match 0
|
||||||
SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ;
|
SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ;
|
||||||
c1 c2
|
c1 c2
|
||||||
4 4
|
4 4
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
-Handler_icp_attempts 2
|
-Handler_icp_attempts 2
|
||||||
-Handler_icp_match 1
|
-Handler_icp_match 1
|
||||||
+Handler_icp_attempts 0
|
+Handler_icp_attempts 0
|
||||||
+Handler_icp_match 0
|
+Handler_icp_match 0
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
|
|
|
@ -818,21 +818,21 @@ INSERT INTO t1 VALUES ('3', '3'),('4','4'),('5','5');
|
||||||
flush status;
|
flush status;
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_icp_attempts 0
|
Handler_icp_attempts 0
|
||||||
Handler_icp_match 0
|
Handler_icp_match 0
|
||||||
SELECT * FROM t1 FORCE INDEX(c1) WHERE (c1='3' or c1='4') and c1 % 2 = 0 ;
|
SELECT * FROM t1 FORCE INDEX(c1) WHERE (c1='3' or c1='4') and c1 % 2 = 0 ;
|
||||||
c1 c2
|
c1 c2
|
||||||
4 4
|
4 4
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_icp_attempts 2
|
Handler_icp_attempts 2
|
||||||
Handler_icp_match 1
|
Handler_icp_match 1
|
||||||
SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ;
|
SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ;
|
||||||
c1 c2
|
c1 c2
|
||||||
4 4
|
4 4
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_icp_attempts 2
|
Handler_icp_attempts 2
|
||||||
Handler_icp_match 1
|
Handler_icp_match 1
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
|
|
|
@ -3221,7 +3221,7 @@ explain
|
||||||
select t1.a, count(t2.p) as count
|
select t1.a, count(t2.p) as count
|
||||||
from t1 left join t2 on t1.a=t2.a and t2.p % 2 = 1 group by t1.a;
|
from t1 left join t2 on t1.a=t2.a and t2.p % 2 = 1 group by t1.a;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 8 Using temporary; Using filesort
|
1 SIMPLE t1 index NULL PRIMARY 4 NULL 8 Using index; Using temporary; Using filesort
|
||||||
1 SIMPLE t2 ref i_a i_a 5 test.t1.a 2 Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
|
1 SIMPLE t2 ref i_a i_a 5 test.t1.a 2 Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
|
||||||
select t1.a, count(t2.p) as count
|
select t1.a, count(t2.p) as count
|
||||||
from t1 left join t2 on t1.a=t2.a and t2.p % 2 = 1 group by t1.a;
|
from t1 left join t2 on t1.a=t2.a and t2.p % 2 = 1 group by t1.a;
|
||||||
|
@ -3522,7 +3522,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
|
1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_icp_attempts 20
|
Handler_icp_attempts 20
|
||||||
Handler_icp_match 4
|
Handler_icp_match 4
|
||||||
set join_cache_level=6;
|
set join_cache_level=6;
|
||||||
select t2.f1, t2.f2, t2.f3 from t1,t2
|
select t2.f1, t2.f2, t2.f3 from t1,t2
|
||||||
|
@ -3539,7 +3539,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
|
1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_icp_attempts 40
|
Handler_icp_attempts 40
|
||||||
Handler_icp_match 8
|
Handler_icp_match 8
|
||||||
set join_cache_level=7;
|
set join_cache_level=7;
|
||||||
select t2.f1, t2.f2, t2.f3 from t1,t2
|
select t2.f1, t2.f2, t2.f3 from t1,t2
|
||||||
|
@ -3556,7 +3556,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan
|
1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_icp_attempts 60
|
Handler_icp_attempts 60
|
||||||
Handler_icp_match 12
|
Handler_icp_match 12
|
||||||
set join_cache_level=8;
|
set join_cache_level=8;
|
||||||
select t2.f1, t2.f2, t2.f3 from t1,t2
|
select t2.f1, t2.f2, t2.f3 from t1,t2
|
||||||
|
@ -3573,7 +3573,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan
|
1 SIMPLE t2 ref f1 f1 4 test.t1.f1 3 Using index condition(BKA); Using where; Using join buffer (flat, BKAH join); Key-ordered Rowid-ordered scan
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_icp_attempts 80
|
Handler_icp_attempts 80
|
||||||
Handler_icp_match 16
|
Handler_icp_match 16
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
set join_cache_level=default;
|
set join_cache_level=default;
|
||||||
|
@ -4274,7 +4274,7 @@ pk int NOT NULL, i int NOT NULL, v varchar(1) NOT NULL,
|
||||||
PRIMARY KEY (pk), INDEX idx1(i), INDEX idx2 (v,i)
|
PRIMARY KEY (pk), INDEX idx1(i), INDEX idx2 (v,i)
|
||||||
) COLLATE latin1_bin;
|
) COLLATE latin1_bin;
|
||||||
INSERT INTO t1 VALUES
|
INSERT INTO t1 VALUES
|
||||||
(10,8,'v'), (11,8,'f'), (12,5,'v'), (13,8,'s'), (14,8,'a'),
|
(10,8,'v'), (11,8,'f'), (13,8,'s'), (14,8,'a'),
|
||||||
(15,6,'p'), (16,7,'z'), (17,2,'a'), (18,5,'h'), (19,7,'h'),
|
(15,6,'p'), (16,7,'z'), (17,2,'a'), (18,5,'h'), (19,7,'h'),
|
||||||
(25,3,'m'), (26,5,'a'), (27,9,'n'), (28,1,'d'), (29,107,'a');
|
(25,3,'m'), (26,5,'a'), (27,9,'n'), (28,1,'d'), (29,107,'a');
|
||||||
INSERT INTO t1 VALUES
|
INSERT INTO t1 VALUES
|
||||||
|
@ -4327,7 +4327,7 @@ SELECT t2.v FROM t1, t2, t3
|
||||||
WHERE t3.v <> t2.v AND t3.pk = t2.i AND t1.v = t3.v AND t1.pk*2<100
|
WHERE t3.v <> t2.v AND t3.pk = t2.i AND t1.v = t3.v AND t1.pk*2<100
|
||||||
GROUP BY t2.v ORDER BY t1.pk,t2.v;
|
GROUP BY t2.v ORDER BY t1.pk,t2.v;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ALL idx1 NULL NULL NULL 20 Using temporary; Using filesort
|
1 SIMPLE t2 index idx1 idx2 7 NULL 20 Using index; Using temporary; Using filesort
|
||||||
1 SIMPLE t3 eq_ref PRIMARY,idx2 PRIMARY 4 test.t2.i 1 Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
|
1 SIMPLE t3 eq_ref PRIMARY,idx2 PRIMARY 4 test.t2.i 1 Using where; Using join buffer (flat, BKA join); Key-ordered Rowid-ordered scan
|
||||||
1 SIMPLE t1 ref idx2 idx2 3 test.t3.v 5 Using where; Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan
|
1 SIMPLE t1 ref idx2 idx2 3 test.t3.v 5 Using where; Using join buffer (incremental, BKA join); Key-ordered Rowid-ordered scan
|
||||||
SELECT t2.v FROM t1, t2, t3
|
SELECT t2.v FROM t1, t2, t3
|
||||||
|
@ -4345,9 +4345,9 @@ SELECT t2.v FROM t1, t2, t3
|
||||||
WHERE t3.v <> t2.v AND t3.pk = t2.i AND t1.v = t3.v AND t1.pk*2<100
|
WHERE t3.v <> t2.v AND t3.pk = t2.i AND t1.v = t3.v AND t1.pk*2<100
|
||||||
GROUP BY t2.v ORDER BY t1.pk,t2.v;
|
GROUP BY t2.v ORDER BY t1.pk,t2.v;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t2 ALL idx1 NULL NULL NULL 20 Using temporary; Using filesort
|
1 SIMPLE t2 index idx1 idx2 7 NULL 20 Using index; Using temporary; Using filesort
|
||||||
1 SIMPLE t3 hash_ALL PRIMARY,idx2 #hash#PRIMARY 4 test.t2.i 20 Using where; Using join buffer (flat, BNLH join)
|
1 SIMPLE t3 hash_ALL PRIMARY,idx2 #hash#PRIMARY 4 test.t2.i 20 Using where; Using join buffer (flat, BNLH join)
|
||||||
1 SIMPLE t1 hash_ALL idx2 #hash#idx2 3 test.t3.v 45 Using where; Using join buffer (incremental, BNLH join)
|
1 SIMPLE t1 hash_ALL idx2 #hash#idx2 3 test.t3.v 44 Using where; Using join buffer (incremental, BNLH join)
|
||||||
SELECT t2.v FROM t1, t2, t3
|
SELECT t2.v FROM t1, t2, t3
|
||||||
WHERE t3.v <> t2.v AND t3.pk = t2.i AND t1.v = t3.v AND t1.pk*2<100
|
WHERE t3.v <> t2.v AND t3.pk = t2.i AND t1.v = t3.v AND t1.pk*2<100
|
||||||
GROUP BY t2.v ORDER BY t1.pk,t2.v;
|
GROUP BY t2.v ORDER BY t1.pk,t2.v;
|
||||||
|
|
|
@ -822,21 +822,21 @@ INSERT INTO t1 VALUES ('3', '3'),('4','4'),('5','5');
|
||||||
flush status;
|
flush status;
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_icp_attempts 0
|
Handler_icp_attempts 0
|
||||||
Handler_icp_match 0
|
Handler_icp_match 0
|
||||||
SELECT * FROM t1 FORCE INDEX(c1) WHERE (c1='3' or c1='4') and c1 % 2 = 0 ;
|
SELECT * FROM t1 FORCE INDEX(c1) WHERE (c1='3' or c1='4') and c1 % 2 = 0 ;
|
||||||
c1 c2
|
c1 c2
|
||||||
4 4
|
4 4
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_icp_attempts 2
|
Handler_icp_attempts 2
|
||||||
Handler_icp_match 1
|
Handler_icp_match 1
|
||||||
SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ;
|
SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ;
|
||||||
c1 c2
|
c1 c2
|
||||||
4 4
|
4 4
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_icp_attempts 2
|
Handler_icp_attempts 2
|
||||||
Handler_icp_match 1
|
Handler_icp_match 1
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
drop table if exists t0, t1, t1i, t1m;
|
drop table if exists t0, t1, t1i, t1m;
|
||||||
|
|
7
mysql-test/r/mysqltest_cont_on_error.result
Normal file
7
mysql-test/r/mysqltest_cont_on_error.result
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
select error;
|
||||||
|
mysqltest: At line 1: query 'select error' failed: 1054: Unknown column 'error' in 'field list'
|
||||||
|
SELECT ERROR;
|
||||||
|
mysqltest: At line 1: query 'SELECT ERROR' failed: 1054: Unknown column 'ERROR' in 'field list'
|
||||||
|
SELECT 2;
|
||||||
|
2
|
||||||
|
2
|
10
mysql-test/r/plugin_loaderr.result
Normal file
10
mysql-test/r/plugin_loaderr.result
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
call mtr.add_suppression("InnoDB");
|
||||||
|
SELECT
|
||||||
|
PLUGIN_NAME,PLUGIN_STATUS,PLUGIN_TYPE,PLUGIN_LIBRARY,PLUGIN_LIBRARY_VERSION,LOAD_OPTION
|
||||||
|
FROM INFORMATION_SCHEMA.PLUGINS WHERE plugin_name = 'innodb';
|
||||||
|
PLUGIN_NAME InnoDB
|
||||||
|
PLUGIN_STATUS DISABLED
|
||||||
|
PLUGIN_TYPE STORAGE ENGINE
|
||||||
|
PLUGIN_LIBRARY NULL
|
||||||
|
PLUGIN_LIBRARY_VERSION NULL
|
||||||
|
LOAD_OPTION ON
|
11
mysql-test/r/progress_976225.result
Normal file
11
mysql-test/r/progress_976225.result
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t2 (b INT) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES (1),(2);
|
||||||
|
INSERT INTO t2 VALUES (3),(4);
|
||||||
|
OPTIMIZE TABLE t1, t2;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
|
||||||
|
test.t1 optimize status OK
|
||||||
|
test.t2 optimize note Table does not support optimize, doing recreate + analyze instead
|
||||||
|
test.t2 optimize status OK
|
||||||
|
drop table t1, t2;
|
|
@ -442,9 +442,11 @@ show global variables like "query_cache_min_res_unit";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
query_cache_min_res_unit 4096
|
query_cache_min_res_unit 4096
|
||||||
set GLOBAL query_cache_min_res_unit=1001;
|
set GLOBAL query_cache_min_res_unit=1001;
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect query_cache_min_res_unit value: '1001'
|
||||||
show global variables like "query_cache_min_res_unit";
|
show global variables like "query_cache_min_res_unit";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
query_cache_min_res_unit 1008
|
query_cache_min_res_unit 1000
|
||||||
create table t1 (a int not null);
|
create table t1 (a int not null);
|
||||||
insert into t1 values (1),(2),(3);
|
insert into t1 values (1),(2),(3);
|
||||||
create table t2 (a int not null);
|
create table t2 (a int not null);
|
||||||
|
|
|
@ -275,7 +275,7 @@ Variable_name Value
|
||||||
Handler_commit 0
|
Handler_commit 0
|
||||||
Handler_delete 0
|
Handler_delete 0
|
||||||
Handler_discover 0
|
Handler_discover 0
|
||||||
Handler_icp_attempts 0
|
Handler_icp_attempts 0
|
||||||
Handler_icp_match 0
|
Handler_icp_match 0
|
||||||
Handler_mrr_init 0
|
Handler_mrr_init 0
|
||||||
Handler_mrr_key_refills 0
|
Handler_mrr_key_refills 0
|
||||||
|
@ -316,7 +316,7 @@ Variable_name Value
|
||||||
Handler_commit 0
|
Handler_commit 0
|
||||||
Handler_delete 0
|
Handler_delete 0
|
||||||
Handler_discover 0
|
Handler_discover 0
|
||||||
Handler_icp_attempts 0
|
Handler_icp_attempts 0
|
||||||
Handler_icp_match 0
|
Handler_icp_match 0
|
||||||
Handler_mrr_init 0
|
Handler_mrr_init 0
|
||||||
Handler_mrr_key_refills 0
|
Handler_mrr_key_refills 0
|
||||||
|
|
|
@ -100,7 +100,7 @@ Variable_name Value
|
||||||
Handler_commit 19
|
Handler_commit 19
|
||||||
Handler_delete 1
|
Handler_delete 1
|
||||||
Handler_discover 0
|
Handler_discover 0
|
||||||
Handler_icp_attempts 0
|
Handler_icp_attempts 0
|
||||||
Handler_icp_match 0
|
Handler_icp_match 0
|
||||||
Handler_mrr_init 0
|
Handler_mrr_init 0
|
||||||
Handler_mrr_key_refills 0
|
Handler_mrr_key_refills 0
|
||||||
|
|
|
@ -4585,7 +4585,7 @@ SELECT MAX(b), (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||||
FROM t1
|
FROM t1
|
||||||
WHERE a = 230;
|
WHERE a = 230;
|
||||||
MAX(b) (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
MAX(b) (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||||
NULL 0
|
NULL NULL
|
||||||
DROP TABLE t1, st1, st2;
|
DROP TABLE t1, st1, st2;
|
||||||
#
|
#
|
||||||
# Bug #48709: Assertion failed in sql_select.cc:11782:
|
# Bug #48709: Assertion failed in sql_select.cc:11782:
|
||||||
|
@ -6521,5 +6521,46 @@ INSERT INTO t1 VALUES (1);
|
||||||
SELECT a FROM t1 WHERE ( SELECT MIN(a) = 100 );
|
SELECT a FROM t1 WHERE ( SELECT MIN(a) = 100 );
|
||||||
a
|
a
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
|
# LP BUG#985667 Wrong result with subquery in SELECT clause, and constant table in
|
||||||
|
# main query and implicit grouping
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (f1 int) engine=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES (7),(8);
|
||||||
|
CREATE TABLE t2 (f2 int, f3 varchar(1)) engine=MyISAM;
|
||||||
|
INSERT INTO t2 VALUES (3,'f');
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), (SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
SELECT COUNT(f1), (SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 NULL
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), exists(SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
SELECT COUNT(f1), exists(SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 0
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), f2 > ALL (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
SELECT COUNT(f1), f2 > ALL (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 1
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 0
|
||||||
|
drop table t1,t2;
|
||||||
# return optimizer switch changed in the beginning of this test
|
# return optimizer switch changed in the beginning of this test
|
||||||
set optimizer_switch=@subselect_tmp;
|
set optimizer_switch=@subselect_tmp;
|
||||||
|
|
|
@ -4587,7 +4587,7 @@ SELECT MAX(b), (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||||
FROM t1
|
FROM t1
|
||||||
WHERE a = 230;
|
WHERE a = 230;
|
||||||
MAX(b) (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
MAX(b) (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||||
NULL 0
|
NULL NULL
|
||||||
DROP TABLE t1, st1, st2;
|
DROP TABLE t1, st1, st2;
|
||||||
#
|
#
|
||||||
# Bug #48709: Assertion failed in sql_select.cc:11782:
|
# Bug #48709: Assertion failed in sql_select.cc:11782:
|
||||||
|
@ -6520,6 +6520,47 @@ INSERT INTO t1 VALUES (1);
|
||||||
SELECT a FROM t1 WHERE ( SELECT MIN(a) = 100 );
|
SELECT a FROM t1 WHERE ( SELECT MIN(a) = 100 );
|
||||||
a
|
a
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
|
# LP BUG#985667 Wrong result with subquery in SELECT clause, and constant table in
|
||||||
|
# main query and implicit grouping
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (f1 int) engine=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES (7),(8);
|
||||||
|
CREATE TABLE t2 (f2 int, f3 varchar(1)) engine=MyISAM;
|
||||||
|
INSERT INTO t2 VALUES (3,'f');
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), (SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
SELECT COUNT(f1), (SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 NULL
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), exists(SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
SELECT COUNT(f1), exists(SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 0
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), f2 > ALL (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
SELECT COUNT(f1), f2 > ALL (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 1
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 0
|
||||||
|
drop table t1,t2;
|
||||||
# return optimizer switch changed in the beginning of this test
|
# return optimizer switch changed in the beginning of this test
|
||||||
set optimizer_switch=@subselect_tmp;
|
set optimizer_switch=@subselect_tmp;
|
||||||
set optimizer_switch=default;
|
set optimizer_switch=default;
|
||||||
|
|
|
@ -4583,7 +4583,7 @@ SELECT MAX(b), (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||||
FROM t1
|
FROM t1
|
||||||
WHERE a = 230;
|
WHERE a = 230;
|
||||||
MAX(b) (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
MAX(b) (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||||
NULL 0
|
NULL NULL
|
||||||
DROP TABLE t1, st1, st2;
|
DROP TABLE t1, st1, st2;
|
||||||
#
|
#
|
||||||
# Bug #48709: Assertion failed in sql_select.cc:11782:
|
# Bug #48709: Assertion failed in sql_select.cc:11782:
|
||||||
|
@ -6516,6 +6516,47 @@ INSERT INTO t1 VALUES (1);
|
||||||
SELECT a FROM t1 WHERE ( SELECT MIN(a) = 100 );
|
SELECT a FROM t1 WHERE ( SELECT MIN(a) = 100 );
|
||||||
a
|
a
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
|
# LP BUG#985667 Wrong result with subquery in SELECT clause, and constant table in
|
||||||
|
# main query and implicit grouping
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (f1 int) engine=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES (7),(8);
|
||||||
|
CREATE TABLE t2 (f2 int, f3 varchar(1)) engine=MyISAM;
|
||||||
|
INSERT INTO t2 VALUES (3,'f');
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), (SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
SELECT COUNT(f1), (SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 NULL
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), exists(SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
SELECT COUNT(f1), exists(SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 0
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), f2 > ALL (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
SELECT COUNT(f1), f2 > ALL (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 1
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 0
|
||||||
|
drop table t1,t2;
|
||||||
# return optimizer switch changed in the beginning of this test
|
# return optimizer switch changed in the beginning of this test
|
||||||
set optimizer_switch=@subselect_tmp;
|
set optimizer_switch=@subselect_tmp;
|
||||||
set @optimizer_switch_for_subselect_test=null;
|
set @optimizer_switch_for_subselect_test=null;
|
||||||
|
|
|
@ -4591,7 +4591,7 @@ SELECT MAX(b), (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||||
FROM t1
|
FROM t1
|
||||||
WHERE a = 230;
|
WHERE a = 230;
|
||||||
MAX(b) (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
MAX(b) (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||||
NULL 0
|
NULL NULL
|
||||||
DROP TABLE t1, st1, st2;
|
DROP TABLE t1, st1, st2;
|
||||||
#
|
#
|
||||||
# Bug #48709: Assertion failed in sql_select.cc:11782:
|
# Bug #48709: Assertion failed in sql_select.cc:11782:
|
||||||
|
@ -6527,6 +6527,47 @@ INSERT INTO t1 VALUES (1);
|
||||||
SELECT a FROM t1 WHERE ( SELECT MIN(a) = 100 );
|
SELECT a FROM t1 WHERE ( SELECT MIN(a) = 100 );
|
||||||
a
|
a
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
|
# LP BUG#985667 Wrong result with subquery in SELECT clause, and constant table in
|
||||||
|
# main query and implicit grouping
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (f1 int) engine=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES (7),(8);
|
||||||
|
CREATE TABLE t2 (f2 int, f3 varchar(1)) engine=MyISAM;
|
||||||
|
INSERT INTO t2 VALUES (3,'f');
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), (SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
SELECT COUNT(f1), (SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 NULL
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), exists(SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
SELECT COUNT(f1), exists(SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 0
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), f2 > ALL (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
SELECT COUNT(f1), f2 > ALL (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 1
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 0
|
||||||
|
drop table t1,t2;
|
||||||
# return optimizer switch changed in the beginning of this test
|
# return optimizer switch changed in the beginning of this test
|
||||||
set optimizer_switch=@subselect_tmp;
|
set optimizer_switch=@subselect_tmp;
|
||||||
set optimizer_switch=default;
|
set optimizer_switch=default;
|
||||||
|
|
|
@ -4583,7 +4583,7 @@ SELECT MAX(b), (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||||
FROM t1
|
FROM t1
|
||||||
WHERE a = 230;
|
WHERE a = 230;
|
||||||
MAX(b) (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
MAX(b) (SELECT COUNT(*) FROM st1,st2 WHERE st2.b <= t1.b)
|
||||||
NULL 0
|
NULL NULL
|
||||||
DROP TABLE t1, st1, st2;
|
DROP TABLE t1, st1, st2;
|
||||||
#
|
#
|
||||||
# Bug #48709: Assertion failed in sql_select.cc:11782:
|
# Bug #48709: Assertion failed in sql_select.cc:11782:
|
||||||
|
@ -6516,6 +6516,47 @@ INSERT INTO t1 VALUES (1);
|
||||||
SELECT a FROM t1 WHERE ( SELECT MIN(a) = 100 );
|
SELECT a FROM t1 WHERE ( SELECT MIN(a) = 100 );
|
||||||
a
|
a
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
|
# LP BUG#985667 Wrong result with subquery in SELECT clause, and constant table in
|
||||||
|
# main query and implicit grouping
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (f1 int) engine=MyISAM;
|
||||||
|
INSERT INTO t1 VALUES (7),(8);
|
||||||
|
CREATE TABLE t2 (f2 int, f3 varchar(1)) engine=MyISAM;
|
||||||
|
INSERT INTO t2 VALUES (3,'f');
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), (SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
SELECT COUNT(f1), (SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 NULL
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), exists(SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2
|
||||||
|
SELECT COUNT(f1), exists(SELECT f1 FROM t1 WHERE f2 > 0 limit 1) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 0
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), f2 > ALL (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
SELECT COUNT(f1), f2 > ALL (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 1
|
||||||
|
EXPLAIN
|
||||||
|
SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 2 Using where
|
||||||
|
SELECT COUNT(f1), f2 IN (SELECT f1 FROM t1 WHERE f2 > 0) AS f4 FROM t2, t1 WHERE 'v'= f3;
|
||||||
|
COUNT(f1) f4
|
||||||
|
0 0
|
||||||
|
drop table t1,t2;
|
||||||
# return optimizer switch changed in the beginning of this test
|
# return optimizer switch changed in the beginning of this test
|
||||||
set optimizer_switch=@subselect_tmp;
|
set optimizer_switch=@subselect_tmp;
|
||||||
set @optimizer_switch_for_subselect_test=null;
|
set @optimizer_switch_for_subselect_test=null;
|
||||||
|
|
|
@ -2671,4 +2671,44 @@ a
|
||||||
DEALLOCATE PREPARE pstmt;
|
DEALLOCATE PREPARE pstmt;
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
#
|
||||||
|
# BUG#978479: Wrong result (extra rows) with derived_with_keys+loosescan+semijoin=ON, materialization=OFF
|
||||||
|
#
|
||||||
|
set @tmp_jcl_978479= @@join_cache_level;
|
||||||
|
set join_cache_level=0;
|
||||||
|
set @tmp_os_978479= @@optimizer_switch;
|
||||||
|
set optimizer_switch = 'derived_with_keys=on,loosescan=on,semijoin=on,materialization=off';
|
||||||
|
# Part#1: make sure EXPLAIN is using LooseScan:
|
||||||
|
CREATE TABLE t1 ( a INT, b INT );
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
(4,0),(6,8),(3,1),(5,8),(3,9),(2,4),
|
||||||
|
(2,6),(9,1),(5,4),(7,7),(5,4);
|
||||||
|
CREATE ALGORITHM=TEMPTABLE
|
||||||
|
VIEW v1 AS SELECT * FROM t1;
|
||||||
|
# This will use LooseScan:
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1 AS t1_1, t1 AS t1_2
|
||||||
|
WHERE (t1_1.a, t1_2.a) IN ( SELECT a, b FROM v1 );
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1_1 ALL NULL NULL NULL NULL 11 Using where
|
||||||
|
1 PRIMARY <derived3> ref key0 key0 5 test.t1_1.a 2 Start temporary
|
||||||
|
1 PRIMARY t1_2 ALL NULL NULL NULL NULL 11 Using where; End temporary
|
||||||
|
3 DERIVED t1 ALL NULL NULL NULL NULL 11
|
||||||
|
SELECT * FROM t1 AS t1_1, t1 AS t1_2
|
||||||
|
WHERE (t1_1.a, t1_2.a) IN ( SELECT a, b FROM v1 );
|
||||||
|
a b a b
|
||||||
|
3 1 9 1
|
||||||
|
5 8 4 0
|
||||||
|
3 9 9 1
|
||||||
|
2 4 6 8
|
||||||
|
2 4 4 0
|
||||||
|
2 6 6 8
|
||||||
|
2 6 4 0
|
||||||
|
5 4 4 0
|
||||||
|
7 7 7 7
|
||||||
|
5 4 4 0
|
||||||
|
DROP VIEW v1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
set @@join_cache_level= @tmp_jcl_978479;
|
||||||
|
set @@optimizer_switch= @tmp_os_978479;
|
||||||
set optimizer_switch=@subselect_sj_tmp;
|
set optimizer_switch=@subselect_sj_tmp;
|
||||||
|
|
|
@ -2685,6 +2685,46 @@ a
|
||||||
DEALLOCATE PREPARE pstmt;
|
DEALLOCATE PREPARE pstmt;
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
|
#
|
||||||
|
# BUG#978479: Wrong result (extra rows) with derived_with_keys+loosescan+semijoin=ON, materialization=OFF
|
||||||
|
#
|
||||||
|
set @tmp_jcl_978479= @@join_cache_level;
|
||||||
|
set join_cache_level=0;
|
||||||
|
set @tmp_os_978479= @@optimizer_switch;
|
||||||
|
set optimizer_switch = 'derived_with_keys=on,loosescan=on,semijoin=on,materialization=off';
|
||||||
|
# Part#1: make sure EXPLAIN is using LooseScan:
|
||||||
|
CREATE TABLE t1 ( a INT, b INT );
|
||||||
|
INSERT INTO t1 VALUES
|
||||||
|
(4,0),(6,8),(3,1),(5,8),(3,9),(2,4),
|
||||||
|
(2,6),(9,1),(5,4),(7,7),(5,4);
|
||||||
|
CREATE ALGORITHM=TEMPTABLE
|
||||||
|
VIEW v1 AS SELECT * FROM t1;
|
||||||
|
# This will use LooseScan:
|
||||||
|
EXPLAIN
|
||||||
|
SELECT * FROM t1 AS t1_1, t1 AS t1_2
|
||||||
|
WHERE (t1_1.a, t1_2.a) IN ( SELECT a, b FROM v1 );
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 PRIMARY t1_1 ALL NULL NULL NULL NULL 11 Using where
|
||||||
|
1 PRIMARY <derived3> ref key0 key0 5 test.t1_1.a 2 Start temporary
|
||||||
|
1 PRIMARY t1_2 ALL NULL NULL NULL NULL 11 Using where; End temporary
|
||||||
|
3 DERIVED t1 ALL NULL NULL NULL NULL 11
|
||||||
|
SELECT * FROM t1 AS t1_1, t1 AS t1_2
|
||||||
|
WHERE (t1_1.a, t1_2.a) IN ( SELECT a, b FROM v1 );
|
||||||
|
a b a b
|
||||||
|
3 1 9 1
|
||||||
|
5 8 4 0
|
||||||
|
3 9 9 1
|
||||||
|
2 4 6 8
|
||||||
|
2 4 4 0
|
||||||
|
2 6 6 8
|
||||||
|
2 6 4 0
|
||||||
|
5 4 4 0
|
||||||
|
7 7 7 7
|
||||||
|
5 4 4 0
|
||||||
|
DROP VIEW v1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
set @@join_cache_level= @tmp_jcl_978479;
|
||||||
|
set @@optimizer_switch= @tmp_os_978479;
|
||||||
set optimizer_switch=@subselect_sj_tmp;
|
set optimizer_switch=@subselect_sj_tmp;
|
||||||
#
|
#
|
||||||
# BUG#49129: Wrong result with IN-subquery with join_cache_level=6 and firstmatch=off
|
# BUG#49129: Wrong result with IN-subquery with join_cache_level=6 and firstmatch=off
|
||||||
|
|
|
@ -21,6 +21,12 @@ name cdate note
|
||||||
name1 1998-01-01 note01
|
name1 1998-01-01 note01
|
||||||
name2 1998-01-01 note01
|
name2 1998-01-01 note01
|
||||||
drop table t1,t2;
|
drop table t1,t2;
|
||||||
|
CREATE TABLE t1(a INT);
|
||||||
|
INSERT INTO t1 VALUES(1);
|
||||||
|
SELECT * FROM t1 WHERE LAST_DAY('0000-00-00 00:00:00') IS NULL;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
DROP TABLE t1;
|
||||||
CREATE TABLE t1 ( datum DATE );
|
CREATE TABLE t1 ( datum DATE );
|
||||||
INSERT INTO t1 VALUES ( "2000-1-1" );
|
INSERT INTO t1 VALUES ( "2000-1-1" );
|
||||||
INSERT INTO t1 VALUES ( "2000-1-2" );
|
INSERT INTO t1 VALUES ( "2000-1-2" );
|
||||||
|
|
9
mysql-test/r/update_ignore_216.result
Normal file
9
mysql-test/r/update_ignore_216.result
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
CREATE TABLE t1 ( a INT, b CHAR(3) );
|
||||||
|
INSERT INTO t1 VALUES ( 1, 'foo' );
|
||||||
|
CREATE TABLE t2 ( c CHAR(3), d INT );
|
||||||
|
INSERT INTO t2 VALUES ( 'foo', 1 );
|
||||||
|
UPDATE IGNORE t1, t2 SET b = 'bar', c = 'bar'
|
||||||
|
WHERE a != ( SELECT 1 UNION SELECT 2 );
|
||||||
|
Warnings:
|
||||||
|
Warning 1242 Subquery returns more than 1 row
|
||||||
|
DROP TABLE t1, t2;
|
|
@ -26,6 +26,9 @@ sub skip_combinations {
|
||||||
|
|
||||||
$skip{'include/not_windows.inc'} = 'Requires not Windows' if IS_WINDOWS;
|
$skip{'include/not_windows.inc'} = 'Requires not Windows' if IS_WINDOWS;
|
||||||
|
|
||||||
|
$skip{'t/plugin_loaderr.test'} = 'needs compiled-in innodb'
|
||||||
|
unless $::mysqld_variables{'innodb'} eq "ON";
|
||||||
|
|
||||||
# disable tests that use ipv6, if unsupported
|
# disable tests that use ipv6, if unsupported
|
||||||
use Socket;
|
use Socket;
|
||||||
$skip{'include/check_ipv6.inc'} = 'No IPv6'
|
$skip{'include/check_ipv6.inc'} = 'No IPv6'
|
||||||
|
|
9
mysql-test/suite/archive/suite.pm
Normal file
9
mysql-test/suite/archive/suite.pm
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
package My::Suite::Archive;
|
||||||
|
|
||||||
|
@ISA = qw(My::Suite);
|
||||||
|
|
||||||
|
return ("Need Archive engine" unless $ENV{HA_ARCHIVE_SO} or
|
||||||
|
$::mysqld_variables{'archive'} eq "ON");
|
||||||
|
|
||||||
|
bless { };
|
||||||
|
|
|
@ -2365,8 +2365,8 @@ select_type SIMPLE
|
||||||
table t1
|
table t1
|
||||||
type index
|
type index
|
||||||
possible_keys NULL
|
possible_keys NULL
|
||||||
key PRIMARY
|
key b
|
||||||
key_len 4
|
key_len 10
|
||||||
ref NULL
|
ref NULL
|
||||||
rows 10
|
rows 10
|
||||||
Extra Using index
|
Extra Using index
|
||||||
|
@ -2652,7 +2652,7 @@ select_type SIMPLE
|
||||||
table t1
|
table t1
|
||||||
type index
|
type index
|
||||||
possible_keys NULL
|
possible_keys NULL
|
||||||
key PRIMARY
|
key b
|
||||||
key_len 8
|
key_len 8
|
||||||
ref NULL
|
ref NULL
|
||||||
rows 3
|
rows 3
|
||||||
|
|
|
@ -824,21 +824,21 @@ INSERT INTO t1 VALUES ('3', '3'),('4','4'),('5','5');
|
||||||
flush status;
|
flush status;
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_icp_attempts 0
|
Handler_icp_attempts 0
|
||||||
Handler_icp_match 0
|
Handler_icp_match 0
|
||||||
SELECT * FROM t1 FORCE INDEX(c1) WHERE (c1='3' or c1='4') and c1 % 2 = 0 ;
|
SELECT * FROM t1 FORCE INDEX(c1) WHERE (c1='3' or c1='4') and c1 % 2 = 0 ;
|
||||||
c1 c2
|
c1 c2
|
||||||
4 4
|
4 4
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_icp_attempts 2
|
Handler_icp_attempts 2
|
||||||
Handler_icp_match 1
|
Handler_icp_match 1
|
||||||
SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ;
|
SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ;
|
||||||
c1 c2
|
c1 c2
|
||||||
4 4
|
4 4
|
||||||
show status like "Handler_icp%";
|
show status like "Handler_icp%";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
Handler_icp_attempts 2
|
Handler_icp_attempts 2
|
||||||
Handler_icp_match 1
|
Handler_icp_match 1
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
set storage_engine= @save_storage_engine;
|
set storage_engine= @save_storage_engine;
|
29
mysql-test/suite/maria/lock.result
Normal file
29
mysql-test/suite/maria/lock.result
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
drop table if exists t1,t2;
|
||||||
|
Warnings:
|
||||||
|
Note 1051 Unknown table 't1'
|
||||||
|
Note 1051 Unknown table 't2'
|
||||||
|
CREATE TABLE t1 (i INT) ENGINE=Aria;
|
||||||
|
CREATE TABLE t2 (i INT) ENGINE=Aria;
|
||||||
|
LOCK TABLE t1 WRITE, t2 WRITE;
|
||||||
|
DROP TABLE t1;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
DROP TABLE t2;
|
||||||
|
CREATE TABLE t1 (i INT) ENGINE=Aria;
|
||||||
|
CREATE TABLE t2 (i INT) ENGINE=Aria;
|
||||||
|
LOCK TABLE t1 WRITE, t2 WRITE;
|
||||||
|
FLUSH TABLE t1;
|
||||||
|
select * from t1;
|
||||||
|
i
|
||||||
|
unlock tables;
|
||||||
|
drop table t1,t2;
|
||||||
|
CREATE TABLE t1 (i INT) ENGINE=Aria;
|
||||||
|
CREATE TABLE t2 (i INT) ENGINE=Aria;
|
||||||
|
LOCK TABLE t1 WRITE, t2 WRITE;
|
||||||
|
repair table t1 use_frm;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 repair status OK
|
||||||
|
select * from t1;
|
||||||
|
i
|
||||||
|
drop table t2;
|
||||||
|
unlock tables;
|
||||||
|
drop table t1;
|
44
mysql-test/suite/maria/lock.test
Normal file
44
mysql-test/suite/maria/lock.test
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
#
|
||||||
|
# Testing of potential problems in Aria with locking
|
||||||
|
#
|
||||||
|
|
||||||
|
-- source include/have_maria.inc
|
||||||
|
|
||||||
|
drop table if exists t1,t2;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Test for Bug#973039
|
||||||
|
# Assertion `share->in_trans == 0' failed in maria_close on DROP TABLE
|
||||||
|
# under LOCK
|
||||||
|
#
|
||||||
|
|
||||||
|
# Test DROP TABLE
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i INT) ENGINE=Aria;
|
||||||
|
CREATE TABLE t2 (i INT) ENGINE=Aria;
|
||||||
|
LOCK TABLE t1 WRITE, t2 WRITE;
|
||||||
|
# Also fails with FLUSH TABLE t1 and with REPAIR TABLE t1 USE_FRM
|
||||||
|
DROP TABLE t1;
|
||||||
|
UNLOCK TABLES;
|
||||||
|
DROP TABLE t2;
|
||||||
|
|
||||||
|
#Test FLUSH TABLE
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i INT) ENGINE=Aria;
|
||||||
|
CREATE TABLE t2 (i INT) ENGINE=Aria;
|
||||||
|
LOCK TABLE t1 WRITE, t2 WRITE;
|
||||||
|
FLUSH TABLE t1;
|
||||||
|
select * from t1;
|
||||||
|
unlock tables;
|
||||||
|
drop table t1,t2;
|
||||||
|
|
||||||
|
# Test REPAIR ... USE_FRM and unlock tables last
|
||||||
|
|
||||||
|
CREATE TABLE t1 (i INT) ENGINE=Aria;
|
||||||
|
CREATE TABLE t2 (i INT) ENGINE=Aria;
|
||||||
|
LOCK TABLE t1 WRITE, t2 WRITE;
|
||||||
|
repair table t1 use_frm;
|
||||||
|
select * from t1;
|
||||||
|
drop table t2;
|
||||||
|
unlock tables;
|
||||||
|
drop table t1;
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue