diff --git a/.gitignore b/.gitignore index db9e19d8708..adcf9a90245 100644 --- a/.gitignore +++ b/.gitignore @@ -136,6 +136,7 @@ scripts/mysqld_safe scripts/mysqldumpslow scripts/mysqlhotcopy scripts/mytop +scripts/print_ddl_recovery_log.pl scripts/wsrep_sst_backup scripts/wsrep_sst_common scripts/wsrep_sst_mysqldump diff --git a/CMakeLists.txt b/CMakeLists.txt index 79c43fb4fc4..16dedc56c06 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -297,7 +297,7 @@ ENDIF() SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC") SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC") -IF(CMAKE_COMPILER_IS_GNUCC AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "10") +IF(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "10") # Enable extra checks when using a recent enough version of GNU libstdc++ SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_GLIBCXX_DEBUG -D_GLIBCXX_ASSERTIONS") ENDIF() diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c index aa9a78ef778..4bbac4ef4be 100644 --- a/client/mysqlcheck.c +++ b/client/mysqlcheck.c @@ -890,6 +890,9 @@ static int disable_binlog() } +/* Ok as mysqlcheck is not multi threaded */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + static int handle_request_for_tables(char *tables, size_t length, my_bool view, my_bool dont_quote) { @@ -1021,9 +1024,6 @@ static void insert_table_name(DYNAMIC_ARRAY *arr, char *in, size_t dblen) insert_dynamic(arr, (uchar*) buf); } -/* Ok as mysqlcheck is not multi threaded */ -PRAGMA_DISABLE_CHECK_STACK_FRAME - static void __attribute__((noinline)) print_result() { MYSQL_RES *res; diff --git a/client/mysqlslap.c b/client/mysqlslap.c index ccc6d55f0b1..286e7ce3549 100644 --- a/client/mysqlslap.c +++ b/client/mysqlslap.c @@ -419,6 +419,8 @@ int main(int argc, char **argv) return 0; } +PRAGMA_DISABLE_CHECK_STACK_FRAME + void concurrency_loop(MYSQL *mysql, uint current, option_string *eptr) { unsigned int x; @@ -514,6 +516,7 @@ void concurrency_loop(MYSQL *mysql, uint current, option_string *eptr) my_free(head_sptr); } +PRAGMA_REENABLE_CHECK_STACK_FRAME static struct my_option my_long_options[] = @@ -2279,6 +2282,7 @@ statement_cleanup(statement *stmt) } } +PRAGMA_DISABLE_CHECK_STACK_FRAME int slap_connect(MYSQL *mysql) @@ -2312,3 +2316,4 @@ slap_connect(MYSQL *mysql) return 0; } +PRAGMA_REENABLE_CHECK_STACK_FRAME diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 4c46145dfd6..f04916f339e 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -2860,6 +2860,7 @@ do_result_format_version(struct st_command *command) dynstr_append_mem(&ds_res, ds_version.str, ds_version.length); dynstr_append_mem(&ds_res, STRING_WITH_LEN("\n")); dynstr_free(&ds_version); + DBUG_VOID_RETURN; } diff --git a/cmake/build_configurations/mysql_release.cmake b/cmake/build_configurations/mysql_release.cmake index 738722aa3af..8b6fea95694 100644 --- a/cmake/build_configurations/mysql_release.cmake +++ b/cmake/build_configurations/mysql_release.cmake @@ -171,7 +171,7 @@ ENDIF() IF(UNIX) # Default GCC flags - IF(CMAKE_COMPILER_IS_GNUCC) + IF(CMAKE_C_COMPILER_ID STREQUAL "GNU") SET(COMMON_C_FLAGS "-g -fno-omit-frame-pointer -fno-strict-aliasing -Wno-uninitialized") STRING(APPEND CMAKE_C_FLAGS_DEBUG " ${COMMON_C_FLAGS}") STRING(APPEND CMAKE_C_FLAGS_RELEASE " ${COMMON_C_FLAGS}") @@ -180,7 +180,7 @@ IF(UNIX) STRING(REGEX REPLACE "-O2" "-O3" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") STRING(REGEX REPLACE "-O2" "-O3" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") ENDIF() - IF(CMAKE_COMPILER_IS_GNUCXX) + IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") SET(COMMON_CXX_FLAGS "-g -fno-omit-frame-pointer -fno-strict-aliasing -Wno-uninitialized") STRING(APPEND CMAKE_CXX_FLAGS_DEBUG " ${COMMON_CXX_FLAGS}") STRING(APPEND CMAKE_CXX_FLAGS_RELEASE " ${COMMON_CXX_FLAGS}") @@ -200,11 +200,11 @@ IF(UNIX) SET(z_flags "") ENDIF() - IF(CMAKE_COMPILER_IS_GNUCC) + IF(CMAKE_C_COMPILER_ID STREQUAL "GNU") STRING(APPEND CMAKE_C_FLAGS_RELEASE " ${z_flags}") STRING(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO " ${z_flags}") ENDIF() - IF(CMAKE_COMPILER_IS_GNUCXX) + IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") STRING(APPEND CMAKE_CXX_FLAGS_RELEASE " ${z_flags}") STRING(APPEND CMAKE_CXX_FLAGS_RELWITHDEBINFO " ${z_flags}") ENDIF() diff --git a/cmake/dtrace.cmake b/cmake/dtrace.cmake index 9d3d3cd50c5..0ba7fc7d6dd 100644 --- a/cmake/dtrace.cmake +++ b/cmake/dtrace.cmake @@ -13,7 +13,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA -IF(CMAKE_SYSTEM_NAME MATCHES "SunOS" AND CMAKE_COMPILER_IS_GNUCXX +IF(CMAKE_SYSTEM_NAME MATCHES "SunOS" AND CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_SIZEOF_VOID_P EQUAL 4) IF(NOT DEFINED BUGGY_GCC_NO_DTRACE_MODULES) EXECUTE_PROCESS( diff --git a/cmake/maintainer.cmake b/cmake/maintainer.cmake index dd5a6ef5bab..ce183d5d238 100644 --- a/cmake/maintainer.cmake +++ b/cmake/maintainer.cmake @@ -42,6 +42,10 @@ SET(MY_WARNING_FLAGS -Wcast-function-type-strict ) +IF(NOT (WITH_MSAN OR WITH_ASAN OR WITH_UBSAN)) + SET(MY_WARNING_FLAGS ${MY_WARNING_FLAGS} -Wframe-larger-than=16384) +ENDIF() + # Warning flags that are in testing before moving # to MY_WARNING_FLAGS if stable. SET(MY_WARNING_FLAGS_NON_FATAL @@ -58,7 +62,7 @@ ENDFOREACH() 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_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS "6.0.0") SET(MY_ERROR_FLAGS ${MY_ERROR_FLAGS} -Wno-error=maybe-uninitialized) SET(MY_ERROR_FLAGS ${MY_ERROR_FLAGS} -Wno-error=non-virtual-dtor) # gcc bug 7302 ENDIF() diff --git a/cmake/os/SunOS.cmake b/cmake/os/SunOS.cmake index 3a9d2dccb87..e971a86e606 100644 --- a/cmake/os/SunOS.cmake +++ b/cmake/os/SunOS.cmake @@ -69,8 +69,8 @@ CHECK_C_SOURCE_RUNS( # Check is special processor flag needs to be set on older GCC -#that defaults to v8 sparc . Code here is taken from my_rdtsc.h -IF(CMAKE_COMPILER_IS_GNUCC AND CMAKE_SIZEOF_VOID_P EQUAL 4 +# that defaults to v8 sparc . Code here is taken from my_rdtsc.h +IF(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_SIZEOF_VOID_P EQUAL 4 AND CMAKE_SYSTEM_PROCESSOR MATCHES "sparc") SET(SOURCE " diff --git a/extra/CMakeLists.txt b/extra/CMakeLists.txt index 0bcbb4f5f6a..e6db43fec62 100644 --- a/extra/CMakeLists.txt +++ b/extra/CMakeLists.txt @@ -82,6 +82,14 @@ IF(WITH_INNOBASE_STORAGE_ENGINE) ) + # clang ~16+ with return values being undefined is resolved by basic optimization + # compiler flags for the function mach_read_from_2 (per MDEV-36316) + IF(WITH_MSAN AND CMAKE_BUILD_TYPE STREQUAL "Debug") + SET_SOURCE_FILES_PROPERTIES( + ${INNOBASE_SOURCES} + innochecksum.cc + PROPERTIES COMPILE_FLAGS -Og) + ENDIF() MYSQL_ADD_EXECUTABLE(innochecksum innochecksum.cc ${INNOBASE_SOURCES}) TARGET_LINK_LIBRARIES(innochecksum mysys mysys_ssl) ADD_DEPENDENCIES(innochecksum GenError) diff --git a/extra/mariabackup/aria_backup_client.cc b/extra/mariabackup/aria_backup_client.cc index 25468148fe4..73fe7cb334d 100644 --- a/extra/mariabackup/aria_backup_client.cc +++ b/extra/mariabackup/aria_backup_client.cc @@ -955,6 +955,7 @@ void Backup::set_post_copy_table_hook(const post_copy_table_hook_t &hook) { bool prepare(const char *target_dir) { maria_data_root= (char *)target_dir; + maria_tmpdir= &mysql_tmpdir_list; if (maria_init()) die("Can't init Aria engine (%d)", errno); diff --git a/extra/mariabackup/fil_cur.cc b/extra/mariabackup/fil_cur.cc index ad48ad9e17c..7eaec010c68 100644 --- a/extra/mariabackup/fil_cur.cc +++ b/extra/mariabackup/fil_cur.cc @@ -209,7 +209,10 @@ xb_fil_cur_open( cursor->buf_size = XB_FIL_CUR_PAGES * cursor->page_size; cursor->buf = static_cast(aligned_malloc(cursor->buf_size, srv_page_size)); - + cursor->tmp_page = static_cast(aligned_malloc(srv_page_size, + srv_page_size)); + cursor->tmp_frame = static_cast(aligned_malloc(srv_page_size, + srv_page_size)); cursor->buf_read = 0; cursor->buf_npages = 0; cursor->buf_offset = 0; @@ -237,15 +240,10 @@ xb_fil_cur_open( return(XB_FIL_CUR_SUCCESS); } -/* Stack usage 131224 with clang */ -PRAGMA_DISABLE_CHECK_STACK_FRAME - static bool page_is_corrupted(const byte *page, ulint page_no, const xb_fil_cur_t *cursor, const fil_space_t *space) { - byte tmp_frame[UNIV_PAGE_SIZE_MAX]; - byte tmp_page[UNIV_PAGE_SIZE_MAX]; const ulint page_size = cursor->page_size; uint16_t page_type = fil_page_get_type(page); @@ -308,42 +306,43 @@ static bool page_is_corrupted(const byte *page, ulint page_no, && !opt_extended_validation) return false; - memcpy(tmp_page, page, page_size); + memcpy(cursor->tmp_page, page, page_size); if (!space->crypt_data || space->crypt_data->type == CRYPT_SCHEME_UNENCRYPTED - || !fil_space_decrypt(space, tmp_frame, tmp_page)) { + || !fil_space_decrypt(space, cursor->tmp_frame, + cursor->tmp_page)) { return true; } if (page_type != FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) { - return buf_page_is_corrupted(false, tmp_page, + return buf_page_is_corrupted(false, cursor->tmp_page, space->flags); } } if (page_type == FIL_PAGE_PAGE_COMPRESSED) { - memcpy(tmp_page, page, page_size); + memcpy(cursor->tmp_page, page, page_size); } if (page_type == FIL_PAGE_PAGE_COMPRESSED || page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED) { - ulint decomp = fil_page_decompress(tmp_frame, tmp_page, + ulint decomp = fil_page_decompress(cursor->tmp_frame, + cursor->tmp_page, space->flags); - page_type = fil_page_get_type(tmp_page); + page_type = fil_page_get_type(cursor->tmp_page); return (!decomp || (decomp != srv_page_size && cursor->zip_size) || page_type == FIL_PAGE_PAGE_COMPRESSED || page_type == FIL_PAGE_PAGE_COMPRESSED_ENCRYPTED - || buf_page_is_corrupted(false, tmp_page, + || buf_page_is_corrupted(false, cursor->tmp_page, space->flags)); } return buf_page_is_corrupted(false, page, space->flags); } -PRAGMA_REENABLE_CHECK_STACK_FRAME /** Reads and verifies the next block of pages from the source file. Positions the cursor after the last read non-corrupted page. @@ -507,7 +506,11 @@ xb_fil_cur_close( xb_fil_cur_t *cursor) /*!< in/out: source file cursor */ { aligned_free(cursor->buf); + aligned_free(cursor->tmp_page); + aligned_free(cursor->tmp_frame); cursor->buf = NULL; + cursor->tmp_page = NULL; + cursor->tmp_frame = NULL; if (cursor->node != NULL) { xb_fil_node_close_file(cursor->node); diff --git a/extra/mariabackup/fil_cur.h b/extra/mariabackup/fil_cur.h index 46c8cb03705..f21466e9cf5 100644 --- a/extra/mariabackup/fil_cur.h +++ b/extra/mariabackup/fil_cur.h @@ -46,7 +46,9 @@ struct xb_fil_cur_t { xb_read_filt_t* read_filter; /*!< read filter */ xb_read_filt_ctxt_t read_filter_ctxt; /*!< read filter context */ - byte* buf; /*!< read buffer */ + byte* buf; /*!< read buffer of XB_FIL_CUR_PAGES */ + byte* tmp_page; /*!< buffer for decrypting a page */ + byte* tmp_frame; /*!< buffer for decompressing a page */ size_t buf_size; /*!< buffer size in bytes */ size_t buf_read; /*!< number of read bytes in buffer after the last cursor read */ diff --git a/extra/mariabackup/xtrabackup.cc b/extra/mariabackup/xtrabackup.cc index 4ca092872be..debc17f0399 100644 --- a/extra/mariabackup/xtrabackup.cc +++ b/extra/mariabackup/xtrabackup.cc @@ -1187,6 +1187,7 @@ static void backup_file_op_fail(uint32_t space_id, int type, const byte* name, ulint len, const byte* new_name, ulint new_len) { + const char *error= ""; bool fail = false; const std::string spacename{filename_to_spacename(name, len)}; switch (type) { @@ -1194,6 +1195,7 @@ static void backup_file_op_fail(uint32_t space_id, int type, msg("DDL tracking : create %" PRIu32 " \"%.*s\"", space_id, int(len), name); fail = !check_if_skip_table(spacename.c_str()); + error= "create"; break; case FILE_MODIFY: break; @@ -1203,12 +1205,14 @@ static void backup_file_op_fail(uint32_t space_id, int type, fail = !check_if_skip_table(spacename.c_str()) || !check_if_skip_table( filename_to_spacename(new_name, new_len).c_str()); + error= "rename"; break; case FILE_DELETE: fail = !check_if_skip_table(spacename.c_str()) && !check_if_fts_table(spacename.c_str()); msg("DDL tracking : delete %" PRIu32 " \"%.*s\"", space_id, int(len), name); + error= "delete"; break; default: ut_ad(0); @@ -1216,9 +1220,14 @@ static void backup_file_op_fail(uint32_t space_id, int type, } if (fail) { - ut_a(opt_no_lock); - die("DDL operation detected in the late phase of backup." - "Backup is inconsistent. Remove --no-lock option to fix."); + if (opt_no_lock) + die("DDL operation detected in the late phase of backup while " + "executing %s on %s. " + "Backup is inconsistent. Remove --no-lock option to fix.", + error, name); + die("Unexpected DDL operation detected in the late phase of backup " + "while executing %s on %s. Backup is inconsistent.", + error, name); } } diff --git a/extra/wolfssl/CMakeLists.txt b/extra/wolfssl/CMakeLists.txt index dc2f8092762..38203a07911 100644 --- a/extra/wolfssl/CMakeLists.txt +++ b/extra/wolfssl/CMakeLists.txt @@ -126,7 +126,8 @@ endif() # Silence some warnings if(MSVC) # truncation warnings - target_compile_options(wolfssl PRIVATE $<$:/wd4244>) + target_compile_options(wolfssl PRIVATE $<$:/wd4244 /wd5287 /wd5286>) + target_compile_definitions(wolfssl PUBLIC WC_NO_STATIC_ASSERT) if(CMAKE_C_COMPILER_ID MATCHES Clang) target_compile_options(wolfssl PRIVATE $<$:-Wno-incompatible-function-pointer-types>) endif() diff --git a/include/my_attribute.h b/include/my_attribute.h index 44b677de66e..04f6a62b4a1 100644 --- a/include/my_attribute.h +++ b/include/my_attribute.h @@ -83,17 +83,30 @@ /* Define pragmas to disable warnings for stack frame checking */ -#if defined(__clang__) +#ifdef __GNUC__ #define PRAGMA_DISABLE_CHECK_STACK_FRAME \ -_Pragma("clang diagnostic push") \ -_Pragma("clang diagnostic ignored \"-Wframe-larger-than=\"") +_Pragma("GCC diagnostic push") \ +_Pragma("GCC diagnostic ignored \"-Wframe-larger-than=\"") #define PRAGMA_REENABLE_CHECK_STACK_FRAME \ -_Pragma("clang diagnostic pop") +_Pragma("GCC diagnostic pop") +/* + The following check is for older gcc version that allocates + a lot of stack during startup that does not need to be checked +*/ + +#if !defined(__clang__) && __GNUC__ < 13 +#define PRAGMA_DISABLE_CHECK_STACK_FRAME_EXTRA PRAGMA_DISABLE_CHECK_STACK_FRAME #else +#define PRAGMA_DISABLE_CHECK_STACK_FRAME_EXTRA +#endif /* !defined(__clang__) && __GNUC__ < 13 */ + +#else /*! __GNUC__ */ #define PRAGMA_DISABLE_CHECK_STACK_FRAME #define PRAGMA_REENABLE_CHECK_STACK_FRAME -#endif +#define PRAGMA_DISABLE_CHECK_STACK_FRAME +#define PRAGMA_DISABLE_CHECK_STACK_FRAME_EXTRA +#endif /* __GNUC__ */ #endif /* _my_attribute_h */ diff --git a/include/my_pthread.h b/include/my_pthread.h index bc2b834ba2b..e4cdc541b46 100644 --- a/include/my_pthread.h +++ b/include/my_pthread.h @@ -667,7 +667,17 @@ extern void my_mutex_end(void); We need to have at least 256K stack to handle calls to myisamchk_init() with the current number of keys and key parts. */ -# if defined(__SANITIZE_ADDRESS__) || defined(WITH_UBSAN) +#if !defined(__has_feature) +#define __has_feature(x) 0 +#endif +#if defined(__clang__) && __has_feature(memory_sanitizer) && !defined(DBUG_OFF) +/* + MSAN in Debug with clang-20.1 required more memory to complete + mtr begin/end checks. The result without increase was MSAN + errors triggered on a call instruction. +*/ +# define DEFAULT_THREAD_STACK (2L<<20) +# elif defined(__SANITIZE_ADDRESS__) || defined(WITH_UBSAN) /* Optimized WITH_ASAN=ON executables produced by GCC 12.3.0, GCC 13.2.0, or clang 16.0.6 diff --git a/include/my_time.h b/include/my_time.h index 9f3e61b944f..90a8885a293 100644 --- a/include/my_time.h +++ b/include/my_time.h @@ -230,7 +230,6 @@ static inline longlong sec_part_unshift(longlong second_part, uint digits) /* Date/time rounding and truncation functions */ static inline long my_time_fraction_remainder(long nr, uint decimals) { - DBUG_ASSERT(decimals <= TIME_SECOND_PART_DIGITS); return nr % (long) log_10_int[TIME_SECOND_PART_DIGITS - decimals]; } static inline void my_datetime_trunc(MYSQL_TIME *ltime, uint decimals) diff --git a/mysql-test/include/no_msan_without_big.inc b/mysql-test/include/no_msan_without_big.inc new file mode 100644 index 00000000000..158b3986768 --- /dev/null +++ b/mysql-test/include/no_msan_without_big.inc @@ -0,0 +1,8 @@ +# Slow with MSAN, but if mtr --big-test specified, then it should complete +if (!$BIG_TEST) +{ + if (`select count(*) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like "MSAN%"`) + { + --skip Can't be run WITH_MSAN unless using --big-test + } +} diff --git a/mysql-test/include/not_msan.inc b/mysql-test/include/not_msan.inc index ca1e2c1d7bd..678139199a2 100644 --- a/mysql-test/include/not_msan.inc +++ b/mysql-test/include/not_msan.inc @@ -1,4 +1,5 @@ -# This file should only be used with tests that are too big or slow for MSAN. +# This file should only be used with tests that are too big or slow for MSAN (even with --big-test). +# Use no_msan_without_big instead unless this really won't complete in a test timeout period. if (`select count(*) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like "MSAN%"`) { diff --git a/mysql-test/include/not_msan_with_debug.inc b/mysql-test/include/not_msan_with_debug.inc new file mode 100644 index 00000000000..155e05991a0 --- /dev/null +++ b/mysql-test/include/not_msan_with_debug.inc @@ -0,0 +1,9 @@ +# This file should only be used with tests that are too big or slow for MSAN with Debug. + +if (`select count(*) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like "MSAN%"`) +{ + if (`select version() like '%debug%'`) + { + --skip Can't be run WITH_MSAN and CMAKE_BUILD_TYPE=Debug + } +} diff --git a/mysql-test/main/alter_table_lock.test b/mysql-test/main/alter_table_lock.test index 1ed267e56d1..a1dc9ac831f 100644 --- a/mysql-test/main/alter_table_lock.test +++ b/mysql-test/main/alter_table_lock.test @@ -1,4 +1,3 @@ ---source include/not_msan.inc --source include/not_embedded.inc --source include/have_innodb.inc diff --git a/mysql-test/main/analyze.result b/mysql-test/main/analyze.result index 8819f15f27b..cf86bb31e7d 100644 --- a/mysql-test/main/analyze.result +++ b/mysql-test/main/analyze.result @@ -453,5 +453,56 @@ SELECT * FROM t1 WHERE f LIKE '2023%'; f DROP TABLE t1; # +# MDEV-36536 Add option to not collect statistics for long char/varchars +# +select @@session.analyze_max_length; +@@session.analyze_max_length +4294967295 +create table t1 (c0 char(2), c1 char(16), c2 char(64), v1 varchar(16), v2 varchar(1000), b1 blob, i1 int) +character set utf8mb4 COLLATE utf8mb4_bin; +insert into t1 values ("A", "A","A","A","A","A",1), ("B","B","B","B","B","B",1); +ANALYZE TABLE t1 PERSISTENT FOR ALL; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze Warning Engine-independent statistics are not collected for column 'b1' +test.t1 analyze status OK +select column_name from mysql.column_stats where table_name = 't1'; +column_name +c0 +c1 +c2 +i1 +v1 +v2 +set @@session.analyze_max_length= 64; +truncate table mysql.column_stats; +ANALYZE TABLE t1 PERSISTENT FOR ALL; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze Warning Engine-independent statistics are not collected for column 'c2' +test.t1 analyze Warning Engine-independent statistics are not collected for column 'v2' +test.t1 analyze Warning Engine-independent statistics are not collected for column 'b1' +test.t1 analyze status Table is already up to date +select column_name from mysql.column_stats where table_name = 't1'; +column_name +c0 +c1 +i1 +v1 +truncate table mysql.column_stats; +ANALYZE TABLE t1 PERSISTENT for COLUMNS (c0,c2,v1,v2,i1) INDEXES ALL; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status Table is already up to date +select column_name from mysql.column_stats where table_name = 't1'; +column_name +c0 +c2 +i1 +v1 +v2 +set @@session.analyze_max_length= default; +drop table t1; +# # End of 10.6 tests # diff --git a/mysql-test/main/analyze.test b/mysql-test/main/analyze.test index fb07e11b0c6..768b18dcb73 100644 --- a/mysql-test/main/analyze.test +++ b/mysql-test/main/analyze.test @@ -306,6 +306,26 @@ ANALYZE TABLE t1 PERSISTENT FOR ALL; SELECT * FROM t1 WHERE f LIKE '2023%'; DROP TABLE t1; +--echo # +--echo # MDEV-36536 Add option to not collect statistics for long char/varchars +--echo # + +select @@session.analyze_max_length; +create table t1 (c0 char(2), c1 char(16), c2 char(64), v1 varchar(16), v2 varchar(1000), b1 blob, i1 int) +character set utf8mb4 COLLATE utf8mb4_bin; +insert into t1 values ("A", "A","A","A","A","A",1), ("B","B","B","B","B","B",1); +ANALYZE TABLE t1 PERSISTENT FOR ALL; +select column_name from mysql.column_stats where table_name = 't1'; +set @@session.analyze_max_length= 64; +truncate table mysql.column_stats; +ANALYZE TABLE t1 PERSISTENT FOR ALL; +select column_name from mysql.column_stats where table_name = 't1'; +truncate table mysql.column_stats; +ANALYZE TABLE t1 PERSISTENT for COLUMNS (c0,c2,v1,v2,i1) INDEXES ALL; +select column_name from mysql.column_stats where table_name = 't1'; +set @@session.analyze_max_length= default; +drop table t1; + --echo # --echo # End of 10.6 tests --echo # diff --git a/mysql-test/main/backup_lock.result b/mysql-test/main/backup_lock.result index e6fc89d7e5c..6e2ccad5091 100644 --- a/mysql-test/main/backup_lock.result +++ b/mysql-test/main/backup_lock.result @@ -266,6 +266,7 @@ col1 SET AUTOCOMMIT = 0; UPDATE t_permanent_innodb SET col1 = 9; UPDATE t_permanent_aria SET col1 = 9; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction UPDATE t_permanent_myisam SET col1 = 9; ERROR HY000: Lock wait timeout exceeded; try restarting transaction UPDATE t_permanent_aria2 SET col1 = 9; diff --git a/mysql-test/main/backup_lock.test b/mysql-test/main/backup_lock.test index fbb5f30c1e8..eec6c2f01ce 100644 --- a/mysql-test/main/backup_lock.test +++ b/mysql-test/main/backup_lock.test @@ -328,6 +328,7 @@ select * from t_permanent_aria2; SET AUTOCOMMIT = 0; UPDATE t_permanent_innodb SET col1 = 9; +--error ER_LOCK_WAIT_TIMEOUT UPDATE t_permanent_aria SET col1 = 9; --error ER_LOCK_WAIT_TIMEOUT UPDATE t_permanent_myisam SET col1 = 9; diff --git a/mysql-test/main/check_constraint.result b/mysql-test/main/check_constraint.result index 66cf84d3377..6a334e79a7c 100644 --- a/mysql-test/main/check_constraint.result +++ b/mysql-test/main/check_constraint.result @@ -139,7 +139,7 @@ drop table t1; create or replace table t1( c1 int auto_increment primary key, check( c1 > 0 or c1 is null ) ); ERROR HY000: Function or expression 'AUTO_INCREMENT' cannot be used in the CHECK clause of `c1` create table t1 (a int check (@b in (select user from mysql.user))); -ERROR HY000: Function or expression 'select ...' cannot be used in the CHECK clause of `a` +ERROR 42000: CHECK does not support subqueries or stored functions create table t1 (a int check (a > @b)); ERROR HY000: Function or expression '@b' cannot be used in the CHECK clause of `a` create table t1 (a int check (a = 1)); diff --git a/mysql-test/main/check_constraint.test b/mysql-test/main/check_constraint.test index 73685981263..42d36dbb5f5 100644 --- a/mysql-test/main/check_constraint.test +++ b/mysql-test/main/check_constraint.test @@ -87,7 +87,7 @@ create or replace table t1( c1 int auto_increment primary key, check( c1 > 0 or # # MDEV-12421 Check constraint with query crashes server and renders DB unusable # ---error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +--error ER_SUBQUERIES_NOT_SUPPORTED create table t1 (a int check (@b in (select user from mysql.user))); --error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (a int check (a > @b)); diff --git a/mysql-test/main/cte_recursive.test b/mysql-test/main/cte_recursive.test index 45057f91c6b..221fb6cc421 100644 --- a/mysql-test/main/cte_recursive.test +++ b/mysql-test/main/cte_recursive.test @@ -1,6 +1,6 @@ --source include/default_optimizer_switch.inc # This is too slow on MSAN ---source include/not_msan.inc +--source include/no_msan_without_big.inc --source include/not_valgrind.inc --source include/have_innodb.inc diff --git a/mysql-test/main/derived.result b/mysql-test/main/derived.result index 47c0ce12e41..04f227091f5 100644 --- a/mysql-test/main/derived.result +++ b/mysql-test/main/derived.result @@ -1383,6 +1383,152 @@ drop table t1,t2,t3; # End of 10.3 tests # # +# MDEV-24588: Fix crash with unnamed column in derived table. +# Assertion `item->name.str && item->name.str[0]` in +# `TABLE_LIST::create_field_translation` fails when a SELECT +# query includes a derived table containing unnamed column +# (eg: `SELECT '' from t`). +# +# Tests from the bug report +CREATE TABLE t (pk INT PRIMARY KEY); +INSERT INTO t VALUES (1), (2), (3); +SELECT SHA(pk) IN (SELECT * FROM (SELECT '' FROM t) AS a) FROM t; +SHA(pk) IN (SELECT * FROM (SELECT '' FROM t) AS a) +0 +0 +0 +SET sql_mode=''; +PREPARE p FROM 'SELECT SHA(pk) IN (SELECT * FROM (SELECT \'\' FROM t) AS a) FROM t;'; +EXECUTE p; +SHA(pk) IN (SELECT * FROM (SELECT '' FROM t) AS a) +0 +0 +0 +EXECUTE p; +SHA(pk) IN (SELECT * FROM (SELECT '' FROM t) AS a) +0 +0 +0 +DEALLOCATE PREPARE p; +# Tests on derived tables +SELECT * FROM (SELECT 1, '' FROM t) AS a; +1 +1 +1 +1 +SELECT * FROM (SELECT '', 1 FROM t) AS a; + 1 + 1 + 1 + 1 +SELECT * FROM (SELECT 1, 2, '' FROM t) AS a; +1 2 +1 2 +1 2 +1 2 +SELECT * FROM (SELECT pk, '' FROM t) AS a; +pk +1 +2 +3 +SELECT '/', '/'; +/ / +/ / +SELECT * FROM (SELECT pk, '', '' as c1 FROM t) AS a; +pk c1 +1 +2 +3 +SELECT * FROM (SELECT '', '' from t) AS a; +ERROR 42S21: Duplicate column name '' +SELECT * FROM (SELECT '/', '/' FROM t) AS a; +ERROR 42S21: Duplicate column name '/' +SELECT * FROM (SELECT '/', '/') AS a; +ERROR 42S21: Duplicate column name '/' +DROP TABLE t; +# Tests on views +CREATE TABLE t (pk INT PRIMARY KEY); +INSERT INTO t VALUES (1), (2), (3); +CREATE VIEW v_t AS SELECT * FROM t; +SHOW CREATE VIEW v_t; +View Create View character_set_client collation_connection +v_t CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_t` AS select `t`.`pk` AS `pk` from `t` latin1 latin1_swedish_ci +SELECT SHA(pk) IN (SELECT * FROM (SELECT '' FROM v_t) AS a) FROM v_t; +SHA(pk) IN (SELECT * FROM (SELECT '' FROM v_t) AS a) +0 +0 +0 +SELECT * FROM (SELECT pk, '', '' as c1 FROM v_t) AS a; +pk c1 +1 +2 +3 +SELECT * FROM (SELECT '', '' from v_t) AS a; +ERROR 42S21: Duplicate column name '' +SELECT * FROM (SELECT '/', '/' from v_t) AS a; +ERROR 42S21: Duplicate column name '/' +CREATE VIEW v1 AS SELECT '/', '/'; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select '/' AS `/`,'/' AS `My_exp_/` latin1 latin1_swedish_ci +DROP VIEW v_t, v1; +DROP TABLE t; +# Tests on views created using SELECT statements that contain derived columns +CREATE TABLE t (pk INT PRIMARY KEY); +INSERT INTO t VALUES (1), (2), (3); +CREATE VIEW v1_t AS SELECT '' FROM t; +SHOW CREATE VIEW v1_t; +View Create View character_set_client collation_connection +v1_t CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1_t` AS select '' AS `Name_exp_1` from `t` latin1 latin1_swedish_ci +SELECT * FROM v1_t; +Name_exp_1 + + + +CREATE VIEW v2_t AS SELECT * FROM (SELECT '' FROM t) AS a; +SHOW CREATE VIEW v2_t; +View Create View character_set_client collation_connection +v2_t CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2_t` AS select `tmp_field` AS `Name_exp_1` from (select '' from `t`) `a` latin1 latin1_swedish_ci +Warnings: +Warning 1356 View 'test.v2_t' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them +SELECT * FROM v2_t; +ERROR HY000: View 'test.v2_t' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them +CREATE VIEW v3_t AS SELECT * FROM (SELECT '' as c1 FROM t) AS a; +SHOW CREATE VIEW v3_t; +View Create View character_set_client collation_connection +v3_t CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3_t` AS select `a`.`c1` AS `c1` from (select '' AS `c1` from `t`) `a` latin1 latin1_swedish_ci +SELECT * FROM v3_t; +c1 + + + +CREATE VIEW v4_t AS SELECT * FROM (SELECT 1, '' FROM t) AS a; +SHOW CREATE VIEW v4_t; +View Create View character_set_client collation_connection +v4_t CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v4_t` AS select `a`.`1` AS `1`,`tmp_field` AS `Name_exp_2` from (select 1 AS `1`,'' from `t`) `a` latin1 latin1_swedish_ci +Warnings: +Warning 1356 View 'test.v4_t' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them +SELECT * from v4_t; +ERROR HY000: View 'test.v4_t' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them +CREATE VIEW v5_t AS SELECT ''; +SHOW CREATE VIEW v5_t; +View Create View character_set_client collation_connection +v5_t CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v5_t` AS select '' AS `Name_exp_1` latin1 latin1_swedish_ci +SELECT * FROM v5_t; +Name_exp_1 + +CREATE VIEW v6_t AS SELECT * FROM (SELECT '') AS a; +SHOW CREATE VIEW v6_t; +View Create View character_set_client collation_connection +v6_t CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v6_t` AS select `tmp_field` AS `Name_exp_1` from (select '') `a` latin1 latin1_swedish_ci +Warnings: +Warning 1356 View 'test.v6_t' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them +SELECT * FROM v6_t; +ERROR HY000: View 'test.v6_t' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them +DROP VIEW v1_t, v2_t, v3_t, v4_t, v5_t, v6_t; +DROP TABLE t; +# End of 10.11 tests +# # Test of "Derived tables and union can now create distinct keys" # create table t1 (a int); diff --git a/mysql-test/main/derived.test b/mysql-test/main/derived.test index 39e7236b5bb..27239fb02f4 100644 --- a/mysql-test/main/derived.test +++ b/mysql-test/main/derived.test @@ -1192,6 +1192,114 @@ drop table t1,t2,t3; --echo # End of 10.3 tests --echo # +--echo # +--echo # MDEV-24588: Fix crash with unnamed column in derived table. +--echo # Assertion `item->name.str && item->name.str[0]` in +--echo # `TABLE_LIST::create_field_translation` fails when a SELECT +--echo # query includes a derived table containing unnamed column +--echo # (eg: `SELECT '' from t`). +--echo # + +--echo # Tests from the bug report + +CREATE TABLE t (pk INT PRIMARY KEY); +INSERT INTO t VALUES (1), (2), (3); + +# this should pass withiout assertion fail in dbg or should not crash mariadb server +SELECT SHA(pk) IN (SELECT * FROM (SELECT '' FROM t) AS a) FROM t; + +# The PREPARE command itself should succeed without crashing +SET sql_mode=''; +PREPARE p FROM 'SELECT SHA(pk) IN (SELECT * FROM (SELECT \'\' FROM t) AS a) FROM t;'; + +EXECUTE p; +EXECUTE p; + +DEALLOCATE PREPARE p; + +--echo # Tests on derived tables + +SELECT * FROM (SELECT 1, '' FROM t) AS a; +SELECT * FROM (SELECT '', 1 FROM t) AS a; +SELECT * FROM (SELECT 1, 2, '' FROM t) AS a; +SELECT * FROM (SELECT pk, '' FROM t) AS a; +SELECT '/', '/'; + +SELECT * FROM (SELECT pk, '', '' as c1 FROM t) AS a; +--error ER_DUP_FIELDNAME +SELECT * FROM (SELECT '', '' from t) AS a; +--error ER_DUP_FIELDNAME +SELECT * FROM (SELECT '/', '/' FROM t) AS a; +--error ER_DUP_FIELDNAME +SELECT * FROM (SELECT '/', '/') AS a; + +DROP TABLE t; + +--echo # Tests on views + +CREATE TABLE t (pk INT PRIMARY KEY); +INSERT INTO t VALUES (1), (2), (3); + +CREATE VIEW v_t AS SELECT * FROM t; +SHOW CREATE VIEW v_t; + +SELECT SHA(pk) IN (SELECT * FROM (SELECT '' FROM v_t) AS a) FROM v_t; + +SELECT * FROM (SELECT pk, '', '' as c1 FROM v_t) AS a; +--error ER_DUP_FIELDNAME +SELECT * FROM (SELECT '', '' from v_t) AS a; +--error ER_DUP_FIELDNAME +SELECT * FROM (SELECT '/', '/' from v_t) AS a; + +CREATE VIEW v1 AS SELECT '/', '/'; +SHOW CREATE VIEW v1; + +DROP VIEW v_t, v1; +DROP TABLE t; + +--echo # Tests on views created using SELECT statements that contain derived columns + +CREATE TABLE t (pk INT PRIMARY KEY); +INSERT INTO t VALUES (1), (2), (3); + +CREATE VIEW v1_t AS SELECT '' FROM t; +SHOW CREATE VIEW v1_t; + +SELECT * FROM v1_t; + +CREATE VIEW v2_t AS SELECT * FROM (SELECT '' FROM t) AS a; +SHOW CREATE VIEW v2_t; + +--error ER_VIEW_INVALID +SELECT * FROM v2_t; + +CREATE VIEW v3_t AS SELECT * FROM (SELECT '' as c1 FROM t) AS a; +SHOW CREATE VIEW v3_t; + +SELECT * FROM v3_t; + +CREATE VIEW v4_t AS SELECT * FROM (SELECT 1, '' FROM t) AS a; +SHOW CREATE VIEW v4_t; + +--error ER_VIEW_INVALID +SELECT * from v4_t; + +CREATE VIEW v5_t AS SELECT ''; +SHOW CREATE VIEW v5_t; + +SELECT * FROM v5_t; + +CREATE VIEW v6_t AS SELECT * FROM (SELECT '') AS a; +SHOW CREATE VIEW v6_t; + +--error ER_VIEW_INVALID +SELECT * FROM v6_t; + +DROP VIEW v1_t, v2_t, v3_t, v4_t, v5_t, v6_t; +DROP TABLE t; + +--echo # End of 10.11 tests + --echo # --echo # Test of "Derived tables and union can now create distinct keys" --echo # diff --git a/mysql-test/main/intersect_all.result b/mysql-test/main/intersect_all.result index ad4ade45862..0ea3aac6f1a 100644 --- a/mysql-test/main/intersect_all.result +++ b/mysql-test/main/intersect_all.result @@ -1063,3 +1063,113 @@ NULL INTERSECT RESULT ALL NULL NULL NULL NULL NULL NULL Warnings: Note 1003 /* select#1 */ select `test`.`t1`.`a` AS `a` from `test`.`t1` where `test`.`t1`.`a` > 4 union all /* select#4 */ select `__4`.`a` AS `a` from (/* select#2 */ select `test`.`t2`.`a` AS `a` from `test`.`t2` where `test`.`t2`.`a` < 5 intersect all /* select#3 */ select `test`.`t3`.`a` AS `a` from `test`.`t3` where `test`.`t3`.`a` < 5) `__4` drop table t1,t2,t3; +# +# MDEV-25158 Segfault on INTERSECT ALL with UNION in Oracle mode +# +create table t3 (x int); +create table u3 (x int); +create table i3 (x int); +explain SELECT * from t3 union select * from u3 intersect all select * from i3; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t3 system NULL NULL NULL NULL 0 Const row not found +4 UNION ALL NULL NULL NULL NULL 2 +2 DERIVED NULL NULL NULL NULL NULL NULL NULL no matching row in const table +3 INTERSECT NULL NULL NULL NULL NULL NULL NULL no matching row in const table +NULL INTERSECT RESULT ALL NULL NULL NULL NULL NULL +NULL UNION RESULT ALL NULL NULL NULL NULL NULL +set sql_mode= 'oracle'; +explain SELECT * from t3 union select * from u3 intersect all select * from i3; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t3 system NULL NULL NULL NULL 0 Const row not found +2 UNION u3 system NULL NULL NULL NULL 0 Const row not found +3 INTERSECT i3 system NULL NULL NULL NULL 0 Const row not found +NULL UNIT RESULT ALL NULL NULL NULL NULL NULL +select * from t3 union select * from u3 intersect select * from i3; +x +SELECT * from t3 union select * from u3 intersect all select * from i3; +x +insert into t3 values (0); +insert into i3 values (0); +Select * from t3 union select * from u3 intersect select * from i3; +x +0 +SELECT * FROM t3 UNION SELECT * FROM u3 INTERSECT ALL SELECT * FROM i3; +x +0 +drop tables t3, u3, i3; +# First line of these results is column names, not the result +# (pay attention to "affected rows") +values (1, 2) union all values (1, 2); +1 2 +1 2 +1 2 +affected rows: 2 +values (1, 2) union all values (1, 2) union values (4, 3) union all values (4, 3); +1 2 +1 2 +4 3 +4 3 +affected rows: 3 +values (1, 2) union all values (1, 2) union values (4, 3) union all values (4, 3) union all values (1, 2); +1 2 +1 2 +4 3 +4 3 +1 2 +affected rows: 4 +values (1, 2) union all values (1, 2) union values (4, 3) union all values (4, 3) union all values (1, 2) union values (1, 2); +1 2 +1 2 +4 3 +affected rows: 2 +create table t1 (a int, b int); +create table t2 like t1; +insert t1 values (1, 2), (1, 2), (1, 2), (2, 3), (2, 3), (3, 4), (3, 4); +insert t2 values (1, 2), (1, 2), (2, 3), (2, 3), (2, 3), (2, 3), (4, 5); +select * from t1 intersect select * from t2; +a b +1 2 +2 3 +select * from t1 intersect all select * from t2; +a b +1 2 +2 3 +1 2 +2 3 +# Default: first INTERSECT ALL, then UNION +# Oracle: first UNION, then INTERSECT ALL +select * from t1 union values (1, 2) intersect all select * from t2; +a b +1 2 +2 3 +select * from t1 union (values (1, 2) intersect all select * from t2); +a b +1 2 +2 3 +3 4 +(select * from t1 union values (1, 2)) intersect all select * from t2; +a b +1 2 +2 3 +select * from t1 intersect all select * from t2 union values (1, 2); +a b +1 2 +2 3 +1 2 +2 3 +select * from t1 intersect all (select * from t2 union values (1, 2)); +a b +1 2 +2 3 +(select * from t1 intersect all select * from t2) union values (1, 2); +a b +1 2 +2 3 +explain select * from t1 intersect all select * from t2 union values (1, 2); +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 7 +2 INTERSECT t2 ALL NULL NULL NULL NULL 7 +3 UNION NULL NULL NULL NULL NULL NULL NULL No tables used +NULL UNIT RESULT ALL NULL NULL NULL NULL NULL +drop tables t1, t2; +set sql_mode= default; diff --git a/mysql-test/main/intersect_all.test b/mysql-test/main/intersect_all.test index 769b25393dd..b318914fe8c 100644 --- a/mysql-test/main/intersect_all.test +++ b/mysql-test/main/intersect_all.test @@ -328,3 +328,69 @@ intersect all select * from t3 where a < 5; drop table t1,t2,t3; + +--echo # +--echo # MDEV-25158 Segfault on INTERSECT ALL with UNION in Oracle mode +--echo # +create table t3 (x int); +create table u3 (x int); +create table i3 (x int); +explain SELECT * from t3 union select * from u3 intersect all select * from i3; +set sql_mode= 'oracle'; +explain SELECT * from t3 union select * from u3 intersect all select * from i3; +select * from t3 union select * from u3 intersect select * from i3; +SELECT * from t3 union select * from u3 intersect all select * from i3; +insert into t3 values (0); +insert into i3 values (0); +Select * from t3 union select * from u3 intersect select * from i3; +SELECT * FROM t3 UNION SELECT * FROM u3 INTERSECT ALL SELECT * FROM i3; +drop tables t3, u3, i3; + +--enable_info +--echo # First line of these results is column names, not the result +--echo # (pay attention to "affected rows") + +# MSSQL: +# 1 2 +# 1 2 +values (1, 2) union all values (1, 2); + +# MSSQL: +# 1 2 +# 4 3 +# 4 3 +values (1, 2) union all values (1, 2) union values (4, 3) union all values (4, 3); + +# MSSQL: +# 1 2 +# 4 3 +# 4 3 +# 1 2 +values (1, 2) union all values (1, 2) union values (4, 3) union all values (4, 3) union all values (1, 2); + +# MSSQL: +# 1 2 +# 4 3 +values (1, 2) union all values (1, 2) union values (4, 3) union all values (4, 3) union all values (1, 2) union values (1, 2); +--disable_info + +create table t1 (a int, b int); +create table t2 like t1; +insert t1 values (1, 2), (1, 2), (1, 2), (2, 3), (2, 3), (3, 4), (3, 4); +insert t2 values (1, 2), (1, 2), (2, 3), (2, 3), (2, 3), (2, 3), (4, 5); +select * from t1 intersect select * from t2; +select * from t1 intersect all select * from t2; +--echo # Default: first INTERSECT ALL, then UNION +--echo # Oracle: first UNION, then INTERSECT ALL +# VIEW is stored and executed normal mode (see Sql_mode_save_for_frm_handling) +--disable_view_protocol +select * from t1 union values (1, 2) intersect all select * from t2; +--enable_view_protocol +select * from t1 union (values (1, 2) intersect all select * from t2); +(select * from t1 union values (1, 2)) intersect all select * from t2; +select * from t1 intersect all select * from t2 union values (1, 2); +select * from t1 intersect all (select * from t2 union values (1, 2)); +(select * from t1 intersect all select * from t2) union values (1, 2); +explain select * from t1 intersect all select * from t2 union values (1, 2); +drop tables t1, t2; +set sql_mode= default; diff --git a/mysql-test/main/join_cache_notasan.cnf b/mysql-test/main/join_cache_notasan.cnf new file mode 100644 index 00000000000..7b2fb3bcb15 --- /dev/null +++ b/mysql-test/main/join_cache_notasan.cnf @@ -0,0 +1,5 @@ +!include include/default_my.cnf + +[ENV] +MSAN_OPTIONS=allocator_may_return_null=1:abort_on_error=1 + diff --git a/mysql-test/main/join_cache_notasan.result b/mysql-test/main/join_cache_notasan.result index 3cec949f5c6..885eece83d6 100644 --- a/mysql-test/main/join_cache_notasan.result +++ b/mysql-test/main/join_cache_notasan.result @@ -1,3 +1,4 @@ +call mtr.add_suppression("MemorySanitizer failed to allocate"); # # MDEV-28217 Incorrect Join Execution When Controlling Join Buffer Size # diff --git a/mysql-test/main/join_cache_notasan.test b/mysql-test/main/join_cache_notasan.test index c2ff670f044..5271d3fae9c 100644 --- a/mysql-test/main/join_cache_notasan.test +++ b/mysql-test/main/join_cache_notasan.test @@ -4,11 +4,13 @@ --source include/have_64bit.inc # Disable asan it asan builds crashes when trying to allocate too much memory --source include/not_asan.inc ---source include/not_msan.inc # Valgrind is useful here, but very slow as lots of memory is allocated --source include/no_valgrind_without_big.inc --source include/have_innodb.inc +# MSAN runs, but ignore its notice. ER_OUTOFMEMORY is expected by tests +call mtr.add_suppression("MemorySanitizer failed to allocate"); + --echo # --echo # MDEV-28217 Incorrect Join Execution When Controlling Join Buffer Size --echo # diff --git a/mysql-test/main/long_unique_bugs.result b/mysql-test/main/long_unique_bugs.result index a5b0f67c0aa..6bf3a7dcc44 100644 --- a/mysql-test/main/long_unique_bugs.result +++ b/mysql-test/main/long_unique_bugs.result @@ -770,4 +770,42 @@ alter table t1 add constraint constraint_1 unique (a); Warnings: Note 1831 Duplicate index `constraint_1`. This is deprecated and will be disallowed in a future release drop table t1; +# +# MDEV-33675 assertion(reclength < vreclength) in setup_vcols_for_repair() +# +create table t (c1 bit, unique key(c1) using hash) engine=myisam; +insert into t values (0); +check table t; +Table Op Msg_type Msg_text +test.t check status OK +insert into t values(); +select cast(c1 as unsigned) c1 from t; +c1 +0 +NULL +drop table t; +create table t1 (c1 bit, c2 long as (c1) virtual, c3 char(10), +c4 long as (c1) stored) engine=myisam; +insert into t1 (c1, c3) values (1, "a"); +check table t1; +Table Op Msg_type Msg_text +test.t1 check status OK +insert into t1 values(); +select hex(c1), hex(c2), c3, hex(c4) from t1; +hex(c1) hex(c2) c3 hex(c4) +1 01 a 01 +NULL NULL NULL NULL +drop table t1; +create table t1 (c1 bit, c2 long as (c1) virtual, c3 char(10), +c4 long as (c1) stored) engine=aria; +insert into t1 (c1, c3) values (1, "a"); +check table t1; +Table Op Msg_type Msg_text +test.t1 check status OK +insert into t1 values(); +select hex(c1), hex(c2), c3, hex(c4) from t1; +hex(c1) hex(c2) c3 hex(c4) +1 01 a 01 +NULL NULL NULL NULL +drop table t1; # End of 10.5 tests diff --git a/mysql-test/main/long_unique_bugs.test b/mysql-test/main/long_unique_bugs.test index e2fec78b151..e1fa39e922b 100644 --- a/mysql-test/main/long_unique_bugs.test +++ b/mysql-test/main/long_unique_bugs.test @@ -745,4 +745,30 @@ create table t1 (a blob unique); alter table t1 add constraint constraint_1 unique (a); drop table t1; +--echo # +--echo # MDEV-33675 assertion(reclength < vreclength) in setup_vcols_for_repair() +--echo # +create table t (c1 bit, unique key(c1) using hash) engine=myisam; +insert into t values (0); +check table t; +insert into t values(); +select cast(c1 as unsigned) c1 from t; +drop table t; + +create table t1 (c1 bit, c2 long as (c1) virtual, c3 char(10), + c4 long as (c1) stored) engine=myisam; +insert into t1 (c1, c3) values (1, "a"); +check table t1; +insert into t1 values(); +select hex(c1), hex(c2), c3, hex(c4) from t1; +drop table t1; + +create table t1 (c1 bit, c2 long as (c1) virtual, c3 char(10), + c4 long as (c1) stored) engine=aria; +insert into t1 (c1, c3) values (1, "a"); +check table t1; +insert into t1 values(); +select hex(c1), hex(c2), c3, hex(c4) from t1; +drop table t1; + --echo # End of 10.5 tests diff --git a/mysql-test/main/mysqld--help.result b/mysql-test/main/mysqld--help.result index adc10ecd44e..e96e89ca8fe 100644 --- a/mysql-test/main/mysqld--help.result +++ b/mysql-test/main/mysqld--help.result @@ -16,6 +16,10 @@ The following specify which files/extra groups are read (specified before remain --alter-algorithm[=name] Specify the alter table algorithm. One of: DEFAULT, COPY, INPLACE, NOCOPY, INSTANT + --analyze-max-length=# + Fields which length in bytes more than this are skipped + by ANALYZE TABLE PERSISTENT unless explicitly listed in + the FOR COLUMNS () clause --analyze-sample-percentage=# Percentage of rows from the table ANALYZE TABLE will sample to collect table statistics. Set to 0 to let @@ -2009,7 +2013,6 @@ thread-pool-oversubscribe 3 thread-pool-prio-kickup-timer 1000 thread-pool-priority auto thread-pool-stall-limit 500 -thread-stack 299008 tmp-disk-table-size 18446744073709551615 tmp-memory-table-size 16777216 tmp-table-size 16777216 diff --git a/mysql-test/main/mysqld--help.test b/mysql-test/main/mysqld--help.test index 05739197331..04cf1a69e3f 100644 --- a/mysql-test/main/mysqld--help.test +++ b/mysql-test/main/mysqld--help.test @@ -20,7 +20,7 @@ exec $MYSQLD_BOOTSTRAP_CMD --symbolic-links=0 --log-bin=foo --lower-case-table-n perl; # Variables which we don't want to display in the result file since - # their paths may vary: + # their paths may vary or they may use a default of 4294967295 : @skipvars=qw/basedir open-files-limit general-log-file log plugin-dir plugin-maturity log-slow-queries pid-file slow-query-log-file log-basename log-slow-query-file @@ -30,7 +30,7 @@ perl; table-open-cache table-open-cache-instances max-connections server-uid tls-version version.* password-reuse-check provider-bzip2 provider-lzma provider-lzo - password-reuse-check-interval/; + password-reuse-check-interval analyze-max-length thread-stack/; # Plugins which may or may not be there: @plugins=qw/innodb archive blackhole federated partition s3 diff --git a/mysql-test/main/opt_trace.result b/mysql-test/main/opt_trace.result index 5efe9010c22..fa910951373 100644 --- a/mysql-test/main/opt_trace.result +++ b/mysql-test/main/opt_trace.result @@ -192,12 +192,6 @@ select * from v1 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -363,12 +357,6 @@ select * from (select * from t1 where t1.a=1)q { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -651,19 +639,6 @@ select * from v2 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [ - { - "join_execution": { - "select_id": 2, - "steps": [] - } - } - ] - } } ] } 0 0 @@ -808,12 +783,6 @@ explain select * from v2 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -1057,19 +1026,6 @@ explain select * from v1 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [ - { - "join_execution": { - "select_id": 2, - "steps": [] - } - } - ] - } } ] } 0 0 @@ -1395,12 +1351,6 @@ explain select * from t1,t2 where t1.a=t2.b+2 and t2.a= t1.b { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -1580,12 +1530,6 @@ EXPLAIN SELECT DISTINCT a FROM t1 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -1836,12 +1780,6 @@ set statement optimizer_scan_setup_cost=0 for EXPLAIN SELECT MIN(d) FROM t1 wher } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -2068,12 +2006,6 @@ EXPLAIN SELECT id,MIN(a),MAX(a) FROM t1 WHERE a>=20010104e0 GROUP BY id { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -2277,12 +2209,6 @@ EXPLAIN SELECT * FROM t1 WHERE a = 20010104e0 GROUP BY id { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -2677,12 +2603,6 @@ explain select * from t1 where a=1 and b=2 order by c limit 1 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -2862,12 +2782,6 @@ select t1.a from t1 left join t2 on t1.a=t2.a { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -3078,12 +2992,6 @@ explain select * from t1 left join t2 on t2.a=t1.a { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -3270,12 +3178,6 @@ explain select t1.a from t1 left join (t2 join t3 on t2.b=t3.b) on t2.a=t1.a and } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -3653,12 +3555,6 @@ explain extended select * from t1 where a in (select p from t2) { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -4029,12 +3925,6 @@ explain select * from t1 where pk = 2 and a=5 and b=1 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -4170,12 +4060,6 @@ select f1(a) from t1 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -4287,12 +4171,6 @@ select f2(a) from t1 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -4313,7 +4191,7 @@ a 2 select length(trace) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; length(trace) -2819 +2728 set optimizer_trace_max_mem_size=100; select * from t1; a @@ -4327,7 +4205,7 @@ select * from t1 { "join_preparation": { "select_id": 1, "steps": [ - 2719 0 + 2628 0 set optimizer_trace_max_mem_size=0; select * from t1; a @@ -4335,7 +4213,7 @@ a 2 select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE; QUERY TRACE MISSING_BYTES_BEYOND_MAX_MEM_SIZE INSUFFICIENT_PRIVILEGES -select * from t1 2819 0 +select * from t1 2728 0 drop table t1; set optimizer_trace='enabled=off'; set @@optimizer_trace_max_mem_size= @save_optimizer_trace_max_mem_size; @@ -4857,12 +4735,6 @@ explain delete t0,t1 from t0, t1 where t0.a=t1.a and t1.a<3 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -5086,19 +4958,6 @@ explain select * from (select rand() from t1)q { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [ - { - "join_execution": { - "select_id": 2, - "steps": [] - } - } - ] - } } ] } 0 0 @@ -5684,12 +5543,6 @@ explain select * from t1 where a in (select t_inner_1.a from t1 t_inner_1, t1 t_ } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -8091,12 +7944,6 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -10521,12 +10368,6 @@ t_outer_2.a in (select t_inner_3.a from t2 t_inner_3, t1 t_inner_4) { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -11750,12 +11591,6 @@ SELECT 'a\0' LIMIT 0 { "select_id": 1, "steps": [] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } @@ -12141,115 +11976,90 @@ UPDATE t, v SET t.b = t.a, t.a = v.c WHERE v.c < t.a { } }, { - "join_execution": { - "select_id": 1, + "join_optimization": { + "select_id": "fake", "steps": [ { - "join_execution": { - "select_id": 2, - "steps": [] - } + "table_dependencies": [ + { + "table": "union", + "row_may_be_null": false, + "map_bit": 0, + "depends_on_map_bits": [] + } + ] }, { - "join_execution": { - "select_id": 3, - "steps": [] - } - }, - { - "join_optimization": { - "select_id": "fake", - "steps": [ - { - "table_dependencies": [ - { - "table": "union", - "row_may_be_null": false, - "map_bit": 0, - "depends_on_map_bits": [] - } - ] - }, - { - "rows_estimation": [ - { - "table": "union", - "table_scan": { - "rows": 2, - "read_cost": 0.010020701, - "read_and_compare_cost": 0.010084701 - } - } - ] - }, - { - "considered_execution_plans": [ - { - "plan_prefix": "", - "get_costs_for_tables": [ - { - "best_access_path": { - "table": "union", - "plan_details": { - "record_count": 1 - }, - "considered_access_paths": [ - { - "access_type": "scan", - "rows": 2, - "rows_after_filter": 2, - "rows_out": 2, - "cost": 0.010084701, - "index_only": false, - "chosen": true - } - ], - "chosen_access_method": { - "type": "scan", - "rows_read": 2, - "rows_out": 2, - "cost": 0.010084701, - "uses_join_buffering": false - } - } - } - ] - }, - { - "plan_prefix": "", - "table": "union", - "rows_for_plan": 2, - "cost_for_plan": 0.010084701 - } - ] - }, - { - "best_join_order": ["union"], + "rows_estimation": [ + { + "table": "union", + "table_scan": { "rows": 2, - "cost": 0.010084701 - }, - { - "attaching_conditions_to_tables": { - "attached_conditions_computation": [], - "attached_conditions_summary": [ - { - "table": "union", - "attached_condition": null + "read_cost": 0.010020701, + "read_and_compare_cost": 0.010084701 + } + } + ] + }, + { + "considered_execution_plans": [ + { + "plan_prefix": "", + "get_costs_for_tables": [ + { + "best_access_path": { + "table": "union", + "plan_details": { + "record_count": 1 + }, + "considered_access_paths": [ + { + "access_type": "scan", + "rows": 2, + "rows_after_filter": 2, + "rows_out": 2, + "cost": 0.010084701, + "index_only": false, + "chosen": true + } + ], + "chosen_access_method": { + "type": "scan", + "rows_read": 2, + "rows_out": 2, + "cost": 0.010084701, + "uses_join_buffering": false } - ] + } } - }, + ] + }, + { + "plan_prefix": "", + "table": "union", + "rows_for_plan": 2, + "cost_for_plan": 0.010084701 + } + ] + }, + { + "best_join_order": ["union"], + "rows": 2, + "cost": 0.010084701 + }, + { + "attaching_conditions_to_tables": { + "attached_conditions_computation": [], + "attached_conditions_summary": [ { - "make_join_readinfo": [] + "table": "union", + "attached_condition": null } ] } }, { - "join_execution": { - "select_id": "fake", - "steps": [] - } + "make_join_readinfo": [] } ] } @@ -12504,12 +12314,6 @@ select count(*) from seq_1_to_10000000 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -13000,6 +12804,136 @@ left(trace, 100) set optimizer_trace='enabled=off'; # End of 10.6 tests # +# MDEV-36461: Remove join_execution nodes and add range_check_for_each_record when appropriate +# +create table t1 (a int, b int); +insert into t1 values (1, 999),(999, 1),(987,987); +create table t2 (a int, b int, index(a),index(b)); +insert into t2 select seq, seq from seq_1_to_1000; +create table t3 (a int); +insert into t3 select seq from seq_1_to_2; +set optimizer_trace='enabled=on'; +analyze +select +( +select count(*) +from t1, t2 +where t2.at3.a +) as SUBQ, a +from t3; +id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra +1 PRIMARY t3 ALL NULL NULL NULL NULL 2 2.00 100.00 100.00 +2 DEPENDENT SUBQUERY t1 ALL NULL NULL NULL NULL 3 3.00 100.00 100.00 +2 DEPENDENT SUBQUERY t2 ALL a,b NULL NULL NULL 1000 333.33 100.00 98.60 Range checked for each record (index map: 0x3) +# The trace must contain 6 objects with select_id 2 and +# loop varying from 1..2 for each of the 3 ranges from t1: +set @trace=(select trace from information_schema.optimizer_trace); +set @trace=(select json_extract(@trace, '$**.range-checked-for-each-record')); +set @trace=json_replace(@trace, '$[0].rows_estimation[0].range_analysis','REPLACED'); +set @trace=json_replace(@trace, '$[1].rows_estimation[0].range_analysis','REPLACED'); +set @trace=json_replace(@trace, '$[2].rows_estimation[0].range_analysis','REPLACED'); +set @trace=json_replace(@trace, '$[3].rows_estimation[0].range_analysis','REPLACED'); +set @trace=json_replace(@trace, '$[4].rows_estimation[0].range_analysis','REPLACED'); +set @trace=json_replace(@trace, '$[5].rows_estimation[0].range_analysis','REPLACED'); +select json_detailed(@trace) as TRACE; +TRACE +[ + { + "select_id": 2, + "loop": 1, + "rows_estimation": + [ + { + "table": "t2", + "range_analysis": "REPLACED" + } + ] + }, + { + "select_id": 2, + "loop": 1, + "rows_estimation": + [ + { + "table": "t2", + "range_analysis": "REPLACED" + } + ] + }, + { + "select_id": 2, + "loop": 1, + "rows_estimation": + [ + { + "table": "t2", + "range_analysis": "REPLACED" + } + ] + }, + { + "select_id": 2, + "loop": 2, + "rows_estimation": + [ + { + "table": "t2", + "range_analysis": "REPLACED" + } + ] + }, + { + "select_id": 2, + "loop": 2, + "rows_estimation": + [ + { + "table": "t2", + "range_analysis": "REPLACED" + } + ] + }, + { + "select_id": 2, + "loop": 2, + "rows_estimation": + [ + { + "table": "t2", + "range_analysis": "REPLACED" + } + ] + } +] +# The trace must be empty: +select json_detailed(json_extract(trace, '$**.join_execution')) +from information_schema.optimizer_trace; +json_detailed(json_extract(trace, '$**.join_execution')) +NULL +select +( +select count(*) +from t1, t2 +where t2.a+1t3.a +) as SUBQ, a +from t3; +SUBQ a +985 1 +985 2 +# The trace must be empty: +select json_detailed(json_extract(trace, '$**.range-checked-for-each-record')) +from information_schema.optimizer_trace; +json_detailed(json_extract(trace, '$**.range-checked-for-each-record')) +NULL +# The trace must be empty: +select json_detailed(json_extract(trace, '$**.join_execution')) +from information_schema.optimizer_trace; +json_detailed(json_extract(trace, '$**.join_execution')) +NULL +set optimizer_trace='enabled=off'; +drop table t1,t2,t3; +# End of 10.11 tests +# # Testing of records_out # set @save_optimizer_switch= @@optimizer_switch; @@ -13311,12 +13245,6 @@ explain select * from t1 where a<10 and b between 10 and 50 and c < 10 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -13783,12 +13711,6 @@ explain format=json select * from three, t1 where t1.a=three.a and t1.b<5000 and } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 diff --git a/mysql-test/main/opt_trace.test b/mysql-test/main/opt_trace.test index 61da3c958c8..fc07cde9b47 100644 --- a/mysql-test/main/opt_trace.test +++ b/mysql-test/main/opt_trace.test @@ -1167,6 +1167,62 @@ set optimizer_trace='enabled=off'; --echo # End of 10.6 tests +--echo # +--echo # MDEV-36461: Remove join_execution nodes and add range_check_for_each_record when appropriate +--echo # + +create table t1 (a int, b int); +insert into t1 values (1, 999),(999, 1),(987,987); +create table t2 (a int, b int, index(a),index(b)); +insert into t2 select seq, seq from seq_1_to_1000; +create table t3 (a int); +insert into t3 select seq from seq_1_to_2; + +set optimizer_trace='enabled=on'; + +analyze +select +( + select count(*) + from t1, t2 + where t2.at3.a +) as SUBQ, a +from t3; + +--echo # The trace must contain 6 objects with select_id 2 and +--echo # loop varying from 1..2 for each of the 3 ranges from t1: +set @trace=(select trace from information_schema.optimizer_trace); +set @trace=(select json_extract(@trace, '$**.range-checked-for-each-record')); +set @trace=json_replace(@trace, '$[0].rows_estimation[0].range_analysis','REPLACED'); +set @trace=json_replace(@trace, '$[1].rows_estimation[0].range_analysis','REPLACED'); +set @trace=json_replace(@trace, '$[2].rows_estimation[0].range_analysis','REPLACED'); +set @trace=json_replace(@trace, '$[3].rows_estimation[0].range_analysis','REPLACED'); +set @trace=json_replace(@trace, '$[4].rows_estimation[0].range_analysis','REPLACED'); +set @trace=json_replace(@trace, '$[5].rows_estimation[0].range_analysis','REPLACED'); +select json_detailed(@trace) as TRACE; + +--echo # The trace must be empty: +select json_detailed(json_extract(trace, '$**.join_execution')) + from information_schema.optimizer_trace; + +select +( + select count(*) + from t1, t2 + where t2.a+1t3.a +) as SUBQ, a +from t3; + +--echo # The trace must be empty: +select json_detailed(json_extract(trace, '$**.range-checked-for-each-record')) + from information_schema.optimizer_trace; +--echo # The trace must be empty: +select json_detailed(json_extract(trace, '$**.join_execution')) + from information_schema.optimizer_trace; +set optimizer_trace='enabled=off'; + +drop table t1,t2,t3; +--echo # End of 10.11 tests --echo # --echo # Testing of records_out @@ -1271,4 +1327,3 @@ set @@optimizer_switch= @save_optimizer_switch; set @@use_stat_tables= @save_use_stat_tables; set @@histogram_size= @save_histogram_size; set @@optimizer_use_condition_selectivity= @save_optimizer_use_condition_selectivity; - diff --git a/mysql-test/main/opt_trace_index_merge.result b/mysql-test/main/opt_trace_index_merge.result index c07240cc936..a9443ff2f1b 100644 --- a/mysql-test/main/opt_trace_index_merge.result +++ b/mysql-test/main/opt_trace_index_merge.result @@ -272,12 +272,6 @@ explain select * from t1 where a=1 or b=1 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 diff --git a/mysql-test/main/opt_trace_index_merge_innodb.result b/mysql-test/main/opt_trace_index_merge_innodb.result index 79d62df3846..56d6f1af8b1 100644 --- a/mysql-test/main/opt_trace_index_merge_innodb.result +++ b/mysql-test/main/opt_trace_index_merge_innodb.result @@ -277,12 +277,6 @@ explain select * from t1 where pk1 != 0 and key1 = 1 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 diff --git a/mysql-test/main/opt_trace_security.result b/mysql-test/main/opt_trace_security.result index cf5dcf5d886..b64135094a8 100644 --- a/mysql-test/main/opt_trace_security.result +++ b/mysql-test/main/opt_trace_security.result @@ -148,12 +148,6 @@ select * from db1.t1 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 @@ -290,12 +284,6 @@ select * from db1.v1 { } ] } - }, - { - "join_execution": { - "select_id": 1, - "steps": [] - } } ] } 0 0 diff --git a/mysql-test/main/sum_distinct-big.test b/mysql-test/main/sum_distinct-big.test index 8820c191ae9..54fc676740f 100644 --- a/mysql-test/main/sum_distinct-big.test +++ b/mysql-test/main/sum_distinct-big.test @@ -5,7 +5,7 @@ --source include/big_test.inc # Test will take more than one hour with valgrind --source include/not_valgrind.inc ---source include/not_msan.inc +--source include/not_msan_with_debug.inc --source include/have_innodb.inc --source include/have_sequence.inc diff --git a/mysql-test/std_data/galera-cert.pem b/mysql-test/std_data/galera-cert.pem index 2996b330cc0..dba44e01585 100644 --- a/mysql-test/std_data/galera-cert.pem +++ b/mysql-test/std_data/galera-cert.pem @@ -1,26 +1,87 @@ +Certificate: + Data: + Version: 1 (0x0) + Serial Number: 4096 (0x1000) + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=FI, ST=Helsinki, L=Helsinki, O=MariaDB, CN=Galera CA + Validity + Not Before: May 20 01:31:39 2025 GMT + Not After : May 20 01:31:39 2125 GMT + Subject: + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:a5:04:b1:45:03:ef:44:cb:1f:31:0c:5d:87:60: + 82:25:a8:f7:62:1f:a9:ed:82:06:67:23:6a:b0:0c: + 59:3e:b7:c9:ec:17:16:e2:0b:55:06:49:26:82:e9: + d0:bb:82:a4:79:08:6d:93:2f:6b:a2:40:73:3a:77: + a0:e8:47:99:40:27:fa:d7:39:33:26:9c:3d:c5:0b: + 82:ba:ea:48:71:53:18:0f:f6:47:a5:02:89:80:16: + 68:77:33:d1:a2:bb:34:7f:38:ae:c4:cd:85:f1:8d: + 84:e4:e3:dc:23:93:be:b3:93:bc:de:db:bb:67:6a: + ec:55:f6:6a:c0:bd:b5:18:6e:2e:15:06:a1:b9:f2: + fc:72:12:4d:fc:c1:5a:38:b2:30:17:c0:de:83:19: + 4c:fc:9c:c5:0f:c2:b1:86:57:30:88:82:07:f7:ff: + 96:68:1e:55:7c:18:3f:53:5e:40:20:06:02:a1:6e: + f7:03:4b:82:ea:9e:4f:07:97:03:33:d0:bf:1c:de: + b8:17:bf:7d:4c:3a:48:2d:41:ed:82:e6:3a:2c:6f: + 4f:fd:b1:2d:33:ed:d6:36:8c:bc:f2:ff:52:af:aa: + 32:9b:cf:87:45:f3:b3:61:d1:20:7d:03:a3:2f:1f: + 6c:1d:f9:b8:41:e9:88:04:c1:ae:b9:23:36:80:59: + d1:4f + Exponent: 65537 (0x10001) + Signature Algorithm: sha256WithRSAEncryption + Signature Value: + a1:d1:8e:b3:3f:47:3a:4a:2c:f0:bf:34:72:69:99:f2:fa:a9: + a0:72:3c:7e:7a:69:c1:d6:97:4f:bd:44:ac:92:79:46:e4:8e: + 62:c0:cd:41:e9:55:a7:29:33:d6:f6:e7:e5:13:e9:5a:a1:83: + 85:16:cb:e2:38:9a:55:b1:57:51:ea:cc:ca:5c:46:ab:1d:a5: + 73:d6:d6:df:57:e8:7c:40:16:63:17:75:b2:13:ac:31:eb:96: + 85:3b:fb:92:d6:69:4d:ab:e2:1d:22:82:0f:71:66:8d:b0:a9: + 56:a2:77:5e:f8:56:90:22:1f:ee:e7:79:33:37:c7:9f:a1:06: + 01:35:fe:13:12:75:2e:d9:2a:04:e5:8f:21:4a:20:de:a5:07: + 89:aa:0c:c2:d2:ec:a1:47:d6:f6:87:f7:ed:29:f9:69:c6:83: + f6:18:8d:7e:7e:3a:53:c7:b3:91:bd:9a:b8:e3:ac:66:de:57: + b8:2d:c5:d5:54:61:1b:27:96:e8:34:0d:a9:88:4f:03:5a:27: + e0:5f:b5:90:97:9f:57:39:f5:a9:9d:c6:b6:77:1a:bb:86:57: + 57:0c:79:6e:66:5f:93:c1:f7:df:c8:06:3c:df:c5:f8:ef:b3: + e3:61:8b:15:8a:45:4f:db:1d:7f:2b:eb:c9:54:ba:6e:c8:b8: + 40:ca:de:10:93:a9:a4:8c:17:56:50:37:9c:6b:ba:9c:b0:5f: + 4c:49:a7:9c:ba:3c:81:37:e3:a2:b3:6a:71:b9:f6:a6:bb:81: + f3:5c:40:ae:f5:e1:68:32:e3:af:22:5b:88:aa:df:2e:3b:5d: + e2:63:ab:c7:01:a3:c8:3a:e1:06:9f:2f:d1:9f:b4:06:c4:11: + 83:c2:99:4a:de:f0:c2:32:04:b8:65:26:e9:57:3f:7d:52:d7: + d8:1c:6e:2c:55:53:d3:81:1d:b9:9e:0a:c1:34:a6:6a:48:af: + 3b:d9:6e:84:16:30:33:a6:10:17:36:b4:30:68:fd:95:e9:3e: + 35:c3:95:71:7a:86:26:a7:46:66:09:95:91:c6:c2:ba:a6:61: + c2:a5:b6:38:8e:34:a0:14:f1:d7:0c:11:93:0a:a4:d3:f8:b7: + 32:fd:12:38:64:9f:68:fe:3d:a1:f6:28:c1:c8:9f:1f:ea:a5: + e2:77:fd:ad:d9:21:22:40:b2:9e:8e:81:3f:79:0e:13:19:1e: + 70:0f:4a:4b:81:ea:92:c5:fa:4f:80:e9:8f:5e:ac:dc:09:74: + 70:e1:7b:23:68:0c:18:c7:7f:07:4a:39:42:29:d6:c3:62:16: + ec:15:73:02:93:a6:a3:5f:21:90:59:8e:e6:b1:0a:be:32:cf: + 6d:4e:7e:56:3d:87:13:0f -----BEGIN CERTIFICATE----- -MIIDWTCCAkGgAwIBAgIJAIlW4JmZGnU4MA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNV -BAYTAkZJMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg -Q29tcGFueSBMdGQwIBcNMTQxMDI0MDc1MTU1WhgPMzAxNDAyMjQwNzUxNTVaMEIx -CzAJBgNVBAYTAkZJMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0Rl -ZmF1bHQgQ29tcGFueSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDDzU6xLZDD5rZENsOpTpTmqS8YisBaefU3ZeN7VJepZZ/7unM/1YLGJtuRh2Qa -MyTkvyjzf7bSFsDt9L5lfQwBBblVeWkrCvGnQmHDQQYB7JrSmFDPz9W9Mxf9Q2BW -B3lcoKXXJgMnWw0WGrt0lEdFp9gWbq8H9hwJdjpyyk4ZTIuucSOD4JUP3QFEhYU5 -kdcIbDRVw81J4eAZ6EdvbjDN05S7qWjW7rJTnCHAHEd18hcsMGwjpwhjEaSdhMrM -mhOeL8kuQV0fI8v2xfYBliIn9xBZGOVzySPzwFmQceORlW6F3V5w6mwFkmuXqXWX -Qo98swTu7mb89qVYmR71d3L3AgMBAAGjUDBOMB0GA1UdDgQWBBRdWet/kGNTyvXK -wuBdP/eSldOgWjAfBgNVHSMEGDAWgBRdWet/kGNTyvXKwuBdP/eSldOgWjAMBgNV -HRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQCcJpP+DR4AJxVelNTSZa+V38c+ -jgrMD2Ku2eU8NQlsjgMfNEU5Md/g7FpP8aCFzVf0kAAT7DxZmSE3uWXQbMXyVJmy -bF+qXinf71QzdWULm6sASoshC6wbHnXL9ZjWQ3gh1nqVgo3MmLQYrb3eJfKaaLoc -wpjhYxVxGFOx1ITN3jED64lUfoLHvR6NFbESYKAuAAzSNqX4HOQ3uGk2THM8JocZ -oH2+38d81Kd4HQ7DDDKS/isG0+rR60Ti1cMgu7OT7p1dZCwT/KQuI5eGjE9lubkc -yAJjaod4rVLdBri3XVvtySfS2+/75qUgv2TF7d/s7mxMq4DDt29yeKSUhZCs +MIID0DCCAbgCAhAAMA0GCSqGSIb3DQEBCwUAMFkxCzAJBgNVBAYTAkZJMREwDwYD +VQQIDAhIZWxzaW5raTERMA8GA1UEBwwISGVsc2lua2kxEDAOBgNVBAoMB01hcmlh +REIxEjAQBgNVBAMMCUdhbGVyYSBDQTAgFw0yNTA1MjAwMTMxMzlaGA8yMTI1MDUy +MDAxMzEzOVowADCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKUEsUUD +70TLHzEMXYdggiWo92Ifqe2CBmcjarAMWT63yewXFuILVQZJJoLp0LuCpHkIbZMv +a6JAczp3oOhHmUAn+tc5MyacPcULgrrqSHFTGA/2R6UCiYAWaHcz0aK7NH84rsTN +hfGNhOTj3COTvrOTvN7bu2dq7FX2asC9tRhuLhUGobny/HISTfzBWjiyMBfA3oMZ +TPycxQ/CsYZXMIiCB/f/lmgeVXwYP1NeQCAGAqFu9wNLguqeTweXAzPQvxzeuBe/ +fUw6SC1B7YLmOixvT/2xLTPt1jaMvPL/Uq+qMpvPh0Xzs2HRIH0Doy8fbB35uEHp +iATBrrkjNoBZ0U8CAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAodGOsz9HOkos8L80 +cmmZ8vqpoHI8fnppwdaXT71ErJJ5RuSOYsDNQelVpykz1vbn5RPpWqGDhRbL4jia +VbFXUerMylxGqx2lc9bW31fofEAWYxd1shOsMeuWhTv7ktZpTaviHSKCD3FmjbCp +VqJ3XvhWkCIf7ud5MzfHn6EGATX+ExJ1LtkqBOWPIUog3qUHiaoMwtLsoUfW9of3 +7Sn5acaD9hiNfn46U8ezkb2auOOsZt5XuC3F1VRhGyeW6DQNqYhPA1on4F+1kJef +Vzn1qZ3Gtncau4ZXVwx5bmZfk8H338gGPN/F+O+z42GLFYpFT9sdfyvryVS6bsi4 +QMreEJOppIwXVlA3nGu6nLBfTEmnnLo8gTfjorNqcbn2pruB81xArvXhaDLjryJb +iKrfLjtd4mOrxwGjyDrhBp8v0Z+0BsQRg8KZSt7wwjIEuGUm6Vc/fVLX2BxuLFVT +04EduZ4KwTSmakivO9luhBYwM6YQFza0MGj9lek+NcOVcXqGJqdGZgmVkcbCuqZh +wqW2OI40oBTx1wwRkwqk0/i3Mv0SOGSfaP49ofYowcifH+ql4nf9rdkhIkCyno6B +P3kOExkecA9KS4HqksX6T4Dpj16s3Al0cOF7I2gMGMd/B0o5QinWw2IW7BVzApOm +o18hkFmO5rEKvjLPbU5+Vj2HEw8= -----END CERTIFICATE----- ------BEGIN DH PARAMETERS----- -MIGHAoGBAJWyvKjE+s7OP4Lj1jXKGlJGWT4Vd5YaxPljihTsRe1aXkWAgsuwISXk -/TQ8Rx5Zmze7rtwtU0PoYxvuam9FMXYqhw2dVe4qRdeSX78DSiL/YBkQzaxlfWVy -RE9+9dzHbCtRVDlN7K1kA+mGWH4/r7NAu4Qm/003V0NTtMwQSqebAgEC ------END DH PARAMETERS----- - diff --git a/mysql-test/std_data/galera-key.pem b/mysql-test/std_data/galera-key.pem index c88c613cacf..82c20e8dd49 100644 --- a/mysql-test/std_data/galera-key.pem +++ b/mysql-test/std_data/galera-key.pem @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDDzU6xLZDD5rZE -NsOpTpTmqS8YisBaefU3ZeN7VJepZZ/7unM/1YLGJtuRh2QaMyTkvyjzf7bSFsDt -9L5lfQwBBblVeWkrCvGnQmHDQQYB7JrSmFDPz9W9Mxf9Q2BWB3lcoKXXJgMnWw0W -Grt0lEdFp9gWbq8H9hwJdjpyyk4ZTIuucSOD4JUP3QFEhYU5kdcIbDRVw81J4eAZ -6EdvbjDN05S7qWjW7rJTnCHAHEd18hcsMGwjpwhjEaSdhMrMmhOeL8kuQV0fI8v2 -xfYBliIn9xBZGOVzySPzwFmQceORlW6F3V5w6mwFkmuXqXWXQo98swTu7mb89qVY -mR71d3L3AgMBAAECggEBAIMT0UdZSp1quL/nrYqNGa9kuSuDz4uCM3+3jNcGZVU4 -vCYHxpmINLi0UK8W5ROJA3zC4AZKjDgOlW93NXK5iKyyiUTIN3hiJi4jiVDuGbh2 -DZtH7mmAKAU1zCx2y2osLLmurfbe8qOJF7ShhrZfgWsHFujFhhUdU92dsTkhZ7EU -2NF8ScxCo4PbOJoHC3j0ApfwCMxUMAKZF5+08EeKYqK7OAXI79HeIvEbHn3cUDGm -bvg6ykwlz2UUO4sg+xdCmn1Bt36HF/4e973Y5fkE/vd9mryHIlu9t7GJgWyUiPr8 -BGEoAWDSpPOMd/b9ivtxh9Gd+LW/uitMuBIfrRPgz9kCgYEA+JqeeD2xqF2IzZyq -i1UqgKe3su2U2zhkgbu1h/1M/reNIZGylF0wFs3P+kNIB2NavmHjXcgSjdJzqRL9 -XEWfFJRmeARo9RTEQEVd8zp1Eo8ISeiksGgvbL4rrNIRR5V5MZytfISRiGCWN6jx -ulJ6EieQk5EcvknGlWpJY/bBsQ0CgYEAyaCLqrR38gVl2Z0t6YlhW/HWAwGt+lf4 -apN1AS4uykx7wRW2B0y9QUDfsrYeVlbbeRPP4UzPmJez+J2cweoIIeFFyo3KP2L7 -79E3EVYywjXhPg52F7OjFA4Bp970XclIC5Al7kDufSgwZmWdceSx4Jjc5ixyQEC8 -Ad0ThgP6yxMCgYAvC4OFmZcvF1Q2JLmZWGqMojB/KbqLqaZLbqwxqduSMEYC3kF/ -FgttpVEAOQ8+ZqzbbkbKjnwEXpkIm9FaTsqF6HdjquH5zw48Y2QeDSfudSbKZb4U -rAKdf3dgYvhmJYEjxFSIRcYMmsqSieQEsGrtWJNheYqI8AkmaVCuHBoXWQKBgQCj -daelNffD2wJuQNI28axfiRjSiSsNuQHpDTCfS1ydnxH5QGu5UUphO4HfdWv03SfC -6f/vDIGEmQBLvyOVxfDf3qzhAMCFUO8kxj1ZrcMq1dmMoNa2cmj0WkKXYNZFrmfd -D/jgRf3Ss6FBcoIJErnudp8nb8MUOibxb9RjIpjQxwKBgEliKaGN+/QkPTNJ4vXz -609CIilxpE+YVTzlv3YeZP5HqsJTJPS2ARIUr/Pjpbl3LHfYNeeGDCwgkJIK0JJH -iA1M51q6t3zG2y9gKmC15FF0jShoZkRgqBxqrSHAnrCo5t2C48ElxJ3FEU8T75sz -dlGTbkmR0Wm43Kh++dWICJ3g +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQClBLFFA+9Eyx8x +DF2HYIIlqPdiH6ntggZnI2qwDFk+t8nsFxbiC1UGSSaC6dC7gqR5CG2TL2uiQHM6 +d6DoR5lAJ/rXOTMmnD3FC4K66khxUxgP9kelAomAFmh3M9GiuzR/OK7EzYXxjYTk +49wjk76zk7ze27tnauxV9mrAvbUYbi4VBqG58vxyEk38wVo4sjAXwN6DGUz8nMUP +wrGGVzCIggf3/5ZoHlV8GD9TXkAgBgKhbvcDS4Lqnk8HlwMz0L8c3rgXv31MOkgt +Qe2C5josb0/9sS0z7dY2jLzy/1KvqjKbz4dF87Nh0SB9A6MvH2wd+bhB6YgEwa65 +IzaAWdFPAgMBAAECggEAT55ae46g8MPCWnN5YvqNAOer6IOXhPlh5nx/ms5yduDN +Q6SGTW0jSmOb+bkflYE8owsOd1//YisPjauvjrMQ/ZPsotA93kivQvXBTzb/2fG6 +H+V3fuWg+xSUtcLiSE5jz2hFZr40/K2H67oG+oFsFw/Wpn5FRuofeoBo1HMTv+OO +8JvDGOC3jNBxqvajf2+YTpHkS2Bm0CujlspMv+LYYJm4kjlmaE+PEKGAqp+WT+rK +10HXYQGsOLld3DVfO0aHJQ+ji5WskTtmJxi/Gutra2BL7upiPByvdInCBFL5WObw +1gQCYZeUgD0Djofmk4Jst8M7fU/v8HDTgyMzy544EQKBgQDOVXuS3wkxz5QqKAt9 +js8nAb+M9w84cCn89hLZN60IBBWb933EtRun5M6Izy7PWRnSUH4Oeao9cGU1GsKQ +AuTLJKfbNVCrYo5dTpRDpK1zgRaiT2IPn8Wi337qP89dcb0NPXpWkzrkmhZJ3C6t +YkvDp8jhunudCpisWsA5cDGmcQKBgQDMvUyI7wyukMt+VDIi1tnzJgJlezXRRCCH +MO1qMSAn0UIIp/9nR41mdj9gQJby1uc+eL5eLY/KTjZgU9NTOhJ3ZT/GkvoR9xQt +yZfWz8117OXoJxMgfUITKijtlQSCY4i3kAcA+bEerFIW+6xtNXzte5Q+LH/knmbh +HmC689hTvwKBgERRwa0L9LtthB3BTKyyUJ0V0xsV4xBI814zDGKoML7qu0z9UcOE +RDf/ZvOdxl4Znpco19RrLJdTU++VgL62dpNc+8d1i9RzubfjgOw05snMAHaV2l5a +BNK9NgTSRBMoyfRMWum3rlRrQN4L7dizJ2sNb1JusOd6zrqjAesC3y3BAoGAAdlz +54jBRJJqRCneihIGxfuB6gjC47EJ2i7G9j6bW8C4J/vcgsJStKo8yFHNC0SFsjrE +/XTL57ftJdGcBxRvNkTj3pdVSvRAaml3xaj64iXRrdcshQ6cmi+3Tu4ZrFPZ2E6k +wY1/3BcSZsK/O/1Ps5V6MVWVkiscIsxzczzgp2ECgYAqC6yFmIbw1Ui/YIqprj8c +nb5xl5KGj47ZGFIWeoNIZKOwUZu+POu+WZ4kOvySP276xvLfjLjWl+HHjN73AMaT +RvW2+xwSEfGR4d5wqGGxk5TnJOzi0vd21tGUCGdc+AAYDE/M00skdW8AfK1fUuVm +qkpHixGjosFWeZn9IGyu0g== -----END PRIVATE KEY----- diff --git a/mysql-test/std_data/galera-upgrade-ca-cert.pem b/mysql-test/std_data/galera-upgrade-ca-cert.pem index 13d27e84bb3..6c6ce469368 100644 --- a/mysql-test/std_data/galera-upgrade-ca-cert.pem +++ b/mysql-test/std_data/galera-upgrade-ca-cert.pem @@ -1,40 +1,32 @@ -----BEGIN CERTIFICATE----- -MIIDWTCCAkGgAwIBAgIJAIlW4JmZGnU4MA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNV -BAYTAkZJMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg -Q29tcGFueSBMdGQwIBcNMTQxMDI0MDc1MTU1WhgPMzAxNDAyMjQwNzUxNTVaMEIx -CzAJBgNVBAYTAkZJMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0Rl -ZmF1bHQgQ29tcGFueSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDDzU6xLZDD5rZENsOpTpTmqS8YisBaefU3ZeN7VJepZZ/7unM/1YLGJtuRh2Qa -MyTkvyjzf7bSFsDt9L5lfQwBBblVeWkrCvGnQmHDQQYB7JrSmFDPz9W9Mxf9Q2BW -B3lcoKXXJgMnWw0WGrt0lEdFp9gWbq8H9hwJdjpyyk4ZTIuucSOD4JUP3QFEhYU5 -kdcIbDRVw81J4eAZ6EdvbjDN05S7qWjW7rJTnCHAHEd18hcsMGwjpwhjEaSdhMrM -mhOeL8kuQV0fI8v2xfYBliIn9xBZGOVzySPzwFmQceORlW6F3V5w6mwFkmuXqXWX -Qo98swTu7mb89qVYmR71d3L3AgMBAAGjUDBOMB0GA1UdDgQWBBRdWet/kGNTyvXK -wuBdP/eSldOgWjAfBgNVHSMEGDAWgBRdWet/kGNTyvXKwuBdP/eSldOgWjAMBgNV -HRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQCcJpP+DR4AJxVelNTSZa+V38c+ -jgrMD2Ku2eU8NQlsjgMfNEU5Md/g7FpP8aCFzVf0kAAT7DxZmSE3uWXQbMXyVJmy -bF+qXinf71QzdWULm6sASoshC6wbHnXL9ZjWQ3gh1nqVgo3MmLQYrb3eJfKaaLoc -wpjhYxVxGFOx1ITN3jED64lUfoLHvR6NFbESYKAuAAzSNqX4HOQ3uGk2THM8JocZ -oH2+38d81Kd4HQ7DDDKS/isG0+rR60Ti1cMgu7OT7p1dZCwT/KQuI5eGjE9lubkc -yAJjaod4rVLdBri3XVvtySfS2+/75qUgv2TF7d/s7mxMq4DDt29yeKSUhZCs ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDVzCCAj+gAwIBAgIJALBO5bqmtlYkMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNV -BAYTAkZJMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg -Q29tcGFueSBMdGQwHhcNMTUwNjI2MDcxMjQ1WhcNMjUwNTA0MDcxMjQ1WjBCMQsw -CQYDVQQGEwJGSTEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZh -dWx0IENvbXBhbnkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -1DlcztIzSngGeTUFibj9GZ4ZO78ASpgYySZv/DRIVn/3hbF41ZRD/6uJlb5rf1R7 -fpFsurbXNDDxeap7b/Gz2XSQy96Dbm0SbsFSZttV/R2WtlT1Wf5n9ix6RLqhKSbg -nPyL2fsDaxtZh2uywGJEXhwXFtdx3deIo/tYivDfl5Tcsv0NnZY8Vg0boBRP+FEn -ReJOdSa5LLn+QJN2Xa+wutbLHe0hI6huKUXU2YUeBfgyk1nWol5241ZUDCgDsoaW -8r2YeJNHmNInd3wERbqFgFHsR4N1+Atcyrfn/uQSj9zrTPO/Pp51KpjWf/gjxjXP -biu5De50qZ4+U4no20EIOwIDAQABo1AwTjAdBgNVHQ4EFgQU3kSPGchrOoQJ5gq1 -mmV2HEra6GswHwYDVR0jBBgwFoAU3kSPGchrOoQJ5gq1mmV2HEra6GswDAYDVR0T -BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAfoBD64FJ9fAR19+vwueFGmpWNIqF -PzN7QmEpCMduV3DXuxYO73q2ikXgrVO5HWFz9IjNvzXbSRmWNzJGaZ3QYZ+Xx1JJ -8MrAOUr6djWuyD659f64dh/2jMxiQNoEHrknXm9HSqR5oJVwndFyr/zvSkYSRexE -KFciIprb9LOba9G3ZMBYBdqK+f3Ky16BMjaD6XfaTx+xjHk/8peSueXIQl+v2biz -zSfpEUa0dKCIxckrzD4JknDHFimTsrzlRftcg8t8piOXwZomFcnVunyGs2bJ/Npj -25c2e6sx7XSc5bUgPGuQcSGflZPLg9zWyJ69sVYUNAz+gqfvWfOOJuzPNg== +MIIFkzCCA3ugAwIBAgIUV3aBq/Mk/AlwaHlG2fWsrojezT4wDQYJKoZIhvcNAQEL +BQAwWTELMAkGA1UEBhMCRkkxETAPBgNVBAgMCEhlbHNpbmtpMREwDwYDVQQHDAhI +ZWxzaW5raTEQMA4GA1UECgwHTWFyaWFEQjESMBAGA1UEAwwJR2FsZXJhIENBMB4X +DTI1MDUyMDAxMTUxNFoXDTM1MDUxODAxMTUxNFowWTELMAkGA1UEBhMCRkkxETAP +BgNVBAgMCEhlbHNpbmtpMREwDwYDVQQHDAhIZWxzaW5raTEQMA4GA1UECgwHTWFy +aWFEQjESMBAGA1UEAwwJR2FsZXJhIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA0w+K6kwQVLDyg//YVYxDXFElDpzUlZo66Yq7y8Y2LcG088GqPQlf +g9tMd/HFat8HXaRu2N3Mjd7cgtt7Sp+wuSC3MadGObqaipwnGMUC04FUI3aOlhyu +NPdS6o+LQ3LIhRNS251SqYJ+lZkWlw7ygw/pyovAwyWKkUib1n1C0O9DwLcZEGdY +4GkkifSp7gF+xHf9NZ3AI0nnXZccmQm3EYslepR8Do+D635Hk+49kN/OPm44uUjn +ul9Xlh4azn6AXgd1VPBWV7Ic6EtMhXIVdIiJTIbhHVBTuMXlwS2TzXEJN0QcGMLF +AyA6aDPkFHwZDAyP/fgh7v2DVkEh8UQUUW4m3GibJmyYcQw0pvILcC8sUHMQ8ZAb +eTchzwB+2L3DywGHmcDMYeUpmYANABNdLGBZTnjy06ZBs0EAPMaUujUXWjb4zI5+ +NQ5KTfYQ3nOePKyFzf+W7aO09ApM9zbYI5fZwoAlgxqwL58LlxmW6QDDSMtu9xE+ +3p0/iJnUD3mCUYPKINqT8ZaJOTOywELntUq/eFjPHZlCebbBhVBGjJQnhNAlWD7O +Y2iOs3XYzVX4FJxlcodj3idKrfRYF3IGekah4+NainFbMu24J08BYrc77vqj8qNv +tHaYcxEs4d0ggyWAnr4i8wDgl/aT63FIj+PPA7VHw9ytbEYkF7ZEBb0CAwEAAaNT +MFEwHQYDVR0OBBYEFFS7XKdj8vKLmXYl/adm467ECLwGMB8GA1UdIwQYMBaAFFS7 +XKdj8vKLmXYl/adm467ECLwGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL +BQADggIBACm8QeUNhuAbwsOA7uImSFyatA7+kSC0heVQyV0B2AC4smca3yQQfnF7 +ttnloEfOQJ/HEKUw67jFPLjf+ZdrV4WGJJFlUpUcOgTBgtPze3Cc8JdJTAsA12cz +rxCKNf7d9Ob1xzXsGmWG0fjPqJpFMDTDdJcuWBdKOjKg8qP3L3anfQBPiVzc6Wyz +IIs7LUQRAYtN05JE8jzDecNKZIbDbGQ3qb4uqyfQOebaP4g63osNMugBPRQpcgLk +o2F0q3iC1GnJD8RCl1P0IpLHtVIC8GbamL0WVD5XWYk6esGHpqzeWZGUl+GVUCJ+ +QOlqnLD0UPnBo/o3d+lrzeRUeGVu+k8u3TeJZyzOyuh7ZPZtNQ7h1Rzxa5LD4tGX +SeFtyS8dYiVC27Vyu2LAFcbZUO3VTOpusXy3iq5jz7MzuTHaV8MiYPDuQ3xhrUo9 +kGWXKiTd+Vr1V6iBig7wWDSwMyFbbDzv3N86TpHjO2ynXNHXPg6VEDOP+zOcI7KO +cgQWqhR8Zr58Yo1tRI8ync9zeUF5cD1EnkP0QRelnmhR0IEPAIxW2YCIO4+jAZOE +5bKPyJwjWzfJR0U2fFi73qpXoMXubcrPFMdiYTMnRjwO+WVLNWCQbe6zE9xh/ZKx +JCYjqvyKIrbtrS4exkRkXDX+gknrdYcfSw/7i9DKkzfowKYVrTQd -----END CERTIFICATE----- diff --git a/mysql-test/std_data/galera-upgrade-server-cert.pem b/mysql-test/std_data/galera-upgrade-server-cert.pem index 3af8b1ae7dd..deee3c9f682 100644 --- a/mysql-test/std_data/galera-upgrade-server-cert.pem +++ b/mysql-test/std_data/galera-upgrade-server-cert.pem @@ -1,20 +1,87 @@ +Certificate: + Data: + Version: 1 (0x0) + Serial Number: 4097 (0x1001) + Signature Algorithm: sha256WithRSAEncryption + Issuer: C=FI, ST=Helsinki, L=Helsinki, O=MariaDB, CN=Galera CA + Validity + Not Before: May 20 01:32:38 2025 GMT + Not After : May 20 01:32:38 2125 GMT + Subject: + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + Public-Key: (2048 bit) + Modulus: + 00:c9:0e:e9:9d:eb:8f:8d:7f:79:aa:55:7f:2d:c0: + be:92:10:77:46:78:31:63:38:82:01:91:91:4c:c1: + 49:85:04:d3:28:0a:49:80:81:1f:3c:3c:00:6f:aa: + e1:ad:d1:44:0a:72:2a:82:39:72:12:5e:3d:0e:be: + 43:f8:11:98:6a:cb:35:a8:f5:05:e1:1b:b1:9f:14: + ee:59:9d:4a:34:cc:92:0d:9b:cf:23:db:ba:5e:68: + b3:de:2f:37:04:41:c7:84:b0:62:fb:5d:7a:b9:6e: + 0d:f8:f9:82:23:24:8c:0e:f6:34:b7:93:fe:82:f6: + fc:56:45:46:67:63:b1:a7:18:2d:2b:7a:90:92:9c: + a0:cc:11:18:68:f1:9d:24:a5:77:40:cc:c3:ae:df: + ed:c9:1c:cb:e1:66:0c:04:3e:93:2b:4f:ad:31:c1: + 33:64:a4:27:7d:27:da:40:bb:bb:d9:a1:f1:b0:bc: + 43:de:52:22:78:0d:21:ac:20:e0:62:15:4b:60:a4: + 60:77:34:44:75:76:1f:57:00:23:15:dd:51:29:b2: + 5e:75:99:b0:72:0b:49:21:31:1f:5f:a4:b9:ef:c4: + f1:1e:4c:0d:1f:4b:2d:f1:71:f9:b1:df:3f:9c:01: + 7e:cd:66:ef:07:e6:e7:9a:95:eb:86:ba:44:05:84: + 42:2b + Exponent: 65537 (0x10001) + Signature Algorithm: sha256WithRSAEncryption + Signature Value: + 90:67:64:33:70:bd:c8:15:10:8d:8c:f3:09:48:c8:12:8d:58: + 25:b6:a7:a5:2f:54:4e:a3:8e:4c:8d:e7:bb:60:2e:1c:1d:0f: + c1:62:78:d3:47:18:a0:c6:55:4c:69:38:07:e4:86:7a:c6:35: + f3:bd:05:1b:a4:67:ea:d9:ed:72:e5:37:df:7f:97:2f:76:4e: + d8:7a:df:de:7f:35:15:de:cd:e0:e3:c2:e1:96:15:79:3f:88: + 5f:d1:f1:b4:f1:41:21:f1:6a:cd:92:3d:4c:14:fc:5b:17:d0: + ec:7d:12:88:18:74:ec:5c:2a:d3:e7:7b:c4:69:53:51:37:71: + d1:f8:2a:70:80:e3:b7:b5:00:a6:df:d4:9b:d4:65:5e:e2:53: + 6e:98:6d:76:26:cd:19:cd:08:ec:81:8b:54:50:53:9b:06:f3: + 65:83:a9:1b:9c:f0:ed:12:88:c5:0c:f2:02:d4:3f:09:fb:43: + f9:1e:13:12:05:c4:e7:47:e7:9e:bf:c0:6a:70:17:3e:f4:29: + 92:77:a8:1b:d9:1c:3c:e3:ae:5d:c8:98:a6:4b:3d:22:a8:cd: + 46:8e:8b:4e:b2:0c:a3:3e:9e:fe:98:a1:2c:36:10:f9:b6:63: + d4:ae:bb:a8:f3:e8:cd:2f:0e:06:a2:e9:e1:41:3f:25:8b:ec: + a1:65:56:ec:d6:98:4b:b3:fc:d1:8f:21:1e:55:3d:28:10:c3: + 55:30:54:0a:92:f5:33:7e:c6:68:fb:7d:b3:5f:5a:a2:65:4f: + 25:53:93:3a:11:4a:23:5b:26:59:8e:5d:c5:56:c9:35:f5:55: + 45:f1:0c:f0:b3:98:62:3f:42:f3:44:17:81:fd:41:80:e5:6e: + 45:76:19:f0:34:f6:9a:13:76:5e:2e:08:66:71:e0:5d:f8:aa: + f9:ef:4b:1d:23:bc:c7:a7:e4:09:61:df:e6:b7:9a:7f:d2:8c: + 25:f3:26:e2:38:36:1a:1e:23:a9:10:60:08:59:22:52:cf:64: + 47:68:a0:04:31:33:f7:14:ec:33:87:76:f2:84:d1:37:07:fc: + 1a:fa:23:94:2a:7e:72:f8:bb:45:17:49:d7:57:46:c1:aa:4c: + d2:04:dc:82:7b:33:b9:44:ee:d2:bb:4c:60:f0:93:7b:68:19: + 77:65:7b:ce:65:d2:16:2d:0b:3d:0b:7d:62:96:86:29:c2:01: + 57:26:02:15:67:cb:97:5b:2e:a6:65:60:b9:4f:53:ce:3a:6a: + 35:06:50:d9:1b:be:5b:a0:0e:0a:b4:66:40:a5:6a:40:d1:37: + fd:f9:0a:63:22:b4:08:7d:5f:1a:ed:cb:6f:74:17:b6:a3:56: + 54:24:38:8f:c4:6a:cf:46 -----BEGIN CERTIFICATE----- -MIIDVzCCAj+gAwIBAgIJALBO5bqmtlYkMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNV -BAYTAkZJMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg -Q29tcGFueSBMdGQwHhcNMTUwNjI2MDcxMjQ1WhcNMjUwNTA0MDcxMjQ1WjBCMQsw -CQYDVQQGEwJGSTEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZh -dWx0IENvbXBhbnkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -1DlcztIzSngGeTUFibj9GZ4ZO78ASpgYySZv/DRIVn/3hbF41ZRD/6uJlb5rf1R7 -fpFsurbXNDDxeap7b/Gz2XSQy96Dbm0SbsFSZttV/R2WtlT1Wf5n9ix6RLqhKSbg -nPyL2fsDaxtZh2uywGJEXhwXFtdx3deIo/tYivDfl5Tcsv0NnZY8Vg0boBRP+FEn -ReJOdSa5LLn+QJN2Xa+wutbLHe0hI6huKUXU2YUeBfgyk1nWol5241ZUDCgDsoaW -8r2YeJNHmNInd3wERbqFgFHsR4N1+Atcyrfn/uQSj9zrTPO/Pp51KpjWf/gjxjXP -biu5De50qZ4+U4no20EIOwIDAQABo1AwTjAdBgNVHQ4EFgQU3kSPGchrOoQJ5gq1 -mmV2HEra6GswHwYDVR0jBBgwFoAU3kSPGchrOoQJ5gq1mmV2HEra6GswDAYDVR0T -BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAfoBD64FJ9fAR19+vwueFGmpWNIqF -PzN7QmEpCMduV3DXuxYO73q2ikXgrVO5HWFz9IjNvzXbSRmWNzJGaZ3QYZ+Xx1JJ -8MrAOUr6djWuyD659f64dh/2jMxiQNoEHrknXm9HSqR5oJVwndFyr/zvSkYSRexE -KFciIprb9LOba9G3ZMBYBdqK+f3Ky16BMjaD6XfaTx+xjHk/8peSueXIQl+v2biz -zSfpEUa0dKCIxckrzD4JknDHFimTsrzlRftcg8t8piOXwZomFcnVunyGs2bJ/Npj -25c2e6sx7XSc5bUgPGuQcSGflZPLg9zWyJ69sVYUNAz+gqfvWfOOJuzPNg== +MIID0DCCAbgCAhABMA0GCSqGSIb3DQEBCwUAMFkxCzAJBgNVBAYTAkZJMREwDwYD +VQQIDAhIZWxzaW5raTERMA8GA1UEBwwISGVsc2lua2kxEDAOBgNVBAoMB01hcmlh +REIxEjAQBgNVBAMMCUdhbGVyYSBDQTAgFw0yNTA1MjAwMTMyMzhaGA8yMTI1MDUy +MDAxMzIzOFowADCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMkO6Z3r +j41/eapVfy3AvpIQd0Z4MWM4ggGRkUzBSYUE0ygKSYCBHzw8AG+q4a3RRApyKoI5 +chJePQ6+Q/gRmGrLNaj1BeEbsZ8U7lmdSjTMkg2bzyPbul5os94vNwRBx4SwYvtd +erluDfj5giMkjA72NLeT/oL2/FZFRmdjsacYLSt6kJKcoMwRGGjxnSSld0DMw67f +7ckcy+FmDAQ+kytPrTHBM2SkJ30n2kC7u9mh8bC8Q95SIngNIawg4GIVS2CkYHc0 +RHV2H1cAIxXdUSmyXnWZsHILSSExH1+kue/E8R5MDR9LLfFx+bHfP5wBfs1m7wfm +55qV64a6RAWEQisCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAkGdkM3C9yBUQjYzz +CUjIEo1YJbanpS9UTqOOTI3nu2AuHB0PwWJ400cYoMZVTGk4B+SGesY1870FG6Rn +6tntcuU333+XL3ZO2Hrf3n81Fd7N4OPC4ZYVeT+IX9HxtPFBIfFqzZI9TBT8WxfQ +7H0SiBh07Fwq0+d7xGlTUTdx0fgqcIDjt7UApt/Um9RlXuJTbphtdibNGc0I7IGL +VFBTmwbzZYOpG5zw7RKIxQzyAtQ/CftD+R4TEgXE50fnnr/AanAXPvQpkneoG9kc +POOuXciYpks9IqjNRo6LTrIMoz6e/pihLDYQ+bZj1K67qPPozS8OBqLp4UE/JYvs +oWVW7NaYS7P80Y8hHlU9KBDDVTBUCpL1M37GaPt9s19aomVPJVOTOhFKI1smWY5d +xVbJNfVVRfEM8LOYYj9C80QXgf1BgOVuRXYZ8DT2mhN2Xi4IZnHgXfiq+e9LHSO8 +x6fkCWHf5reaf9KMJfMm4jg2Gh4jqRBgCFkiUs9kR2igBDEz9xTsM4d28oTRNwf8 +GvojlCp+cvi7RRdJ11dGwapM0gTcgnszuUTu0rtMYPCTe2gZd2V7zmXSFi0LPQt9 +YpaGKcIBVyYCFWfLl1supmVguU9TzjpqNQZQ2Ru+W6AOCrRmQKVqQNE3/fkKYyK0 +CH1fGu3Lb3QXtqNWVCQ4j8Rqz0Y= -----END CERTIFICATE----- diff --git a/mysql-test/std_data/galera-upgrade-server-key.pem b/mysql-test/std_data/galera-upgrade-server-key.pem index d243c9e0381..872f3187cd9 100644 --- a/mysql-test/std_data/galera-upgrade-server-key.pem +++ b/mysql-test/std_data/galera-upgrade-server-key.pem @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDUOVzO0jNKeAZ5 -NQWJuP0Znhk7vwBKmBjJJm/8NEhWf/eFsXjVlEP/q4mVvmt/VHt+kWy6ttc0MPF5 -qntv8bPZdJDL3oNubRJuwVJm21X9HZa2VPVZ/mf2LHpEuqEpJuCc/IvZ+wNrG1mH -a7LAYkReHBcW13Hd14ij+1iK8N+XlNyy/Q2dljxWDRugFE/4USdF4k51Jrksuf5A -k3Zdr7C61ssd7SEjqG4pRdTZhR4F+DKTWdaiXnbjVlQMKAOyhpbyvZh4k0eY0id3 -fARFuoWAUexHg3X4C1zKt+f+5BKP3OtM878+nnUqmNZ/+CPGNc9uK7kN7nSpnj5T -iejbQQg7AgMBAAECggEBAJ4m7VG3db+uOGzFJY5fzEX1+qn6ibYNKJNmUJfrQmkr -zgLUoc7QQehbJhnwoN1v0OQebZ+rOC7NtnZLpNdkkPmhk3JKLTnykIT3DnhWRftt -vG2+XGUnYMQkmy1ywz0Omt6CmZnlJMQByrNPgBM8Z+SWHGLKRTHkOBCz82T/YjDr -wqug1Yv6W0wMNM/cikgoBldVG7hABCJuShjffIbUgVysK3dEPNywNAC78neoGECm -evPZOaIkWEr86SpAlwA6Yh+zTQZ03CXATcGonJdWJ015DvlKRv6QyRR0Q/Y1ONwb -f115kll15MJBEspFdSyhlMcVJlwO8WMaZ2qIzlQZmdECgYEA//P469QzX00L/urK -7IRvtSVu5CP/A/Wui90U4KoP7XgXIeExnEtzLVs1K7vjuzdpTyq+68XuC40gPcJW -RvoX229m6gRV8nC53UiV71jM8IvkyEqFYT/gfZC9KQCMSRJLtVnDMpZ3gMxAY6/5 -p20o616Au8DKFFetQV0aD4Hj1/MCgYEA1ENV1WkgvN6yItB77E9kN/vbKLRh0hrg -9xj0SmMXGYyDM9NpjbgbgJIZo3ukkBtp3kEY8P9JQZRcd1EcnnSrwTB7ChdInWkR -m/LpIZBEMqNQbeu4QSzZYYS6z4tcGGx43aHqzzNBZdnQnqhYL1CvlLwhkgX6oQCo -woXqyfMNKJkCgYEA63gD1NGPwWkcVBSlQxpDup8JeZE0Fux6++kUP+u0Y39LqLuH -7IXtHBkAvY9JXv8HPvHQWw/og2/97VNQFFQYhqPiRgBfIX9bPpx8c4l6YQISI8GL -G4CsglgZ7hK2/LJ8PAascWnD3xYJVqyaPNFMB90VCaW/Qx+2IKAKTaHtfskCgYBu -1f5C4pMqrCpeTXj4Cvis1wE4PwB5QnnH7SrakOVl/N4huLn8O2948lEa8Zwbd4UP -ffR1Gwh4iuzBjQQhpZBt30/QFBphv5RnVy7uzLMfsfF0hEqBFdcoubMGXqGnSzTN -nhfLO9thQJxTzFnH0xzr0FTDOAYH/h0g/eZ8r0JmuQKBgQDjhXM+hJ3Pkwua+Fnl -nZfY5MeSzkJki/9iwVo8rSDwmZS9Nsc83oZnddM7c2x63t+zYOAcMxsVCiByMDzo -5IB781HWRBGcU8TnW1b0bAnZimjKp/qsZ/Szr38rvImqG8TjzbcSD7w0SpyRQ/Ot -A7SZFkWYfem8/q/VImjU/CNbOQ== +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDJDumd64+Nf3mq +VX8twL6SEHdGeDFjOIIBkZFMwUmFBNMoCkmAgR88PABvquGt0UQKciqCOXISXj0O +vkP4EZhqyzWo9QXhG7GfFO5ZnUo0zJINm88j27peaLPeLzcEQceEsGL7XXq5bg34 ++YIjJIwO9jS3k/6C9vxWRUZnY7GnGC0repCSnKDMERho8Z0kpXdAzMOu3+3JHMvh +ZgwEPpMrT60xwTNkpCd9J9pAu7vZofGwvEPeUiJ4DSGsIOBiFUtgpGB3NER1dh9X +ACMV3VEpsl51mbByC0khMR9fpLnvxPEeTA0fSy3xcfmx3z+cAX7NZu8H5uealeuG +ukQFhEIrAgMBAAECggEALOBrPJhrfkXJvj8/F9NBthB+zvfc7iyauAbpy5wI8OvW +xcUmCszHUAaEgmg93zIqYbqByndQAtGOB1Bok2I6Bvw8ie3G1iv8RWnCmbYF7isL +HoZ8gaB1xMTSAPHA8e5Mvk0wirKexezOqZfneDicGmrR8XfTAyBlykvEHyeda5IQ +O5P5OIseevBSOYujV/pYohLIlIJmaxtlyLktIos2TvNxcomULhQ+b+xLc2YZespE +9Tvolin3czzS8UUACFIVDkmWRzEyEH+PXOBFiwbI3SeL1V+iJx+YcEkrNZpLkV45 +DxvNqDMfgi7iZ5Re9/QIuoz79drokiC6yHW/V5EWoQKBgQD3RcvbaaWkCpC0mHer +K3+5I9OtBxFenG3h5v8jXVC4LwKoqeN5CpMBnltohiRWOxfjuJ15MHkIywuDYslU +ySEA2GvZZZIJxa9dNiQiCPlEH5GN0+9U9FDTYj3bvcjKkxrYBsdF3Yt3kkmlkdiZ +ANpo4iWHWkWC0EDXLqlM1dc8vQKBgQDQJ40pkMXczHFjklnwOtm1ftjXPtIUA2t8 +Wgs+IVua0z+j5G1BiHisRct5pQDgLbMCtRzMvi8a/BrH+LMn9eGBnifJfOMZi7JR +6AYIjYzUVqJNgBLPTCLFjRSGOfLgG3XnS++E5OleftOvXZRuhzgng7ED8dU5KRfh +kjqwz3wNBwKBgAUleryyUjQ71A8uLS9u1FWyHTG4t+/UKaVN/Xlq88chk1iXUJiw +U6bw+M4QHKl+yVx/9ycSjzJTp4WwhKgzF3DBEF2R85wodSHngpECxs1YKttc0dpe +y1/a55avOIKe1Swx1+voVILElKvRgUSN8/3C1y0d/9xdITxZSETFHpmxAoGAK+qc +Us+znzEXHz3qcc/IzQ0VLNyZMBXEoLjStGoPTKwTOj3gezoS063qDyEr/SBHK2QQ +znW1tIjKEbS7/8tVp6Y5mL4bn/EkTzmXxEgxFT+uAJHr5gaXM3zffq5NOtEwX/ta +bnxpbEFv4gjpXyRySYv0VfO429V6r2HNti4gaxMCgYEA0EYdaBjLb+eHsT4aBFa4 +uQg7N/F4JPNFpb7L6u0gCxkPGkmolCJyPMBS26ciDIiGIx9VBxvWsuzLU96nphG9 +xgczWAzbYXeHN6UZw2ASWMyW+ffYqgLlE3it5qj0JiCkWxsjSiStLKm675WkqkxM +LBW22SFBcrXvQLb6CEC5mQQ= -----END PRIVATE KEY----- diff --git a/mysql-test/suite/funcs_1/t/myisam_views-big.test b/mysql-test/suite/funcs_1/t/myisam_views-big.test index 60fe1b8eaba..7199542d3d6 100644 --- a/mysql-test/suite/funcs_1/t/myisam_views-big.test +++ b/mysql-test/suite/funcs_1/t/myisam_views-big.test @@ -4,8 +4,7 @@ # because of a pair of slow Solaris Sparc machines in pb2, # this test is marked as big: --source include/big_test.inc -# This test often times out with MSAN ---source include/not_msan.inc +--source include/not_msan_with_debug.inc # MyISAM tables should be used # diff --git a/mysql-test/suite/galera/r/MDEV-29142.result b/mysql-test/suite/galera/r/MDEV-29142.result index 090960a3761..44a9406aba3 100644 --- a/mysql-test/suite/galera/r/MDEV-29142.result +++ b/mysql-test/suite/galera/r/MDEV-29142.result @@ -42,4 +42,8 @@ connection node_2; call mtr.add_suppression("WSREP: Failed to open table mysql\\.wsrep_streaming_log for writing"); call mtr.add_suppression("WSREP: Failed to open SR table for write"); call mtr.add_suppression("WSREP: Failed to recover SR transactions from schema: wsrep_on : 0"); +connection node_1; +call mtr.add_suppression("WSREP: Cert position .* less than last committed"); +connection node_2; +call mtr.add_suppression("WSREP: Cert position .* less than last committed"); DROP TABLE IF EXISTS t1; diff --git a/mysql-test/suite/galera/r/galera_multi_level_fk_ddl_delete.result b/mysql-test/suite/galera/r/galera_multi_level_fk_ddl_delete.result new file mode 100644 index 00000000000..4199fdcd011 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_multi_level_fk_ddl_delete.result @@ -0,0 +1,362 @@ +connection node_2; +connection node_1; +# +# 1. BF-BF conflict on MDL locks between: DROP TABLE t6 and DELETE on t1 +# with foreign key references as below: +# - t1<-t2<-t3<-t4 +# - t3<-t5 +# - t2<-t6 +# +connection node_2; +SET GLOBAL wsrep_slave_threads=2; +CREATE TABLE t1 ( +id INTEGER PRIMARY KEY, +f2 INTEGER +); +CREATE TABLE t2 ( +id INT PRIMARY KEY, +t1_id INT NOT NULL, +t5_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t1_id(t1_id), +CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE, +KEY key_t5_id(t5_id) +); +CREATE TABLE t3 ( +id INT PRIMARY KEY, +t2_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t2_id(t2_id), +CONSTRAINT key_t2_id FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE +); +CREATE TABLE t4 ( +id INT PRIMARY KEY, +t3_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t3_id(t3_id), +CONSTRAINT key_t3_id FOREIGN KEY (t3_id) REFERENCES t3 (id) ON UPDATE CASCADE ON DELETE CASCADE +); +CREATE TABLE t5 ( +id INT PRIMARY KEY, +t3_id_1 INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t3_id_1(t3_id_1), +CONSTRAINT key_t3_id_1 FOREIGN KEY (t3_id_1) REFERENCES t3 (id) ON UPDATE CASCADE ON DELETE CASCADE +); +CREATE TABLE t6 ( +id INT PRIMARY KEY, +t2_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t2_id_1(t2_id), +CONSTRAINT key_t2_id_1 FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE +); +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); +INSERT INTO t1 VALUES (3,0); +INSERT INTO t2 VALUES (1,1,1,1234); +INSERT INTO t2 VALUES (2,2,2,1234); +INSERT INTO t3 VALUES (1,1,1234); +INSERT INTO t3 VALUES (2,2,1234); +INSERT INTO t4 VALUES (1,1,1234); +INSERT INTO t4 VALUES (2,2,1234); +INSERT INTO t5 VALUES (1,1,1234); +INSERT INTO t5 VALUES (2,2,1234); +ALTER TABLE t2 ADD CONSTRAINT key_t5_id FOREIGN KEY (t5_id) +REFERENCES t5 (id) ON UPDATE CASCADE ON DELETE CASCADE; +connection node_1; +connection node_2; +SET GLOBAL DEBUG_DBUG = '+d,sync.wsrep_apply_toi'; +connection node_1; +DROP TABLE t6; +connection node_2; +SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_toi_reached"; +SET SESSION wsrep_sync_wait = 0; +connection node_1; +SET GLOBAL DEBUG_DBUG = '+d,wsrep_print_foreign_keys_table'; +START TRANSACTION; +DELETE FROM t1 WHERE id = 3; +COMMIT; +connection node_2; +SET GLOBAL DEBUG_DBUG = '-d,sync.wsrep_apply_toi'; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_toi"; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +include/assert_grep.inc [Foreign key referenced table found: 4 tables] +include/assert_grep.inc [Foreign key referenced table found: test.t2] +include/assert_grep.inc [Foreign key referenced table found: test.t3] +include/assert_grep.inc [Foreign key referenced table found: test.t4] +include/assert_grep.inc [Foreign key referenced table found: test.t5] +connection node_2; +select * from t1; +id f2 +1 0 +2 0 +select * from t2; +id t1_id t5_id f2 +1 1 1 1234 +2 2 2 1234 +select * from t3; +id t2_id f2 +1 1 1234 +2 2 1234 +select * from t4; +id t3_id f2 +1 1 1234 +2 2 1234 +select * from t5; +id t3_id_1 f2 +1 1 1234 +2 2 1234 +select * from t6; +ERROR 42S02: Table 'test.t6' doesn't exist +connection node_1; +select * from t1; +id f2 +1 0 +2 0 +select * from t2; +id t1_id t5_id f2 +1 1 1 1234 +2 2 2 1234 +select * from t3; +id t2_id f2 +1 1 1234 +2 2 1234 +select * from t4; +id t3_id f2 +1 1 1234 +2 2 1234 +select * from t5; +id t3_id_1 f2 +1 1 1234 +2 2 1234 +select * from t6; +ERROR 42S02: Table 'test.t6' doesn't exist +ALTER TABLE t2 DROP FOREIGN KEY key_t5_id; +DROP TABLE t5, t4, t3, t2, t1; +# +# 2. BF-BF conflict on MDL locks between: +# ALTER TABLE t3 (whose parent table are t3 -> t2 -> t1), and +# DELETE on t1 with t2 referencing t1, and t3 referencing t2. +# +connection node_2; +SET GLOBAL wsrep_slave_threads=2; +CREATE TABLE t1 ( +id INTEGER PRIMARY KEY, +f2 INTEGER +); +CREATE TABLE t2 ( +id INT PRIMARY KEY, +t1_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t1_id(t1_id), +CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE +); +CREATE TABLE t3 ( +id INT PRIMARY KEY, +t2_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t2_id(t2_id) +); +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); +INSERT INTO t1 VALUES (3,0); +INSERT INTO t2 VALUES (1,1,1234); +INSERT INTO t2 VALUES (2,2,1234); +connection node_2; +SET GLOBAL DEBUG_DBUG = '+d,sync.wsrep_apply_toi'; +connection node_1; +ALTER TABLE t3 ADD CONSTRAINT key_t2_id FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE; +connection node_2; +SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_toi_reached"; +SET SESSION wsrep_sync_wait = 0; +connection node_1; +SET GLOBAL DEBUG_DBUG = '+d,wsrep_print_foreign_keys_table'; +START TRANSACTION; +DELETE FROM t1 WHERE id = 3; +COMMIT; +connection node_2; +SET GLOBAL DEBUG_DBUG = '-d,sync.wsrep_apply_toi'; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_toi"; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +include/assert_grep.inc [Foreign key referenced table found: 2 tables] +include/assert_grep.inc [Foreign key referenced table found: test.t2] +include/assert_grep.inc [Foreign key referenced table found: test.t3] +connection node_2; +select * from t1; +id f2 +1 0 +2 0 +select * from t2; +id t1_id f2 +1 1 1234 +2 2 1234 +select * from t3; +id t2_id f2 +connection node_1; +select * from t1; +id f2 +1 0 +2 0 +select * from t2; +id t1_id f2 +1 1 1234 +2 2 1234 +select * from t3; +id t2_id f2 +DROP TABLE t3, t2, t1; +# +# 3. BF-BF conflict on MDL locks between: +# CREATE TABLE t3 (whose parent table are t3 -> t2 -> t1), and +# DELETE on t1 with t2 referencing t1, and t3 referencing t2. +# +connection node_2; +SET GLOBAL wsrep_slave_threads=2; +CREATE TABLE t1 ( +id INTEGER PRIMARY KEY, +f2 INTEGER +); +CREATE TABLE t2 ( +id INT PRIMARY KEY, +t1_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t1_id(t1_id), +CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE +); +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); +INSERT INTO t1 VALUES (3,0); +INSERT INTO t2 VALUES (1,1,1234); +INSERT INTO t2 VALUES (2,2,1234); +connection node_2; +SET GLOBAL DEBUG_DBUG = '+d,sync.wsrep_apply_toi'; +connection node_1; +CREATE TABLE t3 (id INT PRIMARY KEY, t2_id INT NOT NULL, f2 INTEGER NOT NULL, KEY key_t2_id(t2_id), CONSTRAINT key_t2_id FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE); +connection node_2; +SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_toi_reached"; +SET SESSION wsrep_sync_wait = 0; +connection node_1; +SET GLOBAL DEBUG_DBUG = '+d,wsrep_print_foreign_keys_table'; +START TRANSACTION; +DELETE FROM t1 WHERE id = 3; +COMMIT; +connection node_2; +SET GLOBAL DEBUG_DBUG = '-d,sync.wsrep_apply_toi'; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_toi"; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +include/assert_grep.inc [Foreign key referenced table found: 2 tables] +include/assert_grep.inc [Foreign key referenced table found: test.t2] +include/assert_grep.inc [Foreign key referenced table found: test.t3] +connection node_2; +select * from t1; +id f2 +1 0 +2 0 +select * from t2; +id t1_id f2 +1 1 1234 +2 2 1234 +select * from t3; +id t2_id f2 +connection node_1; +select * from t1; +id f2 +1 0 +2 0 +select * from t2; +id t1_id f2 +1 1 1234 +2 2 1234 +select * from t3; +id t2_id f2 +DROP TABLE t3, t2, t1; +# +# 4. BF-BF conflict on MDL locks between: +# OPTIMIZE TABLE t2 (whose parent table are t2 -> t1), and +# DELETE on t1. +# +connection node_2; +SET GLOBAL wsrep_slave_threads=2; +CREATE TABLE t1 ( +id INTEGER PRIMARY KEY, +f2 INTEGER +); +CREATE TABLE t2 ( +id INT PRIMARY KEY, +t1_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t1_id(t1_id), +CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE +); +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); +INSERT INTO t1 VALUES (3,0); +INSERT INTO t2 VALUES (1,1,1234); +INSERT INTO t2 VALUES (2,2,1234); +connection node_2; +SET GLOBAL DEBUG_DBUG = '+d,sync.wsrep_apply_toi'; +connection node_1; +OPTIMIZE TABLE t2; +Table Op Msg_type Msg_text +test.t2 optimize note Table does not support optimize, doing recreate + analyze instead +test.t2 optimize status OK +connection node_2; +SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_toi_reached"; +SET SESSION wsrep_sync_wait = 0; +connection node_1; +SET GLOBAL DEBUG_DBUG = '+d,wsrep_print_foreign_keys_table'; +START TRANSACTION; +DELETE FROM t1 WHERE id = 3; +COMMIT; +connection node_2; +SET GLOBAL DEBUG_DBUG = '-d,sync.wsrep_apply_toi'; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_toi"; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +include/assert_grep.inc [Foreign key referenced table found: 1 tables] +include/assert_grep.inc [Foreign key referenced table found: test.t2] +connection node_2; +select * from t1; +id f2 +1 0 +2 0 +select * from t2; +id t1_id f2 +1 1 1234 +2 2 1234 +connection node_1; +select * from t1; +id f2 +1 0 +2 0 +select * from t2; +id t1_id f2 +1 1 1234 +2 2 1234 +DROP TABLE t2, t1; diff --git a/mysql-test/suite/galera/r/galera_multi_level_fk_ddl_update.result b/mysql-test/suite/galera/r/galera_multi_level_fk_ddl_update.result new file mode 100644 index 00000000000..9c8a34e7dd7 --- /dev/null +++ b/mysql-test/suite/galera/r/galera_multi_level_fk_ddl_update.result @@ -0,0 +1,358 @@ +connection node_2; +connection node_1; +# +# 1. BF-BF conflict on MDL locks between: DROP TABLE t6 and UPDATE on t1 +# with foreign key references as below: +# - t1<-t2<-t3<-t4 +# - t3<-t5 +# - t2<-t6 +# +connection node_2; +SET GLOBAL wsrep_slave_threads=2; +CREATE TABLE t1 ( +id INTEGER PRIMARY KEY, +f2 INTEGER +); +CREATE TABLE t2 ( +id INT PRIMARY KEY, +t1_id INT NOT NULL, +t5_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t1_id(t1_id), +CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE, +KEY key_t5_id(t5_id) +); +CREATE TABLE t3 ( +id INT PRIMARY KEY, +t2_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t2_id(t2_id), +CONSTRAINT key_t2_id FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE +); +CREATE TABLE t4 ( +id INT PRIMARY KEY, +t3_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t3_id(t3_id), +CONSTRAINT key_t3_id FOREIGN KEY (t3_id) REFERENCES t3 (id) ON UPDATE CASCADE ON DELETE CASCADE +); +CREATE TABLE t5 ( +id INT PRIMARY KEY, +t3_id_1 INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t3_id_1(t3_id_1), +CONSTRAINT key_t3_id_1 FOREIGN KEY (t3_id_1) REFERENCES t3 (id) ON UPDATE CASCADE ON DELETE CASCADE +); +CREATE TABLE t6 ( +id INT PRIMARY KEY, +t2_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t2_id_1(t2_id), +CONSTRAINT key_t2_id_1 FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE +); +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); +INSERT INTO t2 VALUES (1,1,1,1234); +INSERT INTO t2 VALUES (2,2,2,1234); +INSERT INTO t3 VALUES (1,1,1234); +INSERT INTO t3 VALUES (2,2,1234); +INSERT INTO t4 VALUES (1,1,1234); +INSERT INTO t4 VALUES (2,2,1234); +INSERT INTO t5 VALUES (1,1,1234); +INSERT INTO t5 VALUES (2,2,1234); +ALTER TABLE t2 ADD CONSTRAINT key_t5_id FOREIGN KEY (t5_id) +REFERENCES t5 (id) ON UPDATE CASCADE ON DELETE CASCADE; +connection node_1; +connection node_2; +SET GLOBAL DEBUG_DBUG = '+d,sync.wsrep_apply_toi'; +connection node_1; +DROP TABLE t6; +connection node_2; +SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_toi_reached"; +SET SESSION wsrep_sync_wait = 0; +connection node_1; +SET GLOBAL DEBUG_DBUG = '+d,wsrep_print_foreign_keys_table'; +START TRANSACTION; +UPDATE t1 SET f2 = 1 WHERE id=2; +COMMIT; +connection node_2; +SET GLOBAL DEBUG_DBUG = '-d,sync.wsrep_apply_toi'; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_toi"; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +include/assert_grep.inc [Foreign key referenced table found: 4 tables] +include/assert_grep.inc [Foreign key referenced table found: test.t2] +include/assert_grep.inc [Foreign key referenced table found: test.t3] +include/assert_grep.inc [Foreign key referenced table found: test.t4] +include/assert_grep.inc [Foreign key referenced table found: test.t5] +connection node_2; +select * from t1; +id f2 +1 0 +2 1 +select * from t2; +id t1_id t5_id f2 +1 1 1 1234 +2 2 2 1234 +select * from t3; +id t2_id f2 +1 1 1234 +2 2 1234 +select * from t4; +id t3_id f2 +1 1 1234 +2 2 1234 +select * from t5; +id t3_id_1 f2 +1 1 1234 +2 2 1234 +select * from t6; +ERROR 42S02: Table 'test.t6' doesn't exist +connection node_1; +select * from t1; +id f2 +1 0 +2 1 +select * from t2; +id t1_id t5_id f2 +1 1 1 1234 +2 2 2 1234 +select * from t3; +id t2_id f2 +1 1 1234 +2 2 1234 +select * from t4; +id t3_id f2 +1 1 1234 +2 2 1234 +select * from t5; +id t3_id_1 f2 +1 1 1234 +2 2 1234 +select * from t6; +ERROR 42S02: Table 'test.t6' doesn't exist +ALTER TABLE t2 DROP FOREIGN KEY key_t5_id; +DROP TABLE t5, t4, t3, t2, t1; +# +# 2. BF-BF conflict on MDL locks between: +# ALTER TABLE t3 (whose parent table are t3 -> t2 -> t1), and +# UPDATE on t1 with t2 referencing t1, and t3 referencing t2. +# +connection node_2; +SET GLOBAL wsrep_slave_threads=2; +CREATE TABLE t1 ( +id INTEGER PRIMARY KEY, +f2 INTEGER +); +CREATE TABLE t2 ( +id INT PRIMARY KEY, +t1_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t1_id(t1_id), +CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE +); +CREATE TABLE t3 ( +id INT PRIMARY KEY, +t2_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t2_id(t2_id) +); +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); +INSERT INTO t2 VALUES (1,1,1234); +INSERT INTO t2 VALUES (2,2,1234); +connection node_2; +SET GLOBAL DEBUG_DBUG = '+d,sync.wsrep_apply_toi'; +connection node_1; +ALTER TABLE t3 ADD CONSTRAINT key_t2_id FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE; +connection node_2; +SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_toi_reached"; +SET SESSION wsrep_sync_wait = 0; +connection node_1; +SET GLOBAL DEBUG_DBUG = '+d,wsrep_print_foreign_keys_table'; +START TRANSACTION; +UPDATE t1 SET f2 = 1 WHERE id=2; +COMMIT; +connection node_2; +SET GLOBAL DEBUG_DBUG = '-d,sync.wsrep_apply_toi'; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_toi"; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +include/assert_grep.inc [Foreign key referenced table found: 2 tables] +include/assert_grep.inc [Foreign key referenced table found: test.t2] +include/assert_grep.inc [Foreign key referenced table found: test.t3] +connection node_2; +select * from t1; +id f2 +1 0 +2 1 +select * from t2; +id t1_id f2 +1 1 1234 +2 2 1234 +select * from t3; +id t2_id f2 +connection node_1; +select * from t1; +id f2 +1 0 +2 1 +select * from t2; +id t1_id f2 +1 1 1234 +2 2 1234 +select * from t3; +id t2_id f2 +DROP TABLE t3, t2, t1; +# +# 3. BF-BF conflict on MDL locks between: +# CREATE TABLE t3 (whose parent table are t3 -> t2 -> t1), and +# UPDATE on t1 with t2 referencing t1, and t3 referencing t2. +# +connection node_2; +SET GLOBAL wsrep_slave_threads=2; +CREATE TABLE t1 ( +id INTEGER PRIMARY KEY, +f2 INTEGER +); +CREATE TABLE t2 ( +id INT PRIMARY KEY, +t1_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t1_id(t1_id), +CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE +); +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); +INSERT INTO t2 VALUES (1,1,1234); +INSERT INTO t2 VALUES (2,2,1234); +connection node_2; +SET GLOBAL DEBUG_DBUG = '+d,sync.wsrep_apply_toi'; +connection node_1; +CREATE TABLE t3 (id INT PRIMARY KEY, t2_id INT NOT NULL, f2 INTEGER NOT NULL, KEY key_t2_id(t2_id), CONSTRAINT key_t2_id FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE); +connection node_2; +SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_toi_reached"; +SET SESSION wsrep_sync_wait = 0; +connection node_1; +SET GLOBAL DEBUG_DBUG = '+d,wsrep_print_foreign_keys_table'; +START TRANSACTION; +UPDATE t1 SET f2 = 1 WHERE id=2; +COMMIT; +connection node_2; +SET GLOBAL DEBUG_DBUG = '-d,sync.wsrep_apply_toi'; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_toi"; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +include/assert_grep.inc [Foreign key referenced table found: 2 tables] +include/assert_grep.inc [Foreign key referenced table found: test.t2] +include/assert_grep.inc [Foreign key referenced table found: test.t3] +connection node_2; +select * from t1; +id f2 +1 0 +2 1 +select * from t2; +id t1_id f2 +1 1 1234 +2 2 1234 +select * from t3; +id t2_id f2 +connection node_1; +select * from t1; +id f2 +1 0 +2 1 +select * from t2; +id t1_id f2 +1 1 1234 +2 2 1234 +select * from t3; +id t2_id f2 +DROP TABLE t3, t2, t1; +# +# 4. BF-BF conflict on MDL locks between: +# OPTIMIZE TABLE t2 (whose parent table are t2 -> t1), and +# UPDATE on t1. +# +connection node_2; +SET GLOBAL wsrep_slave_threads=2; +CREATE TABLE t1 ( +id INTEGER PRIMARY KEY, +f2 INTEGER +); +CREATE TABLE t2 ( +id INT PRIMARY KEY, +t1_id INT NOT NULL, +f2 INTEGER NOT NULL, +KEY key_t1_id(t1_id), +CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE +); +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); +INSERT INTO t2 VALUES (1,1,1234); +INSERT INTO t2 VALUES (2,2,1234); +connection node_2; +SET GLOBAL DEBUG_DBUG = '+d,sync.wsrep_apply_toi'; +connection node_1; +OPTIMIZE TABLE t2; +Table Op Msg_type Msg_text +test.t2 optimize note Table does not support optimize, doing recreate + analyze instead +test.t2 optimize status OK +connection node_2; +SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_toi_reached"; +SET SESSION wsrep_sync_wait = 0; +connection node_1; +SET GLOBAL DEBUG_DBUG = '+d,wsrep_print_foreign_keys_table'; +START TRANSACTION; +UPDATE t1 SET f2 = 1 WHERE id=2; +COMMIT; +connection node_2; +SET GLOBAL DEBUG_DBUG = '-d,sync.wsrep_apply_toi'; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_toi"; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; +connection node_1; +include/assert_grep.inc [Foreign key referenced table found: 1 tables] +include/assert_grep.inc [Foreign key referenced table found: test.t2] +connection node_2; +select * from t1; +id f2 +1 0 +2 1 +select * from t2; +id t1_id f2 +1 1 1234 +2 2 1234 +connection node_1; +select * from t1; +id f2 +1 0 +2 1 +select * from t2; +id t1_id f2 +1 1 1234 +2 2 1234 +DROP TABLE t2, t1; diff --git a/mysql-test/suite/galera/r/galera_vote_during_ist.result b/mysql-test/suite/galera/r/galera_vote_during_ist.result index adbe0e2fe7d..8d95cd8ee15 100644 --- a/mysql-test/suite/galera/r/galera_vote_during_ist.result +++ b/mysql-test/suite/galera/r/galera_vote_during_ist.result @@ -8,6 +8,8 @@ connection node_2; connection node_3; connection node_4; connection node_1; +SET SESSION wsrep_on = ON; +SET SESSION wsrep_sync_wait = 15; CREATE TABLE t1(pk INT AUTO_INCREMENT PRIMARY KEY); CREATE PROCEDURE p1(IN max INT) BEGIN @@ -48,6 +50,8 @@ CREATE TABLE t2(pk INT AUTO_INCREMENT PRIMARY KEY); SET SESSION wsrep_on = ON; INSERT INTO t2 VALUES (DEFAULT); CALL p1(130); +connection node_2; +connection node_3; connection node_1; SET GLOBAL debug = "+d,sync.wsrep_sst_donor_after_donation"; Restarting server 4 @@ -58,8 +62,6 @@ SET SESSION DEBUG_SYNC = "now SIGNAL signal.wsrep_sst_donor_after_donation_conti SET GLOBAL debug = ""; SET DEBUG_SYNC='RESET'; Waiting for server 4 to leave the cluster -SET SESSION wsrep_on = ON; -SET SESSION wsrep_sync_wait = 15; connection node_2; SET SESSION wsrep_on = ON; SET SESSION wsrep_sync_wait = 15; @@ -69,10 +71,18 @@ SET SESSION wsrep_sync_wait = 15; connection node_4; Server 4 left the cluster, killing it... Killed server 4... +connection node_1; +connection node_4; Restarting server 4... connection node_1; SET SESSION wsrep_on = ON; SET SESSION wsrep_sync_wait = 15; +connection node_2; +SET SESSION wsrep_on = ON; +SET SESSION wsrep_sync_wait = 15; +connection node_3; +SET SESSION wsrep_on = ON; +SET SESSION wsrep_sync_wait = 15; connection node_1; SELECT count(*) AS expect1_390 FROM t1; expect1_390 diff --git a/mysql-test/suite/galera/t/MDEV-29142.test b/mysql-test/suite/galera/t/MDEV-29142.test index efcfbf81b87..36167af1aa6 100644 --- a/mysql-test/suite/galera/t/MDEV-29142.test +++ b/mysql-test/suite/galera/t/MDEV-29142.test @@ -53,16 +53,26 @@ SET SESSION wsrep_sync_wait = 0; --let $start_mysqld_params =--wsrep-new-cluster --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --source include/start_mysqld.inc +--source include/wait_until_ready.inc --connection node_2 --let $start_mysqld_params = --let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.2.expect --source include/start_mysqld.inc +--source include/wait_until_ready.inc call mtr.add_suppression("WSREP: Failed to open table mysql\\.wsrep_streaming_log for writing"); call mtr.add_suppression("WSREP: Failed to open SR table for write"); call mtr.add_suppression("WSREP: Failed to recover SR transactions from schema: wsrep_on : 0"); +--connection node_1 +# +# after the membership change on a newly synced node, then this is just a warning +# +call mtr.add_suppression("WSREP: Cert position .* less than last committed"); +--connection node_2 +call mtr.add_suppression("WSREP: Cert position .* less than last committed"); + # # Cleanup # diff --git a/mysql-test/suite/galera/t/galera_multi_level_fk_ddl_delete.test b/mysql-test/suite/galera/t/galera_multi_level_fk_ddl_delete.test new file mode 100644 index 00000000000..b1c3e6d5352 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_multi_level_fk_ddl_delete.test @@ -0,0 +1,452 @@ +# +# BF-BF conflict on MDL locks between DDL and delete query +# when multi-level foreign key like t3 -> t2 -> t1 +# are present. +# +# If bug is present, expect the wait condition +# to timeout and when the DELETE applies, it +# will be granted a MDL lock of type SHARED_READ +# for table t1. When resumed, the DROP TABLE will +# also try to MDL lock t1, causing a BF-BF conflict +# on that MDL lock. + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +--echo # +--echo # 1. BF-BF conflict on MDL locks between: DROP TABLE t6 and DELETE on t1 +--echo # with foreign key references as below: +--echo # - t1<-t2<-t3<-t4 +--echo # - t3<-t5 +--echo # - t2<-t6 +--echo # + + +# +# Setup +# +--connection node_2 +SET GLOBAL wsrep_slave_threads=2; + +CREATE TABLE t1 ( + id INTEGER PRIMARY KEY, + f2 INTEGER +); + +CREATE TABLE t2 ( + id INT PRIMARY KEY, + t1_id INT NOT NULL, + t5_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t1_id(t1_id), + CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE, + KEY key_t5_id(t5_id) +); + +CREATE TABLE t3 ( + id INT PRIMARY KEY, + t2_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t2_id(t2_id), + CONSTRAINT key_t2_id FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE +); + +CREATE TABLE t4 ( + id INT PRIMARY KEY, + t3_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t3_id(t3_id), + CONSTRAINT key_t3_id FOREIGN KEY (t3_id) REFERENCES t3 (id) ON UPDATE CASCADE ON DELETE CASCADE +); + +CREATE TABLE t5 ( + id INT PRIMARY KEY, + t3_id_1 INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t3_id_1(t3_id_1), + CONSTRAINT key_t3_id_1 FOREIGN KEY (t3_id_1) REFERENCES t3 (id) ON UPDATE CASCADE ON DELETE CASCADE +); + +CREATE TABLE t6 ( + id INT PRIMARY KEY, + t2_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t2_id_1(t2_id), + CONSTRAINT key_t2_id_1 FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE +); + + +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); +INSERT INTO t1 VALUES (3,0); + +INSERT INTO t2 VALUES (1,1,1,1234); +INSERT INTO t2 VALUES (2,2,2,1234); + +INSERT INTO t3 VALUES (1,1,1234); +INSERT INTO t3 VALUES (2,2,1234); + +INSERT INTO t4 VALUES (1,1,1234); +INSERT INTO t4 VALUES (2,2,1234); + +INSERT INTO t5 VALUES (1,1,1234); +INSERT INTO t5 VALUES (2,2,1234); + +ALTER TABLE t2 ADD CONSTRAINT key_t5_id FOREIGN KEY (t5_id) +REFERENCES t5 (id) ON UPDATE CASCADE ON DELETE CASCADE; + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = "t2" AND CONSTRAINT_TYPE = "FOREIGN KEY" AND CONSTRAINT_NAME="key_t5_id" +--source include/wait_condition.inc + + +--let $fk_parent_query = DROP TABLE t6 +--let $fk_child_query = DELETE FROM t1 WHERE id = 3 +--let $fk_mdl_lock_num = 5 +--source galera_multi_level_foreign_key.inc + + +# +# Verify Foreign key for referenced table added. +# +--connection node_1 +--let assert_text= Foreign key referenced table found: 4 tables +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 4 +--let assert_select= Foreign key referenced table found: +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_delete +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t2 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 1 +--let assert_select= Foreign key referenced table found: test.t2 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_delete +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t3 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 1 +--let assert_select= Foreign key referenced table found: test.t3 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_delete +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t4 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 1 +--let assert_select= Foreign key referenced table found: test.t4 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_delete +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t5 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 1 +--let assert_select= Foreign key referenced table found: test.t5 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_delete +--source include/assert_grep.inc + + +# +# Verify delete and drop table has succeded. +# +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 2 FROM test.t1 +--source include/wait_condition.inc + +select * from t1; +select * from t2; +select * from t3; +select * from t4; +select * from t5; +--error ER_NO_SUCH_TABLE +select * from t6; + +--connection node_1 +select * from t1; +select * from t2; +select * from t3; +select * from t4; +select * from t5; +--error ER_NO_SUCH_TABLE +select * from t6; + + +# +# Cleanup +# +ALTER TABLE t2 DROP FOREIGN KEY key_t5_id; +DROP TABLE t5, t4, t3, t2, t1; + + +--echo # +--echo # 2. BF-BF conflict on MDL locks between: +--echo # ALTER TABLE t3 (whose parent table are t3 -> t2 -> t1), and +--echo # DELETE on t1 with t2 referencing t1, and t3 referencing t2. +--echo # + +# +# Setup +# +--connection node_2 +SET GLOBAL wsrep_slave_threads=2; + +CREATE TABLE t1 ( + id INTEGER PRIMARY KEY, + f2 INTEGER +); + +CREATE TABLE t2 ( + id INT PRIMARY KEY, + t1_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t1_id(t1_id), + CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE +); + +CREATE TABLE t3 ( + id INT PRIMARY KEY, + t2_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t2_id(t2_id) +); + +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); +INSERT INTO t1 VALUES (3,0); + +INSERT INTO t2 VALUES (1,1,1234); +INSERT INTO t2 VALUES (2,2,1234); + + +# +# ALTER TABLE t3 and wait for it to reach node_2 +# +--let $fk_parent_query = ALTER TABLE t3 ADD CONSTRAINT key_t2_id FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE +# +# Issue a DELETE to table that references t1 +# +--let $fk_child_query = DELETE FROM t1 WHERE id = 3 +--let $fk_mdl_lock_num = 3 +--source galera_multi_level_foreign_key.inc + + +# +# Verify Foreign key for referenced table added. +# +--connection node_1 +--let assert_text= Foreign key referenced table found: 2 tables +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 6 +--let assert_select= Foreign key referenced table found: +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_delete +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t2 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 2 +--let assert_select= Foreign key referenced table found: test.t2 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_delete +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t3 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 2 +--let assert_select= Foreign key referenced table found: test.t3 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_delete +--source include/assert_grep.inc + + +# +# Verify delete and alter table has succeded. +# +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 2 FROM test.t1 +--source include/wait_condition.inc + +select * from t1; +select * from t2; +select * from t3; + +--connection node_1 +select * from t1; +select * from t2; +select * from t3; + + +# +# Cleanup +# +DROP TABLE t3, t2, t1; + + +--echo # +--echo # 3. BF-BF conflict on MDL locks between: +--echo # CREATE TABLE t3 (whose parent table are t3 -> t2 -> t1), and +--echo # DELETE on t1 with t2 referencing t1, and t3 referencing t2. +--echo # + +# +# Setup +# +--connection node_2 +SET GLOBAL wsrep_slave_threads=2; + +CREATE TABLE t1 ( + id INTEGER PRIMARY KEY, + f2 INTEGER +); + +CREATE TABLE t2 ( + id INT PRIMARY KEY, + t1_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t1_id(t1_id), + CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE +); + + +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); +INSERT INTO t1 VALUES (3,0); + +INSERT INTO t2 VALUES (1,1,1234); +INSERT INTO t2 VALUES (2,2,1234); + + +--let $fk_parent_query = CREATE TABLE t3 (id INT PRIMARY KEY, t2_id INT NOT NULL, f2 INTEGER NOT NULL, KEY key_t2_id(t2_id), CONSTRAINT key_t2_id FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE) +--let $fk_child_query = DELETE FROM t1 WHERE id = 3 +--let $fk_mdl_lock_num = 3 +--source galera_multi_level_foreign_key.inc + + +# +# Verify Foreign key for referenced table added. +# +--connection node_1 +--let assert_text= Foreign key referenced table found: 2 tables +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 8 +--let assert_select= Foreign key referenced table found: +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_delete +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t2 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 3 +--let assert_select= Foreign key referenced table found: test.t2 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_delete +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t3 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 3 +--let assert_select= Foreign key referenced table found: test.t3 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_delete +--source include/assert_grep.inc + + +# +# Verify delete and create table has succeded. +# +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 2 FROM test.t1 +--source include/wait_condition.inc + +select * from t1; +select * from t2; +select * from t3; + +--connection node_1 +select * from t1; +select * from t2; +select * from t3; + + +# +# Cleanup +# +DROP TABLE t3, t2, t1; + + +--echo # +--echo # 4. BF-BF conflict on MDL locks between: +--echo # OPTIMIZE TABLE t2 (whose parent table are t2 -> t1), and +--echo # DELETE on t1. +--echo # + +# +# Setup +# +--connection node_2 +SET GLOBAL wsrep_slave_threads=2; + +CREATE TABLE t1 ( + id INTEGER PRIMARY KEY, + f2 INTEGER +); + +CREATE TABLE t2 ( + id INT PRIMARY KEY, + t1_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t1_id(t1_id), + CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE +); + + +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); +INSERT INTO t1 VALUES (3,0); + +INSERT INTO t2 VALUES (1,1,1234); +INSERT INTO t2 VALUES (2,2,1234); + + +--let $fk_parent_query = OPTIMIZE TABLE t2 +--let $fk_child_query = DELETE FROM t1 WHERE id = 3 +--let $fk_mdl_lock_num = 2 +--source galera_multi_level_foreign_key.inc + + +# +# Verify Foreign key for referenced table added. +# +--connection node_1 +--let assert_text= Foreign key referenced table found: 1 tables +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 9 +--let assert_select= Foreign key referenced table found: +--let $assert_only_after = CURRENT_TEST: +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_delete +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t2 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 4 +--let assert_select= Foreign key referenced table found: test.t2 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_delete +--source include/assert_grep.inc + + +# +# Verify delete and create table has succeded. +# +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 2 FROM test.t1 +--source include/wait_condition.inc + + +select * from t1; +select * from t2; + +--connection node_1 +select * from t1; +select * from t2; + + +# +# Cleanup +# +DROP TABLE t2, t1; diff --git a/mysql-test/suite/galera/t/galera_multi_level_fk_ddl_update.test b/mysql-test/suite/galera/t/galera_multi_level_fk_ddl_update.test new file mode 100644 index 00000000000..1dea0021901 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_multi_level_fk_ddl_update.test @@ -0,0 +1,451 @@ +# +# BF-BF conflict on MDL locks between DDL and update query +# when multi-level foreign key like t3 -> t2 -> t1 +# are present. +# +# If bug is present, expect the wait condition +# to timeout and when the UPDATE applies, it +# will be granted a MDL lock of type SHARED_READ +# for table t1. When resumed, the DROP TABLE will +# also try to MDL lock t1, causing a BF-BF conflict +# on that MDL lock. + +--source include/galera_cluster.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + +--echo # +--echo # 1. BF-BF conflict on MDL locks between: DROP TABLE t6 and UPDATE on t1 +--echo # with foreign key references as below: +--echo # - t1<-t2<-t3<-t4 +--echo # - t3<-t5 +--echo # - t2<-t6 +--echo # + + +# +# Setup +# +--connection node_2 +SET GLOBAL wsrep_slave_threads=2; + +CREATE TABLE t1 ( + id INTEGER PRIMARY KEY, + f2 INTEGER +); + +CREATE TABLE t2 ( + id INT PRIMARY KEY, + t1_id INT NOT NULL, + t5_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t1_id(t1_id), + CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE, + KEY key_t5_id(t5_id) +); + +CREATE TABLE t3 ( + id INT PRIMARY KEY, + t2_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t2_id(t2_id), + CONSTRAINT key_t2_id FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE +); + +CREATE TABLE t4 ( + id INT PRIMARY KEY, + t3_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t3_id(t3_id), + CONSTRAINT key_t3_id FOREIGN KEY (t3_id) REFERENCES t3 (id) ON UPDATE CASCADE ON DELETE CASCADE +); + +CREATE TABLE t5 ( + id INT PRIMARY KEY, + t3_id_1 INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t3_id_1(t3_id_1), + CONSTRAINT key_t3_id_1 FOREIGN KEY (t3_id_1) REFERENCES t3 (id) ON UPDATE CASCADE ON DELETE CASCADE +); + +CREATE TABLE t6 ( + id INT PRIMARY KEY, + t2_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t2_id_1(t2_id), + CONSTRAINT key_t2_id_1 FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE +); + + +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); + +INSERT INTO t2 VALUES (1,1,1,1234); +INSERT INTO t2 VALUES (2,2,2,1234); + +INSERT INTO t3 VALUES (1,1,1234); +INSERT INTO t3 VALUES (2,2,1234); + +INSERT INTO t4 VALUES (1,1,1234); +INSERT INTO t4 VALUES (2,2,1234); + +INSERT INTO t5 VALUES (1,1,1234); +INSERT INTO t5 VALUES (2,2,1234); + +ALTER TABLE t2 ADD CONSTRAINT key_t5_id FOREIGN KEY (t5_id) +REFERENCES t5 (id) ON UPDATE CASCADE ON DELETE CASCADE; + +--connection node_1 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = "t2" AND CONSTRAINT_TYPE = "FOREIGN KEY" AND CONSTRAINT_NAME="key_t5_id" +--source include/wait_condition.inc + + +--let $fk_parent_query = DROP TABLE t6 +--let $fk_child_query = UPDATE t1 SET f2 = 1 WHERE id=2 +--let $fk_mdl_lock_num = 5 +--source galera_multi_level_foreign_key.inc + + +# +# Verify Foreign key for referenced table added. +# +--connection node_1 +--let assert_text= Foreign key referenced table found: 4 tables +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 4 +--let assert_select= Foreign key referenced table found: +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_update +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t2 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 1 +--let assert_select= Foreign key referenced table found: test.t2 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_update +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t3 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 1 +--let assert_select= Foreign key referenced table found: test.t3 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_update +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t4 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 1 +--let assert_select= Foreign key referenced table found: test.t4 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_update +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t5 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 1 +--let assert_select= Foreign key referenced table found: test.t5 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_update +--source include/assert_grep.inc + + +# +# Verify update and drop table has succeded. +# +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM test.t1 where id=2 and f2=1; +--source include/wait_condition.inc + +select * from t1; +select * from t2; +select * from t3; +select * from t4; +select * from t5; +--error ER_NO_SUCH_TABLE +select * from t6; + +--connection node_1 +select * from t1; +select * from t2; +select * from t3; +select * from t4; +select * from t5; +--error ER_NO_SUCH_TABLE +select * from t6; + + +# +# Cleanup +# +ALTER TABLE t2 DROP FOREIGN KEY key_t5_id; +DROP TABLE t5, t4, t3, t2, t1; + + +--echo # +--echo # 2. BF-BF conflict on MDL locks between: +--echo # ALTER TABLE t3 (whose parent table are t3 -> t2 -> t1), and +--echo # UPDATE on t1 with t2 referencing t1, and t3 referencing t2. +--echo # + +# +# Setup +# +--connection node_2 +SET GLOBAL wsrep_slave_threads=2; + +CREATE TABLE t1 ( + id INTEGER PRIMARY KEY, + f2 INTEGER +); + +CREATE TABLE t2 ( + id INT PRIMARY KEY, + t1_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t1_id(t1_id), + CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE +); + +CREATE TABLE t3 ( + id INT PRIMARY KEY, + t2_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t2_id(t2_id) +); + +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); + +INSERT INTO t2 VALUES (1,1,1234); +INSERT INTO t2 VALUES (2,2,1234); + + +# +# ALTER TABLE t3 and wait for it to reach node_2 +# +--let $fk_parent_query = ALTER TABLE t3 ADD CONSTRAINT key_t2_id FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE +# +# Issue a UPDATE to table that references t1 +# Notice that we update field f2, not the primary key, +# and not foreign key. Bug does not manifest if we update +# one of those fields (because FK keys appended in those cases). +# +--let $fk_child_query = UPDATE t1 SET f2 = 1 WHERE id=2 +--let $fk_mdl_lock_num = 3 +--source galera_multi_level_foreign_key.inc + + +# +# Verify Foreign key for referenced table added. +# +--connection node_1 +--let assert_text= Foreign key referenced table found: 2 tables +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 6 +--let assert_select= Foreign key referenced table found: +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_update +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t2 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 2 +--let assert_select= Foreign key referenced table found: test.t2 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_update +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t3 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 2 +--let assert_select= Foreign key referenced table found: test.t3 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_update +--source include/assert_grep.inc + + +# +# Verify update and drop table has succeded. +# +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM test.t1 where id=2 and f2=1; +--source include/wait_condition.inc + +select * from t1; +select * from t2; +select * from t3; + +--connection node_1 +select * from t1; +select * from t2; +select * from t3; + + +# +# Cleanup +# +DROP TABLE t3, t2, t1; + + +--echo # +--echo # 3. BF-BF conflict on MDL locks between: +--echo # CREATE TABLE t3 (whose parent table are t3 -> t2 -> t1), and +--echo # UPDATE on t1 with t2 referencing t1, and t3 referencing t2. +--echo # + +# +# Setup +# +--connection node_2 +SET GLOBAL wsrep_slave_threads=2; + +CREATE TABLE t1 ( + id INTEGER PRIMARY KEY, + f2 INTEGER +); + +CREATE TABLE t2 ( + id INT PRIMARY KEY, + t1_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t1_id(t1_id), + CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE +); + + +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); + +INSERT INTO t2 VALUES (1,1,1234); +INSERT INTO t2 VALUES (2,2,1234); + + +--let $fk_parent_query = CREATE TABLE t3 (id INT PRIMARY KEY, t2_id INT NOT NULL, f2 INTEGER NOT NULL, KEY key_t2_id(t2_id), CONSTRAINT key_t2_id FOREIGN KEY (t2_id) REFERENCES t2 (id) ON UPDATE CASCADE ON DELETE CASCADE) +--let $fk_child_query = UPDATE t1 SET f2 = 1 WHERE id=2 +--let $fk_mdl_lock_num = 3 +--source galera_multi_level_foreign_key.inc + + +# +# Verify Foreign key for referenced table added. +# +--connection node_1 +--let assert_text= Foreign key referenced table found: 2 tables +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 8 +--let assert_select= Foreign key referenced table found: +--let $assert_only_after = CURRENT_TEST: +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_update +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t2 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 3 +--let assert_select= Foreign key referenced table found: test.t2 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_update +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t3 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 3 +--let assert_select= Foreign key referenced table found: test.t3 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_update +--source include/assert_grep.inc + + +# +# Verify update and drop table has succeded. +# +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM test.t1 where id=2 and f2=1; +--source include/wait_condition.inc + +select * from t1; +select * from t2; +select * from t3; + +--connection node_1 +select * from t1; +select * from t2; +select * from t3; + + +# +# Cleanup +# +DROP TABLE t3, t2, t1; + + +--echo # +--echo # 4. BF-BF conflict on MDL locks between: +--echo # OPTIMIZE TABLE t2 (whose parent table are t2 -> t1), and +--echo # UPDATE on t1. +--echo # + +# +# Setup +# +--connection node_2 +SET GLOBAL wsrep_slave_threads=2; + +CREATE TABLE t1 ( + id INTEGER PRIMARY KEY, + f2 INTEGER +); + +CREATE TABLE t2 ( + id INT PRIMARY KEY, + t1_id INT NOT NULL, + f2 INTEGER NOT NULL, + KEY key_t1_id(t1_id), + CONSTRAINT key_t1_id FOREIGN KEY (t1_id) REFERENCES t1 (id) ON UPDATE CASCADE ON DELETE CASCADE +); + + +INSERT INTO t1 VALUES (1,0); +INSERT INTO t1 VALUES (2,0); + +INSERT INTO t2 VALUES (1,1,1234); +INSERT INTO t2 VALUES (2,2,1234); + + +--let $fk_parent_query = OPTIMIZE TABLE t2 +--let $fk_child_query = UPDATE t1 SET f2 = 1 WHERE id=2 +--let $fk_mdl_lock_num = 2 +--source galera_multi_level_foreign_key.inc + + +# +# Verify Foreign key for referenced table added. +# +--connection node_1 +--let assert_text= Foreign key referenced table found: 1 tables +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 9 +--let assert_select= Foreign key referenced table found: +--let $assert_only_after = CURRENT_TEST: +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_update +--source include/assert_grep.inc + +--let assert_text= Foreign key referenced table found: test.t2 +--let $assert_file= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let assert_count= 4 +--let assert_select= Foreign key referenced table found: test.t2 +--let assert_only_after= CURRENT_TEST: galera.galera_multi_level_fk_ddl_update +--source include/assert_grep.inc + + +# +# Verify update has succeded. +# +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 1 FROM test.t1 where id=2 and f2=1; +--source include/wait_condition.inc + +select * from t1; +select * from t2; + +--connection node_1 +select * from t1; +select * from t2; + + +# +# Cleanup +# +DROP TABLE t2, t1; diff --git a/mysql-test/suite/galera/t/galera_multi_level_foreign_key.inc b/mysql-test/suite/galera/t/galera_multi_level_foreign_key.inc new file mode 100644 index 00000000000..598019b0a43 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_multi_level_foreign_key.inc @@ -0,0 +1,60 @@ +# +# Execute parent query on node_1 and wait for it to reach node_2 +# +--connection node_2 +SET GLOBAL DEBUG_DBUG = '+d,sync.wsrep_apply_toi'; + +--connection node_1 +--eval $fk_parent_query + +--connection node_2 +SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_toi_reached"; + +SET SESSION wsrep_sync_wait = 0; +--let $expected_apply_waits = query_get_value("SHOW STATUS LIKE 'wsrep_apply_waits'", Value, 1) +--let $expected_apply_waits = `select $expected_apply_waits + 1` + + +# +# Execute child query on node_1. +# If bug is present, expect the wait condition +# to timeout and when the child query applies, it +# will be granted a MDL lock on parent table. +# When resumed, the parent query will +# also try to acquire MDL lock on parent table, +# causing a BF-BF conflict on that MDL lock. +# +--connection node_1 +SET GLOBAL DEBUG_DBUG = '+d,wsrep_print_foreign_keys_table'; +START TRANSACTION; +--eval $fk_child_query +--let $wait_condition = SELECT COUNT(*) = $fk_mdl_lock_num FROM performance_schema.metadata_locks WHERE OBJECT_SCHEMA='test' AND LOCK_STATUS="GRANTED" +--source include/wait_condition.inc +COMMIT; + + +# +# Expect the child query to depend on the parent query, +# therefore it should wait for the parent query to +# finish before it can be applied. +# +--connection node_2 +--let $status_var = wsrep_apply_waits +--let $status_var_value = $expected_apply_waits +--source include/wait_for_status_var.inc + +SET GLOBAL DEBUG_DBUG = '-d,sync.wsrep_apply_toi'; +SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_toi"; + + +# +# Cleanup +# +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; + +--connection node_1 +SET DEBUG_SYNC = 'RESET'; +SET GLOBAL DEBUG_DBUG = ""; +SET GLOBAL wsrep_slave_threads=DEFAULT; diff --git a/mysql-test/suite/galera/t/galera_ssl_cipher.cnf b/mysql-test/suite/galera/t/galera_ssl_cipher.cnf index 776c321d800..92380428b83 100644 --- a/mysql-test/suite/galera/t/galera_ssl_cipher.cnf +++ b/mysql-test/suite/galera/t/galera_ssl_cipher.cnf @@ -5,7 +5,7 @@ loose-galera-ssl-cipher=1 wsrep-debug=1 [mysqld.1] -wsrep_provider_options='socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem;cert.log_conflicts=YES;repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.wait_prim_timeout=PT60S;gcache.size=10M' +wsrep_provider_options='socket.ssl=yes;socket.ssl_ca=@ENV.MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem;cert.log_conflicts=YES;repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.wait_prim_timeout=PT60S;gcache.size=10M' [mysqld.2] -wsrep_provider_options='socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem;cert.log_conflicts=YES;repl.causal_read_timeout=PT90S;base_port=@mysqld.2.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.wait_prim_timeout=PT60S;gcache.size=10M' +wsrep_provider_options='socket.ssl=yes;socket.ssl_ca=@ENV.MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem;cert.log_conflicts=YES;repl.causal_read_timeout=PT90S;base_port=@mysqld.2.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.wait_prim_timeout=PT60S;gcache.size=10M' diff --git a/mysql-test/suite/galera/t/galera_ssl_upgrade.cnf b/mysql-test/suite/galera/t/galera_ssl_upgrade.cnf index ee8c6e590f4..1635c898d27 100644 --- a/mysql-test/suite/galera/t/galera_ssl_upgrade.cnf +++ b/mysql-test/suite/galera/t/galera_ssl_upgrade.cnf @@ -5,7 +5,7 @@ loose-galera-ssl-upgrade=1 wsrep-debug=1 [mysqld.1] -wsrep_provider_options='socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem;repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.wait_prim_timeout=PT60S;gcache.size=10M' +wsrep_provider_options='socket.ssl=yes;socket.ssl_ca=@ENV.MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem;repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.wait_prim_timeout=PT60S;gcache.size=10M' [mysqld.2] -wsrep_provider_options='socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem;repl.causal_read_timeout=PT90S;base_port=@mysqld.2.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.wait_prim_timeout=PT60S;gcache.size=10M' +wsrep_provider_options='socket.ssl=yes;socket.ssl_ca=@ENV.MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem;repl.causal_read_timeout=PT90S;base_port=@mysqld.2.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.wait_prim_timeout=PT60S;gcache.size=10M' diff --git a/mysql-test/suite/galera/t/galera_toi_ddl_nonconflicting.test b/mysql-test/suite/galera/t/galera_toi_ddl_nonconflicting.test index 9836aaa57ef..cc65e6bda9d 100644 --- a/mysql-test/suite/galera/t/galera_toi_ddl_nonconflicting.test +++ b/mysql-test/suite/galera/t/galera_toi_ddl_nonconflicting.test @@ -61,6 +61,8 @@ SET SESSION wsrep_sync_wait=0; --source include/wait_condition.inc --let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME = 't1'; --source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1001 FROM t1; +--source include/wait_condition.inc SELECT COUNT(*) AS EXPECT_3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; SELECT COUNT(*) AS EXPECT_2 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME = 't1'; @@ -72,6 +74,8 @@ SELECT COUNT(*) AS EXPECT_1001 FROM t1; --source include/wait_condition.inc --let $wait_condition = SELECT COUNT(*) = 2 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME = 't1'; --source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1001 FROM t1; +--source include/wait_condition.inc SELECT COUNT(*) AS EXPECT_3 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 't1'; SELECT COUNT(*) AS EXPECT_2 FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_NAME = 't1'; diff --git a/mysql-test/suite/galera/t/galera_vote_during_ist.test b/mysql-test/suite/galera/t/galera_vote_during_ist.test index eff7f527300..fc319a767da 100644 --- a/mysql-test/suite/galera/t/galera_vote_during_ist.test +++ b/mysql-test/suite/galera/t/galera_vote_during_ist.test @@ -20,6 +20,10 @@ source ../wsrep/include/check_galera_version.inc; # create table t1 and procedure p1 to generate wirtesets --connection node_1 + +--let $members = 4 +--source include/wsrep_wait_membership.inc + CREATE TABLE t1(pk INT AUTO_INCREMENT PRIMARY KEY); DELIMITER |; @@ -39,11 +43,17 @@ DELIMITER ;| CALL p1(130); --connection node_4 +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 130 FROM t1; +--source include/wait_condition.inc + --echo Shutting down server 4... --let $node_4_server_id= `SELECT @@server_id` --let $node_4_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$node_4_server_id.expect --let $node_4_pid_file= `SELECT @@pid_file` --source include/shutdown_mysqld.inc +--source include/wait_until_disconnected.inc # Wait for node #4 to leave cluster --let $members = 3 @@ -65,16 +75,23 @@ CALL p1(130); SET SESSION wsrep_on = OFF; CREATE TABLE t2(pk INT AUTO_INCREMENT PRIMARY KEY); SET SESSION wsrep_on = ON; +--source include/wait_until_ready.inc --connection node_2 +--let $wait_condition = SELECT COUNT(*) = 260 FROM t1; +--source include/wait_condition.inc SET SESSION wsrep_on = OFF; CREATE TABLE t2(pk INT AUTO_INCREMENT PRIMARY KEY); SET SESSION wsrep_on = ON; +--source include/wait_until_ready.inc --connection node_3 +--let $wait_condition = SELECT COUNT(*) = 260 FROM t1; +--source include/wait_condition.inc SET SESSION wsrep_on = OFF; CREATE TABLE t2(pk INT AUTO_INCREMENT PRIMARY KEY); SET SESSION wsrep_on = ON; +--source include/wait_until_ready.inc # This should cause error during IST INSERT INTO t2 VALUES (DEFAULT); @@ -82,6 +99,13 @@ INSERT INTO t2 VALUES (DEFAULT); # make sure nodes 1,2,3 progress far enough for commit cut update CALL p1(130); +--connection node_2 +--let $wait_condition = SELECT COUNT(*) = 390 FROM t1; +--source include/wait_condition.inc +--connection node_3 +--let $wait_condition = SELECT COUNT(*) = 390 FROM t1; +--source include/wait_condition.inc + --connection node_1 # prepare to stop SST donor thread when it receives a request from starting node #4 SET GLOBAL debug = "+d,sync.wsrep_sst_donor_after_donation"; @@ -96,14 +120,12 @@ SET SESSION DEBUG_SYNC = "now WAIT_FOR sync.wsrep_sst_donor_after_donation_reach SET SESSION DEBUG_SYNC = "now SIGNAL signal.wsrep_sst_donor_after_donation_continue"; SET GLOBAL debug = ""; SET DEBUG_SYNC='RESET'; - # # After this point node #4 shall proceed to IST and bail out # --echo Waiting for server 4 to leave the cluster --let $members = 3 ---source include/wsrep_wait_membership.inc --connection node_2 --source include/wsrep_wait_membership.inc --connection node_3 @@ -124,14 +146,27 @@ SET DEBUG_SYNC='RESET'; EOF --echo Killed server 4... --source include/wait_until_disconnected.inc + +--connection node_1 +--source include/wait_until_ready.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +--let $wait_condition_on_error_output = SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +--source include/wait_condition_with_debug.inc + +--connection node_4 --echo Restarting server 4... --source include/start_mysqld.inc --source include/galera_wait_ready.inc + # Confirm node #4 has rejoined --connection node_1 --let $members = 4 --source include/wsrep_wait_membership.inc +--connection node_2 +--source include/wsrep_wait_membership.inc +--connection node_3 +--source include/wsrep_wait_membership.inc # Confirm that all is good and all nodes have identical data @@ -148,6 +183,10 @@ SELECT count(*) AS expect3_390 FROM t1; SELECT count(*) AS expect3_1 FROM t2; --connection node_4 +--let $wait_condition = SELECT COUNT(*) = 390 FROM t1; +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM t2; +--source include/wait_condition.inc SELECT count(*) AS expect4_390 FROM t1; SELECT count(*) AS expect4_1 FROM t2; diff --git a/mysql-test/suite/galera_3nodes/r/GCF-354.result b/mysql-test/suite/galera_3nodes/r/GCF-354.result index 3fdd44fe9d3..cbf4e8fb147 100644 --- a/mysql-test/suite/galera_3nodes/r/GCF-354.result +++ b/mysql-test/suite/galera_3nodes/r/GCF-354.result @@ -47,9 +47,13 @@ CALL mtr.add_suppression("Slave SQL: Error 'Unknown database 'test'' on query\\. CALL mtr.add_suppression("Query apply failed"); CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown"); +CALL mtr.add_suppression("WSREP: Cert position .* less than last committed"); +CALL mtr.add_suppression("WSREP: Sending JOIN failed: "); connection node_3; Node 3 synced CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query\\. Default database: 'test'\\. Query: 'CREATE TABLE test\\.t1 \\(f1 INTEGER\\)', Error_code: 1050"); CALL mtr.add_suppression("Query apply failed"); CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown"); +CALL mtr.add_suppression("WSREP: Cert position .* less than last committed"); +CALL mtr.add_suppression("WSREP: Sending JOIN failed: "); diff --git a/mysql-test/suite/galera_3nodes/r/galera_evs_suspect_timeout.result b/mysql-test/suite/galera_3nodes/r/galera_evs_suspect_timeout.result index 2ecd5edfa99..5faa862ddb6 100644 --- a/mysql-test/suite/galera_3nodes/r/galera_evs_suspect_timeout.result +++ b/mysql-test/suite/galera_3nodes/r/galera_evs_suspect_timeout.result @@ -12,10 +12,12 @@ connection node_3; Suspending node ... connection node_1; SET SESSION wsrep_sync_wait=0; +connection node_2; +SET SESSION wsrep_sync_wait=0; +connection node_1; CREATE TABLE t1 (f1 INTEGER) engine=InnoDB; INSERT INTO t1 VALUES (1); connection node_2; -SET SESSION wsrep_sync_wait=0; SET SESSION wsrep_sync_wait = 15; SELECT COUNT(*) FROM t1; COUNT(*) @@ -29,4 +31,5 @@ SELECT COUNT(*) FROM t1; COUNT(*) 1 connection node_1; +connection node_2; DROP TABLE t1; diff --git a/mysql-test/suite/galera_3nodes/t/GCF-354.test b/mysql-test/suite/galera_3nodes/t/GCF-354.test index 44dfa3deeb7..db4f32fccf9 100644 --- a/mysql-test/suite/galera_3nodes/t/GCF-354.test +++ b/mysql-test/suite/galera_3nodes/t/GCF-354.test @@ -92,6 +92,8 @@ CALL mtr.add_suppression("Slave SQL: Error 'Unknown database 'test'' on query\\. CALL mtr.add_suppression("Query apply failed"); CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown"); +CALL mtr.add_suppression("WSREP: Cert position .* less than last committed"); +CALL mtr.add_suppression("WSREP: Sending JOIN failed: "); --connection node_3 --let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready' @@ -101,5 +103,7 @@ CALL mtr.add_suppression("Slave SQL: Error 'Table 't1' already exists' on query\ CALL mtr.add_suppression("Query apply failed"); CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consensus on "); CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown"); +CALL mtr.add_suppression("WSREP: Cert position .* less than last committed"); +CALL mtr.add_suppression("WSREP: Sending JOIN failed: "); --source ../galera/include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera_3nodes/t/galera_dynamic_protocol.cnf b/mysql-test/suite/galera_3nodes/t/galera_dynamic_protocol.cnf index 84500819cee..a1264c09894 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_dynamic_protocol.cnf +++ b/mysql-test/suite/galera_3nodes/t/galera_dynamic_protocol.cnf @@ -5,7 +5,7 @@ wsrep_sst_method=rsync [mysqld.1] wsrep_node_name='node.1' -wsrep_provider_options='socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem;socket.dynamic=true;repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.wait_prim_timeout=PT60S;gcache.size=10M' +wsrep_provider_options='socket.ssl=yes;socket.ssl_ca=@ENV.MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem;socket.dynamic=true;repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.wait_prim_timeout=PT60S;gcache.size=10M' [mysqld.2] wsrep_node_name='node.2' @@ -13,4 +13,4 @@ wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.2.#gale [mysqld.3] wsrep_node_name='node.3' -wsrep_provider_options='socket.ssl=yes;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem;socket.dynamic=true;repl.causal_read_timeout=PT90S;base_port=@mysqld.3.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.wait_prim_timeout=PT60S;gcache.size=10M' +wsrep_provider_options='socket.ssl=yes;socket.ssl_ca=@ENV.MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=@ENV.MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=@ENV.MYSQL_TEST_DIR/std_data/galera-key.pem;socket.dynamic=true;repl.causal_read_timeout=PT90S;base_port=@mysqld.3.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;pc.wait_prim_timeout=PT60S;gcache.size=10M' diff --git a/mysql-test/suite/galera_3nodes/t/galera_dynamic_protocol.test b/mysql-test/suite/galera_3nodes/t/galera_dynamic_protocol.test index b4536762560..d06d7d27a46 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_dynamic_protocol.test +++ b/mysql-test/suite/galera_3nodes/t/galera_dynamic_protocol.test @@ -50,7 +50,7 @@ SELECT COUNT(*) = 1 FROM t1; # Restart node with SSL enabled --source include/shutdown_mysqld.inc --let $restart_noprint = 1 ---let $restart_parameters = --wsrep_cluster_address=gcomm://127.0.0.1:$NODE_GALERAPORT_1 --wsrep_provider_options=base_port=$NODE_GALERAPORT_2;socket.ssl=yes;socket.ssl_ca=$MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_cert=$MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=$MYSQL_TEST_DIR/std_data/galera-key.pem +--let $restart_parameters = --wsrep_cluster_address=gcomm://127.0.0.1:$NODE_GALERAPORT_1 --wsrep_provider_options=base_port=$NODE_GALERAPORT_2;socket.ssl=yes;socket.ssl_ca=$MYSQL_TEST_DIR/std_data/galera-upgrade-ca-cert.pem;socket.ssl_cert=$MYSQL_TEST_DIR/std_data/galera-cert.pem;socket.ssl_key=$MYSQL_TEST_DIR/std_data/galera-key.pem --source include/start_mysqld.inc --source include/galera_wait_ready.inc diff --git a/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.cnf b/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.cnf new file mode 100644 index 00000000000..bc8942624d2 --- /dev/null +++ b/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.cnf @@ -0,0 +1,4 @@ +!include ../galera_3nodes.cnf + +[mysqld] +wsrep-debug=1 diff --git a/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.test b/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.test index c36cce61f23..0b270385d24 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.test +++ b/mysql-test/suite/galera_3nodes/t/galera_evs_suspect_timeout.test @@ -43,6 +43,12 @@ SET SESSION wsrep_sync_wait=0; --let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' --source include/wait_condition.inc +--connection node_2 +SET SESSION wsrep_sync_wait=0; +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + +--connection node_1 --disable_query_log --eval SET GLOBAL wsrep_provider_options = '$wsrep_provider_options_node1'; --enable_query_log @@ -52,10 +58,6 @@ CREATE TABLE t1 (f1 INTEGER) engine=InnoDB; INSERT INTO t1 VALUES (1); --connection node_2 -SET SESSION wsrep_sync_wait=0; ---let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' ---source include/wait_condition.inc - --disable_query_log --eval SET GLOBAL wsrep_provider_options = '$wsrep_provider_options_node2'; --enable_query_log @@ -86,6 +88,10 @@ SELECT COUNT(*) FROM t1; --let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' --source include/wait_condition.inc +--connection node_2 +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + DROP TABLE t1; # Restore original auto_increment_offset values. diff --git a/mysql-test/suite/innodb/r/alloc_fail.result b/mysql-test/suite/innodb/r/alloc_fail.result new file mode 100644 index 00000000000..7bdd0d7ce72 --- /dev/null +++ b/mysql-test/suite/innodb/r/alloc_fail.result @@ -0,0 +1,47 @@ +# +# MDEV-36017 Alter table aborts when temporary +# directory is full +# +SET SESSION DEFAULT_STORAGE_ENGINE=InnoDB; +CREATE TABLE t1(f1 CHAR(100) NOT NULL, f2 CHAR(100) NOT NULL, +f3 CHAR(100) NOT NULL, f4 CHAR(100) NOT NULL, +f5 CHAR(100) NOT NULL)ENGINE=InnoDB; +INSERT INTO t1 SELECT 'a', 'b', 'c', 'd', 'e' FROM seq_1_to_65536; +SET STATEMENT DEBUG_DBUG="+d,write_to_tmp_file_fail" FOR +CREATE TABLE t2 as SELECT * FROM t1; +ERROR HY000: Got error 59 'Temp file write failure' from InnoDB +DROP TABLE t1; +CREATE TABLE t1(f1 INT NOT NULL, f2 CHAR(100), +f3 CHAR(100))ENGINE=InnoDB; +INSERT INTO t1 SELECT seq, 'a', 'b' FROM seq_1_to_1024; +SET STATEMENT DEBUG_DBUG="+d,write_to_tmp_file_fail" FOR +ALTER TABLE t1 FORCE, ALGORITHM=COPY; +ERROR HY000: Got error 59 'Temp file write failure' from InnoDB +DROP TABLE t1; +CREATE TABLE t1(f1 INT NOT NULL, f2 CHAR(100), +f3 CHAR(100))ENGINE=InnoDB; +INSERT INTO t1 SELECT seq, 'a', 'b' FROM seq_1_to_4096; +SET DEBUG_SYNC="inplace_after_index_build SIGNAL dml_start WAIT_FOR dml_commit"; +ALTER TABLE t1 ADD KEY(f1), ADD INDEX(f3(10)); +connect con1,localhost,root,,,; +SET DEBUG_SYNC="now WAIT_FOR dml_start"; +BEGIN; +INSERT INTO t1 SELECT * FROM t1; +SET STATEMENT DEBUG_DBUG="+d,os_file_write_fail" FOR COMMIT; +SET DEBUG_SYNC="now SIGNAL dml_commit"; +connection default; +ERROR HY000: Temporary file write failure +disconnect con1; +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +DROP TABLE t1; +SET STATEMENT DEBUG_DBUG="+d,ddl_log_write_fail" FOR +CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB; +DROP TABLE t1; +CREATE TABLE t1(f1 TEXT, index(f1(2)))ENGINE=InnoDB; +INSERT INTO t1 VALUES('a'); +set statement DEBUG_DBUG="+d,btr_page_alloc_fail" for +UPDATE t1 set f1= REPEAT('b', 12000); +ERROR HY000: The table 't1' is full +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/alter_temp_fail.result b/mysql-test/suite/innodb/r/alter_temp_fail.result new file mode 100644 index 00000000000..f6e62328bbe --- /dev/null +++ b/mysql-test/suite/innodb/r/alter_temp_fail.result @@ -0,0 +1,25 @@ +# +# MDEV-36017 Alter table aborts when temporary +# directory is full +# +CREATE TABLE t1(f1 INT NOT NULL, f2 CHAR(100), +f3 CHAR(100))ENGINE=InnoDB; +INSERT INTO t1 SELECT seq, 'a', 'b' FROM seq_1_to_4096; +SET DEBUG_SYNC="inplace_after_index_build SIGNAL dml_start WAIT_FOR dml_commit"; +ALTER TABLE t1 ADD KEY(f1), ADD INDEX(f3(10)); +connect con1,localhost,root,,,; +SET DEBUG_SYNC="now WAIT_FOR dml_start"; +BEGIN; +INSERT INTO t1 SELECT * FROM t1; +SET STATEMENT DEBUG_DBUG="+d,os_file_write_fail" FOR COMMIT; +SET DEBUG_SYNC="now SIGNAL dml_commit"; +connection default; +ERROR HY000: Temporary file write failure +disconnect con1; +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +DROP TABLE t1; +SET STATEMENT DEBUG_DBUG="+d,ddl_log_write_fail" FOR +CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/innodb-wl5522-debug.result b/mysql-test/suite/innodb/r/innodb-wl5522-debug.result index 1df1750115b..a7799e3e1be 100644 --- a/mysql-test/suite/innodb/r/innodb-wl5522-debug.result +++ b/mysql-test/suite/innodb/r/innodb-wl5522-debug.result @@ -76,8 +76,7 @@ SET @saved_debug_dbug = @@SESSION.debug_dbug; SET SESSION debug_dbug="+d,ib_export_io_write_failure_1"; FLUSH TABLES t1 FOR EXPORT; Warnings: -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flush() failed -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flose() failed +Warning 1004 Can't create file './test/t1.cfg' (errno: 9 "Bad file descriptor") UNLOCK TABLES; SET SESSION debug_dbug=@saved_debug_dbug; DROP TABLE t1; @@ -86,8 +85,7 @@ INSERT INTO t1 VALUES (1); SET SESSION debug_dbug="+d,ib_export_io_write_failure_2"; FLUSH TABLES t1 FOR EXPORT; Warnings: -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flush() failed -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flose() failed +Warning 1004 Can't create file './test/t1.cfg' (errno: 9 "Bad file descriptor") UNLOCK TABLES; SET SESSION debug_dbug=@saved_debug_dbug; DROP TABLE t1; @@ -96,8 +94,7 @@ INSERT INTO t1 VALUES (1); SET SESSION debug_dbug="+d,ib_export_io_write_failure_3"; FLUSH TABLES t1 FOR EXPORT; Warnings: -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flush() failed -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flose() failed +Warning 1004 Can't create file './test/t1.cfg' (errno: 9 "Bad file descriptor") UNLOCK TABLES; SET SESSION debug_dbug=@saved_debug_dbug; DROP TABLE t1; @@ -106,8 +103,7 @@ INSERT INTO t1 VALUES (1); SET SESSION debug_dbug="+d,ib_export_io_write_failure_4"; FLUSH TABLES t1 FOR EXPORT; Warnings: -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flush() failed -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flose() failed +Warning 1004 Can't create file './test/t1.cfg' (errno: 9 "Bad file descriptor") UNLOCK TABLES; SET SESSION debug_dbug=@saved_debug_dbug; DROP TABLE t1; @@ -116,8 +112,7 @@ INSERT INTO t1 VALUES (1); SET SESSION debug_dbug="+d,ib_export_io_write_failure_5"; FLUSH TABLES t1 FOR EXPORT; Warnings: -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flush() failed -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flose() failed +Warning 1004 Can't create file './test/t1.cfg' (errno: 9 "Bad file descriptor") UNLOCK TABLES; SET SESSION debug_dbug=@saved_debug_dbug; DROP TABLE t1; @@ -126,8 +121,7 @@ INSERT INTO t1 VALUES (1); SET SESSION debug_dbug="+d,ib_export_io_write_failure_6"; FLUSH TABLES t1 FOR EXPORT; Warnings: -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flush() failed -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flose() failed +Warning 1004 Can't create file './test/t1.cfg' (errno: 9 "Bad file descriptor") UNLOCK TABLES; SET SESSION debug_dbug=@saved_debug_dbug; DROP TABLE t1; @@ -136,8 +130,7 @@ INSERT INTO t1 VALUES (1); SET SESSION debug_dbug="+d,ib_export_io_write_failure_7"; FLUSH TABLES t1 FOR EXPORT; Warnings: -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flush() failed -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flose() failed +Warning 1004 Can't create file './test/t1.cfg' (errno: 9 "Bad file descriptor") UNLOCK TABLES; SET SESSION debug_dbug=@saved_debug_dbug; DROP TABLE t1; @@ -146,8 +139,7 @@ INSERT INTO t1 VALUES (1); SET SESSION debug_dbug="+d,ib_export_io_write_failure_8"; FLUSH TABLES t1 FOR EXPORT; Warnings: -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flush() failed -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flose() failed +Warning 1004 Can't create file './test/t1.cfg' (errno: 9 "Bad file descriptor") UNLOCK TABLES; SET SESSION debug_dbug=@saved_debug_dbug; DROP TABLE t1; @@ -156,8 +148,7 @@ INSERT INTO t1 VALUES (1); SET SESSION debug_dbug="+d,ib_export_io_write_failure_10"; FLUSH TABLES t1 FOR EXPORT; Warnings: -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flush() failed -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flose() failed +Warning 1004 Can't create file './test/t1.cfg' (errno: 9 "Bad file descriptor") UNLOCK TABLES; SET SESSION debug_dbug=@saved_debug_dbug; DROP TABLE t1; @@ -166,8 +157,7 @@ INSERT INTO t1 VALUES (1); SET SESSION debug_dbug="+d,ib_export_io_write_failure_11"; FLUSH TABLES t1 FOR EXPORT; Warnings: -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flush() failed -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flose() failed +Warning 1004 Can't create file './test/t1.cfg' (errno: 9 "Bad file descriptor") UNLOCK TABLES; SET SESSION debug_dbug=@saved_debug_dbug; DROP TABLE t1; @@ -176,8 +166,7 @@ INSERT INTO t1 VALUES (1); SET SESSION debug_dbug="+d,ib_export_io_write_failure_12"; FLUSH TABLES t1 FOR EXPORT; Warnings: -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flush() failed -Warning 1811 IO Write error: (9, Bad file descriptor) t1.cfg flose() failed +Warning 1004 Can't create file './test/t1.cfg' (errno: 9 "Bad file descriptor") UNLOCK TABLES; SET SESSION debug_dbug=@saved_debug_dbug; DROP TABLE t1; diff --git a/mysql-test/suite/innodb/r/innodb_buffer_pool_resize.result b/mysql-test/suite/innodb/r/innodb_buffer_pool_resize.result index 66b36f18bc8..7b254daf492 100644 --- a/mysql-test/suite/innodb/r/innodb_buffer_pool_resize.result +++ b/mysql-test/suite/innodb/r/innodb_buffer_pool_resize.result @@ -18,6 +18,15 @@ SET STATEMENT foreign_key_checks=0, unique_checks=0 FOR INSERT INTO t1 SELECT seq*4,seq*4 FROM seq_1_to_262144; SET STATEMENT foreign_key_checks=0, unique_checks=0 FOR INSERT INTO t2 SELECT seq*4,seq*4 FROM seq_1_to_16384; +SELECT @@GLOBAL.innodb_adaptive_hash_index; +@@GLOBAL.innodb_adaptive_hash_index +1 +SET STATEMENT max_statement_time=1e-9 FOR +SET GLOBAL innodb_buffer_pool_size = 7340032; +SELECT @@GLOBAL.innodb_adaptive_hash_index; +@@GLOBAL.innodb_adaptive_hash_index +1 +FOUND 1 /innodb_buffer_pool_size=7m.*resized from|innodb_buffer_pool_size change aborted/ in mysqld.1.err set global innodb_buffer_pool_size = 7340032; select count(val) from t1; count(val) diff --git a/mysql-test/suite/innodb/r/innodb_buffer_pool_resize_temporary.result b/mysql-test/suite/innodb/r/innodb_buffer_pool_resize_temporary.result index ec61bb9c0c3..12fb02a40c7 100644 --- a/mysql-test/suite/innodb/r/innodb_buffer_pool_resize_temporary.result +++ b/mysql-test/suite/innodb/r/innodb_buffer_pool_resize_temporary.result @@ -2,6 +2,16 @@ SET @save_limit=@@GLOBAL.innodb_limit_optimistic_insert_debug; SET @save_size=@@GLOBAL.innodb_buffer_pool_size; SET GLOBAL innodb_limit_optimistic_insert_debug=2; SET GLOBAL innodb_buffer_pool_size=16777216; +call mtr.add_suppression("innodb_buffer_pool_size change aborted"); +SET @old_innodb_adaptive_hash_index = @@innodb_adaptive_hash_index; +SET GLOBAL innodb_adaptive_hash_index = ON; +SET STATEMENT debug_dbug='+d,buf_shrink_fail' FOR +SET GLOBAL innodb_buffer_pool_size=8388608; +ERROR HY000: innodb_buffer_pool_size change aborted +SELECT @@GLOBAL.innodb_adaptive_hash_index,@@GLOBAL.innodb_buffer_pool_size; +@@GLOBAL.innodb_adaptive_hash_index @@GLOBAL.innodb_buffer_pool_size +1 16777216 +SET GLOBAL innodb_adaptive_hash_index = @old_innodb_adaptive_hash_index; CREATE TEMPORARY TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t1 SELECT seq FROM seq_1_to_200; SET GLOBAL innodb_max_purge_lag_wait=0; diff --git a/mysql-test/suite/innodb/r/insert_into_empty.result b/mysql-test/suite/innodb/r/insert_into_empty.result index 74b3a39ecdc..2fce3502dda 100644 --- a/mysql-test/suite/innodb/r/insert_into_empty.result +++ b/mysql-test/suite/innodb/r/insert_into_empty.result @@ -580,4 +580,20 @@ WHERE variable_name = 'innodb_bulk_operations'; bulk_operations 1 DROP TABLE t1; +call mtr.add_suppression("Found 1 prepared XA transactions"); +# +# MDEV-36771 Assertion `bulk_insert == TRX_NO_BULK' failed +# in trx_t::assert_freed from innodb_shutdown +# +CREATE TABLE t1(f1 INT)ENGINE=InnoDB; +XA START 'a'; +INSERT INTO t1 VALUES(1); +XA END 'a'; +XA PREPARE 'a'; +# restart +XA COMMIT 'a'; +SELECT * FROM t1; +f1 +1 +DROP TABLE t1; # End of 10.11 tests diff --git a/mysql-test/suite/innodb/t/alloc_fail.opt b/mysql-test/suite/innodb/t/alloc_fail.opt new file mode 100644 index 00000000000..7a3969d2a37 --- /dev/null +++ b/mysql-test/suite/innodb/t/alloc_fail.opt @@ -0,0 +1,2 @@ +--innodb_sort_buffer_size=64k +--innodb_rollback_on_timeout=1 diff --git a/mysql-test/suite/innodb/t/alloc_fail.test b/mysql-test/suite/innodb/t/alloc_fail.test new file mode 100644 index 00000000000..62350872e5e --- /dev/null +++ b/mysql-test/suite/innodb/t/alloc_fail.test @@ -0,0 +1,55 @@ +--source include/have_innodb.inc +--source include/have_sequence.inc +--source include/have_debug.inc +--echo # +--echo # MDEV-36017 Alter table aborts when temporary +--echo # directory is full +--echo # +SET SESSION DEFAULT_STORAGE_ENGINE=InnoDB; +CREATE TABLE t1(f1 CHAR(100) NOT NULL, f2 CHAR(100) NOT NULL, + f3 CHAR(100) NOT NULL, f4 CHAR(100) NOT NULL, + f5 CHAR(100) NOT NULL)ENGINE=InnoDB; +INSERT INTO t1 SELECT 'a', 'b', 'c', 'd', 'e' FROM seq_1_to_65536; +--error ER_GET_ERRMSG +SET STATEMENT DEBUG_DBUG="+d,write_to_tmp_file_fail" FOR +CREATE TABLE t2 as SELECT * FROM t1; +DROP TABLE t1; + +CREATE TABLE t1(f1 INT NOT NULL, f2 CHAR(100), + f3 CHAR(100))ENGINE=InnoDB; +INSERT INTO t1 SELECT seq, 'a', 'b' FROM seq_1_to_1024; +--error ER_GET_ERRMSG +SET STATEMENT DEBUG_DBUG="+d,write_to_tmp_file_fail" FOR +ALTER TABLE t1 FORCE, ALGORITHM=COPY; +DROP TABLE t1; + +CREATE TABLE t1(f1 INT NOT NULL, f2 CHAR(100), + f3 CHAR(100))ENGINE=InnoDB; +INSERT INTO t1 SELECT seq, 'a', 'b' FROM seq_1_to_4096; +SET DEBUG_SYNC="inplace_after_index_build SIGNAL dml_start WAIT_FOR dml_commit"; +SEND ALTER TABLE t1 ADD KEY(f1), ADD INDEX(f3(10)); + +connect(con1,localhost,root,,,); +SET DEBUG_SYNC="now WAIT_FOR dml_start"; +BEGIN; +INSERT INTO t1 SELECT * FROM t1; +SET STATEMENT DEBUG_DBUG="+d,os_file_write_fail" FOR COMMIT; +SET DEBUG_SYNC="now SIGNAL dml_commit"; + +connection default; +--error ER_TEMP_FILE_WRITE_FAILURE +reap; +disconnect con1; +CHECK TABLE t1; +DROP TABLE t1; + +SET STATEMENT DEBUG_DBUG="+d,ddl_log_write_fail" FOR +CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB; +DROP TABLE t1; + +CREATE TABLE t1(f1 TEXT, index(f1(2)))ENGINE=InnoDB; +INSERT INTO t1 VALUES('a'); +--error ER_RECORD_FILE_FULL +set statement DEBUG_DBUG="+d,btr_page_alloc_fail" for +UPDATE t1 set f1= REPEAT('b', 12000); +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/alter_temp_fail.opt b/mysql-test/suite/innodb/t/alter_temp_fail.opt new file mode 100644 index 00000000000..c3f4a891cca --- /dev/null +++ b/mysql-test/suite/innodb/t/alter_temp_fail.opt @@ -0,0 +1 @@ +--innodb_sort_buffer_size=64k diff --git a/mysql-test/suite/innodb/t/alter_temp_fail.test b/mysql-test/suite/innodb/t/alter_temp_fail.test new file mode 100644 index 00000000000..938a3165aaa --- /dev/null +++ b/mysql-test/suite/innodb/t/alter_temp_fail.test @@ -0,0 +1,30 @@ +--source include/have_innodb.inc +--source include/have_sequence.inc +--source include/have_debug.inc +--echo # +--echo # MDEV-36017 Alter table aborts when temporary +--echo # directory is full +--echo # +CREATE TABLE t1(f1 INT NOT NULL, f2 CHAR(100), + f3 CHAR(100))ENGINE=InnoDB; +INSERT INTO t1 SELECT seq, 'a', 'b' FROM seq_1_to_4096; +SET DEBUG_SYNC="inplace_after_index_build SIGNAL dml_start WAIT_FOR dml_commit"; +SEND ALTER TABLE t1 ADD KEY(f1), ADD INDEX(f3(10)); + +connect(con1,localhost,root,,,); +SET DEBUG_SYNC="now WAIT_FOR dml_start"; +BEGIN; +INSERT INTO t1 SELECT * FROM t1; +SET STATEMENT DEBUG_DBUG="+d,os_file_write_fail" FOR COMMIT; +SET DEBUG_SYNC="now SIGNAL dml_commit"; + +connection default; +--error ER_TEMP_FILE_WRITE_FAILURE +reap; +disconnect con1; +CHECK TABLE t1; +DROP TABLE t1; + +SET STATEMENT DEBUG_DBUG="+d,ddl_log_write_fail" FOR +CREATE TABLE t1(f1 INT NOT NULL)ENGINE=InnoDB; +DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/innodb_buffer_pool_resize.test b/mysql-test/suite/innodb/t/innodb_buffer_pool_resize.test index 4cbbdba9974..e48be6b43fa 100644 --- a/mysql-test/suite/innodb/t/innodb_buffer_pool_resize.test +++ b/mysql-test/suite/innodb/t/innodb_buffer_pool_resize.test @@ -1,5 +1,6 @@ --source include/have_innodb.inc --source include/have_sequence.inc +--source include/not_embedded.inc # there are no messages in mysqld.1.err --echo # --echo # MDEV-29445: Reorganize buffer pool (and remove chunks) @@ -42,6 +43,17 @@ INSERT INTO t2 SELECT seq*4,seq*4 FROM seq_1_to_16384; SET GLOBAL innodb_read_only_compressed=@save_innodb_read_only_compressed; --enable_query_log +SELECT @@GLOBAL.innodb_adaptive_hash_index; +--error 0,ER_WRONG_USAGE +SET STATEMENT max_statement_time=1e-9 FOR +SET GLOBAL innodb_buffer_pool_size = 7340032; +SELECT @@GLOBAL.innodb_adaptive_hash_index; + +--let SEARCH_FILE= $MYSQLTEST_VARDIR/log/mysqld.1.err +--let SEARCH_PATTERN= InnoDB: Trying to shrink innodb_buffer_pool_size=7m +--let SEARCH_PATTERN= innodb_buffer_pool_size=7m.*resized from|innodb_buffer_pool_size change aborted +--source include/search_pattern_in_file.inc + # Attempt to shrink the buffer pool. This may occasionally fail. --error 0,ER_WRONG_USAGE set global innodb_buffer_pool_size = 7340032; diff --git a/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_temporary.test b/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_temporary.test index d997c722edd..f96f89c39d5 100644 --- a/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_temporary.test +++ b/mysql-test/suite/innodb/t/innodb_buffer_pool_resize_temporary.test @@ -8,6 +8,16 @@ SET @save_size=@@GLOBAL.innodb_buffer_pool_size; SET GLOBAL innodb_limit_optimistic_insert_debug=2; SET GLOBAL innodb_buffer_pool_size=16777216; +call mtr.add_suppression("innodb_buffer_pool_size change aborted"); + +SET @old_innodb_adaptive_hash_index = @@innodb_adaptive_hash_index; +SET GLOBAL innodb_adaptive_hash_index = ON; +--error ER_WRONG_USAGE +SET STATEMENT debug_dbug='+d,buf_shrink_fail' FOR +SET GLOBAL innodb_buffer_pool_size=8388608; +SELECT @@GLOBAL.innodb_adaptive_hash_index,@@GLOBAL.innodb_buffer_pool_size; +SET GLOBAL innodb_adaptive_hash_index = @old_innodb_adaptive_hash_index; + CREATE TEMPORARY TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t1 SELECT seq FROM seq_1_to_200; diff --git a/mysql-test/suite/innodb/t/insert_into_empty.test b/mysql-test/suite/innodb/t/insert_into_empty.test index f2f277fa417..82f3c6690ef 100644 --- a/mysql-test/suite/innodb/t/insert_into_empty.test +++ b/mysql-test/suite/innodb/t/insert_into_empty.test @@ -638,4 +638,19 @@ SELECT variable_value-@old_bulk_op bulk_operations FROM information_schema.global_status WHERE variable_name = 'innodb_bulk_operations'; DROP TABLE t1; + +call mtr.add_suppression("Found 1 prepared XA transactions"); +--echo # +--echo # MDEV-36771 Assertion `bulk_insert == TRX_NO_BULK' failed +--echo # in trx_t::assert_freed from innodb_shutdown +--echo # +CREATE TABLE t1(f1 INT)ENGINE=InnoDB; +XA START 'a'; +INSERT INTO t1 VALUES(1); +XA END 'a'; +XA PREPARE 'a'; +--source include/restart_mysqld.inc +XA COMMIT 'a'; +SELECT * FROM t1; +DROP TABLE t1; --echo # End of 10.11 tests diff --git a/mysql-test/suite/innodb_gis/t/rtree_purge.test b/mysql-test/suite/innodb_gis/t/rtree_purge.test index f89f590acf0..4efb7213e28 100644 --- a/mysql-test/suite/innodb_gis/t/rtree_purge.test +++ b/mysql-test/suite/innodb_gis/t/rtree_purge.test @@ -4,8 +4,7 @@ --source include/innodb_page_size.inc --source include/have_sequence.inc --source include/not_valgrind.inc -# This test often times out with MSAN ---source include/not_msan.inc +--source include/no_msan_without_big.inc create table t ( b point not null,d point not null, spatial key (d),spatial key (b) diff --git a/mysql-test/suite/maria/max_length.test b/mysql-test/suite/maria/max_length.test index 02df51b33d7..c6859d5267d 100644 --- a/mysql-test/suite/maria/max_length.test +++ b/mysql-test/suite/maria/max_length.test @@ -6,7 +6,7 @@ --source include/big_test.inc # This test is too slow for valgrind --source include/not_valgrind.inc ---source include/not_msan.inc +--source include/not_msan_with_debug.inc drop table if exists t1,t2; diff --git a/mysql-test/suite/perfschema/t/statement_digest_long_query.test b/mysql-test/suite/perfschema/t/statement_digest_long_query.test index efa33800b58..23ff15c9102 100644 --- a/mysql-test/suite/perfschema/t/statement_digest_long_query.test +++ b/mysql-test/suite/perfschema/t/statement_digest_long_query.test @@ -6,6 +6,7 @@ --source include/have_perfschema.inc # Test requires: sp-protocol/ps-protocol/view-protocol/cursor-protocol disabled --source include/no_protocol.inc +--source include/not_msan_with_debug.inc # Thread stack overrun on solaris let $have_solaris = `select convert(@@version_compile_os using latin1) LIKE ("solaris%")`; if ($have_solaris) diff --git a/mysql-test/suite/s3/clone.result b/mysql-test/suite/s3/clone.result new file mode 100644 index 00000000000..a33c8c4259a --- /dev/null +++ b/mysql-test/suite/s3/clone.result @@ -0,0 +1,12 @@ +# +# SELECT using ror_merged scan fails with s3 tables +# +DROP TABLE IF EXISTS t1; +Warnings: +Note 1051 Unknown table 'test.t1' +CREATE TABLE t1 (a INT, b INT, KEY(a), KEY(b)) ENGINE=Aria; +INSERT INTO t1 VALUES (0,0),(0,10),(3,10); +ALTER TABLE t1 ENGINE=S3; +SELECT * FROM t1 WHERE a = 99 OR b = 2; +a b +DROP TABLE t1; diff --git a/mysql-test/suite/s3/clone.test b/mysql-test/suite/s3/clone.test new file mode 100644 index 00000000000..5695257c404 --- /dev/null +++ b/mysql-test/suite/s3/clone.test @@ -0,0 +1,14 @@ +--source include/have_s3.inc +--source include/have_sequence.inc +--source include/have_innodb.inc + +--echo # +--echo # SELECT using ror_merged scan fails with s3 tables +--echo # + +DROP TABLE IF EXISTS t1; +CREATE TABLE t1 (a INT, b INT, KEY(a), KEY(b)) ENGINE=Aria; +INSERT INTO t1 VALUES (0,0),(0,10),(3,10); +ALTER TABLE t1 ENGINE=S3; +SELECT * FROM t1 WHERE a = 99 OR b = 2; +DROP TABLE t1; diff --git a/mysql-test/suite/sql_sequence/alter.result b/mysql-test/suite/sql_sequence/alter.result index 36cef2a3914..6f040764418 100644 --- a/mysql-test/suite/sql_sequence/alter.result +++ b/mysql-test/suite/sql_sequence/alter.result @@ -419,3 +419,73 @@ DROP SEQUENCE s2; # # End of 10.6 tests # +# +# MDEV-36032 Check when doing ALTER TABLE table_name sequence=1 that table can be a sequence +# +create sequence s; +alter table s sequence=0; +insert into s values (3,1,9223372036854775806,1,1,1000,0,0); +alter table s sequence=1; +ERROR HY000: Internal error: More than one row in the table +drop table s; +create sequence s; +alter table s sequence=0; +delete from s; +insert into s values (2,500,200,1,1,1000,0,0); +select * from s; +next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count +2 500 200 1 1 1000 0 0 +alter table s sequence=1; +ERROR HY000: Sequence 'test.s' has out of range value for options +check table s; +Table Op Msg_type Msg_text +test.s check status OK +select * from s; +next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count +2 500 200 1 1 1000 0 0 +check table s; +Table Op Msg_type Msg_text +test.s check status OK +drop table s; +CREATE TABLE `s` ( +# `next_not_cached_value` bigint(21) NOT NULL, +`minimum_value` bigint(21) NOT NULL, +`maximum_value` bigint(21) NOT NULL, +`start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', +`increment` bigint(21) NOT NULL COMMENT 'increment value', +`cache_size` bigint(21) unsigned NOT NULL, +`cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', +`cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' +) ENGINE=innodb; +alter table s sequence=1; +ERROR HY000: Sequence 'test.s' table structure is invalid (Wrong number of columns) +drop table s; +create sequence s; +alter table s drop column next_not_cached_value; +ERROR HY000: Sequence 'test.s' table structure is invalid (Wrong number of columns) +drop sequence s; +CREATE TABLE `s1` ( +`next_not_cached_value` bigint(21) NOT NULL, +`minimum_value` bigint(21) NOT NULL, +`maximum_value` bigint(21) NOT NULL, +`start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', +`increment` bigint(21) NOT NULL COMMENT 'increment value', +`cache_size` bigint(21) unsigned NOT NULL, +`cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', +`cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' +) ENGINE=innodb; +alter table s1 sequence=1; +ERROR HY000: Internal error: Fewer than one row in the table +alter table s1 sequence=0; +insert into s1 values (1,1,9223372036854775806,1,1,1000,0,0); +alter table s1 sequence=1; +alter table s1 sequence=0; +insert into s1 values (2,1,9223372036854775806,1,1,1000,0,0); +alter table s1 sequence=1; +ERROR HY000: Internal error: More than one row in the table +alter table s1 sequence=0; +insert into s1 values (3,1,9223372036854775806,1,1,1000,0,0); +alter table s1 sequence=1; +ERROR HY000: Internal error: More than one row in the table +drop table s1; +# End of 10.11 tests diff --git a/mysql-test/suite/sql_sequence/alter.test b/mysql-test/suite/sql_sequence/alter.test index 9ac22b644e8..b79f83ffd76 100644 --- a/mysql-test/suite/sql_sequence/alter.test +++ b/mysql-test/suite/sql_sequence/alter.test @@ -295,3 +295,84 @@ DROP SEQUENCE s2; --echo # --echo # End of 10.6 tests --echo # + +--echo # +--echo # MDEV-36032 Check when doing ALTER TABLE table_name sequence=1 that table can be a sequence +--echo # + +## Too many rows +create sequence s; +alter table s sequence=0; +insert into s values (3,1,9223372036854775806,1,1,1000,0,0); +--error ER_INTERNAL_ERROR +alter table s sequence=1; +drop table s; + +## Insert a wrong row (min > max) +create sequence s; +alter table s sequence=0; +delete from s; +insert into s values (2,500,200,1,1,1000,0,0); +select * from s; +--error ER_SEQUENCE_INVALID_DATA +alter table s sequence=1; +check table s; +select * from s; +check table s; +drop table s; + +## Invalid table structure (already implemented before MDEV-36032) +CREATE TABLE `s` ( + # `next_not_cached_value` bigint(21) NOT NULL, + `minimum_value` bigint(21) NOT NULL, + `maximum_value` bigint(21) NOT NULL, + `start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', + `increment` bigint(21) NOT NULL COMMENT 'increment value', + `cache_size` bigint(21) unsigned NOT NULL, + `cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', + `cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' +) ENGINE=innodb; +--error ER_SEQUENCE_INVALID_TABLE_STRUCTURE +alter table s sequence=1; +drop table s; + +## Altering a sequence table to a wrong structure is detected (already +## implemented before MDEV-36032) +create sequence s; +--error ER_SEQUENCE_INVALID_TABLE_STRUCTURE +alter table s drop column next_not_cached_value; +drop sequence s; + +## Create a normal table then alter to sequence +CREATE TABLE `s1` ( +`next_not_cached_value` bigint(21) NOT NULL, +`minimum_value` bigint(21) NOT NULL, +`maximum_value` bigint(21) NOT NULL, +`start_value` bigint(21) NOT NULL COMMENT 'start value when sequences is created or value if RESTART is used', +`increment` bigint(21) NOT NULL COMMENT 'increment value', +`cache_size` bigint(21) unsigned NOT NULL, +`cycle_option` tinyint(1) unsigned NOT NULL COMMENT '0 if no cycles are allowed, 1 if the sequence should begin a new cycle when maximum_value is passed', +`cycle_count` bigint(21) NOT NULL COMMENT 'How many cycles have been done' +) ENGINE=innodb; + +--error ER_INTERNAL_ERROR +alter table s1 sequence=1; +# (for coverage) alter a non sequence table with sequence=0 +alter table s1 sequence=0; +insert into s1 values (1,1,9223372036854775806,1,1,1000,0,0); +alter table s1 sequence=1; + +alter table s1 sequence=0; +insert into s1 values (2,1,9223372036854775806,1,1,1000,0,0); +--error ER_INTERNAL_ERROR +alter table s1 sequence=1; + +# (for coverage) alter a non sequence table with sequence=0 +alter table s1 sequence=0; +insert into s1 values (3,1,9223372036854775806,1,1,1000,0,0); +--error ER_INTERNAL_ERROR +alter table s1 sequence=1; + +drop table s1; + +--echo # End of 10.11 tests diff --git a/mysql-test/suite/sys_vars/inc/sysvars_server.inc b/mysql-test/suite/sys_vars/inc/sysvars_server.inc index 8fca98e0383..61b46f5a26a 100644 --- a/mysql-test/suite/sys_vars/inc/sysvars_server.inc +++ b/mysql-test/suite/sys_vars/inc/sysvars_server.inc @@ -1,4 +1,5 @@ --source include/have_perfschema.inc +--source include/have_profiling.inc --source include/word_size.inc --source include/platform.inc --vertical_results diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result index de308582ca6..e82c25b2de7 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result @@ -32,6 +32,16 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST DEFAULT,COPY,INPLACE,NOCOPY,INSTANT READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME ANALYZE_MAX_LENGTH +VARIABLE_SCOPE SESSION +VARIABLE_TYPE INT UNSIGNED +VARIABLE_COMMENT Fields which length in bytes more than this are skipped by ANALYZE TABLE PERSISTENT unless explicitly listed in the FOR COLUMNS () clause +NUMERIC_MIN_VALUE 32 +NUMERIC_MAX_VALUE 4294967295 +NUMERIC_BLOCK_SIZE 1 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ANALYZE_SAMPLE_PERCENTAGE VARIABLE_SCOPE SESSION VARIABLE_TYPE DOUBLE diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result index 347b5eebebb..87d02f00072 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -32,6 +32,16 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST DEFAULT,COPY,INPLACE,NOCOPY,INSTANT READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME ANALYZE_MAX_LENGTH +VARIABLE_SCOPE SESSION +VARIABLE_TYPE INT UNSIGNED +VARIABLE_COMMENT Fields which length in bytes more than this are skipped by ANALYZE TABLE PERSISTENT unless explicitly listed in the FOR COLUMNS () clause +NUMERIC_MIN_VALUE 32 +NUMERIC_MAX_VALUE 4294967295 +NUMERIC_BLOCK_SIZE 1 +ENUM_VALUE_LIST NULL +READ_ONLY NO +COMMAND_LINE_ARGUMENT REQUIRED VARIABLE_NAME ANALYZE_SAMPLE_PERCENTAGE VARIABLE_SCOPE SESSION VARIABLE_TYPE DOUBLE diff --git a/mysql-test/suite/sys_vars/t/thread_stack_basic.test b/mysql-test/suite/sys_vars/t/thread_stack_basic.test index 39f120e0de1..a1f52576d15 100644 --- a/mysql-test/suite/sys_vars/t/thread_stack_basic.test +++ b/mysql-test/suite/sys_vars/t/thread_stack_basic.test @@ -3,6 +3,7 @@ # --source include/not_asan.inc --source include/not_ubsan.inc +--source include/not_msan.inc --replace_result 392192 299008 select @@global.thread_stack; --error ER_INCORRECT_GLOBAL_LOCAL_VAR diff --git a/mysql-test/suite/vcol/r/not_supported.result b/mysql-test/suite/vcol/r/not_supported.result index 37ce4865dcc..034bca6a97c 100644 --- a/mysql-test/suite/vcol/r/not_supported.result +++ b/mysql-test/suite/vcol/r/not_supported.result @@ -55,3 +55,34 @@ ERROR HY000: Function or expression 'b' cannot be used in the GENERATED ALWAYS A # # End of 10.3 tests # +# +# MDEV-29155 CREATE OR REPLACE with self-referencing CHECK hangs forever, cannot be killed +# +create table t1 (a int); +create table t2 (b int) +# create or replace table t (b int); +create table t3 (c int, check(exists(select a from t1) or exists(select b from t2))); +ERROR 42000: CHECK does not support subqueries or stored functions +create table t3 (c int, check(exists(select c from t3))); +ERROR 42000: CHECK does not support subqueries or stored functions +create table t3 (d int); +create or replace table t3 (c int, check(exists(select a from t1) or exists(select b from t2))); +ERROR 42000: CHECK does not support subqueries or stored functions +drop table t3; +create table t3 (d int); +create or replace table t3 (c int, check(exists(select c from t3))); +ERROR 42000: CHECK does not support subqueries or stored functions +drop table t3; +create table t3 (c int); +alter table t3 add check(exists(select a from t1) or exists(select b from t2)); +ERROR 42000: CHECK does not support subqueries or stored functions +alter table t3 add check(exists(select c from t3)); +ERROR 42000: CHECK does not support subqueries or stored functions +create table t3 (c int default (select a from t1)); +ERROR HY000: Function or expression 'select ...' cannot be used in the DEFAULT clause of `c` +create table t3 (c int, d int generated always as (select a from t1 limit 1)); +ERROR HY000: Function or expression 'select ...' cannot be used in the GENERATED ALWAYS AS clause of `d` +drop tables t1, t2, t3; +# +# End of 10.4 tests +# diff --git a/mysql-test/suite/vcol/t/not_supported.test b/mysql-test/suite/vcol/t/not_supported.test index d58b207a7eb..143c0160084 100644 --- a/mysql-test/suite/vcol/t/not_supported.test +++ b/mysql-test/suite/vcol/t/not_supported.test @@ -64,3 +64,36 @@ create table t1 (a int auto_increment primary key, --echo # --echo # End of 10.3 tests --echo # + +--echo # +--echo # MDEV-29155 CREATE OR REPLACE with self-referencing CHECK hangs forever, cannot be killed +--echo # +create table t1 (a int); +create table t2 (b int) +# create or replace table t (b int); +--error ER_SUBQUERIES_NOT_SUPPORTED +create table t3 (c int, check(exists(select a from t1) or exists(select b from t2))); +--error ER_SUBQUERIES_NOT_SUPPORTED +create table t3 (c int, check(exists(select c from t3))); +create table t3 (d int); +--error ER_SUBQUERIES_NOT_SUPPORTED +create or replace table t3 (c int, check(exists(select a from t1) or exists(select b from t2))); +drop table t3; +create table t3 (d int); +--error ER_SUBQUERIES_NOT_SUPPORTED +create or replace table t3 (c int, check(exists(select c from t3))); +drop table t3; +create table t3 (c int); +--error ER_SUBQUERIES_NOT_SUPPORTED +alter table t3 add check(exists(select a from t1) or exists(select b from t2)); +--error ER_SUBQUERIES_NOT_SUPPORTED +alter table t3 add check(exists(select c from t3)); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create table t3 (c int default (select a from t1)); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create table t3 (c int, d int generated always as (select a from t1 limit 1)); +drop tables t1, t2, t3; + +--echo # +--echo # End of 10.4 tests +--echo # diff --git a/mysql-test/suite/versioning/r/partition.result b/mysql-test/suite/versioning/r/partition.result index 156f349ef24..dc30ef4a515 100644 --- a/mysql-test/suite/versioning/r/partition.result +++ b/mysql-test/suite/versioning/r/partition.result @@ -3443,6 +3443,15 @@ insert into t values (1),(2); DELETE from t; drop table t; # +# MDEV-36817 Server crashes in do_mark_index_columns instead of +# ER_DUP_ENTRY on partitioned table +# +create table t (f int, unique(f)) engine=innodb partition by key (f) partitions 2; +insert into t (f) values (1), (3); +update t set f = 0; +ERROR 23000: Duplicate entry '0' for key 'f' +drop table t; +# # End of 10.5 tests # # @@ -3487,6 +3496,18 @@ f() drop table t; drop function f; # +# MDEV-33370 Assertion `!is_set() || (m_status == DA_OK_BULK && +# is_bulk_op())' failed after ALTER TABLE of versioned table +# +create table t1 (i int) with system versioning +partition by system_time interval 1 month ( +partition ver_p1 history, +partition ver_p2 history, +partition ver_pn current); +alter table `t1` partition by system_time interval 7 year ; +ERROR 22003: TIMESTAMP value is out of range in 'INTERVAL' +drop table t1; +# # End of 10.11 tests # set global innodb_stats_persistent= @save_persistent; diff --git a/mysql-test/suite/versioning/t/partition.test b/mysql-test/suite/versioning/t/partition.test index 46851e335ed..ed1f66dadc7 100644 --- a/mysql-test/suite/versioning/t/partition.test +++ b/mysql-test/suite/versioning/t/partition.test @@ -2691,6 +2691,16 @@ insert into t values (1),(2); DELETE from t; drop table t; +--echo # +--echo # MDEV-36817 Server crashes in do_mark_index_columns instead of +--echo # ER_DUP_ENTRY on partitioned table +--echo # +create table t (f int, unique(f)) engine=innodb partition by key (f) partitions 2; +insert into t (f) values (1), (3); +--error ER_DUP_ENTRY +update t set f = 0; +drop table t; + --echo # --echo # End of 10.5 tests --echo # @@ -2756,6 +2766,20 @@ select f(); drop table t; drop function f; +--echo # +--echo # MDEV-33370 Assertion `!is_set() || (m_status == DA_OK_BULK && +--echo # is_bulk_op())' failed after ALTER TABLE of versioned table +--echo # +create table t1 (i int) with system versioning +partition by system_time interval 1 month ( + partition ver_p1 history, + partition ver_p2 history, + partition ver_pn current); + +--error ER_DATA_OUT_OF_RANGE +alter table `t1` partition by system_time interval 7 year ; +drop table t1; + --echo # --echo # End of 10.11 tests --echo # diff --git a/mysys/CMakeLists.txt b/mysys/CMakeLists.txt index 93b7367d8fa..bce1eaa7a18 100644 --- a/mysys/CMakeLists.txt +++ b/mysys/CMakeLists.txt @@ -78,19 +78,19 @@ ELSEIF(MSVC_ARM64) ENDIF() ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|i386|i686") SET(MYSYS_SOURCES ${MYSYS_SOURCES} crc32/crc32_x86.c crc32/crc32c_x86.cc) - IF(CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER_VERSION VERSION_LESS "5") + IF(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS "5") SET_SOURCE_FILES_PROPERTIES(crc32/crc32_x86.c PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul") ENDIF() IF(CMAKE_SIZEOF_VOID_P EQUAL 8) SET(MYSYS_SOURCES ${MYSYS_SOURCES} crc32/crc32c_amd64.cc) - IF(CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER_VERSION VERSION_LESS "5") + IF(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS "5") SET_SOURCE_FILES_PROPERTIES(crc32/crc32c_amd64.cc PROPERTIES COMPILE_FLAGS "-msse4.2 -mpclmul") ENDIF() ENDIF() ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64|AARCH64") - IF(CMAKE_COMPILER_IS_GNUCC) + IF(CMAKE_C_COMPILER_ID STREQUAL "GNU") include(CheckCXXSourceCompiles) CHECK_CXX_SOURCE_COMPILES(" diff --git a/plugin/auth_ed25519/server_ed25519.c b/plugin/auth_ed25519/server_ed25519.c index b789bd34ca4..11e2fb7c03f 100644 --- a/plugin/auth_ed25519/server_ed25519.c +++ b/plugin/auth_ed25519/server_ed25519.c @@ -135,7 +135,7 @@ maria_declare_plugin_end; MYSQL_PLUGIN_EXPORT char *ed25519_password(UDF_INIT *initid __attribute__((unused)), UDF_ARGS *args, char *result, unsigned long *length, - char *is_null, char *error __attribute__((unused))) + unsigned char *is_null, unsigned char *error __attribute__((unused))) { unsigned char pk[CRYPTO_PUBLICKEYBYTES]; diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt index 5c463e52107..0fa94c7586a 100644 --- a/scripts/CMakeLists.txt +++ b/scripts/CMakeLists.txt @@ -271,7 +271,7 @@ IF(WIN32) # The resulting files will have .pl extension (those are perl scripts) # Input files with pl.in extension - SET(PLIN_FILES mysql_config) + SET(PLIN_FILES mysql_config print_ddl_recovery_log) # Input files with .sh extension SET(SH_FILES mysql_convert_table_format mysqld_multi mysqldumpslow @@ -330,6 +330,8 @@ ELSE() # Configure this one, for testing, but do not install it. CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/mysql_config.pl.in ${CMAKE_CURRENT_BINARY_DIR}/mysql_config.pl ESCAPE_QUOTES @ONLY) + CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/print_ddl_recovery_log.pl.in + ${CMAKE_CURRENT_BINARY_DIR}/print_ddl_recovery_log.pl ESCAPE_QUOTES @ONLY) # On Unix, most of the files end up in the bin directory SET(BIN_SCRIPTS msql2mysql @@ -391,7 +393,7 @@ ELSE() ENDIF() # Install libgcc as mylibgcc.a -IF(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_CXX_FLAGS MATCHES "-static") +IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_FLAGS MATCHES "-static") EXECUTE_PROCESS ( COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} ${CMAKE_CXX_FLAGS} --print-libgcc diff --git a/scripts/print_ddl_recovery_log.pl.in b/scripts/print_ddl_recovery_log.pl.in new file mode 100755 index 00000000000..6e300402cae --- /dev/null +++ b/scripts/print_ddl_recovery_log.pl.in @@ -0,0 +1,120 @@ +#!@PERL_PATH@ +use warnings; +use Fcntl qw(:seek); +use Getopt::Long; + +# Constants based on the source +use constant { + BLOCK_SIZE => 4096, + DDL_LOG_ACTION_TYPE_POS => 1, + DDL_LOG_PHASE_POS => 2, + DDL_LOG_NEXT_ENTRY_POS => 4, + DDL_LOG_FLAG_POS => 8, + DDL_LOG_XID_POS => 10, + DDL_LOG_UUID_POS => 18, + MY_UUID_SIZE => 16, + DDL_LOG_ID_POS => 34, + DDL_LOG_END_POS => 42, + NAME_START_POS => 56, +}; + +package main; + +my @log_entrys= ("Unknown", "EXECUTE", "ENTRY", "IGNORED" ); +my @log_actions= ("Unknown", "DELETE_FRM", "RENAME_FRM", "REPLACE", "EXCHANGE", + "RENAME_TABLE", "RENAME_VIEW", "DROP_INIT", "DROP_TABLE", + "DROP_VIEW", "DROP_TRIGGER", "DROP_DB", "CREATE_TABLE", + "CREATE_VIEW", "DELETE_TMP_FILE", "CREATE_TRIGGER", + "ALTER_TABLE", "STORE_QUERY"); + +$opt_skip_not_used= undef; +$opt_skip_ignored= undef; + +sub usage +{ + print < BLOCK_SIZE); + $str = substr($block, $pos, $len); + $pos += $len+1; + push @strings, $str; + } + + print "\n" if ($entry_num > 1); + print "=== DDL Log Entry $entry_num ===\n"; + $entry_num++; + + print "Entry Type : $log_entrys[$entry_type]\n"; + next if ($opt_skip_not_used && $entry_type == 0); + next if ($opt_skip_ignored && $entry_type >= 3); + + print "Action Type : $log_actions[$action_type]\n"; + print "Phase : $phase\n"; + print "Next Entry : $next_entry\n"; + print "Flags : $flags\n"; + print "XID : $xid\n"; + print "UUID : $uuid\n"; + print "Unique ID : $unique_id\n"; + print "Handler Name : $strings[0]\n"; + print "DB : $strings[1]\n"; + print "Name : $strings[2]\n"; + print "From Handler : $strings[3]\n"; + print "From DB : $strings[4]\n"; + print "From Name : $strings[5]\n"; + print "Temp/Extra : $strings[6]\n"; +} + +close $fh; diff --git a/sql/backup.cc b/sql/backup.cc index f634a11f867..c7caac3127f 100644 --- a/sql/backup.cc +++ b/sql/backup.cc @@ -51,6 +51,7 @@ TYPELIB backup_stage_names= static MDL_ticket *backup_flush_ticket; static File volatile backup_log= -1; static int backup_log_error= 0; +static backup_stages backup_stage; static bool backup_start(THD *thd); static bool backup_flush(THD *thd); @@ -68,6 +69,7 @@ void backup_init() backup_flush_ticket= 0; backup_log= -1; backup_log_error= 0; + backup_stage= BACKUP_FINISHED; } bool run_backup_stage(THD *thd, backup_stages stage) @@ -140,6 +142,7 @@ bool run_backup_stage(THD *thd, backup_stages stage) my_error(ER_BACKUP_STAGE_FAILED, MYF(0), stage_names[(uint) stage]); DBUG_RETURN(1); } + backup_stage= next_stage; next_stage= (backup_stages) ((uint) next_stage + 1); } while ((uint) next_stage <= (uint) stage); @@ -174,6 +177,7 @@ static bool backup_start(THD *thd) /* this will be reset if this stage fails */ thd->current_backup_stage= BACKUP_START; + backup_stage= BACKUP_START; /* Wait for old backup to finish and block ddl's so that we can start the @@ -456,6 +460,7 @@ bool backup_end(THD *thd) // This is needed as we may call backup_end without backup_block_commit stop_ddl_logging(); backup_flush_ticket= 0; + backup_stage= BACKUP_FINISHED; thd->current_backup_stage= BACKUP_FINISHED; thd->mdl_context.release_lock(old_ticket); #ifdef WITH_WSREP @@ -513,7 +518,7 @@ bool backup_reset_alter_copy_lock(THD *thd) bool res= 0; MDL_ticket *ticket= thd->mdl_backup_ticket; - /* Ticket maybe NULL in case of LOCK TABLES or for temporary tables*/ + /* Ticket maybe NULL in case of LOCK TABLES or for temporary tables */ if (ticket) res= thd->mdl_context.upgrade_shared_lock(ticket, MDL_BACKUP_DDL, thd->variables.lock_wait_timeout); @@ -638,6 +643,13 @@ static char *add_bool_to_buffer(char *ptr, bool value) { void backup_log_ddl(const backup_log_info *info) { + /* + We should not get any backup_log_ddl request after BACKUP_WAIT_FOR_FLUSH + has been executed. + */ + DBUG_ASSERT(backup_stage <= BACKUP_WAIT_FOR_FLUSH || + backup_stage >= BACKUP_END); + if (backup_log >= 0 && backup_log_error == 0) { mysql_mutex_lock(&LOCK_backup_log); diff --git a/sql/ddl_log.cc b/sql/ddl_log.cc index 72f69d12e17..b5895a039d2 100644 --- a/sql/ddl_log.cc +++ b/sql/ddl_log.cc @@ -3053,13 +3053,15 @@ static bool ddl_log_write(DDL_LOG_STATE *ddl_state, error= ((ddl_log_write_entry(ddl_log_entry, &log_entry)) || ddl_log_write_execute_entry(log_entry->entry_pos, 0, &ddl_state->execute_entry)); - mysql_mutex_unlock(&LOCK_gdl); + DBUG_EXECUTE_IF("ddl_log_write_fail", error= true;); if (error) { if (log_entry) ddl_log_release_memory_entry(log_entry); + mysql_mutex_unlock(&LOCK_gdl); DBUG_RETURN(1); } + mysql_mutex_unlock(&LOCK_gdl); ddl_log_add_entry(ddl_state, log_entry); ddl_state->flags|= ddl_log_entry->flags; // Update cache DBUG_RETURN(0); diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 94250796d4f..89453d50fb5 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -2193,7 +2193,10 @@ int ha_partition::copy_partitions(ulonglong * const copied, else if (m_part_info->part_type == VERSIONING_PARTITION) { if (m_part_info->check_constants(ha_thd(), m_part_info)) + { + result= HA_ERR_PARTITION_LIST; goto init_error; + } } while (reorg_part < m_reorged_parts) diff --git a/sql/handler.cc b/sql/handler.cc index 984eb8d0948..f140429cb6b 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -1620,6 +1620,12 @@ uint ha_count_rw_2pc(THD *thd, bool all) /** Check if we can skip the two-phase commit. + @param thd Thread handler + @param ha_list List of all engines participating on the commit + @param all True if this is final commit (not statement commit) + @param no_rollback Set to 1 if one of the engines doing writes does + not support rollback + A helper function to evaluate if two-phase commit is mandatory. As a side effect, propagates the read-only/read-write flags of the statement transaction to its enclosing normal transaction. @@ -1638,16 +1644,21 @@ uint ha_count_rw_2pc(THD *thd, bool all) uint ha_check_and_coalesce_trx_read_only(THD *thd, Ha_trx_info *ha_list, - bool all) + bool all, bool *no_rollback) { /* The number of storage engines that have actual changes. */ unsigned rw_ha_count= 0; Ha_trx_info *ha_info; + *no_rollback= false; for (ha_info= ha_list; ha_info; ha_info= ha_info->next()) { if (ha_info->is_trx_read_write()) + { ++rw_ha_count; + if (ha_info->is_trx_no_rollback()) + *no_rollback= true; + } if (! all) { @@ -1670,7 +1681,18 @@ ha_check_and_coalesce_trx_read_only(THD *thd, Ha_trx_info *ha_list, information up, and the need for two-phase commit has been already established. Break the loop prematurely. */ - break; + if (*no_rollback == 0) + { + while ((ha_info= ha_info->next())) + { + if (ha_info->is_trx_read_write() && ha_info->is_trx_no_rollback()) + { + *no_rollback= 1; + break; + } + } + break; + } } } return rw_ha_count; @@ -1806,7 +1828,9 @@ int ha_commit_trans(THD *thd, bool all) if (is_real_trans) /* not a statement commit */ thd->stmt_map.close_transient_cursors(); - uint rw_ha_count= ha_check_and_coalesce_trx_read_only(thd, ha_info, all); + bool no_rollback; + uint rw_ha_count= ha_check_and_coalesce_trx_read_only(thd, ha_info, all, + &no_rollback); /* rw_trans is TRUE when we in a transaction changing data */ bool rw_trans= is_real_trans && rw_ha_count > 0; MDL_request mdl_backup; @@ -1819,7 +1843,7 @@ int ha_commit_trans(THD *thd, bool all) calling ha_commit_trans() from spader_commit(). */ - if (rw_trans && !thd->backup_commit_lock) + if ((rw_trans || no_rollback) && !thd->backup_commit_lock) { /* Acquire a metadata lock which will ensure that COMMIT is blocked @@ -2159,7 +2183,9 @@ int ha_commit_one_phase(THD *thd, bool all) static bool is_ro_1pc_trans(THD *thd, Ha_trx_info *ha_info, bool all, bool is_real_trans) { - uint rw_ha_count= ha_check_and_coalesce_trx_read_only(thd, ha_info, all); + bool no_rollback; + uint rw_ha_count= ha_check_and_coalesce_trx_read_only(thd, ha_info, all, + &no_rollback); bool rw_trans= is_real_trans && (rw_ha_count > (thd->is_current_stmt_binlog_disabled()?0U:1U)); @@ -3347,12 +3373,16 @@ int ha_delete_table(THD *thd, handlerton *hton, const char *path, handler *handler::clone(const char *name, MEM_ROOT *mem_root) { + int error= 0; handler *new_handler= get_new_handler(table->s, mem_root, ht); if (!new_handler) return NULL; if (new_handler->set_ha_share_ref(ha_share)) + { + error= ER_OUT_OF_RESOURCES; goto err; + } /* TODO: Implement a more efficient way to have more than one index open for @@ -3361,8 +3391,10 @@ handler *handler::clone(const char *name, MEM_ROOT *mem_root) This is not critical as the engines already have the table open and should be able to use the original instance of the table. */ - if (new_handler->ha_open(table, name, table->db_stat, - HA_OPEN_IGNORE_IF_LOCKED, mem_root)) + if ((error= new_handler->ha_open(table, name, + table->db_stat & HA_READ_ONLY ? + O_RDONLY : O_RDWR, + HA_OPEN_IGNORE_IF_LOCKED, mem_root))) goto err; new_handler->handler_stats= handler_stats; @@ -3371,6 +3403,7 @@ handler *handler::clone(const char *name, MEM_ROOT *mem_root) return new_handler; err: + new_handler->print_error(error, MYF(0)); delete new_handler; return NULL; } @@ -5342,6 +5375,9 @@ void handler::mark_trx_read_write_internal() */ if (table_share == NULL || table_share->tmp_table == NO_TMP_TABLE) ha_info->set_trx_read_write(); + /* Mark if we are using a table that cannot do rollback */ + if (ht->flags & HTON_NO_ROLLBACK) + ha_info->set_trx_no_rollback(); } } @@ -5651,6 +5687,9 @@ handler::check_if_supported_inplace_alter(TABLE *altered_table, (table->s->row_type != create_info->row_type)) DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); + if (create_info->sequence) + DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); + uint table_changes= (ha_alter_info->handler_flags & ALTER_COLUMN_TYPE_CHANGE_BY_ENGINE) ? IS_EQUAL_PACK_LENGTH : IS_EQUAL_YES; diff --git a/sql/handler.h b/sql/handler.h index 9c22c8b826c..b0f1ca1accf 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -1984,6 +1984,16 @@ public: DBUG_ASSERT(is_started()); return m_flags & (int) TRX_READ_WRITE; } + void set_trx_no_rollback() + { + DBUG_ASSERT(is_started()); + m_flags|= (int) TRX_NO_ROLLBACK; + } + bool is_trx_no_rollback() const + { + DBUG_ASSERT(is_started()); + return m_flags & (int) TRX_NO_ROLLBACK; + } bool is_started() const { return m_ht != NULL; } /** Mark this transaction read-write if the argument is read-write. */ void coalesce_trx_with(const Ha_trx_info *stmt_trx) @@ -2008,7 +2018,7 @@ public: return m_ht; } private: - enum { TRX_READ_ONLY= 0, TRX_READ_WRITE= 1 }; + enum { TRX_READ_ONLY= 0, TRX_READ_WRITE= 1, TRX_NO_ROLLBACK= 2 }; /** Auxiliary, used for ha_list management */ Ha_trx_info *m_next; /** @@ -5785,7 +5795,7 @@ uint ha_count_rw_all(THD *thd, Ha_trx_info **ptr_ha_info); bool non_existing_table_error(int error); uint ha_count_rw_2pc(THD *thd, bool all); uint ha_check_and_coalesce_trx_read_only(THD *thd, Ha_trx_info *ha_list, - bool all); + bool all, bool *no_rollback); inline void Cost_estimate::reset(handler *file) { diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 47050d9f31e..8fcb7a93c47 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -8948,7 +8948,7 @@ char *set_server_version(char *buf, size_t size) bool is_log= opt_log || global_system_variables.sql_log_slow || opt_bin_log; bool is_debug= IF_DBUG(!strstr(MYSQL_SERVER_SUFFIX_STR, "-debug"), 0); const char *is_valgrind= -#ifdef HAVE_valgrind +#if defined(HAVE_valgrind) && !__has_feature(memory_sanitizer) !strstr(MYSQL_SERVER_SUFFIX_STR, "-valgrind") ? "-valgrind" : #endif ""; diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 3f7fac54e0d..70e7060308e 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -1535,14 +1535,7 @@ int QUICK_RANGE_SELECT::init_ror_merged_scan(bool reuse_handler, if (!(file= head->file->clone(head->s->normalized_path.str, local_alloc))) { - /* - Manually set the error flag. Note: there seems to be quite a few - places where a failure could cause the server to "hang" the client by - sending no response to a query. ATM those are not real errors because - the storage engine calls in question happen to never fail with the - existing storage engines. - */ - my_error(ER_OUT_OF_RESOURCES, MYF(0)); /* purecov: inspected */ + /* clone() has already generated an error message */ /* Caller will free the memory */ goto failure; /* purecov: inspected */ } diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 9cef0b2478b..af0e950675a 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -2023,13 +2023,24 @@ class Grant_tables { DBUG_ENTER("Grant_tables::open_and_lock"); - TABLE_LIST tables[USER_TABLE+1], *first= NULL; + TABLE_LIST *first= nullptr, *tables= + static_cast(my_malloc(PSI_NOT_INSTRUMENTED, + (USER_TABLE + 1) * sizeof *tables, + MYF(MY_WME))); + int res= -1; + + if (!tables) + DBUG_RETURN(res); if (build_table_list(thd, &first, which_tables, lock_type, tables)) - DBUG_RETURN(-1); + { + func_exit: + my_free(tables); + DBUG_RETURN(res); + } uint counter; - int res= really_open(thd, first, &counter); + res= really_open(thd, first, &counter); /* if User_table_json wasn't found, let's try User_table_tabular */ if (!res && (which_tables & Table_user) && !tables[USER_TABLE].table) @@ -2055,12 +2066,15 @@ class Grant_tables } } if (res) - DBUG_RETURN(res); + goto func_exit; if (lock_tables(thd, first, counter, MYSQL_LOCK_IGNORE_TIMEOUT | MYSQL_OPEN_IGNORE_LOGGING_FORMAT)) - DBUG_RETURN(-1); + { + res= -1; + goto func_exit; + } p_user_table->set_table(tables[USER_TABLE].table); m_db_table.set_table(tables[DB_TABLE].table); @@ -2070,7 +2084,7 @@ class Grant_tables m_procs_priv_table.set_table(tables[PROCS_PRIV_TABLE].table); m_proxies_priv_table.set_table(tables[PROXIES_PRIV_TABLE].table); m_roles_mapping_table.set_table(tables[ROLES_MAPPING_TABLE].table); - DBUG_RETURN(0); + goto func_exit; } inline const User_table& user_table() const diff --git a/sql/sql_admin.cc b/sql/sql_admin.cc index c553154894d..c7f4514d7c8 100644 --- a/sql/sql_admin.cc +++ b/sql/sql_admin.cc @@ -987,8 +987,9 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables, types here. */ enum enum_field_types type= field->type(); - if (type < MYSQL_TYPE_TINY_BLOB || - type > MYSQL_TYPE_BLOB) + if ((type < MYSQL_TYPE_TINY_BLOB || + type > MYSQL_TYPE_BLOB) && + field->field_length <= thd->variables.analyze_max_length) { field->register_field_in_read_map(); bitmap_set_bit(&tab->has_value_set, field->field_index); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 42acc72497e..278e228421b 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -4769,6 +4769,7 @@ restart: goto error; error= FALSE; + std::this_thread::yield(); goto restart; } goto error; @@ -4834,6 +4835,7 @@ restart: error= FALSE; sroutine_to_open= &thd->lex->sroutines_list.first; + std::this_thread::yield(); goto restart; } /* @@ -5114,6 +5116,7 @@ prepare_fk_prelocking_list(THD *thd, Query_tables_list *prelocking_ctx, FOREIGN_KEY_INFO *fk; Query_arena *arena, backup; TABLE *table= table_list->table; + bool error= FALSE; if (!table->file->referenced_by_foreign_key()) DBUG_RETURN(FALSE); @@ -5154,10 +5157,24 @@ prepare_fk_prelocking_list(THD *thd, Query_tables_list *prelocking_ctx, table_list->belong_to_view, op, &prelocking_ctx->query_tables_last, table_list->for_insert_data); + +#ifdef WITH_WSREP + /* + Append table level shared key for the referenced/foreign table for: + - statement that updates existing rows (UPDATE, multi-update) + - statement that deletes existing rows (DELETE, DELETE_MULTI) + This is done to avoid potential MDL conflicts with concurrent DDLs. + */ + if (wsrep_foreign_key_append(thd, fk)) + { + error= TRUE; + break; + } +#endif // WITH_WSREP } if (arena) thd->restore_active_arena(arena, &backup); - DBUG_RETURN(FALSE); + DBUG_RETURN(error); } /** diff --git a/sql/sql_class.cc b/sql/sql_class.cc index ba73ae9b5b9..26e970752b0 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -6015,7 +6015,8 @@ void THD::reset_sub_statement_state(Sub_statement_state *backup, if (rpl_master_erroneous_autoinc(this)) { DBUG_ASSERT(backup->auto_inc_intervals_forced.nb_elements() == 0); - auto_inc_intervals_forced.swap(&backup->auto_inc_intervals_forced); + backup->auto_inc_intervals_forced.copy_shallow(&auto_inc_intervals_forced); + MEM_UNDEFINED(&auto_inc_intervals_forced, sizeof auto_inc_intervals_forced); } #endif @@ -6063,7 +6064,7 @@ void THD::restore_sub_statement_state(Sub_statement_state *backup) */ if (rpl_master_erroneous_autoinc(this)) { - backup->auto_inc_intervals_forced.swap(&auto_inc_intervals_forced); + auto_inc_intervals_forced.copy_shallow(&backup->auto_inc_intervals_forced); DBUG_ASSERT(backup->auto_inc_intervals_forced.nb_elements() == 0); } #endif @@ -8508,16 +8509,19 @@ void mariadb_sleep_for_space(unsigned int seconds) { THD *thd= current_thd; PSI_stage_info old_stage; + struct timespec abstime; if (!thd) { sleep(seconds); return; } - mysql_mutex_lock(&thd->LOCK_wakeup_ready); + set_timespec(abstime, seconds); + mysql_mutex_lock(&thd->LOCK_wakeup_ready); thd->ENTER_COND(&thd->COND_wakeup_ready, &thd->LOCK_wakeup_ready, &stage_waiting_for_disk_space, &old_stage); if (!thd->killed) - mysql_cond_wait(&thd->COND_wakeup_ready, &thd->LOCK_wakeup_ready); + mysql_cond_timedwait(&thd->COND_wakeup_ready, &thd->LOCK_wakeup_ready, + &abstime); thd->EXIT_COND(&old_stage); return; } diff --git a/sql/sql_class.h b/sql/sql_class.h index 3300a501390..aca06d256e3 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -20,6 +20,7 @@ /* Classes in mysql */ #include +#include #include "dur_prop.h" #include #include "sql_const.h" @@ -758,6 +759,7 @@ typedef struct system_variables ulong saved_lock_wait_timeout; #endif /* WITH_WSREP */ + uint analyze_max_length; ulong auto_increment_increment, auto_increment_offset; ulong column_compression_zlib_strategy; ulong lock_wait_timeout; diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 40cce7e6b37..10e75259cd4 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -2267,18 +2267,8 @@ static bool check_prepared_statement(Prepared_statement *stmt) } #ifdef WITH_WSREP - if (wsrep_sync_wait(thd, sql_command)) - goto error; - if (!stmt->is_sql_prepare()) - { - wsrep_after_command_before_result(thd); - if (wsrep_current_error(thd)) - { - wsrep_override_error(thd, wsrep_current_error(thd), - wsrep_current_error_status(thd)); - goto error; - } - } + if (wsrep_sync_wait(thd, sql_command)) + goto error; #endif switch (sql_command) { case SQLCOM_REPLACE: @@ -2494,6 +2484,20 @@ static bool check_prepared_statement(Prepared_statement *stmt) default: break; } + +#ifdef WITH_WSREP + if (!stmt->is_sql_prepare()) + { + wsrep_after_command_before_result(thd); + if (wsrep_current_error(thd)) + { + wsrep_override_error(thd, wsrep_current_error(thd), + wsrep_current_error_status(thd)); + goto error; + } + } +#endif + if (res == 0) { if (!stmt->is_sql_prepare()) @@ -6298,6 +6302,7 @@ extern "C" MYSQL *mysql_real_connect_local(MYSQL *mysql) new_thd->variables.wsrep_on= 0; new_thd->client_capabilities= client_flag; new_thd->variables.sql_log_bin= 0; + new_thd->affected_rows= 0; new_thd->set_binlog_bit(); /* TOSO: decide if we should turn the auditing off diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 6f45048a27b..f1696a0a865 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -4867,11 +4867,6 @@ int JOIN::exec_inner() UNION temp table. */ - Json_writer_object trace_wrapper(thd); - Json_writer_object trace_exec(thd, "join_execution"); - trace_exec.add_select_number(select_lex->select_number); - Json_writer_array trace_steps(thd, "steps"); - if (!select_lex->outer_select() && // (1) select_lex != select_lex->master_unit()->fake_select_lex) // (2) thd->lex->set_limit_rows_examined(); @@ -25175,6 +25170,13 @@ test_if_quick_select(JOIN_TAB *tab) tab->table->file->ha_index_or_rnd_end(); quick_select_return res; + Json_writer_object wrapper(tab->join->thd); + Json_writer_object range_fer(tab->join->thd, + "range-checked-for-each-record"); + range_fer.add_select_number(tab->join->select_lex->select_number); + range_fer.add("loop", tab->join->explain->time_tracker.get_loops()); + + Json_writer_array rows_est(tab->join->thd, "rows_estimation"); res= tab->select->test_quick_select(tab->join->thd, tab->keys, (table_map) 0, HA_POS_ERROR, 0, FALSE, /*remove where parts*/FALSE, diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 0901421fdac..a1c83442c8e 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -10221,6 +10221,13 @@ void init_fill_schema_files_row(TABLE* table) } +/* + gcc 7.5.0 uses a lot of stack at startup to resolve Column() expressions + Note, do not use PRAGMA_REENABLE_CHECK_STACK_FRAME later on in this file + as this causes compilation to fail. +*/ +PRAGMA_DISABLE_CHECK_STACK_FRAME_EXTRA + namespace Show { ST_FIELD_INFO referential_constraints_fields_info[]= diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc index 1ef6e9fade4..6153544b49a 100644 --- a/sql/sql_statistics.cc +++ b/sql/sql_statistics.cc @@ -264,6 +264,7 @@ index_stat_def= {INDEX_STAT_N_FIELDS, index_stat_fields, 4, index_stat_pk_col}; Open all statistical tables and lock them */ +ATTRIBUTE_NOINLINE static int open_stat_tables(THD *thd, TABLE_LIST *tables, bool for_write) { int rc; @@ -2902,9 +2903,6 @@ int collect_statistics_for_table(THD *thd, TABLE *table) After having been updated the statistical system tables are closed. */ -/* Stack usage 20248 from clang */ -PRAGMA_DISABLE_CHECK_STACK_FRAME - int update_statistics_for_table(THD *thd, TABLE *table) { TABLE_LIST tables[STATISTICS_TABLES]; @@ -2933,9 +2931,13 @@ int update_statistics_for_table(THD *thd, TABLE *table) save_binlog_format= thd->set_current_stmt_binlog_format_stmt(); + char statbuf[sizeof(Index_stat)]; + static_assert(sizeof(statbuf) >= sizeof(Table_stat), ""); + static_assert(sizeof(statbuf) >= sizeof(Column_stat), ""); + /* Update the statistical table table_stats */ stat_table= tables[TABLE_STAT].table; - Table_stat table_stat(stat_table, table); + Table_stat &table_stat= *new(statbuf) Table_stat(stat_table, table); restore_record(stat_table, s->default_values); table_stat.set_key_fields(); err= table_stat.update_stat(); @@ -2944,7 +2946,7 @@ int update_statistics_for_table(THD *thd, TABLE *table) /* Update the statistical table colum_stats */ stat_table= tables[COLUMN_STAT].table; - Column_stat column_stat(stat_table, table); + Column_stat &column_stat= *new(statbuf) Column_stat(stat_table, table); for (Field **field_ptr= table->field; *field_ptr; field_ptr++) { Field *table_field= *field_ptr; @@ -2961,7 +2963,7 @@ int update_statistics_for_table(THD *thd, TABLE *table) stat_table= tables[INDEX_STAT].table; uint key; key_map::Iterator it(table->keys_in_use_for_query); - Index_stat index_stat(stat_table, table); + Index_stat &index_stat= *new(statbuf) Index_stat(stat_table, table); while ((key= it++) != key_map::Iterator::BITMAP_END) { @@ -2989,7 +2991,6 @@ int update_statistics_for_table(THD *thd, TABLE *table) new_trans.restore_old_transaction(); DBUG_RETURN(rc); } -PRAGMA_REENABLE_CHECK_STACK_FRAME /** @@ -3073,14 +3074,17 @@ read_statistics_for_table(THD *thd, TABLE *table, /* Read statistics from the statistical table table_stats */ Table_statistics *read_stats= new_stats_cb->table_stats; stat_table= stat_tables[TABLE_STAT].table; - Table_stat table_stat(stat_table, table); + char statbuf[sizeof(Index_stat)]; + static_assert(sizeof(statbuf) >= sizeof(Table_stat), ""); + static_assert(sizeof(statbuf) >= sizeof(Column_stat), ""); + Table_stat &table_stat= *new(statbuf) Table_stat(stat_table, table); table_stat.set_key_fields(); if (table_stat.get_stat_values(new_stats_cb->table_stats)) new_stats_cb->stats_available|= TABLE_STAT_TABLE; /* Read statistics from the statistical table column_stats */ stat_table= stat_tables[COLUMN_STAT].table; - Column_stat column_stat(stat_table, table); + Column_stat &column_stat= *new(statbuf) Column_stat(stat_table, table); Column_statistics *column_statistics= new_stats_cb->table_stats->column_stats; for (field_ptr= table_share->field; *field_ptr; @@ -3102,7 +3106,7 @@ read_statistics_for_table(THD *thd, TABLE *table, /* Read statistics from the statistical table index_stats */ stat_table= stat_tables[INDEX_STAT].table; - Index_stat index_stat(stat_table, table); + Index_stat &index_stat= *new(statbuf) Index_stat(stat_table, table); Index_statistics *index_statistics= new_stats_cb->table_stats->index_stats; for (key_info= table_share->key_info, key_info_end= key_info + table_share->keys; @@ -3397,9 +3401,6 @@ end: The function is called when executing the statement DROP TABLE 'tab'. */ -/* Stack size 20248 with clang */ -PRAGMA_DISABLE_CHECK_STACK_FRAME - int delete_statistics_for_table(THD *thd, const LEX_CSTRING *db, const LEX_CSTRING *tab) { @@ -3423,7 +3424,10 @@ int delete_statistics_for_table(THD *thd, const LEX_CSTRING *db, /* Delete statistics on table from the statistical table index_stats */ stat_table= tables[INDEX_STAT].table; - Index_stat index_stat(stat_table, db, tab); + char statbuf[sizeof(Index_stat)]; + static_assert(sizeof(statbuf) >= sizeof(Table_stat), ""); + static_assert(sizeof(statbuf) >= sizeof(Column_stat), ""); + Index_stat &index_stat= *new(statbuf) Index_stat(stat_table, db, tab); index_stat.set_full_table_name(); while (index_stat.find_next_stat_for_prefix(2)) { @@ -3434,7 +3438,7 @@ int delete_statistics_for_table(THD *thd, const LEX_CSTRING *db, /* Delete statistics on table from the statistical table column_stats */ stat_table= tables[COLUMN_STAT].table; - Column_stat column_stat(stat_table, db, tab); + Column_stat &column_stat= *new(statbuf) Column_stat(stat_table, db, tab); column_stat.set_full_table_name(); while (column_stat.find_next_stat_for_prefix(2)) { @@ -3445,7 +3449,7 @@ int delete_statistics_for_table(THD *thd, const LEX_CSTRING *db, /* Delete statistics on table from the statistical table table_stats */ stat_table= tables[TABLE_STAT].table; - Table_stat table_stat(stat_table, db, tab); + Table_stat &table_stat= *new(statbuf) Table_stat(stat_table, db, tab); table_stat.set_key_fields(); if (table_stat.find_stat()) { @@ -3468,7 +3472,6 @@ int delete_statistics_for_table(THD *thd, const LEX_CSTRING *db, new_trans.restore_old_transaction(); DBUG_RETURN(rc); } -PRAGMA_REENABLE_CHECK_STACK_FRAME /** @@ -3837,7 +3840,6 @@ int rename_indexes_in_stat_table(THD *thd, TABLE *tab, int rc= 0; uint duplicate_counter= 0; List_iterator it(*indexes); - Alter_info::RENAME_INDEX_STAT_PARAMS *index; char tmp_name_buffer[32]; LEX_CSTRING tmp_name= {tmp_name_buffer, 0}; DBUG_ENTER("rename_indexes_in_stat_tables"); @@ -3858,15 +3860,16 @@ int rename_indexes_in_stat_table(THD *thd, TABLE *tab, /* Rename index in the statistical table index_stat */ stat_table= tables.table; + char statbuf[sizeof(Index_stat)]; /* Loop over all indexes and rename to new name or temp name in case of conflicts */ - while ((index= it++)) + while (Alter_info::RENAME_INDEX_STAT_PARAMS *index= it++) { - Index_stat index_stat(stat_table, tab); + Index_stat &index_stat= *new(statbuf) Index_stat(stat_table, tab); uint found= 0; /* We have to make a loop as one index may have many entries */ @@ -3934,12 +3937,11 @@ int rename_indexes_in_stat_table(THD *thd, TABLE *tab, the final name. */ - Alter_info::RENAME_INDEX_STAT_PARAMS *index; it.rewind(); - Index_stat index_stat(stat_table, tab); + Index_stat &index_stat= *new(statbuf) Index_stat(stat_table, tab); stat_table->file->ha_index_init(index_stat.stat_key_idx, 0); - while ((index= it++)) + while (Alter_info::RENAME_INDEX_STAT_PARAMS *index= it++) { int err __attribute__((unused)); @@ -4013,9 +4015,6 @@ int rename_indexes_in_stat_table(THD *thd, TABLE *tab, The function is called when executing any statement that renames a table */ -/* Stack size 20968 with clang */ -PRAGMA_DISABLE_CHECK_STACK_FRAME - int rename_table_in_stat_tables(THD *thd, const LEX_CSTRING *db, const LEX_CSTRING *tab, const LEX_CSTRING *new_db, @@ -4024,26 +4023,39 @@ int rename_table_in_stat_tables(THD *thd, const LEX_CSTRING *db, int err; enum_binlog_format save_binlog_format; TABLE *stat_table; - TABLE_LIST tables[STATISTICS_TABLES]; int rc= 0; DBUG_ENTER("rename_table_in_stat_tables"); - + + TABLE_LIST *tables= + static_cast(my_malloc(PSI_NOT_INSTRUMENTED, + STATISTICS_TABLES * sizeof *tables, + MYF(MY_WME))); + if (!tables) + DBUG_RETURN(1); + start_new_trans new_trans(thd); if (open_stat_tables(thd, tables, TRUE)) { + func_exit: + my_free(tables); new_trans.restore_old_transaction(); - DBUG_RETURN(0); + DBUG_RETURN(rc); } save_binlog_format= thd->set_current_stmt_binlog_format_stmt(); /* Rename table in the statistical table index_stats */ stat_table= tables[INDEX_STAT].table; - Index_stat index_stat(stat_table, db, tab); - index_stat.set_full_table_name(); + char statbuf[sizeof(Index_stat)]; + static_assert(sizeof(statbuf) >= sizeof(Table_stat), ""); + static_assert(sizeof(statbuf) >= sizeof(Column_stat), ""); - Stat_table_write_iter index_iter(&index_stat); + Index_stat &index_stat= *new(statbuf) Index_stat(stat_table, db, tab); + index_stat.set_full_table_name(); + char ibuf[sizeof(Stat_table_write_iter)]; + + auto &index_iter= *new(ibuf) Stat_table_write_iter(&index_stat); if (index_iter.init(2)) rc= 1; while (!index_iter.get_next_row()) @@ -4057,9 +4069,9 @@ int rename_table_in_stat_tables(THD *thd, const LEX_CSTRING *db, /* Rename table in the statistical table column_stats */ stat_table= tables[COLUMN_STAT].table; - Column_stat column_stat(stat_table, db, tab); + Column_stat &column_stat= *new(statbuf) Column_stat(stat_table, db, tab); column_stat.set_full_table_name(); - Stat_table_write_iter column_iter(&column_stat); + auto &column_iter= *new(ibuf) Stat_table_write_iter(&column_stat); if (column_iter.init(2)) rc= 1; while (!column_iter.get_next_row()) @@ -4073,7 +4085,7 @@ int rename_table_in_stat_tables(THD *thd, const LEX_CSTRING *db, /* Rename table in the statistical table table_stats */ stat_table= tables[TABLE_STAT].table; - Table_stat table_stat(stat_table, db, tab); + Table_stat &table_stat= *new(statbuf) Table_stat(stat_table, db, tab); table_stat.set_key_fields(); if (table_stat.find_stat()) { @@ -4089,11 +4101,8 @@ int rename_table_in_stat_tables(THD *thd, const LEX_CSTRING *db, thd->restore_stmt_binlog_format(save_binlog_format); if (thd->commit_whole_transaction_and_close_tables()) rc= 1; - - new_trans.restore_old_transaction(); - DBUG_RETURN(rc); + goto func_exit; } -PRAGMA_REENABLE_CHECK_STACK_FRAME /** diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 2bd9be12fb9..0dbf25f97ab 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -8010,7 +8010,7 @@ static bool mysql_inplace_alter_table(THD *thd, if (table->file->ha_prepare_inplace_alter_table(altered_table, ha_alter_info)) - goto rollback; + goto rollback_no_restore_lock; debug_crash_here("ddl_log_alter_after_prepare_inplace"); @@ -8066,21 +8066,17 @@ static bool mysql_inplace_alter_table(THD *thd, res= table->file->ha_inplace_alter_table(altered_table, ha_alter_info); thd->abort_on_warning= false; - if (start_alter_id && wait_for_master(thd)) - goto rollback; - - if (res) - goto rollback; - + if (res || (start_alter_id && wait_for_master(thd))) + goto rollback_no_restore_lock; DEBUG_SYNC(thd, "alter_table_inplace_before_lock_upgrade"); // Upgrade to EXCLUSIVE before commit. if (wait_while_table_is_used(thd, table, HA_EXTRA_PREPARE_FOR_RENAME)) - goto rollback; + goto rollback_no_restore_lock; /* Set MDL_BACKUP_DDL */ if (backup_reset_alter_copy_lock(thd)) - goto rollback; + goto rollback_no_restore_lock; /* Crashing here should cause the original table to be used */ debug_crash_here("ddl_log_alter_after_copy"); @@ -8109,7 +8105,7 @@ static bool mysql_inplace_alter_table(THD *thd, if (!(table->file->partition_ht()->flags & HTON_REQUIRES_NOTIFY_TABLEDEF_CHANGED_AFTER_COMMIT) && notify_tabledef_changed(table_list)) - goto rollback; + goto rollback_restore_lock; { TR_table trt(thd, true); @@ -8122,17 +8118,17 @@ static bool mysql_inplace_alter_table(THD *thd, if (!TR_table::use_transaction_registry) { my_error(ER_VERS_TRT_IS_DISABLED, MYF(0)); - goto rollback; + goto rollback_restore_lock; } if (trt.update(trx_start_id, trx_end_id)) - goto rollback; + goto rollback_restore_lock; } } if (table->file->ha_commit_inplace_alter_table(altered_table, ha_alter_info, true)) - goto rollback; + goto rollback_restore_lock; DEBUG_SYNC(thd, "alter_table_inplace_after_commit"); } @@ -8229,7 +8225,11 @@ static bool mysql_inplace_alter_table(THD *thd, DBUG_RETURN(commit_succeded_with_error); - rollback: +rollback_restore_lock: + /* Wait for backup if it is running */ + backup_reset_alter_copy_lock(thd); + +rollback_no_restore_lock: table->file->ha_commit_inplace_alter_table(altered_table, ha_alter_info, false); @@ -12325,12 +12325,10 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, { int error= 1; Copy_field *copy= NULL, *copy_end; + void *rli_buff; ha_rows found_count= 0, delete_count= 0; SORT_INFO *file_sort= 0; READ_RECORD info; - TABLE_LIST tables; - List fields; - List all_fields; bool auto_increment_field_copied= 0; bool cleanup_done= 0; bool init_read_record_done= 0; @@ -12346,7 +12344,9 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, MYSQL_TIME query_start; DBUG_ENTER("copy_data_between_tables"); - if (!(copy= new (thd->mem_root) Copy_field[to->s->fields])) + // Relay_log_info is too big to put on a stack + if (!(rli_buff= thd->alloc(sizeof(Relay_log_info))) || + !(copy= new (thd->mem_root) Copy_field[to->s->fields])) DBUG_RETURN(-1); if (mysql_trans_prepare_alter_copy_data(thd)) @@ -12389,6 +12389,16 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, copy_end=copy; to->s->default_fields= 0; error= 1; + if (to->s->table_type == TABLE_TYPE_SEQUENCE && + from->file->ha_table_flags() & HA_STATS_RECORDS_IS_EXACT && + from->file->stats.records != 1) + { + if (from->file->stats.records > 1) + my_error(ER_INTERNAL_ERROR, MYF(0), "More than one row in the table"); + else + my_error(ER_INTERNAL_ERROR, MYF(0), "Fewer than one row in the table"); + goto err; + } for (Field **ptr=to->field ; *ptr ; ptr++) { def=it++; @@ -12447,6 +12457,9 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, } else { + TABLE_LIST tables; + List fields; + List all_fields; bzero((char *) &tables, sizeof(tables)); tables.table= from; tables.alias= tables.table_name= from->s->table_name; @@ -12598,6 +12611,12 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, else to->next_number_field->reset(); } + if (to->s->table_type == TABLE_TYPE_SEQUENCE && found_count == 1) + { + my_error(ER_INTERNAL_ERROR, MYF(0), "More than one row in the table"); + error= 1; + break; + } error= to->file->ha_write_row(to->record[0]); to->auto_increment_field_not_null= FALSE; if (unlikely(error)) @@ -12669,6 +12688,12 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, DEBUG_SYNC(thd, "alter_table_copy_end"); + if (to->s->table_type == TABLE_TYPE_SEQUENCE && found_count == 0) + { + my_error(ER_INTERNAL_ERROR, MYF(0), "Fewer than one row in the table"); + error= 1; + } + THD_STAGE_INFO(thd, stage_enabling_keys); thd_progress_next_stage(thd); @@ -12703,8 +12728,9 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, enum_sql_command saved_sql_command= thd->lex->sql_command; Table_map_log_event table_event(thd, from, from->s->table_map_id, from->file->has_transactions()); - Relay_log_info rli(false); - rpl_group_info rgi(&rli); + + Relay_log_info *rli= new(rli_buff) Relay_log_info(false); + rpl_group_info rgi(rli); RPL_TABLE_LIST rpl_table(to, TL_WRITE, from, table_event.get_table_def(), copy, copy_end); DBUG_ASSERT(to->pos_in_table_list == NULL); @@ -12717,7 +12743,7 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, Cache_flip_event_log *binlog= from->s->online_alter_binlog; DBUG_ASSERT(binlog->is_open()); - rli.relay_log.description_event_for_exec= + rli->relay_log.description_event_for_exec= new Format_description_log_event(4); // We'll be filling from->record[0] from row events @@ -12767,6 +12793,7 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, to->pos_in_table_list= NULL; // Safety DBUG_ASSERT(thd->lex->sql_command == saved_sql_command); thd->lex->sql_command= saved_sql_command; // Just in case + rli->~Relay_log_info(); } #endif @@ -12782,7 +12809,7 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, if (unlikely(mysql_trans_commit_alter_copy_data(thd))) error= 1; - + if (unlikely(error) && online) { /* @@ -12797,13 +12824,13 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, If share exists, we'll always have ref_count >= 1. Once it reaches destroy(), nobody can acquire it again, therefore, only release() is possible at this moment. - + Also, this will release the binlog. */ from->s->tdc->flush_unused(1); } - err: +end: if (bulk_insert_started) (void) to->file->ha_end_bulk_insert(); @@ -12832,6 +12859,10 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to, to->file->extra(HA_EXTRA_PREPARE_FOR_RENAME)) error= 1; DBUG_RETURN(error > 0 ? -1 : 0); + +err: + backup_reset_alter_copy_lock(thd); + goto end; } diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 8ef31bcbaf0..a5946d6fa7a 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -472,21 +472,30 @@ int select_unit::update_counter(Field* counter, longlong value) Try to disable index @retval - true index is disabled this time + true index is disabled and unfold is needed false this time did not disable the index */ bool select_unit_ext::disable_index_if_needed(SELECT_LEX *curr_sl) { + const bool oracle_mode= thd->variables.sql_mode & MODE_ORACLE; if (is_index_enabled && - (curr_sl == curr_sl->master_unit()->union_distinct || + ((!oracle_mode && + curr_sl == curr_sl->master_unit()->union_distinct) || !curr_sl->next_select()) ) { is_index_enabled= false; - if (table->file->ha_disable_indexes(key_map(0), false)) + int error= table->file->ha_disable_indexes(key_map(0), false); + if (error) + { + table->file->print_error(error, MYF(0)); + DBUG_ASSERT(0); return false; + } table->no_keyread=1; - return true; + /* In case of Oracle mode we unfold at the last operator */ + DBUG_ASSERT(!oracle_mode || !curr_sl->next_select()); + return oracle_mode || !curr_sl->distinct; } return false; } @@ -770,8 +779,7 @@ bool select_unit_ext::send_eof() next_sl && next_sl->get_linkage() == INTERSECT_TYPE && !next_sl->distinct; - bool need_unfold= (disable_index_if_needed(curr_sl) && - !curr_sl->distinct); + bool need_unfold= disable_index_if_needed(curr_sl); if (((curr_sl->distinct && !is_next_distinct) || curr_op_type == INTERSECT_ALL || @@ -779,7 +787,8 @@ bool select_unit_ext::send_eof() !need_unfold) { if (!next_sl) - DBUG_ASSERT(curr_op_type != INTERSECT_ALL); + DBUG_ASSERT((thd->variables.sql_mode & MODE_ORACLE) || + curr_op_type != INTERSECT_ALL); bool need_update_row; if (unlikely(table->file->ha_rnd_init_with_error(1))) return 1; @@ -1381,8 +1390,8 @@ bool st_select_lex_unit::prepare(TABLE_LIST *derived_arg, uint union_part_count= 0; select_result *tmp_result; bool is_union_select; - bool have_except= false, have_intersect= false, - have_except_all_or_intersect_all= false; + bool have_except= false, have_intersect= false; + have_except_all_or_intersect_all= false; bool instantiate_tmp_table= false; bool use_direct_union_result= false; bool single_tvc= !first_sl->next_select() && first_sl->tvc; @@ -2300,6 +2309,7 @@ bool st_select_lex_unit::exec_inner() ulonglong add_rows=0; bool first_execution= !executed; bool was_executed= executed; + int error; executed= 1; if (!(uncacheable & ~UNCACHEABLE_EXPLAIN) && item && @@ -2381,17 +2391,32 @@ bool st_select_lex_unit::exec_inner() if (likely(!saved_error)) { records_at_start= table->file->stats.records; + + /* select_unit::send_data() writes rows to (temporary) table */ if (sl->tvc) sl->tvc->exec(sl); else saved_error= sl->join->exec(); + /* + Allow UNION ALL to work: disable unique key. We cannot disable indexes + in the middle of the query because enabling indexes requires table to be empty + (see heap_enable_indexes()). So there is special union_distinct property + which is the rightmost distinct UNION in the expression and we release + the unique key after the last (rightmost) distinct UNION, therefore only the + subsequent UNION ALL work as non-distinct. + */ if (sl == union_distinct && !have_except_all_or_intersect_all && !(with_element && with_element->is_recursive)) { // This is UNION DISTINCT, so there should be a fake_select_lex DBUG_ASSERT(fake_select_lex != NULL); - if (table->file->ha_disable_indexes(key_map(0), false)) + error= table->file->ha_disable_indexes(key_map(0), false); + if (error) + { + table->file->print_error(error, MYF(0)); + DBUG_ASSERT(0); return true; + } table->no_keyread=1; } if (likely(!saved_error)) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index ce47f6759a8..e261ca156e9 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -5954,9 +5954,12 @@ opt_check_constraint: ; check_constraint: - CHECK_SYM '(' expr ')' + CHECK_SYM '(' + { Lex->clause_that_disallows_subselect= "CHECK"; } + expr ')' { - Virtual_column_info *v= add_virtual_expression(thd, $3); + Virtual_column_info *v= add_virtual_expression(thd, $4); + Lex->clause_that_disallows_subselect= NULL; if (unlikely(!v)) MYSQL_YYABORT; $$= v; diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 4733e67830c..2eb1c5b68d2 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -454,6 +454,19 @@ static Sys_var_double Sys_analyze_sample_percentage( CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, 100), DEFAULT(100)); +/* + The max length have to be UINT_MAX32 to not remove GEOMETRY fields + from analyze. +*/ + +static Sys_var_uint Sys_analyze_max_length( + "analyze_max_length", + "Fields which length in bytes more than this are skipped by ANALYZE " + "TABLE PERSISTENT unless explicitly listed in the FOR COLUMNS () clause", + SESSION_VAR(analyze_max_length), + CMD_LINE(REQUIRED_ARG), VALID_RANGE(32, UINT_MAX32), + DEFAULT(UINT_MAX32), BLOCK_SIZE(1)); + static Sys_var_ulong Sys_auto_increment_increment( "auto_increment_increment", "Auto-increment columns are incremented by this", @@ -5414,7 +5427,8 @@ static Sys_var_charptr Sys_have_santitizer( "have_sanitizer", "If the server is compiled with sanitize (compiler option), this " "variable is set to the sanitizer mode used. Possible values are " - "ASAN (Address sanitizer) or UBSAN (The Undefined Behavior Sanitizer).", + "ASAN (Address sanitizer) and/or UBSAN (Undefined Behavior Sanitizer)," + " or MSAN (memory sanitizer).", READ_ONLY GLOBAL_VAR(have_sanitizer), NO_CMD_LINE, DEFAULT(SANITIZER_MODE)); #endif /* defined(__SANITIZE_ADDRESS__) || defined(WITH_UBSAN) */ diff --git a/sql/table.cc b/sql/table.cc index 513ac114e2e..2776a55fece 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -6127,7 +6127,6 @@ allocate: while ((item= it++)) { - DBUG_ASSERT(item->name.str && item->name.str[0]); transl[field_count].name.str= thd->strmake(item->name.str, item->name.length); transl[field_count].name.length= item->name.length; transl[field_count++].item= item; diff --git a/sql/table_cache.cc b/sql/table_cache.cc index b804a3e0627..48cd63401e6 100644 --- a/sql/table_cache.cc +++ b/sql/table_cache.cc @@ -901,6 +901,7 @@ retry: { mysql_mutex_unlock(&element->LOCK_table_share); lf_hash_search_unpin(thd->tdc_hash_pins); + std::this_thread::yield(); goto retry; } lf_hash_search_unpin(thd->tdc_hash_pins); diff --git a/sql/threadpool_generic.cc b/sql/threadpool_generic.cc index 0a653474ffa..89d2a26d16a 100644 --- a/sql/threadpool_generic.cc +++ b/sql/threadpool_generic.cc @@ -715,6 +715,10 @@ static void stop_timer(pool_timer_t *timer) @return a ready connection, or NULL on shutdown */ + +/* ev[MAX_EVENTS] may bloat the stack frame beyond 16 KiB */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + static TP_connection_generic * listener(worker_thread_t *current_thread, thread_group_t *thread_group) { @@ -830,6 +834,7 @@ static TP_connection_generic * listener(worker_thread_t *current_thread, DBUG_RETURN(retval); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /** Adjust thread counters in group or global @@ -1157,6 +1162,9 @@ static bool too_many_threads(thread_group_t *thread_group) NULL is returned if timeout has expired,or on shutdown. */ +/* ev[MAX_EVENTS] may bloat the stack frame beyond 16 KiB */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + TP_connection_generic *get_event(worker_thread_t *current_thread, thread_group_t *thread_group, struct timespec *abstime) { @@ -1262,6 +1270,7 @@ TP_connection_generic *get_event(worker_thread_t *current_thread, DBUG_RETURN(connection); } +PRAGMA_REENABLE_CHECK_STACK_FRAME diff --git a/sql/tztime.cc b/sql/tztime.cc index e674376f8c9..5e2520d2ac5 100644 --- a/sql/tztime.cc +++ b/sql/tztime.cc @@ -2308,6 +2308,8 @@ str_to_offset(const char *str, uint length, long *offset) specification or other error. */ +PRAGMA_DISABLE_CHECK_STACK_FRAME + Time_zone * my_tz_find(THD *thd, const String *name) { @@ -2376,6 +2378,7 @@ my_tz_find(THD *thd, const String *name) DBUG_RETURN(result_tz); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /** diff --git a/sql/udf_example.c b/sql/udf_example.c index 14c793ee98a..d87abdc9f1b 100644 --- a/sql/udf_example.c +++ b/sql/udf_example.c @@ -156,33 +156,33 @@ static pthread_mutex_t LOCK_hostname; my_bool metaphon_init(UDF_INIT *initid, UDF_ARGS *args, char *message); void metaphon_deinit(UDF_INIT *initid); char *metaphon(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *length, char *is_null, char *error); + unsigned long *length, uchar *is_null, uchar *error); my_bool myfunc_double_init(UDF_INIT *, UDF_ARGS *args, char *message); -double myfunc_double(UDF_INIT *initid, UDF_ARGS *args, char *is_null, - char *error); +double myfunc_double(UDF_INIT *initid, UDF_ARGS *args, uchar *is_null, + uchar *error); my_bool myfunc_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message); -longlong myfunc_int(UDF_INIT *initid, UDF_ARGS *args, char *is_null, - char *error); +longlong myfunc_int(UDF_INIT *initid, UDF_ARGS *args, uchar *is_null, + uchar *error); my_bool udf_sequence_init(UDF_INIT *initid, UDF_ARGS *args, char *message); void udf_sequence_deinit(UDF_INIT *initid); -longlong udf_sequence(UDF_INIT *initid, UDF_ARGS *args, char *is_null, - char *error); +longlong udf_sequence(UDF_INIT *initid, UDF_ARGS *args, uchar *is_null, + uchar *error); my_bool avgcost_init( UDF_INIT* initid, UDF_ARGS* args, char* message ); void avgcost_deinit( UDF_INIT* initid ); -void avgcost_reset( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error ); -void avgcost_clear( UDF_INIT* initid, char* is_null, char *error ); -void avgcost_add( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error ); -double avgcost( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error ); +void avgcost_reset( UDF_INIT* initid, UDF_ARGS* args, uchar* is_null, uchar *error ); +void avgcost_clear( UDF_INIT* initid, uchar* is_null, uchar *error ); +void avgcost_add( UDF_INIT* initid, UDF_ARGS* args, uchar* is_null, uchar *error ); +double avgcost( UDF_INIT* initid, UDF_ARGS* args, uchar* is_null, uchar *error ); my_bool avg2_init( UDF_INIT* initid, UDF_ARGS* args, char* message ); void avg2_deinit( UDF_INIT* initid ); -void avg2_reset( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error ); -void avg2_clear( UDF_INIT* initid, char* is_null, char *error ); -void avg2_add( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error ); -void avg2_remove( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error ); -double avg2( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error ); +void avg2_reset( UDF_INIT* initid, UDF_ARGS* args, uchar *is_null, uchar *error ); +void avg2_clear( UDF_INIT* initid, uchar* is_null, uchar *error ); +void avg2_add( UDF_INIT* initid, UDF_ARGS* args, uchar *is_null, uchar *error ); +void avg2_remove( UDF_INIT* initid, UDF_ARGS* args, uchar* is_null, uchar *error ); +double avg2( UDF_INIT* initid, UDF_ARGS* args, uchar* is_null, uchar *error ); my_bool is_const_init(UDF_INIT *initid, UDF_ARGS *args, char *message); char *is_const(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long - *length, char *is_null, char *error); + *length, uchar *is_null, uchar *error); /************************************************************************* @@ -292,7 +292,7 @@ static char codes[26] = { char *metaphon(UDF_INIT *initid __attribute__((unused)), UDF_ARGS *args, char *result, unsigned long *length, - char *is_null, char *error __attribute__((unused))) + uchar *is_null, uchar *error __attribute__((unused))) { const char *word=args->args[0]; const char *w_end; @@ -568,7 +568,7 @@ my_bool myfunc_double_init(UDF_INIT *initid, UDF_ARGS *args, char *message) double myfunc_double(UDF_INIT *initid __attribute__((unused)), UDF_ARGS *args, - char *is_null, char *error __attribute__((unused))) + uchar *is_null, uchar *error __attribute__((unused))) { unsigned long val = 0; unsigned long v = 0; @@ -607,8 +607,8 @@ double myfunc_double(UDF_INIT *initid __attribute__((unused)), UDF_ARGS *args, /* This function returns the sum of all arguments */ longlong myfunc_int(UDF_INIT *initid __attribute__((unused)), UDF_ARGS *args, - char *is_null __attribute__((unused)), - char *error __attribute__((unused))) + uchar *is_null __attribute__((unused)), + uchar *error __attribute__((unused))) { longlong val = 0; uint i; @@ -681,8 +681,8 @@ void udf_sequence_deinit(UDF_INIT *initid) } longlong udf_sequence(UDF_INIT *initid __attribute__((unused)), UDF_ARGS *args, - char *is_null __attribute__((unused)), - char *error __attribute__((unused))) + uchar *is_null __attribute__((unused)), + uchar *error __attribute__((unused))) { ulonglong val=0; if (args->arg_count) @@ -712,11 +712,11 @@ longlong udf_sequence(UDF_INIT *initid __attribute__((unused)), UDF_ARGS *args, my_bool lookup_init(UDF_INIT *initid, UDF_ARGS *args, char *message); void lookup_deinit(UDF_INIT *initid); char *lookup(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *length, char *null_value, char *error); + unsigned long *length, uchar *null_value, uchar *error); my_bool reverse_lookup_init(UDF_INIT *initid, UDF_ARGS *args, char *message); void reverse_lookup_deinit(UDF_INIT *initid); char *reverse_lookup(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *length, char *null_value, char *error); + unsigned long *length, uchar *null_value, uchar *error); /**************************************************************************** @@ -750,8 +750,8 @@ void lookup_deinit(UDF_INIT *initid __attribute__((unused))) } char *lookup(UDF_INIT *initid __attribute__((unused)), UDF_ARGS *args, - char *result, unsigned long *res_length, char *null_value, - char *error __attribute__((unused))) + char *result, unsigned long *res_length, uchar *null_value, + uchar *error __attribute__((unused))) { uint length; char name_buff[256]; @@ -831,7 +831,7 @@ void reverse_lookup_deinit(UDF_INIT *initid __attribute__((unused))) char *reverse_lookup(UDF_INIT *initid __attribute__((unused)), UDF_ARGS *args, char *result, unsigned long *res_length, - char *null_value, char *error __attribute__((unused))) + uchar *null_value, uchar *error __attribute__((unused))) { #if defined(HAVE_GETHOSTBYADDR_R) && defined(HAVE_SOLARIS_STYLE_GETHOST) char name_buff[256]; @@ -974,7 +974,7 @@ avgcost_deinit( UDF_INIT* initid ) /* This is only for MySQL 4.0 compatibility */ void -avgcost_reset(UDF_INIT* initid, UDF_ARGS* args, char* is_null, char* message) +avgcost_reset(UDF_INIT* initid, UDF_ARGS* args, uchar* is_null, uchar* message) { avgcost_clear(initid, is_null, message); avgcost_add(initid, args, is_null, message); @@ -983,8 +983,8 @@ avgcost_reset(UDF_INIT* initid, UDF_ARGS* args, char* is_null, char* message) /* This is needed to get things to work in MySQL 4.1.1 and above */ void -avgcost_clear(UDF_INIT* initid, char* is_null __attribute__((unused)), - char* message __attribute__((unused))) +avgcost_clear(UDF_INIT* initid, uchar* is_null __attribute__((unused)), + uchar* message __attribute__((unused))) { struct avgcost_data* data = (struct avgcost_data*)initid->ptr; data->totalprice= 0.0; @@ -995,8 +995,8 @@ avgcost_clear(UDF_INIT* initid, char* is_null __attribute__((unused)), void avgcost_add(UDF_INIT* initid, UDF_ARGS* args, - char* is_null __attribute__((unused)), - char* message __attribute__((unused))) + uchar* is_null __attribute__((unused)), + uchar* message __attribute__((unused))) { if (args->args[0] && args->args[1]) { @@ -1043,7 +1043,7 @@ avgcost_add(UDF_INIT* initid, UDF_ARGS* args, double avgcost( UDF_INIT* initid, UDF_ARGS* args __attribute__((unused)), - char* is_null, char* error __attribute__((unused))) + uchar* is_null, uchar* error __attribute__((unused))) { struct avgcost_data* data = (struct avgcost_data*)initid->ptr; if (!data->count || !data->totalquantity) @@ -1121,7 +1121,8 @@ avg2_deinit( UDF_INIT* initid ) /* This is only for MySQL 4.0 compatibility */ void -avg2_reset(UDF_INIT* initid, UDF_ARGS* args, char* is_null, char* message) +avg2_reset(UDF_INIT* initid, UDF_ARGS* args, uchar* is_null, + uchar* message) { avgcost_clear(initid, is_null, message); avgcost_add(initid, args, is_null, message); @@ -1130,8 +1131,8 @@ avg2_reset(UDF_INIT* initid, UDF_ARGS* args, char* is_null, char* message) /* This is needed to get things to work in MySQL 4.1.1 and above */ void -avg2_clear(UDF_INIT* initid, char* is_null __attribute__((unused)), - char* message __attribute__((unused))) +avg2_clear(UDF_INIT* initid, uchar* is_null __attribute__((unused)), + uchar* message __attribute__((unused))) { struct avg2_data* data = (struct avg2_data*)initid->ptr; data->sum= 0.0; @@ -1141,8 +1142,8 @@ avg2_clear(UDF_INIT* initid, char* is_null __attribute__((unused)), void avg2_add(UDF_INIT* initid, UDF_ARGS* args, - char* is_null __attribute__((unused)), - char* message __attribute__((unused))) + uchar* is_null __attribute__((unused)), + uchar* message __attribute__((unused))) { if (args->args[0] && args->args[1]) { @@ -1158,8 +1159,8 @@ avg2_add(UDF_INIT* initid, UDF_ARGS* args, void avg2_remove(UDF_INIT* initid, UDF_ARGS* args, - char* is_null __attribute__((unused)), - char* message __attribute__((unused))) + uchar* is_null __attribute__((unused)), + uchar* message __attribute__((unused))) { if (args->args[0] && args->args[1]) { @@ -1174,8 +1175,8 @@ avg2_remove(UDF_INIT* initid, UDF_ARGS* args, double -avg2( UDF_INIT* initid, UDF_ARGS* args __attribute__((unused)), - char* is_null, char* error __attribute__((unused))) +avg2(UDF_INIT* initid, UDF_ARGS* args __attribute__((unused)), + uchar* is_null, uchar* error __attribute__((unused))) { struct avg2_data* data = (struct avg2_data*)initid->ptr; if (!data->count) @@ -1191,8 +1192,8 @@ avg2( UDF_INIT* initid, UDF_ARGS* args __attribute__((unused)), my_bool myfunc_argument_name_init(UDF_INIT *initid, UDF_ARGS *args, char *message); char *myfunc_argument_name(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *length, char *null_value, - char *error); + unsigned long *length, uchar *null_value, + uchar *error); my_bool myfunc_argument_name_init(UDF_INIT *initid, UDF_ARGS *args, char *message) @@ -1210,8 +1211,8 @@ my_bool myfunc_argument_name_init(UDF_INIT *initid, UDF_ARGS *args, char *myfunc_argument_name(UDF_INIT *initid __attribute__((unused)), UDF_ARGS *args, char *result, - unsigned long *length, char *null_value, - char *error __attribute__((unused))) + unsigned long *length, uchar *null_value, + uchar *error __attribute__((unused))) { if (!args->attributes[0]) { @@ -1241,7 +1242,7 @@ my_bool is_const_init(UDF_INIT *initid, UDF_ARGS *args, char *message) char * is_const(UDF_INIT *initid, UDF_ARGS *args __attribute__((unused)), char *result, unsigned long *length, - char *is_null, char *error __attribute__((unused))) + uchar *is_null,uchar *error __attribute__((unused))) { if (initid->ptr != 0) { sprintf(result, "const"); @@ -1280,7 +1281,7 @@ my_bool check_const_len_init(UDF_INIT *initid, UDF_ARGS *args, char *message) char * check_const_len(UDF_INIT *initid, UDF_ARGS *args __attribute__((unused)), char *result, unsigned long *length, - char *is_null, char *error __attribute__((unused))) + uchar *is_null,uchar *error __attribute__((unused))) { strmov(result, initid->ptr); *length= (uint) strlen(result); diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index fbdbd66d8db..c0c29a0b85b 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -1471,7 +1471,8 @@ bool wsrep_check_mode_after_open_table (THD *thd, } // Check are we inside a transaction - uint rw_ha_count= ha_check_and_coalesce_trx_read_only(thd, thd->transaction->all.ha_list, true); + bool not_used; + uint rw_ha_count= ha_check_and_coalesce_trx_read_only(thd, thd->transaction->all.ha_list, true, ¬_used); bool changes= wsrep_has_changes(thd); // Roll back current stmt if exists @@ -4118,3 +4119,36 @@ bool wsrep_table_list_has_non_temp_tables(THD *thd, TABLE_LIST *tables) } return false; } + +bool wsrep_foreign_key_append(THD *thd, FOREIGN_KEY_INFO *fk) +{ + if (WSREP(thd) && !thd->wsrep_applier && + wsrep_is_active(thd) && + (sql_command_flags[thd->lex->sql_command] & + (CF_UPDATES_DATA | CF_DELETES_DATA))) + { + wsrep::key key(wsrep::key::shared); + key.append_key_part(fk->foreign_db->str, fk->foreign_db->length); + key.append_key_part(fk->foreign_table->str, fk->foreign_table->length); + + if (thd->wsrep_cs().append_key(key)) + { + WSREP_ERROR("Appending table key failed: %s", + wsrep_thd_query(thd)); + sql_print_information("Failed Foreign key referenced table found: " + "%s.%s", + fk->foreign_db->str, + fk->foreign_table->str); + return true; + } + + DBUG_EXECUTE_IF( + "wsrep_print_foreign_keys_table", + sql_print_information("Foreign key referenced table found: %s.%s", + fk->foreign_db->str, + fk->foreign_table->str); + ); + } + + return false; +} diff --git a/sql/wsrep_mysqld.h b/sql/wsrep_mysqld.h index 6cd8d6cea95..e2be203ef27 100644 --- a/sql/wsrep_mysqld.h +++ b/sql/wsrep_mysqld.h @@ -600,6 +600,16 @@ void wsrep_ready_set(bool ready_value); */ bool wsrep_table_list_has_non_temp_tables(THD *thd, TABLE_LIST *tables); +/** + * Append foreign key to wsrep. + * + * @param thd Thread object + * @param fk Foreign Key Info + * + * @return true if error, otherwise false. + */ +bool wsrep_foreign_key_append(THD *thd, FOREIGN_KEY_INFO *fk); + #else /* !WITH_WSREP */ /* These macros are needed to compile MariaDB without WSREP support diff --git a/sql/wsrep_schema.cc b/sql/wsrep_schema.cc index f8acd876a5f..7a50a7c05e9 100644 --- a/sql/wsrep_schema.cc +++ b/sql/wsrep_schema.cc @@ -1819,9 +1819,9 @@ static void *allowlist_check_thread(void *param) Allowlist_check_arg *arg= (Allowlist_check_arg *) param; my_thread_init(); - THD thd(0); - thd.thread_stack= (char *) &thd; - wsrep_init_thd_for_schema(&thd); + THD *thd= new THD(0); + thd->thread_stack= (char *) thd; + wsrep_init_thd_for_schema(thd); int error; TABLE *allowlist_table= 0; @@ -1835,8 +1835,8 @@ static void *allowlist_check_thread(void *param) /* * Read allowlist table */ - Wsrep_schema_impl::init_stmt(&thd); - if (Wsrep_schema_impl::open_for_read(&thd, allowlist_table_str.c_str(), + Wsrep_schema_impl::init_stmt(thd); + if (Wsrep_schema_impl::open_for_read(thd, allowlist_table_str.c_str(), &allowlist_table_l) || (allowlist_table= allowlist_table_l.table, Wsrep_schema_impl::init_for_scan(allowlist_table))) @@ -1877,9 +1877,10 @@ static void *allowlist_check_thread(void *param) { goto out; } - Wsrep_schema_impl::finish_stmt(&thd); - (void) trans_commit(&thd); + Wsrep_schema_impl::finish_stmt(thd); + (void) trans_commit(thd); out: + delete thd; my_thread_end(); arg->response = match_found_or_empty; return 0; diff --git a/storage/columnstore/CMakeLists.txt b/storage/columnstore/CMakeLists.txt index cc4780d1cef..491955e0e2f 100644 --- a/storage/columnstore/CMakeLists.txt +++ b/storage/columnstore/CMakeLists.txt @@ -32,6 +32,13 @@ MY_CHECK_AND_SET_COMPILER_FLAG("-Wno-error=calloc-transposed-args") SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--as-needed") +STRING(REGEX REPLACE "-Wframe-larger-than=[0-9]*" "" + CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") +STRING(REGEX REPLACE "-Wframe-larger-than=[0-9]*" "" + CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") +STRING(REGEX REPLACE "-Wframe-larger-than=[0-9]*" "" + CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") + # this does everything, gets the var from the correct scope, appends new # values, sets in the correct scope macro(APPEND_FOR_CPACK V) diff --git a/storage/connect/bsonudf.cpp b/storage/connect/bsonudf.cpp index 2dad053a69c..1ca10979ae2 100644 --- a/storage/connect/bsonudf.cpp +++ b/storage/connect/bsonudf.cpp @@ -192,7 +192,7 @@ my_bool BJNX::SetJpath(PGLOBAL g, char* path, my_bool jb) /*********************************************************************************/ /* Analyse array processing options. */ /*********************************************************************************/ -my_bool BJNX::SetArrayOptions(PGLOBAL g, char* p, int i, PSZ nm) +my_bool BJNX::SetArrayOptions(PGLOBAL g, char* p, int i) { int n = (int)strlen(p); my_bool dg = true, b = false; @@ -340,7 +340,7 @@ my_bool BJNX::ParseJpath(PGLOBAL g) // Jpath must be explicit if (a || *p == 0 || *p == '[' || IsNum(p)) { // Analyse intermediate array processing - if (SetArrayOptions(g, p, i, Nodes[i - 1].Key)) + if (SetArrayOptions(g, p, i)) return true; } else if (*p == '*') { @@ -1973,7 +1973,7 @@ my_bool bsonvalue_init(UDF_INIT* initid, UDF_ARGS* args, char* message) } // end of bsonvalue_init char* bsonvalue(UDF_INIT* initid, UDF_ARGS* args, char* result, - unsigned long* res_length, char*, char*) + unsigned long* res_length, uchar *, uchar *) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2015,7 +2015,7 @@ my_bool bson_make_array_init(UDF_INIT* initid, UDF_ARGS* args, char* message) } // end of bson_make_array_init char* bson_make_array(UDF_INIT* initid, UDF_ARGS* args, char* result, - unsigned long* res_length, char*, char*) + unsigned long* res_length, uchar *, uchar *) { char* str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2082,7 +2082,7 @@ my_bool bson_array_add_values_init(UDF_INIT* initid, UDF_ARGS* args, char* messa } // end of bson_array_add_values_init char* bson_array_add_values(UDF_INIT* initid, UDF_ARGS* args, char* result, - unsigned long* res_length, char* is_null, char*) { + unsigned long* res_length, uchar * is_null, uchar *) { char* str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2160,7 +2160,7 @@ my_bool bson_array_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_array_add_init char *bson_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2264,7 +2264,7 @@ my_bool bson_array_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_array_delete_init char *bson_array_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2333,7 +2333,7 @@ my_bool bson_make_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_make_object_init char *bson_make_object(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, uchar *, uchar *) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2382,7 +2382,7 @@ my_bool bson_object_nonull_init(UDF_INIT *initid, UDF_ARGS *args, } // end of bson_object_nonull_init char *bson_object_nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, uchar *, uchar *) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2436,7 +2436,7 @@ my_bool bson_object_key_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_object_key_init char *bson_object_key(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, uchar *, uchar *) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2505,7 +2505,7 @@ my_bool bson_object_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_object_add_init char *bson_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PSZ key; char *str = NULL; @@ -2600,7 +2600,7 @@ my_bool bson_object_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_object_delete_init char *bson_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2679,7 +2679,7 @@ my_bool bson_object_list_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_object_list_init char *bson_object_list(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2746,7 +2746,7 @@ my_bool bson_object_values_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_object_values_init char *bson_object_values(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2816,7 +2816,7 @@ my_bool bsonset_def_prec_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bsonset_def_prec_init -long long bsonset_def_prec(UDF_INIT *initid, UDF_ARGS *args, char *, char *) +long long bsonset_def_prec(UDF_INIT *initid, UDF_ARGS *args, uchar *, uchar *) { long long n = *(long long*)args->args[0]; @@ -2837,7 +2837,7 @@ my_bool bsonget_def_prec_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bsonget_def_prec_init -long long bsonget_def_prec(UDF_INIT *initid, UDF_ARGS *args, char *, char *) +long long bsonget_def_prec(UDF_INIT *initid, UDF_ARGS *args, uchar *, uchar *) { return (long long)GetJsonDefPrec(); } // end of bsonget_def_prec @@ -2855,7 +2855,7 @@ my_bool bsonset_grp_size_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bsonset_grp_size_init -long long bsonset_grp_size(UDF_INIT *initid, UDF_ARGS *args, char *, char *) +long long bsonset_grp_size(UDF_INIT *initid, UDF_ARGS *args, uchar *, uchar *) { long long n = *(long long*)args->args[0]; @@ -2876,7 +2876,7 @@ my_bool bsonget_grp_size_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bsonget_grp_size_init -long long bsonget_grp_size(UDF_INIT *initid, UDF_ARGS *args, char *, char *) +long long bsonget_grp_size(UDF_INIT *initid, UDF_ARGS *args, uchar *, uchar *) { return (long long)GetJsonGroupSize(); } // end of bsonget_grp_size @@ -2910,7 +2910,7 @@ my_bool bson_array_grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return false; } // end of bson_array_grp_init -void bson_array_grp_clear(UDF_INIT *initid, char*, char*) +void bson_array_grp_clear(UDF_INIT *initid, uchar *, uchar *) { PGLOBAL g = (PGLOBAL)initid->ptr; PBJNX bxp = (PBJNX)((char*)g->Sarea + sizeof(POOLHEADER)); @@ -2920,7 +2920,7 @@ void bson_array_grp_clear(UDF_INIT *initid, char*, char*) g->N = GetJsonGroupSize(); } // end of bson_array_grp_clear -void bson_array_grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) +void bson_array_grp_add(UDF_INIT *initid, UDF_ARGS *args, uchar *, uchar *) { PGLOBAL g = (PGLOBAL)initid->ptr; PBJNX bxp = (PBJNX)((char*)g->Sarea + sizeof(POOLHEADER)); @@ -2932,7 +2932,7 @@ void bson_array_grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) } // end of bson_array_grp_add char *bson_array_grp(UDF_INIT *initid, UDF_ARGS *, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, uchar *, uchar *) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2983,7 +2983,7 @@ my_bool bson_object_grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return false; } // end of bson_object_grp_init -void bson_object_grp_clear(UDF_INIT *initid, char*, char*) +void bson_object_grp_clear(UDF_INIT *initid, uchar *, uchar *) { PGLOBAL g = (PGLOBAL)initid->ptr; PBJNX bxp = (PBJNX)((char*)g->Sarea + sizeof(POOLHEADER)); @@ -2993,7 +2993,7 @@ void bson_object_grp_clear(UDF_INIT *initid, char*, char*) g->N = GetJsonGroupSize(); } // end of bson_object_grp_clear -void bson_object_grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) +void bson_object_grp_add(UDF_INIT *initid, UDF_ARGS *args, uchar *, uchar *) { PGLOBAL g = (PGLOBAL)initid->ptr; PBJNX bxp = (PBJNX)((char*)g->Sarea + sizeof(POOLHEADER)); @@ -3005,7 +3005,7 @@ void bson_object_grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) } // end of bson_object_grp_add char *bson_object_grp(UDF_INIT *initid, UDF_ARGS *, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, uchar *, uchar *) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3046,7 +3046,7 @@ my_bool bson_test_init(UDF_INIT* initid, UDF_ARGS* args, char* message) { } // end of bson_test_init char* bson_test(UDF_INIT* initid, UDF_ARGS* args, char* result, - unsigned long* res_length, char* is_null, char* error) { + unsigned long* res_length, uchar * is_null, uchar * error) { char* str = NULL, *fn = NULL; int pretty = 1; PBVAL bvp; @@ -3150,7 +3150,7 @@ my_bool bsonlocate_init(UDF_INIT* initid, UDF_ARGS* args, char* message) { } // end of bsonlocate_init char* bsonlocate(UDF_INIT* initid, UDF_ARGS* args, char* result, - unsigned long* res_length, char* is_null, char* error) { + unsigned long* res_length, uchar * is_null, uchar * error) { char *path = NULL; int k; PBVAL bvp, bvp2; @@ -3271,7 +3271,7 @@ my_bool bson_locate_all_init(UDF_INIT* initid, UDF_ARGS* args, char* message) { } // end of bson_locate_all_init char* bson_locate_all(UDF_INIT* initid, UDF_ARGS* args, char* result, - unsigned long* res_length, char* is_null, char* error) { + unsigned long* res_length, uchar * is_null, uchar * error) { char* path = NULL; int mx = 10; PBVAL bvp, bvp2; @@ -3396,9 +3396,10 @@ my_bool bson_contains_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return JsonInit(initid, args, message, false, reslen, memlen, more); } // end of bson contains_init -long long bson_contains(UDF_INIT *initid, UDF_ARGS *args, char *, char *error) +long long bson_contains(UDF_INIT *initid, UDF_ARGS *args, uchar *, uchar *error) { - char isn, res[256]; + unsigned char isn; + char res[256]; unsigned long reslen; isn = 0; @@ -3445,7 +3446,7 @@ my_bool bsoncontains_path_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return JsonInit(initid, args, message, true, reslen, memlen, more); } // end of bsoncontains_path_init -long long bsoncontains_path(UDF_INIT *initid, UDF_ARGS *args, char *, char *error) +long long bsoncontains_path(UDF_INIT *initid, UDF_ARGS *args, uchar *, uchar *error) { char *p, *path; long long n; @@ -3560,7 +3561,7 @@ my_bool bson_item_merge_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_item_merge_init char *bson_item_merge(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3670,7 +3671,7 @@ my_bool bson_get_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_get_item_init char *bson_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *) + unsigned long *res_length, uchar *is_null, uchar *) { char *path, *str = NULL; PBVAL jvp; @@ -3776,7 +3777,7 @@ my_bool bsonget_string_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bsonget_string_init char *bsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *) + unsigned long *res_length, uchar *is_null, uchar *) { char *p, *path, *str = NULL; PBVAL jsp, jvp; @@ -3887,7 +3888,7 @@ my_bool bsonget_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bsonget_int_init long long bsonget_int(UDF_INIT *initid, UDF_ARGS *args, - char *is_null, char *error) + uchar *is_null, uchar *error) { char *p, *path; long long n; @@ -4009,7 +4010,7 @@ my_bool bsonget_real_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bsonget_real_init double bsonget_real(UDF_INIT *initid, UDF_ARGS *args, - char *is_null, char *error) + uchar *is_null, uchar *error) { char *p, *path; double d; @@ -4131,7 +4132,7 @@ my_bool bson_delete_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_delete_item_init char *bson_delete_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *path, *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -4214,7 +4215,7 @@ void bson_delete_item_deinit(UDF_INIT* initid) /* This function is used by the json_set/insert/update_item functions. */ /*********************************************************************************/ static char *bson_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *path, *str = NULL; int w; @@ -4361,7 +4362,7 @@ my_bool bson_set_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_set_item_init char *bson_set_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *p) + unsigned long *res_length, uchar *is_null, uchar *p) { strcpy(result, "$set"); return bson_handle_item(initid, args, result, res_length, is_null, p); @@ -4381,7 +4382,7 @@ my_bool bson_insert_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_insert_item_init char *bson_insert_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *p) + unsigned long *res_length, uchar *is_null, uchar *p) { strcpy(result, "$insert"); return bson_handle_item(initid, args, result, res_length, is_null, p); @@ -4401,7 +4402,7 @@ my_bool bson_update_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_update_item_init char *bson_update_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *p) + unsigned long *res_length, uchar *is_null, uchar *p) { strcpy(result, "$update"); return bson_handle_item(initid, args, result, res_length, is_null, p); @@ -4460,7 +4461,7 @@ my_bool bson_file_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_file_init char *bson_file(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *fn, *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -4553,7 +4554,7 @@ my_bool bfile_make_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bfile_make_init char *bfile_make(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *) + unsigned long *res_length, uchar *is_null, uchar *) { char *p, *str = NULL, *fn = NULL; int n, pretty = 2; @@ -4674,7 +4675,7 @@ my_bool bfile_convert_init(UDF_INIT* initid, UDF_ARGS* args, char* message) { } // end of bfile_convert_init char *bfile_convert(UDF_INIT* initid, UDF_ARGS* args, char* result, - unsigned long *res_length, char *is_null, char *error) { + unsigned long *res_length, uchar *is_null, uchar *error) { char *str, *fn, *ofn; int lrecl = (int)*(longlong*)args->args[2]; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -4733,7 +4734,7 @@ my_bool bfile_bjson_init(UDF_INIT* initid, UDF_ARGS* args, char* message) { } // end of bfile_bjson_init char *bfile_bjson(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char*, char *error) { + unsigned long *res_length, uchar *, uchar *error) { char *buf, *str = NULL, fn[_MAX_PATH], ofn[_MAX_PATH]; bool loop; ssize_t len, newloc; @@ -4847,7 +4848,7 @@ my_bool bson_serialize_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bson_serialize_init char *bson_serialize(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *error) + unsigned long *res_length, uchar *, uchar *error) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -4894,7 +4895,7 @@ my_bool bbin_make_array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_make_array_init char *bbin_make_array(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = NULL; @@ -4967,7 +4968,7 @@ my_bool bbin_array_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_array_add_init char *bbin_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = NULL; @@ -5036,7 +5037,7 @@ my_bool bbin_array_add_values_init(UDF_INIT* initid, UDF_ARGS* args, char* messa } // end of bbin_array_add_values_init char* bbin_array_add_values(UDF_INIT* initid, UDF_ARGS* args, char* result, - unsigned long* res_length, char* is_null, char* error) + unsigned long* res_length, uchar * is_null, uchar * error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = NULL; @@ -5088,18 +5089,18 @@ my_bool bbin_array_grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return bson_array_grp_init(initid, args, message); } // end of bbin_array_grp_init -void bbin_array_grp_clear(UDF_INIT *initid, char *a, char *b) +void bbin_array_grp_clear(UDF_INIT *initid, uchar *a, uchar *b) { bson_array_grp_clear(initid, a, b); } // end of bbin_array_grp_clear -void bbin_array_grp_add(UDF_INIT *initid, UDF_ARGS *args, char *a, char *b) +void bbin_array_grp_add(UDF_INIT *initid, UDF_ARGS *args, uchar *a, uchar *b) { bson_array_grp_add(initid, args, a, b); } // end of bbin_array_grp_add char *bbin_array_grp(UDF_INIT *initid, UDF_ARGS *, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PBSON bsp = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -5136,18 +5137,18 @@ my_bool bbin_object_grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return bson_object_grp_init(initid, args, message); } // end of bbin_object_grp_init -void bbin_object_grp_clear(UDF_INIT *initid, char *a, char *b) +void bbin_object_grp_clear(UDF_INIT *initid, uchar *a, uchar *b) { bson_object_grp_clear(initid, a, b); } // end of bbin_object_grp_clear -void bbin_object_grp_add(UDF_INIT *initid, UDF_ARGS *args, char *a, char *b) +void bbin_object_grp_add(UDF_INIT *initid, UDF_ARGS *args, uchar *a, uchar *b) { bson_object_grp_add(initid, args, a, b); } // end of bbin_object_grp_add char *bbin_object_grp(UDF_INIT *initid, UDF_ARGS *, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PBSON bsp = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -5188,7 +5189,7 @@ my_bool bbin_make_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_make_object_init char *bbin_make_object(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = (PBSON)g->Xchk; @@ -5242,7 +5243,7 @@ my_bool bbin_object_nonull_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_object_nonull_init char *bbin_object_nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = (PBSON)g->Xchk; @@ -5302,7 +5303,7 @@ my_bool bbin_object_key_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_object_key_init char *bbin_object_key(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = (PBSON)g->Xchk; @@ -5364,7 +5365,7 @@ my_bool bbin_object_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_object_add_init char *bbin_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = NULL; @@ -5426,7 +5427,7 @@ my_bool bbin_array_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_array_delete_init char *bbin_array_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = NULL; @@ -5497,7 +5498,7 @@ my_bool bbin_object_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_object_delete_init char *bbin_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = NULL; @@ -5556,7 +5557,7 @@ my_bool bbin_object_list_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_object_list_init char *bbin_object_list(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = (PBSON)g->Xchk; @@ -5608,7 +5609,7 @@ my_bool bbin_object_values_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_object_values_init char *bbin_object_values(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = (PBSON)g->Xchk; @@ -5663,7 +5664,7 @@ my_bool bbin_get_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_get_item_init char *bbin_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PBSON bsp = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -5713,7 +5714,7 @@ my_bool bbin_item_merge_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_item_merge_init char *bbin_item_merge(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PBSON bsp = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -5786,7 +5787,7 @@ void bbin_item_merge_deinit(UDF_INIT* initid) /* This function is used by the jbin_set/insert/update_item functions. */ /*********************************************************************************/ static char *bbin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *path; int w; @@ -5892,7 +5893,7 @@ my_bool bbin_set_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_set_item_init char *bbin_set_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *p) + unsigned long *res_length, uchar *is_null, uchar *p) { strcpy(result, "$set"); return bbin_handle_item(initid, args, result, res_length, is_null, p); @@ -5912,7 +5913,7 @@ my_bool bbin_insert_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_insert_item_init char *bbin_insert_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *p) + unsigned long *res_length, uchar *is_null, uchar *p) { strcpy(result, "$insert"); return bbin_handle_item(initid, args, result, res_length, is_null, p); @@ -5932,7 +5933,7 @@ my_bool bbin_update_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_update_item_init char *bbin_update_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *p) + unsigned long *res_length, uchar *is_null, uchar *p) { strcpy(result, "$update"); return bbin_handle_item(initid, args, result, res_length, is_null, p); @@ -5952,7 +5953,7 @@ my_bool bbin_delete_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_delete_item_init char *bbin_delete_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *path; PBSON bsp = NULL; @@ -6046,7 +6047,7 @@ my_bool bbin_file_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of bbin_file_init char *bbin_file(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *fn; int pretty = 3; @@ -6123,7 +6124,7 @@ my_bool bbin_locate_all_init(UDF_INIT* initid, UDF_ARGS* args, char* message) { } // end of bbin_locate_all_init char* bbin_locate_all(UDF_INIT* initid, UDF_ARGS* args, char* result, - unsigned long* res_length, char* is_null, char* error) { + unsigned long* res_length, uchar * is_null, uchar * error) { char *path = NULL; int mx = 10; PBVAL bvp, bvp2; diff --git a/storage/connect/bsonudf.h b/storage/connect/bsonudf.h index e355fe7b48e..7d7598574c0 100644 --- a/storage/connect/bsonudf.h +++ b/storage/connect/bsonudf.h @@ -10,9 +10,6 @@ #include "bson.h" #if 0 -#define UDF_EXEC_ARGS \ - UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char* - // BSON size should be equal on Linux and Windows #define BMX 255 typedef struct BSON* PBSON; @@ -119,7 +116,7 @@ public: PBSON MakeBinResult(UDF_ARGS* args, PBVAL top, ulong len, int n = 2); protected: - my_bool SetArrayOptions(PGLOBAL g, char* p, int i, PSZ nm); + my_bool SetArrayOptions(PGLOBAL g, char* p, int i); PVAL GetColumnValue(PGLOBAL g, PBVAL row, int i); PVAL ExpandArray(PGLOBAL g, PBVAL arp, int n); PVAL CalculateArray(PGLOBAL g, PBVAL arp, int n); @@ -205,11 +202,11 @@ extern "C" { DllExport void bson_locate_all_deinit(UDF_INIT*); DllExport my_bool bson_contains_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long bson_contains(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport long long bson_contains(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport void bson_contains_deinit(UDF_INIT*); DllExport my_bool bsoncontains_path_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long bsoncontains_path(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport long long bsoncontains_path(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport void bsoncontains_path_deinit(UDF_INIT*); DllExport my_bool bson_make_object_init(UDF_INIT*, UDF_ARGS*, char*); @@ -253,34 +250,34 @@ extern "C" { DllExport void bsonget_string_deinit(UDF_INIT*); DllExport my_bool bsonget_int_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long bsonget_int(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport long long bsonget_int(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport void bsonget_int_deinit(UDF_INIT*); DllExport my_bool bsonget_real_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport double bsonget_real(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport double bsonget_real(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport void bsonget_real_deinit(UDF_INIT*); DllExport my_bool bsonset_def_prec_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long bsonset_def_prec(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport long long bsonset_def_prec(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport my_bool bsonget_def_prec_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long bsonget_def_prec(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport long long bsonget_def_prec(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport my_bool bsonset_grp_size_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long bsonset_grp_size(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport long long bsonset_grp_size(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport my_bool bsonget_grp_size_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long bsonget_grp_size(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport long long bsonget_grp_size(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport my_bool bson_array_grp_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport void bson_array_grp_clear(UDF_INIT *, char *, char *); - DllExport void bson_array_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); + DllExport void bson_array_grp_clear(UDF_INIT *, uchar *, uchar *); + DllExport void bson_array_grp_add(UDF_INIT *, UDF_ARGS *, uchar *, uchar *); DllExport char *bson_array_grp(UDF_EXEC_ARGS); DllExport void bson_array_grp_deinit(UDF_INIT*); DllExport my_bool bson_object_grp_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport void bson_object_grp_clear(UDF_INIT *, char *, char *); - DllExport void bson_object_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); + DllExport void bson_object_grp_clear(UDF_INIT *, uchar *, uchar *); + DllExport void bson_object_grp_add(UDF_INIT *, UDF_ARGS *, uchar *, uchar *); DllExport char *bson_object_grp(UDF_EXEC_ARGS); DllExport void bson_object_grp_deinit(UDF_INIT*); @@ -337,14 +334,14 @@ extern "C" { DllExport void bbin_array_delete_deinit(UDF_INIT*); DllExport my_bool bbin_array_grp_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport void bbin_array_grp_clear(UDF_INIT *, char *, char *); - DllExport void bbin_array_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); + DllExport void bbin_array_grp_clear(UDF_INIT *, uchar *, uchar *); + DllExport void bbin_array_grp_add(UDF_INIT *, UDF_ARGS *, uchar *, uchar *); DllExport char *bbin_array_grp(UDF_EXEC_ARGS); DllExport void bbin_array_grp_deinit(UDF_INIT*); DllExport my_bool bbin_object_grp_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport void bbin_object_grp_clear(UDF_INIT *, char *, char *); - DllExport void bbin_object_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); + DllExport void bbin_object_grp_clear(UDF_INIT *, uchar *, uchar *); + DllExport void bbin_object_grp_add(UDF_INIT *, UDF_ARGS *, uchar *, uchar *); DllExport char *bbin_object_grp(UDF_EXEC_ARGS); DllExport void bbin_object_grp_deinit(UDF_INIT*); diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index fa53157d92d..ef2b23b8892 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -7019,9 +7019,6 @@ PRAGMA_REENABLE_CHECK_STACK_FRAME - user has file privilege */ -/* Stack size 16664 in clang */ -PRAGMA_DISABLE_CHECK_STACK_FRAME - bool ha_connect::FileExists(const char *fn, bool bf) { if (!fn || !*fn) @@ -7057,10 +7054,9 @@ bool ha_connect::FileExists(const char *fn, bool bf) if (n < 0) { if (errno != ENOENT) { - char buf[_MAX_PATH + 20]; - - snprintf(buf, sizeof(buf), "Error %d for file %s", errno, filename); - push_warning(table->in_use, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, buf); + push_warning_printf(table->in_use, Sql_condition::WARN_LEVEL_WARN, + ER_UNKNOWN_ERROR, + "Error %d for file %s", errno, filename); return true; } else return false; @@ -7072,7 +7068,6 @@ bool ha_connect::FileExists(const char *fn, bool bf) return true; } // end of FileExists -PRAGMA_REENABLE_CHECK_STACK_FRAME // Called by SameString and NoFieldOptionChange bool ha_connect::CheckString(PCSZ str1, PCSZ str2) diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index f87ac091f81..f48b3ef3c2d 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -29,9 +29,9 @@ #define M 9 static char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error); + unsigned long *res_length, uchar *is_null, uchar *error); static char *bin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error); + unsigned long *res_length, uchar *is_null, uchar *error); static PJSON JsonNew(PGLOBAL g, JTYP type); static PJVAL JvalNew(PGLOBAL g, JTYP type, void *vp = NULL); static PJSNX JsnxNew(PGLOBAL g, PJSON jsp, int type, int len = 64); @@ -113,7 +113,7 @@ my_bool JSNX::SetJpath(PGLOBAL g, char *path, my_bool jb) /*********************************************************************************/ /* Analyse array processing options. */ /*********************************************************************************/ -my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) +my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i) { int n = (int)strlen(p); my_bool dg = true, b = false; @@ -263,7 +263,7 @@ my_bool JSNX::ParseJpath(PGLOBAL g) // Jpath must be explicit if (a || *p == 0 || *p == '[' || IsNum(p)) { // Analyse intermediate array processing - if (SetArrayOptions(g, p, i, Nodes[i-1].Key)) + if (SetArrayOptions(g, p, i)) return true; } else if (*p == '*') { @@ -2066,7 +2066,7 @@ my_bool jsonvalue_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jsonvalue_init char *jsonvalue(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, uchar *, uchar *) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2107,7 +2107,7 @@ my_bool json_make_array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_make_array_init char *json_make_array(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, uchar *, uchar *) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2174,7 +2174,7 @@ my_bool json_array_add_values_init(UDF_INIT *initid, UDF_ARGS *args, char *messa } // end of json_array_add_values_init char *json_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *) + unsigned long *res_length, uchar *is_null, uchar *) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2256,7 +2256,7 @@ my_bool json_array_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_array_add_init char *json_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2364,7 +2364,7 @@ my_bool json_array_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_array_delete_init char *json_array_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2444,7 +2444,7 @@ my_bool jsonsum_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return JsonInit(initid, args, message, true, reslen, memlen, more); } // end of jsonsum_int_init -long long jsonsum_int(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) +long long jsonsum_int(UDF_INIT *initid, UDF_ARGS *args, uchar *is_null, uchar *error) { long long n = 0LL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2519,7 +2519,7 @@ my_bool jsonsum_real_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return JsonInit(initid, args, message, true, reslen, memlen, more); } // end of jsonsum_real_init -double jsonsum_real(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) +double jsonsum_real(UDF_INIT *initid, UDF_ARGS *args, uchar *is_null, uchar *error) { double n = 0.0; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2583,7 +2583,7 @@ my_bool jsonavg_real_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return jsonsum_real_init(initid, args, message); } // end of jsonavg_real_init -double jsonavg_real(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error) +double jsonavg_real(UDF_INIT *initid, UDF_ARGS *args, uchar *is_null, uchar *error) { double n = 0.0; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2654,7 +2654,7 @@ my_bool json_make_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_make_object_init char *json_make_object(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, uchar *, uchar *) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2702,7 +2702,7 @@ my_bool json_object_nonull_init(UDF_INIT *initid, UDF_ARGS *args, } // end of json_object_nonull_init char *json_object_nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, uchar *, uchar *) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2756,7 +2756,7 @@ my_bool json_object_key_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_object_key_init char *json_object_key(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, uchar *, uchar *) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2824,7 +2824,8 @@ my_bool json_object_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_object_add_init char *json_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, + uchar *error) { PCSZ key; char *str = NULL; @@ -2920,7 +2921,7 @@ my_bool json_object_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_object_delete_init char *json_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -2997,7 +2998,7 @@ my_bool json_object_list_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_object_list_init char *json_object_list(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3073,7 +3074,7 @@ my_bool json_object_values_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_object_list_init char *json_object_values(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3142,7 +3143,7 @@ my_bool jsonset_grp_size_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jsonset_grp_size_init -long long jsonset_grp_size(UDF_INIT *initid, UDF_ARGS *args, char *, char *) +long long jsonset_grp_size(UDF_INIT *initid, UDF_ARGS *args, uchar *, uchar *) { long long n = *(long long*)args->args[0]; @@ -3163,7 +3164,7 @@ my_bool jsonget_grp_size_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jsonget_grp_size_init -long long jsonget_grp_size(UDF_INIT *initid, UDF_ARGS *args, char *, char *) +long long jsonget_grp_size(UDF_INIT *initid, UDF_ARGS *args, uchar *, uchar *) { return (long long)GetJsonGroupSize(); } // end of jsonget_grp_size @@ -3198,7 +3199,7 @@ my_bool json_array_grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return false; } // end of json_array_grp_init -void json_array_grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) +void json_array_grp_add(UDF_INIT *initid, UDF_ARGS *args, uchar *, uchar *) { PGLOBAL g = (PGLOBAL)initid->ptr; PJAR arp = (PJAR)g->Activityp; @@ -3209,7 +3210,7 @@ void json_array_grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) } // end of json_array_grp_add char *json_array_grp(UDF_INIT *initid, UDF_ARGS *, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, uchar *, uchar *) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3231,7 +3232,7 @@ char *json_array_grp(UDF_INIT *initid, UDF_ARGS *, char *result, return str; } // end of json_array_grp -void json_array_grp_clear(UDF_INIT *initid, char*, char*) +void json_array_grp_clear(UDF_INIT *initid, uchar *, uchar *) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3275,7 +3276,7 @@ my_bool json_object_grp_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return false; } // end of json_object_grp_init -void json_object_grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) +void json_object_grp_add(UDF_INIT *initid, UDF_ARGS *args, uchar *, uchar *) { PGLOBAL g = (PGLOBAL)initid->ptr; PJOB objp = (PJOB)g->Activityp; @@ -3286,7 +3287,7 @@ void json_object_grp_add(UDF_INIT *initid, UDF_ARGS *args, char*, char*) } // end of json_object_grp_add char *json_object_grp(UDF_INIT *initid, UDF_ARGS *, char *result, - unsigned long *res_length, char *, char *) + unsigned long *res_length, uchar *, uchar *) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3302,7 +3303,7 @@ char *json_object_grp(UDF_INIT *initid, UDF_ARGS *, char *result, return str; } // end of json_object_grp -void json_object_grp_clear(UDF_INIT *initid, char*, char*) +void json_object_grp_clear(UDF_INIT *initid, uchar *, uchar *) { PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3352,7 +3353,7 @@ my_bool json_item_merge_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_item_merge_init char *json_item_merge(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *str = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -3451,7 +3452,7 @@ my_bool json_get_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_get_item_init char *json_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *) + unsigned long *res_length, uchar *is_null, uchar *) { char *path, *str = NULL; PJSON jsp; @@ -3558,7 +3559,7 @@ my_bool jsonget_string_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jsonget_string_init char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *) + unsigned long *res_length, uchar *is_null, uchar *) { char *p, *path, *str = NULL; PJSON jsp; @@ -3667,7 +3668,7 @@ my_bool jsonget_int_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jsonget_int_init long long jsonget_int(UDF_INIT *initid, UDF_ARGS *args, - char *is_null, char *error) + uchar *is_null, uchar *error) { char *p, *path; long long n; @@ -3787,7 +3788,7 @@ my_bool jsonget_real_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jsonget_real_init double jsonget_real(UDF_INIT *initid, UDF_ARGS *args, - char *is_null, char *error) + uchar *is_null, uchar *error) { char *p, *path; double d; @@ -3908,7 +3909,7 @@ my_bool jsonlocate_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jsonlocate_init char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *path = NULL; int k; @@ -4036,7 +4037,7 @@ my_bool json_locate_all_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_locate_all_init char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *p, *path = NULL; int mx = 10; @@ -4162,9 +4163,10 @@ my_bool jsoncontains_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return JsonInit(initid, args, message, false, reslen, memlen, more); } // end of jsoncontains_init -long long jsoncontains(UDF_INIT *initid, UDF_ARGS *args, char *, char *error) +long long jsoncontains(UDF_INIT *initid, UDF_ARGS *args, uchar *, uchar *error) { - char isn, res[256]; + unsigned char isn; + char res[256]; unsigned long reslen; isn = 0; @@ -4211,7 +4213,7 @@ my_bool jsoncontains_path_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return JsonInit(initid, args, message, true, reslen, memlen, more); } // end of jsoncontains_path_init -long long jsoncontains_path(UDF_INIT *initid, UDF_ARGS *args, char *, char *error) +long long jsoncontains_path(UDF_INIT *initid, UDF_ARGS *args, uchar *, uchar *error) { char *p, *path; long long n; @@ -4291,7 +4293,7 @@ void jsoncontains_path_deinit(UDF_INIT* initid) /* This function is used by the json_set/insert/update_item functions. */ /*********************************************************************************/ char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *p, *path, *str = NULL; int w; @@ -4441,7 +4443,7 @@ my_bool json_set_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_set_item_init char *json_set_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *p) + unsigned long *res_length, uchar *is_null, uchar *p) { strcpy(result, "$set"); return handle_item(initid, args, result, res_length, is_null, p); @@ -4461,7 +4463,7 @@ my_bool json_insert_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_insert_item_init char *json_insert_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *p) + unsigned long *res_length, uchar *is_null, uchar *p) { strcpy(result, "$insert"); return handle_item(initid, args, result, res_length, is_null, p); @@ -4481,7 +4483,7 @@ my_bool json_update_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_update_item_init char *json_update_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *p) + unsigned long *res_length, uchar *is_null, uchar *p) { strcpy(result, "$update"); return handle_item(initid, args, result, res_length, is_null, p); @@ -4540,7 +4542,7 @@ my_bool json_file_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_file_init char *json_file(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *str, *fn; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -4637,7 +4639,7 @@ my_bool jfile_make_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jfile_make_init char *jfile_make(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *) + unsigned long *res_length, uchar *is_null, uchar *) { char *p, *str = NULL, *fn = NULL; int n, pretty = 2; @@ -4745,7 +4747,7 @@ my_bool jbin_array_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_array_init char *jbin_array(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = (PBSON)g->Xchk; @@ -4806,7 +4808,7 @@ my_bool jbin_array_add_values_init(UDF_INIT *initid, UDF_ARGS *args, char *messa } // end of jbin_array_add_values_init char *jbin_array_add_values(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = (PBSON)g->Xchk; @@ -4880,7 +4882,7 @@ my_bool jbin_array_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_array_add_init char *jbin_array_add(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { int n = 2; PJSON top = NULL; @@ -4970,7 +4972,7 @@ my_bool jbin_array_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_array_delete_init char *jbin_array_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PJSON top = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -5039,7 +5041,7 @@ my_bool jbin_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_object_init char *jbin_object(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = (PBSON)g->Xchk; @@ -5094,7 +5096,7 @@ my_bool jbin_object_nonull_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_object_nonull_init char *jbin_object_nonull(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = (PBSON)g->Xchk; @@ -5155,7 +5157,7 @@ my_bool jbin_object_key_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_object_key_init char *jbin_object_key(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PGLOBAL g = (PGLOBAL)initid->ptr; PBSON bsp = (PBSON)g->Xchk; @@ -5217,7 +5219,7 @@ my_bool jbin_object_add_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_object_add_init char *jbin_object_add(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PJSON top = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -5297,7 +5299,7 @@ my_bool jbin_object_delete_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_object_delete_init char *jbin_object_delete(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PJSON top = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -5360,7 +5362,7 @@ my_bool jbin_object_list_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_object_list_init char *jbin_object_list(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PJAR jarp = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -5421,7 +5423,7 @@ my_bool jbin_get_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_get_item_init char *jbin_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *path; PJSON jsp; @@ -5514,7 +5516,7 @@ my_bool jbin_item_merge_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_item_merge_init char *jbin_item_merge(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { PJSON top = NULL; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -5574,7 +5576,7 @@ void jbin_item_merge_deinit(UDF_INIT* initid) /* This function is used by the jbin_set/insert/update functions. */ /*********************************************************************************/ char *bin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *p, *path; int w; @@ -5698,7 +5700,7 @@ my_bool jbin_set_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_set_item_init char *jbin_set_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *p) + unsigned long *res_length, uchar *is_null, uchar *p) { strcpy(result, "$set"); return bin_handle_item(initid, args, result, res_length, is_null, p); @@ -5718,7 +5720,7 @@ my_bool jbin_insert_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_insert_item_init char *jbin_insert_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *p) + unsigned long *res_length, uchar *is_null, uchar *p) { strcpy(result, "$insert"); return bin_handle_item(initid, args, result, res_length, is_null, p); @@ -5738,7 +5740,7 @@ my_bool jbin_update_item_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_update_item_init char *jbin_update_item(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *p) + unsigned long *res_length, uchar *is_null, uchar *p) { strcpy(result, "$update"); return bin_handle_item(initid, args, result, res_length, is_null, p); @@ -5786,7 +5788,7 @@ my_bool jbin_file_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of jbin_file_init char *jbin_file(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *error) + unsigned long *res_length, uchar *is_null, uchar *error) { char *fn; int pretty = 3, pty = 3; @@ -5881,7 +5883,7 @@ my_bool json_serialize_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of json_serialize_init char *json_serialize(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *, char *error) + unsigned long *res_length, uchar *, uchar *error) { char *str; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -5937,7 +5939,7 @@ my_bool jfile_convert_init(UDF_INIT* initid, UDF_ARGS* args, char* message) { } // end of jfile_convert_init char *jfile_convert(UDF_INIT* initid, UDF_ARGS* args, char* result, - unsigned long *res_length, char *is_null, char *error) { + unsigned long *res_length, uchar *is_null, uchar *error) { char *str, *fn, *ofn; int lrecl = (int)*(longlong*)args->args[2]; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -5996,7 +5998,7 @@ my_bool jfile_bjson_init(UDF_INIT* initid, UDF_ARGS* args, char* message) { } // end of jfile_bjson_init char *jfile_bjson(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char*, char *error) { + unsigned long *res_length, uchar *, uchar *error) { char *fn, *ofn, *buf, *str = NULL; bool loop; ssize_t len, newloc; @@ -6536,7 +6538,7 @@ my_bool envar_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of envar_init char *envar(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *) + unsigned long *res_length, uchar *is_null, uchar *) { char *str, name[256]; int n = MY_MIN(args->lengths[0], sizeof(name) - 1); @@ -6574,7 +6576,7 @@ my_bool uvar_init(UDF_INIT *initid, UDF_ARGS *args, char *message) } // end of uvar_init char *uvar(UDF_INIT *initid, UDF_ARGS *args, char *result, - unsigned long *res_length, char *is_null, char *) + unsigned long *res_length, uchar *is_null, uchar *) { char *str, varname[256]; PGLOBAL g = (PGLOBAL)initid->ptr; @@ -6618,7 +6620,7 @@ my_bool countin_init(UDF_INIT *initid, UDF_ARGS *args, char *message) return false; } // end of countin_init -long long countin(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *) +long long countin(UDF_INIT *initid, UDF_ARGS *args, uchar *is_null, uchar *) { PSZ str1, str2; char *s; diff --git a/storage/connect/jsonudf.h b/storage/connect/jsonudf.h index 4378bddf9ba..a7defed8e54 100644 --- a/storage/connect/jsonudf.h +++ b/storage/connect/jsonudf.h @@ -14,7 +14,7 @@ #include "json.h" #define UDF_EXEC_ARGS \ - UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char* + UDF_INIT*, UDF_ARGS*, char*, unsigned long*, uchar *, uchar * // BSON size should be equal on Linux and Windows #define BMX 255 @@ -95,15 +95,15 @@ extern "C" { DllExport void json_array_delete_deinit(UDF_INIT*); DllExport my_bool jsonsum_int_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long jsonsum_int(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport long long jsonsum_int(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport void jsonsum_int_deinit(UDF_INIT*); DllExport my_bool jsonsum_real_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport double jsonsum_real(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport double jsonsum_real(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport void jsonsum_real_deinit(UDF_INIT*); DllExport my_bool jsonavg_real_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport double jsonavg_real(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport double jsonavg_real(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport void jsonavg_real_deinit(UDF_INIT*); DllExport my_bool json_make_object_init(UDF_INIT*, UDF_ARGS*, char*); @@ -135,21 +135,21 @@ extern "C" { DllExport void json_object_values_deinit(UDF_INIT*); DllExport my_bool jsonset_grp_size_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long jsonset_grp_size(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport long long jsonset_grp_size(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport my_bool jsonget_grp_size_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long jsonget_grp_size(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport long long jsonget_grp_size(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport my_bool json_array_grp_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport void json_array_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); + DllExport void json_array_grp_add(UDF_INIT *, UDF_ARGS *, uchar *, uchar *); DllExport char *json_array_grp(UDF_EXEC_ARGS); - DllExport void json_array_grp_clear(UDF_INIT *, char *, char *); + DllExport void json_array_grp_clear(UDF_INIT *, uchar *, uchar *); DllExport void json_array_grp_deinit(UDF_INIT*); DllExport my_bool json_object_grp_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport void json_object_grp_add(UDF_INIT *, UDF_ARGS *, char *, char *); + DllExport void json_object_grp_add(UDF_INIT *, UDF_ARGS *, uchar *, uchar *); DllExport char *json_object_grp(UDF_EXEC_ARGS); - DllExport void json_object_grp_clear(UDF_INIT *, char *, char *); + DllExport void json_object_grp_clear(UDF_INIT *, uchar *, uchar *); DllExport void json_object_grp_deinit(UDF_INIT*); DllExport my_bool json_item_merge_init(UDF_INIT*, UDF_ARGS*, char*); @@ -165,15 +165,15 @@ extern "C" { DllExport void jsonget_string_deinit(UDF_INIT*); DllExport my_bool jsonget_int_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long jsonget_int(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport long long jsonget_int(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport void jsonget_int_deinit(UDF_INIT*); DllExport my_bool jsonget_real_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport double jsonget_real(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport double jsonget_real(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport void jsonget_real_deinit(UDF_INIT*); DllExport my_bool jsoncontains_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long jsoncontains(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport long long jsoncontains(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport void jsoncontains_deinit(UDF_INIT*); DllExport my_bool jsonlocate_init(UDF_INIT*, UDF_ARGS*, char*); @@ -185,7 +185,7 @@ extern "C" { DllExport void json_locate_all_deinit(UDF_INIT*); DllExport my_bool jsoncontains_path_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long jsoncontains_path(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport long long jsoncontains_path(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); DllExport void jsoncontains_path_deinit(UDF_INIT*); DllExport my_bool json_set_item_init(UDF_INIT*, UDF_ARGS*, char*); @@ -293,7 +293,7 @@ extern "C" { #endif // DEVELOPMENT DllExport my_bool countin_init(UDF_INIT*, UDF_ARGS*, char*); - DllExport long long countin(UDF_INIT*, UDF_ARGS*, char*, char*); + DllExport long long countin(UDF_INIT*, UDF_ARGS*, uchar *, uchar *); } // extern "C" @@ -330,7 +330,7 @@ public: char *LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx = 10); protected: - my_bool SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm); + my_bool SetArrayOptions(PGLOBAL g, char *p, int i); PVAL GetColumnValue(PGLOBAL g, PJSON row, int i); PVAL ExpandArray(PGLOBAL g, PJAR arp, int n); PVAL GetCalcValue(PGLOBAL g, PJAR bap, int n); diff --git a/storage/connect/mysql-test/connect/r/part_table.result b/storage/connect/mysql-test/connect/r/part_table.result index 0cd4f0115a4..3152bdcecda 100644 --- a/storage/connect/mysql-test/connect/r/part_table.result +++ b/storage/connect/mysql-test/connect/r/part_table.result @@ -164,16 +164,16 @@ Warnings: Note 1105 xt1: 1 affected rows SELECT * FROM t1; id msg -4 four -7 sept 1 one -8 eight -40 forty 10 ten 11 eleven 35 thirty five -72 big +4 four +40 forty 60 big +7 sept +72 big +8 eight 81 big DELETE FROM t1 WHERE id in (60,72); Warnings: @@ -181,14 +181,14 @@ Note 1105 xt3: 2 affected rows Note 1105 xt3: 0 affected rows SELECT * FROM t1; id msg -4 four -7 sept 1 one -8 eight -40 forty 10 ten 11 eleven 35 thirty five +4 four +40 forty +7 sept +8 eight 81 big DROP TABLE t1; CREATE TABLE t1 ( diff --git a/storage/connect/mysql-test/connect/t/part_table.test b/storage/connect/mysql-test/connect/t/part_table.test index 0fb2a11f0f9..0be8563cd52 100644 --- a/storage/connect/mysql-test/connect/t/part_table.test +++ b/storage/connect/mysql-test/connect/t/part_table.test @@ -75,11 +75,14 @@ SELECT * FROM t1 WHERE id = 7; SELECT * FROM t1 WHERE id = 35; UPDATE t1 SET msg = 'number' WHERE id in (60,72); UPDATE t1 SET msg = 'soixante' WHERE id = 60; +--sorted_result SELECT * FROM t1 WHERE id > 50; UPDATE t1 SET msg = 'big' WHERE id > 50; UPDATE t1 SET msg = 'sept' WHERE id = 7; +--sorted_result SELECT * FROM t1; DELETE FROM t1 WHERE id in (60,72); +--sorted_result SELECT * FROM t1; DROP TABLE t1; diff --git a/storage/connect/tabxcl.cpp b/storage/connect/tabxcl.cpp index d354f556ca1..8f77ecb8357 100644 --- a/storage/connect/tabxcl.cpp +++ b/storage/connect/tabxcl.cpp @@ -186,8 +186,8 @@ bool TDBXCL::OpenDB(PGLOBAL g) /*********************************************************************/ /* Physically open the object table. */ /*********************************************************************/ - if (Tdbp->OpenDB(g)) - return TRUE; + if (Tdbp->OpenDB(g)) + return TRUE; Use = USE_OPEN; return FALSE; diff --git a/storage/example/ha_example.cc b/storage/example/ha_example.cc index fbad065760f..0ec2c65605b 100644 --- a/storage/example/ha_example.cc +++ b/storage/example/ha_example.cc @@ -1074,11 +1074,11 @@ static struct st_mysql_sys_var* example_system_variables[]= { // this is an example of SHOW_SIMPLE_FUNC and of my_snprintf() service // If this function would return an array, one should use SHOW_FUNC static int show_func_example(MYSQL_THD thd, struct st_mysql_show_var *var, - char *buf) + void *buf, system_status_var *, enum_var_type) { var->type= SHOW_CHAR; var->value= buf; // it's of SHOW_VAR_FUNC_BUFF_SIZE bytes - my_snprintf(buf, SHOW_VAR_FUNC_BUFF_SIZE, + my_snprintf((char*) buf, SHOW_VAR_FUNC_BUFF_SIZE, "enum_var is %lu, ulong_var is %lu, int_var is %d, " "double_var is %f, %.6b", // %b is a MariaDB/MySQL extension srv_enum_var, srv_ulong_var, THDVAR(thd, int_var), diff --git a/storage/innobase/CMakeLists.txt b/storage/innobase/CMakeLists.txt index 43eb5352e2d..0a51cc3e66c 100644 --- a/storage/innobase/CMakeLists.txt +++ b/storage/innobase/CMakeLists.txt @@ -95,7 +95,7 @@ ENDIF() IF(NOT MSVC) # Work around MDEV-18417, MDEV-18656, MDEV-18417 - IF(WITH_ASAN AND CMAKE_COMPILER_IS_GNUCC AND + IF(WITH_ASAN AND CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS "6.0.0") SET_SOURCE_FILES_PROPERTIES(trx/trx0rec.cc PROPERTIES COMPILE_FLAGS -O1) ENDIF() @@ -450,7 +450,7 @@ ADD_DEFINITIONS(${SSL_DEFINES} ${TPOOL_DEFINES}) # A GCC bug causes crash when compiling these files on ARM64 with -O1+ # Compile them with -O0 as a workaround. -IF(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" +IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" AND CMAKE_C_COMPILER_VERSION VERSION_LESS "5.2.0") ADD_COMPILE_FLAGS( btr/btr0btr.cc @@ -467,6 +467,42 @@ IF(CMAKE_COMPILER_IS_GNUCXX AND CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64" ) ENDIF() +# clang ~16+ with return values being uninitialized is resolved by basic optimization +# compiler flags. The inlining of these function means the uninitalized paths are +# elimated from mach_read_from_2 (per MDEV-36316) and i_s_dict_fill_sys_columns MDEV-36327 +IF(WITH_MSAN AND CMAKE_BUILD_TYPE STREQUAL "Debug") + SET_SOURCE_FILES_PROPERTIES( + btr/btr0btr.cc + btr/btr0bulk.cc + data/data0data.cc + dict/dict0load.cc + dict/dict0mem.cc + fil/fil0crypt.cc + fil/fil0pagecompress.cc + fsp/fsp0fsp.cc + fut/fut0lst.cc + gis/gis0rtree.cc + handler/ha_innodb.cc + handler/i_s.cc + ibuf/ibuf0ibuf.cc + log/log0recv.cc + page/page0cur.cc + page/page0page.cc + page/page0zip.cc + rem/rem0rec.cc + row/row0import.cc + row/row0mysql.cc + row/row0purge.cc + row/row0uins.cc + row/row0undo.cc + row/row0upd.cc + trx/trx0purge.cc + trx/trx0rec.cc + trx/trx0trx.cc + trx/trx0undo.cc + PROPERTIES COMPILE_FLAGS -Og) +ENDIF() + # Older gcc version insist on -mhtm flag for including the # htmxlintrin.h header. This is also true for new gcc versions # like 11.2.0 in Debian Sid diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index 149e1a4e975..464bec0bd91 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -3495,8 +3495,10 @@ btr_cur_optimistic_update( *offsets = rec_get_offsets(rec, index, *offsets, index->n_core_fields, ULINT_UNDEFINED, heap); #if defined UNIV_DEBUG || defined UNIV_BLOB_LIGHT_DEBUG + /* Blob pointer can be null if InnoDB was killed or + ran out of space while allocating a page. */ ut_a(!rec_offs_any_null_extern(rec, *offsets) - || thr_get_trx(thr) == trx_roll_crash_recv_trx); + || thr_get_trx(thr)->in_rollback); #endif /* UNIV_DEBUG || UNIV_BLOB_LIGHT_DEBUG */ if (UNIV_LIKELY(!update->is_metadata()) @@ -4092,7 +4094,12 @@ btr_cur_pessimistic_update( cursor, offsets, offsets_heap, new_entry, &rec, &dummy_big_rec, n_ext, NULL, mtr); - ut_a(err == DB_SUCCESS); + if (err) { + /* This should happen when InnoDB tries to extend the + tablespace */ + ut_ad(err == DB_OUT_OF_FILE_SPACE); + return err; + } ut_a(rec); ut_a(dummy_big_rec == NULL); ut_ad(rec_offs_validate(rec, cursor->index(), *offsets)); @@ -5934,6 +5941,9 @@ btr_store_big_rec_extern_fields( FSP_NO_DIR, 0, &mtr, &mtr, &error); + DBUG_EXECUTE_IF("btr_page_alloc_fail", + block= nullptr; + error= DB_OUT_OF_FILE_SPACE;); if (!block) { alloc_fail: mtr.commit(); diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 483cd850153..3d640d958e3 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -1036,7 +1036,7 @@ inline void buf_pool_t::garbage_collect() noexcept mysql_mutex_unlock(&mutex); sql_print_information("InnoDB: Memory pressure event disregarded;" " innodb_buffer_pool_size=%zum," - " innodb_buffer_pool_size_min=%zum", + " innodb_buffer_pool_size_auto_min=%zum", old_size >> 20, min_size >> 20); return; } @@ -1604,6 +1604,7 @@ ATTRIBUTE_COLD buf_pool_t::shrink_status buf_pool_t::shrink(size_t size) noexcept { mysql_mutex_assert_owner(&mutex); + DBUG_EXECUTE_IF("buf_shrink_fail", return SHRINK_ABORT;); buf_load_abort(); if (!n_blocks_to_withdraw) @@ -2008,25 +2009,12 @@ ATTRIBUTE_COLD void buf_pool_t::resize(size_t size, THD *thd) noexcept if (ahi_disabled) btr_search_enable(true); #endif - mysql_mutex_lock(&LOCK_global_system_variables); - bool resized= n_blocks_removed < 0; - if (n_blocks_removed > 0) - { - mysql_mutex_lock(&mutex); - resized= size_in_bytes == old_size; - if (resized) - { - size_in_bytes_requested= size; - size_in_bytes= size; - } - mysql_mutex_unlock(&mutex); - } - - if (resized) + if (n_blocks_removed) sql_print_information("InnoDB: innodb_buffer_pool_size=%zum (%zu pages)" " resized from %zum (%zu pages)", size >> 20, n_blocks_new, old_size >> 20, old_blocks); + mysql_mutex_lock(&LOCK_global_system_variables); } else { @@ -2089,6 +2077,10 @@ ATTRIBUTE_COLD void buf_pool_t::resize(size_t size, THD *thd) noexcept mysql_mutex_unlock(&mutex); my_printf_error(ER_WRONG_USAGE, "innodb_buffer_pool_size change aborted", MYF(ME_ERROR_LOG)); +#ifdef BTR_CUR_HASH_ADAPT + if (ahi_disabled) + btr_search_enable(true); +#endif mysql_mutex_lock(&LOCK_global_system_variables); } diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 78cb4aec0a1..24e7db7eec6 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -2279,6 +2279,12 @@ redo log capacity filled threshold. @return true if adaptive flushing is recommended. */ static bool af_needed_for_redo(lsn_t oldest_lsn) noexcept { + /* We may have oldest_lsn > log_sys.get_lsn_approx() if + log_t::write_buf() or log_t::persist() are executing concurrently + with this. In that case, age > af_lwm should hold, and + buf_flush_page_cleaner() would execute one more timed wait. (Not a + big problem.) */ + lsn_t age= log_sys.get_lsn_approx() - oldest_lsn; lsn_t af_lwm= static_cast(srv_adaptive_flushing_lwm * static_cast(log_sys.log_capacity) / 100); @@ -2340,8 +2346,10 @@ static ulint page_cleaner_flush_pages_recommendation(ulint last_pages_in, ulint n_pages = 0; const lsn_t cur_lsn = log_sys.get_lsn_approx(); - ut_ad(oldest_lsn <= cur_lsn); - ulint pct_for_lsn = af_get_pct_for_lsn(cur_lsn - oldest_lsn); + /* We may have cur_lsn < oldest_lsn if + log_t::write_buf() or log_t::persist() were executing concurrently. */ + ulint pct_for_lsn = cur_lsn < oldest_lsn + ? 0 : af_get_pct_for_lsn(cur_lsn - oldest_lsn); time_t curr_time = time(nullptr); const double max_pct = srv_max_buf_pool_modified_pct; diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 2c64a6b7b10..2953b003994 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -609,7 +609,7 @@ fil_space_extend_must_retry( *success = os_file_set_size(node->name, node->handle, new_size, node->punch_hole == 1); - os_has_said_disk_full = *success; + os_has_said_disk_full = !*success; if (*success) { os_file_flush(node->handle); last_page_no = size; diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 58dee22d218..a908d6be25a 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -2129,6 +2129,11 @@ convert_error_code_to_mysql( return(HA_ERR_RECORD_FILE_FULL); case DB_TEMP_FILE_WRITE_FAIL: + /* This error can happen during + copy_data_between_tables() or bulk insert operation */ + innodb_transaction_abort(thd, + innobase_rollback_on_timeout, + error); my_error(ER_GET_ERRMSG, MYF(0), DB_TEMP_FILE_WRITE_FAIL, ut_strerr(DB_TEMP_FILE_WRITE_FAIL), @@ -14654,13 +14659,14 @@ innobase_get_mysql_key_number_for_index( if (index->table != ib_table) { i = 0; ind = dict_table_get_first_index(index->table); + const bool auto_gen_clust = dict_index_is_auto_gen_clust(ind); while (index != ind) { ind = dict_table_get_next_index(ind); i++; } - if (dict_index_is_auto_gen_clust(index)) { + if (auto_gen_clust) { ut_a(i > 0); i--; } @@ -15924,7 +15930,7 @@ ha_innobase::extra( } m_prebuilt->table->skip_alter_undo = 0; if (dberr_t err= trx->bulk_insert_apply()) { - m_prebuilt->table->skip_alter_undo = 0; + trx->rollback(); return convert_error_code_to_mysql( err, m_prebuilt->table->flags, trx->mysql_thd); diff --git a/storage/innobase/handler/i_s.cc b/storage/innobase/handler/i_s.cc index 828e0ef9fd5..6cf9d7f6c35 100644 --- a/storage/innobase/handler/i_s.cc +++ b/storage/innobase/handler/i_s.cc @@ -1150,6 +1150,7 @@ struct st_maria_plugin i_s_innodb_cmp_reset = MariaDB_PLUGIN_MATURITY_STABLE }; +PRAGMA_DISABLE_CHECK_STACK_FRAME_EXTRA namespace Show { /* Fields of the dynamic tables diff --git a/storage/innobase/include/log0log.h b/storage/innobase/include/log0log.h index ce6a4f27794..bc034208063 100644 --- a/storage/innobase/include/log0log.h +++ b/storage/innobase/include/log0log.h @@ -411,9 +411,10 @@ public: @param encrypted whether the log is encrypted */ static void header_write(byte *buf, lsn_t lsn, bool encrypted) noexcept; - /** @return a lower bound estimate of get_lsn(), + /** @return an estimate of get_lsn(), using acquire-release ordering with write_buf() or persist(); - this is exact unless append_prepare_wait() is pending */ + an upper bound if said functions have updated only one of the fields, + a lower bound if append_prepare_wait() is pending, otherwise exact */ lsn_t get_lsn_approx() const noexcept { /* acquire-release ordering with write_buf() and persist() */ diff --git a/storage/innobase/row/row0log.cc b/storage/innobase/row/row0log.cc index 9ebbbd37f4c..01b6b506d8b 100644 --- a/storage/innobase/row/row0log.cc +++ b/storage/innobase/row/row0log.cc @@ -398,12 +398,17 @@ start_log: } log->tail.blocks++; + DBUG_EXECUTE_IF("os_file_write_fail", + log->error = DB_TEMP_FILE_WRITE_FAIL; + goto write_failed;); + if (os_file_write( IORequestWrite, "(modification log)", log->fd, buf, byte_offset, srv_sort_buf_size) != DB_SUCCESS) { + log->error = DB_TEMP_FILE_WRITE_FAIL; write_failed: index->type |= DICT_CORRUPT; } diff --git a/storage/innobase/row/row0merge.cc b/storage/innobase/row/row0merge.cc index a45fa23d12c..152992edd19 100644 --- a/storage/innobase/row/row0merge.cc +++ b/storage/innobase/row/row0merge.cc @@ -5177,6 +5177,9 @@ dberr_t row_merge_bulk_t::write_to_tmp_file(ulint index_no) m_block, m_crypt_block, buf->index->table->space->id)) return DB_TEMP_FILE_WRITE_FAIL; + + DBUG_EXECUTE_IF("write_to_tmp_file_fail", + return DB_TEMP_FILE_WRITE_FAIL;); MEM_UNDEFINED(&m_block[0], srv_sort_buf_size); return DB_SUCCESS; } diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index 414dbf2e5fc..3cd037e99b4 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -707,6 +707,7 @@ handle_new_error: case DB_DEADLOCK: case DB_RECORD_CHANGED: case DB_LOCK_TABLE_FULL: + case DB_TEMP_FILE_WRITE_FAIL: rollback: /* Roll back the whole transaction; this resolution was added to version 3.23.43 */ diff --git a/storage/innobase/row/row0quiesce.cc b/storage/innobase/row/row0quiesce.cc index 0f49341441b..36d7e5a9c45 100644 --- a/storage/innobase/row/row0quiesce.cc +++ b/storage/innobase/row/row0quiesce.cc @@ -424,9 +424,6 @@ row_quiesce_write_header( Write the table meta data after quiesce. @return DB_SUCCESS or error code */ -/* Stack size 20904 with clang */ -PRAGMA_DISABLE_CHECK_STACK_FRAME - static MY_ATTRIBUTE((nonnull, warn_unused_result)) dberr_t row_quiesce_write_cfg( @@ -444,9 +441,10 @@ row_quiesce_write_cfg( FILE* file = fopen(name, "w+b"); - if (file == NULL) { - ib_errf(thd, IB_LOG_LEVEL_WARN, ER_CANT_CREATE_FILE, - name, errno, strerror(errno)); + if (!file) { +fail: + ib_senderrf(thd, IB_LOG_LEVEL_WARN, ER_CANT_CREATE_FILE, + name, errno, strerror(errno)); err = DB_IO_ERROR; } else { @@ -460,31 +458,18 @@ row_quiesce_write_cfg( err = row_quiesce_write_indexes(table, file, thd); } - if (fflush(file) != 0) { - - char msg[BUFSIZ]; - - snprintf(msg, sizeof(msg), "%s flush() failed", name); - - ib_senderrf( - thd, IB_LOG_LEVEL_WARN, ER_IO_WRITE_ERROR, - (ulong) errno, strerror(errno), msg); + if (fflush(file)) { + std::ignore = fclose(file); + goto fail; } - if (fclose(file) != 0) { - char msg[BUFSIZ]; - - snprintf(msg, sizeof(msg), "%s flose() failed", name); - - ib_senderrf( - thd, IB_LOG_LEVEL_WARN, ER_IO_WRITE_ERROR, - (ulong) errno, strerror(errno), msg); + if (fclose(file)) { + goto fail; } } return(err); } -PRAGMA_REENABLE_CHECK_STACK_FRAME /*********************************************************************//** Check whether a table has an FTS index defined on it. diff --git a/storage/innobase/row/row0umod.cc b/storage/innobase/row/row0umod.cc index 4b5d676477d..def9e92f598 100644 --- a/storage/innobase/row/row0umod.cc +++ b/storage/innobase/row/row0umod.cc @@ -1105,9 +1105,8 @@ row_undo_mod_upd_exist_sec( dtuple_t* entry = row_build_index_entry( node->row, node->ext, index, heap); if (UNIV_UNLIKELY(!entry)) { - /* The server must have crashed in - row_upd_clust_rec_by_insert() before - the updated externally stored columns (BLOBs) + /* InnoDB must have run of space or been killed + before the updated externally stored columns (BLOBs) of the new clustered index entry were written. */ /* The table must be in DYNAMIC or COMPRESSED @@ -1115,19 +1114,6 @@ row_undo_mod_upd_exist_sec( store a local 768-byte prefix of each externally stored column. */ ut_a(dict_table_has_atomic_blobs(index->table)); - - /* This is only legitimate when - rolling back an incomplete transaction - after crash recovery. */ - ut_a(thr_get_trx(thr)->is_recovered); - - /* The server must have crashed before - completing the insert of the new - clustered index entry and before - inserting to the secondary indexes. - Because node->row was not yet written - to this index, we can ignore it. But - we must restore node->undo_row. */ } else { /* NOTE that if we updated the fields of a delete-marked secondary index record so that diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index 43621d910a5..5818463b3a3 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.cc @@ -1414,16 +1414,11 @@ row_upd_changes_ord_field_binary_func( if (UNIV_LIKELY_NULL(buf)) { if (UNIV_UNLIKELY(buf == field_ref_zero)) { /* The externally stored field - was not written yet. This - record should only be seen by - trx_rollback_recovered() - when the server had crashed before - storing the field. */ - ut_ad(!thr - || thr->graph->trx->is_recovered); - ut_ad(!thr - || thr->graph->trx - == trx_roll_crash_recv_trx); + was not written yet. InnoDB must + have ran out of space or been killed + before storing the page */ + ut_ad(thr); + ut_ad(thr->graph->trx->in_rollback); return(TRUE); } diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index 049de3f230f..030c866a025 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -1077,6 +1077,7 @@ static void trx_purge_close_tables(purge_node_t *node, THD *thd) noexcept void purge_sys_t::wait_FTS(bool also_sys) { + std::this_thread::yield(); for (const uint32_t mask= also_sys ? ~0U : ~PAUSED_SYS; m_FTS_paused & mask;) std::this_thread::sleep_for(std::chrono::milliseconds(10)); } diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index 8d3eeafe8e3..64846487701 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -515,6 +515,7 @@ TRANSACTIONAL_TARGET void trx_free_at_shutdown(trx_t *trx) ut_a(trx->magic_n == TRX_MAGIC_N); ut_d(trx->apply_online_log = false); + trx->bulk_insert = 0; trx->commit_state(); trx->release_locks(); trx->mod_tables.clear(); diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index c121491675d..29461a096ac 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -617,13 +617,13 @@ static int table2maria(TABLE *table_arg, data_file_type row_type, while (recpos < (uint) share->stored_rec_length) { Field **field, *found= 0; - minpos= share->reclength; + minpos= share->stored_rec_length; length= 0; for (field= table_arg->field; *field; field++) { if ((fieldpos= (*field)->offset(record)) >= recpos && - fieldpos <= minpos) + fieldpos < minpos) { /* skip null fields */ if (!(temp_length= (*field)->pack_length_in_rec())) diff --git a/storage/maria/ma_loghandler.c b/storage/maria/ma_loghandler.c index 3db555f62a0..f7cbb0a00e5 100644 --- a/storage/maria/ma_loghandler.c +++ b/storage/maria/ma_loghandler.c @@ -3609,9 +3609,6 @@ static my_bool translog_is_LSN_chunk(uchar type) @retval 1 Error */ -/* Stack size 26120 from clang */ -PRAGMA_DISABLE_CHECK_STACK_FRAME - my_bool translog_init_with_table(const char *directory, uint32 log_file_max_size, uint32 server_version, @@ -3875,6 +3872,7 @@ my_bool translog_init_with_table(const char *directory, if (logs_found) { + TRANSLOG_PAGE_SIZE_BUFF psize_buff; TRANSLOG_ADDRESS current_page= sure_page; my_bool pageok; @@ -3916,7 +3914,6 @@ my_bool translog_init_with_table(const char *directory, do { TRANSLOG_VALIDATOR_DATA data; - TRANSLOG_PAGE_SIZE_BUFF psize_buff; uchar *page; data.addr= ¤t_page; if ((page= translog_get_page(&data, psize_buff.buffer, NULL)) == NULL) @@ -3966,7 +3963,6 @@ my_bool translog_init_with_table(const char *directory, if (logs_found && !old_log_was_recovered && old_flags == flags) { TRANSLOG_VALIDATOR_DATA data; - TRANSLOG_PAGE_SIZE_BUFF psize_buff; uchar *page; uint16 chunk_offset; data.addr= &last_valid_page; @@ -4264,7 +4260,6 @@ err: ma_message_no_user(0, "log initialization failed"); DBUG_RETURN(1); } -PRAGMA_REENABLE_CHECK_STACK_FRAME /* diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c index 35578877a2f..da5d9dbd212 100644 --- a/storage/maria/ma_open.c +++ b/storage/maria/ma_open.c @@ -1558,7 +1558,7 @@ uint _ma_state_info_write(MARIA_SHARE *share, uint pWrite) @retval 1 Error */ -/* Stack size 26376 from clang */ +/* MARIA_STATE_INFO_SIZE + MARIA_STATE_EXTRA_SIZE == 25559 */ PRAGMA_DISABLE_CHECK_STACK_FRAME uint _ma_state_info_write_sub(File file, MARIA_STATE_INFO *state, uint pWrite) diff --git a/storage/maria/ma_pagecache.c b/storage/maria/ma_pagecache.c index 1b09fbe76f4..2bf4bcad0a9 100644 --- a/storage/maria/ma_pagecache.c +++ b/storage/maria/ma_pagecache.c @@ -4913,6 +4913,7 @@ static int flush_cached_blocks(PAGECACHE *pagecache, @retval PCFLUSH_PINNED Pinned blocks was met and skipped. @retval PCFLUSH_PINNED_AND_ERROR PCFLUSH_ERROR and PCFLUSH_PINNED. */ +PRAGMA_DISABLE_CHECK_STACK_FRAME static int flush_pagecache_blocks_int(PAGECACHE *pagecache, PAGECACHE_FILE *file, @@ -5242,6 +5243,7 @@ int flush_pagecache_blocks_with_filter(PAGECACHE *pagecache, pagecache_pthread_mutex_unlock(&pagecache->cache_lock); DBUG_RETURN(res); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /* diff --git a/storage/maria/ma_recovery.c b/storage/maria/ma_recovery.c index f05b366f0bf..faf693b9b78 100644 --- a/storage/maria/ma_recovery.c +++ b/storage/maria/ma_recovery.c @@ -277,6 +277,7 @@ int maria_recovery_from_log(void) @retval 0 OK @retval !=0 Error */ +PRAGMA_DISABLE_CHECK_STACK_FRAME int maria_apply_log(LSN from_lsn, LSN end_redo_lsn, LSN end_undo_lsn, enum maria_apply_log_way apply, @@ -564,6 +565,7 @@ end: */ DBUG_RETURN(error); } +PRAGMA_REENABLE_CHECK_STACK_FRAME /* very basic info about the record's header */ diff --git a/storage/maria/ma_test_big.sh b/storage/maria/ma_test_big.sh old mode 100644 new mode 100755 index 6419d05e3a4..41260151cd7 --- a/storage/maria/ma_test_big.sh +++ b/storage/maria/ma_test_big.sh @@ -4,19 +4,23 @@ # finding bugs in blob handling # +mkdir -p tmp +cd tmp set -e a=15 while test $a -le 5000 do echo $a - rm -f maria_log* - ma_test2 -s -L -K -W -P -M -T -c -b32768 -t4 -A1 -m$a > /dev/null - maria_read_log -a -s >& /dev/null - maria_chk -es test2 - maria_read_log -a -s >& /dev/null - maria_chk -es test2 + rm -f aria_log* + ../ma_test2 -s -L -K -W -P -M -T -c -b32768 -t4 -A1 -m$a > /dev/null + ../aria_read_log -a -s >& /dev/null + ../aria_chk -ess test2 + ../aria_read_log -a -s >& /dev/null + ../aria_chk -ess test2 rm test2.MA? - maria_read_log -a -s >& /dev/null - maria_chk -es test2 + ../aria_read_log -a -s >& /dev/null + ../aria_chk -ess test2 a=$((a+1)) done +cd .. +rm -r tmp diff --git a/storage/mroonga/CMakeLists.txt b/storage/mroonga/CMakeLists.txt index bdda7716c0c..1538b6cc46a 100644 --- a/storage/mroonga/CMakeLists.txt +++ b/storage/mroonga/CMakeLists.txt @@ -49,6 +49,14 @@ if(MSVC) message(FATAL_ERROR ${MRN_OLD_MSVC_MESSAGE}) endif() endif() +else() + STRING(REGEX REPLACE "-Wframe-larger-than=[0-9]*" "" + CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + STRING(REGEX REPLACE "-Wframe-larger-than=[0-9]*" "" + CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") + STRING(REGEX REPLACE "-Wframe-larger-than=[0-9]*" "" + CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") + MY_CHECK_AND_SET_COMPILER_FLAG(-Wframe-larger-than=49152) endif() if(MRN_BUNDLED) @@ -318,7 +326,7 @@ else() if(WITH_DEBUG) set_property(TARGET mroonga APPEND PROPERTY COMPILE_DEFINITIONS "SAFE_MUTEX") - if(CMAKE_COMPILER_IS_GNUCXX) + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(MRN_C_COMPILE_FLAGS "${MRN_C_COMPILE_FLAGS} -g3 -O0") set(MRN_CXX_COMPILE_FLAGS "${MRN_CXX_COMPILE_FLAGS} -g3 -O0") endif() @@ -345,7 +353,7 @@ else() COMPILE_DEFINITIONS "MY_PTHREAD_FASTMUTEX") endif() - if(CMAKE_COMPILER_IS_GNUCXX) + if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") MY_CHECK_AND_SET_COMPILER_FLAG("-Wall") MY_CHECK_AND_SET_COMPILER_FLAG("-Wextra") MY_CHECK_AND_SET_COMPILER_FLAG("-Wno-unused-parameter") diff --git a/storage/mroonga/udf/mrn_udf_command.cpp b/storage/mroonga/udf/mrn_udf_command.cpp index 46911c56e25..44d8c9ccdd0 100644 --- a/storage/mroonga/udf/mrn_udf_command.cpp +++ b/storage/mroonga/udf/mrn_udf_command.cpp @@ -220,7 +220,7 @@ static void mroonga_command_escape_value(grn_ctx *ctx, } MRN_API char *mroonga_command(UDF_INIT *init, UDF_ARGS *args, char *result, - unsigned long *length, char *is_null, char *error) + unsigned long *length, uchar *is_null, uchar *error) { CommandInfo *info = (CommandInfo *)init->ptr; grn_ctx *ctx = info->ctx; diff --git a/storage/mroonga/udf/mrn_udf_escape.cpp b/storage/mroonga/udf/mrn_udf_escape.cpp index 55a3639565e..a03bf25cba2 100644 --- a/storage/mroonga/udf/mrn_udf_escape.cpp +++ b/storage/mroonga/udf/mrn_udf_escape.cpp @@ -214,7 +214,7 @@ static void escape(EscapeInfo *info, UDF_ARGS *args) } MRN_API char *mroonga_escape(UDF_INIT *init, UDF_ARGS *args, char *result, - unsigned long *length, char *is_null, char *error) + unsigned long *length, uchar *is_null, uchar *error) { EscapeInfo *info = reinterpret_cast(init->ptr); grn_ctx *ctx = info->ctx; diff --git a/storage/mroonga/udf/mrn_udf_highlight_html.cpp b/storage/mroonga/udf/mrn_udf_highlight_html.cpp index d986777caff..5085a885fe0 100644 --- a/storage/mroonga/udf/mrn_udf_highlight_html.cpp +++ b/storage/mroonga/udf/mrn_udf_highlight_html.cpp @@ -412,8 +412,8 @@ MRN_API char *mroonga_highlight_html(UDF_INIT *init, UDF_ARGS *args, char *result, unsigned long *length, - char *is_null, - char *error) + uchar *is_null, + uchar *error) { MRN_DBUG_ENTER_FUNCTION(); diff --git a/storage/mroonga/udf/mrn_udf_last_insert_grn_id.cpp b/storage/mroonga/udf/mrn_udf_last_insert_grn_id.cpp index f40dcf0055f..fb948a72ea9 100644 --- a/storage/mroonga/udf/mrn_udf_last_insert_grn_id.cpp +++ b/storage/mroonga/udf/mrn_udf_last_insert_grn_id.cpp @@ -45,7 +45,7 @@ MRN_API my_bool last_insert_grn_id_init(UDF_INIT *init, UDF_ARGS *args, char *me return 0; } -MRN_API longlong last_insert_grn_id(UDF_INIT *init, UDF_ARGS *args, char *is_null, char *error) +MRN_API longlong last_insert_grn_id(UDF_INIT *init, UDF_ARGS *args, uchar *is_null, uchar *error) { THD *thd = current_thd; st_mrn_slot_data *slot_data = mrn_get_slot_data(thd, false); diff --git a/storage/mroonga/udf/mrn_udf_normalize.cpp b/storage/mroonga/udf/mrn_udf_normalize.cpp index 0ebee2ff608..5c34e9b0ec7 100644 --- a/storage/mroonga/udf/mrn_udf_normalize.cpp +++ b/storage/mroonga/udf/mrn_udf_normalize.cpp @@ -151,7 +151,7 @@ error: } MRN_API char *mroonga_normalize(UDF_INIT *init, UDF_ARGS *args, char *result, - unsigned long *length, char *is_null, char *error) + unsigned long *length, uchar *is_null, uchar *error) { st_mrn_normalize_info *info = (st_mrn_normalize_info *)init->ptr; grn_ctx *ctx = info->ctx; diff --git a/storage/mroonga/udf/mrn_udf_query_expand.cpp b/storage/mroonga/udf/mrn_udf_query_expand.cpp index 76a5dad53b4..4ecafe1812b 100644 --- a/storage/mroonga/udf/mrn_udf_query_expand.cpp +++ b/storage/mroonga/udf/mrn_udf_query_expand.cpp @@ -244,8 +244,8 @@ MRN_API char *mroonga_query_expand(UDF_INIT *init, UDF_ARGS *args, char *result, unsigned long *length, - char *is_null, - char *error) + uchar *is_null, + uchar *error) { MRN_DBUG_ENTER_FUNCTION(); diff --git a/storage/mroonga/udf/mrn_udf_snippet.cpp b/storage/mroonga/udf/mrn_udf_snippet.cpp index 1bd6cb7d722..53058bf02f5 100644 --- a/storage/mroonga/udf/mrn_udf_snippet.cpp +++ b/storage/mroonga/udf/mrn_udf_snippet.cpp @@ -248,7 +248,7 @@ error: } MRN_API char *mroonga_snippet(UDF_INIT *init, UDF_ARGS *args, char *result, - unsigned long *length, char *is_null, char *error) + unsigned long *length, uchar *is_null, uchar *error) { st_mrn_snip_info *snip_info = (st_mrn_snip_info *) init->ptr; grn_ctx *ctx = snip_info->ctx; diff --git a/storage/mroonga/udf/mrn_udf_snippet_html.cpp b/storage/mroonga/udf/mrn_udf_snippet_html.cpp index ba0cdadda99..3acdef03f54 100644 --- a/storage/mroonga/udf/mrn_udf_snippet_html.cpp +++ b/storage/mroonga/udf/mrn_udf_snippet_html.cpp @@ -323,8 +323,8 @@ MRN_API char *mroonga_snippet_html(UDF_INIT *init, UDF_ARGS *args, char *result, unsigned long *length, - char *is_null, - char *error) + uchar *is_null, + uchar *error) { MRN_DBUG_ENTER_FUNCTION(); diff --git a/storage/mroonga/vendor/groonga/lib/expr.c b/storage/mroonga/vendor/groonga/lib/expr.c index b4de00b2406..f3e59abf5eb 100644 --- a/storage/mroonga/vendor/groonga/lib/expr.c +++ b/storage/mroonga/vendor/groonga/lib/expr.c @@ -2459,6 +2459,10 @@ grn_proc_call(grn_ctx *ctx, grn_obj *proc, int nargs, grn_obj *caller) } \ } while (0) +#ifdef __GNUC__ +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wframe-larger-than=" +#endif inline static void grn_expr_exec_get_member_vector(grn_ctx *ctx, grn_obj *expr, @@ -3834,6 +3838,9 @@ exit : } GRN_API_RETURN(val); } +#ifdef __GNUC__ +# pragma GCC diagnostic pop +#endif grn_obj * grn_expr_get_value(grn_ctx *ctx, grn_obj *expr, int offset) diff --git a/storage/mroonga/vendor/groonga/lib/ii.c b/storage/mroonga/vendor/groonga/lib/ii.c index 8ce4857bfc2..e6c97c30bf2 100644 --- a/storage/mroonga/vendor/groonga/lib/ii.c +++ b/storage/mroonga/vendor/groonga/lib/ii.c @@ -44,6 +44,8 @@ # include #endif +#include "my_attribute.h" + #define MAX_PSEG 0x20000 #define MAX_PSEG_SMALL 0x00200 /* MAX_PSEG_MEDIUM has enough space for the following source: @@ -2833,6 +2835,8 @@ chunk_flush(grn_ctx *ctx, grn_ii *ii, chunk_info *cinfo, uint8_t *enc, uint32_t return ctx->rc; } +PRAGMA_DISABLE_CHECK_STACK_FRAME + static grn_rc chunk_merge(grn_ctx *ctx, grn_ii *ii, buffer *sb, buffer_term *bt, chunk_info *cinfo, grn_id rid, datavec *dv, @@ -2940,6 +2944,8 @@ chunk_merge(grn_ctx *ctx, grn_ii *ii, buffer *sb, buffer_term *bt, return ctx->rc; } +PRAGMA_REENABLE_CHECK_STACK_FRAME + static void buffer_merge_dump_datavec(grn_ctx *ctx, grn_ii *ii, @@ -2989,6 +2995,8 @@ buffer_merge_dump_datavec(grn_ctx *ctx, GRN_OBJ_FIN(ctx, &buffer); } +PRAGMA_DISABLE_CHECK_STACK_FRAME + /* If dc doesn't have enough space, program may be crashed. * TODO: Support auto space extension or max size check. */ @@ -3314,6 +3322,8 @@ buffer_merge(grn_ctx *ctx, grn_ii *ii, uint32_t seg, grn_hash *h, return ctx->rc; } +PRAGMA_REENABLE_CHECK_STACK_FRAME + static void fake_map(grn_ctx *ctx, grn_io *io, grn_io_win *iw, void *addr, uint32_t seg, uint32_t size) { @@ -4509,6 +4519,9 @@ grn_ii_get_disk_usage(grn_ctx *ctx, grn_ii *ii) return usage; } + +PRAGMA_DISABLE_CHECK_STACK_FRAME + #define BIT11_01(x) ((x >> 1) & 0x7ff) #define BIT31_12(x) (x >> 12) @@ -4784,6 +4797,8 @@ exit : return ctx->rc; } +PRAGMA_REENABLE_CHECK_STACK_FRAME + grn_rc grn_ii_delete_one(grn_ctx *ctx, grn_ii *ii, grn_id tid, grn_ii_updspec *u, grn_hash *h) { diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc index 364404bb939..422be8d4742 100644 --- a/storage/myisam/ha_myisam.cc +++ b/storage/myisam/ha_myisam.cc @@ -367,13 +367,13 @@ int table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out, while (recpos < (uint) share->stored_rec_length) { Field **field, *found= 0; - minpos= share->reclength; + minpos= share->stored_rec_length; length= 0; for (field= table_arg->field; *field; field++) { if ((fieldpos= (*field)->offset(record)) >= recpos && - fieldpos <= minpos) + fieldpos < minpos) { /* skip null fields */ if (!(temp_length= (*field)->pack_length_in_rec())) diff --git a/storage/perfschema/unittest/pfs_instr-t.cc b/storage/perfschema/unittest/pfs_instr-t.cc index 55c4f61997b..90f1cb4bf99 100644 --- a/storage/perfschema/unittest/pfs_instr-t.cc +++ b/storage/perfschema/unittest/pfs_instr-t.cc @@ -86,8 +86,6 @@ void test_no_instruments() cleanup_instruments(); } -PRAGMA_DISABLE_CHECK_STACK_FRAME - void test_no_instances() { int rc; @@ -218,7 +216,7 @@ void test_no_instances() ok(file == NULL, "no file"); ok(global_file_container.m_lost == 4, "lost 4"); - char long_file_name[10000]; + char long_file_name[5000]; int size= sizeof(long_file_name); memset(long_file_name, 'X', size); @@ -247,7 +245,6 @@ void test_no_instances() cleanup_file_hash(); cleanup_instruments(); } -PRAGMA_REENABLE_CHECK_STACK_FRAME void test_with_instances() { diff --git a/storage/rocksdb/CMakeLists.txt b/storage/rocksdb/CMakeLists.txt index ce68d31c28c..8ce050c3f26 100644 --- a/storage/rocksdb/CMakeLists.txt +++ b/storage/rocksdb/CMakeLists.txt @@ -9,6 +9,13 @@ SET(CPACK_RPM_rocksdb-engine_PACKAGE_SUMMARY "RocksDB storage engine for MariaDB SET(CPACK_RPM_rocksdb-engine_PACKAGE_DESCRIPTION "The RocksDB storage engine is a high performance storage engine, aimed at maximising storage efficiency while maintaining InnoDB-like performance." PARENT_SCOPE) +STRING(REGEX REPLACE "-Wframe-larger-than=[0-9]*" "" + CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") +STRING(REGEX REPLACE "-Wframe-larger-than=[0-9]*" "" + CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") +STRING(REGEX REPLACE "-Wframe-larger-than=[0-9]*" "" + CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") +MY_CHECK_AND_SET_COMPILER_FLAG(-Wframe-larger-than=32768) MY_CHECK_AND_SET_COMPILER_FLAG(-Wno-range-loop-construct) MY_CHECK_AND_SET_COMPILER_FLAG(-Wno-invalid-offsetof) MY_CHECK_AND_SET_COMPILER_FLAG(-Wno-effc++ DEBUG RELWITHDEBINFO) diff --git a/storage/spider/mysql-test/spider/bg/r/basic_sql.result b/storage/spider/mysql-test/spider/bg/r/basic_sql.result index 74041ae4872..14c0128da14 100644 --- a/storage/spider/mysql-test/spider/bg/r/basic_sql.result +++ b/storage/spider/mysql-test/spider/bg/r/basic_sql.result @@ -243,20 +243,6 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 4 i 2003-10-30 05:01:03 5 h 2001-10-31 23:59:59 -select sql_calc_found_rows -connection master_1; -SELECT SQL_CALC_FOUND_ROWS a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l -ORDER BY a LIMIT 4; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 f 2008-07-01 10:21:39 -2 g 2000-02-01 00:00:00 -3 j 2007-05-04 20:03:11 -4 i 2003-10-30 05:01:03 -connection master_1; -SELECT found_rows(); -found_rows() -5 - select high_priority connection master_1; SELECT HIGH_PRIORITY a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l diff --git a/storage/spider/mysql-test/spider/bg/t/basic_sql.test b/storage/spider/mysql-test/spider/bg/t/basic_sql.test index 72a9b76cb14..24fa4314097 100644 --- a/storage/spider/mysql-test/spider/bg/t/basic_sql.test +++ b/storage/spider/mysql-test/spider/bg/t/basic_sql.test @@ -847,52 +847,6 @@ if ($USE_CHILD_GROUP2) } } ---echo ---echo select sql_calc_found_rows -if ($USE_CHILD_GROUP2) -{ - if (!$OUTPUT_CHILD_GROUP2) - { - --disable_query_log - --disable_result_log - } - --connection child2_1 - if ($USE_GENERAL_LOG) - { - TRUNCATE TABLE mysql.general_log; - } - if (!$OUTPUT_CHILD_GROUP2) - { - --enable_query_log - --enable_result_log - } -} ---connection master_1 -SELECT SQL_CALC_FOUND_ROWS a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l -ORDER BY a LIMIT 4; -if ($USE_CHILD_GROUP2) -{ - if (!$OUTPUT_CHILD_GROUP2) - { - --disable_query_log - --disable_result_log - } - --connection child2_1 - if ($USE_GENERAL_LOG) - { - SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; - } - if (!$OUTPUT_CHILD_GROUP2) - { - --enable_query_log - --enable_result_log - } -} ---connection master_1 ---disable_ps2_protocol -SELECT found_rows(); ---enable_ps2_protocol - --echo --echo select high_priority if ($USE_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/bugfix/include/mdev_21884_init.inc b/storage/spider/mysql-test/spider/bugfix/include/mdev_21884_init.inc index 68a496a7d5f..9a5294c537f 100644 --- a/storage/spider/mysql-test/spider/bugfix/include/mdev_21884_init.inc +++ b/storage/spider/mysql-test/spider/bugfix/include/mdev_21884_init.inc @@ -43,8 +43,6 @@ let $CHILD2_1_CREATE_TABLES= PRIMARY KEY(a,b) ) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; --let $CHILD2_1_SELECT_TABLES_BACKUP= $CHILD2_1_SELECT_TABLES -let $CHILD2_1_SELECT_TABLES= - SELECT pkey, txt FROM tbl_a ORDER BY pkey; let $CHILD2_1_SELECT_TABLES= SELECT a, b, c FROM ta_r2 ORDER BY a $STR_SEMICOLON SELECT a, b, c FROM ta_r3 ORDER BY a; diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.test index ad9a9e348ee..be8e806a7a9 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.test @@ -60,25 +60,33 @@ TRUNCATE TABLE mysql.general_log; --connection master_1 --disable_ps2_protocol +--disable_view_protocol SELECT a, b, c FROM tbl_a PARTITION (pt2) WHERE b = 'c'; +--enable_view_protocol SELECT a, b, c FROM tbl_a PARTITION (pt1,pt2); +--disable_view_protocol SELECT a, b, c FROM tbl_a PARTITION (pt3) WHERE b = 'c'; +--enable_view_protocol SELECT a, b, c FROM tbl_a PARTITION (pt1,pt2); +--disable_view_protocol SELECT a, b, c FROM tbl_a PARTITION (pt1) WHERE b = 'c'; +--enable_view_protocol SELECT a, b, c FROM tbl_a PARTITION (pt1,pt3); +--disable_view_protocol SELECT a, b, c FROM tbl_a PARTITION (pt1) WHERE b = 'c'; +--enable_view_protocol SELECT a, b, c FROM tbl_a PARTITION (pt2,pt3); --enable_ps2_protocol --connection child2_1 ---disable_ps2_protocol --disable_view_protocol +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; ---enable_view_protocol --enable_ps2_protocol --disable_ps_protocol eval $CHILD2_1_SELECT_TABLES; --enable_ps_protocol +--enable_view_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.test index 42cb625e465..c6ec22550d5 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.test @@ -87,10 +87,10 @@ SET NAMES utf8; --disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; --enable_ps2_protocol ---enable_view_protocol --disable_ps_protocol eval $CHILD2_1_SELECT_TABLES; --enable_ps_protocol +--enable_view_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29352.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_29352.test index 626364efb99..52ad36735bd 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_29352.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29352.test @@ -4,7 +4,9 @@ FLUSH TABLES WITH READ LOCK; --error ER_CANT_UPDATE_WITH_READLOCK CREATE FUNCTION spider_bg_direct_sql RETURNS INT SONAME 'ha_spider.so'; +--disable_view_protocol SELECT * FROM t; +--enable_view_protocol --source include/restart_mysqld.inc diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_33434.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_33434.test index dd9f882f42e..810b70f8fca 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_33434.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_33434.test @@ -4,8 +4,10 @@ INSTALL SONAME 'ha_spider'; SET character_set_connection=ucs2; +--disable_view_protocol --error ER_CONNECT_TO_FOREIGN_DATA_SOURCE SELECT SPIDER_DIRECT_SQL('SELECT SLEEP(1)', '', 'srv "dummy", port "3307"'); +--enable_view_protocol --disable_query_log --source ../../include/clean_up_spider.inc --enable_query_log diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_34555.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_34555.test index 3a1cf604140..b1fcae38e2a 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_34555.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_34555.test @@ -9,6 +9,7 @@ OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE '',user 'Spider', password 'foo'); CREATE TABLE tSpider (a INT) ENGINE=Spider COMMENT='WRAPPER "mysql",SRV "srv",TABLE "t"'; CREATE TABLE t2 (c INT,c2 CHAR(1)) ENGINE=Spider COMMENT='WRAPPER "mysql",SRV "srv",TABLE "t"'; XA START 'a'; +--disable_view_protocol --disable_result_log --error 0,ER_CONNECT_TO_FOREIGN_DATA_SOURCE SELECT * FROM information_schema.table_constraints; @@ -22,6 +23,7 @@ SELECT * FROM t2; SELECT SLEEP (1); --error ER_CONNECT_TO_FOREIGN_DATA_SOURCE SELECT * FROM t2; +--enable_view_protocol xa end 'a'; xa rollback 'a'; drop table tSpider, t2; diff --git a/storage/spider/mysql-test/spider/bugfix/t/perfschema.test b/storage/spider/mysql-test/spider/bugfix/t/perfschema.test index 9346d2b5aa3..cb9e5f1ad1d 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/perfschema.test +++ b/storage/spider/mysql-test/spider/bugfix/t/perfschema.test @@ -7,8 +7,10 @@ enable_query_log; --echo # MDEV-33031 Assertion failure upon reading from performance schema with binlog enabled --echo # connect foo,localhost,root; +--disable_view_protocol select variable_name, variable_value from performance_schema.status_by_thread where variable_name like '%spider_direct_aggregate%'; +--enable_view_protocol disconnect foo; connection default; diff --git a/storage/spider/mysql-test/spider/r/basic_sql.result b/storage/spider/mysql-test/spider/r/basic_sql.result index baebbffc9c6..127d6f5e006 100644 --- a/storage/spider/mysql-test/spider/r/basic_sql.result +++ b/storage/spider/mysql-test/spider/r/basic_sql.result @@ -243,20 +243,6 @@ a b date_format(c, '%Y-%m-%d %H:%i:%s') 4 i 2003-10-30 05:01:03 5 h 2001-10-31 23:59:59 -select sql_calc_found_rows -connection master_1; -SELECT SQL_CALC_FOUND_ROWS a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l -ORDER BY a LIMIT 4; -a b date_format(c, '%Y-%m-%d %H:%i:%s') -1 f 2008-07-01 10:21:39 -2 g 2000-02-01 00:00:00 -3 j 2007-05-04 20:03:11 -4 i 2003-10-30 05:01:03 -connection master_1; -SELECT found_rows(); -found_rows() -5 - select high_priority connection master_1; SELECT HIGH_PRIORITY a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l diff --git a/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_key.test b/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_key.test index 0962457d65c..76717a72c5d 100644 --- a/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_key.test +++ b/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_key.test @@ -62,6 +62,7 @@ INSERT INTO tbl_b (bkey,akey) VALUES (0,0),(1,1),(2,2),(3,3),(4,4),(5,4),(6,3),( --connection child2_1 TRUNCATE TABLE mysql.general_log; +--disable_view_protocol --connection master_1 --disable_ps2_protocol SELECT a.val, a.akey FROM tbl_a a, tbl_b b WHERE a.akey = b.akey AND b.bkey = 5; @@ -69,11 +70,10 @@ SELECT a.val, a.akey FROM tbl_a a, tbl_b b WHERE a.akey = b.akey AND b.bkey = 5; --connection child2_1 --disable_ps_protocol ---disable_view_protocol eval $CHILD2_1_SELECT_ARGUMENT1; ---enable_view_protocol eval $CHILD2_1_SELECT_TABLES; --enable_ps_protocol +--enable_view_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_pkey.test b/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_pkey.test index efb74d02b7b..f22e158916f 100644 --- a/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_pkey.test +++ b/storage/spider/mysql-test/spider/regression/e1121/t/direct_join_by_pkey_pkey.test @@ -71,8 +71,8 @@ SELECT a.val, a.akey FROM tbl_a a, tbl_b b WHERE a.akey = b.akey AND b.bkey = 5; --disable_ps_protocol --disable_view_protocol eval $CHILD2_1_SELECT_ARGUMENT1; ---enable_view_protocol eval $CHILD2_1_SELECT_TABLES; +--enable_view_protocol --enable_ps_protocol --echo diff --git a/storage/spider/mysql-test/spider/t/basic_sql.test b/storage/spider/mysql-test/spider/t/basic_sql.test index b5a9b2f41cd..9439d01d9d9 100644 --- a/storage/spider/mysql-test/spider/t/basic_sql.test +++ b/storage/spider/mysql-test/spider/t/basic_sql.test @@ -847,52 +847,6 @@ if ($USE_CHILD_GROUP2) } } ---echo ---echo select sql_calc_found_rows -if ($USE_CHILD_GROUP2) -{ - if (!$OUTPUT_CHILD_GROUP2) - { - --disable_query_log - --disable_result_log - } - --connection child2_1 - if ($USE_GENERAL_LOG) - { - TRUNCATE TABLE mysql.general_log; - } - if (!$OUTPUT_CHILD_GROUP2) - { - --enable_query_log - --enable_result_log - } -} ---connection master_1 -SELECT SQL_CALC_FOUND_ROWS a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l -ORDER BY a LIMIT 4; -if ($USE_CHILD_GROUP2) -{ - if (!$OUTPUT_CHILD_GROUP2) - { - --disable_query_log - --disable_result_log - } - --connection child2_1 - if ($USE_GENERAL_LOG) - { - SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; - } - if (!$OUTPUT_CHILD_GROUP2) - { - --enable_query_log - --enable_result_log - } -} ---connection master_1 ---disable_ps2_protocol -SELECT found_rows(); ---enable_ps2_protocol - --echo --echo select high_priority if ($USE_CHILD_GROUP2) diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc index 71f48949743..6f9ae7c8dc7 100644 --- a/storage/spider/spd_db_conn.cc +++ b/storage/spider/spd_db_conn.cc @@ -9315,6 +9315,7 @@ error: DBUG_RETURN(error_num); } +PRAGMA_DISABLE_CHECK_STACK_FRAME bool spider_db_conn_is_network_error( int error_num ) { @@ -9331,3 +9332,4 @@ bool spider_db_conn_is_network_error( } DBUG_RETURN(FALSE); } +PRAGMA_REENABLE_CHECK_STACK_FRAME diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index 1f7e7a95b3c..ca92fd62fd4 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -8906,12 +8906,13 @@ int spider_mbase_handler::append_key_select_part( default: DBUG_RETURN(0); } - error_num = append_key_select(str, idx); + error_num = append_key_select(str, sql_type, idx); DBUG_RETURN(error_num); } int spider_mbase_handler::append_key_select( spider_string *str, + ulong sql_type, uint idx ) { st_select_lex *select_lex = NULL; @@ -8960,6 +8961,7 @@ int spider_mbase_handler::append_key_select( str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } str->length(str->length() - SPIDER_SQL_COMMA_LEN); + DBUG_RETURN(append_from(str, sql_type, first_link_idx)); } else { table_name_pos = str->length() + mysql_share->key_select_pos[idx]; if (str->append(mysql_share->key_select[idx])) diff --git a/storage/spider/spd_db_mysql.h b/storage/spider/spd_db_mysql.h index fb007f4a6ee..8e8d8ebd963 100644 --- a/storage/spider/spd_db_mysql.h +++ b/storage/spider/spd_db_mysql.h @@ -881,6 +881,7 @@ public: ) override; int append_key_select( spider_string *str, + ulong sql_type, uint idx ); int append_minimum_select_part( diff --git a/strings/json_lib.c b/strings/json_lib.c index 4fc8625d668..9e202e47b1e 100644 --- a/strings/json_lib.c +++ b/strings/json_lib.c @@ -1698,7 +1698,7 @@ static enum json_esc_char_classes json_escape_chr_map[0x60] = { }; -static const char hexconv[16] = "0123456789ABCDEF"; +static const char hexconv[17] = "0123456789ABCDEF"; int json_escape(CHARSET_INFO *str_cs, @@ -1874,13 +1874,13 @@ static enum json_types smart_read_value(json_engine_t *je, *value_len= (int) ((char *) je->s.c_str - *value); } - compile_time_assert((int) JSON_VALUE_OBJECT == (int) JSV_OBJECT); - compile_time_assert((int) JSON_VALUE_ARRAY == (int) JSV_ARRAY); - compile_time_assert((int) JSON_VALUE_STRING == (int) JSV_STRING); - compile_time_assert((int) JSON_VALUE_NUMBER == (int) JSV_NUMBER); - compile_time_assert((int) JSON_VALUE_TRUE == (int) JSV_TRUE); - compile_time_assert((int) JSON_VALUE_FALSE == (int) JSV_FALSE); - compile_time_assert((int) JSON_VALUE_NULL == (int) JSV_NULL); + compile_time_assert((enum json_types)JSON_VALUE_OBJECT == JSV_OBJECT); + compile_time_assert((enum json_types)JSON_VALUE_ARRAY == JSV_ARRAY); + compile_time_assert((enum json_types)JSON_VALUE_STRING == JSV_STRING); + compile_time_assert((enum json_types)JSON_VALUE_NUMBER == JSV_NUMBER); + compile_time_assert((enum json_types)JSON_VALUE_TRUE == JSV_TRUE); + compile_time_assert((enum json_types)JSON_VALUE_FALSE == JSV_FALSE); + compile_time_assert((enum json_types)JSON_VALUE_NULL == JSV_NULL); return (enum json_types) je->value_type; diff --git a/strings/uca-dump.c b/strings/uca-dump.c index 989fe98f48a..10dc82e1a3d 100644 --- a/strings/uca-dump.c +++ b/strings/uca-dump.c @@ -24,7 +24,7 @@ #include "m_ctype.h" #include "ctype-uca.h" - +PRAGMA_DISABLE_CHECK_STACK_FRAME #define MAX_ALLOWED_CODE 0x10FFFF @@ -398,7 +398,7 @@ static const char *pname_prefix[]= {"_p", "_p", "_p"}; static const char *pname_suffix[]= {"", "_secondary", "_tertiary"}; -void usage(const char *prog) +static void usage(const char *prog) { printf("Usage:\n"); printf("%s [options] filename\n", prog); @@ -411,7 +411,7 @@ static inline int lstrncmp(const char *str, const LEX_CSTRING lstr) } -int process_option(OPT *options, const char *opt) +static int process_option(OPT *options, const char *opt) { static const LEX_CSTRING opt_name_prefix= {STRING_WITH_LEN("--name-prefix=")}; static const LEX_CSTRING opt_levels= {STRING_WITH_LEN("--levels=")}; @@ -458,7 +458,7 @@ int process_option(OPT *options, const char *opt) } -int process_options(OPT *options, int ac, char **av) +static int process_options(OPT *options, int ac, char **av) { int i; for (i= 1; i < ac; i++) @@ -484,7 +484,7 @@ int process_options(OPT *options, int ac, char **av) } -FILE *open_file(const char *name) +static FILE *open_file(const char *name) { if (!strcmp(name, "-")) return stdin; @@ -492,14 +492,14 @@ FILE *open_file(const char *name) } -void close_file(FILE *file) +static void close_file(FILE *file) { if (file != stdin) fclose(file); } -char *strrtrim(char *str) +static char *strrtrim(char *str) { char *end= str + strlen(str); for ( ; str < end; end--) @@ -524,7 +524,7 @@ char *strrtrim(char *str) of them at the moment, it was easier to write these routines in ctype-uca.h manually. So @implicitweights lines are ignored here. */ -my_bool parse_at_line(MY_DUCET *ducet, const char *str) +static my_bool parse_at_line(MY_DUCET *ducet, const char *str) { static const LEX_CSTRING version= {STRING_WITH_LEN("@version ")}; if (!lstrncmp(str, version)) @@ -994,3 +994,4 @@ int main(int ac, char **av) return 0; } +PRAGMA_REENABLE_CHECK_STACK_FRAME diff --git a/vio/CMakeLists.txt b/vio/CMakeLists.txt index 85810840273..e7987cb9c2f 100644 --- a/vio/CMakeLists.txt +++ b/vio/CMakeLists.txt @@ -20,3 +20,4 @@ ADD_DEFINITIONS(${SSL_DEFINES}) SET(VIO_SOURCES vio.c viosocket.c viossl.c viopipe.c viosslfactories.c) ADD_CONVENIENCE_LIBRARY(vio ${VIO_SOURCES}) TARGET_LINK_LIBRARIES(vio ${LIBSOCKET}) +TARGET_LINK_LIBRARIES(vio ${SSL_LIBRARIES})