mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge 11.4 into 11.7
This commit is contained in:
@@ -14,7 +14,7 @@
|
|||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, write to the Free Software
|
||||||
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
|
||||||
|
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12)
|
CMAKE_MINIMUM_REQUIRED(VERSION 3.12.0)
|
||||||
|
|
||||||
IF(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
IF(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||||
# Setting build type to RelWithDebInfo as none was specified.
|
# Setting build type to RelWithDebInfo as none was specified.
|
||||||
|
@@ -3454,6 +3454,9 @@ static int com_charset(String *, char *line)
|
|||||||
MYF(MY_UTF8_IS_UTF8MB3 | MY_WME));
|
MYF(MY_UTF8_IS_UTF8MB3 | MY_WME));
|
||||||
if (new_cs)
|
if (new_cs)
|
||||||
{
|
{
|
||||||
|
if (new_cs->mbminlen > 1)
|
||||||
|
return put_info("Character sets with mbminlen>1 are not supported",
|
||||||
|
INFO_ERROR, 0);
|
||||||
charset_info= new_cs;
|
charset_info= new_cs;
|
||||||
mysql_set_character_set(&mysql, charset_info->cs_name.str);
|
mysql_set_character_set(&mysql, charset_info->cs_name.str);
|
||||||
default_charset= (char *)charset_info->cs_name.str;
|
default_charset= (char *)charset_info->cs_name.str;
|
||||||
|
@@ -43,6 +43,11 @@
|
|||||||
#include "sql_priv.h"
|
#include "sql_priv.h"
|
||||||
#include "sql_basic_types.h"
|
#include "sql_basic_types.h"
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
|
#if 0 /* FIXME: the following is broken for now */
|
||||||
|
# include "mariadb_rpl.h"
|
||||||
|
#else
|
||||||
|
enum Item_result {STRING_RESULT,REAL_RESULT,INT_RESULT,ROW_RESULT,DECIMAL_RESULT};
|
||||||
|
#endif
|
||||||
#include "log_event.h"
|
#include "log_event.h"
|
||||||
#include "compat56.h"
|
#include "compat56.h"
|
||||||
#include "sql_common.h"
|
#include "sql_common.h"
|
||||||
|
@@ -877,11 +877,10 @@ static void write_footer(FILE *sql_file)
|
|||||||
} /* write_footer */
|
} /* write_footer */
|
||||||
|
|
||||||
|
|
||||||
uchar* get_table_key(const char *entry, size_t *length,
|
const uchar *get_table_key(const void *entry, size_t *length, my_bool)
|
||||||
my_bool not_used __attribute__((unused)))
|
|
||||||
{
|
{
|
||||||
*length= strlen(entry);
|
*length= strlen(static_cast<const char*>(entry));
|
||||||
return (uchar*) entry;
|
return static_cast<const uchar*>(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1121,11 +1120,11 @@ static int get_options(int *argc, char ***argv)
|
|||||||
load_defaults_or_exit("my", load_default_groups, argc, argv);
|
load_defaults_or_exit("my", load_default_groups, argc, argv);
|
||||||
defaults_argv= *argv;
|
defaults_argv= *argv;
|
||||||
|
|
||||||
if (my_hash_init(PSI_NOT_INSTRUMENTED, &ignore_database, charset_info, 16, 0, 0,
|
if (my_hash_init(PSI_NOT_INSTRUMENTED, &ignore_database, charset_info, 16, 0,
|
||||||
(my_hash_get_key) get_table_key, my_free, 0))
|
0, get_table_key, my_free, 0))
|
||||||
return(EX_EOM);
|
return(EX_EOM);
|
||||||
if (my_hash_init(PSI_NOT_INSTRUMENTED, &ignore_table, charset_info, 16, 0, 0,
|
if (my_hash_init(PSI_NOT_INSTRUMENTED, &ignore_table, charset_info, 16, 0, 0,
|
||||||
(my_hash_get_key) get_table_key, my_free, 0))
|
get_table_key, my_free, 0))
|
||||||
return(EX_EOM);
|
return(EX_EOM);
|
||||||
/* Don't copy internal log tables */
|
/* Don't copy internal log tables */
|
||||||
if (my_hash_insert(&ignore_table, (uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
|
if (my_hash_insert(&ignore_table, (uchar*) my_strdup(PSI_NOT_INSTRUMENTED,
|
||||||
@@ -1141,7 +1140,7 @@ static int get_options(int *argc, char ***argv)
|
|||||||
return(EX_EOM);
|
return(EX_EOM);
|
||||||
|
|
||||||
if (my_hash_init(PSI_NOT_INSTRUMENTED, &ignore_data, charset_info, 16, 0, 0,
|
if (my_hash_init(PSI_NOT_INSTRUMENTED, &ignore_data, charset_info, 16, 0, 0,
|
||||||
(my_hash_get_key) get_table_key, my_free, 0))
|
get_table_key, my_free, 0))
|
||||||
return(EX_EOM);
|
return(EX_EOM);
|
||||||
|
|
||||||
if ((ho_error= handle_options(argc, argv, my_long_options, get_one_option)))
|
if ((ho_error= handle_options(argc, argv, my_long_options, get_one_option)))
|
||||||
@@ -1865,7 +1864,7 @@ static int switch_character_set_results(MYSQL *mysql, const char *cs_name)
|
|||||||
query_length= my_snprintf(query_buffer,
|
query_length= my_snprintf(query_buffer,
|
||||||
sizeof (query_buffer),
|
sizeof (query_buffer),
|
||||||
"SET SESSION character_set_results = '%s'",
|
"SET SESSION character_set_results = '%s'",
|
||||||
(const char *) cs_name);
|
cs_name);
|
||||||
|
|
||||||
return mysql_real_query(mysql, query_buffer, (ulong)query_length);
|
return mysql_real_query(mysql, query_buffer, (ulong)query_length);
|
||||||
}
|
}
|
||||||
|
@@ -998,7 +998,6 @@ end_thread:
|
|||||||
cn->mysql= 0;
|
cn->mysql= 0;
|
||||||
cn->query_done= 1;
|
cn->query_done= 1;
|
||||||
mysql_thread_end();
|
mysql_thread_end();
|
||||||
pthread_exit(0);
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2411,13 +2410,12 @@ static void strip_parentheses(struct st_command *command)
|
|||||||
|
|
||||||
C_MODE_START
|
C_MODE_START
|
||||||
|
|
||||||
static uchar *get_var_key(const uchar* var, size_t *len,
|
static const uchar *get_var_key(const void *var, size_t *len, my_bool)
|
||||||
my_bool __attribute__((unused)) t)
|
|
||||||
{
|
{
|
||||||
char* key;
|
char* key;
|
||||||
key = ((VAR*)var)->name;
|
key= (static_cast<const VAR *>(var))->name;
|
||||||
*len = ((VAR*)var)->name_len;
|
*len= (static_cast<const VAR *>(var))->name_len;
|
||||||
return (uchar*)key;
|
return reinterpret_cast<const uchar *>(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -12282,8 +12280,10 @@ void replace_dynstr_append_uint(DYNAMIC_STRING *ds, uint val)
|
|||||||
keep_header If header should not be sorted
|
keep_header If header should not be sorted
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int comp_lines(const char **a, const char **b)
|
static int comp_lines(const void *a_, const void *b_)
|
||||||
{
|
{
|
||||||
|
auto a= static_cast<const char *const *>(a_);
|
||||||
|
auto b= static_cast<const char *const *>(b_);
|
||||||
return (strcmp(*a,*b));
|
return (strcmp(*a,*b));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -39,12 +39,23 @@ SET(MY_WARNING_FLAGS
|
|||||||
-Woverloaded-virtual
|
-Woverloaded-virtual
|
||||||
-Wvla
|
-Wvla
|
||||||
-Wwrite-strings
|
-Wwrite-strings
|
||||||
|
-Wcast-function-type-strict
|
||||||
|
)
|
||||||
|
|
||||||
|
# Warning flags that are in testing before moving
|
||||||
|
# to MY_WARNING_FLAGS if stable.
|
||||||
|
SET(MY_WARNING_FLAGS_NON_FATAL
|
||||||
)
|
)
|
||||||
|
|
||||||
FOREACH(F ${MY_WARNING_FLAGS})
|
FOREACH(F ${MY_WARNING_FLAGS})
|
||||||
MY_CHECK_AND_SET_COMPILER_FLAG(${F} DEBUG RELWITHDEBINFO)
|
MY_CHECK_AND_SET_COMPILER_FLAG(${F} DEBUG RELWITHDEBINFO)
|
||||||
ENDFOREACH()
|
ENDFOREACH()
|
||||||
|
|
||||||
|
FOREACH(F ${MY_WARNING_FLAGS_NON_FATAL})
|
||||||
|
MY_CHECK_AND_SET_COMPILER_FLAG(-W${F} DEBUG RELWITHDEBINFO)
|
||||||
|
MY_CHECK_AND_SET_COMPILER_FLAG(-Wno-error=${F} DEBUG RELWITHDEBINFO)
|
||||||
|
ENDFOREACH()
|
||||||
|
|
||||||
SET(MY_ERROR_FLAGS -Werror -fno-operator-names -Wsuggest-override)
|
SET(MY_ERROR_FLAGS -Werror -fno-operator-names -Wsuggest-override)
|
||||||
|
|
||||||
IF(CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER_VERSION VERSION_LESS "6.0.0")
|
IF(CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER_VERSION VERSION_LESS "6.0.0")
|
||||||
|
@@ -76,6 +76,8 @@ static my_bool do_leaf;
|
|||||||
static my_bool per_page_details;
|
static my_bool per_page_details;
|
||||||
static ulint n_merge;
|
static ulint n_merge;
|
||||||
static ulint physical_page_size; /* Page size in bytes on disk. */
|
static ulint physical_page_size; /* Page size in bytes on disk. */
|
||||||
|
static ulint extent_size;
|
||||||
|
static ulint xdes_size;
|
||||||
ulong srv_page_size;
|
ulong srv_page_size;
|
||||||
uint32_t srv_page_size_shift;
|
uint32_t srv_page_size_shift;
|
||||||
/* Current page number (0 based). */
|
/* Current page number (0 based). */
|
||||||
@@ -100,7 +102,7 @@ char* log_filename = NULL;
|
|||||||
FILE* log_file = NULL;
|
FILE* log_file = NULL;
|
||||||
/* Enabled for log write option. */
|
/* Enabled for log write option. */
|
||||||
static bool is_log_enabled = false;
|
static bool is_log_enabled = false;
|
||||||
|
static bool skip_freed_pages;
|
||||||
static byte field_ref_zero_buf[UNIV_PAGE_SIZE_MAX];
|
static byte field_ref_zero_buf[UNIV_PAGE_SIZE_MAX];
|
||||||
const byte *field_ref_zero = field_ref_zero_buf;
|
const byte *field_ref_zero = field_ref_zero_buf;
|
||||||
|
|
||||||
@@ -268,6 +270,8 @@ static void init_page_size(const byte* buf)
|
|||||||
srv_page_size_shift = UNIV_ZIP_SIZE_SHIFT_MIN - 1 + ssize;
|
srv_page_size_shift = UNIV_ZIP_SIZE_SHIFT_MIN - 1 + ssize;
|
||||||
srv_page_size = 512U << ssize;
|
srv_page_size = 512U << ssize;
|
||||||
physical_page_size = srv_page_size;
|
physical_page_size = srv_page_size;
|
||||||
|
extent_size = FSP_EXTENT_SIZE;
|
||||||
|
xdes_size = XDES_SIZE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -279,6 +283,8 @@ static void init_page_size(const byte* buf)
|
|||||||
|
|
||||||
srv_page_size = fil_space_t::logical_size(flags);
|
srv_page_size = fil_space_t::logical_size(flags);
|
||||||
physical_page_size = fil_space_t::physical_size(flags);
|
physical_page_size = fil_space_t::physical_size(flags);
|
||||||
|
extent_size = FSP_EXTENT_SIZE;
|
||||||
|
xdes_size = XDES_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@@ -551,8 +557,8 @@ bool
|
|||||||
is_page_doublewritebuffer(
|
is_page_doublewritebuffer(
|
||||||
const byte* page)
|
const byte* page)
|
||||||
{
|
{
|
||||||
if ((cur_page_num >= FSP_EXTENT_SIZE)
|
if ((cur_page_num >= extent_size)
|
||||||
&& (cur_page_num < FSP_EXTENT_SIZE * 3)) {
|
&& (cur_page_num < extent_size * 3)) {
|
||||||
/* page is doublewrite buffer. */
|
/* page is doublewrite buffer. */
|
||||||
return (true);
|
return (true);
|
||||||
}
|
}
|
||||||
@@ -753,8 +759,8 @@ static inline bool is_page_free(const byte *xdes, ulint physical_page_size,
|
|||||||
{
|
{
|
||||||
const byte *des=
|
const byte *des=
|
||||||
xdes + XDES_ARR_OFFSET +
|
xdes + XDES_ARR_OFFSET +
|
||||||
XDES_SIZE * ((page_no & (physical_page_size - 1)) / FSP_EXTENT_SIZE);
|
xdes_size * ((page_no & (physical_page_size - 1)) / extent_size);
|
||||||
return xdes_is_free(des, page_no % FSP_EXTENT_SIZE);
|
return xdes_is_free(des, page_no % extent_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -782,6 +788,16 @@ parse_page(
|
|||||||
|
|
||||||
/* Check whether page is doublewrite buffer. */
|
/* Check whether page is doublewrite buffer. */
|
||||||
str = skip_page ? "Double_write_buffer" : "-";
|
str = skip_page ? "Double_write_buffer" : "-";
|
||||||
|
page_no = mach_read_from_4(page + FIL_PAGE_OFFSET);
|
||||||
|
if (skip_freed_pages) {
|
||||||
|
const byte *des= xdes + XDES_ARR_OFFSET +
|
||||||
|
xdes_size * ((page_no & (physical_page_size - 1))
|
||||||
|
/ extent_size);
|
||||||
|
if (mach_read_from_4(des) != XDES_FSEG &&
|
||||||
|
xdes_is_free(des, page_no % extent_size)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (fil_page_get_type(page)) {
|
switch (fil_page_get_type(page)) {
|
||||||
|
|
||||||
@@ -1207,6 +1223,9 @@ static struct my_option innochecksum_options[] = {
|
|||||||
&do_leaf, &do_leaf, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
&do_leaf, &do_leaf, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"merge", 'm', "leaf page count if merge given number of consecutive pages",
|
{"merge", 'm', "leaf page count if merge given number of consecutive pages",
|
||||||
&n_merge, &n_merge, 0, GET_ULONG, REQUIRED_ARG, 0, 0, (longlong)10L, 0, 1, 0},
|
&n_merge, &n_merge, 0, GET_ULONG, REQUIRED_ARG, 0, 0, (longlong)10L, 0, 1, 0},
|
||||||
|
{"skip-freed-pages", 'r', "skip freed pages for the tablespace",
|
||||||
|
&skip_freed_pages, &skip_freed_pages, 0, GET_BOOL, NO_ARG,
|
||||||
|
0, 0, 0, 0, 0, 0},
|
||||||
|
|
||||||
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
|
{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
@@ -1216,7 +1235,7 @@ static void usage(void)
|
|||||||
print_version();
|
print_version();
|
||||||
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
|
puts(ORACLE_WELCOME_COPYRIGHT_NOTICE("2000"));
|
||||||
printf("InnoDB offline file checksum utility.\n");
|
printf("InnoDB offline file checksum utility.\n");
|
||||||
printf("Usage: %s [-c] [-s <start page>] [-e <end page>] "
|
printf("Usage: %s [-c] [-r] [-s <start page>] [-e <end page>] "
|
||||||
"[-p <page>] [-i] [-v] [-a <allow mismatches>] [-n] "
|
"[-p <page>] [-i] [-v] [-a <allow mismatches>] [-n] "
|
||||||
"[-S] [-D <page type dump>] "
|
"[-S] [-D <page type dump>] "
|
||||||
"[-l <log>] [-l] [-m <merge pages>] <filename or [-]>\n", my_progname);
|
"[-l <log>] [-l] [-m <merge pages>] <filename or [-]>\n", my_progname);
|
||||||
@@ -1229,7 +1248,7 @@ static void usage(void)
|
|||||||
extern "C" my_bool
|
extern "C" my_bool
|
||||||
innochecksum_get_one_option(
|
innochecksum_get_one_option(
|
||||||
const struct my_option *opt,
|
const struct my_option *opt,
|
||||||
const char *argument MY_ATTRIBUTE((unused)),
|
const char *IF_DBUG(argument,),
|
||||||
const char *)
|
const char *)
|
||||||
{
|
{
|
||||||
switch (opt->id) {
|
switch (opt->id) {
|
||||||
@@ -1255,15 +1274,6 @@ innochecksum_get_one_option(
|
|||||||
my_end(0);
|
my_end(0);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
break;
|
break;
|
||||||
case 'n':
|
|
||||||
no_check = true;
|
|
||||||
break;
|
|
||||||
case 'a':
|
|
||||||
case 'S':
|
|
||||||
break;
|
|
||||||
case 'w':
|
|
||||||
do_write = true;
|
|
||||||
break;
|
|
||||||
case 'D':
|
case 'D':
|
||||||
page_type_dump = true;
|
page_type_dump = true;
|
||||||
break;
|
break;
|
||||||
@@ -1310,8 +1320,8 @@ get_options(
|
|||||||
*/
|
*/
|
||||||
static bool check_encryption(const char* filename, const byte* page)
|
static bool check_encryption(const char* filename, const byte* page)
|
||||||
{
|
{
|
||||||
ulint offset = FSP_HEADER_OFFSET + XDES_ARR_OFFSET + XDES_SIZE *
|
ulint offset = FSP_HEADER_OFFSET + XDES_ARR_OFFSET + xdes_size *
|
||||||
physical_page_size / FSP_EXTENT_SIZE;
|
physical_page_size / extent_size;
|
||||||
|
|
||||||
if (memcmp(page + offset, CRYPT_MAGIC, MAGIC_SZ) != 0) {
|
if (memcmp(page + offset, CRYPT_MAGIC, MAGIC_SZ) != 0) {
|
||||||
return false;
|
return false;
|
||||||
@@ -1843,7 +1853,7 @@ first_non_zero:
|
|||||||
printf("page " UINT32PF " ", cur_page_num);
|
printf("page " UINT32PF " ", cur_page_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page_get_page_no(buf) % physical_page_size == 0) {
|
if (cur_page_num % physical_page_size == 0) {
|
||||||
memcpy(xdes, buf, physical_page_size);
|
memcpy(xdes, buf, physical_page_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -203,7 +203,7 @@ const char *encryption_plugin_get_config()
|
|||||||
return encryption_plugin_config.c_str();
|
return encryption_plugin_config.c_str();
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int finalize_encryption_plugin(st_plugin_int *plugin);
|
extern int finalize_encryption_plugin(void *plugin);
|
||||||
|
|
||||||
|
|
||||||
void encryption_plugin_prepare_init(int argc, char **argv)
|
void encryption_plugin_prepare_init(int argc, char **argv)
|
||||||
|
@@ -353,18 +353,19 @@ err:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
uchar *
|
const uchar *
|
||||||
get_file_entry_key(file_entry_t *entry, size_t *length,
|
get_file_entry_key(const void *entry_, size_t *length, my_bool)
|
||||||
my_bool not_used __attribute__((unused)))
|
|
||||||
{
|
{
|
||||||
*length = entry->pathlen;
|
const file_entry_t *entry= static_cast<const file_entry_t *>(entry_);
|
||||||
return (uchar *) entry->path;
|
*length= entry->pathlen;
|
||||||
|
return reinterpret_cast<const uchar *>(entry->path);
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
void
|
void
|
||||||
file_entry_free(file_entry_t *entry)
|
file_entry_free(void *entry_)
|
||||||
{
|
{
|
||||||
|
file_entry_t *entry= static_cast<file_entry_t *>(entry_);
|
||||||
pthread_mutex_destroy(&entry->mutex);
|
pthread_mutex_destroy(&entry->mutex);
|
||||||
ds_close(entry->file);
|
ds_close(entry->file);
|
||||||
my_free(entry->path);
|
my_free(entry->path);
|
||||||
@@ -541,8 +542,9 @@ mode_extract(int n_threads, int argc __attribute__((unused)),
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (my_hash_init(PSI_NOT_INSTRUMENTED, &filehash, &my_charset_bin,
|
if (my_hash_init(PSI_NOT_INSTRUMENTED, &filehash, &my_charset_bin,
|
||||||
START_FILE_HASH_SIZE, 0, 0, (my_hash_get_key) get_file_entry_key,
|
START_FILE_HASH_SIZE, 0, 0, get_file_entry_key,
|
||||||
(my_hash_free_key) file_entry_free, MYF(0))) {
|
file_entry_free, MYF(0)))
|
||||||
|
{
|
||||||
msg("%s: failed to initialize file hash.", my_progname);
|
msg("%s: failed to initialize file hash.", my_progname);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@@ -1185,7 +1185,7 @@ static void backup_file_op_fail(uint32_t space_id, int type,
|
|||||||
const byte* new_name, ulint new_len)
|
const byte* new_name, ulint new_len)
|
||||||
{
|
{
|
||||||
bool fail = false;
|
bool fail = false;
|
||||||
const static std::string spacename{filename_to_spacename(name, len)};
|
const std::string spacename{filename_to_spacename(name, len)};
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case FILE_CREATE:
|
case FILE_CREATE:
|
||||||
msg("DDL tracking : create %u \"%.*s\"", space_id, int(len), name);
|
msg("DDL tracking : create %u \"%.*s\"", space_id, int(len), name);
|
||||||
@@ -2978,25 +2978,19 @@ my_bool regex_list_check_match(
|
|||||||
return(FALSE);
|
return(FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static bool find_filter_in_hashtable(const char *name, hash_table_t *table,
|
||||||
my_bool
|
xb_filter_entry_t **result) noexcept
|
||||||
find_filter_in_hashtable(
|
|
||||||
const char* name,
|
|
||||||
hash_table_t* table,
|
|
||||||
xb_filter_entry_t** result
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
xb_filter_entry_t* found = NULL;
|
const ulint fold= my_crc32c(0, name, strlen(name));
|
||||||
const ulint fold = my_crc32c(0, name, strlen(name));
|
if (auto found= table->cell_get(fold)->
|
||||||
HASH_SEARCH(name_hash, table, fold,
|
find(&xb_filter_entry_t::name_hash,[name](xb_filter_entry_t *f)
|
||||||
xb_filter_entry_t*,
|
{ return !strcmp(f->name, name); }))
|
||||||
found, (void) 0,
|
{
|
||||||
!strcmp(found->name, name));
|
if (result)
|
||||||
|
*result= found;
|
||||||
if (found && result) {
|
return true;
|
||||||
*result = found;
|
|
||||||
}
|
}
|
||||||
return (found != NULL);
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
@@ -4478,13 +4472,12 @@ xb_add_filter(
|
|||||||
const char* name, /*!< in: name of table/database */
|
const char* name, /*!< in: name of table/database */
|
||||||
hash_table_t* hash) /*!< in/out: hash to insert into */
|
hash_table_t* hash) /*!< in/out: hash to insert into */
|
||||||
{
|
{
|
||||||
xb_filter_entry_t* entry = xb_new_filter_entry(name);
|
xb_filter_entry_t *entry= xb_new_filter_entry(name);
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(!hash->array)) {
|
if (UNIV_UNLIKELY(!hash->array))
|
||||||
hash->create(1000);
|
hash->create(1000);
|
||||||
}
|
hash->cell_get(my_crc32c(0, entry->name, strlen(entry->name)))->
|
||||||
const ulint fold = my_crc32c(0, entry->name, strlen(entry->name));
|
append(*entry, &xb_filter_entry_t::name_hash);
|
||||||
HASH_INSERT(xb_filter_entry_t, name_hash, hash, fold, entry);
|
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4523,12 +4516,8 @@ xb_register_filter_entry(
|
|||||||
hash_table_t* tables_hash
|
hash_table_t* tables_hash
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const char* p;
|
size_t namelen = strlen(name);
|
||||||
size_t namelen;
|
if (const char* p = strchr(name, '.')) {
|
||||||
xb_filter_entry_t* db_entry = NULL;
|
|
||||||
|
|
||||||
namelen = strlen(name);
|
|
||||||
if ((p = strchr(name, '.')) != NULL) {
|
|
||||||
char dbname[NAME_LEN + 1];
|
char dbname[NAME_LEN + 1];
|
||||||
|
|
||||||
xb_validate_name(name, p - name);
|
xb_validate_name(name, p - name);
|
||||||
@@ -4537,18 +4526,20 @@ xb_register_filter_entry(
|
|||||||
strncpy(dbname, name, p - name);
|
strncpy(dbname, name, p - name);
|
||||||
dbname[p - name] = 0;
|
dbname[p - name] = 0;
|
||||||
|
|
||||||
if (databases_hash && databases_hash->array) {
|
if (UNIV_UNLIKELY(!databases_hash->array)) {
|
||||||
const ulint fold = my_crc32c(0, dbname, p - name);
|
databases_hash->create(1000);
|
||||||
HASH_SEARCH(name_hash, databases_hash,
|
|
||||||
fold,
|
|
||||||
xb_filter_entry_t*,
|
|
||||||
db_entry, (void) 0,
|
|
||||||
!strcmp(db_entry->name, dbname));
|
|
||||||
}
|
}
|
||||||
if (!db_entry) {
|
|
||||||
db_entry = xb_add_filter(dbname, databases_hash);
|
xb_filter_entry_t **prev =
|
||||||
|
databases_hash->cell_get(my_crc32c(0, name, p - name))
|
||||||
|
->search(&xb_filter_entry_t::name_hash,
|
||||||
|
[dbname](xb_filter_entry_t* f)
|
||||||
|
{ return f && !strcmp(f->name, dbname); });
|
||||||
|
if (!*prev) {
|
||||||
|
(*prev = xb_new_filter_entry(dbname))
|
||||||
|
->has_tables = TRUE;
|
||||||
}
|
}
|
||||||
db_entry->has_tables = TRUE;
|
ut_ad((*prev)->has_tables);
|
||||||
xb_add_filter(name, tables_hash);
|
xb_add_filter(name, tables_hash);
|
||||||
} else {
|
} else {
|
||||||
xb_validate_name(name, namelen);
|
xb_validate_name(name, namelen);
|
||||||
@@ -4731,32 +4722,16 @@ xb_filters_init()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static void xb_filter_hash_free(hash_table_t* hash)
|
||||||
void
|
|
||||||
xb_filter_hash_free(hash_table_t* hash)
|
|
||||||
{
|
{
|
||||||
ulint i;
|
for (ulint i= 0; i < hash->n_cells; i++)
|
||||||
|
for (auto prev= static_cast<xb_filter_entry_t*>(hash->array[i].node);
|
||||||
/* free the hash elements */
|
prev; )
|
||||||
for (i = 0; i < hash->n_cells; i++) {
|
{
|
||||||
xb_filter_entry_t* table;
|
auto next= prev->name_hash;
|
||||||
|
free(prev);
|
||||||
table = static_cast<xb_filter_entry_t *>
|
prev= next;
|
||||||
(HASH_GET_FIRST(hash, i));
|
|
||||||
|
|
||||||
while (table) {
|
|
||||||
xb_filter_entry_t* prev_table = table;
|
|
||||||
|
|
||||||
table = static_cast<xb_filter_entry_t *>
|
|
||||||
(HASH_GET_NEXT(name_hash, prev_table));
|
|
||||||
const ulint fold = my_crc32c(0, prev_table->name,
|
|
||||||
strlen(prev_table->name));
|
|
||||||
HASH_DELETE(xb_filter_entry_t, name_hash, hash,
|
|
||||||
fold, prev_table);
|
|
||||||
free(prev_table);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
hash->free();
|
hash->free();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6025,8 +6000,8 @@ exit:
|
|||||||
table->name = ((char*)table) + sizeof(xb_filter_entry_t);
|
table->name = ((char*)table) + sizeof(xb_filter_entry_t);
|
||||||
memcpy(table->name, dest_space_name, len + 1);
|
memcpy(table->name, dest_space_name, len + 1);
|
||||||
const ulint fold = my_crc32c(0, dest_space_name, len);
|
const ulint fold = my_crc32c(0, dest_space_name, len);
|
||||||
HASH_INSERT(xb_filter_entry_t, name_hash, &inc_dir_tables_hash,
|
inc_dir_tables_hash.cell_get(fold)->append(
|
||||||
fold, table);
|
*table, &xb_filter_entry_t::name_hash);
|
||||||
|
|
||||||
mysql_mutex_lock(&fil_system.mutex);
|
mysql_mutex_lock(&fil_system.mutex);
|
||||||
fil_space = fil_space_get_by_name(dest_space_name);
|
fil_space = fil_space_get_by_name(dest_space_name);
|
||||||
@@ -6446,8 +6421,8 @@ static ibool prepare_handle_new_files(const char *data_home_dir,
|
|||||||
strcpy(table->name, table_name.c_str());
|
strcpy(table->name, table_name.c_str());
|
||||||
const ulint fold = my_crc32c(0, table->name,
|
const ulint fold = my_crc32c(0, table->name,
|
||||||
table_name.size());
|
table_name.size());
|
||||||
HASH_INSERT(xb_filter_entry_t, name_hash, &inc_dir_tables_hash,
|
inc_dir_tables_hash.cell_get(fold)->append(
|
||||||
fold, table);
|
*table, &xb_filter_entry_t::name_hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -6463,29 +6438,15 @@ rm_if_not_found(
|
|||||||
const char* data_home_dir, /*!<in: path to datadir */
|
const char* data_home_dir, /*!<in: path to datadir */
|
||||||
const char* db_name, /*!<in: database name */
|
const char* db_name, /*!<in: database name */
|
||||||
const char* file_name, /*!<in: file name with suffix */
|
const char* file_name, /*!<in: file name with suffix */
|
||||||
void* arg __attribute__((unused)))
|
void*)
|
||||||
{
|
{
|
||||||
char name[FN_REFLEN];
|
char name[FN_REFLEN];
|
||||||
xb_filter_entry_t* table;
|
|
||||||
|
|
||||||
snprintf(name, FN_REFLEN, "%s/%s", db_name, file_name);
|
|
||||||
/* Truncate ".ibd" */
|
/* Truncate ".ibd" */
|
||||||
const size_t len = strlen(name) - 4;
|
name[snprintf(name, FN_REFLEN, "%s/%s", db_name, file_name) - 4]= '\0';
|
||||||
name[len] = '\0';
|
if (find_filter_in_hashtable(name, &inc_dir_tables_hash, nullptr))
|
||||||
const ulint fold = my_crc32c(0, name, len);
|
return true;
|
||||||
|
snprintf(name, FN_REFLEN, "%s/%s/%s", data_home_dir, db_name, file_name);
|
||||||
HASH_SEARCH(name_hash, &inc_dir_tables_hash, fold,
|
|
||||||
xb_filter_entry_t*,
|
|
||||||
table, (void) 0,
|
|
||||||
!strcmp(table->name, name));
|
|
||||||
|
|
||||||
if (!table) {
|
|
||||||
snprintf(name, FN_REFLEN, "%s/%s/%s", data_home_dir,
|
|
||||||
db_name, file_name);
|
|
||||||
return os_file_delete(0, name);
|
return os_file_delete(0, name);
|
||||||
}
|
|
||||||
|
|
||||||
return(TRUE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Function enumerates files in datadir (provided by path) which are matched
|
/** Function enumerates files in datadir (provided by path) which are matched
|
||||||
|
@@ -49,7 +49,7 @@ static struct my_option my_long_options[] =
|
|||||||
{"debug", '#', "Output debug log", (char**) &default_dbug_option,
|
{"debug", '#', "Output debug log", (char**) &default_dbug_option,
|
||||||
(char**) &default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
(char**) &default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
#endif
|
#endif
|
||||||
{"mysqld", 0, "Read the same set of groups that the mysqld binary does.",
|
{"mysqld", 0, "Read the same set of groups that the mariadbd (previously known as mysqld) binary does.",
|
||||||
&opt_mysqld, &opt_mysqld, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
&opt_mysqld, &opt_mysqld, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
{"mariadbd", 0, "Read the same set of groups that the mariadbd binary does.",
|
{"mariadbd", 0, "Read the same set of groups that the mariadbd binary does.",
|
||||||
&opt_mysqld, &opt_mysqld, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
&opt_mysqld, &opt_mysqld, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||||
@@ -116,7 +116,7 @@ static int get_options(int *argc,char ***argv)
|
|||||||
int ho_error;
|
int ho_error;
|
||||||
|
|
||||||
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
if ((ho_error=handle_options(argc, argv, my_long_options, get_one_option)))
|
||||||
exit(ho_error);
|
cleanup_and_exit(ho_error);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -160,7 +160,8 @@ int main(int argc, char **argv)
|
|||||||
load_default_groups=(char**) my_malloc(PSI_NOT_INSTRUMENTED,
|
load_default_groups=(char**) my_malloc(PSI_NOT_INSTRUMENTED,
|
||||||
nargs*sizeof(char*), MYF(MY_WME));
|
nargs*sizeof(char*), MYF(MY_WME));
|
||||||
if (!load_default_groups)
|
if (!load_default_groups)
|
||||||
exit(1);
|
cleanup_and_exit(1);
|
||||||
|
|
||||||
if (opt_mysqld)
|
if (opt_mysqld)
|
||||||
{
|
{
|
||||||
for (; mysqld_groups[i]; i++)
|
for (; mysqld_groups[i]; i++)
|
||||||
|
@@ -42,6 +42,7 @@ SET(HEADERS
|
|||||||
my_dbug.h
|
my_dbug.h
|
||||||
m_string.h
|
m_string.h
|
||||||
my_sys.h
|
my_sys.h
|
||||||
|
my_cmp.h
|
||||||
my_xml.h
|
my_xml.h
|
||||||
mysql_embed.h
|
mysql_embed.h
|
||||||
my_decimal_limits.h
|
my_decimal_limits.h
|
||||||
|
@@ -42,7 +42,7 @@ extern "C" {
|
|||||||
#define HASH_THREAD_SPECIFIC 2 /* Mark allocated memory THREAD_SPECIFIC */
|
#define HASH_THREAD_SPECIFIC 2 /* Mark allocated memory THREAD_SPECIFIC */
|
||||||
|
|
||||||
typedef uint32 my_hash_value_type;
|
typedef uint32 my_hash_value_type;
|
||||||
typedef uchar *(*my_hash_get_key)(const uchar *,size_t*,my_bool);
|
typedef const uchar *(*my_hash_get_key)(const void *, size_t *, my_bool);
|
||||||
typedef my_hash_value_type (*my_hash_function)(CHARSET_INFO *,
|
typedef my_hash_value_type (*my_hash_function)(CHARSET_INFO *,
|
||||||
const uchar *, size_t);
|
const uchar *, size_t);
|
||||||
typedef void (*my_hash_free_key)(void *);
|
typedef void (*my_hash_free_key)(void *);
|
||||||
|
25
include/my_cmp.h
Normal file
25
include/my_cmp.h
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/* Copyright (c) 2024, MariaDB Corporation.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
typedef int (*qsort_cmp)(const void *, const void *);
|
||||||
|
typedef int (*qsort_cmp2)(void *param, const void *a, const void *b);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
@@ -540,10 +540,9 @@ typedef int pbool; /* Mixed prototypes can't take char */
|
|||||||
typedef int pshort; /* Mixed prototypes can't take short int */
|
typedef int pshort; /* Mixed prototypes can't take short int */
|
||||||
typedef double pfloat; /* Mixed prototypes can't take float */
|
typedef double pfloat; /* Mixed prototypes can't take float */
|
||||||
#endif
|
#endif
|
||||||
C_MODE_START
|
|
||||||
typedef int (*qsort_cmp)(const void *,const void *);
|
#include <my_cmp.h>
|
||||||
typedef int (*qsort_cmp2)(void*, const void *,const void *);
|
|
||||||
C_MODE_END
|
|
||||||
#define qsort_t RETQSORTTYPE /* Broken GCC can't handle typedef !!!! */
|
#define qsort_t RETQSORTTYPE /* Broken GCC can't handle typedef !!!! */
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
#ifdef HAVE_SYS_SOCKET_H
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
@@ -230,8 +230,8 @@ static inline ulonglong my_timer_cycles(void)
|
|||||||
ulonglong result;
|
ulonglong result;
|
||||||
__asm __volatile__("rdtime %0" : "=r"(result));
|
__asm __volatile__("rdtime %0" : "=r"(result));
|
||||||
return result;
|
return result;
|
||||||
}
|
|
||||||
# endif
|
# endif
|
||||||
|
}
|
||||||
#elif defined(HAVE_SYS_TIMES_H) && defined(HAVE_GETHRTIME)
|
#elif defined(HAVE_SYS_TIMES_H) && defined(HAVE_GETHRTIME)
|
||||||
#define MY_TIMER_ROUTINE_CYCLES MY_TIMER_ROUTINE_GETHRTIME
|
#define MY_TIMER_ROUTINE_CYCLES MY_TIMER_ROUTINE_GETHRTIME
|
||||||
/* gethrtime may appear as either cycle or nanosecond counter */
|
/* gethrtime may appear as either cycle or nanosecond counter */
|
||||||
|
@@ -29,6 +29,7 @@ C_MODE_START
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <typelib.h>
|
#include <typelib.h>
|
||||||
#include <my_alloca.h>
|
#include <my_alloca.h>
|
||||||
|
#include <my_cmp.h>
|
||||||
#include <mysql/plugin.h>
|
#include <mysql/plugin.h>
|
||||||
#include <mysql/service_my_print_error.h>
|
#include <mysql/service_my_print_error.h>
|
||||||
|
|
||||||
@@ -501,8 +502,6 @@ typedef struct st_io_cache /* Used when caching files */
|
|||||||
size_t alloced_buffer;
|
size_t alloced_buffer;
|
||||||
} IO_CACHE;
|
} IO_CACHE;
|
||||||
|
|
||||||
typedef int (*qsort2_cmp)(const void *, const void *, const void *);
|
|
||||||
|
|
||||||
typedef void (*my_error_reporter)(enum loglevel level, const char *format, ...)
|
typedef void (*my_error_reporter)(enum loglevel level, const char *format, ...)
|
||||||
ATTRIBUTE_FORMAT_FPTR(printf, 2, 3);
|
ATTRIBUTE_FORMAT_FPTR(printf, 2, 3);
|
||||||
|
|
||||||
@@ -806,8 +805,8 @@ extern void radixsort_for_str_ptr(uchar* base[], uint number_of_elements,
|
|||||||
extern qsort_t my_qsort(void *base_ptr, size_t total_elems, size_t size,
|
extern qsort_t my_qsort(void *base_ptr, size_t total_elems, size_t size,
|
||||||
qsort_cmp cmp);
|
qsort_cmp cmp);
|
||||||
extern qsort_t my_qsort2(void *base_ptr, size_t total_elems, size_t size,
|
extern qsort_t my_qsort2(void *base_ptr, size_t total_elems, size_t size,
|
||||||
qsort2_cmp cmp, void *cmp_argument);
|
qsort_cmp2 cmp, void *cmp_argument);
|
||||||
extern qsort2_cmp get_ptr_compare(size_t);
|
extern qsort_cmp2 get_ptr_compare(size_t);
|
||||||
void my_store_ptr(uchar *buff, size_t pack_length, my_off_t pos);
|
void my_store_ptr(uchar *buff, size_t pack_length, my_off_t pos);
|
||||||
my_off_t my_get_ptr(uchar *ptr, size_t pack_length);
|
my_off_t my_get_ptr(uchar *ptr, size_t pack_length);
|
||||||
extern int init_io_cache(IO_CACHE *info,File file,size_t cachesize,
|
extern int init_io_cache(IO_CACHE *info,File file,size_t cachesize,
|
||||||
|
@@ -374,7 +374,7 @@ typedef struct st_mi_sort_param
|
|||||||
my_bool fix_datafile, master;
|
my_bool fix_datafile, master;
|
||||||
my_bool calc_checksum; /* calculate table checksum */
|
my_bool calc_checksum; /* calculate table checksum */
|
||||||
|
|
||||||
int (*key_cmp)(struct st_mi_sort_param *, const void *, const void *);
|
int (*key_cmp)(void *, const void *, const void *);
|
||||||
int (*key_read)(struct st_mi_sort_param *,void *);
|
int (*key_read)(struct st_mi_sort_param *,void *);
|
||||||
int (*key_write)(struct st_mi_sort_param *, const void *);
|
int (*key_write)(struct st_mi_sort_param *, const void *);
|
||||||
void (*lock_in_memory)(HA_CHECK *);
|
void (*lock_in_memory)(HA_CHECK *);
|
||||||
|
@@ -31,6 +31,8 @@
|
|||||||
#ifndef _queues_h
|
#ifndef _queues_h
|
||||||
#define _queues_h
|
#define _queues_h
|
||||||
|
|
||||||
|
#include <my_cmp.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@@ -44,7 +46,7 @@ typedef struct st_queue {
|
|||||||
uint offset_to_queue_pos; /* If we want to store position in element */
|
uint offset_to_queue_pos; /* If we want to store position in element */
|
||||||
uint auto_extent;
|
uint auto_extent;
|
||||||
int max_at_top; /* Normally 1, set to -1 if queue_top gives max */
|
int max_at_top; /* Normally 1, set to -1 if queue_top gives max */
|
||||||
int (*compare)(void *, uchar *,uchar *);
|
qsort_cmp2 compare;
|
||||||
} QUEUE;
|
} QUEUE;
|
||||||
|
|
||||||
#define queue_first_element(queue) 1
|
#define queue_first_element(queue) 1
|
||||||
@@ -58,14 +60,13 @@ typedef struct st_queue {
|
|||||||
#define queue_set_max_at_top(queue, set_arg) \
|
#define queue_set_max_at_top(queue, set_arg) \
|
||||||
(queue)->max_at_top= set_arg ? -1 : 1
|
(queue)->max_at_top= set_arg ? -1 : 1
|
||||||
#define queue_remove_top(queue_arg) queue_remove((queue_arg), queue_first_element(queue_arg))
|
#define queue_remove_top(queue_arg) queue_remove((queue_arg), queue_first_element(queue_arg))
|
||||||
typedef int (*queue_compare)(void *,uchar *, uchar *);
|
|
||||||
|
|
||||||
int init_queue(QUEUE *queue,uint max_elements,uint offset_to_key,
|
int init_queue(QUEUE *queue,uint max_elements,uint offset_to_key,
|
||||||
my_bool max_at_top, queue_compare compare,
|
my_bool max_at_top, qsort_cmp2 compare,
|
||||||
void *first_cmp_arg, uint offset_to_queue_pos,
|
void *first_cmp_arg, uint offset_to_queue_pos,
|
||||||
uint auto_extent);
|
uint auto_extent);
|
||||||
int reinit_queue(QUEUE *queue,uint max_elements,uint offset_to_key,
|
int reinit_queue(QUEUE *queue,uint max_elements,uint offset_to_key,
|
||||||
my_bool max_at_top, queue_compare compare,
|
my_bool max_at_top, qsort_cmp2 compare,
|
||||||
void *first_cmp_arg, uint offset_to_queue_pos,
|
void *first_cmp_arg, uint offset_to_queue_pos,
|
||||||
uint auto_extent);
|
uint auto_extent);
|
||||||
int resize_queue(QUEUE *queue, uint max_elements);
|
int resize_queue(QUEUE *queue, uint max_elements);
|
||||||
|
Submodule libmariadb updated: 84e5e21936...f64d977210
@@ -15,8 +15,17 @@
|
|||||||
# file. By default the search happens from the last CURRENT_TEST:
|
# file. By default the search happens from the last CURRENT_TEST:
|
||||||
# marker till the end of file (appropriate for searching error logs).
|
# marker till the end of file (appropriate for searching error logs).
|
||||||
#
|
#
|
||||||
# Optionally, SEARCH_ABORT can be set to "FOUND" or "NOT FOUND" and this
|
# Optionally, SEARCH_ABORT can be specified to abort the search (in error)
|
||||||
# will abort if the search result doesn't match the requested one.
|
# if a specific search result is found. Its value is a regular expression
|
||||||
|
# (with an implicit start-of-string anchor '^' prepended), and the search
|
||||||
|
# result that it will match against is either 1) "FOUND <N>", where <N> is
|
||||||
|
# the specific number of matches found, or 2) "NOT FOUND".
|
||||||
|
#
|
||||||
|
# Optionally, SEARCH_WAIT can be specified to wait for a specific search
|
||||||
|
# result. Its usage mimics that of SEARCH_ABORT, in that its value is also
|
||||||
|
# a '^'-prepended regular expression, which will be matched against the same
|
||||||
|
# search result. The timeout can be set in SEARCH_TIMEOUT, default is 60
|
||||||
|
# seconds.
|
||||||
#
|
#
|
||||||
# Optionally, SEARCH_WAIT can be set to "FOUND" or "NOT FOUND", and this
|
# Optionally, SEARCH_WAIT can be set to "FOUND" or "NOT FOUND", and this
|
||||||
# will wait for the condition to occur. The timeout can be set in
|
# will wait for the condition to occur. The timeout can be set in
|
||||||
@@ -91,8 +100,7 @@ perl;
|
|||||||
@matches= ($content =~ /$search_pattern/gs);
|
@matches= ($content =~ /$search_pattern/gs);
|
||||||
$res=@matches ? "FOUND " . scalar(@matches) : "NOT FOUND";
|
$res=@matches ? "FOUND " . scalar(@matches) : "NOT FOUND";
|
||||||
|
|
||||||
if (($ENV{SEARCH_WAIT} eq 'FOUND' && $res eq 'NOT FOUND') ||
|
if ($ENV{SEARCH_WAIT} and not $res =~ /^$ENV{SEARCH_WAIT}/) {
|
||||||
($ENV{SEARCH_WAIT} eq 'NOT FOUND' && $res =~ m{^FOUND })) {
|
|
||||||
if (time() - $start_time < $timeout) {
|
if (time() - $start_time < $timeout) {
|
||||||
# Millisceond sleep emulated with select
|
# Millisceond sleep emulated with select
|
||||||
select(undef, undef, undef, 0.1);
|
select(undef, undef, undef, 0.1);
|
||||||
|
@@ -1,55 +0,0 @@
|
|||||||
# ==== Purpose ====
|
|
||||||
#
|
|
||||||
# Waits until pattern comes into log file or until a timeout is reached.
|
|
||||||
# This is a timeout wrapper for search_pattern_in_file.inc
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# ==== Usage ====
|
|
||||||
#
|
|
||||||
# [--let $timeout= NUMBER in seconds]
|
|
||||||
# For other parameters, check search_pattern_in_file.inc
|
|
||||||
|
|
||||||
--let $wait_save_keep_include_silent=$keep_include_silent
|
|
||||||
--let $include_filename= wait_for_pattern_in_file.inc
|
|
||||||
--source include/begin_include_file.inc
|
|
||||||
--let $keep_include_silent= 1
|
|
||||||
|
|
||||||
let $_timeout= $timeout;
|
|
||||||
if (!$_timeout)
|
|
||||||
{
|
|
||||||
let $_timeout= 10;
|
|
||||||
if ($VALGRIND_TEST)
|
|
||||||
{
|
|
||||||
let $_timeout= 30;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let $_timeout_counter=`SELECT $_timeout * 10`;
|
|
||||||
let SEARCH_ABORT=NOT FOUND;
|
|
||||||
let $_continue= 1;
|
|
||||||
disable_abort_on_error;
|
|
||||||
while ($_continue)
|
|
||||||
{
|
|
||||||
source include/search_pattern_in_file.inc;
|
|
||||||
if (!$errno)
|
|
||||||
{
|
|
||||||
# Found match
|
|
||||||
let $_continue= 0;
|
|
||||||
}
|
|
||||||
if ($errno)
|
|
||||||
{
|
|
||||||
dec $_timeout_counter;
|
|
||||||
if ($_timeout_counter == 1)
|
|
||||||
{
|
|
||||||
enable_abort_on_error;
|
|
||||||
}
|
|
||||||
if (!$_timeout_counter)
|
|
||||||
{
|
|
||||||
let $_continue= 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
enable_abort_on_error;
|
|
||||||
|
|
||||||
--source include/end_include_file.inc
|
|
||||||
--let $keep_include_silent=$wait_save_keep_include_silent
|
|
@@ -2983,4 +2983,39 @@ t2 CREATE TABLE `t2` (
|
|||||||
`c` text /*M!100301 COMPRESSED*/ DEFAULT NULL
|
`c` text /*M!100301 COMPRESSED*/ DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
|
#
|
||||||
|
# MDEV-16698 ASAN: heap-use-after-free in field_longstr::uncompress
|
||||||
|
#
|
||||||
|
CREATE TABLE t5 (
|
||||||
|
i1 smallint(11) unsigned zerofill ,
|
||||||
|
e1 enum('','a') ,
|
||||||
|
b1 mediumblob /*!100301 COMPRESSED*/ ,
|
||||||
|
d2 date NOT NULL DEFAULT '1900-01-01',
|
||||||
|
pk bigint(20) unsigned NOT NULL DEFAULT 0,
|
||||||
|
d1 timestamp NULL ,
|
||||||
|
v1 varbinary(3362) ,
|
||||||
|
t1 time NOT NULL DEFAULT '00:00:00'
|
||||||
|
);
|
||||||
|
INSERT INTO t5 VALUES
|
||||||
|
(00000000004,'','ufhjdtv','1992-07-25',1,'2035-06-05 09:02:48','f','13:25:21'),
|
||||||
|
(00000000001,'','jdt','1998-07-03',2,'1994-05-05 19:59:20','','09:09:19'),
|
||||||
|
(00000000000,'','d','2007-12-05',3,'0000-00-00 00:00:00','tvs','02:51:15');
|
||||||
|
SELECT GROUP_CONCAT(t5.i1, IF(t5.e1, t5.b1, t5.e1),
|
||||||
|
IF(t5.d1, t5.t1, t5.d1), t5.v1,
|
||||||
|
IF(t5.i1, t5.i1, t5.d2), t5.v1, t5.b1
|
||||||
|
ORDER BY 2,6 SEPARATOR ';')
|
||||||
|
FROM (t5 JOIN t5 AS tt ON (tt.pk != t5.pk));
|
||||||
|
DROP TABLE t5;
|
||||||
|
create table t1 (pk int not null, b1 blob compressed, v1 varbinary(100))engine=innodb;
|
||||||
|
insert into t1 values (1,'ufhjdtv','f'),(2,'jdt',''),(3,'d','tvs');
|
||||||
|
select group_concat(t1.v1, t1.b1 order by 1) from (t1 join t1 as tt on (tt.pk != t1.pk));
|
||||||
|
group_concat(t1.v1, t1.b1 order by 1)
|
||||||
|
jdt,jdt,fufhjdtv,fufhjdtv,tvsd,tvsd
|
||||||
|
drop table t1;
|
||||||
|
CREATE TABLE t1 (a CHAR(1), b TEXT /*!100302 COMPRESSED */);
|
||||||
|
INSERT INTO t1 VALUES ('c','n'),('d','mmmmmmmmmm');
|
||||||
|
SELECT GROUP_CONCAT( b, a ORDER BY 2 ) AS f FROM t1;
|
||||||
|
f
|
||||||
|
nc,mmmmmmmmmmd
|
||||||
|
DROP TABLE t1;
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
|
@@ -487,4 +487,41 @@ create table t2 as select group_concat(c order by 1), concat(c), c from t1;
|
|||||||
show create table t2;
|
show create table t2;
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-16698 ASAN: heap-use-after-free in field_longstr::uncompress
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t5 (
|
||||||
|
i1 smallint(11) unsigned zerofill ,
|
||||||
|
e1 enum('','a') ,
|
||||||
|
b1 mediumblob /*!100301 COMPRESSED*/ ,
|
||||||
|
d2 date NOT NULL DEFAULT '1900-01-01',
|
||||||
|
pk bigint(20) unsigned NOT NULL DEFAULT 0,
|
||||||
|
d1 timestamp NULL ,
|
||||||
|
v1 varbinary(3362) ,
|
||||||
|
t1 time NOT NULL DEFAULT '00:00:00'
|
||||||
|
);
|
||||||
|
INSERT INTO t5 VALUES
|
||||||
|
(00000000004,'','ufhjdtv','1992-07-25',1,'2035-06-05 09:02:48','f','13:25:21'),
|
||||||
|
(00000000001,'','jdt','1998-07-03',2,'1994-05-05 19:59:20','','09:09:19'),
|
||||||
|
(00000000000,'','d','2007-12-05',3,'0000-00-00 00:00:00','tvs','02:51:15');
|
||||||
|
--disable_result_log
|
||||||
|
SELECT GROUP_CONCAT(t5.i1, IF(t5.e1, t5.b1, t5.e1),
|
||||||
|
IF(t5.d1, t5.t1, t5.d1), t5.v1,
|
||||||
|
IF(t5.i1, t5.i1, t5.d2), t5.v1, t5.b1
|
||||||
|
ORDER BY 2,6 SEPARATOR ';')
|
||||||
|
FROM (t5 JOIN t5 AS tt ON (tt.pk != t5.pk));
|
||||||
|
DROP TABLE t5;
|
||||||
|
--enable_result_log
|
||||||
|
|
||||||
|
create table t1 (pk int not null, b1 blob compressed, v1 varbinary(100))engine=innodb;
|
||||||
|
insert into t1 values (1,'ufhjdtv','f'),(2,'jdt',''),(3,'d','tvs');
|
||||||
|
select group_concat(t1.v1, t1.b1 order by 1) from (t1 join t1 as tt on (tt.pk != t1.pk));
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a CHAR(1), b TEXT /*!100302 COMPRESSED */);
|
||||||
|
INSERT INTO t1 VALUES ('c','n'),('d','mmmmmmmmmm');
|
||||||
|
SELECT GROUP_CONCAT( b, a ORDER BY 2 ) AS f FROM t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo # End of 10.5 tests
|
--echo # End of 10.5 tests
|
||||||
|
@@ -3455,3 +3455,51 @@ DROP TABLE t1;
|
|||||||
#
|
#
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
#
|
#
|
||||||
|
#
|
||||||
|
# Start of 10.11 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-28767 Collation "binary" is not accepted for databases, tables, columns
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a CHAR(1) COLLATE binary);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` binary(1) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a enum('a') CHARACTER SET binary COLLATE binary DEFAULT NULL);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` enum('a') CHARACTER SET binary DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a enum('a') COLLATE binary DEFAULT NULL);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` enum('a') CHARACTER SET binary DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a CHAR(1) CHARACTER SET latin1 COLLATE binary);
|
||||||
|
ERROR 42000: COLLATION 'binary' is not valid for CHARACTER SET 'latin1'
|
||||||
|
CREATE TABLE t1 (a CHAR(10)) COLLATE binary;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` binary(10) DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=binary
|
||||||
|
DROP TABLE t1;
|
||||||
|
CREATE TABLE t1 (a CHAR(10)) CHARACTER SET latin1 COLLATE binary;
|
||||||
|
ERROR 42000: COLLATION 'binary' is not valid for CHARACTER SET 'latin1'
|
||||||
|
CREATE DATABASE db1 COLLATE binary;
|
||||||
|
SHOW CREATE DATABASE db1;
|
||||||
|
Database Create Database
|
||||||
|
db1 CREATE DATABASE `db1` /*!40100 DEFAULT CHARACTER SET binary */
|
||||||
|
DROP DATABASE db1;
|
||||||
|
CREATE DATABASE db1 CHARACTER SET latin1 COLLATE binary;
|
||||||
|
ERROR 42000: COLLATION 'binary' is not valid for CHARACTER SET 'latin1'
|
||||||
|
#
|
||||||
|
# End of 10.11 tests
|
||||||
|
#
|
||||||
|
@@ -294,3 +294,50 @@ DROP TABLE t1;
|
|||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.5 tests
|
--echo # End of 10.5 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.11 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28767 Collation "binary" is not accepted for databases, tables, columns
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
# Column level
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a CHAR(1) COLLATE binary);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a enum('a') CHARACTER SET binary COLLATE binary DEFAULT NULL);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a enum('a') COLLATE binary DEFAULT NULL);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--error ER_COLLATION_CHARSET_MISMATCH
|
||||||
|
CREATE TABLE t1 (a CHAR(1) CHARACTER SET latin1 COLLATE binary);
|
||||||
|
|
||||||
|
|
||||||
|
# Table level
|
||||||
|
CREATE TABLE t1 (a CHAR(10)) COLLATE binary;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--error ER_COLLATION_CHARSET_MISMATCH
|
||||||
|
CREATE TABLE t1 (a CHAR(10)) CHARACTER SET latin1 COLLATE binary;
|
||||||
|
|
||||||
|
|
||||||
|
# Database level
|
||||||
|
CREATE DATABASE db1 COLLATE binary;
|
||||||
|
SHOW CREATE DATABASE db1;
|
||||||
|
DROP DATABASE db1;
|
||||||
|
|
||||||
|
--error ER_COLLATION_CHARSET_MISMATCH
|
||||||
|
CREATE DATABASE db1 CHARACTER SET latin1 COLLATE binary;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.11 tests
|
||||||
|
--echo #
|
||||||
|
@@ -161,6 +161,21 @@ ERROR 42000: Column length too big for column 'a' (max = 204); use BLOB or TEXT
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
#
|
#
|
||||||
|
# Start of 10.6 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-35393 ASAN unknown-crash in Field_varstring::reset when inserting NULL value to a table with filename charset
|
||||||
|
#
|
||||||
|
SET sql_mode='';
|
||||||
|
CREATE TABLE t (a CHAR(205)) ENGINE=MYISAM CHARACTER SET filename;
|
||||||
|
Warnings:
|
||||||
|
Note 1246 Converting column 'a' from CHAR to VARCHAR
|
||||||
|
INSERT INTO t VALUES (NULL);
|
||||||
|
DROP TABLE t;
|
||||||
|
#
|
||||||
|
# End of 10.6 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
# Start of 10.9 tests
|
# Start of 10.9 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@@ -168,6 +168,24 @@ DROP TABLE t1;
|
|||||||
|
|
||||||
--echo # End of 10.5 tests
|
--echo # End of 10.5 tests
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.6 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-35393 ASAN unknown-crash in Field_varstring::reset when inserting NULL value to a table with filename charset
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET sql_mode='';
|
||||||
|
CREATE TABLE t (a CHAR(205)) ENGINE=MYISAM CHARACTER SET filename;
|
||||||
|
INSERT INTO t VALUES (NULL);
|
||||||
|
DROP TABLE t;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.6 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Start of 10.9 tests
|
--echo # Start of 10.9 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
18
mysql-test/main/ctype_filename_innodb.result
Normal file
18
mysql-test/main/ctype_filename_innodb.result
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#
|
||||||
|
# Start of 10.6 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-35392 Assertion `!__asan_region_is_poisoned((vo id*) dest,templ->mysql_col_len)' failed in void row_sel_field_store_in_mysql_format_func(byte *, const mysql_row_templ_t *, const byte *, ulint)
|
||||||
|
#
|
||||||
|
SET sql_mode='';
|
||||||
|
CREATE TABLE t (a CHAR(205)) ENGINE=INNODB CHARACTER SET filename;
|
||||||
|
Warnings:
|
||||||
|
Note 1246 Converting column 'a' from CHAR to VARCHAR
|
||||||
|
INSERT INTO t VALUES (1);
|
||||||
|
SELECT * FROM t;
|
||||||
|
a
|
||||||
|
1
|
||||||
|
DROP TABLE t;
|
||||||
|
#
|
||||||
|
# End of 10.6 tests
|
||||||
|
#
|
19
mysql-test/main/ctype_filename_innodb.test
Normal file
19
mysql-test/main/ctype_filename_innodb.test
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
--source include/have_innodb.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.6 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-35392 Assertion `!__asan_region_is_poisoned((vo id*) dest,templ->mysql_col_len)' failed in void row_sel_field_store_in_mysql_format_func(byte *, const mysql_row_templ_t *, const byte *, ulint)
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET sql_mode='';
|
||||||
|
CREATE TABLE t (a CHAR(205)) ENGINE=INNODB CHARACTER SET filename;
|
||||||
|
INSERT INTO t VALUES (1);
|
||||||
|
SELECT * FROM t;
|
||||||
|
DROP TABLE t;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.6 tests
|
||||||
|
--echo #
|
@@ -681,10 +681,10 @@ INSERT INTO t1 VALUES
|
|||||||
(REPEAT(0x1125,200000), REPEAT(0x1125,200000)), ('', ''), ('', '');
|
(REPEAT(0x1125,200000), REPEAT(0x1125,200000)), ('', ''), ('', '');
|
||||||
SELECT a FROM t1 GROUP BY 1 LIMIT 1 INTO @nullll;
|
SELECT a FROM t1 GROUP BY 1 LIMIT 1 INTO @nullll;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4202 1 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 1 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
SELECT b FROM t1 GROUP BY 1 LIMIT 1 INTO @nullll;
|
SELECT b FROM t1 GROUP BY 1 LIMIT 1 INTO @nullll;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4202 1 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 1 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
DROP TABLES t1;
|
DROP TABLES t1;
|
||||||
End of 5.0 tests
|
End of 5.0 tests
|
||||||
#
|
#
|
||||||
|
@@ -6796,3 +6796,23 @@ c1
|
|||||||
#
|
#
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
#
|
#
|
||||||
|
#
|
||||||
|
# Start of 10.6 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-23895 Server crash, ASAN heap-buffer-overflow or Valgrind Invalid write in Item_func_rpad::val_str
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a CHAR(8));
|
||||||
|
INSERT INTO t1 VALUES ('foo'),('bar');
|
||||||
|
SET collation_connection= ucs2_danish_ci;
|
||||||
|
SET last_insert_id=0;
|
||||||
|
SELECT * FROM t1 WHERE RPAD(a, 50, LAST_INSERT_ID());
|
||||||
|
a
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect DOUBLE value: 'foo00000000000000000000000000000000000000000000000'
|
||||||
|
Warning 1292 Truncated incorrect DOUBLE value: 'bar00000000000000000000000000000000000000000000000'
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET names latin1;
|
||||||
|
#
|
||||||
|
# End of 10.6 tests
|
||||||
|
#
|
||||||
|
@@ -1242,3 +1242,24 @@ SELECT CAST(CONVERT('-9223372036854775808' USING ucs2) AS SIGNED) AS c1;
|
|||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.5 tests
|
--echo # End of 10.5 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.6 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-23895 Server crash, ASAN heap-buffer-overflow or Valgrind Invalid write in Item_func_rpad::val_str
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a CHAR(8));
|
||||||
|
INSERT INTO t1 VALUES ('foo'),('bar');
|
||||||
|
SET collation_connection= ucs2_danish_ci;
|
||||||
|
SET last_insert_id=0;
|
||||||
|
SELECT * FROM t1 WHERE RPAD(a, 50, LAST_INSERT_ID());
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET names latin1;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.6 tests
|
||||||
|
--echo #
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
SET TIME_ZONE='+03:00';
|
SET TIME_ZONE='+03:00';
|
||||||
DROP TABLE IF EXISTS t1;
|
|
||||||
#
|
#
|
||||||
# Start of 5.5 tests
|
# Start of 5.5 tests
|
||||||
#
|
#
|
||||||
@@ -3153,5 +3152,15 @@ CAST(_utf16 0x0061D83DDE0E0062 AS INT)
|
|||||||
Warnings:
|
Warnings:
|
||||||
Warning 1292 Truncated incorrect INTEGER value: 'a?b'
|
Warning 1292 Truncated incorrect INTEGER value: 'a?b'
|
||||||
#
|
#
|
||||||
|
# MDEV-23138 Odd behavior of character_set variables set to utf16 (when allowed)
|
||||||
|
#
|
||||||
|
SET character_set_connection=utf16;
|
||||||
|
SET transaction_isolation= 'READ-COMMITTED';
|
||||||
|
SELECT @@transaction_isolation;
|
||||||
|
@@transaction_isolation
|
||||||
|
READ-COMMITTED
|
||||||
|
SET transaction_isolation=DEFAULT;
|
||||||
|
SET NAMES utf8mb3;
|
||||||
|
#
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
#
|
#
|
||||||
|
@@ -3,10 +3,6 @@
|
|||||||
|
|
||||||
SET TIME_ZONE='+03:00';
|
SET TIME_ZONE='+03:00';
|
||||||
|
|
||||||
--disable_warnings
|
|
||||||
DROP TABLE IF EXISTS t1;
|
|
||||||
--enable_warnings
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # Start of 5.5 tests
|
--echo # Start of 5.5 tests
|
||||||
--echo #
|
--echo #
|
||||||
@@ -1033,6 +1029,15 @@ SET NAMES utf8;
|
|||||||
# surrogate pairs is replaced to a single question mark.
|
# surrogate pairs is replaced to a single question mark.
|
||||||
SELECT CAST(_utf16 0x0061D83DDE0E0062 AS INT);
|
SELECT CAST(_utf16 0x0061D83DDE0E0062 AS INT);
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-23138 Odd behavior of character_set variables set to utf16 (when allowed)
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET character_set_connection=utf16;
|
||||||
|
SET transaction_isolation= 'READ-COMMITTED';
|
||||||
|
SELECT @@transaction_isolation;
|
||||||
|
SET transaction_isolation=DEFAULT;
|
||||||
|
SET NAMES utf8mb3;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.5 tests
|
--echo # End of 10.5 tests
|
||||||
|
@@ -10769,8 +10769,8 @@ Warning 1292 Truncated incorrect INTEGER value: 'яяя'
|
|||||||
# MDEV-28118 Wrong collation of `CAST(.. AS CHAR COLLATE DEFAULT)`
|
# MDEV-28118 Wrong collation of `CAST(.. AS CHAR COLLATE DEFAULT)`
|
||||||
#
|
#
|
||||||
SET NAMES utf8mb3 COLLATE utf8mb3_bin;
|
SET NAMES utf8mb3 COLLATE utf8mb3_bin;
|
||||||
SELECT COLLATION(CAST('a' AS CHAR COLLATE DEFAULT));
|
SELECT COLLATION(CAST('a' AS CHAR COLLATE DEFAULT)) AS c1;
|
||||||
COLLATION(CAST('a' AS CHAR COLLATE DEFAULT))
|
c1
|
||||||
utf8mb3_general_ci
|
utf8mb3_general_ci
|
||||||
CREATE TABLE t1 AS SELECT CAST('a' AS CHAR COLLATE DEFAULT) AS c1;
|
CREATE TABLE t1 AS SELECT CAST('a' AS CHAR COLLATE DEFAULT) AS c1;
|
||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
|
@@ -2508,7 +2508,7 @@ SELECT CAST(_utf8 'яяя' AS INT);
|
|||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
SET NAMES utf8mb3 COLLATE utf8mb3_bin;
|
SET NAMES utf8mb3 COLLATE utf8mb3_bin;
|
||||||
SELECT COLLATION(CAST('a' AS CHAR COLLATE DEFAULT));
|
SELECT COLLATION(CAST('a' AS CHAR COLLATE DEFAULT)) AS c1;
|
||||||
CREATE TABLE t1 AS SELECT CAST('a' AS CHAR COLLATE DEFAULT) AS c1;
|
CREATE TABLE t1 AS SELECT CAST('a' AS CHAR COLLATE DEFAULT) AS c1;
|
||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@@ -245,5 +245,15 @@ Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_
|
|||||||
test.t1.c 1.1 1.3 3 3 0 0 3.0000 NULL ENUM('1.1','1.3') NOT NULL
|
test.t1.c 1.1 1.3 3 3 0 0 3.0000 NULL ENUM('1.1','1.3') NOT NULL
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
|
# MDEV-31881 ASAN: unknown-crash in check_ulonglong (sql/sql_analyse.cc) on SELECT ... FROM ... PROCEDURE ANALYSE()
|
||||||
|
#
|
||||||
|
CREATE TABLE t (a INT, b CHAR(10));
|
||||||
|
INSERT INTO t VALUES (0,'0000000000');
|
||||||
|
SELECT * FROM t PROCEDURE ANALYSE();
|
||||||
|
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
|
||||||
|
test.t.a 0 0 1 1 1 0 0.0000 0.0000 ENUM('0') NOT NULL
|
||||||
|
test.t.b 0000000000 0000000000 10 10 0 0 10.0000 NULL ENUM('0000000000') NOT NULL
|
||||||
|
DROP TABLE t;
|
||||||
|
#
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
#
|
#
|
||||||
|
@@ -255,6 +255,15 @@ INSERT INTO t1 VALUES (1.3),(1.1);
|
|||||||
SELECT * FROM t1 PROCEDURE ANALYSE();
|
SELECT * FROM t1 PROCEDURE ANALYSE();
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-31881 ASAN: unknown-crash in check_ulonglong (sql/sql_analyse.cc) on SELECT ... FROM ... PROCEDURE ANALYSE()
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t (a INT, b CHAR(10));
|
||||||
|
INSERT INTO t VALUES (0,'0000000000');
|
||||||
|
SELECT * FROM t PROCEDURE ANALYSE();
|
||||||
|
DROP TABLE t;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.5 tests
|
--echo # End of 10.5 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@@ -43,3 +43,14 @@ a
|
|||||||
4828532208463511553
|
4828532208463511553
|
||||||
drop table t1;
|
drop table t1;
|
||||||
#End of 4.1 tests
|
#End of 4.1 tests
|
||||||
|
# Start of 10.5 tests
|
||||||
|
#
|
||||||
|
# MDEV-21029 Incorrect result for expression with the <=> operator and IS NULL
|
||||||
|
#
|
||||||
|
CREATE TABLE t0(c0 INT);
|
||||||
|
INSERT INTO t0 VALUES (1);
|
||||||
|
SELECT (c0 > (NULL <=> 0)) IS NULL AS c1 FROM t0;
|
||||||
|
c1
|
||||||
|
0
|
||||||
|
DROP TABLE t0;
|
||||||
|
# End of 10.5 tests
|
||||||
|
@@ -44,3 +44,18 @@ select * from t1 where a in ('4828532208463511553');
|
|||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
--echo #End of 4.1 tests
|
--echo #End of 4.1 tests
|
||||||
|
|
||||||
|
|
||||||
|
--echo # Start of 10.5 tests
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-21029 Incorrect result for expression with the <=> operator and IS NULL
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t0(c0 INT);
|
||||||
|
INSERT INTO t0 VALUES (1);
|
||||||
|
SELECT (c0 > (NULL <=> 0)) IS NULL AS c1 FROM t0;
|
||||||
|
DROP TABLE t0;
|
||||||
|
|
||||||
|
|
||||||
|
--echo # End of 10.5 tests
|
||||||
|
@@ -1478,5 +1478,55 @@ NULL
|
|||||||
Warnings:
|
Warnings:
|
||||||
Warning 1292 Incorrect interval value: '42949672955000x1'
|
Warning 1292 Incorrect interval value: '42949672955000x1'
|
||||||
#
|
#
|
||||||
|
# MDEV-23687 Assertion `is_valid_value_slow()' failed in Datetime::Datetime upon EXTRACT under mode ZERO_DATE_TIME_CAST
|
||||||
|
#
|
||||||
|
SET SESSION old_mode='ZERO_DATE_TIME_CAST';
|
||||||
|
Warnings:
|
||||||
|
Warning 1287 'ZERO_DATE_TIME_CAST' is deprecated and will be removed in a future release
|
||||||
|
SELECT CAST('100000:00:00' AS DATETIME);
|
||||||
|
CAST('100000:00:00' AS DATETIME)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Incorrect datetime value: '100000:00:00'
|
||||||
|
SELECT EXTRACT(DAY FROM CAST('100000:00:00' AS DATETIME));
|
||||||
|
EXTRACT(DAY FROM CAST('100000:00:00' AS DATETIME))
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Incorrect datetime value: '100000:00:00'
|
||||||
|
SELECT CAST('100000:00:00' AS DATE);
|
||||||
|
CAST('100000:00:00' AS DATE)
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Incorrect datetime value: '100000:00:00'
|
||||||
|
SELECT EXTRACT(DAY FROM CAST('100000:00:00' AS DATE));
|
||||||
|
EXTRACT(DAY FROM CAST('100000:00:00' AS DATE))
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Incorrect datetime value: '100000:00:00'
|
||||||
|
SET SESSION old_mode=DEFAULT;
|
||||||
|
#
|
||||||
|
# MDEV-35489 Assertion `!ldate->neg' or unexpected result upon extracting unit from invalid value
|
||||||
|
#
|
||||||
|
SELECT EXTRACT(DAY FROM TIMESTAMP(-177498480000));
|
||||||
|
EXTRACT(DAY FROM TIMESTAMP(-177498480000))
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Incorrect datetime value: '-177498480000'
|
||||||
|
SELECT EXTRACT(DAY FROM TIMESTAMP(-177498480001));
|
||||||
|
EXTRACT(DAY FROM TIMESTAMP(-177498480001))
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Incorrect datetime value: '-177498480001'
|
||||||
|
SELECT EXTRACT(DAY FROM TIMESTAMP(-200000000000));
|
||||||
|
EXTRACT(DAY FROM TIMESTAMP(-200000000000))
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Incorrect datetime value: '-200000000000'
|
||||||
|
SELECT EXTRACT(DAY FROM TIMESTAMP(-221938034527));
|
||||||
|
EXTRACT(DAY FROM TIMESTAMP(-221938034527))
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Incorrect datetime value: '-221938034527'
|
||||||
|
#
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
#
|
#
|
||||||
|
@@ -517,6 +517,26 @@ DROP FUNCTION select02;
|
|||||||
|
|
||||||
SELECT EXTRACT(HOUR_MICROSECOND FROM '42949672955000x1');
|
SELECT EXTRACT(HOUR_MICROSECOND FROM '42949672955000x1');
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-23687 Assertion `is_valid_value_slow()' failed in Datetime::Datetime upon EXTRACT under mode ZERO_DATE_TIME_CAST
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET SESSION old_mode='ZERO_DATE_TIME_CAST';
|
||||||
|
SELECT CAST('100000:00:00' AS DATETIME);
|
||||||
|
SELECT EXTRACT(DAY FROM CAST('100000:00:00' AS DATETIME));
|
||||||
|
SELECT CAST('100000:00:00' AS DATE);
|
||||||
|
SELECT EXTRACT(DAY FROM CAST('100000:00:00' AS DATE));
|
||||||
|
SET SESSION old_mode=DEFAULT;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-35489 Assertion `!ldate->neg' or unexpected result upon extracting unit from invalid value
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SELECT EXTRACT(DAY FROM TIMESTAMP(-177498480000));
|
||||||
|
SELECT EXTRACT(DAY FROM TIMESTAMP(-177498480001));
|
||||||
|
SELECT EXTRACT(DAY FROM TIMESTAMP(-200000000000));
|
||||||
|
SELECT EXTRACT(DAY FROM TIMESTAMP(-221938034527));
|
||||||
|
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.5 tests
|
--echo # End of 10.5 tests
|
||||||
|
@@ -4342,5 +4342,27 @@ SELECT * FROM t0 WHERE LEAST(c0, NULL);
|
|||||||
c0
|
c0
|
||||||
DROP TABLE t0;
|
DROP TABLE t0;
|
||||||
#
|
#
|
||||||
|
# MDEV-28001 greatest/least with bigint unsigned maxium has unexpected results compared to 0
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a BIGINT UNSIGNED, b BIGINT UNSIGNED);
|
||||||
|
INSERT INTO t1 VALUES (18446744073709551615,0);
|
||||||
|
SELECT a,b, LEAST(a,b), GREATEST(a,b) FROM t1;
|
||||||
|
a b LEAST(a,b) GREATEST(a,b)
|
||||||
|
18446744073709551615 0 0 18446744073709551615
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
#
|
#
|
||||||
|
#
|
||||||
|
# Start of 10.6 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-20944 Wrong result of LEAST() and ASAN heap-use-after-free in my_strnncollsp_simple / Item::temporal_precision on TIME()
|
||||||
|
#
|
||||||
|
SET NAMES latin1;
|
||||||
|
SELECT LEAST( CAST( 0 AS CHAR ), OLD_PASSWORD( 1 ) );
|
||||||
|
LEAST( CAST( 0 AS CHAR ), OLD_PASSWORD( 1 ) )
|
||||||
|
0
|
||||||
|
#
|
||||||
|
# End of 10.6 tests
|
||||||
|
#
|
||||||
|
@@ -1137,7 +1137,30 @@ SELECT * FROM t0 WHERE GREATEST(c0, NULL);
|
|||||||
SELECT * FROM t0 WHERE LEAST(c0, NULL);
|
SELECT * FROM t0 WHERE LEAST(c0, NULL);
|
||||||
DROP TABLE t0;
|
DROP TABLE t0;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28001 greatest/least with bigint unsigned maxium has unexpected results compared to 0
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a BIGINT UNSIGNED, b BIGINT UNSIGNED);
|
||||||
|
INSERT INTO t1 VALUES (18446744073709551615,0);
|
||||||
|
SELECT a,b, LEAST(a,b), GREATEST(a,b) FROM t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.5 tests
|
--echo # End of 10.5 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.6 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-20944 Wrong result of LEAST() and ASAN heap-use-after-free in my_strnncollsp_simple / Item::temporal_precision on TIME()
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES latin1;
|
||||||
|
SELECT LEAST( CAST( 0 AS CHAR ), OLD_PASSWORD( 1 ) );
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.6 tests
|
||||||
|
--echo #
|
||||||
|
@@ -1757,5 +1757,18 @@ count(*)
|
|||||||
0
|
0
|
||||||
drop table t1;
|
drop table t1;
|
||||||
#
|
#
|
||||||
|
# MDEV-29462 ASAN: heap-use-after-free in Binary_string::copy on DO CONVERT
|
||||||
|
#
|
||||||
|
DO CONVERT (INET_ATON (CAST(LEFT (-1,1) as BINARY (30))) USING utf8);
|
||||||
|
DO FROM_BASE64(CAST((MID(UUID(),20,64)) AS BINARY (55)));
|
||||||
|
Warnings:
|
||||||
|
Warning 1958 Bad base64 data as position 4
|
||||||
|
DO FROM_BASE64(CAST((MID(17653,ROW('-688:20:162697', (NULL))>=ROW(('*.)$'),(0xc254b6)),1)) AS BINARY (34)));
|
||||||
|
Warnings:
|
||||||
|
Warning 1958 Bad base64 data as position 1
|
||||||
|
DO FROM_BASE64(CAST(LEFT (-1,1) as BINARY (30)));
|
||||||
|
Warnings:
|
||||||
|
Warning 1958 Bad base64 data as position 0
|
||||||
|
#
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
#
|
#
|
||||||
|
@@ -1381,6 +1381,16 @@ SELECT r as r1, r FROM cte;
|
|||||||
select count(*) from t1 where r1!=r;
|
select count(*) from t1 where r1!=r;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-29462 ASAN: heap-use-after-free in Binary_string::copy on DO CONVERT
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
DO CONVERT (INET_ATON (CAST(LEFT (-1,1) as BINARY (30))) USING utf8);
|
||||||
|
DO FROM_BASE64(CAST((MID(UUID(),20,64)) AS BINARY (55)));
|
||||||
|
DO FROM_BASE64(CAST((MID(17653,ROW('-688:20:162697', (NULL))>=ROW(('*.)$'),(0xc254b6)),1)) AS BINARY (34)));
|
||||||
|
DO FROM_BASE64(CAST(LEFT (-1,1) as BINARY (30)));
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.5 tests
|
--echo # End of 10.5 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
|
@@ -224,3 +224,8 @@ SELECT INTERVAL(1,ROW(1,2));
|
|||||||
ERROR 21000: Operand should contain 1 column(s)
|
ERROR 21000: Operand should contain 1 column(s)
|
||||||
SELECT INTERVAL(ROW(1,2),1);
|
SELECT INTERVAL(ROW(1,2),1);
|
||||||
ERROR 21000: Operand should contain 1 column(s)
|
ERROR 21000: Operand should contain 1 column(s)
|
||||||
|
#
|
||||||
|
# MDEV-29184 Assertion `0' in Item_row::illegal_method_call, Type_handler_row::Item_update_null_value, Item::update_null_value
|
||||||
|
#
|
||||||
|
SELECT INTERVAL(0, ROW(1,1), 1, 1, 1, 1, 1, 1, 1) AS f;
|
||||||
|
ERROR 21000: Operand should contain 1 column(s)
|
||||||
|
@@ -147,3 +147,11 @@ SELECT INTERVAL(ROW(1,1),ROW(1,2));
|
|||||||
SELECT INTERVAL(1,ROW(1,2));
|
SELECT INTERVAL(1,ROW(1,2));
|
||||||
--error ER_OPERAND_COLUMNS
|
--error ER_OPERAND_COLUMNS
|
||||||
SELECT INTERVAL(ROW(1,2),1);
|
SELECT INTERVAL(ROW(1,2),1);
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-29184 Assertion `0' in Item_row::illegal_method_call, Type_handler_row::Item_update_null_value, Item::update_null_value
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--error ER_OPERAND_COLUMNS
|
||||||
|
SELECT INTERVAL(0, ROW(1,1), 1, 1, 1, 1, 1, 1, 1) AS f;
|
||||||
|
@@ -745,9 +745,9 @@ encode('abcd','ab')
|
|||||||
show create table t1;
|
show create table t1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`bin(130)` varchar(64) DEFAULT NULL,
|
`bin(130)` varchar(65) DEFAULT NULL,
|
||||||
`oct(130)` varchar(64) DEFAULT NULL,
|
`oct(130)` varchar(65) DEFAULT NULL,
|
||||||
`conv(130,16,10)` varchar(64) DEFAULT NULL,
|
`conv(130,16,10)` varchar(65) DEFAULT NULL,
|
||||||
`hex(130)` varchar(16) DEFAULT NULL,
|
`hex(130)` varchar(16) DEFAULT NULL,
|
||||||
`char(130)` varbinary(4) DEFAULT NULL,
|
`char(130)` varbinary(4) DEFAULT NULL,
|
||||||
`format(130,10)` varchar(25) DEFAULT NULL,
|
`format(130,10)` varchar(25) DEFAULT NULL,
|
||||||
@@ -5260,7 +5260,7 @@ conv(i,16,2)
|
|||||||
SHOW CREATE TABLE t2;
|
SHOW CREATE TABLE t2;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t2 CREATE TABLE `t2` (
|
t2 CREATE TABLE `t2` (
|
||||||
`conv(i,16,2)` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_uca1400_ai_ci DEFAULT NULL
|
`conv(i,16,2)` varchar(65) CHARACTER SET utf8mb3 COLLATE utf8mb3_uca1400_ai_ci DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
#
|
#
|
||||||
@@ -5330,9 +5330,94 @@ BIN(c)
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
DO OCT(-9223372036854775808);
|
DO OCT(-9223372036854775808);
|
||||||
#
|
#
|
||||||
|
# MDEV-28652 SUBSTRING(str,pos,len) returns incorrect result in view (returns an empty string)
|
||||||
|
#
|
||||||
|
create view v1 as select substring('hello', 1, 4294967295);
|
||||||
|
select * from v1;
|
||||||
|
substring('hello', 1, 4294967295)
|
||||||
|
hello
|
||||||
|
drop view v1;
|
||||||
|
#
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
# Start of 10.6 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-29552 LEFT and RIGHT with big value for parameter 'len' >0 return empty value in view
|
||||||
|
#
|
||||||
|
create view v1 as select left('hello', 4294967295);
|
||||||
|
select * from v1;
|
||||||
|
left('hello', 4294967295)
|
||||||
|
hello
|
||||||
|
drop view v1;
|
||||||
|
#
|
||||||
|
# MDEV-33942 View cuts off the end of string with the utf8 character set in INSERT function
|
||||||
|
#
|
||||||
|
SELECT HEX(INSERT(_utf8 0xD18FD18E, 2, 1, 0x20));
|
||||||
|
HEX(INSERT(_utf8 0xD18FD18E, 2, 1, 0x20))
|
||||||
|
D120D18E
|
||||||
|
CREATE VIEW v1 AS SELECT HEX(INSERT(_utf8 0xD18FD18E, 2, 1, 0x20));
|
||||||
|
SELECT * FROM v1;
|
||||||
|
HEX(INSERT(_utf8 0xD18FD18E, 2, 1, 0x20))
|
||||||
|
D120D18E
|
||||||
|
DROP VIEW v1;
|
||||||
|
#
|
||||||
|
# MDEV-28686 Assertion `0' in Type_handler_string_result::make_sort_key or unexpected result
|
||||||
|
#
|
||||||
|
CREATE TABLE t (s DATE, e DATE, PERIOD FOR p(s,e));
|
||||||
|
INSERT INTO t (s,e) VALUES ('1970-01-01','1970-01-02'),('1980-01-01','1980-01-02');
|
||||||
|
SET sql_mode='';
|
||||||
|
SELECT e, GROUP_CONCAT(s) FROM t GROUP BY CONVERT((LPAD(e, -1) AND e) USING utf8);
|
||||||
|
e GROUP_CONCAT(s)
|
||||||
|
1970-01-02 1970-01-01,1980-01-01
|
||||||
|
DROP TABLE t;
|
||||||
|
CREATE TABLE t (s DATE, e DATE, PERIOD FOR p(s,e));
|
||||||
|
INSERT INTO t (s,e) VALUES ('1970-01-01','1970-01-02'),('1980-01-01','1980-01-02');
|
||||||
|
SET sql_mode='';
|
||||||
|
SELECT DISTINCT CONVERT((LPAD(e, -1) AND e) USING utf8) FROM t;
|
||||||
|
CONVERT((LPAD(e, -1) AND e) USING utf8)
|
||||||
|
NULL
|
||||||
|
SET sql_mode=STRICT_TRANS_TABLES;
|
||||||
|
SELECT DISTINCT CONVERT((LPAD(e, -1) AND e) USING utf8) FROM t;
|
||||||
|
CONVERT((LPAD(e, -1) AND e) USING utf8)
|
||||||
|
NULL
|
||||||
|
DROP TABLE t;
|
||||||
|
SET sql_mode=DEFAULT;
|
||||||
|
#
|
||||||
|
# MDEV-32755 Stack-Buffer-Overflow at /mariadb-11.3.0/strings/int2str.c:122
|
||||||
|
#
|
||||||
|
CREATE TABLE t0 ( c55 INT , c38 INT ) ;
|
||||||
|
INSERT INTO t0 VALUES ( -54 , -27 ) , ( -107 , -62 ) ;
|
||||||
|
CREATE INDEX i0 ON t0 ( c38 ) ;
|
||||||
|
INSERT INTO t0 ( c55 ) VALUES ( 43 ) , ( 77 ) ;
|
||||||
|
SELECT t0 . c55 AS c47 FROM
|
||||||
|
( SELECT c15 AS c40 FROM
|
||||||
|
( SELECT c55 AS c15 FROM t0 ) AS t1
|
||||||
|
JOIN t0 ON t1.c15 = t1.c15 SOUNDS LIKE + CONV ( -2919286674558440404 , -17 , -2 ) ) AS t2
|
||||||
|
JOIN t0 ON t0.c38 = t0.c38;
|
||||||
|
c47
|
||||||
|
DROP TABLE t0;
|
||||||
|
SELECT CONV(-29223372036854775809, -10, 18446744073709551614);
|
||||||
|
CONV(-29223372036854775809, -10, 18446744073709551614)
|
||||||
|
-1000000000000000000000000000000000000000000000000000000000000000
|
||||||
|
SELECT CONV(1<<63, 10, -2);
|
||||||
|
CONV(1<<63, 10, -2)
|
||||||
|
-1000000000000000000000000000000000000000000000000000000000000000
|
||||||
|
#
|
||||||
|
# MDEV-35416 CONV(1<<63, 10, -2) fails with --view-protocol
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 AS SELECT CONV(1<<63, 10, -2) AS c1;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`c1` varchar(65) CHARACTER SET utf8mb3 COLLATE utf8mb3_uca1400_ai_ci DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# End of 10.6 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
# MDEV-25704 Function random_bytes
|
# MDEV-25704 Function random_bytes
|
||||||
#
|
#
|
||||||
create table t1 as select random_bytes(100);
|
create table t1 as select random_bytes(100);
|
||||||
|
@@ -2376,11 +2376,88 @@ DROP TABLE t1;
|
|||||||
|
|
||||||
DO OCT(-9223372036854775808);
|
DO OCT(-9223372036854775808);
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28652 SUBSTRING(str,pos,len) returns incorrect result in view (returns an empty string)
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
create view v1 as select substring('hello', 1, 4294967295);
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.5 tests
|
--echo # End of 10.5 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.6 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-29552 LEFT and RIGHT with big value for parameter 'len' >0 return empty value in view
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
create view v1 as select left('hello', 4294967295);
|
||||||
|
select * from v1;
|
||||||
|
drop view v1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-33942 View cuts off the end of string with the utf8 character set in INSERT function
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SELECT HEX(INSERT(_utf8 0xD18FD18E, 2, 1, 0x20));
|
||||||
|
CREATE VIEW v1 AS SELECT HEX(INSERT(_utf8 0xD18FD18E, 2, 1, 0x20));
|
||||||
|
SELECT * FROM v1;
|
||||||
|
DROP VIEW v1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28686 Assertion `0' in Type_handler_string_result::make_sort_key or unexpected result
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t (s DATE, e DATE, PERIOD FOR p(s,e));
|
||||||
|
INSERT INTO t (s,e) VALUES ('1970-01-01','1970-01-02'),('1980-01-01','1980-01-02');
|
||||||
|
SET sql_mode='';
|
||||||
|
SELECT e, GROUP_CONCAT(s) FROM t GROUP BY CONVERT((LPAD(e, -1) AND e) USING utf8);
|
||||||
|
DROP TABLE t;
|
||||||
|
|
||||||
|
CREATE TABLE t (s DATE, e DATE, PERIOD FOR p(s,e));
|
||||||
|
INSERT INTO t (s,e) VALUES ('1970-01-01','1970-01-02'),('1980-01-01','1980-01-02');
|
||||||
|
SET sql_mode='';
|
||||||
|
SELECT DISTINCT CONVERT((LPAD(e, -1) AND e) USING utf8) FROM t;
|
||||||
|
SET sql_mode=STRICT_TRANS_TABLES;
|
||||||
|
SELECT DISTINCT CONVERT((LPAD(e, -1) AND e) USING utf8) FROM t;
|
||||||
|
DROP TABLE t;
|
||||||
|
SET sql_mode=DEFAULT;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-32755 Stack-Buffer-Overflow at /mariadb-11.3.0/strings/int2str.c:122
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t0 ( c55 INT , c38 INT ) ;
|
||||||
|
INSERT INTO t0 VALUES ( -54 , -27 ) , ( -107 , -62 ) ;
|
||||||
|
CREATE INDEX i0 ON t0 ( c38 ) ;
|
||||||
|
INSERT INTO t0 ( c55 ) VALUES ( 43 ) , ( 77 ) ;
|
||||||
|
SELECT t0 . c55 AS c47 FROM
|
||||||
|
( SELECT c15 AS c40 FROM
|
||||||
|
( SELECT c55 AS c15 FROM t0 ) AS t1
|
||||||
|
JOIN t0 ON t1.c15 = t1.c15 SOUNDS LIKE + CONV ( -2919286674558440404 , -17 , -2 ) ) AS t2
|
||||||
|
JOIN t0 ON t0.c38 = t0.c38;
|
||||||
|
DROP TABLE t0;
|
||||||
|
|
||||||
|
SELECT CONV(-29223372036854775809, -10, 18446744073709551614);
|
||||||
|
SELECT CONV(1<<63, 10, -2);
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-35416 CONV(1<<63, 10, -2) fails with --view-protocol
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 AS SELECT CONV(1<<63, 10, -2) AS c1;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.6 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-25704 Function random_bytes
|
--echo # MDEV-25704 Function random_bytes
|
||||||
--echo #
|
--echo #
|
||||||
|
@@ -5444,6 +5444,19 @@ t2 CREATE TABLE `t2` (
|
|||||||
`c` polygon DEFAULT NULL
|
`c` polygon DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_uca1400_ai_ci
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
|
#
|
||||||
|
# MDEV-33987 Server crashes at Item_func_as_wkt::val_str_ascii
|
||||||
|
#
|
||||||
|
SELECT ST_ASTEXT(BOUNDARY(INET6_ATON('255.255.255.255'))) AS c1;
|
||||||
|
c1
|
||||||
|
NULL
|
||||||
|
#
|
||||||
|
# Server crash in DTCollation::set_repertoire_from_charset
|
||||||
|
#
|
||||||
|
CREATE TABLE t (f POINT, KEY(f));
|
||||||
|
DELETE FROM t WHERE f NOT IN (NULL,'x');
|
||||||
|
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
||||||
|
DROP TABLE t;
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
#
|
#
|
||||||
# Start of 11.5 tests
|
# Start of 11.5 tests
|
||||||
|
@@ -3445,6 +3445,22 @@ create table t2 as select group_concat(c, c order by 1,2), concat(c), c from t1;
|
|||||||
show create table t2;
|
show create table t2;
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-33987 Server crashes at Item_func_as_wkt::val_str_ascii
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SELECT ST_ASTEXT(BOUNDARY(INET6_ATON('255.255.255.255'))) AS c1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Server crash in DTCollation::set_repertoire_from_charset
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t (f POINT, KEY(f));
|
||||||
|
--error ER_CANT_CREATE_GEOMETRY_OBJECT
|
||||||
|
DELETE FROM t WHERE f NOT IN (NULL,'x');
|
||||||
|
DROP TABLE t;
|
||||||
|
|
||||||
--echo # End of 10.5 tests
|
--echo # End of 10.5 tests
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
|
@@ -4,12 +4,12 @@
|
|||||||
install soname 'auth_0x0100';
|
install soname 'auth_0x0100';
|
||||||
CREATE USER foo@localhost IDENTIFIED VIA auth_0x0100;
|
CREATE USER foo@localhost IDENTIFIED VIA auth_0x0100;
|
||||||
uninstall plugin auth_0x0100;
|
uninstall plugin auth_0x0100;
|
||||||
select Priv from mysql.global_priv where User = "foo" and host="localhost"
|
create table t as select Priv from mysql.global_priv where User = "foo" and host="localhost";
|
||||||
into @priv;
|
|
||||||
SET PASSWORD FOR foo@localhost = "1111";
|
SET PASSWORD FOR foo@localhost = "1111";
|
||||||
ERROR HY000: Plugin 'auth_0x0100' is not loaded
|
ERROR HY000: Plugin 'auth_0x0100' is not loaded
|
||||||
select Priv = @priv as "Nothing changed" from mysql.global_priv where User = "foo" and host="localhost";
|
select global_priv.Priv = t.Priv as "Nothing changed" from mysql.global_priv join t where User = "foo" and host="localhost";
|
||||||
Nothing changed
|
Nothing changed
|
||||||
1
|
1
|
||||||
|
drop table t;
|
||||||
DROP USER foo@localhost;
|
DROP USER foo@localhost;
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
|
@@ -13,13 +13,12 @@ install soname 'auth_0x0100';
|
|||||||
CREATE USER foo@localhost IDENTIFIED VIA auth_0x0100;
|
CREATE USER foo@localhost IDENTIFIED VIA auth_0x0100;
|
||||||
uninstall plugin auth_0x0100;
|
uninstall plugin auth_0x0100;
|
||||||
|
|
||||||
--disable_ps_protocol
|
create table t as select Priv from mysql.global_priv where User = "foo" and host="localhost";
|
||||||
select Priv from mysql.global_priv where User = "foo" and host="localhost"
|
|
||||||
into @priv;
|
|
||||||
--enable_ps_protocol
|
|
||||||
--error ER_PLUGIN_IS_NOT_LOADED
|
--error ER_PLUGIN_IS_NOT_LOADED
|
||||||
SET PASSWORD FOR foo@localhost = "1111";
|
SET PASSWORD FOR foo@localhost = "1111";
|
||||||
select Priv = @priv as "Nothing changed" from mysql.global_priv where User = "foo" and host="localhost";
|
select global_priv.Priv = t.Priv as "Nothing changed" from mysql.global_priv join t where User = "foo" and host="localhost";
|
||||||
|
|
||||||
|
drop table t;
|
||||||
|
|
||||||
DROP USER foo@localhost;
|
DROP USER foo@localhost;
|
||||||
|
|
||||||
|
@@ -1919,7 +1919,7 @@ SELECT SUBSTRING(a,1,10), LENGTH(a), GROUP_CONCAT(b) FROM t1 GROUP BY a;
|
|||||||
SUBSTRING(a,1,10) LENGTH(a) GROUP_CONCAT(b)
|
SUBSTRING(a,1,10) LENGTH(a) GROUP_CONCAT(b)
|
||||||
1111111111 1300 one,two
|
1111111111 1300 one,two
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4202 2 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 2 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
EXPLAIN
|
EXPLAIN
|
||||||
SELECT SUBSTRING(a,1,10), LENGTH(a) FROM t1 GROUP BY a;
|
SELECT SUBSTRING(a,1,10), LENGTH(a) FROM t1 GROUP BY a;
|
||||||
id 1
|
id 1
|
||||||
@@ -1936,7 +1936,7 @@ SELECT SUBSTRING(a,1,10), LENGTH(a) FROM t1 GROUP BY a;
|
|||||||
SUBSTRING(a,1,10) LENGTH(a)
|
SUBSTRING(a,1,10) LENGTH(a)
|
||||||
1111111111 1300
|
1111111111 1300
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4202 1 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 1 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
# Bug#57688 Assertion `!table || (!table->write_set || bitmap_is_set(table->write_set, field
|
# Bug#57688 Assertion `!table || (!table->write_set || bitmap_is_set(table->write_set, field
|
||||||
@@ -2733,7 +2733,7 @@ f1 f2
|
|||||||
NULL
|
NULL
|
||||||
NULL NULL
|
NULL NULL
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4202 116 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 116 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
SET @@sort_buffer_size = @old_sort_buff_size;
|
SET @@sort_buffer_size = @old_sort_buff_size;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
|
@@ -848,10 +848,12 @@ CREATE OR REPLACE TABLE t1 (
|
|||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
INSERT INTO t1 VALUES (GeomFromText('POINT(37.646944 -75.761111)'));
|
INSERT INTO t1 VALUES (GeomFromText('POINT(37.646944 -75.761111)'));
|
||||||
|
|
||||||
|
--disable_cursor_protocol
|
||||||
--disable_ps2_protocol
|
--disable_ps2_protocol
|
||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/t1.tsv' FROM t1;
|
eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/t1.tsv' FROM t1;
|
||||||
--enable_ps2_protocol
|
--enable_ps2_protocol
|
||||||
|
--enable_cursor_protocol
|
||||||
|
|
||||||
CREATE OR REPLACE TABLE t2 LIKE t1;
|
CREATE OR REPLACE TABLE t2 LIKE t1;
|
||||||
|
|
||||||
@@ -868,10 +870,12 @@ CREATE OR REPLACE TABLE t1 (
|
|||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||||
|
|
||||||
INSERT INTO t1 VALUES (GeomFromText('POINT(37.646944 -75.761111)'),"їєі");
|
INSERT INTO t1 VALUES (GeomFromText('POINT(37.646944 -75.761111)'),"їєі");
|
||||||
|
--disable_cursor_protocol
|
||||||
--disable_ps2_protocol
|
--disable_ps2_protocol
|
||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/t1.tsv' FROM t1;
|
eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/t1.tsv' FROM t1;
|
||||||
--enable_ps2_protocol
|
--enable_ps2_protocol
|
||||||
|
--enable_cursor_protocol
|
||||||
|
|
||||||
CREATE OR REPLACE TABLE t2 LIKE t1;
|
CREATE OR REPLACE TABLE t2 LIKE t1;
|
||||||
|
|
||||||
|
17
mysql-test/main/mdev-35046.result
Normal file
17
mysql-test/main/mdev-35046.result
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
SET pseudo_slave_mode=1;
|
||||||
|
CREATE TABLE t1 (c INT) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t2 (c INT) ENGINE=MEMORY;
|
||||||
|
XA START 'a';
|
||||||
|
INSERT INTO t1 VALUES (0);
|
||||||
|
CREATE TEMPORARY TABLE t1t (c INT) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1t VALUES (0);
|
||||||
|
XA END 'a';
|
||||||
|
XA PREPARE 'a';
|
||||||
|
OPTIMIZE TABLE t1t;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1t optimize Error Table 'test.t1t' doesn't exist
|
||||||
|
test.t1t optimize status Operation failed
|
||||||
|
LOCK TABLE t2 READ;
|
||||||
|
XA COMMIT 'a';
|
||||||
|
# restart
|
||||||
|
DROP TABLE t1, t2;
|
19
mysql-test/main/mdev-35046.test
Normal file
19
mysql-test/main/mdev-35046.test
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
#
|
||||||
|
# MDEV-35046 SIGSEGV in list_delete in optimized builds when using pseudo_slave_mode
|
||||||
|
# https://jira.mariadb.org/browse/MDEV-35046
|
||||||
|
#
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
SET pseudo_slave_mode=1;
|
||||||
|
CREATE TABLE t1 (c INT) ENGINE=InnoDB;
|
||||||
|
CREATE TABLE t2 (c INT) ENGINE=MEMORY;
|
||||||
|
XA START 'a';
|
||||||
|
INSERT INTO t1 VALUES (0);
|
||||||
|
CREATE TEMPORARY TABLE t1t (c INT) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1t VALUES (0);
|
||||||
|
XA END 'a';
|
||||||
|
XA PREPARE 'a';
|
||||||
|
OPTIMIZE TABLE t1t;
|
||||||
|
LOCK TABLE t2 READ;
|
||||||
|
XA COMMIT 'a';
|
||||||
|
--source include/restart_mysqld.inc
|
||||||
|
DROP TABLE t1, t2;
|
@@ -11,3 +11,11 @@ X
|
|||||||
3
|
3
|
||||||
ERROR 1300 (HY000): Invalid utf8mb3 character string: 'test\xF0\x9F\x98\x81 '
|
ERROR 1300 (HY000): Invalid utf8mb3 character string: 'test\xF0\x9F\x98\x81 '
|
||||||
ERROR 1300 (HY000): Invalid binary character string: 'test\xF0\x9F\x98\x81 '
|
ERROR 1300 (HY000): Invalid binary character string: 'test\xF0\x9F\x98\x81 '
|
||||||
|
# Start of 10.5 tests
|
||||||
|
#
|
||||||
|
# MDEV-34090 Client allows to set character set to utf32 and crashes on the next command
|
||||||
|
#
|
||||||
|
SELECT "Success" AS c1;
|
||||||
|
c1
|
||||||
|
Success
|
||||||
|
# End of 10.5 tests
|
||||||
|
@@ -29,3 +29,16 @@ exec $MYSQL test -e "$query";
|
|||||||
--exec $MYSQL --default-character-set=utf8 -e "select 1" "test😁 " 2>&1
|
--exec $MYSQL --default-character-set=utf8 -e "select 1" "test😁 " 2>&1
|
||||||
--error 1
|
--error 1
|
||||||
--exec $MYSQL --default-character-set=binary -e "select 1" "test😁 " 2>&1
|
--exec $MYSQL --default-character-set=binary -e "select 1" "test😁 " 2>&1
|
||||||
|
|
||||||
|
|
||||||
|
--echo # Start of 10.5 tests
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-34090 Client allows to set character set to utf32 and crashes on the next command
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--error 1
|
||||||
|
--exec $MYSQL test -e '\C utf32 ; SELECT 1'
|
||||||
|
SELECT "Success" AS c1;
|
||||||
|
|
||||||
|
--echo # End of 10.5 tests
|
||||||
|
@@ -105,9 +105,9 @@ execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_t
|
|||||||
execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_transition_type ENGINE=', @time_zone_transition_type_engine, ', ORDER BY Time_zone_id, Transition_type_id'), 'do 0');
|
execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_transition_type ENGINE=', @time_zone_transition_type_engine, ', ORDER BY Time_zone_id, Transition_type_id'), 'do 0');
|
||||||
SET session alter_algorithm=@old_alter_alg;
|
SET session alter_algorithm=@old_alter_alg;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4200 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4200 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
SELECT COUNT(*) FROM time_zone;
|
SELECT COUNT(*) FROM time_zone;
|
||||||
COUNT(*)
|
COUNT(*)
|
||||||
2
|
2
|
||||||
@@ -166,9 +166,9 @@ SET SESSION SQL_LOG_BIN=@save_sql_log_bin;
|
|||||||
execute immediate if(@wsrep_is_on, 'SET SESSION WSREP_ON=@save_wsrep_on', 'do 0');
|
execute immediate if(@wsrep_is_on, 'SET SESSION WSREP_ON=@save_wsrep_on', 'do 0');
|
||||||
SET session alter_algorithm=@old_alter_alg;
|
SET session alter_algorithm=@old_alter_alg;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4200 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4200 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
SELECT COUNT(*) FROM time_zone;
|
SELECT COUNT(*) FROM time_zone;
|
||||||
COUNT(*)
|
COUNT(*)
|
||||||
2
|
2
|
||||||
@@ -490,9 +490,9 @@ execute immediate if(@wsrep_is_on, 'SET SESSION WSREP_ON=@save_wsrep_on', 'do 0'
|
|||||||
#
|
#
|
||||||
set sql_mode=only_full_group_by;
|
set sql_mode=only_full_group_by;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4200 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4200 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
SELECT COUNT(*) FROM time_zone;
|
SELECT COUNT(*) FROM time_zone;
|
||||||
COUNT(*)
|
COUNT(*)
|
||||||
2
|
2
|
||||||
|
@@ -2360,7 +2360,7 @@ set global sql_safe_updates=@orig_sql_safe_updates;
|
|||||||
# MDEV-32043 Remove plugins previously external that are now built in (unix_socket)
|
# MDEV-32043 Remove plugins previously external that are now built in (unix_socket)
|
||||||
#
|
#
|
||||||
INSERT INTO mysql.plugin SELECT 'unix_socket', 'auth_socket.so'
|
INSERT INTO mysql.plugin SELECT 'unix_socket', 'auth_socket.so'
|
||||||
FROM dual WHERE convert(@@version_compile_os using latin1) not in ('Win32', 'Win64', 'Windows');
|
FROM information_schema.plugins WHERE plugin_name='unix_socket' AND plugin_library IS NULL;
|
||||||
# mariadb-upgrade --force --silent 2>&1
|
# mariadb-upgrade --force --silent 2>&1
|
||||||
SELECT * FROM mysql.plugin WHERE name='unix_socket';
|
SELECT * FROM mysql.plugin WHERE name='unix_socket';
|
||||||
name dl
|
name dl
|
||||||
|
@@ -509,7 +509,7 @@ set global sql_safe_updates=@orig_sql_safe_updates;
|
|||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
INSERT INTO mysql.plugin SELECT 'unix_socket', 'auth_socket.so'
|
INSERT INTO mysql.plugin SELECT 'unix_socket', 'auth_socket.so'
|
||||||
FROM dual WHERE convert(@@version_compile_os using latin1) not in ('Win32', 'Win64', 'Windows');
|
FROM information_schema.plugins WHERE plugin_name='unix_socket' AND plugin_library IS NULL;
|
||||||
--echo # mariadb-upgrade --force --silent 2>&1
|
--echo # mariadb-upgrade --force --silent 2>&1
|
||||||
--exec $MYSQL_UPGRADE --force --silent 2>&1
|
--exec $MYSQL_UPGRADE --force --silent 2>&1
|
||||||
SELECT * FROM mysql.plugin WHERE name='unix_socket';
|
SELECT * FROM mysql.plugin WHERE name='unix_socket';
|
||||||
|
@@ -860,7 +860,7 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxab
|
|||||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaa
|
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaa
|
||||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz
|
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4202 2 values were longer than max_sort_length. Sorting used only the first 64 bytes
|
Warning 4203 2 values were longer than max_sort_length. Sorting used only the first 64 bytes
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (
|
create table t1 (
|
||||||
`sid` decimal(8,0) default null,
|
`sid` decimal(8,0) default null,
|
||||||
@@ -4125,7 +4125,7 @@ a substr(b, @save_max_sort_length+1)
|
|||||||
2 AB
|
2 AB
|
||||||
1 A
|
1 A
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4202 5 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 5 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
analyze format=json
|
analyze format=json
|
||||||
select a, substr(b, @save_max_sort_length+1) from t1 order by b desc;
|
select a, substr(b, @save_max_sort_length+1) from t1 order by b desc;
|
||||||
ANALYZE
|
ANALYZE
|
||||||
@@ -4172,7 +4172,7 @@ ANALYZE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4202 5 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 5 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
drop table t1;
|
drop table t1;
|
||||||
#
|
#
|
||||||
# Packing sort keys with complex collations
|
# Packing sort keys with complex collations
|
||||||
|
@@ -835,7 +835,7 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
|||||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxw
|
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxw
|
||||||
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
|
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4202 3 values were longer than max_sort_length. Sorting used only the first 64 bytes
|
Warning 4203 3 values were longer than max_sort_length. Sorting used only the first 64 bytes
|
||||||
set max_sort_length=200;
|
set max_sort_length=200;
|
||||||
select c from t1 order by c, id;
|
select c from t1 order by c, id;
|
||||||
c
|
c
|
||||||
|
@@ -287,7 +287,7 @@ COMMAND_LINE_ARGUMENT OPTIONAL
|
|||||||
GLOBAL_VALUE_PATH NULL
|
GLOBAL_VALUE_PATH NULL
|
||||||
set alter_algorithm=COPY;
|
set alter_algorithm=COPY;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4200 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
select @@alter_algorithm;
|
select @@alter_algorithm;
|
||||||
@@alter_algorithm
|
@@alter_algorithm
|
||||||
DEFAULT
|
DEFAULT
|
||||||
@@ -295,8 +295,8 @@ set statement alter_algorithm=COPY FOR SELECT @@alter_algorithm;
|
|||||||
@@alter_algorithm
|
@@alter_algorithm
|
||||||
DEFAULT
|
DEFAULT
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4200 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
Warning 4200 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@alter_algorithm' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
# restart: --alter-algorithm=COPY
|
# restart: --alter-algorithm=COPY
|
||||||
select @@alter_algorithm;
|
select @@alter_algorithm;
|
||||||
@@alter_algorithm
|
@@alter_algorithm
|
||||||
|
@@ -29,8 +29,8 @@ explain select * from t1 where nm like '500%' AND fl2 = 0;
|
|||||||
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 range idx1,idx2 idx1 35 NULL 1 Using index condition; Using where
|
1 SIMPLE t1 range idx1,idx2 idx1 35 NULL 1 Using index condition; Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4200 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
Warning 4200 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
set @trace=(select trace from information_schema.optimizer_trace);
|
set @trace=(select trace from information_schema.optimizer_trace);
|
||||||
select json_detailed(json_extract(@trace, '$**.considered_access_paths'));
|
select json_detailed(json_extract(@trace, '$**.considered_access_paths'));
|
||||||
json_detailed(json_extract(@trace, '$**.considered_access_paths'))
|
json_detailed(json_extract(@trace, '$**.considered_access_paths'))
|
||||||
@@ -97,8 +97,8 @@ explain select * from t1 where nm like '500%' AND fl2 = 0;
|
|||||||
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 range idx1,idx2 idx1 35 NULL 1 Using index condition; Using where
|
1 SIMPLE t1 range idx1,idx2 idx1 35 NULL 1 Using index condition; Using where
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4200 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
Warning 4200 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
set @trace=(select trace from information_schema.optimizer_trace);
|
set @trace=(select trace from information_schema.optimizer_trace);
|
||||||
select json_detailed(json_extract(@trace, '$**.considered_access_paths'));
|
select json_detailed(json_extract(@trace, '$**.considered_access_paths'));
|
||||||
json_detailed(json_extract(@trace, '$**.considered_access_paths'))
|
json_detailed(json_extract(@trace, '$**.considered_access_paths'))
|
||||||
@@ -163,14 +163,14 @@ select @@optimizer_adjust_secondary_key_costs;
|
|||||||
0
|
0
|
||||||
set @@optimizer_adjust_secondary_key_costs=7;
|
set @@optimizer_adjust_secondary_key_costs=7;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4200 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
Warning 1292 Truncated incorrect optimizer_adjust_secondary_ke... value: '7'
|
Warning 1292 Truncated incorrect optimizer_adjust_secondary_ke... value: '7'
|
||||||
select @@optimizer_adjust_secondary_key_costs;
|
select @@optimizer_adjust_secondary_key_costs;
|
||||||
@@optimizer_adjust_secondary_key_costs
|
@@optimizer_adjust_secondary_key_costs
|
||||||
2
|
2
|
||||||
set @@optimizer_adjust_secondary_key_costs=default;
|
set @@optimizer_adjust_secondary_key_costs=default;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4200 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
#
|
#
|
||||||
# MDEV-34664: fix_innodb_cardinality
|
# MDEV-34664: fix_innodb_cardinality
|
||||||
#
|
#
|
||||||
@@ -201,7 +201,7 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
1 SIMPLE t1 ref b b 5 test.t2.a 90 Using index
|
1 SIMPLE t1 ref b b 5 test.t2.a 90 Using index
|
||||||
set @@optimizer_adjust_secondary_key_costs=8;
|
set @@optimizer_adjust_secondary_key_costs=8;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4200 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
Warning 1292 Truncated incorrect optimizer_adjust_secondary_ke... value: '8'
|
Warning 1292 Truncated incorrect optimizer_adjust_secondary_ke... value: '8'
|
||||||
explain select * from t1,t2 where t1.b=t2.a;
|
explain select * from t1,t2 where t1.b=t2.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
|
||||||
@@ -238,4 +238,4 @@ set global userstat=@save_userstat;
|
|||||||
set global innodb_stats_persistent_sample_pages=@save_ispsp;
|
set global innodb_stats_persistent_sample_pages=@save_ispsp;
|
||||||
set @@optimizer_adjust_secondary_key_costs=default;
|
set @@optimizer_adjust_secondary_key_costs=default;
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 4200 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
Warning 4201 The variable '@@optimizer_adjust_secondary_key_costs' is ignored. It only exists for compatibility with old installations and will be removed in a future release
|
||||||
|
46
mysql-test/main/stack.result
Normal file
46
mysql-test/main/stack.result
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
# Checking stack usage
|
||||||
|
#
|
||||||
|
# basic tests
|
||||||
|
#
|
||||||
|
select variable_value > 0 from information_schema.session_status where variable_name="stack_usage";
|
||||||
|
variable_value > 0
|
||||||
|
1
|
||||||
|
#
|
||||||
|
# Ensure stack usage is same for each iteration when using WITH recursive
|
||||||
|
#
|
||||||
|
create table t1
|
||||||
|
WITH recursive Fibonacci(PrevN, N, Stack) AS
|
||||||
|
(
|
||||||
|
SELECT 0, 1, 0
|
||||||
|
UNION ALL
|
||||||
|
SELECT N, PrevN + N, (select variable_value from information_schema.session_status where variable_name="stack_usage")
|
||||||
|
FROM Fibonacci
|
||||||
|
WHERE N < 100000
|
||||||
|
)
|
||||||
|
SELECT PrevN as N, Stack FROM Fibonacci;
|
||||||
|
select (select stack from t1 where n=2) = (select stack from t1 where N=75025) as c;
|
||||||
|
c
|
||||||
|
1
|
||||||
|
DROP table t1;
|
||||||
|
#
|
||||||
|
# Check stack with recursion
|
||||||
|
#
|
||||||
|
set @@max_sp_recursion_depth=20;
|
||||||
|
create or replace procedure recursion(x int, max int, OUT res int)
|
||||||
|
begin
|
||||||
|
select variable_value into res from information_schema.session_status where variable_name="stack_usage";
|
||||||
|
if (x < max) then
|
||||||
|
call recursion(x+1, max, res);
|
||||||
|
end if;
|
||||||
|
end;
|
||||||
|
$$
|
||||||
|
call recursion(0,2,@s1);
|
||||||
|
call recursion(0,3,@s2);
|
||||||
|
call recursion(0,4,@s3);
|
||||||
|
select @s1 > 0 && @s2 > 0 && @s3 > 0;
|
||||||
|
@s1 > 0 && @s2 > 0 && @s3 > 0
|
||||||
|
1
|
||||||
|
drop procedure recursion;
|
||||||
|
#
|
||||||
|
# End of 10.5 tests
|
||||||
|
#
|
60
mysql-test/main/stack.test
Normal file
60
mysql-test/main/stack.test
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
--echo # Checking stack usage
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # basic tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
select variable_value > 0 from information_schema.session_status where variable_name="stack_usage";
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Ensure stack usage is same for each iteration when using WITH recursive
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
create table t1
|
||||||
|
WITH recursive Fibonacci(PrevN, N, Stack) AS
|
||||||
|
(
|
||||||
|
SELECT 0, 1, 0
|
||||||
|
UNION ALL
|
||||||
|
SELECT N, PrevN + N, (select variable_value from information_schema.session_status where variable_name="stack_usage")
|
||||||
|
FROM Fibonacci
|
||||||
|
WHERE N < 100000
|
||||||
|
)
|
||||||
|
SELECT PrevN as N, Stack FROM Fibonacci;
|
||||||
|
|
||||||
|
select (select stack from t1 where n=2) = (select stack from t1 where N=75025) as c;
|
||||||
|
DROP table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Check stack with recursion
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
set @@max_sp_recursion_depth=20;
|
||||||
|
delimiter $$;
|
||||||
|
create or replace procedure recursion(x int, max int, OUT res int)
|
||||||
|
begin
|
||||||
|
select variable_value into res from information_schema.session_status where variable_name="stack_usage";
|
||||||
|
if (x < max) then
|
||||||
|
call recursion(x+1, max, res);
|
||||||
|
end if;
|
||||||
|
end;
|
||||||
|
$$
|
||||||
|
|
||||||
|
delimiter ;$$
|
||||||
|
|
||||||
|
call recursion(0,2,@s1);
|
||||||
|
call recursion(0,3,@s2);
|
||||||
|
call recursion(0,4,@s3);
|
||||||
|
|
||||||
|
select @s1 > 0 && @s2 > 0 && @s3 > 0;
|
||||||
|
if (`select @s2-@s1 <> @s3 - @s2`)
|
||||||
|
{
|
||||||
|
echo "Wrong result";
|
||||||
|
select @s1 ,@s2, @s3, @s2-@s1, @s3-@s2;
|
||||||
|
}
|
||||||
|
|
||||||
|
drop procedure recursion;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.5 tests
|
||||||
|
--echo #
|
@@ -899,7 +899,7 @@ Warnings:
|
|||||||
Warning 1260 Row 1 was cut by group_concat()
|
Warning 1260 Row 1 was cut by group_concat()
|
||||||
Warning 1260 Row 2 was cut by group_concat()
|
Warning 1260 Row 2 was cut by group_concat()
|
||||||
Warning 1260 Row 3 was cut by group_concat()
|
Warning 1260 Row 3 was cut by group_concat()
|
||||||
Warning 4202 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
set @@group_concat_max_len = 256;
|
set @@group_concat_max_len = 256;
|
||||||
explain extended select left(a1,7), left(a2,7)
|
explain extended select left(a1,7), left(a2,7)
|
||||||
from t1_1024
|
from t1_1024
|
||||||
@@ -917,7 +917,7 @@ Warnings:
|
|||||||
Warning 1260 Row 1 was cut by group_concat()
|
Warning 1260 Row 1 was cut by group_concat()
|
||||||
Warning 1260 Row 2 was cut by group_concat()
|
Warning 1260 Row 2 was cut by group_concat()
|
||||||
Warning 1260 Row 3 was cut by group_concat()
|
Warning 1260 Row 3 was cut by group_concat()
|
||||||
Warning 4202 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
drop table t1_1024, t2_1024, t3_1024;
|
drop table t1_1024, t2_1024, t3_1024;
|
||||||
set @blob_len = 1025;
|
set @blob_len = 1025;
|
||||||
set @suffix_len = @blob_len - @prefix_len;
|
set @suffix_len = @blob_len - @prefix_len;
|
||||||
@@ -1002,7 +1002,7 @@ Warnings:
|
|||||||
Warning 1260 Row 1 was cut by group_concat()
|
Warning 1260 Row 1 was cut by group_concat()
|
||||||
Warning 1260 Row 2 was cut by group_concat()
|
Warning 1260 Row 2 was cut by group_concat()
|
||||||
Warning 1260 Row 3 was cut by group_concat()
|
Warning 1260 Row 3 was cut by group_concat()
|
||||||
Warning 4202 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
set @@group_concat_max_len = 256;
|
set @@group_concat_max_len = 256;
|
||||||
explain extended select left(a1,7), left(a2,7)
|
explain extended select left(a1,7), left(a2,7)
|
||||||
from t1_1025
|
from t1_1025
|
||||||
@@ -1020,7 +1020,7 @@ Warnings:
|
|||||||
Warning 1260 Row 1 was cut by group_concat()
|
Warning 1260 Row 1 was cut by group_concat()
|
||||||
Warning 1260 Row 2 was cut by group_concat()
|
Warning 1260 Row 2 was cut by group_concat()
|
||||||
Warning 1260 Row 3 was cut by group_concat()
|
Warning 1260 Row 3 was cut by group_concat()
|
||||||
Warning 4202 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
drop table t1_1025, t2_1025, t3_1025;
|
drop table t1_1025, t2_1025, t3_1025;
|
||||||
create table t1bit (a1 bit(3), a2 bit(3));
|
create table t1bit (a1 bit(3), a2 bit(3));
|
||||||
create table t2bit (b1 bit(3), b2 bit(3));
|
create table t2bit (b1 bit(3), b2 bit(3));
|
||||||
@@ -3071,3 +3071,401 @@ UNION ALL
|
|||||||
1
|
1
|
||||||
1
|
1
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
|
#
|
||||||
|
# MDEV-34665: Simplify IN predicate processing for NULL-aware
|
||||||
|
# materialization involving only one column
|
||||||
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
set @@optimizer_switch = "materialization=on,in_to_exists=off,semijoin=off";
|
||||||
|
create table t1 (a int);
|
||||||
|
create table t2 (b int);
|
||||||
|
insert into t1 values (null), (1), (2), (3);
|
||||||
|
# Query against empty t2
|
||||||
|
select a, a in (select b from t2) from t1;
|
||||||
|
a a in (select b from t2)
|
||||||
|
1 0
|
||||||
|
2 0
|
||||||
|
3 0
|
||||||
|
NULL 0
|
||||||
|
# Insert some not-NULL values
|
||||||
|
insert into t2 values (3), (4);
|
||||||
|
select a, a in (select b from t2) from t1;
|
||||||
|
a a in (select b from t2)
|
||||||
|
1 0
|
||||||
|
2 0
|
||||||
|
3 1
|
||||||
|
NULL NULL
|
||||||
|
# Ensure the correct strategy is tested
|
||||||
|
analyze format=json select a, a in (select b from t2) from t1;
|
||||||
|
ANALYZE
|
||||||
|
{
|
||||||
|
"query_optimization": {
|
||||||
|
"r_total_time_ms": "REPLACED"
|
||||||
|
},
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_loops": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "t1",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"loops": 1,
|
||||||
|
"r_loops": 1,
|
||||||
|
"rows": 4,
|
||||||
|
"r_rows": 4,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_table_time_ms": "REPLACED",
|
||||||
|
"r_other_time_ms": "REPLACED",
|
||||||
|
"r_engine_stats": REPLACED,
|
||||||
|
"filtered": 100,
|
||||||
|
"r_total_filtered": 100,
|
||||||
|
"r_filtered": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"subqueries": [
|
||||||
|
{
|
||||||
|
"materialization": {
|
||||||
|
"r_strategy": "null-aware index_lookup",
|
||||||
|
"r_loops": 4,
|
||||||
|
"r_index_lookups": 3,
|
||||||
|
"r_partial_matches": 1,
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 2,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_loops": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "t2",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"loops": 1,
|
||||||
|
"r_loops": 1,
|
||||||
|
"rows": 2,
|
||||||
|
"r_rows": 2,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_table_time_ms": "REPLACED",
|
||||||
|
"r_other_time_ms": "REPLACED",
|
||||||
|
"r_engine_stats": REPLACED,
|
||||||
|
"filtered": 100,
|
||||||
|
"r_total_filtered": 100,
|
||||||
|
"r_filtered": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# Insert NULL value (so there are both NULLs and and not-NULL values)
|
||||||
|
insert into t2 values (null);
|
||||||
|
select a, a in (select b from t2) from t1;
|
||||||
|
a a in (select b from t2)
|
||||||
|
1 NULL
|
||||||
|
2 NULL
|
||||||
|
3 1
|
||||||
|
NULL NULL
|
||||||
|
analyze format=json select a, a in (select b from t2) from t1;
|
||||||
|
ANALYZE
|
||||||
|
{
|
||||||
|
"query_optimization": {
|
||||||
|
"r_total_time_ms": "REPLACED"
|
||||||
|
},
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_loops": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "t1",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"loops": 1,
|
||||||
|
"r_loops": 1,
|
||||||
|
"rows": 4,
|
||||||
|
"r_rows": 4,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_table_time_ms": "REPLACED",
|
||||||
|
"r_other_time_ms": "REPLACED",
|
||||||
|
"r_engine_stats": REPLACED,
|
||||||
|
"filtered": 100,
|
||||||
|
"r_total_filtered": 100,
|
||||||
|
"r_filtered": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"subqueries": [
|
||||||
|
{
|
||||||
|
"materialization": {
|
||||||
|
"r_strategy": "null-aware index_lookup",
|
||||||
|
"r_loops": 4,
|
||||||
|
"r_index_lookups": 3,
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 2,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_loops": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "t2",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"loops": 1,
|
||||||
|
"r_loops": 1,
|
||||||
|
"rows": 3,
|
||||||
|
"r_rows": 3,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_table_time_ms": "REPLACED",
|
||||||
|
"r_other_time_ms": "REPLACED",
|
||||||
|
"r_engine_stats": REPLACED,
|
||||||
|
"filtered": 100,
|
||||||
|
"r_total_filtered": 100,
|
||||||
|
"r_filtered": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete from t2;
|
||||||
|
# Insert NULL values only
|
||||||
|
insert into t2 values (null), (null);
|
||||||
|
select a, a in (select b from t2) from t1;
|
||||||
|
a a in (select b from t2)
|
||||||
|
1 NULL
|
||||||
|
2 NULL
|
||||||
|
3 NULL
|
||||||
|
NULL NULL
|
||||||
|
analyze format=json select a, a in (select b from t2) from t1;
|
||||||
|
ANALYZE
|
||||||
|
{
|
||||||
|
"query_optimization": {
|
||||||
|
"r_total_time_ms": "REPLACED"
|
||||||
|
},
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_loops": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "t1",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"loops": 1,
|
||||||
|
"r_loops": 1,
|
||||||
|
"rows": 4,
|
||||||
|
"r_rows": 4,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_table_time_ms": "REPLACED",
|
||||||
|
"r_other_time_ms": "REPLACED",
|
||||||
|
"r_engine_stats": REPLACED,
|
||||||
|
"filtered": 100,
|
||||||
|
"r_total_filtered": 100,
|
||||||
|
"r_filtered": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"subqueries": [
|
||||||
|
{
|
||||||
|
"materialization": {
|
||||||
|
"r_strategy": "return NULL",
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 2,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_loops": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "t2",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"loops": 1,
|
||||||
|
"r_loops": 1,
|
||||||
|
"rows": 2,
|
||||||
|
"r_rows": 2,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_table_time_ms": "REPLACED",
|
||||||
|
"r_other_time_ms": "REPLACED",
|
||||||
|
"r_engine_stats": REPLACED,
|
||||||
|
"filtered": 100,
|
||||||
|
"r_total_filtered": 100,
|
||||||
|
"r_filtered": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# Test UPDATE
|
||||||
|
insert into t2 values (3), (4);
|
||||||
|
update t1 set a=a+1 where a not in (select b from t2);
|
||||||
|
# Nothing updated due to NULLs on both sides of IN
|
||||||
|
select * from t1;
|
||||||
|
a
|
||||||
|
NULL
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
# Remove NULLs from the right side
|
||||||
|
delete from t2 where b is null;
|
||||||
|
update t1 set a=a+1 where a not in (select b from t2);
|
||||||
|
# Now some rows are updated:
|
||||||
|
select * from t1;
|
||||||
|
a
|
||||||
|
NULL
|
||||||
|
2
|
||||||
|
3
|
||||||
|
3
|
||||||
|
analyze format=json update t1 set a=a+1 where a not in (select b from t2);
|
||||||
|
ANALYZE
|
||||||
|
{
|
||||||
|
"query_optimization": {
|
||||||
|
"r_total_time_ms": "REPLACED"
|
||||||
|
},
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"table": {
|
||||||
|
"update": 1,
|
||||||
|
"table_name": "t1",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"rows": 4,
|
||||||
|
"r_rows": 4,
|
||||||
|
"r_total_filtered": 25,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"r_engine_stats": REPLACED,
|
||||||
|
"attached_condition": "!(<in_optimizer>(t1.a,t1.a in (subquery#2)))",
|
||||||
|
"r_filtered": 25
|
||||||
|
},
|
||||||
|
"subqueries": [
|
||||||
|
{
|
||||||
|
"materialization": {
|
||||||
|
"r_strategy": "null-aware index_lookup",
|
||||||
|
"r_loops": 4,
|
||||||
|
"r_index_lookups": 3,
|
||||||
|
"r_partial_matches": 1,
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 2,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_loops": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "t2",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"loops": 1,
|
||||||
|
"r_loops": 1,
|
||||||
|
"rows": 2,
|
||||||
|
"r_rows": 2,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_table_time_ms": "REPLACED",
|
||||||
|
"r_other_time_ms": "REPLACED",
|
||||||
|
"r_engine_stats": REPLACED,
|
||||||
|
"filtered": 100,
|
||||||
|
"r_total_filtered": 100,
|
||||||
|
"r_filtered": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# Test DELETE
|
||||||
|
# Restore initial data-set:
|
||||||
|
delete from t1;
|
||||||
|
insert into t1 values (null), (1), (2), (3);
|
||||||
|
# Add some NULL values to the right side of IN
|
||||||
|
insert into t2 values (null), (null);
|
||||||
|
delete from t1 where a not in (select b from t2);
|
||||||
|
# Nothing deleted due to NULLs on both sides of IN
|
||||||
|
select * from t1;
|
||||||
|
a
|
||||||
|
NULL
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
# Remove NULLs from the right side
|
||||||
|
delete from t2 where b is null;
|
||||||
|
delete from t1 where a not in (select b from t2);
|
||||||
|
# Now some rows are deleted:
|
||||||
|
select * from t1;
|
||||||
|
a
|
||||||
|
NULL
|
||||||
|
3
|
||||||
|
analyze format=json delete from t1 where a not in (select b from t2);
|
||||||
|
ANALYZE
|
||||||
|
{
|
||||||
|
"query_optimization": {
|
||||||
|
"r_total_time_ms": "REPLACED"
|
||||||
|
},
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"table": {
|
||||||
|
"delete": 1,
|
||||||
|
"table_name": "t1",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"rows": 2,
|
||||||
|
"r_rows": 2,
|
||||||
|
"r_total_filtered": 0,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"r_engine_stats": REPLACED,
|
||||||
|
"attached_condition": "!(<in_optimizer>(t1.a,t1.a in (subquery#2)))",
|
||||||
|
"r_filtered": 0
|
||||||
|
},
|
||||||
|
"subqueries": [
|
||||||
|
{
|
||||||
|
"materialization": {
|
||||||
|
"r_strategy": "null-aware index_lookup",
|
||||||
|
"r_loops": 2,
|
||||||
|
"r_index_lookups": 1,
|
||||||
|
"r_partial_matches": 1,
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 2,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_loops": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"nested_loop": [
|
||||||
|
{
|
||||||
|
"table": {
|
||||||
|
"table_name": "t2",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"loops": 1,
|
||||||
|
"r_loops": 1,
|
||||||
|
"rows": 2,
|
||||||
|
"r_rows": 2,
|
||||||
|
"cost": "REPLACED",
|
||||||
|
"r_table_time_ms": "REPLACED",
|
||||||
|
"r_other_time_ms": "REPLACED",
|
||||||
|
"r_engine_stats": REPLACED,
|
||||||
|
"filtered": 100,
|
||||||
|
"r_total_filtered": 100,
|
||||||
|
"r_filtered": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
drop table t1, t2;
|
||||||
|
set @@optimizer_switch=@save_optimizer_switch;
|
||||||
|
@@ -297,3 +297,76 @@ UNION ALL
|
|||||||
;
|
;
|
||||||
|
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-34665: Simplify IN predicate processing for NULL-aware
|
||||||
|
--echo # materialization involving only one column
|
||||||
|
|
||||||
|
set @save_optimizer_switch=@@optimizer_switch;
|
||||||
|
set @@optimizer_switch = "materialization=on,in_to_exists=off,semijoin=off";
|
||||||
|
|
||||||
|
create table t1 (a int);
|
||||||
|
create table t2 (b int);
|
||||||
|
insert into t1 values (null), (1), (2), (3);
|
||||||
|
|
||||||
|
--echo # Query against empty t2
|
||||||
|
--sorted_result
|
||||||
|
select a, a in (select b from t2) from t1;
|
||||||
|
|
||||||
|
--echo # Insert some not-NULL values
|
||||||
|
insert into t2 values (3), (4);
|
||||||
|
--sorted_result
|
||||||
|
select a, a in (select b from t2) from t1;
|
||||||
|
--echo # Ensure the correct strategy is tested
|
||||||
|
--source include/analyze-format.inc
|
||||||
|
analyze format=json select a, a in (select b from t2) from t1;
|
||||||
|
|
||||||
|
--echo # Insert NULL value (so there are both NULLs and and not-NULL values)
|
||||||
|
insert into t2 values (null);
|
||||||
|
--sorted_result
|
||||||
|
select a, a in (select b from t2) from t1;
|
||||||
|
--source include/analyze-format.inc
|
||||||
|
analyze format=json select a, a in (select b from t2) from t1;
|
||||||
|
|
||||||
|
delete from t2;
|
||||||
|
--echo # Insert NULL values only
|
||||||
|
insert into t2 values (null), (null);
|
||||||
|
--sorted_result
|
||||||
|
select a, a in (select b from t2) from t1;
|
||||||
|
--source include/analyze-format.inc
|
||||||
|
analyze format=json select a, a in (select b from t2) from t1;
|
||||||
|
|
||||||
|
--echo # Test UPDATE
|
||||||
|
insert into t2 values (3), (4);
|
||||||
|
update t1 set a=a+1 where a not in (select b from t2);
|
||||||
|
--echo # Nothing updated due to NULLs on both sides of IN
|
||||||
|
select * from t1;
|
||||||
|
--echo # Remove NULLs from the right side
|
||||||
|
delete from t2 where b is null;
|
||||||
|
update t1 set a=a+1 where a not in (select b from t2);
|
||||||
|
--echo # Now some rows are updated:
|
||||||
|
select * from t1;
|
||||||
|
--source include/analyze-format.inc
|
||||||
|
analyze format=json update t1 set a=a+1 where a not in (select b from t2);
|
||||||
|
|
||||||
|
--echo # Test DELETE
|
||||||
|
--echo # Restore initial data-set:
|
||||||
|
delete from t1;
|
||||||
|
insert into t1 values (null), (1), (2), (3);
|
||||||
|
--echo # Add some NULL values to the right side of IN
|
||||||
|
insert into t2 values (null), (null);
|
||||||
|
delete from t1 where a not in (select b from t2);
|
||||||
|
--echo # Nothing deleted due to NULLs on both sides of IN
|
||||||
|
select * from t1;
|
||||||
|
--echo # Remove NULLs from the right side
|
||||||
|
delete from t2 where b is null;
|
||||||
|
delete from t1 where a not in (select b from t2);
|
||||||
|
--echo # Now some rows are deleted:
|
||||||
|
select * from t1;
|
||||||
|
--source include/analyze-format.inc
|
||||||
|
analyze format=json delete from t1 where a not in (select b from t2);
|
||||||
|
|
||||||
|
drop table t1, t2;
|
||||||
|
|
||||||
|
set @@optimizer_switch=@save_optimizer_switch;
|
||||||
|
|
||||||
|
@@ -115,8 +115,6 @@ ANALYZE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
# "Partial match" is used due to NOT IN
|
# "Partial match" is used due to NOT IN
|
||||||
# Force rowid-merge partial partial matching
|
|
||||||
set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off";
|
|
||||||
analyze format=json select * from t1 where a not in (select b from t2);
|
analyze format=json select * from t1 where a not in (select b from t2);
|
||||||
ANALYZE
|
ANALYZE
|
||||||
{
|
{
|
||||||
@@ -151,79 +149,7 @@ ANALYZE
|
|||||||
"subqueries": [
|
"subqueries": [
|
||||||
{
|
{
|
||||||
"materialization": {
|
"materialization": {
|
||||||
"r_strategy": "index_lookup;array merge for partial match",
|
"r_strategy": "null-aware index_lookup",
|
||||||
"r_loops": 4,
|
|
||||||
"r_index_lookups": 3,
|
|
||||||
"r_partial_matches": 1,
|
|
||||||
"r_partial_match_buffer_size": "REPLACED",
|
|
||||||
"r_partial_match_array_sizes": ["2"],
|
|
||||||
"query_block": {
|
|
||||||
"select_id": 2,
|
|
||||||
"cost": "REPLACED",
|
|
||||||
"r_loops": 1,
|
|
||||||
"r_total_time_ms": "REPLACED",
|
|
||||||
"nested_loop": [
|
|
||||||
{
|
|
||||||
"table": {
|
|
||||||
"table_name": "t2",
|
|
||||||
"access_type": "ALL",
|
|
||||||
"loops": 1,
|
|
||||||
"r_loops": 1,
|
|
||||||
"rows": 2,
|
|
||||||
"r_rows": 2,
|
|
||||||
"cost": "REPLACED",
|
|
||||||
"r_table_time_ms": "REPLACED",
|
|
||||||
"r_other_time_ms": "REPLACED",
|
|
||||||
"r_engine_stats": REPLACED,
|
|
||||||
"filtered": 100,
|
|
||||||
"r_total_filtered": 100,
|
|
||||||
"r_filtered": 100
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
# Force table scan partial matching
|
|
||||||
set @@optimizer_switch="partial_match_rowid_merge=off,partial_match_table_scan=on";
|
|
||||||
analyze format=json select * from t1 where a not in (select b from t2);
|
|
||||||
ANALYZE
|
|
||||||
{
|
|
||||||
"query_optimization": {
|
|
||||||
"r_total_time_ms": "REPLACED"
|
|
||||||
},
|
|
||||||
"query_block": {
|
|
||||||
"select_id": 1,
|
|
||||||
"cost": "REPLACED",
|
|
||||||
"r_loops": 1,
|
|
||||||
"r_total_time_ms": "REPLACED",
|
|
||||||
"nested_loop": [
|
|
||||||
{
|
|
||||||
"table": {
|
|
||||||
"table_name": "t1",
|
|
||||||
"access_type": "ALL",
|
|
||||||
"loops": 1,
|
|
||||||
"r_loops": 1,
|
|
||||||
"rows": 4,
|
|
||||||
"r_rows": 4,
|
|
||||||
"cost": "REPLACED",
|
|
||||||
"r_table_time_ms": "REPLACED",
|
|
||||||
"r_other_time_ms": "REPLACED",
|
|
||||||
"r_engine_stats": REPLACED,
|
|
||||||
"filtered": 100,
|
|
||||||
"r_total_filtered": 50,
|
|
||||||
"attached_condition": "!<in_optimizer>(t1.a,t1.a in (subquery#2))",
|
|
||||||
"r_filtered": 50
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"subqueries": [
|
|
||||||
{
|
|
||||||
"materialization": {
|
|
||||||
"r_strategy": "index_lookup;full scan for partial match",
|
|
||||||
"r_loops": 4,
|
"r_loops": 4,
|
||||||
"r_index_lookups": 3,
|
"r_index_lookups": 3,
|
||||||
"r_partial_matches": 1,
|
"r_partial_matches": 1,
|
||||||
@@ -300,7 +226,7 @@ ANALYZE
|
|||||||
"subqueries": [
|
"subqueries": [
|
||||||
{
|
{
|
||||||
"materialization": {
|
"materialization": {
|
||||||
"r_strategy": "index_lookup;full scan for partial match",
|
"r_strategy": "null-aware index_lookup",
|
||||||
"r_loops": 4,
|
"r_loops": 4,
|
||||||
"r_index_lookups": 3,
|
"r_index_lookups": 3,
|
||||||
"r_partial_matches": 1,
|
"r_partial_matches": 1,
|
||||||
@@ -336,7 +262,6 @@ ANALYZE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off";
|
|
||||||
analyze format=json select a from t1 group by a not in (select b from t2);
|
analyze format=json select a from t1 group by a not in (select b from t2);
|
||||||
ANALYZE
|
ANALYZE
|
||||||
{
|
{
|
||||||
@@ -379,12 +304,10 @@ ANALYZE
|
|||||||
"subqueries": [
|
"subqueries": [
|
||||||
{
|
{
|
||||||
"materialization": {
|
"materialization": {
|
||||||
"r_strategy": "index_lookup;array merge for partial match",
|
"r_strategy": "null-aware index_lookup",
|
||||||
"r_loops": 4,
|
"r_loops": 4,
|
||||||
"r_index_lookups": 3,
|
"r_index_lookups": 3,
|
||||||
"r_partial_matches": 1,
|
"r_partial_matches": 1,
|
||||||
"r_partial_match_buffer_size": "REPLACED",
|
|
||||||
"r_partial_match_array_sizes": ["2"],
|
|
||||||
"query_block": {
|
"query_block": {
|
||||||
"select_id": 2,
|
"select_id": 2,
|
||||||
"cost": "REPLACED",
|
"cost": "REPLACED",
|
||||||
@@ -417,7 +340,6 @@ ANALYZE
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=on";
|
|
||||||
# Subselect in ORDER BY
|
# Subselect in ORDER BY
|
||||||
analyze format=json select a from t1 order by a in (select b from t2);
|
analyze format=json select a from t1 order by a in (select b from t2);
|
||||||
ANALYZE
|
ANALYZE
|
||||||
@@ -464,7 +386,7 @@ ANALYZE
|
|||||||
"subqueries": [
|
"subqueries": [
|
||||||
{
|
{
|
||||||
"materialization": {
|
"materialization": {
|
||||||
"r_strategy": "index_lookup;full scan for partial match",
|
"r_strategy": "null-aware index_lookup",
|
||||||
"r_loops": 4,
|
"r_loops": 4,
|
||||||
"r_index_lookups": 3,
|
"r_index_lookups": 3,
|
||||||
"r_partial_matches": 1,
|
"r_partial_matches": 1,
|
||||||
@@ -533,7 +455,7 @@ ANALYZE
|
|||||||
"subqueries": [
|
"subqueries": [
|
||||||
{
|
{
|
||||||
"materialization": {
|
"materialization": {
|
||||||
"r_strategy": "index_lookup;full scan for partial match",
|
"r_strategy": "null-aware index_lookup",
|
||||||
"r_loops": 4,
|
"r_loops": 4,
|
||||||
"r_index_lookups": 3,
|
"r_index_lookups": 3,
|
||||||
"r_partial_matches": 1,
|
"r_partial_matches": 1,
|
||||||
@@ -733,7 +655,7 @@ ANALYZE
|
|||||||
"subqueries": [
|
"subqueries": [
|
||||||
{
|
{
|
||||||
"materialization": {
|
"materialization": {
|
||||||
"r_strategy": "index_lookup;full scan for partial match",
|
"r_strategy": "null-aware index_lookup",
|
||||||
"r_loops": 4,
|
"r_loops": 4,
|
||||||
"r_index_lookups": 3,
|
"r_index_lookups": 3,
|
||||||
"query_block": {
|
"query_block": {
|
||||||
@@ -856,6 +778,7 @@ create table t1 (a1 char(1), a2 char(1));
|
|||||||
insert into t1 values (null, 'b');
|
insert into t1 values (null, 'b');
|
||||||
create table t2 (b1 char(1), b2 char(2));
|
create table t2 (b1 char(1), b2 char(2));
|
||||||
insert into t2 values ('a','b'), ('c', 'd'), (null, 'e'), ('f', 'g');
|
insert into t2 values ('a','b'), ('c', 'd'), (null, 'e'), ('f', 'g');
|
||||||
|
# Force rowid-merge partial matching
|
||||||
set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off";
|
set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off";
|
||||||
explain format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2);
|
explain format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2);
|
||||||
EXPLAIN
|
EXPLAIN
|
||||||
@@ -961,6 +884,7 @@ ANALYZE
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
# Force table scan partial matching
|
||||||
set @@optimizer_switch="partial_match_rowid_merge=off,partial_match_table_scan=on";
|
set @@optimizer_switch="partial_match_rowid_merge=off,partial_match_table_scan=on";
|
||||||
analyze format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2);
|
analyze format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2);
|
||||||
ANALYZE
|
ANALYZE
|
||||||
|
@@ -14,13 +14,6 @@ explain format=json select * from t1 where a in (select b from t2);
|
|||||||
analyze format=json select * from t1 where a in (select b from t2);
|
analyze format=json select * from t1 where a in (select b from t2);
|
||||||
|
|
||||||
--echo # "Partial match" is used due to NOT IN
|
--echo # "Partial match" is used due to NOT IN
|
||||||
--echo # Force rowid-merge partial partial matching
|
|
||||||
set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off";
|
|
||||||
--source include/analyze-format.inc
|
|
||||||
analyze format=json select * from t1 where a not in (select b from t2);
|
|
||||||
|
|
||||||
--echo # Force table scan partial matching
|
|
||||||
set @@optimizer_switch="partial_match_rowid_merge=off,partial_match_table_scan=on";
|
|
||||||
--source include/analyze-format.inc
|
--source include/analyze-format.inc
|
||||||
analyze format=json select * from t1 where a not in (select b from t2);
|
analyze format=json select * from t1 where a not in (select b from t2);
|
||||||
|
|
||||||
@@ -28,11 +21,9 @@ analyze format=json select * from t1 where a not in (select b from t2);
|
|||||||
--source include/analyze-format.inc
|
--source include/analyze-format.inc
|
||||||
analyze format=json select a from t1 group by a in (select b from t2);
|
analyze format=json select a from t1 group by a in (select b from t2);
|
||||||
|
|
||||||
set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off";
|
|
||||||
--source include/analyze-format.inc
|
--source include/analyze-format.inc
|
||||||
analyze format=json select a from t1 group by a not in (select b from t2);
|
analyze format=json select a from t1 group by a not in (select b from t2);
|
||||||
|
|
||||||
set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=on";
|
|
||||||
--echo # Subselect in ORDER BY
|
--echo # Subselect in ORDER BY
|
||||||
--source include/analyze-format.inc
|
--source include/analyze-format.inc
|
||||||
analyze format=json select a from t1 order by a in (select b from t2);
|
analyze format=json select a from t1 order by a in (select b from t2);
|
||||||
@@ -69,12 +60,14 @@ insert into t1 values (null, 'b');
|
|||||||
create table t2 (b1 char(1), b2 char(2));
|
create table t2 (b1 char(1), b2 char(2));
|
||||||
insert into t2 values ('a','b'), ('c', 'd'), (null, 'e'), ('f', 'g');
|
insert into t2 values ('a','b'), ('c', 'd'), (null, 'e'), ('f', 'g');
|
||||||
|
|
||||||
|
--echo # Force rowid-merge partial matching
|
||||||
set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off";
|
set @@optimizer_switch="partial_match_rowid_merge=on,partial_match_table_scan=off";
|
||||||
--source include/explain-no-costs.inc
|
--source include/explain-no-costs.inc
|
||||||
explain format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2);
|
explain format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2);
|
||||||
--source include/analyze-format.inc
|
--source include/analyze-format.inc
|
||||||
analyze format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2);
|
analyze format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2);
|
||||||
|
|
||||||
|
--echo # Force table scan partial matching
|
||||||
set @@optimizer_switch="partial_match_rowid_merge=off,partial_match_table_scan=on";
|
set @@optimizer_switch="partial_match_rowid_merge=off,partial_match_table_scan=on";
|
||||||
--source include/analyze-format.inc
|
--source include/analyze-format.inc
|
||||||
analyze format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2);
|
analyze format=json select * from t1 where (a1, a2) not in (select b1, b2 from t2);
|
||||||
|
@@ -919,7 +919,7 @@ Warnings:
|
|||||||
Warning 1260 Row 1 was cut by group_concat()
|
Warning 1260 Row 1 was cut by group_concat()
|
||||||
Warning 1260 Row 2 was cut by group_concat()
|
Warning 1260 Row 2 was cut by group_concat()
|
||||||
Warning 1260 Row 3 was cut by group_concat()
|
Warning 1260 Row 3 was cut by group_concat()
|
||||||
Warning 4202 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
set @@group_concat_max_len = 256;
|
set @@group_concat_max_len = 256;
|
||||||
explain extended select left(a1,7), left(a2,7)
|
explain extended select left(a1,7), left(a2,7)
|
||||||
from t1_1024
|
from t1_1024
|
||||||
@@ -938,7 +938,7 @@ Warnings:
|
|||||||
Warning 1260 Row 1 was cut by group_concat()
|
Warning 1260 Row 1 was cut by group_concat()
|
||||||
Warning 1260 Row 2 was cut by group_concat()
|
Warning 1260 Row 2 was cut by group_concat()
|
||||||
Warning 1260 Row 3 was cut by group_concat()
|
Warning 1260 Row 3 was cut by group_concat()
|
||||||
Warning 4202 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
drop table t1_1024, t2_1024, t3_1024;
|
drop table t1_1024, t2_1024, t3_1024;
|
||||||
set @blob_len = 1025;
|
set @blob_len = 1025;
|
||||||
set @suffix_len = @blob_len - @prefix_len;
|
set @suffix_len = @blob_len - @prefix_len;
|
||||||
@@ -1024,7 +1024,7 @@ Warnings:
|
|||||||
Warning 1260 Row 1 was cut by group_concat()
|
Warning 1260 Row 1 was cut by group_concat()
|
||||||
Warning 1260 Row 2 was cut by group_concat()
|
Warning 1260 Row 2 was cut by group_concat()
|
||||||
Warning 1260 Row 3 was cut by group_concat()
|
Warning 1260 Row 3 was cut by group_concat()
|
||||||
Warning 4202 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
set @@group_concat_max_len = 256;
|
set @@group_concat_max_len = 256;
|
||||||
explain extended select left(a1,7), left(a2,7)
|
explain extended select left(a1,7), left(a2,7)
|
||||||
from t1_1025
|
from t1_1025
|
||||||
@@ -1043,7 +1043,7 @@ Warnings:
|
|||||||
Warning 1260 Row 1 was cut by group_concat()
|
Warning 1260 Row 1 was cut by group_concat()
|
||||||
Warning 1260 Row 2 was cut by group_concat()
|
Warning 1260 Row 2 was cut by group_concat()
|
||||||
Warning 1260 Row 3 was cut by group_concat()
|
Warning 1260 Row 3 was cut by group_concat()
|
||||||
Warning 4202 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
Warning 4203 3 values were longer than max_sort_length. Sorting used only the first 1024 bytes
|
||||||
drop table t1_1025, t2_1025, t3_1025;
|
drop table t1_1025, t2_1025, t3_1025;
|
||||||
create table t1bit (a1 bit(3), a2 bit(3));
|
create table t1bit (a1 bit(3), a2 bit(3));
|
||||||
create table t2bit (b1 bit(3), b2 bit(3));
|
create table t2bit (b1 bit(3), b2 bit(3));
|
||||||
|
1
mysql-test/main/timezone.opt
Normal file
1
mysql-test/main/timezone.opt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
--timezone=Europe/Budapest
|
@@ -1,6 +1,6 @@
|
|||||||
show variables like "system_time_zone";
|
show variables like "system_time_zone";
|
||||||
Variable_name Value
|
Variable_name Value
|
||||||
system_time_zone MET
|
system_time_zone CET
|
||||||
#
|
#
|
||||||
# Test unix timestamp
|
# Test unix timestamp
|
||||||
#
|
#
|
||||||
@@ -80,7 +80,7 @@ alter table mysql.time_zone_transition_type add primary key (time_zone_id,transi
|
|||||||
SET @@time_zone= default;
|
SET @@time_zone= default;
|
||||||
SELECT DATE_FORMAT('2009-11-01 22:23:00', '%z %Z') AS current_timezone;
|
SELECT DATE_FORMAT('2009-11-01 22:23:00', '%z %Z') AS current_timezone;
|
||||||
current_timezone
|
current_timezone
|
||||||
+0100 MET
|
+0100 CET
|
||||||
SELECT DATE_FORMAT('2008-06-04 02:23:00', '%z %Z') AS current_timezone;
|
SELECT DATE_FORMAT('2008-06-04 02:23:00', '%z %Z') AS current_timezone;
|
||||||
current_timezone
|
current_timezone
|
||||||
+0200 MEST
|
+0200 CEST
|
||||||
|
@@ -1,14 +1,14 @@
|
|||||||
#
|
#
|
||||||
# Test of SYSTEM time zone handling ( for my_system_gmt_sec()).
|
# Test of SYSTEM time zone handling ( for my_system_gmt_sec()).
|
||||||
# This script must be run with TZ=MET
|
# This script must have zonedata for CET
|
||||||
|
-- require include/have_cet_timezone.require
|
||||||
|
|
||||||
-- require include/have_met_timezone.require
|
|
||||||
disable_query_log;
|
disable_query_log;
|
||||||
select FROM_UNIXTIME(24*3600);
|
select FROM_UNIXTIME(24*3600);
|
||||||
enable_query_log;
|
enable_query_log;
|
||||||
|
|
||||||
# The following is because of daylight saving time
|
# The following is because of daylight saving time
|
||||||
--replace_result MEST MET
|
--replace_result MEST CET MET CET
|
||||||
show variables like "system_time_zone";
|
show variables like "system_time_zone";
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
|
@@ -1287,6 +1287,19 @@ h varchar(16) YES NULL
|
|||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
SET sql_mode=DEFAULT;
|
SET sql_mode=DEFAULT;
|
||||||
#
|
#
|
||||||
|
# MDEV-25174 DOUBLE columns do not accept large hex hybrids
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a DOUBLE);
|
||||||
|
INSERT INTO t1 VALUES (0x7FFFFFFFFFFFFFFF);
|
||||||
|
INSERT INTO t1 VALUES (0x8000000000000000);
|
||||||
|
INSERT INTO t1 VALUES (0xFFFFFFFFFFFFFFFF);
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
a
|
||||||
|
9.223372036854776e18
|
||||||
|
9.223372036854776e18
|
||||||
|
1.8446744073709552e19
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@@ -798,6 +798,17 @@ DROP TABLE t1, t2;
|
|||||||
|
|
||||||
SET sql_mode=DEFAULT;
|
SET sql_mode=DEFAULT;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-25174 DOUBLE columns do not accept large hex hybrids
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a DOUBLE);
|
||||||
|
INSERT INTO t1 VALUES (0x7FFFFFFFFFFFFFFF);
|
||||||
|
INSERT INTO t1 VALUES (0x8000000000000000);
|
||||||
|
INSERT INTO t1 VALUES (0xFFFFFFFFFFFFFFFF);
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.5 tests
|
--echo # End of 10.5 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@@ -2878,6 +2878,19 @@ h varchar(16) YES NULL
|
|||||||
DROP TABLE t1, t2;
|
DROP TABLE t1, t2;
|
||||||
SET sql_mode=DEFAULT;
|
SET sql_mode=DEFAULT;
|
||||||
#
|
#
|
||||||
|
# MDEV-25174 DOUBLE columns do not accept large hex hybrids
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a DECIMAL(30,0));
|
||||||
|
INSERT INTO t1 VALUES (0x7FFFFFFFFFFFFFFF);
|
||||||
|
INSERT INTO t1 VALUES (0x8000000000000000);
|
||||||
|
INSERT INTO t1 VALUES (0xFFFFFFFFFFFFFFFF);
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
a
|
||||||
|
9223372036854775807
|
||||||
|
9223372036854775808
|
||||||
|
18446744073709551615
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
# End of 10.5 tests
|
# End of 10.5 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@@ -2052,6 +2052,17 @@ DROP TABLE t1, t2;
|
|||||||
|
|
||||||
SET sql_mode=DEFAULT;
|
SET sql_mode=DEFAULT;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-25174 DOUBLE columns do not accept large hex hybrids
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a DECIMAL(30,0));
|
||||||
|
INSERT INTO t1 VALUES (0x7FFFFFFFFFFFFFFF);
|
||||||
|
INSERT INTO t1 VALUES (0x8000000000000000);
|
||||||
|
INSERT INTO t1 VALUES (0xFFFFFFFFFFFFFFFF);
|
||||||
|
SELECT * FROM t1 ORDER BY a;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.5 tests
|
--echo # End of 10.5 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
Binary file not shown.
@@ -391,3 +391,16 @@ Warnings:
|
|||||||
Note 1003 select "test"."t1"."c1" AS "c1","test"."t1"."c2" AS "c2","test"."t1"."c1" like concat("test"."t1"."c2",'_') AS "c1 LIKE c2||'_'" from "test"."t1" order by "test"."t1"."ord"
|
Note 1003 select "test"."t1"."c1" AS "c1","test"."t1"."c2" AS "c2","test"."t1"."c1" like concat("test"."t1"."c2",'_') AS "c1 LIKE c2||'_'" from "test"."t1" order by "test"."t1"."ord"
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# Start of 10.6 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-31910 ASAN memcpy-param-overlap upon CONCAT in ORACLE mode
|
||||||
|
#
|
||||||
|
SET SQL_MODE= ORACLE;
|
||||||
|
SELECT CONCAT(SUBSTR(123 FROM 2));
|
||||||
|
CONCAT(SUBSTR(123 FROM 2))
|
||||||
|
23
|
||||||
|
#
|
||||||
|
# End of 10.6 tests
|
||||||
|
#
|
||||||
|
@@ -182,3 +182,19 @@ EXPLAIN EXTENDED SELECT * FROM v1;
|
|||||||
|
|
||||||
DROP VIEW v1;
|
DROP VIEW v1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.6 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-31910 ASAN memcpy-param-overlap upon CONCAT in ORACLE mode
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET SQL_MODE= ORACLE;
|
||||||
|
SELECT CONCAT(SUBSTR(123 FROM 2));
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.6 tests
|
||||||
|
--echo #
|
||||||
|
@@ -870,3 +870,14 @@ USE test;
|
|||||||
DROP DATABASE events_test;
|
DROP DATABASE events_test;
|
||||||
SET GLOBAL event_scheduler= 'ON';
|
SET GLOBAL event_scheduler= 'ON';
|
||||||
SET @@global.concurrent_insert= @concurrent_insert;
|
SET @@global.concurrent_insert= @concurrent_insert;
|
||||||
|
#
|
||||||
|
# MDEV-33472 Assertion `0' failed in Item_row::illegal_method_call on CREATE EVENT
|
||||||
|
#
|
||||||
|
CREATE EVENT e ON SCHEDULE EVERY 1 HOUR STARTS ROW(1,2) DO SELECT 1;
|
||||||
|
ERROR 21000: Operand should contain 1 column(s)
|
||||||
|
CREATE EVENT e ON SCHEDULE EVERY 1 HOUR ENDS ROW(1,2) DO SELECT 1;
|
||||||
|
ERROR 21000: Operand should contain 1 column(s)
|
||||||
|
CREATE EVENT e ON SCHEDULE AT ROW(1,2) DO SELECT *;
|
||||||
|
ERROR 21000: Operand should contain 1 column(s)
|
||||||
|
CREATE EVENT e ON SCHEDULE EVERY ROW(1,2) HOUR DO SELECT 1;
|
||||||
|
ERROR 21000: Operand should contain 1 column(s)
|
||||||
|
@@ -1308,3 +1308,20 @@ SET GLOBAL event_scheduler= 'ON';
|
|||||||
--source include/running_event_scheduler.inc
|
--source include/running_event_scheduler.inc
|
||||||
SET @@global.concurrent_insert= @concurrent_insert;
|
SET @@global.concurrent_insert= @concurrent_insert;
|
||||||
# THIS MUST BE THE LAST LINE in this file.
|
# THIS MUST BE THE LAST LINE in this file.
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-33472 Assertion `0' failed in Item_row::illegal_method_call on CREATE EVENT
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--error ER_OPERAND_COLUMNS
|
||||||
|
CREATE EVENT e ON SCHEDULE EVERY 1 HOUR STARTS ROW(1,2) DO SELECT 1;
|
||||||
|
|
||||||
|
--error ER_OPERAND_COLUMNS
|
||||||
|
CREATE EVENT e ON SCHEDULE EVERY 1 HOUR ENDS ROW(1,2) DO SELECT 1;
|
||||||
|
|
||||||
|
--error ER_OPERAND_COLUMNS
|
||||||
|
CREATE EVENT e ON SCHEDULE AT ROW(1,2) DO SELECT *;
|
||||||
|
|
||||||
|
--error ER_OPERAND_COLUMNS
|
||||||
|
CREATE EVENT e ON SCHEDULE EVERY ROW(1,2) HOUR DO SELECT 1;
|
||||||
|
@@ -27,4 +27,4 @@ wsrep_last_written_gtid()
|
|||||||
connection node_1;
|
connection node_1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
connection node_2;
|
connection node_2;
|
||||||
CALL mtr.add_suppression("Ignoring server id for non bootstrap node");
|
CALL mtr.add_suppression("Ignoring server id .* for non bootstrap node");
|
||||||
|
@@ -49,4 +49,4 @@ mysqld-bin.000003 # Query # # COMMIT
|
|||||||
BINLOG_POSITIONS_MATCH
|
BINLOG_POSITIONS_MATCH
|
||||||
1
|
1
|
||||||
DROP TABLE t1,ts1;
|
DROP TABLE t1,ts1;
|
||||||
CALL mtr.add_suppression("Ignoring server id for non bootstrap node");
|
CALL mtr.add_suppression("Ignoring server id .* for non bootstrap node");
|
||||||
|
@@ -5,7 +5,7 @@ select @@gtid_domain_id, @@server_id, @@wsrep_gtid_domain_id,@@wsrep_gtid_mode;
|
|||||||
@@gtid_domain_id @@server_id @@wsrep_gtid_domain_id @@wsrep_gtid_mode
|
@@gtid_domain_id @@server_id @@wsrep_gtid_domain_id @@wsrep_gtid_mode
|
||||||
0 11 1 1
|
0 11 1 1
|
||||||
connection node_2;
|
connection node_2;
|
||||||
call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\.");
|
call mtr.add_suppression("WSREP: Ignoring server id .* for non bootstrap node");
|
||||||
select @@gtid_domain_id, @@server_id, @@wsrep_gtid_domain_id,@@wsrep_gtid_mode;
|
select @@gtid_domain_id, @@server_id, @@wsrep_gtid_domain_id,@@wsrep_gtid_mode;
|
||||||
@@gtid_domain_id @@server_id @@wsrep_gtid_domain_id @@wsrep_gtid_mode
|
@@gtid_domain_id @@server_id @@wsrep_gtid_domain_id @@wsrep_gtid_mode
|
||||||
0 12 1 1
|
0 12 1 1
|
||||||
|
@@ -42,4 +42,4 @@ SET GLOBAL wsrep_on=ON;
|
|||||||
connection node_3;
|
connection node_3;
|
||||||
reset master;
|
reset master;
|
||||||
connection node_2;
|
connection node_2;
|
||||||
CALL mtr.add_suppression("Ignoring server id for non bootstrap node");
|
CALL mtr.add_suppression("Ignoring server id .* for non bootstrap node");
|
||||||
|
@@ -167,4 +167,4 @@ set global wsrep_on=ON;
|
|||||||
connection node_3;
|
connection node_3;
|
||||||
reset master;
|
reset master;
|
||||||
connection node_2;
|
connection node_2;
|
||||||
CALL mtr.add_suppression("Ignoring server id for non bootstrap node");
|
CALL mtr.add_suppression("Ignoring server id .* for non bootstrap node");
|
||||||
|
@@ -42,4 +42,4 @@ SELECT @@gtid_binlog_state;
|
|||||||
@@gtid_binlog_state
|
@@gtid_binlog_state
|
||||||
1-1-101
|
1-1-101
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
CALL mtr.add_suppression("Ignoring server id for non bootstrap node");
|
CALL mtr.add_suppression("Ignoring server id .* for non bootstrap node");
|
||||||
|
@@ -34,4 +34,4 @@ wsrep_last_written_id_advanced
|
|||||||
SET AUTOCOMMIT=ON;
|
SET AUTOCOMMIT=ON;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
connection node_2;
|
connection node_2;
|
||||||
CALL mtr.add_suppression("Ignoring server id for non bootstrap node");
|
CALL mtr.add_suppression("Ignoring server id .* for non bootstrap node");
|
||||||
|
@@ -3,9 +3,9 @@ connection node_1;
|
|||||||
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
|
connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3;
|
||||||
connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4;
|
connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4;
|
||||||
connection node_2;
|
connection node_2;
|
||||||
call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\.");
|
call mtr.add_suppression("WSREP: Ignoring server id .* for non bootstrap node");
|
||||||
connection node_4;
|
connection node_4;
|
||||||
call mtr.add_suppression("WSREP: Ignoring server id for non bootstrap node\\.");
|
call mtr.add_suppression("WSREP: Ignoring server id .* for non bootstrap node");
|
||||||
connection node_3;
|
connection node_3;
|
||||||
CHANGE MASTER TO master_host='127.0.0.1', master_user='root', master_port=NODE_MYPORT_1, master_ssl_verify_server_cert=0, master_use_gtid=current_pos;
|
CHANGE MASTER TO master_host='127.0.0.1', master_user='root', master_port=NODE_MYPORT_1, master_ssl_verify_server_cert=0, master_use_gtid=current_pos;
|
||||||
START SLAVE;
|
START SLAVE;
|
||||||
|
@@ -24,4 +24,4 @@ WSREP_SYNC_WAIT_UPTO
|
|||||||
connection node_1;
|
connection node_1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
connection node_2;
|
connection node_2;
|
||||||
CALL mtr.add_suppression("Ignoring server id for non bootstrap node");
|
CALL mtr.add_suppression("Ignoring server id .* for non bootstrap node");
|
||||||
|
@@ -90,7 +90,7 @@ set global wsrep_on=OFF;
|
|||||||
reset master;
|
reset master;
|
||||||
set global wsrep_on=ON;
|
set global wsrep_on=ON;
|
||||||
connection node_2;
|
connection node_2;
|
||||||
CALL mtr.add_suppression("Ignoring server id for non bootstrap node");
|
CALL mtr.add_suppression("Ignoring server id .* for non bootstrap node");
|
||||||
disconnect node_2;
|
disconnect node_2;
|
||||||
disconnect node_1;
|
disconnect node_1;
|
||||||
# End of test
|
# End of test
|
||||||
|
@@ -207,6 +207,7 @@ connection node_1;
|
|||||||
CREATE TABLE t1 (f1 INTEGER, f2 INTEGER);
|
CREATE TABLE t1 (f1 INTEGER, f2 INTEGER);
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
connection node_2;
|
connection node_2;
|
||||||
|
set session wsrep_sync_wait=0;
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
ERROR 42S02: Table 'test.t1' doesn't exist
|
ERROR 42S02: Table 'test.t1' doesn't exist
|
||||||
SET GLOBAL wsrep_ignore_apply_errors = 10;
|
SET GLOBAL wsrep_ignore_apply_errors = 10;
|
||||||
|
@@ -3,8 +3,9 @@ connection node_1;
|
|||||||
connection node_1;
|
connection node_1;
|
||||||
connection node_2;
|
connection node_2;
|
||||||
connection node_1;
|
connection node_1;
|
||||||
call mtr.add_suppression("WSREP: async IST sender failed to serve.*");
|
call mtr.add_suppression("WSREP:.*");
|
||||||
SET @wsrep_provider_options_orig = @@GLOBAL.wsrep_provider_options;
|
SET @wsrep_provider_options_orig = @@GLOBAL.wsrep_provider_options;
|
||||||
|
SET GLOBAL wsrep_provider_options ='pc.ignore_sb=true;pc.weight=2';
|
||||||
connection node_2;
|
connection node_2;
|
||||||
SET @wsrep_cluster_address_orig = @@GLOBAL.wsrep_cluster_address;
|
SET @wsrep_cluster_address_orig = @@GLOBAL.wsrep_cluster_address;
|
||||||
SET GLOBAL WSREP_ON=0;
|
SET GLOBAL WSREP_ON=0;
|
||||||
@@ -26,11 +27,37 @@ SELECT 1;
|
|||||||
1
|
1
|
||||||
1
|
1
|
||||||
DELETE FROM mysql.wsrep_allowlist;
|
DELETE FROM mysql.wsrep_allowlist;
|
||||||
connection node_1;
|
|
||||||
SET GLOBAL wsrep_provider_options ='pc.ignore_sb=true';
|
|
||||||
connection node_2;
|
connection node_2;
|
||||||
Killing server ...
|
Killing server ...
|
||||||
connection node_1;
|
connection node_1;
|
||||||
|
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
|
||||||
|
EXPECT_0
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster;
|
||||||
|
EXPECT_1
|
||||||
|
1
|
||||||
|
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster_members;
|
||||||
|
EXPECT_1
|
||||||
|
1
|
||||||
connection node_2;
|
connection node_2;
|
||||||
connection node_1;
|
connection node_1;
|
||||||
SET GLOBAL wsrep_provider_options ='pc.ignore_sb=false';
|
SET GLOBAL wsrep_provider_options ='pc.ignore_sb=false;pc.weight=1';
|
||||||
|
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
|
||||||
|
EXPECT_0
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster;
|
||||||
|
EXPECT_1
|
||||||
|
1
|
||||||
|
SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members;
|
||||||
|
EXPECT_2
|
||||||
|
2
|
||||||
|
connection node_2;
|
||||||
|
SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log;
|
||||||
|
EXPECT_0
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster;
|
||||||
|
EXPECT_1
|
||||||
|
1
|
||||||
|
SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members;
|
||||||
|
EXPECT_2
|
||||||
|
2
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user