diff --git a/.gitignore b/.gitignore index 05c65848514..a1d9491e4bc 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ *.rpm .*.swp *.ninja +.ccls-cache/ .ninja_* *.mri *.mri.tpl diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f5d0ef87e07..b59d5a96b7f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -27,6 +27,7 @@ stages: - build - test - Salsa-CI + - sast default: # Base image for builds and tests unless otherwise defined @@ -206,7 +207,7 @@ fedora-sanitizer: - builddir/_CPack_Packages/Linux/RPM/SPECS/ parallel: matrix: - - SANITIZER: [-DWITH_ASAN=YES, -DWITH_TSAN=YES, -DWITH_UBSAN=YES, -DWITH_MSAN=YES] + - SANITIZER: [-DWITH_ASAN=YES, -DWITH_TSAN=YES, -DWITH_UBSAN=YES] centos8: stage: build @@ -298,6 +299,7 @@ centos7: main.mysqldump : Field separator argument is not what is expected; check the manual when executing 'SELECT INTO OUTFILE' main.flush_logs_not_windows : query 'flush logs' succeeded - should have failed with error ER_CANT_CREATE_FILE (1004) main.mysql_upgrade_noengine : upgrade output order does not match the expected + main.func_math : MDEV-20966 - Wrong error code " > skiplist - ./mtr --suite=main --force --parallel=auto --xml-report=$CI_PROJECT_DIR/junit.xml --skip-test-list=skiplist $RESTART_POLICY @@ -370,22 +372,6 @@ mysql-test-run-ubsan: junit: - junit.xml -mysql-test-run-msan: - stage: test - variables: - RESTART_POLICY: "--force-restart" - dependencies: - - "fedora-sanitizer: [-DWITH_MSAN=YES]" - needs: - - "fedora-sanitizer: [-DWITH_MSAN=YES]" - <<: *mysql-test-run-def - allow_failure: true - artifacts: - when: always # Also show results when tests fail - reports: - junit: - - junit.xml - rpmlint: stage: test dependencies: @@ -440,52 +426,70 @@ fedora install: - installed-database.sql - upgraded-database.sql -fedora upgrade: - stage: test - dependencies: - - fedora - needs: - - fedora +cppcheck: + stage: sast + needs: [] + variables: + GIT_STRATEGY: fetch + GIT_SUBMODULE_STRATEGY: normal script: - - dnf install -y mariadb-server - # Fedora does not support running services in Docker (like Debian packages do) so start it manually - - /usr/libexec/mariadb-check-socket - - /usr/libexec/mariadb-prepare-db-dir - - sudo -u mysql /usr/libexec/mariadbd --basedir=/usr & sleep 10 - # Dump database contents in installed state - - mariadb-dump --all-databases --all-tablespaces --triggers --routines --events --skip-extended-insert > old-installed-database.sql - - /usr/libexec/mariadb-check-upgrade - # Dump database contents in upgraded state - - mariadb-dump --all-databases --all-tablespaces --triggers --routines --events --skip-extended-insert > old-upgraded-database.sql - - mariadb --skip-column-names -e "SELECT @@version, @@version_comment" # Show version - # @TODO: Upgrade from Fedora 33 MariaDB 10.4 to MariaDB.org latest does not work - # so do this manual step to remove conflicts until packaging is fixed - - yum remove -y mariadb-server-utils mariadb-gssapi-server mariadb-cracklib-password-check mariadb-backup mariadb-connector-c-config - - rm -f rpm/*debuginfo* # Not relevant in this test - - yum install -y rpm/*.rpm - # nothing provides galera-4 on Fedora, so this step fails if built with wsrep - - mysql -e "SHUTDOWN;" - - /usr/bin/mariadb-install-db # This step should not do anything on upgrades, just exit - - sudo -u mysql /usr/sbin/mariadbd & sleep 10 - # Dump database contents in installed state - - mariadb-dump --all-databases --all-tablespaces --triggers --routines --events --skip-extended-insert > new-installed-database.sql || true - # The step above fails on: mariadb-dump: Couldn't execute 'show events': Cannot proceed, because event scheduler is disabled (1577) - # @TODO: Since we did a manual start, we also need to run upgrade manually - - /usr/bin/mariadb-upgrade - # Dump database contents in upgraded state - - mariadb-dump --all-databases --all-tablespaces --triggers --routines --events --skip-extended-insert > new-upgraded-database.sql - - | - mariadb --skip-column-names -e "SELECT @@version, @@version_comment" | tee /tmp/version - grep $MARIADB_MAJOR_VERSION /tmp/version || echo "MariaDB didn't upgrade properly" - - mariadb --table -e "SELECT * FROM mysql.global_priv; SHOW CREATE USER root@localhost; SHOW CREATE USER 'mariadb.sys'@localhost" - - mariadb --table -e "SELECT * FROM mysql.plugin; SHOW PLUGINS" + - yum install -y cppcheck diffutils + # --template: use a single-line template + # --force: check large directories without warning + # -i: ignore this directory when scanning + # -j: run multiple cppcheck threads + # Use newline to escape colon in yaml + - > + cppcheck --template="{file}:{line}: {severity}: {message}" --force + client dbug extra include libmariadb libmysqld libservices mysql-test mysys mysys_ssl pcre plugin + strings tests unittest vio wsrep-lib sql sql-common storage + -istorage/mroonga -istorage/tokudb -istorage/spider -istorage/rocksdb -iextra/ -ilibmariadb/ -istorage/columnstore + --output-file=cppcheck.txt -j $(nproc) + # Parallel jobs may output findings in an nondeterministic order. Sort to match ignorelist. + - cat cppcheck.txt | sort > cppcheck_sorted.txt + # Remove line numbers for diff + - sed 's/:[^:]*:/:/' cppcheck_sorted.txt > cppcheck_sorted_no_line_numbers.txt + # Only print new issues not found in ignore list + - echo "Problems found in ignore list that were not discovered by cppcheck (may have been fixed)." + - diff --changed-group-format='%>' --unchanged-group-format='' cppcheck_sorted_no_line_numbers.txt tests/code_quality/cppcheck_ignorelist.txt || true + - echo "Problems found by cppcheck that were not in ignore list." + - diff --changed-group-format='%<' --unchanged-group-format='' cppcheck_sorted_no_line_numbers.txt tests/code_quality/cppcheck_ignorelist.txt > lines_not_ignored.txt || true + - cat lines_not_ignored.txt && test ! -s lines_not_ignored.txt artifacts: + when: always paths: - - old-installed-database.sql - - old-upgraded-database.sql - - new-installed-database.sql - - new-upgraded-database.sql + - cppcheck_sorted.txt +flawfinder: + stage: sast + needs: [] + variables: + GIT_STRATEGY: fetch + GIT_SUBMODULE_STRATEGY: normal + script: + - yum install -y python3 python3-pip jq diffutils git + - pip install flawfinder + - flawfinder --falsepositive --quiet --html . > flawfinder-all-vulnerabilities.html + - cat flawfinder-all-vulnerabilities.html | grep "Hits =" + - flawfinder --falsepositive --quiet --minlevel=5 --sarif . > flawfinder-output.json + # FlawFinder's --sarif output will display all vulnerabilities despite having --minlevel=5 specified. + # Therefore, we postprocess the results with jq and filter out findings where the vulnerability level is less than 5. + # Also in the SARIF output format, the vulnerabilities are ranked as 0.2/0.4/0.6/0.8/1.0 which correspond to the --minlevel=1/2/3/4/5 of FlawFinder. + # Additionally, we sort the results because individual findings are consistent across different runs, but their ordering may not be. + # Vulnerabilities can also be ignored in-line (/* Flawfinder: ignore */), but this option was chosen as to not clutter the codebase. + - jq 'del(.runs[] | .tool | .driver | .rules) | del(.runs[] | .results[] | select(.rank < 1)) | del(.runs[] | .results[] | .locations[] | .physicalLocation | .region | .startLine) | .runs[0].results|=sort_by(.fingerprints)' flawfinder-output.json > flawfinder-min-level5.json + # Diff against known vulnerabilities, but ignore the line number. + - echo "Problems found in ignore list that were not discovered by flawfinder (may have been fixed)." + - diff --changed-group-format='%>' --unchanged-group-format='' flawfinder-min-level5.json tests/code_quality/flawfinder_ignorelist.json || true + - echo "Problems found by flawfinder that were not in ignore list." + - diff --changed-group-format='%<' --unchanged-group-format='' flawfinder-min-level5.json tests/code_quality/flawfinder_ignorelist.json > lines_not_ignored.txt || true + - cat lines_not_ignored.txt && test ! -s lines_not_ignored.txt + artifacts: + when: always + paths: + - flawfinder-all-vulnerabilities.html + - flawfinder-min-level5.json + mini-benchmark: stage: test dependencies: diff --git a/CMakeLists.txt b/CMakeLists.txt index ce77fdc5f1f..8c6e509a5ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,8 +27,6 @@ IF(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) "None" "Debug" "Release" "MinSizeRel" "RelWithDebInfo") ENDIF() -PROJECT(MySQL) - # Remove the following comment if you don't want to have striped binaries # in RPM's: @@ -39,6 +37,8 @@ FOREACH(p CMP0022 CMP0046 CMP0040 CMP0048 CMP0054 CMP0075 CMP0069 CMP0135) ENDIF() ENDFOREACH() +PROJECT(MySQL) + MESSAGE(STATUS "Running cmake version ${CMAKE_VERSION}") SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} diff --git a/client/mysql.cc b/client/mysql.cc index f3d07bc2489..34fc1a8b11a 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -2122,7 +2122,7 @@ static int get_options(int argc, char **argv) current_db= my_strdup(PSI_NOT_INSTRUMENTED, *argv, MYF(MY_WME)); } if (tty_password) - opt_password= get_tty_password(NullS); + opt_password= my_get_tty_password(NullS); if (debug_info_flag) my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO; if (debug_check_flag) @@ -4826,7 +4826,7 @@ char *mysql_authentication_dialog_ask(MYSQL *mysql, int type, if (type == 2) /* password */ { - s= get_tty_password(""); + s= my_get_tty_password(""); strnmov(buf, s, buf_len); buf[buf_len-1]= 0; my_free(s); diff --git a/client/mysql_upgrade.c b/client/mysql_upgrade.c index 09ea3406809..a6d497b2720 100644 --- a/client/mysql_upgrade.c +++ b/client/mysql_upgrade.c @@ -1451,7 +1451,7 @@ int main(int argc, char **argv) if (tty_password) { - opt_password= get_tty_password(NullS); + opt_password= my_get_tty_password(NullS); /* add password to defaults file */ add_one_option_cnf_file(&ds_args, "password", opt_password); } diff --git a/client/mysqladmin.cc b/client/mysqladmin.cc index eae46b8b5f1..410ee663d30 100644 --- a/client/mysqladmin.cc +++ b/client/mysqladmin.cc @@ -369,7 +369,7 @@ int main(int argc,char *argv[]) } commands = temp_argv; if (tty_password) - opt_password = get_tty_password(NullS); + opt_password = my_get_tty_password(NullS); (void) signal(SIGINT,endprog); /* Here if abort */ (void) signal(SIGTERM,endprog); /* Here if abort */ @@ -1100,8 +1100,8 @@ static int execute_commands(MYSQL *mysql,int argc, char **argv) else if (argc == 1) { /* prompt for password */ - typed_password= get_tty_password("New password: "); - verified= get_tty_password("Confirm new password: "); + typed_password= my_get_tty_password("New password: "); + verified= my_get_tty_password("Confirm new password: "); if (strcmp(typed_password, verified) != 0) { my_printf_error(0,"Passwords don't match",MYF(ME_BELL)); diff --git a/client/mysqlbinlog.cc b/client/mysqlbinlog.cc index 517d513c754..dc62fd5baf3 100644 --- a/client/mysqlbinlog.cc +++ b/client/mysqlbinlog.cc @@ -2545,7 +2545,7 @@ get_one_option(const struct my_option *opt, const char *argument, break; } if (tty_password) - pass= get_tty_password(NullS); + pass= my_get_tty_password(NullS); return 0; } diff --git a/client/mysqlcheck.c b/client/mysqlcheck.c index 3b9942d55a5..2f366ec0659 100644 --- a/client/mysqlcheck.c +++ b/client/mysqlcheck.c @@ -489,7 +489,7 @@ static int get_options(int *argc, char ***argv) DBUG_RETURN(1); } if (tty_password) - opt_password = get_tty_password(NullS); + opt_password = my_get_tty_password(NullS); if (debug_info_flag) my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO; if (debug_check_flag) diff --git a/client/mysqldump.c b/client/mysqldump.c index b75dd39a106..af31e613671 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -1323,7 +1323,7 @@ static int get_options(int *argc, char ***argv) return EX_USAGE; } if (tty_password) - opt_password=get_tty_password(NullS); + opt_password=my_get_tty_password(NullS); return(0); } /* get_options */ @@ -2818,11 +2818,7 @@ static uint dump_routines_for_db(char *db) routine_type[i], routine_name); if (mysql_query_with_error_report(mysql, &routine_res, query_buff)) - { - mysql_free_result(routine_list_res); - routine_list_res= 0; - DBUG_RETURN(1); - } + continue; while ((row= mysql_fetch_row(routine_res))) { diff --git a/client/mysqlimport.c b/client/mysqlimport.c index 7456d109d5b..68f89968dae 100644 --- a/client/mysqlimport.c +++ b/client/mysqlimport.c @@ -326,7 +326,7 @@ static int get_options(int *argc, char ***argv) current_db= *((*argv)++); (*argc)--; if (tty_password) - opt_password=get_tty_password(NullS); + opt_password=my_get_tty_password(NullS); return(0); } diff --git a/client/mysqlshow.c b/client/mysqlshow.c index 63981e02d59..aa606d61c72 100644 --- a/client/mysqlshow.c +++ b/client/mysqlshow.c @@ -385,7 +385,7 @@ get_options(int *argc,char ***argv) exit(ho_error); if (tty_password) - opt_password=get_tty_password(NullS); + opt_password=my_get_tty_password(NullS); if (opt_count) { /* diff --git a/client/mysqlslap.c b/client/mysqlslap.c index f8b8ad15e4c..885a5f43e35 100644 --- a/client/mysqlslap.c +++ b/client/mysqlslap.c @@ -1552,7 +1552,7 @@ get_options(int *argc,char ***argv) } if (tty_password) - opt_password= get_tty_password(NullS); + opt_password= my_get_tty_password(NullS); DBUG_RETURN(0); } diff --git a/client/mysqltest.cc b/client/mysqltest.cc index 9854001ba1a..d225383d7a2 100644 --- a/client/mysqltest.cc +++ b/client/mysqltest.cc @@ -116,7 +116,7 @@ static my_bool opt_compress= 0, silent= 0, verbose= 0; static my_bool debug_info_flag= 0, debug_check_flag= 0; static my_bool tty_password= 0; static my_bool opt_mark_progress= 0; -static my_bool ps_protocol= 0, ps_protocol_enabled= 0; +static my_bool ps_protocol= 0, ps_protocol_enabled= 0, ps2_protocol_enabled= 0; static my_bool sp_protocol= 0, sp_protocol_enabled= 0; static my_bool view_protocol= 0, view_protocol_enabled= 0; static my_bool service_connection_enabled= 1; @@ -157,6 +157,7 @@ static struct property prop_list[] = { { &display_session_track_info, 0, 1, 1, "$ENABLED_STATE_CHANGE_INFO" }, { &display_metadata, 0, 0, 0, "$ENABLED_METADATA" }, { &ps_protocol_enabled, 0, 0, 0, "$ENABLED_PS_PROTOCOL" }, + { &ps2_protocol_enabled, 0, 0, 0, "$ENABLED_PS2_PROTOCOL" }, { &view_protocol_enabled, 0, 0, 0, "$ENABLED_VIEW_PROTOCOL"}, { &service_connection_enabled, 0, 1, 0, "$ENABLED_SERVICE_CONNECTION"}, { &disable_query_log, 0, 0, 1, "$ENABLED_QUERY_LOG" }, @@ -173,6 +174,7 @@ enum enum_prop { P_SESSION_TRACK, P_META, P_PS, + P_PS2, P_VIEW, P_CONN, P_QUERY, @@ -263,6 +265,7 @@ static size_t suite_dir_len, overlay_dir_len; /* Precompiled re's */ static regex_t ps_re; /* the query can be run using PS protocol */ +static regex_t ps2_re; /* the query can be run using PS protocol with second execution*/ static regex_t sp_re; /* the query can be run as a SP */ static regex_t view_re; /* the query can be run as a view*/ @@ -381,6 +384,7 @@ enum enum_commands { Q_LOWERCASE, Q_START_TIMER, Q_END_TIMER, Q_CHARACTER_SET, Q_DISABLE_PS_PROTOCOL, Q_ENABLE_PS_PROTOCOL, + Q_DISABLE_PS2_PROTOCOL, Q_ENABLE_PS2_PROTOCOL, Q_DISABLE_VIEW_PROTOCOL, Q_ENABLE_VIEW_PROTOCOL, Q_DISABLE_SERVICE_CONNECTION, Q_ENABLE_SERVICE_CONNECTION, Q_ENABLE_NON_BLOCKING_API, Q_DISABLE_NON_BLOCKING_API, @@ -474,6 +478,8 @@ const char *command_names[]= "character_set", "disable_ps_protocol", "enable_ps_protocol", + "disable_ps2_protocol", + "enable_ps2_protocol", "disable_view_protocol", "enable_view_protocol", "disable_service_connection", @@ -7387,7 +7393,7 @@ int parse_args(int argc, char **argv) if (argc == 1) opt_db= *argv; if (tty_password) - opt_pass= get_tty_password(NullS); /* purify tested */ + opt_pass= my_get_tty_password(NullS); /* purify tested */ if (debug_info_flag) my_end_arg= MY_CHECK_ERROR | MY_GIVE_INFO; if (debug_check_flag) @@ -8475,6 +8481,19 @@ void run_query_stmt(struct st_connection *cn, struct st_command *command, } #endif + /* + Execute the query first time if second execution enable + */ + if(ps2_protocol_enabled && match_re(&ps2_re, query)) + { + if (do_stmt_execute(cn)) + { + handle_error(command, mysql_stmt_errno(stmt), + mysql_stmt_error(stmt), mysql_stmt_sqlstate(stmt), ds); + goto end; + } + } + /* Execute the query */ @@ -9084,6 +9103,9 @@ int util_query(MYSQL* org_mysql, const char* query){ org_mysql->unix_socket); cur_con->util_mysql= mysql; + if (mysql->charset != org_mysql->charset) + mysql_set_character_set(mysql, org_mysql->charset-> + IF_EMBEDDED(cs_name.str, csname)); } } else @@ -9463,6 +9485,13 @@ void init_re(void) "[[:space:]]*UNINSTALL[[:space:]]+|" "[[:space:]]*UPDATE[[:space:]]" ")"; + /* + Filter for queries that can be run for second + execution of prepare statement + */ + const char *ps2_re_str = + "^(" + "[[:space:]]*SELECT[[:space:]])"; /* Filter for queries that can be run as views @@ -9472,6 +9501,7 @@ void init_re(void) "[[:space:]]*SELECT[[:space:]])"; init_re_comp(&ps_re, ps_re_str); + init_re_comp(&ps2_re, ps2_re_str); init_re_comp(&sp_re, sp_re_str); init_re_comp(&view_re, view_re_str); } @@ -9508,6 +9538,7 @@ int match_re(regex_t *re, char *str) void free_re(void) { regfree(&ps_re); + regfree(&ps2_re); regfree(&sp_re); regfree(&view_re); } @@ -9859,6 +9890,9 @@ int main(int argc, char **argv) if (cursor_protocol) ps_protocol= 1; + /* Enable second execution of SELECT for ps-protocol + if ps-protocol is used */ + ps2_protocol_enabled= ps_protocol; ps_protocol_enabled= ps_protocol; sp_protocol_enabled= sp_protocol; view_protocol_enabled= view_protocol; @@ -10286,6 +10320,12 @@ int main(int argc, char **argv) case Q_ENABLE_PS_PROTOCOL: set_property(command, P_PS, ps_protocol); break; + case Q_DISABLE_PS2_PROTOCOL: + set_property(command, P_PS2, 0); + break; + case Q_ENABLE_PS2_PROTOCOL: + set_property(command, P_PS2, ps_protocol); + break; case Q_DISABLE_VIEW_PROTOCOL: set_property(command, P_VIEW, 0); /* Close only util connections */ diff --git a/cmake/aws_sdk.cmake b/cmake/aws_sdk.cmake index f6f88f2b880..a0d46e1a892 100644 --- a/cmake/aws_sdk.cmake +++ b/cmake/aws_sdk.cmake @@ -10,7 +10,7 @@ FUNCTION (CHECK_AWS_SDK RETVAL REASON) SKIP_AWS_SDK("AWS_SDK_EXTERNAL_PROJECT is not ON") ENDIF() IF(NOT NOT_FOR_DISTRIBUTION) - SKIP_AWS_SDK("AWS SDK has Apache 2.0 License which is not complatible with GPLv2. Set -DNOT_FOR_DISTRIBUTION=ON if you need it") + SKIP_AWS_SDK("AWS SDK has Apache 2.0 License which is not compatible with GPLv2. Set -DNOT_FOR_DISTRIBUTION=ON if you need it") ENDIF() # Check compiler support IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU") diff --git a/cmake/cpack_rpm.cmake b/cmake/cpack_rpm.cmake index eec37d4fdad..28d12ab089a 100644 --- a/cmake/cpack_rpm.cmake +++ b/cmake/cpack_rpm.cmake @@ -74,7 +74,7 @@ It was originally forked from Percona XtraBackup 2.3.8.") # Packages with default description SET(CPACK_RPM_client_PACKAGE_SUMMARY "MariaDB database client binaries") SET(CPACK_RPM_client_PACKAGE_DESCRIPTION "${CPACK_RPM_PACKAGE_DESCRIPTION}") -SET(CPACK_RPM_common_PACKAGE_SUMMARY "MariaDB database common files (e.g. /etc/mysql/conf.d/mariadb.cnf)") +SET(CPACK_RPM_common_PACKAGE_SUMMARY "MariaDB database common configuration files (e.g. /etc/mysql/conf.d/mariadb.cnf)") SET(CPACK_RPM_common_PACKAGE_DESCRIPTION "${CPACK_RPM_PACKAGE_DESCRIPTION}") SET(CPACK_RPM_compat_PACKAGE_SUMMARY "MariaDB database client library MySQL compat package") SET(CPACK_RPM_compat_PACKAGE_DESCRIPTION "${CPACK_RPM_PACKAGE_DESCRIPTION}") @@ -109,6 +109,8 @@ SET(CPACK_RPM_SPEC_MORE_DEFINE " %define restart_flag_dir %{_localstatedir}/lib/rpm-state/mariadb %define restart_flag %{restart_flag_dir}/need-restart +%define pretrans %{nil} + %{?filter_setup: %filter_provides_in \\\\.\\\\(test\\\\|result\\\\|h\\\\|cc\\\\|c\\\\|inc\\\\|opt\\\\|ic\\\\|cnf\\\\|rdiff\\\\|cpp\\\\)$ %filter_requires_in \\\\.\\\\(test\\\\|result\\\\|h\\\\|cc\\\\|c\\\\|inc\\\\|opt\\\\|ic\\\\|cnf\\\\|rdiff\\\\|cpp\\\\)$ @@ -239,6 +241,8 @@ SET(CPACK_RPM_shared_POST_INSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/support-files/ SET(CPACK_RPM_shared_POST_UNINSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/support-files/rpm/shared-post.sh) SET(CPACK_RPM_compat_POST_INSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/support-files/rpm/shared-post.sh) SET(CPACK_RPM_compat_POST_UNINSTALL_SCRIPT_FILE ${CMAKE_SOURCE_DIR}/support-files/rpm/shared-post.sh) +SET(CPACK_RPM_cracklib-password-check_POST_INSTALL_SCRIPT_FILE + ${CMAKE_SOURCE_DIR}/plugin/cracklib_password_check/support-files/rpm/mariadb-plugin-cracklib-password-check-postin.sh) MACRO(ALTERNATIVE_NAME real alt) IF(${ARGC} GREATER 2) diff --git a/debian/control b/debian/control index cc1e3410be0..f2ea3585575 100644 --- a/debian/control +++ b/debian/control @@ -82,9 +82,9 @@ Description: MariaDB database development files language in the world. The main goals of MariaDB are speed, robustness and ease of use. . - This package includes development libraries and header files. To allow sources + This package includes development libraries and header files to allow sources expecting the MariaDB Connector/C to build. Sources that expect the MySQL - Client libraries should use files from the libmariadb-dev-compat package. + client libraries should use files from the libmariadb-dev-compat package. Package: libmariadb-dev-compat Architecture: any @@ -232,18 +232,18 @@ Breaks: libmariadb-dev (<< ${source:Version}), Replaces: libmariadb-dev (<< ${source:Version}), libmariadbclient-dev (<< ${source:Version}), libmysqld-dev -Description: MariaDB embedded database, development files +Description: MariaDB embedded database, development files package MariaDB is a fast, stable and true multi-user, multi-threaded SQL database server. SQL (Structured Query Language) is the most popular database query language in the world. The main goals of MariaDB are speed, robustness and ease of use. . - This package includes the embedded server library development and header files. + This package includes the MariaDB embedded server library development and header files. Package: mysql-common Architecture: all Depends: ${misc:Depends} -Description: MariaDB database common files (e.g. /etc/mysql/my.cnf) +Description: MariaDB client common configuration files package (e.g. /etc/mysql/my.cnf) MariaDB is a fast, stable and true multi-user, multi-threaded SQL database server. SQL (Structured Query Language) is the most popular database query language in the world. The main goals of MariaDB are speed, robustness and @@ -257,7 +257,7 @@ Architecture: all Depends: mysql-common (>= 5.6.25), ${misc:Depends} Multi-Arch: foreign -Description: MariaDB common configuration files +Description: MariaDB database common files (e.g. /etc/mysql/mariadb.conf.d/) MariaDB is a fast, stable and true multi-user, multi-threaded SQL database server. SQL (Structured Query Language) is the most popular database query language in the world. The main goals of MariaDB are speed, robustness and @@ -804,8 +804,8 @@ Depends: mariadb-client-core (= ${binary:Version}), ${misc:Depends}, ${shlibs:Depends} Description: Backup tool for MariaDB server - This backup tool is guaranteed to be compatible with MariaDB. - Based on Xtrabackup, but improved to work with MariaDB. + Based on Xtrabackup, but improved to work with MariaDB server. + This backup tool is guaranteed to be compatible with MariaDB server. . Please refer to the MariaDB Knowledge Base on more information on how to use this tool. @@ -832,11 +832,11 @@ Replaces: mariadb-connect-engine-10.0, mariadb-connect-engine-10.4, mariadb-server-10.0, mariadb-server-10.1 -Description: Connect storage engine for MariaDB +Description: Connect storage engine for MariaDB server Connect engine supports a number of file formats (dbf, xml, txt, bin, etc), connections to ODBC tables and remote MySQL tables, as well as a number of other interesting features. - This package contains the Connect plugin for MariaDB. + This package contains the Connect plugin for MariaDB server. Package: mariadb-plugin-s3 Architecture: any @@ -863,10 +863,10 @@ Replaces: mariadb-rocksdb-engine-10.2, mariadb-rocksdb-engine-10.3, mariadb-rocksdb-engine-10.4 Recommends: python3-mysqldb -Description: RocksDB storage engine for MariaDB +Description: RocksDB storage engine for MariaDB server The RocksDB storage engine is a high performance storage engine, aimed at maximising storage efficiency while maintaining InnoDB-like performance. - This package contains the RocksDB plugin for MariaDB. + This package contains the RocksDB plugin for MariaDB server. Package: mariadb-plugin-oqgraph Architecture: any @@ -888,10 +888,10 @@ Replaces: mariadb-oqgraph-engine-10.0, mariadb-oqgraph-engine-10.4, mariadb-server-10.0, mariadb-server-10.1 -Description: OQGraph storage engine for MariaDB +Description: OQGraph storage engine for MariaDB server The OQGraph engine is a computation engine plugin for handling hierarchies (trees) and graphs (friend-of-a-friend, etc) cleanly through standard SQL. - This package contains the OQGraph plugin for MariaDB. + This package contains the OQGraph plugin for MariaDB server. Package: mariadb-plugin-mroonga Architecture: any-alpha any-amd64 any-arm any-arm64 any-i386 any-ia64 any-mips64el any-mips64r6el any-mipsel any-mipsr6el any-nios2 any-powerpcel any-ppc64el any-sh3 any-sh4 any-tilegx @@ -908,10 +908,10 @@ Replaces: mariadb-server-10.0, mariadb-server-10.2, mariadb-server-10.3, mariadb-server-10.4 -Description: Mroonga storage engine for MariaDB +Description: Mroonga storage engine for MariaDB server Mroonga (formerly named Groonga Storage Engine) is a storage engine that provides fast CJK-ready full text searching using column store. - This package contains the Mroonga plugin for MariaDB. + This package contains the Mroonga plugin for MariaDB server. Package: mariadb-plugin-spider Architecture: any @@ -928,9 +928,9 @@ Replaces: mariadb-server-10.0, mariadb-server-10.2, mariadb-server-10.3, mariadb-server-10.4 -Description: Spider storage engine for MariaDB +Description: Spider storage engine for MariaDB server The Spider storage engine with built-in sharding features. It supports - partitioning and xa transactions, and allows tables of different MariaDB + partitioning and xa transactions, and allows tables of different MariaDB server instances to be handled as if they were on the same instance. It refers to one possible implementation of ISO/IEC 9075-9:2008 SQL/MED. @@ -985,11 +985,11 @@ Depends: libcrack2 (>= 2.9.0), mariadb-server, ${misc:Depends}, ${shlibs:Depends} -Description: CrackLib Password Validation Plugin for MariaDB +Description: CrackLib Password Validation Plugin for MariaDB server This password validation plugin uses cracklib to allow only - sufficiently secure (as defined by cracklib) user passwords in MariaDB. + sufficiently secure (as defined by cracklib) user passwords in MariaDB server. . - Install and configure this to enforce stronger passwords for MariaDB users. + Install and configure this to enforce stronger passwords for MariaDB server users. Package: mariadb-plugin-hashicorp-key-management Architecture: any diff --git a/extra/innochecksum.cc b/extra/innochecksum.cc index 7b8ffa92d3b..41c21f19e9c 100644 --- a/extra/innochecksum.cc +++ b/extra/innochecksum.cc @@ -1127,11 +1127,15 @@ print_summary( fprintf(fil_out, "index_id\t#pages\t\t#leaf_pages\t#recs_per_page" "\t#bytes_per_page\n"); - for (std::map::const_iterator it = index_ids.begin(); - it != index_ids.end(); it++) { - const per_index_stats& index = it->second; + for (const auto &ids : index_ids) { + const per_index_stats& index = ids.second; + if (!index.pages) { + DBUG_ASSERT(index.free_pages); + continue; + } + fprintf(fil_out, "%lld\t\t%lld\t\t%lld\t\t%lld\t\t%lld\n", - it->first, index.pages, index.leaf_pages, + ids.first, index.pages, index.leaf_pages, index.total_n_recs / index.pages, index.total_data_bytes / index.pages); } diff --git a/extra/wolfssl/CMakeLists.txt b/extra/wolfssl/CMakeLists.txt index 390a618ac91..c034db01ce2 100644 --- a/extra/wolfssl/CMakeLists.txt +++ b/extra/wolfssl/CMakeLists.txt @@ -147,7 +147,9 @@ IF(WOLFSSL_X86_64_BUILD) LIST(APPEND WOLFCRYPT_SOURCES ${WOLFCRYPT_SRCDIR}/cpuid.c) IF(MSVC) SET(WOLFSSL_AESNI 1) - LIST(APPEND WOLFCRYPT_SOURCES ${WOLFCRYPT_SRCDIR}/aes_asm.asm) + LIST(APPEND WOLFCRYPT_SOURCES + ${WOLFCRYPT_SRCDIR}/aes_asm.asm + ${WOLFCRYPT_SRCDIR}/aes_gcm_asm.asm) IF(CMAKE_C_COMPILER_ID MATCHES Clang) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -maes -msse4.2 -mpclmul -mrdrnd -mrdseed") ENDIF() diff --git a/extra/wolfssl/wolfssl b/extra/wolfssl/wolfssl index 4fbd4fd36a2..3b3c175af0e 160000 --- a/extra/wolfssl/wolfssl +++ b/extra/wolfssl/wolfssl @@ -1 +1 @@ -Subproject commit 4fbd4fd36a21efd9d1a7e17aba390e91c78693b1 +Subproject commit 3b3c175af0e993ffaae251871421e206cc41963f diff --git a/include/handler_ername.h b/include/handler_ername.h index 026d7c8bb8c..e969daa7c77 100644 --- a/include/handler_ername.h +++ b/include/handler_ername.h @@ -78,4 +78,5 @@ { "HA_ERR_ABORTED_BY_USER", HA_ERR_ABORTED_BY_USER, "" }, { "HA_ERR_DISK_FULL", HA_ERR_DISK_FULL, "" }, { "HA_ERR_INCOMPATIBLE_DEFINITION", HA_ERR_INCOMPATIBLE_DEFINITION, "" }, +{ "HA_ERR_NO_ENCRYPTION", HA_ERR_NO_ENCRYPTION, "" }, { "HA_ERR_COMMIT_ERROR", HA_ERR_COMMIT_ERROR, "" }, diff --git a/include/json_lib.h b/include/json_lib.h index f7231b07636..6342e36ab85 100644 --- a/include/json_lib.h +++ b/include/json_lib.h @@ -37,6 +37,7 @@ typedef struct st_json_string_t const uchar *c_str; /* Current position in JSON string */ const uchar *str_end; /* The end on the string. */ my_wc_t c_next; /* UNICODE of the last read character */ + int c_next_len; /* character lenght of the last read character. */ int error; /* error code. */ CHARSET_INFO *cs; /* Character set of the JSON string. */ @@ -50,7 +51,7 @@ void json_string_set_cs(json_string_t *s, CHARSET_INFO *i_cs); void json_string_set_str(json_string_t *s, const uchar *str, const uchar *end); #define json_next_char(j) \ - (j)->wc((j)->cs, &(j)->c_next, (j)->c_str, (j)->str_end) + ((j)->c_next_len= (j)->wc((j)->cs, &(j)->c_next, (j)->c_str, (j)->str_end)) #define json_eos(j) ((j)->c_str >= (j)->str_end) /* read_string_const_chr() reads the next character of the string constant diff --git a/include/m_string.h b/include/m_string.h index 28ad9ee7c88..0360cd3868e 100644 --- a/include/m_string.h +++ b/include/m_string.h @@ -250,11 +250,30 @@ static inline void lex_string_set3(LEX_CSTRING *lex_str, const char *c_str, static inline int safe_strcpy(char *dst, size_t dst_size, const char *src) { DBUG_ASSERT(dst_size > 0); - /* Note, strncpy will zerofill end of dst if src shorter than dst_size */ + + /* 1) IF there is a 0 byte in the first dst_size bytes of src, strncpy will + * 0-terminate dst, and pad dst with additional 0 bytes out to dst_size. + * + * 2) IF there is no 0 byte in the first dst_size bytes of src, strncpy will + * copy dst_size bytes, and the final byte won't be 0. + * + * In GCC 8+, the `-Wstringop-truncation` warning will object to strncpy() + * being used in this way, so we need to disable this warning for this + * single statement. + */ + +#if defined(__GNUC__) && __GNUC__ >= 8 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-truncation" +#endif strncpy(dst, src, dst_size); +#if defined(__GNUC__) && __GNUC__ >= 8 +#pragma GCC diagnostic pop +#endif + if (dst[dst_size-1]) { - /* Ensure string is zero terminated */ + /* Only possible in case (2), meaning src was truncated. */ dst[dst_size-1]= 0; return 1; } diff --git a/include/my_base.h b/include/my_base.h index 22f1ea0a5df..f237eb8a4d1 100644 --- a/include/my_base.h +++ b/include/my_base.h @@ -48,6 +48,7 @@ #define HA_OPEN_NO_PSI_CALL 1024U /* Don't call/connect PSI */ #define HA_OPEN_MERGE_TABLE 2048U #define HA_OPEN_FOR_CREATE 4096U +#define HA_OPEN_FOR_DROP (1U << 13) /* Open part of drop */ /* Allow opening even if table is incompatible as this is for ALTER TABLE which @@ -269,17 +270,15 @@ enum ha_base_keytype { #define HA_NOSAME 1U /* Set if not dupplicated records */ #define HA_PACK_KEY 2U /* Pack string key to previous key */ -#define HA_AUTO_KEY 16U +#define HA_AUTO_KEY 16U /* MEMORY/MyISAM/Aria internal */ #define HA_BINARY_PACK_KEY 32U /* Packing of all keys to prev key */ #define HA_FULLTEXT 128U /* For full-text search */ -#define HA_UNIQUE_CHECK 256U /* Check the key for uniqueness */ #define HA_SPATIAL 1024U /* For spatial search */ #define HA_NULL_ARE_EQUAL 2048U /* NULL in key are cmp as equal */ #define HA_GENERATED_KEY 8192U /* Automatically generated key */ /* The combination of the above can be used for key type comparison. */ -#define HA_KEYFLAG_MASK (HA_NOSAME | HA_AUTO_KEY | \ - HA_FULLTEXT | HA_UNIQUE_CHECK | \ +#define HA_KEYFLAG_MASK (HA_NOSAME | HA_AUTO_KEY | HA_FULLTEXT | \ HA_SPATIAL | HA_NULL_ARE_EQUAL | HA_GENERATED_KEY) /* @@ -447,6 +446,7 @@ enum ha_base_keytype { #define HA_ERR_CRASHED 126 /* Indexfile is crashed */ #define HA_ERR_WRONG_IN_RECORD 127 /* Record-file is crashed */ #define HA_ERR_OUT_OF_MEM 128 /* Out of memory */ +#define HA_ERR_RETRY_INIT 129 /* Initialization failed and should be retried */ #define HA_ERR_NOT_A_TABLE 130 /* not a MYI file - no signature */ #define HA_ERR_WRONG_COMMAND 131 /* Command not supported */ #define HA_ERR_OLD_FILE 132 /* old databasfile */ @@ -522,14 +522,15 @@ enum ha_base_keytype { #define HA_ERR_DISK_FULL 189 #define HA_ERR_INCOMPATIBLE_DEFINITION 190 #define HA_ERR_FTS_TOO_MANY_WORDS_IN_PHRASE 191 /* Too many words in a phrase */ -#define HA_ERR_DECRYPTION_FAILED 192 /* Table encrypted but decypt failed */ +#define HA_ERR_DECRYPTION_FAILED 192 /* Table encrypted but decrypt failed */ #define HA_ERR_FK_DEPTH_EXCEEDED 193 /* FK cascade depth exceeded */ #define HA_ERR_TABLESPACE_MISSING 194 /* Missing Tablespace */ #define HA_ERR_SEQUENCE_INVALID_DATA 195 #define HA_ERR_SEQUENCE_RUN_OUT 196 #define HA_ERR_COMMIT_ERROR 197 #define HA_ERR_PARTITION_LIST 198 -#define HA_ERR_LAST 198 /* Copy of last error nr * */ +#define HA_ERR_NO_ENCRYPTION 199 +#define HA_ERR_LAST 199 /* Copy of last error nr * */ /* Number of different errors */ #define HA_ERR_ERRORS (HA_ERR_LAST - HA_ERR_FIRST + 1) diff --git a/include/my_handler_errors.h b/include/my_handler_errors.h index 96632629775..df414888907 100644 --- a/include/my_handler_errors.h +++ b/include/my_handler_errors.h @@ -109,7 +109,8 @@ static const char *handler_error_messages[]= "Sequence has been run out", "Sequence values are conflicting", "Error during commit", - "Cannot select partitions" + "Cannot select partitions", + "Cannot initialize encryption. Check that all encryption parameters have been set" }; #endif /* MYSYS_MY_HANDLER_ERRORS_INCLUDED */ diff --git a/include/my_sys.h b/include/my_sys.h index cac9f4ad889..d619cbbb6fa 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -1081,7 +1081,7 @@ extern size_t escape_string_for_mysql(CHARSET_INFO *charset_info, char *to, size_t to_length, const char *from, size_t length, my_bool *overflow); -extern char *get_tty_password(const char *opt_message); +extern char *my_get_tty_password(const char *opt_message); #ifdef _WIN32 #define BACKSLASH_MBTAIL /* File system character set */ diff --git a/include/mysql.h b/include/mysql.h index a66dcc7bd02..031570a0fe5 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -141,6 +141,7 @@ typedef unsigned long long my_ulonglong; #define ER_WRONG_FK_OPTION_FOR_VIRTUAL_COLUMN ER_WRONG_FK_OPTION_FOR_GENERATED_COLUMN #define ER_UNSUPPORTED_ACTION_ON_VIRTUAL_COLUMN ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN #define ER_UNSUPPORTED_ENGINE_FOR_VIRTUAL_COLUMNS ER_UNSUPPORTED_ENGINE_FOR_GENERATED_COLUMNS +#define ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT ER_QUERY_RESULT_INCOMPLETE #define ER_KEY_COLUMN_DOES_NOT_EXITS ER_KEY_COLUMN_DOES_NOT_EXIST #define ER_DROP_PARTITION_NON_EXISTENT ER_PARTITION_DOES_NOT_EXIST diff --git a/include/mysql_com.h b/include/mysql_com.h index a2befe2d324..1bc2fcc7855 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -281,7 +281,7 @@ enum enum_indicator_type #define CLIENT_DEPRECATE_EOF (1ULL << 24) #define CLIENT_PROGRESS_OBSOLETE (1ULL << 29) -#define CLIENT_SSL_VERIFY_SERVER_CERT (1ULL << 30) +#define CLIENT_SSL_VERIFY_SERVER_CERT_OBSOLETE (1ULL << 30) /* It used to be that if mysql_real_connect() failed, it would delete any options set by the client, unless the CLIENT_REMEMBER_OPTIONS flag was @@ -339,7 +339,6 @@ enum enum_indicator_type CLIENT_MULTI_STATEMENTS | \ CLIENT_MULTI_RESULTS | \ CLIENT_PS_MULTI_RESULTS | \ - CLIENT_SSL_VERIFY_SERVER_CERT | \ CLIENT_REMEMBER_OPTIONS | \ MARIADB_CLIENT_PROGRESS | \ CLIENT_PLUGIN_AUTH | \ @@ -356,9 +355,8 @@ enum enum_indicator_type If any of the optional flags is supported by the build it will be switched on before sending to the client during the connection handshake. */ -#define CLIENT_BASIC_FLAGS (((CLIENT_ALL_FLAGS & ~CLIENT_SSL) \ - & ~CLIENT_COMPRESS) \ - & ~CLIENT_SSL_VERIFY_SERVER_CERT) +#define CLIENT_BASIC_FLAGS ((CLIENT_ALL_FLAGS & ~CLIENT_SSL) \ + & ~CLIENT_COMPRESS) enum mariadb_field_attr_t { diff --git a/include/sql_common.h b/include/sql_common.h index ad5ab7e19af..2a79261c6e8 100644 --- a/include/sql_common.h +++ b/include/sql_common.h @@ -41,6 +41,7 @@ struct st_mysql_options_extention { uint proc_info_length); HASH connection_attributes; size_t connection_attributes_length; + my_bool tls_verify_server_cert; }; typedef struct st_mysql_methods diff --git a/include/ssl_compat.h b/include/ssl_compat.h index 3678e5fa084..3327eee0d8e 100644 --- a/include/ssl_compat.h +++ b/include/ssl_compat.h @@ -24,8 +24,8 @@ #define HAVE_OPENSSL11 1 #define SSL_LIBRARY OpenSSL_version(OPENSSL_VERSION) #define ERR_remove_state(X) ERR_clear_error() -#define EVP_CIPHER_CTX_SIZE 176 -#define EVP_MD_CTX_SIZE 72 +#define EVP_CIPHER_CTX_SIZE 200 +#define EVP_MD_CTX_SIZE 80 #undef EVP_MD_CTX_init #define EVP_MD_CTX_init(X) do { memset((X), 0, EVP_MD_CTX_SIZE); EVP_MD_CTX_reset(X); } while(0) #undef EVP_CIPHER_CTX_init diff --git a/libmariadb b/libmariadb index 5af90f00ffe..c0ddc2c8cff 160000 --- a/libmariadb +++ b/libmariadb @@ -1 +1 @@ -Subproject commit 5af90f00ffeda64795e23753c14d601cce5d02ca +Subproject commit c0ddc2c8cff30aebbedc5ae175e435c2c6fec646 diff --git a/libmysqld/libmysqld.c b/libmysqld/libmysqld.c index 774b687f0e2..14cca6e073f 100644 --- a/libmysqld/libmysqld.c +++ b/libmysqld/libmysqld.c @@ -219,3 +219,7 @@ error: DBUG_RETURN(0); } +char *get_tty_password(const char *opt_message) +{ + return my_get_tty_password(opt_message); +} diff --git a/mysql-test/include/column_compression_rpl.inc b/mysql-test/include/column_compression_rpl.inc index 3abf04a92ed..f9986f69cc7 100644 --- a/mysql-test/include/column_compression_rpl.inc +++ b/mysql-test/include/column_compression_rpl.inc @@ -1,4 +1,6 @@ +--disable_ps2_protocol + --connection slave SET @saved_slave_type_conversions = @@slave_type_conversions; @@ -257,4 +259,4 @@ SET GLOBAL SLAVE_TYPE_CONVERSIONS = @saved_slave_type_conversions; DROP TABLE t1,t2; --sync_slave_with_master - +--enable_ps2_protocol diff --git a/mysql-test/include/commit.inc b/mysql-test/include/commit.inc index a3c64096adf..c696613dab3 100644 --- a/mysql-test/include/commit.inc +++ b/mysql-test/include/commit.inc @@ -6,6 +6,7 @@ ## - $engine_type should be set ## +--disable_ps2_protocol set sql_mode=no_engine_substitution; eval set default_storage_engine = $engine_type; set autocommit=1; @@ -787,3 +788,4 @@ call p_verify_status_increment(2, 0, 2, 0); drop table t1, t2, t3; drop procedure p_verify_status_increment; drop function f1; +--enable_ps2_protocol diff --git a/mysql-test/include/ctype_E05C.inc b/mysql-test/include/ctype_E05C.inc index 71861044664..d157d8a7c88 100644 --- a/mysql-test/include/ctype_E05C.inc +++ b/mysql-test/include/ctype_E05C.inc @@ -76,6 +76,15 @@ INSERT INTO t1 VALUES (_BINARY'\\'' SELECT a, HEX(a) FROM t1; DROP TABLE t1; +# +# test how strings are written into view's frm +# +disable_view_protocol; +create view v1 as select hex('à\'), hex('à\t'); +select * from v1; +drop view v1; +enable_view_protocol; + # Checking that with character_set_client=binary 0x5C in 0xE05C # is treated as escape rather than the second byte of a multi-byte character, # even if character_set_connection is big5/cp932/gbk/sjis. @@ -109,5 +118,5 @@ SELECT HEX(a) FROM t1; DROP TABLE t1; --enable_view_protocol ---echo # Start of ctype_E05C.inc +--echo # End of ctype_E05C.inc diff --git a/mysql-test/include/ctype_numconv.inc b/mysql-test/include/ctype_numconv.inc index 6c7ac3b69fe..a4eaf72c403 100644 --- a/mysql-test/include/ctype_numconv.inc +++ b/mysql-test/include/ctype_numconv.inc @@ -463,6 +463,7 @@ select * from t1; show create table t1; drop table t1; +--disable_ps2_protocol # Ensure that row_count() value is reset after drop table. select 1; select hex(concat(row_count())); @@ -474,6 +475,7 @@ select hex(concat(found_rows())); create table t1 as select concat(found_rows()) as c1; show create table t1; drop table t1; +--enable_ps2_protocol create table t1 as select concat(uuid_short()) as c1; show create table t1; diff --git a/mysql-test/include/ctype_unicode_ws_bmp.inc b/mysql-test/include/ctype_unicode_ws_bmp.inc index 31166b5d31a..dcbd8894aa7 100644 --- a/mysql-test/include/ctype_unicode_ws_bmp.inc +++ b/mysql-test/include/ctype_unicode_ws_bmp.inc @@ -10,6 +10,7 @@ SELECT FROM seq_0_to_65535', @@character_set_connection, @@collation_connection); +--disable_service_connection SELECT COLLATION(c) FROM v_bmp LIMIT 1; SELECT HEX(codepoint) FROM v_bmp WHERE HEX(WEIGHT_STRING(c))='FFFD'; @@ -23,4 +24,6 @@ SELECT codepoint_hex4,HEX(WEIGHT_STRING(c)) FROM v_bmp WHERE codepoint_hex4<>HEX(WEIGHT_STRING(c)); +--enable_service_connection + DROP VIEW v_bmp; diff --git a/mysql-test/include/diff_tables.inc b/mysql-test/include/diff_tables.inc index a29156cfce9..a566a4d79c2 100644 --- a/mysql-test/include/diff_tables.inc +++ b/mysql-test/include/diff_tables.inc @@ -165,9 +165,11 @@ while ($_dt_tables) # Now that we have the comma-separated list of columns, we can write # the table to a file. + --disable_ps2_protocol --let $_dt_outfile= `SELECT @@datadir` --let $_dt_outfile= $_dt_outfile/diff_table-$_dt_connection-$_dt_database-$_dt_table eval SELECT * INTO OUTFILE '$_dt_outfile' FROM $_dt_database.$_dt_table ORDER BY `$_dt_column_list`; + --enable_ps2_protocol # Compare files. if ($_dt_prev_outfile) diff --git a/mysql-test/include/explain_utils.inc b/mysql-test/include/explain_utils.inc index bdea2407739..c85e0d4d288 100644 --- a/mysql-test/include/explain_utils.inc +++ b/mysql-test/include/explain_utils.inc @@ -26,6 +26,7 @@ --echo # query: $query --echo # select: $select --echo # +--disable_ps2_protocol --disable_view_protocol if ($select) { --enable_prepare_warnings @@ -164,3 +165,4 @@ SHOW STATUS WHERE (Variable_name LIKE 'Sort%' OR --echo --enable_view_protocol +--enable_ps2_protocol diff --git a/mysql-test/include/function_defaults.inc b/mysql-test/include/function_defaults.inc index 6e4fa10a65b..e8e1059f4be 100644 --- a/mysql-test/include/function_defaults.inc +++ b/mysql-test/include/function_defaults.inc @@ -824,6 +824,7 @@ eval CREATE TABLE t2 ( i $datetime DEFAULT $current_timestamp ON UPDATE $current_timestamp NOT NULL ); +--disable_ps2_protocol SELECT 1 INTO OUTFILE 't3.dat' FROM dual; SELECT NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL @@ -831,6 +832,7 @@ INTO OUTFILE 't4.dat' FROM dual; SELECT 1, 2 INTO OUTFILE 't5.dat' FROM dual; +--enable_ps2_protocol --echo # Mon Aug 1 15:11:19 2011 UTC SET TIMESTAMP = 1312211479.918273; @@ -929,9 +931,11 @@ remove_file $MYSQLD_DATADIR/test/t5.dat; --echo # Mon Aug 1 15:11:19 2011 UTC SET TIMESTAMP = 1312211479.089786; +--disable_ps2_protocol SELECT 1 INTO OUTFILE "file1.dat" FROM dual; SELECT NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL INTO OUTFILE "file2.dat" FROM dual; +--enable_ps2_protocol --echo # Too short row diff --git a/mysql-test/include/grant_cache.inc b/mysql-test/include/grant_cache.inc index 467c1170563..69c520c3e61 100644 --- a/mysql-test/include/grant_cache.inc +++ b/mysql-test/include/grant_cache.inc @@ -54,6 +54,8 @@ set GLOBAL query_cache_type=ON; set LOCAL query_cache_type=ON; set GLOBAL query_cache_size=1355776; +--disable_ps2_protocol + reset query cache; flush status; connect (root,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK); @@ -171,6 +173,8 @@ show status like "Qcache_queries_in_cache"; show status like "Qcache_hits"; show status like "Qcache_not_cached"; +--enable_ps2_protocol + # Cleanup connection root; diff --git a/mysql-test/include/icp_tests.inc b/mysql-test/include/icp_tests.inc index d78fe0dd209..d4e6362fa71 100644 --- a/mysql-test/include/icp_tests.inc +++ b/mysql-test/include/icp_tests.inc @@ -876,6 +876,7 @@ SET optimizer_switch=@save_optimizer_switch; DROP TABLE t1,t2; +--disable_ps2_protocol --echo # check "Handler_pushed" status varuiables CREATE TABLE t1 ( c1 CHAR(1), @@ -897,6 +898,7 @@ SELECT * FROM t1 WHERE (c2='3' or c2='4') and c2 % 2 = 0 ; show status like "Handler_icp%"; DROP TABLE t1; +--enable_ps2_protocol # # MDEV-308 lp:1008516 - Failing assertion: templ->mysql_col_len == len diff --git a/mysql-test/include/query_cache.inc b/mysql-test/include/query_cache.inc index a1ad20dbd15..0f52b70b7f2 100644 --- a/mysql-test/include/query_cache.inc +++ b/mysql-test/include/query_cache.inc @@ -14,6 +14,7 @@ # old name was innodb_cache.test # main code went into include/query_cache.inc # +--disable_ps2_protocol --disable_view_protocol SET global query_cache_type=ON; SET local query_cache_type=ON; @@ -192,3 +193,4 @@ drop table t2; SET global query_cache_type=default; --enable_view_protocol +--enable_ps2_protocol diff --git a/mysql-test/include/query_cache_partitions.inc b/mysql-test/include/query_cache_partitions.inc index bfbaa87c257..6c51300a5d5 100644 --- a/mysql-test/include/query_cache_partitions.inc +++ b/mysql-test/include/query_cache_partitions.inc @@ -44,13 +44,14 @@ flush status; show status like "Qcache_queries_in_cache"; show status like "Qcache_hits"; - +--disable_ps2_protocol SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; show status like "Qcache_queries_in_cache"; show status like "Qcache_hits"; +--enable_ps2_protocol drop table t1; @@ -79,12 +80,14 @@ flush status; show status like "Qcache_queries_in_cache"; show status like "Qcache_hits"; +--disable_ps2_protocol SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; show status like "Qcache_queries_in_cache"; show status like "Qcache_hits"; +--enable_ps2_protocol drop table t1; @@ -114,6 +117,7 @@ INSERT INTO t1 VALUES (1, now(), 0); show status like "Qcache_queries_in_cache"; show status like "Qcache_hits"; +--disable_ps2_protocol BEGIN; UPDATE `t1` SET `cool` = 1 WHERE `id` = 1; SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; @@ -126,6 +130,7 @@ SELECT cool FROM `t1` WHERE (`t1`.id = 1) LIMIT 1; show status like "Qcache_queries_in_cache"; show status like "Qcache_hits"; +--enable_ps2_protocol drop table t1; diff --git a/mysql-test/include/query_cache_sql_prepare.inc b/mysql-test/include/query_cache_sql_prepare.inc index 1bc7c94a172..978213777a4 100644 --- a/mysql-test/include/query_cache_sql_prepare.inc +++ b/mysql-test/include/query_cache_sql_prepare.inc @@ -23,6 +23,8 @@ set GLOBAL query_cache_type=ON; set LOCAL query_cache_type=ON; +--disable_ps2_protocol + connect (con1,localhost,root,,test,$MASTER_MYPORT,); connection default; @@ -252,6 +254,7 @@ set @a=10; execute stmt1 using @a; show status like 'Qcache_hits'; +--enable_ps2_protocol drop table t1; disconnect con1; diff --git a/mysql-test/include/test_outfile.inc b/mysql-test/include/test_outfile.inc index b67e67a4dd4..e50847b67a3 100644 --- a/mysql-test/include/test_outfile.inc +++ b/mysql-test/include/test_outfile.inc @@ -1 +1,3 @@ +--disable_ps2_protocol eval select "Outfile OK" into outfile "$MYSQLTEST_VARDIR/tmp/outfile.test"; +--enable_ps2_protocol diff --git a/mysql-test/include/type_temporal_zero_default.inc b/mysql-test/include/type_temporal_zero_default.inc index 500d25ea18f..6553bfb6d86 100644 --- a/mysql-test/include/type_temporal_zero_default.inc +++ b/mysql-test/include/type_temporal_zero_default.inc @@ -34,8 +34,10 @@ SET sql_mode=DEFAULT; --eval CREATE TABLE t1 (a $type DEFAULT $defval, b $type DEFAULT $defval) --eval INSERT INTO t1 VALUES (DEFAULT,DEFAULT); --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT a INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/mdev-7824.txt' FROM t1 DELETE FROM t1; +--enable_ps2_protocol SET sql_mode=TRADITIONAL; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --error ER_INVALID_DEFAULT_VALUE_FOR_FIELD diff --git a/mysql-test/include/wait_until_connected_again.inc b/mysql-test/include/wait_until_connected_again.inc index 44b7fdb8e6b..deb6ca13e8b 100644 --- a/mysql-test/include/wait_until_connected_again.inc +++ b/mysql-test/include/wait_until_connected_again.inc @@ -11,7 +11,7 @@ let $counter= 5000; let $mysql_errno= 9999; while ($mysql_errno) { - --error 0,ER_ACCESS_DENIED_ERROR,ER_SERVER_SHUTDOWN,ER_CONNECTION_KILLED,ER_LOCK_WAIT_TIMEOUT,2002,2006,2013 + --error 0,ER_ACCESS_DENIED_ERROR,ER_SERVER_SHUTDOWN,ER_CONNECTION_KILLED,ER_LOCK_WAIT_TIMEOUT,2002,2006,2013,HA_ERR_NO_ENCRYPTION select 1; dec $counter; @@ -33,6 +33,10 @@ while ($mysql_errno) { let $mysql_errno=0; } + if ($mysql_errno == 199) + { + let $mysql_errno=0; + } if ($mysql_errno > 0) { --sleep 0.1 diff --git a/mysql-test/include/write_var_to_file.inc b/mysql-test/include/write_var_to_file.inc index 7982c6fab31..58bdac6f09e 100644 --- a/mysql-test/include/write_var_to_file.inc +++ b/mysql-test/include/write_var_to_file.inc @@ -46,7 +46,9 @@ if (`SELECT LENGTH(@@secure_file_priv) > 0`) --let $_wvtf_suffix= `SELECT UUID()` --let $_wvtf_tmp_file= $MYSQLTEST_VARDIR/_wvtf_$_wvtf_suffix + --disable_ps2_protocol --eval SELECT '$write_var' INTO DUMPFILE '$_wvtf_tmp_file' + --enable_ps2_protocol --copy_file $_wvtf_tmp_file $write_to_file --remove_file $_wvtf_tmp_file } diff --git a/mysql-test/lib/My/Debugger.pm b/mysql-test/lib/My/Debugger.pm index c2062c2eaba..5da58419948 100644 --- a/mysql-test/lib/My/Debugger.pm +++ b/mysql-test/lib/My/Debugger.pm @@ -119,19 +119,19 @@ for my $k (sort keys %debuggers) { my $v = $debuggers{$k}; $v = $debuggers{$k} = $debuggers{$v} if not ref $v; # resolve aliases - sub register_opt($$) { - my ($name, $msg) = @_; - $opts{"$name=s"} = \$opt_vals{$name}; - $help .= wrap(sprintf(" %-23s", $name), ' 'x25, "$msg under $name\n"); + sub register_opt($$$) { + my ($prefix, $name, $msg) = @_; + $opts{"$prefix$name=s"} = \$opt_vals{$prefix.$name}; + $help .= wrap(sprintf(" %-23s", $prefix.$name), ' 'x25, "$msg under $name\n"); } $v->{script} = '' unless $v->{script}; $v->{options} =~ s/(\{exe\}|$)/ {options} $&/ unless $v->{options} =~ /\{options\}/; - register_opt "$k" => "Start mariadbd"; - register_opt "client-$k" => "Start mariadb-test client"; - register_opt "boot-$k" => "Start bootstrap server"; - register_opt "manual-$k" => "Before running test(s) let user manually start mariadbd"; + register_opt "", $k, "Start mysqld"; + register_opt "client-", $k, "Start mysqltest client"; + register_opt "boot-", $k, "Start bootstrap server"; + register_opt "manual-", "$k", "Before running test(s) let user manually start mariadbd"; } sub subst($%) { diff --git a/mysql-test/lib/My/SysInfo.pm b/mysql-test/lib/My/SysInfo.pm index 1e5ac353def..211f72c0561 100644 --- a/mysql-test/lib/My/SysInfo.pm +++ b/mysql-test/lib/My/SysInfo.pm @@ -68,7 +68,7 @@ sub _cpuinfo { } } $F= undef; # Close file - return $self; + return $self->{cpus}; } @@ -95,12 +95,7 @@ sub _kstat { push(@{$self->{cpus}}, $cpuinfo); } - # At least one cpu should have been found - # if this method worked - if ( $self->{cpus} ) { - return $self; - } - return undef; + return $self->{cpus}; } diff --git a/mysql-test/main/analyze_engine_stats.result b/mysql-test/main/analyze_engine_stats.result index f82e1b7f69a..f1dc42558cf 100644 --- a/mysql-test/main/analyze_engine_stats.result +++ b/mysql-test/main/analyze_engine_stats.result @@ -107,3 +107,80 @@ select cast(json_extract(@out,'$[0]') as DOUBLE) > 0 as PAGES_UPDATED_MORE_THAN_ PAGES_UPDATED_MORE_THAN_ZERO 1 drop table t1; +# +# MDEV-31764: ASAN use-after-poison in trace_engine_stats upon ANALYZE FORMAT=JSON +# +ANALYZE FORMAT=JSON SELECT count(*) FROM information_schema.GLOBAL_STATUS; +# Another testcase without I_S: +CREATE TABLE t1 (a INT); +INSERT INTO t1 SELECT seq FROM seq_1_to_100; +CREATE TABLE t2 (s INT); +INSERT INTO t2 SELECT seq FROM seq_1_to_10; +# Must use SJ-Materialization to hit the issue with temp.table: +ANALYZE FORMAT=JSON SELECT * FROM t1 WHERE a IN (SELECT s FROM t2); +ANALYZE +{ + "query_block": { + "select_id": 1, + "r_loops": 1, + "r_total_time_ms": "REPLACED", + "const_condition": "1", + "nested_loop": [ + { + "table": { + "table_name": "t1", + "access_type": "ALL", + "r_loops": 1, + "rows": 100, + "r_rows": 100, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + }, + { + "table": { + "table_name": "", + "access_type": "eq_ref", + "possible_keys": ["distinct_key"], + "key": "distinct_key", + "key_length": "4", + "used_key_parts": ["s"], + "ref": ["func"], + "r_loops": 100, + "rows": 1, + "r_rows": 0.1, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "filtered": 100, + "r_filtered": 100, + "materialized": { + "unique": 1, + "query_block": { + "select_id": 2, + "nested_loop": [ + { + "table": { + "table_name": "t2", + "access_type": "ALL", + "r_loops": 1, + "rows": 10, + "r_rows": 10, + "r_table_time_ms": "REPLACED", + "r_other_time_ms": "REPLACED", + "r_engine_stats": REPLACED, + "filtered": 100, + "r_filtered": 100 + } + } + ] + } + } + } + } + ] + } +} +DROP TABLE t1, t2; diff --git a/mysql-test/main/analyze_engine_stats.test b/mysql-test/main/analyze_engine_stats.test index a26c65a1aa4..019ec39064a 100644 --- a/mysql-test/main/analyze_engine_stats.test +++ b/mysql-test/main/analyze_engine_stats.test @@ -62,3 +62,23 @@ select cast(json_extract(@out,'$[0]') as DOUBLE) > 0 as PAGES_UPDATED_MORE_THAN_ drop table t1; +--echo # +--echo # MDEV-31764: ASAN use-after-poison in trace_engine_stats upon ANALYZE FORMAT=JSON +--echo # + +--disable_result_log +ANALYZE FORMAT=JSON SELECT count(*) FROM information_schema.GLOBAL_STATUS; +--enable_result_log + +--echo # Another testcase without I_S: + +CREATE TABLE t1 (a INT); +INSERT INTO t1 SELECT seq FROM seq_1_to_100; +CREATE TABLE t2 (s INT); +INSERT INTO t2 SELECT seq FROM seq_1_to_10; + +--echo # Must use SJ-Materialization to hit the issue with temp.table: +--source include/analyze-format.inc +ANALYZE FORMAT=JSON SELECT * FROM t1 WHERE a IN (SELECT s FROM t2); + +DROP TABLE t1, t2; diff --git a/mysql-test/main/analyze_stmt_slow_query_log.test b/mysql-test/main/analyze_stmt_slow_query_log.test index 44865b652cb..268203078f8 100644 --- a/mysql-test/main/analyze_stmt_slow_query_log.test +++ b/mysql-test/main/analyze_stmt_slow_query_log.test @@ -19,7 +19,9 @@ SET @@global.slow_query_log = ON; create table t1 (a int); INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); +--disable_ps2_protocol select * from t1 where a<3; +--enable_ps2_protocol drop table t1; let SLOW_LOG_FILE= `select @@slow_query_log_file`; diff --git a/mysql-test/main/auto_increment_ranges_innodb.test b/mysql-test/main/auto_increment_ranges_innodb.test index aaa64e2d6f9..3abd8d4d482 100644 --- a/mysql-test/main/auto_increment_ranges_innodb.test +++ b/mysql-test/main/auto_increment_ranges_innodb.test @@ -11,7 +11,9 @@ set default_storage_engine=innodb; # create table t1 (pk int auto_increment primary key, f varchar(20)); insert t1 (f) values ('a'), ('b'), ('c'), ('d'); +--disable_ps2_protocol select null, f into outfile 'load.data' from t1 limit 1; +--enable_ps2_protocol load data infile 'load.data' into table t1; insert t1 (f) values ('<==='); select * from t1; diff --git a/mysql-test/main/bootstrap.test b/mysql-test/main/bootstrap.test index d7cc8e36d56..76d5ed008a6 100644 --- a/mysql-test/main/bootstrap.test +++ b/mysql-test/main/bootstrap.test @@ -45,7 +45,9 @@ remove_file $MYSQLTEST_VARDIR/tmp/bootstrap_error.sql; --echo # --disable_query_log create table t1 select 2 as a, concat(repeat('MySQL', @@max_allowed_packet/10), ';') as b; +--disable_ps2_protocol eval select * into outfile '$MYSQLTEST_VARDIR/tmp/long_query.sql' from t1; +--enable_ps2_protocol --enable_query_log --source include/kill_mysqld.inc --error 1 diff --git a/mysql-test/main/bug39022.test b/mysql-test/main/bug39022.test index e07d087a320..211a40234b4 100644 --- a/mysql-test/main/bug39022.test +++ b/mysql-test/main/bug39022.test @@ -6,6 +6,7 @@ --echo # Bug #39022: Mysql randomly crashing in lock_sec_rec_cons_read_sees --echo # +--disable_ps2_protocol call mtr.add_suppression("Deadlock found when trying to get lock; try restarting transaction"); CREATE TABLE t1(a TINYINT NOT NULL,b TINYINT,PRIMARY KEY(b)) ENGINE=innodb; @@ -56,3 +57,4 @@ disconnect thread1; connection default; DROP TABLE t1,t2; +--enable_ps2_protocol diff --git a/mysql-test/main/cast.test b/mysql-test/main/cast.test index 025b5fa717d..073b5fe0be5 100644 --- a/mysql-test/main/cast.test +++ b/mysql-test/main/cast.test @@ -402,9 +402,11 @@ SET @@GLOBAL.max_allowed_packet=2048; # reconnect to make the new max packet size take effect --connect (newconn, localhost, root,,) +--disable_ps2_protocol SELECT CONVERT('a', BINARY(2049)); SELECT CONVERT('a', CHAR(2049)); SELECT length(CONVERT(repeat('a',2048), CHAR(2049))); +--enable_ps2_protocol connection default; disconnect newconn; diff --git a/mysql-test/main/check_constraint.test b/mysql-test/main/check_constraint.test index 194fdc04399..cfdddcab3a1 100644 --- a/mysql-test/main/check_constraint.test +++ b/mysql-test/main/check_constraint.test @@ -172,7 +172,10 @@ insert t1 (b) values (1); insert t1 (b) values (10); select * from t1 where a is null; set sql_auto_is_null=1; +#Enable after fix MDEV-31307 +--disable_ps2_protocol select * from t1 where a is null; +--enable_ps2_protocol --error ER_CONSTRAINT_FAILED insert t1 (b) values (1); drop table t1; diff --git a/mysql-test/main/column_compression.inc b/mysql-test/main/column_compression.inc index 89a96ef67ad..13952b739ae 100644 --- a/mysql-test/main/column_compression.inc +++ b/mysql-test/main/column_compression.inc @@ -8,6 +8,8 @@ eval CREATE TABLE t1(a $typec); ALTER TABLE t1 ADD KEY(a(10)); SHOW CREATE TABLE t1; +--disable_ps2_protocol + --echo # Make sure column was actually compressed INSERT INTO t1 VALUES(REPEAT('a', 1000)); SELECT LEFT(a, 10), LENGTH(a) FROM t1; @@ -94,6 +96,8 @@ SELECT * FROM t1 ORDER BY a; SELECT a+1 FROM t1 ORDER BY 1; SELECT * FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME IN('Column_compressions', 'Column_decompressions'); +--enable_ps2_protocol + DROP TABLE t1; --echo # diff --git a/mysql-test/main/count_distinct2.test b/mysql-test/main/count_distinct2.test index 95086ad04aa..f5d16527af3 100644 --- a/mysql-test/main/count_distinct2.test +++ b/mysql-test/main/count_distinct2.test @@ -48,6 +48,7 @@ select count(distinct n1), count(distinct n2) from t1; select count(distinct n2), n1 from t1 group by n1; drop table t1; +--disable_ps2_protocol # test the conversion from tree to MyISAM create table t1 (n int default NULL); let $1=5000; @@ -82,5 +83,6 @@ flush status; select count(distinct s) from t1; show status like 'Created_tmp_disk_tables'; drop table t1; +--enable_ps2_protocol # End of 4.1 tests diff --git a/mysql-test/main/create.result b/mysql-test/main/create.result index 9ab1db89029..c1ef8b527de 100644 --- a/mysql-test/main/create.result +++ b/mysql-test/main/create.result @@ -1221,7 +1221,7 @@ drop table if exists t1,t2,t3; # Fix modified for MariaDB: we support this syntax create table t1 (a int) transactional=0; Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=0' +Warning 1911 Unknown option 'transactional' create table t2 (a int) page_checksum=1; create table t3 (a int) row_format=page; drop table t1,t2,t3; @@ -2019,7 +2019,7 @@ drop table t1; # MDEV-18428 Memory: If transactional=0 is specified in CREATE TABLE, it is not possible to ALTER TABLE # create table t1 (c int(10) unsigned) engine=memory transactional=0; -ERROR HY000: Table storage engine 'MEMORY' does not support the create option 'TRANSACTIONAL=0' +ERROR HY000: Unknown option 'transactional' # # End of 10.2 tests # diff --git a/mysql-test/main/create.test b/mysql-test/main/create.test index 0b9e51e8545..78bf9e35cbb 100644 --- a/mysql-test/main/create.test +++ b/mysql-test/main/create.test @@ -1879,7 +1879,7 @@ drop table t1; --echo # --echo # MDEV-18428 Memory: If transactional=0 is specified in CREATE TABLE, it is not possible to ALTER TABLE --echo # ---error ER_ILLEGAL_HA_CREATE_OPTION +--error ER_UNKNOWN_OPTION create table t1 (c int(10) unsigned) engine=memory transactional=0; --echo # diff --git a/mysql-test/main/cte_recursive.result b/mysql-test/main/cte_recursive.result index 7822fdf1a57..ae1d7d9ca2f 100644 --- a/mysql-test/main/cte_recursive.result +++ b/mysql-test/main/cte_recursive.result @@ -1214,6 +1214,8 @@ generation name 2 Grandma Ann 2 Grandma Sally 2 Grandpa Ben +Warnings: +Warning 1931 Query execution was interrupted. The query exceeded max_recursive_iterations = 1. The query result may be incomplete # query with recursive tables using key access alter table folks add primary key (id); explain @@ -2433,6 +2435,8 @@ DROP TABLE edges; # in a heap table # create table t1 (id int, test_data varchar(36)); +set @save_max_recursive_iterations= @@max_recursive_iterations; +set max_recursive_iterations= 200000; insert into t1(id, test_data) select id, test_data from ( @@ -2444,6 +2448,7 @@ select id + 1, uuid() from data_generator where id < 150000 select * from data_generator ) as a; drop table t1; +set max_recursive_iterations= @save_max_recursive_iterations; # # MDEV-10773: ANALYZE for query with recursive CTE # @@ -2660,6 +2665,8 @@ select * from applied_modules; m m1 m2 +Warnings: +Warning 1931 Query execution was interrupted. The query exceeded max_recursive_iterations = 2. The query result may be incomplete drop table value_nodes, module_nodes, module_arguments, module_results; # # mdev-12519: recursive references in subqueries @@ -5901,4 +5908,52 @@ a a 9 9 10 10 drop table t1; +# +# MDEV-20010 Equal on two RANK window functions create wrong result +# +create table t1 (a int, b int) engine= innodb; +insert into t1 values (4, -2), (3, -1); +SELECT RANK() OVER (ORDER BY D.C) = RANK() OVER (ORDER BY B.a) FROM +(SELECT 5 AS C FROM t1) as D, (SELECT t1.b AS A FROM t1) AS B; +RANK() OVER (ORDER BY D.C) = RANK() OVER (ORDER BY B.a) +1 +1 +0 +0 +select b, rank() over (order by c) , rank() over (order by dt1.b) +from +(select 5 as c from t1) as dt, +(select b from t1) as dt1; +b rank() over (order by c) rank() over (order by dt1.b) +-2 1 1 +-2 1 1 +-1 1 3 +-1 1 3 +select b, rank() over (order by c) , rank() over (order by dt1.b), +rank() over (order by c) = rank() over (order by dt1.b) +from +(select 5 as c from t1) as dt, +(select b from t1) as dt1; +b rank() over (order by c) rank() over (order by dt1.b) rank() over (order by c) = rank() over (order by dt1.b) +-2 1 1 1 +-2 1 1 1 +-1 1 3 0 +-1 1 3 0 +alter table t1 engine=myisam; +select b, rank() over (order by c) , rank() over (order by dt1.b) +from +(select 5 as c from t1) as dt, +(select b from t1) as dt1; +b rank() over (order by c) rank() over (order by dt1.b) +-2 1 1 +-2 1 1 +-1 1 3 +-1 1 3 +create view v1 as select b,5 as c from t1; +select b, rank() over (order by c) from v1 order by b; +b rank() over (order by c) +-2 1 +-1 1 +drop view v1; +drop table t1; # End of 10.4 tests diff --git a/mysql-test/main/cte_recursive.test b/mysql-test/main/cte_recursive.test index ebea3b96754..4ecdaa4f0fa 100644 --- a/mysql-test/main/cte_recursive.test +++ b/mysql-test/main/cte_recursive.test @@ -2,6 +2,7 @@ # This is too slow on MSAN --source include/not_msan.inc --source include/not_valgrind.inc +--source include/have_innodb.inc create table t1 (a int, b varchar(32)); insert into t1 values @@ -1532,6 +1533,9 @@ DROP TABLE edges; create table t1 (id int, test_data varchar(36)); +set @save_max_recursive_iterations= @@max_recursive_iterations; +set max_recursive_iterations= 200000; + insert into t1(id, test_data) select id, test_data from ( @@ -1545,6 +1549,8 @@ select id, test_data drop table t1; +set max_recursive_iterations= @save_max_recursive_iterations; + --echo # --echo # MDEV-10773: ANALYZE for query with recursive CTE --echo # @@ -4016,4 +4022,37 @@ with cte_e as ( drop table t1; +--echo # +--echo # MDEV-20010 Equal on two RANK window functions create wrong result +--echo # + +create table t1 (a int, b int) engine= innodb; +insert into t1 values (4, -2), (3, -1); + +SELECT RANK() OVER (ORDER BY D.C) = RANK() OVER (ORDER BY B.a) FROM +(SELECT 5 AS C FROM t1) as D, (SELECT t1.b AS A FROM t1) AS B; + +select b, rank() over (order by c) , rank() over (order by dt1.b) +from +(select 5 as c from t1) as dt, +(select b from t1) as dt1; + +select b, rank() over (order by c) , rank() over (order by dt1.b), +rank() over (order by c) = rank() over (order by dt1.b) +from +(select 5 as c from t1) as dt, +(select b from t1) as dt1; + +alter table t1 engine=myisam; +select b, rank() over (order by c) , rank() over (order by dt1.b) +from +(select 5 as c from t1) as dt, +(select b from t1) as dt1; + +create view v1 as select b,5 as c from t1; +select b, rank() over (order by c) from v1 order by b; + +drop view v1; +drop table t1; + --echo # End of 10.4 tests diff --git a/mysql-test/main/ctype_big5.result b/mysql-test/main/ctype_big5.result index b2abca5df7a..234897b08fe 100644 --- a/mysql-test/main/ctype_big5.result +++ b/mysql-test/main/ctype_big5.result @@ -725,15 +725,15 @@ create table t1 (a blob); insert into t1 values (0xEE00); select * into outfile 'test/t1.txt' from t1; delete from t1; -select hex(load_file('MYSQLD_DATADIR/test/t1.txt'));; -hex(load_file('MYSQLD_DATADIR/test/t1.txt')) +select hex(load_file('MYSQLD_DATADIR/test/t1.txt')) as lf; +lf 5CEE5C300A load data infile 't1.txt' into table t1; select hex(a) from t1; hex(a) EE00 drop table t1; -End of 5.0 tests +# End of 5.0 tests # # Start of 5.5 tests # @@ -4893,6 +4893,11 @@ a HEX(a) \'à\ 5C27E05C à\'\ E05C275C DROP TABLE t1; +create view v1 as select hex('à\'), hex('à\t'); +select * from v1; +hex('à\') hex('à\t') +E05C E05C74 +drop view v1; SET character_set_client=binary, character_set_results=binary; SELECT @@character_set_client, @@character_set_connection, @@character_set_results; @@character_set_client @@character_set_connection @@character_set_results @@ -4932,7 +4937,7 @@ HEX(a) E05C5B E05B DROP TABLE t1; -# Start of ctype_E05C.inc +# End of ctype_E05C.inc SET NAMES big5; CREATE TABLE t1 (a ENUM('È@') CHARACTER SET big5); SHOW CREATE TABLE t1; diff --git a/mysql-test/main/ctype_big5.test b/mysql-test/main/ctype_big5.test index b7d33c4fcde..8a8b6f8a824 100644 --- a/mysql-test/main/ctype_big5.test +++ b/mysql-test/main/ctype_big5.test @@ -78,20 +78,19 @@ select hex(convert(_big5 0xC84041 using ucs2)); set names big5; create table t1 (a blob); insert into t1 values (0xEE00); +--disable_ps2_protocol select * into outfile 'test/t1.txt' from t1; +--enable_ps2_protocol delete from t1; -#enable after fix MDEV-27871 ---disable_view_protocol let $MYSQLD_DATADIR= `select @@datadir`; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR ---eval select hex(load_file('$MYSQLD_DATADIR/test/t1.txt')); +--eval select hex(load_file('$MYSQLD_DATADIR/test/t1.txt')) as lf load data infile 't1.txt' into table t1; select hex(a) from t1; --remove_file $MYSQLD_DATADIR/test/t1.txt drop table t1; -#enable_view_protocol # ---echo End of 5.0 tests +--echo # End of 5.0 tests --echo # diff --git a/mysql-test/main/ctype_binary.result b/mysql-test/main/ctype_binary.result index 24fc961e17d..ffad035ee13 100644 --- a/mysql-test/main/ctype_binary.result +++ b/mysql-test/main/ctype_binary.result @@ -3351,6 +3351,40 @@ DROP FUNCTION f1; # End of 10.3 tests # # +# Start of 10.4 tests +# +# +# MDEV-28384 UBSAN: null pointer passed as argument 1, which is declared to never be null in my_strnncoll_binary on SELECT ... COUNT or GROUP_CONCAT +# +CREATE TABLE t (c BLOB NOT NULL); +INSERT IGNORE INTO t VALUES (0); +SELECT COUNT(*) FROM t WHERE EXTRACTVALUE(c,'a')='a'; +COUNT(*) +0 +DROP TABLE t; +SET sql_mode=''; +CREATE TABLE t (c TEXT NOT NULL); +INSERT INTO t VALUES(); +Warnings: +Warning 1364 Field 'c' doesn't have a default value +INSERT IGNORE INTO t VALUES (NULL); +Warnings: +Warning 1048 Column 'c' cannot be null +SELECT GROUP_CONCAT(c ORDER BY BINARY c) FROM t GROUP BY c; +GROUP_CONCAT(c ORDER BY BINARY c) +, +DROP TABLE t; +# +# MDEV-30982 UBSAN: runtime error: null pointer passed as argument 2, which is declared to never be null in my_strnncoll_binary on DELETE +# +CREATE TABLE t (c1 SET('1','2','3'),c2 BINARY); +INSERT INTO t VALUES (0,0); +DELETE FROM t WHERE c2= 1; +--enable_ps2_protocol select * from t2; drop table t2; drop function f1; @@ -96,9 +98,12 @@ end| delimiter ;| +#Check after fix MDEV-31281 +--disable_ps2_protocol select f1(10); select f1(sal) from t1; select f1(sal) from t1 where 1=0; +--enable_ps2_protocol drop function f1; delimiter |; diff --git a/mysql-test/main/custom_aggregates_i_s.test b/mysql-test/main/custom_aggregates_i_s.test index c6b195f7974..adcaedc3a68 100644 --- a/mysql-test/main/custom_aggregates_i_s.test +++ b/mysql-test/main/custom_aggregates_i_s.test @@ -3,6 +3,8 @@ --source include/default_optimizer_switch.inc +--disable_ps2_protocol + flush status; show status like "%custom_aggregate%"; create table t2 (sal int(10)); @@ -73,6 +75,8 @@ with agg_sum as ( select * from agg_sum; show status like "%custom_aggregate%"; +--enable_ps2_protocol + drop table t2,t1,t3; drop function f1; drop function f2; diff --git a/mysql-test/main/debug_sync.test b/mysql-test/main/debug_sync.test index 6e75ba9624c..0c5bee3e220 100644 --- a/mysql-test/main/debug_sync.test +++ b/mysql-test/main/debug_sync.test @@ -388,6 +388,7 @@ DROP TABLE IF EXISTS t1; --enable_warnings # # Test. +--disable_ps2_protocol CREATE TABLE t1 (c1 INT) ENGINE=MyISAM; INSERT INTO t1 VALUES (1); SELECT GET_LOCK('mysqltest_lock', 100); @@ -424,6 +425,7 @@ disconnect con1; disconnect con2; connection default; DROP TABLE t1; +--enable_ps2_protocol --echo # --echo # Test NO_CLEAR_EVENT flag. The signal should still be visible after diff --git a/mysql-test/main/delete.test b/mysql-test/main/delete.test index 6d898ec769d..0b0e7ce4019 100644 --- a/mysql-test/main/delete.test +++ b/mysql-test/main/delete.test @@ -451,6 +451,7 @@ DELETE t1 FROM db1.t1, db2.t1; # Test multiple-table cross database deletes +--disable_ps2_protocol DELETE t1 FROM db1.t2 AS t1, db2.t2 AS t2 WHERE t2.a = 1 AND t1.a = t2.a; SELECT ROW_COUNT(); CALL count_rows(); @@ -462,6 +463,7 @@ DROP DATABASE db1; DROP DATABASE db2; DROP PROCEDURE count_rows; DROP TABLE t1, t2; +--enable_ps2_protocol --echo # --echo # Bug#46958: Assertion in Diagnostics_area::set_ok_status, trigger, diff --git a/mysql-test/main/derived.test b/mysql-test/main/derived.test index f78266b95b0..318219a7263 100644 --- a/mysql-test/main/derived.test +++ b/mysql-test/main/derived.test @@ -899,11 +899,14 @@ select distinct t1.id, tt.id, tt.data (select t1.id, 'yes' as data from t1) as tt on t1.id = tt.id; +#Check after fix MDEV-31277 +--disable_ps2_protocol select distinct t1.id, tt.id, tt.data from t1 left join (select t1.id, 'yes' as data from t1 where id > 1) as tt on t1.id = tt.id; +--enable_ps2_protocol drop table t1; diff --git a/mysql-test/main/derived_cond_pushdown.result b/mysql-test/main/derived_cond_pushdown.result index 9b533a0ee92..9372066afbe 100644 --- a/mysql-test/main/derived_cond_pushdown.result +++ b/mysql-test/main/derived_cond_pushdown.result @@ -20814,7 +20814,7 @@ from (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 -) +) as SUBQ from t1 limit 5; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 1000 @@ -20828,14 +20828,9 @@ from (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 -) +) as SUBQ from t1 limit 5; -a ( select concat(t3.a,'=',dt.s) -from -(select a, sum(b) as s from t2 group by a) as dt, -t3 -where dt.a=t1.a and t3.a < 3 -) +a SUBQ 1 1=804 2 1=1056 3 1=846 @@ -20854,7 +20849,7 @@ from (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 -) +) as SUBQ from t1 limit 5; id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY t1 ALL NULL NULL NULL NULL 1000 @@ -20868,14 +20863,9 @@ from (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 -) +) as SUBQ from t1 limit 5; -a ( select concat(t3.a,'=',dt.s) -from -(select a, sum(b) as s from t2 group by a) as dt, -t3 -where dt.a=t1.a and t3.a < 3 -) +a SUBQ 1 1=11858 2 1=11380 3 1=11588 diff --git a/mysql-test/main/derived_cond_pushdown.test b/mysql-test/main/derived_cond_pushdown.test index 7c87785ccc1..22060799f2d 100644 --- a/mysql-test/main/derived_cond_pushdown.test +++ b/mysql-test/main/derived_cond_pushdown.test @@ -1896,9 +1896,9 @@ DELIMITER ;$$ CALL p1('a'); DROP PROCEDURE p1; - +--disable_ps2_protocol SELECT a FROM (SELECT "aa" a) t WHERE REGEXP_INSTR(t.a, (SELECT MAX('aa') FROM DUAL LIMIT 1)); - +--enable_ps2_protocol DELIMITER $$; CREATE OR REPLACE FUNCTION f1(a VARCHAR(10), b VARCHAR(10)) RETURNS INT @@ -3998,7 +3998,7 @@ select (select a, sum(b) as s from t2 group by a) as dt, t3 where dt.a=t1.a and t3.a < 3 - ) + ) as SUBQ from t1 limit 5; eval explain $q; diff --git a/mysql-test/main/derived_view.test b/mysql-test/main/derived_view.test index 777389a9844..03565ae02f3 100644 --- a/mysql-test/main/derived_view.test +++ b/mysql-test/main/derived_view.test @@ -42,6 +42,7 @@ explain extended select * from (select * from t1 where f1 in (2,3)) tt join (select * from t1 where f1 in (1,2)) aa on tt.f1=aa.f1; +--disable_ps2_protocol flush status; explain extended select * from (select * from t1 where f1 in (2,3)) tt where f11=2; @@ -49,6 +50,7 @@ show status like 'Handler_read%'; flush status; select * from (select * from t1 where f1 in (2,3)) tt where f11=2; show status like 'Handler_read%'; +--enable_ps2_protocol --echo for merged views create view v1 as select * from t1; @@ -69,6 +71,7 @@ explain extended select * from v3 join v4 on f1=f2; select * from v3 join v4 on f1=f2; +--disable_ps2_protocol flush status; explain extended select * from v4 where f2 in (1,3); show status like 'Handler_read%'; @@ -91,6 +94,7 @@ show status like 'Handler_read%'; flush status; select * from t1 join (select * from t2 group by f2) tt on f1=f2; show status like 'Handler_read%'; +--enable_ps2_protocol --echo for materialized views drop view v1,v2,v3; @@ -106,6 +110,7 @@ explain extended select * from t1 join v2 on f1=f2; select * from t1 join v2 on f1=f2; explain extended select * from t1,v3 as v31,v3 where t1.f1=v31.f1 and t1.f1=v3.f1; +--disable_ps2_protocol flush status; select * from t1,v3 as v31,v3 where t1.f1=v31.f1 and t1.f1=v3.f1; show status like 'Handler_read%'; @@ -116,6 +121,7 @@ show status like 'Handler_read%'; flush status; select * from t1 join v2 on f1=f2; show status like 'Handler_read%'; +--enable_ps2_protocol explain extended select * from v1 join v4 on f1=f2; explain format=json select * from v1 join v4 on f1=f2; @@ -159,6 +165,7 @@ join (select * from (select * from t1 where f1 < 7 group by f1) tt where f1 > 2) z on x.f1 = z.f1; +--disable_ps2_protocol flush status; select * from (select * from (select * from t1 where f1 < 7 group by f1) tt where f1 > 2) x @@ -167,6 +174,7 @@ join on x.f1 = z.f1; show status like 'Handler_read%'; flush status; +--enable_ps2_protocol --echo merged in merged derived join merged in merged derived explain extended select * from diff --git a/mysql-test/main/distinct.test b/mysql-test/main/distinct.test index 9aa3b2921aa..6737600ea84 100644 --- a/mysql-test/main/distinct.test +++ b/mysql-test/main/distinct.test @@ -494,14 +494,18 @@ DROP TABLE IF EXISTS t2; CREATE TABLE t2 (fruit_id INT NOT NULL, fruit_name varchar(20) default NULL); +--disable_ps2_protocol SELECT DISTINCT fruit_id, fruit_name INTO OUTFILE '../../tmp/data1.tmp' FROM t1 WHERE fruit_name = 'APPLE'; +--enable_ps2_protocol LOAD DATA INFILE '../../tmp/data1.tmp' INTO TABLE t2; --error 0,1 --remove_file $MYSQLTEST_VARDIR/tmp/data1.tmp +--disable_ps2_protocol SELECT DISTINCT @v19:= fruit_id, @v20:= fruit_name INTO OUTFILE '../../tmp/data2.tmp' FROM t1 WHERE fruit_name = 'APPLE'; +--enable_ps2_protocol LOAD DATA INFILE '../../tmp/data2.tmp' INTO TABLE t2; --remove_file $MYSQLTEST_VARDIR/tmp/data2.tmp diff --git a/mysql-test/main/empty_table.test b/mysql-test/main/empty_table.test index a17b0c897d5..85638bc290b 100644 --- a/mysql-test/main/empty_table.test +++ b/mysql-test/main/empty_table.test @@ -7,9 +7,11 @@ drop table if exists t1; --enable_warnings create table t1 (nr int(5) not null auto_increment,b blob,str char(10), primary key (nr)); +--disable_ps2_protocol select count(*) from t1; select * from t1; select * from t1 limit 0; +--enable_ps2_protocol show status like "Empty_queries"; drop table t1; @@ -17,8 +19,10 @@ drop table t1; # Accessing a non existing table should not increase Empty_queries # +--disable_ps2_protocol --error 1146 select * from t2; +--enable_ps2_protocol show status like "Empty_queries"; --echo # End of 4.1 tests diff --git a/mysql-test/main/error_simulation.test b/mysql-test/main/error_simulation.test index 2c155bc9a22..c4e2d442727 100644 --- a/mysql-test/main/error_simulation.test +++ b/mysql-test/main/error_simulation.test @@ -80,10 +80,12 @@ SET optimizer_switch='outer_join_with_cache=off'; SET SESSION debug_dbug= '+d,only_one_Unique_may_be_created'; +--disable_ps2_protocol --replace_column 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x EXPLAIN SELECT * FROM t1 LEFT JOIN t2 ON ( t2.a < 10 OR t2.b < 10 ); SELECT * FROM t1 LEFT JOIN t2 ON ( t2.a < 10 OR t2.b < 10 ); +--enable_ps2_protocol SET debug_dbug= @saved_dbug; diff --git a/mysql-test/main/errors.test b/mysql-test/main/errors.test index 1948eebfcb3..cc5cad2a68e 100644 --- a/mysql-test/main/errors.test +++ b/mysql-test/main/errors.test @@ -94,8 +94,10 @@ end| delimiter ;| flush status; +--disable_ps2_protocol --error 1062 select f1(), f2(); +--enable_ps2_protocol show status like 'Com_insert'; select * from t1; select * from t2; diff --git a/mysql-test/main/explain_innodb.result b/mysql-test/main/explain_innodb.result index c44d7baadea..ffd62c6611c 100644 --- a/mysql-test/main/explain_innodb.result +++ b/mysql-test/main/explain_innodb.result @@ -19,20 +19,5 @@ id select_type table type possible_keys key key_len ref rows Extra SET GLOBAL slow_query_log = @sql_tmp; drop table t1; # -# MDEV-31181: Server crash in subselect_uniquesubquery_engine::print -# upon EXPLAIN EXTENDED DELETE -# -CREATE TABLE t1 (a INT); -INSERT INTO t1 VALUES (1),(2); -CREATE TABLE t2 (pk INT PRIMARY KEY); -INSERT INTO t2 VALUES (1),(2); -EXPLAIN EXTENDED DELETE FROM t1 WHERE a IN (SELECT pk FROM t2); -id select_type table type possible_keys key key_len ref rows filtered Extra -1 PRIMARY t1 ALL NULL NULL NULL NULL 2 100.00 Using where -2 DEPENDENT SUBQUERY t2 unique_subquery PRIMARY PRIMARY 4 func 1 100.00 Using index -Warnings: -Note 1003 /* select#1 */ delete from `test`.`t1` where (`test`.`t1`.`a`,(((`test`.`t1`.`a`)))) -drop table t1, t2; -# # End of 10.4 tests # diff --git a/mysql-test/main/explain_innodb.test b/mysql-test/main/explain_innodb.test index 3dcad4c2d49..e72cae2cf23 100644 --- a/mysql-test/main/explain_innodb.test +++ b/mysql-test/main/explain_innodb.test @@ -19,21 +19,6 @@ SELECT * FROM (SELECT id FROM t1 GROUP BY id) dt WHERE 1=0; SET GLOBAL slow_query_log = @sql_tmp; drop table t1; - ---echo # ---echo # MDEV-31181: Server crash in subselect_uniquesubquery_engine::print ---echo # upon EXPLAIN EXTENDED DELETE ---echo # - -CREATE TABLE t1 (a INT); -INSERT INTO t1 VALUES (1),(2); -CREATE TABLE t2 (pk INT PRIMARY KEY); -INSERT INTO t2 VALUES (1),(2); - -EXPLAIN EXTENDED DELETE FROM t1 WHERE a IN (SELECT pk FROM t2); - -drop table t1, t2; - --echo # --echo # End of 10.4 tests --echo # diff --git a/mysql-test/main/explain_non_select.result b/mysql-test/main/explain_non_select.result index 74d8103f130..3101887ad01 100644 --- a/mysql-test/main/explain_non_select.result +++ b/mysql-test/main/explain_non_select.result @@ -278,6 +278,37 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t2 ALL NULL NULL NULL NULL 2 drop table t1,t2; # +# MDEV-31181: EXPLAIN EXTENDED for single-table DELETE with IN predicand +# +create table t1 (a int); +insert into t1 values (3), (7), (1), (3), (4); +create table t2 (pk int primary key); +insert into t2 values (3), (5), (1); +create table t3 (a int, key(a)); +insert into t3 values (7), (5), (7), (3); +explain extended delete from t1 where a in (select pk from t2); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 5 100.00 Using where +2 DEPENDENT SUBQUERY t2 unique_subquery PRIMARY PRIMARY 4 func 1 100.00 Using index +Warnings: +Note 1003 /* select#1 */ delete from `test`.`t1` where (`test`.`t1`.`a`,(((`test`.`t1`.`a`) in t2 on PRIMARY))) +delete from t1 where a in (select pk from t2); +select * from t1; +a +7 +4 +explain extended delete from t1 where a in (select a from t3); +id select_type table type possible_keys key key_len ref rows filtered Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 2 100.00 Using where +2 DEPENDENT SUBQUERY t3 index_subquery a a 5 func 2 100.00 Using index +Warnings: +Note 1003 /* select#1 */ delete from `test`.`t1` where (`test`.`t1`.`a`,(((`test`.`t1`.`a`) in t3 on a))) +delete from t1 where a in (select a from t3); +select * from t1; +a +4 +drop table t1,t2,t3; +# # MDEV-31224: EXPLAIN EXTENDED for multi-table update of system table # CREATE TABLE t1 (a INT); diff --git a/mysql-test/main/explain_non_select.test b/mysql-test/main/explain_non_select.test index f87a5d9ec8d..e861955b3f1 100644 --- a/mysql-test/main/explain_non_select.test +++ b/mysql-test/main/explain_non_select.test @@ -250,6 +250,33 @@ PREPARE stmt FROM 'EXPLAIN INSERT INTO t1 SELECT * FROM t2'; EXECUTE stmt; drop table t1,t2; +--echo # +--echo # MDEV-31181: EXPLAIN EXTENDED for single-table DELETE with IN predicand +--echo # + +create table t1 (a int); +insert into t1 values (3), (7), (1), (3), (4); +create table t2 (pk int primary key); +insert into t2 values (3), (5), (1); +create table t3 (a int, key(a)); +insert into t3 values (7), (5), (7), (3); + +let $q1= +delete from t1 where a in (select pk from t2); + +eval explain extended $q1; +eval $q1; +select * from t1; + +let $q2= +delete from t1 where a in (select a from t3); + +eval explain extended $q2; +eval $q2; +select * from t1; + +drop table t1,t2,t3; + --echo # --echo # MDEV-31224: EXPLAIN EXTENDED for multi-table update of system table --echo # diff --git a/mysql-test/main/fast_prefix_index_fetch_innodb.test b/mysql-test/main/fast_prefix_index_fetch_innodb.test index 52066e96117..492d43fa06f 100644 --- a/mysql-test/main/fast_prefix_index_fetch_innodb.test +++ b/mysql-test/main/fast_prefix_index_fetch_innodb.test @@ -41,6 +41,7 @@ select "no-op query"; let $count = query_get_value($show_count_statement, Value, 1); let $opt = query_get_value($show_opt_statement, Value, 1); +--disable_ps2_protocol --disable_query_log eval select $count - $base_count into @cluster_lookups; eval select $opt - $base_opt into @cluster_lookups_avoided; @@ -665,6 +666,8 @@ eval set @cluster_lookups_avoided = $opt - $base_opt; select @cluster_lookups; select @cluster_lookups_avoided; +--enable_ps2_protocol + DROP TABLE t1; --echo # diff --git a/mysql-test/main/features.test b/mysql-test/main/features.test index 14c86255c37..054d8f323f0 100644 --- a/mysql-test/main/features.test +++ b/mysql-test/main/features.test @@ -9,6 +9,8 @@ drop table if exists t1; set sql_mode=""; +--disable_ps2_protocol + flush status; show status like "feature%"; @@ -115,7 +117,7 @@ select updatexml('
12
', '/','12') as upd1; --replace_result 4 2 show status like "feature_xml"; - +--enable_ps2_protocol --echo # --echo # Feature delayed_keys diff --git a/mysql-test/main/fetch_first.test b/mysql-test/main/fetch_first.test index 98bbf1ca06b..242807f4243 100644 --- a/mysql-test/main/fetch_first.test +++ b/mysql-test/main/fetch_first.test @@ -822,14 +822,18 @@ from t1 group by a, b order by a fetch first 1 rows with ties; +--disable_ps2_protocol SELECT FOUND_ROWS(); +--enable_ps2_protocol --sorted_result select SQL_CALC_FOUND_ROWS a, b from t1 order by a fetch first 1 rows with ties; +--disable_ps2_protocol SELECT FOUND_ROWS(); +--enable_ps2_protocol --enable_view_protocol --echo # diff --git a/mysql-test/main/func_gconcat.test b/mysql-test/main/func_gconcat.test index e24dba5d04f..cc5236a18be 100644 --- a/mysql-test/main/func_gconcat.test +++ b/mysql-test/main/func_gconcat.test @@ -61,6 +61,7 @@ select grp,group_concat(c order by c) from t1 group by grp; # Test warnings +--disable_ps2_protocol set group_concat_max_len = 4; select grp,group_concat(c) from t1 group by grp; show warnings; @@ -72,6 +73,7 @@ set group_concat_max_len = 1024; select group_concat(sum(c)) from t1 group by grp; --error 1054 select grp,group_concat(c order by 2) from t1 group by grp; +--enable_ps2_protocol drop table t1; @@ -237,10 +239,12 @@ select group_concat(distinct b) from t1 group by a; select group_concat(b order by b) from t1 group by a; select group_concat(distinct b order by b) from t1 group by a; set local group_concat_max_len=4; +--disable_ps2_protocol select group_concat(b) from t1 group by a; select group_concat(distinct b) from t1 group by a; select group_concat(b order by b) from t1 group by a; select group_concat(distinct b order by b) from t1 group by a; +--enable_ps2_protocol # # long blobs @@ -256,10 +260,12 @@ select group_concat(distinct b) from t1 group by a; select group_concat(b order by b) from t1 group by a; select group_concat(distinct b order by b) from t1 group by a; set local group_concat_max_len=400; +--disable_ps2_protocol select group_concat(b) from t1 group by a; select group_concat(distinct b) from t1 group by a; select group_concat(b order by b) from t1 group by a; select group_concat(distinct b order by b) from t1 group by a; +--enable_ps2_protocol drop table t1; @@ -517,10 +523,12 @@ CREATE TABLE t1( a VARCHAR( 10 ), b INT ); INSERT INTO t1 VALUES ( repeat( 'a', 10 ), 1), ( repeat( 'b', 10 ), 2); SET group_concat_max_len = 20; +--disable_ps2_protocol SELECT GROUP_CONCAT( a ) FROM t1; SELECT GROUP_CONCAT( DISTINCT a ) FROM t1; SELECT GROUP_CONCAT( a ORDER BY b ) FROM t1; -SELECT GROUP_CONCAT( DISTINCT a ORDER BY b ) FROM t1; +SELECT GROUP_CONCAT( DISTINCT a ORDER BY b ) FROM t1; +--enable_ps2_protocol SET group_concat_max_len = DEFAULT; DROP TABLE t1; # Bug #23856:GROUP_CONCAT and ORDER BY: junk from previous rows for query on I_S @@ -787,7 +795,9 @@ INSERT INTO t1 VALUES ('555555', 5); SET group_concat_max_len = 5; SET @old_sql_mode = @@sql_mode, @@sql_mode = 'traditional'; +--disable_ps2_protocol SELECT GROUP_CONCAT(a), b FROM t1 GROUP BY b LIMIT 3; +--enable_ps2_protocol --error ER_CUT_VALUE_GROUP_CONCAT INSERT INTO t2 SELECT GROUP_CONCAT(a), b FROM t1 GROUP BY b; UPDATE t1 SET a = '11111' WHERE b = 1; @@ -864,6 +874,7 @@ CREATE TABLE t2 SELECT GROUP_CONCAT(UPPER(f1) ORDER BY f2) FROM t1; SHOW CREATE TABLE t2; DROP TABLE t2; +--disable_ps2_protocol SET group_concat_max_len= 1024; SELECT LENGTH(GROUP_CONCAT(f1 ORDER BY f2)) FROM t1; @@ -873,6 +884,7 @@ SELECT LENGTH(GROUP_CONCAT(f1 ORDER BY f2)) FROM t1 GROUP BY f2; INSERT INTO t1 VALUES (REPEAT('a', 499999), 3), (REPEAT('b', 500000), 4); SELECT LENGTH(GROUP_CONCAT(f1 ORDER BY f2)) FROM t1 GROUP BY f2; +--enable_ps2_protocol DROP TABLE t1; SET group_concat_max_len= DEFAULT; @@ -882,8 +894,10 @@ SET group_concat_max_len= DEFAULT; # set session group_concat_max_len=1024; set max_session_mem_used=16*1024*1024; # 8M..32M +--disable_ps2_protocol SELECT GROUP_CONCAT(concat(seq/1.1), concat(seq/1.1), concat(seq/1.1), concat(seq/1.1), concat(seq/1.1), concat(seq/1.1), concat(seq/1.1), concat(seq/1.1) ORDER BY 2,1,3,4,6,5,8,7) AS c FROM seq_1_to_200000; +--enable_ps2_protocol set max_session_mem_used=default; set session group_concat_max_len=default; diff --git a/mysql-test/main/func_json.result b/mysql-test/main/func_json.result index 5af8e658d34..e482acada77 100644 --- a/mysql-test/main/func_json.result +++ b/mysql-test/main/func_json.result @@ -1043,9 +1043,6 @@ SELECT JSON_EXTRACT('{"a":null, "b":10, "c":"null"}', '$.a'); JSON_EXTRACT('{"a":null, "b":10, "c":"null"}', '$.a') null # -# End of 10.3 tests -# -# # Start of 10.4 tests # # @@ -1455,6 +1452,13 @@ SELECT JSON_LENGTH('{"a":"b"}','$','$', 'foo'); ERROR 42000: Incorrect parameter count in the call to native function 'json_length' SELECT JSON_LENGTH(); ERROR 42000: Incorrect parameter count in the call to native function 'JSON_LENGTH' +# MDEV-23187: Assorted assertion failures in json_find_path with certain collations +SET @old_collation_connection= @@COLLATION_CONNECTION; +SET COLLATION_CONNECTION= ucs2_unicode_ci; +SELECT JSON_VALUE('["foo"]', '$**[0]') AS f; +f +foo +SET @@COLLATION_CONNECTION= @old_collation_connection; # # End of 10.4 tests # diff --git a/mysql-test/main/func_json.test b/mysql-test/main/func_json.test index 23a703ca716..d940bec74d9 100644 --- a/mysql-test/main/func_json.test +++ b/mysql-test/main/func_json.test @@ -665,11 +665,6 @@ SELECT 1 + JSON_VALUE('{"nulltest": null}', '$.nulltest'); SELECT NULL; SELECT JSON_EXTRACT('{"a":null, "b":10, "c":"null"}', '$.a'); - ---echo # ---echo # End of 10.3 tests ---echo # - --echo # --echo # Start of 10.4 tests --echo # @@ -926,6 +921,16 @@ SELECT JSON_LENGTH('{"a":"b"}','$','$', 'foo'); --error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT SELECT JSON_LENGTH(); +--echo # MDEV-23187: Assorted assertion failures in json_find_path with certain collations + + +SET @old_collation_connection= @@COLLATION_CONNECTION; + +SET COLLATION_CONNECTION= ucs2_unicode_ci; +SELECT JSON_VALUE('["foo"]', '$**[0]') AS f; + +SET @@COLLATION_CONNECTION= @old_collation_connection; + --echo # --echo # End of 10.4 tests --echo # @@ -1012,8 +1017,11 @@ DROP TABLE t1; set group_concat_max_len=64; create table t1 (a varchar(254)); insert into t1 values (concat('x64-', repeat('a', 60))); -insert into t1 values (concat('x64-', repeat('b', 60))); insert into t1 values (concat('x64-', repeat('c', 60))); -select json_arrayagg(a) from t1; +insert into t1 values (concat('x64-', repeat('b', 60))); +insert into t1 values (concat('x64-', repeat('c', 60))); +--disable_ps2_protocol +select json_arrayagg(a) from t1; +--enable_ps2_protocol drop table t1; SET group_concat_max_len= default; diff --git a/mysql-test/main/func_like.test b/mysql-test/main/func_like.test index 7339743afe4..751e9c19e40 100644 --- a/mysql-test/main/func_like.test +++ b/mysql-test/main/func_like.test @@ -223,12 +223,15 @@ drop table t1; # # Item_func_like::fix_fields, ESCAPE, const_item() # +#Enable after fix MDEV-31282 +--disable_ps2_protocol create table t1(f1 int); insert into t1 values(1); --error ER_WRONG_ARGUMENTS update (select 1 like 2 escape (1 in (select 1 from t1))) x, t1 as d set d.f1 = 1; select * from (select 1 like 2 escape (1 in (select 1 from t1))) x; drop table t1; +--enable_ps2_protocol # # Item_func_like::walk diff --git a/mysql-test/main/func_math.result b/mysql-test/main/func_math.result index 746dd9169ca..9543a9db5bd 100644 --- a/mysql-test/main/func_math.result +++ b/mysql-test/main/func_math.result @@ -972,7 +972,8 @@ SELECT 9223372036854775808 DIV 1; SELECT 9223372036854775808 DIV -1; ERROR 22003: BIGINT UNSIGNED value is out of range in '9223372036854775808 DIV -1' SELECT -9223372036854775808 DIV 1; -ERROR 22003: BIGINT value is out of range in '-9223372036854775808 DIV 1' +-9223372036854775808 DIV 1 +-9223372036854775808 SELECT -9223372036854775808 DIV -1; ERROR 22003: BIGINT value is out of range in '-9223372036854775808 DIV -1' SELECT 9223372036854775808 MOD 1; @@ -3640,6 +3641,32 @@ t2 CREATE TABLE `t2` ( ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1,t2; # +# MDEV-30932 UBSAN: negation of -X cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in Item_func_mul::int_op and Item_func_round::int_op +# +SELECT (1 DIV(-1/POW(807,14))*1); +ERROR 22003: BIGINT value is out of range in '1 DIV (-1 / pow(807,14))' +DO((-9223372036854775808)*(1)); +SELECT (-9223372036854775808)*(1); +(-9223372036854775808)*(1) +-9223372036854775808 +SELECT (GET_FORMAT(TIME,'JIS'))DIV(POW(-40,65)DIV(1)*2); +ERROR 22003: BIGINT value is out of range in 'pow(-40,65) DIV 1' +SELECT -9223372036854775808 MOD 9223372036854775810; +-9223372036854775808 MOD 9223372036854775810 +-9223372036854775808 +CREATE TABLE t1 (c INT); +INSERT INTO t1 VALUES(TRUNCATE(0,-1.e+30)); +DROP TABLE t1; +SELECT TRUNCATE(0, -9223372036854775808); +TRUNCATE(0, -9223372036854775808) +0 +SELECT GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))) AS col1; +col1 +NULL +SELECT (GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))/ROUND(-1)))DIV(-1-LOG2(1))-(-1*POWER(-1,0)) AS col1; +col1 +NULL +# # End of 10.4 tests # # diff --git a/mysql-test/main/func_math.test b/mysql-test/main/func_math.test index 02c5b872ea5..2e62d0b0b9d 100644 --- a/mysql-test/main/func_math.test +++ b/mysql-test/main/func_math.test @@ -31,7 +31,9 @@ explain extended select log10(100),log10(18),log10(-4),log10(0),log10(NULL); select pow(10,log10(10)),power(2,4); explain extended select pow(10,log10(10)),power(2,4); set @@rand_seed1=10000000,@@rand_seed2=1000000; +--disable_ps2_protocol select rand(999999),rand(); +--enable_ps2_protocol explain extended select rand(999999),rand(); select pi(),format(sin(pi()/2),6),format(cos(pi()/2),6),format(abs(tan(pi())),6),format(cot(1),6),format(asin(1),6),format(acos(0),6),format(atan(1),6); explain extended select pi(),format(sin(pi()/2),6),format(cos(pi()/2),6),format(abs(tan(pi())),6),format(cot(1),6),format(asin(1),6),format(acos(0),6),format(atan(1),6); @@ -710,7 +712,6 @@ DROP TABLE t1; SELECT 9223372036854775808 DIV 1; --error ER_DATA_OUT_OF_RANGE SELECT 9223372036854775808 DIV -1; ---error ER_DATA_OUT_OF_RANGE SELECT -9223372036854775808 DIV 1; --error ER_DATA_OUT_OF_RANGE SELECT -9223372036854775808 DIV -1; @@ -1918,6 +1919,32 @@ SELECT * FROM t2; SHOW CREATE TABLE t2; DROP TABLE t1,t2; +--echo # +--echo # MDEV-30932 UBSAN: negation of -X cannot be represented in type 'long long int'; cast to an unsigned type to negate this value to itself in Item_func_mul::int_op and Item_func_round::int_op +--echo # + +--error ER_DATA_OUT_OF_RANGE +SELECT (1 DIV(-1/POW(807,14))*1); + +DO((-9223372036854775808)*(1)); + +SELECT (-9223372036854775808)*(1); + +--error ER_DATA_OUT_OF_RANGE +SELECT (GET_FORMAT(TIME,'JIS'))DIV(POW(-40,65)DIV(1)*2); + +SELECT -9223372036854775808 MOD 9223372036854775810; + +CREATE TABLE t1 (c INT); +INSERT INTO t1 VALUES(TRUNCATE(0,-1.e+30)); +DROP TABLE t1; +SELECT TRUNCATE(0, -9223372036854775808); + +--disable_warnings +SELECT GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))) AS col1; +SELECT (GET_FORMAT(TIME,'JIS') DIV ATAN (TRUNCATE (0,'2000000000000000' DIV SIN(1500)*NOW(5))/ROUND(-1)))DIV(-1-LOG2(1))-(-1*POWER(-1,0)) AS col1; +--enable_warnings + --echo # --echo # End of 10.4 tests --echo # diff --git a/mysql-test/main/func_misc.test b/mysql-test/main/func_misc.test index 6a199a45b27..f508eda2009 100644 --- a/mysql-test/main/func_misc.test +++ b/mysql-test/main/func_misc.test @@ -59,6 +59,7 @@ drop table t1; # Bug#16501: IS_USED_LOCK does not appear to work # +--disable_ps2_protocol CREATE TABLE t1 (conn CHAR(7), connection_id INT); INSERT INTO t1 VALUES ('default', CONNECTION_ID()); @@ -90,6 +91,7 @@ disconnect con1; connection default; DROP TABLE t1; +--enable_ps2_protocol # # Bug #21531: EXPORT_SET() doesn't accept args with coercible character sets @@ -154,15 +156,19 @@ select avg(a) from table_26093; select benchmark(100, (select avg(a) from table_26093)); set @invoked := 0; +--disable_ps2_protocol select benchmark(100, (select avg(func_26093_a(a)) from table_26093)); +--enable_ps2_protocol # Returns only 10, since intermediate results are cached. select @invoked; set @invoked := 0; +--disable_ps2_protocol #enable after fix MDEV-27871 --disable_view_protocol select benchmark(100, (select avg(func_26093_b(a, rand())) from table_26093)); --enable_view_protocol +--enable_ps2_protocol # Returns 1000, due to rand() preventing caching. select @invoked; @@ -637,6 +643,7 @@ DROP TABLE t1; --echo # GET_LOCK, RELEASE_LOCK, IS_USED_LOCK functions test --echo # +--disable_ps2_protocol --disable_service_connection --echo # IS_USED_LOCK, IS_FREE_LOCK: the lock is not acquired @@ -800,6 +807,7 @@ select is_free_lock(repeat('a', 193)); select release_lock(repeat('a', 193)); --enable_service_connection +--enable_ps2_protocol --echo --echo # -- @@ -1230,8 +1238,10 @@ DROP TABLE t1; --echo # MDEV-20517 Assertion `!is_expensive()' failed in Item::value_depends_on_sql_mode_const_item --echo # +--disable_ps2_protocol SELECT ( 1 LIKE GET_LOCK( 'foo', 0 ) ) - 2; SELECT RELEASE_LOCK('foo'); +--enable_ps2_protocol --echo # --echo # End of 10.2 tests @@ -1306,6 +1316,7 @@ DROP TABLE t1; --echo # MDEV-10569 Add RELEASE_ALL_LOCKS SQL-function --echo # --disable_view_protocol +--disable_ps2_protocol --echo # Test function without any locks SELECT RELEASE_ALL_LOCKS(); @@ -1360,4 +1371,5 @@ SELECT RELEASE_ALL_LOCKS(); SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA FROM information_schema.metadata_lock_info WHERE thread_id>0 ORDER BY TABLE_SCHEMA; +--enable_ps2_protocol --enable_view_protocol diff --git a/mysql-test/main/func_rollback.test b/mysql-test/main/func_rollback.test index e8af4ef2eff..0650ae09292 100644 --- a/mysql-test/main/func_rollback.test +++ b/mysql-test/main/func_rollback.test @@ -90,12 +90,16 @@ delimiter ;// --echo --echo # One f1_simple_insert execution per row, no NOT NULL violation +--disable_ps2_protocol SELECT f1_simple_insert(1); +--enable_ps2_protocol SELECT * FROM t1_not_null ORDER BY f1,f2; ROLLBACK; SELECT * FROM t1_not_null; # +--disable_ps2_protocol SELECT f1_simple_insert(1) FROM t1_select; +--enable_ps2_protocol SELECT * FROM t1_not_null ORDER BY f1,f2; ROLLBACK; SELECT * FROM t1_not_null; @@ -219,7 +223,9 @@ eval $f1_insert_select; --echo # - t1_not_null gets a row inserted --echo # is covered by the manual. # Non strict sqlmode + INSERT SELECT --> NULL adjusted to default +--disable_ps2_protocol SELECT f1_insert_select(2); +--enable_ps2_protocol SELECT * FROM t1_not_null ORDER BY f1,f2; ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; @@ -295,7 +301,9 @@ eval $f1_insert_with_two_rows; --echo # - t1_not_null gets a row inserted --echo # is covered by the manual. # Non strict sqlmode + multiple-row INSERT --> NULL adjusted to default +--disable_ps2_protocol SELECT f1_insert_with_two_rows(); +--enable_ps2_protocol SELECT * FROM t1_not_null ORDER BY f1,f2; ROLLBACK; SELECT * FROM t1_not_null ORDER BY f1,f2; diff --git a/mysql-test/main/func_str.test b/mysql-test/main/func_str.test index e3a98558967..ae9a04f741a 100644 --- a/mysql-test/main/func_str.test +++ b/mysql-test/main/func_str.test @@ -1545,7 +1545,9 @@ SELECT CONVERT(('' IN (REVERSE(CAST(('') AS DECIMAL)), '')), CHAR(3)); --echo # CREATE TABLE t1 ( a TEXT ); --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT 'aaaaaaaaaaaaaa' INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/bug58165.txt'; +--enable_ps2_protocol SELECT insert( substring_index( 'a', 'a', 'b' ), 1, 0, 'x' ); --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/bug58165.txt' INTO TABLE t1; diff --git a/mysql-test/main/func_time.test b/mysql-test/main/func_time.test index b0b9eb5c63c..9aa45342236 100644 --- a/mysql-test/main/func_time.test +++ b/mysql-test/main/func_time.test @@ -2284,9 +2284,11 @@ delimiter ;// SET @sav_slow_query_log= @@session.slow_query_log; +--disable_ps2_protocol # @@slow_query_log ON check SET @@session.slow_query_log= ON; SELECT current_timestamp(6),fn_sleep_before_now() INTO @ts_cur, @ts_func; +--enable_ps2_protocol --enable_prepare_warnings SELECT a FROM t_ts LIMIT 1 into @ts_func; @@ -2299,9 +2301,11 @@ if (!`SELECT @ts_cur = @ts_func and @ts_func = @ts_trig`) DELETE FROM t_ts; DELETE FROM t_trig; +--disable_ps2_protocol # @@slow_query_log OFF check SET @@session.slow_query_log= OFF; SELECT current_timestamp(6),fn_sleep_before_now() INTO @ts_cur, @func_ts; +--enable_ps2_protocol SELECT a FROM t_ts LIMIT 1 into @ts_func; SELECT a FROM t_trig LIMIT 1 into @ts_trig; --disable_prepare_warnings @@ -2355,9 +2359,11 @@ SELECT --echo # MDEV-14032 SEC_TO_TIME executes side effect two times --echo # +--disable_ps2_protocol SET @a=10000000; SELECT SEC_TO_TIME(@a:=@a+1); SELECT @a; +--enable_ps2_protocol CREATE TABLE t1 (a TEXT); DELIMITER $$; @@ -2368,7 +2374,9 @@ BEGIN END; $$ DELIMITER ;$$ +--disable_ps2_protocol SELECT SEC_TO_TIME(f1()); +--enable_ps2_protocol SELECT * FROM t1; DROP TABLE t1; DROP FUNCTION f1; diff --git a/mysql-test/main/func_weight_string.test b/mysql-test/main/func_weight_string.test index e2043e8657f..d68ea46cf4f 100644 --- a/mysql-test/main/func_weight_string.test +++ b/mysql-test/main/func_weight_string.test @@ -117,7 +117,9 @@ drop table t1; --echo # BUG#11898467 - SERVER CRASHES ON SELECT HEX(WEIGHT_STRING(STR AS [CHAR|BINARY](N))) IF N IS BIG --echo # SELECT HEX(WEIGHT_STRING('ab' AS CHAR(1000000000000000000))); +--disable_ps2_protocol SELECT HEX(WEIGHT_STRING('ab' AS BINARY(1000000000000000000))); +--enable_ps2_protocol disconnect conn1; connection default; diff --git a/mysql-test/main/grant2.test b/mysql-test/main/grant2.test index b8098488709..dc584fa3c80 100644 --- a/mysql-test/main/grant2.test +++ b/mysql-test/main/grant2.test @@ -840,7 +840,9 @@ SHOW CREATE TABLE t1; --echo # INSERT INTO t1 VALUES (1), (2), (3); --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT a INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/bug27480.txt' FROM t1 +--enable_ps2_protocol --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval LOAD DATA INFILE '$MYSQLTEST_VARDIR/tmp/bug27480.txt' INTO TABLE t1 --remove_file $MYSQLTEST_VARDIR/tmp/bug27480.txt diff --git a/mysql-test/main/group_by.test b/mysql-test/main/group_by.test index 7f81c787c36..340a6473eb7 100644 --- a/mysql-test/main/group_by.test +++ b/mysql-test/main/group_by.test @@ -284,23 +284,27 @@ drop table t1; CREATE TABLE t1 (a char(1)); INSERT INTO t1 VALUES ('A'),('B'),('A'),('B'),('A'),('B'),(NULL),('a'),('b'),(NULL),('A'),('B'),(NULL); flush status; +--disable_ps2_protocol SELECT a FROM t1 GROUP BY a; SELECT a,count(*) FROM t1 GROUP BY a; SELECT a FROM t1 GROUP BY binary a; SELECT a,count(*) FROM t1 GROUP BY binary a; SELECT binary a FROM t1 GROUP BY 1; SELECT binary a,count(*) FROM t1 GROUP BY 1; +--enable_ps2_protocol --disable_ps_protocol show status like 'Created%tables'; --enable_ps_protocol # Do the same tests with on-disk temporary tables set tmp_memory_table_size=0; +--disable_ps2_protocol SELECT a FROM t1 GROUP BY a; SELECT a,count(*) FROM t1 GROUP BY a; SELECT a FROM t1 GROUP BY binary a; SELECT a,count(*) FROM t1 GROUP BY binary a; SELECT binary a FROM t1 GROUP BY 1; SELECT binary a,count(*) FROM t1 GROUP BY 1; +--enable_ps2_protocol --disable_ps_protocol show status like 'Created%tables'; --enable_ps_protocol @@ -1041,9 +1045,11 @@ EXPLAIN SELECT a FROM t1 IGNORE INDEX FOR JOIN (PRIMARY,i2); EXPLAIN SELECT a FROM t1 IGNORE INDEX FOR GROUP BY (PRIMARY,i2) GROUP BY a; --echo # Here's a proof it is really doing sorting: flush status; +--disable_ps2_protocol --disable_result_log SELECT a FROM t1 IGNORE INDEX FOR GROUP BY (PRIMARY,i2) GROUP BY a; --enable_result_log +--enable_ps2_protocol show status like 'Sort_%'; --echo # Proof ends. --echo # @@ -1054,9 +1060,11 @@ show status like 'Sort_%'; EXPLAIN SELECT a FROM t1 IGNORE INDEX FOR ORDER BY (PRIMARY,i2) ORDER BY a; --echo # Here's a proof it is really doing sorting: flush status; +--disable_ps2_protocol --disable_result_log SELECT a FROM t1 IGNORE INDEX FOR ORDER BY (PRIMARY,i2) ORDER BY a; --enable_result_log +--enable_ps2_protocol show status like 'Sort_%'; --echo # Proof ends. --echo # @@ -1409,7 +1417,9 @@ let $query0=SELECT col1 AS field1, col1 AS field2 # Needs to be range to exercise bug --eval EXPLAIN $query0; FLUSH STATUS; +--disable_ps2_protocol --eval $query0; +--enable_ps2_protocol SHOW SESSION STATUS LIKE 'Sort_scan%'; let $query=SELECT SQL_BIG_RESULT col1 AS field1, col1 AS field2 @@ -1418,7 +1428,9 @@ let $query=SELECT SQL_BIG_RESULT col1 AS field1, col1 AS field2 # Needs to be range to exercise bug --eval EXPLAIN $query FLUSH STATUS; +--disable_ps2_protocol --eval $query +--enable_ps2_protocol SHOW SESSION STATUS LIKE 'Sort_scan%'; CREATE VIEW v1 AS SELECT * FROM t1; @@ -1652,6 +1664,7 @@ DROP TABLE t1, t2; #the view protocol creates # an additional util connection and other statistics data +--disable_ps2_protocol --disable_view_protocol FLUSH STATUS; # this test case *must* use Aria temp tables @@ -1664,6 +1677,7 @@ DROP TABLE t1; --echo the value below *must* be 1 show status like 'Created_tmp_disk_tables'; --enable_view_protocol +--enable_ps2_protocol --echo # --echo # Bug #1002146: Unneeded filesort if usage of join buffer is not allowed diff --git a/mysql-test/main/group_min_max.result b/mysql-test/main/group_min_max.result index 055bd266e15..88c5680457d 100644 --- a/mysql-test/main/group_min_max.result +++ b/mysql-test/main/group_min_max.result @@ -4028,6 +4028,119 @@ drop table t1; # End of 10.1 tests # # +# MDEV-6768 Wrong result with agregate with join with no resultset +# +create table t1 +( +PARENT_ID int(10) unsigned NOT NULL AUTO_INCREMENT, +PARENT_FIELD VARCHAR(10), +PRIMARY KEY (PARENT_ID) +) engine=innodb; +create table t2 +( +CHILD_ID INT NOT NULL AUTO_INCREMENT, +PARENT_ID INT NOT NULL, +CHILD_FIELD varchar(10), +PRIMARY KEY (CHILD_ID) +)engine=innodb; +INSERT INTO t1 (PARENT_FIELD) +SELECT 'AAAA'; +INSERT INTO t2 (PARENT_ID, CHILD_FIELD) +SELECT 1, 'BBBB'; +explain select +t1.PARENT_ID, +min(CHILD_FIELD) +from t1 straight_join t2 +where t1.PARENT_ID = 1 +and t1.PARENT_ID = t2.PARENT_ID +and t2.CHILD_FIELD = "ZZZZ"; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 const PRIMARY PRIMARY 4 const 1 Using index +1 SIMPLE t2 ALL NULL NULL NULL NULL 1 Using where +select +t1.PARENT_ID, +min(CHILD_FIELD) +from t1 straight_join t2 +where t1.PARENT_ID = 1 +and t1.PARENT_ID = t2.PARENT_ID +and t2.CHILD_FIELD = "ZZZZ"; +PARENT_ID min(CHILD_FIELD) +NULL NULL +select +1, +min(CHILD_FIELD) +from t1 straight_join t2 +where t1.PARENT_ID = 1 +and t1.PARENT_ID = t2.PARENT_ID +and t2.CHILD_FIELD = "ZZZZ"; +1 min(CHILD_FIELD) +1 NULL +select +IFNULL(t1.PARENT_ID,1), +min(CHILD_FIELD) +from t1 straight_join t2 +where t1.PARENT_ID = 1 +and t1.PARENT_ID = t2.PARENT_ID +and t2.CHILD_FIELD = "ZZZZ"; +IFNULL(t1.PARENT_ID,1) min(CHILD_FIELD) +1 NULL +# Check that things works with MyISAM (which has different explain) +alter table t1 engine=myisam; +alter table t2 engine=myisam; +explain select +t1.PARENT_ID, +min(CHILD_FIELD) +from t1 straight_join t2 +where t1.PARENT_ID = 1 +and t1.PARENT_ID = t2.PARENT_ID +and t2.CHILD_FIELD = "ZZZZ"; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +select +t1.PARENT_ID, +min(CHILD_FIELD) +from t1 straight_join t2 +where t1.PARENT_ID = 1 +and t1.PARENT_ID = t2.PARENT_ID +and t2.CHILD_FIELD = "ZZZZ"; +PARENT_ID min(CHILD_FIELD) +NULL NULL +drop table t1,t2; +# Check that things works if sub queries are re-executed +create table t1 (a int primary key, b int); +create table t2 (a int primary key, b int); +create table t3 (a int primary key, b int); +insert into t1 values (1,1),(2,2),(3,3); +insert into t2 values (1,1),(2,2),(3,3); +insert into t3 values (1,1),(3,3); +explain +select *, +(select +CONCAT('t2:', IFNULL(t2.a, 't2a-null'), ';', +'min_t3_b:', IFNULL(min(t3.b), 't3b-null')) +from t2,t3 +where t2.a=1 and t1.b = t3.a) as s1 +from t1; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL 3 +2 DEPENDENT SUBQUERY t2 const PRIMARY PRIMARY 4 const 1 Using index +2 DEPENDENT SUBQUERY t3 eq_ref PRIMARY PRIMARY 4 test.t1.b 1 +select *, +(select +CONCAT('t2:', IFNULL(t2.a, 't2a-null'), ';', +'min_t3_b:', IFNULL(min(t3.b), 't3b-null')) +from t2,t3 +where t2.a=1 and t1.b = t3.a) as s1 +from t1; +a b s1 +1 1 t2:1;min_t3_b:1 +2 2 t2:t2a-null;min_t3_b:t3b-null +3 3 t2:1;min_t3_b:3 +drop table t1,t2,t3; +# +# End of 10.4 tests +# +# # MDEV-27442 Wrong result upon query with DISTINCT and EXISTS subquery # CREATE TABLE t1 (a int, b int, KEY b (b,a)) ENGINE=MyISAM; diff --git a/mysql-test/main/group_min_max.test b/mysql-test/main/group_min_max.test index 5722f76ccfb..68ec14975ac 100644 --- a/mysql-test/main/group_min_max.test +++ b/mysql-test/main/group_min_max.test @@ -922,7 +922,7 @@ DROP TABLE t1,t2; # # Bug#24156: Loose index scan not used with CREATE TABLE ...SELECT and similar statements # - +--disable_ps2_protocol CREATE TABLE t1 (a INT, b INT, INDEX (a,b)); INSERT INTO t1 (a, b) VALUES (1,1), (1,2), (1,3), (1,4), (1,5), (2,2), (2,3), (2,1), (3,1), (4,1), (4,2), (4,3), (4,4), (4,5), (4,6); @@ -980,6 +980,7 @@ DELETE FROM t3 WHERE (SELECT (SELECT MAX(b) FROM t1 GROUP BY a HAVING a < 2) x SHOW STATUS LIKE 'handler_read__e%'; DROP TABLE t1,t2,t3; +--enable_ps2_protocol # # Bug#25602: queries with DISTINCT and SQL_BIG_RESULT hint @@ -1693,6 +1694,120 @@ drop table t1; --echo # End of 10.1 tests --echo # +--echo # +--echo # MDEV-6768 Wrong result with agregate with join with no resultset +--echo # + +create table t1 +( + PARENT_ID int(10) unsigned NOT NULL AUTO_INCREMENT, + PARENT_FIELD VARCHAR(10), + PRIMARY KEY (PARENT_ID) +) engine=innodb; + +create table t2 +( + CHILD_ID INT NOT NULL AUTO_INCREMENT, + PARENT_ID INT NOT NULL, + CHILD_FIELD varchar(10), + PRIMARY KEY (CHILD_ID) +)engine=innodb; + +INSERT INTO t1 (PARENT_FIELD) +SELECT 'AAAA'; + +INSERT INTO t2 (PARENT_ID, CHILD_FIELD) +SELECT 1, 'BBBB'; + +explain select + t1.PARENT_ID, + min(CHILD_FIELD) + from t1 straight_join t2 + where t1.PARENT_ID = 1 + and t1.PARENT_ID = t2.PARENT_ID + and t2.CHILD_FIELD = "ZZZZ"; + +select + t1.PARENT_ID, + min(CHILD_FIELD) + from t1 straight_join t2 + where t1.PARENT_ID = 1 + and t1.PARENT_ID = t2.PARENT_ID + and t2.CHILD_FIELD = "ZZZZ"; + +select + 1, + min(CHILD_FIELD) + from t1 straight_join t2 + where t1.PARENT_ID = 1 + and t1.PARENT_ID = t2.PARENT_ID + and t2.CHILD_FIELD = "ZZZZ"; + +select + IFNULL(t1.PARENT_ID,1), + min(CHILD_FIELD) + from t1 straight_join t2 + where t1.PARENT_ID = 1 + and t1.PARENT_ID = t2.PARENT_ID + and t2.CHILD_FIELD = "ZZZZ"; + + +--echo # Check that things works with MyISAM (which has different explain) + +alter table t1 engine=myisam; +alter table t2 engine=myisam; + +explain select + t1.PARENT_ID, + min(CHILD_FIELD) + from t1 straight_join t2 + where t1.PARENT_ID = 1 + and t1.PARENT_ID = t2.PARENT_ID + and t2.CHILD_FIELD = "ZZZZ"; + +select + t1.PARENT_ID, + min(CHILD_FIELD) + from t1 straight_join t2 + where t1.PARENT_ID = 1 + and t1.PARENT_ID = t2.PARENT_ID + and t2.CHILD_FIELD = "ZZZZ"; + +drop table t1,t2; + +--echo # Check that things works if sub queries are re-executed + +create table t1 (a int primary key, b int); +create table t2 (a int primary key, b int); +create table t3 (a int primary key, b int); + +insert into t1 values (1,1),(2,2),(3,3); +insert into t2 values (1,1),(2,2),(3,3); +insert into t3 values (1,1),(3,3); + +explain +select *, + (select + CONCAT('t2:', IFNULL(t2.a, 't2a-null'), ';', + 'min_t3_b:', IFNULL(min(t3.b), 't3b-null')) + from t2,t3 + where t2.a=1 and t1.b = t3.a) as s1 +from t1; + +select *, + (select + CONCAT('t2:', IFNULL(t2.a, 't2a-null'), ';', + 'min_t3_b:', IFNULL(min(t3.b), 't3b-null')) + from t2,t3 + where t2.a=1 and t1.b = t3.a) as s1 +from t1; + +drop table t1,t2,t3; + +--echo # +--echo # End of 10.4 tests +--echo # + --echo # --echo # MDEV-27442 Wrong result upon query with DISTINCT and EXISTS subquery --echo # diff --git a/mysql-test/main/group_min_max_innodb.result b/mysql-test/main/group_min_max_innodb.result index 3586ad5237f..fed3d30b16a 100644 --- a/mysql-test/main/group_min_max_innodb.result +++ b/mysql-test/main/group_min_max_innodb.result @@ -308,6 +308,28 @@ NULL bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb NULL aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa drop table t1,t2; +# +# MDEV-30143: Segfault on select query using index for group-by and filesort +# +CREATE TABLE t1 (a varchar(35), b varchar(4)) ENGINE=InnoDB; +INSERT INTO t1 VALUES +('Albania','AXA'),('Australia','AUS'),('American Samoa','AMSA'),('Bahamas','BS'); +CREATE TABLE t2 (a varchar(4), b varchar(50), PRIMARY KEY (b,a), KEY (a)) ENGINE=InnoDB; +INSERT INTO t2 VALUES +('BERM','African Methodist Episcopal'),('AUS','Anglican'),('BERM','Anglican'),('BS','Anglican'),('BS','Baptist'),('BS','Methodist'); +EXPLAIN SELECT t1.a +FROM (SELECT a FROM t2 GROUP BY a ORDER BY COUNT(DISTINCT b) LIMIT 1) dt +JOIN t1 ON dt.a=t1.b; +id select_type table type possible_keys key key_len ref rows Extra +1 PRIMARY t1 ALL NULL NULL NULL NULL # Using where +1 PRIMARY ref key0 key0 6 test.t1.b # +2 DERIVED t2 range a a 58 NULL # Using index for group-by; Using temporary; Using filesort +SELECT t1.a +FROM (SELECT a FROM t2 GROUP BY a ORDER BY COUNT(DISTINCT b) LIMIT 1) dt +JOIN t1 ON dt.a=t1.b; +a +Australia +DROP TABLES t1, t2; set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= @innodb_stats_persistent_sample_pages_save; diff --git a/mysql-test/main/group_min_max_innodb.test b/mysql-test/main/group_min_max_innodb.test index 87a6e320887..fcecbec41b3 100644 --- a/mysql-test/main/group_min_max_innodb.test +++ b/mysql-test/main/group_min_max_innodb.test @@ -251,7 +251,28 @@ insert into t2 values (1,repeat("a",1000)),(2,repeat("a",1000)),(3,repeat("b",10 SELECT GROUP_CONCAT(t1.language_id SEPARATOR ',') AS `translation_resources`, `d`.`serialized_c` FROM t2 AS `d` LEFT JOIN t1 ON `d`.`voter_id` = t1.`voter_id` GROUP BY `d`.`voter_id` ORDER BY 10-d.voter_id+RAND()*0; drop table t1,t2; + +--echo # +--echo # MDEV-30143: Segfault on select query using index for group-by and filesort +--echo # +CREATE TABLE t1 (a varchar(35), b varchar(4)) ENGINE=InnoDB; +INSERT INTO t1 VALUES +('Albania','AXA'),('Australia','AUS'),('American Samoa','AMSA'),('Bahamas','BS'); + +CREATE TABLE t2 (a varchar(4), b varchar(50), PRIMARY KEY (b,a), KEY (a)) ENGINE=InnoDB; +INSERT INTO t2 VALUES +('BERM','African Methodist Episcopal'),('AUS','Anglican'),('BERM','Anglican'),('BS','Anglican'),('BS','Baptist'),('BS','Methodist'); + +let query= +SELECT t1.a +FROM (SELECT a FROM t2 GROUP BY a ORDER BY COUNT(DISTINCT b) LIMIT 1) dt +JOIN t1 ON dt.a=t1.b; +--replace_column 9 # +eval EXPLAIN $query; +eval $query; + +DROP TABLES t1, t2; + set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= @innodb_stats_persistent_sample_pages_save; - diff --git a/mysql-test/main/handler_read_last.test b/mysql-test/main/handler_read_last.test index 2f18e302fa0..390d5f092fc 100644 --- a/mysql-test/main/handler_read_last.test +++ b/mysql-test/main/handler_read_last.test @@ -9,6 +9,7 @@ DROP TABLE IF EXISTS t1; CREATE TABLE t1 (a INT, INDEX (a)); INSERT INTO t1 VALUES (),(),(),(),(),(),(),(),(),(); +--disable_ps2_protocol FLUSH STATUS; SELECT a FROM t1 ORDER BY a LIMIT 1; SHOW STATUS LIKE 'HANDLER_READ%'; @@ -24,6 +25,7 @@ SHOW STATUS LIKE 'HANDLER_READ%'; FLUSH STATUS; SELECT a FROM t1 ORDER BY a DESC LIMIT 3; SHOW STATUS LIKE 'HANDLER_READ%'; +--enable_ps2_protocol DROP TABLE t1; diff --git a/mysql-test/main/having.test b/mysql-test/main/having.test index ce86c99865a..397b220978e 100644 --- a/mysql-test/main/having.test +++ b/mysql-test/main/having.test @@ -893,7 +893,9 @@ INSERT INTO t1 VALUES(10, 10), (11, 11), (12, 12), (12, 13),(14, 15), (15, 16), (16, 17), (17, 17); ANALYZE TABLE t1; explain SELECT t, next_seq_value() r FROM t1 FORCE INDEX(t) GROUP BY t HAVING r = 1 ORDER BY t1.u; +--disable_ps2_protocol SELECT t, next_seq_value() r FROM t1 FORCE INDEX(t) GROUP BY t HAVING r = 1 ORDER BY t1.u; +--enable_ps2_protocol DROP TABLE t1; DROP FUNCTION next_seq_value; diff --git a/mysql-test/main/information_schema.result b/mysql-test/main/information_schema.result index 156a7a11578..70692732825 100644 --- a/mysql-test/main/information_schema.result +++ b/mysql-test/main/information_schema.result @@ -2360,7 +2360,7 @@ SCHEMA_NAME SELECT * FROM INFORMATION_SCHEMA.`COLUMNS` LIMIT ROWS EXAMINED 10; TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE DATETIME_PRECISION CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT IS_GENERATED GENERATION_EXPRESSION Warnings: -Warning 1931 Query execution was interrupted. The query examined at least ### rows, which exceeds LIMIT ROWS EXAMINED (10). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 10. The query result may be incomplete # # MDEV-24179: AAssertion `m_status == DA_ERROR || m_status == DA_OK || # m_status == DA_OK_BULK' failed in Diagnostics_area::message() @@ -2534,6 +2534,28 @@ progress # End of 10.3 tests # # +# MDEV-MDEV-31064 Changes of the procedure are not immediatly seen in queries to I_S.parameter from other connections +# +CREATE PROCEDURE sp1(IN p1 INT, IN p2 INT) +BEGIN +END; +connect con2, localhost, root,,; +CALL sp1(10, 20); +connection default; +CREATE OR REPLACE PROCEDURE sp1(p1 INT) +BEGIN +END; +connection con2; +SELECT COUNT(*) FROM information_schema.parameters WHERE SPECIFIC_NAME = 'sp1'; +COUNT(*) +1 +disconnect con2; +connection default; +DROP PROCEDURE sp1; +# +# End of 10.4 tests +# +# # Start of 10.5 tests # # diff --git a/mysql-test/main/information_schema.test b/mysql-test/main/information_schema.test index 7ef536c2a54..fe9853da70f 100644 --- a/mysql-test/main/information_schema.test +++ b/mysql-test/main/information_schema.test @@ -1407,12 +1407,13 @@ set global init_connect=""; # # Bug#34517 SHOW GLOBAL STATUS does not work properly in embedded server. # - +--disable_ps2_protocol create table t0 select * from information_schema.global_status where VARIABLE_NAME='COM_SELECT'; SELECT 1; select a.VARIABLE_VALUE - b.VARIABLE_VALUE from t0 b, information_schema.global_status a where a.VARIABLE_NAME = b.VARIABLE_NAME; drop table t0; +--enable_ps2_protocol # # Bug#35275 INFORMATION_SCHEMA.TABLES.CREATE_OPTIONS omits KEY_BLOCK_SIZE @@ -2113,6 +2114,28 @@ select progress from information_schema.processlist limit 1; --echo # End of 10.3 tests --echo # +--echo # +--echo # MDEV-MDEV-31064 Changes of the procedure are not immediatly seen in queries to I_S.parameter from other connections +--echo # +CREATE PROCEDURE sp1(IN p1 INT, IN p2 INT) +BEGIN +END; +--connect(con2, localhost, root,,) +CALL sp1(10, 20); +--connection default +CREATE OR REPLACE PROCEDURE sp1(p1 INT) +BEGIN +END; +--connection con2 +SELECT COUNT(*) FROM information_schema.parameters WHERE SPECIFIC_NAME = 'sp1'; +--disconnect con2 +--connection default +DROP PROCEDURE sp1; + +--echo # +--echo # End of 10.4 tests +--echo # + --echo # --echo # Start of 10.5 tests --echo # diff --git a/mysql-test/main/information_schema_stats.test b/mysql-test/main/information_schema_stats.test index 49d46ee437d..fd5171c3fb4 100644 --- a/mysql-test/main/information_schema_stats.test +++ b/mysql-test/main/information_schema_stats.test @@ -1,3 +1,4 @@ +--disable_ps2_protocol # # MDEV-8633: information_schema.index_statistics doesn't delete item when drop table indexes or drop table; # @@ -45,3 +46,4 @@ drop table just_a_test; select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test'; select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test'; set global userstat=@save_userstat; +--enable_ps2_protocol diff --git a/mysql-test/main/innodb_ext_key.test b/mysql-test/main/innodb_ext_key.test index 41a55232001..af7bd9fe967 100644 --- a/mysql-test/main/innodb_ext_key.test +++ b/mysql-test/main/innodb_ext_key.test @@ -27,6 +27,7 @@ ANALYZE TABLE lineitem PERSISTENT FOR COLUMNS() INDEXES(); --enable_result_log --enable_query_log +--disable_ps2_protocol explain select count(*) from lineitem where l_orderkey=130 and l_shipdate='1992-07-01'; flush status; @@ -149,6 +150,7 @@ select o_orderkey, p_partkey where p_retailprice > 1100 and o_orderdate='1997-01-01' and o_orderkey=l_orderkey and p_partkey=l_partkey; show status like 'handler_read%'; +--enable_ps2_protocol --echo # --echo # Bug mdev-3851: ref access used instead of expected eq_ref access @@ -317,12 +319,14 @@ select A.a + 10 * B.a, A.a + 10 * B.a, A.a + 10 * B.a from t1 A, t1 B; +--disable_ps2_protocol --replace_column 9 # explain select * from t1, t2 where t2.a=t1.a and t2.b < 2; flush status; select * from t1, t2 where t2.a=t1.a and t2.b < 2; show status like 'handler_read%'; +--enable_ps2_protocol drop table t1,t2; diff --git a/mysql-test/main/insert.test b/mysql-test/main/insert.test index e5cb2bac6f8..0a1e63765a4 100644 --- a/mysql-test/main/insert.test +++ b/mysql-test/main/insert.test @@ -210,6 +210,7 @@ drop table t1; # (and thus for values returned by mysql_affected_rows()) # for various forms of INSERT # +--disable_ps2_protocol create table t1 (id int primary key, data int); insert into t1 values (1, 1), (2, 2), (3, 3); select row_count(); @@ -227,6 +228,7 @@ select row_count(); insert into t1 values (5, 5) on duplicate key update data= data + 10; select row_count(); drop table t1; +--enable_ps2_protocol # # Bug#25123: ON DUPLICATE KEY clause allows fields not from the insert table @@ -284,8 +286,10 @@ BEGIN END | delimiter ;| +--disable_ps2_protocol SELECT f1(); SELECT f2(); +--enable_ps2_protocol INSERT INTO t1 VALUES (3); INSERT DELAYED INTO t1 VALUES (4); @@ -592,7 +596,9 @@ CREATE ALGORITHM = MERGE VIEW v1 AS SELECT f1, f2 FROM t1 WHERE f1 = cast('' as REPLACE INTO v1 SET f2 = 1; SELECT * from t1; drop view v1; +--disable_ps2_protocol SELECT 0,0 INTO OUTFILE 't1.txt'; +--enable_ps2_protocol CREATE ALGORITHM = MERGE VIEW v1 AS SELECT f1, f2 FROM t1 WHERE f1 = 'x' WITH CHECK OPTION; --error ER_TRUNCATED_WRONG_VALUE LOAD DATA INFILE 't1.txt' INTO TABLE v1; diff --git a/mysql-test/main/invisible_field.test b/mysql-test/main/invisible_field.test index 7fd22704fcb..8e11981cc02 100644 --- a/mysql-test/main/invisible_field.test +++ b/mysql-test/main/invisible_field.test @@ -252,7 +252,9 @@ create or replace table t1 (a int, b int invisible); insert into t1 values (1),(2); --enable_prepare_warnings +--disable_ps2_protocol select * from t1 into outfile 'f'; +--enable_ps2_protocol load data infile 'f' into table t1; select a,b from t1; load data infile 'f' into table t1 (a,@v) SET b=@v; @@ -262,7 +264,9 @@ select a,b from t1; truncate table t1; insert into t1(a,b) values (1,1),(2,2); +--disable_ps2_protocol select a,b from t1 into outfile 'a'; +--enable_ps2_protocol load data infile 'a' into table t1(a,b); select a,b from t1; load data infile 'a' into table t1 (a,@v) SET b=@v; diff --git a/mysql-test/main/join.test b/mysql-test/main/join.test index b665f034813..2f94daf4616 100644 --- a/mysql-test/main/join.test +++ b/mysql-test/main/join.test @@ -659,7 +659,9 @@ create table t3 (a int not null, primary key(a)); insert into t3 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); flush status; +--disable_ps2_protocol select * from t1, t2, t3 where t3.a=t1.a and t2.a=t1.b; +--enable_ps2_protocol explain select * from t1, t2, t3 where t3.a=t1.a and t2.a=t1.b; --echo We expect rnd_next=5, and read_key must be 0 because of short-cutting: show status like 'Handler_read%'; @@ -958,7 +960,9 @@ INSERT INTO t1 VALUES (3,'b'),(4,NULL),(5,'c'),(6,'cc'),(7,'d'), INSERT INTO t2 VALUES (2,NULL); ANALYZE TABLE t1,t2; FLUSH STATUS; +--disable_ps2_protocol SELECT * FROM t1 JOIN t2 ON t1.v = t2.v WHERE t2.v IS NULL ORDER BY 1; +--enable_ps2_protocol SHOW STATUS LIKE 'Handler_read_%'; DROP TABLE t1, t2; diff --git a/mysql-test/main/join_cache.result b/mysql-test/main/join_cache.result index 10ed8960b64..85fba5be1c0 100644 --- a/mysql-test/main/join_cache.result +++ b/mysql-test/main/join_cache.result @@ -3781,9 +3781,9 @@ id1 num3 text1 id4 id3 dummy 228808822 6 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 228808822 18 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 228808822 1 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 -228808822 3 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 228808822 17 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 228808822 50 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 +228808822 3 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 228808822 4 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 826928662 935693782 0 228808822 89 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2381969632 2482416112 0 228808822 19 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC 2381969632 2482416112 0 @@ -5655,13 +5655,13 @@ EXPLAIN SELECT * FROM t1, t2 LEFT JOIN t3 ON t2.b=t3.b WHERE t1.a=t2.a; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 -1 SIMPLE t2 ALL NULL NULL NULL NULL 12 Using where -1 SIMPLE t3 ALL NULL NULL NULL NULL 3 Using where +1 SIMPLE t2 ALL NULL NULL NULL NULL 12 Using where; Using join buffer (flat, BNL join) +1 SIMPLE t3 ALL NULL NULL NULL NULL 3 Using where; Using join buffer (incremental, BNL join) SELECT * FROM t1, t2 LEFT JOIN t3 ON t2.b=t3.b WHERE t1.a=t2.a; a a b b c +3 3 32 32 302 3 3 30 30 300 3 3 31 NULL NULL -3 3 32 32 302 set join_buffer_space_limit=@save_join_buffer_space_limit; set join_buffer_size=@save_join_buffer_size; set join_cache_level=@save_join_cache_level; @@ -6239,3 +6239,26 @@ set @@optimizer_switch=@save_optimizer_switch; set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= @innodb_stats_persistent_sample_pages_save; +# +# MDEV-31226 Server crash or assertion failure with row size close to +# join_buffer_size +# +set @org_optimizer_switch=@@optimizer_switch; +set @org_join_buffer_size=@@join_buffer_size; +CREATE TABLE t (f VARCHAR(16384)) ENGINE=MyISAM CHARACTER SET utf8; +INSERT INTO t VALUES (REPEAT('a',16384)),(REPEAT('b',16384)); +SET OPTIMIZER_SWITCH = 'optimize_join_buffer_size=off'; +SET JOIN_BUFFER_SIZE = 16384; +explain SELECT length(concat(t1.f,t2.f)) FROM t t1, t t2; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 2 +1 SIMPLE t2 ALL NULL NULL NULL NULL 2 +SELECT length(concat(t1.f,t2.f)) FROM t t1, t t2; +length(concat(t1.f,t2.f)) +32768 +32768 +32768 +32768 +DROP TABLE t; +set @@optimizer_switch=@org_optimizer_switch; +set @@join_buffer_size=@org_join_buffer_size; diff --git a/mysql-test/main/join_cache.test b/mysql-test/main/join_cache.test index f09f28c273a..40e1ee3acfb 100644 --- a/mysql-test/main/join_cache.test +++ b/mysql-test/main/join_cache.test @@ -1645,6 +1645,7 @@ insert into t2 values (3,1, 'qwerty'),(3,4, 'qwerty'); insert into t2 values (4,1, 'qwerty'),(4,2, 'qwerty'),(4,3, 'qwerty'), (4,4, 'qwerty'); +--disable_ps2_protocol flush status; set join_cache_level=5; select t2.f1, t2.f2, t2.f3 from t1,t2 @@ -1678,6 +1679,8 @@ explain select t2.f1, t2.f2, t2.f3 from t1,t2 where t1.f1=t2.f1 and t2.f2 between t1.f1 and t2.f2; show status like "Handler_icp%"; +--enable_ps2_protocol + drop table t1,t2; set join_cache_level=@save_join_cache_level; @@ -4031,6 +4034,7 @@ insert into t3 values (2); set @counter=0; +--disable_ps2_protocol explain select count(*) from t1 straight_join t2 where c1 = c2-0 and c2 <= (select max(c3) from t3 where c3 = 2 and @counter:=@counter+1); @@ -4055,6 +4059,8 @@ where c1 = c2-0 and select @counter; +--enable_ps2_protocol + drop table t1,t2,t3; set expensive_subquery_limit=@save_expensive_subquery_limit; @@ -4207,3 +4213,20 @@ set @@optimizer_switch=@save_optimizer_switch; set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= @innodb_stats_persistent_sample_pages_save; + +--echo # +--echo # MDEV-31226 Server crash or assertion failure with row size close to +--echo # join_buffer_size +--echo # + +set @org_optimizer_switch=@@optimizer_switch; +set @org_join_buffer_size=@@join_buffer_size; +CREATE TABLE t (f VARCHAR(16384)) ENGINE=MyISAM CHARACTER SET utf8; +INSERT INTO t VALUES (REPEAT('a',16384)),(REPEAT('b',16384)); +SET OPTIMIZER_SWITCH = 'optimize_join_buffer_size=off'; +SET JOIN_BUFFER_SIZE = 16384; +explain SELECT length(concat(t1.f,t2.f)) FROM t t1, t t2; +SELECT length(concat(t1.f,t2.f)) FROM t t1, t t2; +DROP TABLE t; +set @@optimizer_switch=@org_optimizer_switch; +set @@join_buffer_size=@org_join_buffer_size; diff --git a/mysql-test/main/join_cache_notasan.result b/mysql-test/main/join_cache_notasan.result new file mode 100644 index 00000000000..3cec949f5c6 --- /dev/null +++ b/mysql-test/main/join_cache_notasan.result @@ -0,0 +1,27 @@ +# +# MDEV-28217 Incorrect Join Execution When Controlling Join Buffer Size +# +CREATE TABLE t1 (i int PRIMARY KEY)engine=innodb; +INSERT INTO t1 VALUES (1332945389); +CREATE TABLE t2 (i int PRIMARY KEY)engine=innodb; +INSERT INTO t2 VALUES (1180244875), (1951338178); +SET SESSION join_buffer_size= X; +Warnings: +Warning X Truncated incorrect join_buffer_size value: 'X' +SET SESSION join_cache_level = 4; +SET optimizer_switch='optimize_join_buffer_size=on'; +SELECT t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +i +SET optimizer_switch='optimize_join_buffer_size=off'; +SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +ERROR HYX: Could not create a join buffer. Please check and adjust the value of the variables 'JOIN_BUFFER_SIZE (X)' and 'JOIN_BUFFER_SPACE_LIMIT (X)' +SET SESSION join_buffer_size= 10000000; +SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +i i +SET SESSION optimizer_switch= default; +SET SESSION join_buffer_size= default; +SET SESSION join_cache_level= default; +drop table t1,t2; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/join_cache_notasan.test b/mysql-test/main/join_cache_notasan.test new file mode 100644 index 00000000000..b5eddb84c13 --- /dev/null +++ b/mysql-test/main/join_cache_notasan.test @@ -0,0 +1,37 @@ +# +# Tests that should be in join_cache but cannot be run with ASAN + +--source include/have_64bit.inc +--source include/not_asan.inc +--source include/not_msan.inc +--source include/have_innodb.inc + +--echo # +--echo # MDEV-28217 Incorrect Join Execution When Controlling Join Buffer Size +--echo # + +# This test tries to allocate a too big bufffer, for which ASAN gives an error + +CREATE TABLE t1 (i int PRIMARY KEY)engine=innodb; +INSERT INTO t1 VALUES (1332945389); +CREATE TABLE t2 (i int PRIMARY KEY)engine=innodb; +INSERT INTO t2 VALUES (1180244875), (1951338178); +--replace_regex /[0-9][0-9]+/X/ +SET SESSION join_buffer_size= 5250229460064350213; +SET SESSION join_cache_level = 4; +SET optimizer_switch='optimize_join_buffer_size=on'; +SELECT t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +SET optimizer_switch='optimize_join_buffer_size=off'; +--replace_regex /[0-9][0-9]+/X/ +--error ER_OUTOFMEMORY +SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +SET SESSION join_buffer_size= 10000000; +SELECT t1.i,t2.i FROM t2 LEFT JOIN t1 ON t1.i = t2.i WHERE t1.i; +SET SESSION optimizer_switch= default; +SET SESSION join_buffer_size= default; +SET SESSION join_cache_level= default; +drop table t1,t2; + +--echo # +--echo # End of 10.4 tests +--echo # diff --git a/mysql-test/main/join_optimizer.test b/mysql-test/main/join_optimizer.test index 3afe82113b9..e5f6181944d 100644 --- a/mysql-test/main/join_optimizer.test +++ b/mysql-test/main/join_optimizer.test @@ -2,6 +2,8 @@ drop table if exists t0,t1,t2,t3; --enable_warnings +--source include/have_innodb.inc + --echo # --echo # BUG#38049 incorrect rows estimations with references from preceding table --echo # diff --git a/mysql-test/main/join_outer.test b/mysql-test/main/join_outer.test index 5e1e83e4049..857a9ced41b 100644 --- a/mysql-test/main/join_outer.test +++ b/mysql-test/main/join_outer.test @@ -685,9 +685,15 @@ create table t1 (a int, b varchar(20)); create table t2 (a int, c varchar(20)); insert into t1 values (1,"aaaaaaaaaa"),(2,"bbbbbbbbbb"); insert into t2 values (1,"cccccccccc"),(2,"dddddddddd"); +#Enable after fix MDEV-31276 +--disable_ps2_protocol select group_concat(t1.b,t2.c) from t1 left join t2 using(a) group by t1.a; +--enable_ps2_protocol select group_concat(t1.b,t2.c) from t1 inner join t2 using(a) group by t1.a; +#Enable after fix MDEV-31276 +--disable_ps2_protocol select group_concat(t1.b,t2.c) from t1 left join t2 using(a) group by a; +--enable_ps2_protocol select group_concat(t1.b,t2.c) from t1 inner join t2 using(a) group by a; drop table t1, t2; set group_concat_max_len=default; @@ -873,7 +879,8 @@ DROP TABLE t1,t2; # # Bug 28188: 'not exists' optimization for outer joins # - + +--disable_ps2_protocol CREATE TABLE t1 (id int PRIMARY KEY, a varchar(8)); CREATE TABLE t2 (id int NOT NULL, b int NOT NULL, INDEX idx(id)); INSERT INTO t1 VALUES @@ -889,7 +896,7 @@ SELECT t1.id, a FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.b IS NULL; show status like 'Handler_read%'; DROP TABLE t1,t2; - +--enable_ps2_protocol # # Bug 28571: outer join with false on condition over constant tables # @@ -1369,6 +1376,7 @@ drop table t1,t2,t3,t4; --echo # Bug#57024: Poor performance when conjunctive condition over the outer --echo # table is used in the on condition of an outer join --echo # +--disable_ps2_protocol --disable_view_protocol create table t1 (a int); insert into t1 values (NULL), (NULL), (NULL), (NULL); @@ -1411,6 +1419,7 @@ show status like "handler_read%"; drop table t1,t2,t3; --enable_view_protocol +--enable_ps2_protocol --echo # --echo # Bug#57688 Assertion `!table || (!table->write_set || bitmap_is_set(table->write_set, field @@ -2363,8 +2372,11 @@ create view v1 as select * from t1 left join ( select 'Y' AS Voted, ElectionID from t2 ) AS T on T.ElectionID = t1.Election limit 9; +#enable after fix MDEV-31277 +--disable_ps2_protocol # limit X causes merge algorithm select as opposed to temp table select * from v1; +--enable_ps2_protocol drop table t1, t2; drop view v1; @@ -2379,7 +2391,10 @@ create view v10 as select *, 'U' as u from t10 left join (select 'Y' as y, t20.b create table t30 (c int); insert into t30 values (1),(3); create view v20 as select * from t30 left join (select 'X' as x, v10.u, v10.y, v10.b from v10) dt2 on t30.c=dt2.b limit 6; +#check after fix MDEV-31277 +--disable_ps2_protocol select * from v20 limit 9; +--enable_ps2_protocol drop view v10, v20; drop table t10, t20, t30; @@ -2392,7 +2407,9 @@ create table t3 (c int); insert into t3 values (3),(1); create table t1 (a int); insert into t1 values (1),(2),(7),(1); - + +#check after fix MDEV-31277 +--disable_ps2_protocol select * from ( select * from @@ -2405,6 +2422,7 @@ select * from on dt1.a=dt2.b limit 9 ) dt; +--enable_ps2_protocol ## Same as dt3 above create view v3(x,c) as select * from (select 'X' as x, t3.c from t3) dt3; @@ -2418,7 +2436,10 @@ create view v0(y,b,x,c) as select * from v2 left join v3 on v2.b=v3.c; # Same as above select statement create view v1 as select 'Z' as z, t1.a, v0.* from t1 left join v0 on t1.a=v0.b limit 9; +#check after fix MDEV-31277 +--disable_ps2_protocol select * from v1; +--enable_ps2_protocol set statement join_cache_level=0 for select * from v1; diff --git a/mysql-test/main/key_cache.test b/mysql-test/main/key_cache.test index 9bd57f017f0..0829719a442 100644 --- a/mysql-test/main/key_cache.test +++ b/mysql-test/main/key_cache.test @@ -276,6 +276,7 @@ DROP TABLE t1; # Test usage of the KEY_CACHE table from information schema # for a simple key cache +--disable_ps2_protocol set global key_buffer_size=@save_key_buffer_size; set global key_cache_block_size=@save_key_cache_block_size; select @@key_buffer_size; @@ -536,6 +537,7 @@ set global keycache2.key_buffer_size=0; set global key_buffer_size=@save_key_buffer_size; set global key_cache_segments=@save_key_cache_segments; set global key_cache_file_hash_size=@save_key_cache_file_hash_size; +--enable_ps2_protocol # End of 5.2 tests diff --git a/mysql-test/main/limit_rows_examined.result b/mysql-test/main/limit_rows_examined.result index f0a22b8f3f2..50b542fa5fe 100644 --- a/mysql-test/main/limit_rows_examined.result +++ b/mysql-test/main/limit_rows_examined.result @@ -22,7 +22,7 @@ select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 2; c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (2). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 2. The query result may be incomplete explain select * from t1i, t2i where c1 = c2 LIMIT ROWS EXAMINED 4; id select_type table type possible_keys key key_len ref rows Extra @@ -32,7 +32,7 @@ select * from t1i, t2i where c1 = c2 LIMIT ROWS EXAMINED 4; c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 5 rows, which exceeds LIMIT ROWS EXAMINED (4). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 4. The query result may be incomplete Blocked nested loops join, empty result set because of blocking set @@join_cache_level=1; explain @@ -44,7 +44,7 @@ select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 6; c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 7 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete explain select * from t1i, t2i where c1 = c2 LIMIT ROWS EXAMINED 6; id select_type table type possible_keys key key_len ref rows Extra @@ -55,7 +55,7 @@ c1 c2 bb bb cc cc Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 7 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete set @@join_cache_level=6; explain select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 3; @@ -65,7 +65,7 @@ id select_type table type possible_keys key key_len ref rows Extra select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 3; c1 c2 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 4 rows, which exceeds LIMIT ROWS EXAMINED (3). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 3. The query result may be incomplete explain select * from t1i, t2i where c1 = c2 LIMIT ROWS EXAMINED 6; id select_type table type possible_keys key key_len ref rows Extra @@ -76,7 +76,7 @@ c1 c2 bb bb cc cc Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 7 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete Mix LIMIT ROWS EXAMINED with LIMIT set @@join_cache_level=0; explain @@ -125,7 +125,7 @@ id select_type table type possible_keys key key_len ref rows Extra select * from t0, t1 where c0 = 'bb' and c1 > c0 LIMIT ROWS EXAMINED 0; c0 c1 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 2 rows, which exceeds LIMIT ROWS EXAMINED (0). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 0. The query result may be incomplete set @@join_cache_level = @save_join_cache_level; drop table t0; ========================================================================= @@ -139,7 +139,7 @@ execute st1 using @l; c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (2). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 2. The query result may be incomplete deallocate prepare st1; User variable (not supported for LIMIT in MariaDB 5.3/MySQL 5.1) select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED @l; @@ -153,7 +153,7 @@ call test_limit_rows(3); c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 4 rows, which exceeds LIMIT ROWS EXAMINED (3). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 3. The query result may be incomplete drop procedure test_limit_rows; set @@join_cache_level = @save_join_cache_level; ========================================================================= @@ -165,14 +165,14 @@ UNION c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 8 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete (select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 0) UNION (select * from t1, t2 where c1 < c2 LIMIT ROWS EXAMINED 6); c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 8 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 0 UNION select * from t1, t2 where c1 < c2 LIMIT ROWS EXAMINED 6; @@ -185,7 +185,7 @@ LIMIT ROWS EXAMINED 6; c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 8 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete (select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 0) UNION (select * from t1, t2 where c1 < c2 LIMIT ROWS EXAMINED 0) @@ -193,7 +193,7 @@ LIMIT 1 ROWS EXAMINED 6; c1 c2 bb bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 8 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete (select * from t1, t2 where c1 = c2 LIMIT ROWS EXAMINED 0) UNION (select * from t1, t2 where c1 < c2 LIMIT ROWS EXAMINED 0) @@ -202,7 +202,7 @@ c1 c2 bb bb cc cc Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (10). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 10. The query result may be incomplete ========================================================================= Subqueries (with several LIMIT ROWS EXAMINED clauses) ========================================================================= @@ -219,7 +219,7 @@ where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 11); c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (11). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 11. The query result may be incomplete explain select * from t1 where c1 IN (select * from t2 where c2 > ' ') @@ -234,7 +234,7 @@ LIMIT ROWS EXAMINED 11; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (11). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 11. The query result may be incomplete explain select * from t1 where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 0) @@ -249,7 +249,7 @@ LIMIT ROWS EXAMINED 11; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (11). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 11. The query result may be incomplete explain select * from t1i where c1 IN (select * from t2i where c2 > ' ') @@ -264,7 +264,7 @@ c1 bb cc Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 7 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete Subqueries with IN-TO-EXISTS set @@optimizer_switch='semijoin=off,in_to_exists=on,materialization=off'; explain @@ -278,7 +278,7 @@ where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 4); c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 5 rows, which exceeds LIMIT ROWS EXAMINED (4). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 4. The query result may be incomplete explain select * from t1 where c1 IN (select * from t2 where c2 > ' ') @@ -292,7 +292,7 @@ LIMIT ROWS EXAMINED 4; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 5 rows, which exceeds LIMIT ROWS EXAMINED (4). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 4. The query result may be incomplete explain select * from t1 where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 0) @@ -306,7 +306,7 @@ LIMIT ROWS EXAMINED 4; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 5 rows, which exceeds LIMIT ROWS EXAMINED (4). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 4. The query result may be incomplete explain select * from t1i where c1 IN (select * from t2i where c2 > ' ') @@ -320,7 +320,7 @@ LIMIT ROWS EXAMINED 9; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (9). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 9. The query result may be incomplete Same as above, without subquery cache set @@optimizer_switch='subquery_cache=off'; select * from t1 @@ -328,28 +328,28 @@ where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 2); c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (2). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 2. The query result may be incomplete select * from t1 where c1 IN (select * from t2 where c2 > ' ') LIMIT ROWS EXAMINED 2; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (2). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 2. The query result may be incomplete select * from t1 where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 0) LIMIT ROWS EXAMINED 2; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (2). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 2. The query result may be incomplete select * from t1i where c1 IN (select * from t2i where c2 > ' ') LIMIT ROWS EXAMINED 5; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 7 rows, which exceeds LIMIT ROWS EXAMINED (5). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete Subqueries with materialization set @@optimizer_switch='semijoin=off,in_to_exists=off,materialization=on,subquery_cache=on'; explain @@ -363,7 +363,7 @@ where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 13); c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 14 rows, which exceeds LIMIT ROWS EXAMINED (13). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 13. The query result may be incomplete explain select * from t1 where c1 IN (select * from t2 where c2 > ' ') LIMIT ROWS EXAMINED 13; @@ -375,7 +375,7 @@ where c1 IN (select * from t2 where c2 > ' ') LIMIT ROWS EXAMINED 13; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 14 rows, which exceeds LIMIT ROWS EXAMINED (13). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 13. The query result may be incomplete explain select * from t1 where c1 IN (select * from t2 where c2 > ' ' LIMIT ROWS EXAMINED 0) @@ -389,7 +389,7 @@ LIMIT ROWS EXAMINED 13; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 14 rows, which exceeds LIMIT ROWS EXAMINED (13). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 13. The query result may be incomplete explain select * from t1i where c1 IN (select * from t2i where c2 > ' ') LIMIT ROWS EXAMINED 17; @@ -401,7 +401,7 @@ where c1 IN (select * from t2i where c2 > ' ') LIMIT ROWS EXAMINED 17; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 18 rows, which exceeds LIMIT ROWS EXAMINED (17). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 17. The query result may be incomplete set @@optimizer_switch='default'; ========================================================================= Views and derived tables @@ -422,18 +422,18 @@ bb cc dd Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 18 rows, which exceeds LIMIT ROWS EXAMINED (17). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 17. The query result may be incomplete select * from v1 LIMIT ROWS EXAMINED 16; c1 bb cc Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 17 rows, which exceeds LIMIT ROWS EXAMINED (16). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 16. The query result may be incomplete select * from v1 LIMIT ROWS EXAMINED 11; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (11). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 11. The query result may be incomplete drop view v1; explain select * @@ -451,7 +451,7 @@ LIMIT ROWS EXAMINED 11; c1 bb Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (11). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 11. The query result may be incomplete ========================================================================= Aggregation ========================================================================= @@ -474,16 +474,16 @@ id select_type table type possible_keys key key_len ref rows Extra select c1, sum(c2) from t3 group by c1 LIMIT ROWS EXAMINED 0; c1 sum(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 1 rows, which exceeds LIMIT ROWS EXAMINED (0). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 0. The query result may be incomplete select c1, sum(c2) from t3 group by c1 LIMIT ROWS EXAMINED 1; c1 sum(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (1). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 1. The query result may be incomplete select c1, sum(c2) from t3 group by c1 LIMIT ROWS EXAMINED 20; c1 sum(c2) aa 3 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 21 rows, which exceeds LIMIT ROWS EXAMINED (20). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 20. The query result may be incomplete select c1, sum(c2) from t3 group by c1 LIMIT ROWS EXAMINED 21; c1 sum(c2) aa 3 @@ -501,16 +501,16 @@ id select_type table type possible_keys key key_len ref rows Extra select c1, sum(c2) from t3i group by c1 LIMIT ROWS EXAMINED 0; c1 sum(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 1 rows, which exceeds LIMIT ROWS EXAMINED (0). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 0. The query result may be incomplete select c1, sum(c2) from t3i group by c1 LIMIT ROWS EXAMINED 1; c1 sum(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (1). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 1. The query result may be incomplete select c1, sum(c2) from t3i group by c1 LIMIT ROWS EXAMINED 20; c1 sum(c2) aa 3 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 21 rows, which exceeds LIMIT ROWS EXAMINED (20). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 20. The query result may be incomplete select c1, sum(c2) from t3i group by c1 LIMIT ROWS EXAMINED 21; c1 sum(c2) aa 3 @@ -523,14 +523,14 @@ id select_type table type possible_keys key key_len ref rows Extra select min(c2) from t3 LIMIT ROWS EXAMINED 5; min(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 6 rows, which exceeds LIMIT ROWS EXAMINED (5). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete select max(c2) from t3 LIMIT ROWS EXAMINED 6; max(c2) 5 select max(c2) from t3 LIMIT ROWS EXAMINED 0; max(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 1 rows, which exceeds LIMIT ROWS EXAMINED (0). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 0. The query result may be incomplete explain select max(c2) from t3 where c2 > 10 LIMIT ROWS EXAMINED 5; id select_type table type possible_keys key key_len ref rows Extra @@ -538,14 +538,14 @@ id select_type table type possible_keys key key_len ref rows Extra select max(c2) from t3 where c2 > 10 LIMIT ROWS EXAMINED 5; max(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 6 rows, which exceeds LIMIT ROWS EXAMINED (5). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete select max(c2) from t3 where c2 > 10 LIMIT ROWS EXAMINED 6; max(c2) NULL select max(c2) from t3 where c2 > 10 LIMIT ROWS EXAMINED 0; max(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 1 rows, which exceeds LIMIT ROWS EXAMINED (0). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 0. The query result may be incomplete explain select count(c2) from t3 LIMIT ROWS EXAMINED 5; id select_type table type possible_keys key key_len ref rows Extra @@ -553,14 +553,14 @@ id select_type table type possible_keys key key_len ref rows Extra select count(c2) from t3 LIMIT ROWS EXAMINED 5; count(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 6 rows, which exceeds LIMIT ROWS EXAMINED (5). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete select count(c2) from t3 LIMIT ROWS EXAMINED 6; count(c2) 5 select count(c2) from t3 LIMIT ROWS EXAMINED 0; count(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 1 rows, which exceeds LIMIT ROWS EXAMINED (0). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 0. The query result may be incomplete explain select count(c2) from t3 where c2 > 10 LIMIT ROWS EXAMINED 5; id select_type table type possible_keys key key_len ref rows Extra @@ -568,7 +568,7 @@ id select_type table type possible_keys key key_len ref rows Extra select count(c2) from t3 where c2 > 10 LIMIT ROWS EXAMINED 5; count(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 6 rows, which exceeds LIMIT ROWS EXAMINED (5). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete select count(c2) from t3 where c2 > 10 LIMIT ROWS EXAMINED 6; count(c2) 0 @@ -579,7 +579,7 @@ id select_type table type possible_keys key key_len ref rows Extra select sum(c2) from t3 LIMIT ROWS EXAMINED 5; sum(c2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 6 rows, which exceeds LIMIT ROWS EXAMINED (5). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 5. The query result may be incomplete select sum(c2) from t3 LIMIT ROWS EXAMINED 6; sum(c2) 15 @@ -618,7 +618,7 @@ c1 c2 aa 1 aa 2 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (2). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 2. The query result may be incomplete explain select c1, c2 from t3i order by c2, c1 desc LIMIT ROWS EXAMINED 2; id select_type table type possible_keys key key_len ref rows Extra @@ -634,14 +634,14 @@ CREATE TABLE t4 (a int); INSERT INTO t4 values (1), (2); INSERT IGNORE INTO t4 SELECT a + 2 FROM t4 LIMIT ROWS EXAMINED 0; Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 1 rows, which exceeds LIMIT ROWS EXAMINED (0). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 0. The query result may be incomplete select * from t4; a 1 2 INSERT INTO t4 SELECT a + 2 FROM t4 LIMIT ROWS EXAMINED 6; Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 8 rows, which exceeds LIMIT ROWS EXAMINED (6). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 6. The query result may be incomplete select * from t4; a 1 @@ -692,7 +692,7 @@ WHERE EXISTS (SELECT c FROM t3 LEFT JOIN t2 ON b = d) HAVING field1 > 'aaa' LIMIT ROWS EXAMINED 20; field1 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 21 rows, which exceeds LIMIT ROWS EXAMINED (20). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 20. The query result may be incomplete EXPLAIN SELECT DISTINCT a FROM t1, t2 HAVING a > ' ' LIMIT ROWS EXAMINED 14; id select_type table type possible_keys key key_len ref rows Extra @@ -702,13 +702,13 @@ SELECT DISTINCT a FROM t1, t2 HAVING a > ' ' LIMIT ROWS EXAMINED 14; a USA Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 15 rows, which exceeds LIMIT ROWS EXAMINED (14). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 14. The query result may be incomplete SELECT DISTINCT a FROM t1, t2 HAVING a > ' ' LIMIT ROWS EXAMINED 15; a USA CAN Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 16 rows, which exceeds LIMIT ROWS EXAMINED (15). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 15. The query result may be incomplete SELECT DISTINCT a FROM t1, t2 HAVING a > ' ' LIMIT ROWS EXAMINED 16; a USA @@ -753,7 +753,7 @@ GROUP BY field1, field2, field3, field4, field5 LIMIT ROWS EXAMINED 120; field1 field2 field3 field4 field5 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 121 rows, which exceeds LIMIT ROWS EXAMINED (120). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 120. The query result may be incomplete SHOW STATUS LIKE 'Handler_read%'; Variable_name Value Handler_read_first 1 @@ -778,8 +778,8 @@ GROUP BY field1, field2, field3, field4, field5 LIMIT ROWS EXAMINED 124; field1 field2 field3 field4 field5 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 125 rows, which exceeds LIMIT ROWS EXAMINED (124). The query result may be incomplete -Warning 1931 Query execution was interrupted. The query examined at least 127 rows, which exceeds LIMIT ROWS EXAMINED (124). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 124. The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 124. The query result may be incomplete SHOW STATUS LIKE 'Handler_read%'; Variable_name Value Handler_read_first 1 @@ -822,7 +822,7 @@ WHERE b <= alias1.b OR e != alias2.c ) LIMIT ROWS EXAMINED 20; a b c Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 25 rows, which exceeds LIMIT ROWS EXAMINED (20). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 20. The query result may be incomplete drop table t1, t2, t3; MDEV-174: LIMIT ROWS EXAMINED: Assertion `0' failed in net_end_statement(THD*) @@ -839,7 +839,7 @@ WHERE c = (SELECT MAX(b) FROM t2) LIMIT ROWS EXAMINED 3; (SELECT MAX(c) FROM t1, t2) Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 12 rows, which exceeds LIMIT ROWS EXAMINED (3). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 3. The query result may be incomplete drop table t1, t2; MDEV-178: LIMIT ROWS EXAMINED: Assertion `0' failed in net_end_statement(THD*) on the @@ -856,12 +856,12 @@ EXECUTE ps; a 3 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 22 rows, which exceeds LIMIT ROWS EXAMINED (21). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 21. The query result may be incomplete EXECUTE ps; a 3 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 22 rows, which exceeds LIMIT ROWS EXAMINED (21). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 21. The query result may be incomplete drop view v; drop table t1, t2; # @@ -876,7 +876,7 @@ INSERT INTO t1 (k,c) VALUES(0,'0'), (0,'0'),(0,'0'),(0,'0'),(0,'0'),(0,'0'),(0,' SET @@sql_mode='STRICT_TRANS_TABLES'; INSERT INTO t1 (c) SELECT k FROM t1 LIMIT ROWS EXAMINED 2; Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3 rows, which exceeds LIMIT ROWS EXAMINED (2). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 2. The query result may be incomplete SET @@sql_mode=@old_mode; DROP TABLE t1; # diff --git a/mysql-test/main/limit_rows_examined.test b/mysql-test/main/limit_rows_examined.test index 2315580410f..16831a0cf5c 100644 --- a/mysql-test/main/limit_rows_examined.test +++ b/mysql-test/main/limit_rows_examined.test @@ -489,6 +489,7 @@ WHERE alias3.c IN ( SELECT 1 UNION SELECT 6 ) GROUP BY field1, field2, field3, field4, field5 LIMIT ROWS EXAMINED 120; +--disable_ps2_protocol FLUSH STATUS; SELECT a AS field1, alias2.d AS field2, alias2.f AS field3, alias2.e AS field4, b AS field5 FROM t1, t2 AS alias2, t2 AS alias3 @@ -506,6 +507,7 @@ GROUP BY field1, field2, field3, field4, field5 LIMIT ROWS EXAMINED 124; SHOW STATUS LIKE 'Handler_read%'; SHOW STATUS LIKE 'Handler_tmp%'; +--enable_ps2_protocol drop table t1, t2; @@ -550,10 +552,12 @@ INSERT INTO t2 VALUES (5, 0),(3, 4),(6, 1), (5, 8),(4, 9),(8, 1); +--disable_ps2_protocol SELECT (SELECT MAX(c) FROM t1, t2) FROM t2 WHERE c = (SELECT MAX(b) FROM t2) LIMIT ROWS EXAMINED 3; +--enable_ps2_protocol drop table t1, t2; diff --git a/mysql-test/main/loaddata.test b/mysql-test/main/loaddata.test index b1a7b323b8b..0a5e3c27007 100644 --- a/mysql-test/main/loaddata.test +++ b/mysql-test/main/loaddata.test @@ -36,6 +36,7 @@ drop table t1; # # Bug #12053 LOAD DATA INFILE ignores NO_AUTO_VALUE_ON_ZERO setting # +--disable_ps2_protocol SET @OLD_SQL_MODE=@@SQL_MODE, @@SQL_MODE=NO_AUTO_VALUE_ON_ZERO; create table t1(id integer not null auto_increment primary key); insert into t1 values(0); @@ -59,6 +60,7 @@ select * from t1; remove_file $MYSQLTEST_VARDIR/tmp/t1; SET @@SQL_MODE=@OLD_SQL_MODE; drop table t1; +--enable_ps2_protocol # # Bug #11203: LOAD DATA does not accept same characters for ESCAPED and @@ -92,7 +94,9 @@ INSERT INTO t1 (c1) VALUES SELECT * FROM t1; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/t1' FIELDS ENCLOSED BY 'r' FROM t1; +--enable_ps2_protocol cat_file $MYSQLTEST_VARDIR/tmp/t1; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR @@ -183,7 +187,9 @@ create table t1(f1 int); insert into t1 values(1),(null); create table t2(f2 int auto_increment primary key); disable_query_log; +--disable_ps2_protocol eval select * into outfile '$MYSQLTEST_VARDIR/tmp/t1' from t1; +--enable_ps2_protocol SET @OLD_SQL_MODE=@@SQL_MODE, @@SQL_MODE=NO_AUTO_VALUE_ON_ZERO; eval load data infile '$MYSQLTEST_VARDIR/tmp/t1' into table t2; enable_query_log; @@ -200,16 +206,20 @@ create table t1(f1 int, f2 timestamp not null default current_timestamp); create table t2(f1 int); insert into t2 values(1),(2); disable_query_log; +--disable_ps2_protocol eval select * into outfile '$MYSQLTEST_VARDIR/tmp/t2' from t2; +--enable_ps2_protocol eval load data infile '$MYSQLTEST_VARDIR/tmp/t2' ignore into table t1; enable_query_log; select f1 from t1 where f2 <> '0000-00-00 00:00:00' order by f1; remove_file $MYSQLTEST_VARDIR/tmp/t2; delete from t1; disable_query_log; +--disable_ps2_protocol eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/t2' FIELDS TERMINATED BY '' OPTIONALLY ENCLOSED BY '' LINES TERMINATED BY '\r\n' FROM t2; +--enable_ps2_protocol eval load data infile '$MYSQLTEST_VARDIR/tmp/t2' ignore into table t1 FIELDS TERMINATED BY '' OPTIONALLY ENCLOSED BY '' LINES TERMINATED BY '\r\n'; enable_query_log; @@ -228,7 +238,9 @@ INSERT INTO t1 (c1, c2, c3, c4) VALUES (10, '1970-02-01 01:02:03', 1.1E-100, 1.1 SELECT * FROM t1; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/t1' FIELDS ENCLOSED BY '-' FROM t1; +--enable_ps2_protocol cat_file $MYSQLTEST_VARDIR/tmp/t1; echo EOF; @@ -365,8 +377,10 @@ SET @OLD_SQL_MODE=@@SESSION.SQL_MODE; SET sql_mode = ''; +--disable_ps2_protocol --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval SELECT '1 \\\\aa\n' INTO DUMPFILE '$file' +--enable_ps2_protocol CREATE TABLE t1 (id INT, val1 CHAR(3)) ENGINE=MyISAM; @@ -378,13 +392,17 @@ SELECT * FROM t1; # show we can write this with OUTFILE, forcing the parameters for now --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT * INTO OUTFILE '$file2' FIELDS ESCAPED BY '' TERMINATED BY ' ' FROM t1 +--enable_ps2_protocol --diff_files $file $file2 --remove_file $file2 # now show the OUTFILE defaults are correct with NO_BACKSLASH_ESCAPES --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT * INTO OUTFILE '$file2' FIELDS TERMINATED BY ' ' FROM t1 +--enable_ps2_protocol --diff_files $file $file2 --remove_file $file2 @@ -417,7 +435,9 @@ INSERT INTO t1 (id, val1) VALUES (3, '\tx'); --echo 1.1 NO_BACKSLASH_ESCAPES, use defaults for ESCAPED BY --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT * INTO OUTFILE '$file' FIELDS TERMINATED BY ' ' FROM t1 ORDER BY id +--enable_ps2_protocol --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval LOAD DATA INFILE '$file' INTO TABLE t2 FIELDS TERMINATED BY ' ' @@ -439,7 +459,9 @@ eval SELECT LOAD_FILE("$file"); --echo 1.2 NO_BACKSLASH_ESCAPES, override defaults for ESCAPED BY --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT * INTO OUTFILE '$file' FIELDS ESCAPED BY '\' TERMINATED BY ' ' FROM t1 ORDER BY id +--enable_ps2_protocol --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval LOAD DATA INFILE '$file' INTO TABLE t2 FIELDS ESCAPED BY '\' TERMINATED BY ' ' @@ -465,7 +487,9 @@ SET sql_mode = ''; --echo 2.1 !NO_BACKSLASH_ESCAPES, use defaults for ESCAPED BY --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT * INTO OUTFILE '$file' FIELDS TERMINATED BY ' ' FROM t1 ORDER BY id +--enable_ps2_protocol --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval LOAD DATA INFILE '$file' INTO TABLE t2 FIELDS TERMINATED BY ' ' @@ -493,7 +517,9 @@ SET sql_mode = ''; --echo 2.2 !NO_BACKSLASH_ESCAPES, override defaults for ESCAPED BY --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT * INTO OUTFILE '$file' FIELDS ESCAPED BY '' TERMINATED BY ' ' FROM t1 ORDER BY id +--enable_ps2_protocol --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval LOAD DATA INFILE '$file' INTO TABLE t2 FIELDS ESCAPED BY '' TERMINATED BY ' ' @@ -544,7 +570,9 @@ INSERT INTO t1 VALUES (1); SET NAMES latin1; SET character_set_filesystem=filename; select @@character_set_filesystem; +--disable_ps2_protocol SELECT * INTO OUTFILE 't-1' FROM t1; +--enable_ps2_protocol DELETE FROM t1; LOAD DATA INFILE 't-1' INTO TABLE t1; SELECT * FROM t1; @@ -566,7 +594,9 @@ select @@character_set_filesystem; --echo # CREATE TABLE t1(col0 LONGBLOB); +--disable_ps2_protocol SELECT 'test' INTO OUTFILE 't1.txt'; +--enable_ps2_protocol LOAD DATA INFILE 't1.txt' IGNORE INTO TABLE t1 SET col0=col0; SELECT * FROM t1; @@ -635,7 +665,9 @@ disconnect con1; --echo # CREATE TABLE t1(f1 INT); +--disable_ps2_protocol EVAL SELECT 0xE1BB30 INTO OUTFILE 't1.dat'; +--enable_ps2_protocol --disable_warnings LOAD DATA INFILE 't1.dat' IGNORE INTO TABLE t1 CHARACTER SET utf8; --enable_warnings @@ -649,9 +681,11 @@ remove_file $MYSQLD_DATADIR/test/t1.dat; --echo # WHEN ERROR OCCURS --echo # +--disable_ps2_protocol --let $file=$MYSQLTEST_VARDIR/tmp/bug11735141.txt --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR --eval SELECT '1\n' INTO DUMPFILE '$file' +--enable_ps2_protocol create table t1(a point); --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR @@ -737,7 +771,9 @@ CREATE TABLE t1 (a INT, b INT, PRIMARY KEY (a), UNIQUE(b)); INSERT INTO t1 VALUES (1,1); CREATE TABLE t2 (c INT); CREATE VIEW v AS SELECT t1.* FROM t1 JOIN t2; +--disable_ps2_protocol SELECT a, b INTO OUTFILE '15645.data' FROM t1; +--enable_ps2_protocol --error ER_WRONG_USAGE LOAD DATA INFILE '15645.data' IGNORE INTO TABLE v (a,b); --error ER_WRONG_USAGE diff --git a/mysql-test/main/lock_multi.test b/mysql-test/main/lock_multi.test index 5cc7219b01d..a9a9341b82d 100644 --- a/mysql-test/main/lock_multi.test +++ b/mysql-test/main/lock_multi.test @@ -8,6 +8,7 @@ drop DATABASE if exists mysqltest_1; # Test to see if select will get the lock ahead of low priority update +--disable_ps2_protocol connect (locker,localhost,root,,); connect (locker2,localhost,root,,); connect (reader,localhost,root,,); @@ -87,6 +88,7 @@ select release_lock("mysqltest_lock"); connection writer; reap; drop table t1; +--enable_ps2_protocol # # Test problem when using locks with multi-updates diff --git a/mysql-test/main/log_slow.test b/mysql-test/main/log_slow.test index d2e314cf667..c92dc76a48a 100644 --- a/mysql-test/main/log_slow.test +++ b/mysql-test/main/log_slow.test @@ -44,6 +44,7 @@ show fields from mysql.slow_log; # # Check flush command # +--disable_ps2_protocol flush slow logs; @@ -115,6 +116,7 @@ select * from t; show session status like 'Slow_queries'; drop table t; +--enable_ps2_protocol --echo # --echo # End of 10.3 tests diff --git a/mysql-test/main/log_slow_innodb.test b/mysql-test/main/log_slow_innodb.test index 2cd2b654ee5..31eab5f414f 100644 --- a/mysql-test/main/log_slow_innodb.test +++ b/mysql-test/main/log_slow_innodb.test @@ -30,7 +30,9 @@ SET SESSION log_slow_verbosity='innodb,query_plan'; --let log_file=$log_slow_prefix-verbosity_1 --source include/log_slow_start.inc +--disable_ps2_protocol SELECT sum(a+b) FROM t1; +--enable_ps2_protocol UPDATE t1 set b=b+1 where a=1 or a=999; --source include/log_slow_stop.inc @@ -49,7 +51,9 @@ SET SESSION log_slow_verbosity='innodb,query_plan'; --let log_file=$log_slow_prefix-verbosity_2 --source include/log_slow_start.inc +--disable_ps2_protocol SELECT 1; +--enable_ps2_protocol --source include/log_slow_stop.inc --let log_slow_verbosity_expected_matches= 2 diff --git a/mysql-test/main/log_tables-big.test b/mysql-test/main/log_tables-big.test index fa8810ecd3b..0861c79126e 100644 --- a/mysql-test/main/log_tables-big.test +++ b/mysql-test/main/log_tables-big.test @@ -16,6 +16,7 @@ connect (con2,localhost,root,,); # # Bug #27638: slow logging to CSV table inserts bad query_time and lock_time values # +--disable_ps2_protocol connection con1; set session long_query_time=10; select get_lock('bug27638', 1); @@ -36,5 +37,6 @@ connection default; disconnect con1; disconnect con2; +--enable_ps2_protocol set @@global.log_output = @log_output.saved; diff --git a/mysql-test/main/log_tables.test b/mysql-test/main/log_tables.test index 22db93bd1ed..3ce49a21e7d 100644 --- a/mysql-test/main/log_tables.test +++ b/mysql-test/main/log_tables.test @@ -1052,12 +1052,14 @@ INSERT INTO t1 VALUES (2,2,2); INSERT INTO t1 VALUES (3,3,3); INSERT INTO t1 VALUES (4,4,4); +--disable_ps2_protocol SELECT SQL_NO_CACHE 'Bug#31700 - SCAN',f1,f2,f3,SLEEP(1.1) FROM t1 WHERE f3=4; SELECT SQL_NO_CACHE 'Bug#31700 - KEY', f1,f2,f3,SLEEP(1.1) FROM t1 WHERE f2=3; SELECT SQL_NO_CACHE 'Bug#31700 - PK', f1,f2,f3,SLEEP(1.1) FROM t1 WHERE f1=2; --replace_column 1 TIMESTAMP SELECT start_time, rows_examined, rows_sent, sql_text FROM mysql.slow_log WHERE sql_text LIKE '%Bug#31700%' ORDER BY start_time; +--enable_ps2_protocol DROP TABLE t1; diff --git a/mysql-test/main/long_unique_bugs.test b/mysql-test/main/long_unique_bugs.test index 6fc29e1d2dd..c7914d1e5dd 100644 --- a/mysql-test/main/long_unique_bugs.test +++ b/mysql-test/main/long_unique_bugs.test @@ -12,7 +12,9 @@ insert into t1 () values (),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(), (),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(), (),(),(),(); +--disable_ps2_protocol select * into outfile 'load.data' from t1; +--enable_ps2_protocol create temporary table tmp (a varchar(1024), b int, c int, d int, e linestring, unique (e)); load data infile 'load.data' into table tmp; delete from tmp; @@ -224,7 +226,9 @@ drop table t1; --echo # CREATE TABLE t1 (data VARCHAR(4), unique(data) using hash) with system versioning; INSERT INTO t1 VALUES ('A'); +--disable_ps2_protocol SELECT * INTO OUTFILE 'load.data' from t1; +--enable_ps2_protocol --error ER_DUP_ENTRY LOAD DATA INFILE 'load.data' INTO TABLE t1; select * from t1; @@ -238,7 +242,9 @@ DROP TABLE t1; CREATE TABLE t1 (data VARCHAR(7961)) ENGINE=InnoDB; INSERT INTO t1 VALUES ('f'), ('o'), ('o'); +--disable_ps2_protocol SELECT * INTO OUTFILE 'load.data' from t1; +--enable_ps2_protocol ALTER IGNORE TABLE t1 ADD UNIQUE INDEX (data); SELECT * FROM t1; @@ -472,7 +478,9 @@ drop table t2; --echo # create table t1 (pk int primary key, f blob, unique(f)) engine=innodb; insert t1 values (1, null); +--disable_ps2_protocol select * into outfile 't1.data' from t1; +--enable_ps2_protocol load data infile 't1.data' replace into table t1; select * from t1; drop table t1; diff --git a/mysql-test/main/lowercase_table2.opt b/mysql-test/main/lowercase_table2.opt new file mode 100644 index 00000000000..ac4d3211e89 --- /dev/null +++ b/mysql-test/main/lowercase_table2.opt @@ -0,0 +1 @@ +--lower-case-table-names=2 diff --git a/mysql-test/main/lowercase_table2.result b/mysql-test/main/lowercase_table2.result index 9194638a4d2..fe06fb671a2 100644 --- a/mysql-test/main/lowercase_table2.result +++ b/mysql-test/main/lowercase_table2.result @@ -14,7 +14,7 @@ SHOW CREATE TABLE T1; Table Create Table T1 CREATE TABLE `T1` ( `a` int(11) DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci RENAME TABLE T1 TO T2; SHOW TABLES LIKE "T2"; Tables_in_test (T2) @@ -70,7 +70,7 @@ SHOW CREATE TABLE T1; Table Create Table T1 CREATE TABLE `T1` ( `a` int(11) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=latin1 +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci RENAME TABLE T1 TO T2; SHOW TABLES LIKE "T2"; Tables_in_test (T2) @@ -319,18 +319,42 @@ Database (mysql_t%) mysql_TEST show create database mysql_test; Database Create Database -mysql_test CREATE DATABASE `mysql_test` /*!40100 DEFAULT CHARACTER SET latin1 */ +mysql_test CREATE DATABASE `mysql_test` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */ show create database mysql_TEST; Database Create Database -mysql_TEST CREATE DATABASE `mysql_TEST` /*!40100 DEFAULT CHARACTER SET latin1 */ +mysql_TEST CREATE DATABASE `mysql_TEST` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci */ show create table mysql_TEST.T1; Table Create Table T1 CREATE TABLE `T1` ( `a` int(11) DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci show create table mysql_test.t1; Table Create Table t1 CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop database mysql_TEST; +# MDEV-30765 SHOW TABLES not working properly with +# lower_case_table_names=2 +# +create database db1; +use db1; +# lowercase table name +create table `a` (a int); +# uppercase table name +create table `B` (a int); +create user 'mysqltest_1'@'localhost' identified by 'password'; +grant select, show view on db1.`a` to 'mysqltest_1'@'localhost'; +grant select, show view on db1.`B` to 'mysqltest_1'@'localhost'; +connect conn1, localhost, mysqltest_1, password, test; +connection conn1; +use db1; +show tables; +Tables_in_db1 +B +a +connection default; +disconnect conn1; +drop user 'mysqltest_1'@'localhost'; +drop tables a, B; +drop database db1; diff --git a/mysql-test/main/lowercase_table2.test b/mysql-test/main/lowercase_table2.test index 601089ca760..82c07bf9345 100644 --- a/mysql-test/main/lowercase_table2.test +++ b/mysql-test/main/lowercase_table2.test @@ -288,3 +288,29 @@ show create database mysql_TEST; show create table mysql_TEST.T1; show create table mysql_test.t1; drop database mysql_TEST; + +--echo # MDEV-30765 SHOW TABLES not working properly with +--echo # lower_case_table_names=2 +--echo # +create database db1; +use db1; +--echo # lowercase table name +create table `a` (a int); +--echo # uppercase table name +create table `B` (a int); + +create user 'mysqltest_1'@'localhost' identified by 'password'; + +grant select, show view on db1.`a` to 'mysqltest_1'@'localhost'; +grant select, show view on db1.`B` to 'mysqltest_1'@'localhost'; + +connect (conn1, localhost, mysqltest_1, password, test); +connection conn1; +use db1; +show tables; + +connection default; +disconnect conn1; +drop user 'mysqltest_1'@'localhost'; +drop tables a, B; +drop database db1; \ No newline at end of file diff --git a/mysql-test/main/merge.test b/mysql-test/main/merge.test index 76903e27ae9..aacfdd686d8 100644 --- a/mysql-test/main/merge.test +++ b/mysql-test/main/merge.test @@ -2001,7 +2001,9 @@ BEGIN RETURN (SELECT MAX(c1) FROM tm1); END| DELIMITER ;| +--disable_ps2_protocol SELECT f1() FROM (SELECT 1 UNION SELECT 1) c1; +--enable_ps2_protocol DROP FUNCTION f1; DROP TABLE tm1, t1, t2; # diff --git a/mysql-test/main/myisam.result b/mysql-test/main/myisam.result index 0b0099d7b84..4d79a85163f 100644 --- a/mysql-test/main/myisam.result +++ b/mysql-test/main/myisam.result @@ -2414,13 +2414,13 @@ DROP TABLE t1; set statement sql_mode='' for create table t1 (n int not null, c char(1)) transactional=1; Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' +Warning 1911 Unknown option 'transactional' show create table t1; Table Create Table t1 CREATE TABLE `t1` ( `n` int(11) NOT NULL, `c` char(1) DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci TRANSACTIONAL=1 +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci /* TRANSACTIONAL=1 */ drop table t1; CREATE TABLE t1 (line LINESTRING NOT NULL) engine=myisam; INSERT INTO t1 VALUES (GeomFromText("LINESTRING(0 0)")); @@ -2555,9 +2555,6 @@ INSERT INTO t1 VALUES ('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'), ('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'), ('0'),('0'),('0'),('0'),('0'),('0'),('0'); -Warnings: -Error 1034 myisam_sort_buffer_size is too small. X -Warning 1034 Number of rows changed from 0 to 157 SET myisam_sort_buffer_size=@@global.myisam_sort_buffer_size; INSERT INTO t1 VALUES('1'); SELECT * FROM t1, t1 AS a1 WHERE t1.a=1 AND a1.a=1; diff --git a/mysql-test/main/myisam_mrr.test b/mysql-test/main/myisam_mrr.test index 11c9aa64ef1..66188622a82 100644 --- a/mysql-test/main/myisam_mrr.test +++ b/mysql-test/main/myisam_mrr.test @@ -273,6 +273,7 @@ drop table t1; --echo # --echo # Test of MRR handler counters --echo # +--disable_ps2_protocol flush status; show status like 'Handler_mrr%'; create table t0 (a int); @@ -321,6 +322,7 @@ show status like 'handler_mrr%'; set join_cache_level= @join_cache_level_save; set join_buffer_size= @join_buffer_size_save; +--enable_ps2_protocol drop table t0, t1; diff --git a/mysql-test/main/mysqldump.result b/mysql-test/main/mysqldump.result index 0a84b89b687..c4419bdaa51 100644 --- a/mysql-test/main/mysqldump.result +++ b/mysql-test/main/mysqldump.result @@ -6491,6 +6491,7 @@ END utf8mb3 utf8mb3_general_ci latin1_swedish_ci DROP DATABASE test1; DROP DATABASE test2; SET sql_mode=@save_sql_mode; +use test; # # MDEV-4875 Can't restore a mysqldump if --add-drop-database meets general_log # @@ -6584,4 +6585,67 @@ TABLE 1 SET GLOBAL LOG_OUTPUT=DEFAULT, GLOBAL GENERAL_LOG=@save_general_log; TRUNCATE TABLE mysql.general_log; DROP DATABASE test1; +# # End of 10.3 tests +# +# +# MDEV-31092 mysqldump --force doesn't ignore error as it should +# +create function f1() returns int return 1; +create function f2() returns int return 2; +update mysql.proc set body='return no_such_var' where db='test' and name='f1'; +create event e1 on schedule every 1 year starts '2030-01-01' do select 1; +Warnings: +Warning 1105 Event scheduler is switched off, use SET GLOBAL event_scheduler=ON to enable it. +update mysql.event set body ='select not_a_value' where db='test' and name='e1'; +create table t1 (i int); +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `t1` ( + `i` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci; +/*!40101 SET character_set_client = @saved_cs_client */; +mariadb-dump: Couldn't execute 'SHOW CREATE FUNCTION `f1`': Undeclared variable: no_such_var (1327) +/*!50106 SET @save_time_zone= @@TIME_ZONE */ ; +DELIMITER ;; +/*!50003 SET @saved_cs_client = @@character_set_client */ ;; +/*!50003 SET @saved_cs_results = @@character_set_results */ ;; +/*!50003 SET @saved_col_connection = @@collation_connection */ ;; +/*!50003 SET character_set_client = utf8mb3 */ ;; +/*!50003 SET character_set_results = utf8mb3 */ ;; +/*!50003 SET collation_connection = utf8mb3_general_ci */ ;; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ;; +/*!50003 SET sql_mode = '' */ ;; +/*!50003 SET @saved_time_zone = @@time_zone */ ;; +/*!50003 SET time_zone = 'SYSTEM' */ ;; +/*!50106 CREATE*/ /*!50117 DEFINER=`root`@`localhost`*/ /*!50106 EVENT `e1` ON SCHEDULE EVERY 1 YEAR STARTS '2030-01-01 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO select not_a_value */ ;; +/*!50003 SET time_zone = @saved_time_zone */ ;; +/*!50003 SET sql_mode = @saved_sql_mode */ ;; +/*!50003 SET character_set_client = @saved_cs_client */ ;; +/*!50003 SET character_set_results = @saved_cs_results */ ;; +/*!50003 SET collation_connection = @saved_col_connection */ ;; +DELIMITER ; +/*!50106 SET TIME_ZONE= @save_time_zone */ ; +/*!50003 SET @saved_sql_mode = @@sql_mode */ ; +/*!50003 SET sql_mode = '' */ ; +/*!50003 SET @saved_cs_client = @@character_set_client */ ; +/*!50003 SET @saved_cs_results = @@character_set_results */ ; +/*!50003 SET @saved_col_connection = @@collation_connection */ ; +/*!50003 SET character_set_client = utf8mb3 */ ; +/*!50003 SET character_set_results = utf8mb3 */ ; +/*!50003 SET collation_connection = utf8mb3_general_ci */ ; +DELIMITER ;; +CREATE DEFINER=`root`@`localhost` FUNCTION `f2`() RETURNS int(11) +return 2 ;; +DELIMITER ; +/*!50003 SET sql_mode = @saved_sql_mode */ ; +/*!50003 SET character_set_client = @saved_cs_client */ ; +/*!50003 SET character_set_results = @saved_cs_results */ ; +/*!50003 SET collation_connection = @saved_col_connection */ ; +drop function f1; +drop function f2; +drop event e1; +drop table t1; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/mysqldump.test b/mysql-test/main/mysqldump.test index 238d90e4cdc..995f32681cc 100644 --- a/mysql-test/main/mysqldump.test +++ b/mysql-test/main/mysqldump.test @@ -2813,6 +2813,7 @@ drop database d; --echo # MDEV-21786: --echo # mysqldump will forget sequence definition details on --no-data dump --echo # +--disable_ps2_protocol create database d; CREATE SEQUENCE d.s1 START WITH 100 INCREMENT BY 10 MINVALUE=100 MAXVALUE=1100 CYCLE; @@ -2863,6 +2864,7 @@ show create sequence d2.s1; drop sequence d.s1, d.s2, d.s3, d.s4; drop database d; drop database d2; +--enable_ps2_protocol --echo # --echo # MDEV-20070 @@ -2922,6 +2924,7 @@ DROP DATABASE test1; DROP DATABASE test2; SET sql_mode=@save_sql_mode; --remove_file $MYSQLTEST_VARDIR/tmp/dumptest1.sql +use test; --echo # --echo # MDEV-4875 Can't restore a mysqldump if --add-drop-database meets general_log @@ -2982,4 +2985,27 @@ TRUNCATE TABLE mysql.general_log; DROP DATABASE test1; --remove_file $MYSQLTEST_VARDIR/tmp/dumptest1.sql +--echo # --echo # End of 10.3 tests +--echo # + +--echo # +--echo # MDEV-31092 mysqldump --force doesn't ignore error as it should +--echo # +create function f1() returns int return 1; +create function f2() returns int return 2; +update mysql.proc set body='return no_such_var' where db='test' and name='f1'; +create event e1 on schedule every 1 year starts '2030-01-01' do select 1; +update mysql.event set body ='select not_a_value' where db='test' and name='e1'; +create table t1 (i int); +--replace_result mariadb-dump.exe mariadb-dump +--error 2 +--exec $MYSQL_DUMP --compact --events --routines --force test 2>&1 +drop function f1; +drop function f2; +drop event e1; +drop table t1; + +--echo # +--echo # End of 10.4 tests +--echo # diff --git a/mysql-test/main/mysqltest_tracking_info.result b/mysql-test/main/mysqltest_tracking_info.result index 791f2a2b4a4..5436dd87122 100644 --- a/mysql-test/main/mysqltest_tracking_info.result +++ b/mysql-test/main/mysqltest_tracking_info.result @@ -58,6 +58,36 @@ SET SESSION session_track_system_variables=NULL; ERROR 42000: Variable 'session_track_system_variables' can't be set to the value of 'NULL' # End of 10.3 tests # +# MDEV-25237: crash after setting global session_track_system_variables +# to an invalid value +# +SET GLOBAL session_track_system_variables='a'; +ERROR HY000: Unknown system variable 'a' +SET GLOBAL event_scheduler=1; +# check that value really returns as it was +set GLOBAL session_track_system_variables='character_set_connection'; +SET GLOBAL session_track_system_variables='a'; +ERROR HY000: Unknown system variable 'a' +connect con,localhost,root,,test; +SET NAMES 'utf8'; +-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES +-- character_set_connection +-- utf8mb3 + +SET NAMES 'big5'; +-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES +-- character_set_connection +-- big5 + +select @@session_track_system_variables; +@@session_track_system_variables +character_set_connection +connection default; +disconnect con; +SET GLOBAL session_track_system_variables=default; +SET GLOBAL event_scheduler=default; +# End of 10.4 test +# # MDEV-16470 - Session user variables tracker # # End of 10.5 tests diff --git a/mysql-test/main/mysqltest_tracking_info.test b/mysql-test/main/mysqltest_tracking_info.test index 2be3e9344b9..8f5e0954c40 100644 --- a/mysql-test/main/mysqltest_tracking_info.test +++ b/mysql-test/main/mysqltest_tracking_info.test @@ -61,6 +61,38 @@ SET SESSION session_track_system_variables=NULL; --echo # End of 10.3 tests +--echo # +--echo # MDEV-25237: crash after setting global session_track_system_variables +--echo # to an invalid value +--echo # + +--error ER_UNKNOWN_SYSTEM_VARIABLE +SET GLOBAL session_track_system_variables='a'; +SET GLOBAL event_scheduler=1; + + +--echo # check that value really returns as it was + +set GLOBAL session_track_system_variables='character_set_connection'; +--error ER_UNKNOWN_SYSTEM_VARIABLE +SET GLOBAL session_track_system_variables='a'; + +connect (con,localhost,root,,test); +--enable_session_track_info +SET NAMES 'utf8'; +SET NAMES 'big5'; +--disable_session_track_info + +select @@session_track_system_variables; + +connection default; +disconnect con; + +SET GLOBAL session_track_system_variables=default; +SET GLOBAL event_scheduler=default; + +--echo # End of 10.4 test + --echo # --echo # MDEV-16470 - Session user variables tracker --echo # diff --git a/mysql-test/main/mysqltest_tracking_info_debug.result b/mysql-test/main/mysqltest_tracking_info_debug.result new file mode 100644 index 00000000000..39d17c7ca34 --- /dev/null +++ b/mysql-test/main/mysqltest_tracking_info_debug.result @@ -0,0 +1,21 @@ +set @save_session_track_system_variables=@@session_track_system_variables; +# +# MDEV-25237: Assertion `global_system_variables. +# session_track_system_variables' failed in +# Session_sysvars_tracker::init | SIGSEGV's in __strlen_avx2 | +# UBSAN: runtime error: null pointer passed as argument 1, which +# is declared to never be null in my_strdup +# +# check that that parser problems do not lead to crash +SET @old_debug= @@session.debug; +set debug_dbug="+d,dbug_session_tracker_parse_error"; +SET GLOBAL session_track_system_variables='query_cache_size'; +ERROR HY001: Out of memory; restart server and try again (needed 1 bytes) +set debug_dbug=@old_debug; +SELECT @@global.session_track_system_variables; +@@global.session_track_system_variables +NULL +SET GLOBAL event_scheduler=1; +SET GLOBAL session_track_system_variables=default; +SET GLOBAL event_scheduler=default; +# End of 10.4 test diff --git a/mysql-test/main/mysqltest_tracking_info_debug.test b/mysql-test/main/mysqltest_tracking_info_debug.test new file mode 100644 index 00000000000..1699801f318 --- /dev/null +++ b/mysql-test/main/mysqltest_tracking_info_debug.test @@ -0,0 +1,30 @@ + +--source include/have_debug.inc +--source include/no_protocol.inc +--source include/not_embedded.inc + + +set @save_session_track_system_variables=@@session_track_system_variables; + +--echo # +--echo # MDEV-25237: Assertion `global_system_variables. +--echo # session_track_system_variables' failed in +--echo # Session_sysvars_tracker::init | SIGSEGV's in __strlen_avx2 | +--echo # UBSAN: runtime error: null pointer passed as argument 1, which +--echo # is declared to never be null in my_strdup +--echo # + +--echo # check that that parser problems do not lead to crash +SET @old_debug= @@session.debug; +set debug_dbug="+d,dbug_session_tracker_parse_error"; +--error ER_OUTOFMEMORY +SET GLOBAL session_track_system_variables='query_cache_size'; +set debug_dbug=@old_debug; +SELECT @@global.session_track_system_variables; + +SET GLOBAL event_scheduler=1; + +SET GLOBAL session_track_system_variables=default; +SET GLOBAL event_scheduler=default; + +--echo # End of 10.4 test diff --git a/mysql-test/main/nested_profiling.test b/mysql-test/main/nested_profiling.test index ba89aefc647..eff348ea5dd 100644 --- a/mysql-test/main/nested_profiling.test +++ b/mysql-test/main/nested_profiling.test @@ -29,7 +29,9 @@ SET GLOBAL profiling=on; create user mysqltest1@localhost; connect (con1,localhost,mysqltest1,,); connection con1; +--disable_ps2_protocol SELECT @a, @b; +--enable_ps2_protocol --replace_column 2 # SHOW PROFILES; diff --git a/mysql-test/main/null.test b/mysql-test/main/null.test index 3741ec0f8ea..9c8b01c8a9c 100644 --- a/mysql-test/main/null.test +++ b/mysql-test/main/null.test @@ -1086,6 +1086,7 @@ DROP TABLE t1; # Testing with side effects +--disable_ps2_protocol CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1),(2),(3); SET @a=0; @@ -1094,6 +1095,7 @@ SELECT @a; SET @a=0; SELECT NULLIF(AVG(a),0), NULLIF(AVG(LAST_VALUE(@a:=@a+1,a)),0) FROM t1; SELECT @a; +--enable_ps2_protocol # There should not be cache in here: diff --git a/mysql-test/main/null_key.test b/mysql-test/main/null_key.test index 7eabd6d5dc3..0759e99b524 100644 --- a/mysql-test/main/null_key.test +++ b/mysql-test/main/null_key.test @@ -233,6 +233,7 @@ SELECT COUNT(*) FROM t3; EXPLAIN SELECT SQL_CALC_FOUND_ROWS * FROM t1 LEFT JOIN t2 ON t1.a=t2.a LEFT JOIN t3 ON t2.b=t3.b; FLUSH STATUS ; +--disable_ps2_protocol SELECT SQL_CALC_FOUND_ROWS * FROM t1 LEFT JOIN t2 ON t1.a=t2.a LEFT JOIN t3 ON t2.b=t3.b; @@ -240,6 +241,7 @@ SELECT SQL_CALC_FOUND_ROWS * FROM t1 LEFT JOIN t2 ON t1.a=t2.a SELECT FOUND_ROWS(); SHOW STATUS LIKE "handler_read%"; --enable_view_protocol +--enable_ps2_protocol DROP TABLE t1,t2,t3,t4; # End of 4.1 tests diff --git a/mysql-test/main/odbc.test b/mysql-test/main/odbc.test index f1d60e15bc8..4a125bfc72e 100644 --- a/mysql-test/main/odbc.test +++ b/mysql-test/main/odbc.test @@ -18,8 +18,11 @@ select {fn length("hello")}, { date "1997-10-20" }; create table t1 (a int not null auto_increment,b int not null,primary key (a,b)); insert into t1 SET A=NULL,B=1; insert into t1 SET a=null,b=2; +#Enable after fix MDEV-31307 +--disable_ps2_protocol select * from t1 where a is null and b=2; select * from t1 where a is null; +--enable_ps2_protocol explain select * from t1 where b is null; drop table t1; @@ -28,8 +31,11 @@ drop table t1; # CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY); INSERT INTO t1 VALUES (NULL); +#Enable after fix MDEV-31307 +--disable_ps2_protocol SELECT sql_no_cache a, last_insert_id() FROM t1 WHERE a IS NULL; SELECT sql_no_cache a, last_insert_id() FROM t1 WHERE a IS NULL; +--enable_ps2_protocol SELECT sql_no_cache a, last_insert_id() FROM t1; DROP TABLE t1; diff --git a/mysql-test/main/olap.test b/mysql-test/main/olap.test index 59c30da52ca..9e4f15d50da 100644 --- a/mysql-test/main/olap.test +++ b/mysql-test/main/olap.test @@ -453,6 +453,7 @@ DROP TABLE t; --echo # MDEV-14041 Server crashes in String::length on queries with functions and ROLLUP --echo # +--disable_ps2_protocol #enable view protocol after fix MDEV-28538 --disable_view_protocol @@ -463,6 +464,7 @@ SELECT HEX( RELEASE_LOCK( 'foo' ) ) AS f FROM t1 GROUP BY f WITH ROLLUP; DROP TABLE t1; --enable_view_protocol +--enable_ps2_protocol CREATE TABLE t1 (i INT); INSERT INTO t1 VALUES (1),(2); diff --git a/mysql-test/main/opt_trace.result b/mysql-test/main/opt_trace.result index 1c138e81b02..52412b75d84 100644 --- a/mysql-test/main/opt_trace.result +++ b/mysql-test/main/opt_trace.result @@ -7516,8 +7516,8 @@ set optimizer_trace='enabled=on'; explain select * from t1 force index (a_b) where a=2 and b=4; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref a_b a_b 10 const,const 1 Using index -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7545,8 +7545,8 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) explain select * from t1 where a >= 900 and b between 10 and 20; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range a_b a_b 10 NULL 107 Using where; Using index -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7577,8 +7577,8 @@ insert into t1 select date_add(now(), interval a day), date_add(now(), interval explain select * from t1 force index(start_date) where start_date >= '2019-02-10' and end_date <'2019-04-01'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range start_date start_date 8 NULL 1000 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7617,8 +7617,8 @@ insert into t1 select a,a, a,a from ten; explain select * from t1 force index(a_b_c) where a between 1 and 4 and b < 50; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 range a_b_c a_b_c 8 NULL 4 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7651,8 +7651,8 @@ INSERT INTO t1 VALUES (2, NULL); EXPLAIN SELECT * FROM t1 WHERE b IN (0xD95B94336A9946A39CF5B58CFE772D8C); id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 17 const 1 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7680,8 +7680,8 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) EXPLAIN SELECT * FROM t1 WHERE b IS NULL; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 17 const 1 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7717,8 +7717,8 @@ set optimizer_trace=1; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 13 const 1 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7747,8 +7747,8 @@ ALTER TABLE t1 modify column b BINARY(10) AFTER i; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 11 const 1 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7777,8 +7777,8 @@ ALTER TABLE t1 modify column b VARBINARY(10) AFTER i; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 13 const 1 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7810,8 +7810,8 @@ INSERT INTO t1 VALUES (2, NULL); EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 11 const 1 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7846,8 +7846,8 @@ set optimizer_trace=1; EXPLAIN SELECT * FROM t1 WHERE b= 'ab\n'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 1003 const 1 Using where -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7880,8 +7880,8 @@ set optimizer_trace=1; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref i_b i_b 13 const 2 Using index condition -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7935,8 +7935,8 @@ EXPLAIN ] } } -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -7994,8 +7994,8 @@ explain select * from t0 A, one_k B where A.a<5 and B.a<800; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE A ALL NULL NULL NULL NULL 10 Using where 1 SIMPLE B ALL NULL NULL NULL NULL 1000 Using where -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8088,8 +8088,8 @@ explain select * from t0 A, one_k B where A.a=B.b and B.a<800; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE A ALL NULL NULL NULL NULL 10 Using where 1 SIMPLE B ref b b 5 test.A.a 1 Using where -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8198,8 +8198,8 @@ id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ref a a 258 const 1 Using where SELECT * FROM t1 WHERE a= REPEAT('a', 0); a -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -8260,8 +8260,8 @@ insert into t1 values (1,1),(1,5),(5,1),(5,5); set optimizer_trace=1; select * from t1 force index(kp1) where (kp1=2 and kp2 >=4); kp1 kp2 -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8290,8 +8290,8 @@ EXPLAIN SELECT * FROM t1, t2 WHERE t1.a=t2.a ORDER BY t2.b; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL a NULL NULL NULL 10 Using where; Using temporary; Using filesort 1 SIMPLE t2 ref a a 5 test.t1.a 1 -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8445,8 +8445,8 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 100 0.25 Using where Warnings: Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` between 1 and 5 and `test`.`t1`.`b` <= 5 -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8468,8 +8468,8 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 100 99.00 Using where Warnings: Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`a` <> 5 -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8488,8 +8488,8 @@ id select_type table type possible_keys key key_len ref rows filtered Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 100 15.00 Using where Warnings: Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1` where `test`.`t1`.`b` >= 10 and `test`.`t1`.`b` < 25 -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8510,8 +8510,8 @@ SELECT sum(b), row_number() OVER (order by b) FROM t1 WHERE a = 101; sum(b) row_number() OVER (order by b) NULL 1 UPDATE t1 SET b=10 WHERE a=1; -SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ [ { @@ -8581,6 +8581,55 @@ SELECT a FROM t1 WHERE (a,b) in (SELECT @c,@d); a DROP TABLE t1; # +# MDEV-30964: MAX_SEL_ARG memory exhaustion is not visible in the optimizer trace +# +create table t1 ( +c1 int, +c2 int, +c3 int, +c4 int, +c5 int, +c6 int, +c7 int, +c8 int, +key(c1,c2,c3,c4,c5,c6,c7,c8) +); +insert into t1 () values (),(),(); +explain select * +from t1 +where +(c1 in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) and c2=1) and +c3 in (1,2,3,4,5,6,7,8,9,10) and +c4 in (1,2,3,4,5,6,7,8,9,10) and +c5 in (1,2,3,4,5,6,7,8,9,10) and +c6 in (1,2,3,4); +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index c1 c1 40 NULL 3 Using where; Using index +select +json_detailed(json_extract(trace, '$**.setup_range_conditions')) +from +information_schema.optimizer_trace; +json_detailed(json_extract(trace, '$**.setup_range_conditions')) +[ + [ + { + "enforce_sel_arg_weight_limit": + { + "index": "c1", + "old_weight": 74806, + "new_weight": 1776 + } + }, + { + "sel_arg_alloc_limit_hit": + { + "alloced_sel_args": 16001 + } + } + ] +] +drop table t1; +# # MDEV-31085: multi-update using view with optimizer trace enabled # SET SESSION optimizer_trace = 'enabled=on'; diff --git a/mysql-test/main/opt_trace.test b/mysql-test/main/opt_trace.test index 07e0694cf7a..36e507a4ac0 100644 --- a/mysql-test/main/opt_trace.test +++ b/mysql-test/main/opt_trace.test @@ -24,6 +24,7 @@ create view v2 as select * from t1 where t1.a=1 group by t1.b; set optimizer_trace="enabled=on"; --echo # Mergeable views/derived tables +--disable_ps2_protocol --disable_view_protocol select * from v1; select * from information_schema.OPTIMIZER_TRACE; @@ -34,6 +35,7 @@ select * from information_schema.OPTIMIZER_TRACE; select * from v2; select * from information_schema.OPTIMIZER_TRACE; --enable_view_protocol +--enable_ps2_protocol drop table t1,t2; drop view v1,v2; drop function f1; @@ -411,13 +413,11 @@ create table t1 ( a int, b int, key a_b(a,b)); insert into t1 select a,a from one_k; set optimizer_trace='enabled=on'; -#enable after fix MDEV-27871 ---disable_view_protocol explain select * from t1 force index (a_b) where a=2 and b=4; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; explain select * from t1 where a >= 900 and b between 10 and 20; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t0,t1; @@ -426,7 +426,7 @@ create table t1 (start_date date, end_date date, filler char(100), key(start_dat insert into t1 select date_add(now(), interval a day), date_add(now(), interval (a+7) day), 'data' from one_k; --enable_warnings explain select * from t1 force index(start_date) where start_date >= '2019-02-10' and end_date <'2019-04-01'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1,one_k; create table ten(a int); @@ -441,7 +441,7 @@ create table t1 ( insert into t1 select a,a, a,a from ten; explain select * from t1 force index(a_b_c) where a between 1 and 4 and b < 50; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table ten,t1; --echo # Ported test from MYSQL for ranges involving Binary column @@ -451,10 +451,10 @@ INSERT INTO t1 VALUES (1, x'D95B94336A9946A39CF5B58CFE772D8C'); INSERT INTO t1 VALUES (2, NULL); EXPLAIN SELECT * FROM t1 WHERE b IN (0xD95B94336A9946A39CF5B58CFE772D8C); -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; EXPLAIN SELECT * FROM t1 WHERE b IS NULL; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; @@ -467,22 +467,22 @@ INSERT INTO t1 VALUES (1, 'ab\n'); INSERT INTO t1 VALUES (2, NULL); set optimizer_trace=1; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ALTER TABLE t1 modify column b BINARY(10) AFTER i; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ALTER TABLE t1 modify column b VARBINARY(10) AFTER i; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; CREATE TABLE t1(i INT PRIMARY KEY, b CHAR(10), INDEX i_b(b)); INSERT INTO t1 VALUES (1, 'ab\n'); INSERT INTO t1 VALUES (2, NULL); EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; CREATE TABLE t1(i INT PRIMARY KEY, b blob , INDEX i_b(b)); @@ -490,7 +490,7 @@ INSERT INTO t1 VALUES (1, 'ab\n'); INSERT INTO t1 VALUES (2, NULL); set optimizer_trace=1; EXPLAIN SELECT * FROM t1 WHERE b= 'ab\n'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; CREATE TABLE t1(i INT PRIMARY KEY, b VARCHAR(10), INDEX i_b(b)); @@ -498,7 +498,7 @@ INSERT INTO t1 VALUES (1, 'ab\n'); INSERT INTO t1 VALUES (2, 'ab\n'); set optimizer_trace=1; EXPLAIN SELECT * FROM t1 WHERE b='ab\n'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; create table t0(a int); insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); @@ -509,9 +509,8 @@ create table t1 (start_date date, end_date date, filler char(100), key(start_dat insert into t1 select date_add(now(), interval a day), date_add(now(), interval (a+7) day), 'data' from one_k; --enable_warnings explain format=json select * from t1 force index(start_date) where start_date >= '2019-02-10' and end_date <'2019-04-01'; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1, t0, one_k; ---enable_view_protocol --echo # --echo # MDEV-19776: Assertion `to_len >= 8' failed in convert_to_printable with optimizer trace enabled @@ -541,18 +540,15 @@ set optimizer_trace=1; --echo # (cost_for_plan is the same as best_access_path.cost for single-table SELECTs --echo # but for joins using condition selectivity it is not as trivial. So, --echo # now we are printing it) -#enable after fix MDEV-27871 ---disable_view_protocol explain select * from t0 A, one_k B where A.a<5 and B.a<800; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; set join_cache_level=@tmp_jcl; --echo # This shows post-join selectivity explain select * from t0 A, one_k B where A.a=B.b and B.a<800; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t0, one_k; ---enable_view_protocol --echo # --echo # Assertion `to_len >= 8' failed in convert_to_printable @@ -564,9 +560,7 @@ insert into t1 values ('foo'), ('bar'); EXPLAIN SELECT * FROM t1 WHERE a= REPEAT('a', 0); SELECT * FROM t1 WHERE a= REPEAT('a', 0); #enable after fix MDEV-27871 ---disable_view_protocol -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ---enable_view_protocol +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; DROP TABLE t1; --echo # @@ -597,9 +591,7 @@ insert into t1 values (1,1),(1,5),(5,1),(5,5); set optimizer_trace=1; select * from t1 force index(kp1) where (kp1=2 and kp2 >=4); #enable after fix MDEV-27871 ---disable_view_protocol -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ---enable_view_protocol +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; --echo # @@ -612,12 +604,10 @@ CREATE TABLE t2(a INT, b INT, key(a)); INSERT INTO t2 SELECT seq, seq from seq_1_to_100; #enable after fix MDEV-27871 ---disable_view_protocol SET OPTIMIZER_TRACE=1; EXPLAIN SELECT * FROM t1, t2 WHERE t1.a=t2.a ORDER BY t2.b; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; DROP TABLE t1,t2; ---enable_view_protocol --echo # --echo # MDEV-22665: Print ranges in the optimizer trace created for non-indexed columns when @@ -628,15 +618,12 @@ CREATE TABLE t1(a INT, b INT); INSERT INTO t1 SELECT seq, seq from seq_1_to_100; SET optimizer_trace=1; ANALYZE TABLE t1 PERSISTENT FOR ALL; -#enable after fix MDEV-27871 ---disable_view_protocol EXPLAIN EXTENDED SELECT * from t1 WHERE a between 1 and 5 and b <= 5; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; EXPLAIN EXTENDED SELECT * from t1 WHERE a != 5; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; EXPLAIN EXTENDED SELECT * from t1 WHERE b >= 10 and b < 25; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ---enable_view_protocol +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; --echo # @@ -647,10 +634,7 @@ drop table t1; CREATE TABLE t1( a INT, b INT, PRIMARY KEY( a ) ); SELECT sum(b), row_number() OVER (order by b) FROM t1 WHERE a = 101; UPDATE t1 SET b=10 WHERE a=1; -#enable after fix MDEV-27871 ---disable_view_protocol -SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ---enable_view_protocol +SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; DROP TABLE t1; set optimizer_trace='enabled=off'; @@ -685,6 +669,39 @@ INSERT INTO t1 VALUES (0,0); SELECT a FROM t1 WHERE (a,b) in (SELECT @c,@d); DROP TABLE t1; + +--echo # +--echo # MDEV-30964: MAX_SEL_ARG memory exhaustion is not visible in the optimizer trace +--echo # +create table t1 ( + c1 int, + c2 int, + c3 int, + c4 int, + c5 int, + c6 int, + c7 int, + c8 int, + key(c1,c2,c3,c4,c5,c6,c7,c8) +); +insert into t1 () values (),(),(); + +explain select * +from t1 +where + (c1 in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) and c2=1) and + c3 in (1,2,3,4,5,6,7,8,9,10) and + c4 in (1,2,3,4,5,6,7,8,9,10) and + c5 in (1,2,3,4,5,6,7,8,9,10) and + c6 in (1,2,3,4); + +select + json_detailed(json_extract(trace, '$**.setup_range_conditions')) +from + information_schema.optimizer_trace; + +drop table t1; + --echo # --echo # MDEV-31085: multi-update using view with optimizer trace enabled --echo # @@ -759,6 +776,15 @@ select * from from t10 left join t11 on t11.col1=t10.col1 group by grp_id) T on T.grp_id=t1.b; +# Enable after fix MDEV-31408 +# On the first creation of the view from information_schema.optimizer_trace +# everything is fine, but on the second creation of the view is +# from information_schema.optimizer_trace the result of select +# from this view is already returned NULL. +# That's why view-protocol is disabled here + +--disable_view_protocol + select json_detailed(json_extract(trace, '$**.check_split_materialized')) as JS from information_schema.optimizer_trace; @@ -771,6 +797,7 @@ select ) as JS from information_schema.optimizer_trace; +--enable_view_protocol drop table t1,t2,t3,t10,t11; set optimizer_trace=DEFAULT; diff --git a/mysql-test/main/opt_trace_index_merge.result b/mysql-test/main/opt_trace_index_merge.result index 1ef7565690e..becadeeb460 100644 --- a/mysql-test/main/opt_trace_index_merge.result +++ b/mysql-test/main/opt_trace_index_merge.result @@ -308,8 +308,8 @@ set optimizer_trace='enabled=on'; explain select key1,key2,key3 from t1 where key1=100 and key2=100 and key3=100; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index_merge key1,key2,key3 key1,key2,key3 5,5,5 NULL 2 Using intersect(key1,key2,key3); Using where; Using index -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -402,8 +402,8 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) [] } ] -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_access_plan": @@ -447,8 +447,8 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) explain select key1,key2,key3,key4 from t1 where key1=100 and key2=100 or key3=100 and key4=100; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 index_merge key1,key2,key3,key4 key1,key2,key3,key4 5,5,5,5 NULL 154 Using union(intersect(key1,key2),intersect(key3,key4)); Using where -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": @@ -624,8 +624,8 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) ] } ] -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_access_plan": diff --git a/mysql-test/main/opt_trace_index_merge.test b/mysql-test/main/opt_trace_index_merge.test index 85918211184..1181aaa3db1 100644 --- a/mysql-test/main/opt_trace_index_merge.test +++ b/mysql-test/main/opt_trace_index_merge.test @@ -119,17 +119,17 @@ insert into t1 (key1, key2, key3, key4, filler1) values (100, 100, -1, -1, 'key1 insert into t1 (key1, key2, key3, key4, filler1) values (-1, -1, 100, 100, 'key4-key3'); set optimizer_trace='enabled=on'; -#check after fix MDEV-27871 +# Enable after fix MDEV-31408 --disable_view_protocol --echo # 3-way ROR-intersection explain select key1,key2,key3 from t1 where key1=100 and key2=100 and key3=100; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; --echo # ROR-union(ROR-intersection, ROR-range) explain select key1,key2,key3,key4 from t1 where key1=100 and key2=100 or key3=100 and key4=100; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; --enable_view_protocol drop table t0,t1; diff --git a/mysql-test/main/opt_trace_security.test b/mysql-test/main/opt_trace_security.test index cf45a64d30b..414cd8f437a 100644 --- a/mysql-test/main/opt_trace_security.test +++ b/mysql-test/main/opt_trace_security.test @@ -66,7 +66,9 @@ grant show view on db1.v1 to 'bar'@'%'; --change_user foo select current_user(); set optimizer_trace="enabled=on"; +--disable_ps2_protocol select * from db1.v1; +--enable_ps2_protocol select * from information_schema.OPTIMIZER_TRACE; set optimizer_trace="enabled=off"; diff --git a/mysql-test/main/opt_trace_ucs2.result b/mysql-test/main/opt_trace_ucs2.result index 9e4f25f3150..dfb35731f6b 100644 --- a/mysql-test/main/opt_trace_ucs2.result +++ b/mysql-test/main/opt_trace_ucs2.result @@ -24,8 +24,8 @@ EXPLAIN ] } } -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; -JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; +JS [ { "range_scan_alternatives": diff --git a/mysql-test/main/opt_trace_ucs2.test b/mysql-test/main/opt_trace_ucs2.test index 1a79ea9780e..eff7d960c17 100644 --- a/mysql-test/main/opt_trace_ucs2.test +++ b/mysql-test/main/opt_trace_ucs2.test @@ -6,8 +6,5 @@ insert into t1 values ('a', 'a'); insert into t1 values ('a', 'a'); set optimizer_trace=1; explain format=json select * from t1 force index(col1) where col1 >='a'; -#enable after fix MDEV-27871 ---disable_view_protocol -select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE; ---enable_view_protocol +select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) AS JS from INFORMATION_SCHEMA.OPTIMIZER_TRACE; drop table t1; diff --git a/mysql-test/main/opt_tvc.test b/mysql-test/main/opt_tvc.test index f8469f22aa1..e08f0a3f664 100644 --- a/mysql-test/main/opt_tvc.test +++ b/mysql-test/main/opt_tvc.test @@ -347,6 +347,8 @@ DROP TABLE t1; --echo # MDEV-14835: conversion to TVC with BIGINT or YEAR values --echo # +#Enable after fix MDEV-31178 +--disable_ps2_protocol SET @@in_predicate_conversion_threshold= 2; CREATE TABLE t1 (a BIGINT); @@ -362,6 +364,7 @@ SELECT * FROM t2 WHERE y IN ('2009','2011'); DROP TABLE t1,t2; SET @@in_predicate_conversion_threshold= default; +--enable_ps2_protocol --echo # --echo # MDEV-17222: conversion to TVC with no names for constants diff --git a/mysql-test/main/order_by.test b/mysql-test/main/order_by.test index 1cd9efa2710..68ae317f188 100644 --- a/mysql-test/main/order_by.test +++ b/mysql-test/main/order_by.test @@ -1457,6 +1457,7 @@ SELECT * FROM t1 WHERE f1>10 ORDER BY f2, f0 LIMIT 0; SELECT * FROM t1 WHERE f1>10 ORDER BY f2, f0 LIMIT 10 OFFSET 10; SELECT * FROM t1 WHERE f1>10 ORDER BY f2, f0 LIMIT 0 OFFSET 10; +--disable_ps2_protocol ################ ## Test with SQL_CALC_FOUND_ROWS set sort_buffer_size= 32768; @@ -1503,6 +1504,7 @@ SELECT SQL_CALC_FOUND_ROWS * FROM t1 JOIN tmp on t1.f2=tmp.f2 WHERE t1.f2>20 ORDER BY tmp.f1, f0 LIMIT 30 OFFSET 30; SELECT FOUND_ROWS(); +--enable_ps2_protocol ################ ## Test views @@ -1527,6 +1529,7 @@ GROUP BY 1 ORDER BY 2,1 LIMIT 0; ################ ## Test SP +--disable_ps2_protocol delimiter |; CREATE PROCEDURE wl1393_sp_test() BEGIN @@ -1540,6 +1543,7 @@ END| CALL wl1393_sp_test()| DROP PROCEDURE wl1393_sp_test| delimiter ;| +--enable_ps2_protocol ################ ## Test with subqueries @@ -1874,6 +1878,7 @@ insert into t1 analyze table t1; --enable_result_log +--disable_ps2_protocol explain select b, count(*) num_cnt from t1 where a > 9750 group by b order by num_cnt; @@ -1893,6 +1898,7 @@ select b, count(*) num_cnt from t1 where a > 9750 group by b order by num_cnt limit 1; --enable_result_log show status like '%Handler_read%'; +--enable_ps2_protocol drop table t0, t1; diff --git a/mysql-test/main/order_by_pack_big.test b/mysql-test/main/order_by_pack_big.test index dce7bcb905c..5e39d9f2988 100644 --- a/mysql-test/main/order_by_pack_big.test +++ b/mysql-test/main/order_by_pack_big.test @@ -112,7 +112,9 @@ set sort_buffer_size=262144*10; --source include/analyze-format.inc eval analyze format=json $query; flush status; +--disable_ps2_protocol eval $query; +--enable_ps2_protocol show status like '%sort%'; set sort_buffer_size=default; @@ -124,7 +126,9 @@ set sort_buffer_size=32768; --source include/analyze-format.inc eval analyze format=json $query; flush status; +--disable_ps2_protocol eval $query; +--enable_ps2_protocol show status like '%sort%'; set sort_buffer_size=default; @@ -141,12 +145,16 @@ set sort_buffer_size= 2097152; --source include/analyze-format.inc eval ANALYZE FORMAT=JSON SELECT id, names, address FROM t3 ORDER BY names, address; flush status; +--disable_ps2_protocol evalp SELECT id, names, address INTO OUTFILE '$file1' FROM t3 ORDER BY names, address; +--enable_ps2_protocol --echo # Sort_merge_passes should be 0 show status like '%sort%'; +--disable_ps2_protocol evalp SELECT id, names, address INTO OUTFILE '$file2' FROM t3 FORCE INDEX(idx) ORDER BY names, address; +--enable_ps2_protocol diff_files $file1 $file2; @@ -163,7 +171,9 @@ set sort_buffer_size= 1097152; --source include/analyze-format.inc eval ANALYZE FORMAT=JSON SELECT id, names, address FROM t3 ORDER BY names, address; flush status; +--disable_ps2_protocol evalp SELECT id, names, address INTO OUTFILE '$file1' FROM t3 ORDER BY names, address; +--enable_ps2_protocol --echo # Sort_merge_passes should be 0 show status like '%sort%'; diff --git a/mysql-test/main/order_by_sortkey.test b/mysql-test/main/order_by_sortkey.test index 43de028496e..4a875b60078 100644 --- a/mysql-test/main/order_by_sortkey.test +++ b/mysql-test/main/order_by_sortkey.test @@ -57,7 +57,9 @@ set sort_buffer_size= 32768; FLUSH STATUS; SHOW SESSION STATUS LIKE 'Sort%'; +--disable_ps2_protocol SELECT * FROM t1 ORDER BY f2 LIMIT 100; +--enable_ps2_protocol SHOW SESSION STATUS LIKE 'Sort%'; diff --git a/mysql-test/main/outfile.test b/mysql-test/main/outfile.test index 9f2fc22da99..7f8f31bc748 100644 --- a/mysql-test/main/outfile.test +++ b/mysql-test/main/outfile.test @@ -8,6 +8,7 @@ enable_query_log; # Save the initial number of concurrent sessions --source include/count_sessions.inc +--disable_ps2_protocol # # test of into outfile|dumpfile @@ -139,3 +140,4 @@ drop database mysqltest; # Wait till we reached the initial number of concurrent sessions --source include/wait_until_count_sessions.inc +--enable_ps2_protocol diff --git a/mysql-test/main/outfile_loaddata.test b/mysql-test/main/outfile_loaddata.test index 9d966b1e99d..e35b40a0979 100644 --- a/mysql-test/main/outfile_loaddata.test +++ b/mysql-test/main/outfile_loaddata.test @@ -6,8 +6,7 @@ DROP TABLE IF EXISTS t1, t2; -- source include/no_view_protocol.inc --enable_prepare_warnings - - +--disable_ps2_protocol --echo # --echo # Bug#31663 FIELDS TERMINATED BY special character --echo # @@ -296,5 +295,7 @@ SELECT LENGTH(a) FROM t2; DROP TABLE t1, t2; --disable_prepare_warnings +--enable_ps2_protocol + ########################################################################### --echo # End of 5.1 tests. diff --git a/mysql-test/main/partition.test b/mysql-test/main/partition.test index d96031a6b2b..81cc3567629 100644 --- a/mysql-test/main/partition.test +++ b/mysql-test/main/partition.test @@ -476,6 +476,7 @@ INSERT INTO `t2` VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13), EXPLAIN PARTITIONS SELECT c1 FROM t1 WHERE (c1 > 10 AND c1 < 13) OR (c1 > 17 AND c1 < 20); +--disable_ps2_protocol FLUSH STATUS; SELECT c1 FROM t1 WHERE (c1 > 10 AND c1 < 13) OR (c1 > 17 AND c1 < 20); SHOW STATUS LIKE 'Handler_read_%'; @@ -486,6 +487,7 @@ FLUSH STATUS; SELECT c1 FROM t2 WHERE (c1 > 10 AND c1 < 13) OR (c1 > 17 AND c1 < 20); SHOW STATUS LIKE 'Handler_read_%'; DROP TABLE t1,t2; +--enable_ps2_protocol # Bug#37329 Range scan on partitioned tables shows higher Handler_read_next # (marked as duplicate of Bug#35931) @@ -507,6 +509,7 @@ INSERT INTO `t2` VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13), EXPLAIN PARTITIONS SELECT c1 FROM t1 WHERE (c1 > 2 AND c1 < 5); +--disable_ps2_protocol FLUSH STATUS; SELECT c1 FROM t1 WHERE (c1 > 2 AND c1 < 5); SHOW STATUS LIKE 'Handler_read_%'; @@ -529,6 +532,7 @@ FLUSH STATUS; SELECT c1 FROM t2 WHERE (c1 > 12 AND c1 < 15); SHOW STATUS LIKE 'Handler_read_%'; DROP TABLE t1,t2; +--enable_ps2_protocol --error ER_PARTITION_FUNCTION_IS_NOT_ALLOWED create table t1 (a int) partition by list ((a/3)*10 div 1) diff --git a/mysql-test/main/partition_explicit_prune.test b/mysql-test/main/partition_explicit_prune.test index 2e9a15d4c5e..d1fbd187c25 100644 --- a/mysql-test/main/partition_explicit_prune.test +++ b/mysql-test/main/partition_explicit_prune.test @@ -10,6 +10,7 @@ WHERE VARIABLE_NAME LIKE 'HANDLER_%' AND VARIABLE_VALUE > 0; --echo # Bug#13559657: PARTITION SELECTION DOES NOT WORK WITH VIEWS --echo # --disable_view_protocol +--disable_ps2_protocol CREATE TABLE t1 (a int) ENGINE = InnoDB PARTITION BY HASH (a) PARTITIONS 2; @@ -85,7 +86,6 @@ SELECT * FROM v1; SELECT * FROM t1; DROP VIEW v1; DROP TABLE t1; ---enable_service_connection --echo # Original tests for WL#5217 --echo # Must have InnoDB as engine to get the same statistics results. @@ -101,7 +101,6 @@ eval $get_handler_status_counts; eval $get_handler_status_counts; --echo # OK, seems to add number of variables processed before HANDLER_WRITE --echo # and number of variables + 1 evaluated in the previous call in RND_NEXT ---disable_service_connection CREATE TABLE t1 (a INT NOT NULL, b varchar (64), @@ -624,6 +623,7 @@ eval $get_handler_status_counts; SELECT * FROM t3 PARTITION (pNeg); DROP TABLE t1, t2, t3; +--enable_ps2_protocol --enable_view_protocol --echo # Test from superseeded WL# 2682 # Partition select tests. diff --git a/mysql-test/main/partition_range.test b/mysql-test/main/partition_range.test index f56851217cf..19050267914 100644 --- a/mysql-test/main/partition_range.test +++ b/mysql-test/main/partition_range.test @@ -968,6 +968,7 @@ ANALYZE TABLE t1,t2; EXPLAIN SELECT a, MAX(b) FROM t1 WHERE a IN (10,100) GROUP BY a; EXPLAIN SELECT a, MAX(b) FROM t2 WHERE a IN (10,100) GROUP BY a; +--disable_ps2_protocol FLUSH status; SELECT a, MAX(b) FROM t1 WHERE a IN (10, 100) GROUP BY a; --echo # Should be no more than 4 reads. @@ -977,6 +978,7 @@ FLUSH status; SELECT a, MAX(b) FROM t2 WHERE a IN (10, 100) GROUP BY a; --echo # Should be no more than 4 reads. SHOW status LIKE 'handler_read_key'; +--enable_ps2_protocol --echo # --echo # MDEV-18501 Partition pruning doesn't work for historical queries diff --git a/mysql-test/main/precedence.test b/mysql-test/main/precedence.test index b93aea72e65..7837b34afc2 100644 --- a/mysql-test/main/precedence.test +++ b/mysql-test/main/precedence.test @@ -4495,7 +4495,10 @@ select 2 BETWEEN 1 AND 3 IN (SELECT 0 UNION SELECT 1), 2 BETWEEN 1 AND (3 IN (SE create or replace view v1 as select 2 LIKE 1 ESCAPE 3 IN (SELECT 0 UNION SELECT 1), 2 LIKE 1 ESCAPE (3 IN (SELECT 0 UNION SELECT 1)), (2 LIKE 1 ESCAPE 3) IN (SELECT 0 UNION SELECT 1); Select view_definition from information_schema.views where table_schema='test' and table_name='v1'; +#Enable after fix MDEV-31282 +--disable_ps2_protocol select 2 LIKE 1 ESCAPE 3 IN (SELECT 0 UNION SELECT 1), 2 LIKE 1 ESCAPE (3 IN (SELECT 0 UNION SELECT 1)), (2 LIKE 1 ESCAPE 3) IN (SELECT 0 UNION SELECT 1) union select * from v1; +--enable_ps2_protocol create or replace view v1 as select 3 BETWEEN 1 AND 2 AND NULL, 3 BETWEEN (1 AND 2) AND NULL, 3 BETWEEN 1 AND (2 AND NULL), (3 BETWEEN 1 AND 2) AND NULL; Select view_definition from information_schema.views where table_schema='test' and table_name='v1'; diff --git a/mysql-test/main/preload.test b/mysql-test/main/preload.test index 69949fccedc..f03ec16bff6 100644 --- a/mysql-test/main/preload.test +++ b/mysql-test/main/preload.test @@ -56,6 +56,7 @@ insert into t1(b) select b from t2; select count(*) from t1; select count(*) from t2; +--disable_ps2_protocol flush tables; flush status; show status like "key_read%"; @@ -99,6 +100,7 @@ flush tables; flush status; show status like "key_read%"; load index into cache t3 key (b), t2 key (c) ; show status like "key_read%"; +--enable_ps2_protocol drop table t1, t2; diff --git a/mysql-test/main/profiling.test b/mysql-test/main/profiling.test index 714c68c00c7..8ba66e6617c 100644 --- a/mysql-test/main/profiling.test +++ b/mysql-test/main/profiling.test @@ -1,6 +1,7 @@ --source include/have_profiling.inc --source include/no_view_protocol.inc +--disable_ps2_protocol # Verify that the protocol isn't violated if we ask for profiling info # before profiling has recorded anything. show profiles; @@ -257,7 +258,7 @@ drop function if exists f1; #--eval select 1; select 2; select 3; ## two continuations, one starting #select state from information_schema.profiling where seq=1 order by query_id desc limit 3; - +--enable_ps2_protocol ## last thing in the file set session profiling = OFF; diff --git a/mysql-test/main/ps.test b/mysql-test/main/ps.test index bb6ce7d4048..ebf646eadf3 100644 --- a/mysql-test/main/ps.test +++ b/mysql-test/main/ps.test @@ -464,6 +464,7 @@ deallocate prepare stmt; # Bug#6088 "FOUND_ROWS returns wrong values for prepared statements when # LIMIT is used" # +--disable_ps2_protocol create table t1 (a int); insert into t1 (a) values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); prepare stmt from "select sql_calc_found_rows * from t1 limit 2"; @@ -475,6 +476,7 @@ execute stmt; select found_rows(); deallocate prepare stmt; drop table t1; +--enable_ps2_protocol # # Bug#6047 "permission problem when executing mysql_stmt_execute with derived @@ -556,13 +558,14 @@ drop table t1; # # Bug #6089: FOUND_ROWS returns wrong values when no table/view is used # - +--disable_ps2_protocol prepare stmt from "SELECT SQL_CALC_FOUND_ROWS 'foo' UNION SELECT 'bar' LIMIT 0"; execute stmt; SELECT FOUND_ROWS(); execute stmt; SELECT FOUND_ROWS(); deallocate prepare stmt; +--enable_ps2_protocol # # Bug#9096 "select doesn't return all matched records if prepared statements @@ -1410,11 +1413,13 @@ DEALLOCATE PREPARE b12651; # Bug #14956: ROW_COUNT() returns incorrect result after EXECUTE of prepared # statement # +--disable_ps2_protocol create table t1 (id int); prepare ins_call from "insert into t1 (id) values (1)"; execute ins_call; select row_count(); drop table t1; +--enable_ps2_protocol # # BUG#16474: SP crashed MySQL @@ -3564,8 +3569,10 @@ flush status; execute st; show status like '%Handler_read%'; flush status; +--disable_ps2_protocol select * from t1 use index() where a=3; show status like '%Handler_read%'; +--enable_ps2_protocol flush status; execute st; show status like '%Handler_read%'; diff --git a/mysql-test/main/ps_11bugs.test b/mysql-test/main/ps_11bugs.test index ccab833e878..1888de060fc 100644 --- a/mysql-test/main/ps_11bugs.test +++ b/mysql-test/main/ps_11bugs.test @@ -203,7 +203,9 @@ END| DELIMITER ;| +--disable_ps2_protocol SELECT * FROM t2 WHERE a = @@sort_buffer_size AND p1(@@sort_buffer_size + 1) > a - 1; +--enable_ps2_protocol DROP TABLE t2; DROP FUNCTION p1; diff --git a/mysql-test/main/ps_missed_cmds_bin_prot.test b/mysql-test/main/ps_missed_cmds_bin_prot.test index 44db5192629..954ffb1bd55 100644 --- a/mysql-test/main/ps_missed_cmds_bin_prot.test +++ b/mysql-test/main/ps_missed_cmds_bin_prot.test @@ -19,7 +19,9 @@ SET default_storage_engine= InnoDB; CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1); COMMIT; +--disable_ps2_protocol SELECT * INTO OUTFILE 'load.data' FROM t1; +--enable_ps2_protocol LOAD DATA INFILE 'load.data' INTO TABLE t1; SELECT * FROM t1; diff --git a/mysql-test/main/query_cache.test b/mysql-test/main/query_cache.test index f3c8093d41b..257ab80b8a5 100644 --- a/mysql-test/main/query_cache.test +++ b/mysql-test/main/query_cache.test @@ -3,6 +3,7 @@ -- source include/no_valgrind_without_big.inc -- source include/no_view_protocol.inc +--disable_ps2_protocol set @save_query_cache_size=@@query_cache_size; # # Tests with query cache @@ -1836,3 +1837,4 @@ DROP TABLE t; --echo restore defaults SET GLOBAL query_cache_type= default; SET GLOBAL query_cache_size=@save_query_cache_size; +--enable_ps2_protocol diff --git a/mysql-test/main/query_cache_innodb.result b/mysql-test/main/query_cache_innodb.result index 62424ac362b..e5569c53d5f 100644 --- a/mysql-test/main/query_cache_innodb.result +++ b/mysql-test/main/query_cache_innodb.result @@ -85,7 +85,7 @@ t2id id use test; drop database `#mysql50#-`; SET NAMES default; -FOUND 8 /\[ERROR\] Invalid \(old\?\) table or database name/ in mysqld.1.err +FOUND 10 /\[ERROR\] Invalid \(old\?\) table or database name/ in mysqld.1.err set global query_cache_type=DEFAULT; set global query_cache_size=@save_query_cache_size; End of 10.2 tests diff --git a/mysql-test/main/query_cache_merge.test b/mysql-test/main/query_cache_merge.test index 9b342d57a8e..c3267d628b9 100644 --- a/mysql-test/main/query_cache_merge.test +++ b/mysql-test/main/query_cache_merge.test @@ -38,6 +38,7 @@ while ($1) # prepare and execute, and we will get a constant validation # error. See WL#4165 for details. # +--disable_ps2_protocol --disable_view_protocol set @save_table_definition_cache= @@global.table_definition_cache; set @@global.table_definition_cache=512; @@ -54,6 +55,7 @@ drop table t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t2 SET @@global.query_cache_size=0; set @@global.table_definition_cache=@save_table_definition_cache; --enable_view_protocol +--enable_ps2_protocol # End of 4.1 tests diff --git a/mysql-test/main/query_cache_notembedded.test b/mysql-test/main/query_cache_notembedded.test index 83c7b1628e8..5f97dc5c00d 100644 --- a/mysql-test/main/query_cache_notembedded.test +++ b/mysql-test/main/query_cache_notembedded.test @@ -113,6 +113,7 @@ disconnect root2; # query in QC from normal execution and SP (Bug#6897) # improved to also test Bug#3583 and Bug#12990 # +--disable_ps2_protocol flush query cache; reset query cache; flush status; @@ -191,6 +192,7 @@ drop procedure f2; drop procedure f3; drop procedure f4; drop table t1; +--enable_ps2_protocol # # Bug#14767 INSERT in SF + concurrent SELECT with query cache diff --git a/mysql-test/main/query_cache_with_views.test b/mysql-test/main/query_cache_with_views.test index e472a7dd478..6740c70883e 100644 --- a/mysql-test/main/query_cache_with_views.test +++ b/mysql-test/main/query_cache_with_views.test @@ -13,6 +13,8 @@ set @save_query_cache_type=@@global.query_cache_type; set GLOBAL query_cache_type=ON; set LOCAL query_cache_type=ON; set GLOBAL query_cache_size=1355776; + +--disable_ps2_protocol flush status; create table t1 (a int, b int); @@ -32,11 +34,13 @@ select * from v2; show status like "Qcache_queries_in_cache"; show status like "Qcache_inserts"; show status like "Qcache_hits"; +--enable_ps2_protocol drop view v1,v2; # SQL_CACHE option set query_cache_type=demand; +--disable_ps2_protocol flush status; # query with view will be cached, but direct acess to table will not create view v1 (c,d) as select sql_cache a,b from t1; @@ -61,6 +65,7 @@ show status like "Qcache_inserts"; show status like "Qcache_hits"; drop view v1; set query_cache_type=default; +--enable_ps2_protocol drop table t1; @@ -105,6 +110,7 @@ drop table t1; # # BUG#15119: returning temptable view from the query cache. # +--disable_ps2_protocol flush status; create table t1 (a int, b int); create algorithm=temptable view v1 as select * from t1; @@ -130,6 +136,7 @@ show status like "Qcache_queries_in_cache"; show status like "Qcache_inserts"; show status like "Qcache_hits"; drop table t1; +--enable_ps2_protocol --echo # --echo # Bug46615 Assertion in Query_cache::invalidate in INSERT in a VIEW of a MERGE table diff --git a/mysql-test/main/range_debug.test b/mysql-test/main/range_debug.test index ef331cdc84f..25783dbe285 100644 --- a/mysql-test/main/range_debug.test +++ b/mysql-test/main/range_debug.test @@ -10,7 +10,9 @@ insert into t2 select 2*(A.a + 10*(B.a + 10*C.a)) from t1 A, t1 B, t1 C; set in_predicate_conversion_threshold= 2000; set @a="select * from t2 force index (a) where a NOT IN(0"; +--disable_ps2_protocol select count(*) from (select @a:=concat(@a, ',', a) from t2 ) Z; +--enable_ps2_protocol set @a=concat(@a, ')'); insert into t2 values (11),(13),(15); diff --git a/mysql-test/main/range_vs_index_merge.test b/mysql-test/main/range_vs_index_merge.test index 38b643c0b13..c4b90bc646b 100644 --- a/mysql-test/main/range_vs_index_merge.test +++ b/mysql-test/main/range_vs_index_merge.test @@ -693,6 +693,7 @@ DROP INDEX CityName on City; CREATE INDEX Name ON City(Name); CREATE INDEX Population ON City(Population); +--disable_ps2_protocol --disable_view_protocol --replace_column 9 # EXPLAIN @@ -754,6 +755,7 @@ SELECT * FROM City ORDER BY Population LIMIT 5; SHOW STATUS LIKE 'Handler_read_%'; --enable_view_protocol +--enable_ps2_protocol set optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/main/repair.result b/mysql-test/main/repair.result index 88f5f9eb06b..9e4cfa347a1 100644 --- a/mysql-test/main/repair.result +++ b/mysql-test/main/repair.result @@ -77,9 +77,6 @@ INSERT INTO t1 VALUES ('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'), ('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'),('0'), ('0'),('0'),('0'),('0'),('0'),('0'),('0'); -Warnings: -Error 1034 myisam_sort_buffer_size is too small. X -Warning 1034 Number of rows changed from 0 to 157 SET myisam_repair_threads=2; REPAIR TABLE t1; Table Op Msg_type Msg_text diff --git a/mysql-test/main/reset_connection.test b/mysql-test/main/reset_connection.test index e6a456fb27d..95dff6ebbdc 100644 --- a/mysql-test/main/reset_connection.test +++ b/mysql-test/main/reset_connection.test @@ -6,6 +6,7 @@ FLUSH STATUS; --disable_query_log --disable_service_connection +--disable_ps2_protocol let $i = 10; begin; while ($i) @@ -14,6 +15,7 @@ while ($i) SELECT 1; } commit; +--enable_ps2_protocol --enable_query_log --enable_result_log diff --git a/mysql-test/main/rownum.test b/mysql-test/main/rownum.test index 291bd9bd993..a68a432b606 100644 --- a/mysql-test/main/rownum.test +++ b/mysql-test/main/rownum.test @@ -307,6 +307,7 @@ drop table t1; create table t1 (a int); insert into t1 select seq from seq_1_to_100; +--disable_ps2_protocol flush status; select * from t1 where rownum() <= 3; show status like "Rows_read"; @@ -371,6 +372,7 @@ show status like "Rows_read"; flush status; select * from t1 where rownum() < 10 limit 4; show status like "Rows_read"; +--enable_ps2_protocol drop table t1; @@ -445,7 +447,9 @@ insert into t1 values (1),(2),(3),(4),(5); let $query= select * from (select a from t1 where a < 1000) as tt where rownum() <= 2; flush status; +--disable_ps2_protocol eval $query; +--enable_ps2_protocol show status like "Rows_read"; eval explain extended $query; eval prepare stmt from "$query"; @@ -461,7 +465,9 @@ deallocate prepare stmt; let $query= select * from (select a from t1 where a < 1000 group by a) as tt where rownum() <= 2; flush status; +--disable_ps2_protocol eval $query; +--enable_ps2_protocol show status like "Rows_read"; eval explain extended $query; eval prepare stmt from "$query"; @@ -472,7 +478,9 @@ deallocate prepare stmt; let $query= select * from (select a from t1 where a < 1000 group by a order by 1) as tt where rownum() <= 2; flush status; +--disable_ps2_protocol eval $query; +--enable_ps2_protocol show status like "Rows_read"; eval explain extended $query; eval prepare stmt from "$query"; @@ -483,7 +491,9 @@ deallocate prepare stmt; let $query= select * from (select a from t1 where a < 1000 union select 10) as tt where rownum() <= 2; flush status; +--disable_ps2_protocol eval $query; +--enable_ps2_protocol show status like "Rows_read"; eval explain extended $query; eval prepare stmt from "$query"; diff --git a/mysql-test/main/select.test b/mysql-test/main/select.test index 332b5a36aea..8cb32f56685 100644 --- a/mysql-test/main/select.test +++ b/mysql-test/main/select.test @@ -2185,6 +2185,7 @@ drop table t2; # # Bug #11745: SELECT ... FROM DUAL with WHERE condition # +--disable_ps2_protocol --disable_view_protocol CREATE TABLE t1 (a int, b int, c int); INSERT INTO t1 @@ -2204,8 +2205,9 @@ select count(*) from t1 limit 2,3; select found_rows(); select SQL_CALC_FOUND_ROWS count(*) from t1 limit 2,3; select found_rows(); ---enable_view_protocol DROP TABLE t1; +--enable_view_protocol +--enable_ps2_protocol # # Bug 7672 Unknown column error in order clause @@ -3737,6 +3739,7 @@ DROP TABLE t1; # # Bug #32942 now() - interval '7200' second is NOT pre-calculated, causing "full table scan" # +--disable_ps2_protocol --disable_view_protocol CREATE TABLE t1 (a INT, b INT); CREATE TABLE t2 (a INT, c INT, KEY(a)); @@ -3752,6 +3755,8 @@ SELECT DISTINCT b FROM t1 LEFT JOIN t2 USING(a) WHERE c <= 3; SHOW STATUS LIKE 'Handler_read%'; DROP TABLE t1, t2; --enable_view_protocol +--enable_ps2_protocol + # # Bug#40953 SELECT query throws "ERROR 1062 (23000): Duplicate entry..." error # @@ -4110,7 +4115,9 @@ END;| delimiter ;| SET @cnt := 0; +--disable_ps2_protocol SELECT * FROM t1 WHERE a = f1(); +--enable_ps2_protocol SELECT @cnt; EXPLAIN EXTENDED SELECT * FROM t1 WHERE a = f1(); DROP TABLE t1, t2; diff --git a/mysql-test/main/select_found.test b/mysql-test/main/select_found.test index 4b6bdbb15e1..dac16fdb727 100644 --- a/mysql-test/main/select_found.test +++ b/mysql-test/main/select_found.test @@ -10,6 +10,7 @@ drop table if exists t1,t2; --enable_warnings +--disable_ps2_protocol create table t1 (a int not null auto_increment, b int not null, primary key(a)); insert into t1 (b) values (2),(3),(5),(5),(5),(6),(7),(9); select SQL_CALC_FOUND_ROWS * from t1; @@ -292,3 +293,4 @@ select found_rows(); select sql_calc_found_rows * from t1 order by c1 limit 2,1; select found_rows(); drop table t1; +--enable_ps2_protocol diff --git a/mysql-test/main/selectivity.test b/mysql-test/main/selectivity.test index 9f21bea442a..bcaf599e171 100644 --- a/mysql-test/main/selectivity.test +++ b/mysql-test/main/selectivity.test @@ -1093,14 +1093,18 @@ set @save_use_stat_tables= @@use_stat_tables; set @@use_stat_tables='complementary'; set @@optimizer_use_condition_selectivity=4; SET @cnt= 0; +--disable_ps2_protocol SELECT * FROM t1 WHERE a = f1(); +--enable_ps2_protocol SELECT @cnt; set @@use_stat_tables='preferably'; analyze table t1 persistent for all; SET @cnt := 0; set @@optimizer_use_condition_selectivity=4; +--disable_ps2_protocol SELECT * FROM t1 WHERE a = f1(); +--enable_ps2_protocol SELECT @cnt; alter table t1 force; drop table t1; diff --git a/mysql-test/main/set_statement.test b/mysql-test/main/set_statement.test index aae7cea40d1..f9d7c098327 100644 --- a/mysql-test/main/set_statement.test +++ b/mysql-test/main/set_statement.test @@ -976,6 +976,7 @@ SET STATEMENT keycache1.key_buffer_size=1024 FOR SELECT 1; # # MDEV-6940: SET STATEMENT executed after SET GLOBAL does not work # +--disable_ps2_protocol --disable_view_protocol set @save_general_log=@@global.general_log; --echo # SET STATEMENT works (OK) @@ -1038,6 +1039,7 @@ set statement long_query_time=0.01,min_examined_row_limit=50 for select sleep(0. select sql_text from mysql.slow_log where sql_text not like 'set @@long_query_time%'; --echo #--- --enable_view_protocol +--enable_ps2_protocol # # log_slow_verbosity is impossible to check because results are not written # in TABLE mode diff --git a/mysql-test/main/set_statement_notembedded_binlog.test b/mysql-test/main/set_statement_notembedded_binlog.test index b0c00008d4f..22a0e5fc749 100644 --- a/mysql-test/main/set_statement_notembedded_binlog.test +++ b/mysql-test/main/set_statement_notembedded_binlog.test @@ -41,7 +41,9 @@ DELIMITER ;| call mtr.add_suppression("Unsafe statement written to the binary log using"); +--disable_ps2_protocol select f1() from t2; +--enable_ps2_protocol --replace_column 1 x 2 x 3 x 4 x 5 x show binlog events limit 16, 100; @@ -71,7 +73,9 @@ BEGIN end| DELIMITER ;| +--disable_ps2_protocol select f1() from t2; +--enable_ps2_protocol --replace_column 1 x 2 x 3 x 4 x 5 x show binlog events limit 13, 100; diff --git a/mysql-test/main/show_check.test b/mysql-test/main/show_check.test index 15beaaf0401..4042b704a7f 100644 --- a/mysql-test/main/show_check.test +++ b/mysql-test/main/show_check.test @@ -608,8 +608,10 @@ show tables; show status like 'slow_queries'; # Table scan query, to ensure that slow_queries does still get incremented # (mysqld is started with --log-queries-not-using-indexes) +--disable_ps2_protocol select 1 from information_schema.tables limit 1; show status like 'slow_queries'; +--enable_ps2_protocol create table t1 (a int); create trigger tr1 before insert on t1 for each row @@ -969,6 +971,7 @@ DROP FUNCTION f1; # # Bug#28808 log_queries_not_using_indexes variable dynamic change is ignored # +--disable_ps2_protocol flush status; show variables like "log_queries_not_using_indexes"; select 1 from information_schema.tables limit 1; @@ -981,6 +984,7 @@ set session log_queries_not_using_indexes=ON; show variables like "log_queries_not_using_indexes"; select 1 from information_schema.tables limit 1; show status like 'slow_queries'; +--enable_ps2_protocol # # Bug#30088 Can't disable myisam-recover by a value of "" diff --git a/mysql-test/main/show_profile.test b/mysql-test/main/show_profile.test index fe923d74a0e..969fb49a3eb 100644 --- a/mysql-test/main/show_profile.test +++ b/mysql-test/main/show_profile.test @@ -10,6 +10,7 @@ -- source include/no_view_protocol.inc --source include/have_profiling.inc +--disable_ps2_protocol SET profiling = 1; SELECT 1; --replace_column 2 # @@ -19,4 +20,4 @@ SHOW PROFILE FOR QUERY 1; SHOW PROFILE CPU FOR QUERY 1; --enable_result_log SET profiling = 0; - +--enable_ps2_protocol diff --git a/mysql-test/main/single_delete_update.test b/mysql-test/main/single_delete_update.test index 4a4ad5e5a8e..0f2dc189e94 100644 --- a/mysql-test/main/single_delete_update.test +++ b/mysql-test/main/single_delete_update.test @@ -6,6 +6,7 @@ # an additional util connection and other statistics data -- source include/no_view_protocol.inc +--disable_ps2_protocol --echo # --echo # Bug #30584: delete with order by and limit clauses does not use --echo # limit efficiently @@ -455,4 +456,4 @@ SHOW STATUS LIKE 'Handler_read_%'; SELECT * FROM t2 WHERE c = 10 ORDER BY a DESC, b DESC; DROP TABLE t1, t2; - +--enable_ps2_protocol diff --git a/mysql-test/main/sp-anchor-row-type-table.result b/mysql-test/main/sp-anchor-row-type-table.result index 00fda5f12ad..f1067222709 100644 --- a/mysql-test/main/sp-anchor-row-type-table.result +++ b/mysql-test/main/sp-anchor-row-type-table.result @@ -814,3 +814,47 @@ t2 CREATE TABLE `t2` ( `text0` text DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci DROP TABLE t1; +# +# End of 10.3 tests +# +# +# Start of 10.4 tests +# +# +# MDEV-31250 ROW variables do not get assigned from subselects +# +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +BEGIN NOT ATOMIC +DECLARE r ROW TYPE OF t1; +SELECT * INTO r FROM t1 WHERE a=1; +SELECT r.a, r.b; +END; +$$ +r.a r.b +1 b1 +DROP TABLE t1; +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +BEGIN NOT ATOMIC +DECLARE r ROW TYPE OF t1; +SET r=(SELECT * FROM t1 WHERE a=1); +SELECT r.a, r.b; +END; +$$ +r.a r.b +1 b1 +DROP TABLE t1; +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +BEGIN NOT ATOMIC +DECLARE r ROW TYPE OF t1 DEFAULT (SELECT * FROM t1 WHERE a=1); +SELECT r.a, r.b; +END; +$$ +r.a r.b +1 b1 +DROP TABLE t1; +# +# End of 10.4 tests +# diff --git a/mysql-test/main/sp-anchor-row-type-table.test b/mysql-test/main/sp-anchor-row-type-table.test index 33b2d7487a4..7123f9160db 100644 --- a/mysql-test/main/sp-anchor-row-type-table.test +++ b/mysql-test/main/sp-anchor-row-type-table.test @@ -884,3 +884,58 @@ $$ DELIMITER ;$$ DROP TABLE t1; --disable_prepare_warnings + +--echo # +--echo # End of 10.3 tests +--echo # + + +--echo # +--echo # Start of 10.4 tests +--echo # + +--echo # +--echo # MDEV-31250 ROW variables do not get assigned from subselects +--echo # + +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +DELIMITER $$; +BEGIN NOT ATOMIC + DECLARE r ROW TYPE OF t1; + SELECT * INTO r FROM t1 WHERE a=1; + SELECT r.a, r.b; +END; +$$ +DELIMITER ;$$ +DROP TABLE t1; + + +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +DELIMITER $$; +BEGIN NOT ATOMIC + DECLARE r ROW TYPE OF t1; + SET r=(SELECT * FROM t1 WHERE a=1); + SELECT r.a, r.b; +END; +$$ +DELIMITER ;$$ +DROP TABLE t1; + + +CREATE TABLE t1 (a INT, b TEXT); +INSERT INTO t1 VALUES (1,'b1'); +DELIMITER $$; +BEGIN NOT ATOMIC + DECLARE r ROW TYPE OF t1 DEFAULT (SELECT * FROM t1 WHERE a=1); + SELECT r.a, r.b; +END; +$$ +DELIMITER ;$$ +DROP TABLE t1; + + +--echo # +--echo # End of 10.4 tests +--echo # diff --git a/mysql-test/main/sp-error.test b/mysql-test/main/sp-error.test index 8bd70358c9f..c112dd0f531 100644 --- a/mysql-test/main/sp-error.test +++ b/mysql-test/main/sp-error.test @@ -8,11 +8,13 @@ drop table if exists t1, t2; --enable_warnings +--disable_ps2_protocol # Backup the mysql.proc table --enable_prepare_warnings --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR eval SELECT * FROM mysql.proc INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/proc.txt'; --disable_prepare_warnings +--enable_ps2_protocol # Make sure we don't have any procedures left. delete from mysql.proc; @@ -422,6 +424,7 @@ unlock tables| # Check that in functions we don't allow to update tables which # are used by statements which invoke these functions. # +--disable_ps2_protocol --disable_warnings drop function if exists f1| --enable_warnings @@ -445,7 +448,7 @@ select * from t1| # Cleanup delete from t1 where val= 17| drop function f1| - +--enable_ps2_protocol # # BUG#1965 @@ -2265,7 +2268,9 @@ begin return 1; end| delimiter ;| +--disable_ps2_protocol select f2(); +--enable_ps2_protocol drop function f2; --error ER_BAD_TABLE_ERROR @@ -3466,6 +3471,7 @@ DROP PROCEDURE p13; --echo # Bug#12731619: NESTED SP HANDLERS CAN TRIGGER ASSERTION --echo +--disable_ps2_protocol --disable_warnings DROP FUNCTION IF EXISTS f1; DROP TABLE IF EXISTS t1; @@ -3515,7 +3521,7 @@ SELECT * FROM t1; DROP FUNCTION f1; DROP TABLE t1; - +--enable_ps2_protocol --echo --echo # Check that handled SQL-conditions are properly cleared from DA. diff --git a/mysql-test/main/sp-inout.test b/mysql-test/main/sp-inout.test index 8f3f134b675..04c6f723864 100644 --- a/mysql-test/main/sp-inout.test +++ b/mysql-test/main/sp-inout.test @@ -932,7 +932,9 @@ DELIMITER ;$$ SELECT * from Persons; SET @a = 6; +--disable_ps2_protocol SELECT func_main(@a); +--enable_ps2_protocol SELECT * from Persons; DROP TABLE Persons; DROP FUNCTION func_main; @@ -1041,7 +1043,9 @@ DELIMITER ;$$ SELECT * from Persons; SET @a = 6; +--disable_ps2_protocol SELECT func_main(@a); +--enable_ps2_protocol SELECT * from Persons; DROP TABLE Persons; DROP FUNCTION func_sub; diff --git a/mysql-test/main/sp-prelocking.test b/mysql-test/main/sp-prelocking.test index fd754a9371c..94db36167fa 100644 --- a/mysql-test/main/sp-prelocking.test +++ b/mysql-test/main/sp-prelocking.test @@ -408,8 +408,10 @@ BEGIN END ! DELIMITER ;! +--disable_ps2_protocol --echo # Without the patch, an error was getting reported. SELECT f1(); +--enable_ps2_protocol DROP FUNCTION f1; DROP VIEW v1; diff --git a/mysql-test/main/sp-vars.test b/mysql-test/main/sp-vars.test index 5e1e07888ca..4049cf198ae 100644 --- a/mysql-test/main/sp-vars.test +++ b/mysql-test/main/sp-vars.test @@ -1015,7 +1015,9 @@ BEGIN END| delimiter ;| +--disable_ps2_protocol SELECT f1('_aBcDe_'); +--enable_ps2_protocol SELECT * FROM t1; @@ -1434,6 +1436,7 @@ end| create table t1 (a int)| insert into t1 (a) values (1), (2)| +--disable_ps2_protocol set @b=1| set @a=0| select f1(), @b from t1| @@ -1441,6 +1444,7 @@ select f1(), @b from t1| set @b:='test'| set @a=0| select f1(), @b from t1| +--enable_ps2_protocol delimiter ;| diff --git a/mysql-test/main/sp.test b/mysql-test/main/sp.test index 2e3a492659e..4314fb8661f 100644 --- a/mysql-test/main/sp.test +++ b/mysql-test/main/sp.test @@ -727,6 +727,7 @@ begin insert into test.t1 values (concat(x, "2"), y+2); end| +--disable_ps2_protocol # Check that file does not exists --error 1 --file_exists $MYSQLTEST_VARDIR/tmp/spout @@ -734,6 +735,7 @@ call into_outfile("ofile", 1)| --remove_file $MYSQLTEST_VARDIR/tmp/spout delete from t1| drop procedure into_outfile| +--enable_ps2_protocol --disable_warnings drop procedure if exists into_dumpfile| @@ -1153,6 +1155,7 @@ begin insert into t1 values ("a", 1), ("b", 2), ("c", 3); end| +--disable_ps2_protocol call rc()| select row_count()| --disable_ps_protocol @@ -1166,7 +1169,7 @@ select row_count()| select * from t1| select row_count()| drop procedure rc| - +--enable_ps2_protocol # # Let us test how well new locking scheme works. @@ -1666,6 +1669,7 @@ begin end if; return x; end| +--disable_ps2_protocol select * from t1 where data = getcount("bar")| select * from t3| select getcount("zip")| @@ -1674,6 +1678,7 @@ select * from t3| select getcount(id) from t1 where data = 3| select getcount(id) from t1 where data = 5| select * from t3| +--enable_ps2_protocol drop table t3| drop function getcount| @@ -3166,6 +3171,7 @@ begin insert into t3 values (1); end| +--disable_ps2_protocol call bug4905()| select row_count()| call bug4905()| @@ -3173,6 +3179,7 @@ select row_count()| call bug4905()| select row_count()| select * from t3| +--enable_ps2_protocol drop procedure bug4905| drop table t3| @@ -3770,8 +3777,10 @@ if (`select @@have_query_cache='YES'`) { --enable_query_log set @x = 1| insert into t1 values ("qc", 42)| +--disable_ps2_protocol select bug9902() from t1| select bug9902() from t1| +--enable_ps2_protocol select @x| --echo # Restore the old query cache size @@ -6239,7 +6248,9 @@ CREATE FUNCTION bug19862(x INT) RETURNS INT RETURN x+1; END| INSERT INTO t12 VALUES (1), (2)| +--disable_ps2_protocol SELECT bug19862(a) FROM t12 ORDER BY 1| +--enable_ps2_protocol SELECT * FROM t11| DROP TABLE t11, t12| DROP FUNCTION bug19862| @@ -6804,7 +6815,9 @@ END| CREATE FUNCTION bug23760_rc_test(in_var INT) RETURNS INT RETURN in_var| INSERT INTO bug23760 (num) VALUES (0), (1), (1), (2), (3), (5), (8)| +--disable_ps2_protocol SELECT ROW_COUNT()| +--enable_ps2_protocol CALL bug23760_test_row_count()| SELECT * FROM bug23760_log ORDER BY id| @@ -6814,14 +6827,18 @@ SELECT @save_max_sp_recursion| SET max_sp_recursion_depth= 5| SELECT @@max_sp_recursion_depth| CALL bug23760_test_row_count2(2)| +--disable_ps2_protocol SELECT ROW_COUNT()| +--enable_ps2_protocol SELECT * FROM bug23760_log ORDER BY id| SELECT * FROM bug23760 ORDER by ID| SET max_sp_recursion_depth= @save_max_sp_recursion| SELECT bug23760_rc_test(123)| INSERT INTO bug23760 (num) VALUES (13), (21), (34), (55)| +--disable_ps2_protocol SELECT bug23760_rc_test(ROW_COUNT())| +--enable_ps2_protocol DROP TABLE bug23760, bug23760_log| DROP PROCEDURE bug23760_update_log| diff --git a/mysql-test/main/sp_trans.test b/mysql-test/main/sp_trans.test index abc308a26d8..e7adcccb9e1 100644 --- a/mysql-test/main/sp_trans.test +++ b/mysql-test/main/sp_trans.test @@ -83,7 +83,9 @@ create function bug10015_4(i int) returns int insert into t2 values (i, m); return m; end| +--disable_ps2_protocol select *, bug10015_4(id) from t1| +--enable_ps2_protocol select * from t2| drop function bug10015_4| # Now let us test how statement rollback works @@ -327,10 +329,14 @@ commit| set autocommit= 1| # Let us test that savepoints work inside of functions # even in auto-commit mode +--disable_ps2_protocol select bug13825_3(0)| +--enable_ps2_protocol select * from t1| delete from t1| +--disable_ps2_protocol select bug13825_3(1)| +--enable_ps2_protocol select * from t1| delete from t1| # Curious case: rolling back to savepoint which is set by first diff --git a/mysql-test/main/statistics.test b/mysql-test/main/statistics.test index 525836abba8..7faf35be9a5 100644 --- a/mysql-test/main/statistics.test +++ b/mysql-test/main/statistics.test @@ -329,6 +329,7 @@ SELECT * FROM mysql.column_stats; SELECT * FROM mysql.index_stats; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/save_column_stats' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' @@ -338,6 +339,7 @@ eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/save_index_stats' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM mysql.index_stats WHERE index_name IN ('idx1', 'idx4'); +--enable_ps2_protocol ALTER TABLE t1 CHANGE COLUMN b x varchar(30); SHOW CREATE TABLE t1; diff --git a/mysql-test/main/status2.test b/mysql-test/main/status2.test index ea674c2ed7c..339e853f2fc 100644 --- a/mysql-test/main/status2.test +++ b/mysql-test/main/status2.test @@ -3,6 +3,7 @@ --echo # --echo # Bug#24289 Status Variable "Questions" gets wrong values with Stored Routines --echo # +--disable_ps2_protocol FLUSH STATUS; DELIMITER $$; CREATE FUNCTION testQuestion() RETURNS INTEGER @@ -64,6 +65,7 @@ DROP TRIGGER trigg1; DROP FUNCTION testQuestion; DROP EVENT ev1; DROP TABLE t1,t2; +--enable_ps2_protocol --echo # --echo # End of 5.5 tests diff --git a/mysql-test/main/subselect.test b/mysql-test/main/subselect.test index 0f6032fb148..18ae20c44da 100644 --- a/mysql-test/main/subselect.test +++ b/mysql-test/main/subselect.test @@ -1174,6 +1174,7 @@ DROP TABLE t1; # Bug#2198 SELECT INTO OUTFILE (with Sub-Select) Problem # +--disable_ps2_protocol create table t1 (a int, b decimal(13, 3)); insert into t1 values (1, 0.123); let $outfile_abs= $MYSQLTEST_VARDIR/tmp/subselect.out.file.1; @@ -1186,7 +1187,7 @@ eval load data infile "$outfile_rel" into table t1; --remove_file $outfile_abs select * from t1; drop table t1; - +--enable_ps2_protocol # # Bug#2479 dependant subquery with limit crash @@ -5851,6 +5852,7 @@ SELECT WHERE b = a AND (b = alias1.b OR EXISTS (SELECT * FROM t3))) AS m FROM t2 alias1, t1 alias2, t1 alias3; +--disable_ps2_protocol flush status; SELECT @@ -5878,6 +5880,7 @@ FROM t2 alias1, t1 alias2, t1 alias3; show status like "subquery_cache%"; show status like '%Handler_read%'; +--enable_ps2_protocol drop table t1, t2, t3; @@ -5923,8 +5926,10 @@ set global userstat=on; flush table_statistics; flush index_statistics; +--disable_ps2_protocol SELECT MIN(b) FROM ( SELECT * FROM t1, t2, t3 WHERE d = b ) AS alias1 WHERE SLEEP(0.1) OR c < 'p' OR b = ( SELECT MIN(b) FROM t2 ); +--enable_ps2_protocol --echo # The following shows that t2 was indeed scanned with a full scan. show table_statistics; diff --git a/mysql-test/main/subselect3.inc b/mysql-test/main/subselect3.inc index af7b45542bd..881cda2e736 100644 --- a/mysql-test/main/subselect3.inc +++ b/mysql-test/main/subselect3.inc @@ -57,7 +57,9 @@ select a, oref, a in ( create table t3 (a int); insert into t3 values (NULL), (NULL); flush status; +--disable_ps2_protocol select a in (select max(ie) from t1 where oref=4 group by grp) from t3; +--enable_ps2_protocol show status like 'Handler_read_rnd_next'; select ' ^ This must show 11' Z; @@ -92,6 +94,7 @@ select oref, a, a in (select a from t1 where oref=t2.oref) Z from t2; explain extended select oref, a, a in (select a from t1 where oref=t2.oref) Z from t2; +--disable_ps2_protocol flush status; select oref, a from t2 where a in (select a from t1 where oref=t2.oref); # This will only show access to t2: @@ -107,6 +110,7 @@ select oref, a, a in (select a from t1 where oref=t2.oref) Z from t2; show status like '%Handler_read%'; select 'No key lookups, seq reads: 29= 5 reads from t2 + 4 * 6 reads from t1.' Z; set @@optimizer_switch=@save_optimizer_switch; +--enable_ps2_protocol drop table t1, t2; @@ -637,7 +641,9 @@ DROP TABLE t1, t2; create table t1 (a int, b decimal(13, 3)); insert into t1 values (1, 0.123); +--disable_ps2_protocol select a, (select max(b) from t1) into outfile "subselect.out.file.1" from t1; +--enable_ps2_protocol delete from t1; load data infile "subselect.out.file.1" into table t1; select * from t1; @@ -805,6 +811,7 @@ FLUSH STATUS; set @save_optimizer_switch2=@@optimizer_switch; set optimizer_switch='subquery_cache=off'; +--disable_ps2_protocol --echo SELECT i1, i2 FROM t1 @@ -831,6 +838,7 @@ WHERE (i1, i2) --echo # Handler_read_rnd_next should be one more than baseline --echo # (read record from t1, but do not read from t2) SHOW STATUS LIKE '%Handler_read_rnd_next'; +--enable_ps2_protocol set @@optimizer_switch=@save_optimizer_switch2; DROP TABLE t1,t2; @@ -969,7 +977,9 @@ set @@max_heap_table_size= 16384; explain select count(*) from t0 A, t0 B, t0 C, t0 D where D.a in (select a from t1 E where a+1 < 10000 + A.a + B.a +C.a+D.a); flush status; +--disable_ps2_protocol select count(*) from t0 A, t0 B, t0 C, t0 D where D.a in (select a from t1 E where a+1 < 10000 + A.a + B.a +C.a+D.a); +--enable_ps2_protocol show status like 'Created_tmp_disk_tables'; set @save_max_heap_table_size=@@max_heap_table_size; set @@optimizer_switch=@save_optimizer_switch; diff --git a/mysql-test/main/subselect4.result b/mysql-test/main/subselect4.result index 115a9ebf957..b06797b1b20 100644 --- a/mysql-test/main/subselect4.result +++ b/mysql-test/main/subselect4.result @@ -2760,7 +2760,7 @@ from t2 join t1 on ('i','w') not in (select t1.v1,t4.v2 from t4,t1,t3 where t3.v2 = t1.v1) LIMIT ROWS EXAMINED 500; 1 Warnings: -Warning 1931 Query execution was interrupted. The query examined at least 3020 rows, which exceeds LIMIT ROWS EXAMINED (500). The query result may be incomplete +Warning 1931 Query execution was interrupted. The query exceeded LIMIT ROWS EXAMINED 500. The query result may be incomplete SET join_cache_level= @save_join_cache_level; DROP TABLE t1,t2,t3,t4; # diff --git a/mysql-test/main/subselect4.test b/mysql-test/main/subselect4.test index 827037c6d5f..9e0b574ca8e 100644 --- a/mysql-test/main/subselect4.test +++ b/mysql-test/main/subselect4.test @@ -1768,7 +1768,8 @@ EXPLAIN SELECT MAX(a), 1 >= ALL ( SELECT b FROM t2 ) AS bb FROM t1; SELECT MAX(a), 1 >= ALL ( SELECT b FROM t2 ) AS bb FROM t1; - +#enable after fix MDEV-31270 +--disable_ps2_protocol EXPLAIN SELECT MAX(a), ( SELECT 1 FROM t2 where b = a) AS bb FROM t1; SELECT MAX(a), ( SELECT 1 FROM t2 where b = a) AS bb FROM t1; @@ -1780,6 +1781,7 @@ SELECT MAX(a), a in ( SELECT b FROM t2 ) AS bb FROM t1; EXPLAIN SELECT MAX(a), a >= ALL ( SELECT b FROM t2 ) AS bb FROM t1; SELECT MAX(a), a >= ALL ( SELECT b FROM t2 ) AS bb FROM t1; +--enable_ps2_protocol drop table t1, t2; diff --git a/mysql-test/main/subselect_cache.test b/mysql-test/main/subselect_cache.test index cf647afb994..1af2825791e 100644 --- a/mysql-test/main/subselect_cache.test +++ b/mysql-test/main/subselect_cache.test @@ -22,6 +22,7 @@ insert into t2 values (2,3),(3,4),(5,6),(4,1); --echo * Test subquery as top item in different clauses --echo * --echo #single value subquery test (SELECT list) +--disable_ps2_protocol flush status; select a, (select d from t2 where b=c) from t1; @@ -341,7 +342,7 @@ flush status; select a, b, (select exists (select * from t2 where b=d) from t2 where b=c) as SUNS1 from t1; show status like "subquery_cache%"; show status like '%Handler_read%'; - +--enable_ps2_protocol --echo #clean up drop table t1,t2; @@ -421,6 +422,7 @@ DROP TABLE t1; --echo #uncacheable queries test (random and side effect) +--disable_ps2_protocol flush status; CREATE TABLE t1 (a int); INSERT INTO t1 VALUES (2), (4), (1), (3); @@ -431,6 +433,7 @@ show status like "subquery_cache%"; select a, a in (select a from t1 where -1 < benchmark(a,100)) from t1 as ext; show status like "subquery_cache%"; drop table t1; +--enable_ps2_protocol --echo #test of big_tables switch and outer table reference in subquery with grouping set tmp_memory_table_size=0; # force on-disk tmp table @@ -456,6 +459,7 @@ insert into t1 values (2,1), (3,1), (2,4), (3,4), (10,2), (20,2), (2,5), (3,5), (100,3), (200,3), (10,6), (20,6), (20,7), (100,8), (200,8); insert into t2 values (1,1),(3,3),(20,20); +--disable_ps2_protocol --echo aggregate function as parameter of subquery set optimizer_switch='subquery_cache=off'; flush status; @@ -480,6 +484,7 @@ flush status; select max(a), (select a from t2 where a=c) from t1 group by b; show status like "subquery_cache%"; show status like '%Handler_read%'; +--enable_ps2_protocol drop table t1,t2; @@ -494,6 +499,7 @@ insert into t1 values create table t2 (pk int, a int, primary key(pk)); insert into t2 select a,a from t0; +--disable_ps2_protocol set optimizer_switch='default,semijoin=on,materialization=on,subquery_cache=on'; flush status; select * from t1 where a in (select pk from t2); @@ -525,6 +531,7 @@ flush status; select * from t1 where a in (select pk from t2); show status like "subquery_cache%"; show status like '%Handler_read%'; +--enable_ps2_protocol drop table t0,t1,t2; @@ -1308,6 +1315,7 @@ CREATE TABLE `t4` ( ) ENGINE=MyISAM AUTO_INCREMENT=101 DEFAULT CHARSET=latin1; INSERT INTO `t4` VALUES (100,2,5,'2001-07-26','2001-07-26','11:49:25','11:49:25','2007-04-25 05:08:49','2007-04-25 05:08:49','f','f'); +--disable_ps2_protocol SET @@optimizer_switch = 'subquery_cache=off'; /* cache is off */ SELECT COUNT( DISTINCT table2 .`col_int_key` ) , ( @@ -1325,6 +1333,7 @@ FROM t3 SUBQUERY2_t1 JOIN t2 ON SUBQUERY2_t1 .`col_int_key` WHERE table1 .`col_varchar_key` ) , table2 .`col_varchar_nokey` field10 FROM t4 table1 JOIN ( t1 table2 STRAIGHT_JOIN t1 table3 ON table2 .`pk` ) ON table3 .`col_varchar_key` = table2 .`col_varchar_key` GROUP BY field10 ; +--enable_ps2_protocol drop table t1,t2,t3,t4; set @@optimizer_switch= default; diff --git a/mysql-test/main/subselect_sj_mat.test b/mysql-test/main/subselect_sj_mat.test index 6b343900dca..000581d5758 100644 --- a/mysql-test/main/subselect_sj_mat.test +++ b/mysql-test/main/subselect_sj_mat.test @@ -523,6 +523,8 @@ where a1 in (select substring(b1,1,512) from t2_512 where b1 > '0'); # group_concat with a blob argument - depends on # the variable group_concat_max_len, and # convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB +#Check after fix MDEV-31276 +--disable_ps2_protocol explain extended select left(a1,7), left(a2,7) from t1_512 where a1 in (select group_concat(b1) from t2_512 group by b2); @@ -540,6 +542,7 @@ where a1 in (select group_concat(b1) from t2_512 group by b2); select left(a1,7), left(a2,7) from t1_512 where a1 in (select group_concat(b1) from t2_512 group by b2); +--enable_ps2_protocol drop table t1_512, t2_512, t3_512; @@ -605,6 +608,8 @@ where a1 in (select substring(b1,1,1024) from t2_1024 where b1 > '0'); # group_concat with a blob argument - depends on # the variable group_concat_max_len, and # convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB +#Check after fix MDEV-31276 +--disable_ps2_protocol explain extended select left(a1,7), left(a2,7) from t1_1024 where a1 in (select group_concat(b1) from t2_1024 group by b2); @@ -622,6 +627,7 @@ where a1 in (select group_concat(b1) from t2_1024 group by b2); select left(a1,7), left(a2,7) from t1_1024 where a1 in (select group_concat(b1) from t2_1024 group by b2); +--enable_ps2_protocol drop table t1_1024, t2_1024, t3_1024; @@ -687,6 +693,8 @@ where a1 in (select substring(b1,1,1025) from t2_1025 where b1 > '0'); # group_concat with a blob argument - depends on # the variable group_concat_max_len, and # convert_blob_length == max_len*collation->mbmaxlen > CONVERT_IF_BIGGER_TO_BLOB +#Check after fix MDEV-31276 +--disable_ps2_protocol explain extended select left(a1,7), left(a2,7) from t1_1025 where a1 in (select group_concat(b1) from t2_1025 group by b2); @@ -704,6 +712,7 @@ where a1 in (select group_concat(b1) from t2_1025 group by b2); select left(a1,7), left(a2,7) from t1_1025 where a1 in (select group_concat(b1) from t2_1025 group by b2); +--enable_ps2_protocol drop table t1_1025, t2_1025, t3_1025; diff --git a/mysql-test/main/table_options.result b/mysql-test/main/table_options.result index 60f25c96a0d..917c4716610 100644 --- a/mysql-test/main/table_options.result +++ b/mysql-test/main/table_options.result @@ -1,4 +1,3 @@ -drop table if exists t1; SET @OLD_SQL_MODE=@@SQL_MODE; SET SQL_MODE='IGNORE_BAD_TABLE_OPTIONS'; create table t1 (a int fkey=vvv, key akey (a) dff=vvv) tkey1='1v1'; @@ -180,3 +179,103 @@ SET SQL_MODE=''; create table t1 (a int fkey=vvv, key akey (a) dff=vvv) tkey1=1v1; ERROR HY000: Unknown option 'fkey' SET @@SQL_MODE=@OLD_SQL_MODE; +# +# End of 5.5 tests +# +# +# MDEV-31822 ALTER TABLE ENGINE=x started failing instead of producing warning on unsupported TRANSACTIONAL=1 +# +create table t0 (a int) transactional=0 engine=aria; +create table t1 (a int) transactional=1 engine=aria; +create table t2 (a int) transactional=default engine=aria; +show create table t0; +Table Create Table +t0 CREATE TABLE `t0` ( + `a` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 TRANSACTIONAL=0 +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 TRANSACTIONAL=1 +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 +alter table t0 engine=myisam; +alter table t1 engine=myisam; +alter table t2 engine=myisam; +show create table t0; +Table Create Table +t0 CREATE TABLE `t0` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 /* TRANSACTIONAL=0 */ +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 /* TRANSACTIONAL=1 */ +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 +alter table t0 engine=myisam transactional=0; +ERROR HY000: Unknown option 'transactional' +alter table t1 engine=myisam transactional=1; +ERROR HY000: Unknown option 'transactional' +alter table t2 engine=myisam transactional=default; +ERROR HY000: Unknown option 'transactional' +set sql_mode=IGNORE_BAD_TABLE_OPTIONS; +alter table t0 engine=myisam transactional=0; +Warnings: +Warning 1911 Unknown option 'transactional' +alter table t1 engine=myisam transactional=1; +Warnings: +Warning 1911 Unknown option 'transactional' +alter table t2 engine=myisam transactional=default; +Warnings: +Warning 1911 Unknown option 'transactional' +show create table t0; +Table Create Table +t0 CREATE TABLE `t0` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci TRANSACTIONAL=0 +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci TRANSACTIONAL=1 +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +drop table t0,t1,t2; +create table t1 (a int) foo=bar; +Warnings: +Warning 1911 Unknown option 'foo' +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `foo`=bar +set sql_mode=default; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci /* `foo`=bar */ +alter table t1 engine=aria bar=foo; +ERROR HY000: Unknown option 'bar' +alter table t1 engine=aria; +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=Aria DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci PAGE_CHECKSUM=1 /* `foo`=bar */ +drop table t1; +# +# End of 10.5 tests +# diff --git a/mysql-test/main/table_options.test b/mysql-test/main/table_options.test index 533e6829c00..0605ce9ee0d 100644 --- a/mysql-test/main/table_options.test +++ b/mysql-test/main/table_options.test @@ -1,7 +1,3 @@ ---disable_warnings -drop table if exists t1; ---enable_warnings - SET @OLD_SQL_MODE=@@SQL_MODE; SET SQL_MODE='IGNORE_BAD_TABLE_OPTIONS'; @@ -66,3 +62,52 @@ SET SQL_MODE=''; create table t1 (a int fkey=vvv, key akey (a) dff=vvv) tkey1=1v1; SET @@SQL_MODE=@OLD_SQL_MODE; + +--echo # +--echo # End of 5.5 tests +--echo # + +--echo # +--echo # MDEV-31822 ALTER TABLE ENGINE=x started failing instead of producing warning on unsupported TRANSACTIONAL=1 +--echo # +create table t0 (a int) transactional=0 engine=aria; +create table t1 (a int) transactional=1 engine=aria; +create table t2 (a int) transactional=default engine=aria; +show create table t0; +show create table t1; +show create table t2; +alter table t0 engine=myisam; +alter table t1 engine=myisam; +alter table t2 engine=myisam; +show create table t0; +show create table t1; +show create table t2; +--error ER_UNKNOWN_OPTION +alter table t0 engine=myisam transactional=0; +--error ER_UNKNOWN_OPTION +alter table t1 engine=myisam transactional=1; +--error ER_UNKNOWN_OPTION +alter table t2 engine=myisam transactional=default; +set sql_mode=IGNORE_BAD_TABLE_OPTIONS; +alter table t0 engine=myisam transactional=0; +alter table t1 engine=myisam transactional=1; +alter table t2 engine=myisam transactional=default; +show create table t0; +show create table t1; +show create table t2; +drop table t0,t1,t2; + +# same behavior for other unknown options: +create table t1 (a int) foo=bar; +show create table t1; +set sql_mode=default; +show create table t1; +--error ER_UNKNOWN_OPTION +alter table t1 engine=aria bar=foo; +alter table t1 engine=aria; +show create table t1; +drop table t1; + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/mysql-test/main/tc_heuristic_recover.test b/mysql-test/main/tc_heuristic_recover.test index a69dc5036af..a31c29c8c93 100644 --- a/mysql-test/main/tc_heuristic_recover.test +++ b/mysql-test/main/tc_heuristic_recover.test @@ -43,8 +43,10 @@ set debug_sync='ha_commit_trans_after_prepare WAIT_FOR go'; --echo # Prove that no COMMIT or ROLLBACK occurred yet. SELECT * FROM t1; +--disable_ps2_protocol SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM t1; +--enable_ps2_protocol # TODO: MDEV-12700 Allow innodb_read_only startup without prior slow shutdown. --source include/kill_mysqld.inc @@ -90,8 +92,10 @@ SELECT * FROM t1; SET TRANSACTION ISOLATION LEVEL READ COMMITTED; SELECT * FROM t1; +--disable_ps2_protocol SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM t1; +--enable_ps2_protocol # # Cleanup # diff --git a/mysql-test/main/thread_pool_info.test b/mysql-test/main/thread_pool_info.test index 8d4ac01bb1c..5e4866f4785 100644 --- a/mysql-test/main/thread_pool_info.test +++ b/mysql-test/main/thread_pool_info.test @@ -37,7 +37,9 @@ SELECT SUM(POLLS_BY_WORKER) FROM INFORMATION_SCHEMA.THREAD_POOL_STATS; DESC INFORMATION_SCHEMA.THREAD_POOL_WAITS; SELECT REASON FROM INFORMATION_SCHEMA.THREAD_POOL_WAITS; SELECT COUNT FROM INFORMATION_SCHEMA.THREAD_POOL_WAITS WHERE REASON='Sleep'; +--disable_ps2_protocol SELECT SLEEP(0.01); +--enable_ps2_protocol SELECT COUNT FROM INFORMATION_SCHEMA.THREAD_POOL_WAITS WHERE REASON='Sleep'; FLUSH THREAD_POOL_WAITS; diff --git a/mysql-test/main/trigger-compat.test b/mysql-test/main/trigger-compat.test index 4d9160c7728..9c102993a6f 100644 --- a/mysql-test/main/trigger-compat.test +++ b/mysql-test/main/trigger-compat.test @@ -68,9 +68,11 @@ let $MYSQLD_DATADIR = `select @@datadir`; eval LOAD DATA LOCAL INFILE '$MYSQLD_DATADIR/mysqltest_db1/t1.TRG' INTO TABLE patch; # remove original t1.TRG file so SELECT INTO OUTFILE won't fail --remove_file $MYSQLD_DATADIR/mysqltest_db1/t1.TRG +--disable_ps2_protocol eval SELECT SUBSTRING_INDEX(a,'definers=',1) INTO OUTFILE '$MYSQLD_DATADIR/mysqltest_db1/t1.TRG' FROM patch; +--enable_ps2_protocol DROP TABLE patch; --connection wl2818_definer_con --enable_query_log diff --git a/mysql-test/main/trigger-trans.test b/mysql-test/main/trigger-trans.test index 5d7d1f8afef..d542b6120aa 100644 --- a/mysql-test/main/trigger-trans.test +++ b/mysql-test/main/trigger-trans.test @@ -91,6 +91,7 @@ begin end| delimiter ;| +--disable_ps2_protocol # Establish an alternative connection. --connect (connection_aux,localhost,root,,test,,) --connect (connection_update,localhost,root,,test,,) @@ -122,6 +123,8 @@ connection connection_aux; select release_lock("lock_bug26141_wait"); connection default; reap; +--enable_ps2_protocol + select * from t1; select * from t2; select * from t3; diff --git a/mysql-test/main/trigger_notembedded.test b/mysql-test/main/trigger_notembedded.test index 313faea982c..509d247f55a 100644 --- a/mysql-test/main/trigger_notembedded.test +++ b/mysql-test/main/trigger_notembedded.test @@ -820,6 +820,7 @@ USE test; # # Bug #26162: Trigger DML ignores low_priority_updates setting # +--disable_ps2_protocol CREATE TABLE t1 (id INTEGER); CREATE TABLE t2 (id INTEGER); @@ -889,6 +890,7 @@ DROP TRIGGER t1_test; DROP TABLE t1,t2; SET SESSION LOW_PRIORITY_UPDATES=DEFAULT; SET GLOBAL LOW_PRIORITY_UPDATES=DEFAULT; +--enable_ps2_protocol --echo End of 5.0 tests. diff --git a/mysql-test/main/type_blob.result b/mysql-test/main/type_blob.result index 851d0bd72d4..1737e75dced 100644 --- a/mysql-test/main/type_blob.result +++ b/mysql-test/main/type_blob.result @@ -1144,5 +1144,18 @@ c d DROP TABLE t1, t2; SET @@sql_mode=@save_sql_mode; # +# MDEV-31800 Problem with open ranges on prefix blobs keys +# +create table t1 (d text not null, key a (d(6))) ; +insert into t1 values ('prefix 2' ), ('prefix 0' ); +select d from t1 where d >= 'prefix 1' and d < 'prefix 3'; +d +prefix 2 +alter table t1 drop index a; +select d from t1 where d >= 'prefix 1' and d < 'prefix 3'; +d +prefix 2 +drop table t1; +# # End of 10.4 test # diff --git a/mysql-test/main/type_blob.test b/mysql-test/main/type_blob.test index f958a055b6c..021ead2e87c 100644 --- a/mysql-test/main/type_blob.test +++ b/mysql-test/main/type_blob.test @@ -764,6 +764,16 @@ select * from t2; DROP TABLE t1, t2; SET @@sql_mode=@save_sql_mode; +--echo # +--echo # MDEV-31800 Problem with open ranges on prefix blobs keys +--echo # +create table t1 (d text not null, key a (d(6))) ; +insert into t1 values ('prefix 2' ), ('prefix 0' ); +select d from t1 where d >= 'prefix 1' and d < 'prefix 3'; +alter table t1 drop index a; +select d from t1 where d >= 'prefix 1' and d < 'prefix 3'; +drop table t1; + --echo # --echo # End of 10.4 test --echo # diff --git a/mysql-test/main/type_date.test b/mysql-test/main/type_date.test index cbc3c67bf64..81cad6b5af5 100644 --- a/mysql-test/main/type_date.test +++ b/mysql-test/main/type_date.test @@ -787,6 +787,7 @@ DROP TABLE t1; --echo # --echo # MDEV-29890 Update with inner join false row count result --echo # +--disable_ps2_protocol set sql_mode='NO_ZERO_DATE'; create table t1 (a1 bigint primary key, a2 date not null, a3 bigint not null); create table t2 (b1 bigint primary key); @@ -800,6 +801,7 @@ set sql_mode='NO_ZERO_DATE'; update t1 inner join t2 on t1.a3 = t2.b1 set t1.a2 = t1.a2 + interval 1 day; drop table t1, t2; set sql_mode=default; +--enable_ps2_protocol --echo # --echo # End of 10.4 tests diff --git a/mysql-test/main/type_datetime.test b/mysql-test/main/type_datetime.test index 5816977029d..4a14bee4319 100644 --- a/mysql-test/main/type_datetime.test +++ b/mysql-test/main/type_datetime.test @@ -287,6 +287,7 @@ drop table t1; # Bug#28261: Wrong DATETIME comparison result when the GET_USER_VAR function # is involved. # +--disable_ps2_protocol create table t1(f1 date); insert into t1 values('01-01-01'),('02-02-02'),('01-01-01'),('02-02-02'); set @bug28261=''; @@ -294,6 +295,7 @@ select if(@bug28261 = f1, '', @bug28261:= f1) from t1; select if(@bug28261 = f1, '', @bug28261:= f1) from t1; select if(@bug28261 = f1, '', @bug28261:= f1) from t1; drop table t1; +--enable_ps2_protocol # # Bug#28778: Wrong result of BETWEEN when comparing a DATETIME field with an diff --git a/mysql-test/main/type_int.result b/mysql-test/main/type_int.result index 1d38181c71d..c25b213c7c4 100644 --- a/mysql-test/main/type_int.result +++ b/mysql-test/main/type_int.result @@ -1675,5 +1675,16 @@ SELECT DISTINCT 1 FROM t1 GROUP BY 0 >> NULL WITH ROLLUP; 1 DROP TABLE t1; # +# MDEV-30710 Incorrect operator when comparing large unsigned integers. +# +create table t1(c0 tinyint unique); +insert into t1 values (127); +insert into t1 values (-128); +select * from t1 where 18446744073700599371 > c0; +c0 +-128 +127 +drop table t1; +# # End of 10.5 tests # diff --git a/mysql-test/main/type_int.test b/mysql-test/main/type_int.test index 7ffbe94cc0d..c339bfa1834 100644 --- a/mysql-test/main/type_int.test +++ b/mysql-test/main/type_int.test @@ -554,6 +554,15 @@ INSERT INTO t1 VALUES (1),(2); SELECT DISTINCT 1 FROM t1 GROUP BY 0 >> NULL WITH ROLLUP; DROP TABLE t1; +--echo # +--echo # MDEV-30710 Incorrect operator when comparing large unsigned integers. +--echo # + +create table t1(c0 tinyint unique); +insert into t1 values (127); +insert into t1 values (-128); +select * from t1 where 18446744073700599371 > c0; +drop table t1; --echo # --echo # End of 10.5 tests diff --git a/mysql-test/main/type_newdecimal.test b/mysql-test/main/type_newdecimal.test index d30a2f0067b..af5dc43fbd3 100644 --- a/mysql-test/main/type_newdecimal.test +++ b/mysql-test/main/type_newdecimal.test @@ -1215,7 +1215,9 @@ CREATE TABLE t1 (a int DEFAULT NULL, b int DEFAULT NULL); INSERT INTO t1 VALUES (3,30), (1,10), (2,10); SET @a= CAST(1 AS decimal); +--disable_ps2_protocol SELECT 1 FROM t1 GROUP BY @b := @a, @b; +--enable_ps2_protocol DROP TABLE t1; diff --git a/mysql-test/main/type_time.result b/mysql-test/main/type_time.result index a863eaea686..34bf165a3e4 100644 --- a/mysql-test/main/type_time.result +++ b/mysql-test/main/type_time.result @@ -2446,5 +2446,49 @@ DROP TABLE t1; SET @@time_zone=DEFAULT; SET TIMESTAMP=DEFAULT; # +# MDEV-23838 Possibly wrong result or Assertion `0' failed in Item_func_round::native_op +# +CREATE TABLE t1 (a TIME, b INT); +INSERT INTO t1 VALUES ('07:26:24',NULL),('23:55:04',NULL); +SELECT MAX(ROUND(a, 0)) FROM t1 GROUP BY 1 << b; +MAX(ROUND(a, 0)) +23:55:04 +DROP TABLE t1; +CREATE TABLE t1 (a TIME(6), b INT); +INSERT INTO t1 VALUES ('07:26:24.12',NULL),('23:55:04.34',NULL); +SELECT MAX(ROUND(a, 2)) FROM t1 GROUP BY 1 << b; +MAX(ROUND(a, 2)) +23:55:04.34 +DROP TABLE t1; +SET sql_mode=''; +CREATE TABLE t1 (a TIME); +INSERT INTO t1 VALUES (0),(0); +SELECT MAX(ROUND (a,a)) FROM t1 GROUP BY a; +MAX(ROUND (a,a)) +00:00:00 +DROP TABLE t1; +SET sql_mode=DEFAULT; +CREATE TABLE t1 (a TIME, b INT); +INSERT INTO t1 VALUES ('07:26:24',1),('23:55:04',1); +SELECT MIN(CEILING(a)), MAX(CEILING(a)) FROM t1 GROUP BY b; +MIN(CEILING(a)) MAX(CEILING(a)) +07:26:24 23:55:04 +SELECT MIN(FLOOR(a)), MAX(FLOOR(a)) FROM t1 GROUP BY b; +MIN(FLOOR(a)) MAX(FLOOR(a)) +07:26:24 23:55:04 +DROP TABLE t1; +CREATE TABLE t1 (a TIME(6), b INT); +INSERT INTO t1 VALUES ('00:00:00.5',1),('00:01:00.5',1); +INSERT INTO t1 VALUES ('-00:00:00.5',2),('-00:01:00.5',2); +SELECT MIN(CEILING(a)), MAX(CEILING(a)) FROM t1 GROUP BY b; +MIN(CEILING(a)) MAX(CEILING(a)) +00:00:01 00:01:01 +-00:01:00 00:00:00 +SELECT MIN(FLOOR(a)), MAX(FLOOR(a)) FROM t1 GROUP BY b; +MIN(FLOOR(a)) MAX(FLOOR(a)) +00:00:00 00:01:00 +-00:01:01 -00:00:01 +DROP TABLE t1; +# # End of 10.4 tests # diff --git a/mysql-test/main/type_time.test b/mysql-test/main/type_time.test index 9ed5c3a73dc..a75b278b1de 100644 --- a/mysql-test/main/type_time.test +++ b/mysql-test/main/type_time.test @@ -1585,6 +1585,41 @@ SET @@time_zone=DEFAULT; SET TIMESTAMP=DEFAULT; +--echo # +--echo # MDEV-23838 Possibly wrong result or Assertion `0' failed in Item_func_round::native_op +--echo # + +CREATE TABLE t1 (a TIME, b INT); +INSERT INTO t1 VALUES ('07:26:24',NULL),('23:55:04',NULL); +SELECT MAX(ROUND(a, 0)) FROM t1 GROUP BY 1 << b; +DROP TABLE t1; + +CREATE TABLE t1 (a TIME(6), b INT); +INSERT INTO t1 VALUES ('07:26:24.12',NULL),('23:55:04.34',NULL); +SELECT MAX(ROUND(a, 2)) FROM t1 GROUP BY 1 << b; +DROP TABLE t1; + +SET sql_mode=''; +CREATE TABLE t1 (a TIME); +INSERT INTO t1 VALUES (0),(0); +SELECT MAX(ROUND (a,a)) FROM t1 GROUP BY a; +DROP TABLE t1; +SET sql_mode=DEFAULT; + +CREATE TABLE t1 (a TIME, b INT); +INSERT INTO t1 VALUES ('07:26:24',1),('23:55:04',1); +SELECT MIN(CEILING(a)), MAX(CEILING(a)) FROM t1 GROUP BY b; +SELECT MIN(FLOOR(a)), MAX(FLOOR(a)) FROM t1 GROUP BY b; +DROP TABLE t1; + +CREATE TABLE t1 (a TIME(6), b INT); +INSERT INTO t1 VALUES ('00:00:00.5',1),('00:01:00.5',1); +INSERT INTO t1 VALUES ('-00:00:00.5',2),('-00:01:00.5',2); +SELECT MIN(CEILING(a)), MAX(CEILING(a)) FROM t1 GROUP BY b; +SELECT MIN(FLOOR(a)), MAX(FLOOR(a)) FROM t1 GROUP BY b; +DROP TABLE t1; + + --echo # --echo # End of 10.4 tests --echo # diff --git a/mysql-test/main/type_timestamp.test b/mysql-test/main/type_timestamp.test index 14e865df918..af61f57dd08 100644 --- a/mysql-test/main/type_timestamp.test +++ b/mysql-test/main/type_timestamp.test @@ -403,12 +403,14 @@ INSERT INTO t2 VALUES( '2010-02-01 09:31:11' ); --echo # The bug would cause the range optimizer's comparison to use an open --echo # interval here. This reveals itself only in the number of reads --echo # performed. +--disable_ps2_protocol FLUSH STATUS; --replace_column 1 x 2 x 3 x 5 x 6 x 7 x 8 x 9 x 10 x EXPLAIN SELECT * FROM t2 WHERE a < '2010-02-01 09:31:02.0'; SELECT * FROM t2 WHERE a < '2010-02-01 09:31:02.0'; SHOW STATUS LIKE 'Handler_read_next'; +--enable_ps2_protocol DROP TABLE t1, t2; @@ -740,7 +742,9 @@ FLUSH TABLES; # 0xFF - record flags # 0x77777777 - TIMESTAMP integer part # 0xFFFFFF - TIMESTAMP bad fractional part +--disable_ps2_protocol --eval SELECT CONCAT(0xFF,0x77777777,0xFFFFFF) INTO OUTFILE '$MYSQLD_DATADIR/test/t1.MYD' FIELDS TERMINATED BY '' ESCAPED BY '' LINES TERMINATED BY '' +--enable_ps2_protocol --eval SELECT HEX(LOAD_FILE('$MYSQLD_DATADIR/test/t1.MYD')) AS MYD --enable_query_log SELECT a, CAST(a AS DATETIME) AS dt0, CAST(a AS DATETIME(6)) AS dt6 FROM t1; diff --git a/mysql-test/main/type_year.test b/mysql-test/main/type_year.test index 7672fa94968..52783a21b74 100644 --- a/mysql-test/main/type_year.test +++ b/mysql-test/main/type_year.test @@ -187,7 +187,10 @@ insert t1 values (0,2000); select a from t1 where a=2000; # constant. select a from t1 where a=1000+1000; # still a constant. # select a from t1 where a=(select 2000); # even this is a constant +#Check after fix MDEV-31277 +--disable_ps2_protocol select a from t1 where a=(select 2000 from dual where 1); # constant, but "expensive" +--enable_ps2_protocol select a from t1 where a=y2k(); # constant, but "expensive" select a from t1 where a=b; # not a constant drop table t1; diff --git a/mysql-test/main/union.test b/mysql-test/main/union.test index 4cebdcff9bb..994f187b946 100644 --- a/mysql-test/main/union.test +++ b/mysql-test/main/union.test @@ -22,6 +22,7 @@ select 't1',b,count(*) from t1 group by b UNION select 't2',b,count(*) from t2 g --error ER_TABLENAME_NOT_ALLOWED_HERE (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by t1.b; explain extended (select a,b from t1 limit 2) union all (select a,b from t2 order by a limit 1) order by b desc; +--disable_ps2_protocol --disable_view_protocol select count(*) from ( (select a,b from t1 limit 2) union all (select a,b from t2 order by a)) q; @@ -32,6 +33,7 @@ select a,b from t1 union all select a,b from t2) q; select sql_calc_found_rows a,b from t1 union all select a,b from t2 limit 2; select found_rows(); --enable_view_protocol +--enable_ps2_protocol # # Test some error conditions with UNION # @@ -207,6 +209,7 @@ insert into t1 values (1),(2),(3); create table t2 (a int); insert into t2 values (3),(4),(5); +--disable_ps2_protocol --disable_view_protocol # Test global limits SELECT COUNT(*) FROM ( @@ -234,14 +237,17 @@ SELECT COUNT(*) FROM ( (SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1) UNION SELECT * FROM t2 LIMIT 1; select found_rows(); --enable_view_protocol +--enable_ps2_protocol # In these case found_rows() should work --error ER_PARSE_ERROR SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1 UNION all SELECT * FROM t2 LIMIT 2; +--disable_ps2_protocol --disable_view_protocol SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION all SELECT * FROM t2 LIMIT 2; select found_rows(); --enable_view_protocol +--enable_ps2_protocol # The following examples will not be exact SELECT COUNT(*) FROM ( @@ -249,16 +255,20 @@ SELECT * FROM t1 UNION SELECT * FROM t2) q; SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION SELECT * FROM t2 LIMIT 2; SELECT COUNT(*) FROM ( (SELECT * FROM t1 LIMIT 1) UNION all SELECT * FROM t2) q; +--disable_ps2_protocol --disable_view_protocol (SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1) UNION all SELECT * FROM t2 LIMIT 2; select found_rows(); --enable_view_protocol +--enable_ps2_protocol SELECT COUNT(*) FROM ( SELECT * FROM t1 UNION all SELECT * FROM t2) q; +--disable_ps2_protocol --disable_view_protocol SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION SELECT * FROM t2 LIMIT 100; select found_rows(); --enable_view_protocol +--enable_ps2_protocol --error ER_PARSE_ERROR SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 100 UNION SELECT * FROM t2; SELECT COUNT(*) FROM ( @@ -274,10 +284,12 @@ SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1 UNION SELECT * FROM t2 LIMIT 2; SELECT COUNT(*) FROM ( (SELECT * FROM t1 LIMIT 1) UNION SELECT * FROM t2) q; (SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1) UNION SELECT * FROM t2 LIMIT 2; +--disable_ps2_protocol --disable_view_protocol SELECT SQL_CALC_FOUND_ROWS * FROM t1 UNION SELECT * FROM t2 LIMIT 2,2; select found_rows(); --enable_view_protocol +--enable_ps2_protocol SELECT COUNT(*) FROM ( SELECT * FROM t1 UNION SELECT * FROM t2) q; --error ER_PARSE_ERROR @@ -509,6 +521,7 @@ insert t1 select a+1, a+b from t1; insert t1 select a+1, a+b from t1; insert t1 select a+1, a+b from t1; FLUSH STATUS; +--disable_ps2_protocol --disable_view_protocol show status like 'Slow_queries'; select count(*) from t1 where a=7; @@ -524,6 +537,7 @@ flush status; select a from t1 where b not in (1,2,3) union select a from t1 where b not in (4,5,6); show status like 'Slow_queries'; --enable_view_protocol +--enable_ps2_protocol drop table t1; # @@ -1099,6 +1113,7 @@ DROP TABLE t1; -- echo # Bug#32858: Error: "Incorrect usage of UNION and INTO" does not take -- echo # subselects into account -- echo # +--disable_ps2_protocol CREATE TABLE t1 (a INT); INSERT INTO t1 VALUES (1); @@ -1146,6 +1161,7 @@ SELECT ( SELECT a UNION SELECT a ) INTO DUMPFILE 'union.out.file4' FROM t1; DROP TABLE t1; remove_files_wildcard $MYSQLTEST_VARDIR/mysqld.1/data/test union.out.fil*; +--enable_ps2_protocol --echo # --echo # Bug #49734: Crash on EXPLAIN EXTENDED UNION ... ORDER BY @@ -1372,11 +1388,13 @@ INSERT INTO t17059925 VALUES (1), (2), (3); INSERT INTO t2 VALUES (4), (5), (6); INSERT INTO t3 VALUES (7), (8), (9); TRUNCATE table mysql.slow_log; ---sorted_result +--disable_ps2_protocol --disable_view_protocol +--sorted_result SELECT * FROM t17059925 UNION SELECT * FROM t2 UNION SELECT * FROM t3; SELECT sql_text, rows_examined FROM mysql.slow_log WHERE sql_text LIKE '%SELECT%t17059925%'; --enable_view_protocol +--enable_ps_protocol DROP TABLE t17059925, t2, t3; ## Reset to initial values diff --git a/mysql-test/main/update.test b/mysql-test/main/update.test index 147d69d50c9..0dbc3c333ee 100644 --- a/mysql-test/main/update.test +++ b/mysql-test/main/update.test @@ -234,11 +234,13 @@ create table t1 ( a int, b int default 0, index (a) ); insert into t1 (a) values (0),(0),(0),(0),(0),(0),(0),(0); # the view protocol creates an additional statistics data +--disable_ps2_protocol --disable_view_protocol flush status; select a from t1 order by a limit 1; show status like 'handler_read%'; --enable_view_protocol +--enable_ps2_protocol flush status; update t1 set a=9999 order by a limit 1; @@ -344,6 +346,7 @@ INSERT INTO t1(user_id) SELECT user_id FROM t1; INSERT INTO t1(user_id) SELECT user_id FROM t1; INSERT INTO t1(user_id) SELECT user_id FROM t1; +--disable_ps2_protocol flush status; SELECT user_id FROM t1 WHERE request_id=9999999999999; show status like '%Handler_read%'; @@ -353,6 +356,7 @@ UPDATE t1 SET user_id=null WHERE request_id=9999999999999; show status like '%Handler_read%'; UPDATE t1 SET user_id=null WHERE request_id=999999999999999999999999999999; show status like '%Handler_read%'; +--enable_ps2_protocol DROP TABLE t1; diff --git a/mysql-test/main/user_var.result b/mysql-test/main/user_var.result index a5837996c19..26bf2853dd4 100644 --- a/mysql-test/main/user_var.result +++ b/mysql-test/main/user_var.result @@ -572,7 +572,7 @@ End of 5.5 tests # # Check that used memory extends if we set a variable # -set @var= repeat('a',20000); +set @var= repeat('a',30000); 1 explain select @a:=max(seq) from seq_1_to_1000000; id select_type table type possible_keys key key_len ref rows Extra diff --git a/mysql-test/main/user_var.test b/mysql-test/main/user_var.test index 589043f096e..15bc527601c 100644 --- a/mysql-test/main/user_var.test +++ b/mysql-test/main/user_var.test @@ -25,6 +25,7 @@ explain select @vv1:=i from t1 where i=@vv1; explain select * from t1 where i=@vv1; drop table t1,t2; +--disable_ps2_protocol # Check types of variables set @a=0,@b=0; select @a:=10, @b:=1, @a > @b, @a < @b; @@ -74,6 +75,7 @@ set @a=0; select @a,@a:="hello",@a,@a:=3,@a,@a:="hello again" from t1 group by i; select @a,@a:="hello",@a,@a:=3,@a,@a:="hello again" from t1 group by i; drop table t1; +--enable_ps2_protocol # # Bug #2244: User variables didn't copy collation and derivation @@ -263,7 +265,7 @@ drop table t1; # # Bug#26020: User-Defined Variables are not consistent with columns data types # - +--disable_ps2_protocol create table t1(b bigint); insert into t1 (b) values (10), (30), (10), (10); set @var := 0; @@ -284,6 +286,7 @@ insert into t1 values (2), (3), (3), (4); set @lastid=-1; select @lastid != id, @lastid, @lastid := id from t1; drop table t1; +--enable_ps2_protocol # # Bug#42009: SELECT into variable gives different results to direct SELECT @@ -336,8 +339,10 @@ DROP TABLE t1; CREATE TABLE t1(a INT); INSERT INTO t1 VALUES (0),(0); +--disable_ps2_protocol --echo # BUG#55615 : should not crash SELECT (@a:=(SELECT @a:=1 FROM t1 LIMIT 1)) AND COUNT(1) FROM t1 GROUP BY @a; +--enable_ps2_protocol --echo # BUG#55564 : should not crash SELECT IF( @v:=LEAST((SELECT 1 FROM t1 t2 LEFT JOIN t1 ON (@v) GROUP BY t1.a), a), @@ -496,7 +501,7 @@ DROP TABLE t1; --disable_service_connection # Execute twice so number stablizes a bit let $tmp= `select memory_used from information_schema.processlist`; -set @var= repeat('a',20000); +set @var= repeat('a',30000); let $tmp2= `select memory_used from information_schema.processlist`; --disable_query_log --disable_column_names diff --git a/mysql-test/main/userstat-badlogin-4824.test b/mysql-test/main/userstat-badlogin-4824.test index 12cca9f12b3..0a7490bc29c 100644 --- a/mysql-test/main/userstat-badlogin-4824.test +++ b/mysql-test/main/userstat-badlogin-4824.test @@ -12,6 +12,7 @@ create user foo@localhost identified by 'foo'; flush user_statistics; set global userstat=1; +--disable_ps2_protocol connect(foo, localhost, foo, foo); select 1; disconnect foo; @@ -33,6 +34,7 @@ connection default; --replace_result 41 18 select user, bytes_received from information_schema.user_statistics where user = 'foo'; +--enable_ps2_protocol drop user foo@localhost; set global userstat=@save_userstat; diff --git a/mysql-test/main/userstat.test b/mysql-test/main/userstat.test index 5691a2dc890..a452bd9e679 100644 --- a/mysql-test/main/userstat.test +++ b/mysql-test/main/userstat.test @@ -8,6 +8,7 @@ -- source include/have_perfschema.inc --enable_prepare_warnings +--disable_ps2_protocol select variable_value from information_schema.global_status where variable_name="handler_read_key" into @global_read_key; --disable_prepare_warnings show columns from information_schema.client_statistics; @@ -127,6 +128,7 @@ select f() from information_schema.table_statistics; select f() from information_schema.index_statistics; set global userstat= 0; drop function f; +--enable_ps2_protocol --echo # --echo # End of 10.2 tests diff --git a/mysql-test/main/variables.test b/mysql-test/main/variables.test index 495ab101352..2f145a77d74 100644 --- a/mysql-test/main/variables.test +++ b/mysql-test/main/variables.test @@ -164,7 +164,9 @@ select * from information_schema.session_variables where variable_name like 'cha select @@timestamp>0; set @@rand_seed1=10000000,@@rand_seed2=1000000; +--disable_ps2_protocol select ROUND(RAND(),5); +--enable_ps2_protocol --echo diff --git a/mysql-test/main/view.test b/mysql-test/main/view.test index fa3f0d312a7..d6c600c82b1 100644 --- a/mysql-test/main/view.test +++ b/mysql-test/main/view.test @@ -2054,7 +2054,9 @@ set @tmp=@@optimizer_switch; set @@optimizer_switch='derived_merge=OFF'; create table t1(f1 char(1)); create view v1 as select * from t1; +--disable_ps2_protocol select * from (select f1 as f2, f1 as f3 from v1) v where v.f2='a'; +--enable_ps2_protocol --disable_ps_protocol show status like "Created_tmp%"; --enable_ps_protocol @@ -4146,6 +4148,7 @@ drop table t1,t2,t3,t4,t5,t6; --echo # Bug #59696 Optimizer does not use equalities for conditions over view --echo # +--disable_ps2_protocol CREATE TABLE t1 (a int NOT NULL); INSERT INTO t1 VALUES (9), (2), (8), (1), (3), (4), (2), (5), @@ -4171,6 +4174,7 @@ SHOW STATUS LIKE 'Handler_read_%'; DROP VIEW v; DROP TABLE t1, t2; +--enable_ps2_protocol --echo # --echo # Bug#702403: crash with multiple equalities and a view @@ -4595,10 +4599,14 @@ CREATE PROCEDURE p1() SELECT COUNT(*), GET_LOCK('blocker', 100) FROM v1; --disable_result_log CALL p1(); --enable_result_log +--disable_ps2_protocol SELECT RELEASE_LOCK('blocker'); +--enable_ps2_protocol connection con3; +--disable_ps2_protocol SELECT GET_LOCK('blocker', 100); +--enable_ps2_protocol connection default; --echo # Try to CALL p1() again, this time it should block on "blocker". @@ -4621,14 +4629,18 @@ let $wait_condition= WHERE state = "Waiting for table metadata lock" AND info = "DROP VIEW v1"; --source include/wait_condition.inc --echo # Now allow CALL p1() to complete +--disable_ps2_protocol SELECT RELEASE_LOCK('blocker'); +--enable_ps2_protocol connection default; --echo # Reaping: CALL p1() --disable_result_log --reap --enable_result_log +--disable_ps2_protocol SELECT RELEASE_LOCK('blocker'); +--enable_ps2_protocol connection con2; --echo # Reaping: DROP VIEW v1 @@ -6490,6 +6502,8 @@ DROP TABLE t1, t2; --echo # MDEV-23291: SUM column from a derived table returns invalid values --echo # +#Enable ps2 protocol after fix MDEV-31175 +--disable_ps2_protocol CREATE TABLE t1(a INT, b INT); INSERT INTO t1 VALUES (1,1), (2,2); @@ -6501,6 +6515,7 @@ SELECT sum(z) FROM v1; DROP TABLE t1; DROP VIEW v1; +--enable_ps2_protocol --echo # --echo # MDEV-26299: Some views force server (and mysqldump) to generate diff --git a/mysql-test/main/win.test b/mysql-test/main/win.test index 0cc929ce46b..0c610f35453 100644 --- a/mysql-test/main/win.test +++ b/mysql-test/main/win.test @@ -1016,6 +1016,7 @@ drop table t1; --echo # MDEV-9848: Window functions: reuse sorting and/or scanning --echo # +--disable_ps2_protocol create table t1 (a int, b int, c int); insert into t1 values (1,3,1), @@ -1065,6 +1066,7 @@ select from t1; drop table t1; +--enable_ps2_protocol --echo # @@ -2548,7 +2550,8 @@ drop table t1; --echo # --echo # MDEV-25630: Crash with window function in left expr of IN subquery --echo # - +#Enable after fix MDEV-31281 +--disable_ps2_protocol CREATE TABLE t1 (i int); INSERT INTO t1 VALUES (1),(2),(3); SELECT lag(i) over (ORDER BY i) IN ( SELECT 1 FROM t1 a) FROM t1; @@ -2558,6 +2561,7 @@ CREATE TABLE t1 (i int); INSERT INTO t1 VALUES (1),(2),(3); SELECT sum(i) over () IN ( SELECT 1 FROM t1 a) FROM t1; DROP TABLE t1; +--enable_ps2_protocol --echo # --echo # MDEV-25565: 2-nd call of SP with SELECT from view / derived table / CTE diff --git a/mysql-test/main/win_i_s.test b/mysql-test/main/win_i_s.test index d9b0f190285..89d28b7b5c4 100644 --- a/mysql-test/main/win_i_s.test +++ b/mysql-test/main/win_i_s.test @@ -1,3 +1,4 @@ +--disable_ps2_protocol show status like '%window%'; create table t1 (a int, b int); @@ -16,3 +17,4 @@ from (select a, b, rank() over (order by a) as r1 from t1) t_a, show status like '%window%'; drop table t1; +--enable_ps2_protocol diff --git a/mysql-test/main/xa.result b/mysql-test/main/xa.result index 54763729e57..a692e5ec311 100644 --- a/mysql-test/main/xa.result +++ b/mysql-test/main/xa.result @@ -545,6 +545,54 @@ formatID gtrid_length bqual_length data drop table asd; disconnect con_tmp; connection default; +# MDEV-30978: a read-only server should still allow the commit of +# read-only XA transactions +set @sav_read_only=@@global.read_only; +set global read_only=1; +xa start '1'; +select 0; +0 +0 +xa end '1'; +xa prepare '1'; +xa commit '1'; +xa start '2'; +select 0; +0 +0 +xa end '2'; +xa prepare '2'; +xa rollback '2'; +# Read-only disconnect case +connect con1_ro,localhost,root,,; +xa start '3'; +select 0; +0 +0 +xa end '3'; +xa prepare '3'; +disconnect con1_ro; +connection default; +xa recover; +formatID gtrid_length bqual_length data +1 1 0 3 +xa commit '3'; +ERROR XA100: XA_RBROLLBACK: Transaction branch was rolled back +connect con2_ro,localhost,root,,; +xa start '4'; +select 0; +0 +0 +xa end '4'; +xa prepare '4'; +disconnect con2_ro; +connection default; +xa recover; +formatID gtrid_length bqual_length data +1 1 0 4 +xa rollback '4'; +ERROR XA100: XA_RBROLLBACK: Transaction branch was rolled back +set @@global.read_only=@sav_read_only; # # End of 10.5 tests # diff --git a/mysql-test/main/xa.test b/mysql-test/main/xa.test index 7cb6d46d112..77df6831355 100644 --- a/mysql-test/main/xa.test +++ b/mysql-test/main/xa.test @@ -696,6 +696,58 @@ disconnect con_tmp; --source include/wait_until_disconnected.inc connection default; +--echo # MDEV-30978: a read-only server should still allow the commit of +--echo # read-only XA transactions +set @sav_read_only=@@global.read_only; +set global read_only=1; + +# Commit case +xa start '1'; +select 0; +xa end '1'; +xa prepare '1'; +xa commit '1'; + +# Rollback case +xa start '2'; +select 0; +xa end '2'; +xa prepare '2'; +xa rollback '2'; + +--echo # Read-only disconnect case + +--source include/count_sessions.inc +connect (con1_ro,localhost,root,,); +xa start '3'; +select 0; +xa end '3'; +xa prepare '3'; +disconnect con1_ro; + +connection default; +--source include/wait_until_count_sessions.inc +xa recover; +--error ER_XA_RBROLLBACK +xa commit '3'; + +--source include/count_sessions.inc +connect (con2_ro,localhost,root,,); +xa start '4'; +select 0; +xa end '4'; +xa prepare '4'; +disconnect con2_ro; + +connection default; +--source include/wait_until_count_sessions.inc +xa recover; +--error ER_XA_RBROLLBACK +xa rollback '4'; + +set @@global.read_only=@sav_read_only; + + --echo # --echo # End of 10.5 tests --echo # diff --git a/mysql-test/std_data/wsrep_notify_ssl.sh b/mysql-test/std_data/wsrep_notify_ssl.sh index ce5e3f8c695..12dc939e689 100755 --- a/mysql-test/std_data/wsrep_notify_ssl.sh +++ b/mysql-test/std_data/wsrep_notify_ssl.sh @@ -12,7 +12,7 @@ PSWD='' # If these parameters are not set, then the values # passed by the server are taken: # -HOST="127.0.0.1" +HOST="::1" PORT=$NODE_MYPORT_1 # # Edit parameters below to specify SSL parameters: diff --git a/mysql-test/suite/archive/rnd_pos.test b/mysql-test/suite/archive/rnd_pos.test index 8c7a0e16a79..f0a8c9ad2f3 100644 --- a/mysql-test/suite/archive/rnd_pos.test +++ b/mysql-test/suite/archive/rnd_pos.test @@ -11,7 +11,9 @@ explain partitions select c1,c3 from t1 order by c2; set max_length_for_sort_data = 4; explain partitions select c1,c3 from t1 order by c2; flush status; +--disable_ps2_protocol select c1,c3 from t1 order by c2; +--enable_ps2_protocol set max_length_for_sort_data = default; --disable_ps_protocol show status where variable_name like '%tmp%' and value != 0; @@ -22,7 +24,9 @@ explain partitions select c1,c3 from t1 order by c2; set max_length_for_sort_data = 4; explain partitions select c1,c3 from t1 order by c2; flush status; +--disable_ps2_protocol select c1,c3 from t1 order by c2; +--enable_ps2_protocol set max_length_for_sort_data = default; --disable_ps_protocol show status where variable_name like '%tmp%' and value != 0; diff --git a/mysql-test/suite/binlog/include/database.test b/mysql-test/suite/binlog/include/database.test index 097a501cc34..e61198b2da2 100644 --- a/mysql-test/suite/binlog/include/database.test +++ b/mysql-test/suite/binlog/include/database.test @@ -44,7 +44,9 @@ CREATE TABLE t2(c1 INT); let $prefix= `SELECT UUID()`; --echo # Create a file in the database directory --replace_result $prefix FAKE_FILE +--disable_ps2_protocol eval SELECT 'hello' INTO OUTFILE 'fake_file.$prefix'; +--enable_ps2_protocol --echo --echo # 'DROP DATABASE' will fail if there is any other file in the the diff --git a/mysql-test/suite/binlog/t/binlog_empty_xa_prepared.test b/mysql-test/suite/binlog/t/binlog_empty_xa_prepared.test index b127178ebf7..52b4ad2037b 100644 --- a/mysql-test/suite/binlog/t/binlog_empty_xa_prepared.test +++ b/mysql-test/suite/binlog/t/binlog_empty_xa_prepared.test @@ -68,7 +68,9 @@ INSERT INTO t1 VALUES (1); CREATE SEQUENCE s ENGINE=InnoDB; XA START '2'; +--disable_ps2_protocol SELECT NEXT VALUE FOR s; +--enable_ps2_protocol REPLACE INTO t1 SELECT * FROM t1; XA END '2'; XA PREPARE '2'; diff --git a/mysql-test/suite/binlog/t/binlog_stm_row.test b/mysql-test/suite/binlog/t/binlog_stm_row.test index bade737c114..bef6b6e6a2c 100644 --- a/mysql-test/suite/binlog/t/binlog_stm_row.test +++ b/mysql-test/suite/binlog/t/binlog_stm_row.test @@ -41,6 +41,7 @@ INSERT INTO t2 VALUES(2); --echo # lock that will prevent the source table from being modified. --echo # +--disable_ps2_protocol --connection con1 SELECT GET_LOCK('Bug#34306', 120); --connection con2 @@ -87,6 +88,7 @@ INSERT INTO t2 VALUES (4); SELECT RELEASE_LOCK('Bug#34306'); --connection con2 --reap +--enable_ps2_protocol --disconnect con1 --disconnect con2 diff --git a/mysql-test/suite/binlog/t/binlog_unsafe.test b/mysql-test/suite/binlog/t/binlog_unsafe.test index 673712ff209..5e5d4c26954 100644 --- a/mysql-test/suite/binlog/t/binlog_unsafe.test +++ b/mysql-test/suite/binlog/t/binlog_unsafe.test @@ -573,7 +573,9 @@ END| RESET MASTER; CALL proc_insert_delayed(); +--disable_ps2_protocol SELECT func_limit(); +--enable_ps2_protocol source include/show_binlog_events.inc; SET @@session.binlog_format = @old_binlog_format; diff --git a/mysql-test/suite/binlog_encryption/rpl_gtid_basic.result b/mysql-test/suite/binlog_encryption/rpl_gtid_basic.result index 0e066fc0418..5771b0f405f 100644 --- a/mysql-test/suite/binlog_encryption/rpl_gtid_basic.result +++ b/mysql-test/suite/binlog_encryption/rpl_gtid_basic.result @@ -555,6 +555,62 @@ a 32 33 34 +*** MDEV-31723: Crash on SET SESSION gtid_seq_no= DEFAULT +connection server_1; +SET SESSION gtid_seq_no= 2000; +SELECT @@SESSION.gtid_seq_no; +@@SESSION.gtid_seq_no +2000 +INSERT INTO t1 VALUES (40); +SELECT @@SESSION.gtid_seq_no; +@@SESSION.gtid_seq_no +0 +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2000 +INSERT INTO t1 VALUES (41); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2001 +SET SESSION gtid_seq_no= 2010; +INSERT INTO t1 VALUES (42); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2010 +SET @old_strict= @@GLOBAL.gtid_strict_mode; +SET GLOBAL gtid_strict_mode= 1; +SET SESSION gtid_seq_no= 0; +INSERT INTO t1 VALUES (43); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2011 +SET GLOBAL gtid_strict_mode= @old_strict; +INSERT INTO t1 VALUES (44); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2012 +SET SESSION gtid_seq_no= 2020; +SET SESSION gtid_seq_no= 2030; +INSERT INTO t1 VALUES (45); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2030 +SET SESSION gtid_seq_no= 2040; +SET SESSION gtid_seq_no= DEFAULT; +INSERT INTO t1 VALUES (46); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2031 +INSERT INTO t1 VALUES (47); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2032 +SET SESSION gtid_seq_no= 2050; +SET SESSION gtid_seq_no= 0; +INSERT INTO t1 VALUES (48); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2033 connection server_1; DROP TABLE t1; include/rpl_end.inc diff --git a/mysql-test/suite/compat/oracle/r/rpl_sp_package.result b/mysql-test/suite/compat/oracle/r/rpl_sp_package.result index 2f10ec8ccd9..4c4995269fc 100644 --- a/mysql-test/suite/compat/oracle/r/rpl_sp_package.result +++ b/mysql-test/suite/compat/oracle/r/rpl_sp_package.result @@ -43,7 +43,10 @@ comment character_set_client latin1 collation_connection latin1_swedish_ci db_collation latin1_swedish_ci -body_utf8 +body_utf8 AS +FUNCTION f1 RETURN INT; +PROCEDURE p1; +END aggregate NONE db test name pack @@ -73,7 +76,16 @@ comment character_set_client latin1 collation_connection latin1_swedish_ci db_collation latin1_swedish_ci -body_utf8 +body_utf8 AS +FUNCTION f1 RETURN INT AS +BEGIN +RETURN 10; +END; +PROCEDURE p1 AS +BEGIN +SELECT f1(); +END; +END aggregate NONE SELECT * FROM mysql.proc WHERE db='test' AND name LIKE 'pack.%'; SET @@sql_mode=ORACLE; diff --git a/mysql-test/suite/compat/oracle/r/sp-memory-leak.result b/mysql-test/suite/compat/oracle/r/sp-memory-leak.result new file mode 100644 index 00000000000..109a9f84b52 --- /dev/null +++ b/mysql-test/suite/compat/oracle/r/sp-memory-leak.result @@ -0,0 +1,27 @@ +# +# Start of 10.5 tests +# +# +# MDEV-26186 280 Bytes lost in mysys/array.c, mysys/hash.c, sql/sp.cc, sql/sp.cc, sql/item_create.cc, sql/item_create.cc, sql/sql_yacc.yy:10748 when using oracle sql_mode +# +SET sql_mode= 'oracle'; +BEGIN CONTINUE WHEN f0(); +ERROR 42000: CONTINUE with no matching label: +SET sql_mode= 'oracle'; +BEGIN CONTINUE label WHEN f0(); +ERROR 42000: CONTINUE with no matching label: label +SET sql_mode= 'oracle'; +BEGIN EXIT WHEN f0(); +ERROR 42000: EXIT with no matching label: +SET sql_mode= 'oracle'; +BEGIN EXIT label WHEN f0(); +ERROR 42000: EXIT with no matching label: label +SET sql_mode= 'oracle'; +WHILE f(8)<1 DO SELECT 1;; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'DO SELECT 1' at line 1 +SET sql_mode= 'oracle'; +BEGIN DECLARE CONTINUE HANDLER FOR SQLEXCEPTION RETURN f0(); +ERROR 42000: RETURN is only allowed in a FUNCTION +# +# End of 10.5 tests +# diff --git a/mysql-test/suite/compat/oracle/r/sp-package-i_s.result b/mysql-test/suite/compat/oracle/r/sp-package-i_s.result new file mode 100644 index 00000000000..2f4201f7d60 --- /dev/null +++ b/mysql-test/suite/compat/oracle/r/sp-package-i_s.result @@ -0,0 +1,75 @@ +# +# Start of 10.5 tests +# +# +# MDEV-30662 SQL/PL package body does not appear in I_S.ROUTINES.ROUTINE_DEFINITION +# +SET sql_mode=ORACLE; +CREATE OR REPLACE PACKAGE pkg1 AS +FUNCTION f1() RETURN INT; +END; +$$ +CREATE PACKAGE BODY pkg1 AS +FUNCTION f1() RETURN INT AS +BEGIN +RETURN 1; +END; +END; +$$ +SELECT routine_name, routine_type, routine_definition +FROM information_schema.routines +WHERE routine_type LIKE 'PACKAGE%' +ORDER BY routine_type; +routine_name pkg1 +routine_type PACKAGE +routine_definition AS +FUNCTION f1() RETURN INT; +END +routine_name pkg1 +routine_type PACKAGE BODY +routine_definition AS +FUNCTION f1() RETURN INT AS +BEGIN +RETURN 1; +END; +END +DROP PACKAGE pkg1; +SET sql_mode=ORACLE; +CREATE OR REPLACE PACKAGE pkg1 AS +FUNCTION f1() RETURN INT; +END; +$$ +CREATE PACKAGE BODY pkg1 AS +FUNCTION f1() RETURN INT AS +BEGIN +RETURN 1; +END; +BEGIN +SET @a=10; +SET @a=f1(); +END; +$$ +SELECT routine_name, routine_type, routine_definition +FROM information_schema.routines +WHERE routine_type LIKE 'PACKAGE%' +ORDER BY routine_type; +routine_name pkg1 +routine_type PACKAGE +routine_definition AS +FUNCTION f1() RETURN INT; +END +routine_name pkg1 +routine_type PACKAGE BODY +routine_definition AS +FUNCTION f1() RETURN INT AS +BEGIN +RETURN 1; +END; +BEGIN +SET @a=10; +SET @a=f1(); +END +DROP PACKAGE pkg1; +# +# End of 10.5 tests +# diff --git a/mysql-test/suite/compat/oracle/r/sp-package.result b/mysql-test/suite/compat/oracle/r/sp-package.result index ef0acea5da1..ee17c048c0e 100644 --- a/mysql-test/suite/compat/oracle/r/sp-package.result +++ b/mysql-test/suite/compat/oracle/r/sp-package.result @@ -535,7 +535,13 @@ comment package-test2-comment character_set_client latin1 collation_connection latin1_swedish_ci db_collation latin1_swedish_ci -body_utf8 +body_utf8 AS +FUNCTION f1 RETURN INT DETERMINISTIC; +FUNCTION f2(a INT) RETURN INT; +FUNCTION concat RETURN INT; +PROCEDURE p1; +PROCEDURE p2(a INT); +END aggregate NONE SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='test' AND ROUTINE_NAME='test2'; SPECIFIC_NAME test2 @@ -553,7 +559,13 @@ CHARACTER_SET_NAME NULL COLLATION_NAME NULL DTD_IDENTIFIER NULL ROUTINE_BODY SQL -ROUTINE_DEFINITION +ROUTINE_DEFINITION AS +FUNCTION f1 RETURN INT DETERMINISTIC; +FUNCTION f2(a INT) RETURN INT; +FUNCTION concat RETURN INT; +PROCEDURE p1; +PROCEDURE p2(a INT); +END EXTERNAL_NAME NULL EXTERNAL_LANGUAGE NULL PARAMETER_STYLE SQL @@ -639,7 +651,13 @@ CHARACTER_SET_NAME NULL COLLATION_NAME NULL DTD_IDENTIFIER NULL ROUTINE_BODY SQL -ROUTINE_DEFINITION +ROUTINE_DEFINITION AS +FUNCTION f1 RETURN INT DETERMINISTIC; +FUNCTION f2(a INT) RETURN INT; +FUNCTION concat RETURN INT; +PROCEDURE p1; +PROCEDURE p2(a INT); +END EXTERNAL_NAME NULL EXTERNAL_LANGUAGE NULL PARAMETER_STYLE SQL @@ -670,7 +688,19 @@ CHARACTER_SET_NAME NULL COLLATION_NAME NULL DTD_IDENTIFIER NULL ROUTINE_BODY SQL -ROUTINE_DEFINITION +ROUTINE_DEFINITION AS +FUNCTION f1 RETURN INT AS BEGIN RETURN 10; END; +FUNCTION f2(a INT) RETURN INT AS BEGIN RETURN f1()+a; END; +FUNCTION concat RETURN INT AS BEGIN RETURN 1; END; +PROCEDURE p1 AS +BEGIN +SELECT f2(0); +END; +PROCEDURE p2(a INT) AS +BEGIN +SELECT f2(a); +END; +END EXTERNAL_NAME NULL EXTERNAL_LANGUAGE NULL PARAMETER_STYLE SQL diff --git a/mysql-test/suite/compat/oracle/t/sequence.test b/mysql-test/suite/compat/oracle/t/sequence.test index 719c4bcd45b..9bd8cec5852 100644 --- a/mysql-test/suite/compat/oracle/t/sequence.test +++ b/mysql-test/suite/compat/oracle/t/sequence.test @@ -2,6 +2,7 @@ SET sql_mode=ORACLE; +--disable_ps2_protocol CREATE SEQUENCE s1; SHOW CREATE SEQUENCE s1; SELECT s1.currval; @@ -13,12 +14,14 @@ SELECT nextval(s1); EXPLAIN EXTENDED SELECT s1.currval; SELECT lastval(s1); DROP SEQUENCE s1; - +--enable_ps2_protocol CREATE SEQUENCE s1; CREATE VIEW v1 AS SELECT s1.nextval AS a; SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME='v1'; +--disable_ps2_protocol SELECT * FROM v1; +--enable_ps2_protocol SHOW CREATE VIEW v1; DROP VIEW v1; DROP SEQUENCE s1; @@ -35,9 +38,11 @@ DROP SEQUENCE s1; --echo # --echo # MDEV-12533 sql_mode=ORACLE: Add support for database qualified sequence names in NEXTVAL and CURRVAL --echo # +--disable_ps2_protocol CREATE SEQUENCE s1; SELECT test.s1.nextval; SELECT test.s1.currval; SELECT .s1.nextval; SELECT .s1.currval; DROP SEQUENCE s1; +--enable_ps2_protocol diff --git a/mysql-test/suite/compat/oracle/t/sp-inout.test b/mysql-test/suite/compat/oracle/t/sp-inout.test index 9f9d3bdb26a..d605be645b3 100644 --- a/mysql-test/suite/compat/oracle/t/sp-inout.test +++ b/mysql-test/suite/compat/oracle/t/sp-inout.test @@ -1236,7 +1236,9 @@ DELIMITER ;$$ select * from Persons; set @a = 6; +--disable_ps2_protocol select pkg2.func_main(@a); +--enable_ps2_protocol select * from Persons; DROP TABLE Persons; DROP PACKAGE pkg2; @@ -1374,7 +1376,9 @@ DELIMITER ;$$ select * from Persons; set @a = 6; +--disable_ps2_protocol select pkg2.func_main(@a); +--enable_ps2_protocol select * from Persons; DROP TABLE Persons; DROP PACKAGE pkg2; diff --git a/mysql-test/suite/compat/oracle/t/sp-memory-leak.test b/mysql-test/suite/compat/oracle/t/sp-memory-leak.test new file mode 100644 index 00000000000..015169c2100 --- /dev/null +++ b/mysql-test/suite/compat/oracle/t/sp-memory-leak.test @@ -0,0 +1,35 @@ +--echo # +--echo # Start of 10.5 tests +--echo # + +--echo # +--echo # MDEV-26186 280 Bytes lost in mysys/array.c, mysys/hash.c, sql/sp.cc, sql/sp.cc, sql/item_create.cc, sql/item_create.cc, sql/sql_yacc.yy:10748 when using oracle sql_mode +--echo # + +SET sql_mode= 'oracle'; +--error ER_SP_LILABEL_MISMATCH +BEGIN CONTINUE WHEN f0(); + +SET sql_mode= 'oracle'; +--error ER_SP_LILABEL_MISMATCH +BEGIN CONTINUE label WHEN f0(); + +SET sql_mode= 'oracle'; +--error ER_SP_LILABEL_MISMATCH +BEGIN EXIT WHEN f0(); + +SET sql_mode= 'oracle'; +--error ER_SP_LILABEL_MISMATCH +BEGIN EXIT label WHEN f0(); + +SET sql_mode= 'oracle'; +--error ER_PARSE_ERROR +--query WHILE f(8)<1 DO SELECT 1; + +SET sql_mode= 'oracle'; +--error ER_SP_BADRETURN +BEGIN DECLARE CONTINUE HANDLER FOR SQLEXCEPTION RETURN f0(); + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/mysql-test/suite/compat/oracle/t/sp-package-i_s.test b/mysql-test/suite/compat/oracle/t/sp-package-i_s.test new file mode 100644 index 00000000000..a355e4841f8 --- /dev/null +++ b/mysql-test/suite/compat/oracle/t/sp-package-i_s.test @@ -0,0 +1,69 @@ +--source include/default_charset.inc + +--echo # +--echo # Start of 10.5 tests +--echo # + + +--echo # +--echo # MDEV-30662 SQL/PL package body does not appear in I_S.ROUTINES.ROUTINE_DEFINITION +--echo # + +# Testing a package without the executable section + +SET sql_mode=ORACLE; +DELIMITER $$; +CREATE OR REPLACE PACKAGE pkg1 AS + FUNCTION f1() RETURN INT; +END; +$$ +CREATE PACKAGE BODY pkg1 AS + FUNCTION f1() RETURN INT AS + BEGIN + RETURN 1; + END; +END; +$$ +DELIMITER ;$$ + +--vertical_results +SELECT routine_name, routine_type, routine_definition +FROM information_schema.routines +WHERE routine_type LIKE 'PACKAGE%' +ORDER BY routine_type; +--horizontal_results + +DROP PACKAGE pkg1; + +# Testing a package with the executable section + +SET sql_mode=ORACLE; +DELIMITER $$; +CREATE OR REPLACE PACKAGE pkg1 AS + FUNCTION f1() RETURN INT; +END; +$$ +CREATE PACKAGE BODY pkg1 AS + FUNCTION f1() RETURN INT AS + BEGIN + RETURN 1; + END; +BEGIN + SET @a=10; + SET @a=f1(); +END; +$$ +DELIMITER ;$$ + +--vertical_results +SELECT routine_name, routine_type, routine_definition +FROM information_schema.routines +WHERE routine_type LIKE 'PACKAGE%' +ORDER BY routine_type; +--horizontal_results + +DROP PACKAGE pkg1; + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/mysql-test/suite/compat/oracle/t/sp-package.test b/mysql-test/suite/compat/oracle/t/sp-package.test index 0092c869d50..b6310eedc53 100644 --- a/mysql-test/suite/compat/oracle/t/sp-package.test +++ b/mysql-test/suite/compat/oracle/t/sp-package.test @@ -3,6 +3,7 @@ SET sql_mode=ORACLE; --enable_prepare_warnings +--disable_ps2_protocol --echo # --echo # Creating a body of a non-existing package @@ -3013,6 +3014,7 @@ DELIMITER ;$$ SELECT db2.pkg1.var1(); CALL db2.pkg1.p2_db1_pkg1_p1; +--enable_ps2_protocol DROP DATABASE db1; DROP DATABASE db2; diff --git a/mysql-test/suite/federated/federatedx_create_handlers.result b/mysql-test/suite/federated/federatedx_create_handlers.result index db2006669c3..7fa7f797a24 100644 --- a/mysql-test/suite/federated/federatedx_create_handlers.result +++ b/mysql-test/suite/federated/federatedx_create_handlers.result @@ -196,7 +196,7 @@ FROM federated.t3, (SELECT * FROM federated.t1 WHERE id > 3) t WHERE federated.t3.name=t.name; 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 7 7.00 100.00 100.00 -1 PRIMARY ref key0 key0 18 federated.t3.name 2 0.00 100.00 100.00 +1 PRIMARY ref key0 key0 18 federated.t3.name 2 1.00 100.00 100.00 2 PUSHED DERIVED NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL SELECT * FROM federated.t3, (SELECT t1.name FROM federated.t1 @@ -253,7 +253,7 @@ ANALYZE "ref": ["federated.t3.name"], "r_loops": 7, "rows": 2, - "r_rows": 0, + "r_rows": 0.142857143, "r_table_time_ms": "REPLACED", "r_other_time_ms": "REPLACED", "filtered": 100, diff --git a/mysql-test/suite/federated/federatedx_create_handlers.test b/mysql-test/suite/federated/federatedx_create_handlers.test index f827c141f3d..19af71e02a9 100644 --- a/mysql-test/suite/federated/federatedx_create_handlers.test +++ b/mysql-test/suite/federated/federatedx_create_handlers.test @@ -94,9 +94,12 @@ DEFAULT CHARSET=latin1; INSERT INTO federated.t3 VALUES ('yyy'), ('www'), ('yyy'), ('xxx'), ('www'), ('yyy'), ('www'); +#Enable after fix MDEV-31361 +--disable_ps2_protocol SELECT * FROM federated.t3, (SELECT * FROM federated.t1 WHERE id > 3) t WHERE federated.t3.name=t.name; +--enable_ps2_protocol EXPLAIN SELECT * @@ -164,7 +167,9 @@ select * from federated.t4; select name into @var from federated.t1 where id=3 limit 1 ; select @var; +--disable_ps2_protocol select name into outfile 'tmp.txt' from federated.t1; +--enable_ps2_protocol let $path=`select concat(@@datadir, 'test/tmp.txt')`; remove_file $path; diff --git a/mysql-test/suite/funcs_1/storedproc/storedproc_10.inc b/mysql-test/suite/funcs_1/storedproc/storedproc_10.inc index 930322e203a..db8f45d0be7 100644 --- a/mysql-test/suite/funcs_1/storedproc/storedproc_10.inc +++ b/mysql-test/suite/funcs_1/storedproc/storedproc_10.inc @@ -266,6 +266,7 @@ BEGIN END// delimiter ;// +--disable_ps2_protocol CALL sp_ins_1(); SELECT row_count(); --sorted_result @@ -296,7 +297,7 @@ CALL sp_with_rowcount(); SELECT row_count(); --sorted_result SELECT * FROM temp; - +--enable_ps2_protocol # cleanup DROP PROCEDURE sp_ins_1; diff --git a/mysql-test/suite/funcs_1/t/is_basics_mixed.test b/mysql-test/suite/funcs_1/t/is_basics_mixed.test index bed3f633212..591a5ca566b 100644 --- a/mysql-test/suite/funcs_1/t/is_basics_mixed.test +++ b/mysql-test/suite/funcs_1/t/is_basics_mixed.test @@ -185,12 +185,14 @@ let $OUTFILE = $MYSQLTEST_VARDIR/tmp/datadict.out; --error 0,1 remove_file $OUTFILE; --replace_result $OUTFILE +--disable_ps2_protocol eval SELECT table_name,table_schema INTO OUTFILE '$OUTFILE' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM information_schema.tables WHERE table_schema = 'db_datadict' ORDER BY table_name; +--enable_ps2_protocol cat_file $OUTFILE; remove_file $OUTFILE; # diff --git a/mysql-test/suite/funcs_1/t/row_count_func.test b/mysql-test/suite/funcs_1/t/row_count_func.test index 3a76a6cac7c..fb207681bc6 100644 --- a/mysql-test/suite/funcs_1/t/row_count_func.test +++ b/mysql-test/suite/funcs_1/t/row_count_func.test @@ -18,12 +18,16 @@ INSERT INTO t1 VALUES (1), (2), (3); --enable_info --echo SELECT * FROM t1 INTO OUTFILE "MYSQL_TMP_DIR/bug21818.txt"; --disable_query_log # to avoid $MYSQL_TMP_DIR in query log +--disable_ps2_protocol --eval SELECT * FROM t1 INTO OUTFILE "$MYSQL_TMP_DIR/bug21818.txt" +--enable_ps2_protocol --enable_query_log --disable_info --echo +--disable_ps2_protocol SELECT ROW_COUNT(); +--enable_ps2_protocol --echo --echo # -- Check 2. @@ -33,7 +37,9 @@ SELECT a FROM t1 LIMIT 1 INTO @a; --disable_info --echo +--disable_ps2_protocol SELECT ROW_COUNT(); +--enable_ps2_protocol --enable_warnings --echo @@ -48,7 +54,9 @@ CREATE DATABASE mysqltest1; --disable_info --echo +--disable_ps2_protocol SELECT ROW_COUNT(); +--enable_ps2_protocol DROP DATABASE mysqltest1; @@ -65,7 +73,9 @@ DELETE FROM t1; --disable_info --echo +--disable_ps2_protocol SELECT ROW_COUNT(); +--enable_ps2_protocol --remove_file $MYSQL_TMP_DIR/bug21818.txt @@ -77,7 +87,9 @@ ALTER TABLE t1 ADD COLUMN b VARCHAR(255); --disable_info --echo +--disable_ps2_protocol SELECT ROW_COUNT(); +--enable_ps2_protocol --echo DROP TABLE t1; @@ -109,7 +121,9 @@ INSERT INTO t1 VALUES (1), (2), (3); --error ER_SP_DOES_NOT_EXIST SELECT f1(); +--disable_ps2_protocol SELECT ROW_COUNT(); +--enable_ps2_protocol DROP TABLE t1; diff --git a/mysql-test/suite/funcs_1/views/views_master.inc b/mysql-test/suite/funcs_1/views/views_master.inc index 573d72022fb..526e9e3426e 100644 --- a/mysql-test/suite/funcs_1/views/views_master.inc +++ b/mysql-test/suite/funcs_1/views/views_master.inc @@ -2912,6 +2912,7 @@ while ($run) # be wrong, please edit the while loop above and set $debug to 1. #-------------------------------------------------------------------------- # 1.1 Check of top level VIEW +--disable_ps2_protocol let $toplevel= `SELECT @max_level`; eval SHOW CREATE VIEW test3.v$toplevel; eval SELECT * FROM test3.v$toplevel; @@ -2924,7 +2925,7 @@ eval SHOW CREATE VIEW test3.v$toplevel; eval SELECT * FROM test3.v$toplevel; --error ER_VIEW_INVALID eval EXPLAIN SELECT * FROM test3.v$toplevel; - +--enable_ps2_protocol # 2. Complicated nested VIEWs # parameter @max_level = nesting level @@ -3054,8 +3055,10 @@ let $toplevel= `SELECT @max_level`; # Show should be easy eval SHOW CREATE VIEW test1.v$toplevel; # SELECT is much more complicated +--disable_ps2_protocol eval SELECT CAST(f1 AS SIGNED INTEGER) AS f1, CAST(f2 AS CHAR) AS f2 FROM test1.v$toplevel; +--enable_ps2_protocol let $message= The output of following EXPLAIN is deactivated, because the result differs on some platforms FIXME Is this a bug ? ; diff --git a/mysql-test/suite/galera/disabled.def b/mysql-test/suite/galera/disabled.def index 84ecd3eb7fb..ffdf0ea6e4b 100644 --- a/mysql-test/suite/galera/disabled.def +++ b/mysql-test/suite/galera/disabled.def @@ -13,19 +13,17 @@ galera_as_slave_ctas : MDEV-28378 timeout galera_pc_recovery : MDEV-25199 cluster fails to start up galera_sst_encrypted : MDEV-29876 Galera test failure on galera_sst_encrypted -MW-284 : MDEV-29861 Galera test case hangs galera_binlog_checksum : MDEV-29861 Galera test case hangs galera_var_notify_ssl_ipv6 : MDEV-29861 Galera test case hangs galera_var_notify_cmd: MDEV-29861 Galera test case hangs galera_var_node_address : MDEV-20485 Galera test failure MDEV-26575 : MDEV-29878 Galera test failure on MDEV-26575 galera_bf_abort_shutdown : MDEV-29918 Assertion failure on galera_bf_abort_shutdown -# Links to below failures in MDEV-30172 -galera_wan : [ERROR] WSREP: /home/buildbot/buildbot/build/gcs/src/gcs_state_msg.cpp:gcs_state_msg_get_quorum():947: Failed to establish quorum. galera_var_ignore_apply_errors : 28: "Server did not transition to READY state" galera_bf_kill_debug : timeout after 900 seconds galera_ssl_upgrade : [Warning] Failed to load slave replication state from table mysql.gtid_slave_pos: 130: Incorrect file format 'gtid_slave_pos' galera_parallel_simple : timeout related to wsrep_sync_wait galera_insert_bulk : MDEV-30536 no expected deadlock in galera_insert_bulk test +versioning_trx_id : MDEV-18590: galera.versioning_trx_id: Test failure: mysqltest: Result content mismatch MDEV-27713 : test is using get_lock(), which is now rejected in cluster galera_bf_abort_group_commit : MDEV-30855 PR to remove the test exists diff --git a/mysql-test/suite/galera/r/GAL-419.result b/mysql-test/suite/galera/r/GAL-419.result index 74508a1e75e..c70c9ee3263 100644 --- a/mysql-test/suite/galera/r/GAL-419.result +++ b/mysql-test/suite/galera/r/GAL-419.result @@ -2,6 +2,9 @@ connection node_2; connection node_1; call mtr.add_suppression("WSREP: It may not be safe to bootstrap the cluster from this node.*"); call mtr.add_suppression("Aborting"); +call mtr.add_suppression("Plugin \'wsrep\' init function returned error."); +call mtr.add_suppression("Plugin \'wsrep\' registration as a STORAGE ENGINE failed."); +call mtr.add_suppression("Failed to initialize plugins."); connection node_2; SET SESSION wsrep_sync_wait = 0; Killing server ... diff --git a/mysql-test/suite/galera/r/MDEV-18832.result b/mysql-test/suite/galera/r/MDEV-18832.result index 2e0872b9f2e..676ee4bf337 100644 --- a/mysql-test/suite/galera/r/MDEV-18832.result +++ b/mysql-test/suite/galera/r/MDEV-18832.result @@ -1,17 +1,14 @@ connection node_2; connection node_1; -CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1; +CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1 NOCACHE; CREATE TABLE t1 (Id int(11) NOT NULL, PRIMARY KEY (Id)); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); DROP SEQUENCE Seq1_1; -CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1; +CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1 NOCACHE; INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); ERROR 23000: Duplicate entry '1' for key 'PRIMARY' DROP SEQUENCE Seq1_1; DROP TABLE t1; -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); -connection node_2; -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); diff --git a/mysql-test/suite/galera/r/MDEV-21479.result b/mysql-test/suite/galera/r/MDEV-21479.result new file mode 100644 index 00000000000..7d1220a038b --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-21479.result @@ -0,0 +1,95 @@ +connection node_2; +connection node_1; +# Lets first see that we can access wsrep schema tables +# Node1 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_1 from mysql.wsrep_cluster; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; +EXPECT_2 +2 +connection node_2; +# Node2 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; +EXPECT_2 +2 +connection node_1; +SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; +SET GLOBAL wsrep_provider_options = 'pc.weight=2'; +connection node_2; +# Desync and disconnect node_2 +SET @@global.wsrep_desync = 1; +SET SESSION wsrep_dirty_reads=1; +SET SESSION wsrep_sync_wait=0; +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +VARIABLE_VALUE +non-Primary +connection node_1; +# Waiting until node_2 is not part of cluster anymore +# Verify that we can access wsrep schema tables +# Node1 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster_members; +EXPECT_1 +1 +connection node_2; +# Node2 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; +EXPECT_2 +2 +connection node_2; +# Reconnect node_2 back to cluster +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +SET wsrep_dirty_reads=0; +SHOW STATUS LIKE 'wsrep_desync_count'; +Variable_name Value +wsrep_desync_count 0 +SET @@global.wsrep_desync = 0; +CALL mtr.add_suppression("WSREP: Protocol violation. JOIN message sender (.*) is not in state transfer \\(SYNCED\\). Message ignored."); +connection node_1; +# Wait until both nodes are back to cluster +SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=false'; +SET GLOBAL wsrep_provider_options = 'pc.weight=1'; +# Verify that we can access wsrep schema tables +# Node1 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; +EXPECT_2 +2 +connection node_2; +# Node2 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +EXPECT_0 +0 +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +EXPECT_1 +1 +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; +EXPECT_2 +2 diff --git a/mysql-test/suite/galera/r/MDEV-27713.result b/mysql-test/suite/galera/r/MDEV-27713.result deleted file mode 100644 index 14575cb484d..00000000000 --- a/mysql-test/suite/galera/r/MDEV-27713.result +++ /dev/null @@ -1,46 +0,0 @@ -connection node_2; -connection node_1; -CREATE TABLE t1 ( -f1 INT, -f2 VARCHAR(255) PRIMARY KEY -) ENGINE=InnoDB DEFAULT CHARSET=utf8; -INSERT INTO t1 VALUES(1, 'abc'); -connection node_1; -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 VALUES (2,'def'); -connection node_2; -SET GLOBAL event_scheduler=ON; -CREATE PROCEDURE update_table() -BEGIN -SET AUTOCOMMIT=OFF; -DO GET_LOCK('local_lock', 0); -SET DEBUG_SYNC = 'innodb_row_update_for_mysql_begin SIGNAL blocked WAIT_FOR continue'; -UPDATE t1 SET f2 = 'jkl' WHERE f1 != 2; -DO RELEASE_LOCK('local_lock'); -END| -CREATE DEFINER=current_user -EVENT event -ON SCHEDULE AT CURRENT_TIMESTAMP -ON COMPLETION PRESERVE -ENABLE -DO CALL update_table(); -connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2; -SET DEBUG_SYNC = 'now WAIT_FOR blocked'; -connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2; -SET GLOBAL debug_dbug = "+d,sync.wsrep_apply_cb"; -connection node_1; -COMMIT; -connection node_2b; -SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; -SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; -connection node_2a; -SET DEBUG_SYNC = 'now SIGNAL continue'; -connection node_2; -SET GLOBAL event_scheduler=default; -DROP PROCEDURE update_table; -DROP EVENT event; -SET DEBUG_SYNC='reset'; -SET GLOBAL debug_dbug = DEFAULT; -connection node_1; -DROP TABLE t1; diff --git a/mysql-test/suite/galera/r/MDEV-27862.result b/mysql-test/suite/galera/r/MDEV-27862.result index 25b7bc6cfd2..d1aa9e2ca91 100644 --- a/mysql-test/suite/galera/r/MDEV-27862.result +++ b/mysql-test/suite/galera/r/MDEV-27862.result @@ -1,10 +1,5 @@ connection node_2; connection node_1; -CREATE SEQUENCE seq_nocache ENGINE=InnoDB; -DROP SEQUENCE seq_nocache; -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); -connection node_2; -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); connection node_1; CREATE SEQUENCE seq NOCACHE ENGINE=InnoDB; SELECT NEXTVAL(seq) = 1; diff --git a/mysql-test/suite/galera/r/MW-284.result b/mysql-test/suite/galera/r/MW-284.result index 3df126de728..6ca1f16db6b 100644 --- a/mysql-test/suite/galera/r/MW-284.result +++ b/mysql-test/suite/galera/r/MW-284.result @@ -13,6 +13,7 @@ connection node_3; SELECT @@wsrep_on; @@wsrep_on 0 +call mtr.add_suppression("Error reading packet from server: WSREP has not yet prepared node for application use (server_errno=1047)"); START SLAVE; include/wait_for_slave_param.inc [Slave_IO_Running] connection node_1; diff --git a/mysql-test/suite/galera/r/galera_gcache_recover_manytrx.result b/mysql-test/suite/galera/r/galera_gcache_recover_manytrx.result index 5718807b5c4..76f16791eb7 100644 --- a/mysql-test/suite/galera/r/galera_gcache_recover_manytrx.result +++ b/mysql-test/suite/galera/r/galera_gcache_recover_manytrx.result @@ -94,7 +94,7 @@ CALL insert_1m ();; connection node_1_insert_10m; CALL insert_10m ();; connection node_2; -call mtr.add_suppression("Error in Log_event::read_log_event():.*"); +call mtr.add_suppression("Error in Log_event::read_log_event\(\):.*"); SET SESSION wsrep_sync_wait = 0; Killing server ... connection node_1; @@ -131,6 +131,9 @@ DROP PROCEDURE update_simple; DROP PROCEDURE insert_1k; DROP PROCEDURE insert_1m; connection node_1; -call mtr.add_suppression("Error in Log_event::read_log_event():.*"); +call mtr.add_suppression("Error in Log_event::read_log_event\(\):.*"); CALL mtr.add_suppression("conflict state 7 after post commit"); CALL mtr.add_suppression("Skipped GCache ring buffer recovery"); +connection node_2; +call mtr.add_suppression("Error in Log_event::read_log_event\(\):.*"); +CALL mtr.add_suppression("Skipped GCache ring buffer recovery"); diff --git a/mysql-test/suite/galera/r/galera_log_bin.result b/mysql-test/suite/galera/r/galera_log_bin.result index df7ace9d95a..31f953bfd36 100644 --- a/mysql-test/suite/galera/r/galera_log_bin.result +++ b/mysql-test/suite/galera/r/galera_log_bin.result @@ -1,10 +1,10 @@ connection node_2; connection node_1; -connection node_1; +connection node_2; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; -connection node_2; +connection node_1; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; diff --git a/mysql-test/suite/galera/r/galera_log_bin_ext.result b/mysql-test/suite/galera/r/galera_log_bin_ext.result index b110cb4dba3..9d7ea473241 100644 --- a/mysql-test/suite/galera/r/galera_log_bin_ext.result +++ b/mysql-test/suite/galera/r/galera_log_bin_ext.result @@ -2,11 +2,11 @@ connection node_2; connection node_1; connection node_1; connection node_2; -connection node_1; +connection node_2; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; -connection node_2; +connection node_1; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; diff --git a/mysql-test/suite/galera/r/galera_log_bin_ext_mariabackup.result b/mysql-test/suite/galera/r/galera_log_bin_ext_mariabackup.result index b110cb4dba3..9d7ea473241 100644 --- a/mysql-test/suite/galera/r/galera_log_bin_ext_mariabackup.result +++ b/mysql-test/suite/galera/r/galera_log_bin_ext_mariabackup.result @@ -2,11 +2,11 @@ connection node_2; connection node_1; connection node_1; connection node_2; -connection node_1; +connection node_2; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; -connection node_2; +connection node_1; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; diff --git a/mysql-test/suite/galera/r/galera_log_bin_opt.result b/mysql-test/suite/galera/r/galera_log_bin_opt.result index df7ace9d95a..31f953bfd36 100644 --- a/mysql-test/suite/galera/r/galera_log_bin_opt.result +++ b/mysql-test/suite/galera/r/galera_log_bin_opt.result @@ -1,10 +1,10 @@ connection node_2; connection node_1; -connection node_1; +connection node_2; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; -connection node_2; +connection node_1; set global wsrep_on=OFF; reset master; set global wsrep_on=ON; diff --git a/mysql-test/suite/galera/r/galera_sequences.result b/mysql-test/suite/galera/r/galera_sequences.result index da669e6774e..e696a707cdf 100644 --- a/mysql-test/suite/galera/r/galera_sequences.result +++ b/mysql-test/suite/galera/r/galera_sequences.result @@ -1,11 +1,6 @@ connection node_2; connection node_1; connection node_1; -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); -CALL mtr.add_suppression("WSREP: CREATE TABLE isolation failure"); -connection node_2; -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); -connection node_1; CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 1000000 increment by 0 cache 1000 nocycle ENGINE=InnoDB; SHOW CREATE SEQUENCE seq; Table Create Table @@ -15,14 +10,14 @@ SHOW CREATE SEQUENCE seq; Table Create Table seq CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 1000000 increment by 0 cache 1000 nocycle ENGINE=InnoDB connection node_1; -ALTER SEQUENCE seq MAXVALUE = 10000; +ALTER SEQUENCE seq MAXVALUE = 10000 NOCACHE; SHOW CREATE SEQUENCE seq; Table Create Table -seq CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 10000 increment by 0 cache 1000 nocycle ENGINE=InnoDB +seq CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 10000 increment by 0 nocache nocycle ENGINE=InnoDB connection node_2; SHOW CREATE SEQUENCE seq; Table Create Table -seq CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 10000 increment by 0 cache 1000 nocycle ENGINE=InnoDB +seq CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 10000 increment by 0 nocache nocycle ENGINE=InnoDB connection node_1; DROP SEQUENCE seq; SHOW CREATE SEQUENCE seq; @@ -31,25 +26,26 @@ connection node_2; SHOW CREATE SEQUENCE seq; ERROR 42S02: Table 'test.seq' doesn't exist connection node_1; -CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1; +CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1 NOCACHE; select NEXT VALUE FOR Seq1_1; NEXT VALUE FOR Seq1_1 1 alter table Seq1_1 engine=myisam; +ERROR 42000: This version of MariaDB doesn't yet support 'Galera cluster does support only InnoDB sequences' select NEXT VALUE FOR Seq1_1; NEXT VALUE FOR Seq1_1 -1001 +2 alter table Seq1_1 engine=innodb; select NEXT VALUE FOR Seq1_1; NEXT VALUE FOR Seq1_1 -2001 +3 connection node_2; SHOW CREATE SEQUENCE Seq1_1; Table Create Table -Seq1_1 CREATE SEQUENCE `Seq1_1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 cache 1000 nocycle ENGINE=InnoDB +Seq1_1 CREATE SEQUENCE `Seq1_1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 nocache nocycle ENGINE=InnoDB select NEXT VALUE FOR Seq1_1; NEXT VALUE FOR Seq1_1 -3001 +4 connection node_1; DROP SEQUENCE Seq1_1; connection node_1; @@ -83,27 +79,192 @@ SET SESSION autocommit=1; DROP SEQUENCE seq1; DROP SEQUENCE seq2; DROP TABLE t2; +connection node_2; SET SESSION AUTOCOMMIT=0; SET SESSION wsrep_OSU_method='RSU'; CREATE TABLE t1(c1 VARCHAR(10)); -INSERT INTO t1 (c1) VALUES(''); create temporary sequence sq1 NOCACHE engine=innodb; create sequence sq2 NOCACHE engine=innodb; COMMIT; +SET SESSION wsrep_OSU_method='TOI'; SHOW CREATE SEQUENCE sq1; Table Create Table sq1 CREATE SEQUENCE `sq1` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 nocache nocycle ENGINE=InnoDB SHOW CREATE SEQUENCE sq2; Table Create Table sq2 CREATE SEQUENCE `sq2` start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 1 nocache nocycle ENGINE=InnoDB -connection node_2; +connection node_1; SHOW CREATE SEQUENCE sq1; ERROR 42S02: Table 'test.sq1' doesn't exist SHOW CREATE SEQUENCE sq2; ERROR 42S02: Table 'test.sq2' doesn't exist -connection node_1; +connection node_2; SET SESSION AUTOCOMMIT=1; DROP TABLE t1; DROP SEQUENCE sq1; DROP SEQUENCE sq2; -SET SESSION wsrep_OSU_method='TOI'; +connection node_1; +CREATE TABLE t (f INT) engine=innodb; +LOCK TABLE t WRITE; +CREATE OR REPLACE SEQUENCE t MAXVALUE=13 INCREMENT BY 1 NOCACHE engine=innodb; +Warnings: +Warning 138 Galera cluster does not support LOCK TABLE on SEQUENCES. Lock is released. +LOCK TABLE t WRITE; +ERROR 42000: This version of MariaDB doesn't yet support 'LOCK TABLE on SEQUENCES in Galera cluster' +INSERT INTO t VALUES (0,0,1,1,1,0,0,0); +SELECT * from t; +next_not_cached_value minimum_value maximum_value start_value increment cache_size cycle_option cycle_count +0 0 1 1 1 0 0 0 +SELECT NEXTVAL(t); +NEXTVAL(t) +0 +UNLOCK TABLES; +DROP TABLE t; +CREATE SEQUENCE t INCREMENT BY 0 NOCACHE ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), +b int) engine=innodb; +INSERT INTO t1(b) VALUES (1),(2),(3); +SELECT * FROM t1; +a b +1 1 +3 2 +5 3 +connection node_2; +SELECT * FROM t1; +a b +1 1 +3 2 +5 3 +INSERT INTO t1(b) VALUES (4),(5),(6); +SELECT * FROM t1; +a b +1 1 +3 2 +5 3 +8 4 +10 5 +12 6 +connection node_1; +SELECT * FROM t1; +a b +1 1 +3 2 +5 3 +8 4 +10 5 +12 6 +DROP TABLE t1; +DROP SEQUENCE t; +CREATE SEQUENCE t ENGINE=MYISAM; +ERROR 42000: This version of MariaDB doesn't yet support 'Galera cluster does support only InnoDB sequences' +CREATE SEQUENCE t INCREMENT BY 1 NOCACHE ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; +connection node_2; +# Wait DDL to replicate +connection node_1; +SELECT @@auto_increment_increment; +@@auto_increment_increment +2 +SELECT @@auto_increment_offset; +@@auto_increment_offset +1 +SET SESSION wsrep_sync_wait=0; +connection node_2; +SELECT @@auto_increment_increment; +@@auto_increment_increment +2 +SELECT @@auto_increment_offset; +@@auto_increment_offset +2 +SET SESSION wsrep_sync_wait=0; +connection node_1; +connection node_2; +connection node_1; +DROP SEQUENCE t; +DROP TABLE t1; +CREATE SEQUENCE t INCREMENT BY 0 NOCACHE ENGINE=INNODB; +DROP SEQUENCE t; +CREATE SEQUENCE t INCREMENT BY 1 CACHE=20 ENGINE=INNODB; +ERROR 42000: This version of MariaDB doesn't yet support 'In Galera if you use CACHE you should set INCREMENT BY 0 to behave correctly in a cluster' +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; +connection node_2; +# Wait DDL to replicate +connection node_1; +SET SESSION wsrep_sync_wait=0; +connection node_2; +SET SESSION wsrep_sync_wait=0; +connection node_1; +connection node_2; +connection node_1; +DROP SEQUENCE t; +DROP TABLE t1; +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +ALTER TABLE t ENGINE=MYISAM; +ERROR 42000: This version of MariaDB doesn't yet support 'Galera cluster does support only InnoDB sequences' +ALTER SEQUENCE t INCREMENT BY 1 CACHE=10; +ERROR 42000: This version of MariaDB doesn't yet support 'In Galera if you use CACHE you should set INCREMENT BY 0 to behave correctly in a cluster' +ALTER SEQUENCE t INCREMENT BY 1 NOCACHE; +ALTER SEQUENCE t INCREMENT BY 0 NOCACHE; +ALTER SEQUENCE t INCREMENT BY 0 CACHE=10; +DROP SEQUENCE t; +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; +BEGIN; +INSERT INTO t1(b) VALUES (1); +INSERT INTO t1(b) VALUES (2); +INSERT INTO t1(b) VALUES (3); +INSERT INTO t1(b) VALUES (4); +INSERT INTO t1(a,b) VALUES (2,2); +INSERT INTO t1(a,b) VALUES (3,2); +ERROR 23000: Duplicate entry '3' for key 'PRIMARY' +ROLLBACK; +SELECT * FROM t1; +a b +SELECT NEXTVAL(t); +NEXTVAL(t) +9 +connection node_2; +SELECT * FROM t1; +a b +SELECT NEXTVAL(t); +NEXTVAL(t) +2 +connection node_1; +DROP TABLE t1; +DROP SEQUENCE t; +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; +BEGIN; +INSERT INTO t1(b) VALUES (1); +INSERT INTO t1(b) VALUES (2); +INSERT INTO t1(b) VALUES (3); +INSERT INTO t1(b) VALUES (4); +INSERT INTO t1(a,b) VALUES (2,2); +INSERT INTO t1(a,b) VALUES (3,2); +ERROR 23000: Duplicate entry '3' for key 'PRIMARY' +COMMIT; +SELECT * FROM t1; +a b +1 1 +2 2 +3 2 +5 3 +7 4 +SELECT NEXTVAL(t); +NEXTVAL(t) +9 +connection node_2; +SELECT * FROM t1; +a b +1 1 +2 2 +3 2 +5 3 +7 4 +SELECT NEXTVAL(t); +NEXTVAL(t) +42 +connection node_1; +DROP TABLE t1; +DROP SEQUENCE t; diff --git a/mysql-test/suite/galera/r/galera_temporary_sequences.result b/mysql-test/suite/galera/r/galera_temporary_sequences.result new file mode 100644 index 00000000000..af80551c40b --- /dev/null +++ b/mysql-test/suite/galera/r/galera_temporary_sequences.result @@ -0,0 +1,46 @@ +connection node_2; +connection node_1; +connection node_2; +SET AUTOCOMMIT=0; +SET SESSION wsrep_OSU_method='RSU'; +CREATE TABLE t (i int primary key, j int); +CREATE TEMPORARY SEQUENCE seq2 NOCACHE ENGINE=InnoDB; +COMMIT; +SET SESSION wsrep_OSU_method='RSU'; +CREATE SEQUENCE seq1 NOCACHE ENGINE=InnoDB; +SET SESSION wsrep_OSU_method='TOI'; +DROP TABLE t; +DROP SEQUENCE seq2; +DROP SEQUENCE seq1; +connection node_1; +CREATE TABLE t (i int primary key, j int) ENGINE=InnoDB; +SET AUTOCOMMIT=0; +INSERT INTO t VALUES (3,0); +CREATE TEMPORARY SEQUENCE seq1 NOCACHE ENGINE=InnoDB; +COMMIT; +INSERT INTO t VALUES (4,0); +CREATE SEQUENCE seq2 NOCACHE ENGINE=InnoDB; +commit; +connection node_2; +SELECT * FROM t; +i j +3 0 +4 0 +SHOW CREATE TABLE seq1; +ERROR 42S02: Table 'test.seq1' doesn't exist +SHOW CREATE TABLE seq2; +Table Create Table +seq2 CREATE TABLE `seq2` ( + `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 SEQUENCE=1 +connection node_1; +DROP TABLE t; +DROP SEQUENCE seq1; +DROP SEQUENCE seq2; diff --git a/mysql-test/suite/galera/r/galera_vote_rejoin_ddl.result b/mysql-test/suite/galera/r/galera_vote_rejoin_ddl.result index 6ad7ac75314..c6b3d8fa554 100644 --- a/mysql-test/suite/galera/r/galera_vote_rejoin_ddl.result +++ b/mysql-test/suite/galera/r/galera_vote_rejoin_ddl.result @@ -3,10 +3,14 @@ connection node_1; connection node_1; connection node_2; connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; +connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4; +connection node_1; +connection node_2; +connection node_3; +connection node_4; connection node_3; SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; connection node_1; -connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4; connection node_4; SET SESSION wsrep_on=OFF; CREATE TABLE t1 (f1 INTEGER); diff --git a/mysql-test/suite/galera/r/mariadb_tzinfo_to_sql.result b/mysql-test/suite/galera/r/mariadb_tzinfo_to_sql.result old mode 100644 new mode 100755 index d47cec0992f..9750c97a481 --- a/mysql-test/suite/galera/r/mariadb_tzinfo_to_sql.result +++ b/mysql-test/suite/galera/r/mariadb_tzinfo_to_sql.result @@ -12,11 +12,7 @@ CREATE TABLE time_zone_transition LIKE mysql.time_zone_transition; CREATE TABLE time_zone_transition_type LIKE mysql.time_zone_transition_type; CREATE TABLE time_zone_leap_second LIKE mysql.time_zone_leap_second; ALTER TABLE time_zone_name ENGINE=MyISAM; -Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' ALTER TABLE time_zone_transition_type ENGINE=MyISAM; -Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' SET @save_wsrep_mode=@@WSREP_MODE; # # Run on zoneinfo directory --skip-write-binlog @@ -24,8 +20,6 @@ SET @save_wsrep_mode=@@WSREP_MODE; # Apply on node_1 -Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' 'binlog stationary as expected' SELECT @wsrep_is_on, @wsrep_cannot_replicate_tz, @save_wsrep_on, @save_sql_log_bin, @@WSREP_ON, @@SQL_LOG_BIN; @wsrep_is_on @wsrep_cannot_replicate_tz @save_wsrep_on @save_sql_log_bin @@WSREP_ON @@SQL_LOG_BIN @@ -79,8 +73,6 @@ COUNT(*) connection node_1; SET GLOBAL WSREP_MODE='REPLICATE_ARIA,REPLICATE_MYISAM'; -Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' 'binlog stationary as expected' SELECT @wsrep_is_on, @wsrep_cannot_replicate_tz, @save_wsrep_on, @save_sql_log_bin, @@WSREP_ON, @@SQL_LOG_BIN; @wsrep_is_on @wsrep_cannot_replicate_tz @save_wsrep_on @save_sql_log_bin @@WSREP_ON @@SQL_LOG_BIN @@ -136,8 +128,6 @@ COUNT(*) # Apply on node_1 connection node_1; -Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' 'binlog advanced as expected' SELECT @wsrep_is_on, @wsrep_cannot_replicate_tz, @save_wsrep_on, @save_sql_log_bin, @@WSREP_ON, @@SQL_LOG_BIN; @wsrep_is_on @wsrep_cannot_replicate_tz @save_wsrep_on @save_sql_log_bin @@WSREP_ON @@SQL_LOG_BIN @@ -196,10 +186,6 @@ TRUNCATE TABLE time_zone_leap_second; connection node_1; SET GLOBAL WSREP_MODE=''; -Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' -Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' 'binlog advanced as expected' SELECT @wsrep_is_on, @wsrep_cannot_replicate_tz, @save_wsrep_on, @save_sql_log_bin, @@WSREP_ON, @@SQL_LOG_BIN; @wsrep_is_on @wsrep_cannot_replicate_tz @save_wsrep_on @save_sql_log_bin @@WSREP_ON @@SQL_LOG_BIN diff --git a/mysql-test/suite/galera/r/mdev-28433.result b/mysql-test/suite/galera/r/mdev-28433.result new file mode 100644 index 00000000000..c2dde6481f4 --- /dev/null +++ b/mysql-test/suite/galera/r/mdev-28433.result @@ -0,0 +1,25 @@ +connection node_2; +connection node_1; +connection node_1; +connection node_2; +connection node_2; +SET @@global.wsrep_sst_donor = NULL; +ERROR 42000: Variable 'wsrep_sst_donor' can't be set to the value of 'NULL' +SET @@global.wsrep_cluster_address='NULL'; +SET SESSION wsrep_sync_wait=0; +SELECT @@wsrep_sst_donor; +@@wsrep_sst_donor + +SELECT @@wsrep_cluster_address; +@@wsrep_cluster_address +NULL +SHOW STATUS LIKE 'wsrep_ready'; +Variable_name Value +wsrep_ready OFF +SHOW STATUS LIKE 'wsrep_cluster_status'; +Variable_name Value +wsrep_cluster_status Disconnected +call mtr.add_suppression("WSREP: .*Invalid backend URI.*"); +call mtr.add_suppression("WSREP: gcs connect failed: Invalid argument"); +disconnect node_2; +disconnect node_1; diff --git a/mysql-test/suite/galera/r/mdev-30013.result b/mysql-test/suite/galera/r/mdev-30013.result new file mode 100644 index 00000000000..86016b09ca6 --- /dev/null +++ b/mysql-test/suite/galera/r/mdev-30013.result @@ -0,0 +1,17 @@ +connection node_2; +connection node_1; +INSTALL PLUGIN ARCHIVE SONAME 'ha_archive.so'; +CREATE TABLE t (a CHAR(1)) ENGINE=ARCHIVE; +SHOW CREATE TABLE t; +Table Create Table +t CREATE TABLE `t` ( + `a` char(1) DEFAULT NULL +) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +INSERT INTO t VALUES ('A'); +UNINSTALL SONAME 'ha_archive'; +Warnings: +Warning 1620 Plugin is busy and will be uninstalled on shutdown +ALTER TABLE t CHANGE COLUMN a a CHAR(2); +INSERT INTO t (a) VALUES ('AB'); +ERROR 42000: Unknown storage engine 'ARCHIVE' +DROP TABLE t; diff --git a/mysql-test/suite/galera/t/GAL-419.test b/mysql-test/suite/galera/t/GAL-419.test index d304b01ed5e..60c34f209eb 100644 --- a/mysql-test/suite/galera/t/GAL-419.test +++ b/mysql-test/suite/galera/t/GAL-419.test @@ -7,6 +7,9 @@ call mtr.add_suppression("WSREP: It may not be safe to bootstrap the cluster from this node.*"); call mtr.add_suppression("Aborting"); +call mtr.add_suppression("Plugin \'wsrep\' init function returned error."); +call mtr.add_suppression("Plugin \'wsrep\' registration as a STORAGE ENGINE failed."); +call mtr.add_suppression("Failed to initialize plugins."); --connection node_2 SET SESSION wsrep_sync_wait = 0; diff --git a/mysql-test/suite/galera/t/MDEV-18832.test b/mysql-test/suite/galera/t/MDEV-18832.test index ba93761435a..d60be151142 100644 --- a/mysql-test/suite/galera/t/MDEV-18832.test +++ b/mysql-test/suite/galera/t/MDEV-18832.test @@ -1,23 +1,15 @@ --source include/galera_cluster.inc --source include/have_innodb.inc -CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1; +CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1 NOCACHE; CREATE TABLE t1 (Id int(11) NOT NULL, PRIMARY KEY (Id)); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); DROP SEQUENCE Seq1_1; -CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1; +CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1 NOCACHE; --error ER_DUP_ENTRY INSERT INTO t1 VALUES (NEXT VALUE FOR Seq1_1); DROP SEQUENCE Seq1_1; DROP TABLE t1; - -# Supress warning for SEQUENCES that are declared without `NOCACHE` introduced with MDEV-27862 - -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); - ---connection node_2 - -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); diff --git a/mysql-test/suite/galera/t/MDEV-21479.test b/mysql-test/suite/galera/t/MDEV-21479.test new file mode 100644 index 00000000000..86de97ea77c --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-21479.test @@ -0,0 +1,99 @@ +# +# MDEV-21479 : Galera 4 unable to query cluster state if not primary component +# +--source include/galera_cluster.inc +--source include/have_innodb.inc + + +--echo # Lets first see that we can access wsrep schema tables +--echo # Node1 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_1 from mysql.wsrep_cluster; +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; + +--connection node_2 +--echo # Node2 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; + +--connection node_1 +# Make node 1 tolerate split-brain +SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=true'; +SET GLOBAL wsrep_provider_options = 'pc.weight=2'; + +# Desync and disconnect node 2 from the PC: +--connection node_2 +--echo # Desync and disconnect node_2 +SET @@global.wsrep_desync = 1; +SET SESSION wsrep_dirty_reads=1; +SET SESSION wsrep_sync_wait=0; +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; +--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; + +# Wait until node 2 disappears from the PC: +--connection node_1 +--echo # Waiting until node_2 is not part of cluster anymore +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +--echo # Verify that we can access wsrep schema tables +--echo # Node1 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster_members; + +--connection node_2 +# +# Here node2 remembers old configuration even when we are non-Primary +# +--echo # Node2 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; + +# Reconnect node 2 to the PC: +--connection node_2 +--echo # Reconnect node_2 back to cluster +SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +SET wsrep_dirty_reads=0; +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'ON' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_ready'; +--source include/wait_condition.inc + +# Must return 0: +SHOW STATUS LIKE 'wsrep_desync_count'; + +# Resync node_2, should pass: +SET @@global.wsrep_desync = 0; + +--let $wait_condition = SELECT VARIABLE_VALUE = 'Synced' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_local_state_comment'; +--source include/wait_condition.inc + +CALL mtr.add_suppression("WSREP: Protocol violation. JOIN message sender (.*) is not in state transfer \\(SYNCED\\). Message ignored."); + +--connection node_1 +--echo # Wait until both nodes are back to cluster +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; +--source include/wait_condition.inc +SET GLOBAL wsrep_provider_options = 'pc.ignore_sb=false'; +SET GLOBAL wsrep_provider_options = 'pc.weight=1'; + +--echo # Verify that we can access wsrep schema tables +--echo # Node1 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; + +--connection node_2 +--echo # Node2 +SELECT COUNT(*) AS EXPECT_0 FROM mysql.wsrep_streaming_log; +SELECT COUNT(*) AS EXPECT_1 FROM mysql.wsrep_cluster; +SELECT COUNT(*) AS EXPECT_2 FROM mysql.wsrep_cluster_members; diff --git a/mysql-test/suite/galera/t/MDEV-27713.test b/mysql-test/suite/galera/t/MDEV-27713.test deleted file mode 100644 index 4bfcd7e3d50..00000000000 --- a/mysql-test/suite/galera/t/MDEV-27713.test +++ /dev/null @@ -1,67 +0,0 @@ ---source include/galera_cluster.inc ---source include/have_innodb.inc ---source include/have_debug.inc ---source include/have_debug_sync.inc ---source include/big_test.inc - -CREATE TABLE t1 ( - f1 INT, - f2 VARCHAR(255) PRIMARY KEY -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -INSERT INTO t1 VALUES(1, 'abc'); - ---connection node_1 -SET AUTOCOMMIT=OFF; -START TRANSACTION; -INSERT INTO t1 VALUES (2,'def'); - ---connection node_2 - -SET GLOBAL event_scheduler=ON; - -DELIMITER |; -CREATE PROCEDURE update_table() -BEGIN - SET AUTOCOMMIT=OFF; - DO GET_LOCK('local_lock', 0); - SET DEBUG_SYNC = 'innodb_row_update_for_mysql_begin SIGNAL blocked WAIT_FOR continue'; - UPDATE t1 SET f2 = 'jkl' WHERE f1 != 2; - DO RELEASE_LOCK('local_lock'); -END| -DELIMITER ;| - -CREATE DEFINER=current_user - EVENT event - ON SCHEDULE AT CURRENT_TIMESTAMP - ON COMPLETION PRESERVE - ENABLE - DO CALL update_table(); - ---connect node_2a, 127.0.0.1, root, , test, $NODE_MYPORT_2 -SET DEBUG_SYNC = 'now WAIT_FOR blocked'; - -# Applier control thread ---connect node_2b, 127.0.0.1, root, , test, $NODE_MYPORT_2 -SET GLOBAL debug_dbug = "+d,sync.wsrep_apply_cb"; - ---connection node_1 -COMMIT; - -# Applier control thread ---connection node_2b -SET DEBUG_SYNC = "now WAIT_FOR sync.wsrep_apply_cb_reached"; -SET DEBUG_SYNC = "now SIGNAL signal.wsrep_apply_cb"; - ---connection node_2a -SET DEBUG_SYNC = 'now SIGNAL continue'; - ---connection node_2 -SET GLOBAL event_scheduler=default; -DROP PROCEDURE update_table; -DROP EVENT event; -SET DEBUG_SYNC='reset'; -SET GLOBAL debug_dbug = DEFAULT; - ---connection node_1 -DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-27862.test b/mysql-test/suite/galera/t/MDEV-27862.test index 89d3465b91f..d23ce95d47e 100644 --- a/mysql-test/suite/galera/t/MDEV-27862.test +++ b/mysql-test/suite/galera/t/MDEV-27862.test @@ -1,17 +1,6 @@ --source include/galera_cluster.inc --source include/have_innodb.inc -# Report WARNING when SEQUENCE is created without `NOCACHE` - -CREATE SEQUENCE seq_nocache ENGINE=InnoDB; -DROP SEQUENCE seq_nocache; - -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); - ---connection node_2 - -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); - # NEXTVAL --connection node_1 diff --git a/mysql-test/suite/galera/t/MW-284.test b/mysql-test/suite/galera/t/MW-284.test index 99fe305d859..d7da1dcd214 100644 --- a/mysql-test/suite/galera/t/MW-284.test +++ b/mysql-test/suite/galera/t/MW-284.test @@ -29,6 +29,7 @@ SET global wsrep_sync_wait=0; --connection node_3 SELECT @@wsrep_on; --sleep 1 +call mtr.add_suppression("Error reading packet from server: WSREP has not yet prepared node for application use (server_errno=1047)"); START SLAVE; --let $slave_param= Slave_IO_Running --let $slave_param_value= Connecting diff --git a/mysql-test/suite/galera/t/galera_bf_abort_group_commit.cnf b/mysql-test/suite/galera/t/galera_bf_abort_group_commit.cnf deleted file mode 100644 index 612418c17c0..00000000000 --- a/mysql-test/suite/galera/t/galera_bf_abort_group_commit.cnf +++ /dev/null @@ -1,15 +0,0 @@ -!include ../galera_2nodes.cnf - -# We set repl.commit_order=1 in order to disable provider commit -# ordering. - -[mysqld.1] -log-bin -log-slave-updates -wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.1.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;repl.commit_order=1' - -[mysqld.2] - -log-bin -log-slave-updates -wsrep_provider_options='repl.causal_read_timeout=PT90S;base_port=@mysqld.2.#galera_port;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;repl.commit_order=1' \ No newline at end of file diff --git a/mysql-test/suite/galera/t/galera_bf_abort_group_commit.test b/mysql-test/suite/galera/t/galera_bf_abort_group_commit.test deleted file mode 100644 index a828701cd0e..00000000000 --- a/mysql-test/suite/galera/t/galera_bf_abort_group_commit.test +++ /dev/null @@ -1,77 +0,0 @@ -# -# This test uses galera_sr_bf_abort.inc to probe various BF abort points -# for SR transactions with wsrep provider commit ordering disabled. -# - ---source include/galera_cluster.inc ---source include/have_innodb.inc ---source include/galera_have_debug_sync.inc - -# Control connection for manipulating sync points on node 1 ---connect node_1a, 127.0.0.1, root, , test, $NODE_MYPORT_1 -SET SESSION wsrep_sync_wait = 0; - -# SR bf abort on fragment ---let $wsrep_trx_fragment_size = 1 ---echo galera_sr_bf_abort_at_commit = 0 ---let $galera_sr_bf_abort_at_commit = 0 - ---echo after_replicate_sync ---let $galera_sr_bf_abort_sync_point = after_replicate_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo local_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = local_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo apply_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = apply_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo commit_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = commit_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - -# SR bf abort on commit fragment ---let $wsrep_trx_fragment_size = 1 ---echo galera_sr_bf_abort_at_commit = 1 ---let $galera_sr_bf_abort_at_commit = 1 - ---echo after_replicate_sync ---let $galera_sr_bf_abort_sync_point = after_replicate_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo local_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = local_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo apply_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = apply_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo commit_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = commit_monitor_master_enter_sync ---source suite/galera/t/galera_sr_bf_abort.inc - -# Normal bf abort on commit ---let $wsrep_trx_fragment_size = 0 ---echo galera_sr_bf_abort_at_commit = 1 ---let $galera_sr_bf_abort_at_commit = 1 - ---echo after_replicate_sync ---let $galera_sr_bf_abort_sync_point = after_replicate_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo local_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = local_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo apply_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = apply_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - ---echo commit_monitor_master_enter_sync ---let $galera_sr_bf_abort_sync_point = commit_monitor_master_enter_sync ---source ../../suite/galera_sr/t/galera_sr_bf_abort.inc - -CALL mtr.add_suppression("WSREP: fragment replication failed: 1"); diff --git a/mysql-test/suite/galera/t/galera_bf_abort_ps_bind.cnf b/mysql-test/suite/galera/t/galera_bf_abort_ps_bind.cnf index 62cf1854032..7df8ed28a4d 100644 --- a/mysql-test/suite/galera/t/galera_bf_abort_ps_bind.cnf +++ b/mysql-test/suite/galera/t/galera_bf_abort_ps_bind.cnf @@ -2,6 +2,10 @@ [mysqld.1] wsrep-debug=1 +auto_increment_offset=1 +auto_increment_increment=2 [mysqld.2] wsrep-debug=1 +auto_increment_offset=2 +auto_increment_increment=2 diff --git a/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test b/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test index 214d5166781..e3921264f3d 100644 --- a/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test +++ b/mysql-test/suite/galera/t/galera_gcache_recover_manytrx.test @@ -126,7 +126,7 @@ DELIMITER ;| --send CALL insert_10m (); --connection node_2 -call mtr.add_suppression("Error in Log_event::read_log_event():.*"); +call mtr.add_suppression("Error in Log_event::read_log_event\(\):.*"); SET SESSION wsrep_sync_wait = 0; # Make sure that node_2 is not killed while TOIs are applied. @@ -200,8 +200,12 @@ DROP PROCEDURE insert_1k; DROP PROCEDURE insert_1m; --connection node_1 -call mtr.add_suppression("Error in Log_event::read_log_event():.*"); +call mtr.add_suppression("Error in Log_event::read_log_event\(\):.*"); CALL mtr.add_suppression("conflict state 7 after post commit"); # Warning happens when the cluster is started for the first time CALL mtr.add_suppression("Skipped GCache ring buffer recovery"); + +--connection node_2 +call mtr.add_suppression("Error in Log_event::read_log_event\(\):.*"); +CALL mtr.add_suppression("Skipped GCache ring buffer recovery"); diff --git a/mysql-test/suite/galera/t/galera_log_bin.inc b/mysql-test/suite/galera/t/galera_log_bin.inc index 4c245846752..3cac28047d4 100644 --- a/mysql-test/suite/galera/t/galera_log_bin.inc +++ b/mysql-test/suite/galera/t/galera_log_bin.inc @@ -1,11 +1,11 @@ --source include/galera_cluster.inc --source include/force_restart.inc ---connection node_1 +--connection node_2 set global wsrep_on=OFF; reset master; set global wsrep_on=ON; ---connection node_2 +--connection node_1 set global wsrep_on=OFF; reset master; set global wsrep_on=ON; diff --git a/mysql-test/suite/galera/t/galera_log_bin_sst.inc b/mysql-test/suite/galera/t/galera_log_bin_sst.inc index 3d20add6d9e..87420ad539f 100644 --- a/mysql-test/suite/galera/t/galera_log_bin_sst.inc +++ b/mysql-test/suite/galera/t/galera_log_bin_sst.inc @@ -6,11 +6,11 @@ --let $node_2=node_2 --source include/auto_increment_offset_save.inc ---connection node_1 +--connection node_2 set global wsrep_on=OFF; reset master; set global wsrep_on=ON; ---connection node_2 +--connection node_1 set global wsrep_on=OFF; reset master; set global wsrep_on=ON; diff --git a/mysql-test/suite/galera/t/galera_sequences.cnf b/mysql-test/suite/galera/t/galera_sequences.cnf index 98e724fb2d0..3a0543e3d34 100644 --- a/mysql-test/suite/galera/t/galera_sequences.cnf +++ b/mysql-test/suite/galera/t/galera_sequences.cnf @@ -3,7 +3,11 @@ [mysqld.1] log-bin log-slave-updates +auto-increment-increment=2 +auto-increment-offset=1 [mysqld.2] log-bin log-slave-updates +auto-increment-increment=2 +auto-increment-offset=2 diff --git a/mysql-test/suite/galera/t/galera_sequences.test b/mysql-test/suite/galera/t/galera_sequences.test index 613823d83e9..5c03ab973e0 100644 --- a/mysql-test/suite/galera/t/galera_sequences.test +++ b/mysql-test/suite/galera/t/galera_sequences.test @@ -5,13 +5,6 @@ # MDEV-19353 : Alter Sequence do not replicate to another nodes with in Galera Cluster # ---connection node_1 -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); -CALL mtr.add_suppression("WSREP: CREATE TABLE isolation failure"); ---connection node_2 - -CALL mtr.add_suppression("SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); - --connection node_1 CREATE SEQUENCE `seq` start with 1 minvalue 1 maxvalue 1000000 increment by 0 cache 1000 nocycle ENGINE=InnoDB; SHOW CREATE SEQUENCE seq; @@ -20,7 +13,7 @@ SHOW CREATE SEQUENCE seq; SHOW CREATE SEQUENCE seq; --connection node_1 -ALTER SEQUENCE seq MAXVALUE = 10000; +ALTER SEQUENCE seq MAXVALUE = 10000 NOCACHE; SHOW CREATE SEQUENCE seq; --connection node_2 @@ -39,8 +32,9 @@ SHOW CREATE SEQUENCE seq; # MDEV-18848 : Galera: 10.4 node crashed with Assertion `client_state.transaction().active()` after altering SEQUENCE table's engine to myisam and back to innodb # --connection node_1 -CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1; +CREATE SEQUENCE Seq1_1 START WITH 1 INCREMENT BY 1 NOCACHE; select NEXT VALUE FOR Seq1_1; +--error ER_NOT_SUPPORTED_YET alter table Seq1_1 engine=myisam; select NEXT VALUE FOR Seq1_1; alter table Seq1_1 engine=innodb; @@ -78,23 +72,247 @@ DROP TABLE t2; # # Case2 # +--connection node_2 SET SESSION AUTOCOMMIT=0; SET SESSION wsrep_OSU_method='RSU'; CREATE TABLE t1(c1 VARCHAR(10)); -INSERT INTO t1 (c1) VALUES(''); create temporary sequence sq1 NOCACHE engine=innodb; create sequence sq2 NOCACHE engine=innodb; COMMIT; +SET SESSION wsrep_OSU_method='TOI'; SHOW CREATE SEQUENCE sq1; SHOW CREATE SEQUENCE sq2; ---connection node_2 ---error ER_NO_SUCH_TABLE -SHOW CREATE SEQUENCE sq1; ---error ER_NO_SUCH_TABLE -SHOW CREATE SEQUENCE sq2; --connection node_1 +--error ER_NO_SUCH_TABLE +SHOW CREATE SEQUENCE sq1; +--error ER_NO_SUCH_TABLE +SHOW CREATE SEQUENCE sq2; +--connection node_2 SET SESSION AUTOCOMMIT=1; DROP TABLE t1; DROP SEQUENCE sq1; DROP SEQUENCE sq2; -SET SESSION wsrep_OSU_method='TOI'; + +# +# MDEV-30388 Assertion `!wsrep_has_changes(thd) || (thd->lex->sql_command == SQLCOM_CREATE_TABLE +# && !thd->is_current_stmt_binlog_format_row()) || +# thd->wsrep_cs().transaction().state() == wsrep::transaction::s_aborted' failed +# +--connection node_1 +CREATE TABLE t (f INT) engine=innodb; +LOCK TABLE t WRITE; +CREATE OR REPLACE SEQUENCE t MAXVALUE=13 INCREMENT BY 1 NOCACHE engine=innodb; +--error ER_NOT_SUPPORTED_YET +LOCK TABLE t WRITE; +INSERT INTO t VALUES (0,0,1,1,1,0,0,0); +SELECT * from t; +SELECT NEXTVAL(t); +UNLOCK TABLES; +DROP TABLE t; + +CREATE SEQUENCE t INCREMENT BY 0 NOCACHE ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), +b int) engine=innodb; +INSERT INTO t1(b) VALUES (1),(2),(3); +SELECT * FROM t1; + +--connection node_2 +SELECT * FROM t1; +INSERT INTO t1(b) VALUES (4),(5),(6); +SELECT * FROM t1; + +--connection node_1 +SELECT * FROM t1; +DROP TABLE t1; +DROP SEQUENCE t; + +# +# Test Galera SEQUENCE support +# +# +# No MyISAM SEQUENCES +# +--error ER_NOT_SUPPORTED_YET +CREATE SEQUENCE t ENGINE=MYISAM; +CREATE SEQUENCE t INCREMENT BY 1 NOCACHE ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; + +--connection node_2 +--echo # Wait DDL to replicate +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1' +--source include/wait_condition.inc + +# +# Below we do not care order of INSERTs we care only that values are unique +# +--connection node_1 +SELECT @@auto_increment_increment; +SELECT @@auto_increment_offset; +--let $wsrep_sync_wait_orig_1 = `SELECT @@wsrep_sync_wait` +SET SESSION wsrep_sync_wait=0; + +--connection node_2 +SELECT @@auto_increment_increment; +SELECT @@auto_increment_offset; +--let $wsrep_sync_wait_orig_2 = `SELECT @@wsrep_sync_wait` +SET SESSION wsrep_sync_wait=0; + +--let $count = 20 +--disable_query_log +while ($count) +{ +--connection node_1 +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (1); +--connection node_2 +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (2); +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (2); +--connection node_1 +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (1); +--dec $count +} +--enable_query_log + +--connection node_1 +--disable_query_log +--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig_1 +--enable_query_log + +--connection node_2 +--disable_query_log +--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig_2 +--enable_query_log + +--connection node_1 +DROP SEQUENCE t; +DROP TABLE t1; +CREATE SEQUENCE t INCREMENT BY 0 NOCACHE ENGINE=INNODB; +DROP SEQUENCE t; +--error ER_NOT_SUPPORTED_YET +CREATE SEQUENCE t INCREMENT BY 1 CACHE=20 ENGINE=INNODB; + +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; + +--connection node_2 +--echo # Wait DDL to replicate +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't' +--source include/wait_condition.inc +--let $wait_condition = SELECT COUNT(*) = 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1' +--source include/wait_condition.inc + +# +# Below we do not care order of INSERTs we care only that values are unique +# +--connection node_1 +--let $wsrep_sync_wait_orig_1 = `SELECT @@wsrep_sync_wait` +SET SESSION wsrep_sync_wait=0; + +--connection node_2 +--let $wsrep_sync_wait_orig_2 = `SELECT @@wsrep_sync_wait` +SET SESSION wsrep_sync_wait=0; + +--let $count = 5 +--disable_query_log +while ($count) +{ +--connection node_1 +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (1),(2),(3),(4),(5),(6),(7),(8),(9); +--connection node_2 +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (21),(22),(23),(24),(25),(26),(27),(28),(29); +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (21),(22),(23),(24),(25),(26),(27),(28),(29); +--connection node_1 +--error 0,ER_LOCK_WAIT_TIMEOUT +INSERT INTO t1(b) values (1),(2),(3),(4),(5),(6),(7),(8),(9); +--dec $count +} +--enable_query_log + +--connection node_1 +--disable_query_log +--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig_1 +--enable_query_log + +--connection node_2 +--disable_query_log +--eval SET SESSION wsrep_sync_wait = $wsrep_sync_wait_orig_2 +--enable_query_log + +--connection node_1 +DROP SEQUENCE t; +DROP TABLE t1; + +# +# Test ALTER table to sequence and ALTER SEQUENCE +# +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +--error ER_NOT_SUPPORTED_YET +ALTER TABLE t ENGINE=MYISAM; +--error ER_NOT_SUPPORTED_YET +ALTER SEQUENCE t INCREMENT BY 1 CACHE=10; +ALTER SEQUENCE t INCREMENT BY 1 NOCACHE; +ALTER SEQUENCE t INCREMENT BY 0 NOCACHE; +ALTER SEQUENCE t INCREMENT BY 0 CACHE=10; +DROP SEQUENCE t; + +# +# Test transactions +# +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; +# +# ROLLBACK TRX +# +BEGIN; +INSERT INTO t1(b) VALUES (1); +INSERT INTO t1(b) VALUES (2); +INSERT INTO t1(b) VALUES (3); +INSERT INTO t1(b) VALUES (4); +INSERT INTO t1(a,b) VALUES (2,2); +--error ER_DUP_ENTRY +INSERT INTO t1(a,b) VALUES (3,2); +ROLLBACK; +SELECT * FROM t1; +SELECT NEXTVAL(t); + +--connection node_2 +SELECT * FROM t1; +SELECT NEXTVAL(t); + +--connection node_1 +DROP TABLE t1; +DROP SEQUENCE t; + +CREATE SEQUENCE t INCREMENT BY 0 CACHE=20 ENGINE=INNODB; +CREATE TABLE t1(a int not null primary key default nextval(t), b int) engine=innodb; +# +# COMMIT TRX +# +BEGIN; +INSERT INTO t1(b) VALUES (1); +INSERT INTO t1(b) VALUES (2); +INSERT INTO t1(b) VALUES (3); +INSERT INTO t1(b) VALUES (4); +INSERT INTO t1(a,b) VALUES (2,2); +--error ER_DUP_ENTRY +INSERT INTO t1(a,b) VALUES (3,2); +COMMIT; + +SELECT * FROM t1; +SELECT NEXTVAL(t); + +--connection node_2 +SELECT * FROM t1; +SELECT NEXTVAL(t); + +--connection node_1 +DROP TABLE t1; +DROP SEQUENCE t; diff --git a/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf b/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf index 0f38a85744e..52ec6af7e74 100644 --- a/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf +++ b/mysql-test/suite/galera/t/galera_sst_mysqldump_with_key.cnf @@ -5,11 +5,9 @@ [mysqld.1] wsrep_provider_options='base_port=@mysqld.1.#galera_port;gcache.size=1;pc.ignore_sb=true' -wsrep_sync_wait=0 [mysqld.2] wsrep_provider_options='base_port=@mysqld.2.#galera_port;gcache.size=1;pc.ignore_sb=true' -wsrep_sync_wait=0 [client] ssl-ca=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem diff --git a/mysql-test/suite/galera/t/galera_temporary_sequences.test b/mysql-test/suite/galera/t/galera_temporary_sequences.test new file mode 100644 index 00000000000..c46c4243514 --- /dev/null +++ b/mysql-test/suite/galera/t/galera_temporary_sequences.test @@ -0,0 +1,37 @@ +--source include/galera_cluster.inc +--source include/have_sequence.inc + +--connection node_2 +SET AUTOCOMMIT=0; +SET SESSION wsrep_OSU_method='RSU'; +CREATE TABLE t (i int primary key, j int); +CREATE TEMPORARY SEQUENCE seq2 NOCACHE ENGINE=InnoDB; +COMMIT; +SET SESSION wsrep_OSU_method='RSU'; +CREATE SEQUENCE seq1 NOCACHE ENGINE=InnoDB; +SET SESSION wsrep_OSU_method='TOI'; +DROP TABLE t; +DROP SEQUENCE seq2; +DROP SEQUENCE seq1; + +--connection node_1 +CREATE TABLE t (i int primary key, j int) ENGINE=InnoDB; +SET AUTOCOMMIT=0; +INSERT INTO t VALUES (3,0); +CREATE TEMPORARY SEQUENCE seq1 NOCACHE ENGINE=InnoDB; +COMMIT; +INSERT INTO t VALUES (4,0); +CREATE SEQUENCE seq2 NOCACHE ENGINE=InnoDB; +commit; + +--connection node_2 +SELECT * FROM t; +--error ER_NO_SUCH_TABLE +SHOW CREATE TABLE seq1; +SHOW CREATE TABLE seq2; + + +--connection node_1 +DROP TABLE t; +DROP SEQUENCE seq1; +DROP SEQUENCE seq2; diff --git a/mysql-test/suite/galera/t/galera_var_notify_ssl_ipv6.cnf b/mysql-test/suite/galera/t/galera_var_notify_ssl_ipv6.cnf index db6f36605b7..9b88a09d814 100644 --- a/mysql-test/suite/galera/t/galera_var_notify_ssl_ipv6.cnf +++ b/mysql-test/suite/galera/t/galera_var_notify_ssl_ipv6.cnf @@ -4,13 +4,13 @@ ssl-cert=@ENV.MYSQL_TEST_DIR/std_data/server-cert.pem ssl-key=@ENV.MYSQL_TEST_DIR/std_data/server-key.pem ssl-ca=@ENV.MYSQL_TEST_DIR/std_data/cacert.pem -bind-address=:: [mysqld.1] wsrep_provider_options='base_host=[::1];base_port=@mysqld.1.#galera_port;gmcast.listen_addr=tcp://[::]:@mysqld.1.#galera_port;ist.recv_addr=[::1]:@mysqld.1.#ist_port;repl.causal_read_timeout=PT90S;evs.suspect_timeout=PT10S;evs.inactive_timeout=PT30S;evs.install_timeout=PT15S;gcache.size=10M' wsrep_node_incoming_address='[::1]:@mysqld.1.port' wsrep_node_address=[::1]:@mysqld.1.#galera_port wsrep_sst_receive_address='[::1]:@mysqld.1.#sst_port' +bind-address=:: [mysqld.2] wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' @@ -18,3 +18,4 @@ wsrep_provider_options='base_host=[::1];base_port=@mysqld.2.#galera_port;gmcast. wsrep_node_incoming_address='[::1]:@mysqld.2.port' wsrep_node_address=[::1]:@mysqld.2.#galera_port wsrep_sst_receive_address='[::1]:@mysqld.2.#sst_port' +bind-address=:: diff --git a/mysql-test/suite/galera/t/galera_var_notify_ssl_ipv6.test b/mysql-test/suite/galera/t/galera_var_notify_ssl_ipv6.test index 2c2b106c2ae..eaef34cce32 100644 --- a/mysql-test/suite/galera/t/galera_var_notify_ssl_ipv6.test +++ b/mysql-test/suite/galera/t/galera_var_notify_ssl_ipv6.test @@ -3,6 +3,7 @@ # notifications into a table. # +--let galera_connection_address=::1 --source include/galera_cluster.inc --source include/have_ssl_communication.inc --source include/check_ipv6.inc diff --git a/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.test b/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.test index 0a32a06580b..5e74af4ab2e 100644 --- a/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.test +++ b/mysql-test/suite/galera/t/galera_vote_rejoin_ddl.test @@ -17,9 +17,17 @@ --let $node_4=node_4 --let $auto_increment_offset_node_4 = 4; -# Isolate node #3 --connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 + +--let $node_1=node_1 +--let $node_2=node_2 +--let $node_3=node_3 +--let $node_4=node_4 +--source suite/galera/include/auto_increment_offset_save.inc + --connection node_3 +# Isolate node #3 SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; # Wait for node #3 to leave cluster @@ -28,7 +36,6 @@ SET GLOBAL wsrep_provider_options = 'gmcast.isolate = 1'; --source include/wait_condition.inc # Introduce inconsistency on node #4 ---connect node_4, 127.0.0.1, root, , test, $NODE_MYPORT_4 --connection node_4 SET SESSION wsrep_on=OFF; CREATE TABLE t1 (f1 INTEGER); @@ -97,4 +104,4 @@ DROP TABLE t2; --let $auto_increment_offset_node_3 = 3; --let $node_4=node_4 --let $auto_increment_offset_node_4 = 4; ---source include/auto_increment_offset_restore.inc +--source suite/galera/include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera/t/mariadb_tzinfo_to_sql.test b/mysql-test/suite/galera/t/mariadb_tzinfo_to_sql.test old mode 100644 new mode 100755 index eb5febb127a..192a7cb228d --- a/mysql-test/suite/galera/t/mariadb_tzinfo_to_sql.test +++ b/mysql-test/suite/galera/t/mariadb_tzinfo_to_sql.test @@ -6,6 +6,7 @@ --echo # MDEV-28263: mariadb-tzinfo-to-sql improve wsrep and binlog cases --echo # +--exec rm -rf $MYSQLTEST_VARDIR/zoneinfo --exec mkdir $MYSQLTEST_VARDIR/zoneinfo --exec ln -s $MYSQLTEST_VARDIR/zoneinfo $MYSQLTEST_VARDIR/zoneinfo/posix --copy_file std_data/zoneinfo/GMT $MYSQLTEST_VARDIR/zoneinfo/GMT diff --git a/mysql-test/suite/galera/t/mdev-28433.test b/mysql-test/suite/galera/t/mdev-28433.test new file mode 100644 index 00000000000..ddee3618fee --- /dev/null +++ b/mysql-test/suite/galera/t/mdev-28433.test @@ -0,0 +1,35 @@ +--source include/galera_cluster.inc + +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--source include/auto_increment_offset_save.inc + +--connection node_2 +--let $wsrep_cluster_address_saved = `SELECT @@global.wsrep_cluster_address` + +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_sst_donor = NULL; +--let $wsrep_cluster_address_orig = `SELECT @@wsrep_cluster_address` +SET @@global.wsrep_cluster_address='NULL'; +SET SESSION wsrep_sync_wait=0; +SELECT @@wsrep_sst_donor; +SELECT @@wsrep_cluster_address; +# Must return 'OFF' +SHOW STATUS LIKE 'wsrep_ready'; + +# Must return 'Disconnected' +SHOW STATUS LIKE 'wsrep_cluster_status'; + +--disable_query_log +--eval SET @@global.wsrep_cluster_address = '$wsrep_cluster_address_orig' +--enable_query_log +--source include/wait_until_connected_again.inc +--source include/galera_wait_ready.inc +call mtr.add_suppression("WSREP: .*Invalid backend URI.*"); +call mtr.add_suppression("WSREP: gcs connect failed: Invalid argument"); + +# Restore original auto_increment_offset values. +--source include/auto_increment_offset_restore.inc + +--source include/galera_end.inc diff --git a/mysql-test/suite/galera/t/mdev-30013.test b/mysql-test/suite/galera/t/mdev-30013.test new file mode 100644 index 00000000000..038b66600ce --- /dev/null +++ b/mysql-test/suite/galera/t/mdev-30013.test @@ -0,0 +1,15 @@ +--source include/galera_cluster.inc + +if (!$HA_ARCHIVE_SO) { + skip Needs Archive loadable plugin; +} + +INSTALL PLUGIN ARCHIVE SONAME 'ha_archive.so'; +CREATE TABLE t (a CHAR(1)) ENGINE=ARCHIVE; +SHOW CREATE TABLE t; +INSERT INTO t VALUES ('A'); +UNINSTALL SONAME 'ha_archive'; +ALTER TABLE t CHANGE COLUMN a a CHAR(2); +--error ER_UNKNOWN_STORAGE_ENGINE +INSERT INTO t (a) VALUES ('AB'); +DROP TABLE t; diff --git a/mysql-test/suite/galera/t/mysql_tzinfo_to_sql.test b/mysql-test/suite/galera/t/mysql_tzinfo_to_sql.test old mode 100644 new mode 100755 index 6bfad2f18b5..4ee07044c3d --- a/mysql-test/suite/galera/t/mysql_tzinfo_to_sql.test +++ b/mysql-test/suite/galera/t/mysql_tzinfo_to_sql.test @@ -9,6 +9,7 @@ --echo # MDEV-28263: mariadb-tzinfo-to-sql improve wsrep and binlog cases --echo # +--exec rm -rf $MYSQLTEST_VARDIR/zoneinfo --exec mkdir $MYSQLTEST_VARDIR/zoneinfo --exec ln -s $MYSQLTEST_VARDIR/zoneinfo $MYSQLTEST_VARDIR/zoneinfo/posix --copy_file std_data/zoneinfo/GMT $MYSQLTEST_VARDIR/zoneinfo/GMT diff --git a/mysql-test/suite/galera_3nodes/disabled.def b/mysql-test/suite/galera_3nodes/disabled.def index b51d221e72f..d0e682958ec 100644 --- a/mysql-test/suite/galera_3nodes/disabled.def +++ b/mysql-test/suite/galera_3nodes/disabled.def @@ -16,10 +16,6 @@ galera_ipv6_mariabackup : MDEV-24097 galera_ipv6_mariabackup_section : MDEV-24097, MDEV-22195 galera_vote_rejoin_mysqldump : MDEV-24481: galera_3nodes.galera_vote_rejoin_mysqldump MTR failed: mysql_shutdown failed galera_ssl_reload : MDEV-30172 At line 50: mysql_shutdown failed -GCF-354 : mysqltest: At line 39: query 'DROP TABLE test.t1' failed: 1047: WSREP has not yet prepared node for application use -GCF-354 : mysqltest: At line 30: query 'INSERT INTO test.t1 values (1)' failed: 1180: Got error 6 "No such device or address" -galera_ipv6_mysqldump : mysql_shutdown failed # Opensuse/suse/rocky9/rocky84/rhel9/rhel8-ppc64le .. - all same IPv6 isn't configured right or skipping or galera -galera_ipv6_mysqldump : Can't connect to server on '::1' (115) galera_ipv6_rsync : Can't connect to server on '::1' (115) galera_ipv6_rsync_section : Can't connect to server on '::1' (115) diff --git a/mysql-test/suite/galera_3nodes/r/GCF-354.result b/mysql-test/suite/galera_3nodes/r/GCF-354.result index 958c1d06538..2b1399e6265 100644 --- a/mysql-test/suite/galera_3nodes/r/GCF-354.result +++ b/mysql-test/suite/galera_3nodes/r/GCF-354.result @@ -1,7 +1,5 @@ connection node_2; connection node_1; -connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; -connection node_3; connection node_1; connection node_2; connection node_3; diff --git a/mysql-test/suite/galera_3nodes/r/GCF-363.result b/mysql-test/suite/galera_3nodes/r/GCF-363.result index fb235aceb77..a7b811f794a 100644 --- a/mysql-test/suite/galera_3nodes/r/GCF-363.result +++ b/mysql-test/suite/galera_3nodes/r/GCF-363.result @@ -1,6 +1,5 @@ connection node_2; connection node_1; -connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; connection node_1; connection node_2; connection node_3; diff --git a/mysql-test/suite/galera_3nodes/r/GCF-376.result b/mysql-test/suite/galera_3nodes/r/GCF-376.result index 71705d2c35e..7b535a01ed4 100644 --- a/mysql-test/suite/galera_3nodes/r/GCF-376.result +++ b/mysql-test/suite/galera_3nodes/r/GCF-376.result @@ -1,10 +1,9 @@ connection node_2; connection node_1; -connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; -connection node_1; connection node_1; connection node_2; connection node_3; +connection node_1; CREATE TABLE test.t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) ENGINE=InnoDB; connection node_2; SET GLOBAL wsrep_on=OFF; @@ -16,6 +15,12 @@ INSERT INTO t1 VALUES (1, 'b'); SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; SET SESSION wsrep_sync_wait=0; connection node_3; +SHOW STATUS LIKE 'wsrep_cluster_size'; +Variable_name Value +wsrep_cluster_size 2 +SHOW STATUS LIKE 'wsrep_cluster_status'; +Variable_name Value +wsrep_cluster_status Primary connection node_2; UNLOCK TABLES; SET SESSION wsrep_on = ON; @@ -24,6 +29,9 @@ connection node_1; SHOW STATUS LIKE 'wsrep_cluster_status'; Variable_name Value wsrep_cluster_status non-Primary +SHOW STATUS LIKE 'wsrep_cluster_size'; +Variable_name Value +wsrep_cluster_size 1 connection node_2; SET SESSION wsrep_sync_wait=0; SHOW STATUS LIKE 'wsrep_cluster_status'; @@ -47,10 +55,21 @@ wsrep_cluster_size 1 SELECT * FROM t1; f1 f2 1 b +# reconnect node #1 connection node_1; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +# reconnect node #2 connection node_2; # restart +SHOW STATUS LIKE 'wsrep_cluster_status'; +Variable_name Value +wsrep_cluster_status Primary +SHOW STATUS LIKE 'wsrep_cluster_size'; +Variable_name Value +wsrep_cluster_size 3 +SELECT * FROM t1; +f1 f2 +1 b connection node_1; SELECT * FROM t1; f1 f2 diff --git a/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_B.result b/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_B.result index 7e75bc4b08a..732385a3966 100644 --- a/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_B.result +++ b/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_B.result @@ -1,6 +1,9 @@ connection node_2; connection node_1; connection node_1; +connection node_2; +connection node_3; +connection node_1; CREATE TABLE t1 (pk INT PRIMARY KEY, node INT) ENGINE=innodb; INSERT INTO t1 VALUES (1, 1); connection node_2; diff --git a/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_C.result b/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_C.result index ea10edfc62c..d85f121b0f7 100644 --- a/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_C.result +++ b/mysql-test/suite/galera_3nodes/r/galera_join_with_cc_C.result @@ -1,6 +1,9 @@ connection node_2; connection node_1; connection node_1; +connection node_2; +connection node_3; +connection node_1; CREATE TABLE t1 (pk INT PRIMARY KEY, node INT) ENGINE=innodb; INSERT INTO t1 VALUES (1, 1); connection node_2; diff --git a/mysql-test/suite/galera_3nodes/r/galera_pc_bootstrap.result b/mysql-test/suite/galera_3nodes/r/galera_pc_bootstrap.result index 3f29c7419eb..8cdd62db959 100644 --- a/mysql-test/suite/galera_3nodes/r/galera_pc_bootstrap.result +++ b/mysql-test/suite/galera_3nodes/r/galera_pc_bootstrap.result @@ -1,17 +1,19 @@ connection node_2; connection node_1; call mtr.add_suppression("WSREP: gcs/src/gcs_core.cpp:core_handle_uuid_msg\\(\\).*"); -CREATE TABLE t1 (f1 INTEGER); connection node_1; +connection node_2; +connection node_3; +connection node_1; +CREATE TABLE t1 (f1 INTEGER); +SET SESSION wsrep_sync_wait=0; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; connection node_2; SET SESSION wsrep_sync_wait=0; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; -connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; connection node_3; SET SESSION wsrep_sync_wait=0; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; -SET SESSION wsrep_sync_wait = 0; connection node_2; SET GLOBAL wsrep_provider_options = 'pc.bootstrap=1'; SHOW STATUS LIKE 'wsrep_cluster_size'; diff --git a/mysql-test/suite/galera_3nodes/t/GAL-501.cnf b/mysql-test/suite/galera_3nodes/t/GAL-501.cnf index 3b18a86093c..cd99c90bc16 100644 --- a/mysql-test/suite/galera_3nodes/t/GAL-501.cnf +++ b/mysql-test/suite/galera_3nodes/t/GAL-501.cnf @@ -3,7 +3,6 @@ [mysqld] wsrep_sst_method=rsync - [mysqld.1] wsrep-cluster-address=gcomm:// wsrep_node_address=[::1] diff --git a/mysql-test/suite/galera_3nodes/t/GCF-354.cnf b/mysql-test/suite/galera_3nodes/t/GCF-354.cnf index 252b4b613c7..4c5e4854606 100644 --- a/mysql-test/suite/galera_3nodes/t/GCF-354.cnf +++ b/mysql-test/suite/galera_3nodes/t/GCF-354.cnf @@ -2,4 +2,4 @@ [mysqld] wsrep-ignore-apply-errors=0 -wsrep_sync_wait=0 \ No newline at end of file +wsrep_sync_wait=0 diff --git a/mysql-test/suite/galera_3nodes/t/GCF-354.test b/mysql-test/suite/galera_3nodes/t/GCF-354.test index ce0fd445f23..e1459734cf3 100644 --- a/mysql-test/suite/galera_3nodes/t/GCF-354.test +++ b/mysql-test/suite/galera_3nodes/t/GCF-354.test @@ -1,8 +1,10 @@ --source include/galera_cluster.inc +--source include/have_innodb.inc --source include/force_restart.inc ---connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 ---connection node_3 +--let $galera_connection_name = node_3 +--let $galera_server_number = 3 +--source include/galera_connect.inc # Save original auto_increment_offset values. --let $node_1=node_1 @@ -101,4 +103,3 @@ CALL mtr.add_suppression("WSREP: Inconsistency detected: Inconsistent by consens CALL mtr.add_suppression("Plugin 'InnoDB' will be forced to shutdown"); --source ../galera/include/auto_increment_offset_restore.inc - diff --git a/mysql-test/suite/galera_3nodes/t/GCF-363.test b/mysql-test/suite/galera_3nodes/t/GCF-363.test index 17c510e7c9c..00af02126af 100644 --- a/mysql-test/suite/galera_3nodes/t/GCF-363.test +++ b/mysql-test/suite/galera_3nodes/t/GCF-363.test @@ -5,7 +5,9 @@ --source include/galera_cluster.inc --source include/have_innodb.inc ---connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 +--let $galera_connection_name = node_3 +--let $galera_server_number = 3 +--source include/galera_connect.inc # Save original auto_increment_offset values. --let $node_1=node_1 diff --git a/mysql-test/suite/galera_3nodes/t/GCF-376.test b/mysql-test/suite/galera_3nodes/t/GCF-376.test index ff5bfbfb209..20b9703f835 100644 --- a/mysql-test/suite/galera_3nodes/t/GCF-376.test +++ b/mysql-test/suite/galera_3nodes/t/GCF-376.test @@ -5,8 +5,9 @@ --source include/galera_cluster.inc --source include/have_innodb.inc ---connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 ---connection node_1 +--let $galera_connection_name = node_3 +--let $galera_server_number = 3 +--source include/galera_connect.inc # Save original auto_increment_offset values. --let $node_1=node_1 @@ -14,6 +15,7 @@ --let $node_3=node_3 --source ../galera/include/auto_increment_offset_save.inc +--connection node_1 CREATE TABLE test.t1 (f1 INTEGER PRIMARY KEY, f2 CHAR(1)) ENGINE=InnoDB; --connection node_2 @@ -36,6 +38,8 @@ SET SESSION wsrep_sync_wait=0; --connection node_3 --let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' --source include/wait_condition.inc +SHOW STATUS LIKE 'wsrep_cluster_size'; +SHOW STATUS LIKE 'wsrep_cluster_status'; --connection node_2 UNLOCK TABLES; @@ -44,10 +48,17 @@ UNLOCK TABLES; --source include/wsrep_wait_disconnect.inc --connection node_1 +--let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc SHOW STATUS LIKE 'wsrep_cluster_status'; +SHOW STATUS LIKE 'wsrep_cluster_size'; --connection node_2 SET SESSION wsrep_sync_wait=0; +--let $wait_condition = SELECT VARIABLE_VALUE = 'Disconnected' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc SHOW STATUS LIKE 'wsrep_cluster_status'; SHOW STATUS LIKE 'wsrep_cluster_size'; SET GLOBAL wsrep_on=OFF; @@ -61,14 +72,23 @@ SHOW STATUS LIKE 'wsrep_cluster_status'; SHOW STATUS LIKE 'wsrep_cluster_size'; SELECT * FROM t1; -# reconnect node #1 +--echo # reconnect node #1 --connection node_1 SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0'; +--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status'; +--source include/wait_condition.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 2 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc -# reconnect node #2 +--echo # reconnect node #2 --connection node_2 --source include/restart_mysqld.inc --source include/wait_until_connected_again.inc +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc +SHOW STATUS LIKE 'wsrep_cluster_status'; +SHOW STATUS LIKE 'wsrep_cluster_size'; +SELECT * FROM t1; --connection node_1 --let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' @@ -95,4 +115,4 @@ CALL mtr.add_suppression("Slave SQL: Could not execute Write_rows event on table CALL mtr.add_suppression("WSREP: Event (.*) Write_rows_v1 apply failed: 121, seqno "); 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: Failed to apply write set: "); \ No newline at end of file +CALL mtr.add_suppression("WSREP: Failed to apply write set: "); diff --git a/mysql-test/suite/galera_3nodes/t/galera_2_cluster.cnf b/mysql-test/suite/galera_3nodes/t/galera_2_cluster.cnf index 3889a4f4fdd..41c1c7c0519 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_2_cluster.cnf +++ b/mysql-test/suite/galera_3nodes/t/galera_2_cluster.cnf @@ -22,4 +22,4 @@ server-id=22 [mysqld.6] wsrep_gtid_domain_id=2 -server-id=23 \ No newline at end of file +server-id=23 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 ee75aa085e6..8848e698c25 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 @@ -10,7 +10,6 @@ --let $galera_connection_name = node_3 --let $galera_server_number = 3 --source include/galera_connect.inc ---let $wsrep_cluster_address_node3 = `SELECT @@wsrep_cluster_address` # Save original auto_increment_offset values. --let $node_1=node_1 diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_mariabackup.cnf b/mysql-test/suite/galera_3nodes/t/galera_ipv6_mariabackup.cnf index 415a8f33257..ed0e6204d3e 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_ipv6_mariabackup.cnf +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_mariabackup.cnf @@ -3,7 +3,6 @@ [mysqld] wsrep_sst_method=mariabackup wsrep_sst_auth="root:" -bind-address=:: [mysqld.1] wsrep-cluster-address=gcomm:// @@ -12,6 +11,7 @@ wsrep_sst_receive_address='[::1]:@mysqld.1.#sst_port' wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.1.port' wsrep_node_name=node_1 +bind-address=:: [mysqld.2] wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' @@ -21,6 +21,7 @@ wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.2.port' wsrep_node_name=node_2 wsrep_sst_donor=node_1 +bind-address=:: [mysqld.3] wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' @@ -30,6 +31,7 @@ wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.3.port' wsrep_node_name=node_3 wsrep_sst_donor=node_1 +bind-address=:: [SST] transferfmt=@ENV.MTR_GALERA_TFMT diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_mariabackup_section.cnf b/mysql-test/suite/galera_3nodes/t/galera_ipv6_mariabackup_section.cnf index 21f229ffcce..aaad88ebcbd 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_ipv6_mariabackup_section.cnf +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_mariabackup_section.cnf @@ -3,11 +3,9 @@ # decoy value - should not be read by mysqld or sst scripts [mysqld] innodb-data-home-dir=/tmp -bind-address=:: innodb-data-home-dir= wsrep_sst_method=mariabackup wsrep_sst_auth="root:" -bind-address=:: [mysqld.1] wsrep-cluster-address=gcomm:// @@ -16,6 +14,7 @@ wsrep_sst_receive_address='[::1]:@mysqld.1.#sst_port' wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.1.port' wsrep_node_name=node_1 +bind-address=:: [mysqld.2] wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' @@ -25,6 +24,7 @@ wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.2.port' wsrep_node_name=node_2 wsrep_sst_donor=node_1 +bind-address=:: [mysqld.3] wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' @@ -34,6 +34,7 @@ wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.3.port' wsrep_node_name=node_3 wsrep_sst_donor=node_1 +bind-address=:: [SST] transferfmt=@ENV.MTR_GALERA_TFMT diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.cnf b/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.cnf index afdfacfa3a5..0a54fb8e4e1 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.cnf +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_mysqldump.cnf @@ -2,7 +2,6 @@ [mysqld] wsrep_sst_method=rsync -bind-address=:: [mysqld.1] wsrep-cluster-address=gcomm:// @@ -10,6 +9,7 @@ wsrep_provider_options='base_host=[::1];base_port=@mysqld.1.#galera_port;gmcast. wsrep_sst_receive_address='[::1]:@mysqld.1.#sst_port' wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.1.port' +bind-address=:: [mysqld.2] wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' @@ -17,6 +17,7 @@ wsrep_provider_options='base_host=[::1];base_port=@mysqld.2.#galera_port;gmcast. wsrep_sst_receive_address='[::1]:@mysqld.2.#sst_port' wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.2.port' +bind-address=:: [mysqld.3] wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' @@ -24,3 +25,4 @@ wsrep_provider_options='base_host=[::1];base_port=@mysqld.3.#galera_port;gmcast. wsrep_sst_receive_address='[::1]:@mysqld.3.#sst_port' wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.3.port' +bind-address=:: diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.cnf b/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.cnf index afdfacfa3a5..0a54fb8e4e1 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.cnf +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync.cnf @@ -2,7 +2,6 @@ [mysqld] wsrep_sst_method=rsync -bind-address=:: [mysqld.1] wsrep-cluster-address=gcomm:// @@ -10,6 +9,7 @@ wsrep_provider_options='base_host=[::1];base_port=@mysqld.1.#galera_port;gmcast. wsrep_sst_receive_address='[::1]:@mysqld.1.#sst_port' wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.1.port' +bind-address=:: [mysqld.2] wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' @@ -17,6 +17,7 @@ wsrep_provider_options='base_host=[::1];base_port=@mysqld.2.#galera_port;gmcast. wsrep_sst_receive_address='[::1]:@mysqld.2.#sst_port' wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.2.port' +bind-address=:: [mysqld.3] wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' @@ -24,3 +25,4 @@ wsrep_provider_options='base_host=[::1];base_port=@mysqld.3.#galera_port;gmcast. wsrep_sst_receive_address='[::1]:@mysqld.3.#sst_port' wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.3.port' +bind-address=:: diff --git a/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync_section.cnf b/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync_section.cnf index c34144d9a69..35196700044 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync_section.cnf +++ b/mysql-test/suite/galera_3nodes/t/galera_ipv6_rsync_section.cnf @@ -7,7 +7,6 @@ innodb-data-home-dir=/tmp [mysqld] innodb-data-home-dir= wsrep_sst_method=rsync -bind-address=:: [mysqld.1] wsrep-cluster-address=gcomm:// @@ -15,6 +14,7 @@ wsrep_provider_options='base_host=[::1];base_port=@mysqld.1.#galera_port;gmcast. wsrep_sst_receive_address='[::1]:@mysqld.1.#sst_port' wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.1.port' +bind-address=:: [mysqld.2] wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' @@ -22,6 +22,7 @@ wsrep_provider_options='base_host=[::1];base_port=@mysqld.2.#galera_port;gmcast. wsrep_sst_receive_address='[::1]:@mysqld.2.#sst_port' wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.2.port' +bind-address=:: [mysqld.3] wsrep_cluster_address='gcomm://[::1]:@mysqld.1.#galera_port' @@ -29,3 +30,4 @@ wsrep_provider_options='base_host=[::1];base_port=@mysqld.3.#galera_port;gmcast. wsrep_sst_receive_address='[::1]:@mysqld.3.#sst_port' wsrep_node_address=::1 wsrep_node_incoming_address='[::1]:@mysqld.3.port' +bind-address=:: diff --git a/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_B.test b/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_B.test index 2fb0e78c759..55d6b458849 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_B.test +++ b/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_B.test @@ -15,6 +15,12 @@ --let $galera_server_number = 3 --source include/galera_connect.inc +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--let $node_3=node_3 +--source ../galera/include/auto_increment_offset_save.inc + --connection node_1 --let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; --source include/wait_condition.inc @@ -271,3 +277,5 @@ call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State T --connection node_3 call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); + +--source ../galera/include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_C.test b/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_C.test index 133903d7cbf..d1111e9fd4a 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_C.test +++ b/mysql-test/suite/galera_3nodes/t/galera_join_with_cc_C.test @@ -14,6 +14,12 @@ --let $galera_server_number = 3 --source include/galera_connect.inc +# Save original auto_increment_offset values. +--let $node_1=node_1 +--let $node_2=node_2 +--let $node_3=node_3 +--source ../galera/include/auto_increment_offset_save.inc + --connection node_1 --let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size'; --source include/wait_condition.inc @@ -297,3 +303,5 @@ call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State T --connection node_3 call mtr.add_suppression("WSREP: Rejecting JOIN message from \(.*\): new State Transfer required."); + +--source ../galera/include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera_3nodes/t/galera_pc_bootstrap.test b/mysql-test/suite/galera_3nodes/t/galera_pc_bootstrap.test index ef5bc7dd923..58a67c7b32b 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_pc_bootstrap.test +++ b/mysql-test/suite/galera_3nodes/t/galera_pc_bootstrap.test @@ -1,17 +1,35 @@ # # Test the operation of pc.bootstrap # - --source include/big_test.inc --source include/galera_cluster.inc --source include/have_innodb.inc call mtr.add_suppression("WSREP: gcs/src/gcs_core.cpp:core_handle_uuid_msg\\(\\).*"); +# +# Create connection node_3 and save auto increment variables. +# +--let $galera_connection_name = node_3 +--let $galera_server_number = 3 +--source include/galera_connect.inc + +--let $node_1 = node_1 +--let $node_2 = node_2 +--let $node_3 = node_3 + +--source ../galera/include/auto_increment_offset_save.inc + +--connection node_1 + CREATE TABLE t1 (f1 INTEGER); +SET SESSION wsrep_sync_wait=0; +--let $wait_condition = SELECT VARIABLE_VALUE = 3 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' +--source include/wait_condition.inc + # Force all nodes to become non-primary ---connection node_1 + SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; --connection node_2 @@ -21,7 +39,6 @@ SET SESSION wsrep_sync_wait=0; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; ---connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 --connection node_3 SET SESSION wsrep_sync_wait=0; --let $wait_condition = SELECT VARIABLE_VALUE = 1 FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_size' @@ -29,13 +46,16 @@ SET SESSION wsrep_sync_wait=0; SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1'; +# Node #3 should be non-primary +--let $wait_condition = SELECT variable_value = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE variable_name = 'wsrep_cluster_status'; +--source include/wait_condition.inc + +--connection node_2 # Node #2 should be non-primary -SET SESSION wsrep_sync_wait = 0; --let $wait_condition = SELECT variable_value = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE variable_name = 'wsrep_cluster_status'; --source include/wait_condition.inc # Signal node #2 to bootstrap ---connection node_2 SET GLOBAL wsrep_provider_options = 'pc.bootstrap=1'; # Wait until node becomes available for queries again @@ -97,3 +117,8 @@ SELECT COUNT(*) FROM t1; # Test cleanup DROP TABLE t1; + +# +# Restore auto increment variables. +# +--source ../galera/include/auto_increment_offset_restore.inc diff --git a/mysql-test/suite/galera_3nodes/t/galera_pc_weight.cnf b/mysql-test/suite/galera_3nodes/t/galera_pc_weight.cnf index 1a61471d581..833c1437fe0 100644 --- a/mysql-test/suite/galera_3nodes/t/galera_pc_weight.cnf +++ b/mysql-test/suite/galera_3nodes/t/galera_pc_weight.cnf @@ -3,5 +3,3 @@ # interactions with following tests such as # galera_3nodes.galera_var_dirty_reads2 !include ../galera_3nodes.cnf - -!include ../galera_3nodes.cnf diff --git a/mysql-test/suite/galera_3nodes/t/inconsistency_shutdown.test b/mysql-test/suite/galera_3nodes/t/inconsistency_shutdown.test index 6ad19e01849..7a9c4e83f87 100644 --- a/mysql-test/suite/galera_3nodes/t/inconsistency_shutdown.test +++ b/mysql-test/suite/galera_3nodes/t/inconsistency_shutdown.test @@ -76,6 +76,8 @@ SET GLOBAL wsrep_on=OFF; --source include/start_mysqld.inc --source include/galera_wait_ready.inc +--let $wait_condition = SELECT COUNT(*)=1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc DROP TABLE t1; # @@ -100,6 +102,8 @@ CREATE TABLE t2 (f1 INTEGER PRIMARY KEY, f2 INT); SET GLOBAL wsrep_provider_options='gcs.fc_limit=1K'; # Introduce inconsistency SET wsrep_on=OFF; +--let $wait_condition = SELECT COUNT(*)=1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't2'; +--source include/wait_condition.inc DROP TABLE t2; SET wsrep_on=ON; @@ -171,6 +175,9 @@ SET GLOBAL wsrep_on=OFF; --source include/start_mysqld.inc --source include/galera_wait_ready.inc +--let $wait_condition = SELECT COUNT(*)=1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 't1'; +--source include/wait_condition.inc + DROP TABLE t1; CALL mtr.add_suppression('Can\'t find record in \'t1\''); diff --git a/mysql-test/suite/gcol/inc/gcol_ins_upd.inc b/mysql-test/suite/gcol/inc/gcol_ins_upd.inc index 68c0a0e30c9..f025752b5b1 100644 --- a/mysql-test/suite/gcol/inc/gcol_ins_upd.inc +++ b/mysql-test/suite/gcol/inc/gcol_ins_upd.inc @@ -626,7 +626,9 @@ CREATE TABLE t1 ( ); INSERT IGNORE INTO t1 (b) VALUES (b'101110001110100'),(b'011101'); +--disable_ps2_protocol SELECT pk, b INTO OUTFILE 'load.data' FROM t1; +--enable_ps2_protocol --error ER_DATA_TOO_LONG LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1 (pk, b); diff --git a/mysql-test/suite/gcol/inc/gcol_keys.inc b/mysql-test/suite/gcol/inc/gcol_keys.inc index e5ac0afd92a..4ae47afca9f 100644 --- a/mysql-test/suite/gcol/inc/gcol_keys.inc +++ b/mysql-test/suite/gcol/inc/gcol_keys.inc @@ -776,7 +776,9 @@ CREATE TABLE t1 ( ); INSERT IGNORE INTO t1 (b) VALUES (b'101110001110100'),(b'011101'); +--disable_ps2_protocol SELECT pk, b INTO OUTFILE 'load.data' FROM t1; +--enable_ps2_protocol --error ER_DATA_TOO_LONG LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1 (pk, b); diff --git a/mysql-test/suite/gcol/r/innodb_virtual_basic.result b/mysql-test/suite/gcol/r/innodb_virtual_basic.result index 5b599dc3520..3823887186b 100644 --- a/mysql-test/suite/gcol/r/innodb_virtual_basic.result +++ b/mysql-test/suite/gcol/r/innodb_virtual_basic.result @@ -1077,7 +1077,7 @@ KEY `a_2` (`a`,`vbidxcol`), KEY `vbidxcol_2` (`vbidxcol`,`d`), CONSTRAINT `fk_16` FOREIGN KEY (`a`) REFERENCES `ibstd_16` (`a`) ON DELETE SET NULL ) ENGINE=InnoDB; -DROP TABLE ibstd_16_fk; +ERROR HY000: Function or expression 'a' cannot be used in the GENERATED ALWAYS AS clause of `vadcol` CREATE TABLE `ibstd_16_fk` ( `a` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, diff --git a/mysql-test/suite/gcol/t/gcol_bugfixes.test b/mysql-test/suite/gcol/t/gcol_bugfixes.test index a1f277199eb..4c1b00a878a 100644 --- a/mysql-test/suite/gcol/t/gcol_bugfixes.test +++ b/mysql-test/suite/gcol/t/gcol_bugfixes.test @@ -674,7 +674,9 @@ DROP TABLE t1; CREATE TABLE t1 (id INT PRIMARY KEY, a VARCHAR(2333), va VARCHAR(171) AS (a)) ENGINE=InnoDB; INSERT INTO t1 (id,a) VALUES (1,REPEAT('x',200)); +--disable_ps2_protocol SELECT id, va INTO OUTFILE 'load_t1' FROM t1; +--enable_ps2_protocol --error ER_DATA_TOO_LONG LOAD DATA INFILE 'load_t1' REPLACE INTO TABLE t1 (id,va); SELECT * FROM t1; @@ -687,7 +689,9 @@ DROP TABLE t1; CREATE TABLE t1 (id BIGINT PRIMARY KEY, a VARCHAR(2333), va VARCHAR(171) AS (a)) ENGINE=InnoDB; INSERT INTO t1 (id,a) VALUES (1,REPEAT('x',200)); +--disable_ps2_protocol SELECT id, va INTO OUTFILE 'load_t1' FROM t1; +--enable_ps2_protocol --error ER_DATA_TOO_LONG LOAD DATA INFILE 'load_t1' REPLACE INTO TABLE t1 (id,va); SELECT * FROM t1; @@ -707,7 +711,9 @@ CREATE TABLE t1 (id INT PRIMARY KEY, ts TIMESTAMP DEFAULT '1971-01-01 00:00:00', c VARBINARY(8) DEFAULT '', vc VARCHAR(3) AS (c) STORED); INSERT IGNORE INTO t1 (id,c) VALUES (1,'foobar'); +--disable_ps2_protocol SELECT id, ts, vc INTO OUTFILE 'load_t1' FROM t1; +--enable_ps2_protocol --error 0,ER_DATA_TOO_LONG LOAD DATA INFILE 'load_t1' REPLACE INTO TABLE t1 (id, ts, vc); INSERT IGNORE INTO t1 (id) VALUES (2); diff --git a/mysql-test/suite/gcol/t/innodb_virtual_basic.test b/mysql-test/suite/gcol/t/innodb_virtual_basic.test index 87251ad7d52..3259875823f 100644 --- a/mysql-test/suite/gcol/t/innodb_virtual_basic.test +++ b/mysql-test/suite/gcol/t/innodb_virtual_basic.test @@ -1021,7 +1021,7 @@ CREATE TABLE `ibstd_16` ( ) ENGINE=INNODB; # Block when FK constraint on base column of stored column. -#--error ER_CANNOT_ADD_FOREIGN +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED CREATE TABLE `ibstd_16_fk` ( `a` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, @@ -1040,7 +1040,6 @@ CREATE TABLE `ibstd_16_fk` ( KEY `vbidxcol_2` (`vbidxcol`,`d`), CONSTRAINT `fk_16` FOREIGN KEY (`a`) REFERENCES `ibstd_16` (`a`) ON DELETE SET NULL ) ENGINE=InnoDB; -DROP TABLE ibstd_16_fk; # Take out "KEY `a_2` (`a`,`vbidxcol`)", this should then be successful CREATE TABLE `ibstd_16_fk` ( diff --git a/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test b/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test index e7bf8eb485b..da49a5b6b43 100644 --- a/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test +++ b/mysql-test/suite/gcol/t/innodb_virtual_debug_purge.test @@ -260,6 +260,10 @@ disconnect truncate; connection default; DROP TABLE t1, t2; +--disable_ps2_protocol +--enable_ps2_protocol +--disable_ps2_protocol +--enable_ps2_protocol --source include/wait_until_count_sessions.inc set debug_sync=reset; diff --git a/mysql-test/suite/handler/handler.inc b/mysql-test/suite/handler/handler.inc index c83e7e5d0b2..9ad9e8d91f8 100644 --- a/mysql-test/suite/handler/handler.inc +++ b/mysql-test/suite/handler/handler.inc @@ -896,6 +896,7 @@ drop table t1; --echo # If we have to wait on an exclusive locks while having --echo # an open HANDLER, ER_LOCK_DEADLOCK is reported. --echo # +--disable_ps2_protocol create table t1 (a int, key a(a)); handler t1 open; connection con1; @@ -915,6 +916,7 @@ select release_lock('lock1'); connection default; reap; select release_lock('lock1'); +--enable_ps2_protocol --echo # Demonstrate that there is no deadlock with FLUSH TABLE, --echo # even though it is waiting for the other table to go away diff --git a/mysql-test/suite/innodb/r/data_types.result b/mysql-test/suite/innodb/r/data_types.result index 1394431b09d..146f9bb080f 100644 --- a/mysql-test/suite/innodb/r/data_types.result +++ b/mysql-test/suite/innodb/r/data_types.result @@ -174,3 +174,10 @@ DROP TABLE t1; CREATE TABLE t1 (c VARCHAR(0), KEY(c)) ENGINE=InnoDB; INSERT INTO t1 VALUES (''); DROP TABLE t1; +# +# MDEV-19216 Assertion ...SYS_FOREIGN failed in btr_node_ptr_max_size +# +CREATE TABLE t1 (b BINARY(0), v VARBINARY(0), KEY(b), KEY(v)) ENGINE=InnoDB; +INSERT INTO t1 SET b='',v=''; +DROP TABLE t1; +# End of 10.4 tests diff --git a/mysql-test/suite/innodb/r/deadlock_on_lock_upgrade.result b/mysql-test/suite/innodb/r/deadlock_on_lock_upgrade.result new file mode 100644 index 00000000000..4446c925200 --- /dev/null +++ b/mysql-test/suite/innodb/r/deadlock_on_lock_upgrade.result @@ -0,0 +1,78 @@ +# +# Bug #23755664 DEADLOCK WITH 3 CONCURRENT DELETES BY UNIQUE KEY +# +connection default; +CREATE TABLE `t`( +`id` INT, +`a` INT DEFAULT NULL, +PRIMARY KEY(`id`), +UNIQUE KEY `u`(`a`) +) ENGINE=InnoDB; +INSERT INTO t (`id`,`a`) VALUES +(1,1), +(2,9999), +(3,10000); +connect deleter,localhost,root,,; +connect holder,localhost,root,,; +connect waiter,localhost,root,,; +connection deleter; +SET DEBUG_SYNC = +'lock_sec_rec_read_check_and_lock_has_locked + SIGNAL deleter_has_locked + WAIT_FOR waiter_has_locked'; +DELETE FROM t WHERE a = 9999; +connection holder; +SET DEBUG_SYNC= +'now WAIT_FOR deleter_has_locked'; +SET DEBUG_SYNC= +'lock_sec_rec_read_check_and_lock_has_locked SIGNAL holder_has_locked'; +DELETE FROM t WHERE a = 9999; +connection waiter; +SET DEBUG_SYNC= +'now WAIT_FOR holder_has_locked'; +SET DEBUG_SYNC= +'lock_sec_rec_read_check_and_lock_has_locked SIGNAL waiter_has_locked'; +DELETE FROM t WHERE a = 9999; +connection deleter; +connection holder; +connection waiter; +connection default; +disconnect deleter; +disconnect holder; +disconnect waiter; +DROP TABLE `t`; +SET DEBUG_SYNC='reset'; +CREATE TABLE `t`( +`id` INT NOT NULL PRIMARY KEY +) ENGINE=InnoDB; +INSERT INTO t (`id`) VALUES (1), (2); +connect holder,localhost,root,,; +connect waiter,localhost,root,,; +connection holder; +BEGIN; +SELECT id FROM t WHERE id=1 FOR UPDATE; +id +1 +SELECT id FROM t WHERE id=2 FOR UPDATE; +id +2 +connection waiter; +SET DEBUG_SYNC= +'lock_wait_before_suspend SIGNAL waiter_will_wait'; +SELECT id FROM t WHERE id = 1 FOR UPDATE; +connection holder; +SET DEBUG_SYNC= +'now WAIT_FOR waiter_will_wait'; +SELECT * FROM t FOR UPDATE; +id +1 +2 +COMMIT; +connection waiter; +id +1 +connection default; +disconnect holder; +disconnect waiter; +DROP TABLE `t`; +SET DEBUG_SYNC='reset'; diff --git a/mysql-test/suite/innodb/r/fk_col_alter.result b/mysql-test/suite/innodb/r/fk_col_alter.result new file mode 100644 index 00000000000..187cab21043 --- /dev/null +++ b/mysql-test/suite/innodb/r/fk_col_alter.result @@ -0,0 +1,77 @@ +# +# MDEV-31086 MODIFY COLUMN can break FK constraints, and +# lead to unrestorable dumps +# +CREATE TABLE t1( +id SERIAL, +msg VARCHAR(100) CHARACTER SET utf8mb3, +KEY(msg))ENGINE=InnoDB; +CREATE TABLE t2( +id SERIAL, +msg varchar(100) CHARACTER SET utf8mb4, +CONSTRAINT fk_t1 FOREIGN KEY (msg) REFERENCES t1 (msg))ENGINE=InnoDB; +ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed") +CREATE TABLE t2( +id SERIAL, +msg varchar(100) CHARACTER SET utf8mb3, +msg_1 varchar(100) CHARACTER SET utf8mb3, +INDEX (msg_1), +INDEX (msg), +CONSTRAINT fk_t1 FOREIGN KEY (msg) REFERENCES t1 (msg) +ON DELETE CASCADE)ENGINE=InnoDB; +SET FOREIGN_KEY_CHECKS=1; +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'test/fk_t1' +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(400) character set utf8mb3, ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'test/fk_t1' +SET FOREIGN_KEY_CHECKS=1; +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'test/fk_t1' +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4,ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4,ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'test/fk_t1' +SET FOREIGN_KEY_CHECKS=1; +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY; +ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed") +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE; +ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Adding foreign keys needs foreign_key_checks=OFF. Try ALGORITHM=COPY +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY; +ERROR HY000: Can't create table `test`.`t2` (errno: 150 "Foreign key constraint is incorrectly formed") +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg_1': used in a foreign key constraint 'test/t2_ibfk_0' +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(200) CHARACTER SET utf8mb3, ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg_1': used in a foreign key constraint 'test/t2_ibfk_0' +SET FOREIGN_KEY_CHECKS=1; +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' of table 'test.t2' +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'test/fk_t1' of table 'test/t2' +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' of table 'test.t2' +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'test/fk_t1' of table 'test/t2' +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' of table 'test.t2' +ALTER TABLE t1 MODIFY msg VARCHAR(400) CHARSET utf8mb3, ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'test/fk_t1' of table 'test/t2' +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'fk_t1' of table 'test.t2' +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=INPLACE; +ERROR HY000: Cannot change column 'msg': used in a foreign key constraint 'test/fk_t1' of table 'test/t2' +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE t2 DROP FOREIGN KEY fk_t1, MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY (msg) REFERENCES t1(msg), aLGORITHM=INPLACE; +SET FOREIGN_KEY_CHECKS=1; +DROP TABLE t2, t1; diff --git a/mysql-test/suite/innodb/r/foreign_key.result b/mysql-test/suite/innodb/r/foreign_key.result index acf021db22c..61645e56c0c 100644 --- a/mysql-test/suite/innodb/r/foreign_key.result +++ b/mysql-test/suite/innodb/r/foreign_key.result @@ -246,8 +246,11 @@ CREATE TABLE t1 (a INT, UNIQUE(a), KEY(a)) ENGINE=InnoDB; ALTER TABLE t1 ADD FOREIGN KEY (a) REFERENCES t1 (a); SET SESSION FOREIGN_KEY_CHECKS = OFF; ALTER TABLE t1 CHANGE COLUMN a a TIME NOT NULL; +ERROR HY000: Cannot change column 'a': used in a foreign key constraint 't1_ibfk_1' of table 'test.t1' ALTER TABLE t1 ADD pk INT NOT NULL AUTO_INCREMENT PRIMARY KEY; ALTER TABLE t1 CHANGE COLUMN a b TIME; +ERROR 0A000: ALGORITHM=COPY is not supported. Reason: Columns participating in a foreign key are renamed. Try ALGORITHM=INPLACE +ALTER TABLE t1 CHANGE COLUMN a b TIME, DROP FOREIGN KEY t1_ibfk_1; SET SESSION FOREIGN_KEY_CHECKS = ON; DROP TABLE t1; # diff --git a/mysql-test/suite/innodb/r/innodb.result b/mysql-test/suite/innodb/r/innodb.result index 47e5f0f5c94..0f848cf21b3 100644 --- a/mysql-test/suite/innodb/r/innodb.result +++ b/mysql-test/suite/innodb/r/innodb.result @@ -2554,12 +2554,14 @@ set foreign_key_checks=0; create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb; create table t1(a varchar(10) primary key) engine = innodb; alter table t1 modify column a int; +ERROR HY000: Cannot change column 'a': used in a foreign key constraint 't2_ibfk_1' of table 'test.t2' set foreign_key_checks=1; drop table t2,t1; set foreign_key_checks=0; create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb DEFAULT CHARSET=latin1; create table t1(a varchar(10) primary key) engine = innodb DEFAULT CHARSET=latin1; alter table t1 convert to character set utf8; +ERROR HY000: Cannot change column 'a': used in a foreign key constraint 't2_ibfk_1' of table 'test.t2' set foreign_key_checks=1; drop table t2,t1; call mtr.add_suppression("\\[Warning\\] InnoDB: In ALTER TABLE `test`.`t1` has or is referenced in foreign key constraints which are not compatible with the new table definition."); diff --git a/mysql-test/suite/innodb/r/innodb_max_recordsize_32k.result b/mysql-test/suite/innodb/r/innodb_max_recordsize_32k.result deleted file mode 100644 index fc41d0b1471..00000000000 --- a/mysql-test/suite/innodb/r/innodb_max_recordsize_32k.result +++ /dev/null @@ -1,338 +0,0 @@ -SELECT @@innodb_page_size; -@@innodb_page_size -32768 -SET innodb_strict_mode=ON; -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=FIXED; -ERROR HY000: Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -show warnings; -Level Code Message -Warning 1478 InnoDB: invalid ROW_FORMAT specifier. -Error 1005 Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; -ERROR HY000: Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -show warnings; -Level Code Message -Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. -Error 1005 Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB -SET @@innodb_strict_mode=OFF; -SELECT @@innodb_strict_mode; -@@innodb_strict_mode -0 -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPACT; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),'a',NULL); -ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPACT; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',156),NULL); -ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',155),NULL); -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL -DROP TABLE tab5; -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=DYNAMIC; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=DYNAMIC; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',156),NULL); -ERROR 42000: Row size too large (> 16318). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',155),NULL); -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL -DROP TABLE tab5; -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=REDUNDANT; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255)); -ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=REDUNDANT; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',89),NULL); -ERROR 42000: Row size too large (> 16315). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',88),NULL); -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; -Warnings: -Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > NNNNk. Assuming ROW_FORMAT=DYNAMIC. -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. -DROP TABLE tab5; -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; -SHOW WARNINGS; -Level Code Message -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -LENGTH(col) -16384 -32768 -65535 -FLUSH TABLE t; -ANALYZE TABLE t; -Table Op Msg_type Msg_text -test.t analyze status Engine-independent statistics collected -test.t analyze Warning Engine-independent statistics are not collected for column 'col' -test.t analyze status OK -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -clust_index_size -7 -DROP TABLE t; -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; -SHOW WARNINGS; -Level Code Message -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -LENGTH(col) -16384 -32768 -65535 -FLUSH TABLE t; -ANALYZE TABLE t; -Table Op Msg_type Msg_text -test.t analyze status Engine-independent statistics collected -test.t analyze Warning Engine-independent statistics are not collected for column 'col' -test.t analyze status OK -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -clust_index_size -5 -DROP TABLE t; -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=COMPACT; -SHOW WARNINGS; -Level Code Message -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -LENGTH(col) -16384 -32768 -65535 -FLUSH TABLE t; -ANALYZE TABLE t; -Table Op Msg_type Msg_text -test.t analyze status Engine-independent statistics collected -test.t analyze Warning Engine-independent statistics are not collected for column 'col' -test.t analyze status OK -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -clust_index_size -5 -DROP TABLE t; diff --git a/mysql-test/suite/innodb/r/innodb_max_recordsize_64k.result b/mysql-test/suite/innodb/r/innodb_max_recordsize_64k.result deleted file mode 100644 index a9683016925..00000000000 --- a/mysql-test/suite/innodb/r/innodb_max_recordsize_64k.result +++ /dev/null @@ -1,520 +0,0 @@ -SELECT @@innodb_page_size; -@@innodb_page_size -65536 -SET innodb_strict_mode=ON; -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=FIXED; -ERROR HY000: Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -show warnings; -Level Code Message -Warning 1478 InnoDB: invalid ROW_FORMAT specifier. -Error 1005 Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; -ERROR HY000: Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -show warnings; -Level Code Message -Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. -Error 1005 Can't create table `test`.`tab5` (errno: 140 "Wrong create options") -Warning 1030 Got error 140 "Wrong create options" from storage engine InnoDB -SET @@innodb_strict_mode=OFF; -SELECT @@innodb_strict_mode; -@@innodb_strict_mode -0 -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), -ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), -ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), -ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), -ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), -ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), -ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), -ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), -ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), -ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), -ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), -ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) -) -ENGINE = innodb ROW_FORMAT=COMPACT; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),'a',NULL); -ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), -ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), -ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), -ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), -ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), -ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), -ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), -ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), -ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), -ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), -ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), -ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) -) -ENGINE = innodb ROW_FORMAT=COMPACT; -Warnings: -Warning 139 Row size too large (> 32702). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',214),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); -ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',213),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL -DROP TABLE tab5; -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), -ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), -ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), -ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), -ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), -ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), -ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), -ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), -ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), -ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), -ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), -ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) -) -ENGINE = innodb ROW_FORMAT=DYNAMIC; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), -ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), -ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), -ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), -ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), -ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), -ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), -ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), -ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), -ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), -ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), -ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) -) -ENGINE = innodb ROW_FORMAT=DYNAMIC; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',214),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); -ERROR 42000: Row size too large (> 16383). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',213),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL -DROP TABLE tab5; -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), -ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), -ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), -ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), -ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), -ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), -ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), -ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), -ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), -ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), -ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), -ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) -) -ENGINE = innodb ROW_FORMAT=REDUNDANT; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); -ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), -ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), -ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), -ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), -ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), -ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), -ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), -ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), -ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), -ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), -ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), -ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) -) -ENGINE = innodb ROW_FORMAT=REDUNDANT; -Warnings: -Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',27),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); -ERROR 42000: Row size too large (> 16382). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',26),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); -SELECT * FROM tab5; -col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14 col15 col16 col17 col18 col19 col20 col21 col22 col23 col24 col25 col26 col27 col28 col29 col30 col31 col32 col33 col34 col35 col36 col37 col38 col39 col40 col41 col42 col43 col44 col45 col46 col47 col48 col49 col50 col51 col52 col53 col54 col55 col56 col57 col58 col59 col60 col61 col62 col63 col64 col65 ccol1 ccol2 ccol3 ccol4 ccol5 ccol6 ccol7 ccol8 ccol9 ccol10 ccol11 ccol12 ccol13 ccol14 ccol15 ccol16 ccol17 ccol18 ccol19 ccol20 ccol21 ccol22 ccol23 ccol24 ccol25 ccol26 ccol27 ccol28 ccol29 ccol30 ccol31 ccol32 ccol33 ccol34 ccol35 ccol36 ccol37 ccol38 ccol39 ccol40 ccol41 ccol42 ccol43 ccol44 ccol45 ccol46 ccol47 ccol48 ccol49 ccol50 ccol51 ccol52 ccol53 ccol54 ccol55 ccol56 ccol57 ccol58 ccol59 ccol60 ccol61 ccol62 ccol63 ccol64 ccol65 -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL -DROP TABLE tab5; -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; -Warnings: -Warning 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > NNNNk. Assuming ROW_FORMAT=DYNAMIC. -DROP TABLE tab5; -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; -SHOW WARNINGS; -Level Code Message -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -LENGTH(col) -16384 -32768 -65535 -FLUSH TABLE t; -ANALYZE TABLE t; -Table Op Msg_type Msg_text -test.t analyze status Engine-independent statistics collected -test.t analyze Warning Engine-independent statistics are not collected for column 'col' -test.t analyze status OK -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -clust_index_size -5 -DROP TABLE t; -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; -SHOW WARNINGS; -Level Code Message -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -LENGTH(col) -16384 -32768 -65535 -FLUSH TABLE t; -ANALYZE TABLE t; -Table Op Msg_type Msg_text -test.t analyze status Engine-independent statistics collected -test.t analyze Warning Engine-independent statistics are not collected for column 'col' -test.t analyze status OK -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -clust_index_size -4 -DROP TABLE t; -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=COMPACT; -SHOW WARNINGS; -Level Code Message -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -LENGTH(col) -16384 -32768 -65535 -FLUSH TABLE t; -ANALYZE TABLE t; -Table Op Msg_type Msg_text -test.t analyze status Engine-independent statistics collected -test.t analyze Warning Engine-independent statistics are not collected for column 'col' -test.t analyze status OK -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -clust_index_size -4 -DROP TABLE t; diff --git a/mysql-test/suite/innodb/r/stored_fk.result b/mysql-test/suite/innodb/r/stored_fk.result index fc48f346656..542d362f3cf 100644 --- a/mysql-test/suite/innodb/r/stored_fk.result +++ b/mysql-test/suite/innodb/r/stored_fk.result @@ -1,19 +1,21 @@ -# Create statement with FK on base column of stored column -create table t1(f1 int, f2 int as(f1) stored, -foreign key(f1) references t2(f1) on delete cascade)engine=innodb; -ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed") -# adding new stored column during alter table copy operation. create table t1(f1 int primary key) engine=innodb; +# Create statement with FK on base column of stored column +create table t2(f1 int not null, f2 int as (f1) stored, +foreign key(f1) references t1(f1) on update cascade)engine=innodb; +ERROR HY000: Function or expression 'f1' cannot be used in the GENERATED ALWAYS AS clause of `f2` +create table t2(f1 int not null, f2 int as (f1) virtual, f3 int as (f2) stored, +foreign key(f1) references t1(f1) on update cascade)engine=innodb; +ERROR HY000: Function or expression 'f2' cannot be used in the GENERATED ALWAYS AS clause of `f3` +# adding new stored column during alter table copy operation. create table t2(f1 int not null, f2 int as (f1) virtual, foreign key(f1) references t1(f1) on update cascade)engine=innodb; alter table t2 add column f3 int as (f1) stored, add column f4 int as (f1) virtual; +ERROR HY000: Function or expression 'f1' cannot be used in the GENERATED ALWAYS AS clause of `f3` show create table t2; Table Create Table t2 CREATE TABLE `t2` ( `f1` int(11) NOT NULL, `f2` int(11) GENERATED ALWAYS AS (`f1`) VIRTUAL, - `f3` int(11) GENERATED ALWAYS AS (`f1`) STORED, - `f4` int(11) GENERATED ALWAYS AS (`f1`) VIRTUAL, KEY `f1` (`f1`), CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f1`) ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci @@ -21,26 +23,25 @@ drop table t2; # adding foreign key constraint for base columns during alter copy. create table t2(f1 int not null, f2 int as (f1) stored) engine=innodb; alter table t2 add foreign key(f1) references t1(f1) on update cascade, algorithm=copy; +ERROR HY000: Function or expression 'f1' cannot be used in the GENERATED ALWAYS AS clause of `f2` show create table t2; Table Create Table t2 CREATE TABLE `t2` ( `f1` int(11) NOT NULL, - `f2` int(11) GENERATED ALWAYS AS (`f1`) STORED, - KEY `f1` (`f1`), - CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t1` (`f1`) ON UPDATE CASCADE + `f2` int(11) GENERATED ALWAYS AS (`f1`) STORED ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci drop table t2; # adding foreign key constraint for base columns during online alter. create table t2(f1 int not null, f2 int as (f1) stored) engine=innodb; set foreign_key_checks = 0; alter table t2 add foreign key(f1) references t1(f1) on update cascade, algorithm=inplace; -ERROR 0A000: Cannot add foreign key on the base column of stored column +ERROR HY000: Function or expression 'f1' cannot be used in the GENERATED ALWAYS AS clause of `f2` drop table t2; # adding stored column via online alter. create table t2(f1 int not null, foreign key(f1) references t1(f1) on update cascade)engine=innodb; alter table t2 add column f2 int as (f1) stored, algorithm=inplace; -ERROR 0A000: ALGORITHM=INPLACE is not supported for this operation. Try ALGORITHM=COPY +ERROR HY000: Function or expression 'f1' cannot be used in the GENERATED ALWAYS AS clause of `f2` drop table t2, t1; # # BUG#26731689 FK ON TABLE WITH GENERATED COLS: ASSERTION POS < N_DEF diff --git a/mysql-test/suite/innodb/r/trx_sys_t_find_lf_hash_error.result b/mysql-test/suite/innodb/r/trx_sys_t_find_lf_hash_error.result new file mode 100644 index 00000000000..11d3fb4a7a3 --- /dev/null +++ b/mysql-test/suite/innodb/r/trx_sys_t_find_lf_hash_error.result @@ -0,0 +1,25 @@ +create table t1 (a int) engine=innodb STATS_PERSISTENT=0; +create table t2 (a int) engine=innodb STATS_PERSISTENT=0; +BEGIN; +insert into t1 values(1); +connect con_1, localhost, root,,; +SET DEBUG_SYNC="before_trx_hash_find_element_mutex_enter SIGNAL before_mutex_enter WAIT_FOR cont1"; +SET DEBUG_SYNC="after_trx_hash_find_element_mutex_enter SIGNAL after_mutex_enter WAIT_FOR cont2"; +SELECT * FROM t1 WHERE a = 1 FOR UPDATE; +connection default; +SET DEBUG_SYNC="now WAIT_FOR before_mutex_enter"; +COMMIT; +SET DEBUG_SYNC="now SIGNAL cont1"; +SET DEBUG_SYNC="now WAIT_FOR after_mutex_enter"; +insert into t2 values(1); +BEGIN; +INSERT INTO t2 VALUES(2); +SET DEBUG_SYNC="now SIGNAL cont2"; +connection con_1; +a +1 +disconnect con_1; +connection default; +DROP TABLE t1; +DROP TABLE t2; +SET DEBUG_SYNC="reset"; diff --git a/mysql-test/suite/innodb/t/alter_kill.test b/mysql-test/suite/innodb/t/alter_kill.test index 277d9b4e71b..c370ba1c99d 100644 --- a/mysql-test/suite/innodb/t/alter_kill.test +++ b/mysql-test/suite/innodb/t/alter_kill.test @@ -163,10 +163,14 @@ let SEARCH_PATTERN= \[ERROR\] InnoDB: Tablespace [0-9]+ was not found at .*test. -- source include/restart_mysqld.inc SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--disable_ps2_protocol SELECT * FROM bug16735660; +--enable_ps2_protocol XA RECOVER; XA ROLLBACK 'x'; +--disable_ps2_protocol SELECT * FROM bug16735660; +--enable_ps2_protocol DROP TABLE bug16735660; diff --git a/mysql-test/suite/innodb/t/data_types.test b/mysql-test/suite/innodb/t/data_types.test index 2856650dad1..19e37a41f83 100644 --- a/mysql-test/suite/innodb/t/data_types.test +++ b/mysql-test/suite/innodb/t/data_types.test @@ -140,3 +140,13 @@ DROP TABLE t1; CREATE TABLE t1 (c VARCHAR(0), KEY(c)) ENGINE=InnoDB; INSERT INTO t1 VALUES (''); DROP TABLE t1; + +--echo # +--echo # MDEV-19216 Assertion ...SYS_FOREIGN failed in btr_node_ptr_max_size +--echo # + +CREATE TABLE t1 (b BINARY(0), v VARBINARY(0), KEY(b), KEY(v)) ENGINE=InnoDB; +INSERT INTO t1 SET b='',v=''; +DROP TABLE t1; + +--echo # End of 10.4 tests diff --git a/mysql-test/suite/innodb/t/deadlock_on_lock_upgrade.test b/mysql-test/suite/innodb/t/deadlock_on_lock_upgrade.test new file mode 100644 index 00000000000..79adbe22021 --- /dev/null +++ b/mysql-test/suite/innodb/t/deadlock_on_lock_upgrade.test @@ -0,0 +1,143 @@ +--echo # +--echo # Bug #23755664 DEADLOCK WITH 3 CONCURRENT DELETES BY UNIQUE KEY +--echo # + +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/count_sessions.inc + +--connection default +# There are various scenarious in which a transaction already holds "half" +# of a record lock (for example, a lock on the record but not on the gap) +# and wishes to "upgrade it" to a full lock (i.e. on both gap and record). +# This is often a cause for a deadlock, if there is another transaction +# which is already waiting for the lock being blocked by us: +# 1. our granted lock for one half +# 2. her waiting lock for the same half +# 3. our waiting lock for the whole + +# +# SCENARIO 1 +# +# In this scenario, three different threads try to delete the same row, +# identified by a secondary index key. +# This kind of operation (besides LOCK_IX on a table) requires +# an LOCK_REC_NOT_GAP|LOCK_REC|LOCK_X lock on a secondary index +# 1. `deleter` is the first to get the required lock +# 2. `holder` enqueues a waiting lock +# 3. `waiter` enqueues right after `holder` +# 4. `deleter` commits, releasing the lock, and granting it to `holder` +# 5. `holder` now observes that the row was deleted, so it needs to +# "seal the gap", by obtaining a LOCK_X|LOCK_REC, but.. +# 6. this causes a deadlock between `holder` and `waiter` +# +# This scenario does not fail if MDEV-10962 is not fixed because of MDEV-30225 +# fix, as the 'holder' does not "seal the gap" after 'deleter' was committed, +# because it was initially sealed, as row_search_mvcc() requests next-key lock +# after MDEV-30225 fix in the case when it requested not-gap lock before the +# fix. +# +# But let the scenario be in the tests, because it can fail if MDEV-30225 +# related code is changed + +CREATE TABLE `t`( + `id` INT, + `a` INT DEFAULT NULL, + PRIMARY KEY(`id`), + UNIQUE KEY `u`(`a`) +) ENGINE=InnoDB; + +INSERT INTO t (`id`,`a`) VALUES + (1,1), + (2,9999), + (3,10000); + +--connect(deleter,localhost,root,,) +--connect(holder,localhost,root,,) +--connect(waiter,localhost,root,,) + + +--connection deleter + SET DEBUG_SYNC = + 'lock_sec_rec_read_check_and_lock_has_locked + SIGNAL deleter_has_locked + WAIT_FOR waiter_has_locked'; + --send DELETE FROM t WHERE a = 9999 + +--connection holder + SET DEBUG_SYNC= + 'now WAIT_FOR deleter_has_locked'; + SET DEBUG_SYNC= + 'lock_sec_rec_read_check_and_lock_has_locked SIGNAL holder_has_locked'; + --send DELETE FROM t WHERE a = 9999 + +--connection waiter + SET DEBUG_SYNC= + 'now WAIT_FOR holder_has_locked'; + SET DEBUG_SYNC= + 'lock_sec_rec_read_check_and_lock_has_locked SIGNAL waiter_has_locked'; + --send DELETE FROM t WHERE a = 9999 + +--connection deleter + --reap + +--connection holder + --reap + +--connection waiter + --reap + +--connection default + +--disconnect deleter +--disconnect holder +--disconnect waiter + +DROP TABLE `t`; +SET DEBUG_SYNC='reset'; + +# SCENARIO 2 +# +# Here, we form a situation in which con1 has LOCK_REC_NOT_GAP on rows 1 and 2 +# con2 waits for lock on row 1, and then con1 wants to upgrade the lock on row 1, +# which might cause a deadlock, unless con1 properly notices that even though the +# lock on row 1 can not be upgraded, a separate LOCK_GAP can be obtaied easily. + +CREATE TABLE `t`( + `id` INT NOT NULL PRIMARY KEY +) ENGINE=InnoDB; + +INSERT INTO t (`id`) VALUES (1), (2); + +--connect(holder,localhost,root,,) +--connect(waiter,localhost,root,,) + +--connection holder + BEGIN; + SELECT id FROM t WHERE id=1 FOR UPDATE; + SELECT id FROM t WHERE id=2 FOR UPDATE; + +--connection waiter + SET DEBUG_SYNC= + 'lock_wait_before_suspend SIGNAL waiter_will_wait'; + --send SELECT id FROM t WHERE id = 1 FOR UPDATE + +--connection holder + SET DEBUG_SYNC= + 'now WAIT_FOR waiter_will_wait'; + SELECT * FROM t FOR UPDATE; + COMMIT; + +--connection waiter + --reap + +--connection default + +--disconnect holder +--disconnect waiter + +DROP TABLE `t`; +SET DEBUG_SYNC='reset'; + +--source include/wait_until_count_sessions.inc diff --git a/mysql-test/suite/innodb/t/fk_col_alter.test b/mysql-test/suite/innodb/t/fk_col_alter.test new file mode 100644 index 00000000000..25f26b24bd0 --- /dev/null +++ b/mysql-test/suite/innodb/t/fk_col_alter.test @@ -0,0 +1,106 @@ +--source include/have_innodb.inc +--echo # +--echo # MDEV-31086 MODIFY COLUMN can break FK constraints, and +--echo # lead to unrestorable dumps +--echo # +CREATE TABLE t1( + id SERIAL, + msg VARCHAR(100) CHARACTER SET utf8mb3, + KEY(msg))ENGINE=InnoDB; + +--error ER_CANT_CREATE_TABLE +CREATE TABLE t2( +id SERIAL, +msg varchar(100) CHARACTER SET utf8mb4, +CONSTRAINT fk_t1 FOREIGN KEY (msg) REFERENCES t1 (msg))ENGINE=InnoDB; + +CREATE TABLE t2( +id SERIAL, +msg varchar(100) CHARACTER SET utf8mb3, +msg_1 varchar(100) CHARACTER SET utf8mb3, +INDEX (msg_1), +INDEX (msg), +CONSTRAINT fk_t1 FOREIGN KEY (msg) REFERENCES t1 (msg) +ON DELETE CASCADE)ENGINE=InnoDB; + +# Changing column used in FK constraint +SET FOREIGN_KEY_CHECKS=1; +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=COPY; +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=INPLACE; + +SET FOREIGN_KEY_CHECKS=0; +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(200) character set utf8mb3, ALGORITHM=COPY; +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(400) character set utf8mb3, ALGORITHM=INPLACE; + +# Changing column charset used in FK constraint +SET FOREIGN_KEY_CHECKS=1; +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY; + +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE; + +SET FOREIGN_KEY_CHECKS=0; +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4,ALGORITHM=COPY; + +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 MODIFY COLUMN msg VARCHAR(100) CHARACTER SET utf8mb4,ALGORITHM=INPLACE; + +# Modify the column in the newly added foreign constraint +SET FOREIGN_KEY_CHECKS=1; +--error ER_CANT_CREATE_TABLE +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY; + +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE; + + +SET FOREIGN_KEY_CHECKS=0; +--error ER_CANT_CREATE_TABLE +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=COPY; + +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(100) CHARACTER SET utf8mb4, ALGORITHM=INPLACE; + +--error ER_FK_COLUMN_CANNOT_CHANGE +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY(msg_1) REFERENCES t1(msg),MODIFY COLUMN msg_1 VARCHAR(200) CHARACTER SET utf8mb3, ALGORITHM=INPLACE; + +# Change referenced table column +SET FOREIGN_KEY_CHECKS=1; +# Change referenced column length +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=COPY; +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=INPLACE; +# Change referenced column character set +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=INPLACE; + +SET FOREIGN_KEY_CHECKS=0; +# Change referenced column length +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb3, ALGORITHM=COPY; +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD +ALTER TABLE t1 MODIFY msg VARCHAR(400) CHARSET utf8mb3, ALGORITHM=INPLACE; + +# Change referenced column character set +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=INPLACE; + +# Correct way to change character set in foreign key constraint +SET FOREIGN_KEY_CHECKS=0; +ALTER TABLE t2 DROP FOREIGN KEY fk_t1, MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +ALTER TABLE t1 MODIFY msg VARCHAR(200) CHARSET utf8mb4, ALGORITHM=COPY; +ALTER TABLE t2 ADD CONSTRAINT FOREIGN KEY (msg) REFERENCES t1(msg), aLGORITHM=INPLACE; +SET FOREIGN_KEY_CHECKS=1; + +DROP TABLE t2, t1; diff --git a/mysql-test/suite/innodb/t/foreign_key.test b/mysql-test/suite/innodb/t/foreign_key.test index 4b047ea4d4a..dd375c099cb 100644 --- a/mysql-test/suite/innodb/t/foreign_key.test +++ b/mysql-test/suite/innodb/t/foreign_key.test @@ -237,9 +237,12 @@ DROP TABLE t3,t1; CREATE TABLE t1 (a INT, UNIQUE(a), KEY(a)) ENGINE=InnoDB; ALTER TABLE t1 ADD FOREIGN KEY (a) REFERENCES t1 (a); SET SESSION FOREIGN_KEY_CHECKS = OFF; +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD ALTER TABLE t1 CHANGE COLUMN a a TIME NOT NULL; ALTER TABLE t1 ADD pk INT NOT NULL AUTO_INCREMENT PRIMARY KEY; +--error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON ALTER TABLE t1 CHANGE COLUMN a b TIME; +ALTER TABLE t1 CHANGE COLUMN a b TIME, DROP FOREIGN KEY t1_ibfk_1; SET SESSION FOREIGN_KEY_CHECKS = ON; DROP TABLE t1; @@ -434,7 +437,9 @@ end| delimiter ;| flush tables; flush status; +--disable_ps2_protocol select foo(); +--enable_ps2_protocol show status like '%opened_tab%'; drop function foo; drop table t2, t1; diff --git a/mysql-test/suite/innodb/t/innodb-autoinc-56228.test b/mysql-test/suite/innodb/t/innodb-autoinc-56228.test index 28141f812b2..a02f7b4383a 100644 --- a/mysql-test/suite/innodb/t/innodb-autoinc-56228.test +++ b/mysql-test/suite/innodb/t/innodb-autoinc-56228.test @@ -25,7 +25,9 @@ END // DELIMITER ;// +--disable_ps_protocol SELECT bug56228(); +--enable_ps2_protocol DROP FUNCTION bug56228; DROP TEMPORARY TABLE t2_56228; diff --git a/mysql-test/suite/innodb/t/innodb.test b/mysql-test/suite/innodb/t/innodb.test index 3b3b2770df7..9e223de2682 100644 --- a/mysql-test/suite/innodb/t/innodb.test +++ b/mysql-test/suite/innodb/t/innodb.test @@ -1632,6 +1632,7 @@ drop table t1; set foreign_key_checks=0; create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb; create table t1(a varchar(10) primary key) engine = innodb; +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD alter table t1 modify column a int; set foreign_key_checks=1; drop table t2,t1; @@ -1641,6 +1642,7 @@ drop table t2,t1; set foreign_key_checks=0; create table t2 (a varchar(10), foreign key (a) references t1(a)) engine = innodb DEFAULT CHARSET=latin1; create table t1(a varchar(10) primary key) engine = innodb DEFAULT CHARSET=latin1; +--error ER_FK_COLUMN_CANNOT_CHANGE_CHILD alter table t1 convert to character set utf8; set foreign_key_checks=1; drop table t2,t1; diff --git a/mysql-test/suite/innodb/t/innodb_bug14007649.test b/mysql-test/suite/innodb/t/innodb_bug14007649.test index 9326e1c53ef..9b332b9b08b 100644 --- a/mysql-test/suite/innodb/t/innodb_bug14007649.test +++ b/mysql-test/suite/innodb/t/innodb_bug14007649.test @@ -22,7 +22,9 @@ start transaction; update t1 set f2 = 4 where f1 = 1 and f2 is null; -- echo (b) Number of rows updated: +--disable_ps2_protocol select row_count(); +--enable_ps2_protocol insert into t1 values (3, 1, null); @@ -40,7 +42,9 @@ SET SESSION debug_dbug="+d,bug14007649"; update t1 set f2 = 6 where f1 = 1 and f2 is null; -- echo (a) Number of rows updated: +--disable_ps2_protocol select row_count(); +--enable_ps2_protocol -- echo (a) After the update statement is executed. select rowid, f1, f2 from t1; diff --git a/mysql-test/suite/innodb/t/innodb_bug59641.test b/mysql-test/suite/innodb/t/innodb_bug59641.test index e0d3431e45b..36001133a88 100644 --- a/mysql-test/suite/innodb/t/innodb_bug59641.test +++ b/mysql-test/suite/innodb/t/innodb_bug59641.test @@ -36,13 +36,17 @@ CONNECT (con3,localhost,root,,); --let $shutdown_timeout=0 --source include/restart_mysqld.inc SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--disable_ps2_protocol SELECT * FROM t; +--enable_ps2_protocol COMMIT; --source include/restart_mysqld.inc SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--disable_ps2_protocol SELECT * FROM t; +--enable_ps2_protocol COMMIT; --sorted_result XA RECOVER; diff --git a/mysql-test/suite/innodb/t/innodb_force_recovery.test b/mysql-test/suite/innodb/t/innodb_force_recovery.test index 2544db15f29..2368af76f09 100644 --- a/mysql-test/suite/innodb/t/innodb_force_recovery.test +++ b/mysql-test/suite/innodb/t/innodb_force_recovery.test @@ -143,7 +143,9 @@ connection default; let $status=`SHOW ENGINE INNODB STATUS`; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--disable_ps2_protocol select * from t2; +--enable_ps2_protocol SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; select * from t2; SET SESSION innodb_lock_wait_timeout=1; diff --git a/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.opt b/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.opt deleted file mode 100644 index 05d6c5f9435..00000000000 --- a/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.opt +++ /dev/null @@ -1,5 +0,0 @@ ---innodb-page-size=32K ---innodb_buffer_pool_size=32M ---skip-innodb-stats-persistent ---innodb-sys-tablestats ---skip-innodb-read-only-compressed diff --git a/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.test b/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.test deleted file mode 100644 index 89bace5d9b1..00000000000 --- a/mysql-test/suite/innodb/t/innodb_max_recordsize_32k.test +++ /dev/null @@ -1,327 +0,0 @@ ---source include/have_innodb.inc ---source include/have_innodb_32k.inc - -# Check page size 32k -SELECT @@innodb_page_size; - -SET innodb_strict_mode=ON; - -# FIXED not supported --- error 1005 -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=FIXED; -show warnings; - --- error 1005 -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; -show warnings; - ---disable_warnings -SET @@innodb_strict_mode=OFF; -SELECT @@innodb_strict_mode; ---enable_warnings - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPACT; - -# row size 16353 > 16K ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),'a',NULL); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPACT; - -# row size 16318 : expected to fail ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',156),NULL); - -# row size 16317 -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',155),NULL); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=DYNAMIC; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=DYNAMIC; - -# row size 16318 : expected to fail ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',156),NULL); - -# row size 16317 -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',155),NULL); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=REDUNDANT; - -# 65 * 255 = 16575 ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255)); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=REDUNDANT; - -# row size 16315 : expected to fail ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',89),NULL); - -# row size 16314 -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',88),NULL); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > NNNNk. Assuming ROW_FORMAT=COMPACT ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; - -DROP TABLE tab5; - -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; -SHOW WARNINGS; -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -FLUSH TABLE t; -ANALYZE TABLE t; -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -DROP TABLE t; - -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; -SHOW WARNINGS; -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -FLUSH TABLE t; -ANALYZE TABLE t; -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -DROP TABLE t; - -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=COMPACT; -SHOW WARNINGS; -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -FLUSH TABLE t; -ANALYZE TABLE t; -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -DROP TABLE t; diff --git a/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.opt b/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.opt deleted file mode 100644 index 1c11f5f2add..00000000000 --- a/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.opt +++ /dev/null @@ -1,5 +0,0 @@ ---innodb-page-size=64K ---innodb_buffer_pool_size=32M ---skip-innodb-stats-persistent ---innodb-sys-tablestats ---skip-innodb-read-only-compressed diff --git a/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.test b/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.test deleted file mode 100644 index 4b4faf16f58..00000000000 --- a/mysql-test/suite/innodb/t/innodb_max_recordsize_64k.test +++ /dev/null @@ -1,508 +0,0 @@ ---source include/have_innodb.inc ---source include/have_innodb_64k.inc - -# Check page size 64k -SELECT @@innodb_page_size; - -SET innodb_strict_mode=ON; - -# FIXED not supported --- error 1005 -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=FIXED; -show warnings; - --- error 1005 -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; -show warnings; - ---disable_warnings -SET @@innodb_strict_mode=OFF; -SELECT @@innodb_strict_mode; ---enable_warnings - -# Check the Warning | 139 | Row size too large ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), -ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), -ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), -ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), -ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), -ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), -ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), -ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), -ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), -ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), -ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), -ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) -) -ENGINE = innodb ROW_FORMAT=COMPACT; - -# row size 32936 : should fail ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),'a',NULL); - -SELECT * FROM tab5; -DROP TABLE tab5; - -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), -ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), -ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), -ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), -ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), -ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), -ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), -ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), -ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), -ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), -ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), -ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) -) -ENGINE = innodb ROW_FORMAT=COMPACT; - -# row size 16384 >= 16K : expected to fail ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',214),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); - -# row size 16383 < 16K : expected to pass -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',213),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), -ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), -ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), -ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), -ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), -ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), -ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), -ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), -ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), -ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), -ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), -ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) -) -ENGINE = innodb ROW_FORMAT=DYNAMIC; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large (> 16318) ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), -ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), -ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), -ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), -ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), -ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), -ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), -ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), -ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), -ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), -ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), -ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) -) -ENGINE = innodb ROW_FORMAT=DYNAMIC; - -# row size 16384 >= 16K : expected to fail ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',214),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); - -# row size 16383 < 16K : expected to pass -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',213),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255), -col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255), -col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255), -col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255), -col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255), -col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255), -col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255), -col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255), -col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255), -col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255), -col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255), -ccol1 CHAR(255),ccol2 CHAR(255),ccol3 CHAR(255),ccol4 CHAR(255),ccol5 CHAR(255), -ccol6 CHAR(255),ccol7 CHAR(255),ccol8 CHAR(255),ccol9 CHAR(255),ccol10 CHAR(255), ccol11 CHAR(255), -ccol12 CHAR(255),ccol13 CHAR(255),ccol14 CHAR(255),ccol15 CHAR(255),ccol16 CHAR(255), ccol17 CHAR(255), -ccol18 CHAR(255),ccol19 CHAR(255),ccol20 CHAR(255),ccol21 CHAR(255),ccol22 CHAR(255), ccol23 CHAR(255), -ccol24 CHAR(255),ccol25 CHAR(255),ccol26 CHAR(255),ccol27 CHAR(255),ccol28 CHAR(255), ccol29 CHAR(255), -ccol30 CHAR(255),ccol31 CHAR(255),ccol32 CHAR(255),ccol33 CHAR(255),ccol34 CHAR(255), ccol35 CHAR(255), -ccol36 CHAR(255),ccol37 CHAR(255),ccol38 CHAR(255),ccol39 CHAR(255),ccol40 CHAR(255), ccol41 CHAR(255), -ccol42 CHAR(255),ccol43 CHAR(255),ccol44 CHAR(255),ccol45 CHAR(255),ccol46 CHAR(255), ccol47 CHAR(255), -ccol48 CHAR(255),ccol49 CHAR(255),ccol50 CHAR(255),ccol51 CHAR(255),ccol52 CHAR(255), ccol53 CHAR(255), -ccol54 CHAR(255),ccol55 CHAR(255),ccol56 CHAR(255),ccol57 CHAR(255),ccol58 CHAR(255), ccol59 CHAR(255), -ccol60 CHAR(255),ccol61 CHAR(255),ccol62 CHAR(255),ccol63 CHAR(255),ccol64 CHAR(255), ccol65 CHAR(255) -) -ENGINE = innodb ROW_FORMAT=REDUNDANT; - -# 65 * 255 = 16575 ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 139 | Row size too large ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255), -ccol1 VARCHAR(255),ccol2 VARCHAR(255),ccol3 VARCHAR(255),ccol4 VARCHAR(255),ccol5 VARCHAR(255), -ccol6 VARCHAR(255),ccol7 VARCHAR(255),ccol8 VARCHAR(255),ccol9 VARCHAR(255),ccol10 VARCHAR(255), ccol11 VARCHAR(255), -ccol12 VARCHAR(255),ccol13 VARCHAR(255),ccol14 VARCHAR(255),ccol15 VARCHAR(255),ccol16 VARCHAR(255), ccol17 VARCHAR(255), -ccol18 VARCHAR(255),ccol19 VARCHAR(255),ccol20 VARCHAR(255),ccol21 VARCHAR(255),ccol22 VARCHAR(255), ccol23 VARCHAR(255), -ccol24 VARCHAR(255),ccol25 VARCHAR(255),ccol26 VARCHAR(255),ccol27 VARCHAR(255),ccol28 VARCHAR(255), ccol29 VARCHAR(255), -ccol30 VARCHAR(255),ccol31 VARCHAR(255),ccol32 VARCHAR(255),ccol33 VARCHAR(255),ccol34 VARCHAR(255), ccol35 VARCHAR(255), -ccol36 VARCHAR(255),ccol37 VARCHAR(255),ccol38 VARCHAR(255),ccol39 VARCHAR(255),ccol40 VARCHAR(255), ccol41 VARCHAR(255), -ccol42 VARCHAR(255),ccol43 VARCHAR(255),ccol44 VARCHAR(255),ccol45 VARCHAR(255),ccol46 VARCHAR(255), ccol47 VARCHAR(255), -ccol48 VARCHAR(255),ccol49 VARCHAR(255),ccol50 VARCHAR(255),ccol51 VARCHAR(255),ccol52 VARCHAR(255), ccol53 VARCHAR(255), -ccol54 VARCHAR(255),ccol55 VARCHAR(255),ccol56 VARCHAR(255),ccol57 VARCHAR(255),ccol58 VARCHAR(255), ccol59 VARCHAR(255), -ccol60 VARCHAR(255),ccol61 VARCHAR(255),ccol62 VARCHAR(255),ccol63 VARCHAR(255),ccol64 VARCHAR(255), ccol65 VARCHAR(255) -) -ENGINE = innodb ROW_FORMAT=REDUNDANT; - -# row size 16383 >= 16K-1 : expected to fail ---error ER_TOO_BIG_ROWSIZE -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',27),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); - -# row size 16382 < 16K-1 : expected to pass -INSERT INTO tab5 values(repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',255), -repeat('a',255),repeat('a',255),repeat('a',255),repeat('a',26),NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL, -NULL,NULL,NULL,NULL,NULL -); - -SELECT * FROM tab5; -DROP TABLE tab5; - -# Check the Warning | 1478 InnoDB: Cannot create a COMPRESSED table when innodb_page_size > NNNNk. Assuming ROW_FORMAT=COMPACT ---replace_regex /> [0-9]+/> NNNN/ -CREATE TABLE tab5(col1 VARCHAR (255), col2 VARCHAR (255), col3 VARCHAR(255),col4 VARCHAR(255), col5 VARCHAR(255), -col6 VARCHAR(255), col7 VARCHAR(255), col8 VARCHAR(255), col9 VARCHAR(255),col10 VARCHAR(255), col11 VARCHAR(255), -col12 VARCHAR(255), col13 VARCHAR(255),col14 VARCHAR(255),col15 VARCHAR(255),col16 VARCHAR(255), col17 VARCHAR(255), -col18 VARCHAR(255),col19 VARCHAR(255),col20 VARCHAR(255),col21 VARCHAR(255),col22 VARCHAR(255), col23 VARCHAR(255), -col24 VARCHAR(255),col25 VARCHAR(255),col26 VARCHAR(255),col27 VARCHAR(255),col28 VARCHAR(255), col29 VARCHAR(255), -col30 VARCHAR(255),col31 VARCHAR(255),col32 VARCHAR(255),col33 VARCHAR(255),col34 VARCHAR(255), col35 VARCHAR(255), -col36 VARCHAR(255),col37 VARCHAR(255),col38 VARCHAR(255),col39 VARCHAR(255),col40 VARCHAR(255), col41 VARCHAR(255), -col42 VARCHAR(255),col43 VARCHAR(255),col44 VARCHAR(255),col45 VARCHAR(255),col46 VARCHAR(255), col47 VARCHAR(255), -col48 VARCHAR(255),col49 VARCHAR(255),col50 VARCHAR(255),col51 VARCHAR(255),col52 VARCHAR(255), col53 VARCHAR(255), -col54 VARCHAR(255),col55 VARCHAR(255),col56 VARCHAR(255),col57 VARCHAR(255),col58 VARCHAR(255), col59 VARCHAR(255), -col60 VARCHAR(255),col61 VARCHAR(255),col62 VARCHAR(255),col63 VARCHAR(255),col64 VARCHAR(255), col65 VARCHAR(255)) -ENGINE = innodb ROW_FORMAT=COMPRESSED; - -DROP TABLE tab5; - -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=DYNAMIC; -SHOW WARNINGS; -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -FLUSH TABLE t; -ANALYZE TABLE t; -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -DROP TABLE t; - -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; -SHOW WARNINGS; -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -FLUSH TABLE t; -ANALYZE TABLE t; -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -DROP TABLE t; - -CREATE TABLE t(col BLOB) ENGINE=InnoDB ROW_FORMAT=COMPACT; -SHOW WARNINGS; -INSERT INTO t VALUES (REPEAT('a',16384)); -INSERT INTO t VALUES (REPEAT('a',32768)); -INSERT INTO t VALUES (REPEAT('a',65535)); -SELECT LENGTH(col) FROM t; -FLUSH TABLE t; -ANALYZE TABLE t; -SELECT clust_index_size FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESTATS -WHERE name = 'test/t'; -DROP TABLE t; diff --git a/mysql-test/suite/innodb/t/instant_alter_bugs.test b/mysql-test/suite/innodb/t/instant_alter_bugs.test index b9d631a9213..5c3c39d44e0 100644 --- a/mysql-test/suite/innodb/t/instant_alter_bugs.test +++ b/mysql-test/suite/innodb/t/instant_alter_bugs.test @@ -128,7 +128,9 @@ INSERT INTO t1 (f1,f2,f3,f4,f5,f6,f7,f8) VALUES INSERT INTO t1 (f1,f2,f3,f4,f5,f6,f7,f8) VALUES ('impact', 'b', 'h', 185, 'fj', 7, 7, 3); ALTER TABLE t1 ADD COLUMN filler VARCHAR(255) DEFAULT ''; +--disable_ps2_protocol SELECT * INTO OUTFILE 'load.data' FROM t1; +--enable_ps2_protocol UPDATE IGNORE t1 SET pk = 0; LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1; HANDLER t1 OPEN AS h; diff --git a/mysql-test/suite/innodb/t/monitor.test b/mysql-test/suite/innodb/t/monitor.test index 65a93e5a97a..6cced98501e 100644 --- a/mysql-test/suite/innodb/t/monitor.test +++ b/mysql-test/suite/innodb/t/monitor.test @@ -365,6 +365,7 @@ primary key (a(1), c(1)), key(b)) engine = innodb; insert into monitor_test values("13", 2, "aa"); +--disable_ps2_protocol select a from monitor_test where b < 1 for update; # should have icp_attempts = 1 and icp_out_of_range = 1 @@ -376,6 +377,7 @@ select a from monitor_test where b < 3 for update; select name, count from information_schema.innodb_metrics where name like "icp%"; +--enable_ps2_protocol drop table monitor_test; set global innodb_monitor_disable = All; diff --git a/mysql-test/suite/innodb/t/read_only_recover_committed.test b/mysql-test/suite/innodb/t/read_only_recover_committed.test index d61fbd3c522..50863f0cc4a 100644 --- a/mysql-test/suite/innodb/t/read_only_recover_committed.test +++ b/mysql-test/suite/innodb/t/read_only_recover_committed.test @@ -57,7 +57,9 @@ COMMIT; --disconnect con2 SELECT * FROM t; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--disable_ps2_protocol SELECT * FROM t; +--enable_ps2_protocol # refused on MySQL 5.6, MariaDB 10.0, 10.1, but not MariaDB 10.2+ UPDATE t SET a=3 WHERE a=1; --let $restart_parameters= --innodb-read-only diff --git a/mysql-test/suite/innodb/t/stored_fk.test b/mysql-test/suite/innodb/t/stored_fk.test index b9c7c934555..571ca030d65 100644 --- a/mysql-test/suite/innodb/t/stored_fk.test +++ b/mysql-test/suite/innodb/t/stored_fk.test @@ -1,24 +1,28 @@ --source include/have_innodb.inc +create table t1(f1 int primary key) engine=innodb; + --echo # Create statement with FK on base column of stored column ---error ER_CANT_CREATE_TABLE -create table t1(f1 int, f2 int as(f1) stored, - foreign key(f1) references t2(f1) on delete cascade)engine=innodb; +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create table t2(f1 int not null, f2 int as (f1) stored, + foreign key(f1) references t1(f1) on update cascade)engine=innodb; + +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create table t2(f1 int not null, f2 int as (f1) virtual, f3 int as (f2) stored, + foreign key(f1) references t1(f1) on update cascade)engine=innodb; --echo # adding new stored column during alter table copy operation. -create table t1(f1 int primary key) engine=innodb; create table t2(f1 int not null, f2 int as (f1) virtual, foreign key(f1) references t1(f1) on update cascade)engine=innodb; -# MySQL 5.7 would refuse this -#--error ER_ERROR_ON_RENAME +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t2 add column f3 int as (f1) stored, add column f4 int as (f1) virtual; show create table t2; drop table t2; --echo # adding foreign key constraint for base columns during alter copy. create table t2(f1 int not null, f2 int as (f1) stored) engine=innodb; -# MySQL 5.7 would refuse this +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t2 add foreign key(f1) references t1(f1) on update cascade, algorithm=copy; show create table t2; drop table t2; @@ -26,14 +30,14 @@ drop table t2; --echo # adding foreign key constraint for base columns during online alter. create table t2(f1 int not null, f2 int as (f1) stored) engine=innodb; set foreign_key_checks = 0; ---error 138 +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t2 add foreign key(f1) references t1(f1) on update cascade, algorithm=inplace; drop table t2; --echo # adding stored column via online alter. create table t2(f1 int not null, foreign key(f1) references t1(f1) on update cascade)engine=innodb; ---error ER_ALTER_OPERATION_NOT_SUPPORTED +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t2 add column f2 int as (f1) stored, algorithm=inplace; drop table t2, t1; diff --git a/mysql-test/suite/innodb/t/table_index_statistics.inc b/mysql-test/suite/innodb/t/table_index_statistics.inc index ba585320fc9..01f8af06c86 100644 --- a/mysql-test/suite/innodb/t/table_index_statistics.inc +++ b/mysql-test/suite/innodb/t/table_index_statistics.inc @@ -9,6 +9,7 @@ FLUSH TABLE_STATISTICS; SET @userstat_old= @@userstat; SET GLOBAL userstat=ON; +--disable_ps2_protocol CREATE TABLE t1 (id int(10), PRIMARY KEY (id)); INSERT INTO t1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); SELECT COUNT(*) FROM t1; @@ -33,6 +34,7 @@ SELECT ROWS_READ FROM INFORMATION_SCHEMA.INDEX_STATISTICS WHERE TABLE_NAME='t1'; SELECT COUNT(*) FROM t1; SELECT ROWS_READ FROM INFORMATION_SCHEMA.TABLE_STATISTICS WHERE TABLE_NAME='t1'; SELECT ROWS_READ FROM INFORMATION_SCHEMA.INDEX_STATISTICS WHERE TABLE_NAME='t1'; +--enable_ps2_protocol DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/temp_table_savepoint.test b/mysql-test/suite/innodb/t/temp_table_savepoint.test index ffac771ded9..fd1d06b48f7 100644 --- a/mysql-test/suite/innodb/t/temp_table_savepoint.test +++ b/mysql-test/suite/innodb/t/temp_table_savepoint.test @@ -141,7 +141,10 @@ update ignore t5 set c1 = 20 where c1 = 140 ; select count(*) from t5 where c1 = 140; --replace_result $MYSQLTEST_VARDIR VARDIR +--disable_ps2_protocol eval select * into outfile "$MYSQLTEST_VARDIR/tmp/t5.outfile" from t5; +--enable_ps2_protocol + create temporary table temp_1 engine = innodb as select * from t5 where 1=2; select count(*) from temp_1; diff --git a/mysql-test/suite/innodb/t/trx_sys_t_find_lf_hash_error.test b/mysql-test/suite/innodb/t/trx_sys_t_find_lf_hash_error.test new file mode 100644 index 00000000000..833919f9ad6 --- /dev/null +++ b/mysql-test/suite/innodb/t/trx_sys_t_find_lf_hash_error.test @@ -0,0 +1,87 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/count_sessions.inc + +create table t1 (a int) engine=innodb STATS_PERSISTENT=0; +create table t2 (a int) engine=innodb STATS_PERSISTENT=0; + +BEGIN; # trx1 +# register rw-transaction in trx_sys.rw_trx_hash +insert into t1 values(1); + +--connect (con_1, localhost, root,,) +SET DEBUG_SYNC="before_trx_hash_find_element_mutex_enter SIGNAL before_mutex_enter WAIT_FOR cont1"; +SET DEBUG_SYNC="after_trx_hash_find_element_mutex_enter SIGNAL after_mutex_enter WAIT_FOR cont2"; + +# trx2 is converting implicit lock of trx1 to explicit one, it's invoking +# â–¾ l_search +# â–¾ lf_hash_search_using_hash_value +# â–¾ lf_hash_search +# â–¾ rw_trx_hash_t::find +# â–¾ trx_sys_t::find +# â–¾ lock_rec_convert_impl_to_expl +# rw_trx_hash_t::find returns lf_hash element, pin 2 is pinned, +# but element->mutex has not been acquired yet, what allows trx1 element to be +# removed from trx_sys.rw_trx_hash at one hand, and at the other hand, the +# content of the element is still valid as it's pinned. +# +# trx2 +--send SELECT * FROM t1 WHERE a = 1 FOR UPDATE +--connection default +SET DEBUG_SYNC="now WAIT_FOR before_mutex_enter"; +--disable_query_log +SET @saved_dbug = @@debug_dbug; + +# Usually pinbox purgatory is purged either when the number of elements in +# purgatory is greater then some limit(see lf_pinbox_free()), or when thread +# invokes rw_trx_hash_t::put_pins() explicitly. For this test the first +# variant was choosen. The following option makes lf_pinbox_free() to purge +# pinbox purgatory on each call, ignoring pins->purgatory_count. +SET DEBUG_DBUG='+d,unconditional_pinbox_free'; +--enable_query_log + +# trx1 is committed and removed from trx_sys.rw_trx_hash. It can be done as +# trx2 has not been acquired element->mutex yet. +COMMIT; +--disable_query_log +SET DEBUG_DBUG = @saved_dbug; +--enable_query_log + +# Let trx2 to acquire element->mutex and unpin pin 2 +SET DEBUG_SYNC="now SIGNAL cont1"; +SET DEBUG_SYNC="now WAIT_FOR after_mutex_enter"; + +--disable_query_log +SET @saved_dbug = @@debug_dbug; +SET DEBUG_DBUG='+d,unconditional_pinbox_free'; +--enable_query_log +# trx3 commits and invokes lf_pinbox_free(), which purges pin 2 of trx2 and +# places its pointer on trx_sys.rw_trx_hash.hash.alloc.top. +insert into t2 values(1); +--disable_query_log +SET DEBUG_DBUG = @saved_dbug; +--enable_query_log + +BEGIN; # trx4 +# trx_sys.rw_trx_hash.hash.alloc.top points to "freed" trx2 lf_hash element, +# lf_alloc_new() gets the pointer from trx_sys.rw_trx_hash.hash.alloc.top, +# so the memory for lf_hash element will be reused for trx4 if MDEV-31185 is +# not fixed +INSERT INTO t2 VALUES(2); + +# let trx2 to invoke DBUG_ASSERT(trx_id == trx->id) and crash if MDEV-31185 +# is not fixed +SET DEBUG_SYNC="now SIGNAL cont2"; + +--connection con_1 +# trx 2 assertion failure if MDEV-31185 is not fixed +--reap +--disconnect con_1 +--connection default +DROP TABLE t1; +DROP TABLE t2; + +SET DEBUG_SYNC="reset"; + +--source include/wait_until_count_sessions.inc diff --git a/mysql-test/suite/innodb/t/xa_recovery.test b/mysql-test/suite/innodb/t/xa_recovery.test index cfb82240187..547c4eb9d54 100644 --- a/mysql-test/suite/innodb/t/xa_recovery.test +++ b/mysql-test/suite/innodb/t/xa_recovery.test @@ -47,7 +47,9 @@ DROP TABLE t2; disconnect con1; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--disable_ps2_protocol SELECT * FROM t1; +--enable_ps2_protocol XA ROLLBACK 'x'; SELECT * FROM t1; diff --git a/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test b/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test index b194ad20f71..c2d1d82657d 100644 --- a/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test +++ b/mysql-test/suite/innodb_fts/t/innodb_fts_misc.test @@ -1349,3 +1349,4 @@ ALTER TABLE t1 KEY_BLOCK_SIZE=0; SET GLOBAL innodb_read_only_compressed=@save_innodb_read_only_compressed; --enable_query_log DROP TABLE t1; + diff --git a/mysql-test/suite/innodb_gis/t/0.test b/mysql-test/suite/innodb_gis/t/0.test index b5d82f2ae69..c482d881732 100644 --- a/mysql-test/suite/innodb_gis/t/0.test +++ b/mysql-test/suite/innodb_gis/t/0.test @@ -25,7 +25,9 @@ connect (con1,localhost,root,,); connection con1; set @g1 = ST_GeomFromText('Polygon((0 0,0 100,100 100,100 0,0 0))'); set transaction isolation level read uncommitted; +--disable_ps2_protocol select count(*) from t1 where ST_Within(t1.c2, @g1); +--enable_ps2_protocol disconnect con1; --source include/wait_until_disconnected.inc diff --git a/mysql-test/suite/maria/encrypt-no-key.result b/mysql-test/suite/maria/encrypt-no-key.result index 5229158d525..20b856dc27c 100644 --- a/mysql-test/suite/maria/encrypt-no-key.result +++ b/mysql-test/suite/maria/encrypt-no-key.result @@ -1,17 +1,30 @@ call mtr.add_suppression('Unknown key id 1'); call mtr.add_suppression('try to repair it'); call mtr.add_suppression('Index is corrupted'); +call mtr.add_suppression("Initialization of encryption failed.*"); set global aria_encrypt_tables= 1; create table t1 (pk int primary key, a int, key(a)) engine=aria transactional=1; -alter table t1 disable keys; -insert into t1 values (1,1); -alter table t1 enable keys; -ERROR HY000: Unknown key id 1 for test/t1. Can't continue! -repair table t1 use_frm; -Table Op Msg_type Msg_text -test.t1 repair warning Number of rows changed from 0 to 1 -test.t1 repair Error Unknown key id 1 for test/t1. Can't continue! -test.t1 repair Error Unknown key id 1 for test/t1. Can't continue! -test.t1 repair status OK -drop table t1; +ERROR HY000: Initialization of encryption failed for ./test/t1 set global aria_encrypt_tables= default; +# +# MDEV-26258 Various crashes/asserts/corruptions when Aria encryption is +# enabled/used, but the encryption plugin is not loaded +# +SET GLOBAL aria_encrypt_tables=ON; +CREATE TABLE t1 (a INT KEY,b INT,KEY(b)) ENGINE=Aria; +ERROR HY000: Initialization of encryption failed for ./test/t1 +# Restart with encryption enabled +CREATE TABLE t1 (a INT KEY,b INT,KEY(b)) ENGINE=Aria; +INSERT INTO t1 VALUES (4,0); +LOAD INDEX INTO CACHE t1 IGNORE LEAVES; +Table Op Msg_type Msg_text +test.t1 preload_keys status OK +LOAD INDEX INTO CACHE t1; +Table Op Msg_type Msg_text +test.t1 preload_keys status OK +SELECT * FROM t1; +ERROR HY000: Initialization of encryption failed for ./test/t1.MAD +DROP TABLE t1; +Warnings: +Warning 199 Initialization of encryption failed for ./test/t1.MAD +Cleanup diff --git a/mysql-test/suite/maria/encrypt-no-key.test b/mysql-test/suite/maria/encrypt-no-key.test index 1157263ca79..457441226cc 100644 --- a/mysql-test/suite/maria/encrypt-no-key.test +++ b/mysql-test/suite/maria/encrypt-no-key.test @@ -1,20 +1,59 @@ +--source include/not_embedded.inc # # MDEV-18496 Crash when Aria encryption is enabled but plugin not available # call mtr.add_suppression('Unknown key id 1'); call mtr.add_suppression('try to repair it'); call mtr.add_suppression('Index is corrupted'); +call mtr.add_suppression("Initialization of encryption failed.*"); set global aria_encrypt_tables= 1; +--error HA_ERR_NO_ENCRYPTION create table t1 (pk int primary key, a int, key(a)) engine=aria transactional=1; -alter table t1 disable keys; -insert into t1 values (1,1); ---replace_result \\ / ---replace_regex /for .*test/for test/ ---error 192 -alter table t1 enable keys; ---replace_result \\ / ---replace_regex /for .*test/for test/ -repair table t1 use_frm; -drop table t1; set global aria_encrypt_tables= default; + +--echo # +--echo # MDEV-26258 Various crashes/asserts/corruptions when Aria encryption is +--echo # enabled/used, but the encryption plugin is not loaded +--echo # + +SET GLOBAL aria_encrypt_tables=ON; + +--write_file $MYSQLTEST_VARDIR/keys1.txt +1;770A8A65DA156D24EE2A093277530142 +EOF + +--replace_result \\ / +--error HA_ERR_NO_ENCRYPTION +CREATE TABLE t1 (a INT KEY,b INT,KEY(b)) ENGINE=Aria; + +--echo # Restart with encryption enabled + +--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--shutdown_server +--source include/wait_until_disconnected.inc +--exec echo "restart:--aria-encrypt-tables=1 --plugin-load-add=file_key_management --file-key-management --file-key-management-filename=$MYSQLTEST_VARDIR/keys1.txt" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--enable_reconnect +--source include/wait_until_connected_again.inc + +CREATE TABLE t1 (a INT KEY,b INT,KEY(b)) ENGINE=Aria; +INSERT INTO t1 VALUES (4,0); +LOAD INDEX INTO CACHE t1 IGNORE LEAVES; +LOAD INDEX INTO CACHE t1; + +# Restart without encryption. Above table should be unreadable + +--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--shutdown_server +--source include/wait_until_disconnected.inc +--exec echo "restart:--aria-encrypt-tables=0" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--enable_reconnect +--source include/wait_until_connected_again.inc + +--replace_result \\ / +--error HA_ERR_NO_ENCRYPTION +SELECT * FROM t1; +DROP TABLE t1; + +--echo Cleanup +--remove_file $MYSQLTEST_VARDIR/keys1.txt diff --git a/mysql-test/suite/maria/encrypt-wrong-key.result b/mysql-test/suite/maria/encrypt-wrong-key.result index bc22481296d..4ff057957da 100644 --- a/mysql-test/suite/maria/encrypt-wrong-key.result +++ b/mysql-test/suite/maria/encrypt-wrong-key.result @@ -1,16 +1,16 @@ call mtr.add_suppression("file_key_management"); call mtr.add_suppression("System key id 1 is missing"); call mtr.add_suppression("Unknown key id 1"); -call mtr.add_suppression("Failed to decrypt"); +call mtr.add_suppression("Initialization of encryption failed.*"); CREATE TABLE t1 (i INT, KEY(i)) ENGINE=Aria; INSERT INTO t1 VALUES (1); repair table t1; Table Op Msg_type Msg_text -test.t1 repair info Wrong CRC on datapage at 1 -test.t1 repair warning Number of rows changed from 1 to 0 -test.t1 repair status OK +test.t1 repair Error Initialization of encryption failed for ./test/t1.MAD +test.t1 repair error Corrupt INSERT INTO t1 VALUES (2); +ERROR HY000: Initialization of encryption failed for ./test/t1.MAD select * from t1; -ERROR HY000: failed to decrypt './test/t1' rc: -1 dstlen: 0 size: 8172 - +i +1 drop table t1; diff --git a/mysql-test/suite/maria/encrypt-wrong-key.test b/mysql-test/suite/maria/encrypt-wrong-key.test index ca65e1018d0..ac060c4e9dd 100644 --- a/mysql-test/suite/maria/encrypt-wrong-key.test +++ b/mysql-test/suite/maria/encrypt-wrong-key.test @@ -7,7 +7,7 @@ call mtr.add_suppression("file_key_management"); call mtr.add_suppression("System key id 1 is missing"); call mtr.add_suppression("Unknown key id 1"); -call mtr.add_suppression("Failed to decrypt"); +call mtr.add_suppression("Initialization of encryption failed.*"); --exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect --shutdown_server @@ -36,8 +36,11 @@ EOF --enable_reconnect --source include/wait_until_connected_again.inc +--replace_result \\ / repair table t1; +--replace_result \\ / +--error HA_ERR_NO_ENCRYPTION INSERT INTO t1 VALUES (2); --exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect @@ -48,8 +51,6 @@ INSERT INTO t1 VALUES (2); --enable_reconnect --source include/wait_until_connected_again.inc ---replace_result \\ / ---error 192 select * from t1; drop table t1; --remove_file $MYSQLTEST_VARDIR/keys1.txt diff --git a/mysql-test/suite/maria/maria-64bit.result b/mysql-test/suite/maria/maria-64bit.result new file mode 100644 index 00000000000..03c95ab296c --- /dev/null +++ b/mysql-test/suite/maria/maria-64bit.result @@ -0,0 +1,51 @@ +set session storage_engine=aria; +Warnings: +Warning 1287 '@@storage_engine' is deprecated and will be removed in a future release. Please use '@@default_storage_engine' instead +# +# BUG#47444 - --myisam_repair_threads > 1 can result in all index +# cardinalities=1 +# +SET aria_repair_threads=2; +SET aria_sort_buffer_size=16384; +CREATE TABLE t1(a CHAR(255), KEY(a), KEY(a), KEY(a)); +Warnings: +Note 1831 Duplicate index `a_2`. This is deprecated and will be disallowed in a future release +Note 1831 Duplicate index `a_3`. This is deprecated and will be disallowed in a future release +INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(0),(1),(2),(3); +REPAIR TABLE t1; +Table Op Msg_type Msg_text +test.t1 repair status OK +SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; +CARDINALITY +14 +14 +14 +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +DROP TABLE t1; +SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; +SET aria_repair_threads=@@global.aria_repair_threads; +# +# BUG#47073 - valgrind errs, corruption,failed repair of partition, +# low myisam_sort_buffer_size +# +CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); +INSERT INTO t1 select seq,'0' from seq_1_to_65536; +SET aria_sort_buffer_size=16384; +REPAIR TABLE t1; +Table Op Msg_type Msg_text +test.t1 repair status OK +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +SET aria_repair_threads=2; +REPAIR TABLE t1; +Table Op Msg_type Msg_text +test.t1 repair status OK +CHECK TABLE t1; +Table Op Msg_type Msg_text +test.t1 check status OK +SET aria_repair_threads=@@global.aria_repair_threads; +SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; +DROP TABLE t1; diff --git a/mysql-test/suite/maria/maria-64bit.test b/mysql-test/suite/maria/maria-64bit.test new file mode 100644 index 00000000000..117ace42f7c --- /dev/null +++ b/mysql-test/suite/maria/maria-64bit.test @@ -0,0 +1,41 @@ +--source include/have_maria.inc +--source include/have_sequence.inc +--source include/have_64bit.inc + +set session storage_engine=aria; + +--echo # +--echo # BUG#47444 - --myisam_repair_threads > 1 can result in all index +--echo # cardinalities=1 +--echo # + +SET aria_repair_threads=2; +SET aria_sort_buffer_size=16384; +CREATE TABLE t1(a CHAR(255), KEY(a), KEY(a), KEY(a)); +INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(0),(1),(2),(3); +--replace_regex /Current aria_sort_buffer_size.*/X/ +REPAIR TABLE t1; +SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; +CHECK TABLE t1; +DROP TABLE t1; +SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; +SET aria_repair_threads=@@global.aria_repair_threads; + +--echo # +--echo # BUG#47073 - valgrind errs, corruption,failed repair of partition, +--echo # low myisam_sort_buffer_size +--echo # +CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); +INSERT INTO t1 select seq,'0' from seq_1_to_65536; +SET aria_sort_buffer_size=16384; +--replace_regex /Current aria_sort_buffer_size.*/X/ +REPAIR TABLE t1; +CHECK TABLE t1; +SET aria_repair_threads=2; +# May report different values depending on threads activity. +--replace_regex /Current aria_sort_buffer_size.*/X/ +REPAIR TABLE t1; +CHECK TABLE t1; +SET aria_repair_threads=@@global.aria_repair_threads; +SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; +DROP TABLE t1; diff --git a/mysql-test/suite/maria/maria.result b/mysql-test/suite/maria/maria.result index 65e94414bf0..ab1065f0f05 100644 --- a/mysql-test/suite/maria/maria.result +++ b/mysql-test/suite/maria/maria.result @@ -2809,71 +2809,6 @@ DROP TABLE t1; # # End of 5.5 tests # -# -# BUG#47444 - --myisam_repair_threads > 1 can result in all index -# cardinalities=1 -# -SET aria_repair_threads=2; -SET aria_sort_buffer_size=8192; -CREATE TABLE t1(a CHAR(255), KEY(a), KEY(a), KEY(a)); -Warnings: -Note 1831 Duplicate index `a_2`. This is deprecated and will be disallowed in a future release -Note 1831 Duplicate index `a_3`. This is deprecated and will be disallowed in a future release -INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(0),(1),(2),(3); -REPAIR TABLE t1; -Table Op Msg_type Msg_text -test.t1 repair status OK -SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; -CARDINALITY -14 -14 -14 -CHECK TABLE t1; -Table Op Msg_type Msg_text -test.t1 check status OK -DROP TABLE t1; -SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; -SET aria_repair_threads=@@global.aria_repair_threads; -# -# BUG#47073 - valgrind errs, corruption,failed repair of partition, -# low myisam_sort_buffer_size -# -CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); -INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'), -(6,'0'),(7,'0'); -INSERT INTO t1 SELECT a+10,b FROM t1; -INSERT INTO t1 SELECT a+20,b FROM t1; -INSERT INTO t1 SELECT a+40,b FROM t1; -INSERT INTO t1 SELECT a+80,b FROM t1; -INSERT INTO t1 SELECT a+160,b FROM t1; -INSERT INTO t1 SELECT a+320,b FROM t1; -INSERT INTO t1 SELECT a+640,b FROM t1; -INSERT INTO t1 SELECT a+1280,b FROM t1; -INSERT INTO t1 SELECT a+2560,b FROM t1; -INSERT INTO t1 SELECT a+5120,b FROM t1; -SET aria_sort_buffer_size=4096; -REPAIR TABLE t1; -Table Op Msg_type Msg_text -test.t1 repair error aria_sort_buffer_size is too small. X -test.t1 repair error Create index by sort failed -test.t1 repair info Retrying repair with keycache -test.t1 repair status OK -CHECK TABLE t1; -Table Op Msg_type Msg_text -test.t1 check status OK -SET aria_repair_threads=2; -REPAIR TABLE t1; -Table Op Msg_type Msg_text -test.t1 repair error aria_sort_buffer_size is too small. X -test.t1 repair error Create index by sort failed -test.t1 repair info Retrying repair with keycache -test.t1 repair status OK -CHECK TABLE t1; -Table Op Msg_type Msg_text -test.t1 check status OK -SET aria_repair_threads=@@global.aria_repair_threads; -SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; -DROP TABLE t1; CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'), (6,'0'),(7,'0'); diff --git a/mysql-test/suite/maria/maria.test b/mysql-test/suite/maria/maria.test index 119d005dc72..25c18d5dbf8 100644 --- a/mysql-test/suite/maria/maria.test +++ b/mysql-test/suite/maria/maria.test @@ -5,6 +5,7 @@ -- source include/have_maria.inc -- source include/have_partition.inc +-- source include/have_sequence.inc call mtr.add_suppression("Can't find record in '.*'"); @@ -2029,52 +2030,6 @@ DROP TABLE t1; --echo # End of 5.5 tests --echo # ---echo # ---echo # BUG#47444 - --myisam_repair_threads > 1 can result in all index ---echo # cardinalities=1 ---echo # -SET aria_repair_threads=2; -SET aria_sort_buffer_size=8192; -CREATE TABLE t1(a CHAR(255), KEY(a), KEY(a), KEY(a)); -INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(0),(1),(2),(3); ---replace_regex /Current aria_sort_buffer_size.*/X/ -REPAIR TABLE t1; -SELECT CARDINALITY FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t1'; -CHECK TABLE t1; -DROP TABLE t1; -SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; -SET aria_repair_threads=@@global.aria_repair_threads; - ---echo # ---echo # BUG#47073 - valgrind errs, corruption,failed repair of partition, ---echo # low myisam_sort_buffer_size ---echo # -CREATE TABLE t1(a INT, b CHAR(10), KEY(a), KEY(b)); -INSERT INTO t1 VALUES(1,'0'),(2,'0'),(3,'0'),(4,'0'),(5,'0'), - (6,'0'),(7,'0'); -INSERT INTO t1 SELECT a+10,b FROM t1; -INSERT INTO t1 SELECT a+20,b FROM t1; -INSERT INTO t1 SELECT a+40,b FROM t1; -INSERT INTO t1 SELECT a+80,b FROM t1; -INSERT INTO t1 SELECT a+160,b FROM t1; -INSERT INTO t1 SELECT a+320,b FROM t1; -INSERT INTO t1 SELECT a+640,b FROM t1; -INSERT INTO t1 SELECT a+1280,b FROM t1; -INSERT INTO t1 SELECT a+2560,b FROM t1; -INSERT INTO t1 SELECT a+5120,b FROM t1; -SET aria_sort_buffer_size=4096; ---replace_regex /Current aria_sort_buffer_size.*/X/ -REPAIR TABLE t1; -CHECK TABLE t1; -SET aria_repair_threads=2; -# May report different values depending on threads activity. ---replace_regex /Current aria_sort_buffer_size.*/X/ -REPAIR TABLE t1; -CHECK TABLE t1; -SET aria_repair_threads=@@global.aria_repair_threads; -SET aria_sort_buffer_size=@@global.aria_sort_buffer_size; -DROP TABLE t1; - # # Check FLUSH FOR EXPORT # diff --git a/mysql-test/suite/maria/maria3.result b/mysql-test/suite/maria/maria3.result index fcdd08382a0..221f2155a54 100644 --- a/mysql-test/suite/maria/maria3.result +++ b/mysql-test/suite/maria/maria3.result @@ -521,8 +521,6 @@ t1 CREATE TABLE `t1` ( drop table t1; create table t1 (n int not null, c char(1)) engine=aria transactional=1; alter table t1 engine=myisam; -Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' alter table t1 engine=aria; show create table t1; Table Create Table @@ -533,7 +531,7 @@ t1 CREATE TABLE `t1` ( drop table t1; create table t1 (n int not null, c char(1)) engine=myisam transactional=1; Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' +Warning 1911 Unknown option 'transactional' alter table t1 engine=aria; show create table t1; Table Create Table diff --git a/mysql-test/suite/maria/repair-big-sort.result b/mysql-test/suite/maria/repair-big-sort.result new file mode 100644 index 00000000000..a650a3872d3 --- /dev/null +++ b/mysql-test/suite/maria/repair-big-sort.result @@ -0,0 +1,79 @@ +SET sql_mode=''; +CREATE TEMPORARY TABLE t1 (a tinyINT,b CHAR(1)) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +INSERT INTO t1 VALUES (1,1),(3,3),(2,2); +SET SESSION tmp_table_size=True; +CREATE TABLE t2 (c INT, d DATE) ENGINE=InnoDB PARTITION BY RANGE (YEAR (d)) SUBPARTITION BY HASH (TO_DAYS (d)) (PARTITION p0 VALUES LESS THAN (1990) (SUBPARTITION s0, SUBPARTITION s1), PARTITION p1 VALUES LESS THAN MAXVALUE (SUBPARTITION s4, SUBPARTITION s5)); +SET SESSION aria_sort_buffer_size=CAST(-1 AS UNSIGNED INT); +Warnings: +Note 1105 Cast to unsigned converted negative integer to it's positive complement +Note 1105 Cast to unsigned converted negative integer to it's positive complement +Warning 1292 Truncated incorrect aria_sort_buffer_size value: '18446744073709551615' +INSERT INTO t1 SELECT '', SEQ FROM seq_1_to_258; +Warnings: +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 1 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 2 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 3 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 4 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 5 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 6 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 7 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 8 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 9 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 10 +Warning 1265 Data truncated for column 'b' at row 10 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 11 +Warning 1265 Data truncated for column 'b' at row 11 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 12 +Warning 1265 Data truncated for column 'b' at row 12 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 13 +Warning 1265 Data truncated for column 'b' at row 13 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 14 +Warning 1265 Data truncated for column 'b' at row 14 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 15 +Warning 1265 Data truncated for column 'b' at row 15 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 16 +Warning 1265 Data truncated for column 'b' at row 16 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 17 +Warning 1265 Data truncated for column 'b' at row 17 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 18 +Warning 1265 Data truncated for column 'b' at row 18 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 19 +Warning 1265 Data truncated for column 'b' at row 19 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 20 +Warning 1265 Data truncated for column 'b' at row 20 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 21 +Warning 1265 Data truncated for column 'b' at row 21 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 22 +Warning 1265 Data truncated for column 'b' at row 22 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 23 +Warning 1265 Data truncated for column 'b' at row 23 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 24 +Warning 1265 Data truncated for column 'b' at row 24 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 25 +Warning 1265 Data truncated for column 'b' at row 25 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 26 +Warning 1265 Data truncated for column 'b' at row 26 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 27 +Warning 1265 Data truncated for column 'b' at row 27 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 28 +Warning 1265 Data truncated for column 'b' at row 28 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 29 +Warning 1265 Data truncated for column 'b' at row 29 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 30 +Warning 1265 Data truncated for column 'b' at row 30 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 31 +Warning 1265 Data truncated for column 'b' at row 31 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 32 +Warning 1265 Data truncated for column 'b' at row 32 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 33 +Warning 1265 Data truncated for column 'b' at row 33 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 34 +Warning 1265 Data truncated for column 'b' at row 34 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 35 +Warning 1265 Data truncated for column 'b' at row 35 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 36 +Warning 1265 Data truncated for column 'b' at row 36 +Warning 1366 Incorrect integer value: '' for column `test`.`t1`.`a` at row 37 +SET SESSION aria_repair_threads=4; +UPDATE t1 SET a=( (SELECT MAX(a) FROM t1)); +drop table t1,t2; diff --git a/mysql-test/suite/maria/repair-big-sort.test b/mysql-test/suite/maria/repair-big-sort.test new file mode 100644 index 00000000000..f2f4f84c29b --- /dev/null +++ b/mysql-test/suite/maria/repair-big-sort.test @@ -0,0 +1,15 @@ + +--source include/have_innodb.inc +--source include/have_partition.inc +--source include/have_sequence.inc + +SET sql_mode=''; +CREATE TEMPORARY TABLE t1 (a tinyINT,b CHAR(1)) ENGINE=InnoDB ROW_FORMAT=REDUNDANT; +INSERT INTO t1 VALUES (1,1),(3,3),(2,2); +SET SESSION tmp_table_size=True; +CREATE TABLE t2 (c INT, d DATE) ENGINE=InnoDB PARTITION BY RANGE (YEAR (d)) SUBPARTITION BY HASH (TO_DAYS (d)) (PARTITION p0 VALUES LESS THAN (1990) (SUBPARTITION s0, SUBPARTITION s1), PARTITION p1 VALUES LESS THAN MAXVALUE (SUBPARTITION s4, SUBPARTITION s5)); +SET SESSION aria_sort_buffer_size=CAST(-1 AS UNSIGNED INT); +INSERT INTO t1 SELECT '', SEQ FROM seq_1_to_258; +SET SESSION aria_repair_threads=4; +UPDATE t1 SET a=( (SELECT MAX(a) FROM t1)); +drop table t1,t2; diff --git a/mysql-test/suite/mariabackup/apply-log-only-incr.test b/mysql-test/suite/mariabackup/apply-log-only-incr.test index b110d12540e..01b74af2211 100644 --- a/mysql-test/suite/mariabackup/apply-log-only-incr.test +++ b/mysql-test/suite/mariabackup/apply-log-only-incr.test @@ -62,7 +62,9 @@ rmdir $incremental_dir; SELECT COUNT(*) FROM t; SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; +--disable_ps2_protocol SELECT COUNT(*) FROM t; +--enable_ps2_protocol --let $restart_parameters= --source include/restart_mysqld.inc diff --git a/mysql-test/suite/parts/t/optimizer.test b/mysql-test/suite/parts/t/optimizer.test index f93c36823ca..0cc326da979 100644 --- a/mysql-test/suite/parts/t/optimizer.test +++ b/mysql-test/suite/parts/t/optimizer.test @@ -34,6 +34,7 @@ INSERT INTO t2 SELECT * FROM t1; EXPLAIN SELECT a, MAX(b) FROM t1 WHERE a IN (10,100) GROUP BY a; EXPLAIN SELECT a, MAX(b) FROM t2 WHERE a IN (10,100) GROUP BY a; +--disable_ps2_protocol FLUSH status; SELECT a, MAX(b) FROM t1 WHERE a IN (10, 100) GROUP BY a; --echo # Should be no more than 4 reads. @@ -43,5 +44,6 @@ FLUSH status; SELECT a, MAX(b) FROM t2 WHERE a IN (10, 100) GROUP BY a; --echo # Should be no more than 4 reads. SHOW status LIKE 'handler_read_key'; +--enable_ps2_protocol DROP TABLE t1, t2; diff --git a/mysql-test/suite/perfschema/include/table_io_basic_dml.inc b/mysql-test/suite/perfschema/include/table_io_basic_dml.inc index 4fe2fd9dfb3..5457566b296 100644 --- a/mysql-test/suite/perfschema/include/table_io_basic_dml.inc +++ b/mysql-test/suite/perfschema/include/table_io_basic_dml.inc @@ -5,6 +5,7 @@ # $table_item = . must be set before sourcing this script. # +--disable_ps2_protocol insert into marker set a = 1; eval insert into $table_item set a = 'foo', b = 1; insert into marker set a = 1; @@ -33,4 +34,4 @@ insert into marker set a = 1; eval truncate table $table_item; --enable_abort_on_error insert into marker set a = 1; - +--enable_ps2_protocol diff --git a/mysql-test/suite/perfschema/t/batch_table_io_func.test b/mysql-test/suite/perfschema/t/batch_table_io_func.test index c35d8a06125..dcdf61b0cef 100644 --- a/mysql-test/suite/perfschema/t/batch_table_io_func.test +++ b/mysql-test/suite/perfschema/t/batch_table_io_func.test @@ -103,10 +103,12 @@ call before_payload(); # Payload query to analyse: should do batch io on t3 +--disable_ps2_protocol --disable_result_log select t1.*, t2.*, t3.* from t1 join t2 using (id1) join t3 using (id2); --enable_result_log +--enable_ps2_protocol call after_payload(); @@ -127,10 +129,12 @@ call before_payload(); # Payload query to analyse: should do batch io on t3 +--disable_ps2_protocol --disable_result_log select t1.*, t2.*, t3.* from t1 join t2 using (id1) join t3 using (id2); --enable_result_log +--enable_ps2_protocol call after_payload(); diff --git a/mysql-test/suite/perfschema/t/indexed_table_io.test b/mysql-test/suite/perfschema/t/indexed_table_io.test index 59fe4dd134d..03718771777 100644 --- a/mysql-test/suite/perfschema/t/indexed_table_io.test +++ b/mysql-test/suite/perfschema/t/indexed_table_io.test @@ -54,6 +54,7 @@ select count(*) from test.index_tab; # Testing Code +--disable_ps2_protocol # For getting avg(a) inspection of # - all rows (test.no_index_tab) # - all unique index values (test.index_tab, assuming the optimizer decides to @@ -102,6 +103,7 @@ update performance_schema.setup_consumers set enabled='YES'; delete from test.index_tab where a = 51; update performance_schema.setup_consumers set enabled='NO'; eval $table_io_select 'index_tab'; +--enable_ps2_protocol # In case of failures, this will tell if table io are lost. show global status like 'performance_schema_%'; diff --git a/mysql-test/suite/perfschema/t/mdl_func.test b/mysql-test/suite/perfschema/t/mdl_func.test index 7aad37ea4d4..fc12bdacf8c 100644 --- a/mysql-test/suite/perfschema/t/mdl_func.test +++ b/mysql-test/suite/perfschema/t/mdl_func.test @@ -381,7 +381,9 @@ TRUNCATE TABLE performance_schema.events_waits_current; --connection con1 +--disable_ps2_protocol SELECT GET_LOCK('test', 0); +--enable_ps2_protocol --connection default @@ -396,7 +398,9 @@ execute dump_waits_history_long; --connection con2 +--disable_ps2_protocol --send SELECT GET_LOCK('test', 120); +--enable_ps2_protocol --connection default @@ -416,8 +420,9 @@ execute dump_waits_history_long; --horizontal_results --connection con1 - +--disable_ps2_protocol SELECT RELEASE_LOCK('test'); +--enable_ps2_protocol --connection con2 @@ -435,8 +440,9 @@ execute dump_waits_history_long; --horizontal_results --connection con2 - +--disable_ps2_protocol SELECT RELEASE_LOCK('test'); +--enable_ps2_protocol --connection default diff --git a/mysql-test/suite/perfschema/t/misc_global_status.test b/mysql-test/suite/perfschema/t/misc_global_status.test index be20835c66e..c9ae14c1993 100644 --- a/mysql-test/suite/perfschema/t/misc_global_status.test +++ b/mysql-test/suite/perfschema/t/misc_global_status.test @@ -29,7 +29,9 @@ FLUSH STATUS; let $initial= `SELECT VARIABLE_VALUE FROM performance_schema.global_status WHERE VARIABLE_NAME = 'Select_range'`; # Causes Select_range to increment (+1) +--disable_ps2_protocol SELECT * from test.t_range where (a >= 3) AND (a <= 5); +--enable_ps2_protocol SELECT * from performance_schema.session_status WHERE VARIABLE_NAME = 'Select_range'; @@ -40,7 +42,9 @@ eval SELECT VARIABLE_NAME, (VARIABLE_VALUE - $initial) AS DELTA from performance connect(con1, localhost, user1,,); # Causes Select_range to increment (+1) +--disable_ps2_protocol SELECT * from test.t_range where (a >= 3) AND (a <= 5); +--enable_ps2_protocol SELECT * from performance_schema.session_status WHERE VARIABLE_NAME = 'Select_range'; @@ -51,8 +55,10 @@ eval SELECT VARIABLE_NAME, (VARIABLE_VALUE - $initial) AS DELTA from performance connect(con2, localhost, user2,,); # Causes Select_range to increment (+2) +--disable_ps2_protocol SELECT * from test.t_range where (a >= 3) AND (a <= 5); SELECT * from test.t_range where (a >= 4) AND (a <= 6); +--enable_ps2_protocol SELECT * from performance_schema.session_status WHERE VARIABLE_NAME = 'Select_range'; @@ -63,9 +69,11 @@ eval SELECT VARIABLE_NAME, (VARIABLE_VALUE - $initial) AS DELTA from performance connect(con3, localhost, user3,,); # Causes Select_range to increment (+3) +--disable_ps2_protocol SELECT * from test.t_range where (a >= 3) AND (a <= 5); SELECT * from test.t_range where (a >= 4) AND (a <= 6); SELECT * from test.t_range where (a >= 5) AND (a <= 7); +--enable_ps2_protocol SELECT * from performance_schema.session_status WHERE VARIABLE_NAME = 'Select_range'; diff --git a/mysql-test/suite/perfschema/t/multi_table_io.test b/mysql-test/suite/perfschema/t/multi_table_io.test index d835f36be4b..50bc4f6b8b6 100644 --- a/mysql-test/suite/perfschema/t/multi_table_io.test +++ b/mysql-test/suite/perfschema/t/multi_table_io.test @@ -27,6 +27,7 @@ let $schema_to_dump= 'test','test1'; # Start event recording update performance_schema.setup_consumers set enabled = 'YES'; +--disable_ps2_protocol # INSERT ... SELECT ... insert into test1.t2 select * from test.t1; insert into marker set a = 1; @@ -42,6 +43,7 @@ insert into marker set a = 1; # DELETE delete from test.t1, test1.t2 using test.t1 inner join test1.t2 where test.t1.col1 = test1.t2.col1; +--enable_ps2_protocol # Stop event recording + pull results --source ../include/table_io_result_helper.inc diff --git a/mysql-test/suite/perfschema/t/query_cache.test b/mysql-test/suite/perfschema/t/query_cache.test index d5e3008d3af..045c4628e9e 100644 --- a/mysql-test/suite/perfschema/t/query_cache.test +++ b/mysql-test/suite/perfschema/t/query_cache.test @@ -22,6 +22,7 @@ flush query cache; reset query cache; flush status; +--disable_ps2_protocol select * from t1; show global status like "Qcache_queries_in_cache"; @@ -47,6 +48,7 @@ select spins from performance_schema.events_waits_current order by event_name li --replace_result CYCLE {CYCLE_OR_NANOSECOND} NANOSECOND {CYCLE_OR_NANOSECOND} select * from performance_schema.setup_timers where name='wait'; +--enable_ps2_protocol show global status like "Qcache_queries_in_cache"; show global status like "Qcache_inserts"; diff --git a/mysql-test/suite/perfschema/t/start_server_low_index.test b/mysql-test/suite/perfschema/t/start_server_low_index.test index 18004e1993c..eea01091baa 100644 --- a/mysql-test/suite/perfschema/t/start_server_low_index.test +++ b/mysql-test/suite/perfschema/t/start_server_low_index.test @@ -27,7 +27,9 @@ create table db1.t1 (a int, b char(10) default 'default', ####################### insert into db1.t1 values('1', 'abc'); insert into db1.t1 values('2', 'abc'); +--disable_ps2_protocol select * from db1.t1 where a='1'; +--enable_ps2_protocol ##################################################### # Run few queries on Performance Schema stats tables. @@ -80,11 +82,15 @@ create table db1.t2 (a int, b char(10) default 'default', ####################### insert into db1.t1 values('3', 'abc'); insert into db1.t1 values('4', 'abc'); +--disable_ps2_protocol select * from db1.t1 where a='1'; +--enable_ps2_protocol insert into db1.t2 values('1', 'abc'); insert into db1.t2 values('2', 'abc'); +--disable_ps2_protocol select * from db1.t2 where a='1'; +--enable_ps2_protocol ##################################################### # Run few queries on Performance Schema stats tables. diff --git a/mysql-test/suite/perfschema/t/start_server_low_table_lock.test b/mysql-test/suite/perfschema/t/start_server_low_table_lock.test index 8f35eb64e2a..d397b16e0e0 100644 --- a/mysql-test/suite/perfschema/t/start_server_low_table_lock.test +++ b/mysql-test/suite/perfschema/t/start_server_low_table_lock.test @@ -20,7 +20,9 @@ create table db1.t1 (a int, b char(10) default 'default'); ####################### insert into db1.t1 values('1', 'abc'); insert into db1.t1 values('2', 'abc'); +--disable_ps2_protocol select * from db1.t1 where a='1'; +--enable_ps2_protocol ##################################################### # Run few queries on Performance Schema stats tables. @@ -52,11 +54,15 @@ create table db1.t2 (a int, b char(10) default 'default', ####################### insert into db1.t1 values('3', 'abc'); insert into db1.t1 values('4', 'abc'); +--disable_ps2_protocol select * from db1.t1 where a='1'; +--enable_ps2_protocol insert into db1.t2 values('1', 'abc'); insert into db1.t2 values('2', 'abc'); +--disable_ps2_protocol select * from db1.t2 where a='1'; +--enable_ps2_protocol ##################################################### # Run few queries on Performance Schema stats tables. diff --git a/mysql-test/suite/perfschema/t/start_server_no_index.test b/mysql-test/suite/perfschema/t/start_server_no_index.test index 8c636cc6163..6f8f27b2464 100644 --- a/mysql-test/suite/perfschema/t/start_server_no_index.test +++ b/mysql-test/suite/perfschema/t/start_server_no_index.test @@ -21,7 +21,9 @@ create table db1.t1 (a int, b char(10) default 'default', ####################### insert into db1.t1 values('1', 'abc'); insert into db1.t1 values('2', 'abc'); +--disable_ps2_protocol select * from db1.t1 where a='1'; +--enable_ps2_protocol ##################################################### # Run few queries on Performance Schema stats tables. diff --git a/mysql-test/suite/perfschema/t/start_server_no_table_lock.test b/mysql-test/suite/perfschema/t/start_server_no_table_lock.test index c80639a5799..111130b74e7 100644 --- a/mysql-test/suite/perfschema/t/start_server_no_table_lock.test +++ b/mysql-test/suite/perfschema/t/start_server_no_table_lock.test @@ -20,7 +20,9 @@ create table db1.t1 (a int, b char(10) default 'default'); ####################### insert into db1.t1 values('1', 'abc'); insert into db1.t1 values('2', 'abc'); +--disable_ps2_protocol select * from db1.t1 where a='1'; +--enable_ps2_protocol ##################################################### # Run few queries on Performance Schema stats tables. diff --git a/mysql-test/suite/perfschema/t/trigger_table_io.test b/mysql-test/suite/perfschema/t/trigger_table_io.test index 090d64e330e..2b374c79d15 100644 --- a/mysql-test/suite/perfschema/t/trigger_table_io.test +++ b/mysql-test/suite/perfschema/t/trigger_table_io.test @@ -37,6 +37,7 @@ update performance_schema.setup_consumers set enabled = 'YES'; # Code to test +--disable_ps2_protocol insert into marker set a = 1; insert into t1 set a = 1, v = 10; insert into marker set a = 1; @@ -63,6 +64,7 @@ insert into marker set a = 1; select * from t1; insert into marker set a = 1; select * from t2; +--enable_ps2_protocol # Stop recording events + pull results --source ../include/table_io_result_helper.inc diff --git a/mysql-test/suite/period/t/overlaps.test b/mysql-test/suite/period/t/overlaps.test index 4611aa15ddd..4e71d64d595 100644 --- a/mysql-test/suite/period/t/overlaps.test +++ b/mysql-test/suite/period/t/overlaps.test @@ -253,14 +253,18 @@ insert into t values (1, '2020-03-03', '2020-03-10') on duplicate key update x = 2; select * from t; +--disable_ps2_protocol select * into outfile 'tmp_t.txt' from t; +--enable_ps2_protocol load data infile 'tmp_t.txt' into table t; --error ER_NOT_SUPPORTED_YET load data infile 'tmp_t.txt' replace into table t; remove_file $MYSQLD_DATADIR/test/tmp_t.txt; insert into t values (1, '2020-03-01', '2020-03-05'); +--disable_ps2_protocol select * into outfile 'tmp_t.txt' from t; +--enable_ps2_protocol --error ER_DUP_ENTRY load data infile 'tmp_t.txt' into table t; diff --git a/mysql-test/suite/plugins/r/audit_null_debug.result b/mysql-test/suite/plugins/r/audit_null_debug.result index 727bd67aecf..c916b27f95e 100644 --- a/mysql-test/suite/plugins/r/audit_null_debug.result +++ b/mysql-test/suite/plugins/r/audit_null_debug.result @@ -1,6 +1,4 @@ alter table mysql.plugin engine=myisam; -Warnings: -Warning 1478 Table storage engine 'MyISAM' does not support the create option 'TRANSACTIONAL=1' set @old_dbug=@@debug_dbug; call mtr.add_suppression("Index for table.*mysql.plugin.MYI"); call mtr.add_suppression("Index for table 'plugin' is corrupt; try to repair it"); diff --git a/mysql-test/suite/plugins/t/qc_info.test b/mysql-test/suite/plugins/t/qc_info.test index 8803e907b89..de3e9d59b01 100644 --- a/mysql-test/suite/plugins/t/qc_info.test +++ b/mysql-test/suite/plugins/t/qc_info.test @@ -4,8 +4,10 @@ set @save_query_cache_size=@@global.query_cache_size; # test that hits are correctly incremented reset query cache; +--disable_ps2_protocol select * from t1; select * from t1; +--enable_ps2_protocol select hits, statement_text from information_schema.query_cache_info; drop table t1; diff --git a/mysql-test/suite/plugins/t/qc_info_init.inc b/mysql-test/suite/plugins/t/qc_info_init.inc index ad93e5c1547..c69ffa07ca8 100644 --- a/mysql-test/suite/plugins/t/qc_info_init.inc +++ b/mysql-test/suite/plugins/t/qc_info_init.inc @@ -9,7 +9,9 @@ set global query_cache_size=1355776; create table t1 (a int not null); insert into t1 values (1),(2),(3); +--disable_ps2_protocol select * from t1; +--enable_ps2_protocol select statement_schema, statement_text, result_blocks_count, result_blocks_size from information_schema.query_cache_info; select @@time_zone into @time_zone; @@ -25,7 +27,9 @@ select @@group_concat_max_len into @group_concat_max_len; select Name into @new_time_zone from mysql.time_zone_name limit 1; set time_zone=@new_time_zone,default_week_format=4,character_set_client='binary',character_set_results='utf32',collation_connection='utf32_bin',sql_mode='STRICT_ALL_TABLES',div_precision_increment=7,lc_time_names='ar_SD',autocommit=0, group_concat_max_len=513, max_sort_length=1011; --disable_result_log +--disable_ps2_protocol select * from t1; +--enable_ps2_protocol --enable_result_log set time_zone= @time_zone, default_week_format= @default_week_format, character_set_client= @character_set_client,character_set_results= @character_set_results, sql_mode= @sql_mode, div_precision_increment= @div_precision_increment, lc_time_names= @lc_time_names, autocommit= @autocommit, group_concat_max_len= @group_concat_max_len, max_sort_length= @max_sort_length; diff --git a/mysql-test/suite/plugins/t/server_audit.test b/mysql-test/suite/plugins/t/server_audit.test index 5048ccc2446..47d6fdacdcf 100644 --- a/mysql-test/suite/plugins/t/server_audit.test +++ b/mysql-test/suite/plugins/t/server_audit.test @@ -5,6 +5,7 @@ if (!$SERVER_AUDIT_SO) { skip No SERVER_AUDIT plugin; } +--disable_ps2_protocol # An unfortunate wait for check-testcase.test to complete disconnect. let count_sessions= 1; source include/wait_until_count_sessions.inc; @@ -234,6 +235,7 @@ uninstall plugin server_audit; --replace_regex /[0-9]* [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\,[^,]*\,/TIME,HOSTNAME,/ /\,[1-9][0-9]*\,/,1,/ /\,[1-9][0-9]*/,ID/ cat_file $MYSQLD_DATADIR/server_audit.log; remove_file $MYSQLD_DATADIR/server_audit.log; +--enable_ps2_protocol --echo # --echo # MDEV-27631 Assertion `global_status_var.global_memory_used == 0' failed in mysqld_exit diff --git a/mysql-test/suite/plugins/t/show_all_plugins.test b/mysql-test/suite/plugins/t/show_all_plugins.test index f8f375976fe..77723d32170 100644 --- a/mysql-test/suite/plugins/t/show_all_plugins.test +++ b/mysql-test/suite/plugins/t/show_all_plugins.test @@ -12,7 +12,9 @@ show status like '%libraries%'; #show status like '%libraries%'; --replace_result .dll .so --replace_column 5 MYSQL_VERSION_ID +--disable_ps2_protocol eval select * from information_schema.all_plugins where plugin_library='$HA_EXAMPLE_SO'; +--enable_ps2_protocol show status like '%libraries%'; --sorted_result --replace_result .dll .so diff --git a/mysql-test/suite/plugins/t/thread_pool_server_audit.test b/mysql-test/suite/plugins/t/thread_pool_server_audit.test index 7347d8f99ff..c12ef29ff20 100644 --- a/mysql-test/suite/plugins/t/thread_pool_server_audit.test +++ b/mysql-test/suite/plugins/t/thread_pool_server_audit.test @@ -7,6 +7,7 @@ if (!$SERVER_AUDIT_SO) { install plugin server_audit soname 'server_audit'; +--disable_ps2_protocol show variables like 'server_audit%'; set global server_audit_file_path=null; set global server_audit_incl_users=null; @@ -140,6 +141,7 @@ set global server_audit_file_path='nonexisting_dir/'; show status like 'server_audit_current_log'; show variables like 'server_audit%'; uninstall plugin server_audit; +--enable_ps2_protocol let $MYSQLD_DATADIR= `SELECT @@datadir`; # replace the timestamp and the hostname with constant values diff --git a/mysql-test/suite/rpl/include/mdev-31448_conservative.inc b/mysql-test/suite/rpl/include/mdev-31448_conservative.inc new file mode 100644 index 00000000000..3db5a000af0 --- /dev/null +++ b/mysql-test/suite/rpl/include/mdev-31448_conservative.inc @@ -0,0 +1,68 @@ +--connection master +create table t1 (a int) engine=innodb; +create table t2 (a int) engine=innodb; +insert into t1 values (1); +--source include/save_master_gtid.inc + +--connection slave +call mtr.add_suppression("Slave: Commit failed due to failure of an earlier commit on which this one depends"); + +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +set @save.slave_parallel_threads= @@global.slave_parallel_threads; +set @save.slave_parallel_mode= @@global.slave_parallel_mode; +set @@global.slave_parallel_threads= 3; +set @@global.slave_parallel_mode= CONSERVATIVE; +--connection slave1 +BEGIN; +update t1 set a=2 where a=1; + +--connection master +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; + +# GCO 1 +SET @commit_id= 10000; +# T1 +update t1 set a=2 where a=1; +# T2 +insert into t2 values (1); + +# GCO 2 +SET @commit_id= 10001; +# T3 +insert into t1 values (3); + +--connection slave +--source include/start_slave.inc + +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Update_rows_log_event::find_row(-1)%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to start commit%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--let $t3_tid= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Waiting for prior transaction to start commit%'` +--evalp kill $t3_tid + +--connection slave1 +commit; + +--connection slave +--let $slave_timeout=1032 +--source include/wait_for_slave_sql_to_stop.inc + +update t1 set a=1 where a=2; +set @@global.slave_parallel_threads = @save.slave_parallel_threads; +set @@global.slave_parallel_mode = @save.slave_parallel_mode; +--source include/start_slave.inc + +--echo # +--echo # Cleanup +--connection master +DROP TABLE t1, t2; +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc diff --git a/mysql-test/suite/rpl/include/mdev-31448_optimistic.inc b/mysql-test/suite/rpl/include/mdev-31448_optimistic.inc new file mode 100644 index 00000000000..22cee6b3195 --- /dev/null +++ b/mysql-test/suite/rpl/include/mdev-31448_optimistic.inc @@ -0,0 +1,94 @@ +--echo # MDEV-31448 OOO finish event group by killed worker +# The test demonstrates how a killed worker access gco lists +# in finish_event_group() out-of-order to fire +# DBUG_ASSERT(!tmp_gco->next_gco || tmp_gco->last_sub_id > sub_id); +# in the buggy version. + +--echo # Initialize test data +--connection master +create table t1 (a int) engine=innodb; +create table t2 (a int) engine=innodb; + +insert into t1 values (1); +--source include/save_master_gtid.inc + +--connection slave +call mtr.add_suppression("Connection was killed"); +call mtr.add_suppression("Can.t find record"); + +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +set @save.slave_parallel_threads= @@global.slave_parallel_threads; +set @save.slave_parallel_mode= @@global.slave_parallel_mode; +set @@global.slave_parallel_threads= 3; +set @@global.slave_parallel_mode= OPTIMISTIC; + +--connection slave1 +begin; +update t1 set a=2 where a=1; + +--connection master +set @old_dbug= @@session.debug_dbug; +set @@session.debug_dbug="+d,binlog_force_commit_id"; + +# GCO 1 +set @commit_id= 10000; +# T1 +update t1 set a=2 where a=1; + +if (!$killed_trx_commits) +{ +set @commit_id= 10001; +# T2 +set statement skip_parallel_replication=1 for insert into t2 values (1); +} + +if ($killed_trx_commits) +{ +insert into t2 values (1); +} +# GCO 2 +# T3 +drop table t2; + +--connection slave +--source include/start_slave.inc + +--echo # wait for T1 +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Update_rows_log_event::find_row(-1)%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--echo # wait for T2 +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc +--let $t2_tid= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Waiting for prior transaction to commit%' and command LIKE 'Slave_worker'` +--echo # wait for T3 +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to start commit%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--evalp kill $t2_tid +# give some little time for T2 to re-sink into the same state +--let $slave_param=Last_Errno +--let $slave_param_value=1927 +--source include/wait_for_slave_param.inc +--connection slave1 +commit; + +--connection slave +--let $slave_timeout=1032 +--source include/wait_for_slave_sql_to_stop.inc + +update t1 set a=1 where a=2; +set @@global.slave_parallel_threads = @save.slave_parallel_threads; +set @@global.slave_parallel_mode = @save.slave_parallel_mode; +--source include/start_slave.inc + +--echo # +--echo # Cleanup +--connection master +drop table t1; +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc + diff --git a/mysql-test/suite/rpl/include/rpl_insert_id.test b/mysql-test/suite/rpl/include/rpl_insert_id.test index 32d861bd45a..aca14078850 100644 --- a/mysql-test/suite/rpl/include/rpl_insert_id.test +++ b/mysql-test/suite/rpl/include/rpl_insert_id.test @@ -182,9 +182,11 @@ drop trigger t1_bi; # Check that nested call doesn't affect outer context. select last_insert_id(); +--disable_ps2_protocol --disable_warnings ONCE select bug15728_insert(); select last_insert_id(); +--enable_ps2_protocol insert into t1 (last_id) values (bug15728()); # This should be exactly one greater than in the previous call. select last_insert_id(); @@ -440,8 +442,10 @@ delimiter ;| INSERT INTO t1 VALUES (NULL, -1); CALL p1(); +--disable_ps2_protocol --disable_warnings ONCE SELECT f1(); +--enable_ps2_protocol INSERT INTO t1 VALUES (NULL, f2()), (NULL, LAST_INSERT_ID()), (NULL, LAST_INSERT_ID()), (NULL, f2()), (NULL, f2()); INSERT INTO t1 VALUES (NULL, f2()); @@ -458,7 +462,9 @@ connection master1; INSERT INTO t1 (i) VALUES (NULL); connection master; +--disable_ps2_protocol SELECT f3(); +--enable_ps2_protocol SELECT * FROM t1 ORDER BY i; SELECT * FROM t2 ORDER BY i; @@ -510,8 +516,10 @@ insert into t2 (id) values(1),(2),(3); delete from t2; set sql_log_bin=1; #inside SELECT, then inside INSERT +--disable_ps2_protocol --disable_warnings ONCE select insid(); +--enable_ps2_protocol set sql_log_bin=0; insert into t2 (id) values(5),(6),(7); delete from t2 where id>=5; diff --git a/mysql-test/suite/rpl/include/rpl_mixing_engines.inc b/mysql-test/suite/rpl/include/rpl_mixing_engines.inc index c71c45a57c5..c78a6a0e5d8 100644 --- a/mysql-test/suite/rpl/include/rpl_mixing_engines.inc +++ b/mysql-test/suite/rpl/include/rpl_mixing_engines.inc @@ -213,6 +213,7 @@ if ($commands == 'clean') --let $commands= } +--disable_ps2_protocol while ($commands != '') { --disable_query_log @@ -633,5 +634,6 @@ while ($commands != '') inc $trans_id; } } +--enable_ps2_protocol --let $commands= $rme_initial_commands diff --git a/mysql-test/suite/rpl/include/rpl_row_UUID.test b/mysql-test/suite/rpl/include/rpl_row_UUID.test index 368596d4fbc..11eb3c6b748 100644 --- a/mysql-test/suite/rpl/include/rpl_row_UUID.test +++ b/mysql-test/suite/rpl/include/rpl_row_UUID.test @@ -40,7 +40,9 @@ end| delimiter ;| # test both in SELECT and in INSERT +--disable_ps2_protocol select fn1(0); +--enable_ps2_protocol eval create table t2 (a int) engine=$engine_type; insert into t2 values(fn1(2)); diff --git a/mysql-test/suite/rpl/include/rpl_row_img_sequence.inc b/mysql-test/suite/rpl/include/rpl_row_img_sequence.inc index be5b7600f0a..d9ed6f278b9 100644 --- a/mysql-test/suite/rpl/include/rpl_row_img_sequence.inc +++ b/mysql-test/suite/rpl/include/rpl_row_img_sequence.inc @@ -54,7 +54,9 @@ FLUSH LOGS; --echo # Pt.2 Ensure NEXTVAL replicates and binlogs correctly --connection server_1 +--disable_ps2_protocol SELECT NEXTVAL(s1); +--enable_ps2_protocol --source include/save_master_gtid.inc --echo # Validate NEXTVAL replicated correctly to other servers diff --git a/mysql-test/suite/rpl/include/rpl_row_sp003.test b/mysql-test/suite/rpl/include/rpl_row_sp003.test index a8f25485f26..829e42f23c2 100644 --- a/mysql-test/suite/rpl/include/rpl_row_sp003.test +++ b/mysql-test/suite/rpl/include/rpl_row_sp003.test @@ -14,6 +14,7 @@ DROP TABLE IF EXISTS test.t1; # Begin test section 1 +--disable_ps2_protocol eval CREATE TABLE test.t1(a INT,PRIMARY KEY(a))ENGINE=$engine_type; delimiter |; @@ -70,6 +71,7 @@ connection slave; SELECT * FROM test.t1; connection master; #show binlog events from 720; +--enable_ps2_protocol DROP PROCEDURE IF EXISTS test.p1; DROP PROCEDURE IF EXISTS test.p2; diff --git a/mysql-test/suite/rpl/r/mdev-31448_kill_ooo_finish_optimistic.result b/mysql-test/suite/rpl/r/mdev-31448_kill_ooo_finish_optimistic.result new file mode 100644 index 00000000000..23a16e01b96 --- /dev/null +++ b/mysql-test/suite/rpl/r/mdev-31448_kill_ooo_finish_optimistic.result @@ -0,0 +1,52 @@ +include/master-slave.inc +[connection master] +# MDEV-31448 OOO finish event group by killed worker +# Initialize test data +connection master; +call mtr.add_suppression("Slave: Connection was killed"); +call mtr.add_suppression("Slave: Commit failed due to failure of an earlier commit on which this one depends"); +create table t1 (a int) engine=innodb; +create table t2 (a int) engine=innodb; +insert into t1 values (1); +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +include/stop_slave.inc +set @@global.slave_parallel_threads= 4; +set @@global.slave_parallel_mode= OPTIMISTIC; +set @@global.innodb_lock_wait_timeout= 30; +set @@global.slave_transaction_retries= 0; +connection slave1; +BEGIN; +SELECT * FROM t1 WHERE a=1 FOR UPDATE; +a +1 +connection master; +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10000; +update t1 set a=2 where a=1; +set statement skip_parallel_replication=1 for insert into t2 values (1); +drop table t2; +connection slave; +include/start_slave.inc +# wait for T1 +# wait for T2 +# wait for T3 +kill T2_TID; +connection slave1; +ROLLBACK; +connection master; +DROP TABLE t1; +include/save_master_gtid.inc +connection slave; +# +# Cleanup +include/stop_slave.inc +set @@global.slave_parallel_threads= 0; +set @@global.slave_parallel_mode= optimistic; +set @@global.innodb_lock_wait_timeout= 50; +set @@global.slave_transaction_retries= 10; +include/start_slave.inc +include/sync_with_master_gtid.inc +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_gtid_basic.result b/mysql-test/suite/rpl/r/rpl_gtid_basic.result index 32df09789cc..aefb80a7c13 100644 --- a/mysql-test/suite/rpl/r/rpl_gtid_basic.result +++ b/mysql-test/suite/rpl/r/rpl_gtid_basic.result @@ -554,6 +554,62 @@ a 32 33 34 +*** MDEV-31723: Crash on SET SESSION gtid_seq_no= DEFAULT +connection server_1; +SET SESSION gtid_seq_no= 2000; +SELECT @@SESSION.gtid_seq_no; +@@SESSION.gtid_seq_no +2000 +INSERT INTO t1 VALUES (40); +SELECT @@SESSION.gtid_seq_no; +@@SESSION.gtid_seq_no +0 +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2000 +INSERT INTO t1 VALUES (41); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2001 +SET SESSION gtid_seq_no= 2010; +INSERT INTO t1 VALUES (42); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2010 +SET @old_strict= @@GLOBAL.gtid_strict_mode; +SET GLOBAL gtid_strict_mode= 1; +SET SESSION gtid_seq_no= 0; +INSERT INTO t1 VALUES (43); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2011 +SET GLOBAL gtid_strict_mode= @old_strict; +INSERT INTO t1 VALUES (44); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2012 +SET SESSION gtid_seq_no= 2020; +SET SESSION gtid_seq_no= 2030; +INSERT INTO t1 VALUES (45); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2030 +SET SESSION gtid_seq_no= 2040; +SET SESSION gtid_seq_no= DEFAULT; +INSERT INTO t1 VALUES (46); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2031 +INSERT INTO t1 VALUES (47); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2032 +SET SESSION gtid_seq_no= 2050; +SET SESSION gtid_seq_no= 0; +INSERT INTO t1 VALUES (48); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +dom0_pos +0-1-2033 connection server_1; DROP TABLE t1; include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_gtid_crash.result b/mysql-test/suite/rpl/r/rpl_gtid_crash.result index 153081d9ca5..4e74a3b25ac 100644 --- a/mysql-test/suite/rpl/r/rpl_gtid_crash.result +++ b/mysql-test/suite/rpl/r/rpl_gtid_crash.result @@ -168,7 +168,7 @@ SELECT * from t1 WHERE a > 10 ORDER BY a; a gtid_check Binlog pos ok -# Wait 30 seconds for SQL thread to catch up with IO thread +# Wait 60 seconds for SQL thread to catch up with IO thread connection server_2; SELECT * from t1 WHERE a > 10 ORDER BY a; a @@ -224,7 +224,7 @@ gtid_check Binlog pos ok gtid_check Current pos ok -# Wait 30 seconds for SQL thread to catch up with IO thread +# Wait 60 seconds for SQL thread to catch up with IO thread connection server_2; SELECT * from t1 WHERE a > 10 ORDER BY a; a @@ -275,7 +275,7 @@ COMMIT; Got one of the listed errors connection server_1; connection server_2; -# Wait 30 seconds for IO thread to connect and SQL thread to catch up +# Wait 60 seconds for IO thread to connect and SQL thread to catch up # with IO thread. include/stop_slave.inc connection server_1; diff --git a/mysql-test/suite/rpl/r/rpl_manual_change_index_file.result b/mysql-test/suite/rpl/r/rpl_manual_change_index_file.result index 78a86437867..15ecb55b016 100644 --- a/mysql-test/suite/rpl/r/rpl_manual_change_index_file.result +++ b/mysql-test/suite/rpl/r/rpl_manual_change_index_file.result @@ -8,7 +8,7 @@ FLUSH LOGS; call mtr.add_suppression('Got fatal error 1236 from master when reading data from binary log: .*could not find next log'); connection slave; include/wait_for_slave_io_error.inc [errno=1236] -Last_IO_Error = 'Got fatal error 1236 from master when reading data from binary log: 'could not find next log; the first event 'master-bin.000001' at XXX, the last event read from 'master-bin.000002' at XXX, the last byte read from 'master-bin.000002' at XXX.'' +Last_IO_Error = 'Got fatal error 1236 from master when reading data from binary log: 'could not find next log; the first event 'FILE' at XXX, the last event read from 'master-bin.000002' at XXX, the last byte read from 'master-bin.000002' at XXX.'' connection master; CREATE TABLE t2(c1 INT); FLUSH LOGS; diff --git a/mysql-test/suite/rpl/r/rpl_parallel_ftwrl.result b/mysql-test/suite/rpl/r/rpl_parallel_ftwrl.result new file mode 100644 index 00000000000..b6c71055fe7 --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_parallel_ftwrl.result @@ -0,0 +1,105 @@ +include/master-slave.inc +[connection master] +connection slave; +include/stop_slave.inc +SET @old_parallel_threads= @@GLOBAL.slave_parallel_threads; +SET GLOBAL slave_parallel_threads=3; +SET @old_parallel_mode= @@GLOBAL.slave_parallel_mode; +SET GLOBAL slave_parallel_mode=aggressive; +SET @old_dbug= @@GLOBAL.debug_dbug; +CHANGE MASTER TO master_use_gtid=slave_pos; +include/start_slave.inc +*** MDEV-31509: Lost data with FTWRL and STOP SLAVE +connection master; +ALTER TABLE mysql.gtid_slave_pos ENGINE=InnoDB; +CREATE TABLE t1 (a INT PRIMARY KEY, b INT) ENGINE=InnoDB; +CREATE TABLE t2 (a INT PRIMARY KEY, b INT) ENGINE=MyISAM; +INSERT INTO t1 VALUES (0,0); +INSERT INTO t2 VALUES (0,0); +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +connection slave; +*** Arrange for T1 to delay before entering GCO wait. +SET GLOBAL debug_dbug="+d,gco_wait_delay_gtid_0_x_99"; +*** Arrange for T2 to wait for FTWRL to start. +SET GLOBAL debug_dbug="+d,hold_worker_on_schedule"; +*** Arrange for T2 to delay wakeup from FTWRL pause. +SET GLOBAL debug_dbug="+d,delay_ftwrl_wait_gtid_0_x_100"; +connection master; +*** Event group T1 +SET SESSION gtid_seq_no=99; +INSERT INTO t1 VALUES (1,1); +connection slave; +*** 1a. Wait for T1 to be queued. +SET debug_sync="now WAIT_FOR gco_wait_paused"; +connection master; +*** Event group T2 +SET SESSION gtid_seq_no=100; +INSERT INTO t2 VALUES (2,2); +connection slave; +*** 1b. Wait for T2 to be queued. +SET debug_sync= "now WAIT_FOR reached_pause"; +connection slave1; +*** 2. Run FTWRL +SET GLOBAL debug_dbug= "+d,pause_for_ftwrl_wait"; +FLUSH TABLES WITH READ LOCK; +connection slave; +SET debug_sync= "now WAIT_FOR pause_ftwrl_waiting"; +*** 3. Wait for T2 to be waiting for FTWRL pause +SET debug_sync= "now SIGNAL continue_worker"; +*** 4. FTWRL completes, UNLOCK TABLES. +SET debug_sync="now SIGNAL pause_ftwrl_cont"; +connection slave1; +UNLOCK TABLES; +connection slave; +*** T2 is now ready to proceed after FTWRL pause, but did not wake up yet. +SET debug_sync="now WAIT_FOR pause_wait_started"; +*** 5. STOP SLAVE is run. +connection slave1; +SET GLOBAL debug_dbug="+d,rpl_parallel_wait_for_done_trigger"; +STOP SLAVE; +connection slave; +SET debug_sync="now WAIT_FOR wait_for_done_waiting"; +*** 5. T2 wakes up after FTWRL pause, reaches wait_for_prior_commit(). +SET debug_sync="now SIGNAL pause_wait_continue"; +*** 6. T1 starts. +SET debug_sync="now SIGNAL gco_wait_cont"; +connection slave1; +connection slave; +include/wait_for_slave_to_stop.inc +connection master; +SELECT * FROM t1 ORDER BY a; +a b +0 0 +1 1 +SELECT * FROM t2 ORDER BY a; +a b +0 0 +2 2 +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +SELECT @@GLOBAL.gtid_slave_pos; +@@GLOBAL.gtid_slave_pos +0-1-100 +SELECT * FROM t1 ORDER BY a; +a b +0 0 +1 1 +SELECT * FROM t2 ORDER BY a; +a b +0 0 +2 2 +*** Clean up. +connection slave; +include/stop_slave.inc +SET DEBUG_SYNC= "RESET"; +SET GLOBAL slave_parallel_threads= @old_parallel_threads; +SET GLOBAL slave_parallel_mode= @old_parallel_mode; +SET GLOBAL debug_dbug=@old_dbug; +include/start_slave.inc +connection master; +DROP TABLE t1, t2; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_parallel_kill.result b/mysql-test/suite/rpl/r/rpl_parallel_kill.result new file mode 100644 index 00000000000..7e6b065725b --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_parallel_kill.result @@ -0,0 +1,142 @@ +include/master-slave.inc +[connection master] +connection master; +create table t1 (a int) engine=innodb; +create table t2 (a int) engine=innodb; +insert into t1 values (1); +include/save_master_gtid.inc +connection slave; +call mtr.add_suppression("Slave: Commit failed due to failure of an earlier commit on which this one depends"); +include/sync_with_master_gtid.inc +include/stop_slave.inc +set @save.slave_parallel_threads= @@global.slave_parallel_threads; +set @save.slave_parallel_mode= @@global.slave_parallel_mode; +set @@global.slave_parallel_threads= 3; +set @@global.slave_parallel_mode= CONSERVATIVE; +connection slave1; +BEGIN; +update t1 set a=2 where a=1; +connection master; +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; +SET @commit_id= 10000; +update t1 set a=2 where a=1; +insert into t2 values (1); +SET @commit_id= 10001; +insert into t1 values (3); +connection slave; +include/start_slave.inc +kill $t3_tid; +connection slave1; +commit; +connection slave; +include/wait_for_slave_sql_to_stop.inc +update t1 set a=1 where a=2; +set @@global.slave_parallel_threads = @save.slave_parallel_threads; +set @@global.slave_parallel_mode = @save.slave_parallel_mode; +include/start_slave.inc +# +# Cleanup +connection master; +DROP TABLE t1, t2; +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +# MDEV-31448 OOO finish event group by killed worker +# Initialize test data +connection master; +create table t1 (a int) engine=innodb; +create table t2 (a int) engine=innodb; +insert into t1 values (1); +include/save_master_gtid.inc +connection slave; +call mtr.add_suppression("Connection was killed"); +call mtr.add_suppression("Can.t find record"); +include/sync_with_master_gtid.inc +include/stop_slave.inc +set @save.slave_parallel_threads= @@global.slave_parallel_threads; +set @save.slave_parallel_mode= @@global.slave_parallel_mode; +set @@global.slave_parallel_threads= 3; +set @@global.slave_parallel_mode= OPTIMISTIC; +connection slave1; +begin; +update t1 set a=2 where a=1; +connection master; +set @old_dbug= @@session.debug_dbug; +set @@session.debug_dbug="+d,binlog_force_commit_id"; +set @commit_id= 10000; +update t1 set a=2 where a=1; +insert into t2 values (1); +drop table t2; +connection slave; +include/start_slave.inc +# wait for T1 +# wait for T2 +# wait for T3 +kill $t2_tid; +include/wait_for_slave_param.inc [Last_Errno] +connection slave1; +commit; +connection slave; +include/wait_for_slave_sql_to_stop.inc +update t1 set a=1 where a=2; +set @@global.slave_parallel_threads = @save.slave_parallel_threads; +set @@global.slave_parallel_mode = @save.slave_parallel_mode; +include/start_slave.inc +# +# Cleanup +connection master; +drop table t1; +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +# MDEV-31448 OOO finish event group by killed worker +# Initialize test data +connection master; +create table t1 (a int) engine=innodb; +create table t2 (a int) engine=innodb; +insert into t1 values (1); +include/save_master_gtid.inc +connection slave; +call mtr.add_suppression("Connection was killed"); +call mtr.add_suppression("Can.t find record"); +include/sync_with_master_gtid.inc +include/stop_slave.inc +set @save.slave_parallel_threads= @@global.slave_parallel_threads; +set @save.slave_parallel_mode= @@global.slave_parallel_mode; +set @@global.slave_parallel_threads= 3; +set @@global.slave_parallel_mode= OPTIMISTIC; +connection slave1; +begin; +update t1 set a=2 where a=1; +connection master; +set @old_dbug= @@session.debug_dbug; +set @@session.debug_dbug="+d,binlog_force_commit_id"; +set @commit_id= 10000; +update t1 set a=2 where a=1; +set @commit_id= 10001; +set statement skip_parallel_replication=1 for insert into t2 values (1); +drop table t2; +connection slave; +include/start_slave.inc +# wait for T1 +# wait for T2 +# wait for T3 +kill $t2_tid; +include/wait_for_slave_param.inc [Last_Errno] +connection slave1; +commit; +connection slave; +include/wait_for_slave_sql_to_stop.inc +update t1 set a=1 where a=2; +set @@global.slave_parallel_threads = @save.slave_parallel_threads; +set @@global.slave_parallel_mode = @save.slave_parallel_mode; +include/start_slave.inc +# +# Cleanup +connection master; +drop table t1; +include/save_master_gtid.inc +connection slave; +include/sync_with_master_gtid.inc +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/r/rpl_delayed_parallel_slave_sbm.result b/mysql-test/suite/rpl/r/rpl_parallel_sbm.result similarity index 54% rename from mysql-test/suite/rpl/r/rpl_delayed_parallel_slave_sbm.result rename to mysql-test/suite/rpl/r/rpl_parallel_sbm.result index b00a8a5e1d7..f3cc8454510 100644 --- a/mysql-test/suite/rpl/r/rpl_delayed_parallel_slave_sbm.result +++ b/mysql-test/suite/rpl/r/rpl_parallel_sbm.result @@ -1,12 +1,17 @@ include/master-slave.inc [connection master] +# +# MDEV-29639: Seconds_Behind_Master is incorrect for Delayed, Parallel Replicas +# connection slave; include/stop_slave.inc +set @@GLOBAL.debug_dbug= "d,negate_clock_diff_with_master"; +set @@GLOBAL.slave_parallel_mode= CONSERVATIVE; change master to master_delay=3, master_use_gtid=Slave_Pos; -set @@GLOBAL.slave_parallel_threads=2; include/start_slave.inc connection master; create table t1 (a int); +create table t2 (a int); include/sync_slave_sql_with_master.inc # # Pt 1) Ensure SBM is updated immediately upon arrival of the next event @@ -25,11 +30,10 @@ connection slave; UNLOCK TABLES; include/sync_with_master_gtid.inc # -# Pt 2) If the SQL thread has not entered an idle state, ensure +# Pt 2) If the worker threads have not entered an idle state, ensure # following events do not update SBM -# Stop slave IO thread so it receives both events together on restart connection slave; -include/stop_slave_io.inc +LOCK TABLES t1 WRITE; connection master; # Sleep 2 to allow a buffer between events for SBM check insert into t1 values (1); @@ -37,36 +41,49 @@ insert into t1 values (1); insert into t1 values (2); include/save_master_pos.inc connection slave; -LOCK TABLES t1 WRITE; -SET @@global.debug_dbug="+d,pause_sql_thread_on_next_event"; -START SLAVE IO_THREAD; -# Before we start processing the events, we ensure both transactions -# were written into the relay log. Otherwise, if the IO thread takes too -# long to queue the events, the sql thread can think it has caught up -# too quickly. -SET DEBUG_SYNC='now WAIT_FOR paused_on_event'; -include/sync_io_with_master.inc -SET @@global.debug_dbug="-d,pause_sql_thread_on_next_event"; -SET DEBUG_SYNC='now SIGNAL sql_thread_continue'; # Wait for first transaction to complete SQL delay and begin execution.. -# Validate SBM calculation doesn't use the second transaction because SQL thread shouldn't have gone idle.. +# Validate SBM calculation doesn't use the second transaction because worker threads shouldn't have gone idle.. # ..and that SBM wasn't calculated using prior committed transactions # ..done connection slave; UNLOCK TABLES; -# +include/wait_for_slave_param.inc [Relay_Master_Log_File] +include/wait_for_slave_param.inc [Exec_Master_Log_Pos] # Cleanup -# Reset master_delay include/stop_slave.inc CHANGE MASTER TO master_delay=0; -set @@GLOBAL.slave_parallel_threads=4; -SET @@global.debug_dbug=""; -SET DEBUG_SYNC='RESET'; include/start_slave.inc +# +# MDEV-30619: Parallel Slave SQL Thread Can Update Seconds_Behind_Master with Active Workers +# +connection slave; +# Ensure the replica is fully idle before starting transactions +# Lock t1 on slave so the first received transaction does not complete/commit +LOCK TABLES t1 WRITE; connection master; -DROP TABLE t1; +insert into t1 values (3); +include/save_master_gtid.inc +connection slave; +# Waiting for first transaction to begin.. +connection master; +# Sleep 2 sec to create a gap between events +INSERT INTO t2 VALUES (1); +include/save_master_gtid.inc +connection slave; +# Waiting for second transaction to begin.. +connection slave; +UNLOCK TABLES; +include/sync_with_master_gtid.inc +# +# Cleanup +connection master; +DROP TABLE t1, t2; include/save_master_gtid.inc connection slave; include/sync_with_master_gtid.inc +include/stop_slave.inc +set @@GLOBAL.debug_dbug= ""; +set @@GLOBAL.slave_parallel_mode= "$save_parallel_mode"; +include/start_slave.inc include/rpl_end.inc -# End of rpl_delayed_parallel_slave_sbm.test +# End of rpl_parallel_sbm.test diff --git a/mysql-test/suite/rpl/r/rpl_parallel_seq.result b/mysql-test/suite/rpl/r/rpl_parallel_seq.result index ae4041f470d..8b1bb7c81c6 100644 --- a/mysql-test/suite/rpl/r/rpl_parallel_seq.result +++ b/mysql-test/suite/rpl/r/rpl_parallel_seq.result @@ -47,11 +47,21 @@ Warnings: Note 1255 Slave already has been stopped RESET MASTER; SET @@global.gtid_slave_pos=""; -SET @@global.gtid_strict_mode=1; connection master; RESET MASTER; CREATE TABLE ti (a INT) ENGINE=innodb; CREATE SEQUENCE s2 ENGINE=innodb; +include/save_master_gtid.inc +connection slave; +include/start_slave.inc +include/sync_with_master_gtid.inc +include/stop_slave.inc +include/rpl_restart_server.inc [server_number=2] +SET @@global.slave_parallel_threads=2; +SET @@global.slave_parallel_mode=optimistic; +SET @@global.debug_dbug="+d,hold_worker_on_schedule"; +SET @@global.gtid_strict_mode=1; +connection master; SET @@gtid_seq_no=100; ALTER SEQUENCE s2 restart with 1; INSERT INTO ti SET a=1; @@ -60,6 +70,7 @@ SELECT @@global.gtid_binlog_state "Master gtid state"; Master gtid state 0-1-101 connection slave; +SET STATEMENT sql_log_bin=0 FOR FLUSH TABLES; include/start_slave.inc SELECT @@global.gtid_binlog_state, @@global.gtid_slave_pos as "no 100,101 yet in both"; @@global.gtid_binlog_state no 100,101 yet in both diff --git a/mysql-test/suite/rpl/r/rpl_read_only.result b/mysql-test/suite/rpl/r/rpl_read_only.result index dbcd58a224f..a68b6f6d53e 100644 --- a/mysql-test/suite/rpl/r/rpl_read_only.result +++ b/mysql-test/suite/rpl/r/rpl_read_only.result @@ -139,6 +139,26 @@ insert into t1 values(1006); ERROR HY000: The MariaDB server is running with the --read-only option so it cannot execute this statement insert into t2 values(2006); ERROR HY000: The MariaDB server is running with the --read-only option so it cannot execute this statement +# +# MDEV-30978: On slave XA COMMIT/XA ROLLBACK fail to return an error in read-only mode +# +# Where a read-only server permits writes through replication, it +# should not permit user connections to commit/rollback XA transactions +# prepared via replication. This test ensure this behavior is prohibited +# +connection master; +xa start '1'; +insert into t1 values (1007); +xa end '1'; +xa prepare '1'; +connection slave; +connection slave2; +xa commit '1'; +ERROR HY000: The MariaDB server is running with the --read-only option so it cannot execute this statement +xa rollback '1'; +ERROR HY000: The MariaDB server is running with the --read-only option so it cannot execute this statement +connection master; +xa rollback '1'; connection master; drop user test; drop table t1; diff --git a/mysql-test/suite/rpl/r/rpl_rotate_logs.result b/mysql-test/suite/rpl/r/rpl_rotate_logs.result index 2518b207111..d720b0b865e 100644 --- a/mysql-test/suite/rpl/r/rpl_rotate_logs.result +++ b/mysql-test/suite/rpl/r/rpl_rotate_logs.result @@ -1,5 +1,6 @@ connect master,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK; connect slave,localhost,root,,test,$SLAVE_MYPORT,$SLAVE_MYSOCK; +SET GLOBAL gtid_slave_pos= ""; connection slave; CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT."); start slave; diff --git a/mysql-test/suite/rpl/r/rpl_seconds_behind_master_spike.result b/mysql-test/suite/rpl/r/rpl_seconds_behind_master_spike.result index 4eeb863bb40..bb71f6c92b0 100644 --- a/mysql-test/suite/rpl/r/rpl_seconds_behind_master_spike.result +++ b/mysql-test/suite/rpl/r/rpl_seconds_behind_master_spike.result @@ -3,7 +3,7 @@ include/master-slave.inc connection slave; include/stop_slave.inc SET @save_dbug= @@GLOBAL.debug_dbug; -SET @@global.debug_dbug="+d,pause_sql_thread_on_fde"; +SET @@global.debug_dbug="+d,pause_sql_thread_on_fde,negate_clock_diff_with_master"; include/start_slave.inc # Future events must be logged at least 2 seconds after # the slave starts @@ -34,8 +34,31 @@ SET @@global.debug_dbug="-d,pause_sql_thread_on_fde"; SET DEBUG_SYNC='now SIGNAL sql_thread_continue'; # Wait for SQL thread to continue into normal execution SET DEBUG_SYNC='RESET'; +# +# MDEV-29639 +# When receiving an event after the SQL Thread idles, +# Seconds_Behind_Master should not update before it updates +# last_master_timestamp +connection slave; +include/stop_slave.inc +set @@global.debug_dbug="+d,pause_sql_thread_on_next_event"; +include/start_slave.inc +connection master; +insert into t1 values(2); +include/save_master_gtid.inc +connection slave; +set debug_sync='now wait_for paused_on_event'; +connection master; +# Sleeping 1s to create a visible SBM gap between events +insert into t1 values(3); +include/save_master_gtid.inc +connection slave; +set debug_sync='now wait_for paused_on_event'; +include/stop_slave.inc +set debug_sync='RESET'; +SET @@global.debug_dbug=$save_dbug; +include/start_slave.inc +include/sync_with_master_gtid.inc connection master; DROP TABLE t1; -connection slave; -SET @@global.debug_dbug=$save_dbug; include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/mdev-31448_kill_ooo_finish_optimistic.test b/mysql-test/suite/rpl/t/mdev-31448_kill_ooo_finish_optimistic.test new file mode 100644 index 00000000000..1297fcda7f7 --- /dev/null +++ b/mysql-test/suite/rpl/t/mdev-31448_kill_ooo_finish_optimistic.test @@ -0,0 +1,93 @@ +--source include/master-slave.inc +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_binlog_format_row.inc + +--echo # MDEV-31448 OOO finish event group by killed worker +# The test demonstrates how a killed worker access gco lists +# in finish_event_group() out-of-order to fire +# DBUG_ASSERT(!tmp_gco->next_gco || tmp_gco->last_sub_id > sub_id); +# in the buggy version. + +--echo # Initialize test data +--connection master +call mtr.add_suppression("Slave: Connection was killed"); +call mtr.add_suppression("Slave: Commit failed due to failure of an earlier commit on which this one depends"); +create table t1 (a int) engine=innodb; +create table t2 (a int) engine=innodb; + +insert into t1 values (1); +--source include/save_master_gtid.inc + +--connection slave +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +--let $save_slave_parallel_threads= `SELECT @@global.slave_parallel_threads` +--let $save_slave_parallel_mode= `SELECT @@global.slave_parallel_mode` +--let $save_innodb_lock_wait_timeout= `SELECT @@global.innodb_lock_wait_timeout` +--let $save_transaction_retries= `SELECT @@global.slave_transaction_retries` +set @@global.slave_parallel_threads= 4; +set @@global.slave_parallel_mode= OPTIMISTIC; +set @@global.innodb_lock_wait_timeout= 30; +set @@global.slave_transaction_retries= 0; + +--connection slave1 +BEGIN; +SELECT * FROM t1 WHERE a=1 FOR UPDATE; + +--connection master +SET @old_dbug= @@SESSION.debug_dbug; +SET @@SESSION.debug_dbug="+d,binlog_force_commit_id"; + +# GCO 1 +SET @commit_id= 10000; +# T1 +update t1 set a=2 where a=1; +# T2 +set statement skip_parallel_replication=1 for insert into t2 values (1); + +# GCO 2 +# T3 +drop table t2; + +--connection slave +--source include/start_slave.inc + +--echo # wait for T1 +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Update_rows_log_event::find_row(-1)%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--echo # wait for T2 +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to commit%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc +--let $t2_tid= `SELECT ID FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE LIKE 'Waiting for prior transaction to commit%' and command LIKE 'Slave_worker'` +--echo # wait for T3 +--let $wait_condition= SELECT count(*)=1 FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to start commit%' and command LIKE 'Slave_worker'; +--source include/wait_condition.inc + +--replace_result $t2_tid T2_TID +--eval kill $t2_tid + +--sleep 1 + +--connection slave1 +# Release the blocked T1 +ROLLBACK; + +--connection master +DROP TABLE t1; +--source include/save_master_gtid.inc + +--connection slave +--echo # +--echo # Cleanup +--source include/stop_slave.inc +eval set @@global.slave_parallel_threads= $save_slave_parallel_threads; +eval set @@global.slave_parallel_mode= $save_slave_parallel_mode; +eval set @@global.innodb_lock_wait_timeout= $save_innodb_lock_wait_timeout; +eval set @@global.slave_transaction_retries= $save_transaction_retries; +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + +--source include/rpl_end.inc + diff --git a/mysql-test/suite/rpl/t/rpl_auto_increment_bug45679.test b/mysql-test/suite/rpl/t/rpl_auto_increment_bug45679.test index 32f08be7c4d..25bfa134dbb 100644 --- a/mysql-test/suite/rpl/t/rpl_auto_increment_bug45679.test +++ b/mysql-test/suite/rpl/t/rpl_auto_increment_bug45679.test @@ -34,7 +34,9 @@ begin end// delimiter ;// +--disable_ps2_protocol select multi_part_pk_with_autoinc (3); +--enable_ps2_protocol --echo *** autoincrement field is not the first in PK warning must be there: *** show warnings; diff --git a/mysql-test/suite/rpl/t/rpl_binlog_errors.test b/mysql-test/suite/rpl/t/rpl_binlog_errors.test index bf92736a2af..a5988efcb21 100644 --- a/mysql-test/suite/rpl/t/rpl_binlog_errors.test +++ b/mysql-test/suite/rpl/t/rpl_binlog_errors.test @@ -58,7 +58,9 @@ SET @old_debug= @@global.debug_dbug; -- let $load_file= $MYSQLTEST_VARDIR/tmp/bug_46166.data -- let $MYSQLD_DATADIR= `select @@datadir` -- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol -- eval SELECT repeat('x',8192) INTO OUTFILE '$load_file' +--enable_ps2_protocol ### ACTION: create a small file (< 4096 bytes) that will be later used ### in LOAD DATA INFILE to check for absence of binlog errors @@ -67,7 +69,9 @@ SET @old_debug= @@global.debug_dbug; -- let $load_file2= $MYSQLTEST_VARDIR/tmp/bug_46166-2.data -- let $MYSQLD_DATADIR= `select @@datadir` -- replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol -- eval SELECT repeat('x',10) INTO OUTFILE '$load_file2' +--enable_ps2_protocol RESET MASTER; diff --git a/mysql-test/suite/rpl/t/rpl_delayed_parallel_slave_sbm-slave.opt b/mysql-test/suite/rpl/t/rpl_delayed_parallel_slave_sbm-slave.opt deleted file mode 100644 index 9eea6a54b68..00000000000 --- a/mysql-test/suite/rpl/t/rpl_delayed_parallel_slave_sbm-slave.opt +++ /dev/null @@ -1 +0,0 @@ ---slave-parallel-threads=4 diff --git a/mysql-test/suite/rpl/t/rpl_drop_db.test b/mysql-test/suite/rpl/t/rpl_drop_db.test index f67f422c36f..245ab8b609c 100644 --- a/mysql-test/suite/rpl/t/rpl_drop_db.test +++ b/mysql-test/suite/rpl/t/rpl_drop_db.test @@ -11,8 +11,10 @@ create database mysqltest1; create table mysqltest1.t1 (n int); insert into mysqltest1.t1 values (1); --enable_prepare_warnings +--disable_ps2_protocol select * from mysqltest1.t1 into outfile 'mysqltest1/f1.txt'; --disable_prepare_warnings +--enable_ps2_protocol create table mysqltest1.t2 (n int); create table mysqltest1.t3 (n int); --replace_result \\ / 66 39 93 39 17 39 247 39 41 39 "File exists" "Directory not empty" diff --git a/mysql-test/suite/rpl/t/rpl_gtid_basic.test b/mysql-test/suite/rpl/t/rpl_gtid_basic.test index 5975c6f03c3..70bd0087f7a 100644 --- a/mysql-test/suite/rpl/t/rpl_gtid_basic.test +++ b/mysql-test/suite/rpl/t/rpl_gtid_basic.test @@ -211,6 +211,7 @@ SELECT * FROM t1; --echo *** Test @@LAST_GTID and MASTER_GTID_WAIT() *** +--disable_ps2_protocol --connection server_1 DROP TABLE t1; CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; @@ -396,7 +397,7 @@ INSERT INTO t1 VALUES (7); reap; --connection s7 reap; - +--enable_ps2_protocol --echo *** Test gtid_slave_pos when used with GTID *** @@ -564,6 +565,50 @@ SELECT * FROM t1 WHERE a >= 30 ORDER BY a; SELECT * FROM t1 WHERE a >= 30 ORDER BY a; +--echo *** MDEV-31723: Crash on SET SESSION gtid_seq_no= DEFAULT +--connection server_1 + +# Setting gtid_seq_no forces the GTID logged, but only once. +SET SESSION gtid_seq_no= 2000; +SELECT @@SESSION.gtid_seq_no; +INSERT INTO t1 VALUES (40); +SELECT @@SESSION.gtid_seq_no; +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +INSERT INTO t1 VALUES (41); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; + +# Setting to 0 has no effect. +SET SESSION gtid_seq_no= 2010; +INSERT INTO t1 VALUES (42); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +SET @old_strict= @@GLOBAL.gtid_strict_mode; +SET GLOBAL gtid_strict_mode= 1; +SET SESSION gtid_seq_no= 0; +INSERT INTO t1 VALUES (43); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +SET GLOBAL gtid_strict_mode= @old_strict; +INSERT INTO t1 VALUES (44); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; + +# Setting gtid_seq_no multiple times. +SET SESSION gtid_seq_no= 2020; +SET SESSION gtid_seq_no= 2030; +INSERT INTO t1 VALUES (45); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; + +# Setting to DEFAULT or 0 disables prior setting. +SET SESSION gtid_seq_no= 2040; +SET SESSION gtid_seq_no= DEFAULT; +INSERT INTO t1 VALUES (46); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +INSERT INTO t1 VALUES (47); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; +SET SESSION gtid_seq_no= 2050; +SET SESSION gtid_seq_no= 0; +INSERT INTO t1 VALUES (48); +SELECT REGEXP_REPLACE(@@gtid_binlog_pos, ".*\\b(0-1-[0-9]+)\\b.*", "\\1") AS dom0_pos; + + # Clean up. --connection server_1 DROP TABLE t1; diff --git a/mysql-test/suite/rpl/t/rpl_gtid_crash.test b/mysql-test/suite/rpl/t/rpl_gtid_crash.test index d0af69a65ed..f2167911101 100644 --- a/mysql-test/suite/rpl/t/rpl_gtid_crash.test +++ b/mysql-test/suite/rpl/t/rpl_gtid_crash.test @@ -345,9 +345,9 @@ SELECT * from t1 WHERE a > 10 ORDER BY a; eval SELECT IF(INSTR(@@gtid_binlog_pos, '$saved_gtid'), "Binlog pos ok", CONCAT("Unexpected binlog pos: ", @@gtid_binlog_pos, "; does not contain the GTID $saved_gtid.")) AS gtid_check; --enable_query_log ---echo # Wait 30 seconds for SQL thread to catch up with IO thread +--echo # Wait 60 seconds for SQL thread to catch up with IO thread --connection server_2 ---let $wait_timeout= 300 +--let $wait_timeout= 600 while ($wait_timeout != 0) { --let $read_log_pos= query_get_value('SHOW SLAVE STATUS', Read_Master_Log_Pos, 1) @@ -442,9 +442,9 @@ eval SELECT IF(INSTR(@@gtid_binlog_pos, '$saved_gtid'), "Binlog pos ok", CONCAT( eval SELECT IF(INSTR(@@gtid_current_pos, '$saved_gtid'), "Current pos ok", CONCAT("Unexpected current pos: ", @@gtid_current_pos, "; does not contain the GTID $saved_gtid.")) AS gtid_check; --enable_query_log ---echo # Wait 30 seconds for SQL thread to catch up with IO thread +--echo # Wait 60 seconds for SQL thread to catch up with IO thread --connection server_2 ---let $wait_timeout= 300 +--let $wait_timeout= 600 while ($wait_timeout != 0) { --let $read_log_pos= query_get_value('SHOW SLAVE STATUS', Read_Master_Log_Pos, 1) @@ -533,9 +533,9 @@ EOF --source include/wait_until_connected_again.inc --connection server_2 ---echo # Wait 30 seconds for IO thread to connect and SQL thread to catch up +--echo # Wait 60 seconds for IO thread to connect and SQL thread to catch up --echo # with IO thread. ---let $wait_timeout= 300 +--let $wait_timeout= 600 while ($wait_timeout != 0) { --let $connected=`SELECT COUNT(*) > 0 FROM information_schema.processlist WHERE State = 'Waiting for master to send event'` diff --git a/mysql-test/suite/rpl/t/rpl_loaddata_local.test b/mysql-test/suite/rpl/t/rpl_loaddata_local.test index 20962d74e98..01f5607ba0b 100644 --- a/mysql-test/suite/rpl/t/rpl_loaddata_local.test +++ b/mysql-test/suite/rpl/t/rpl_loaddata_local.test @@ -27,7 +27,9 @@ set SQL_LOG_BIN=1; enable_query_log; let $MYSQLD_DATADIR= `select @@datadir`; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--disable_ps2_protocol eval select * into outfile '$MYSQLD_DATADIR/rpl_loaddatalocal.select_outfile' from t1; +--enable_ps2_protocol #This will generate a 20KB file, now test LOAD DATA LOCAL truncate table t1; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR @@ -50,7 +52,9 @@ connection master; create table t1(a int); insert into t1 values (1), (2), (2), (3); --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--disable_ps2_protocol eval select * into outfile '$MYSQLD_DATADIR/rpl_loaddatalocal.select_outfile' from t1; +--enable_ps2_protocol drop table t1; create table t1(a int primary key); --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR @@ -79,7 +83,9 @@ SET sql_mode='ignore_space'; CREATE TABLE t1(a int); insert into t1 values (1), (2), (3), (4); --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--disable_ps2_protocol eval select * into outfile '$MYSQLD_DATADIR/rpl_loaddatalocal.select_outfile' from t1; +--enable_ps2_protocol truncate table t1; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR eval load data local infile '$MYSQLD_DATADIR/rpl_loaddatalocal.select_outfile' into table t1; @@ -111,7 +117,9 @@ CREATE TABLE t1(a int); INSERT INTO t1 VALUES (1), (2), (3), (4); --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--disable_ps2_protocol eval SELECT * INTO OUTFILE '$MYSQLD_DATADIR/bug43746.sql' FROM t1; +--enable_ps2_protocol TRUNCATE TABLE t1; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR @@ -159,7 +167,9 @@ sync_slave_with_master; connection master; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--disable_ps2_protocol eval SELECT * INTO OUTFILE '$MYSQLD_DATADIR/bug59267.sql' FROM t1; +--enable_ps2_protocol TRUNCATE TABLE t1; --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR @@ -204,7 +214,9 @@ CREATE VIEW v1 AS SELECT * FROM t2 WHERE f1 IN (SELECT f1 FROM t3 WHERE (t3.f2 IS NULL)); --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +--disable_ps2_protocol eval SELECT 1 INTO OUTFILE '$MYSQLD_DATADIR/bug60580.csv' FROM DUAL; +--enable_ps2_protocol --replace_result $MYSQLD_DATADIR MYSQLD_DATADIR eval LOAD DATA LOCAL INFILE '$MYSQLD_DATADIR/bug60580.csv' INTO TABLE t1 (@f1) SET f2 = (SELECT f1 FROM v1 WHERE f1=@f1); diff --git a/mysql-test/suite/rpl/t/rpl_loaddata_map.test b/mysql-test/suite/rpl/t/rpl_loaddata_map.test index 655bcc39cb9..0df424aa1ac 100644 --- a/mysql-test/suite/rpl/t/rpl_loaddata_map.test +++ b/mysql-test/suite/rpl/t/rpl_loaddata_map.test @@ -37,7 +37,9 @@ while($rows) eval insert into t1 values (null); dec $rows; } +--disable_ps2_protocol eval select * into outfile '$MYSQLTEST_VARDIR/tmp/bug30435_5k.txt' from t1; +--enable_ps2_protocol DROP TABLE t1; SET @@sql_log_bin= 1; diff --git a/mysql-test/suite/rpl/t/rpl_loadfile.test b/mysql-test/suite/rpl/t/rpl_loadfile.test index 9cd64530690..a49b3c30b87 100644 --- a/mysql-test/suite/rpl/t/rpl_loadfile.test +++ b/mysql-test/suite/rpl/t/rpl_loadfile.test @@ -69,7 +69,9 @@ connection master; let $file= $MYSQLTEST_VARDIR/tmp/bug_39701.data; --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR +--disable_ps2_protocol --eval SELECT repeat('x',20) INTO OUTFILE '$file' +--enable_ps2_protocol disable_warnings; DROP TABLE IF EXISTS t1; diff --git a/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test b/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test index 1c087c550d0..2b69ef2e82a 100644 --- a/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test +++ b/mysql-test/suite/rpl/t/rpl_manual_change_index_file.test @@ -62,7 +62,7 @@ connection slave; --let $slave_io_errno= 1236 --let $show_slave_io_error= 1 # Mask line numbers ---let $slave_io_error_replace= / at [0-9]*/ at XXX/ +--let $slave_io_error_replace= / at [0-9]*/ at XXX/ /the first event '(\.|master-bin.000001)'/the first event 'FILE'/ --source include/wait_for_slave_io_error.inc connection master; diff --git a/mysql-test/suite/rpl/t/rpl_misc_functions.test b/mysql-test/suite/rpl/t/rpl_misc_functions.test index 4b140c9588a..b9d65844b12 100644 --- a/mysql-test/suite/rpl/t/rpl_misc_functions.test +++ b/mysql-test/suite/rpl/t/rpl_misc_functions.test @@ -26,7 +26,9 @@ insert into t1 values(3, 0, 0, 0, password('does_this_work?')); --disable_warnings insert into t1 values(4, connection_id(), rand()*1000, rand()*1000, password('does_this_still_work?')); --enable_warnings +--disable_ps2_protocol select * into outfile 'rpl_misc_functions.outfile' from t1; +--enable_ps2_protocol let $MYSQLD_DATADIR= `select @@datadir`; sync_slave_with_master; create temporary table t2 like t1; @@ -91,8 +93,10 @@ INSERT INTO t1 (col_a) VALUES (test_replication_sf()); --enable_prepare_warnings # Dump table on slave +--disable_ps2_protocol select * from t1 into outfile "../../tmp/t1_slave.txt"; --disable_prepare_warnings +--enable_ps2_protocol # Load data from slave into temp table on master connection master; diff --git a/mysql-test/suite/rpl/t/rpl_mix_found_rows.test b/mysql-test/suite/rpl/t/rpl_mix_found_rows.test index c8b2eaef53b..af206c55d49 100644 --- a/mysql-test/suite/rpl/t/rpl_mix_found_rows.test +++ b/mysql-test/suite/rpl/t/rpl_mix_found_rows.test @@ -75,7 +75,9 @@ END $$ --delimiter ; SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1; +--disable_ps2_protocol SELECT log_rows(2,1), log_rows(2,2); +--enable_ps2_protocol CREATE TABLE t2 (a INT, b INT); diff --git a/mysql-test/suite/rpl/t/rpl_mixed_mixing_engines.test b/mysql-test/suite/rpl/t/rpl_mixed_mixing_engines.test index 1df53270b74..ddc7757fa6c 100644 --- a/mysql-test/suite/rpl/t/rpl_mixed_mixing_engines.test +++ b/mysql-test/suite/rpl/t/rpl_mixed_mixing_engines.test @@ -4,6 +4,8 @@ ################################################################################### --source include/have_binlog_format_mixed.inc --source include/have_innodb.inc +# MDEV-31790 FIXME: This test is extremely slow +--source include/not_msan.inc --source include/master-slave.inc let $engine_type=Innodb; diff --git a/mysql-test/suite/rpl/t/rpl_non_direct_mixed_mixing_engines.test b/mysql-test/suite/rpl/t/rpl_non_direct_mixed_mixing_engines.test index 1f2f8749a0c..d6b278ca13d 100644 --- a/mysql-test/suite/rpl/t/rpl_non_direct_mixed_mixing_engines.test +++ b/mysql-test/suite/rpl/t/rpl_non_direct_mixed_mixing_engines.test @@ -4,6 +4,8 @@ ################################################################################### --source include/have_binlog_format_mixed.inc --source include/have_innodb.inc +# MDEV-31790 FIXME: This test is extremely slow +--source include/not_msan.inc --source include/master-slave.inc --disable_query_log diff --git a/mysql-test/suite/rpl/t/rpl_non_direct_row_mixing_engines.test b/mysql-test/suite/rpl/t/rpl_non_direct_row_mixing_engines.test index b4552c79349..0161a609738 100644 --- a/mysql-test/suite/rpl/t/rpl_non_direct_row_mixing_engines.test +++ b/mysql-test/suite/rpl/t/rpl_non_direct_row_mixing_engines.test @@ -4,6 +4,8 @@ ################################################################################### --source include/have_binlog_format_row.inc --source include/have_innodb.inc +# MDEV-31790 FIXME: This test is extremely slow +--source include/not_msan.inc --source include/master-slave.inc --disable_query_log diff --git a/mysql-test/suite/rpl/t/rpl_non_direct_stm_mixing_engines.test b/mysql-test/suite/rpl/t/rpl_non_direct_stm_mixing_engines.test index 23552515df7..9944370727e 100644 --- a/mysql-test/suite/rpl/t/rpl_non_direct_stm_mixing_engines.test +++ b/mysql-test/suite/rpl/t/rpl_non_direct_stm_mixing_engines.test @@ -4,6 +4,8 @@ ################################################################################### --source include/have_binlog_format_statement.inc --source include/have_innodb.inc +# MDEV-31790 FIXME: This test is extremely slow +--source include/not_msan.inc --source include/master-slave.inc --disable_query_log diff --git a/mysql-test/suite/rpl/t/rpl_parallel_ftwrl.test b/mysql-test/suite/rpl/t/rpl_parallel_ftwrl.test new file mode 100644 index 00000000000..308fcd0bd1f --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_parallel_ftwrl.test @@ -0,0 +1,143 @@ +--source include/have_innodb.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc +--source include/have_binlog_format_mixed.inc +--source include/master-slave.inc + +--connection slave +--source include/stop_slave.inc +SET @old_parallel_threads= @@GLOBAL.slave_parallel_threads; +SET GLOBAL slave_parallel_threads=3; +SET @old_parallel_mode= @@GLOBAL.slave_parallel_mode; +SET GLOBAL slave_parallel_mode=aggressive; +SET @old_dbug= @@GLOBAL.debug_dbug; +CHANGE MASTER TO master_use_gtid=slave_pos; +--source include/start_slave.inc + +--echo *** MDEV-31509: Lost data with FTWRL and STOP SLAVE +# The bug was as follows: +# 1. Event groups T1 and T2 are queued but not started yet. +# 2. FLUSH TABLE WITH READ LOCKS starts, sets rpl_parallel_entry::pause_sub_id +# 3. T2 Sees pause_sub_id, goes to wait for the pause to complete. +# 4. FTWRL completes, UNLOCK TABLES is run. +# 5. STOP SLAVE is run, sets rpl_parallel_entry::stop_sub_id. +# 6. T2 wakes up after FTWRL pause, only now sets +# rpl_parallel_entry::largest_started_sub_id. This is the bug, +# largest_started_sub_id is set too late here. +# 7. T1 starts, it sees stop_sub_id ($seconds_since_idling + 1)`) --connection slave UNLOCK TABLES; +--source include/sync_with_master.inc + +--echo # Cleanup +--source include/stop_slave.inc +--eval CHANGE MASTER TO master_delay=0 +--source include/start_slave.inc + + +--echo # +--echo # MDEV-30619: Parallel Slave SQL Thread Can Update Seconds_Behind_Master with Active Workers +--echo # + +# This test ensures that a parallel slave will not update +# Seconds_Behind_Master after the SQL Thread has idled if the worker threads +# are still executing events. To test this, two events are executed on the +# primary with $sleep seconds in-between them. Once the second event begins +# execution on the replica, Seconds_Behind_Master is queried to ensure it +# reflects the value of the first transaction, rather than the second. + +--connection slave +--echo # Ensure the replica is fully idle before starting transactions +--let $wait_condition= SELECT count(*) FROM information_schema.processlist WHERE state LIKE 'Slave has read all relay log%'; +--source include/wait_condition.inc +--let $wait_condition= SELECT count(*)=2 FROM information_schema.processlist WHERE state LIKE 'Waiting for work from SQL thread'; +--source include/wait_condition.inc + +--echo # Lock t1 on slave so the first received transaction does not complete/commit +LOCK TABLES t1 WRITE; + +--connection master +--let $ts_t1_before_master_ins= `SELECT UNIX_TIMESTAMP()` +--eval insert into t1 values ($insert_ctr) +--inc $insert_ctr +--source include/save_master_gtid.inc + +--connection slave +--echo # Waiting for first transaction to begin.. +--let $wait_condition= SELECT count(*) FROM information_schema.processlist WHERE state LIKE 'Waiting for table metadata lock'; +--source include/wait_condition.inc + +--let $sbm_1= query_get_value(SHOW SLAVE STATUS, Seconds_Behind_Master, 1) + +--connection master +--let $sleep = 2 +--echo # Sleep $sleep sec to create a gap between events +sleep $sleep; +INSERT INTO t2 VALUES (1); +--source include/save_master_gtid.inc + +--connection slave +--echo # Waiting for second transaction to begin.. +--let $wait_condition= SELECT count(*) FROM information_schema.processlist WHERE state LIKE 'Waiting for prior transaction to start commit%'; +--source include/wait_condition.inc + +--let $sbm_2= query_get_value(SHOW SLAVE STATUS, Seconds_Behind_Master, 1) + +if (`SELECT $sbm_1 + $sleep > $sbm_2`) +{ + --echo # Seconds_Behind_Masters: $sbm_1 $sbm_2_0 + --die Two successive Seconds_Behind_Master timestamps must be separated by the sleep parameter value or greater +} + +--connection slave +UNLOCK TABLES; +--source include/sync_with_master_gtid.inc + --echo # --echo # Cleanup ---echo # Reset master_delay ---source include/stop_slave.inc ---eval CHANGE MASTER TO master_delay=0 ---eval set @@GLOBAL.slave_parallel_threads=$old_slave_threads ---eval SET @@global.debug_dbug="$old_debug_dbug" -SET DEBUG_SYNC='RESET'; ---source include/start_slave.inc - --connection master -DROP TABLE t1; +DROP TABLE t1, t2; --source include/save_master_gtid.inc --connection slave --source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +--eval set @@GLOBAL.debug_dbug= "$save_dbug" +--evalp set @@GLOBAL.slave_parallel_mode= "$save_parallel_mode" +--source include/start_slave.inc --source include/rpl_end.inc ---echo # End of rpl_delayed_parallel_slave_sbm.test +--echo # End of rpl_parallel_sbm.test diff --git a/mysql-test/suite/rpl/t/rpl_parallel_seq.test b/mysql-test/suite/rpl/t/rpl_parallel_seq.test index 2a4fd96ff34..55113798d85 100644 --- a/mysql-test/suite/rpl/t/rpl_parallel_seq.test +++ b/mysql-test/suite/rpl/t/rpl_parallel_seq.test @@ -16,7 +16,9 @@ SET @@session.binlog_row_image=FULL; SET @@session.debug_dbug="+d,binlog_force_commit_id"; SET @commit_id=7; SET @@gtid_seq_no=100; +--disable_ps2_protocol SELECT NEXT VALUE FOR s1; +--enable_ps2_protocol INSERT INTO s1 VALUES(2, 1, 10, 1, 2, 1, 1, 0); SET @@session.debug_dbug=""; @@ -77,15 +79,28 @@ SET DEBUG_SYNC = 'now SIGNAL continue_worker'; --source include/stop_slave.inc RESET MASTER; SET @@global.gtid_slave_pos=""; ---let $slave_gtid_strict_mode=`select @@global.gtid_strict_mode` -SET @@global.gtid_strict_mode=1; --connection master RESET MASTER; # Load from master CREATE TABLE ti (a INT) ENGINE=innodb; CREATE SEQUENCE s2 ENGINE=innodb; +--source include/save_master_gtid.inc +--connection slave +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc +--source include/stop_slave.inc +--let $rpl_server_number= 2 +--source include/rpl_restart_server.inc +# upon restart +SET @@global.slave_parallel_threads=2; +SET @@global.slave_parallel_mode=optimistic; +SET @@global.debug_dbug="+d,hold_worker_on_schedule"; +--let $slave_gtid_strict_mode=`select @@global.gtid_strict_mode` +SET @@global.gtid_strict_mode=1; + +--connection master SET @@gtid_seq_no=100; ALTER SEQUENCE s2 restart with 1; INSERT INTO ti SET a=1; @@ -93,6 +108,10 @@ INSERT INTO ti SET a=1; SELECT @@global.gtid_binlog_state "Master gtid state"; --connection slave +# The following FT complicates the opening table time with committing +# an internal transaction. The rest of the test also proves +# MDEV-31503 "branch" of the OOO error is fixed. +SET STATEMENT sql_log_bin=0 FOR FLUSH TABLES; --source include/start_slave.inc --let $wait_condition= SELECT count(*) = 1 FROM information_schema.processlist WHERE state LIKE "Waiting for prior transaction to commit" diff --git a/mysql-test/suite/rpl/t/rpl_read_only.test b/mysql-test/suite/rpl/t/rpl_read_only.test index c4781bbbb3b..6f53221bfa2 100644 --- a/mysql-test/suite/rpl/t/rpl_read_only.test +++ b/mysql-test/suite/rpl/t/rpl_read_only.test @@ -117,6 +117,33 @@ insert into t1 values(1006); --error ER_OPTION_PREVENTS_STATEMENT insert into t2 values(2006); + +--echo # +--echo # MDEV-30978: On slave XA COMMIT/XA ROLLBACK fail to return an error in read-only mode +--echo # +--echo # Where a read-only server permits writes through replication, it +--echo # should not permit user connections to commit/rollback XA transactions +--echo # prepared via replication. This test ensure this behavior is prohibited +--echo # + +# Note: slave's read_only=1 is set prior to this test case + +connection master; +xa start '1'; +insert into t1 values (1007); +xa end '1'; +xa prepare '1'; +sync_slave_with_master; + +connection slave2; +--error ER_OPTION_PREVENTS_STATEMENT +xa commit '1'; +--error ER_OPTION_PREVENTS_STATEMENT +xa rollback '1'; + +connection master; +xa rollback '1'; + ## Cleanup connection master; drop user test; diff --git a/mysql-test/suite/rpl/t/rpl_rotate_logs.test b/mysql-test/suite/rpl/t/rpl_rotate_logs.test index 0d65a05bf50..4dd58931cd9 100644 --- a/mysql-test/suite/rpl/t/rpl_rotate_logs.test +++ b/mysql-test/suite/rpl/t/rpl_rotate_logs.test @@ -20,6 +20,9 @@ connect (master,localhost,root,,test,$MASTER_MYPORT,$MASTER_MYSOCK); connect (slave,localhost,root,,test,$SLAVE_MYPORT,$SLAVE_MYSOCK); +# Reset the GTID position explicitly (since we're not using rpl_init.inc). +SET GLOBAL gtid_slave_pos= ""; + # Create empty file let $MYSQLD_SLAVE_DATADIR= `select @@datadir`; write_file $MYSQLD_SLAVE_DATADIR/master.info; diff --git a/mysql-test/suite/rpl/t/rpl_row_func001.test b/mysql-test/suite/rpl/t/rpl_row_func001.test index 6ff97388b31..2327ba9a48c 100644 --- a/mysql-test/suite/rpl/t/rpl_row_func001.test +++ b/mysql-test/suite/rpl/t/rpl_row_func001.test @@ -33,8 +33,10 @@ return 0; end// delimiter ;// +--disable_ps2_protocol select test.f1(1); select test.f1(2); +--enable_ps2_protocol select * from test.t1; save_master_pos; diff --git a/mysql-test/suite/rpl/t/rpl_row_mixing_engines.test b/mysql-test/suite/rpl/t/rpl_row_mixing_engines.test index c1a13cd9e52..5aa4f2c9925 100644 --- a/mysql-test/suite/rpl/t/rpl_row_mixing_engines.test +++ b/mysql-test/suite/rpl/t/rpl_row_mixing_engines.test @@ -4,6 +4,8 @@ ################################################################################### --source include/have_binlog_format_row.inc --source include/have_innodb.inc +# MDEV-31790 FIXME: This test is extremely slow +--source include/not_msan.inc --source include/master-slave.inc let $engine_type=Innodb; diff --git a/mysql-test/suite/rpl/t/rpl_seconds_behind_master_spike.test b/mysql-test/suite/rpl/t/rpl_seconds_behind_master_spike.test index d1bfbf25bae..d96863a14c2 100644 --- a/mysql-test/suite/rpl/t/rpl_seconds_behind_master_spike.test +++ b/mysql-test/suite/rpl/t/rpl_seconds_behind_master_spike.test @@ -27,7 +27,7 @@ --connection slave --source include/stop_slave.inc SET @save_dbug= @@GLOBAL.debug_dbug; -SET @@global.debug_dbug="+d,pause_sql_thread_on_fde"; +SET @@global.debug_dbug="+d,pause_sql_thread_on_fde,negate_clock_diff_with_master"; --source include/start_slave.inc --let $sleep_time=2 @@ -93,11 +93,93 @@ SET DEBUG_SYNC='now SIGNAL sql_thread_continue'; # Reset last sql_thread_continue signal SET DEBUG_SYNC='RESET'; + +--echo # +--echo # MDEV-29639 +--echo # When receiving an event after the SQL Thread idles, +--echo # Seconds_Behind_Master should not update before it updates +--echo # last_master_timestamp + +--connection slave +--source include/stop_slave.inc +set @@global.debug_dbug="+d,pause_sql_thread_on_next_event"; +--source include/start_slave.inc + +--connection master +insert into t1 values(2); +--source include/save_master_gtid.inc + +# Each event after starting will trigger a pause, so continually send signal +# sql_thread_continue until caught up +--connection slave +--let $caught_up=0 +--let $tries= 0 +set debug_sync='now wait_for paused_on_event'; +--disable_query_log +while (!$caught_up) +{ + set debug_sync='now signal sql_thread_continue'; + --let $slave_gtid= `SELECT @@global.gtid_slave_pos` + if (`SELECT strcmp("$master_pos","$slave_gtid") = 0`) + { + --inc $caught_up + } + --inc $tries + # Wait 30s + if (`SELECT $tries > 300`) + { + --die Replica failed to sync with primary + } + sleep 0.1; +} +--enable_query_log + +--connection master +--echo # Sleeping 1s to create a visible SBM gap between events +sleep 1; +insert into t1 values(3); +--source include/save_master_gtid.inc + +--connection slave +set debug_sync='now wait_for paused_on_event'; +--let $sbm= query_get_value(SHOW SLAVE STATUS, Seconds_Behind_Master, 1) + +if ($sbm) +{ + --echo # Expected Seconds_Behind_Master to be 0 but was $sbm + --die Seconds_Behind_Master should not show updates before last_master_timestamp is updated +} + +# Continually send signal sql_thread_continue until caught up +--let $caught_up=0 +--let $tries= 0 +--disable_query_log +while (!$caught_up) +{ + set debug_sync='now signal sql_thread_continue'; + --let $slave_gtid= `SELECT @@global.gtid_slave_pos` + if (`SELECT strcmp("$master_pos","$slave_gtid") = 0`) + { + --inc $caught_up + } + --inc $tries + # Wait 30s + if (`SELECT $tries > 300`) + { + --die Replica failed to sync with primary + } + sleep 0.1; +} +--enable_query_log + # Cleanup +--source include/stop_slave.inc +set debug_sync='RESET'; +SET @@global.debug_dbug=$save_dbug; +--source include/start_slave.inc +--source include/sync_with_master_gtid.inc + --connection master DROP TABLE t1; ---connection slave -SET @@global.debug_dbug=$save_dbug; - --source include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_slow_query_log.test b/mysql-test/suite/rpl/t/rpl_slow_query_log.test index 558d28b6e60..2d5d08a4600 100644 --- a/mysql-test/suite/rpl/t/rpl_slow_query_log.test +++ b/mysql-test/suite/rpl/t/rpl_slow_query_log.test @@ -49,6 +49,7 @@ TRUNCATE mysql.slow_log; source include/start_slave.inc; +--disable_ps2_protocol connection master; CREATE TABLE t1 (a int, b int); @@ -341,3 +342,4 @@ DROP TABLE t1; SET @@global.log_output= @old_log_output; SET @@global.long_query_time= @old_long_query_time; --source include/rpl_end.inc +--enable_ps2_protocol diff --git a/mysql-test/suite/rpl/t/rpl_sp.test b/mysql-test/suite/rpl/t/rpl_sp.test index c68c76caf41..12619a00cd1 100644 --- a/mysql-test/suite/rpl/t/rpl_sp.test +++ b/mysql-test/suite/rpl/t/rpl_sp.test @@ -195,7 +195,9 @@ end| delimiter ;| delete t1,t2 from t1,t2; +--disable_ps2_protocol select fn1(20); +--enable_ps2_protocol insert into t2 values(fn1(21)); --sorted_result select * from t1; diff --git a/mysql-test/suite/rpl/t/rpl_sp_effects.test b/mysql-test/suite/rpl/t/rpl_sp_effects.test index 05bd49330ed..08d806b1b3c 100644 --- a/mysql-test/suite/rpl/t/rpl_sp_effects.test +++ b/mysql-test/suite/rpl/t/rpl_sp_effects.test @@ -91,7 +91,9 @@ SELECT * FROM t1 ORDER BY a; create table t2(a int); insert into t2 values (10),(11); +--disable_ps2_protocol SELECT a,f1(a) FROM t2 ORDER BY a; +--enable_ps2_protocol # This shouldn't put separate 'call f1(3)' into binlog: insert into t2 select f1(3); @@ -110,7 +112,9 @@ delete from t2; delete from t1; insert into t2 values(1),(2); create view v1 as select f1(a) as f from t2; +--disable_ps2_protocol select * from v1 order by f; +--enable_ps2_protocol SELECT 'master:',a FROM t1 ORDER BY a; sync_slave_with_master; @@ -192,7 +196,9 @@ delimiter ;// set @x=10; set @y=20; set @z=100; +--disable_ps2_protocol select f1(); +--enable_ps2_protocol set @x=30; call p1(); @@ -238,10 +244,12 @@ DELIMITER ;// call sp_bug26199(b'1110'); call sp_bug26199('\0'); +--disable_ps2_protocol select sf_bug26199(b'1111111'); SET STATEMENT sql_mode = '' FOR select sf_bug26199(b'101111111'); select sf_bug26199('\''); +--enable_ps2_protocol select hex(b) from t2; sync_slave_with_master; diff --git a/mysql-test/suite/rpl/t/rpl_stm_found_rows.test b/mysql-test/suite/rpl/t/rpl_stm_found_rows.test index 9d76879a4ac..c1b7e02319b 100644 --- a/mysql-test/suite/rpl/t/rpl_stm_found_rows.test +++ b/mysql-test/suite/rpl/t/rpl_stm_found_rows.test @@ -35,14 +35,18 @@ SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1; # Instead of # INSERT INTO logtbl VALUES(1, 1, FOUND_ROWS()); # we write +--disable_ps2_protocol SELECT FOUND_ROWS() INTO @a; +--enable_ps2_protocol INSERT INTO logtbl VALUES(1,1,@a); SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a < 5 ORDER BY a LIMIT 1; # Instead of # INSERT INTO logtbl VALUES(1, 2, FOUND_ROWS()); # we write +--disable_ps2_protocol SELECT FOUND_ROWS() INTO @a; +--enable_ps2_protocol INSERT INTO logtbl VALUES(1,2,@a); SELECT * FROM logtbl WHERE sect = 1 ORDER BY sect,test; @@ -78,7 +82,9 @@ END $$ --delimiter ; SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1; +--disable_ps2_protocol SELECT FOUND_ROWS() INTO @found_rows; +--enable_ps2_protocol CALL just_log(2,3,@found_rows); SELECT * FROM logtbl WHERE sect = 2 ORDER BY sect,test; @@ -98,8 +104,10 @@ END $$ --delimiter ; SELECT SQL_CALC_FOUND_ROWS * FROM t1 WHERE a > 5 ORDER BY a LIMIT 1; +--disable_ps2_protocol SELECT FOUND_ROWS() INTO @found_rows; SELECT log_rows(3,1,@found_rows), log_rows(3,2,@found_rows); +--enable_ps2_protocol SELECT * FROM logtbl WHERE sect = 3 ORDER BY sect,test; sync_slave_with_master; diff --git a/mysql-test/suite/rpl/t/rpl_stm_mixing_engines.test b/mysql-test/suite/rpl/t/rpl_stm_mixing_engines.test index 9cb440b6599..e8b52885624 100644 --- a/mysql-test/suite/rpl/t/rpl_stm_mixing_engines.test +++ b/mysql-test/suite/rpl/t/rpl_stm_mixing_engines.test @@ -4,6 +4,8 @@ ################################################################################### --source include/have_binlog_format_statement.inc --source include/have_innodb.inc +# MDEV-31790 FIXME: This test is extremely slow +--source include/not_msan.inc --source include/master-slave.inc let $engine_type=Innodb; diff --git a/mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test b/mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test index d814a257711..6b28e344447 100644 --- a/mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test +++ b/mysql-test/suite/rpl/t/rpl_switch_stm_row_mixed.test @@ -238,7 +238,9 @@ begin return 100; end| delimiter ;| +--disable_ps2_protocol select foo4(); +--enable_ps2_protocol prepare stmt1 from 'select foo4()'; execute stmt1; @@ -253,7 +255,9 @@ begin return 100; end| delimiter ;| +--disable_ps2_protocol select foo5(); +--enable_ps2_protocol prepare stmt1 from 'select foo5()'; execute stmt1; @@ -268,8 +272,10 @@ begin return 100; end| delimiter ;| +--disable_ps2_protocol select foo6("foo6_1_"); select foo6(concat("foo6_2_",SYS_GUID())); +--enable_ps2_protocol prepare stmt1 from 'select foo6(concat("foo6_3_",SYS_GUID()))'; execute stmt1; @@ -376,7 +382,9 @@ begin return 1; end| delimiter ;| +--disable_ps2_protocol select f("try_41_"); +--enable_ps2_protocol # Two operations which compensate each other except that their net # effect is that they advance the auto_increment counter of t2 on slave: sync_slave_with_master; @@ -386,7 +394,9 @@ delete from t2 where a>=2; connection master; # this is the call which didn't replicate well +--disable_ps2_protocol select f("try_42_"); +--enable_ps2_protocol sync_slave_with_master; # now use prepared statement and test again, just to see that the RBB @@ -410,7 +420,9 @@ connection master; create table t12 select * from t1; # save for comparing later drop table t1; create table t1 (a int, b varchar(100), key(a)); +--disable_ps2_protocol select f("try_45_"); +--enable_ps2_protocol # restore table's key create table t13 select * from t1; @@ -435,7 +447,9 @@ begin return 1; end| delimiter ;| +--disable_ps2_protocol select f1("try_46_"),f2("try_47_"); +--enable_ps2_protocol sync_slave_with_master; insert into t2 values(2,null),(3,null),(4,null); @@ -443,7 +457,9 @@ delete from t2 where a>=2; connection master; # Test with SELECT and INSERT +--disable_ps2_protocol select f1("try_48_"),f2("try_49_"); +--enable_ps2_protocol insert into t3 values(concat("try_50_",f1("try_51_"),f2("try_52_"))); sync_slave_with_master; @@ -460,7 +476,9 @@ begin return y; end| delimiter ;| +--disable_ps2_protocol select f1("try_53_"),f2("try_54_"); +--enable_ps2_protocol sync_slave_with_master; # And now, a normal statement with a trigger (no stored functions) diff --git a/mysql-test/suite/rpl/t/rpl_variables.test b/mysql-test/suite/rpl/t/rpl_variables.test index 1b83d5d57d7..f6e88c5ae61 100644 --- a/mysql-test/suite/rpl/t/rpl_variables.test +++ b/mysql-test/suite/rpl/t/rpl_variables.test @@ -468,8 +468,9 @@ BEGIN END| DELIMITER ;| +--disable_ps2_protocol SELECT func(); - +--enable_ps2_protocol --echo ==== Insert variables from a trigger ==== diff --git a/mysql-test/suite/rpl/t/rpl_variables_stm.test b/mysql-test/suite/rpl/t/rpl_variables_stm.test index 1cc3cde3280..ffbb3e7749a 100644 --- a/mysql-test/suite/rpl/t/rpl_variables_stm.test +++ b/mysql-test/suite/rpl/t/rpl_variables_stm.test @@ -372,9 +372,11 @@ BEGIN END| DELIMITER ;| +--disable_ps2_protocol --disable_warnings SELECT func(); --enable_warnings +--enable_ps2_protocol --echo ==== Insert variables from a trigger ==== diff --git a/mysql-test/suite/rpl/t/rpl_view_multi.test b/mysql-test/suite/rpl/t/rpl_view_multi.test index c8af44bfc6e..50b9c184d91 100644 --- a/mysql-test/suite/rpl/t/rpl_view_multi.test +++ b/mysql-test/suite/rpl/t/rpl_view_multi.test @@ -27,6 +27,7 @@ drop view if exists v1; --echo # Syncing slave with master --sync_slave_with_master +--disable_ps2_protocol connect (master2,127.0.0.1,root,,test,$MASTER_MYPORT,); connection master; @@ -122,6 +123,7 @@ select * from t2; --echo # So we have same result on slave. select * from t1; select * from t2; +--enable_ps2_protocol connection master; drop table t1, t2; diff --git a/mysql-test/suite/rpl/t/sequence.test b/mysql-test/suite/rpl/t/sequence.test index 436a0b1cdab..5c6a8e1ea23 100644 --- a/mysql-test/suite/rpl/t/sequence.test +++ b/mysql-test/suite/rpl/t/sequence.test @@ -27,7 +27,9 @@ set @@default_storage_engine="aria"; CREATE SEQUENCE s1 cache=10; create table t1 select * from s1; +--disable_ps2_protocol select NEXT VALUE for s1,seq from seq_1_to_20; +--enable_ps2_protocol insert into t1 select * from s1; do setval(s1,5, 1, 0); insert into t1 select * from s1; diff --git a/mysql-test/suite/sql_sequence/alter.test b/mysql-test/suite/sql_sequence/alter.test index 3ad9821b0cf..dab0e665950 100644 --- a/mysql-test/suite/sql_sequence/alter.test +++ b/mysql-test/suite/sql_sequence/alter.test @@ -7,6 +7,7 @@ drop table if exists t1; --echo # Test alter sequence --echo # +--disable_ps2_protocol CREATE SEQUENCE t1 nocache engine=myisam; select * from t1; select next value for t1; @@ -173,3 +174,5 @@ SHOW CREATE SEQUENCE s2; DROP SEQUENCE s2; RENAME TABLE s1 TO s2; DROP SEQUENCE s2; + +--enable_ps2_protocol diff --git a/mysql-test/suite/sql_sequence/alter_notembedded.test b/mysql-test/suite/sql_sequence/alter_notembedded.test index a7c37b53473..5bd54a7c721 100644 --- a/mysql-test/suite/sql_sequence/alter_notembedded.test +++ b/mysql-test/suite/sql_sequence/alter_notembedded.test @@ -10,6 +10,7 @@ create database s_db; create sequence s_db.s1; grant select on s_db.s1 to normal_1@'%' identified by 'pass'; +--disable_ps2_protocol connect(m_normal_1, localhost, normal_1, pass, s_db); select * from s1; --error ER_TABLEACCESS_DENIED_ERROR @@ -30,6 +31,7 @@ alter sequence s1 restart 50; select nextval(s1); --error ER_TABLEACCESS_DENIED_ERROR drop sequence s1; +--enable_ps2_protocol connection default; disconnect m_normal_1; diff --git a/mysql-test/suite/sql_sequence/aria.test b/mysql-test/suite/sql_sequence/aria.test index 8e8a50ef412..daca8aff71c 100644 --- a/mysql-test/suite/sql_sequence/aria.test +++ b/mysql-test/suite/sql_sequence/aria.test @@ -8,6 +8,7 @@ set @@default_storage_engine="aria"; +--disable_ps2_protocol CREATE SEQUENCE t1 cache=10; show create sequence t1; select NEXT VALUE for t1,seq from seq_1_to_20; @@ -41,3 +42,4 @@ select next value for t2; alter table t2 rename to t1; select next value for t1; drop table t1; +--enable_ps2_protocol diff --git a/mysql-test/suite/sql_sequence/auto_increment.test b/mysql-test/suite/sql_sequence/auto_increment.test index 335bef7ea37..11f772b67b9 100644 --- a/mysql-test/suite/sql_sequence/auto_increment.test +++ b/mysql-test/suite/sql_sequence/auto_increment.test @@ -4,6 +4,7 @@ # tests with auto_increment_increment and auto_increment_offset # +--disable_ps2_protocol set global auto_increment_increment= 2, auto_increment_offset= 2; create sequence s start with -3 minvalue= -1000 increment 0; @@ -24,6 +25,7 @@ select nextval(s); flush tables; select nextval(s); drop sequence s; +--enable_ps2_protocol # Clean up diff --git a/mysql-test/suite/sql_sequence/binlog.test b/mysql-test/suite/sql_sequence/binlog.test index 6a12e670a1e..70d28038a82 100644 --- a/mysql-test/suite/sql_sequence/binlog.test +++ b/mysql-test/suite/sql_sequence/binlog.test @@ -11,10 +11,12 @@ reset master; # get rid of previous tests binlog --enable_query_log create or replace sequence s1 cache 3; +--disable_ps2_protocol select next value for s1, minimum_value from s1 where maximum_value> 1; select next value for s1, minimum_value from s1 where maximum_value> 2; select next value for s1, minimum_value from s1 where maximum_value> 3; select next value for s1, minimum_value from s1 where maximum_value> 4; +--enable_ps2_protocol # # Alter sequence diff --git a/mysql-test/suite/sql_sequence/concurrent_create.test b/mysql-test/suite/sql_sequence/concurrent_create.test index b27a6d3bdb9..e9a61e63b78 100644 --- a/mysql-test/suite/sql_sequence/concurrent_create.test +++ b/mysql-test/suite/sql_sequence/concurrent_create.test @@ -69,7 +69,9 @@ FLUSH TABLES; --disconnect con1 --connection default +--disable_ps2_protocol SELECT NEXTVAL(s1); +--enable_ps2_protocol COMMIT; # Cleanup diff --git a/mysql-test/suite/sql_sequence/create.test b/mysql-test/suite/sql_sequence/create.test index 49b39fbb40c..f2ea1d69cc1 100644 --- a/mysql-test/suite/sql_sequence/create.test +++ b/mysql-test/suite/sql_sequence/create.test @@ -379,6 +379,7 @@ drop view v1; # CREATE TEMPORARY SEQUENCE # +--disable_ps2_protocol CREATE TEMPORARY SEQUENCE t1; select next value for t1; drop temporary table t1; @@ -411,6 +412,7 @@ select previous value for t1; drop temporary sequence t1; select previous value for t1; drop sequence t1; +--enable_ps2_protocol # # Check that we can't create anything with the sequence engine diff --git a/mysql-test/suite/sql_sequence/default.test b/mysql-test/suite/sql_sequence/default.test index 28eb71e39cc..f965089d992 100644 --- a/mysql-test/suite/sql_sequence/default.test +++ b/mysql-test/suite/sql_sequence/default.test @@ -29,10 +29,12 @@ INSERT into t1 values(default(a),10); INSERT into t1 values(default(a),default(a)); update t1 set a=default(a), b=12 where b=2; select * from t1; +--disable_ps2_protocol select default(a), a, b from t1; select * from s1; select * from t1 where default(a) > 0; select * from s1; +--enable_ps2_protocol --echo # --echo # View @@ -70,7 +72,9 @@ UNLOCK TABLES; LOCK TABLE t1 WRITE, s1 WRITE; insert into t1 (b) values (5),(6); +--disable_ps2_protocol select default(a) from t1; +--enable_ps2_protocol UNLOCK TABLES; LOCK TABLE t1 READ; diff --git a/mysql-test/suite/sql_sequence/grant.test b/mysql-test/suite/sql_sequence/grant.test index 3a911d79671..fb8a9f813a6 100644 --- a/mysql-test/suite/sql_sequence/grant.test +++ b/mysql-test/suite/sql_sequence/grant.test @@ -22,6 +22,7 @@ connect(read_write,localhost,read_write,,mysqltest_1); connect(alter,localhost,alter,,mysqltest_1); connect(only_alter, localhost, only_alter,,mysqltest_1); +--disable_ps2_protocol connection normal; create sequence s1; select next value for s1; @@ -52,6 +53,7 @@ select next value for s1; alter sequence s1 restart= 11; --error ER_TABLEACCESS_DENIED_ERROR select * from s1; +--enable_ps2_protocol # # Cleanup diff --git a/mysql-test/suite/sql_sequence/gtid.test b/mysql-test/suite/sql_sequence/gtid.test index 63ed7ec5264..230fbef8070 100644 --- a/mysql-test/suite/sql_sequence/gtid.test +++ b/mysql-test/suite/sql_sequence/gtid.test @@ -6,6 +6,7 @@ --source include/master-slave.inc --source include/have_innodb.inc +--disable_ps2_protocol connection master; create database s_db; grant all on s_db.* to normal_1@'%' identified by 'pass'; @@ -704,5 +705,6 @@ drop user normal_2@'%'; drop user normal_3@'%'; drop user normal_4@'%'; drop user normal_5@'%'; +--enable_ps2_protocol --source include/rpl_end.inc diff --git a/mysql-test/suite/sql_sequence/next.test b/mysql-test/suite/sql_sequence/next.test index a80f9fad561..18b52961a54 100644 --- a/mysql-test/suite/sql_sequence/next.test +++ b/mysql-test/suite/sql_sequence/next.test @@ -5,6 +5,7 @@ # Test sequence generation # +--disable_ps2_protocol CREATE SEQUENCE t1 start with 1 minvalue 1 maxvalue 10 increment by 1 cache 2 cycle; show create table t1; select next value for t1; @@ -297,3 +298,4 @@ SELECT SETVAL (v,0); UNLOCK TABLES; DROP VIEW v; +--disable_ps2_protocol diff --git a/mysql-test/suite/sql_sequence/other.test b/mysql-test/suite/sql_sequence/other.test index 639cc5c36b0..eaf54de455a 100644 --- a/mysql-test/suite/sql_sequence/other.test +++ b/mysql-test/suite/sql_sequence/other.test @@ -9,6 +9,7 @@ --echo # Create and check --echo # +--disable_ps2_protocol create sequence s1 engine=innodb; check table s1; select next value for s1; @@ -27,6 +28,7 @@ check table s1; select next value for s1; select * from s1; drop sequence s1; +--enable_ps2_protocol --echo # --echo # INSERT @@ -45,7 +47,9 @@ insert into s1 values(0,9223372036854775806,1,1,1,1000,0,0); select * from s1; insert into s1 values(1000,1,9223372036854775806,1,1,1000,0,0); select * from s1; +--disable_ps2_protocol select next value for s1; +--enable_ps2_protocol select * from s1; --error ER_SEQUENCE_INVALID_DATA insert into s2 values(0, 1, 10, 1, 2, 1, 1, 0); @@ -98,6 +102,7 @@ drop table s1; --echo # Many sequence calls with innodb --echo # +--disable_ps2_protocol create sequence s1 cache=1000 engine=innodb; start transaction; select count(nextval(s1)) from seq_1_to_2000; @@ -120,11 +125,13 @@ connection default; select * from s1; commit; drop sequence s1; +--enable_ps2_protocol --echo # --echo # Flush tables with read lock --echo # +--disable_ps2_protocol create sequence s1; select next value for s1; flush tables with read lock; @@ -134,6 +141,7 @@ create sequence s2; select next value for s1; unlock tables; drop sequence s1; +--enable_ps2_protocol --echo # --echo # MDEV-14761 diff --git a/mysql-test/suite/sql_sequence/read_only.test b/mysql-test/suite/sql_sequence/read_only.test index 73103384882..141a310c040 100644 --- a/mysql-test/suite/sql_sequence/read_only.test +++ b/mysql-test/suite/sql_sequence/read_only.test @@ -39,6 +39,8 @@ select * from s1; --let $restart_parameters= --source include/restart_mysqld.inc select * from s1; +--disable_ps2_protocol select next value for s1; +--enable_ps2_protocol select * from s1; drop sequence s1; diff --git a/mysql-test/suite/sql_sequence/replication.test b/mysql-test/suite/sql_sequence/replication.test index e26fde8a329..35feb3d8fd8 100644 --- a/mysql-test/suite/sql_sequence/replication.test +++ b/mysql-test/suite/sql_sequence/replication.test @@ -9,6 +9,7 @@ --source include/master-slave.inc --source include/have_innodb.inc +--disable_ps2_protocol connection master; create database s_db; use s_db; @@ -868,6 +869,7 @@ select * from t1; select * from s1; connection master; drop table t1,s1; +--enable_ps2_protocol # # Cleanup diff --git a/mysql-test/suite/sql_sequence/replication_mixed.test b/mysql-test/suite/sql_sequence/replication_mixed.test index 0096ab5acd8..4796c84835f 100644 --- a/mysql-test/suite/sql_sequence/replication_mixed.test +++ b/mysql-test/suite/sql_sequence/replication_mixed.test @@ -9,7 +9,9 @@ --echo # CREATE SEQUENCE s1 ENGINE=InnoDB; +--disable_ps2_protocol SELECT NEXTVAL(s1); +--enable_ps2_protocol CREATE TABLE t1 ENGINE=InnoDB SELECT LASTVAL(s1) AS a; INSERT INTO t1 VALUES (NEXTVAL(s1)); INSERT INTO t1 VALUES (LASTVAL(s1)); diff --git a/mysql-test/suite/sql_sequence/setval.test b/mysql-test/suite/sql_sequence/setval.test index 1993bdbe077..712e7a77be7 100644 --- a/mysql-test/suite/sql_sequence/setval.test +++ b/mysql-test/suite/sql_sequence/setval.test @@ -7,6 +7,7 @@ drop table if exists t1; --echo # Test setval function --echo # +--disable_ps2_protocol CREATE SEQUENCE t1 cache 10 engine=myisam; select next_not_cached_value,cycle_count from t1; do setval(t1,10); @@ -151,6 +152,6 @@ SELECT SETVAL(s, 10); # Cleanup DROP SEQUENCE s; - +--enable_ps2_protocol --echo # End of 10.3 tests diff --git a/mysql-test/suite/sql_sequence/slave_nextval.test b/mysql-test/suite/sql_sequence/slave_nextval.test index 70da1044540..41aca150625 100644 --- a/mysql-test/suite/sql_sequence/slave_nextval.test +++ b/mysql-test/suite/sql_sequence/slave_nextval.test @@ -5,6 +5,7 @@ # MDEV-14092 NEXTVAL() fails on slave # +--disable_ps2_protocol CREATE SEQUENCE s; INSERT INTO s VALUES (1,1,4,1,1,1,0,0); show create sequence s; @@ -125,6 +126,7 @@ END $ --connection master DROP SEQUENCE s; DROP PROCEDURE pr; +--enable_ps2_protocol # # Cleanup diff --git a/mysql-test/suite/sql_sequence/temporary.test b/mysql-test/suite/sql_sequence/temporary.test index aeacf6e9497..e57dc693304 100644 --- a/mysql-test/suite/sql_sequence/temporary.test +++ b/mysql-test/suite/sql_sequence/temporary.test @@ -11,7 +11,9 @@ create temporary sequence s1 engine=innodb; alter table s1 engine myisam; +--disable_ps2_protocol select nextval(s1); +--enable_ps2_protocol select * from s1; drop temporary sequence s1; @@ -28,6 +30,7 @@ DROP TEMPORARY SEQUENCE s1; --echo # MDEV-13007 ALTER .. ENGINE on temporary sequence may go wrong --echo # +--disable_ps2_protocol create temporary sequence s1 engine=aria; alter table s1 engine myisam; select nextval(s1); @@ -41,3 +44,4 @@ alter table s1 engine innodb; select nextval(s1); select nextval(s1); drop temporary sequence s1; +--enable_ps2_protocol diff --git a/mysql-test/suite/sql_sequence/view.test b/mysql-test/suite/sql_sequence/view.test index 5b970432a34..affac002878 100644 --- a/mysql-test/suite/sql_sequence/view.test +++ b/mysql-test/suite/sql_sequence/view.test @@ -8,9 +8,11 @@ create sequence s1; create view v1 as select * from s1; create view v2 as select next value for s1; +--disable_ps2_protocol select * from v1; select * from v2; select * from v2; +--enable_ps2_protocol --error ER_NOT_SEQUENCE select next value for v1; drop sequence s1; diff --git a/mysql-test/suite/sys_vars/r/aria_sort_buffer_size_basic.result b/mysql-test/suite/sys_vars/r/aria_sort_buffer_size_basic.result index b2a87db3f8c..6da4c9bfe97 100644 --- a/mysql-test/suite/sys_vars/r/aria_sort_buffer_size_basic.result +++ b/mysql-test/suite/sys_vars/r/aria_sort_buffer_size_basic.result @@ -22,13 +22,13 @@ Warnings: Warning 1292 Truncated incorrect aria_sort_buffer_size value: '10' select @@global.aria_sort_buffer_size; @@global.aria_sort_buffer_size -4096 +16376 set session aria_sort_buffer_size=10; Warnings: Warning 1292 Truncated incorrect aria_sort_buffer_size value: '10' select @@session.aria_sort_buffer_size; @@session.aria_sort_buffer_size -4096 +16376 set global aria_sort_buffer_size=1.1; ERROR 42000: Incorrect argument type to variable 'aria_sort_buffer_size' set session aria_sort_buffer_size=1e1; @@ -40,9 +40,9 @@ Warnings: Warning 1292 Truncated incorrect aria_sort_buffer_size value: '0' select @@global.aria_sort_buffer_size; @@global.aria_sort_buffer_size -4096 +16376 set session aria_sort_buffer_size=cast(-1 as unsigned int); select @@session.aria_sort_buffer_size; @@session.aria_sort_buffer_size -9223372036854775807 +1152921504606846975 SET @@global.aria_sort_buffer_size = @start_global_value; diff --git a/mysql-test/suite/sys_vars/r/gtid_seq_no_basic.result b/mysql-test/suite/sys_vars/r/gtid_seq_no_basic.result index f0aa0d2ba97..855be9de503 100644 --- a/mysql-test/suite/sys_vars/r/gtid_seq_no_basic.result +++ b/mysql-test/suite/sys_vars/r/gtid_seq_no_basic.result @@ -8,6 +8,7 @@ SELECT @@session.gtid_seq_no; 20 SET GLOBAL gtid_seq_no= DEFAULT; ERROR HY000: Variable 'gtid_seq_no' is a SESSION variable and can't be used with SET GLOBAL +SET SESSION gtid_seq_no= DEFAULT; SET SESSION gtid_seq_no= -1; Warnings: Warning 1292 Truncated incorrect gtid_seq_no value: '-1' diff --git a/mysql-test/suite/sys_vars/r/myisam_sort_buffer_size_basic.result b/mysql-test/suite/sys_vars/r/myisam_sort_buffer_size_basic.result index 6fbbdac5a45..0acb7878a75 100644 --- a/mysql-test/suite/sys_vars/r/myisam_sort_buffer_size_basic.result +++ b/mysql-test/suite/sys_vars/r/myisam_sort_buffer_size_basic.result @@ -26,10 +26,10 @@ Warning 1292 Truncated incorrect myisam_sort_buffer_size value: '4' SELECT @@global.myisam_sort_buffer_size ; @@global.myisam_sort_buffer_size 4096 -SET @@global.myisam_sort_buffer_size = 4294967295; +SET @@global.myisam_sort_buffer_size = 268435455; SELECT @@global.myisam_sort_buffer_size ; @@global.myisam_sort_buffer_size -4294967295 +268435455 SET @@global.myisam_sort_buffer_size = 655354; SELECT @@global.myisam_sort_buffer_size ; @@global.myisam_sort_buffer_size @@ -41,10 +41,10 @@ Warning 1292 Truncated incorrect myisam_sort_buffer_size value: '4' SELECT @@session.myisam_sort_buffer_size ; @@session.myisam_sort_buffer_size 4096 -SET @@session.myisam_sort_buffer_size = 4294967295; +SET @@session.myisam_sort_buffer_size = 268435455; SELECT @@session.myisam_sort_buffer_size ; @@session.myisam_sort_buffer_size -4294967295 +268435455 SET @@session.myisam_sort_buffer_size = 655345; SELECT @@session.myisam_sort_buffer_size ; @@session.myisam_sort_buffer_size diff --git a/mysql-test/suite/sys_vars/r/sysvars_aria,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_aria,32bit.rdiff index f0cbbd874ee..6569d266695 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_aria,32bit.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_aria,32bit.rdiff @@ -97,9 +97,9 @@ @@ -212,7 +212,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE. - NUMERIC_MIN_VALUE 4096 --NUMERIC_MAX_VALUE 9223372036854775807 -+NUMERIC_MAX_VALUE 2147483647 + NUMERIC_MIN_VALUE 16376 +-NUMERIC_MAX_VALUE 1152921504606846975 ++NUMERIC_MAX_VALUE 268435455 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO diff --git a/mysql-test/suite/sys_vars/r/sysvars_aria.result b/mysql-test/suite/sys_vars/r/sysvars_aria.result index 181c0de74df..427eb83c949 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_aria.result +++ b/mysql-test/suite/sys_vars/r/sysvars_aria.result @@ -223,8 +223,8 @@ DEFAULT_VALUE 268434432 VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE. -NUMERIC_MIN_VALUE 4096 -NUMERIC_MAX_VALUE 9223372036854775807 +NUMERIC_MIN_VALUE 16376 +NUMERIC_MAX_VALUE 1152921504606846975 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff b/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff index a6bf0fb606a..e1b1981c75b 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded,32bit.rdiff @@ -95,9 +95,9 @@ @@ -207,7 +207,7 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE. - NUMERIC_MIN_VALUE 4096 --NUMERIC_MAX_VALUE 9223372036854775807 -+NUMERIC_MAX_VALUE 2147483647 + NUMERIC_MIN_VALUE 16376 +-NUMERIC_MAX_VALUE 1152921504606846975 ++NUMERIC_MAX_VALUE 268435455 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO @@ -652,8 +652,8 @@ VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE NUMERIC_MIN_VALUE 4096 --NUMERIC_MAX_VALUE 18446744073709551615 -+NUMERIC_MAX_VALUE 4294967295 +-NUMERIC_MAX_VALUE 1152921504606846975 ++NUMERIC_MAX_VALUE 268435455 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO 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 3376636d8ce..60e7f8c82c3 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_embedded.result @@ -216,8 +216,8 @@ VARIABLE_NAME ARIA_SORT_BUFFER_SIZE VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE. -NUMERIC_MIN_VALUE 4096 -NUMERIC_MAX_VALUE 9223372036854775807 +NUMERIC_MIN_VALUE 16376 +NUMERIC_MAX_VALUE 1152921504606846975 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO @@ -2127,7 +2127,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE NUMERIC_MIN_VALUE 4096 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 1152921504606846975 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO 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 a5789ed1ef5..6b40f68bbf6 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -216,8 +216,8 @@ VARIABLE_NAME ARIA_SORT_BUFFER_SIZE VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE. -NUMERIC_MIN_VALUE 4096 -NUMERIC_MAX_VALUE 9223372036854775807 +NUMERIC_MIN_VALUE 16376 +NUMERIC_MAX_VALUE 1152921504606846975 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO @@ -2297,7 +2297,7 @@ VARIABLE_SCOPE SESSION VARIABLE_TYPE BIGINT UNSIGNED VARIABLE_COMMENT The buffer that is allocated when sorting the index when doing a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE NUMERIC_MIN_VALUE 4096 -NUMERIC_MAX_VALUE 18446744073709551615 +NUMERIC_MAX_VALUE 1152921504606846975 NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO diff --git a/mysql-test/suite/sys_vars/r/wsrep_sst_donor_basic.result b/mysql-test/suite/sys_vars/r/wsrep_sst_donor_basic.result index 3d4fc24df7f..dbe4cc23bf9 100644 --- a/mysql-test/suite/sys_vars/r/wsrep_sst_donor_basic.result +++ b/mysql-test/suite/sys_vars/r/wsrep_sst_donor_basic.result @@ -33,17 +33,22 @@ SET @@global.wsrep_sst_donor=default; SELECT @@global.wsrep_sst_donor; @@global.wsrep_sst_donor -SET @@global.wsrep_sst_donor=NULL; +SET @@global.wsrep_sst_donor=''; SELECT @@global.wsrep_sst_donor; @@global.wsrep_sst_donor -NULL + # invalid values SET @@global.wsrep_sst_donor=1; ERROR 42000: Incorrect argument type to variable 'wsrep_sst_donor' SELECT @@global.wsrep_sst_donor; @@global.wsrep_sst_donor -NULL + +SET @@global.wsrep_sst_donor=NULL; +ERROR 42000: Variable 'wsrep_sst_donor' can't be set to the value of 'NULL' +SELECT @@global.wsrep_sst_donor; +@@global.wsrep_sst_donor + # restore the initial value SET @@global.wsrep_sst_donor = @wsrep_sst_donor_global_saved; diff --git a/mysql-test/suite/sys_vars/t/aria_sort_buffer_size_basic.test b/mysql-test/suite/sys_vars/t/aria_sort_buffer_size_basic.test index aa748778402..bf4106864ae 100644 --- a/mysql-test/suite/sys_vars/t/aria_sort_buffer_size_basic.test +++ b/mysql-test/suite/sys_vars/t/aria_sort_buffer_size_basic.test @@ -40,8 +40,7 @@ select @@global.aria_sort_buffer_size; --disable_warnings set session aria_sort_buffer_size=cast(-1 as unsigned int); --enable_warnings ---replace_result 4294967295 18446744073709551615 +--replace_result 4294967295 18446744073709551615 268435455 1152921504606846975 select @@session.aria_sort_buffer_size; SET @@global.aria_sort_buffer_size = @start_global_value; - diff --git a/mysql-test/suite/sys_vars/t/group_concat_max_len_func.test b/mysql-test/suite/sys_vars/t/group_concat_max_len_func.test index d90fc061289..4957afc0880 100644 --- a/mysql-test/suite/sys_vars/t/group_concat_max_len_func.test +++ b/mysql-test/suite/sys_vars/t/group_concat_max_len_func.test @@ -78,14 +78,17 @@ connect (test_con2,localhost,root,,); connection test_con1; --echo ## Accessing data and using group_concat on column whose value is greater than 4 ## +--disable_ps2_protocol SELECT id, rollno, GROUP_CONCAT(name) FROM t1 GROUP BY rollno; +--enable_ps2_protocol --echo ## Changing session value of variable and verifying its behavior, ## --echo ## warning should come here ## SET @@session.group_concat_max_len = 10; +--disable_ps2_protocol SELECT id, rollno, GROUP_CONCAT(name) FROM t1 GROUP BY rollno; - +--enable_ps2_protocol --echo '#--------------------FN_DYNVARS_034_03-------------------------#' ############################################################################## @@ -103,8 +106,9 @@ SET @@session.group_concat_max_len = 20; --echo ## Verifying value of name column, it should not me more than 20 characters ## --echo ## Warning should come here ## +--disable_ps2_protocol SELECT id, rollno, GROUP_CONCAT(name) FROM t1 GROUP BY rollno; - +--enable_ps2_protocol --echo '#--------------------FN_DYNVARS_034_04-------------------------#' ############################################################################### diff --git a/mysql-test/suite/sys_vars/t/gtid_seq_no_basic.test b/mysql-test/suite/sys_vars/t/gtid_seq_no_basic.test index db5768ac334..e93455337d6 100644 --- a/mysql-test/suite/sys_vars/t/gtid_seq_no_basic.test +++ b/mysql-test/suite/sys_vars/t/gtid_seq_no_basic.test @@ -9,5 +9,7 @@ SELECT @@session.gtid_seq_no; --error ER_LOCAL_VARIABLE SET GLOBAL gtid_seq_no= DEFAULT; +SET SESSION gtid_seq_no= DEFAULT; + SET SESSION gtid_seq_no= -1; SELECT @@session.gtid_seq_no; diff --git a/mysql-test/suite/sys_vars/t/log_disabled_statements_func.test b/mysql-test/suite/sys_vars/t/log_disabled_statements_func.test index a7a088cdcd9..1e5602eabf1 100644 --- a/mysql-test/suite/sys_vars/t/log_disabled_statements_func.test +++ b/mysql-test/suite/sys_vars/t/log_disabled_statements_func.test @@ -22,7 +22,9 @@ select @@log_disabled_statements; TRUNCATE TABLE mysql.general_log; check table t1; CALL slow(); +--disable_ps2_protocol SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part2'; +--enable_ps2_protocol --echo --> SELECT argument FROM mysql.general_log where command_type <> "Close stmt" and command_type <> "Prepare" and argument not like "%general_log%"; @@ -32,7 +34,9 @@ TRUNCATE TABLE mysql.general_log; SET SESSION log_disabled_statements=""; check table t1; CALL slow(); +--disable_ps2_protocol SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part3'; +--enable_ps2_protocol --echo --> SELECT argument FROM mysql.general_log where command_type <> "Close stmt" and command_type <> "Prepare" and argument not like "%general_log%"; @@ -42,7 +46,9 @@ TRUNCATE TABLE mysql.general_log; SET SESSION log_disabled_statements="sp,slave"; check table t1; CALL slow(); +--disable_ps2_protocol SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part4'; +--enable_ps2_protocol --echo --> SELECT argument FROM mysql.general_log where command_type <> "Close stmt" and command_type <> "Prepare" and argument not like "%general_log%"; diff --git a/mysql-test/suite/sys_vars/t/log_slow_admin_statements_func.test b/mysql-test/suite/sys_vars/t/log_slow_admin_statements_func.test index 97822a0f23a..b8a76a84bbd 100644 --- a/mysql-test/suite/sys_vars/t/log_slow_admin_statements_func.test +++ b/mysql-test/suite/sys_vars/t/log_slow_admin_statements_func.test @@ -50,7 +50,9 @@ CHECK TABLE log_slow_admin_statements EXTENDED; DROP TABLE log_slow_admin_statements; # ALTER, OPTIMIZE, CHECK and DROP operations should be logged in slow query log. +--disable_ps2_protocol SELECT sql_text FROM mysql.slow_log WHERE sql_text LIKE '%TABLE log_slow_admin_statements%'; +--enable_ps2_protocol SET @@global.log_output= @old_log_output; SET @@global.slow_query_log= @old_slow_query_log; diff --git a/mysql-test/suite/sys_vars/t/log_slow_disabled_statements_func.test b/mysql-test/suite/sys_vars/t/log_slow_disabled_statements_func.test index 483948c840e..db9bc8fb48f 100644 --- a/mysql-test/suite/sys_vars/t/log_slow_disabled_statements_func.test +++ b/mysql-test/suite/sys_vars/t/log_slow_disabled_statements_func.test @@ -38,6 +38,7 @@ DELIMITER ;$ SET SESSION long_query_time = 0; +--disable_ps2_protocol SELECT @@log_slow_disabled_statements; TRUNCATE TABLE mysql.slow_log; ALTER TABLE t1 add column extra int; @@ -77,6 +78,7 @@ SELECT count(if(sleep(1) >= 0,0,NULL)) from t1 where j>'b and part5'; --echo --> SELECT sql_text FROM mysql.slow_log where sql_text <> "Close stmt" and sql_text <> "Prepare"; --echo <-- +--enable_ps2_protocol DROP TABLE t1,t2; DROP PROCEDURE slow; diff --git a/mysql-test/suite/sys_vars/t/myisam_sort_buffer_size_basic.test b/mysql-test/suite/sys_vars/t/myisam_sort_buffer_size_basic.test index 81ff81ae935..ac1e9d615af 100644 --- a/mysql-test/suite/sys_vars/t/myisam_sort_buffer_size_basic.test +++ b/mysql-test/suite/sys_vars/t/myisam_sort_buffer_size_basic.test @@ -61,7 +61,7 @@ SELECT @@session.myisam_sort_buffer_size = @default_myisam_sort_buffer_size; SET @@global.myisam_sort_buffer_size = 4; SELECT @@global.myisam_sort_buffer_size ; -SET @@global.myisam_sort_buffer_size = 4294967295; +SET @@global.myisam_sort_buffer_size = 268435455; SELECT @@global.myisam_sort_buffer_size ; SET @@global.myisam_sort_buffer_size = 655354; @@ -76,7 +76,7 @@ SELECT @@global.myisam_sort_buffer_size ; SET @@session.myisam_sort_buffer_size = 4; SELECT @@session.myisam_sort_buffer_size ; -SET @@session.myisam_sort_buffer_size = 4294967295; +SET @@session.myisam_sort_buffer_size = 268435455; SELECT @@session.myisam_sort_buffer_size ; SET @@session.myisam_sort_buffer_size = 655345; @@ -96,33 +96,32 @@ SELECT @@global.myisam_sort_buffer_size ; --disable_warnings SET @@global.myisam_sort_buffer_size = 429496729533; --enable_warnings ---replace_result 429496729533 4294967295 +--replace_result 429496729533 4294967295 268435455 4294967295 SELECT @@global.myisam_sort_buffer_size ; - --Error ER_WRONG_TYPE_FOR_VAR SET @@global.myisam_sort_buffer_size = 65530.34; ---replace_result 429496729533 4294967295 +--replace_result 429496729533 4294967295 268435455 4294967295 SELECT @@global.myisam_sort_buffer_size ; --Error ER_WRONG_TYPE_FOR_VAR SET @@global.myisam_sort_buffer_size = test; ---replace_result 429496729533 4294967295 +--replace_result 429496729533 4294967295 268435455 4294967295 SELECT @@global.myisam_sort_buffer_size ; --Error ER_WRONG_TYPE_FOR_VAR SET @@global.myisam_sort_buffer_size = "test"; ---replace_result 429496729533 4294967295 +--replace_result 429496729533 4294967295 268435455 4294967295 SELECT @@global.myisam_sort_buffer_size ; --Error ER_WRONG_TYPE_FOR_VAR SET @@global.myisam_sort_buffer_size = 'test'; ---replace_result 429496729533 4294967295 +--replace_result 429496729533 4294967295 268435455 4294967295 SELECT @@global.myisam_sort_buffer_size ; --Error ER_WRONG_TYPE_FOR_VAR SET @@global.myisam_sort_buffer_size = ON; ---replace_result 429496729533 4294967295 +--replace_result 429496729533 4294967295 268435455 4294967295 SELECT @@global.myisam_sort_buffer_size ; diff --git a/mysql-test/suite/sys_vars/t/query_cache_limit_func.test b/mysql-test/suite/sys_vars/t/query_cache_limit_func.test index c115524d49d..e0105c89866 100644 --- a/mysql-test/suite/sys_vars/t/query_cache_limit_func.test +++ b/mysql-test/suite/sys_vars/t/query_cache_limit_func.test @@ -114,7 +114,9 @@ SET @@GLOBAL.query_cache_limit = 0; #fetching results# --echo ** fetching results ** +--disable_ps2_protocol SELECT * FROM t; +--enable_ps2_protocol # Check status after setting value# --echo ** Check status after setting value ** diff --git a/mysql-test/suite/sys_vars/t/secure_file_priv.test b/mysql-test/suite/sys_vars/t/secure_file_priv.test index a8565375e45..d9dff17b5a0 100644 --- a/mysql-test/suite/sys_vars/t/secure_file_priv.test +++ b/mysql-test/suite/sys_vars/t/secure_file_priv.test @@ -25,7 +25,9 @@ my $protected_file= dirname($ENV{MYSQLTEST_VARDIR}).'/bug50373.txt'; # test runs). unlink $protected_file; open(FILE, ">", "$ENV{MYSQL_TMP_DIR}/bug50373.inc") or die; +print FILE "--disable_ps2_protocol\n"; print FILE "SELECT * FROM t1 INTO OUTFILE '".$protected_file."';\n"; +print FILE "--enable_ps2_protocol\n"; print FILE "DELETE FROM t1;\n"; print FILE "LOAD DATA INFILE '".$protected_file."' INTO TABLE t1;\n"; print FILE "SELECT * FROM t1;\n"; diff --git a/mysql-test/suite/sys_vars/t/sql_buffer_result_func.test b/mysql-test/suite/sys_vars/t/sql_buffer_result_func.test index 380f2568b9c..77f947c9913 100644 --- a/mysql-test/suite/sys_vars/t/sql_buffer_result_func.test +++ b/mysql-test/suite/sys_vars/t/sql_buffer_result_func.test @@ -51,14 +51,18 @@ SHOW STATUS LIKE 'Created_tmp_tables'; --enable_ps_protocol --echo Expected value : 0. +--disable_ps2_protocol SELECT * FROM t1; +--enable_ps2_protocol --disable_ps_protocol SHOW STATUS LIKE 'Created_tmp_tables'; --enable_ps_protocol --echo Expected value : 1. +--disable_ps2_protocol SELECT * FROM t1; +--enable_ps2_protocol --disable_ps_protocol SHOW STATUS LIKE 'Created_tmp_tables'; diff --git a/mysql-test/suite/sys_vars/t/tmp_disk_table_size_func.test b/mysql-test/suite/sys_vars/t/tmp_disk_table_size_func.test index 6b3d2e1fa1b..c78eac199c3 100644 --- a/mysql-test/suite/sys_vars/t/tmp_disk_table_size_func.test +++ b/mysql-test/suite/sys_vars/t/tmp_disk_table_size_func.test @@ -15,6 +15,7 @@ SET @start_tmp_disk_table_size=@@session.tmp_disk_table_size; set @@session.tmp_memory_table_size=1000; set @@session.tmp_disk_table_size=3000000; +--disable_ps2_protocol create table t1 (a int primary key, b varchar(2000)); insert into t1 select seq,repeat(char(mod(seq,62)+64),seq) from seq_1_to_2000; insert into t1 values (20000,"A"); @@ -25,3 +26,4 @@ set @@session.tmp_disk_table_size=1000000; select count(*) as c from t1 group by b having c>1; show status like "created_tmp_disk%"; drop table t1; +--enable_ps2_protocol diff --git a/mysql-test/suite/sys_vars/t/wsrep_sst_donor_basic.test b/mysql-test/suite/sys_vars/t/wsrep_sst_donor_basic.test index 7d3d6598557..c4b32bb8af6 100644 --- a/mysql-test/suite/sys_vars/t/wsrep_sst_donor_basic.test +++ b/mysql-test/suite/sys_vars/t/wsrep_sst_donor_basic.test @@ -27,7 +27,7 @@ SET @@global.wsrep_sst_donor='hyphenated-donor-name'; SELECT @@global.wsrep_sst_donor; SET @@global.wsrep_sst_donor=default; SELECT @@global.wsrep_sst_donor; -SET @@global.wsrep_sst_donor=NULL; +SET @@global.wsrep_sst_donor=''; SELECT @@global.wsrep_sst_donor; --echo @@ -35,6 +35,9 @@ SELECT @@global.wsrep_sst_donor; --error ER_WRONG_TYPE_FOR_VAR SET @@global.wsrep_sst_donor=1; SELECT @@global.wsrep_sst_donor; +--error ER_WRONG_VALUE_FOR_VAR +SET @@global.wsrep_sst_donor=NULL; +SELECT @@global.wsrep_sst_donor; --echo --echo # restore the initial value diff --git a/mysql-test/suite/sysschema/t/v_schema_tables_with_full_table_scans.test b/mysql-test/suite/sysschema/t/v_schema_tables_with_full_table_scans.test index 1ada8284a26..80c43bb3ee5 100644 --- a/mysql-test/suite/sysschema/t/v_schema_tables_with_full_table_scans.test +++ b/mysql-test/suite/sysschema/t/v_schema_tables_with_full_table_scans.test @@ -48,9 +48,11 @@ CALL sys.ps_truncate_all_tables(false); # Following returns 28 rows, but should full scan as j has no index # Using RAND() to force no query caching, so ignore results, they are not important +--disable_ps2_protocol --disable_result_log SELECT i, j, RAND() FROM test.t WHERE j = 12; --enable_result_log +--enable_ps2_protocol # Ensure the base performance schema data is aggregated first --let $wait_condition= SELECT COUNT_STAR = 768 FROM performance_schema.table_io_waits_summary_by_index_usage WHERE object_schema = 'test' AND object_name = 't' AND index_name IS NULL @@ -62,9 +64,11 @@ SELECT object_schema, object_name, rows_full_scanned FROM sys.schema_tables_with SELECT object_schema, object_name, rows_full_scanned FROM sys.x$schema_tables_with_full_table_scans; # Scan again +--disable_ps2_protocol --disable_result_log SELECT i, j, RAND() FROM test.t WHERE j = 12; --enable_result_log +--enable_ps2_protocol # Again ensure the base performance schema data is aggregated first --let $wait_condition= SELECT COUNT_STAR = 1536 FROM performance_schema.table_io_waits_summary_by_index_usage WHERE object_schema = 'test' AND object_name = 't' AND index_name IS NULL diff --git a/mysql-test/suite/vcol/inc/vcol_trigger_sp.inc b/mysql-test/suite/vcol/inc/vcol_trigger_sp.inc index 8be139471f1..c7dedcdd74c 100644 --- a/mysql-test/suite/vcol/inc/vcol_trigger_sp.inc +++ b/mysql-test/suite/vcol/inc/vcol_trigger_sp.inc @@ -197,6 +197,7 @@ DELIMITER ;| --echo # Inserts set @a=0,@b=0,@c=0; +--disable_ps2_protocol insert into t1 (a) values(1); insert into t1 (a,b) values(2, "*2*"); insert into t1 (a,b,c) values(3, "*3*", "**3**"); @@ -219,6 +220,7 @@ update t1 set a=a+100, b=NULL where a=3; update t1 set a=a+100, b="invisible", c=NULL where a=4; select @a,@b,@c; select * from t1; +--enable_ps2_protocol drop trigger t1_ins; drop trigger t1_update; diff --git a/mysql-test/suite/vcol/r/innodb_virtual_fk.result b/mysql-test/suite/vcol/r/innodb_virtual_fk.result index 58db12583e2..5c0f717642f 100644 --- a/mysql-test/suite/vcol/r/innodb_virtual_fk.result +++ b/mysql-test/suite/vcol/r/innodb_virtual_fk.result @@ -10,3 +10,73 @@ select * from t2; id drop table t2; drop table t1; +# +# End of 10.2 tests +# +# +# MDEV-18114 Foreign Key Constraint actions don't affect Virtual Column +# +create table t1 (id int primary key); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update cascade); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on delete set null); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update set null); +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update cascade); +ERROR HY000: Function or expression 'id' cannot be used in the GENERATED ALWAYS AS clause of `id2` +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on delete set null); +ERROR HY000: Function or expression 'id' cannot be used in the GENERATED ALWAYS AS clause of `id2` +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update set null); +ERROR HY000: Function or expression 'id' cannot be used in the GENERATED ALWAYS AS clause of `id2` +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update cascade); +ERROR HY000: Function or expression 'id2' cannot be used in the GENERATED ALWAYS AS clause of `id3` +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on delete set null); +ERROR HY000: Function or expression 'id2' cannot be used in the GENERATED ALWAYS AS clause of `id3` +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update set null); +ERROR HY000: Function or expression 'id2' cannot be used in the GENERATED ALWAYS AS clause of `id3` +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update cascade); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on delete set null); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update set null); +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update cascade); +ERROR HY000: Function or expression 'id' cannot be used in the CHECK clause of `id2` +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on delete set null); +ERROR HY000: Function or expression 'id' cannot be used in the CHECK clause of `id2` +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update set null); +ERROR HY000: Function or expression 'id' cannot be used in the CHECK clause of `id2` +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update cascade); +ERROR HY000: Function or expression 'id' cannot be used in the CHECK clause of `CONSTRAINT_1` +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on delete set null); +ERROR HY000: Function or expression 'id' cannot be used in the CHECK clause of `CONSTRAINT_1` +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update set null); +ERROR HY000: Function or expression 'id' cannot be used in the CHECK clause of `CONSTRAINT_1` +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update cascade); +ERROR HY000: Function or expression 'id2' cannot be used in the CHECK clause of `CONSTRAINT_1` +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on delete set null); +ERROR HY000: Function or expression 'id2' cannot be used in the CHECK clause of `CONSTRAINT_1` +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update set null); +ERROR HY000: Function or expression 'id2' cannot be used in the CHECK clause of `CONSTRAINT_1` +drop table if exists t2, t1; +Warnings: +Note 1051 Unknown table 'test.t2' +# +# End of 10.5 tests +# diff --git a/mysql-test/suite/vcol/r/vcol_syntax.result b/mysql-test/suite/vcol/r/vcol_syntax.result index b5f20b19fa4..144d4ab335d 100644 --- a/mysql-test/suite/vcol/r/vcol_syntax.result +++ b/mysql-test/suite/vcol/r/vcol_syntax.result @@ -54,22 +54,22 @@ set session sql_mode=@OLD_SQL_MODE; # create table t2 (x int); create table t1 (x int, y int generated always as (t2.x)); -ERROR 42S22: Unknown column '`t2`.`x`' in 'GENERATED ALWAYS' +ERROR HY000: Function or expression 't2.x' cannot be used in the GENERATED ALWAYS AS clause of `y` create table t1 (x int, y int check (y > t2.x)); -ERROR 42S22: Unknown column '`t2`.`x`' in 'CHECK' +ERROR HY000: Function or expression 't2.x' cannot be used in the CHECK clause of `y` create table t1 (x int, y int default t2.x); -ERROR 42S22: Unknown column '`t2`.`x`' in 'DEFAULT' +ERROR HY000: Function or expression 't2.x' cannot be used in the DEFAULT clause of `y` create table t1 (x int, check (t2.x > 0)); -ERROR 42S22: Unknown column '`t2`.`x`' in 'CHECK' +ERROR HY000: Function or expression 't2.x' cannot be used in the CHECK clause of `CONSTRAINT_1` create table t1 (x int); alter table t1 add column y int generated always as (t2.x); -ERROR 42S22: Unknown column '`t2`.`x`' in 'GENERATED ALWAYS' +ERROR HY000: Function or expression 't2.x' cannot be used in the GENERATED ALWAYS AS clause of `y` alter table t1 add column y int check (z > t2.x); -ERROR 42S22: Unknown column '`t2`.`x`' in 'CHECK' +ERROR HY000: Function or expression 't2.x' cannot be used in the CHECK clause of `y` alter table t1 add column y int default t2.x; -ERROR 42S22: Unknown column '`t2`.`x`' in 'DEFAULT' +ERROR HY000: Function or expression 't2.x' cannot be used in the DEFAULT clause of `y` alter table t1 add constraint check (t2.x > 0); -ERROR 42S22: Unknown column '`t2`.`x`' in 'CHECK' +ERROR HY000: Function or expression 't2.x' cannot be used in the CHECK clause of `CONSTRAINT_1` create or replace table t1 (x int, y int generated always as (t1.x)); create or replace table t1 (x int, y int check (y > t1.x)); create or replace table t1 (x int, y int default t1.x); @@ -80,13 +80,13 @@ create or replace table t1 (x int, y int default test.t1.x); create or replace table t1 (x int, check (test.t1.x > 0)); drop tables t1, t2; create table t1 (x int, y int generated always as (test2.t1.x)); -ERROR 42S22: Unknown column '`test2`.`t1`.`x`' in 'GENERATED ALWAYS' +ERROR HY000: Function or expression 'test2.t1.x' cannot be used in the GENERATED ALWAYS AS clause of `y` create table t1 (x int, y int check (y > test2.t1.x)); -ERROR 42S22: Unknown column '`test2`.`t1`.`x`' in 'CHECK' +ERROR HY000: Function or expression 'test2.t1.x' cannot be used in the CHECK clause of `y` create table t1 (x int, y int default test2.t1.x); -ERROR 42S22: Unknown column '`test2`.`t1`.`x`' in 'DEFAULT' +ERROR HY000: Function or expression 'test2.t1.x' cannot be used in the DEFAULT clause of `y` create table t1 (x int, check (test2.t1.x > 0)); -ERROR 42S22: Unknown column '`test2`.`t1`.`x`' in 'CHECK' +ERROR HY000: Function or expression 'test2.t1.x' cannot be used in the CHECK clause of `CONSTRAINT_1` # # MDEV-25672 table alias from previous statement interferes later commands # @@ -197,3 +197,40 @@ Warnings: Warning 1292 Truncated incorrect DECIMAL value: 'x' Warning 1292 Truncated incorrect DECIMAL value: 'test' drop table t1; +# +# MDEV-31319 Assertion const_item_cache == true failed in Item_func::fix_fields +# +create table t (f1 int, f2 int, fv int generated always as (case user() when 'foo' or 'bar' then f1 else f2 end) virtual); +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'foo' +Warning 1292 Truncated incorrect DOUBLE value: 'bar' +select * from t; +f1 f2 fv +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'foo' +Warning 1292 Truncated incorrect DOUBLE value: 'bar' +create table tmp as select * from information_schema.tables where table_name = 't'; +select * from t; +f1 f2 fv +Warnings: +Warning 1292 Truncated incorrect DOUBLE value: 'foo' +Warning 1292 Truncated incorrect DOUBLE value: 'bar' +drop table t, tmp; +# +# MDEV-29357 Assertion (fixed) in Item_func_dayname on INSERT +# +set sql_mode=''; +create table t (c1 blob ,c2 int,c3 char(10) as (dayname (c2))); +create trigger tr before insert on t for each row set new.c2=0; +insert into t values (0, 0, 0); +Warnings: +Warning 1906 The value specified for generated column 'c3' in table 't' has been ignored +Warning 1292 Incorrect datetime value: '0' for column `test`.`t`.`c2` at row 1 +Warning 1292 Incorrect datetime value: '0' for column `test`.`t`.`c2` at row 1 +insert into t values (1, 1, 1); +Warnings: +Warning 1906 The value specified for generated column 'c3' in table 't' has been ignored +Warning 1292 Incorrect datetime value: '1' for column `test`.`t`.`c2` at row 1 +Warning 1292 Incorrect datetime value: '0' for column `test`.`t`.`c2` at row 1 +drop trigger tr; +drop table t; diff --git a/mysql-test/suite/vcol/t/innodb_virtual_fk.test b/mysql-test/suite/vcol/t/innodb_virtual_fk.test index c364adaa613..ed1d9c6c0cf 100644 --- a/mysql-test/suite/vcol/t/innodb_virtual_fk.test +++ b/mysql-test/suite/vcol/t/innodb_virtual_fk.test @@ -14,3 +14,92 @@ select * from t1; select * from t2; drop table t2; drop table t1; + +--echo # +--echo # End of 10.2 tests +--echo # + +--echo # +--echo # MDEV-18114 Foreign Key Constraint actions don't affect Virtual Column +--echo # +create table t1 (id int primary key); + +# note that RESTRICT, NO ACTION, and DELETE CASCADE are fine +# because they don't change values of referenced columns + +# virtual indexed +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update cascade); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on delete set null); +create or replace table t2 (id int, id2 int as (id) virtual, key(id2), foreign key (id) references t1 (id) on update set null); + +# stored +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on delete cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on delete set null); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) stored, foreign key (id) references t1 (id) on update set null); + +# stored indirect +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on delete cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on delete set null); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) virtual, id3 int as (id2) stored, foreign key (id) references t1 (id) on update set null); + +# default +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on delete cascade); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update cascade); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on delete set null); +create or replace table t2 (id int, id2 int default (id), foreign key (id) references t1 (id) on update set null); + +# field check +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on delete cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on delete set null); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int check (id), foreign key (id) references t1 (id) on update set null); + +# table check +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on delete cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on delete set null); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int, check (id), foreign key (id) references t1 (id) on update set null); + +# table check indirect +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update restrict); +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update no action); +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on delete cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update cascade); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on delete set null); +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED +create or replace table t2 (id int, id2 int as (id) virtual, check (id2), foreign key (id) references t1 (id) on update set null); + +drop table if exists t2, t1; + +--echo # +--echo # End of 10.5 tests +--echo # diff --git a/mysql-test/suite/vcol/t/load_data.test b/mysql-test/suite/vcol/t/load_data.test index f4b3b60397e..1b662818cd2 100644 --- a/mysql-test/suite/vcol/t/load_data.test +++ b/mysql-test/suite/vcol/t/load_data.test @@ -5,7 +5,9 @@ create table t1 ( c1 varchar(10), c2 varchar(10), c3 int ); insert into t1 values ("a" , "b", 1), ("a" , "b", 2); create table t2 like t1 ; alter table t2 add column c4 bigint unsigned as (CONV(LEFT(MD5(concat(c1,c2,c3)), 16), 16, 10)) persistent unique key; +--disable_ps2_protocol select * into outfile 't1.csv' from t1; +--enable_ps2_protocol load data infile 't1.csv' ignore into table t2 ; select * from t2; insert into t2 (c1,c2,c3) values ("a" , "b", 4); diff --git a/mysql-test/suite/vcol/t/vcol_keys_myisam.test b/mysql-test/suite/vcol/t/vcol_keys_myisam.test index b8cbf9ef705..ab75703f2a9 100644 --- a/mysql-test/suite/vcol/t/vcol_keys_myisam.test +++ b/mysql-test/suite/vcol/t/vcol_keys_myisam.test @@ -281,7 +281,9 @@ drop table t1; CREATE TABLE t1 (i INT, d1 DATE, d2 DATE NOT NULL, t TIMESTAMP, KEY(t)) ENGINE=MyISAM; INSERT INTO t1 VALUES (1,'2023-03-16','2023-03-15','2012-12-12 12:12:12'); ALTER TABLE t1 MODIFY t FLOAT AS (i) PERSISTENT; +--disable_ps2_protocol SELECT i, d1, d2 INTO OUTFILE 'load_t1' FROM t1; +--enable_ps2_protocol DELETE FROM t1; LOAD DATA INFILE 'load_t1' INTO TABLE t1 (i,d1,d2); SELECT * FROM t1 WHERE d2 < d1; diff --git a/mysql-test/suite/vcol/t/vcol_syntax.test b/mysql-test/suite/vcol/t/vcol_syntax.test index 198d61a13aa..da2ad27d37d 100644 --- a/mysql-test/suite/vcol/t/vcol_syntax.test +++ b/mysql-test/suite/vcol/t/vcol_syntax.test @@ -29,23 +29,23 @@ set session sql_mode=@OLD_SQL_MODE; --echo # create table t2 (x int); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, y int generated always as (t2.x)); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, y int check (y > t2.x)); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, y int default t2.x); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, check (t2.x > 0)); create table t1 (x int); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t1 add column y int generated always as (t2.x); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t1 add column y int check (z > t2.x); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t1 add column y int default t2.x; ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED alter table t1 add constraint check (t2.x > 0); create or replace table t1 (x int, y int generated always as (t1.x)); @@ -60,13 +60,13 @@ create or replace table t1 (x int, check (test.t1.x > 0)); drop tables t1, t2; ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, y int generated always as (test2.t1.x)); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, y int check (y > test2.t1.x)); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, y int default test2.t1.x); ---error ER_BAD_FIELD_ERROR +--error ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED create table t1 (x int, check (test2.t1.x > 0)); --echo # @@ -162,3 +162,26 @@ create table t1 (a int , b date as (1 in ('x' ,(database ()) ))) ; select b from t1; select a from t1 order by 'x' = b; drop table t1; + +--echo # +--echo # MDEV-31319 Assertion const_item_cache == true failed in Item_func::fix_fields +--echo # +create table t (f1 int, f2 int, fv int generated always as (case user() when 'foo' or 'bar' then f1 else f2 end) virtual); +select * from t; +create table tmp as select * from information_schema.tables where table_name = 't'; +select * from t; + +# cleanup +drop table t, tmp; + +--echo # +--echo # MDEV-29357 Assertion (fixed) in Item_func_dayname on INSERT +--echo # +set sql_mode=''; +create table t (c1 blob ,c2 int,c3 char(10) as (dayname (c2))); +create trigger tr before insert on t for each row set new.c2=0; +insert into t values (0, 0, 0); +insert into t values (1, 1, 1); + +drop trigger tr; +drop table t; diff --git a/mysql-test/suite/vcol/t/wrong_arena.test b/mysql-test/suite/vcol/t/wrong_arena.test index 296cb68f5c0..4b6f941563e 100644 --- a/mysql-test/suite/vcol/t/wrong_arena.test +++ b/mysql-test/suite/vcol/t/wrong_arena.test @@ -21,7 +21,10 @@ connect con1, localhost, root; disable_warnings; insert t1 (a) values ('2010-10-10 10:10:10'); enable_warnings; +#Enable after fix MDEV-31359 +--disable_ps2_protocol select * from t1; +--enable_ps2_protocol disconnect con1; connection default; disable_warnings; diff --git a/mysql-test/suite/versioning/common.inc b/mysql-test/suite/versioning/common.inc index aff6b9fbc2d..9b901846e9f 100644 --- a/mysql-test/suite/versioning/common.inc +++ b/mysql-test/suite/versioning/common.inc @@ -92,6 +92,18 @@ begin end~~ delimiter ;~~ +delimiter ~~; +eval create or replace function check_row_slave(row_start $sys_datatype_expl, row_end $sys_datatype_expl) +returns varchar(255) +deterministic +begin + if current_row(row_end) then + return "CURRENT ROW"; + end if; + return "HISTORICAL ROW"; +end~~ +delimiter ;~~ + delimiter ~~; eval create or replace function check_row_ts(row_start timestamp(6), row_end timestamp(6)) returns varchar(255) diff --git a/mysql-test/suite/versioning/common_finish.inc b/mysql-test/suite/versioning/common_finish.inc index 255daa1963a..503a692ffe6 100644 --- a/mysql-test/suite/versioning/common_finish.inc +++ b/mysql-test/suite/versioning/common_finish.inc @@ -4,6 +4,7 @@ drop procedure if exists verify_trt; drop procedure if exists verify_trt_dummy; drop function if exists current_row; drop function if exists check_row; +drop function if exists check_row_slave; drop function if exists current_row_ts; drop function if exists check_row_ts; set @@global.time_zone= default; diff --git a/mysql-test/suite/versioning/r/delete.result b/mysql-test/suite/versioning/r/delete.result index 6f8c8921790..89c1ef516eb 100644 --- a/mysql-test/suite/versioning/r/delete.result +++ b/mysql-test/suite/versioning/r/delete.result @@ -133,18 +133,38 @@ drop table t1; # # MDEV-21138 Assertion `col->ord_part' or `f.col->ord_part' failed in row_build_index_entry_low # +# Check DELETE and multi-DELETE with foreign key create table t1 ( f1 int, f2 text, f3 int, fulltext (f2), key(f1), key(f3), -foreign key r (f3) references t1 (f1) on delete set null) +foreign key r (f3) references t1 (f1) on delete set null, +row_start SYS_TYPE as row start invisible, +row_end SYS_TYPE as row end invisible, +period for system_time (row_start, row_end)) with system versioning engine innodb; insert into t1 values (1, repeat('a', 8193), 1), (1, repeat('b', 8193), 1); -select f1, f3, check_row_ts(row_start, row_end) from t1; -f1 f3 check_row_ts(row_start, row_end) +insert into t1 select 2, f2, 2 from t1; +select f1, f3, check_row(row_start, row_end) from t1; +f1 f3 check_row(row_start, row_end) 1 1 CURRENT ROW 1 1 CURRENT ROW -delete from t1; -select f1, f3, check_row_ts(row_start, row_end) from t1 for system_time all; -f1 f3 check_row_ts(row_start, row_end) +2 2 CURRENT ROW +2 2 CURRENT ROW +delete from t1 where f1 = 1; +select f1, f3, check_row(row_start, row_end) from t1 for system_time all order by f1, row_end; +f1 f3 check_row(row_start, row_end) 1 1 HISTORICAL ROW 1 1 HISTORICAL ROW -drop table t1; +2 2 CURRENT ROW +2 2 CURRENT ROW +create table t2 (f1 int); +insert into t2 values (2); +# Multi-delelte +delete t1, t2 from t1 join t2 where t1.f1 = t2.f1; +select f1, f3, check_row(row_start, row_end) from t1 for system_time all order by f1, row_end; +f1 f3 check_row(row_start, row_end) +1 1 HISTORICAL ROW +1 1 HISTORICAL ROW +2 2 HISTORICAL ROW +2 2 HISTORICAL ROW +# Cleanup +drop tables t1, t2; diff --git a/mysql-test/suite/versioning/r/partition.result b/mysql-test/suite/versioning/r/partition.result index fd2804cbf38..d20b77289d2 100644 --- a/mysql-test/suite/versioning/r/partition.result +++ b/mysql-test/suite/versioning/r/partition.result @@ -3413,4 +3413,17 @@ drop table t; create table t (a int) with system versioning partition by system_time interval 5 week; alter table t partition by system_time interval 10 week; drop table t; +# +# MDEV-29727 ALTER and CREATE with default partitioning +# differently react to SQL_MODE => unusable SHOW CREATE +# +create table t (a int) with system versioning; +alter table t partition by system_time partitions 3; +ERROR HY000: Maybe missing parameters: no rotation condition for multiple HISTORY partitions. +drop table t; +create table t (a int) with system versioning partition by system_time partitions 3; +ERROR HY000: Maybe missing parameters: no rotation condition for multiple HISTORY partitions. +# +# End of 10.5 tests +# set global innodb_stats_persistent= @save_persistent; diff --git a/mysql-test/suite/versioning/r/rpl.result b/mysql-test/suite/versioning/r/rpl.result index a4b87724760..4fb94907c7b 100644 --- a/mysql-test/suite/versioning/r/rpl.result +++ b/mysql-test/suite/versioning/r/rpl.result @@ -189,6 +189,55 @@ include/diff_tables.inc [master:test.t1,slave:test.t1] connection master; drop table t1; # +# MDEV-31313 SYSTEM VERSIONING and FOREIGN KEY CASCADE create orphan rows on replica +# +create table parent ( +id int(11) not null auto_increment, +processdate datetime default null, +primary key (id) +) engine=innodb with system versioning; +set timestamp= unix_timestamp('2000-01-01 00:00:00'); +insert into parent values (1, now()); +create table child ( +id int(11) not null auto_increment, +ch_name varchar(30), +andreid int(11) default null, +primary key (id), +key andreid (andreid), +constraint fk_andreid foreign key (andreid) references parent (id) on delete cascade +) engine=innodb with system versioning; +set timestamp= unix_timestamp('2000-01-01 00:00:01'); +insert into child values (null, 'vimtomar', 1); +set timestamp= unix_timestamp('2000-01-01 00:00:02'); +delete from parent where id = 1; +select check_row(row_start, row_end) from parent for system_time all; +check_row(row_start, row_end) +HISTORICAL ROW +select check_row(row_start, row_end) from child for system_time all; +check_row(row_start, row_end) +HISTORICAL ROW +select * from child; +id ch_name andreid +select * from parent; +id processdate +connection slave; +select check_row_slave(row_start, row_end) from parent for system_time all; +check_row_slave(row_start, row_end) +HISTORICAL ROW +select check_row_slave(row_start, row_end) from child for system_time all; +check_row_slave(row_start, row_end) +HISTORICAL ROW +select * from child; +id ch_name andreid +select * from parent; +id processdate +connection master; +set timestamp= default; +drop table child; +drop table parent; +connection slave; +connection master; +# # MDEV-17554 Auto-create new partition for system versioned tables # with history partitioned by INTERVAL/LIMIT # diff --git a/mysql-test/suite/versioning/r/update,trx_id.rdiff b/mysql-test/suite/versioning/r/update,trx_id.rdiff index 7ce75714235..18395507b71 100644 --- a/mysql-test/suite/versioning/r/update,trx_id.rdiff +++ b/mysql-test/suite/versioning/r/update,trx_id.rdiff @@ -1,6 +1,6 @@ ---- update.result 2018-12-19 13:55:35.873917389 +0300 -+++ update,trx_id.reject 2018-12-19 13:55:35.533917399 +0300 -@@ -81,12 +81,10 @@ +--- update.result ++++ update.reject +@@ -84,12 +84,10 @@ commit; select x, y, sys_trx_end = MAXVAL as current from t1 for system_time all order by sys_trx_end, x, y; x y current @@ -14,3 +14,11 @@ 1 1 1 2 2 1 3 3 1 +@@ -464,7 +462,6 @@ + select nid, nstate, check_row(row_start, row_end) from t1 for system_time all order by row_start, row_end; + nid nstate check_row(row_start, row_end) + 1 1 HISTORICAL ROW +-1 1 HISTORICAL ROW + 1 3 CURRENT ROW + commit; + drop tables t1; diff --git a/mysql-test/suite/versioning/r/update.result b/mysql-test/suite/versioning/r/update.result index f6a36ec9ce1..c439f5cf8f5 100644 --- a/mysql-test/suite/versioning/r/update.result +++ b/mysql-test/suite/versioning/r/update.result @@ -51,19 +51,22 @@ sys_trx_start SYS_DATATYPE as row start invisible, sys_trx_end SYS_DATATYPE as row end invisible, period for system_time (sys_trx_start, sys_trx_end)) with system versioning; +set timestamp= unix_timestamp('2000-01-01 00:00:00'); insert into t1 values(1, 1, 1); -set @ins_t= now(6); select sys_trx_start into @tmp1 from t1; +set timestamp= unix_timestamp('2000-01-01 01:00:00'); update t1 set x= 11, y= 11 where id = 1; select @tmp1 < sys_trx_start as A1, x, y from t1; A1 x y 1 11 11 select sys_trx_start into @tmp1 from t1; +set timestamp= unix_timestamp('2000-01-01 02:00:00'); update t1 set y= 1 where id = 1; select @tmp1 = sys_trx_start as A2, x from t1; A2 x 1 11 drop table t1; +set timestamp= default; create table t1 ( x int, y int, @@ -437,4 +440,46 @@ update t1 set a = 3 where b <= 9; update t2 set a = 3 where b <= 9; update t1, t2 set t1.a = 3, t2.a = 3 where t1.b <= 10 and t2.b <= 10 and t1.b = t2.b; drop tables t1, t2; +# +# MDEV-23100 ODKU of non-versioning column inserts history row +# +create table t1 ( +x int unique, +y int without system versioning +) with system versioning; +insert into t1 (x, y) values ('1', '1'); +insert into t1 (x, y) values ('1', '2') +on duplicate key update y = 3; +select x, y, check_row_ts(row_start, row_end) from t1 for system_time all order by row_end; +x y check_row_ts(row_start, row_end) +1 3 CURRENT ROW +drop table t1; +# +# MDEV-25644 UPDATE not working properly on transaction precise system versioned table +# +create or replace table t1 (nid int primary key, nstate int, ntype int) engine innodb; +alter table t1 add +row_start SYS_DATATYPE generated always as row start invisible, +add row_end SYS_DATATYPE generated always as row end invisible, +add period for system_time(row_start, row_end), +add system versioning; +insert into t1 values (1, 1, 1); +select nid, nstate, check_row(row_start, row_end) from t1 for system_time all order by row_start, row_end; +nid nstate check_row(row_start, row_end) +1 1 CURRENT ROW +start transaction; +update t1 set nstate= nstate where nid = 1; +select nid, nstate, check_row(row_start, row_end) from t1 for system_time all order by row_start, row_end; +nid nstate check_row(row_start, row_end) +1 1 HISTORICAL ROW +1 1 CURRENT ROW +# Bug: ERROR 1761 (23000): Foreign key constraint for table 'xxx', record '1-18446744073709551615' would lead to a duplicate entry in table 'xxx', key 'PRIMARY' +update t1 set nstate= 3 where nid= 1; +select nid, nstate, check_row(row_start, row_end) from t1 for system_time all order by row_start, row_end; +nid nstate check_row(row_start, row_end) +1 1 HISTORICAL ROW +1 1 HISTORICAL ROW +1 3 CURRENT ROW +commit; +drop tables t1; # End of 10.4 tests diff --git a/mysql-test/suite/versioning/t/delete.test b/mysql-test/suite/versioning/t/delete.test index a5a0497fef2..9debdcfec8c 100644 --- a/mysql-test/suite/versioning/t/delete.test +++ b/mysql-test/suite/versioning/t/delete.test @@ -97,16 +97,26 @@ drop table t1; --echo # --echo # MDEV-21138 Assertion `col->ord_part' or `f.col->ord_part' failed in row_build_index_entry_low --echo # -create table t1 ( +--echo # Check DELETE and multi-DELETE with foreign key +replace_result $sys_datatype_expl SYS_TYPE; +eval create table t1 ( f1 int, f2 text, f3 int, fulltext (f2), key(f1), key(f3), - foreign key r (f3) references t1 (f1) on delete set null) + foreign key r (f3) references t1 (f1) on delete set null, + row_start $sys_datatype_expl as row start invisible, + row_end $sys_datatype_expl as row end invisible, + period for system_time (row_start, row_end)) with system versioning engine innodb; insert into t1 values (1, repeat('a', 8193), 1), (1, repeat('b', 8193), 1); -select f1, f3, check_row_ts(row_start, row_end) from t1; -delete from t1; -select f1, f3, check_row_ts(row_start, row_end) from t1 for system_time all; - -# cleanup -drop table t1; +insert into t1 select 2, f2, 2 from t1; +select f1, f3, check_row(row_start, row_end) from t1; +delete from t1 where f1 = 1; +select f1, f3, check_row(row_start, row_end) from t1 for system_time all order by f1, row_end; +create table t2 (f1 int); +insert into t2 values (2); +--echo # Multi-delelte +delete t1, t2 from t1 join t2 where t1.f1 = t2.f1; +select f1, f3, check_row(row_start, row_end) from t1 for system_time all order by f1, row_end; +--echo # Cleanup +drop tables t1, t2; --source suite/versioning/common_finish.inc diff --git a/mysql-test/suite/versioning/t/foreign.test b/mysql-test/suite/versioning/t/foreign.test index c94cff540c6..5f228747108 100644 --- a/mysql-test/suite/versioning/t/foreign.test +++ b/mysql-test/suite/versioning/t/foreign.test @@ -398,15 +398,21 @@ INSERT INTO t2 VALUES (1,'against'),(2,'q'); SET SQL_MODE= ''; SET timestamp = 2; +--disable_ps2_protocol SELECT * INTO OUTFILE 't1.data' FROM t1; +--enable_ps2_protocol SET timestamp = 3; UPDATE t1 SET f13 = 'q'; SET timestamp = 4; LOAD DATA INFILE 't1.data' REPLACE INTO TABLE t1; +--disable_ps2_protocol SELECT * INTO OUTFILE 't1.data.2' FROM t1; +--enable_ps2_protocol SET timestamp = 5; LOAD DATA INFILE 't1.data.2' REPLACE INTO TABLE t1; +--disable_ps2_protocol SELECT * INTO OUTFILE 't2.data' FROM t2; +--enable_ps2_protocol SET timestamp = 6; LOAD DATA INFILE 't2.data' REPLACE INTO TABLE t2; SET FOREIGN_KEY_CHECKS = OFF; @@ -549,7 +555,9 @@ delete from t0; --error ER_ROW_IS_REFERENCED_2 replace t0 values (1); +--disable_ps2_protocol select * into outfile 'load_t0' from t0 ; +--enable_ps2_protocol --error ER_ROW_IS_REFERENCED_2 load data infile 'load_t0' replace into table t0; diff --git a/mysql-test/suite/versioning/t/load_data.test b/mysql-test/suite/versioning/t/load_data.test index d4a1fa1a736..4b77d9f80bb 100644 --- a/mysql-test/suite/versioning/t/load_data.test +++ b/mysql-test/suite/versioning/t/load_data.test @@ -6,8 +6,10 @@ CREATE TABLE t1 (a INT, b INT, c INT, vc INT AS (c), UNIQUE(a), UNIQUE(b)) WITH INSERT IGNORE INTO t1 (a,b,c) VALUES (1,2,3); --enable_prepare_warnings +--disable_ps2_protocol SELECT a, b, c FROM t1 INTO OUTFILE '15330.data'; --disable_prepare_warnings +--enable_ps2_protocol LOAD DATA INFILE '15330.data' IGNORE INTO TABLE t1 (a,b,c); LOAD DATA INFILE '15330.data' REPLACE INTO TABLE t1 (a,b,c); diff --git a/mysql-test/suite/versioning/t/partition.test b/mysql-test/suite/versioning/t/partition.test index 3013353d23f..eec063830af 100644 --- a/mysql-test/suite/versioning/t/partition.test +++ b/mysql-test/suite/versioning/t/partition.test @@ -1019,7 +1019,9 @@ create or replace table t1 ( insert into t1 () values (),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(); +--disable_ps2_protocol select * into outfile 'MDEV-17891.data' from t1; +--enable_ps2_protocol load data infile 'MDEV-17891.data' replace into table t1; --error ER_RECORD_FILE_FULL load data infile 'MDEV-17891.data' replace into table t1; @@ -1365,7 +1367,9 @@ partition by system_time limit 100 ( partition pn current); insert into t1 select seq from seq_0_to_49; +--disable_ps2_protocol select x into outfile 'MDEV-20077.data' from t1; +--enable_ps2_protocol load data infile 'MDEV-20077.data' replace into table t1 (x); load data infile 'MDEV-20077.data' replace into table t1 (x); @@ -2204,7 +2208,9 @@ create or replace table t1 (x int primary key) with system versioning partition by system_time interval 1 hour auto; insert t1 values (1), (2), (3); +--disable_ps2_protocol select x into outfile 'MDEV-17554.data' from t1; +--enable_ps2_protocol set timestamp= unix_timestamp('2000-01-01 01:00:00'); load data infile 'MDEV-17554.data' replace into table t1 (x); @@ -2634,5 +2640,21 @@ alter table t partition by system_time interval 10 week; drop table t; --disable_prepare_warnings + +--echo # +--echo # MDEV-29727 ALTER and CREATE with default partitioning +--echo # differently react to SQL_MODE => unusable SHOW CREATE +--echo # +create table t (a int) with system versioning; +--error WARN_VERS_PARAMETERS +alter table t partition by system_time partitions 3; +drop table t; +--error WARN_VERS_PARAMETERS +create table t (a int) with system versioning partition by system_time partitions 3; + +--echo # +--echo # End of 10.5 tests +--echo # + set global innodb_stats_persistent= @save_persistent; --source suite/versioning/common_finish.inc diff --git a/mysql-test/suite/versioning/t/rpl.test b/mysql-test/suite/versioning/t/rpl.test index 622b68c80e4..7de0ae97057 100644 --- a/mysql-test/suite/versioning/t/rpl.test +++ b/mysql-test/suite/versioning/t/rpl.test @@ -1,4 +1,5 @@ --source suite/versioning/engines.inc +--source suite/versioning/common.inc --source include/have_partition.inc --source include/master-slave.inc @@ -6,6 +7,7 @@ #Testing command counters -BEFORE. #Storing the before counts of Slave connection slave; +--source suite/versioning/common.inc let $slave_com_commit_before= query_get_value(SHOW GLOBAL STATUS LIKE 'com_commit', Value, 1); let $slave_com_insert_before= query_get_value(SHOW GLOBAL STATUS LIKE 'com_insert', Value, 1); let $slave_com_delete_before= query_get_value(SHOW GLOBAL STATUS LIKE 'com_delete', Value, 1); @@ -167,6 +169,57 @@ sync_slave_with_master; connection master; drop table t1; +--echo # +--echo # MDEV-31313 SYSTEM VERSIONING and FOREIGN KEY CASCADE create orphan rows on replica +--echo # +create table parent ( + id int(11) not null auto_increment, + processdate datetime default null, + primary key (id) +) engine=innodb with system versioning; + +set timestamp= unix_timestamp('2000-01-01 00:00:00'); +insert into parent values (1, now()); + +create table child ( + id int(11) not null auto_increment, + ch_name varchar(30), + andreid int(11) default null, + primary key (id), + key andreid (andreid), + constraint fk_andreid foreign key (andreid) references parent (id) on delete cascade +) engine=innodb with system versioning; + +set timestamp= unix_timestamp('2000-01-01 00:00:01'); +insert into child values (null, 'vimtomar', 1); + +set timestamp= unix_timestamp('2000-01-01 00:00:02'); +delete from parent where id = 1; + +select check_row(row_start, row_end) from parent for system_time all; +select check_row(row_start, row_end) from child for system_time all; +select * from child; +select * from parent; + +sync_slave_with_master; + +# Annoying tweaking of microseconds in slave row_end, so row_end can be <= row_start +select check_row_slave(row_start, row_end) from parent for system_time all; +select check_row_slave(row_start, row_end) from child for system_time all; +select * from child; +select * from parent; + +# Cleanup +--source suite/versioning/common_finish.inc +--connection master +set timestamp= default; +drop table child; +drop table parent; + +sync_slave_with_master; +connection master; + +--source suite/versioning/common_finish.inc --echo # --echo # MDEV-17554 Auto-create new partition for system versioned tables --echo # with history partitioned by INTERVAL/LIMIT diff --git a/mysql-test/suite/versioning/t/update.test b/mysql-test/suite/versioning/t/update.test index 5d250bb2162..6930fecce40 100644 --- a/mysql-test/suite/versioning/t/update.test +++ b/mysql-test/suite/versioning/t/update.test @@ -26,15 +26,18 @@ eval create table t1 ( sys_trx_end $sys_datatype_expl as row end invisible, period for system_time (sys_trx_start, sys_trx_end)) with system versioning; +set timestamp= unix_timestamp('2000-01-01 00:00:00'); insert into t1 values(1, 1, 1); -set @ins_t= now(6); select sys_trx_start into @tmp1 from t1; +set timestamp= unix_timestamp('2000-01-01 01:00:00'); update t1 set x= 11, y= 11 where id = 1; select @tmp1 < sys_trx_start as A1, x, y from t1; select sys_trx_start into @tmp1 from t1; +set timestamp= unix_timestamp('2000-01-01 02:00:00'); update t1 set y= 1 where id = 1; select @tmp1 = sys_trx_start as A2, x from t1; drop table t1; +set timestamp= default; replace_result $sys_datatype_expl SYS_DATATYPE; eval create table t1 ( @@ -373,6 +376,44 @@ update t1, t2 set t1.a = 3, t2.a = 3 where t1.b <= 10 and t2.b <= 10 and t1.b = # cleanup drop tables t1, t2; +--echo # +--echo # MDEV-23100 ODKU of non-versioning column inserts history row +--echo # +create table t1 ( + x int unique, + y int without system versioning +) with system versioning; + +insert into t1 (x, y) values ('1', '1'); +insert into t1 (x, y) values ('1', '2') + on duplicate key update y = 3; + +select x, y, check_row_ts(row_start, row_end) from t1 for system_time all order by row_end; + +drop table t1; + +--echo # +--echo # MDEV-25644 UPDATE not working properly on transaction precise system versioned table +--echo # +create or replace table t1 (nid int primary key, nstate int, ntype int) engine innodb; +--replace_result $sys_datatype_expl SYS_DATATYPE +eval alter table t1 add + row_start $sys_datatype_expl generated always as row start invisible, + add row_end $sys_datatype_expl generated always as row end invisible, + add period for system_time(row_start, row_end), + add system versioning; +insert into t1 values (1, 1, 1); +select nid, nstate, check_row(row_start, row_end) from t1 for system_time all order by row_start, row_end; +start transaction; +update t1 set nstate= nstate where nid = 1; +select nid, nstate, check_row(row_start, row_end) from t1 for system_time all order by row_start, row_end; +--echo # Bug: ERROR 1761 (23000): Foreign key constraint for table 'xxx', record '1-18446744073709551615' would lead to a duplicate entry in table 'xxx', key 'PRIMARY' +update t1 set nstate= 3 where nid= 1; +# Under one transaction trx_id generates only one history row, that differs from timestamp +select nid, nstate, check_row(row_start, row_end) from t1 for system_time all order by row_start, row_end; +commit; +drop tables t1; + --echo # End of 10.4 tests source suite/versioning/common_finish.inc; diff --git a/mysys/get_password.c b/mysys/get_password.c index 18286fd9e39..bf474912111 100644 --- a/mysys/get_password.c +++ b/mysys/get_password.c @@ -60,14 +60,14 @@ /* were just going to fake it here and get input from the keyboard */ -char *get_tty_password(const char *opt_message) +char *my_get_tty_password(const char *opt_message) { wchar_t wbuf[80]; char *to; int to_len; UINT cp; wchar_t *pos=wbuf,*end=wbuf + array_elements(wbuf)-1; - DBUG_ENTER("get_tty_password"); + DBUG_ENTER("my_get_tty_password"); _cputs(opt_message ? opt_message : "Enter password: "); for (;;) { @@ -168,7 +168,7 @@ static void get_password(char *to,uint length,int fd, my_bool echo) #endif /* ! HAVE_GETPASS */ -char *get_tty_password(const char *opt_message) +char *my_get_tty_password(const char *opt_message) { #ifdef HAVE_GETPASS char *passbuff; @@ -177,7 +177,7 @@ char *get_tty_password(const char *opt_message) #endif /* HAVE_GETPASS */ char buff[80]; - DBUG_ENTER("get_tty_password"); + DBUG_ENTER("my_get_tty_password"); #ifdef HAVE_GETPASS passbuff = getpass(opt_message ? opt_message : "Enter password: "); diff --git a/mysys/lf_alloc-pin.c b/mysys/lf_alloc-pin.c index 33480289d94..fc3f320a623 100644 --- a/mysys/lf_alloc-pin.c +++ b/mysys/lf_alloc-pin.c @@ -269,6 +269,9 @@ void lf_pinbox_free(LF_PINS *pins, void *addr) add_to_purgatory(pins, addr); if (pins->purgatory_count % LF_PURGATORY_SIZE == 0) lf_pinbox_real_free(pins); + DBUG_EXECUTE_IF("unconditional_pinbox_free", + if (pins->purgatory_count % LF_PURGATORY_SIZE) + lf_pinbox_real_free(pins);); } struct st_harvester { diff --git a/mysys/my_default.c b/mysys/my_default.c index ae576f7a058..65a876a9e25 100644 --- a/mysys/my_default.c +++ b/mysys/my_default.c @@ -626,12 +626,27 @@ static int search_default_file_with_ext(struct handle_option_ctx *ctx, if (!my_stat(name,&stat_info,MYF(0))) return 1; /* - Ignore world-writable regular files. - This is mainly done to protect us to not read a file created by - the mysqld server, but the check is still valid in most context. + Ignore world-writable regular files (exceptions apply). + This is mainly done to protect us to not read a file that may be + modified by anyone. + + Also check access so that read only mounted (EROFS) + or immutable files (EPERM) that are suitable protections. + + The main case we are allowing is a container readonly volume mount + from a filesystem that doesn't have unix permissions. This will + have a 0777 permission and access will set errno = EROFS. + + Note if a ROFS has a file with permissions 04n6, access sets errno + EACCESS, rather the ROFS, so in this case we'll error, even though + the ROFS is protecting the file. + + An ideal, race free, implementation would do fstat / fstatvfs / ioctl + for permission, read only filesystem, and immutability resprectively. */ if ((stat_info.st_mode & S_IWOTH) && - (stat_info.st_mode & S_IFMT) == S_IFREG) + (stat_info.st_mode & S_IFMT) == S_IFREG && + (access(name, W_OK) == 0 || (errno != EROFS && errno != EPERM))) { fprintf(stderr, "Warning: World-writable config file '%s' is ignored\n", name); diff --git a/mysys_ssl/openssl.c b/mysys_ssl/openssl.c index b38d4ba309c..8adaeae4069 100644 --- a/mysys_ssl/openssl.c +++ b/mysys_ssl/openssl.c @@ -15,6 +15,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include +#include +#include /* The check is only done for OpenSSL 1.1.x. @@ -24,17 +26,15 @@ */ #ifndef HAVE_OPENSSL11 -#include int check_openssl_compatibility() { return 0; } #else #include -#include static uint testing; -size_t alloc_size, alloc_count; +static size_t alloc_size, alloc_count; static void *coc_malloc(size_t size, const char *f __attribute__((unused)), int l __attribute__((unused))) diff --git a/plugin/auth_pam/mapper/pam_user_map.c b/plugin/auth_pam/mapper/pam_user_map.c index fa8d9ae08c1..5dda97a20cd 100644 --- a/plugin/auth_pam/mapper/pam_user_map.c +++ b/plugin/auth_pam/mapper/pam_user_map.c @@ -216,7 +216,7 @@ int pam_sm_authenticate(pam_handle_t *pamh, int flags, } from= s; skip(isalnum(*s) || (*s == '_') || (*s == '.') || (*s == '-') || - (*s == '$') || (*s == '\\') || (*s == '/')); + (*s == '$') || (*s == '\\') || (*s == '/') || (*s == '@')); end_from= s; skip(isspace(*s)); if (end_from == from || *s++ != ':') goto syntax_error; diff --git a/plugin/cracklib_password_check/CMakeLists.txt b/plugin/cracklib_password_check/CMakeLists.txt index 620234ccd3f..4a6337310f9 100644 --- a/plugin/cracklib_password_check/CMakeLists.txt +++ b/plugin/cracklib_password_check/CMakeLists.txt @@ -1,9 +1,9 @@ INCLUDE (CheckIncludeFiles) INCLUDE (CheckLibraryExists) -SET(CPACK_RPM_cracklib-password-check_PACKAGE_SUMMARY "CrackLib Password Validation Plugin for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_cracklib-password-check_PACKAGE_SUMMARY "CrackLib Password Validation Plugin for MariaDB server" PARENT_SCOPE) SET(CPACK_RPM_cracklib-password-check_PACKAGE_DESCRIPTION "This password validation plugin uses cracklib to allow only -sufficiently secure (as defined by cracklib) user passwords in MariaDB." PARENT_SCOPE) +sufficiently secure (as defined by cracklib) user passwords in MariaDB server." PARENT_SCOPE) CHECK_LIBRARY_EXISTS(crack FascistCheckUser "" HAVE_LIBCRACK) @@ -14,4 +14,29 @@ IF (HAVE_ALLOCA_H AND HAVE_CRACK_H AND HAVE_LIBCRACK AND HAVE_MEMCPY) MYSQL_ADD_PLUGIN(cracklib_password_check cracklib_password_check.c LINK_LIBRARIES crack MODULE_ONLY COMPONENT cracklib-password-check) + + IF (RPM) + SET(inst_location ${INSTALL_SUPPORTFILESDIR}) + INSTALL(DIRECTORY policy DESTINATION ${inst_location} COMPONENT cracklib-password-check) + FIND_PROGRAM(CHECKMODULE checkmodule) + FIND_PROGRAM(SEMODULE_PACKAGE semodule_package) + MARK_AS_ADVANCED(CHECKMODULE SEMODULE_PACKAGE) + + # Build pp files in policy/selinux + IF(CHECKMODULE AND SEMODULE_PACKAGE) + FOREACH(pol mariadb-plugin-cracklib-password-check) + SET(src ${CMAKE_CURRENT_SOURCE_DIR}/policy/selinux/${pol}.te) + SET(tmp ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${pol}-pp.dir/${pol}.mod) + SET(out ${CMAKE_CURRENT_BINARY_DIR}/${pol}.pp) + ADD_CUSTOM_COMMAND(OUTPUT ${out} + COMMAND ${CHECKMODULE} -M -m ${src} -o ${tmp} + COMMAND ${SEMODULE_PACKAGE} -m ${tmp} -o ${out} + DEPENDS ${src}) + ADD_CUSTOM_TARGET(${pol}-pp ALL DEPENDS ${out}) + INSTALL(FILES ${out} DESTINATION ${inst_location}/policy/selinux COMPONENT cracklib-password-check) + ENDFOREACH() + ENDIF() + + ENDIF() + ENDIF() diff --git a/plugin/cracklib_password_check/policy/selinux/mariadb-plugin-cracklib-password-check.te b/plugin/cracklib_password_check/policy/selinux/mariadb-plugin-cracklib-password-check.te new file mode 100644 index 00000000000..a352f206c97 --- /dev/null +++ b/plugin/cracklib_password_check/policy/selinux/mariadb-plugin-cracklib-password-check.te @@ -0,0 +1,13 @@ + +module mariadb-plugin-cracklib-password-check 1.0; + +require { + type mysqld_t; + type crack_db_t; + class file { execute setattr read create getattr execute_no_trans write ioctl open append unlink }; + class dir { write search getattr add_name read remove_name open }; +} + +allow mysqld_t crack_db_t:dir { search read open }; +allow mysqld_t crack_db_t:file { getattr read open }; + diff --git a/plugin/cracklib_password_check/support-files/rpm/mariadb-plugin-cracklib-password-check-postin.sh b/plugin/cracklib_password_check/support-files/rpm/mariadb-plugin-cracklib-password-check-postin.sh new file mode 100644 index 00000000000..43315503315 --- /dev/null +++ b/plugin/cracklib_password_check/support-files/rpm/mariadb-plugin-cracklib-password-check-postin.sh @@ -0,0 +1,8 @@ +SETARGETDIR=/etc/selinux/targeted/src/policy +SEDOMPROG=$SETARGETDIR/domains/program +SECONPROG=$SETARGETDIR/file_contexts/program + +if [ -x /usr/sbin/semodule ] ; then + /usr/sbin/semodule -i /usr/share/mysql/policy/selinux/mariadb-plugin-cracklib-password-check.pp +fi + diff --git a/plugin/versioning/versioning.cc b/plugin/versioning/versioning.cc index c970a9d6561..38ebf76256b 100644 --- a/plugin/versioning/versioning.cc +++ b/plugin/versioning/versioning.cc @@ -141,7 +141,7 @@ Create_func_trt_trx_sees Create_func_trt_trx_sees::s_singleton; #define BUILDER(F) & F::s_singleton -static Native_func_registry func_array[] = +static const Native_func_registry func_array_vers[] = { { { C_STRING_WITH_LEN("TRT_BEGIN_TS") }, BUILDER(Create_func_trt)}, { { C_STRING_WITH_LEN("TRT_COMMIT_ID") }, BUILDER(Create_func_trt)}, @@ -165,7 +165,8 @@ static int versioning_plugin_init(void *p __attribute__ ((unused))) { DBUG_ENTER("versioning_plugin_init"); // No need in locking since we so far single-threaded - int res= item_create_append(func_array); + int res= native_functions_hash.append(func_array_vers, + array_elements(func_array_vers)); if (res) { my_message(ER_PLUGIN_IS_NOT_LOADED, "Can't append function array" , MYF(0)); @@ -178,7 +179,8 @@ static int versioning_plugin_init(void *p __attribute__ ((unused))) static int versioning_plugin_deinit(void *p __attribute__ ((unused))) { DBUG_ENTER("versioning_plugin_deinit"); - (void) item_create_remove(func_array); + (void) native_functions_hash.remove(func_array_vers, + array_elements(func_array_vers)); DBUG_RETURN(0); } diff --git a/sql-common/client.c b/sql-common/client.c index 80dbe170f11..0adaa00a0c4 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -2137,7 +2137,7 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, If the server does not support ssl, we abort the connection. */ if (mysql->options.use_ssl && - (mysql->client_flag & CLIENT_SSL_VERIFY_SERVER_CERT) && + (mysql->options.extension && mysql->options.extension->tls_verify_server_cert) && !(mysql->server_capabilities & CLIENT_SSL)) { set_mysql_extended_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate, @@ -2207,7 +2207,7 @@ static int send_client_reply_packet(MCPVIO_EXT *mpvio, DBUG_PRINT("info", ("IO layer change done!")); /* Verify server cert */ - if ((mysql->client_flag & CLIENT_SSL_VERIFY_SERVER_CERT) && + if ((mysql->options.extension && mysql->options.extension->tls_verify_server_cert) && ssl_verify_server_cert(net->vio, mysql->host, &cert_error)) { set_mysql_extended_error(mysql, CR_SSL_CONNECTION_ERROR, unknown_sqlstate, @@ -3811,10 +3811,13 @@ mysql_options(MYSQL *mysql,enum mysql_option option, const void *arg) mysql->options.use_thread_specific_memory= *(my_bool *) arg; break; case MYSQL_OPT_SSL_VERIFY_SERVER_CERT: - if (*(my_bool*) arg) - mysql->options.client_flag|= CLIENT_SSL_VERIFY_SERVER_CERT; - else - mysql->options.client_flag&= ~CLIENT_SSL_VERIFY_SERVER_CERT; + if (!mysql->options.extension) + mysql->options.extension= (struct st_mysql_options_extention *) + my_malloc(PSI_INSTRUMENT_ME, + sizeof(struct st_mysql_options_extention), + MYF(MY_WME | MY_ZEROFILL)); + if (mysql->options.extension) + mysql->options.extension->tls_verify_server_cert= *(my_bool*) arg; break; case MYSQL_PLUGIN_DIR: EXTENSION_SET_STRING(&mysql->options, plugin_dir, arg); diff --git a/sql/derived_handler.cc b/sql/derived_handler.cc index adb04e08c63..cddd1200f5d 100644 --- a/sql/derived_handler.cc +++ b/sql/derived_handler.cc @@ -40,7 +40,6 @@ Pushdown_derived::Pushdown_derived(TABLE_LIST *tbl, derived_handler *h) : derived(tbl), handler(h) { - is_analyze= handler->thd->lex->analyze_stmt; } @@ -57,12 +56,6 @@ int Pushdown_derived::execute() if ((err= handler->init_scan())) goto error; - if (is_analyze) - { - handler->end_scan(); - DBUG_RETURN(0); - } - while (!(err= handler->next_row())) { if (unlikely(thd->check_killed())) diff --git a/sql/field.cc b/sql/field.cc index f59a9e27a1c..11f8819b6ea 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -2721,6 +2721,8 @@ bool Field_row::sp_prepare_and_store_item(THD *thd, Item **value) fixed underlying Item_field pointing to Field_row. - In case if we're assigning from a ROW() value, src and value[0] will point to the same Item_row. + - In case if we're assigning from a subselect, src and value[0] also + point to the same Item_singlerow_subselect. */ Item *src; if (!(src= thd->sp_fix_func_item(value)) || @@ -2732,6 +2734,7 @@ bool Field_row::sp_prepare_and_store_item(THD *thd, Item **value) DBUG_RETURN(true); } + src->bring_value(); DBUG_RETURN(m_table->sp_set_all_fields_from_item(thd, src)); } diff --git a/sql/field.h b/sql/field.h index e57a93b6562..917d4aecf94 100644 --- a/sql/field.h +++ b/sql/field.h @@ -5253,7 +5253,7 @@ class Column_definition: public Sql_alloc, const Type_handler *field_type() const; // Prevent using this Compression_method *compression_method_ptr; public: - LEX_CSTRING field_name; + Lex_ident field_name; LEX_CSTRING comment; // Comment for field enum enum_column_versioning { diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 32c34cff9ed..40cf7cd9b5e 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -6515,7 +6515,7 @@ int ha_partition::multi_range_key_create_key(RANGE_SEQ_IF *seq, m_mrr_range_current->ptr= m_mrr_range_current->key_multi_range.ptr; m_mrr_range_current->key_multi_range.ptr= m_mrr_range_current; - if (start_key->key && (start_key->flag & HA_READ_KEY_EXACT)) + if (start_key->key && (start_key->flag == HA_READ_KEY_EXACT)) get_partition_set(table, table->record[0], active_index, start_key, &m_part_spec); else diff --git a/sql/handler.cc b/sql/handler.cc index c7006751a75..8c5f3c57c5c 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -110,7 +110,7 @@ static handlerton *installed_htons[128]; #define BITMAP_STACKBUF_SIZE (128/8) KEY_CREATE_INFO default_key_create_info= -{ HA_KEY_ALG_UNDEF, 0, 0, {NullS, 0}, {NullS, 0}, true, false }; +{ HA_KEY_ALG_UNDEF, 0, 0, {NullS, 0}, {NullS, 0}, false }; /* number of entries in handlertons[] */ ulong total_ha= 0; @@ -362,9 +362,6 @@ handlerton *ha_checktype(THD *thd, handlerton *hton, bool no_substitute) if (no_substitute) return NULL; -#ifdef WITH_WSREP - (void)wsrep_after_rollback(thd, false); -#endif /* WITH_WSREP */ return ha_default_handlerton(thd); } /* ha_checktype */ @@ -627,6 +624,7 @@ const char *hton_no_exts[]= { 0 }; int ha_initialize_handlerton(st_plugin_int *plugin) { handlerton *hton; + int ret= 0; DBUG_ENTER("ha_initialize_handlerton"); DBUG_PRINT("plugin", ("initialize plugin: '%s'", plugin->name.str)); @@ -636,6 +634,7 @@ int ha_initialize_handlerton(st_plugin_int *plugin) { sql_print_error("Unable to allocate memory for plugin '%s' handlerton.", plugin->name.str); + ret= 1; goto err_no_hton_memory; } @@ -646,12 +645,15 @@ int ha_initialize_handlerton(st_plugin_int *plugin) hton->slot= HA_SLOT_UNDEF; /* Historical Requirement */ plugin->data= hton; // shortcut for the future - if (plugin->plugin->init && plugin->plugin->init(hton)) - { - sql_print_error("Plugin '%s' init function returned error.", - plugin->name.str); + /* [remove after merge] notes on merge conflict (MDEV-31400): + 10.6-10.11: 13ba00ff4933cfc1712676f323587504e453d1b5 + 11.0-11.2: 42f8be10f18163c4025710cf6a212e82bddb2f62 + The 10.11->11.0 conflict is trivial, but the reference commit also + contains different non-conflict changes needs to be applied to 11.0 + (and beyond). + */ + if (plugin->plugin->init && (ret= plugin->plugin->init(hton))) goto err; - } // hton_ext_based_table_discovery() works only when discovery // is supported and the engine if file-based. @@ -689,6 +691,7 @@ int ha_initialize_handlerton(st_plugin_int *plugin) if (idx == (int) DB_TYPE_DEFAULT) { sql_print_warning("Too many storage engines!"); + ret= 1; goto err_deinit; } if (hton->db_type != DB_TYPE_UNKNOWN) @@ -716,6 +719,7 @@ int ha_initialize_handlerton(st_plugin_int *plugin) { sql_print_error("Too many plugins loaded. Limit is %lu. " "Failed on '%s'", (ulong) MAX_HA, plugin->name.str); + ret= 1; goto err_deinit; } hton->slot= total_ha++; @@ -765,7 +769,7 @@ int ha_initialize_handlerton(st_plugin_int *plugin) resolve_sysvar_table_options(hton); update_discovery_counters(hton, 1); - DBUG_RETURN(0); + DBUG_RETURN(ret); err_deinit: /* @@ -783,7 +787,7 @@ err: my_free(hton); err_no_hton_memory: plugin->data= NULL; - DBUG_RETURN(1); + DBUG_RETURN(ret); } int ha_init() @@ -1750,10 +1754,7 @@ int ha_commit_trans(THD *thd, bool all) DEBUG_SYNC(thd, "ha_commit_trans_after_acquire_commit_lock"); } - if (rw_trans && - opt_readonly && - !(thd->security_ctx->master_access & PRIV_IGNORE_READ_ONLY) && - !thd->slave_thread) + if (rw_trans && thd->is_read_only_ctx()) { my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); goto err; @@ -2167,17 +2168,26 @@ int ha_rollback_trans(THD *thd, bool all) attempt. Otherwise those following transactions can run too early, and possibly cause replication to fail. See comments in retry_event_group(). + (This concerns rollbacks due to temporary errors where the transaction + will be retried afterwards. For non-recoverable errors, following + transactions will not start but just be skipped as the worker threads + perform the error stop). + There were several bugs with this in the past that were very hard to track down (MDEV-7458, MDEV-8302). So we add here an assertion for rollback without signalling following transactions. And in release builds, we explicitly do the signalling before rolling back. */ DBUG_ASSERT( - !(thd->rgi_slave && thd->rgi_slave->did_mark_start_commit) || + !(thd->rgi_slave && + !thd->rgi_slave->worker_error && + thd->rgi_slave->did_mark_start_commit) || (thd->transaction->xid_state.is_explicit_XA() || (thd->rgi_slave->gtid_ev_flags2 & Gtid_log_event::FL_PREPARED_XA))); - if (thd->rgi_slave && thd->rgi_slave->did_mark_start_commit) + if (thd->rgi_slave && + !thd->rgi_slave->worker_error && + thd->rgi_slave->did_mark_start_commit) thd->rgi_slave->unmark_start_commit(); } #endif diff --git a/sql/handler.h b/sql/handler.h index 80c11f8a9bf..46cd2e24a59 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -2657,12 +2657,6 @@ typedef struct st_key_create_information uint flags; /* HA_USE.. flags */ LEX_CSTRING parser_name; LEX_CSTRING comment; - /** - A flag to determine if we will check for duplicate indexes. - This typically means that the key information was specified - directly by the user (set by the parser). - */ - bool check_for_duplicate_indexes; bool is_ignored; } KEY_CREATE_INFO; @@ -3672,7 +3666,7 @@ public: - How things are tracked in trx and in add_changed_table(). - If we can combine several statements under one commit in the binary log. */ - bool has_transactions() + bool has_transactions() const { return ((ha_table_flags() & (HA_NO_TRANSACTIONS | HA_PERSISTENT_TABLE)) == 0); @@ -3683,24 +3677,33 @@ public: we don't have to write failed statements to the log as they can be rolled back. */ - bool has_transactions_and_rollback() + bool has_transactions_and_rollback() const { return has_transactions() && has_rollback(); } /* True if the underlaying table support transactions and rollback */ - bool has_transaction_manager() + bool has_transaction_manager() const { return ((ha_table_flags() & HA_NO_TRANSACTIONS) == 0 && has_rollback()); } + /* + True if the underlaying table support TRANSACTIONAL table option + */ + bool has_transactional_option() const + { + extern handlerton *maria_hton; + return partition_ht() == maria_hton || has_transaction_manager(); + } + /* True if table has rollback. Used to check if an update on the table can be killed fast. */ - bool has_rollback() + bool has_rollback() const { return ((ht->flags & HTON_NO_ROLLBACK) == 0); } diff --git a/sql/item.cc b/sql/item.cc index e1a1dff3dde..0538f0d915d 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1521,7 +1521,7 @@ int Item::save_in_field_no_warnings(Field *field, bool no_conversions) #ifndef DBUG_OFF static inline -void mark_unsupported_func(const char *where, const char *processor_name) +void dbug_mark_unsupported_func(const char *where, const char *processor_name) { char buff[64]; my_snprintf(buff, sizeof(buff), "%s::%s", where ? where: "", processor_name); @@ -1531,7 +1531,7 @@ void mark_unsupported_func(const char *where, const char *processor_name) DBUG_VOID_RETURN; } #else -#define mark_unsupported_func(X,Y) {} +#define dbug_mark_unsupported_func(X,Y) {} #endif bool mark_unsupported_function(const char *where, void *store, uint result) @@ -1539,7 +1539,7 @@ bool mark_unsupported_function(const char *where, void *store, uint result) Item::vcol_func_processor_result *res= (Item::vcol_func_processor_result*) store; uint old_errors= res->errors; - mark_unsupported_func(where, "check_vcol_func_processor"); + dbug_mark_unsupported_func(where, "check_vcol_func_processor"); res->errors|= result; /* Store type of expression */ /* Store the name to the highest violation (normally VCOL_IMPOSSIBLE) */ if (result > old_errors) @@ -1560,33 +1560,19 @@ bool mark_unsupported_function(const char *w1, const char *w2, bool Item_field::check_vcol_func_processor(void *arg) { + uint r= VCOL_FIELD_REF; context= 0; vcol_func_processor_result *res= (vcol_func_processor_result *) arg; if (res && res->alter_info) + r|= res->alter_info->check_vcol_field(this); + else if (field) { - for (Key &k: res->alter_info->key_list) - { - if (k.type != Key::FOREIGN_KEY) - continue; - Foreign_key *fk= (Foreign_key*) &k; - if (fk->update_opt != FK_OPTION_CASCADE) - continue; - for (Key_part_spec& kp: fk->columns) - { - if (!lex_string_cmp(system_charset_info, &kp.field_name, &field_name)) - { - return mark_unsupported_function(field_name.str, arg, VCOL_IMPOSSIBLE); - } - } - } + if (field->unireg_check == Field::NEXT_NUMBER) + r|= VCOL_AUTO_INC; + if (field->vcol_info && + field->vcol_info->flags & (VCOL_NOT_STRICTLY_DETERMINISTIC | VCOL_AUTO_INC)) + r|= VCOL_NON_DETERMINISTIC; } - - uint r= VCOL_FIELD_REF; - if (field && field->unireg_check == Field::NEXT_NUMBER) - r|= VCOL_AUTO_INC; - if (field && field->vcol_info && - field->vcol_info->flags & (VCOL_NOT_STRICTLY_DETERMINISTIC | VCOL_AUTO_INC)) - r|= VCOL_NON_DETERMINISTIC; return mark_unsupported_function(field_name.str, arg, r); } diff --git a/sql/item.h b/sql/item.h index f31811bef18..c12ceeefbb4 100644 --- a/sql/item.h +++ b/sql/item.h @@ -2217,15 +2217,6 @@ public: return 0; } - /** - Check db/table_name if they defined in item and match arg values - - @param arg Pointer to Check_table_name_prm structure - - @retval true Match failed - @retval false Match succeeded - */ - virtual bool check_table_name_processor(void *arg) { return false; } /* TRUE if the expression depends only on the table indicated by tab_map or can be converted to such an exression using equalities. @@ -2426,15 +2417,6 @@ public: bool collect; }; - struct Check_table_name_prm - { - LEX_CSTRING db; - LEX_CSTRING table_name; - String field; - Check_table_name_prm(LEX_CSTRING _db, LEX_CSTRING _table_name) : - db(_db), table_name(_table_name) {} - }; - /* For SP local variable returns pointer to Item representing its current value and pointer to current Item otherwise. @@ -3499,17 +3481,17 @@ protected: updated during fix_fields() to values from Field object and life-time of those is shorter than life-time of Item_field. */ - LEX_CSTRING orig_db_name; - LEX_CSTRING orig_table_name; - LEX_CSTRING orig_field_name; + Lex_table_name orig_db_name; + Lex_table_name orig_table_name; + Lex_ident orig_field_name; void undeclared_spvar_error() const; public: Name_resolution_context *context; - LEX_CSTRING db_name; - LEX_CSTRING table_name; - LEX_CSTRING field_name; + Lex_table_name db_name; + Lex_table_name table_name; + Lex_ident field_name; /* Cached pointer to table which contains this field, used for the same reason by prep. stmt. too in case then we have not-fully qualified field. @@ -3786,24 +3768,6 @@ public: } return 0; } - bool check_table_name_processor(void *arg) override - { - Check_table_name_prm &p= *static_cast(arg); - if (!field && p.table_name.length && table_name.length) - { - DBUG_ASSERT(p.db.length); - if ((db_name.length && - my_strcasecmp(table_alias_charset, p.db.str, db_name.str)) || - my_strcasecmp(table_alias_charset, p.table_name.str, table_name.str)) - { - print(&p.field, (enum_query_type) (QT_ITEM_ORIGINAL_FUNC_NULLIF | - QT_NO_DATA_EXPANSION | - QT_TO_SYSTEM_CHARSET)); - return true; - } - } - return false; - } void cleanup() override; Item_equal *get_item_equal() override { return item_equal; } void set_item_equal(Item_equal *item_eq) override { item_equal= item_eq; } diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index b8b02093278..9cbe29441aa 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -3689,7 +3689,7 @@ in_string::~in_string() } } -void in_string::set(uint pos,Item *item) +bool in_string::set(uint pos, Item *item) { String *str=((String*) base)+pos; String *res=item->val_str(str); @@ -3709,6 +3709,7 @@ void in_string::set(uint pos,Item *item) cs= &my_charset_bin; // Should never happen for STR items str->set_charset(cs); } + return res == NULL; } @@ -3750,12 +3751,12 @@ uchar *in_row::get_value(Item *item) return (uchar *)&tmp; } -void in_row::set(uint pos, Item *item) +bool in_row::set(uint pos, Item *item) { DBUG_ENTER("in_row::set"); DBUG_PRINT("enter", ("pos: %u item: %p", pos,item)); - ((cmp_item_row*) base)[pos].store_value_by_template(current_thd, &tmp, item); - DBUG_VOID_RETURN; + DBUG_RETURN(((cmp_item_row*) base)[pos].store_value_by_template(current_thd, + &tmp, item)); } in_longlong::in_longlong(THD *thd, uint elements) @@ -3763,12 +3764,13 @@ in_longlong::in_longlong(THD *thd, uint elements) (qsort2_cmp) cmp_longlong, 0) {} -void in_longlong::set(uint pos,Item *item) +bool in_longlong::set(uint pos, Item *item) { struct packed_longlong *buff= &((packed_longlong*) base)[pos]; buff->val= item->val_int(); buff->unsigned_flag= item->unsigned_flag; + return item->null_value; } uchar *in_longlong::get_value(Item *item) @@ -3803,14 +3805,17 @@ in_timestamp::in_timestamp(THD *thd, uint elements) {} -void in_timestamp::set(uint pos, Item *item) +bool in_timestamp::set(uint pos, Item *item) { Timestamp_or_zero_datetime *buff= &((Timestamp_or_zero_datetime *) base)[pos]; Timestamp_or_zero_datetime_native_null native(current_thd, item, true); if (native.is_null()) + { *buff= Timestamp_or_zero_datetime(); - else - *buff= Timestamp_or_zero_datetime(native); + return true; + } + *buff= Timestamp_or_zero_datetime(native); + return false; } @@ -3837,20 +3842,22 @@ void in_timestamp::value_to_item(uint pos, Item *item) } -void in_datetime::set(uint pos,Item *item) +bool in_datetime::set(uint pos, Item *item) { struct packed_longlong *buff= &((packed_longlong*) base)[pos]; buff->val= item->val_datetime_packed(current_thd); buff->unsigned_flag= 1L; + return item->null_value; } -void in_time::set(uint pos,Item *item) +bool in_time::set(uint pos, Item *item) { struct packed_longlong *buff= &((packed_longlong*) base)[pos]; buff->val= item->val_time_packed(current_thd); buff->unsigned_flag= 1L; + return item->null_value; } uchar *in_datetime::get_value(Item *item) @@ -3881,9 +3888,10 @@ in_double::in_double(THD *thd, uint elements) :in_vector(thd, elements, sizeof(double), (qsort2_cmp) cmp_double, 0) {} -void in_double::set(uint pos,Item *item) +bool in_double::set(uint pos, Item *item) { ((double*) base)[pos]= item->val_real(); + return item->null_value; } uchar *in_double::get_value(Item *item) @@ -3905,7 +3913,7 @@ in_decimal::in_decimal(THD *thd, uint elements) {} -void in_decimal::set(uint pos, Item *item) +bool in_decimal::set(uint pos, Item *item) { /* as far as 'item' is constant, we can store reference on my_decimal */ my_decimal *dec= ((my_decimal *)base) + pos; @@ -3915,6 +3923,7 @@ void in_decimal::set(uint pos, Item *item) /* if item->val_decimal() is evaluated to NULL then res == 0 */ if (!item->null_value && res != dec) my_decimal2decimal(res, dec); + return item->null_value; } @@ -4091,15 +4100,16 @@ void cmp_item_row::store_value(Item *item) } -void cmp_item_row::store_value_by_template(THD *thd, cmp_item *t, Item *item) +bool cmp_item_row::store_value_by_template(THD *thd, cmp_item *t, Item *item) { cmp_item_row *tmpl= (cmp_item_row*) t; if (tmpl->n != item->cols()) { my_error(ER_OPERAND_COLUMNS, MYF(0), tmpl->n); - return; + return 1; } n= tmpl->n; + bool rc= false; if ((comparators= (cmp_item **) thd->alloc(sizeof(cmp_item *)*n))) { item->bring_value(); @@ -4108,11 +4118,11 @@ void cmp_item_row::store_value_by_template(THD *thd, cmp_item *t, Item *item) { if (!(comparators[i]= tmpl->comparators[i]->make_same(thd))) break; // new failed - comparators[i]->store_value_by_template(thd, tmpl->comparators[i], - item->element_index(i)); - item->null_value|= item->element_index(i)->null_value; + rc|= comparators[i]->store_value_by_template(thd, tmpl->comparators[i], + item->element_index(i)); } } + return rc; } @@ -4506,8 +4516,7 @@ void Item_func_in::fix_in_vector() uint j=0; for (uint i=1 ; i < arg_count ; i++) { - array->set(j,args[i]); - if (!args[i]->null_value) + if (!array->set(j,args[i])) j++; // include this cell in the array. else { @@ -6184,7 +6193,9 @@ void Regexp_processor_pcre::fix_owner(Item_func *owner, Item *subject_arg, Item *pattern_arg) { - if (!is_compiled() && pattern_arg->const_item()) + if (!is_compiled() && + pattern_arg->const_item() && + !pattern_arg->is_expensive()) { if (compile(pattern_arg, true)) { diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 99656e910ba..5457b98b074 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -1454,7 +1454,14 @@ public: size(element_length), compare(cmp_func), collation(cmp_coll), count(elements), used_count(elements) {} virtual ~in_vector() = default; - virtual void set(uint pos,Item *item)=0; + /* + Store an Item value at the given position. + @returns false - the Item was not NULL, and the conversion from the + Item data type to the cmp_item data type went without + errors + @returns true - the Item was NULL, or data type conversion returned NULL + */ + virtual bool set(uint pos, Item *item)=0; virtual uchar *get_value(Item *item)=0; void sort() { @@ -1509,7 +1516,7 @@ class in_string :public in_vector public: in_string(THD *thd, uint elements, qsort2_cmp cmp_func, CHARSET_INFO *cs); ~in_string(); - void set(uint pos,Item *item) override; + bool set(uint pos, Item *item) override; uchar *get_value(Item *item) override; Item* create_item(THD *thd) override; void value_to_item(uint pos, Item *item) override @@ -1537,7 +1544,7 @@ protected: } tmp; public: in_longlong(THD *thd, uint elements); - void set(uint pos,Item *item) override; + bool set(uint pos, Item *item) override; uchar *get_value(Item *item) override; Item* create_item(THD *thd) override; void value_to_item(uint pos, Item *item) override @@ -1558,11 +1565,11 @@ class in_timestamp :public in_vector Timestamp_or_zero_datetime tmp; public: in_timestamp(THD *thd, uint elements); - void set(uint pos,Item *item) override; + bool set(uint pos, Item *item) override; uchar *get_value(Item *item) override; Item* create_item(THD *thd) override; void value_to_item(uint pos, Item *item) override; - const Type_handler *type_handler() const override + const Type_handler *type_handler() const override { return &type_handler_timestamp2; } }; @@ -1594,7 +1601,7 @@ public: in_datetime(THD *thd, uint elements) :in_temporal(thd, elements) {} - void set(uint pos,Item *item) override; + bool set(uint pos, Item *item) override; uchar *get_value(Item *item) override; const Type_handler *type_handler() const override { return &type_handler_datetime2; } @@ -1607,7 +1614,7 @@ public: in_time(THD *thd, uint elements) :in_temporal(thd, elements) {} - void set(uint pos,Item *item) override; + bool set(uint pos, Item *item) override; uchar *get_value(Item *item) override; const Type_handler *type_handler() const override { return &type_handler_time2; } @@ -1619,7 +1626,7 @@ class in_double :public in_vector double tmp; public: in_double(THD *thd, uint elements); - void set(uint pos,Item *item) override; + bool set(uint pos, Item *item) override; uchar *get_value(Item *item) override; Item *create_item(THD *thd) override; void value_to_item(uint pos, Item *item) override @@ -1636,7 +1643,7 @@ class in_decimal :public in_vector my_decimal val; public: in_decimal(THD *thd, uint elements); - void set(uint pos, Item *item) override; + bool set(uint pos, Item *item) override; uchar *get_value(Item *item) override; Item *create_item(THD *thd) override; void value_to_item(uint pos, Item *item) override @@ -1670,10 +1677,14 @@ public: // for optimized IN with row virtual int compare(cmp_item *item)= 0; virtual cmp_item *make_same(THD *thd)= 0; - virtual void store_value_by_template(THD *thd, cmp_item *tmpl, Item *item) - { - store_value(item); - } + /* + Store a scalar or a ROW value into "this". + @returns false - the value (or every component in case of ROW) was + not NULL and the data type conversion went without errors. + @returns true - the value (or some of its components) was NULL, or the + data type conversion of a not-NULL value returned NULL. + */ + virtual bool store_value_by_template(THD *thd, cmp_item *tmpl, Item *item)=0; }; /// cmp_item which stores a scalar (i.e. non-ROW). @@ -1681,6 +1692,11 @@ class cmp_item_scalar : public cmp_item { protected: bool m_null_value; ///< If stored value is NULL + bool store_value_by_template(THD *thd, cmp_item *tmpl, Item *item) override + { + store_value(item); + return m_null_value; + } }; class cmp_item_string : public cmp_item_scalar @@ -2637,18 +2653,18 @@ class cmp_item_row :public cmp_item public: cmp_item_row(): comparators(0), n(0) {} ~cmp_item_row(); - void store_value(Item *item); + void store_value(Item *item) override; bool prepare_comparators(THD *, const LEX_CSTRING &funcname, const Item_args *args, uint level); - int cmp(Item *arg); - int cmp_not_null(const Value *val) + int cmp(Item *arg) override; + int cmp_not_null(const Value *val) override { DBUG_ASSERT(false); return TRUE; } - int compare(cmp_item *arg); - cmp_item *make_same(THD *thd); - void store_value_by_template(THD *thd, cmp_item *tmpl, Item *); + int compare(cmp_item *arg) override; + cmp_item *make_same(THD *thd) override; + bool store_value_by_template(THD *thd, cmp_item *tmpl, Item *) override; friend class Item_func_in; cmp_item *get_comparator(uint i) { return comparators[i]; } }; @@ -2660,7 +2676,7 @@ class in_row :public in_vector public: in_row(THD *thd, uint elements, Item *); ~in_row(); - void set(uint pos,Item *item) override; + bool set(uint pos, Item *item) override; uchar *get_value(Item *item) override; friend class Item_func_in; const Type_handler *type_handler() const override { return &type_handler_row; } diff --git a/sql/item_create.cc b/sql/item_create.cc index 2143ecaf6ac..27f537788d6 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -49,20 +49,6 @@ get_native_fct_hash_key(const uchar *buff, size_t *length, } -bool Native_func_registry_array::append_to_hash(HASH *hash) const -{ - DBUG_ENTER("Native_func_registry_array::append_to_hash"); - for (size_t i= 0; i < count(); i++) - { - const Native_func_registry &func= element(i); - DBUG_ASSERT(func.builder != NULL); - if (my_hash_insert(hash, (uchar*) &func)) - DBUG_RETURN(true); - } - DBUG_RETURN(false); -} - - #ifdef HAVE_SPATIAL extern Native_func_registry_array native_func_registry_array_geom; #endif @@ -5663,7 +5649,7 @@ Create_func_year_week::create_native(THD *thd, const LEX_CSTRING *name, - keep 1 line per entry, it makes grep | sort easier */ -Native_func_registry func_array[] = +const Native_func_registry func_array[] = { { { STRING_WITH_LEN("ABS") }, BUILDER(Create_func_abs)}, { { STRING_WITH_LEN("ACOS") }, BUILDER(Create_func_acos)}, @@ -5868,7 +5854,9 @@ Native_func_registry func_array[] = Native_func_registry_array native_func_registry_array(func_array, array_elements(func_array)); -static HASH native_functions_hash; +const size_t func_array_length= sizeof(func_array) / sizeof(Native_func_registry) - 1; + +Native_functions_hash native_functions_hash; /* Load the hash table for native functions. @@ -5876,74 +5864,57 @@ static HASH native_functions_hash; startup only (before going multi-threaded) */ -int item_create_init() +bool Native_functions_hash::init(size_t count) { - DBUG_ENTER("item_create_init"); - size_t count= native_func_registry_array.count(); -#ifdef HAVE_SPATIAL - count+= native_func_registry_array_geom.count(); -#endif - if (my_hash_init(key_memory_native_functions, & native_functions_hash, + DBUG_ENTER("Native_functions_hash::init"); + + if (my_hash_init(key_memory_native_functions, this, system_charset_info, (ulong) count, 0, 0, (my_hash_get_key) get_native_fct_hash_key, NULL, MYF(0))) - DBUG_RETURN(1); + DBUG_RETURN(true); - if (native_func_registry_array.append_to_hash(&native_functions_hash)) - DBUG_RETURN(1); + DBUG_RETURN(false); +} -#ifdef HAVE_SPATIAL - if (native_func_registry_array_geom.append_to_hash(&native_functions_hash)) - DBUG_RETURN(1); -#endif -#ifdef DBUG_TRACE - for (uint i=0 ; i < native_functions_hash.records ; i++) +bool Native_functions_hash::append(const Native_func_registry array[], + size_t count) +{ + DBUG_ENTER("Native_functions_hash::append"); + + for (size_t i= 0; i < count; i++) { - Native_func_registry *func; - func= (Native_func_registry*) my_hash_element(& native_functions_hash, i); + if (my_hash_insert(this, (uchar*) &array[i])) + DBUG_RETURN(true); + } + +#if ! defined (DBUG_OFF) && defined (DBUG_TRACE) + for (uint i=0 ; i < records ; i++) + { + const Native_func_registry *func= + (Native_func_registry*) my_hash_element(this, i); DBUG_PRINT("info", ("native function: %s length: %u", func->name.str, (uint) func->name.length)); } #endif - - DBUG_RETURN(0); + DBUG_RETURN(false); } -/* - This function is used (dangerously) by plugin/versioning/versioning.cc - TODO: MDEV-20842 Wrap SQL functions defined in - plugin/versioning/versioning.cc into MariaDB_FUNCTION_PLUGIN -*/ -int item_create_append(Native_func_registry array[]) +bool Native_functions_hash::remove(const Native_func_registry array[], + size_t count) { - Native_func_registry *func; + DBUG_ENTER("Native_functions_hash::remove"); - DBUG_ENTER("item_create_append"); - - for (func= array; func->builder != NULL; func++) + for (size_t i= 0; i < count; i++) { - if (my_hash_insert(& native_functions_hash, (uchar*) func)) - DBUG_RETURN(1); + if (my_hash_delete(this, (uchar*) &array[i])) + DBUG_RETURN(true); } - DBUG_RETURN(0); + DBUG_RETURN(false); } -int item_create_remove(Native_func_registry array[]) -{ - Native_func_registry *func; - - DBUG_ENTER("item_create_remove"); - - for (func= array; func->builder != NULL; func++) - { - if (my_hash_delete(& native_functions_hash, (uchar*) func)) - DBUG_RETURN(1); - } - - DBUG_RETURN(0); -} /* Empty the hash table for native functions. @@ -5951,10 +5922,10 @@ int item_create_remove(Native_func_registry array[]) shutdown only (after thread requests have been executed). */ -void item_create_cleanup() +void Native_functions_hash::cleanup() { - DBUG_ENTER("item_create_cleanup"); - my_hash_free(& native_functions_hash); + DBUG_ENTER("Native_functions_hash::cleanup"); + my_hash_free(this); DBUG_VOID_RETURN; } @@ -5977,25 +5948,53 @@ function_plugin_find_native_function_builder(THD *thd, const LEX_CSTRING &name) Create_func * -find_native_function_builder(THD *thd, const LEX_CSTRING *name) +Native_functions_hash::find(THD *thd, const LEX_CSTRING &name) const { Native_func_registry *func; Create_func *builder= NULL; /* Thread safe */ - func= (Native_func_registry*) my_hash_search(&native_functions_hash, - (uchar*) name->str, - name->length); + func= (Native_func_registry*) my_hash_search(this, + (uchar*) name.str, + name.length); if (func && (builder= func->builder)) return builder; - if ((builder= function_plugin_find_native_function_builder(thd, *name))) + if ((builder= function_plugin_find_native_function_builder(thd, name))) return builder; return NULL; } + +int item_create_init() +{ + size_t count= native_func_registry_array.count(); +#ifdef HAVE_SPATIAL + count+= native_func_registry_array_geom.count(); +#endif + + if (native_functions_hash.init(count) || + native_functions_hash.append(native_func_registry_array.elements(), + native_func_registry_array.count())) + return true; + +#ifdef HAVE_SPATIAL + if (native_functions_hash.append(native_func_registry_array_geom.elements(), + native_func_registry_array_geom.count())) + return true; +#endif + return false; +} + + +void item_create_cleanup() +{ + native_functions_hash.cleanup(); +} + + Create_qfunc * find_qualified_function_builder(THD *thd) { diff --git a/sql/item_create.h b/sql/item_create.h index 7c248e81711..803959604c6 100644 --- a/sql/item_create.h +++ b/sql/item_create.h @@ -252,16 +252,6 @@ protected: }; -/** - Find the native function builder associated with a given function name. - @param thd The current thread - @param name The native function name - @return The native function builder associated with the name, or NULL -*/ -extern Create_func *find_native_function_builder(THD *thd, - const LEX_CSTRING *name); - - /** Find the function builder for qualified functions. @param thd The current thread @@ -308,9 +298,48 @@ struct Native_func_registry Create_func *builder; }; + +class Native_functions_hash: public HASH +{ +public: + Native_functions_hash() + { + bzero(this, sizeof(*this)); + } + ~Native_functions_hash() + { + /* + No automatic free because objects of this type + are expected to be declared statically. + The code in cleanup() calls my_hash_free() which may not work correctly + at the very end of mariadbd shutdown. + The the upper level code should call cleanup() explicitly. + + Unfortunatelly, it's not possible to use DBUG_ASSERT(!records) here, + because the server terminates using exit() in some cases, + e.g. in the test main.named_pipe with the "Create named pipe failed" + error. + */ + } + bool init(size_t count); + bool append(const Native_func_registry array[], size_t count); + bool remove(const Native_func_registry array[], size_t count); + void cleanup(); + /** + Find the native function builder associated with a given function name. + @param thd The current thread + @param name The native function name + @return The native function builder associated with the name, or NULL + */ + Create_func *find(THD *thd, const LEX_CSTRING &name) const; +}; + +extern MYSQL_PLUGIN_IMPORT Native_functions_hash native_functions_hash; + +extern const Native_func_registry func_array[]; +extern const size_t func_array_length; + int item_create_init(); -int item_create_append(Native_func_registry array[]); -int item_create_remove(Native_func_registry array[]); void item_create_cleanup(); Item *create_func_dyncol_create(THD *thd, List &list); @@ -342,8 +371,8 @@ public: DBUG_ASSERT(i < m_count); return m_elements[i]; } + const Native_func_registry *elements() const { return m_elements; } size_t count() const { return m_count; } - bool append_to_hash(HASH *hash) const; }; diff --git a/sql/item_func.cc b/sql/item_func.cc index 6c0c785e901..aa89caf08e9 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -78,7 +78,7 @@ bool check_reserved_words(const LEX_CSTRING *name) */ static inline bool test_if_sum_overflows_ull(ulonglong arg1, ulonglong arg2) { - return ULONGLONG_MAX - arg1 < arg2; + return ULonglong::test_if_sum_overflows_ull(arg1, arg2); } @@ -348,7 +348,10 @@ Item_func::fix_fields(THD *thd, Item **ref) We shouldn't call fix_fields() twice, so check 'fixed' field first */ if ((*arg)->fix_fields_if_needed(thd, arg)) + { + cleanup(); return TRUE; /* purecov: inspected */ + } item= *arg; base_flags|= item->base_flags & item_base_t::MAYBE_NULL; @@ -358,9 +361,15 @@ Item_func::fix_fields(THD *thd, Item **ref) } } if (check_arguments()) + { + cleanup(); return true; + } if (fix_length_and_dec(thd)) + { + cleanup(); return TRUE; + } base_flags|= item_base_t::FIXED; return FALSE; } @@ -1377,79 +1386,23 @@ double Item_func_mul::real_op() longlong Item_func_mul::int_op() { DBUG_ASSERT(fixed()); - longlong a= args[0]->val_int(); - longlong b= args[1]->val_int(); - longlong res; - ulonglong res0, res1; - ulong a0, a1, b0, b1; - bool res_unsigned= FALSE; - bool a_negative= FALSE, b_negative= FALSE; - - if ((null_value= args[0]->null_value || args[1]->null_value)) - return 0; - /* - First check whether the result can be represented as a - (bool unsigned_flag, longlong value) pair, then check if it is compatible - with this Item's unsigned_flag by calling check_integer_overflow(). - - Let a = a1 * 2^32 + a0 and b = b1 * 2^32 + b0. Then - a * b = (a1 * 2^32 + a0) * (b1 * 2^32 + b0) = a1 * b1 * 2^64 + - + (a1 * b0 + a0 * b1) * 2^32 + a0 * b0; - We can determine if the above sum overflows the ulonglong range by - sequentially checking the following conditions: - 1. If both a1 and b1 are non-zero. - 2. Otherwise, if (a1 * b0 + a0 * b1) is greater than ULONG_MAX. - 3. Otherwise, if (a1 * b0 + a0 * b1) * 2^32 + a0 * b0 is greater than - ULONGLONG_MAX. - Since we also have to take the unsigned_flag for a and b into account, it is easier to first work with absolute values and set the correct sign later. */ - if (!args[0]->unsigned_flag && a < 0) - { - a_negative= TRUE; - a= -a; - } - if (!args[1]->unsigned_flag && b < 0) - { - b_negative= TRUE; - b= -b; - } + Longlong_hybrid_null ha= args[0]->to_longlong_hybrid_null(); + Longlong_hybrid_null hb= args[1]->to_longlong_hybrid_null(); - a0= 0xFFFFFFFFUL & a; - a1= ((ulonglong) a) >> 32; - b0= 0xFFFFFFFFUL & b; - b1= ((ulonglong) b) >> 32; + if ((null_value= ha.is_null() || hb.is_null())) + return 0; - if (a1 && b1) - goto err; + ULonglong_null ures= ULonglong_null::ullmul(ha.abs(), hb.abs()); + if (ures.is_null()) + return raise_integer_overflow(); - res1= (ulonglong) a1 * b0 + (ulonglong) a0 * b1; - if (res1 > 0xFFFFFFFFUL) - goto err; - - res1= res1 << 32; - res0= (ulonglong) a0 * b0; - - if (test_if_sum_overflows_ull(res1, res0)) - goto err; - res= res1 + res0; - - if (a_negative != b_negative) - { - if ((ulonglong) res > (ulonglong) LONGLONG_MIN + 1) - goto err; - res= -res; - } - else - res_unsigned= TRUE; - - return check_integer_overflow(res, res_unsigned); - -err: - return raise_integer_overflow(); + return check_integer_overflow(ULonglong_hybrid(ures.value(), + ha.neg() != hb.neg())); } @@ -1647,15 +1600,8 @@ longlong Item_func_int_div::val_int() return 0; } - bool res_negative= val0.neg() != val1.neg(); - ulonglong res= val0.abs() / val1.abs(); - if (res_negative) - { - if (res > (ulonglong) LONGLONG_MAX) - return raise_integer_overflow(); - res= (ulonglong) (-(longlong) res); - } - return check_integer_overflow(res, !res_negative); + return check_integer_overflow(ULonglong_hybrid(val0.abs() / val1.abs(), + val0.neg() != val1.neg())); } @@ -1689,9 +1635,8 @@ longlong Item_func_mod::int_op() LONGLONG_MIN by -1 generates SIGFPE, we calculate using unsigned values and then adjust the sign appropriately. */ - ulonglong res= val0.abs() % val1.abs(); - return check_integer_overflow(val0.neg() ? -(longlong) res : res, - !val0.neg()); + return check_integer_overflow(ULonglong_hybrid(val0.abs() % val1.abs(), + val0.neg())); } double Item_func_mod::real_op() @@ -2358,6 +2303,16 @@ bool Item_func_int_val::fix_length_and_dec(THD *thd) } +bool Item_func_int_val::native_op(THD *thd, Native *to) +{ + // TODO: turn Item_func_int_val into Item_handled_func eventually. + if (type_handler()->mysql_timestamp_type() == MYSQL_TIMESTAMP_TIME) + return Time(thd, this).to_native(to, decimals); + DBUG_ASSERT(0); + return true; +} + + longlong Item_func_ceiling::int_op() { switch (args[0]->result_type()) { @@ -2723,7 +2678,7 @@ longlong Item_func_round::int_op() if ((dec >= 0) || args[1]->unsigned_flag) return value; // integer have not digits after point - abs_dec= -dec; + abs_dec= Longlong(dec).abs(); // Avoid undefined behavior longlong tmp; if(abs_dec >= array_elements(log_10_int)) @@ -2787,6 +2742,16 @@ bool Item_func_round::date_op(THD *thd, MYSQL_TIME *to, date_mode_t fuzzydate) } +bool Item_func_round::native_op(THD *thd, Native *to) +{ + // TODO: turn Item_func_round into Item_handled_func eventually. + if (type_handler()->mysql_timestamp_type() == MYSQL_TIMESTAMP_TIME) + return Time(thd, this).to_native(to, decimals); + DBUG_ASSERT(0); + return true; +} + + void Item_func_rand::seed_random(Item *arg) { /* diff --git a/sql/item_func.h b/sql/item_func.h index 6df3b98276b..435875bd6c3 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -243,12 +243,23 @@ public: */ inline longlong check_integer_overflow(longlong value, bool val_unsigned) { - if ((unsigned_flag && !val_unsigned && value < 0) || - (!unsigned_flag && val_unsigned && - (ulonglong) value > (ulonglong) LONGLONG_MAX)) - return raise_integer_overflow(); - return value; + return check_integer_overflow(Longlong_hybrid(value, val_unsigned)); } + + // Check if the value is compatible with Item::unsigned_flag. + inline longlong check_integer_overflow(const Longlong_hybrid &sval) + { + Longlong_null res= sval.val_int(unsigned_flag); + return res.is_null() ? raise_integer_overflow() : res.value(); + } + + // Check if the value is compatible with Item::unsigned_flag. + longlong check_integer_overflow(const ULonglong_hybrid &uval) + { + Longlong_null res= uval.val_int(unsigned_flag); + return res.is_null() ? raise_integer_overflow() : res.value(); + } + /** Throw an error if the error code of a DECIMAL operation is E_DEC_OVERFLOW. */ @@ -2005,11 +2016,7 @@ public: } bool fix_length_and_dec(THD *thd) override; String *str_op(String *str) override { DBUG_ASSERT(0); return 0; } - bool native_op(THD *thd, Native *to) override - { - DBUG_ASSERT(0); - return true; - } + bool native_op(THD *thd, Native *to) override; }; @@ -2074,11 +2081,7 @@ public: my_decimal *decimal_op(my_decimal *) override; bool date_op(THD *thd, MYSQL_TIME *ltime, date_mode_t fuzzydate) override; bool time_op(THD *thd, MYSQL_TIME *ltime) override; - bool native_op(THD *thd, Native *to) override - { - DBUG_ASSERT(0); - return true; - } + bool native_op(THD *thd, Native *to) override; String *str_op(String *str) override { DBUG_ASSERT(0); diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index 97306c18d8f..c5d171c5a73 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -3665,8 +3665,12 @@ String *Item_func_conv::val_str(String *str) from_base, &endptr, &err); } + uint dummy_errors; if (!(ptr= longlong2str(dec, ans, to_base)) || - str->copy(ans, (uint32) (ptr - ans), default_charset())) + (collation.collation->state & MY_CS_NONASCII) ? + str->copy(ans, (uint32) (ptr - ans), &my_charset_latin1, + collation.collation, &dummy_errors) : + str->copy(ans, (uint32) (ptr - ans), collation.collation)) { null_value= 1; return NULL; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 6e4c5f48928..ff004bbb045 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -4622,16 +4622,11 @@ void subselect_union_engine::print(String *str, enum_query_type query_type) void subselect_uniquesubquery_engine::print(String *str, enum_query_type query_type) { + TABLE *table= tab->tab_list ? tab->tab_list->table : tab->table; str->append(STRING_WITH_LEN("(")); tab->ref.items[0]->print(str, query_type); - if (!tab->table) - { - // table is not opened so unknown - str->append(')'); - return; - } str->append(STRING_WITH_LEN(" in ")); - if (tab->table->s->table_category == TABLE_CATEGORY_TEMPORARY) + if (table->s->table_category == TABLE_CATEGORY_TEMPORARY) { /* Temporary tables' names change across runs, so they can't be used for @@ -4640,8 +4635,8 @@ void subselect_uniquesubquery_engine::print(String *str, str->append(STRING_WITH_LEN("")); } else - str->append(&tab->table->s->table_name); - KEY *key_info= tab->table->key_info+ tab->ref.key; + str->append(&table->s->table_name); + KEY *key_info= table->key_info+ tab->ref.key; str->append(STRING_WITH_LEN(" on ")); str->append(&key_info->name); if (cond) @@ -4659,12 +4654,13 @@ all other tests pass. void subselect_uniquesubquery_engine::print(String *str) { - KEY *key_info= tab->table->key_info + tab->ref.key; + TABLE *table= tab->tab_list ? tab->tab_list->table : tab->table; + KEY *key_info= table->key_info + tab->ref.key; str->append(STRING_WITH_LEN("(")); for (uint i= 0; i < key_info->user_defined_key_parts; i++) tab->ref.items[i]->print(str); str->append(STRING_WITH_LEN(" in ")); - str->append(&tab->table->s->table_name); + str->append(&table->s->table_name); str->append(STRING_WITH_LEN(" on ")); str->append(&key_info->name); if (cond) @@ -4679,11 +4675,12 @@ void subselect_uniquesubquery_engine::print(String *str) void subselect_indexsubquery_engine::print(String *str, enum_query_type query_type) { + TABLE *table= tab->tab_list ? tab->tab_list->table : tab->table; str->append(STRING_WITH_LEN("(")); tab->ref.items[0]->print(str, query_type); str->append(STRING_WITH_LEN(" in ")); - str->append(tab->table->s->table_name.str, tab->table->s->table_name.length); - KEY *key_info= tab->table->key_info+ tab->ref.key; + str->append(&table->s->table_name); + KEY *key_info= table->key_info+ tab->ref.key; str->append(STRING_WITH_LEN(" on ")); str->append(&key_info->name); if (check_null) @@ -5366,6 +5363,7 @@ subselect_hash_sj_engine::make_unique_engine() DBUG_RETURN(NULL); tab->table= tmp_table; + tab->tab_list= 0; tab->preread_init_done= FALSE; tab->ref.tmp_table_index_lookup_init(thd, tmp_key, it, FALSE); diff --git a/sql/item_xmlfunc.cc b/sql/item_xmlfunc.cc index 7c209060c37..85ec05168e6 100644 --- a/sql/item_xmlfunc.cc +++ b/sql/item_xmlfunc.cc @@ -2647,19 +2647,21 @@ static int my_xpath_parse_VariableReference(MY_XPATH *xpath) { LEX_CSTRING name; - int user_var; - const char *dollar_pos; THD *thd= xpath->thd; - if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_DOLLAR) || - (!(dollar_pos= xpath->prevtok.beg)) || - (!((user_var= my_xpath_parse_term(xpath, MY_XPATH_LEX_AT) && + if (!my_xpath_parse_term(xpath, MY_XPATH_LEX_DOLLAR)) + return 0; + const char *dollar_pos= xpath->prevtok.beg; + if (!dollar_pos) + return 0; + int user_var= my_xpath_parse_term(xpath, MY_XPATH_LEX_AT); + if (!((user_var && my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT))) && - !my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT))) + !my_xpath_parse_term(xpath, MY_XPATH_LEX_IDENT)) return 0; name.length= xpath->prevtok.end - xpath->prevtok.beg; name.str= (char*) xpath->prevtok.beg; - + if (user_var) xpath->item= new (thd->mem_root) Item_func_get_user_var(thd, &name); else diff --git a/sql/lex_string.h b/sql/lex_string.h index e7a732346c4..56f37706aa8 100644 --- a/sql/lex_string.h +++ b/sql/lex_string.h @@ -50,6 +50,60 @@ class Lex_cstring : public LEX_CSTRING str= _str; length= _len; } + + /* + Trim left white spaces. + Assumes that there are no multi-bytes characters + that can be considered white-space. + */ + Lex_cstring ltrim_whitespace(CHARSET_INFO *cs) const + { + DBUG_ASSERT(cs->mbminlen == 1); + Lex_cstring str= *this; + while (str.length > 0 && my_isspace(cs, str.str[0])) + { + str.length--; + str.str++; + } + return str; + } + + /* + Trim right white spaces. + Assumes that there are no multi-bytes characters + that can be considered white-space. + Also, assumes that the character set supports backward space parsing. + */ + Lex_cstring rtrim_whitespace(CHARSET_INFO *cs) const + { + DBUG_ASSERT(cs->mbminlen == 1); + Lex_cstring str= *this; + while (str.length > 0 && my_isspace(cs, str.str[str.length - 1])) + { + str.length --; + } + return str; + } + + /* + Trim all spaces. + */ + Lex_cstring trim_whitespace(CHARSET_INFO *cs) const + { + return ltrim_whitespace(cs).rtrim_whitespace(cs); + } + + /* + Trim all spaces and return the length of the leading space sequence. + */ + Lex_cstring trim_whitespace(CHARSET_INFO *cs, size_t *prefix_length) const + { + Lex_cstring tmp= Lex_cstring(*this).ltrim_whitespace(cs); + if (prefix_length) + *prefix_length= tmp.str - str; + return tmp.rtrim_whitespace(cs); + } + }; diff --git a/sql/log.cc b/sql/log.cc index c39a581556b..427543ae289 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -8027,7 +8027,7 @@ MYSQL_BIN_LOG::queue_for_group_commit(group_commit_entry *orig_entry) Setting this flag may or may not be seen by the other thread, but we are safe in any case: The other thread will set queued_by_other under - its LOCK_wait_commit, and we will not check queued_by_other only after + its LOCK_wait_commit, and we will not check queued_by_other until after we have been woken up. */ wfc->opaque_pointer= orig_entry; @@ -8124,7 +8124,7 @@ MYSQL_BIN_LOG::queue_for_group_commit(group_commit_entry *orig_entry) is pointed to by `last` (we do not use NULL to terminate the list). As we process an entry, any waiters for that entry are added at the end of - the list, to be processed in subsequent iterations. The the entry is added + the list, to be processed in subsequent iterations. Then the entry is added to the group_commit_queue. This continues until the list is exhausted, with all entries ever added eventually processed. @@ -12015,7 +12015,7 @@ get_gtid_list_event(IO_CACHE *cache, Gtid_list_log_event **out_gtid_list) if (fdle->start_decryption((Start_encryption_log_event*) ev)) { errormsg= "Could not set up decryption for binlog."; - break; + typ= UNKNOWN_EVENT; // to cleanup and abort below } } delete ev; diff --git a/sql/log_event_server.cc b/sql/log_event_server.cc index d24b8f1be3d..afc0066de98 100644 --- a/sql/log_event_server.cc +++ b/sql/log_event_server.cc @@ -3603,7 +3603,10 @@ Gtid_log_event::Gtid_log_event(THD *thd_arg, uint64 seq_no_arg, thd_arg->transaction->all.has_created_dropped_temp_table() || thd_arg->transaction->all.trans_executed_admin_cmd()) flags2|= FL_DDL; - else if (is_transactional && !is_tmp_table) + else if (is_transactional && !is_tmp_table && + !(thd_arg->transaction->all.modified_non_trans_table && + thd->variables.binlog_direct_non_trans_update == 0 && + !thd->is_current_stmt_binlog_format_row())) flags2|= FL_TRANSACTIONAL; if (!(thd_arg->variables.option_bits & OPTION_RPL_SKIP_PARALLEL)) flags2|= FL_ALLOW_PARALLEL; @@ -8778,6 +8781,11 @@ Update_rows_log_event::do_exec_row(rpl_group_info *rgi) return error; } + const bool history_change= m_table->versioned() ? + !m_table->vers_end_field()->is_max() : false; + TABLE_LIST *tl= m_table->pos_in_table_list; + uint8 trg_event_map_save= tl->trg_event_map; + /* This is the situation after locating BI: @@ -8843,9 +8851,17 @@ Update_rows_log_event::do_exec_row(rpl_group_info *rgi) goto err; } - if (m_vers_from_plain && m_table->versioned(VERS_TIMESTAMP)) - m_table->vers_update_fields(); + if (m_table->versioned()) + { + if (m_vers_from_plain && m_table->versioned(VERS_TIMESTAMP)) + m_table->vers_update_fields(); + if (!history_change && !m_table->vers_end_field()->is_max()) + { + tl->trg_event_map|= trg2bit(TRG_EVENT_DELETE); + } + } error= m_table->file->ha_update_row(m_table->record[1], m_table->record[0]); + tl->trg_event_map= trg_event_map_save; if (unlikely(error == HA_ERR_RECORD_IS_THE_SAME)) error= 0; if (m_vers_from_plain && m_table->versioned(VERS_TIMESTAMP)) diff --git a/sql/opt_range.cc b/sql/opt_range.cc index e84a2a1b4a0..6161f3854ee 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -1962,19 +1962,25 @@ public: Use this constructor if value->save_in_field() went precisely, without any data rounding or truncation. */ - SEL_ARG_LT(const uchar *key, Field *field) + SEL_ARG_LT(const uchar *key, const KEY_PART *key_part, Field *field) :SEL_ARG_LE(key, field) - { max_flag= NEAR_MAX; } + { + // Don't use open ranges for partial key_segments + if (!(key_part->flag & HA_PART_KEY_SEG)) + max_flag= NEAR_MAX; + } /* Use this constructor if value->save_in_field() returned success, but we don't know if rounding or truncation happened (as some Field::store() do not report minor data changes). */ - SEL_ARG_LT(THD *thd, const uchar *key, Field *field, - Item *value) + SEL_ARG_LT(THD *thd, const uchar *key, + const KEY_PART *key_part, Field *field, Item *value) :SEL_ARG_LE(key, field) { - if (stored_field_cmp_to_item(thd, field, value) == 0) + // Don't use open ranges for partial key_segments + if (!(key_part->flag & HA_PART_KEY_SEG) && + stored_field_cmp_to_item(thd, field, value) == 0) max_flag= NEAR_MAX; } }; @@ -2888,6 +2894,13 @@ int SQL_SELECT::test_quick_select(THD *thd, key_map keys_to_use, tree= cond->get_mm_tree(¶m, &cond); if (notnull_cond_tree) tree= tree_and(¶m, tree, notnull_cond_tree); + if (thd->trace_started() && + param.alloced_sel_args >= SEL_ARG::MAX_SEL_ARGS) + { + Json_writer_object wrapper(thd); + Json_writer_object obj(thd, "sel_arg_alloc_limit_hit"); + obj.add("alloced_sel_args", param.alloced_sel_args); + } } if (tree) { @@ -9002,7 +9015,8 @@ SEL_ARG *Field::stored_field_make_mm_leaf_bounded_int(RANGE_OPT_PARAM *param, DBUG_RETURN(new (param->mem_root) SEL_ARG_IMPOSSIBLE(this)); longlong item_val= value->val_int(); - if (op == SCALAR_CMP_LT && item_val > 0) + if (op == SCALAR_CMP_LT && ((item_val > 0) + || (value->unsigned_flag && (ulonglong)item_val > 0 ))) op= SCALAR_CMP_LE; // e.g. rewrite (tinyint < 200) to (tinyint <= 127) else if (op == SCALAR_CMP_GT && !unsigned_field && !value->unsigned_flag && item_val < 0) @@ -9046,7 +9060,7 @@ SEL_ARG *Field::stored_field_make_mm_leaf(RANGE_OPT_PARAM *param, case SCALAR_CMP_LE: DBUG_RETURN(new (mem_root) SEL_ARG_LE(str, this)); case SCALAR_CMP_LT: - DBUG_RETURN(new (mem_root) SEL_ARG_LT(thd, str, this, value)); + DBUG_RETURN(new (mem_root) SEL_ARG_LT(thd, str, key_part, this, value)); case SCALAR_CMP_GT: DBUG_RETURN(new (mem_root) SEL_ARG_GT(thd, str, key_part, this, value)); case SCALAR_CMP_GE: @@ -9075,7 +9089,7 @@ SEL_ARG *Field::stored_field_make_mm_leaf_exact(RANGE_OPT_PARAM *param, case SCALAR_CMP_LE: DBUG_RETURN(new (param->mem_root) SEL_ARG_LE(str, this)); case SCALAR_CMP_LT: - DBUG_RETURN(new (param->mem_root) SEL_ARG_LT(str, this)); + DBUG_RETURN(new (param->mem_root) SEL_ARG_LT(str, key_part, this)); case SCALAR_CMP_GT: DBUG_RETURN(new (param->mem_root) SEL_ARG_GT(str, key_part, this)); case SCALAR_CMP_GE: diff --git a/sql/opt_split.cc b/sql/opt_split.cc index 43cd5517b6c..edac837dbbf 100644 --- a/sql/opt_split.cc +++ b/sql/opt_split.cc @@ -962,7 +962,7 @@ SplM_plan_info * JOIN_TAB::choose_best_splitting(uint idx, SplM_plan_info *spl_plan= 0; uint best_key= 0; uint best_key_parts= 0; - table_map best_param_tables; + table_map best_param_tables= 0L; Json_writer_object trace_obj(thd, "choose_best_splitting"); Json_writer_array trace_arr(thd, "considered_keys"); /* diff --git a/sql/opt_subselect.cc b/sql/opt_subselect.cc index 46db641987b..69d34202e20 100644 --- a/sql/opt_subselect.cc +++ b/sql/opt_subselect.cc @@ -4207,6 +4207,7 @@ bool setup_sj_materialization_part1(JOIN_TAB *sjm_tab) sjm->materialized= FALSE; sjm_tab->table= sjm->table; + sjm_tab->tab_list= emb_sj_nest; sjm->table->pos_in_table_list= emb_sj_nest; DBUG_RETURN(FALSE); diff --git a/sql/partition_info.cc b/sql/partition_info.cc index 0d082a2b4f6..1b65de6e3c0 100644 --- a/sql/partition_info.cc +++ b/sql/partition_info.cc @@ -986,6 +986,8 @@ bool vers_create_partitions(THD *thd, TABLE_LIST* tl, uint num_parts) goto exit; } + alter_info.db= alter_ctx.db; + alter_info.table_name= alter_ctx.table_name; if (fast_alter_partition_table(thd, table, &alter_info, &alter_ctx, &create_info, tl)) { diff --git a/sql/rpl_gtid.cc b/sql/rpl_gtid.cc index c4e5c75b10a..17ef96dfd5e 100644 --- a/sql/rpl_gtid.cc +++ b/sql/rpl_gtid.cc @@ -46,9 +46,7 @@ rpl_slave_state::update_state_hash(uint64 sub_id, rpl_gtid *gtid, void *hton, there will not be an attempt to delete the corresponding table row before it is even committed. */ - mysql_mutex_lock(&LOCK_slave_state); err= update(gtid->domain_id, gtid->server_id, sub_id, gtid->seq_no, hton, rgi); - mysql_mutex_unlock(&LOCK_slave_state); if (err) { sql_print_warning("Slave: Out of memory during slave state maintenance. " @@ -293,11 +291,24 @@ rpl_slave_state::truncate_hash() int rpl_slave_state::update(uint32 domain_id, uint32 server_id, uint64 sub_id, uint64 seq_no, void *hton, rpl_group_info *rgi) +{ + int res; + mysql_mutex_lock(&LOCK_slave_state); + res= update_nolock(domain_id, server_id, sub_id, seq_no, hton, rgi); + mysql_mutex_unlock(&LOCK_slave_state); + return res; +} + + +int +rpl_slave_state::update_nolock(uint32 domain_id, uint32 server_id, uint64 sub_id, + uint64 seq_no, void *hton, rpl_group_info *rgi) { element *elem= NULL; list_element *list_elem= NULL; DBUG_ASSERT(hton || !loaded); + mysql_mutex_assert_owner(&LOCK_slave_state); if (!(elem= get_element(domain_id))) return 1; @@ -311,7 +322,6 @@ rpl_slave_state::update(uint32 domain_id, uint32 server_id, uint64 sub_id, of all pending MASTER_GTID_WAIT(), so we do not slow down the replication SQL thread. */ - mysql_mutex_assert_owner(&LOCK_slave_state); elem->gtid_waiter= NULL; mysql_cond_broadcast(&elem->COND_wait_gtid); } @@ -1392,6 +1402,7 @@ rpl_slave_state::load(THD *thd, const char *state_from_master, size_t len, { const char *end= state_from_master + len; + mysql_mutex_assert_not_owner(&LOCK_slave_state); if (reset) { if (truncate_state_table(thd)) diff --git a/sql/rpl_gtid.h b/sql/rpl_gtid.h index 8fed16543f3..7d25ee6e75d 100644 --- a/sql/rpl_gtid.h +++ b/sql/rpl_gtid.h @@ -246,6 +246,8 @@ struct rpl_slave_state ulong count() const { return hash.records; } int update(uint32 domain_id, uint32 server_id, uint64 sub_id, uint64 seq_no, void *hton, rpl_group_info *rgi); + int update_nolock(uint32 domain_id, uint32 server_id, uint64 sub_id, + uint64 seq_no, void *hton, rpl_group_info *rgi); int truncate_state_table(THD *thd); void select_gtid_pos_table(THD *thd, LEX_CSTRING *out_tablename); int record_gtid(THD *thd, const rpl_gtid *gtid, uint64 sub_id, diff --git a/sql/rpl_parallel.cc b/sql/rpl_parallel.cc index 1e07ca582da..9b7e36e0155 100644 --- a/sql/rpl_parallel.cc +++ b/sql/rpl_parallel.cc @@ -27,6 +27,9 @@ struct rpl_parallel_thread_pool global_rpl_thread_pool; static void signal_error_to_sql_driver_thread(THD *thd, rpl_group_info *rgi, int err); +static void +register_wait_for_prior_event_group_commit(rpl_group_info *rgi, + rpl_parallel_entry *entry); static int rpt_handle_event(rpl_parallel_thread::queued_event *qev, @@ -154,15 +157,35 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id, return; thd->get_stmt_da()->set_overwrite_status(true); + + if (unlikely(rgi->worker_error)) + { + /* + In case a previous wait was killed, we need to re-register to be able to + repeat the wait. + + And before doing that, we un-register any previous registration (in case + we got an error earlier and skipped waiting). + */ + thd->wait_for_commit_ptr->unregister_wait_for_prior_commit(); + mysql_mutex_lock(&entry->LOCK_parallel_entry); + register_wait_for_prior_event_group_commit(rgi, entry); + mysql_mutex_unlock(&entry->LOCK_parallel_entry); + } + /* Remove any left-over registration to wait for a prior commit to complete. Normally, such wait would already have been removed at this point by wait_for_prior_commit() called from within COMMIT - processing. However, in case of MyISAM and no binlog, we might not - have any commit processing, and so we need to do the wait here, - before waking up any subsequent commits, to preserve correct - order of event execution. Also, in the error case we might have - skipped waiting and thus need to remove it explicitly. + processing. + + However, in case of MyISAM and no binlog, we might not have any commit + processing, and so we need to do the wait here, before waking up any + subsequent commits, to preserve correct order of event execution. + + Also, in the error case we might have skipped waiting and thus need to + remove it explicitly. Or the wait might have been killed and we need to + repeat the registration and the wait. It is important in the non-error case to do a wait, not just an unregister. Because we might be last in a group-commit that is @@ -175,8 +198,18 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id, all earlier event groups have also committed; this way no more mark_start_commit() calls can be made and it is safe to de-allocate the GCO. + + Thus this final wait is done with kill ignored during the wait. This is + fine, at this point there is no active query or transaction to abort, and + the thread will continue as soon as earlier event groups complete. + + Note though, that in the non-error case there is no guarantee that + finish_event_group() will be run in-order. For example, a successful + binlog group commit will wakeup all participating event groups + simultaneously so only thread scheduling will decide the order in which + finish_event_group() calls acquire LOCK_parallel_entry. */ - err= wfc->wait_for_prior_commit(thd); + err= wfc->wait_for_prior_commit(thd, false); if (unlikely(err) && !rgi->worker_error) signal_error_to_sql_driver_thread(thd, rgi, err); thd->wait_for_commit_ptr= NULL; @@ -245,8 +278,7 @@ finish_event_group(rpl_parallel_thread *rpt, uint64 sub_id, not yet started should just skip their group, preparing for stop of the SQL driver thread. */ - if (unlikely(rgi->worker_error) && - entry->stop_on_error_sub_id == (uint64)ULONGLONG_MAX) + if (unlikely(rgi->worker_error) && entry->stop_on_error_sub_id > sub_id) entry->stop_on_error_sub_id= sub_id; mysql_mutex_unlock(&entry->LOCK_parallel_entry); #ifdef ENABLED_DEBUG_SYNC @@ -291,16 +323,11 @@ static void signal_error_to_sql_driver_thread(THD *thd, rpl_group_info *rgi, int err) { rgi->worker_error= err; - /* - In case we get an error during commit, inform following transactions that - we aborted our commit. - */ DBUG_EXECUTE_IF("hold_worker2_favor_worker3", { if (rgi->current_gtid.seq_no == 2002) { debug_sync_set_action(thd, STRING_WITH_LEN("now WAIT_FOR cont_worker2")); }}); - rgi->unmark_start_commit(); rgi->cleanup_context(thd, true); rgi->rli->abort_slave= true; rgi->rli->stop_for_until= false; @@ -347,7 +374,7 @@ register_wait_for_prior_event_group_commit(rpl_group_info *rgi, Do not start parallel execution of this event group until all prior groups have reached the commit phase that are not safe to run in parallel with. */ -static bool +static void do_gco_wait(rpl_group_info *rgi, group_commit_orderer *gco, bool *did_enter_cond, PSI_stage_info *old_stage) { @@ -399,18 +426,45 @@ do_gco_wait(rpl_group_info *rgi, group_commit_orderer *gco, &entry->LOCK_parallel_entry); } while (wait_count > entry->count_committing_event_groups); } +} - if (entry->force_abort && wait_count > entry->stop_count) + +static bool +do_stop_handling(rpl_group_info *rgi) +{ + bool should_stop= false; + rpl_parallel_entry *entry= rgi->parallel_entry; + + mysql_mutex_assert_owner(&entry->LOCK_parallel_entry); + + if (unlikely(entry->force_abort) && rgi->gtid_sub_id > entry->stop_sub_id) { /* - We are stopping (STOP SLAVE), and this event group is beyond the point - where we can safely stop. So return a flag that will cause us to skip, - rather than execute, the following events. + We are stopping (STOP SLAVE), and this event group need not be applied + before we can safely stop. So return a flag that will cause us to skip, + rather than execute, the following events. Once all queued events have + been skipped, the STOP SLAVE is complete (for this thread). */ - return true; + should_stop= true; } - else - return false; + + if (unlikely(entry->stop_on_error_sub_id <= rgi->wait_commit_sub_id)) + { + rgi->worker_error= 1; + should_stop= true; + } + + if (likely(!should_stop)) + { + /* + Since we did not decide to stop, bump the largest_started_sub_id while + still holding LOCK_parallel_entry. + */ + if (rgi->gtid_sub_id > entry->largest_started_sub_id) + entry->largest_started_sub_id= rgi->gtid_sub_id; + } + + return should_stop; } @@ -457,15 +511,25 @@ do_ftwrl_wait(rpl_group_info *rgi, mysql_cond_wait(&entry->COND_parallel_entry, &entry->LOCK_parallel_entry); } while (sub_id > entry->pause_sub_id); + DBUG_EXECUTE_IF("delay_ftwrl_wait_gtid_0_x_100", { + if (rgi->current_gtid.domain_id == 0 && + rgi->current_gtid.seq_no == 100) { + /* + Simulate delayed wakeup from the mysql_cond_wait(). To do this, we + need to have the LOCK_parallel_entry mutex released during the wait. + */ + mysql_mutex_unlock(&entry->LOCK_parallel_entry); + debug_sync_set_action(thd, + STRING_WITH_LEN("now SIGNAL pause_wait_started WAIT_FOR pause_wait_continue")); + mysql_mutex_lock(&entry->LOCK_parallel_entry); + } + }); /* We do not call EXIT_COND() here, as this will be done later by our caller (since we set *did_enter_cond to true). */ } - if (sub_id > entry->largest_started_sub_id) - entry->largest_started_sub_id= sub_id; - DBUG_RETURN(aborted); } @@ -624,7 +688,17 @@ rpl_pause_for_ftwrl(THD *thd) mysql_mutex_unlock(&rpt->LOCK_rpl_thread); ++e->need_sub_id_signal; if (e->pause_sub_id == (uint64)ULONGLONG_MAX) + { e->pause_sub_id= e->largest_started_sub_id; + DBUG_EXECUTE_IF("pause_for_ftwrl_wait", { + mysql_mutex_unlock(&e->LOCK_parallel_entry); + debug_sync_set_action(thd, + STRING_WITH_LEN("now " + "SIGNAL pause_ftwrl_waiting " + "WAIT_FOR pause_ftwrl_cont")); + mysql_mutex_lock(&e->LOCK_parallel_entry); + }); + } thd->ENTER_COND(&e->COND_parallel_entry, &e->LOCK_parallel_entry, &stage_waiting_for_ftwrl_threads_to_pause, &old_stage); thd->set_time_for_next_stage(); @@ -860,10 +934,12 @@ do_retry: for (;;) { mysql_mutex_lock(&entry->LOCK_parallel_entry); - register_wait_for_prior_event_group_commit(rgi, entry); - if (entry->stop_on_error_sub_id != (uint64) ULONGLONG_MAX && - !DBUG_IF("simulate_mdev_12746") && - rgi->gtid_sub_id >= entry->stop_on_error_sub_id) + if (rgi->gtid_sub_id < entry->stop_on_error_sub_id || + DBUG_IF("simulate_mdev_12746")) + { + register_wait_for_prior_event_group_commit(rgi, entry); + } + else { /* A failure of a preceding "parent" transaction may not be @@ -1301,14 +1377,15 @@ handle_rpl_parallel_thread(void *arg) event_gtid_sub_id= rgi->gtid_sub_id; rgi->thd= thd; - mysql_mutex_lock(&entry->LOCK_parallel_entry); - skip_event_group= do_gco_wait(rgi, gco, &did_enter_cond, &old_stage); + DBUG_EXECUTE_IF("gco_wait_delay_gtid_0_x_99", { + if (rgi->current_gtid.domain_id == 0 && rgi->current_gtid.seq_no == 99) { + debug_sync_set_action(thd, + STRING_WITH_LEN("now SIGNAL gco_wait_paused WAIT_FOR gco_wait_cont")); + } }); - if (unlikely(entry->stop_on_error_sub_id <= rgi->wait_commit_sub_id)) - { - skip_event_group= true; - rgi->worker_error= 1; - } + mysql_mutex_lock(&entry->LOCK_parallel_entry); + do_gco_wait(rgi, gco, &did_enter_cond, &old_stage); + skip_event_group= do_stop_handling(rgi); if (likely(!skip_event_group)) skip_event_group= do_ftwrl_wait(rgi, &did_enter_cond, &old_stage); @@ -2588,9 +2665,7 @@ rpl_parallel::find(uint32 domain_id, Relay_log_info *rli) mysql_cond_init(key_COND_parallel_entry, &e->COND_parallel_entry, NULL); if (my_hash_insert(&domain_hash, (uchar *)e)) { - mysql_cond_destroy(&e->COND_parallel_entry); - mysql_mutex_destroy(&e->LOCK_parallel_entry); - my_free(e); + free_rpl_parallel_entry(e); return NULL; } } @@ -2634,20 +2709,18 @@ rpl_parallel::wait_for_done(THD *thd, Relay_log_info *rli) are also executed, so that we stop at a consistent point in the binlog stream (per replication domain). - All event groups wait for e->count_committing_event_groups to reach - the value of group_commit_orderer::wait_count before starting to - execute. Thus, at this point we know that any event group with a - strictly larger wait_count are safe to skip, none of them can have - started executing yet. So we set e->stop_count here and use it to - decide in the worker threads whether to continue executing an event - group or whether to skip it, when force_abort is set. + At this point, we are holding LOCK_parallel_entry, and we know that no + event group after e->largest_started_sub_id has started running yet. We + record this value in e->stop_sub_id, and then each event group can check + their own sub_id against it. If their sub_id is strictly larger, then + that event group will be skipped. If we stop due to reaching the START SLAVE UNTIL condition, then we need to continue executing any queued events up to that point. */ e->force_abort= true; - e->stop_count= rli->stop_for_until ? - e->count_queued_event_groups : e->count_committing_event_groups; + e->stop_sub_id= rli->stop_for_until ? + e->current_sub_id : e->largest_started_sub_id; mysql_mutex_unlock(&e->LOCK_parallel_entry); for (j= 0; j < e->rpl_thread_max; ++j) { @@ -2754,7 +2827,7 @@ rpl_parallel::stop_during_until() e= (struct rpl_parallel_entry *)my_hash_element(&domain_hash, i); mysql_mutex_lock(&e->LOCK_parallel_entry); if (e->force_abort) - e->stop_count= e->count_committing_event_groups; + e->stop_sub_id= e->largest_started_sub_id; mysql_mutex_unlock(&e->LOCK_parallel_entry); } } diff --git a/sql/rpl_parallel.h b/sql/rpl_parallel.h index f2bf36aa4a1..a9cfefcb02e 100644 --- a/sql/rpl_parallel.h +++ b/sql/rpl_parallel.h @@ -92,6 +92,10 @@ struct group_commit_orderer { }; uint8 flags; #ifndef DBUG_OFF + /* + Flag set when the GCO has been freed and entered the free list, to catch + (in debug) errors in the complex lifetime of this object. + */ bool gc_done; #endif }; @@ -361,13 +365,13 @@ struct rpl_parallel_entry { /* At STOP SLAVE (force_abort=true), we do not want to process all events in the queue (which could unnecessarily delay stop, if a lot of events happen - to be queued). The stop_count provides a safe point at which to stop, so + to be queued). The stop_sub_id provides a safe point at which to stop, so that everything before becomes committed and nothing after does. The value - corresponds to group_commit_orderer::wait_count; if wait_count is less than - or equal to stop_count, we execute the associated event group, else we - skip it (and all following) and stop. + corresponds to rpl_group_info::gtid_sub_id; if that is less than or equal + to stop_sub_id, we execute the associated event group, else we skip it (and + all following) and stop. */ - uint64 stop_count; + uint64 stop_sub_id; /* Cyclic array recording the last rpl_thread_max worker threads that we diff --git a/sql/rpl_rli.cc b/sql/rpl_rli.cc index 23961686560..b9317b83004 100644 --- a/sql/rpl_rli.cc +++ b/sql/rpl_rli.cc @@ -1933,7 +1933,7 @@ rpl_load_gtid_slave_state(THD *thd) for (i= 0; i < array.elements; ++i) { get_dynamic(&array, (uchar *)&tmp_entry, i); - if ((err= rpl_global_gtid_slave_state->update(tmp_entry.gtid.domain_id, + if ((err= rpl_global_gtid_slave_state->update_nolock(tmp_entry.gtid.domain_id, tmp_entry.gtid.server_id, tmp_entry.sub_id, tmp_entry.gtid.seq_no, diff --git a/sql/session_tracker.cc b/sql/session_tracker.cc index 3eacdc03b50..14cb78e8fa6 100644 --- a/sql/session_tracker.cc +++ b/sql/session_tracker.cc @@ -167,7 +167,7 @@ bool Session_sysvars_tracker::vars_list::parse_var_list(THD *thd, { push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_WRONG_VALUE_FOR_VAR, - "%.*s is not a valid system variable and will" + "%.*s is not a valid system variable and will " "be ignored.", (int)var.length, token); } else @@ -221,7 +221,7 @@ bool sysvartrack_validate_value(THD *thd, const char *str, size_t len) /* Remove leading/trailing whitespace. */ trim_whitespace(system_charset_info, &var); - if (!strcmp(var.str, "*") && !find_sys_var(thd, var.str, var.length)) + if (strcmp(var.str, "*") && !find_sys_var(thd, var.str, var.length)) return true; if (lasts) @@ -331,10 +331,9 @@ void Session_sysvars_tracker::init(THD *thd) mysql_mutex_assert_owner(&LOCK_global_system_variables); DBUG_ASSERT(thd->variables.session_track_system_variables == global_system_variables.session_track_system_variables); - DBUG_ASSERT(global_system_variables.session_track_system_variables); thd->variables.session_track_system_variables= my_strdup(PSI_INSTRUMENT_ME, - global_system_variables.session_track_system_variables, + safe_str(global_system_variables.session_track_system_variables), MYF(MY_WME | MY_THREAD_SPECIFIC)); } @@ -576,6 +575,12 @@ bool sysvartrack_global_update(THD *thd, char *str, size_t len) { LEX_STRING tmp= { str, len }; Session_sysvars_tracker::vars_list dummy; + DBUG_EXECUTE_IF("dbug_session_tracker_parse_error", + { + my_error(ER_OUTOFMEMORY, MYF(0), 1); + return true; + }); + if (!dummy.parse_var_list(thd, tmp, false, system_charset_info)) { dummy.construct_var_list(str, len + 1); diff --git a/sql/share/errmsg-utf8.txt b/sql/share/errmsg-utf8.txt index e41cf8b6eb9..feffe923fba 100644 --- a/sql/share/errmsg-utf8.txt +++ b/sql/share/errmsg-utf8.txt @@ -2479,7 +2479,6 @@ ER_TABLE_NOT_LOCKED swe "Tabell '%-.192s' är inte lÃ¥st med LOCK TABLES" ukr "Таблицю '%-.192s' не було блоковано з LOCK TABLES" ER_UNUSED_17 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" ER_WRONG_DB_NAME 42000 @@ -4276,7 +4275,6 @@ ER_NEW_ABORTING_CONNECTION 08S01 swe "Avbröt länken för trÃ¥d %lld till db '%-.192s', användare '%-.48s', host '%-.64s' (%-.64s)" ukr "Перервано з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ %lld до бази данних: '%-.192s' кориÑтувач: '%-.48s' хоÑÑ‚: '%-.64s' (%-.64s)" ER_UNUSED_10 - chi "你应当永远看ä¸åˆ°è¿™ä¸ª" eng "You should never see it" spa "Nunca lo debería vd de ver" ER_FLUSH_MASTER_BINLOG_CLOSED @@ -6861,11 +6859,9 @@ ER_EVENT_NEITHER_M_EXPR_NOR_M_AT ger "Kein DATETIME-Ausdruck angegeben" spa "No se ha suministrado expresión datetime" ER_UNUSED_2 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "No lo debería vd de ver nunca" ER_UNUSED_3 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "No lo debería vd de ver nunca" ER_EVENT_CANNOT_DELETE @@ -6912,7 +6908,6 @@ ER_CANT_LOCK_LOG_TABLE ger "Log-Tabellen können nicht gesperrt werden" spa "No puede usar bloqueos con tablas de historial (log)" ER_UNUSED_4 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE @@ -6931,7 +6926,6 @@ ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT ger "Das Binärlog-Format kann innerhalb einer gespeicherten Funktion oder eines Triggers nicht geändert werden" spa "No puedo cambiar el formato de historial (log) binario dentro de funciones almacenadas o disparadores" ER_UNUSED_13 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" ER_PARTITION_NO_TEMPORARY @@ -7198,7 +7192,6 @@ ER_CANT_CREATE_SROUTINE ger "Kann gespeicherte Routine %`s nicht erzeugen. Beachten Sie die Warnungen" spa "No puedo crear rutina alnacenada %`s. Revise los avisos" ER_UNUSED_11 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT @@ -7279,7 +7272,6 @@ ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE eng "The requested value for the heartbeat period is either negative or exceeds the maximum allowed (%u seconds)" spa "El valor requerido para el período de latido o es negativo o excede al máximo permitido (%u segundos)" ER_UNUSED_14 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" ER_CONFLICT_FN_PARSE_ERROR @@ -7762,12 +7754,10 @@ ER_BINLOG_UNSAFE_UPDATE_IGNORE spa "UPDATE IGNORE no es seguro porque el orden en el que las filas son actualizadas determina qué filas (si hay alguna) son ignoradas. Este orden no puede ser predicho y puede diferir entre maestro (master) y esclavo" ER_UNUSED_15 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" ER_UNUSED_16 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" @@ -7905,7 +7895,6 @@ ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET swe "Hittade en rad som inte passar i nÃ¥gon given partition" ER_UNUSED_5 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" @@ -8197,7 +8186,6 @@ ER_SLAVE_SILENT_RETRY_TRANSACTION spa "El esclavo debe de reintentar silenciosamente la transacción en curso" ER_UNUSED_22 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" @@ -8604,13 +8592,13 @@ ER_LAST_MYSQL_ERROR_MESSAGE start-error-number 1900 ER_UNUSED_18 - eng "" + eng "You should never see it" ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED chi "函数或表达å¼'%s'ä¸èƒ½ç”¨äºŽ%sçš„%`s" eng "Function or expression '%s' cannot be used in the %s clause of %`s" spa "La Función o expresión '%s' no se puede usar en la cláusula %s de %`s" ER_UNUSED_19 - eng "" + eng "You should never see it" ER_PRIMARY_KEY_BASED_ON_GENERATED_COLUMN chi "主键无法在生æˆçš„列上定义" eng "Primary key cannot be defined upon a generated column" @@ -8632,9 +8620,9 @@ ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN eng "This is not yet supported for generated columns" spa "Esto no está aún soportado para columnas generadas" ER_UNUSED_20 - eng "" + eng "You should never see it" ER_UNUSED_21 - eng "" + eng "You should never see it" ER_UNSUPPORTED_ENGINE_FOR_GENERATED_COLUMNS chi "%så­˜å‚¨å¼•æ“Žä¸æ”¯æŒç”Ÿæˆçš„列" eng "%s storage engine does not support generated columns" @@ -8651,15 +8639,12 @@ ER_BAD_OPTION_VALUE hindi "गलत मान '%-.64T' विकलà¥à¤ª '%-.64s' के लिà¤" spa "Valor incorrecto '%-.64T' para opción '%-.64s'" ER_UNUSED_6 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" ER_UNUSED_7 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" ER_UNUSED_8 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" ER_DATA_OVERFLOW 22003 @@ -8714,7 +8699,6 @@ ER_CONNECTION_KILLED 70100 hindi "कनेकà¥à¤¶à¤¨ को समापà¥à¤¤ कर दिया गया है" spa "La conexión fue matada" ER_UNUSED_12 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SKIP_REPLICATION @@ -8725,10 +8709,8 @@ ER_STORED_FUNCTION_PREVENTS_SWITCH_SKIP_REPLICATION chi "无法修改存储函数或触å‘器内的@@session.skip_replication" eng "Cannot modify @@session.skip_replication inside a stored function or trigger" spa "No puedo modificar @@session.skip_replication dentro de una función almacenada o disparador" -ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT - chi "查询执行被中断。查询检查至少%llu行,超过é™åˆ¶è¡Œï¼ˆ%llu)。查询结果å¯èƒ½æ˜¯ä¸å®Œæ•´çš„" - eng "Query execution was interrupted. The query examined at least %llu rows, which exceeds LIMIT ROWS EXAMINED (%llu). The query result may be incomplete" - spa "Se ha interrumpido la ejecución de la consulta (query). La consulta (query) examinó al menos %llu filas, lo cual excede LIMIT ROWS EXAMINED (%llu). El resultado de la consulta (query) puede estar incompleto" +ER_QUERY_RESULT_INCOMPLETE + eng "Query execution was interrupted. The query exceeded %s %llu. The query result may be incomplete" ER_NO_SUCH_TABLE_IN_ENGINE 42S02 chi "表'%-.192s.%-.192s'在引擎中ä¸å­˜åœ¨" eng "Table '%-.192s.%-.192s' doesn't exist in engine" @@ -8908,7 +8890,6 @@ ER_SET_STATEMENT_NOT_SUPPORTED 42000 eng "The system variable %.200s cannot be set in SET STATEMENT." spa "La variable del sistema %.200s no se puede poner en SET STATEMENT." ER_UNUSED_9 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" ER_USER_CREATE_EXISTS @@ -9091,10 +9072,8 @@ ER_WARN_ONLY_MASTER_LOG_FILE_NO_POS eng "CHANGE MASTER TO with a MASTER_LOG_FILE clause but no MASTER_LOG_POS clause may not be safe. The old position value may not be valid for the new binary log file." spa "CHANGE MASTER TO mediante una cláusula MASTER_LOG_FILE pero sin existir cláusula MASTER_LOG_POS puede no ser seguro. El valor viejo de la posición puede no ser válido para el nuevo fichero/archivo binario de historial (log)." -ER_QUERY_TIMEOUT - chi "æŸ¥è¯¢æ‰§è¡Œä¸­æ–­ï¼Œè¶…è¿‡äº†æœ€å¤§è¯­å¥æ‰§è¡Œæ—¶é—´" - eng "Query execution was interrupted, maximum statement execution time exceeded" - spa "Se ha interrumpido la ejecución de la consulta (query), se ha excedido el tiempo máximo de ejecución de sentencia" +ER_UNUSED_1 + eng "You should never see it" ER_NON_RO_SELECT_DISABLE_TIMER chi "SELECT䏿˜¯åªè¯»è¯­å¥ï¼Œç¦ç”¨è®¡æ—¶å™¨" @@ -9768,7 +9747,6 @@ ER_VERS_ENGINE_UNSUPPORTED spa "No se soporta versionado de sistema de transacción precisa para %`s" ER_UNUSED_23 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" @@ -9793,7 +9771,6 @@ ER_VERS_DROP_PARTITION_INTERVAL spa "Sólo se pueden eliminar viejas particiones al rotar mediante INTERVAL" ER_UNUSED_25 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" @@ -9888,7 +9865,6 @@ ER_VERS_ALREADY_VERSIONED spa "La tabla %`s ya es versionada del sistema" ER_UNUSED_24 - chi "你永远ä¸åº”该看到它" eng "You should never see it" spa "Nunca debería vd de ver esto" diff --git a/sql/slave.cc b/sql/slave.cc index 0aa7ac62c8b..899208068d3 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -1897,7 +1897,10 @@ static int get_master_version_and_clock(MYSQL* mysql, Master_info* mi) { mysql_mutex_lock(&mi->data_lock); mi->clock_diff_with_master= - (long) (time((time_t*) 0) - strtoul(master_row[0], 0, 10)); + (DBUG_IF("negate_clock_diff_with_master") ? + 0: + (long) (time((time_t *) 0) - strtoul(master_row[0], 0, 10))); + mysql_mutex_unlock(&mi->data_lock); } else if (check_io_slave_killed(mi, NULL)) @@ -3252,6 +3255,14 @@ static bool send_show_master_info_data(THD *thd, Master_info *mi, bool full, else { idle= mi->rli.sql_thread_caught_up; + + /* + The idleness of the SQL thread is needed for the parallel slave + because events can be ignored before distribution to a worker thread. + That is, Seconds_Behind_Master should still be calculated and visible + while the slave is processing ignored events, such as those skipped + due to slave_skip_counter. + */ if (mi->using_parallel() && idle && !mi->rli.parallel.workers_idle()) idle= false; } @@ -4273,7 +4284,6 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli, thd, STRING_WITH_LEN( "now SIGNAL paused_on_event WAIT_FOR sql_thread_continue"))); - DBUG_SET("-d,pause_sql_thread_on_next_event"); mysql_mutex_lock(&rli->data_lock); }); @@ -4290,7 +4300,8 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli, the user might be surprised to see a claim that the slave is up to date long before those queued events are actually executed. */ - if ((!rli->mi->using_parallel()) && event_can_update_last_master_timestamp(ev)) + if ((!rli->mi->using_parallel()) && + event_can_update_last_master_timestamp(ev)) { rli->last_master_timestamp= ev->when + (time_t) ev->exec_time; rli->sql_thread_caught_up= false; @@ -4345,9 +4356,22 @@ static int exec_relay_log_event(THD* thd, Relay_log_info* rli, if (rli->mi->using_parallel()) { - if (unlikely((rli->last_master_timestamp == 0 || - rli->sql_thread_caught_up) && - event_can_update_last_master_timestamp(ev))) + /* + rli->sql_thread_caught_up is checked and negated here to ensure that + the value of Seconds_Behind_Master in SHOW SLAVE STATUS is consistent + with the update of last_master_timestamp. It was previously unset + immediately after reading an event from the relay log; however, for the + duration between that unset and the time that LMT would be updated + could lead to spikes in SBM. + + The check for queued_count == dequeued_count ensures the worker threads + are all idle (i.e. all events have been executed). + */ + if ((unlikely(rli->last_master_timestamp == 0) || + (rli->sql_thread_caught_up && + (rli->last_inuse_relaylog->queued_count == + rli->last_inuse_relaylog->dequeued_count))) && + event_can_update_last_master_timestamp(ev)) { if (rli->last_master_timestamp < ev->when) { diff --git a/sql/sp.cc b/sql/sp.cc index 9c6d0380cc6..73408481082 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -3055,7 +3055,9 @@ Sp_handler::sp_load_for_information_schema(THD *thd, TABLE *proc_table, sp_cache **spc= get_cache(thd); sp_name sp_name_obj(&db, &name, true); // This can change "name" *free_sp_head= 0; - if ((sp= sp_cache_lookup(spc, &sp_name_obj))) + sp= sp_cache_lookup(spc, &sp_name_obj); + + if (sp && !(sp->sp_cache_version() < sp_cache_version())) { return sp; } diff --git a/sql/sp_head.cc b/sql/sp_head.cc index 85a812f85d9..e8104eea246 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -579,7 +579,7 @@ sp_head::sp_head(MEM_ROOT *mem_root_arg, sp_package *parent, m_next_cached_sp(0), m_param_begin(NULL), m_param_end(NULL), - m_body_begin(NULL), + m_cpp_body_begin(NULL), m_thd_root(NULL), m_thd(NULL), m_pcont(new (&main_mem_root) sp_pcontext()), @@ -840,18 +840,18 @@ sp_head::init_psi_share() void -sp_head::set_body_start(THD *thd, const char *begin_ptr) +sp_head::set_body_start(THD *thd, const char *cpp_body_start) { - m_body_begin= begin_ptr; - thd->m_parser_state->m_lip.body_utf8_start(thd, begin_ptr); + m_cpp_body_begin= cpp_body_start; + if (!m_parent) + thd->m_parser_state->m_lip.body_utf8_start(thd, cpp_body_start); } void -sp_head::set_stmt_end(THD *thd) +sp_head::set_stmt_end(THD *thd, const char *cpp_body_end) { Lex_input_stream *lip= & thd->m_parser_state->m_lip; /* shortcut */ - const char *end_ptr= lip->get_cpp_tok_start(); /* shortcut */ /* Make the string of parameters. */ @@ -863,30 +863,27 @@ sp_head::set_stmt_end(THD *thd) /* Remember end pointer for further dumping of whole statement. */ - thd->lex->stmt_definition_end= end_ptr; + thd->lex->stmt_definition_end= cpp_body_end; /* Make the string of body (in the original character set). */ - m_body.length= end_ptr - m_body_begin; - m_body.str= thd->strmake(m_body_begin, m_body.length); - trim_whitespace(thd->charset(), &m_body); + m_body= thd->strmake_lex_cstring_trim_whitespace( + Lex_cstring(m_cpp_body_begin, cpp_body_end)); /* Make the string of UTF-body. */ - lip->body_utf8_append(end_ptr); + lip->body_utf8_append(cpp_body_end); - m_body_utf8.length= lip->get_body_utf8_length(); - m_body_utf8.str= thd->strmake(lip->get_body_utf8_str(), m_body_utf8.length); - trim_whitespace(thd->charset(), &m_body_utf8); + if (!m_parent) + m_body_utf8= thd->strmake_lex_cstring_trim_whitespace(lip->body_utf8()); /* Make the string of whole stored-program-definition query (in the original character set). */ - m_defstr.length= end_ptr - lip->get_cpp_buf(); - m_defstr.str= thd->strmake(lip->get_cpp_buf(), m_defstr.length); - trim_whitespace(thd->charset(), &m_defstr); + m_defstr= thd->strmake_lex_cstring_trim_whitespace( + Lex_cstring(lip->get_cpp_buf(), cpp_body_end)); } diff --git a/sql/sp_head.h b/sql/sp_head.h index 97593930b6f..23566b5805f 100644 --- a/sql/sp_head.h +++ b/sql/sp_head.h @@ -314,7 +314,13 @@ public: const char *m_param_end; private: - const char *m_body_begin; + /* + A pointer to the body start inside the cpp buffer. + Used only during parsing. Should be removed eventually. + The affected functions/methods should be fixed to get the cpp body start + as a parameter, rather than through this member. + */ + const char *m_cpp_body_begin; public: /* @@ -351,12 +357,11 @@ public: /** Set the body-definition start position. */ void - set_body_start(THD *thd, const char *begin_ptr); + set_body_start(THD *thd, const char *cpp_body_start); /** Set the statement-definition (body-definition) end position. */ void - set_stmt_end(THD *thd); - + set_stmt_end(THD *thd, const char *cpp_body_end); bool execute_trigger(THD *thd, diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 283c629f42a..e53a35ad0cc 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -5613,7 +5613,7 @@ table_hash_search(const char *host, const char *ip, const char *db, const char *user, const char *tname, bool exact) { return (GRANT_TABLE*) name_hash_search(&column_priv_hash, host, ip, db, - user, tname, exact, FALSE); + user, tname, exact, (lower_case_table_names > 0)); } static bool column_priv_insert(GRANT_TABLE *grant) @@ -13150,7 +13150,6 @@ static bool send_server_handshake_packet(MPVIO_EXT *mpvio, if (ssl_acceptor_fd) { thd->client_capabilities |= CLIENT_SSL; - thd->client_capabilities |= CLIENT_SSL_VERIFY_SERVER_CERT; } if (data_len) diff --git a/sql/sql_alter.cc b/sql/sql_alter.cc index 5959203b36d..a9ab104f69b 100644 --- a/sql/sql_alter.cc +++ b/sql/sql_alter.cc @@ -256,6 +256,43 @@ Alter_info::algorithm(const THD *thd) const } +uint Alter_info::check_vcol_field(Item_field *item) const +{ + if (!item->field && + ((item->db_name.length && !db.streq(item->db_name)) || + (item->table_name.length && !table_name.streq(item->table_name)))) + { + char *ptr= (char*)current_thd->alloc(item->db_name.length + + item->table_name.length + + item->field_name.length + 3); + strxmov(ptr, safe_str(item->db_name.str), item->db_name.length ? "." : "", + item->table_name.str, ".", item->field_name.str, NullS); + item->field_name.str= ptr; + return VCOL_IMPOSSIBLE; + } + for (Key &k: key_list) + { + if (k.type != Key::FOREIGN_KEY) + continue; + Foreign_key *fk= (Foreign_key*) &k; + if (fk->update_opt < FK_OPTION_CASCADE && + fk->delete_opt < FK_OPTION_SET_NULL) + continue; + for (Key_part_spec& kp: fk->columns) + { + if (item->field_name.streq(kp.field_name)) + return VCOL_NON_DETERMINISTIC; + } + } + for (Create_field &cf: create_list) + { + if (item->field_name.streq(cf.field_name)) + return cf.vcol_info ? cf.vcol_info->flags : 0; + } + return 0; +} + + Alter_table_ctx::Alter_table_ctx() : db(null_clex_str), table_name(null_clex_str), alias(null_clex_str), new_db(null_clex_str), new_name(null_clex_str), new_alias(null_clex_str) diff --git a/sql/sql_alter.h b/sql/sql_alter.h index 99e717d50b2..3b27277484c 100644 --- a/sql/sql_alter.h +++ b/sql/sql_alter.h @@ -85,6 +85,7 @@ public: ALTER_TABLE_LOCK_EXCLUSIVE }; + Lex_table_name db, table_name; // Columns and keys to be dropped. List drop_list; @@ -234,6 +235,8 @@ public: */ enum_alter_table_algorithm algorithm(const THD *thd) const; + uint check_vcol_field(Item_field *f) const; + private: Alter_info &operator=(const Alter_info &rhs); // not implemented Alter_info(const Alter_info &rhs); // not implemented diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 2dbbe719c92..c9c74046fd9 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -844,7 +844,12 @@ int close_thread_tables(THD *thd) !thd->stmt_arena->is_stmt_prepare()) table->part_info->vers_check_limit(thd); #endif - table->vcol_cleanup_expr(thd); + /* + For simple locking we cleanup it here because we don't close thread + tables. For prelocking we close it when we do close thread tables. + */ + if (thd->locked_tables_mode != LTM_PRELOCKED) + table->vcol_cleanup_expr(thd); } /* Detach MERGE children after every statement. Even under LOCK TABLES. */ diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 96b17c99dd9..3c1f6700e62 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -178,7 +178,7 @@ Key::Key(const Key &rhs, MEM_ROOT *mem_root) name(rhs.name), option_list(rhs.option_list), generated(rhs.generated), invisible(false), - without_overlaps(rhs.without_overlaps), period(rhs.period) + without_overlaps(rhs.without_overlaps), old(rhs.old), period(rhs.period) { list_copy_and_replace_each_value(columns, mem_root); } @@ -214,11 +214,11 @@ Foreign_key::Foreign_key(const Foreign_key &rhs, MEM_ROOT *mem_root) We only compare field names RETURN - 0 Generated key is a prefix of other key - 1 Not equal + true Generated key is a prefix of other key + false Not a prefix */ -bool foreign_key_prefix(Key *a, Key *b) +bool is_foreign_key_prefix(Key *a, Key *b) { /* Ensure that 'a' is the generated key */ if (a->generated) @@ -229,13 +229,13 @@ bool foreign_key_prefix(Key *a, Key *b) else { if (!b->generated) - return TRUE; // No foreign key + return false; // No foreign key swap_variables(Key*, a, b); // Put generated key in 'a' } /* Test if 'a' is a prefix of 'b' */ if (a->columns.elements > b->columns.elements) - return TRUE; // Can't be prefix + return false; // Can't be prefix List_iterator col_it1(a->columns); List_iterator col_it2(b->columns); @@ -255,17 +255,17 @@ bool foreign_key_prefix(Key *a, Key *b) } } if (!found) - return TRUE; // Error + return false; // Error } - return FALSE; // Is prefix + return true; // Is prefix #else while ((col1= col_it1++)) { col2= col_it2++; if (!(*col1 == *col2)) - return TRUE; + return false; } - return FALSE; // Is prefix + return true; // Is prefix #endif } @@ -286,6 +286,8 @@ bool Foreign_key::validate(List &table_fields) List_iterator cols(columns); List_iterator it(table_fields); DBUG_ENTER("Foreign_key::validate"); + if (old) + DBUG_RETURN(FALSE); // must be good while ((column= cols++)) { it.rewind(); @@ -8043,15 +8045,22 @@ wait_for_commit::register_wait_for_prior_commit(wait_for_commit *waitee) with register_wait_for_prior_commit(). If the commit already completed, returns immediately. + If ALLOW_KILL is set to true (the default), the wait can be aborted by a + kill. In case of kill, the wait registration is still removed, so another + call of unregister_wait_for_prior_commit() is needed to later retry the + wait. If ALLOW_KILL is set to false, then kill will be ignored and this + function will not return until the prior commit (if any) has called + wakeup_subsequent_commits(). + If thd->backup_commit_lock is set, release it while waiting for other threads */ int -wait_for_commit::wait_for_prior_commit2(THD *thd) +wait_for_commit::wait_for_prior_commit2(THD *thd, bool allow_kill) { PSI_stage_info old_stage; wait_for_commit *loc_waitee; - bool backup_lock_released= 0; + bool backup_lock_released= false; /* Release MDL_BACKUP_COMMIT LOCK while waiting for other threads to commit @@ -8061,7 +8070,7 @@ wait_for_commit::wait_for_prior_commit2(THD *thd) */ if (thd->backup_commit_lock && thd->backup_commit_lock->ticket) { - backup_lock_released= 1; + backup_lock_released= true; thd->mdl_context.release_lock(thd->backup_commit_lock->ticket); thd->backup_commit_lock->ticket= 0; } @@ -8072,7 +8081,7 @@ wait_for_commit::wait_for_prior_commit2(THD *thd) &stage_waiting_for_prior_transaction_to_commit, &old_stage); while ((loc_waitee= this->waitee.load(std::memory_order_relaxed)) && - likely(!thd->check_killed(1))) + (!allow_kill || likely(!thd->check_killed(1)))) mysql_cond_wait(&COND_wait_commit, &LOCK_wait_commit); if (!loc_waitee) { @@ -8114,14 +8123,14 @@ wait_for_commit::wait_for_prior_commit2(THD *thd) use within enter_cond/exit_cond. */ DEBUG_SYNC(thd, "wait_for_prior_commit_killed"); - if (backup_lock_released) + if (unlikely(backup_lock_released)) thd->mdl_context.acquire_lock(thd->backup_commit_lock, thd->variables.lock_wait_timeout); return wakeup_error; end: thd->EXIT_COND(&old_stage); - if (backup_lock_released) + if (unlikely(backup_lock_released)) thd->mdl_context.acquire_lock(thd->backup_commit_lock, thd->variables.lock_wait_timeout); return wakeup_error; diff --git a/sql/sql_class.h b/sql/sql_class.h index bc978ff63eb..426131adddb 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -321,7 +321,7 @@ typedef struct st_copy_info { class Key_part_spec :public Sql_alloc { public: - LEX_CSTRING field_name; + Lex_ident field_name; uint length; bool generated, asc; Key_part_spec(const LEX_CSTRING *name, uint len, bool gen= false) @@ -456,6 +456,7 @@ public: bool generated; bool invisible; bool without_overlaps; + bool old; Lex_ident period; Key(enum Keytype type_par, const LEX_CSTRING *name_arg, @@ -463,7 +464,7 @@ public: :DDL_options(ddl_options), type(type_par), key_create_info(default_key_create_info), name(*name_arg), option_list(NULL), generated(generated_arg), - invisible(false), without_overlaps(false) + invisible(false), without_overlaps(false), old(false) { key_create_info.algorithm= algorithm_arg; } @@ -474,12 +475,12 @@ public: :DDL_options(ddl_options), type(type_par), key_create_info(*key_info_arg), columns(*cols), name(*name_arg), option_list(create_opt), generated(generated_arg), - invisible(false), without_overlaps(false) + invisible(false), without_overlaps(false), old(false) {} Key(const Key &rhs, MEM_ROOT *mem_root); virtual ~Key() = default; /* Equality comparison of keys (ignoring name) */ - friend bool foreign_key_prefix(Key *a, Key *b); + friend bool is_foreign_key_prefix(Key *a, Key *b); /** Used to make a clone of this object for ALTER/CREATE TABLE @sa comment for Key_part_spec::clone @@ -512,9 +513,7 @@ public: ref_db(*ref_db_arg), ref_table(*ref_table_arg), ref_columns(*ref_cols), delete_opt(delete_opt_arg), update_opt(update_opt_arg), match_opt(match_opt_arg) - { - // We don't check for duplicate FKs. - key_create_info.check_for_duplicate_indexes= false; + { } Foreign_key(const Foreign_key &rhs, MEM_ROOT *mem_root); /** @@ -2344,14 +2343,14 @@ struct wait_for_commit bool commit_started; void register_wait_for_prior_commit(wait_for_commit *waitee); - int wait_for_prior_commit(THD *thd) + int wait_for_prior_commit(THD *thd, bool allow_kill=true) { /* Quick inline check, to avoid function call and locking in the common case where no wakeup is registered, or a registered wait was already signalled. */ if (waitee.load(std::memory_order_acquire)) - return wait_for_prior_commit2(thd); + return wait_for_prior_commit2(thd, allow_kill); else { if (wakeup_error) @@ -2405,7 +2404,7 @@ struct wait_for_commit void wakeup(int wakeup_error); - int wait_for_prior_commit2(THD *thd); + int wait_for_prior_commit2(THD *thd, bool allow_kill); void wakeup_subsequent_commits2(int wakeup_error); void unregister_wait_for_prior_commit2(); @@ -3060,6 +3059,16 @@ public: return m_binlog_filter_state; } + /** + Checks if a user connection is read-only + */ + inline bool is_read_only_ctx() + { + return opt_readonly && + !(security_ctx->master_access & PRIV_IGNORE_READ_ONLY) && + !slave_thread; + } + private: /** Indicate if the current statement should be discarded @@ -4189,6 +4198,10 @@ public: { return strmake_lex_cstring(from.str, from.length); } + LEX_CSTRING strmake_lex_cstring_trim_whitespace(const LEX_CSTRING &from) + { + return strmake_lex_cstring(Lex_cstring(from).trim_whitespace(charset())); + } LEX_STRING *make_lex_string(LEX_STRING *lex_str, const char* str, size_t length) { @@ -5143,10 +5156,10 @@ public: } wait_for_commit *wait_for_commit_ptr; - int wait_for_prior_commit() + int wait_for_prior_commit(bool allow_kill=true) { if (wait_for_commit_ptr) - return wait_for_commit_ptr->wait_for_prior_commit(this); + return wait_for_commit_ptr->wait_for_prior_commit(this, allow_kill); return 0; } void wakeup_subsequent_commits(int wakeup_error) diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index c7121efb2bc..5cfe478c103 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -124,9 +124,12 @@ bool Update_plan::save_explain_data_intern(THD *thd, if (is_analyze || (thd->variables.log_slow_verbosity & LOG_SLOW_VERBOSITY_ENGINE)) + { table->file->set_time_tracker(&explain->table_tracker); - explain->handler_for_stats= table->file; + if (table->file->handler_stats && table->s->tmp_table != INTERNAL_TMP_TABLE) + explain->handler_for_stats= table->file; + } select_lex->set_explain_type(TRUE); explain->select_type= select_lex->type; diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index e5362ffe0a9..4e42bcd3353 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -1158,7 +1158,14 @@ bool TABLE_LIST::fill_recursive(THD *thd) while (!rc && !with->all_are_stabilized()) { if (with->level > thd->variables.max_recursive_iterations) + { + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + ER_QUERY_RESULT_INCOMPLETE, + ER_THD(thd, ER_QUERY_RESULT_INCOMPLETE), + "max_recursive_iterations =", + (ulonglong)thd->variables.max_recursive_iterations); break; + } with->prepare_for_next_iteration(); rc= unit->exec_recursive(); } diff --git a/sql/sql_explain.h b/sql/sql_explain.h index 139d6ea4338..894309568ba 100644 --- a/sql/sql_explain.h +++ b/sql/sql_explain.h @@ -870,12 +870,18 @@ public: Gap_time_tracker extra_time_tracker; /* - Note: This pointer is only valid until notify_tables_are_closed() is - called. After that, the tables may be freed or reused, together with their - handler_stats objects. + Handler object to get the handler_stats from. + Notes: + This pointer is only valid until notify_tables_are_closed() is called. + After that, the tables may be freed or reused, together with their + handler_stats objects. notify_tables_are_closed() disables printing of FORMAT=JSON output. r_engine_stats is only printed in FORMAT=JSON output, so we're fine. + + We do not store pointers to temporary (aka "work") tables here. + Temporary tables may be freed (e.g. by JOIN::cleanup()) or re-created + during query execution (when HEAP table is converted into Aria). */ handler *handler_for_stats; diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 4ca10b34faa..d9c2b841740 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -2026,7 +2026,8 @@ int write_record(THD *thd, TABLE *table, COPY_INFO *info, select_result *sink) if (error != HA_ERR_RECORD_IS_THE_SAME) { info->updated++; - if (table->versioned()) + if (table->versioned() && + table->vers_check_update(*info->update_fields)) { if (table->versioned(VERS_TIMESTAMP)) { @@ -4595,8 +4596,6 @@ TABLE *select_create::create_table_from_items(THD *thd, List *items, */ if (!mysql_create_table_no_lock(thd, &ddl_log_state_create, &ddl_log_state_rm, - &create_table->db, - &create_table->table_name, create_info, alter_info, NULL, select_field_count, create_table)) { diff --git a/sql/sql_join_cache.cc b/sql/sql_join_cache.cc index 36eae30de16..4f93d2e3e34 100644 --- a/sql/sql_join_cache.cc +++ b/sql/sql_join_cache.cc @@ -634,7 +634,7 @@ void JOIN_CACHE::create_remaining_fields() /* - Calculate and set all cache constants + Calculate and set all cache constants SYNOPSIS set_constants() @@ -694,16 +694,22 @@ void JOIN_CACHE::set_constants() (prev_cache ? prev_cache->get_size_of_rec_offset() : 0) + length + fields*sizeof(uint); pack_length_with_blob_ptrs= pack_length + blobs*sizeof(uchar *); - min_buff_size= 0; min_records= 1; + min_buff_size= get_min_join_buffer_size(); buff_size= (size_t)MY_MAX(join->thd->variables.join_buff_size, - get_min_join_buffer_size()); + min_buff_size); size_of_rec_ofs= offset_size(buff_size); size_of_rec_len= blobs ? size_of_rec_ofs : offset_size(len); size_of_fld_ofs= size_of_rec_len; base_prefix_length= (with_length ? size_of_rec_len : 0) + (prev_cache ? prev_cache->get_size_of_rec_offset() : 0); - /* + /* + Call ge_min_join_buffer_size() again as the size may have got smaller + if size_of_rec_ofs or some other variable changed since last call. + */ + min_buff_size= 0; + min_buff_size= get_min_join_buffer_size(); + /* The size of the offsets for referenced fields will be added later. The values of 'pack_length' and 'pack_length_with_blob_ptrs' are adjusted every time when the first reference to the referenced field is registered. @@ -767,30 +773,29 @@ uint JOIN_CACHE::get_record_max_affix_length() size_t JOIN_CACHE::get_min_join_buffer_size() { - if (!min_buff_size) + if (min_buff_size) + return min_buff_size; // use cached value + + size_t len= 0, len_last= 0, len_addon, min_sz, add_sz= 0; + + for (JOIN_TAB *tab= start_tab; tab != join_tab; + tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) { - size_t len= 0; - size_t len_last= 0; - for (JOIN_TAB *tab= start_tab; tab != join_tab; - tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) - { - len+= tab->get_max_used_fieldlength(); - len_last+= tab->get_used_fieldlength(); - } - size_t len_addon= get_record_max_affix_length() + - get_max_key_addon_space_per_record(); - len+= len_addon; - len_last+= len_addon; - size_t min_sz= len*(min_records-1) + len_last; - min_sz+= pack_length_with_blob_ptrs; - size_t add_sz= 0; - for (uint i=0; i < min_records; i++) - add_sz+= join_tab_scan->aux_buffer_incr(i+1); - avg_aux_buffer_incr= add_sz/min_records; - min_sz+= add_sz; - set_if_bigger(min_sz, 1); - min_buff_size= min_sz; + len+= tab->get_max_used_fieldlength(); + len_last+= tab->get_used_fieldlength(); } + len_addon= (get_record_max_affix_length() + + get_max_key_addon_space_per_record()); + len+= len_addon; + len_last+= len_addon; + min_sz= len*(min_records-1) + len_last; + min_sz+= pack_length_with_blob_ptrs; + for (uint i=0; i < min_records; i++) + add_sz+= join_tab_scan->aux_buffer_incr(i+1); + avg_aux_buffer_incr= add_sz/min_records; + min_sz+= add_sz; + set_if_bigger(min_sz, 1); + min_buff_size= min_sz; return min_buff_size; } @@ -805,61 +810,67 @@ size_t JOIN_CACHE::get_min_join_buffer_size() the estimated number of records in the partial join DESCRIPTION - At the first its invocation for the cache the function calculates the - maximum possible size of join buffer for the cache. If the parameter - optimize_buff_size true then this value does not exceed the size of the - space needed for the estimated number of records 'max_records' in the - partial join that joins tables from the first one through join_tab. This - value is also capped off by the value of join_tab->join_buffer_size_limit, - if it has been set a to non-zero value, and by the value of the system - parameter join_buffer_size - otherwise. After the calculation of the - interesting size the function saves the value in the field 'max_buff_size' - in order to use it directly at the next invocations of the function. - NOTES - Currently the value of join_tab->join_buffer_size_limit is initialized - to 0 and is never reset. + At the first its invocation for the cache the function calculates + the maximum possible size of join buffer for the cache. If the + parameter optimize_buff_size true then this value does not exceed + the size of the space needed for the estimated number of records + 'max_records' in the partial join that joins tables from the first + one through join_tab. This value is also capped off by the value + of the system parameter join_buffer_size. After the calculation of + the interesting size the function saves the value in the field + 'max_buff_size' in order to use it directly at the next + invocations of the function. + RETURN VALUE The maximum possible size of the join buffer of this cache */ -size_t JOIN_CACHE::get_max_join_buffer_size(bool optimize_buff_size) +size_t JOIN_CACHE::get_max_join_buffer_size(bool optimize_buff_size, + size_t min_sz) { - if (!max_buff_size) + if (max_buff_size) + return max_buff_size; // use cached value + + size_t limit_sz= (size_t) join->thd->variables.join_buff_size; + + if (!optimize_buff_size) + return max_buff_size= limit_sz; + + size_t max_sz; + size_t len= 0; + double max_records, partial_join_cardinality= + (join_tab-1)->get_partial_join_cardinality(); + /* Expected join buffer space used for one record */ + size_t space_per_record; + + for (JOIN_TAB *tab= start_tab; tab != join_tab; + tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) { - size_t max_sz; - size_t min_sz= get_min_join_buffer_size(); - size_t len= 0; - for (JOIN_TAB *tab= start_tab; tab != join_tab; - tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) - { - len+= tab->get_used_fieldlength(); - } - len+= get_record_max_affix_length(); - avg_record_length= len; - len+= get_max_key_addon_space_per_record() + avg_aux_buffer_incr; - space_per_record= len; - - size_t limit_sz= (size_t)join->thd->variables.join_buff_size; - if (join_tab->join_buffer_size_limit) - set_if_smaller(limit_sz, join_tab->join_buffer_size_limit); - if (!optimize_buff_size) - max_sz= limit_sz; - else - { - if (limit_sz / max_records > space_per_record) - max_sz= space_per_record * max_records; - else - max_sz= limit_sz; - max_sz+= pack_length_with_blob_ptrs; - set_if_smaller(max_sz, limit_sz); - } - set_if_bigger(max_sz, min_sz); - max_buff_size= max_sz; + len+= tab->get_used_fieldlength(); } + len+= get_record_max_affix_length(); + avg_record_length= len; + len+= get_max_key_addon_space_per_record() + avg_aux_buffer_incr; + space_per_record= len; + + /* Note that space_per_record can be 0 if no table fields where used */ + max_records= (double) (limit_sz / MY_MAX(space_per_record, 1)); + set_if_smaller(max_records, partial_join_cardinality); + set_if_bigger(max_records, 10.0); + + if ((size_t) (limit_sz / max_records) > space_per_record) + max_sz= space_per_record * (size_t) max_records; + else + max_sz= limit_sz; + max_sz+= pack_length_with_blob_ptrs; + set_if_smaller(max_sz, limit_sz); + + set_if_bigger(max_sz, min_sz); + max_buff_size= max_sz; return max_buff_size; -} +} /* @@ -899,16 +910,8 @@ int JOIN_CACHE::alloc_buffer() join->thd->variables.join_buff_space_limit; bool optimize_buff_size= optimizer_flag(join->thd, OPTIMIZER_SWITCH_OPTIMIZE_JOIN_BUFFER_SIZE); - double partial_join_cardinality= (join_tab-1)->get_partial_join_cardinality(); buff= NULL; - min_buff_size= 0; - max_buff_size= 0; - min_records= 1; - max_records= (size_t) (partial_join_cardinality <= join_buff_space_limit ? - (ulonglong) partial_join_cardinality : join_buff_space_limit); - set_if_bigger(max_records, 10); - min_buff_size= get_min_join_buffer_size(); - buff_size= get_max_join_buffer_size(optimize_buff_size); + buff_size= get_max_join_buffer_size(optimize_buff_size, min_buff_size); for (tab= start_tab; tab!= join_tab; tab= next_linear_tab(join, tab, WITHOUT_BUSH_ROOTS)) @@ -923,11 +926,26 @@ int JOIN_CACHE::alloc_buffer() curr_min_buff_space_sz+= min_buff_size; curr_buff_space_sz+= buff_size; - if (curr_min_buff_space_sz > join_buff_space_limit || - (curr_buff_space_sz > join_buff_space_limit && - (!optimize_buff_size || + if (optimize_buff_size) + { + /* + optimize_join_buffer_size=on used. We should limit the join + buffer space to join_buff_space_limit if possible. + */ + if (curr_min_buff_space_sz > join_buff_space_limit) + { + /* + Increase buffer size to minimum needed, to be able to use the + join buffer. + */ + join_buff_space_limit= curr_min_buff_space_sz; + } + if (curr_buff_space_sz > join_buff_space_limit && join->shrink_join_buffers(join_tab, curr_buff_space_sz, - join_buff_space_limit)))) + join_buff_space_limit)) + goto fail; // Fatal error + } + else if (curr_min_buff_space_sz > buff_size) goto fail; if (for_explain_only) @@ -1080,18 +1098,19 @@ int JOIN_CACHE::init(bool for_explain) /* - Check the possibility to read the access keys directly from the join buffer + Check the possibility to read the access keys directly from the join buffer SYNOPSIS check_emb_key_usage() DESCRIPTION - The function checks some conditions at which the key values can be read - directly from the join buffer. This is possible when the key values can be - composed by concatenation of the record fields stored in the join buffer. - Sometimes when the access key is multi-component the function has to re-order - the fields written into the join buffer to make keys embedded. If key - values for the key access are detected as embedded then 'use_emb_key' - is set to TRUE. + The function checks some conditions at which the key values can be + read directly from the join buffer. This is possible when the key + values can be composed by concatenation of the record fields + stored in the join buffer. Sometimes when the access key is + multi-component the function has to re-order the fields written + into the join buffer to make keys embedded. If key values for the + key access are detected as embedded then 'use_emb_key' is set to + TRUE. EXAMPLE Let table t2 has an index defined on the columns a,b . Let's assume also @@ -1244,7 +1263,7 @@ bool JOIN_CACHE::check_emb_key_usage() trailing spaces - significant part of fixed length fields that can have trailing spaces with the prepanded length - - data of non-blob variable length fields with the prepanded data length + - data of non-blob variable length fields with the prepanded data length - blob data from blob fields with the prepanded data length (5) record offset values for the data fields that are referred to from other caches @@ -1315,7 +1334,7 @@ uint JOIN_CACHE::write_record_data(uchar * link, bool *is_full) Check whether we won't be able to add any new record into the cache after this one because the cache will be full. Set last_record to TRUE if it's so. The assume that the cache will be full after the record has been written - into it if either the remaining space of the cache is not big enough for the + into it if either the remaining space of the cache is not big enough for the record's blob values or if there is a chance that not all non-blob fields of the next record can be placed there. This function is called only in the case when there is enough space left in @@ -1337,7 +1356,7 @@ uint JOIN_CACHE::write_record_data(uchar * link, bool *is_full) /* Put a reference to the fields of the record that are stored in the previous - cache if there is any. This reference is passed by the 'link' parameter. + cache if there is any. This reference is passed by the 'link' parameter. */ if (prev_cache) { @@ -2774,7 +2793,6 @@ bool JOIN_CACHE_BKAH::save_explain_data(EXPLAIN_BKA_TYPE *explain) int JOIN_CACHE_HASHED::init(bool for_explain) { - int rc= 0; TABLE_REF *ref= &join_tab->ref; DBUG_ENTER("JOIN_CACHE_HASHED::init"); @@ -2784,8 +2802,21 @@ int JOIN_CACHE_HASHED::init(bool for_explain) key_length= ref->key_length; - if ((rc= JOIN_CACHE::init(for_explain)) || for_explain) - DBUG_RETURN (rc); + if (JOIN_CACHE::init(for_explain)) + { + THD *thd= join->thd; + const char *errmsg= + "Could not create a join buffer. Please check and " + "adjust the value of the variables 'JOIN_BUFFER_SIZE (%llu)' and " + "'JOIN_BUFFER_SPACE_LIMIT (%llu)'"; + my_printf_error(ER_OUTOFMEMORY, errmsg, MYF(0), + thd->variables.join_buff_size, + thd->variables.join_buff_space_limit); + DBUG_RETURN (1); + } + + if (for_explain) + DBUG_RETURN(0); if (!(key_buff= (uchar*) join->thd->alloc(key_length))) DBUG_RETURN(1); diff --git a/sql/sql_join_cache.h b/sql/sql_join_cache.h index 393b3e309d3..8318fcc9411 100644 --- a/sql/sql_join_cache.h +++ b/sql/sql_join_cache.h @@ -251,9 +251,6 @@ protected: /* The expected size of the space per record in the auxiliary buffer */ size_t avg_aux_buffer_incr; - /* Expected join buffer space used for one record */ - size_t space_per_record; - /* Pointer to the beginning of the join buffer */ uchar *buff; /* @@ -275,11 +272,6 @@ protected: the minimal size equal to min_buff_size */ size_t min_records; - /* - The maximum expected number of records to be put in the join buffer - at one refill - */ - size_t max_records; /* Pointer to the current position in the join buffer. @@ -545,6 +537,7 @@ protected: join_tab= tab; prev_cache= next_cache= 0; buff= 0; + min_buff_size= max_buff_size= 0; // Caches } /* @@ -560,6 +553,7 @@ protected: next_cache= 0; prev_cache= prev; buff= 0; + min_buff_size= max_buff_size= 0; // Caches if (prev) prev->next_cache= this; } @@ -611,9 +605,10 @@ public: void set_join_buffer_size(size_t sz) { buff_size= sz; } /* Get the minimum possible size of the cache join buffer */ - virtual size_t get_min_join_buffer_size(); + size_t get_min_join_buffer_size(); /* Get the maximum possible size of the cache join buffer */ - virtual size_t get_max_join_buffer_size(bool optimize_buff_size); + size_t get_max_join_buffer_size(bool optimize_buff_size, + size_t min_buffer_size_arg); /* Shrink the size if the cache join buffer in a given ratio */ bool shrink_join_buffer_in_ratio(ulonglong n, ulonglong d); diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index f9967fe92fe..21331b52421 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -1460,7 +1460,7 @@ bool is_lex_native_function(const LEX_CSTRING *name) bool is_native_function(THD *thd, const LEX_CSTRING *name) { - if (find_native_function_builder(thd, name)) + if (native_functions_hash.find(thd, *name)) return true; if (is_lex_native_function(name)) @@ -2841,34 +2841,6 @@ int Lex_input_stream::scan_ident_delimited(THD *thd, } -void trim_whitespace(CHARSET_INFO *cs, LEX_CSTRING *str, size_t * prefix_length) -{ - /* - TODO: - This code assumes that there are no multi-bytes characters - that can be considered white-space. - */ - - size_t plen= 0; - while ((str->length > 0) && (my_isspace(cs, str->str[0]))) - { - plen++; - str->length --; - str->str ++; - } - if (prefix_length) - *prefix_length= plen; - /* - FIXME: - Also, parsing backward is not safe with multi bytes characters - */ - while ((str->length > 0) && (my_isspace(cs, str->str[str->length-1]))) - { - str->length --; - } -} - - /* st_select_lex structures initialisations */ @@ -7416,7 +7388,7 @@ bool LEX::sp_body_finalize_routine(THD *thd) { if (sphead->check_unresolved_goto()) return true; - sphead->set_stmt_end(thd); + sphead->set_stmt_end(thd, thd->m_parser_state->m_lip.get_cpp_tok_start()); sphead->restore_thd_mem_root(thd); return false; } @@ -9348,8 +9320,7 @@ sp_package *LEX::create_package_start(THD *thd, bool LEX::create_package_finalize(THD *thd, const sp_name *name, const sp_name *name2, - const char *body_start, - const char *body_end) + const char *cpp_body_end) { if (name2 && (name2->m_explicit_name != name->m_explicit_name || @@ -9362,18 +9333,8 @@ bool LEX::create_package_finalize(THD *thd, exp ? ErrConvDQName(name).ptr() : name->m_name.str); return true; } - // TODO: reuse code in LEX::create_package_finalize and sp_head::set_stmt_end - sphead->m_body.length= body_end - body_start; - if (unlikely(!(sphead->m_body.str= thd->strmake(body_start, - sphead->m_body.length)))) - return true; - - size_t not_used; - Lex_input_stream *lip= & thd->m_parser_state->m_lip; - sphead->m_defstr.length= lip->get_cpp_ptr() - lip->get_cpp_buf(); - sphead->m_defstr.str= thd->strmake(lip->get_cpp_buf(), sphead->m_defstr.length); - trim_whitespace(thd->charset(), &sphead->m_defstr, ¬_used); + sphead->set_stmt_end(thd, cpp_body_end); sphead->restore_thd_mem_root(thd); sp_package *pkg= sphead->get_package(); DBUG_ASSERT(pkg); @@ -9587,7 +9548,7 @@ Item *LEX::make_item_func_call_native_or_parse_error(THD *thd, Lex_ident_cli_st &name, List *args) { - Create_func *builder= find_native_function_builder(thd, &name); + Create_func *builder= native_functions_hash.find(thd, name); DBUG_EXECUTE_IF("make_item_func_call_native_simulate_not_found", builder= NULL;); if (builder) diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 250eb7bdc31..2399bcdee80 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -2735,15 +2735,9 @@ public: return p; } /** Get the utf8-body string. */ - const char *get_body_utf8_str() const + LEX_CSTRING body_utf8() const { - return m_body_utf8; - } - - /** Get the utf8-body length. */ - size_t get_body_utf8_length() const - { - return (size_t) (m_body_utf8_ptr - m_body_utf8); + return LEX_CSTRING({m_body_utf8, (size_t) (m_body_utf8_ptr - m_body_utf8)}); } void body_utf8_start(THD *thd, const char *begin_ptr); @@ -3470,13 +3464,6 @@ public: TABLE_LIST *create_last_non_select_table; sp_head *sphead; sp_name *spname; - - void delete_if_not_sp_lex_in_use() - { - if (!sp_lex_in_use) - delete this; - } - sp_pcontext *spcont; st_sp_chistics sp_chistics; @@ -3884,8 +3871,7 @@ public: bool create_package_finalize(THD *thd, const sp_name *name, const sp_name *name2, - const char *body_start, - const char *body_end); + const char *cpp_body_end); bool call_statement_start(THD *thd, sp_name *name); bool call_statement_start(THD *thd, const Lex_ident_sys_st *name); bool call_statement_start(THD *thd, const Lex_ident_sys_st *name1, @@ -5158,7 +5144,12 @@ int init_lex_with_single_table(THD *thd, TABLE *table, LEX *lex); extern int MYSQLlex(union YYSTYPE *yylval, THD *thd); extern int ORAlex(union YYSTYPE *yylval, THD *thd); -extern void trim_whitespace(CHARSET_INFO *cs, LEX_CSTRING *str, size_t * prefix_length = 0); +inline void trim_whitespace(CHARSET_INFO *cs, LEX_CSTRING *str, + size_t * prefix_length = 0) +{ + *str= Lex_cstring(*str).trim_whitespace(cs, prefix_length); +} + extern bool is_lex_native_function(const LEX_CSTRING *name); extern bool is_native_function(THD *thd, const LEX_CSTRING *name); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index b3f9006a0d4..06b2b53d4fd 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2923,6 +2923,16 @@ retry: if (result) goto err; } + +#ifdef WITH_WSREP + if (WSREP(thd) && table->table->s->table_type == TABLE_TYPE_SEQUENCE) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "LOCK TABLE on SEQUENCES in Galera cluster"); + goto err; + } +#endif + } /* Check privileges of view tables here, after views were opened. @@ -6341,9 +6351,11 @@ execute_show_status(THD *thd, TABLE_LIST *all_tables) memcpy(&thd->status_var, &old_status_var, offsetof(STATUS_VAR, last_cleared_system_status_var)); mysql_mutex_unlock(&LOCK_status); + thd->initial_status_var= NULL; return res; #ifdef WITH_WSREP wsrep_error_label: /* see WSREP_SYNC_WAIT() macro above */ + thd->initial_status_var= NULL; return true; #endif /* WITH_WSREP */ } diff --git a/sql/sql_partition.cc b/sql/sql_partition.cc index 8c0efb7d3d0..8ac5247336f 100644 --- a/sql/sql_partition.cc +++ b/sql/sql_partition.cc @@ -6148,7 +6148,8 @@ static bool mysql_change_partitions(ALTER_PARTITION_PARAM_TYPE *lpt, bool copy_d THD *thd= lpt->thd; DBUG_ENTER("mysql_change_partitions"); - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); if(copy_data && mysql_trans_prepare_alter_copy_data(thd)) DBUG_RETURN(TRUE); @@ -6198,7 +6199,8 @@ static bool mysql_rename_partitions(ALTER_PARTITION_PARAM_TYPE *lpt) int error; DBUG_ENTER("mysql_rename_partitions"); - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); if (unlikely((error= lpt->table->file->ha_rename_partitions(path)))) { if (error != 1) @@ -6242,7 +6244,8 @@ static bool mysql_drop_partitions(ALTER_PARTITION_PARAM_TYPE *lpt) lpt->table->s->table_name.str, MDL_EXCLUSIVE)); - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); if ((error= lpt->table->file->ha_drop_partitions(path))) { lpt->table->file->print_error(error, MYF(0)); @@ -6733,7 +6736,8 @@ static bool write_log_rename_frm(ALTER_PARTITION_PARAM_TYPE *lpt) DBUG_ENTER("write_log_rename_frm"); part_info->list= NULL; - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); build_table_shadow_filename(shadow_path, sizeof(shadow_path) - 1, lpt); mysql_mutex_lock(&LOCK_gdl); if (write_log_replace_frm(lpt, 0UL, shadow_path, path)) @@ -6784,7 +6788,8 @@ static bool write_log_drop_partition(ALTER_PARTITION_PARAM_TYPE *lpt) DBUG_ENTER("write_log_drop_partition"); part_info->list= NULL; - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); build_table_shadow_filename(tmp_path, sizeof(tmp_path) - 1, lpt); mysql_mutex_lock(&LOCK_gdl); if (write_log_dropped_partitions(lpt, &next_entry, (const char*)path, @@ -6819,7 +6824,9 @@ static bool write_log_convert_partition(ALTER_PARTITION_PARAM_TYPE *lpt) char path[FN_REFLEN + 1]; uint next_entry= part_info->list ? part_info->list->entry_pos : 0; - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, + lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); build_table_shadow_filename(tmp_path, sizeof(tmp_path) - 1, lpt); mysql_mutex_lock(&LOCK_gdl); @@ -6870,7 +6877,8 @@ static bool write_log_add_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt) DBUG_ASSERT(old_first_log_entry); DBUG_ENTER("write_log_add_change_partition"); - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); build_table_shadow_filename(tmp_path, sizeof(tmp_path) - 1, lpt); mysql_mutex_lock(&LOCK_gdl); @@ -6935,7 +6943,8 @@ static bool write_log_final_change_partition(ALTER_PARTITION_PARAM_TYPE *lpt) Replace the revert operations with forced retry operations. */ part_info->list= NULL; - build_table_filename(path, sizeof(path) - 1, lpt->db.str, lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); build_table_shadow_filename(shadow_path, sizeof(shadow_path) - 1, lpt); mysql_mutex_lock(&LOCK_gdl); if (write_log_changed_partitions(lpt, &next_entry, (const char*)path)) @@ -7134,8 +7143,8 @@ static void handle_alter_part_error(ALTER_PARTITION_PARAM_TYPE *lpt, Better to do that here, than leave the cleaning up to others. Acquire EXCLUSIVE mdl lock if not already acquired. */ - if (!thd->mdl_context.is_lock_owner(MDL_key::TABLE, lpt->db.str, - lpt->table_name.str, + if (!thd->mdl_context.is_lock_owner(MDL_key::TABLE, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, MDL_EXCLUSIVE) && wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN)) { @@ -7318,13 +7327,13 @@ bool log_partition_alter_to_ddl_log(ALTER_PARTITION_PARAM_TYPE *lpt) ddl_log.query= { C_STRING_WITH_LEN("ALTER") }; ddl_log.org_storage_engine_name= old_engine_lex; ddl_log.org_partitioned= true; - ddl_log.org_database= lpt->db; - ddl_log.org_table= lpt->table_name; + ddl_log.org_database= lpt->alter_info->db; + ddl_log.org_table= lpt->alter_info->table_name; ddl_log.org_table_id= lpt->org_tabledef_version; ddl_log.new_storage_engine_name= old_engine_lex; ddl_log.new_partitioned= true; - ddl_log.new_database= lpt->db; - ddl_log.new_table= lpt->table_name; + ddl_log.new_database= lpt->alter_info->db; + ddl_log.new_table= lpt->alter_info->table_name; ddl_log.new_table_id= lpt->create_info->tabledef_version; backup_log_ddl(&ddl_log); // This sets backup_log_error on failure return 0; @@ -7432,8 +7441,7 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, /* Set-up struct used to write frm files */ partition_info *part_info; - ALTER_PARTITION_PARAM_TYPE lpt_obj; - ALTER_PARTITION_PARAM_TYPE *lpt= &lpt_obj; + ALTER_PARTITION_PARAM_TYPE lpt_obj, *lpt= &lpt_obj; bool action_completed= FALSE; bool frm_install= FALSE; MDL_ticket *mdl_ticket= table->mdl_ticket; @@ -7453,8 +7461,6 @@ uint fast_alter_partition_table(THD *thd, TABLE *table, lpt->table= table; lpt->key_info_buffer= 0; lpt->key_count= 0; - lpt->db= alter_ctx->db; - lpt->table_name= alter_ctx->table_name; lpt->org_tabledef_version= table->s->tabledef_version; lpt->copied= 0; lpt->deleted= 0; diff --git a/sql/sql_partition.h b/sql/sql_partition.h index a90eaae0bae..cff3214f477 100644 --- a/sql/sql_partition.h +++ b/sql/sql_partition.h @@ -58,8 +58,6 @@ typedef struct st_lock_param_type Alter_table_ctx *alter_ctx; TABLE *table; KEY *key_info_buffer; - LEX_CSTRING db; - LEX_CSTRING table_name; LEX_CUSTRING org_tabledef_version; uchar *pack_frm_data; uint key_count; diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index 5a077a934ac..3576730723e 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -1435,6 +1435,50 @@ void plugin_unlock_list(THD *thd, plugin_ref *list, size_t count) DBUG_VOID_RETURN; } +static void print_init_failed_error(st_plugin_int *p) +{ + sql_print_error("Plugin '%s' registration as a %s failed.", + p->name.str, + plugin_type_names[p->plugin->type].str); +} + +static int plugin_do_initialize(struct st_plugin_int *plugin, uint &state) +{ + DBUG_ENTER("plugin_do_initialize"); + mysql_mutex_assert_not_owner(&LOCK_plugin); + plugin_type_init init= plugin_type_initialize[plugin->plugin->type]; + if (!init) + init= (plugin_type_init) plugin->plugin->init; + if (init) + if (int ret= init(plugin)) + { + /* Plugin init failed and did not requested a retry */ + if (ret != HA_ERR_RETRY_INIT) + print_init_failed_error(plugin); + DBUG_RETURN(ret); + } + state= PLUGIN_IS_READY; // plugin->init() succeeded + + if (plugin->plugin->status_vars) + { + /* + historical ndb behavior caused MySQL plugins to specify + status var names in full, with the plugin name prefix. + this was never fixed in MySQL. + MariaDB fixes that but supports MySQL style too. + */ + SHOW_VAR *show_vars= plugin->plugin->status_vars; + SHOW_VAR tmp_array[2]= {{plugin->plugin->name, + (char *) plugin->plugin->status_vars, SHOW_ARRAY}, + {0, 0, SHOW_UNDEF}}; + if (strncasecmp(show_vars->name, plugin->name.str, plugin->name.length)) + show_vars= tmp_array; + + if (add_status_vars(show_vars)) + DBUG_RETURN(1); + } + DBUG_RETURN(0); +} static int plugin_initialize(MEM_ROOT *tmp_root, struct st_plugin_int *plugin, int *argc, char **argv, bool options_only) @@ -1457,52 +1501,10 @@ static int plugin_initialize(MEM_ROOT *tmp_root, struct st_plugin_int *plugin, { ret= !options_only && plugin_is_forced(plugin); state= PLUGIN_IS_DISABLED; - goto err; } + else + ret= plugin_do_initialize(plugin, state); - if (plugin_type_initialize[plugin->plugin->type]) - { - if ((*plugin_type_initialize[plugin->plugin->type])(plugin)) - { - sql_print_error("Plugin '%s' registration as a %s failed.", - plugin->name.str, plugin_type_names[plugin->plugin->type].str); - goto err; - } - } - else if (plugin->plugin->init) - { - if (plugin->plugin->init(plugin)) - { - sql_print_error("Plugin '%s' init function returned error.", - plugin->name.str); - goto err; - } - } - state= PLUGIN_IS_READY; // plugin->init() succeeded - - if (plugin->plugin->status_vars) - { - /* - historical ndb behavior caused MySQL plugins to specify - status var names in full, with the plugin name prefix. - this was never fixed in MySQL. - MariaDB fixes that but supports MySQL style too. - */ - SHOW_VAR *show_vars= plugin->plugin->status_vars; - SHOW_VAR tmp_array[2]= { - {plugin->plugin->name, (char*)plugin->plugin->status_vars, SHOW_ARRAY}, - {0, 0, SHOW_UNDEF} - }; - if (strncasecmp(show_vars->name, plugin->name.str, plugin->name.length)) - show_vars= tmp_array; - - if (add_status_vars(show_vars)) - goto err; - } - - ret= 0; - -err: if (ret) plugin_variables_deinit(plugin); @@ -1595,7 +1597,7 @@ int plugin_init(int *argc, char **argv, int flags) size_t i; struct st_maria_plugin **builtins; struct st_maria_plugin *plugin; - struct st_plugin_int tmp, *plugin_ptr, **reap; + struct st_plugin_int tmp, *plugin_ptr, **reap, **retry_end, **retry_start; MEM_ROOT tmp_root; bool reaped_mandatory_plugin= false; bool mandatory= true; @@ -1737,11 +1739,16 @@ int plugin_init(int *argc, char **argv, int flags) */ mysql_mutex_lock(&LOCK_plugin); + /* List of plugins to reap */ reap= (st_plugin_int **) my_alloca((plugin_array.elements+1) * sizeof(void*)); *(reap++)= NULL; + /* List of plugins to retry */ + retry_start= retry_end= + (st_plugin_int **) my_alloca((plugin_array.elements+1) * sizeof(void*)); for(;;) { + int error; for (i=0; i < MYSQL_MAX_PLUGIN_TYPE_NUM; i++) { HASH *hash= plugin_hash + plugin_type_initialization_order[i]; @@ -1755,14 +1762,51 @@ int plugin_init(int *argc, char **argv, int flags) bool opts_only= flags & PLUGIN_INIT_SKIP_INITIALIZATION && (flags & PLUGIN_INIT_SKIP_PLUGIN_TABLE || !plugin_table_engine); - if (plugin_initialize(&tmp_root, plugin_ptr, argc, argv, opts_only)) + error= plugin_initialize(&tmp_root, plugin_ptr, argc, argv, + opts_only); + if (error) { plugin_ptr->state= PLUGIN_IS_DYING; - *(reap++)= plugin_ptr; + /* The plugin wants a retry of the initialisation, + possibly due to dependency on other plugins */ + if (unlikely(error == HA_ERR_RETRY_INIT)) + *(retry_end++)= plugin_ptr; + else + *(reap++)= plugin_ptr; } } } } + /* Retry plugins that asked for it */ + while (retry_start < retry_end) + { + st_plugin_int **to_re_retry, **retrying; + for (to_re_retry= retrying= retry_start; retrying < retry_end; retrying++) + { + plugin_ptr= *retrying; + uint state= plugin_ptr->state; + mysql_mutex_unlock(&LOCK_plugin); + error= plugin_do_initialize(plugin_ptr, state); + mysql_mutex_lock(&LOCK_plugin); + plugin_ptr->state= state; + if (error == HA_ERR_RETRY_INIT) + *(to_re_retry++)= plugin_ptr; + else if (error) + *(reap++)= plugin_ptr; + } + /* If the retry list has not changed, i.e. if all retry attempts + result in another retry request, empty the retry list */ + if (to_re_retry == retry_end) + while (to_re_retry > retry_start) + { + plugin_ptr= *(--to_re_retry); + *(reap++)= plugin_ptr; + /** `plugin_do_initialize()' did not print any error in this + case, so we do it here. */ + print_init_failed_error(plugin_ptr); + } + retry_end= to_re_retry; + } /* load and init plugins from the plugin table (unless done already) */ if (flags & PLUGIN_INIT_SKIP_PLUGIN_TABLE) @@ -1788,6 +1832,7 @@ int plugin_init(int *argc, char **argv, int flags) } mysql_mutex_unlock(&LOCK_plugin); + my_afree(retry_start); my_afree(reap); if (reaped_mandatory_plugin && !opt_help) goto err; diff --git a/sql/sql_select.cc b/sql/sql_select.cc index a9bffa6f593..8493401cadb 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -609,9 +609,9 @@ bool handle_select(THD *thd, LEX *lex, select_result *result, bool saved_abort_on_warning= thd->abort_on_warning; thd->abort_on_warning= false; push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT, - ER_THD(thd, ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT), - thd->accessed_rows_and_keys, + ER_QUERY_RESULT_INCOMPLETE, + ER_THD(thd, ER_QUERY_RESULT_INCOMPLETE), + "LIMIT ROWS EXAMINED", thd->lex->limit_rows_examined->val_uint()); thd->abort_on_warning= saved_abort_on_warning; thd->reset_killed(); @@ -8673,7 +8673,8 @@ best_access_path(JOIN *join, !(best_key && best_key->key == MAX_KEY) && // (2) !(s->quick && s->quick->get_type() != QUICK_SELECT_I::QS_TYPE_GROUP_MIN_MAX && // (2) - best_key && s->quick->index == best_key->key && // (2) + best_key && s->quick->index == best_key->key && // (2) + s->table->opt_range_keys.is_set(best_key->key) && // (2) best_max_key_part >= s->table->opt_range[best_key->key].key_parts) &&// (2) !((s->table->file->ha_table_flags() & HA_TABLE_SCAN_ON_INDEX) && // (3) ! s->table->covering_keys.is_clear_all() && best_key && !s->quick) &&// (3) @@ -14445,7 +14446,7 @@ double JOIN_TAB::scan_time() ha_rows JOIN_TAB::get_examined_rows() { double examined_rows; - SQL_SELECT *sel= filesort? filesort->select : this->select; + const SQL_SELECT *sel= get_sql_select(); if (sel && sel->quick && use_quick != 2) examined_rows= (double)sel->quick->records; @@ -27759,13 +27760,12 @@ bool JOIN_TAB::save_explain_data(Explain_table_access *eta, eta->key.clear(); eta->quick_info= NULL; - SQL_SELECT *tab_select; /* We assume that if this table does pre-sorting, then it doesn't do filtering with SQL_SELECT. */ DBUG_ASSERT(!(select && filesort)); - tab_select= (filesort)? filesort->select : select; + const SQL_SELECT *tab_select= get_sql_select(); if (filesort) { @@ -27787,12 +27787,16 @@ bool JOIN_TAB::save_explain_data(Explain_table_access *eta, LOG_SLOW_VERBOSITY_ENGINE)) { table->file->set_time_tracker(&eta->op_tracker); + /* Set handler_for_stats even if we are not running an ANALYZE command. There's no harm, and in case somebody runs a SHOW ANALYZE command we'll be able to print the engine statistics. */ - eta->handler_for_stats= table->file; + if (table->file->handler_stats && + table->s->tmp_table != INTERNAL_TMP_TABLE) + eta->handler_for_stats= table->file; + if (likely(thd->lex->analyze_stmt)) { eta->op_tracker.set_gap_tracker(&eta->extra_time_tracker); diff --git a/sql/sql_select.h b/sql/sql_select.h index f162907c393..4604bf83ed6 100644 --- a/sql/sql_select.h +++ b/sql/sql_select.h @@ -401,7 +401,6 @@ typedef struct st_join_table { /* TRUE <=> it is prohibited to join this table using join buffer */ bool no_forced_join_cache; uint used_join_cache_level; - ulong join_buffer_size_limit; JOIN_CACHE *cache; /* Index condition for BKA access join @@ -551,14 +550,19 @@ typedef struct st_join_table { void cleanup(); inline bool is_using_loose_index_scan() { - const SQL_SELECT *sel= filesort ? filesort->select : select; + const SQL_SELECT *sel= get_sql_select(); return (sel && sel->quick && (sel->quick->get_type() == QUICK_SELECT_I::QS_TYPE_GROUP_MIN_MAX)); } bool is_using_agg_loose_index_scan () { + const SQL_SELECT *sel= get_sql_select(); return (is_using_loose_index_scan() && - ((QUICK_GROUP_MIN_MAX_SELECT *)select->quick)->is_agg_distinct()); + ((QUICK_GROUP_MIN_MAX_SELECT *)sel->quick)->is_agg_distinct()); + } + const SQL_SELECT *get_sql_select() + { + return filesort ? filesort->select : select; } bool is_inner_table_of_semi_join_with_first_match() { @@ -2503,8 +2507,6 @@ class derived_handler; class Pushdown_derived: public Sql_alloc { -private: - bool is_analyze; public: TABLE_LIST *derived; derived_handler *handler; diff --git a/sql/sql_sequence.cc b/sql/sql_sequence.cc index fdb9c647727..28ba88c09f0 100644 --- a/sql/sql_sequence.cc +++ b/sql/sql_sequence.cc @@ -312,11 +312,6 @@ bool sequence_insert(THD *thd, LEX *lex, TABLE_LIST *org_table_list) DBUG_RETURN(TRUE); } -#ifdef WITH_WSREP - if (WSREP_ON && seq->cache != 0) - WSREP_WARN("CREATE SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); -#endif - /* If not temporary table */ if (!temporary_table) { @@ -902,6 +897,20 @@ end: DBUG_RETURN(error); } +#if defined(HAVE_REPLICATION) +class wait_for_commit_raii +{ +private: + THD *m_thd; + wait_for_commit *m_wfc; + +public: + wait_for_commit_raii(THD* thd) : + m_thd(thd), m_wfc(thd->suspend_subsequent_commits()) + {} + ~wait_for_commit_raii() { m_thd->resume_subsequent_commits(m_wfc); } +}; +#endif bool Sql_cmd_alter_sequence::execute(THD *thd) { @@ -914,7 +923,10 @@ bool Sql_cmd_alter_sequence::execute(THD *thd) SEQUENCE *seq; No_such_table_error_handler no_such_table_handler; DBUG_ENTER("Sql_cmd_alter_sequence::execute"); - +#if defined(HAVE_REPLICATION) + /* No wakeup():s of subsequent commits is allowed in this function. */ + wait_for_commit_raii suspend_wfc(thd); +#endif if (check_access(thd, ALTER_ACL, first_table->db.str, &first_table->grant.privilege, @@ -922,21 +934,24 @@ bool Sql_cmd_alter_sequence::execute(THD *thd) 0, 0)) DBUG_RETURN(TRUE); /* purecov: inspected */ -#ifdef WITH_WSREP - if (WSREP_ON && new_seq->cache != 0) - WSREP_WARN("ALTER SEQUENCES declared without `NOCACHE` will not behave correctly in galera cluster."); -#endif - if (check_grant(thd, ALTER_ACL, first_table, FALSE, 1, FALSE)) DBUG_RETURN(TRUE); /* purecov: inspected */ #ifdef WITH_WSREP - if (WSREP_ON && WSREP(thd) && - wsrep_to_isolation_begin(thd, first_table->db.str, - first_table->table_name.str, - first_table)) - DBUG_RETURN(TRUE); + if (WSREP(thd) && wsrep_thd_is_local(thd)) + { + if (wsrep_check_sequence(thd, new_seq)) + DBUG_RETURN(TRUE); + + if (wsrep_to_isolation_begin(thd, first_table->db.str, + first_table->table_name.str, + first_table)) + { + DBUG_RETURN(TRUE); + } + } #endif /* WITH_WSREP */ + if (if_exists()) thd->push_internal_handler(&no_such_table_handler); error= open_and_lock_tables(thd, first_table, FALSE, 0); @@ -1011,19 +1026,15 @@ bool Sql_cmd_alter_sequence::execute(THD *thd) else table->file->print_error(error, MYF(0)); seq->write_unlock(table); - { - wait_for_commit* suspended_wfc= thd->suspend_subsequent_commits(); - if (trans_commit_stmt(thd)) - error= 1; - if (trans_commit_implicit(thd)) - error= 1; - thd->resume_subsequent_commits(suspended_wfc); - DBUG_EXECUTE_IF("hold_worker_on_schedule", - { - /* delay binlogging of a parent trx in rpl_parallel_seq */ - my_sleep(100000); - }); - } + if (trans_commit_stmt(thd)) + error= 1; + if (trans_commit_implicit(thd)) + error= 1; + DBUG_EXECUTE_IF("hold_worker_on_schedule", + { + /* delay binlogging of a parent trx in rpl_parallel_seq */ + my_sleep(100000); + }); if (likely(!error)) error= write_bin_log(thd, 1, thd->query(), thd->query_length()); if (likely(!error)) diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 137c992e2d8..2961cc50b7a 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -1980,8 +1980,13 @@ static void add_table_options(THD *thd, TABLE *table, } if (share->transactional != HA_CHOICE_UNDEF) { + bool do_comment= !table->file->has_transactional_option() && check_options; + if (do_comment) + packet->append(STRING_WITH_LEN(" /*")); packet->append(STRING_WITH_LEN(" TRANSACTIONAL=")); packet->append(ha_choice_values[(uint) share->transactional]); + if (do_comment) + packet->append(STRING_WITH_LEN(" */")); } if (share->table_type == TABLE_TYPE_SEQUENCE) packet->append(STRING_WITH_LEN(" SEQUENCE=1")); diff --git a/sql/sql_string.cc b/sql/sql_string.cc index 208805b91ba..33acfc5ae83 100644 --- a/sql/sql_string.cc +++ b/sql/sql_string.cc @@ -1156,22 +1156,28 @@ String_copier::well_formed_copy(CHARSET_INFO *to_cs, characters with backslashes as necessary. Does not add the enclosing quotes, this is left up to caller. */ -#define APPEND(X) if (append(X)) return 1; else break +#define APPEND(...) if (append(__VA_ARGS__)) return 1; bool String::append_for_single_quote(const char *st, size_t len) { const char *end= st+len; + int chlen; for (; st < end; st++) { - uchar c= *st; - switch (c) + switch (*st) { - case '\\': APPEND(STRING_WITH_LEN("\\\\")); - case '\0': APPEND(STRING_WITH_LEN("\\0")); - case '\'': APPEND(STRING_WITH_LEN("\\'")); - case '\n': APPEND(STRING_WITH_LEN("\\n")); - case '\r': APPEND(STRING_WITH_LEN("\\r")); - case '\032': APPEND(STRING_WITH_LEN("\\Z")); - default: APPEND(c); + case '\\': APPEND(STRING_WITH_LEN("\\\\")); break; + case '\0': APPEND(STRING_WITH_LEN("\\0")); break; + case '\'': APPEND(STRING_WITH_LEN("\\'")); break; + case '\n': APPEND(STRING_WITH_LEN("\\n")); break; + case '\r': APPEND(STRING_WITH_LEN("\\r")); break; + case '\032': APPEND(STRING_WITH_LEN("\\Z")); break; + default: if ((chlen=charset()->charlen(st, end)) > 0) + { + APPEND(st, chlen); + st+= chlen-1; + } + else + APPEND(*st); } } return 0; diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 5aa2d6b8080..78654d6de72 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -86,12 +86,9 @@ static int copy_data_between_tables(THD *, TABLE *,TABLE *, ha_rows *, ha_rows *, Alter_info::enum_enable_or_disable, Alter_table_ctx *); -static int append_system_key_parts(THD *thd, HA_CREATE_INFO *create_info, - Key *key); +static int append_system_key_parts(THD *, HA_CREATE_INFO *, Key *); static int mysql_prepare_create_table(THD *, HA_CREATE_INFO *, Alter_info *, - uint *, handler *, KEY **, uint *, int, - const LEX_CSTRING db, - const LEX_CSTRING table_name); + uint *, handler *, KEY **, uint *, int); static uint blob_length_by_type(enum_field_types type); static bool fix_constraints_names(THD *, List *, const HA_CREATE_INFO *); @@ -411,8 +408,7 @@ uint filename_to_tablename(const char *from, char *to, size_t to_length, system_charset_info, to, to_length, &errors); if (unlikely(errors)) // Old 5.0 name { - res= (strxnmov(to, to_length, MYSQL50_TABLE_NAME_PREFIX, from, NullS) - - to); + res= strxnmov(to, to_length, MYSQL50_TABLE_NAME_PREFIX, from, NullS) - to; if (!stay_quiet) sql_print_error("Invalid (old?) table or database name '%s'", from); } @@ -685,9 +681,9 @@ uint build_table_shadow_filename(char *buff, size_t bufflen, char tmp_name[FN_REFLEN]; my_snprintf(tmp_name, sizeof (tmp_name), "%s-%s-%lx-%s", tmp_file_prefix, backup ? "backup" : "shadow", - (ulong) current_thd->thread_id, lpt->table_name.str); - return build_table_filename(buff, bufflen, lpt->db.str, tmp_name, "", - FN_IS_TMP); + (ulong) current_thd->thread_id, lpt->alter_info->table_name.str); + return build_table_filename(buff, bufflen, lpt->alter_info->db.str, tmp_name, + "", FN_IS_TMP); } @@ -754,7 +750,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) if (mysql_prepare_create_table(lpt->thd, lpt->create_info, lpt->alter_info, &lpt->db_options, lpt->table->file, &lpt->key_info_buffer, &lpt->key_count, - C_ALTER_TABLE, lpt->db, lpt->table_name)) + C_ALTER_TABLE)) { DBUG_RETURN(TRUE); } @@ -774,7 +770,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) #endif /* Write shadow frm file */ lpt->create_info->table_options= lpt->db_options; - LEX_CUSTRING frm= build_frm_image(lpt->thd, lpt->table_name, + LEX_CUSTRING frm= build_frm_image(lpt->thd, lpt->alter_info->table_name, lpt->create_info, lpt->alter_info->create_list, lpt->key_count, lpt->key_info_buffer, @@ -785,7 +781,8 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) goto end; } - int error= writefile(shadow_frm_name, lpt->db.str, lpt->table_name.str, + int error= writefile(shadow_frm_name, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, lpt->create_info->tmp_table(), frm.str, frm.length); my_free(const_cast(frm.str)); @@ -828,8 +825,7 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) if (mysql_prepare_create_table(thd, create_info, lpt->alter_info, &lpt->db_options, file, &lpt->key_info_buffer, &lpt->key_count, - C_ALTER_TABLE, alter_ctx->new_db, - alter_ctx->new_name)) + C_ALTER_TABLE)) DBUG_RETURN(TRUE); lpt->create_info->table_options= lpt->db_options; @@ -858,8 +854,8 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) } if (flags & WFRM_BACKUP_ORIGINAL) { - build_table_filename(path, sizeof(path) - 1, lpt->db.str, - lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); strxnmov(frm_name, sizeof(frm_name), path, reg_ext, NullS); build_table_shadow_filename(bak_path, sizeof(bak_path) - 1, lpt, true); @@ -895,8 +891,8 @@ bool mysql_write_frm(ALTER_PARTITION_PARAM_TYPE *lpt, uint flags) /* Build frm file name */ - build_table_filename(path, sizeof(path) - 1, lpt->db.str, - lpt->table_name.str, "", 0); + build_table_filename(path, sizeof(path) - 1, lpt->alter_info->db.str, + lpt->alter_info->table_name.str, "", 0); strxnmov(frm_name, sizeof(frm_name), path, reg_ext, NullS); /* When we are changing to use new frm file we need to ensure that we @@ -2363,7 +2359,7 @@ static void check_duplicate_key(THD *thd, const Key *key, const KEY *key_info, Check is requested if the key was explicitly created or altered by the user (unless it's a foreign key). */ - if (!key->key_create_info.check_for_duplicate_indexes || key->generated) + if (key->old || key->type == Key::FOREIGN_KEY || key->generated) return; for (const Key &k : *key_list) @@ -2791,9 +2787,7 @@ static int mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, Alter_info *alter_info, uint *db_options, handler *file, KEY **key_info_buffer, - uint *key_count, int create_table_mode, - const LEX_CSTRING db, - const LEX_CSTRING table_name) + uint *key_count, int create_table_mode) { const char *key_name; Create_field *sql_field,*dup_field; @@ -2809,19 +2803,16 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, bool tmp_table= create_table_mode == C_ALTER_TABLE; const bool create_simple= thd->lex->create_simple(); bool is_hash_field_needed= false; + const CHARSET_INFO *scs= system_charset_info; DBUG_ENTER("mysql_prepare_create_table"); - LEX_CSTRING* connect_string = &create_info->connect_string; - if (connect_string->length != 0 && - connect_string->length > CONNECT_STRING_MAXLEN && - (system_charset_info->charpos(connect_string->str, - (connect_string->str + - connect_string->length), - CONNECT_STRING_MAXLEN) - < connect_string->length)) + LEX_CSTRING* connstr = &create_info->connect_string; + if (connstr->length > CONNECT_STRING_MAXLEN && + scs->charpos(connstr->str, connstr->str + connstr->length, + CONNECT_STRING_MAXLEN) < connstr->length) { - my_error(ER_WRONG_STRING_LENGTH, MYF(0), - connect_string->str, "CONNECTION", CONNECT_STRING_MAXLEN); + my_error(ER_WRONG_STRING_LENGTH, MYF(0), connstr->str, "CONNECTION", + CONNECT_STRING_MAXLEN); DBUG_RETURN(TRUE); } @@ -2858,9 +2849,7 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, /* Check if we have used the same field name before */ for (dup_no=0; (dup_field=it2++) != sql_field; dup_no++) { - if (lex_string_cmp(system_charset_info, - &sql_field->field_name, - &dup_field->field_name) == 0) + if (lex_string_cmp(scs, &sql_field->field_name, &dup_field->field_name) == 0) { /* If this was a CREATE ... SELECT statement, accept a field @@ -3030,15 +3019,13 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, while ((key2 = key_iterator2++) != key) { /* - foreign_key_prefix(key, key2) returns 0 if key or key2, or both, is - 'generated', and a generated key is a prefix of the other key. - Then we do not need the generated shorter key. + is_foreign_key_prefix(key, key2) returns true if key or key2, or + both, is 'generated', and a generated key is a prefix of the other + key. Then we do not need the generated shorter key. */ - if ((key2->type != Key::FOREIGN_KEY && - key2->name.str != ignore_key && - !foreign_key_prefix(key, key2))) + if (key2->type != Key::FOREIGN_KEY && key2->name.str != ignore_key && + is_foreign_key_prefix(key, key2)) { - /* TODO: issue warning message */ /* mark that the generated key should be ignored */ if (!key2->generated || (key->generated && key->columns.elements < @@ -3059,14 +3046,13 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, else (*key_count)--; if (key->name.str && !tmp_table && (key->type != Key::PRIMARY) && - !my_strcasecmp(system_charset_info, key->name.str, - primary_key_name.str)) + !my_strcasecmp(scs, key->name.str, primary_key_name.str)) { my_error(ER_WRONG_NAME_FOR_INDEX, MYF(0), key->name.str); DBUG_RETURN(TRUE); } if (key->type == Key::PRIMARY && key->name.str && - my_strcasecmp(system_charset_info, key->name.str, primary_key_name.str) != 0) + my_strcasecmp(scs, key->name.str, primary_key_name.str) != 0) { bool sav_abort_on_warning= thd->abort_on_warning; thd->abort_on_warning= FALSE; /* Don't make an error out of this. */ @@ -3104,9 +3090,7 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, auto field_name= key->columns.elem(0)->field_name; it.rewind(); while ((sql_field=it++) && - lex_string_cmp(system_charset_info, - &field_name, - &sql_field->field_name)); + lex_string_cmp(scs, &field_name, &sql_field->field_name)); if (sql_field) field_name= sql_field->field_name; key_name=make_unique_key_name(thd, field_name.str, @@ -3279,9 +3263,7 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, it.rewind(); field=0; while ((sql_field=it++) && - lex_string_cmp(system_charset_info, - &column->field_name, - &sql_field->field_name)) + lex_string_cmp(scs, &column->field_name, &sql_field->field_name)) field++; /* Either field is not present or field visibility is > INVISIBLE_USER @@ -3301,8 +3283,7 @@ mysql_prepare_create_table_finalize(THD *thd, HA_CREATE_INFO *create_info, } while ((dup_column= cols2++) != column) { - if (!lex_string_cmp(system_charset_info, - &column->field_name, &dup_column->field_name)) + if (!lex_string_cmp(scs, &column->field_name, &dup_column->field_name)) { my_error(ER_DUP_FIELDNAME, MYF(0), column->field_name.str); DBUG_RETURN(TRUE); @@ -3606,8 +3587,7 @@ without_overlaps_err: { for (Key_part_spec& kp2: fk->columns) { - if (!lex_string_cmp(system_charset_info, &kp.field_name, - &kp2.field_name)) + if (!lex_string_cmp(scs, &kp.field_name, &kp2.field_name)) { goto without_overlaps_err; } @@ -3659,7 +3639,6 @@ without_overlaps_err: create_info->null_bits= null_fields; /* Check fields. */ - Item::Check_table_name_prm walk_prm(db, table_name); it.rewind(); while ((sql_field=it++)) { @@ -3717,33 +3696,22 @@ without_overlaps_err: if (create_simple) { - /* - NOTE: we cannot do this in check_vcol_func_processor() as there is already - no table name qualifier in expression. - */ if (sql_field->vcol_info && sql_field->vcol_info->expr && - sql_field->vcol_info->expr->walk(&Item::check_table_name_processor, - false, (void *) &walk_prm)) - { - my_error(ER_BAD_FIELD_ERROR, MYF(0), walk_prm.field.c_ptr(), "GENERATED ALWAYS"); + check_expression(sql_field->vcol_info, &sql_field->field_name, + sql_field->vcol_info->stored_in_db + ? VCOL_GENERATED_STORED : VCOL_GENERATED_VIRTUAL, + alter_info)) DBUG_RETURN(TRUE); - } if (sql_field->default_value && - sql_field->default_value->expr->walk(&Item::check_table_name_processor, - false, (void *) &walk_prm)) - { - my_error(ER_BAD_FIELD_ERROR, MYF(0), walk_prm.field.c_ptr(), "DEFAULT"); + check_expression(sql_field->default_value, &sql_field->field_name, + VCOL_DEFAULT, alter_info)) DBUG_RETURN(TRUE); - } if (sql_field->check_constraint && - sql_field->check_constraint->expr->walk(&Item::check_table_name_processor, - false, (void *) &walk_prm)) - { - my_error(ER_BAD_FIELD_ERROR, MYF(0), walk_prm.field.c_ptr(), "CHECK"); + check_expression(sql_field->check_constraint, &sql_field->field_name, + VCOL_CHECK_FIELD, alter_info)) DBUG_RETURN(TRUE); - } } } @@ -3751,22 +3719,9 @@ without_overlaps_err: create_info->check_constraint_list= &alter_info->check_constraint_list; { List_iterator_fast c_it(alter_info->check_constraint_list); - Virtual_column_info *check; - while ((check= c_it++)) + while (Virtual_column_info *check= c_it++) { - if (create_simple && check->expr->walk(&Item::check_table_name_processor, false, - (void *) &walk_prm)) - { - my_error(ER_BAD_FIELD_ERROR, MYF(0), walk_prm.field.c_ptr(), "CHECK"); - DBUG_RETURN(TRUE); - } - if (!check->name.length || check->automatic_name) - { - if (check_expression(check, &check->name, VCOL_CHECK_TABLE, alter_info)) - DBUG_RETURN(TRUE); - continue; - } - + if (check->name.length && !check->automatic_name) { /* Check that there's no repeating table CHECK constraint names. */ List_iterator_fast @@ -3774,57 +3729,45 @@ without_overlaps_err: const Virtual_column_info *dup_check; while ((dup_check= dup_it++) && dup_check != check) { - if (!lex_string_cmp(system_charset_info, - &check->name, &dup_check->name)) + if (check->name.streq(dup_check->name)) { my_error(ER_DUP_CONSTRAINT_NAME, MYF(0), "CHECK", check->name.str); DBUG_RETURN(TRUE); } } - } - /* Check that there's no repeating key constraint names. */ - List_iterator_fast key_it(alter_info->key_list); - while (const Key *key= key_it++) - { - /* - Not all keys considered to be the CONSTRAINT - Noly Primary Key UNIQUE and Foreign keys. - */ - if (key->type != Key::PRIMARY && key->type != Key::UNIQUE && - key->type != Key::FOREIGN_KEY) - continue; - - if (check->name.length == key->name.length && - my_strcasecmp(system_charset_info, - check->name.str, key->name.str) == 0) + /* Check that there's no repeating key constraint names. */ + List_iterator_fast key_it(alter_info->key_list); + while (const Key *key= key_it++) { - my_error(ER_DUP_CONSTRAINT_NAME, MYF(0), "CHECK", check->name.str); + if (key->type != Key::PRIMARY && key->type != Key::UNIQUE && + key->type != Key::FOREIGN_KEY) + continue; + + if (check->name.length == key->name.length && + my_strcasecmp(scs, check->name.str, key->name.str) == 0) + { + my_error(ER_DUP_CONSTRAINT_NAME, MYF(0), "CHECK", check->name.str); + DBUG_RETURN(TRUE); + } + } + + if (check_string_char_length(&check->name, 0, NAME_CHAR_LEN, scs, 1)) + { + my_error(ER_TOO_LONG_IDENT, MYF(0), check->name.str); DBUG_RETURN(TRUE); } } - - if (check_string_char_length(&check->name, 0, NAME_CHAR_LEN, - system_charset_info, 1)) - { - my_error(ER_TOO_LONG_IDENT, MYF(0), check->name.str); - DBUG_RETURN(TRUE); - } if (check_expression(check, &check->name, VCOL_CHECK_TABLE, alter_info)) DBUG_RETURN(TRUE); } } /* Give warnings for not supported table options */ - extern handlerton *maria_hton; - if (file->partition_ht() != maria_hton && create_info->transactional && - !file->has_transaction_manager()) - push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_ILLEGAL_HA_CREATE_OPTION, - ER_THD(thd, ER_ILLEGAL_HA_CREATE_OPTION), - file->engine_name()->str, - create_info->transactional == HA_CHOICE_YES - ? "TRANSACTIONAL=1" : "TRANSACTIONAL=0"); + if (create_info->used_fields & HA_CREATE_USED_TRANSACTIONAL && + !file->has_transactional_option()) + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_OPTION, + ER_THD(thd, ER_UNKNOWN_OPTION), "transactional"); if (parse_option_list(thd, file->partition_ht(), &create_info->option_struct, &create_info->option_list, @@ -3832,12 +3775,10 @@ without_overlaps_err: thd->mem_root)) DBUG_RETURN(TRUE); -#ifndef DBUG_OFF DBUG_EXECUTE_IF("key", Debug_key::print_keys(thd, "prep_create_table: ", *key_info_buffer, *key_count); ); -#endif DBUG_RETURN(FALSE); } @@ -3873,15 +3814,12 @@ static int mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info, Alter_info *alter_info, uint *db_options, handler *file, KEY **key_info_buffer, - uint *key_count, int create_table_mode, - const LEX_CSTRING db, - const LEX_CSTRING table_name) + uint *key_count, int create_table_mode) { return mysql_prepare_create_table_stage1(thd, create_info, alter_info) || mysql_prepare_create_table_finalize(thd, create_info, alter_info, db_options, file, key_info_buffer, - key_count, create_table_mode, - db, table_name); + key_count, create_table_mode); } @@ -4090,9 +4028,7 @@ static int append_system_key_parts(THD *thd, HA_CREATE_INFO *create_info, return result; } -handler *mysql_create_frm_image(THD *thd, const LEX_CSTRING &db, - const LEX_CSTRING &table_name, - HA_CREATE_INFO *create_info, +handler *mysql_create_frm_image(THD *thd, HA_CREATE_INFO *create_info, Alter_info *alter_info, int create_table_mode, KEY **key_info, uint *key_count, LEX_CUSTRING *frm) @@ -4231,7 +4167,7 @@ handler *mysql_create_frm_image(THD *thd, const LEX_CSTRING &db, if (part_info->vers_info && !create_info->versioned()) { - my_error(ER_VERS_NOT_VERSIONED, MYF(0), table_name.str); + my_error(ER_VERS_NOT_VERSIONED, MYF(0), alter_info->table_name.str); goto err; } @@ -4331,13 +4267,12 @@ handler *mysql_create_frm_image(THD *thd, const LEX_CSTRING &db, if (mysql_prepare_create_table_finalize(thd, create_info, alter_info, &db_options, file, key_info, key_count, - create_table_mode, db, table_name)) + create_table_mode)) goto err; create_info->table_options=db_options; - *frm= build_frm_image(thd, table_name, create_info, - alter_info->create_list, *key_count, - *key_info, file); + *frm= build_frm_image(thd, alter_info->table_name, create_info, + alter_info->create_list, *key_count, *key_info, file); if (frm->str) DBUG_RETURN(file); @@ -4642,9 +4577,10 @@ int create_table_impl(THD *thd, &path, &db, &table_name, frm_only); debug_crash_here("ddl_log_create_before_create_frm"); - file= mysql_create_frm_image(thd, orig_db, orig_table_name, create_info, - alter_info, create_table_mode, key_info, - key_count, frm); + alter_info->db= orig_db; + alter_info->table_name= orig_table_name; + file= mysql_create_frm_image(thd, create_info, alter_info, + create_table_mode, key_info, key_count, frm); /* TODO: remove this check of thd->is_error() (now it intercept errors in some val_*() methods and bring some single place to @@ -4733,8 +4669,6 @@ warn: int mysql_create_table_no_lock(THD *thd, DDL_LOG_STATE *ddl_log_state_create, DDL_LOG_STATE *ddl_log_state_rm, - const LEX_CSTRING *db, - const LEX_CSTRING *table_name, Table_specification_st *create_info, Alter_info *alter_info, bool *is_trans, int create_table_mode, TABLE_LIST *table_list) @@ -4745,6 +4679,8 @@ int mysql_create_table_no_lock(THD *thd, uint path_length; char path[FN_REFLEN + 1]; LEX_CSTRING cpath; + const LEX_CSTRING *db= &table_list->db; + const LEX_CSTRING *table_name= &table_list->table_name; LEX_CUSTRING frm= {0,0}; DBUG_ASSERT(create_info->default_table_charset); @@ -4807,6 +4743,51 @@ int mysql_create_table_no_lock(THD *thd, return res; } +#ifdef WITH_WSREP +/** Additional sequence checks for Galera cluster. + +@param thd thread handle +@param seq sequence definition +@retval 0 failure +@retval 1 success +*/ +bool wsrep_check_sequence(THD* thd, const sequence_definition *seq) +{ + enum legacy_db_type db_type; + if (thd->lex->create_info.used_fields & HA_CREATE_USED_ENGINE) + { + db_type= thd->lex->create_info.db_type->db_type; + } + else + { + const handlerton *hton= ha_default_handlerton(thd); + db_type= hton->db_type; + } + + // In Galera cluster we support only InnoDB sequences + if (db_type != DB_TYPE_INNODB) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "Galera cluster does support only InnoDB sequences"); + return(true); + } + + // In Galera cluster it is best to use INCREMENT BY 0 with CACHE + // or NOCACHE + if (seq && + seq->increment && + seq->cache) + { + my_error(ER_NOT_SUPPORTED_YET, MYF(0), + "In Galera if you use CACHE you should set INCREMENT BY 0" + " to behave correctly in a cluster"); + return(true); + } + + return (false); +} +#endif /* WITH_WSREP */ + /** Implementation of SQLCOM_CREATE_TABLE. @@ -4880,12 +4861,20 @@ bool mysql_create_table(THD *thd, TABLE_LIST *create_table, if (!(thd->variables.option_bits & OPTION_EXPLICIT_DEF_TIMESTAMP)) promote_first_timestamp_column(&alter_info->create_list); +#ifdef WITH_WSREP + if (thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE && + WSREP(thd) && wsrep_thd_is_local_toi(thd)) + { + if (wsrep_check_sequence(thd, create_info->seq_create_info)) + DBUG_RETURN(true); + } +#endif /* WITH_WSREP */ + /* We can abort create table for any table type */ thd->abort_on_warning= thd->is_strict_mode(); if (mysql_create_table_no_lock(thd, &ddl_log_state_create, &ddl_log_state_rm, - &create_table->db, - &create_table->table_name, create_info, + create_info, alter_info, &is_trans, create_table_mode, create_table) > 0) @@ -5406,7 +5395,6 @@ bool mysql_create_like_table(THD* thd, TABLE_LIST* table, res= ((create_res= mysql_create_table_no_lock(thd, &ddl_log_state_create, &ddl_log_state_rm, - &table->db, &table->table_name, &local_create_info, &local_alter_info, &is_trans, C_ORDINARY_CREATE, table)) > 0); @@ -7133,8 +7121,7 @@ bool mysql_compare_tables(TABLE *table, Alter_info *alter_info, C_ORDINARY_CREATE : C_ALTER_TABLE; if (mysql_prepare_create_table(thd, create_info, &tmp_alter_info, &db_options, table->file, &key_info_buffer, - &key_count, create_table_mode, - table->s->db, table->s->table_name)) + &key_count, create_table_mode)) DBUG_RETURN(1); /* Some very basic checks. */ @@ -8036,6 +8023,7 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, List new_create_tail; /* New key definitions are added here */ List new_key_list; + List fk_list; List rename_key_list(alter_info->alter_rename_key_list); /* @@ -8069,12 +8057,13 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, bool drop_period= false; LEX_CSTRING period_start_name= {nullptr, 0}; LEX_CSTRING period_end_name= {nullptr, 0}; + DBUG_ENTER("mysql_prepare_alter_table"); + if (table->s->period.name) { period_start_name= table->s->period_start_field()->field_name; period_end_name= table->s->period_end_field()->field_name; } - DBUG_ENTER("mysql_prepare_alter_table"); /* Merge incompatible changes flag in case of upgrade of a table from an @@ -8139,6 +8128,8 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, &create_info->option_list, thd->mem_root)) DBUG_RETURN(1); + table->file->get_foreign_key_list(thd, &fk_list); + /* First collect all fields from table which isn't in drop_list */ @@ -8754,12 +8745,6 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, key_create_info.comment= key_info->comment; key_create_info.is_ignored= key_info->is_ignored; - /* - We're refreshing an already existing index. Since the index is not - modified, there is no need to check for duplicate indexes again. - */ - key_create_info.check_for_duplicate_indexes= false; - if (key_info->flags & HA_SPATIAL) key_type= Key::SPATIAL; else if (key_info->flags & HA_NOSAME) @@ -8806,10 +8791,11 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, tmp_name.length= strlen(key_name); /* We dont need LONG_UNIQUE_HASH_FIELD flag because it will be autogenerated */ key= new (thd->mem_root) Key(key_type, &tmp_name, &key_create_info, - MY_TEST(key_info->flags & HA_GENERATED_KEY), + key_info->flags & HA_GENERATED_KEY, &key_parts, key_info->option_list, DDL_options()); key->without_overlaps= key_info->without_overlaps; key->period= table->s->period.name; + key->old= true; new_key_list.push_back(key, thd->mem_root); } if (long_hash_key) @@ -8818,6 +8804,30 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, re_setup_keyinfo_hash(key_info); } } + { + // add existing foreign keys + for (auto &fk : fk_list) + { + Alter_drop *drop; + for(drop_it.rewind(); (drop=drop_it++); ) + if (drop->type == Alter_drop::FOREIGN_KEY && + !my_strcasecmp(system_charset_info, fk.foreign_id->str, drop->name)) + break; + if (drop) + continue; + List cols, ref_cols; + for (LEX_CSTRING &c : fk.foreign_fields) + cols.push_back(new (thd->mem_root) Key_part_spec(&c, 0)); + for (LEX_CSTRING &c : fk.referenced_fields) + ref_cols.push_back(new (thd->mem_root) Key_part_spec(&c, 0)); + auto key= new (thd->mem_root) + Foreign_key(fk.foreign_id, &cols, fk.foreign_id, fk.referenced_db, + fk.referenced_table, &ref_cols, fk.delete_method, fk.update_method, + Foreign_key::FK_MATCH_UNDEF, DDL_options()); + key->old= true; + new_key_list.push_back(key, thd->mem_root); + } + } { Key *key; while ((key=key_it++)) // Add new keys @@ -8942,10 +8952,8 @@ mysql_prepare_alter_table(THD *thd, TABLE *table, if (!alter_info->check_constraint_list.is_empty()) { /* Check the table FOREIGN KEYs for name duplications. */ - List fk_child_key_list; FOREIGN_KEY_INFO *f_key; - table->file->get_foreign_key_list(thd, &fk_child_key_list); - List_iterator fk_key_it(fk_child_key_list); + List_iterator fk_key_it(fk_list); while ((f_key= fk_key_it++)) { List_iterator_fast @@ -9136,17 +9144,12 @@ fk_check_column_changes(THD *thd, Alter_info *alter_info, ((new_field->flags & NOT_NULL_FLAG) && !(old_field->flags & NOT_NULL_FLAG))) { - if (!(thd->variables.option_bits & OPTION_NO_FOREIGN_KEY_CHECKS)) - { - /* - Column in a FK has changed significantly. Unless - foreign_key_checks are off we prohibit this since this - means values in this column might be changed by ALTER - and thus referential integrity might be broken, - */ - *bad_column_name= column->str; - return FK_COLUMN_DATA_CHANGE; - } + /* + Column in a FK has changed significantly and it + may break referential intergrity. + */ + *bad_column_name= column->str; + return FK_COLUMN_DATA_CHANGE; } } else @@ -9375,7 +9378,7 @@ static bool fk_prepare_copy_alter_table(THD *thd, TABLE *table, while (Key *key= fk_list_it++) { - if (key->type != Key::FOREIGN_KEY) + if (key->type != Key::FOREIGN_KEY || key->old) continue; Foreign_key *fk= static_cast(key); @@ -10544,11 +10547,22 @@ do_continue:; } // In-place execution of ALTER TABLE for partitioning. + alter_info->db= alter_ctx.db; + alter_info->table_name= alter_ctx.table_name; DBUG_RETURN(fast_alter_partition_table(thd, table, alter_info, &alter_ctx, create_info, table_list)); } #endif +#ifdef WITH_WSREP + if (table->s->sequence && WSREP(thd) && + wsrep_thd_is_local_toi(thd)) + { + if (wsrep_check_sequence(thd, create_info->seq_create_info)) + DBUG_RETURN(TRUE); + } +#endif /* WITH_WSREP */ + /* Use copy algorithm if: - old_alter_table system variable is set without in-place requested using @@ -10675,6 +10689,7 @@ do_continue:; else alter_info->flags|= ALTER_INDEX_ORDER; create_info->alias= alter_ctx.table_name; + thd->abort_on_warning= !ignore && thd->is_strict_mode(); /* Create the .frm file for the new table. Storage engine table will not be created at this stage. @@ -10688,9 +10703,10 @@ do_continue:; alter_ctx.db, alter_ctx.table_name, alter_ctx.new_db, alter_ctx.tmp_name, alter_ctx.get_tmp_cstring_path(), - thd->lex->create_info, create_info, alter_info, - C_ALTER_TABLE_FRM_ONLY, NULL, - &key_info, &key_count, &frm); + thd->lex->create_info, + create_info, alter_info, C_ALTER_TABLE_FRM_ONLY, + NULL, &key_info, &key_count, &frm); + thd->abort_on_warning= false; reenable_binlog(thd); debug_crash_here("ddl_log_alter_after_create_frm"); diff --git a/sql/sql_table.h b/sql/sql_table.h index ccde7d87120..fded83531f5 100644 --- a/sql/sql_table.h +++ b/sql/sql_table.h @@ -133,24 +133,16 @@ bool add_keyword_to_query(THD *thd, String *result, const LEX_CSTRING *keyword, int mysql_create_table_no_lock(THD *thd, DDL_LOG_STATE *ddl_log_state, DDL_LOG_STATE *ddl_log_state_rm, - const LEX_CSTRING *db, - const LEX_CSTRING *table_name, Table_specification_st *create_info, Alter_info *alter_info, bool *is_trans, int create_table_mode, TABLE_LIST *table); -handler *mysql_create_frm_image(THD *thd, - const LEX_CSTRING &db, - const LEX_CSTRING &table_name, - HA_CREATE_INFO *create_info, - Alter_info *alter_info, - int create_table_mode, - KEY **key_info, - uint *key_count, +handler *mysql_create_frm_image(THD *thd, HA_CREATE_INFO *create_info, + Alter_info *alter_info, int create_table_mode, + KEY **key_info, uint *key_count, LEX_CUSTRING *frm); -int mysql_discard_or_import_tablespace(THD *thd, - TABLE_LIST *table_list, +int mysql_discard_or_import_tablespace(THD *thd, TABLE_LIST *table_list, bool discard); bool mysql_prepare_alter_table(THD *thd, TABLE *table, @@ -224,4 +216,8 @@ extern MYSQL_PLUGIN_IMPORT const LEX_CSTRING primary_key_name; bool check_engine(THD *, const char *, const char *, HA_CREATE_INFO *); +#ifdef WITH_WSREP +bool wsrep_check_sequence(THD* thd, const class sequence_definition *seq); +#endif + #endif /* SQL_TABLE_INCLUDED */ diff --git a/sql/sql_type_fixedbin.h b/sql/sql_type_fixedbin.h index 2a2cc1e1ff6..fed9820772a 100644 --- a/sql/sql_type_fixedbin.h +++ b/sql/sql_type_fixedbin.h @@ -773,7 +773,7 @@ public: { return singleton(); } - void set(uint pos, Item *item) override + bool set(uint pos, Item *item) override { Fbt *buff= &((Fbt *) base)[pos]; Fbt_null value(item); @@ -781,6 +781,7 @@ public: *buff= Fbt::zero(); else *buff= value; + return FALSE; } uchar *get_value(Item *item) override { diff --git a/sql/sql_type_int.h b/sql/sql_type_int.h index c22b1038890..e015e989da3 100644 --- a/sql/sql_type_int.h +++ b/sql/sql_type_int.h @@ -36,6 +36,12 @@ protected: public: longlong value() const { return m_value; } Longlong(longlong nr) :m_value(nr) { } + ulonglong abs() + { + if (m_value == LONGLONG_MIN) // avoid undefined behavior + return ((ulonglong) LONGLONG_MAX) + 1; + return m_value < 0 ? -m_value : m_value; + } }; @@ -108,6 +114,86 @@ public: }; +class ULonglong +{ +protected: + ulonglong m_value; +public: + ulonglong value() const { return m_value; } + explicit ULonglong(ulonglong nr) :m_value(nr) { } + + static bool test_if_sum_overflows_ull(ulonglong arg1, ulonglong arg2) + { + return ULONGLONG_MAX - arg1 < arg2; + } + + Longlong_null operator-() const + { + if (m_value > (ulonglong) LONGLONG_MAX) // Avoid undefined behaviour + { + return m_value == (ulonglong) LONGLONG_MAX + 1 ? + Longlong_null(LONGLONG_MIN, false) : + Longlong_null(0, true); + } + return Longlong_null(-(longlong) m_value, false); + } + + // Convert to Longlong_null with the range check + Longlong_null to_longlong_null() const + { + if (m_value > (ulonglong) LONGLONG_MAX) + return Longlong_null(0, true); + return Longlong_null((longlong) m_value, false); + } + +}; + + +class ULonglong_null: public ULonglong, public Null_flag +{ +public: + ULonglong_null(ulonglong nr, bool is_null) + :ULonglong(nr), Null_flag(is_null) + { } + + /* + Multiply two ulonglong values. + + Let a = a1 * 2^32 + a0 and b = b1 * 2^32 + b0. Then + a * b = (a1 * 2^32 + a0) * (b1 * 2^32 + b0) = a1 * b1 * 2^64 + + + (a1 * b0 + a0 * b1) * 2^32 + a0 * b0; + We can determine if the above sum overflows the ulonglong range by + sequentially checking the following conditions: + 1. If both a1 and b1 are non-zero. + 2. Otherwise, if (a1 * b0 + a0 * b1) is greater than ULONG_MAX. + 3. Otherwise, if (a1 * b0 + a0 * b1) * 2^32 + a0 * b0 is greater than + ULONGLONG_MAX. + */ + static ULonglong_null ullmul(ulonglong a, ulonglong b) + { + ulong a1= (ulong)(a >> 32); + ulong b1= (ulong)(b >> 32); + + if (a1 && b1) + return ULonglong_null(0, true); + + ulong a0= (ulong)(0xFFFFFFFFUL & a); + ulong b0= (ulong)(0xFFFFFFFFUL & b); + + ulonglong res1= (ulonglong) a1 * b0 + (ulonglong) a0 * b1; + if (res1 > 0xFFFFFFFFUL) + return ULonglong_null(0, true); + + res1= res1 << 32; + ulonglong res0= (ulonglong) a0 * b0; + + if (test_if_sum_overflows_ull(res1, res0)) + return ULonglong_null(0, true); + return ULonglong_null(res1 + res0, false); + } +}; + + // A longlong/ulonglong hybrid. Good to store results of val_int(). class Longlong_hybrid: public Longlong { @@ -136,9 +222,7 @@ public: { if (m_unsigned) return (ulonglong) m_value; - if (m_value == LONGLONG_MIN) // avoid undefined behavior - return ((ulonglong) LONGLONG_MAX) + 1; - return m_value < 0 ? -m_value : m_value; + return Longlong(m_value).abs(); } /* Convert to an unsigned number: @@ -156,6 +240,33 @@ public: { return (uint) to_ulonglong(upper_bound); } + + + Longlong_null val_int_signed() const + { + if (m_unsigned) + return ULonglong((ulonglong) m_value).to_longlong_null(); + return Longlong_null(m_value, false); + } + + Longlong_null val_int_unsigned() const + { + if (!m_unsigned && m_value < 0) + return Longlong_null(0, true); + return Longlong_null(m_value, false); + } + + /* + Return in Item compatible val_int() format: + - signed numbers as a straight longlong value + - unsigned numbers as a ulonglong value reinterpreted to longlong + */ + Longlong_null val_int(bool want_unsigned_value) const + { + return want_unsigned_value ? val_int_unsigned() : + val_int_signed(); + } + int cmp(const Longlong_hybrid& other) const { if (m_unsigned == other.m_unsigned) @@ -205,4 +316,50 @@ public: }; +/* + Stores the absolute value of a number, and the sign. + Value range: -ULONGLONG_MAX .. +ULONGLONG_MAX. + + Provides a wider range for negative numbers than Longlong_hybrid does. + Usefull to store intermediate results of an expression whose value + is further needed to be negated. For example, these methods: + - Item_func_mul::int_op() + - Item_func_int_div::val_int() + - Item_func_mod::int_op() + calculate the result of absolute values of the arguments, + then optionally negate the result. +*/ +class ULonglong_hybrid: public ULonglong +{ + bool m_neg; +public: + ULonglong_hybrid(ulonglong value, bool neg) + :ULonglong(value), m_neg(neg) + { + if (m_neg && !m_value) + m_neg= false; // convert -0 to +0 + } + Longlong_null val_int_unsigned() const + { + return m_neg ? Longlong_null(0, true) : + Longlong_null((longlong) m_value, false); + } + Longlong_null val_int_signed() const + { + return m_neg ? -ULonglong(m_value) : ULonglong::to_longlong_null(); + } + + /* + Return in Item compatible val_int() format: + - signed numbers as a straight longlong value + - unsigned numbers as a ulonglong value reinterpreted to longlong + */ + Longlong_null val_int(bool want_unsigned_value) const + { + return want_unsigned_value ? val_int_unsigned() : + val_int_signed(); + } +}; + + #endif // SQL_TYPE_INT_INCLUDED diff --git a/sql/sql_union.cc b/sql/sql_union.cc index f88f515f0d2..26fc278288f 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -2303,9 +2303,9 @@ bool st_select_lex_unit::exec() the current result. */ push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, - ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT, - ER_THD(thd, ER_QUERY_EXCEEDED_ROWS_EXAMINED_LIMIT), - thd->accessed_rows_and_keys, + ER_QUERY_RESULT_INCOMPLETE, + ER_THD(thd, ER_QUERY_RESULT_INCOMPLETE), + "LIMIT ROWS EXAMINED", thd->lex->limit_rows_examined->val_uint()); thd->reset_killed(); break; diff --git a/sql/sql_update.cc b/sql/sql_update.cc index b9a96238fc7..78532051987 100644 --- a/sql/sql_update.cc +++ b/sql/sql_update.cc @@ -231,6 +231,11 @@ bool TABLE::vers_check_update(List &items) } } } + /* + Tell TRX_ID-versioning that it does not insert history row + (see calc_row_difference()). + */ + vers_write= false; return false; } diff --git a/sql/sql_window.cc b/sql/sql_window.cc index 8716b596914..4d6d5ddd951 100644 --- a/sql/sql_window.cc +++ b/sql/sql_window.cc @@ -3081,7 +3081,7 @@ bool Window_funcs_sort::setup(THD *thd, SQL_SELECT *sel, spec= win_func->window_spec; int win_func_order_elements= spec->partition_list->elements + spec->order_list->elements; - if (win_func_order_elements > longest_order_elements) + if (win_func_order_elements >= longest_order_elements) { win_func_with_longest_order= win_func; longest_order_elements= win_func_order_elements; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index b8ed2db11b7..541c98360d9 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1559,6 +1559,43 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); delete $$; } + +/* + +// COMMENT_FOR_DESCTRUCTOR: +// +// %destructor is only invoked if the rule parsing fails in the middle. +// If we call YYABORT from the last code block %destructor is not called, +// because Bison's stack already contains the reduced upper level rule. +// If we need to invoke the %destructor after the YYABORT in the last code +// block, we have to add another dummy empty end-of-rule action {} at the end. + +// So to have a %destructor work properly with YYABORT, +// make sure to turn a grammar like this: + +rule: + KEYWORD expr_lex + { + if (condition) // End-of-rule action + YYABORT; + } + ; + +// into: + +rule: + KEYWORD expr_lex + { + if (condition) // This is now a mid-rule action + YYABORT; + } + { + // A dummy empty end-of-rule action. + } + ; +*/ + + %type assignment_source_lex assignment_source_expr @@ -3782,6 +3819,7 @@ sp_proc_stmt_return: $2->get_item(), $2))) MYSQL_YYABORT; } + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } | RETURN_ORACLE_SYM { LEX *lex= Lex; @@ -3808,11 +3846,13 @@ sp_proc_stmt_exit_oracle: if (unlikely($3->sp_exit_statement(thd, $3->get_item()))) MYSQL_YYABORT; } + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } | EXIT_ORACLE_SYM label_ident WHEN_SYM expr_lex { if (unlikely($4->sp_exit_statement(thd, &$2, $4->get_item()))) MYSQL_YYABORT; } + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } ; sp_proc_stmt_continue_oracle: @@ -3831,11 +3871,13 @@ sp_proc_stmt_continue_oracle: if (unlikely($3->sp_continue_when_statement(thd))) MYSQL_YYABORT; } + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } | CONTINUE_ORACLE_SYM label_ident WHEN_SYM expr_lex { if (unlikely($4->sp_continue_when_statement(thd, &$2))) MYSQL_YYABORT; } + { /* See the comment 'COMMENT_FOR_DESCTRUCTOR' near %destructor */ } ; @@ -10513,7 +10555,7 @@ function_call_generic: This will be revised with WL#2128 (SQL PATH) */ - if ((builder= find_native_function_builder(thd, &$1))) + if ((builder= native_functions_hash.find(thd, $1))) { item= builder->create_func(thd, &$1, $4); } @@ -19243,8 +19285,6 @@ create_routine: } | create_or_replace definer_opt PACKAGE_ORACLE_SYM opt_if_not_exists sp_name opt_create_package_chistics_init - sp_tail_is - remember_name { sp_package *pkg; if (unlikely(!(pkg= Lex-> @@ -19254,17 +19294,17 @@ create_routine: $5, $1 | $4)))) MYSQL_YYABORT; pkg->set_c_chistics(Lex->sp_chistics); + Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); } + sp_tail_is opt_package_specification_element_list END remember_end_opt opt_sp_name { - if (unlikely(Lex->create_package_finalize(thd, $5, $13, $8, $12))) + if (unlikely(Lex->create_package_finalize(thd, $5, $12, $11))) MYSQL_YYABORT; } | create_or_replace definer_opt PACKAGE_ORACLE_SYM BODY_ORACLE_SYM opt_if_not_exists sp_name opt_create_package_chistics_init - sp_tail_is - remember_name { sp_package *pkg; if (unlikely(!(pkg= Lex-> @@ -19274,8 +19314,10 @@ create_routine: $6, $1 | $5)))) MYSQL_YYABORT; pkg->set_c_chistics(Lex->sp_chistics); + Lex->sphead->set_body_start(thd, YYLIP->get_cpp_tok_start()); Lex->sp_block_init(thd); } + sp_tail_is package_implementation_declare_section { if (unlikely(Lex->sp_block_with_exceptions_finalize_declarations(thd))) @@ -19283,13 +19325,13 @@ create_routine: } package_implementation_executable_section { - $11.hndlrs+= $13.hndlrs; - if (unlikely(Lex->sp_block_finalize(thd, $11))) + $10.hndlrs+= $12.hndlrs; + if (unlikely(Lex->sp_block_finalize(thd, $10))) MYSQL_YYABORT; } remember_end_opt opt_sp_name { - if (unlikely(Lex->create_package_finalize(thd, $6, $16, $9, $15))) + if (unlikely(Lex->create_package_finalize(thd, $6, $15, $14))) MYSQL_YYABORT; } ; diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index ec8d6aac915..66c554d1cc6 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -1866,6 +1866,13 @@ Sys_gtid_domain_id( ON_CHECK(check_gtid_domain_id)); +/* + Check that setting gtid_seq_no isn't done inside a transaction, and (in + gtid_strict_mode) doesn't create an out-of-order GTID sequence. + + Setting gtid_seq_no to DEFAULT or 0 means we 'reset' it so that the value + doesn't affect the GTID of the next event group written to the binlog. +*/ static bool check_gtid_seq_no(sys_var *self, THD *thd, set_var *var) { uint32 domain_id, server_id; @@ -1876,13 +1883,16 @@ static bool check_gtid_seq_no(sys_var *self, THD *thd, set_var *var) ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_GTID_DOMAIN_ID_SEQ_NO))) return true; - domain_id= thd->variables.gtid_domain_id; - server_id= thd->variables.server_id; - seq_no= (uint64)var->value->val_uint(); - DBUG_EXECUTE_IF("ignore_set_gtid_seq_no_check", return 0;); - if (opt_gtid_strict_mode && opt_bin_log && - mysql_bin_log.check_strict_gtid_sequence(domain_id, server_id, seq_no)) - return true; + DBUG_EXECUTE_IF("ignore_set_gtid_seq_no_check", return false;); + if (var->value && opt_gtid_strict_mode && opt_bin_log) + { + domain_id= thd->variables.gtid_domain_id; + server_id= thd->variables.server_id; + seq_no= (uint64)var->value->val_uint(); + if (seq_no != 0 && + mysql_bin_log.check_strict_gtid_sequence(domain_id, server_id, seq_no)) + return true; + } return false; } diff --git a/sql/sys_vars.inl b/sql/sys_vars.inl index 97e3a28b67e..fff8998b25a 100644 --- a/sql/sys_vars.inl +++ b/sql/sys_vars.inl @@ -664,7 +664,11 @@ public: { if (sysvartrack_global_update(thd, new_val, var->save_result.string_value.length)) + { + if (new_val) + my_free(new_val); new_val= 0; + } } global_update_finish(new_val); return (new_val == 0 && var->save_result.string_value.str != 0); diff --git a/sql/table.cc b/sql/table.cc index 6b886915715..bdfd9ff2c84 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -46,6 +46,9 @@ #include "sql_show.h" #include "opt_trace.h" #include "sql_db.h" // get_default_db_collation +#ifdef WITH_WSREP +#include "wsrep_schema.h" +#endif /* For MySQL 5.7 virtual fields */ #define MYSQL57_GENERATED_FIELD 128 @@ -281,10 +284,14 @@ TABLE_CATEGORY get_table_category(const LEX_CSTRING *db, #ifdef WITH_WSREP if (db->str && - my_strcasecmp(system_charset_info, db->str, "mysql") == 0 && - my_strcasecmp(system_charset_info, name->str, "wsrep_streaming_log") == 0) + my_strcasecmp(system_charset_info, db->str, WSREP_SCHEMA) == 0) { - return TABLE_CATEGORY_INFORMATION; + if ((my_strcasecmp(system_charset_info, name->str, WSREP_STREAMING_TABLE) == 0 || + my_strcasecmp(system_charset_info, name->str, WSREP_CLUSTER_TABLE) == 0 || + my_strcasecmp(system_charset_info, name->str, WSREP_MEMBERS_TABLE) == 0)) + { + return TABLE_CATEGORY_INFORMATION; + } } #endif /* WITH_WSREP */ if (is_infoschema_db(db)) @@ -3541,17 +3548,18 @@ int TABLE_SHARE::init_from_sql_statement_string(THD *thd, bool write, if (thd->lex->create_info.resolve_to_charset_collation_context(thd, ctx)) DBUG_RETURN(true); - thd->lex->create_info.db_type= hton; + tmp_lex.create_info.db_type= hton; #ifdef WITH_PARTITION_STORAGE_ENGINE thd->work_part_info= 0; // For partitioning #endif if (tabledef_version.str) - thd->lex->create_info.tabledef_version= tabledef_version; + tmp_lex.create_info.tabledef_version= tabledef_version; - promote_first_timestamp_column(&thd->lex->alter_info.create_list); - file= mysql_create_frm_image(thd, db, table_name, - &thd->lex->create_info, &thd->lex->alter_info, + tmp_lex.alter_info.db= db; + tmp_lex.alter_info.table_name= table_name; + promote_first_timestamp_column(&tmp_lex.alter_info.create_list); + file= mysql_create_frm_image(thd, &tmp_lex.create_info, &tmp_lex.alter_info, C_ORDINARY_CREATE, &unused1, &unused2, &frm); error|= file == 0; delete file; @@ -3565,7 +3573,7 @@ int TABLE_SHARE::init_from_sql_statement_string(THD *thd, bool write, ret: my_free(const_cast(frm.str)); - lex_end(thd->lex); + lex_end(&tmp_lex); thd->reset_db(&db_backup); thd->lex= old_lex; reenable_binlog(thd); @@ -9994,20 +10002,14 @@ LEX_CSTRING *fk_option_name(enum_fk_option opt) { { STRING_WITH_LEN("???") }, { STRING_WITH_LEN("RESTRICT") }, + { STRING_WITH_LEN("NO ACTION") }, { STRING_WITH_LEN("CASCADE") }, { STRING_WITH_LEN("SET NULL") }, - { STRING_WITH_LEN("NO ACTION") }, { STRING_WITH_LEN("SET DEFAULT") } }; return names + opt; } -bool fk_modifies_child(enum_fk_option opt) -{ - static bool can_write[]= { false, false, true, true, false, true }; - return can_write[opt]; -} - enum TR_table::enabled TR_table::use_transaction_registry= TR_table::MAYBE; TR_table::TR_table(THD* _thd, bool rw) : diff --git a/sql/table.h b/sql/table.h index baf6cff4181..820be6d193c 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1912,8 +1912,8 @@ enum enum_schema_table_state PROCESSED_BY_JOIN_EXEC }; -enum enum_fk_option { FK_OPTION_UNDEF, FK_OPTION_RESTRICT, FK_OPTION_CASCADE, - FK_OPTION_SET_NULL, FK_OPTION_NO_ACTION, FK_OPTION_SET_DEFAULT}; +enum enum_fk_option { FK_OPTION_UNDEF, FK_OPTION_RESTRICT, FK_OPTION_NO_ACTION, + FK_OPTION_CASCADE, FK_OPTION_SET_NULL, FK_OPTION_SET_DEFAULT }; typedef struct st_foreign_key_info { @@ -1930,7 +1930,11 @@ typedef struct st_foreign_key_info } FOREIGN_KEY_INFO; LEX_CSTRING *fk_option_name(enum_fk_option opt); -bool fk_modifies_child(enum_fk_option opt); +static inline bool fk_modifies_child(enum_fk_option opt) +{ + return opt >= FK_OPTION_CASCADE; +} + class IS_table_read_plan; diff --git a/sql/table_cache.cc b/sql/table_cache.cc index 8fb3a559d86..789d0c87e02 100644 --- a/sql/table_cache.cc +++ b/sql/table_cache.cc @@ -823,6 +823,10 @@ retry: element= (TDC_element*) lf_hash_search_using_hash_value(&tdc_hash, thd->tdc_hash_pins, hash_value, (uchar*) key, key_length); + /* It's safe to unpin the pins here, because an empty element was inserted + above, "empty" means at least element->share = 0. Some other thread can't + delete it while element->share == 0. And element->share is also protected + with element->LOCK_table_share mutex. */ lf_hash_search_unpin(thd->tdc_hash_pins); DBUG_ASSERT(element); diff --git a/sql/wsrep_mysqld.cc b/sql/wsrep_mysqld.cc index 1f446868653..b788e054508 100644 --- a/sql/wsrep_mysqld.cc +++ b/sql/wsrep_mysqld.cc @@ -2531,6 +2531,15 @@ bool wsrep_can_run_in_toi(THD *thd, const char *db, const char *table, return !(table || table_list); break; + case SQLCOM_CREATE_SEQUENCE: + /* No TOI for temporary sequences as they are + not replicated */ + if (thd->lex->tmp_table()) + { + return false; + } + return true; + } } @@ -2819,6 +2828,13 @@ static int wsrep_RSU_begin(THD *thd, const char *db_, const char *table_) WSREP_DEBUG("RSU BEGIN: %lld, : %s", wsrep_thd_trx_seqno(thd), wsrep_thd_query(thd)); + /* For CREATE TEMPORARY SEQUENCE we do not start RSU because + object is local only and actually CREATE TABLE + INSERT + */ + if (thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE && + thd->lex->tmp_table()) + return 1; + if (thd->variables.wsrep_OSU_method == WSREP_OSU_RSU && thd->variables.sql_log_bin == 1 && wsrep_check_mode(WSREP_MODE_DISALLOW_LOCAL_GTID)) @@ -2918,9 +2934,20 @@ int wsrep_to_isolation_begin(THD *thd, const char *db_, const char *table_, return -1; } + /* If we are inside LOCK TABLE we release it and give warning. */ + if (thd->variables.option_bits & OPTION_TABLE_LOCK && + thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE) + { + thd->locked_tables_list.unlock_locked_tables(thd); + thd->variables.option_bits&= ~(OPTION_TABLE_LOCK); + push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, + HA_ERR_UNSUPPORTED, + "Galera cluster does not support LOCK TABLE on " + "SEQUENCES. Lock is released."); + } if (wsrep_debug && thd->mdl_context.has_locks()) { - WSREP_DEBUG("thread holds MDL locks at TI begin: %s %llu", + WSREP_DEBUG("thread holds MDL locks at TO begin: %s %llu", wsrep_thd_query(thd), thd->thread_id); } diff --git a/sql/wsrep_schema.cc b/sql/wsrep_schema.cc index a19ea688fd6..5a759c74ef7 100644 --- a/sql/wsrep_schema.cc +++ b/sql/wsrep_schema.cc @@ -35,11 +35,6 @@ #include #include -#define WSREP_SCHEMA "mysql" -#define WSREP_STREAMING_TABLE "wsrep_streaming_log" -#define WSREP_CLUSTER_TABLE "wsrep_cluster" -#define WSREP_MEMBERS_TABLE "wsrep_cluster_members" - const char* wsrep_sr_table_name_full= WSREP_SCHEMA "/" WSREP_STREAMING_TABLE; static const std::string wsrep_schema_str= WSREP_SCHEMA; @@ -55,7 +50,7 @@ static const std::string create_cluster_table_str= "view_seqno BIGINT NOT NULL," "protocol_version INT NOT NULL," "capabilities INT NOT NULL" - ") ENGINE=InnoDB STATS_PERSISTENT=0"; + ") ENGINE=InnoDB STATS_PERSISTENT=0 CHARSET=latin1"; static const std::string create_members_table_str= "CREATE TABLE IF NOT EXISTS " + wsrep_schema_str + "." + members_table_str + @@ -64,7 +59,7 @@ static const std::string create_members_table_str= "cluster_uuid CHAR(36) NOT NULL," "node_name CHAR(32) NOT NULL," "node_incoming_address VARCHAR(256) NOT NULL" - ") ENGINE=InnoDB STATS_PERSISTENT=0"; + ") ENGINE=InnoDB STATS_PERSISTENT=0 CHARSET=latin1"; #ifdef WSREP_SCHEMA_MEMBERS_HISTORY static const std::string cluster_member_history_table_str= "wsrep_cluster_member_history"; @@ -77,7 +72,7 @@ static const std::string create_members_history_table_str= "last_view_seqno BIGINT NOT NULL," "node_name CHAR(32) NOT NULL," "node_incoming_address VARCHAR(256) NOT NULL" - ") ENGINE=InnoDB STATS_PERSISTENT=0"; + ") ENGINE=InnoDB STATS_PERSISTENT=0 CHARSET=latin1"; #endif /* WSREP_SCHEMA_MEMBERS_HISTORY */ static const std::string create_frag_table_str= @@ -89,7 +84,7 @@ static const std::string create_frag_table_str= "flags INT NOT NULL, " "frag LONGBLOB NOT NULL, " "PRIMARY KEY (node_uuid, trx_id, seqno)" - ") ENGINE=InnoDB STATS_PERSISTENT=0"; + ") ENGINE=InnoDB STATS_PERSISTENT=0 CHARSET=latin1"; static const std::string delete_from_cluster_table= "DELETE FROM " + wsrep_schema_str + "." + cluster_table_str; @@ -101,21 +96,21 @@ static const std::string delete_from_members_table= persistent statistics to be collected from these tables. */ static const std::string alter_cluster_table= "ALTER TABLE " + wsrep_schema_str + "." + cluster_table_str + - " STATS_PERSISTENT=0"; + " STATS_PERSISTENT=0 CHARSET=latin1"; static const std::string alter_members_table= "ALTER TABLE " + wsrep_schema_str + "." + members_table_str + - " STATS_PERSISTENT=0"; + " STATS_PERSISTENT=0 CHARSET=latin1"; #ifdef WSREP_SCHEMA_MEMBERS_HISTORY static const std::string alter_members_history_table= "ALTER TABLE " + wsrep_schema_str + "." + members_history_table_str + - " STATS_PERSISTENT=0"; + " STATS_PERSISTENT=0 CHARSET=latin1"; #endif static const std::string alter_frag_table= "ALTER TABLE " + wsrep_schema_str + "." + sr_table_str + - " STATS_PERSISTENT=0"; + " STATS_PERSISTENT=0 CHARSET=latin1"; namespace Wsrep_schema_impl { diff --git a/sql/wsrep_schema.h b/sql/wsrep_schema.h index 36e23998d19..979b175481c 100644 --- a/sql/wsrep_schema.h +++ b/sql/wsrep_schema.h @@ -33,6 +33,11 @@ struct TABLE_LIST; struct st_mysql_lex_string; typedef struct st_mysql_lex_string LEX_STRING; +#define WSREP_SCHEMA "mysql" +#define WSREP_STREAMING_TABLE "wsrep_streaming_log" +#define WSREP_CLUSTER_TABLE "wsrep_cluster" +#define WSREP_MEMBERS_TABLE "wsrep_cluster_members" + /** Name of the table in `wsrep_schema_str` used for storing streaming replication data. In an InnoDB full format, e.g. "database/tablename". */ extern const char* wsrep_sr_table_name_full; diff --git a/sql/wsrep_sst.cc b/sql/wsrep_sst.cc index 118bedecff3..e03de7d59f7 100644 --- a/sql/wsrep_sst.cc +++ b/sql/wsrep_sst.cc @@ -299,6 +299,15 @@ void wsrep_sst_auth_init () bool wsrep_sst_donor_check (sys_var *self, THD* thd, set_var* var) { + if ((! var->save_result.string_value.str) || + (var->save_result.string_value.length > (FN_REFLEN -1))) // safety + { + my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), var->var->name.str, + var->save_result.string_value.str ? + var->save_result.string_value.str : "NULL"); + return 1; + } + return 0; } diff --git a/sql/wsrep_trans_observer.h b/sql/wsrep_trans_observer.h index 6b656f84c78..54493f245de 100644 --- a/sql/wsrep_trans_observer.h +++ b/sql/wsrep_trans_observer.h @@ -220,13 +220,18 @@ static inline bool wsrep_run_commit_hook(THD* thd, bool all) mysql_mutex_lock(&thd->LOCK_thd_data); /* Transaction creating sequence is TOI or RSU, - CREATE [TEMPORARY] SEQUENCE = CREATE + INSERT (initial value) + CREATE SEQUENCE = CREATE + INSERT (initial value) and replicated using statement based replication, thus - the commit hooks will be skipped */ + the commit hooks will be skipped. + + For TEMPORARY SEQUENCES commit hooks will be done as + CREATE + INSERT is not replicated and needs to be + committed locally. */ if (ret && (thd->wsrep_cs().mode() == wsrep::client_state::m_toi || thd->wsrep_cs().mode() == wsrep::client_state::m_rsu) && - thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE) + thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE && + !thd->lex->tmp_table()) ret= false; mysql_mutex_unlock(&thd->LOCK_thd_data); diff --git a/sql/xa.cc b/sql/xa.cc index 0e421ac62f5..234d2a6dccc 100644 --- a/sql/xa.cc +++ b/sql/xa.cc @@ -251,9 +251,14 @@ static XID_cache_element *xid_cache_search(THD *thd, XID *xid) xid->key(), xid->key_length()); if (element) { + /* The element can be removed from lf_hash by other thread, but + element->acquire_recovered() will return false in this case. */ if (!element->acquire_recovered()) element= 0; lf_hash_search_unpin(thd->xid_hash_pins); + /* Once the element is acquired (i.e. got the ACQUIRED bit) by this thread, + only this thread can delete it. The deletion happens in xid_cache_delete(). + See also the XID_cache_element documentation. */ DEBUG_SYNC(thd, "xa_after_search"); } return element; @@ -601,6 +606,16 @@ bool trans_xa_commit(THD *thd) if (auto xs= xid_cache_search(thd, thd->lex->xid)) { bool xid_deleted= false; + MDL_request mdl_request; + bool rw_trans= (xs->rm_error != ER_XA_RBROLLBACK); + + if (rw_trans && thd->is_read_only_ctx()) + { + my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); + res= 1; + goto _end_external_xid; + } + res= xa_trans_rolled_back(xs); /* Acquire metadata lock which will ensure that COMMIT is blocked @@ -609,7 +624,6 @@ bool trans_xa_commit(THD *thd) We allow FLUSHer to COMMIT; we assume FLUSHer knows what it does. */ - MDL_request mdl_request; MDL_REQUEST_INIT(&mdl_request, MDL_key::BACKUP, "", "", MDL_BACKUP_COMMIT, MDL_EXPLICIT); if (thd->mdl_context.acquire_lock(&mdl_request, @@ -659,7 +673,11 @@ bool trans_xa_commit(THD *thd) DBUG_RETURN(res); } - if (xa_trans_rolled_back(xid_state.xid_cache_element)) + if (thd->transaction->all.is_trx_read_write() && thd->is_read_only_ctx()) + { + my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); + DBUG_RETURN(TRUE); + } else if (xa_trans_rolled_back(xid_state.xid_cache_element)) { xa_trans_force_rollback(thd); DBUG_RETURN(thd->is_error()); @@ -777,6 +795,15 @@ bool trans_xa_rollback(THD *thd) bool res; bool xid_deleted= false; MDL_request mdl_request; + bool rw_trans= (xs->rm_error != ER_XA_RBROLLBACK); + + if (rw_trans && thd->is_read_only_ctx()) + { + my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); + res= 1; + goto _end_external_xid; + } + MDL_REQUEST_INIT(&mdl_request, MDL_key::BACKUP, "", "", MDL_BACKUP_COMMIT, MDL_EXPLICIT); if (thd->mdl_context.acquire_lock(&mdl_request, @@ -822,7 +849,11 @@ bool trans_xa_rollback(THD *thd) DBUG_RETURN(thd->get_stmt_da()->is_error()); } - if (xid_state.xid_cache_element->xa_state == XA_ACTIVE) + if (thd->transaction->all.is_trx_read_write() && thd->is_read_only_ctx()) + { + my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); + DBUG_RETURN(TRUE); + } else if (xid_state.xid_cache_element->xa_state == XA_ACTIVE) { xid_state.er_xaer_rmfail(); DBUG_RETURN(TRUE); diff --git a/storage/connect/CMakeLists.txt b/storage/connect/CMakeLists.txt index 4816086f7c8..51d1cf2fe39 100644 --- a/storage/connect/CMakeLists.txt +++ b/storage/connect/CMakeLists.txt @@ -17,7 +17,7 @@ IF(WITHOUT_DYNAMIC_PLUGINS OR WITH_NONE OR ("${PLUGIN_CONNECT}" STREQUAL "NO")) RETURN() ENDIF() -SET(CPACK_RPM_connect-engine_PACKAGE_SUMMARY "Connect storage engine for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_connect-engine_PACKAGE_SUMMARY "Connect storage engine for MariaDB server" PARENT_SCOPE) SET(CPACK_RPM_connect-engine_PACKAGE_DESCRIPTION "Connect engine supports a number of file formats (dbf, xml, txt, bin, etc), connections to ODBC tables and remote MySQL tables, as well as a number of other interesting features." PARENT_SCOPE) @@ -271,9 +271,11 @@ OPTION(CONNECT_WITH_JDBC "Compile CONNECT storage engine with JDBC support" ON) IF(CONNECT_WITH_JDBC) FIND_PACKAGE(Java 1.6) - SET_PACKAGE_PROPERTIES(Java PROPERTIES TYPE OPTIONAL) + SET_PACKAGE_PROPERTIES(Java PROPERTIES TYPE OPTIONAL + PURPOSE "Required for the CONNECT_JDBC feature") FIND_PACKAGE(JNI) - SET_PACKAGE_PROPERTIES(JNI PROPERTIES TYPE OPTIONAL) + SET_PACKAGE_PROPERTIES(JNI PROPERTIES TYPE OPTIONAL + PURPOSE "Required for the CONNECT_JDBC feature") IF (JAVA_FOUND AND JNI_FOUND) INCLUDE(UseJava) INCLUDE_DIRECTORIES(${JAVA_INCLUDE_PATH}) diff --git a/storage/connect/bson.cpp b/storage/connect/bson.cpp index 6bea4eb5d85..44d53ba17bd 100644 --- a/storage/connect/bson.cpp +++ b/storage/connect/bson.cpp @@ -215,7 +215,7 @@ OFFSET BDOC::ParseArray(size_t& i) switch (s[i]) { case ',': if (level < 2) { - sprintf(G->Message, "Unexpected ',' near %.*s", (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "Unexpected ',' near %.*s", (int) ARGS); throw 1; } else level = 1; @@ -223,7 +223,7 @@ OFFSET BDOC::ParseArray(size_t& i) break; case ']': if (level == 1) { - sprintf(G->Message, "Unexpected ',]' near %.*s", (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "Unexpected ',]' near %.*s", (int) ARGS); throw 1; } // endif level @@ -237,7 +237,7 @@ OFFSET BDOC::ParseArray(size_t& i) break; default: if (level == 2) { - sprintf(G->Message, "Unexpected value near %.*s", (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "Unexpected value near %.*s", (int) ARGS); throw 1; } else if (lastvlp) { vlp = ParseValue(i, NewVal()); @@ -284,7 +284,7 @@ OFFSET BDOC::ParseObject(size_t& i) level = 2; } else { - sprintf(G->Message, "misplaced string near %.*s", (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "misplaced string near %.*s", (int) ARGS); throw 2; } // endif level @@ -294,14 +294,14 @@ OFFSET BDOC::ParseObject(size_t& i) ParseValue(++i, GetVlp(lastbpp)); level = 3; } else { - sprintf(G->Message, "Unexpected ':' near %.*s", (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "Unexpected ':' near %.*s", (int) ARGS); throw 2; } // endif level break; case ',': if (level < 3) { - sprintf(G->Message, "Unexpected ',' near %.*s", (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "Unexpected ',' near %.*s", (int) ARGS); throw 2; } else level = 1; @@ -309,7 +309,7 @@ OFFSET BDOC::ParseObject(size_t& i) break; case '}': if (!(level == 0 || level == 3)) { - sprintf(G->Message, "Unexpected '}' near %.*s", (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "Unexpected '}' near %.*s", (int) ARGS); throw 2; } // endif level @@ -321,7 +321,7 @@ OFFSET BDOC::ParseObject(size_t& i) case '\t': break; default: - sprintf(G->Message, "Unexpected character '%c' near %.*s", + snprintf(G->Message, sizeof(G->Message), "Unexpected character '%c' near %.*s", s[i], (int) ARGS); throw 2; }; // endswitch s[i] @@ -399,7 +399,7 @@ suite: return bvp; err: - sprintf(G->Message, "Unexpected character '%c' near %.*s", s[i], (int) ARGS); + snprintf(G->Message, sizeof(G->Message), "Unexpected character '%c' near %.*s", s[i], (int) ARGS); throw 3; } // end of ParseValue @@ -758,16 +758,16 @@ bool BDOC::SerializeValue(PBVAL jvp, bool b) return jp->Escape(MZP(jvp->To_Val)); case TYPE_INTG: - sprintf(buf, "%d", jvp->N); + snprintf(buf, sizeof(buf), "%d", jvp->N); return jp->WriteStr(buf); case TYPE_BINT: - sprintf(buf, "%lld", *(longlong*)MakePtr(Base, jvp->To_Val)); + snprintf(buf, sizeof(buf), "%lld", *(longlong*)MakePtr(Base, jvp->To_Val)); return jp->WriteStr(buf); case TYPE_FLOAT: - sprintf(buf, "%.*f", jvp->Nd, jvp->F); + snprintf(buf, sizeof(buf), "%.*f", jvp->Nd, jvp->F); return jp->WriteStr(buf); case TYPE_DBL: - sprintf(buf, "%.*lf", jvp->Nd, *(double*)MakePtr(Base, jvp->To_Val)); + snprintf(buf, sizeof(buf), "%.*lf", jvp->Nd, *(double*)MakePtr(Base, jvp->To_Val)); return jp->WriteStr(buf); case TYPE_NULL: return jp->WriteStr("null"); @@ -797,7 +797,7 @@ void* BJSON::BsonSubAlloc(size_t size) memp, size, pph->To_Free, pph->FreeBlk); if (size > pph->FreeBlk) { /* Not enough memory left in pool */ - sprintf(G->Message, + snprintf(G->Message, sizeof(G->Message), "Not enough memory for request of %zd (used=%zd free=%zd)", size, pph->To_Free, pph->FreeBlk); xtrc(1, "BsonSubAlloc: %s\n", G->Message); @@ -1679,7 +1679,7 @@ PBVAL BJSON::SetValue(PBVAL vlp, PVAL valp) break; default: - sprintf(G->Message, "Unsupported typ %d\n", valp->GetType()); + snprintf(G->Message, sizeof(G->Message), "Unsupported typ %d\n", valp->GetType()); throw(777); } // endswitch Type diff --git a/storage/connect/bsonudf.cpp b/storage/connect/bsonudf.cpp index f92bdb46727..2dad053a69c 100644 --- a/storage/connect/bsonudf.cpp +++ b/storage/connect/bsonudf.cpp @@ -69,7 +69,7 @@ static PBSON BbinAlloc(PGLOBAL g, ulong len, PBVAL jsp) PBSON bsp = (PBSON)PlgDBSubAlloc(g, NULL, sizeof(BSON)); if (bsp) { - strcpy(bsp->Msg, "Binary Json"); + snprintf(bsp->Msg, sizeof(bsp->Msg), "Binary Json"); bsp->Msg[BMX] = 0; bsp->Filename = NULL; bsp->G = g; @@ -272,7 +272,7 @@ my_bool BJNX::SetArrayOptions(PGLOBAL g, char* p, int i, PSZ nm) } // endif n } else { - strcpy(g->Message, "Wrong array specification"); + snprintf(g->Message, sizeof(g->Message), "Wrong array specification"); return true; } // endif's @@ -568,7 +568,7 @@ PBVAL BJNX::GetRowValue(PGLOBAL g, PBVAL row, int i) vlp = row; // DupVal(g, row) ??? } else { - strcpy(g->Message, "Unexpected object"); + snprintf(g->Message, sizeof(g->Message), "Unexpected object"); vlp = NULL; } //endif Op @@ -613,7 +613,7 @@ PBVAL BJNX::GetRowValue(PGLOBAL g, PBVAL row, int i) /*********************************************************************************/ PVAL BJNX::ExpandArray(PGLOBAL g, PBVAL arp, int n) { - strcpy(g->Message, "Expand cannot be done by this function"); + snprintf(g->Message, sizeof(g->Message), "Expand cannot be done by this function"); return NULL; } // end of ExpandArray @@ -794,7 +794,7 @@ PVAL BJNX::CalculateArray(PGLOBAL g, PBVAL bap, int n) xtrc(1, "Exception %d: %s\n", n, g->Message); PUSH_WARNING(g->Message); } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); } // end catch return vp; @@ -863,7 +863,7 @@ PBVAL BJNX::GetRow(PGLOBAL g) } else if (row->Type == TYPE_JAR) { AddArrayValue(row, MOF(nwr)); } else { - strcpy(g->Message, "Wrong type when writing new row"); + snprintf(g->Message, sizeof(g->Message), "Wrong type when writing new row"); nwr = NULL; } // endif's @@ -896,7 +896,7 @@ my_bool BJNX::WriteValue(PGLOBAL g, PBVAL jvalp) case TYPE_JAR: arp = row; break; case TYPE_JVAL: jvp = MVP(row->To_Val); break; default: - strcpy(g->Message, "Invalid target type"); + snprintf(g->Message, sizeof(g->Message), "Invalid target type"); return true; } // endswitch Type @@ -1070,7 +1070,7 @@ my_bool BJNX::CheckPath(PGLOBAL g, UDF_ARGS *args, PBVAL jsp, PBVAL& jvp, int n) return false; } else { - strcpy(g->Message, "Path argument is null"); + snprintf(g->Message, sizeof(g->Message), "Path argument is null"); return true; } // endif path @@ -1091,7 +1091,7 @@ PSZ BJNX::Locate(PGLOBAL g, PBVAL jsp, PBVAL jvp, int k) g->Message[0] = 0; if (!jsp) { - strcpy(g->Message, "Null json tree"); + snprintf(g->Message, sizeof(g->Message), "Null json tree"); return NULL; } // endif jsp @@ -1118,7 +1118,7 @@ PSZ BJNX::Locate(PGLOBAL g, PBVAL jsp, PBVAL jvp, int k) if (err) { if (!g->Message[0]) - strcpy(g->Message, "Invalid json tree"); + snprintf(g->Message, sizeof(g->Message), "Invalid json tree"); } else if (Found) { Jp->WriteChr('\0'); @@ -1130,7 +1130,7 @@ PSZ BJNX::Locate(PGLOBAL g, PBVAL jsp, PBVAL jvp, int k) xtrc(1, "Exception %d: %s\n", n, g->Message); PUSH_WARNING(g->Message); } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); } // end catch return str; @@ -1211,7 +1211,7 @@ PSZ BJNX::LocateAll(PGLOBAL g, PBVAL jsp, PBVAL bvp, int mx) PJPN jnp; if (!jsp) { - strcpy(g->Message, "Null json tree"); + snprintf(g->Message, sizeof(g->Message), "Null json tree"); return NULL; } // endif jsp @@ -1250,13 +1250,13 @@ PSZ BJNX::LocateAll(PGLOBAL g, PBVAL jsp, PBVAL bvp, int mx) PlugSubAlloc(g, NULL, Jp->N); str = Jp->Strp; } else if (!g->Message[0]) - strcpy(g->Message, "Invalid json tree"); + snprintf(g->Message, sizeof(g->Message), "Invalid json tree"); } catch (int n) { xtrc(1, "Exception %d: %s\n", n, g->Message); PUSH_WARNING(g->Message); } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); } // end catch return str; @@ -1747,7 +1747,7 @@ PBSON BJNX::MakeBinResult(UDF_ARGS *args, PBVAL top, ulong len, int n) if ((bnp = BbinAlloc(G, len, top))) { bnp->Filename = filename; bnp->Pretty = pretty; - strcpy(bnp->Msg, "Json Binary item"); + snprintf(bnp->Msg, sizeof(bnp->Msg), "Json Binary item"); } //endif bnp return bnp; @@ -3103,7 +3103,7 @@ char* bson_test(UDF_INIT* initid, UDF_ARGS* args, char* result, *error = 1; str = NULL; } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); *error = 1; str = NULL; @@ -3224,7 +3224,7 @@ char* bsonlocate(UDF_INIT* initid, UDF_ARGS* args, char* result, *error = 1; path = NULL; } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); *error = 1; path = NULL; @@ -3342,7 +3342,7 @@ char* bson_locate_all(UDF_INIT* initid, UDF_ARGS* args, char* result, *error = 1; path = NULL; } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); *error = 1; path = NULL; @@ -3709,7 +3709,7 @@ char *bson_get_item(UDF_INIT *initid, UDF_ARGS *args, char *result, jvp = bnx.GetRowValue(g, jvp, 0); if (!bnx.IsJson(jvp)) { - strcpy(g->Message, "Not a Json item"); + snprintf(g->Message, sizeof(g->Message), "Not a Json item"); } else str = bnx.Serialize(g, jvp, NULL, 0); @@ -3841,7 +3841,7 @@ char *bsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, PUSH_WARNING(g->Message); str = NULL; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); str = NULL; } // end catch @@ -4300,7 +4300,7 @@ static char *bson_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, PUSH_WARNING(g->Message); str = NULL; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); str = NULL; } // end catch @@ -4742,8 +4742,8 @@ char *bfile_bjson(UDF_INIT *initid, UDF_ARGS *args, char *result, PGLOBAL g = (PGLOBAL)initid->ptr; BDOC doc(g); - strcpy(fn, MakePSZ(g, args, 0)); - strcpy(ofn, MakePSZ(g, args, 1)); + snprintf(fn, sizeof(fn), "%s", MakePSZ(g, args, 0)); + snprintf(ofn, sizeof(ofn), "%s", MakePSZ(g, args, 1)); if (args->arg_count == 3) lrecl = (size_t)*(longlong*)args->args[2]; @@ -5869,7 +5869,7 @@ static char *bbin_handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, PUSH_WARNING(g->Message); } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); } // end catch @@ -6201,7 +6201,7 @@ char* bbin_locate_all(UDF_INIT* initid, UDF_ARGS* args, char* result, *error = 1; path = NULL; } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); *error = 1; path = NULL; diff --git a/storage/connect/cmgoconn.cpp b/storage/connect/cmgoconn.cpp index 3ecdb02a813..e61806d42eb 100644 --- a/storage/connect/cmgoconn.cpp +++ b/storage/connect/cmgoconn.cpp @@ -156,7 +156,7 @@ bool CMgoConn::Connect(PGLOBAL g) { if (!Pcg->Db_name || !Pcg->Coll_name) { // This would crash in mongoc_client_get_collection - strcpy(g->Message, "Missing DB or collection name"); + snprintf(g->Message, sizeof(g->Message), "Missing DB or collection name"); return true; } // endif name @@ -165,7 +165,7 @@ bool CMgoConn::Connect(PGLOBAL g) __try { mongo_init(true); } __except (EXCEPTION_EXECUTE_HANDLER) { - strcpy(g->Message, "Cannot load MongoDB C driver"); + snprintf(g->Message, sizeof(g->Message), "Cannot load MongoDB C driver"); return true; } // end try/except #else // !_WIN32 @@ -379,7 +379,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) p = strrchr(options, ']'); if (!p) { - strcpy(g->Message, "Missing ] in pipeline"); + snprintf(g->Message, sizeof(g->Message), "Missing ] in pipeline"); return true; } else *(char*)p = 0; @@ -390,7 +390,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) s->Append(",{\"$match\":"); if (MakeSelector(g, filp, s)) { - strcpy(g->Message, "Failed making selector"); + snprintf(g->Message, sizeof(g->Message), "Failed making selector"); return true; } else s->Append('}'); @@ -454,7 +454,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g) s->Append(','); if (MakeSelector(g, filp, s)) { - strcpy(g->Message, "Failed making selector"); + snprintf(g->Message, sizeof(g->Message), "Failed making selector"); return true; } // endif Selector @@ -771,7 +771,7 @@ int CMgoConn::Write(PGLOBAL g) } // endif remove } else { - strcpy(g->Message, "Mongo update: cannot find _id"); + snprintf(g->Message, sizeof(g->Message), "Mongo update: cannot find _id"); rc = RC_FX; } // endif b @@ -1066,7 +1066,7 @@ bool CMgoConn::AddValue(PGLOBAL g, PCOL colp, bson_t *doc, char *key, bool upd) } // endswitch Buf_Type if (!rc) { - strcpy(g->Message, "Adding value failed"); + snprintf(g->Message, sizeof(g->Message), "Adding value failed"); return true; } else return false; diff --git a/storage/connect/filamdbf.cpp b/storage/connect/filamdbf.cpp index 7cd46fd1181..5c4f17acc27 100644 --- a/storage/connect/filamdbf.cpp +++ b/storage/connect/filamdbf.cpp @@ -336,9 +336,9 @@ PQRYRES DBFColumns(PGLOBAL g, PCSZ dp, PCSZ fn, PTOS topt, bool info) hp->Headlen(), hp->Reclen(), fields); htrc("flags(iem)=%d,%d,%d cp=%d\n", hp->Incompleteflag, hp->Encryptflag, hp->Mdxflag, hp->Language); - htrc("%hd records, last changed %02d/%02d/%d\n", - hp->Records(), hp->Filedate[1], hp->Filedate[2], - hp->Filedate[0] + ((hp->Filedate[0] <= 30) ? 2000 : 1900)); + htrc("%hd records, last changed %04d-%02d-%02d\n", + hp->Records(), + hp->Filedate[0] + 1900, hp->Filedate[1], hp->Filedate[2]); htrc("Field Type Offset Len Dec Set Mdx\n"); } // endif trace @@ -606,8 +606,7 @@ bool DBFFAM::OpenTableFile(PGLOBAL g) strcpy(opmode, (UseTemp) ? "rb" : "r+b"); break; case MODE_INSERT: - // Must be in text mode to remove an eventual EOF character - strcpy(opmode, "a+"); + strcpy(opmode, Records ? "r+b" : "w+b"); break; default: snprintf(g->Message, sizeof(g->Message), MSG(BAD_OPEN_MODE), mode); @@ -620,7 +619,7 @@ bool DBFFAM::OpenTableFile(PGLOBAL g) if (!(Stream = PlugOpenFile(g, filename, opmode))) { if (trace(1)) htrc("%s\n", g->Message); - + return (mode == MODE_READ && errno == ENOENT) ? PushWarning(g, Tdbp) : true; } // endif Stream @@ -644,6 +643,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) { char c; int rc; + int len; MODE mode = Tdbp->GetMode(); Buflen = Blksize; @@ -665,7 +665,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) /************************************************************************/ /* If this is a new file, the header must be generated. */ /************************************************************************/ - int len = GetFileLength(g); + len = GetFileLength(g); if (!len) { // Make the header for this DBF table file @@ -703,7 +703,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) header->Version = DBFTYPE; t = time(NULL) - (time_t)DTVAL::GetShift(); datm = gmtime(&t); - header->Filedate[0] = datm->tm_year - 100; + header->Filedate[0] = datm->tm_year; header->Filedate[1] = datm->tm_mon + 1; header->Filedate[2] = datm->tm_mday; header->SetHeadlen((ushort)hlen); @@ -794,8 +794,12 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g) /**************************************************************************/ /* Position the file at the begining of the data. */ /**************************************************************************/ - if (Tdbp->GetMode() == MODE_INSERT) - rc = fseek(Stream, 0, SEEK_END); + if (Tdbp->GetMode() == MODE_INSERT) { + if (len) + rc = fseek(Stream, -1, SEEK_END); + else + rc = fseek(Stream, 0, SEEK_END); + } else rc = fseek(Stream, Headlen, SEEK_SET); @@ -980,6 +984,7 @@ void DBFFAM::CloseTableFile(PGLOBAL g, bool abort) Rbuf = CurNum--; // Closing = true; wrc = WriteBuffer(g); + fputc(0x1a, Stream); } else if (mode == MODE_UPDATE || mode == MODE_DELETE) { if (Modif && !Closing) { // Last updated block remains to be written @@ -1004,35 +1009,27 @@ void DBFFAM::CloseTableFile(PGLOBAL g, bool abort) } // endif's mode if (Tdbp->GetMode() == MODE_INSERT) { - int n = ftell(Stream) - Headlen; - - rc = PlugCloseFile(g, To_Fb); + int n = ftell(Stream) - Headlen - 1; if (n >= 0 && !(n % Lrecl)) { n /= Lrecl; // New number of lines if (n > Records) { // Update the number of rows in the file header - char filename[_MAX_PATH]; + char nRecords[4]; + int4store(nRecords, n); - PlugSetPath(filename, To_File, Tdbp->GetPath()); - if ((Stream= global_fopen(g, MSGID_OPEN_MODE_STRERROR, filename, "r+b"))) - { - char nRecords[4]; - int4store(nRecords, n); - - fseek(Stream, 4, SEEK_SET); // Get header.Records position - fwrite(nRecords, sizeof(nRecords), 1, Stream); - fclose(Stream); - Stream= NULL; - Records= n; // Update Records value - } + fseek(Stream, 4, SEEK_SET); // Get header.Records position + fwrite(nRecords, sizeof(nRecords), 1, Stream); + Stream= NULL; + Records= n; // Update Records value } // endif n } // endif n - } else // Finally close the file - rc = PlugCloseFile(g, To_Fb); + } + // Finally close the file + rc = PlugCloseFile(g, To_Fb); fin: if (trace(1)) diff --git a/storage/connect/filamgz.cpp b/storage/connect/filamgz.cpp index 0eaf3571a80..5b965f63926 100644 --- a/storage/connect/filamgz.cpp +++ b/storage/connect/filamgz.cpp @@ -88,7 +88,7 @@ int GZFAM::Zerror(PGLOBAL g) { int errnum; - strcpy(g->Message, gzerror(Zfile, &errnum)); + snprintf(g->Message, sizeof(g->Message), "%s", gzerror(Zfile, &errnum)); if (errnum == Z_ERRNO) #if defined(_WIN32) @@ -142,7 +142,7 @@ bool GZFAM::OpenTableFile(PGLOBAL g) /*****************************************************************/ /* Updating GZ files not implemented yet. */ /*****************************************************************/ - strcpy(g->Message, MSG(UPD_ZIP_NOT_IMP)); + snprintf(g->Message, sizeof(g->Message), MSG(UPD_ZIP_NOT_IMP)); return true; case MODE_DELETE: if (!Tdbp->GetNext()) { @@ -379,7 +379,7 @@ int GZFAM::WriteBuffer(PGLOBAL g) /***********************************************************************/ int GZFAM::DeleteRecords(PGLOBAL g, int) { - strcpy(g->Message, MSG(NO_ZIP_DELETE)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_ZIP_DELETE)); return RC_FX; } // end of DeleteRecords @@ -926,7 +926,7 @@ bool ZLBFAM::AllocateBuffer(PGLOBAL g) #if 0 if (!Optimized && Tdbp->NeedIndexing(g)) { - strcpy(g->Message, MSG(NOP_ZLIB_INDEX)); + snprintf(g->Message, sizeof(g->Message), MSG(NOP_ZLIB_INDEX)); return TRUE; } // endif indexing #endif // 0 @@ -993,7 +993,7 @@ bool ZLBFAM::AllocateBuffer(PGLOBAL g) CurBlk = Block - 1; CurNum = Last; - strcpy(g->Message, MSG(NO_PAR_BLK_INS)); + snprintf(g->Message, sizeof(g->Message), "%s",MSG(NO_PAR_BLK_INS)); return TRUE; } // endif Last @@ -1068,7 +1068,7 @@ bool ZLBFAM::SetPos(PGLOBAL g, int pos __attribute__((unused))) return true; #if 0 // All this must be checked if (pos < 0) { - strcpy(g->Message, MSG(INV_REC_POS)); + snprintf(g->Message, sizeof(g->Message), MSG(INV_REC_POS)); return true; } // endif recpos @@ -1156,7 +1156,7 @@ int ZLBFAM::ReadBuffer(PGLOBAL g) rdbuf = Zlenp; } else { // !Optimized if (CurBlk != OldBlk + 1) { - strcpy(g->Message, MSG(INV_RAND_ACC)); + snprintf(g->Message, sizeof(g->Message), MSG(INV_RAND_ACC)); return RC_FX; } else Fpos = ftell(Stream); // Used when optimizing @@ -1276,7 +1276,7 @@ int ZLBFAM::WriteBuffer(PGLOBAL g) #if defined(_DEBUG) if (Tdbp->GetFtype() == RECFM_FIX && (signed)strlen(CurLine) != Lrecl + (signed)strlen(CrLf)) { - strcpy(g->Message, MSG(BAD_LINE_LEN)); + snprintf(g->Message, sizeof(g->Message), MSG(BAD_LINE_LEN)); Closing = TRUE; return RC_FX; } // endif Lrecl diff --git a/storage/connect/filamtxt.cpp b/storage/connect/filamtxt.cpp index f8168887e89..d449fc1d1c5 100644 --- a/storage/connect/filamtxt.cpp +++ b/storage/connect/filamtxt.cpp @@ -367,13 +367,13 @@ int TXTFAM::UpdateSortedRows(PGLOBAL g) // return RC_INFO; return RC_OK; // Nothing to do } else if (!(Sosar = MakeValueArray(g, To_Sos))) { - strcpy(g->Message, "Start position array is null"); + snprintf(g->Message, sizeof(g->Message), "Start position array is null"); goto err; } else if (!(Updar = MakeValueArray(g, To_Upd))) { - strcpy(g->Message, "Updated line array is null"); + snprintf(g->Message, sizeof(g->Message), "Updated line array is null"); goto err; } else if (!(ix = (int*)Posar->GetSortIndex(g))) { - strcpy(g->Message, "Error getting array sort index"); + snprintf(g->Message, sizeof(g->Message), "Error getting array sort index"); goto err; } // endif's @@ -419,10 +419,10 @@ int TXTFAM::DeleteSortedRows(PGLOBAL g) // return RC_INFO; return RC_OK; // Nothing to do } else if (!(Sosar = MakeValueArray(g, To_Sos))) { - strcpy(g->Message, "Start position array is null"); + snprintf(g->Message, sizeof(g->Message), "Start position array is null"); goto err; } else if (!(ix = (int*)Posar->GetSortIndex(g))) { - strcpy(g->Message, "Error getting array sort index"); + snprintf(g->Message, sizeof(g->Message), "Error getting array sort index"); goto err; } // endif's @@ -454,7 +454,7 @@ err: /***********************************************************************/ int TXTFAM::InitDelete(PGLOBAL g, int, int) { - strcpy(g->Message, "InitDelete should not be used by this table type"); + snprintf(g->Message, sizeof(g->Message), "InitDelete should not be used by this table type"); return RC_FX; } // end of InitDelete @@ -556,7 +556,7 @@ bool DOSFAM::OpenTableFile(PGLOBAL g) switch (mode) { case MODE_READ: - strcpy(opmode, "r"); + snprintf(opmode, sizeof(opmode), "r"); break; case MODE_DELETE: if (!Tdbp->Next) { @@ -570,7 +570,7 @@ bool DOSFAM::OpenTableFile(PGLOBAL g) } // endif blocked // This will erase the entire file - strcpy(opmode, "w"); + snprintf(opmode, sizeof(opmode), "w"); Tdbp->ResetSize(); break; } // endif @@ -580,14 +580,14 @@ bool DOSFAM::OpenTableFile(PGLOBAL g) /* fall through */ case MODE_UPDATE: if ((UseTemp = Tdbp->IsUsingTemp(g))) { - strcpy(opmode, "r"); + snprintf(opmode, sizeof(opmode), "r"); Bin = true; } else - strcpy(opmode, "r+"); + snprintf(opmode, sizeof(opmode), "r+"); break; case MODE_INSERT: - strcpy(opmode, "a+"); + snprintf(opmode, sizeof(opmode), "a+"); break; default: snprintf(g->Message, sizeof(g->Message), MSG(BAD_OPEN_MODE), mode); @@ -1364,7 +1364,7 @@ int BLKFAM::GetNextPos(void) /***********************************************************************/ bool BLKFAM::SetPos(PGLOBAL g, int) { - strcpy(g->Message, "Blocked variable tables cannot be used indexed"); + snprintf(g->Message, sizeof(g->Message), "Blocked variable tables cannot be used indexed"); return true; } // end of SetPos @@ -1708,10 +1708,10 @@ bool BINFAM::OpenTableFile(PGLOBAL g) { switch (mode) { case MODE_READ: - strcpy(opmode, "rb"); + snprintf(opmode, sizeof(opmode), "rb"); break; case MODE_WRITE: - strcpy(opmode, "wb"); + snprintf(opmode, sizeof(opmode), "wb"); break; default: snprintf(g->Message, sizeof(g->Message), MSG(BAD_OPEN_MODE), mode); @@ -1859,7 +1859,7 @@ int BINFAM::ReadBuffer(PGLOBAL g) // Read the prefix giving the row length if (!fread(&Recsize, sizeof(size_t), 1, Stream)) { if (!feof(Stream)) { - strcpy(g->Message, "Error reading line prefix\n"); + snprintf(g->Message, sizeof(g->Message), "Error reading line prefix\n"); return RC_FX; } else return RC_EF; diff --git a/storage/connect/filamvct.cpp b/storage/connect/filamvct.cpp index 184df646cb7..f2f70e591dd 100644 --- a/storage/connect/filamvct.cpp +++ b/storage/connect/filamvct.cpp @@ -429,7 +429,7 @@ bool VCTFAM::OpenTableFile(PGLOBAL g) /*********************************************************************/ switch (mode) { case MODE_READ: - strcpy(opmode, "rb"); + snprintf(opmode, sizeof(opmode), "rb"); break; case MODE_DELETE: if (!Tdbp->GetNext()) { @@ -437,7 +437,7 @@ bool VCTFAM::OpenTableFile(PGLOBAL g) DelRows = Cardinality(g); // This will delete the whole file - strcpy(opmode, "wb"); + snprintf(opmode, sizeof(opmode), "wb"); break; } // endif @@ -445,7 +445,7 @@ bool VCTFAM::OpenTableFile(PGLOBAL g) /* fall through */ case MODE_UPDATE: UseTemp = Tdbp->IsUsingTemp(g); - strcpy(opmode, (UseTemp) ? "rb" : "r+b"); + snprintf(opmode, sizeof(opmode), (UseTemp) ? "rb" : "r+b"); break; case MODE_INSERT: if (MaxBlk) { @@ -453,11 +453,11 @@ bool VCTFAM::OpenTableFile(PGLOBAL g) if (MakeEmptyFile(g, To_File)) return true; - strcpy(opmode, "r+b"); // Required to update empty blocks + snprintf(opmode, sizeof(opmode), "r+b"); // Required to update empty blocks } else if (!Block || Last == Nrec) - strcpy(opmode, "ab"); + snprintf(opmode, sizeof(opmode), "ab"); else - strcpy(opmode, "r+b"); // Required to update the last block + snprintf(opmode, sizeof(opmode), "r+b"); // Required to update the last block break; default: @@ -1911,7 +1911,7 @@ bool VECFAM::OpenTableFile(PGLOBAL g) /*********************************************************************/ switch (mode) { case MODE_READ: - strcpy(opmode, "rb"); + snprintf(opmode, sizeof(opmode), "rb"); break; case MODE_DELETE: if (!Tdbp->GetNext()) { @@ -1919,7 +1919,7 @@ bool VECFAM::OpenTableFile(PGLOBAL g) DelRows = Cardinality(g); // This will delete the whole file - strcpy(opmode, "wb"); + snprintf(opmode, sizeof(opmode), "wb"); // This will stop the process by causing GetProgMax to return 0. ResetTableSize(g, 0, Nrec); @@ -1930,10 +1930,10 @@ bool VECFAM::OpenTableFile(PGLOBAL g) /* fall through */ case MODE_UPDATE: UseTemp = Tdbp->IsUsingTemp(g); - strcpy(opmode, (UseTemp) ? "rb": "r+b"); + snprintf(opmode, sizeof(opmode), (UseTemp) ? "rb": "r+b"); break; case MODE_INSERT: - strcpy(opmode, "ab"); + snprintf(opmode, sizeof(opmode), "ab"); break; default: snprintf(g->Message, sizeof(g->Message), MSG(BAD_OPEN_MODE), mode); diff --git a/storage/connect/filamzip.cpp b/storage/connect/filamzip.cpp index 5a1e40cccb2..a7d8e162a54 100644 --- a/storage/connect/filamzip.cpp +++ b/storage/connect/filamzip.cpp @@ -152,7 +152,7 @@ static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, PCSZ pat, char *buf) /*********************************************************************/ /* pat is a multiple file name with wildcard characters */ /*********************************************************************/ - strcpy(filename, pat); + snprintf(filename, sizeof(filename), "%s", pat); #if defined(_WIN32) int rc; @@ -174,7 +174,7 @@ static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, PCSZ pat, char *buf) snprintf(g->Message, sizeof(g->Message), MSG(BAD_FILE_HANDLE), filename); return true; } else { - strcpy(g->Message, "Cannot find any file to load"); + snprintf(g->Message, sizeof(g->Message), "Cannot find any file to load"); return true; } // endif rc @@ -208,7 +208,7 @@ static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, PCSZ pat, char *buf) // Close the search handle. if (!FindClose(hSearch)) { - strcpy(g->Message, MSG(SRCH_CLOSE_ERR)); + snprintf(g->Message, sizeof(g->Message), MSG(SRCH_CLOSE_ERR)); return true; } // endif FindClose @@ -402,7 +402,7 @@ bool ZIPUTIL::OpenTable(PGLOBAL g, MODE mode, PCSZ fn, bool append) return true; } else { - strcpy(g->Message, "Only INSERT mode supported for ZIPPING files"); + snprintf(g->Message, sizeof(g->Message), "Only INSERT mode supported for ZIPPING files"); return true; } // endif mode @@ -610,7 +610,7 @@ int UNZIPUTL::findEntry(PGLOBAL g, bool next) next = true; } while (true); - strcpy(g->Message, "FindNext logical error"); + snprintf(g->Message, sizeof(g->Message), "FindNext logical error"); return RC_FX; } // end of FindEntry @@ -703,7 +703,7 @@ bool UNZIPUTL::OpenTable(PGLOBAL g, MODE mode, PCSZ fn) return true; } else { - strcpy(g->Message, "Only READ mode supported for ZIPPED tables"); + snprintf(g->Message, sizeof(g->Message), "Only READ mode supported for ZIPPED tables"); return true; } // endif mode @@ -755,7 +755,7 @@ bool UNZIPUTL::openEntry(PGLOBAL g) try { memory = new char[size + 1]; } catch (...) { - strcpy(g->Message, "Out of memory"); + snprintf(g->Message, sizeof(g->Message), "Out of memory"); return true; } // end try/catch @@ -1130,16 +1130,16 @@ int UZDFAM::dbfhead(PGLOBAL g, void* buf) // Check first byte to be sure of .dbf type if ((hdrp->Version & 0x03) != DBFTYPE) { - strcpy(g->Message, MSG(NOT_A_DBF_FILE)); + snprintf(g->Message, sizeof(g->Message), MSG(NOT_A_DBF_FILE)); rc = RC_INFO; if ((hdrp->Version & 0x30) == 0x30) { - strcpy(g->Message, MSG(FOXPRO_FILE)); + snprintf(g->Message, sizeof(g->Message), MSG(FOXPRO_FILE)); dbc = 264; // FoxPro database container } // endif Version } else - strcpy(g->Message, MSG(DBASE_FILE)); + snprintf(g->Message, sizeof(g->Message), MSG(DBASE_FILE)); // Check last byte(s) of header endmark = (char*)hdrp + hdrp->Headlen() - dbc; @@ -1303,13 +1303,13 @@ bool ZIPFAM::OpenTableFile(PGLOBAL g) if (len < 0) return true; else if (!append && len > 0) { - strcpy(g->Message, "No insert into existing zip file"); + snprintf(g->Message, sizeof(g->Message), "No insert into existing zip file"); return true; } else if (append && len > 0) { UNZIPUTL *zutp = new(g) UNZIPUTL(target, NULL, false); if (!zutp->IsInsertOk(g, filename)) { - strcpy(g->Message, "No insert into existing entry"); + snprintf(g->Message, sizeof(g->Message), "No insert into existing entry"); return true; } // endif Ok @@ -1336,7 +1336,7 @@ bool ZIPFAM::OpenTableFile(PGLOBAL g) /***********************************************************************/ int ZIPFAM::ReadBuffer(PGLOBAL g) { - strcpy(g->Message, "ReadBuffer should not been called when zipping"); + snprintf(g->Message, sizeof(g->Message), "ReadBuffer should not been called when zipping"); return RC_FX; } // end of ReadBuffer @@ -1387,13 +1387,13 @@ bool ZPXFAM::OpenTableFile(PGLOBAL g) if (len < 0) return true; else if (!append && len > 0) { - strcpy(g->Message, "No insert into existing zip file"); + snprintf(g->Message, sizeof(g->Message), "No insert into existing zip file"); return true; } else if (append && len > 0) { UNZIPUTL *zutp = new(g) UNZIPUTL(target, NULL, false); if (!zutp->IsInsertOk(g, filename)) { - strcpy(g->Message, "No insert into existing entry"); + snprintf(g->Message, sizeof(g->Message), "No insert into existing entry"); return true; } // endif Ok diff --git a/storage/connect/filter.cpp b/storage/connect/filter.cpp index da418d38e31..cddb8b8c526 100644 --- a/storage/connect/filter.cpp +++ b/storage/connect/filter.cpp @@ -386,7 +386,7 @@ int FILTER::CheckColumn(PGLOBAL g, PSQL sqlp, PXOB &p, int &ag) } // endfor i if (*errmsg) { - strcpy(g->Message, errmsg); + snprintf(g->Message, sizeof(g->Message), errmsg); return -1; } else return n; @@ -993,7 +993,7 @@ bool FILTER::Convert(PGLOBAL g, bool having) break; case TYPE_ARRAY: if ((Opc != OP_IN && !Opm) || i == 0) { - strcpy(g->Message, MSG(BAD_ARRAY_OPER)); + snprintf(g->Message, sizeof(g->Message), MSG(BAD_ARRAY_OPER)); return TRUE; } // endif @@ -1007,7 +1007,7 @@ bool FILTER::Convert(PGLOBAL g, bool having) goto TEST; // Filter has only one argument } // endif i - strcpy(g->Message, MSG(VOID_FIRST_ARG)); + snprintf(g->Message, sizeof(g->Message), MSG(VOID_FIRST_ARG)); return TRUE; } // endswitch @@ -1052,7 +1052,7 @@ bool FILTER::Convert(PGLOBAL g, bool having) } // endif Opc if (comtype == TYPE_ERROR) { - strcpy(g->Message, MSG(ILL_FILTER_CONV)); + snprintf(g->Message, sizeof(g->Message), MSG(ILL_FILTER_CONV)); return TRUE; } // endif @@ -1101,7 +1101,7 @@ bool FILTER::Convert(PGLOBAL g, bool having) break; case TYPE_FILTER: - strcpy(g->Message, MSG(UNMATCH_FIL_ARG)); + snprintf(g->Message, sizeof(g->Message), MSG(UNMATCH_FIL_ARG)); return TRUE; default: // Conversion from Column, Select/Func, Expr, Scalfnc... @@ -1271,7 +1271,7 @@ bool FILTER::Eval(PGLOBAL g) ap = (PARRAY)Arg(1); break; default: - strcpy(g->Message, MSG(IN_WITHOUT_SUB)); + snprintf(g->Message, sizeof(g->Message), MSG(IN_WITHOUT_SUB)); goto FilterError; } // endswitch Type diff --git a/storage/connect/fmdlex.c b/storage/connect/fmdlex.c index 1bca2d4ec18..165913a9698 100644 --- a/storage/connect/fmdlex.c +++ b/storage/connect/fmdlex.c @@ -1480,7 +1480,7 @@ void MakeAMPM(int n) n, pp->Num, pp->InFmt, pp->OutFmt); #endif pp->Index[pp->Num++] = -n; - sprintf(buf, "%%%ds", m); + snprintf(buf, sizeof(buf), "%%%ds", m); MakeIn(buf); if (pp->OutFmt) { diff --git a/storage/connect/ha_connect.cc b/storage/connect/ha_connect.cc index 3327ba63598..54ecde32352 100644 --- a/storage/connect/ha_connect.cc +++ b/storage/connect/ha_connect.cc @@ -1870,7 +1870,7 @@ bool ha_connect::CheckVirtualIndex(TABLE_SHARE *s) rid= (fp->option_struct) ? fp->option_struct->special : NULL; if (!rid || (stricmp(rid, "ROWID") && stricmp(rid, "ROWNUM"))) { - strcpy(g->Message, "Invalid virtual index"); + snprintf(g->Message, sizeof(g->Message), "Invalid virtual index"); return true; } // endif rowid @@ -2016,7 +2016,7 @@ int ha_connect::OpenTable(PGLOBAL g, bool del) case MODE_INSERT: case MODE_UPDATE: case MODE_DELETE: - strcpy(g->Message, MSG(READ_ONLY)); + snprintf(g->Message, sizeof(g->Message), MSG(READ_ONLY)); return HA_ERR_TABLE_READONLY; default: break; @@ -2145,7 +2145,7 @@ bool ha_connect::CheckColumnList(PGLOBAL g) htrc("Exception %d: %s\n", n, g->Message); brc= true; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); brc= true; } // end catch @@ -2514,7 +2514,7 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, ranges[1]= (end_range && !eq_range) ? &save_end_range : NULL; if (!ranges[0] && !ranges[1]) { - strcpy(g->Message, "MakeKeyWhere: No key"); + snprintf(g->Message, sizeof(g->Message), "MakeKeyWhere: No key"); return true; } else both= ranges[0] && ranges[1]; @@ -2611,7 +2611,7 @@ bool ha_connect::MakeKeyWhere(PGLOBAL g, PSTRG qry, OPVAL vop, char q, qry->Append(')'); if ((oom= qry->IsTruncated())) - strcpy(g->Message, "Out of memory"); + snprintf(g->Message, sizeof(g->Message), "Out of memory"); dbug_tmp_restore_column_map(&table->write_set, old_map); return oom; @@ -3385,7 +3385,7 @@ const COND *ha_connect::cond_push(const COND *cond) if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); } // end catch fin:; @@ -3611,7 +3611,7 @@ int ha_connect::optimize(THD* thd, HA_CHECK_OPT*) htrc("Exception %d: %s\n", n, g->Message); rc= HA_ERR_INTERNAL_ERROR; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); rc= HA_ERR_INTERNAL_ERROR; } // end catch @@ -4711,7 +4711,7 @@ MODE ha_connect::CheckMode(PGLOBAL g, THD *thd, break; default: htrc("Unsupported sql_command=%d\n", thd_sql_command(thd)); - strcpy(g->Message, "CONNECT Unsupported command"); + snprintf(g->Message, sizeof(g->Message), "CONNECT Unsupported command"); my_message(ER_NOT_ALLOWED_COMMAND, g->Message, MYF(0)); newmode= MODE_ERROR; break; @@ -4769,7 +4769,7 @@ MODE ha_connect::CheckMode(PGLOBAL g, THD *thd, break; default: htrc("Unsupported sql_command=%d\n", thd_sql_command(thd)); - strcpy(g->Message, "CONNECT Unsupported command"); + snprintf(g->Message, sizeof(g->Message), "CONNECT Unsupported command"); my_message(ER_NOT_ALLOWED_COMMAND, g->Message, MYF(0)); newmode= MODE_ERROR; break; @@ -5024,7 +5024,7 @@ int ha_connect::external_lock(THD *thd, int lock_type) xmod= MODE_ANY; // For info commands DBUG_RETURN(rc); } else if (check_privileges(thd, options, table->s->db.str)) { - strcpy(g->Message, "This operation requires the FILE privilege"); + snprintf(g->Message, sizeof(g->Message), "This operation requires the FILE privilege"); htrc("%s\n", g->Message); DBUG_RETURN(HA_ERR_INTERNAL_ERROR); } // endif check_privileges @@ -5390,7 +5390,7 @@ bool CheckSelf(PGLOBAL g, TABLE_SHARE *s, PCSZ host, else if (port && port != (signed)GetDefaultPort()) return false; - strcpy(g->Message, "This MySQL table is defined on itself"); + snprintf(g->Message, sizeof(g->Message), "This MySQL table is defined on itself"); return true; } // end of CheckSelf @@ -5736,7 +5736,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, } else if (topt->http) { if (ttp == TAB_UNDEF) { ttr= TAB_JSON; - strcpy(g->Message, "No table_type. Was set to JSON"); + snprintf(g->Message, sizeof(g->Message), "No table_type. Was set to JSON"); push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, ER_UNKNOWN_ERROR, g->Message); } else ttr= ttp; @@ -5769,7 +5769,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, case TAB_BSON: #endif // BSON_SUPPORT if (checkPrivileges(thd, ttp, topt, db)) { - strcpy(g->Message, "This operation requires the FILE privilege"); + snprintf(g->Message, sizeof(g->Message), "This operation requires the FILE privilege"); rc= HA_ERR_INTERNAL_ERROR; goto err; } // endif check_privileges @@ -5785,7 +5785,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, char *p; if (!tbl) { - strcpy(g->Message, "Missing table list"); + snprintf(g->Message, sizeof(g->Message), "Missing table list"); rc= HA_ERR_INTERNAL_ERROR; goto err; } // endif tbl @@ -5843,7 +5843,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, if (fnc & FNC_DRIVER) { ok= true; } else if (!(url= strz(g, create_info->connect_string))) { - strcpy(g->Message, "Missing URL"); + snprintf(g->Message, sizeof(g->Message), "Missing URL"); } else { // Store JDBC additional parameters int rc; @@ -5947,7 +5947,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, if (topt->module && topt->subtype) ok= true; else - strcpy(g->Message, "Missing OEM module or subtype"); + snprintf(g->Message, sizeof(g->Message), "Missing OEM module or subtype"); break; #if defined(LIBXML2_SUPPORT) || defined(DOMDOC_SUPPORT) @@ -5999,7 +5999,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, } // endif supfnc if (src && fnc != FNC_NO) { - strcpy(g->Message, "Cannot make catalog table from srcdef"); + snprintf(g->Message, sizeof(g->Message), "Cannot make catalog table from srcdef"); ok= false; } // endif src @@ -6151,7 +6151,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, qrp= OEMColumns(g, topt, tab, (char*)db, fnc == FNC_COL); break; default: - strcpy(g->Message, "System error during assisted discovery"); + snprintf(g->Message, sizeof(g->Message), "System error during assisted discovery"); break; } // endswitch ttp @@ -6395,7 +6395,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd, htrc("Exception %d: %s\n", n, g->Message); rc= HA_ERR_INTERNAL_ERROR; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); rc= HA_ERR_INTERNAL_ERROR; } // end catch @@ -6555,7 +6555,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, case TAB_PIVOT: case TAB_OCCUR: if (options->srcdef) { - strcpy(g->Message, "Cannot check looping reference"); + snprintf(g->Message, sizeof(g->Message), "Cannot check looping reference"); push_warning(thd, Sql_condition::WARN_LEVEL_WARN, ER_UNKNOWN_ERROR, g->Message); } else if (options->tabname) { if (!stricmp(options->tabname, create_info->alias.str) && @@ -6568,7 +6568,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, } // endif tab } else { - strcpy(g->Message, "Missing object table name or definition"); + snprintf(g->Message, sizeof(g->Message), "Missing object table name or definition"); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); DBUG_RETURN(HA_ERR_INTERNAL_ERROR); } // endif tabname @@ -6646,14 +6646,14 @@ int ha_connect::create(const char *name, TABLE *table_arg, #if !defined(DOMDOC_SUPPORT) if (dom) { - strcpy(g->Message, "MS-DOM not supported by this version"); + snprintf(g->Message, sizeof(g->Message), "MS-DOM not supported by this version"); xsup= NULL; } // endif DomDoc #endif // !DOMDOC_SUPPORT #if !defined(LIBXML2_SUPPORT) if (!dom) { - strcpy(g->Message, "libxml2 not supported by this version"); + snprintf(g->Message, sizeof(g->Message), "libxml2 not supported by this version"); xsup= NULL; } // endif Libxml2 #endif // !LIBXML2_SUPPORT @@ -6698,7 +6698,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, continue; // This is a virtual column if (fp->flags & AUTO_INCREMENT_FLAG) { - strcpy(g->Message, "Auto_increment is not supported yet"); + snprintf(g->Message, sizeof(g->Message), "Auto_increment is not supported yet"); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); rc= HA_ERR_INTERNAL_ERROR; DBUG_RETURN(rc); @@ -6714,7 +6714,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, if (type == TAB_VIR) if (!fp->option_struct || !fp->option_struct->special) { - strcpy(g->Message, "Virtual tables accept only special or virtual columns"); + snprintf(g->Message, sizeof(g->Message), "Virtual tables accept only special or virtual columns"); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); rc= HA_ERR_INTERNAL_ERROR; DBUG_RETURN(rc); @@ -6932,7 +6932,7 @@ int ha_connect::create(const char *name, TABLE *table_arg, // This is an ALTER to CONNECT from another engine. // It cannot be accepted because the table data would be modified // except when the target file does not exist. - strcpy(g->Message, "Operation denied. Table data would be modified."); + snprintf(g->Message, sizeof(g->Message), "Operation denied. Table data would be modified."); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); DBUG_RETURN(HA_ERR_INTERNAL_ERROR); } // endif part_info @@ -6942,11 +6942,11 @@ int ha_connect::create(const char *name, TABLE *table_arg, // Get the index definitions if ((xdp= GetIndexInfo()) || sqlcom == SQLCOM_DROP_INDEX) { if (options->multiple) { - strcpy(g->Message, "Multiple tables are not indexable"); + snprintf(g->Message, sizeof(g->Message), "Multiple tables are not indexable"); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); rc= HA_ERR_UNSUPPORTED; } else if (options->compressed) { - strcpy(g->Message, "Compressed tables are not indexable"); + snprintf(g->Message, sizeof(g->Message), "Compressed tables are not indexable"); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); rc= HA_ERR_UNSUPPORTED; } else if (xdp->Invalid) { @@ -7231,11 +7231,11 @@ ha_connect::check_if_supported_inplace_alter(TABLE *altered_table, !SameString(altered_table, "optname") || !SameBool(altered_table, "sepindex")) { if (newopt->multiple) { - strcpy(g->Message, "Multiple tables are not indexable"); + snprintf(g->Message, sizeof(g->Message), "Multiple tables are not indexable"); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); DBUG_RETURN(HA_ALTER_ERROR); } else if (newopt->compressed) { - strcpy(g->Message, "Compressed tables are not indexable"); + snprintf(g->Message, sizeof(g->Message), "Compressed tables are not indexable"); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); DBUG_RETURN(HA_ALTER_ERROR); } else if (GetIndexType(type) == 1) { @@ -7286,7 +7286,7 @@ ha_connect::check_if_supported_inplace_alter(TABLE *altered_table, tshp= NULL; if (FileExists(fn, false)) { - strcpy(g->Message, "Operation denied. Table data would be lost."); + snprintf(g->Message, sizeof(g->Message), "Operation denied. Table data would be lost."); my_message(ER_UNKNOWN_ERROR, g->Message, MYF(0)); DBUG_RETURN(HA_ALTER_ERROR); } else diff --git a/storage/connect/javaconn.cpp b/storage/connect/javaconn.cpp index efde2e86330..847014e3ca5 100644 --- a/storage/connect/javaconn.cpp +++ b/storage/connect/javaconn.cpp @@ -167,7 +167,7 @@ bool JAVAConn::gmID(PGLOBAL g, jmethodID& mid, const char *name, const char *sig mid = env->GetMethodID(jdi, name, sig); if (Check()) { - strcpy(g->Message, Msg); + snprintf(g->Message, sizeof(g->Message), "%s", Msg); return true; } else return false; @@ -372,7 +372,7 @@ bool JAVAConn::Open(PGLOBAL g) rc = jvm->AttachCurrentThread((void**)&env, nullptr); if (rc != JNI_OK) { - strcpy(g->Message, "Cannot attach jvm to the current thread"); + snprintf(g->Message, sizeof(g->Message), "Cannot attach jvm to the current thread"); return true; } // endif rc @@ -456,26 +456,26 @@ bool JAVAConn::Open(PGLOBAL g) switch (rc) { case JNI_OK: - strcpy(g->Message, "VM successfully created"); + snprintf(g->Message, sizeof(g->Message), "VM successfully created"); brc = false; break; case JNI_ERR: - strcpy(g->Message, "Initialising JVM failed: unknown error"); + snprintf(g->Message, sizeof(g->Message), "Initialising JVM failed: unknown error"); break; case JNI_EDETACHED: - strcpy(g->Message, "Thread detached from the VM"); + snprintf(g->Message, sizeof(g->Message), "Thread detached from the VM"); break; case JNI_EVERSION: - strcpy(g->Message, "JNI version error"); + snprintf(g->Message, sizeof(g->Message), "JNI version error"); break; case JNI_ENOMEM: - strcpy(g->Message, "Not enough memory"); + snprintf(g->Message, sizeof(g->Message), "Not enough memory"); break; case JNI_EEXIST: - strcpy(g->Message, "VM already created"); + snprintf(g->Message, sizeof(g->Message), "VM already created"); break; case JNI_EINVAL: - strcpy(g->Message, "Invalid arguments"); + snprintf(g->Message, sizeof(g->Message), "Invalid arguments"); break; default: snprintf(g->Message, sizeof(g->Message), "Unknown return code %d", (int)rc); @@ -516,7 +516,7 @@ bool JAVAConn::Open(PGLOBAL g) rc = env->CallStaticIntMethod(jdi, alp, path); if ((msg = Check(rc))) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), msg); env->DeleteLocalRef(path); return RC_FX; } else switch (rc) { @@ -528,7 +528,7 @@ bool JAVAConn::Open(PGLOBAL g) break; case JNI_ERR: default: - strcpy(g->Message, "Error adding jpath"); + snprintf(g->Message, sizeof(g->Message), "Error adding jpath"); env->DeleteLocalRef(path); return RC_FX; } // endswitch rc @@ -559,7 +559,7 @@ bool JAVAConn::Open(PGLOBAL g) errid = env->GetMethodID(jdi, "GetErrmsg", "()Ljava/lang/String;"); if (env->ExceptionCheck()) { - strcpy(g->Message, "ERROR: method GetErrmsg() not found!"); + snprintf(g->Message, sizeof(g->Message), "ERROR: method GetErrmsg() not found!"); env->ExceptionDescribe(); env->ExceptionClear(); return true; diff --git a/storage/connect/jdbconn.cpp b/storage/connect/jdbconn.cpp index 0ba1f56aa50..c73808fa176 100644 --- a/storage/connect/jdbconn.cpp +++ b/storage/connect/jdbconn.cpp @@ -877,11 +877,11 @@ int JDBConn::ExecuteCommand(PCSZ sql) snprintf(g->Message, sizeof(g->Message), "GetResult: %s", Msg); rc = RC_FX; } else if (m_Ncol) { - strcpy(g->Message, "Result set column number"); + snprintf(g->Message, sizeof(g->Message), "Result set column number"); rc = RC_OK; // A result set was returned } else { m_Aff = (int)n; // Affected rows - strcpy(g->Message, "Affected rows"); + snprintf(g->Message, sizeof(g->Message), "Affected rows"); rc = RC_NF; } // endif ncol @@ -901,7 +901,7 @@ int JDBConn::Fetch(int pos) if (pos) { if (!m_Scrollable) { - strcpy(g->Message, "Cannot fetch(pos) if FORWARD ONLY"); + snprintf(g->Message, sizeof(g->Message), "Cannot fetch(pos) if FORWARD ONLY"); return rc; } else if (gmID(m_G, fetchid, "Fetch", "(I)Z")) return rc; @@ -1230,7 +1230,7 @@ int JDBConn::ExecuteSQL(void) jint n = env->CallIntMethod(job, xpid); if (n == -3) - strcpy(g->Message, "SQL statement is not prepared"); + snprintf(g->Message, sizeof(g->Message), "SQL statement is not prepared"); else if (Check(n)) snprintf(g->Message, sizeof(g->Message), "ExecutePrep: %s", Msg); else { @@ -1313,17 +1313,17 @@ bool JDBConn::SetParam(JDBCCOL *colp) break; case TYPE_DATE: if ((dat = env->FindClass("java/sql/Timestamp")) == nullptr) { - strcpy(g->Message, "Cannot find Timestamp class"); + snprintf(g->Message, sizeof(g->Message), "Cannot find Timestamp class"); return true; } else if (!(dtc = env->GetMethodID(dat, "", "(J)V"))) { - strcpy(g->Message, "Cannot find Timestamp class constructor"); + snprintf(g->Message, sizeof(g->Message), "Cannot find Timestamp class constructor"); return true; } // endif's lg = (jlong)val->GetBigintValue() * 1000; if ((datobj = env->NewObject(dat, dtc, lg)) == nullptr) { - strcpy(g->Message, "Cannot make Timestamp object"); + snprintf(g->Message, sizeof(g->Message), "Cannot make Timestamp object"); return true; } else if (gmID(g, setid, "SetTimestampParm", "(ILjava/sql/Timestamp;)V")) return true; @@ -1414,12 +1414,12 @@ bool JDBConn::SetParam(JDBCCOL *colp) int rc = ExecuteCommand(src); if (rc == RC_NF) { - strcpy(g->Message, "Srcdef is not returning a result set"); + snprintf(g->Message, sizeof(g->Message), "Srcdef is not returning a result set"); return NULL; } else if ((rc) == RC_FX) { return NULL; } else if (m_Ncol == 0) { - strcpy(g->Message, "Invalid Srcdef"); + snprintf(g->Message, sizeof(g->Message), "Invalid Srcdef"); return NULL; } // endif's @@ -1461,7 +1461,7 @@ bool JDBConn::SetParam(JDBCCOL *colp) if (Check()) snprintf(g->Message, sizeof(g->Message), "ColumnDesc: %s", Msg); else - strcpy(g->Message, "No result metadata"); + snprintf(g->Message, sizeof(g->Message), "No result metadata"); env->ReleaseIntArrayElements(val, n, 0); return NULL; @@ -1565,7 +1565,7 @@ bool JDBConn::SetParam(JDBCCOL *colp) // n because we no more ignore the first column if ((n = qrp->Nbcol) > (uint)ncol) { - strcpy(g->Message, MSG(COL_NUM_MISM)); + snprintf(g->Message, sizeof(g->Message), MSG(COL_NUM_MISM)); return -1; } // endif n @@ -1635,7 +1635,7 @@ bool JDBConn::SetParam(JDBCCOL *colp) PQRYRES qrp; if (!m_Rows) { - strcpy(g->Message, "Void result"); + snprintf(g->Message, sizeof(g->Message), "Void result"); return NULL; } // endif m_Rows diff --git a/storage/connect/jmgoconn.cpp b/storage/connect/jmgoconn.cpp index f527eb83dfe..16f472ea084 100644 --- a/storage/connect/jmgoconn.cpp +++ b/storage/connect/jmgoconn.cpp @@ -264,7 +264,7 @@ bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, p = strrchr(Options, ']'); if (!p) { - strcpy(g->Message, "Missing ] in pipeline"); + snprintf(g->Message, sizeof(g->Message), "Missing ] in pipeline"); return true; } else *(char*)p = 0; @@ -275,7 +275,7 @@ bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, s->Append(",{\"$match\":"); if (MakeSelector(g, filp, s)) { - strcpy(g->Message, "Failed making selector"); + snprintf(g->Message, sizeof(g->Message), "Failed making selector"); return true; } else s->Append('}'); @@ -343,7 +343,7 @@ bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options, s->Append(','); if (MakeSelector(g, filp, s)) { - strcpy(g->Message, "Failed making selector"); + snprintf(g->Message, sizeof(g->Message), "Failed making selector"); return true; } // endif Selector diff --git a/storage/connect/json.cpp b/storage/connect/json.cpp index 4490f179d24..95b3024d60a 100644 --- a/storage/connect/json.cpp +++ b/storage/connect/json.cpp @@ -162,7 +162,7 @@ PJSON ParseJson(PGLOBAL g, char* s, size_t len, int* ptyp, bool* comma) htrc("ParseJson: s=%.10s len=%zd\n", s, len); if (!s || !len) { - strcpy(g->Message, "Void JSON object"); + snprintf(g->Message, sizeof(g->Message), "Void JSON object"); return NULL; } else if (comma) *comma = false; @@ -245,7 +245,7 @@ PJSON ParseJson(PGLOBAL g, char* s, size_t len, int* ptyp, bool* comma) htrc("Exception %d: %s\n", n, g->Message); jsp = NULL; } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); jsp = NULL; } // end catch @@ -269,7 +269,7 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char* fn, int pretty) { jdp->dfp = GetDefaultPrec(); if (!jsp) { - safe_strcpy(g->Message, sizeof(g->Message), "Null json tree"); + snprintf(g->Message, sizeof(g->Message), "Null json tree"); throw 1; } else if (!fn) { // Serialize to a string @@ -305,20 +305,25 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char* fn, int pretty) { err = jdp->SerializeValue((PJVAL)jsp); break; default: - strcpy(g->Message, "Invalid json tree"); + snprintf(g->Message, sizeof(g->Message), "Invalid json tree"); } // endswitch Type if (fs) { fputs(EL, fs); fclose(fs); - str = (err) ? NULL : strcpy(g->Message, "Ok"); + if(err) { + str = NULL; + } else { + snprintf(g->Message, sizeof(g->Message), "Ok"); + str = g->Message; + } } else if (!err) { str = ((JOUTSTR*)jp)->Strp; jp->WriteChr('\0'); PlugSubAlloc(g, NULL, ((JOUTSTR*)jp)->N); } else { if (!g->Message[0]) - strcpy(g->Message, "Error in Serialize"); + snprintf(g->Message, sizeof(g->Message), "Error in Serialize"); } // endif's @@ -327,7 +332,7 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char* fn, int pretty) { htrc("Exception %d: %s\n", n, g->Message); str = NULL; } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); str = NULL; } // end catch @@ -551,7 +556,7 @@ PJAR JDOC::ParseAsArray(PGLOBAL g, int& i, int pretty, int *ptyp) return jsp; } else - strcpy(g->Message, "More than one item in file"); + snprintf(g->Message, sizeof(g->Message), "More than one item in file"); return NULL; } // end of ParseAsArray @@ -670,7 +675,7 @@ PJOB JDOC::ParseObject(PGLOBAL g, int& i) throw 2; }; // endswitch s[i] - strcpy(g->Message, "Unexpected EOF in Object"); + snprintf(g->Message, sizeof(g->Message), "Unexpected EOF in Object"); throw 2; } // end of ParseObject @@ -1177,7 +1182,7 @@ PSZ JOBJECT::GetText(PGLOBAL g, PSTRG text) bool JOBJECT::Merge(PGLOBAL g, PJSON jsp) { if (jsp->GetType() != TYPE_JOB) { - strcpy(g->Message, "Second argument is not an object"); + snprintf(g->Message, sizeof(g->Message), "Second argument is not an object"); return true; } // endif Type @@ -1351,7 +1356,7 @@ PJVAL JARRAY::AddArrayValue(PGLOBAL g, PJVAL jvp, int *x) bool JARRAY::Merge(PGLOBAL g, PJSON jsp) { if (jsp->GetType() != TYPE_JAR) { - strcpy(g->Message, "Second argument is not an array"); + snprintf(g->Message, sizeof(g->Message), "Second argument is not an array"); return true; } // endif Type diff --git a/storage/connect/jsonudf.cpp b/storage/connect/jsonudf.cpp index 45a0bb963e7..f87ac091f81 100644 --- a/storage/connect/jsonudf.cpp +++ b/storage/connect/jsonudf.cpp @@ -173,7 +173,7 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) case '!': jnp->Op = OP_SEP; break; // Average case '#': jnp->Op = OP_NUM; break; case '*': // Expand this array - strcpy(g->Message, "Expand not supported by this function"); + snprintf(g->Message, sizeof(g->Message), "Expand not supported by this function"); return true; default: snprintf(g->Message, sizeof(g->Message), "Invalid function specification %c", *p); @@ -195,7 +195,7 @@ my_bool JSNX::SetArrayOptions(PGLOBAL g, char *p, int i, PSZ nm) } // endif n } else { - strcpy(g->Message, "Wrong array specification"); + snprintf(g->Message, sizeof(g->Message), "Wrong array specification"); return true; } // endif's @@ -356,10 +356,10 @@ PJVAL JSNX::MakeJson(PGLOBAL g, PJSON jsp, int n) Jb = false; if (Value->IsTypeNum()) { - strcpy(g->Message, "Cannot make Json for a numeric value"); + snprintf(g->Message, sizeof(g->Message), "Cannot make Json for a numeric value"); return NULL; } else if (jsp->GetType() != TYPE_JAR && jsp->GetType() != TYPE_JOB) { - strcpy(g->Message, "Target is not an array or object"); + snprintf(g->Message, sizeof(g->Message), "Target is not an array or object"); return NULL; } else if (n < Nod -1) { if (jsp->GetType() == TYPE_JAR) { @@ -448,7 +448,7 @@ PJVAL JSNX::GetRowValue(PGLOBAL g, PJSON row, int i, my_bool b) val = new(g)JVALUE(row); } else { - strcpy(g->Message, "Unexpected object"); + snprintf(g->Message, sizeof(g->Message), "Unexpected object"); val = NULL; } //endif Op @@ -498,7 +498,7 @@ PJVAL JSNX::GetRowValue(PGLOBAL g, PJSON row, int i, my_bool b) /*********************************************************************************/ PVAL JSNX::ExpandArray(PGLOBAL g, PJAR arp, int n) { - strcpy(g->Message, "Expand cannot be done by this function"); + snprintf(g->Message, sizeof(g->Message), "Expand cannot be done by this function"); return NULL; } // end of ExpandArray @@ -784,7 +784,7 @@ PJSON JSNX::GetRow(PGLOBAL g) ((PJAR)row)->AddArrayValue(g, new(g)JVALUE(nwr)); ((PJAR)row)->InitArray(g); } else { - strcpy(g->Message, "Wrong type when writing new row"); + snprintf(g->Message, sizeof(g->Message), "Wrong type when writing new row"); nwr = NULL; } // endif's @@ -817,7 +817,7 @@ my_bool JSNX::WriteValue(PGLOBAL g, PJVAL jvalp) case TYPE_JAR: arp = (PJAR)row; break; case TYPE_JVAL: jvp = (PJVAL)row; break; default: - strcpy(g->Message, "Invalid target type"); + snprintf(g->Message, sizeof(g->Message), "Invalid target type"); return true; } // endswitch Type @@ -852,7 +852,7 @@ PSZ JSNX::Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k) g->Message[0] = 0; if (!jsp) { - strcpy(g->Message, "Null json tree"); + snprintf(g->Message, sizeof(g->Message), "Null json tree"); return NULL; } // endif jsp @@ -879,7 +879,7 @@ PSZ JSNX::Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k) if (err) { if (!g->Message[0]) - strcpy(g->Message, "Invalid json tree"); + snprintf(g->Message, sizeof(g->Message), "Invalid json tree"); } else if (Found) { Jp->WriteChr('\0'); @@ -893,7 +893,7 @@ PSZ JSNX::Locate(PGLOBAL g, PJSON jsp, PJVAL jvp, int k) PUSH_WARNING(g->Message); } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); } // end catch return str; @@ -973,7 +973,7 @@ PSZ JSNX::LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx) PJPN jnp; if (!jsp) { - strcpy(g->Message, "Null json tree"); + snprintf(g->Message, sizeof(g->Message), "Null json tree"); return NULL; } // endif jsp @@ -1012,7 +1012,7 @@ PSZ JSNX::LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx) PlugSubAlloc(g, NULL, Jp->N); str = Jp->Strp; } else if (!g->Message[0]) - strcpy(g->Message, "Invalid json tree"); + snprintf(g->Message, sizeof(g->Message), "Invalid json tree"); } catch (int n) { if (trace(1)) @@ -1020,7 +1020,7 @@ PSZ JSNX::LocateAll(PGLOBAL g, PJSON jsp, PJVAL jvp, int mx) PUSH_WARNING(g->Message); } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); } // end catch return str; @@ -1403,7 +1403,7 @@ static my_bool CheckPath(PGLOBAL g, UDF_ARGS *args, PJSON jsp, PJVAL& jvp, int n } // endif jvp } else { - strcpy(g->Message, "Path argument is null"); + snprintf(g->Message, sizeof(g->Message), "Path argument is null"); return true; } // endif path @@ -1751,7 +1751,7 @@ my_bool CheckMemory(PGLOBAL g, UDF_INIT *initid, UDF_ARGS *args, uint n, char errmsg[MAX_STR]; snprintf(errmsg, sizeof(errmsg) - 1, MSG(WORK_AREA), g->Message); - strcpy(g->Message, errmsg); + snprintf(g->Message, sizeof(g->Message), "%s", errmsg); return true; } // endif SareaAlloc @@ -3621,7 +3621,7 @@ char *jsonget_string(UDF_INIT *initid, UDF_ARGS *args, char *result, PUSH_WARNING(g->Message); str = NULL; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); str = NULL; } // end catch @@ -3981,7 +3981,7 @@ char *jsonlocate(UDF_INIT *initid, UDF_ARGS *args, char *result, *error = 1; path = NULL; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); *error = 1; path = NULL; @@ -4107,7 +4107,7 @@ char *json_locate_all(UDF_INIT *initid, UDF_ARGS *args, char *result, *error = 1; path = NULL; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); *error = 1; path = NULL; @@ -4380,7 +4380,7 @@ char *handle_item(UDF_INIT *initid, UDF_ARGS *args, char *result, PUSH_WARNING(g->Message); str = NULL; } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); PUSH_WARNING(g->Message); str = NULL; } // end catch @@ -6188,7 +6188,7 @@ bool JUP::unPretty(PGLOBAL g, int lrecl) { htrc("UnPretty: s=%.10s len=%zd lrecl=%d\n", s, len, lrecl); if (!s || !len) { - strcpy(g->Message, "Void JSON file"); + snprintf(g->Message, sizeof(g->Message), "Void JSON file"); return true; } else if (*s != '[') { // strcpy(g->Message, "JSON file is not an array"); @@ -6251,7 +6251,7 @@ bool JUP::unPretty(PGLOBAL g, int lrecl) { htrc("Exception %d: %s\n", n, g->Message); rc = true; } catch (const char* msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); rc = true; } // end catch diff --git a/storage/connect/macutil.cpp b/storage/connect/macutil.cpp index fd85210ac91..99b2cce8ade 100644 --- a/storage/connect/macutil.cpp +++ b/storage/connect/macutil.cpp @@ -57,12 +57,11 @@ void MACINFO::MakeErrorMsg(PGLOBAL g, DWORD drc) "GetAdaptersInfo: Buffer Overflow buflen=%d nbofadap=%d", Buflen, N); else if (drc == ERROR_INVALID_PARAMETER) - strcpy(g->Message, "GetAdaptersInfo: Invalid parameters"); + snprintf(g->Message, sizeof(g->Message), "GetAdaptersInfo: Invalid parameters"); else if (drc == ERROR_NO_DATA) - strcpy(g->Message, - "No adapter information exists for the local computer"); + snprintf(g->Message, sizeof(g->Message), "No adapter information exists for the local computer"); else if (drc == ERROR_NOT_SUPPORTED) - strcpy(g->Message, "GetAdaptersInfo is not supported"); + snprintf(g->Message, sizeof(g->Message), "GetAdaptersInfo is not supported"); else FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), diff --git a/storage/connect/mysql-test/connect/r/dbf.result b/storage/connect/mysql-test/connect/r/dbf.result index 65d894a0c24..e29cfa94a9a 100644 --- a/storage/connect/mysql-test/connect/r/dbf.result +++ b/storage/connect/mysql-test/connect/r/dbf.result @@ -64,6 +64,24 @@ t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `TABLE_TYPE`=DBF `FILE_NAME`='t1.dbf' INSERT INTO t1 VALUES (10),(20); +CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); +-------- -------- +FileSize 91 +DBF_Version 03 +NRecords 2 +FirstRecPos 66 +RecLength 12 +TableFlags 0000 +CodePageMark 00 +--- --- +FieldN 0 +Name a +Type N +Offset 0 +Length 11 +Dec 0 +Flags 00 +-------- -------- SELECT * FROM t1; a 10 @@ -89,6 +107,24 @@ t1 CREATE TABLE `t1` ( `a` int(11) NOT NULL ) ENGINE=CONNECT DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci `TABLE_TYPE`=DBF `FILE_NAME`='t1.dbf' `READONLY`=NO INSERT INTO t1 VALUES (30); +CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); +-------- -------- +FileSize 103 +DBF_Version 03 +NRecords 3 +FirstRecPos 66 +RecLength 12 +TableFlags 0000 +CodePageMark 00 +--- --- +FieldN 0 +Name a +Type N +Offset 0 +Length 11 +Dec 0 +Flags 00 +-------- -------- SELECT * FROM t1; a 10 @@ -137,7 +173,7 @@ a test CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 77 +FileSize 78 DBF_Version 03 NRecords 1 FirstRecPos 66 @@ -171,7 +207,7 @@ a b c 2 2 2 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 194 +FileSize 195 DBF_Version 03 NRecords 2 FirstRecPos 130 @@ -264,7 +300,7 @@ a -9223372036854775808 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 108 +FileSize 109 DBF_Version 03 NRecords 2 FirstRecPos 66 @@ -308,7 +344,7 @@ a -32768 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 80 +FileSize 81 DBF_Version 03 NRecords 2 FirstRecPos 66 @@ -338,7 +374,7 @@ LENGTH(a) 255 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 322 +FileSize 323 DBF_Version 03 NRecords 1 FirstRecPos 66 @@ -419,7 +455,7 @@ a 2001-01-01 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 75 +FileSize 76 DBF_Version 03 NRecords 1 FirstRecPos 66 @@ -449,7 +485,7 @@ a 123.0000 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 79 +FileSize 80 DBF_Version 03 NRecords 1 FirstRecPos 66 @@ -481,7 +517,7 @@ a 123456789.12345 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 108 +FileSize 109 DBF_Version 03 NRecords 2 FirstRecPos 66 @@ -511,7 +547,7 @@ a 10 CALL dbf_header('MYSQLD_DATADIR/test/t1c.dbf'); -------- -------- -FileSize 77 +FileSize 78 DBF_Version 03 NRecords 1 FirstRecPos 66 @@ -538,7 +574,7 @@ a 10 CALL dbf_header('MYSQLD_DATADIR/test/t1c.dbf'); -------- -------- -FileSize 77 +FileSize 78 DBF_Version 03 NRecords 1 FirstRecPos 66 @@ -567,7 +603,7 @@ a 10 CALL dbf_header('MYSQLD_DATADIR/test/t1c.dbf'); -------- -------- -FileSize 77 +FileSize 78 DBF_Version 03 NRecords 1 FirstRecPos 66 @@ -604,7 +640,7 @@ c1 c2 i1 i2 30 def 30 123 CALL dbf_header('MYSQLD_DATADIR/test/t1.dbf'); -------- -------- -FileSize 291 +FileSize 292 DBF_Version 03 NRecords 3 FirstRecPos 162 diff --git a/storage/connect/mysql-test/connect/t/dbf.test b/storage/connect/mysql-test/connect/t/dbf.test index ca5124f1a81..3e403ac4fb4 100644 --- a/storage/connect/mysql-test/connect/t/dbf.test +++ b/storage/connect/mysql-test/connect/t/dbf.test @@ -63,6 +63,11 @@ DELIMITER ;// CREATE TABLE t1 (a INT NOT NULL) ENGINE=CONNECT TABLE_TYPE=DBF FILE_NAME='t1.dbf'; SHOW CREATE TABLE t1; INSERT INTO t1 VALUES (10),(20); +--chmod 0777 $MYSQLD_DATADIR/test/t1.dbf +--vertical_results +--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf'); +--horizontal_results SELECT * FROM t1; ALTER TABLE t1 READONLY=Yes; SHOW CREATE TABLE t1; @@ -77,6 +82,11 @@ TRUNCATE TABLE t1; ALTER TABLE t1 READONLY=NO; SHOW CREATE TABLE t1; INSERT INTO t1 VALUES (30); +--chmod 0777 $MYSQLD_DATADIR/test/t1.dbf +--vertical_results +--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR +eval CALL dbf_header('$MYSQLD_DATADIR/test/t1.dbf'); +--horizontal_results SELECT * FROM t1; DROP TABLE t1; --remove_file $MYSQLD_DATADIR/test/t1.dbf diff --git a/storage/connect/mysql-test/connect/t/infoschema-9739.test b/storage/connect/mysql-test/connect/t/infoschema-9739.test index 16f837cafcc..02b264e6d0b 100644 --- a/storage/connect/mysql-test/connect/t/infoschema-9739.test +++ b/storage/connect/mysql-test/connect/t/infoschema-9739.test @@ -5,5 +5,7 @@ --source windows.inc create table t1 (i int) engine=Connect table_type=XML option_list='xmlsup=domdoc'; +--disable_ps2_protocol select * from information_schema.tables where table_schema='test' and create_options like '%table_type=XML%'; +--enable_ps2_protocol drop table t1; diff --git a/storage/connect/mysql-test/connect/t/infoschema2-9739.test b/storage/connect/mysql-test/connect/t/infoschema2-9739.test index 76681bc91ed..a4c149148db 100644 --- a/storage/connect/mysql-test/connect/t/infoschema2-9739.test +++ b/storage/connect/mysql-test/connect/t/infoschema2-9739.test @@ -5,5 +5,7 @@ --source have_libxml2.inc create table t1 (i int) engine=Connect table_type=XML option_list='xmlsup=libxml2'; +--disable_ps2_protocol select * from information_schema.tables where table_schema='test' and create_options like '%table_type=XML%'; +--enable_ps2_protocol drop table t1; diff --git a/storage/connect/mysql-test/connect/t/json_udf.test b/storage/connect/mysql-test/connect/t/json_udf.test index d45131f32ba..96fe836e60b 100644 --- a/storage/connect/mysql-test/connect/t/json_udf.test +++ b/storage/connect/mysql-test/connect/t/json_udf.test @@ -33,7 +33,9 @@ SELECT Json_Array_Add(Json_Make_Array(56, 3.1416, 'foo', NULL), 'One more') Arra SELECT Json_Array_Add(JsonValue('one value'), 'One more'); #--error ER_CANT_INITIALIZE_UDF SELECT Json_Array_Add('one value', 'One more'); +--disable_ps2_protocol SELECT Json_Array_Add('one value' json_, 'One more'); +--enable_ps2_protocol #--error ER_CANT_INITIALIZE_UDF SELECT Json_Array_Add(5 json_, 'One more'); SELECT Json_Array_Add('[5,3,8,7,9]' json_, 4, 0); diff --git a/storage/connect/mysql-test/connect/t/json_udf_bin.test b/storage/connect/mysql-test/connect/t/json_udf_bin.test index cbbfca9d2d2..d8c7c0fb398 100644 --- a/storage/connect/mysql-test/connect/t/json_udf_bin.test +++ b/storage/connect/mysql-test/connect/t/json_udf_bin.test @@ -112,7 +112,9 @@ SELECT Json_Serialize(Jbin_Array_Add(Jbin_File('not_exist.json'), 'd')); SELECT Json_Serialize(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')); SELECT Json_File('bt1.json', 2); --echo # This does modify the file +--disable_ps2_protocol SELECT Json_Array_Add(Jbin_File('bt1.json'), 'd'); +--enable_ps2_protocol SELECT Json_File('bt1.json', 2); --echo # Back to the original file SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); @@ -120,31 +122,45 @@ SELECT Json_Make_Object(Jbin_Array_Add(Jbin_Array('a','b','c'), 'd') "Jbin_foo") SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd')) AS "Result"; SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1") AS "Result"; --echo # This does modify the file +--disable_ps2_protocol SELECT Json_Make_Object(Json_Array_Add(Jbin_File('bt1.json'), 'd') "Jfile_bt1") AS "Result"; +--enable_ps2_protocol SELECT Json_File('bt1.json'); SELECT Json_File(Json_Array_Delete(Jbin_File('bt1.json'), 3), 2); SELECT Json_Make_Object(Jbin_Array_Add(Jbin_File('bt1.json'), 'd') "Jbin_bt1", n "t1") AS "Result" from t1; +--disable_ps2_protocol SELECT Json_File(Json_Array_Add(Jbin_Array_Add(Jbin_File('bt1.json'), 'd'), 'e')) AS "Result"; +--enable_ps2_protocol SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); +--disable_ps2_protocol SELECT Json_File(Json_Array_Add(Jbin_Array_Add(Jbin_File('bt1.json'), 'd'), 'e')) AS "Result" from t1; +--enable_ps2_protocol SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); +--disable_ps2_protocol SELECT Json_Array_Add(Jbin_Array_Add(Jbin_File('bt1.json'), 'd'), n) AS "Result" from t1; +--enable_ps2_protocol --echo # Show modified file SELECT Json_File('bt1.json'); SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); +--disable_ps2_protocol SELECT Json_Array_Add(Jbin_File('bt1.json'), n) AS "Result" from t1; +--enable_ps2_protocol --echo # Show modified file SELECT Json_File('bt1.json'); SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); +--disable_ps2_protocol SELECT Json_File(Jbin_Item_Merge(Jbin_File('bt1.json'), Jbin_Array('d','e','f'))); SELECT Json_File(Json_Item_Merge(Jbin_File('bt1.json'), Jbin_Array('d','e','f'))); +--enable_ps2_protocol SELECT Jfile_Make(Jbin_Array('a','b','c'), 'bt1.json'); --echo # Test DELETE from file +--disable_ps2_protocol SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 1)) AS "Result"; SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 2) "Jbin_bt1") AS "Result"; SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 0) "Jbin_bt1", n "t1") AS "Result" from t1; SELECT Json_Make_Object(Jbin_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1; SELECT Json_Make_Object(Json_Array_Delete(Jbin_File('bt1.json'), 3 - n) "Jbin_bt1") AS "Result" from t1; +--enable_ps2_protocol --echo # Show modified file SELECT Json_File('bt1.json'); --echo # Object file @@ -181,9 +197,11 @@ SELECT Json_Serialize(Jbin_Object_List(Jbin_File('bt2.json'))) "Key list"; # Test documentation examples # SELECT Jfile_Make('{"a":1, "b":[44, 55]}' json_, 'bt3.json', 0); +--disable_ps2_protocol SELECT Json_Array_Add(Json_File('bt3.json', '$.b'), 66); SELECT Json_Array_Add(Json_File('bt3.json'), 66, '$.b'); SELECT Json_Array_Add(Jbin_File('bt3.json', '$.b'), 66); +--enable_ps2_protocol SELECT Json_File('bt3.json', 3); SELECT Jfile_Make('{"a":1, "b":[44, 55]}' json_, 'bt3.json', 0); # diff --git a/storage/connect/mysql-test/connect/t/mysql_exec.test b/storage/connect/mysql-test/connect/t/mysql_exec.test index 4aad23cd588..afa3613fbe7 100644 --- a/storage/connect/mysql-test/connect/t/mysql_exec.test +++ b/storage/connect/mysql-test/connect/t/mysql_exec.test @@ -13,6 +13,7 @@ eval CREATE TABLE t1 ( message VARCHAR(255) FLAG=2) ENGINE=CONNECT TABLE_TYPE=MYSQL CONNECTION='mysql://root@127.0.0.1:$SLAVE_MYPORT/test' OPTION_LIST='Execsrc=1,maxerr=2'; +--disable_ps2_protocol SELECT * FROM t1 WHERE command IN ('Warning','Note', 'drop table if exists t1', 'create table t1 (id int key auto_increment, msg varchar(32) not null)', @@ -22,6 +23,7 @@ SELECT * FROM t1 WHERE command IN ('Warning','Note', 'insert ignore into t1(id) values(NULL)', "update t1 set msg = 'Four' where id = 4", 'select * from t1'); +--enable_ps2_protocol --echo # --echo # Checking Using Procedure diff --git a/storage/connect/odbconn.cpp b/storage/connect/odbconn.cpp index 0c5903baa77..520b82d51c2 100644 --- a/storage/connect/odbconn.cpp +++ b/storage/connect/odbconn.cpp @@ -1158,7 +1158,7 @@ int ODBConn::Open(PCSZ ConnectString, POPARM sop, DWORD options) if (!m_UseCnc) { if (DriverConnect(options)) { - strcpy(g->Message, MSG(CONNECT_CANCEL)); + snprintf(g->Message, sizeof(g->Message), MSG(CONNECT_CANCEL)); return 0; } // endif @@ -1480,7 +1480,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) ThrowDBX(rc, "SQLNumResultCols", hstmt); if (ncol == 0) { - strcpy(g->Message, "This Srcdef does not return a result set"); + snprintf(g->Message, sizeof(g->Message), "This Srcdef does not return a result set"); return -1; } // endif ncol @@ -1523,7 +1523,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) tp = GetSQLCType(colp->GetResultType()); if (tp == SQL_TYPE_NULL) { - sprintf(m_G->Message, MSG(INV_COLUMN_TYPE), + snprintf(m_G->Message, sizeof(m_G->Message), MSG(INV_COLUMN_TYPE), colp->GetResultType(), SVP(colp->GetName())); ThrowDBX(m_G->Message); } // endif tp @@ -1549,7 +1549,7 @@ int ODBConn::ExecDirectSQL(char *sql, ODBCCOL *tocols) for (int i = 0; i < MAX_NUM_OF_MSG && x->m_ErrMsg[i]; i++) htrc(x->m_ErrMsg[i]); - sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); + snprintf(m_G->Message, sizeof(m_G->Message), "%s: %s", x->m_Msg, x->GetErrorMessage(0)); if (b) SQLCancel(hstmt); @@ -1777,7 +1777,7 @@ int ODBConn::ExecuteSQL(void) if (ncol) { // This should never happen while inserting - strcpy(g->Message, "Logical error while inserting"); + snprintf(g->Message, sizeof(g->Message), "Logical error while inserting"); } else { // Insert, Update or Delete statement if (!Check(rc = SQLRowCount(m_hstmt, &afrw))) @@ -1786,7 +1786,7 @@ int ODBConn::ExecuteSQL(void) } // endif ncol } catch(DBX *x) { - sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); + snprintf(m_G->Message, sizeof(m_G->Message), "%s: %s", x->m_Msg, x->GetErrorMessage(0)); SQLCancel(m_hstmt); rc = SQLFreeStmt(m_hstmt, SQL_DROP); m_hstmt = NULL; @@ -1825,7 +1825,7 @@ bool ODBConn::BindParam(ODBCCOL *colp) ThrowDBX(rc, "SQLDescribeParam", m_hstmt); } catch(DBX *x) { - sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); + snprintf(m_G->Message, sizeof(m_G->Message), "%s: %s", x->m_Msg, x->GetErrorMessage(0)); #endif // 0 colsize = colp->GetPrecision(); sqlt = GetSQLType(buftype); @@ -1923,10 +1923,10 @@ bool ODBConn::ExecSQLcommand(char *sql) ThrowDBX(rc, "SQLRowCount", hstmt); m_Tdb->AftRows = (int)afrw; - strcpy(g->Message, "Affected rows"); + snprintf(g->Message, sizeof(g->Message), "Affected rows"); } else { m_Tdb->AftRows = (int)ncol; - strcpy(g->Message, "Result set column number"); + snprintf(g->Message, sizeof(g->Message), "Result set column number"); } // endif ncol } catch(DBX *x) { @@ -2024,7 +2024,7 @@ PQRYRES ODBConn::GetMetaData(PGLOBAL g, PCSZ dsn, PCSZ src) } // end try/catch if (!ncol) { - strcpy(g->Message, "Invalid Srcdef"); + snprintf(g->Message, sizeof(g->Message), "Invalid Srcdef"); goto err; } // endif ncol @@ -2122,7 +2122,7 @@ bool ODBConn::GetDataSources(PQRYRES qrp) } // endfor i } catch(DBX *x) { - sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); + snprintf(m_G->Message, sizeof(m_G->Message), "%s: %s", x->m_Msg, x->GetErrorMessage(0)); rv = true; } // end try/catch @@ -2173,7 +2173,7 @@ bool ODBConn::GetDrivers(PQRYRES qrp) } // endfor n } catch(DBX *x) { - sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); + snprintf(m_G->Message, sizeof(m_G->Message), "%s: %s", x->m_Msg, x->GetErrorMessage(0)); rv = true; } // end try/catch @@ -2518,7 +2518,7 @@ PQRYRES ODBConn::AllocateResult(PGLOBAL g) PQRYRES qrp; if (!m_Rows) { - strcpy(g->Message, "Void result"); + snprintf(g->Message, sizeof(g->Message), "Void result"); return NULL; } // endif m_Res @@ -2597,7 +2597,7 @@ int ODBConn::Rewind(char *sql, ODBCCOL *tocols) rbuf = (int)crow; } catch(DBX *x) { - sprintf(m_G->Message, "%s: %s", x->m_Msg, x->GetErrorMessage(0)); + snprintf(m_G->Message, sizeof(m_G->Message), "%s: %s", x->m_Msg, x->GetErrorMessage(0)); rbuf = -1; } // end try/catch diff --git a/storage/connect/osutil.c b/storage/connect/osutil.c index 278023f55a2..9b1771be105 100644 --- a/storage/connect/osutil.c +++ b/storage/connect/osutil.c @@ -4,6 +4,7 @@ #include #include #include "osutil.h" +#include "m_string.h" #ifdef _WIN32 my_bool CloseFileHandle(HANDLE h) @@ -140,25 +141,25 @@ char *_fullpath(char *absPath, const char *relPath, size_t maxLength) char *p; if ( *relPath == '\\' || *relPath == '/' ) { - strncpy(absPath, relPath, maxLength); + snprintf(absPath, maxLength, "%s", relPath); } else if (*relPath == '~') { // get the path to the home directory struct passwd *pw = getpwuid(getuid()); const char *homedir = pw->pw_dir; if (homedir) - strcat(strncpy(absPath, homedir, maxLength), relPath + 1); + snprintf(absPath, maxLength, "%s%s", homedir, relPath + 1); else - strncpy(absPath, relPath, maxLength); + snprintf(absPath, maxLength, "%s", relPath); } else { char buff[2*_MAX_PATH]; p= getcwd(buff, _MAX_PATH); assert(p); - strcat(buff,"/"); - strcat(buff, relPath); - strncpy(absPath, buff, maxLength); + safe_strcat(buff, sizeof(buff), "/"); + safe_strcat(buff, sizeof(buff), relPath); + snprintf(absPath, maxLength, "%s", buff); } /* endif's relPath */ p = absPath; diff --git a/storage/connect/plgdbutl.cpp b/storage/connect/plgdbutl.cpp index 0f075a67876..68641129dc9 100644 --- a/storage/connect/plgdbutl.cpp +++ b/storage/connect/plgdbutl.cpp @@ -381,7 +381,7 @@ char *SetPath(PGLOBAL g, const char *path) return NULL; if (PlugIsAbsolutePath(path)) { - strcpy(buf, path); + snprintf(buf, len, "%s", path); return buf; } // endif path @@ -391,9 +391,9 @@ char *SetPath(PGLOBAL g, const char *path) #else // !_WIN32 const char *s = "/"; #endif // !_WIN32 - strcat(strcat(strcat(strcpy(buf, "."), s), path), s); + snprintf(buf, len, ".%s%s%s", s, path, s); } else - strcpy(buf, path); + snprintf(buf, len, "%s", path); } // endif path diff --git a/storage/connect/plugutil.cpp b/storage/connect/plugutil.cpp index 6fb40c92a1b..a39c5846225 100644 --- a/storage/connect/plugutil.cpp +++ b/storage/connect/plugutil.cpp @@ -74,6 +74,7 @@ /***********************************************************************/ #define STORAGE /* Initialize global variables */ +#include "m_string.h" #include "osutil.h" #include "global.h" #include "plgdbsem.h" @@ -329,14 +330,15 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath) switch (*direc) { case '\0': - strcpy(direc, defdir); + snprintf(direc, sizeof(direc), "%s", defdir); break; case '\\': case '/': break; default: // This supposes that defdir ends with a SLASH - strcpy(direc, strcat(defdir, direc)); + safe_strcat(defdir, sizeof(defdir), direc); + snprintf(direc, sizeof(direc), "%s", defdir); } // endswitch _makepath(newname, drive, direc, fname, ftype); @@ -607,7 +609,7 @@ char *PlugDup(PGLOBAL g, const char *str) if (str) { char *sm = (char*)PlugSubAlloc(g, NULL, strlen(str) + 1); - strcpy(sm, str); + snprintf(sm, strlen(str) + 1, "%s", str); return sm; } else return NULL; diff --git a/storage/connect/tabjmg.cpp b/storage/connect/tabjmg.cpp index 06a91f57dea..cf0fa73b5d5 100644 --- a/storage/connect/tabjmg.cpp +++ b/storage/connect/tabjmg.cpp @@ -48,7 +48,7 @@ JMGDISC::JMGDISC(PGLOBAL g, int *lg) : MGODISC(g, lg) bool JMGDISC::Init(PGLOBAL g) { if (!(Jcp = ((TDBJMG*)tmgp)->Jcp)) { - strcpy(g->Message, "Init: Jcp is NULL"); + snprintf(g->Message, sizeof(g->Message), "Init: Jcp is NULL"); return true; } else if (Jcp->gmID(g, columnid, "ColumnDesc", "(Ljava/lang/Object;I[II)Ljava/lang/Object;")) @@ -86,7 +86,7 @@ bool JMGDISC::ColDesc(PGLOBAL g, jobject obj, char *pcn, char *pfmt, jintArray val = Jcp->env->NewIntArray(5); if (val == nullptr) { - strcpy(g->Message, "Cannot allocate jint array"); + snprintf(g->Message, sizeof(g->Message), "Cannot allocate jint array"); return true; } else if (!ncol) n = Jcp->env->GetIntArrayElements(val, 0); @@ -113,7 +113,7 @@ bool JMGDISC::ColDesc(PGLOBAL g, jobject obj, char *pcn, char *pfmt, z = 65 - strlen(colname); strncat(strncat(colname, "_", z), key, z - 1); } else - strcpy(colname, key); + snprintf(colname, sizeof(colname), "%s", key); if (pfmt) { strncpy(fmt, pfmt, 128); @@ -121,7 +121,7 @@ bool JMGDISC::ColDesc(PGLOBAL g, jobject obj, char *pcn, char *pfmt, z = 129 - strlen(fmt); strncat(strncat(fmt, ".", z), key, z - 1); } else - strcpy(fmt, key); + snprintf(fmt, sizeof(fmt), "%s", key); if (!jres) { bcol.Type = n[0]; @@ -318,7 +318,7 @@ bool TDBJMG::OpenDB(PGLOBAL g) /* First opening. */ /*********************************************************************/ if (Pipe && Mode != MODE_READ) { - strcpy(g->Message, "Pipeline tables are read only"); + snprintf(g->Message, sizeof(g->Message), "Pipeline tables are read only"); return true; } // endif Pipe @@ -353,7 +353,7 @@ bool TDBJMG::OpenDB(PGLOBAL g) /***********************************************************************/ bool TDBJMG::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) { - strcpy(g->Message, "MONGO tables are not indexable"); + snprintf(g->Message, sizeof(g->Message), "MONGO tables are not indexable"); return true; } // end of ReadKey @@ -601,7 +601,7 @@ bool JMGCOL::AddValue(PGLOBAL g, bson_t *doc, char *key, bool upd) } // endswitch Buf_Type if (!rc) { - strcpy(g->Message, "Adding value failed"); + snprintf(g->Message, sizeof(g->Message), "Adding value failed"); return true; } else return false; diff --git a/storage/connect/tabmysql.cpp b/storage/connect/tabmysql.cpp index 7192b572309..2c6ffa8bdcc 100644 --- a/storage/connect/tabmysql.cpp +++ b/storage/connect/tabmysql.cpp @@ -112,7 +112,7 @@ bool MYSQLDEF::GetServerInfo(PGLOBAL g, const char *server_name) if (!server_name || !strlen(server_name)) { DBUG_PRINT("info", ("server_name not defined!")); - strcpy(g->Message, "server_name not defined!"); + snprintf(g->Message, sizeof(g->Message), "server_name not defined!"); DBUG_RETURN(true); } // endif server_name @@ -121,7 +121,7 @@ bool MYSQLDEF::GetServerInfo(PGLOBAL g, const char *server_name) if (!(server= get_server_by_name(mem, server_name, &server_buffer))) { DBUG_PRINT("info", ("get_server_by_name returned > 0 error condition!")); /* need to come up with error handling */ - strcpy(g->Message, "get_server_by_name returned > 0 error condition!"); + snprintf(g->Message, sizeof(g->Message), "get_server_by_name returned > 0 error condition!"); DBUG_RETURN(true); } // endif server @@ -214,21 +214,21 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) char *sport, *scheme = url; if (!(Username = strstr(url, "://"))) { - strcpy(g->Message, "Connection is not an URL"); + snprintf(g->Message, sizeof(g->Message), "Connection is not an URL"); return true; } // endif User scheme[Username - scheme] = 0; if (stricmp(scheme, "mysql")) { - strcpy(g->Message, "scheme must be mysql"); + snprintf(g->Message, sizeof(g->Message), "scheme must be mysql"); return true; } // endif scheme Username += 3; if (!(Hostname = (char*)strchr(Username, '@'))) { - strcpy(g->Message, "No host specified in URL"); + snprintf(g->Message, sizeof(g->Message), "No host specified in URL"); return true; } else { *Hostname++ = 0; // End Username @@ -240,7 +240,7 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) // Make sure there isn't an extra / if (strchr(pwd, '/')) { - strcpy(g->Message, "Syntax error in URL"); + snprintf(g->Message, sizeof(g->Message), "Syntax error in URL"); return true; } // endif @@ -256,7 +256,7 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) // Make sure there isn't an extra / or @ */ if ((strchr(Username, '/')) || (strchr(Hostname, '@'))) { - strcpy(g->Message, "Syntax error in URL"); + snprintf(g->Message, sizeof(g->Message), "Syntax error in URL"); return true; } // endif @@ -268,7 +268,7 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b) // Make sure there's not an extra / if ((strchr(tabn, '/'))) { - strcpy(g->Message, "Syntax error in URL"); + snprintf(g->Message, sizeof(g->Message), "Syntax error in URL"); return true; } // endif / @@ -574,7 +574,7 @@ bool TDBMYSQL::MakeSelect(PGLOBAL g, bool mx) len += (mx ? 256 : 1); if (Query->IsTruncated() || Query->Resize(len)) { - strcpy(g->Message, "MakeSelect: Out of memory"); + snprintf(g->Message, sizeof(g->Message), "MakeSelect: Out of memory"); return true; } // endif Query @@ -599,7 +599,7 @@ bool TDBMYSQL::MakeInsert(PGLOBAL g) if (Prep) { #if !defined(MYSQL_PREPARED_STATEMENTS) - strcpy(g->Message, "Prepared statements not used (not supported)"); + snprintf(g->Message, sizeof(g->Message), "Prepared statements not used (not supported)"); PushWarning(g, this); Prep = false; #endif // !MYSQL_PREPARED_STATEMENTS @@ -607,7 +607,7 @@ bool TDBMYSQL::MakeInsert(PGLOBAL g) for (colp = Columns; colp; colp = colp->GetNext()) if (colp->IsSpecial()) { - strcpy(g->Message, MSG(NO_SPEC_COL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_SPEC_COL)); return true; } else { len += (strlen(colp->GetName()) + 4); @@ -664,7 +664,7 @@ bool TDBMYSQL::MakeInsert(PGLOBAL g) #endif // MYSQL_PREPARED_STATEMENTS if ((oom = Query->IsTruncated())) - strcpy(g->Message, "MakeInsert: Out of memory"); + snprintf(g->Message, sizeof(g->Message), "MakeInsert: Out of memory"); return oom; } // end of MakeInsert @@ -706,7 +706,7 @@ bool TDBMYSQL::MakeCommand(PGLOBAL g) Query->Append(Qrystr + (p - qrystr) + strlen(name)); if (Query->IsTruncated()) { - strcpy(g->Message, "MakeCommand: Out of memory"); + snprintf(g->Message, sizeof(g->Message), "MakeCommand: Out of memory"); return true; } else strlwr(strcpy(qrystr, Query->GetStr())); @@ -742,7 +742,7 @@ int TDBMYSQL::MakeUpdate(PGLOBAL g) && !stricmp(tab, Name)) qc = (Quoted) ? "`" : ""; else { - strcpy(g->Message, "Cannot use this UPDATE command"); + snprintf(g->Message, sizeof(g->Message), "Cannot use this UPDATE command"); return RC_FX; } // endif sscanf @@ -769,7 +769,7 @@ int TDBMYSQL::MakeDelete(PGLOBAL g) else if (sscanf(Qrystr, "%s %s %s%511c", cmd, from, tab, end) > 2) qc = (Quoted) ? "`" : ""; else { - strcpy(g->Message, "Cannot use this DELETE command"); + snprintf(g->Message, sizeof(g->Message), "Cannot use this DELETE command"); return RC_FX; } // endif sscanf @@ -934,7 +934,7 @@ bool TDBMYSQL::OpenDB(PGLOBAL g) } else if (Mode == MODE_INSERT) { if (Srcdef) { - strcpy(g->Message, "No insert into anonym views"); + snprintf(g->Message, sizeof(g->Message), "No insert into anonym views"); Myc.Close(); return true; } // endif Srcdef @@ -946,7 +946,7 @@ bool TDBMYSQL::OpenDB(PGLOBAL g) if (Nparm != n) { if (n >= 0) // Other errors return negative values - strcpy(g->Message, MSG(BAD_PARM_COUNT)); + snprintf(g->Message, sizeof(g->Message), MSG(BAD_PARM_COUNT)); } else #endif // MYSQL_PREPARED_STATEMENTS @@ -1109,7 +1109,7 @@ bool TDBMYSQL::ReadKey(PGLOBAL g, OPVAL op, const key_range *kr) if (To_CondFil) if (Query->Append(" AND ") || Query->Append(To_CondFil->Body)) { - strcpy(g->Message, "Readkey: Out of memory"); + snprintf(g->Message, sizeof(g->Message), "Readkey: Out of memory"); return true; } // endif Append @@ -1184,7 +1184,7 @@ int TDBMYSQL::WriteDB(PGLOBAL g) } // endfor colp if (unlikely(Query->IsTruncated())) { - strcpy(g->Message, "WriteDB: Out of memory"); + snprintf(g->Message, sizeof(g->Message), "WriteDB: Out of memory"); rc = RC_FX; } else { Query->RepLast(')'); @@ -1530,13 +1530,13 @@ PCMD TDBMYEXC::MakeCMD(PGLOBAL g) (To_CondFil->Op == OP_EQ || To_CondFil->Op == OP_IN)) { xcmd = To_CondFil->Cmds; } else - strcpy(g->Message, "Invalid command specification filter"); + snprintf(g->Message, sizeof(g->Message), "Invalid command specification filter"); } else - strcpy(g->Message, "No command column in select list"); + snprintf(g->Message, sizeof(g->Message), "No command column in select list"); } else if (!Srcdef) - strcpy(g->Message, "No Srcdef default command"); + snprintf(g->Message, sizeof(g->Message), "No Srcdef default command"); else xcmd = new(g) CMD(g, Srcdef); @@ -1561,7 +1561,7 @@ int TDBMYEXC::GetMaxSize(PGLOBAL) bool TDBMYEXC::OpenDB(PGLOBAL g) { if (Use == USE_OPEN) { - strcpy(g->Message, "Multiple execution is not allowed"); + snprintf(g->Message, sizeof(g->Message), "Multiple execution is not allowed"); return true; } // endif use @@ -1579,7 +1579,7 @@ bool TDBMYEXC::OpenDB(PGLOBAL g) Use = USE_OPEN; // Do it now in case we are recursively called if (Mode != MODE_READ && Mode != MODE_READX) { - strcpy(g->Message, "No INSERT/DELETE/UPDATE of MYSQL EXEC tables"); + snprintf(g->Message, sizeof(g->Message), "No INSERT/DELETE/UPDATE of MYSQL EXEC tables"); return true; } // endif Mode @@ -1626,11 +1626,11 @@ int TDBMYEXC::ReadDB(PGLOBAL g) switch (rc = Myc.ExecSQLcmd(g, Query->GetStr(), &Warnings)) { case RC_NF: AftRows = Myc.m_Afrw; - strcpy(g->Message, "Affected rows"); + snprintf(g->Message, sizeof(g->Message), "Affected rows"); break; case RC_OK: AftRows = Myc.m_Fields; - strcpy(g->Message, "Result set columns"); + snprintf(g->Message, sizeof(g->Message), "Result set columns"); break; case RC_FX: AftRows = Myc.m_Afrw; @@ -1660,7 +1660,7 @@ int TDBMYEXC::ReadDB(PGLOBAL g) /***********************************************************************/ int TDBMYEXC::WriteDB(PGLOBAL g) { - strcpy(g->Message, "EXEC MYSQL tables are read only"); + snprintf(g->Message, sizeof(g->Message), "EXEC MYSQL tables are read only"); return RC_FX; } // end of WriteDB diff --git a/storage/connect/tabpivot.cpp b/storage/connect/tabpivot.cpp index ba9b903399d..da5885f9914 100644 --- a/storage/connect/tabpivot.cpp +++ b/storage/connect/tabpivot.cpp @@ -120,7 +120,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) uint n = strlen(Skcol); skc = (char*)PlugSubAlloc(g, NULL, n + 2); - strcpy(skc, Skcol); + snprintf(skc, n + 2, "%s", Skcol); skc[n + 1] = 0; // Replace ; by nulls in skc @@ -133,9 +133,9 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) if (!Tabsrc && Tabname) { // Locate the query query = (char*)PlugSubAlloc(g, NULL, strlen(Tabname) + 26); - sprintf(query, "SELECT * FROM `%s` LIMIT 1", Tabname); + snprintf(query, strlen(Tabname) + 26, "SELECT * FROM `%s` LIMIT 1", Tabname); } else if (!Tabsrc) { - strcpy(g->Message, MSG(SRC_TABLE_UNDEF)); + snprintf(g->Message, sizeof(g->Message), MSG(SRC_TABLE_UNDEF)); goto err; } else query = (char*)Tabsrc; @@ -167,7 +167,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) Fncol = crp->Name; if (!Fncol) { - strcpy(g->Message, MSG(NO_DEF_FNCCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_FNCCOL)); goto err; } // endif Fncol @@ -180,7 +180,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) Picol = crp->Name; if (!Picol) { - strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_PIVOTCOL)); goto err; } // endif Picol @@ -206,10 +206,10 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) pcrp = &crp->Next; } if (!Rblkp) { - strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_PIVOTCOL)); goto err; } else if (!fncrp) { - strcpy(g->Message, MSG(NO_DEF_FNCCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_FNCCOL)); goto err; } // endif @@ -302,7 +302,7 @@ PQRYRES PIVAID::MakePivotColumns(PGLOBAL g) if (trace(1)) htrc("Exception %d: %s\n", n, g->Message); } catch (const char *msg) { - strcpy(g->Message, msg); + snprintf(g->Message, sizeof(g->Message), "%s", msg); } // end catch err: @@ -442,7 +442,7 @@ bool TDBPIVOT::FindDefaultColumns(PGLOBAL g) Fncol = cdp->GetName(); if (!Fncol) { - strcpy(g->Message, MSG(NO_DEF_FNCCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_FNCCOL)); return true; } // endif Fncol @@ -455,7 +455,7 @@ bool TDBPIVOT::FindDefaultColumns(PGLOBAL g) Picol = cdp->GetName(); if (!Picol) { - strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_PIVOTCOL)); return true; } // endif Picol @@ -518,7 +518,7 @@ bool TDBPIVOT::GetSourceTable(PGLOBAL g) } // endif !GBdone } else if (!Tabsrc) { - strcpy(g->Message, MSG(SRC_TABLE_UNDEF)); + snprintf(g->Message, sizeof(g->Message), MSG(SRC_TABLE_UNDEF)); return true; } // endif @@ -587,18 +587,18 @@ bool TDBPIVOT::MakeViewColumns(PGLOBAL g) PTDBMY tdbp; if (Tdbp->GetAmType() != TYPE_AM_MYSQL) { - strcpy(g->Message, "View is not MySQL"); + snprintf(g->Message, sizeof(g->Message),"View is not MySQL"); return true; } else tdbp = (PTDBMY)Tdbp; if (!Fncol && !(Fncol = tdbp->FindFieldColumn(Picol))) { - strcpy(g->Message, MSG(NO_DEF_FNCCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_FNCCOL)); return true; } // endif Fncol if (!Picol && !(Picol = tdbp->FindFieldColumn(Fncol))) { - strcpy(g->Message, MSG(NO_DEF_PIVOTCOL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_DEF_PIVOTCOL)); return true; } // endif Picol @@ -678,7 +678,7 @@ bool TDBPIVOT::OpenDB(PGLOBAL g) /*******************************************************************/ /* Direct access of PIVOT tables is not implemented yet. */ /*******************************************************************/ - strcpy(g->Message, MSG(NO_PIV_DIR_ACC)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_PIV_DIR_ACC)); return TRUE; } // endif To_Key_Col @@ -779,7 +779,7 @@ int TDBPIVOT::ReadDB(PGLOBAL g) if (!colp && !(colp = Dcolp)) { if (!Accept) { - strcpy(g->Message, MSG(NO_MATCH_COL)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_MATCH_COL)); return RC_FX; } else continue; diff --git a/storage/connect/tabsys.cpp b/storage/connect/tabsys.cpp index 7d90b467276..9e8a7d9dbfd 100644 --- a/storage/connect/tabsys.cpp +++ b/storage/connect/tabsys.cpp @@ -84,7 +84,7 @@ bool INIDEF::DefineAM(PGLOBAL g, LPCSTR, int) PlugSetPath(p, Fn, GetPath()); Fn = p; } else { - strcpy(g->Message, MSG(MISSING_FNAME)); + snprintf(g->Message, sizeof(g->Message), MSG(MISSING_FNAME)); return true; } // endif Fn @@ -326,7 +326,7 @@ int TDBINI::DeleteDB(PGLOBAL g, int irc) break; default: if (!Section) { - strcpy(g->Message, MSG(NO_SECTION_NAME)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_SECTION_NAME)); return RC_FX; } else if (!WritePrivateProfileString(Section, NULL, NULL, Ifile)) { @@ -514,7 +514,7 @@ void INICOL::WriteColumn(PGLOBAL g) throw 31; } else if (Flag == 1) { if (tdbp->Mode == MODE_UPDATE) { - strcpy(g->Message, MSG(NO_SEC_UPDATE)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_SEC_UPDATE)); throw 31; } else if (*p) { tdbp->Section = p; @@ -523,7 +523,7 @@ void INICOL::WriteColumn(PGLOBAL g) return; } else if (!tdbp->Section) { - strcpy(g->Message, MSG(SEC_NAME_FIRST)); + snprintf(g->Message, sizeof(g->Message), MSG(SEC_NAME_FIRST)); throw 31; } // endif's @@ -752,7 +752,7 @@ int TDBXIN::DeleteDB(PGLOBAL g, int irc) } // endif } else if (!Section) { - strcpy(g->Message, MSG(NO_SECTION_NAME)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_SECTION_NAME)); return RC_FX; } else if (!WritePrivateProfileString(Section, Keycur, NULL, Ifile)) { @@ -840,7 +840,7 @@ void XINCOL::WriteColumn(PGLOBAL g) throw 31; } else if (Flag == 1) { if (tdbp->Mode == MODE_UPDATE) { - strcpy(g->Message, MSG(NO_SEC_UPDATE)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_SEC_UPDATE)); throw 31; } else if (*p) { tdbp->Section = p; @@ -850,7 +850,7 @@ void XINCOL::WriteColumn(PGLOBAL g) return; } else if (Flag == 2) { if (tdbp->Mode == MODE_UPDATE) { - strcpy(g->Message, MSG(NO_KEY_UPDATE)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_KEY_UPDATE)); throw 31; } else if (*p) { tdbp->Keycur = p; @@ -859,7 +859,7 @@ void XINCOL::WriteColumn(PGLOBAL g) return; } else if (!tdbp->Section || !tdbp->Keycur) { - strcpy(g->Message, MSG(SEC_KEY_FIRST)); + snprintf(g->Message, sizeof(g->Message), MSG(SEC_KEY_FIRST)); throw 31; } // endif's diff --git a/storage/connect/tabwmi.cpp b/storage/connect/tabwmi.cpp index 935d21c59c9..1cd46a7442c 100644 --- a/storage/connect/tabwmi.cpp +++ b/storage/connect/tabwmi.cpp @@ -6,6 +6,7 @@ #error This is a WINDOWS only table type #endif // !_WIN32 #include "my_global.h" +#include "m_string.h" #include #include "global.h" @@ -49,7 +50,7 @@ PWMIUT InitWMI(PGLOBAL g, PCSZ nsp, PCSZ classname) else if (!stricmp(nsp, "root\\cli")) classname = "Msft_CliAlias"; else { - strcpy(g->Message, "Missing class name"); + safe_strcpy(g->Message, sizeof(g->Message), "Missing class name"); return NULL; } // endif classname @@ -512,7 +513,8 @@ char *TDBWMI::MakeWQL(PGLOBAL g) ncol++; if (ncol) { - colist = (char*)PlugSubAlloc(g, NULL, (NAM_LEN + 4) * ncol); + size_t colist_sz = (NAM_LEN + 4) * ncol; + colist = (char*)PlugSubAlloc(g, NULL, colist_sz); for (colp = Columns; colp; colp = colp->GetNext()) if (!colp->IsSpecial()) { @@ -521,10 +523,13 @@ char *TDBWMI::MakeWQL(PGLOBAL g) if (colp->GetColUse(U_P | U_J_EXT) || noloc) { if (first) { - strcpy(colist, colp->GetName()); + snprintf(colist, colist_sz, colp->GetName()); first = false; - } else + } else { strcat(strcat(colist, ", "), colp->GetName()); + safe_strcat(colist, colist_sz, ", "); + safe_strcat(colist, colist_sz, colp->GetName()); + } } // endif ColUse @@ -534,18 +539,19 @@ char *TDBWMI::MakeWQL(PGLOBAL g) // ncol == 0 can occur for queries such that sql count(*) from... // for which we will count the rows from sql * from... colist = (char*)PlugSubAlloc(g, NULL, 2); - strcpy(colist, "*"); + snprintf(colist, 2, "*"); } // endif ncol // Below 14 is length of 'select ' + length of ' from ' + 1 len = (strlen(colist) + strlen(Wclass) + 14); len += (To_CondFil ? strlen(To_CondFil->Body) + 7 : 0); wql = (char*)PlugSubAlloc(g, NULL, len); - strcat(strcat(strcpy(wql, "SELECT "), colist), " FROM "); - strcat(wql, Wclass); + snprintf(wql, len, "SELECT %s FROM %s", colist, Wclass); - if (To_CondFil) - strcat(strcat(wql, " WHERE "), To_CondFil->Body); + if (To_CondFil) { + safe_strcat(wql, len, " WHERE "); + safe_strcat(wql, len, To_CondFil->Body); + } return wql; } // end of MakeWQL @@ -654,13 +660,13 @@ bool TDBWMI::OpenDB(PGLOBAL g) /*******************************************************************/ /* WMI tables cannot be modified. */ /*******************************************************************/ - strcpy(g->Message, "WMI tables are read only"); + safe_strcpy(g->Message, sizeof(g->Message), "WMI tables are read only"); return true; } // endif Mode if (!To_CondFil && !stricmp(Wclass, "CIM_Datafile") && !stricmp(Nspace, "root\\cimv2")) { - strcpy(g->Message, + safe_strcpy(g->Message, sizeof(g->Message), "Would last forever when not filtered, use DIR table instead"); return true; } else @@ -697,7 +703,7 @@ int TDBWMI::ReadDB(PGLOBAL g) /***********************************************************************/ int TDBWMI::WriteDB(PGLOBAL g) { - strcpy(g->Message, "WMI tables are read only"); + safe_strcpy(g->Message, sizeof(g->Message), "WMI tables are read only"); return RC_FX; } // end of WriteDB @@ -706,7 +712,7 @@ int TDBWMI::WriteDB(PGLOBAL g) /***********************************************************************/ int TDBWMI::DeleteDB(PGLOBAL g, int irc) { - strcpy(g->Message, "Delete not enabled for WMI tables"); + safe_strcpy(g->Message, sizeof(g->Message), "Delete not enabled for WMI tables"); return RC_FX; } // end of DeleteDB diff --git a/storage/connect/tabxml.cpp b/storage/connect/tabxml.cpp index a5957178b60..d5302759bc4 100644 --- a/storage/connect/tabxml.cpp +++ b/storage/connect/tabxml.cpp @@ -139,7 +139,7 @@ PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info) } // endif info if (GetIntegerTableOption(g, topt, "Multiple", 0)) { - strcpy(g->Message, "Cannot find column definition for multiple table"); + snprintf(g->Message, sizeof(g->Message), "Cannot find column definition for multiple table"); return NULL; } // endif Multiple @@ -151,7 +151,7 @@ PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info) fn = GetStringTableOption(g, topt, "Subtype", NULL); if (!fn) { - strcpy(g->Message, MSG(MISSING_FNAME)); + snprintf(g->Message, sizeof(g->Message), MSG(MISSING_FNAME)); return NULL; } else topt->subtype = NULL; @@ -485,12 +485,12 @@ bool XMLDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) Encoding = GetStringCatInfo(g, "Encoding", "UTF-8"); if (*Fn == '?') { - strcpy(g->Message, MSG(MISSING_FNAME)); + snprintf(g->Message, sizeof(g->Message), MSG(MISSING_FNAME)); return true; } // endif fn if ((signed)GetIntCatInfo("Flag", -1) != -1) { - strcpy(g->Message, MSG(DEPREC_FLAG)); + snprintf(g->Message, sizeof(g->Message), MSG(DEPREC_FLAG)); return true; } // endif flag @@ -569,7 +569,7 @@ PTDB XMLDEF::GetTable(PGLOBAL g, MODE m) return new(g) TDBXCT(this); if (Zipped && !(m == MODE_READ || m == MODE_ANY)) { - strcpy(g->Message, "ZIpped XML tables are read only"); + snprintf(g->Message, sizeof(g->Message), "ZIpped XML tables are read only"); return NULL; } // endif Zipped @@ -859,16 +859,16 @@ bool TDBXML::Initialize(PGLOBAL g) // Get root node if (!(Root = Docp->GetRoot(g))) { // This should never happen as load should have failed - strcpy(g->Message, MSG(EMPTY_DOC)); + snprintf(g->Message, sizeof(g->Message), MSG(EMPTY_DOC)); goto error; } // endif Root // If tabname is not an Xpath, // construct one that will find it anywhere if (!strchr(Tabname, '/')) - strcat(strcpy(tabpath, "//"), Tabname); + snprintf(tabpath, sizeof(tabpath), "//%s", Tabname); else - strcpy(tabpath, Tabname); + snprintf(tabpath, sizeof(tabpath), "%s", Tabname); // Evaluate table xpath if ((TabNode = Root->SelectSingleNode(g, tabpath))) { @@ -913,7 +913,7 @@ bool TDBXML::Initialize(PGLOBAL g) // Create the XML node if (Docp->NewDoc(g, "1.0")) { - strcpy(g->Message, MSG(NEW_DOC_FAILED)); + snprintf(g->Message, sizeof(g->Message), MSG(NEW_DOC_FAILED)); goto error; } // endif NewDoc @@ -921,7 +921,7 @@ bool TDBXML::Initialize(PGLOBAL g) To_Xb = Docp->LinkXblock(g, Mode, rc, filename); // Add a CONNECT comment node - strcpy(buf, " Created by the MariaDB CONNECT Storage Engine"); + snprintf(buf, sizeof(buf), " Created by the MariaDB CONNECT Storage Engine"); Docp->AddComment(g, buf); if (XmlDB) { @@ -934,7 +934,7 @@ bool TDBXML::Initialize(PGLOBAL g) TabNode = Root = Docp->NewRoot(g, Tabname); if (TabNode == NULL || Root == NULL) { - strcpy(g->Message, MSG(XML_INIT_ERROR)); + snprintf(g->Message, sizeof(g->Message), MSG(XML_INIT_ERROR)); goto error; } else if (SetTabNode(g)) goto error; @@ -994,7 +994,7 @@ bool TDBXML::Initialize(PGLOBAL g) #if !defined(UNIX) } catch(...) { // Other errors - strcpy(g->Message, MSG(XMLTAB_INIT_ERR)); + snprintf(g->Message, sizeof(g->Message), MSG(XMLTAB_INIT_ERR)); goto error; #endif } // end of try-catches @@ -1039,7 +1039,7 @@ bool TDBXML::SetTabNode(PGLOBAL g) TabNode->AddText(g, "\n\t"); rn = TabNode->AddChildNode(g, Rowname, NULL); } else { - strcpy(g->Message, MSG(NO_ROW_NODE)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_ROW_NODE)); return true; } // endif Rowname @@ -1295,7 +1295,7 @@ bool TDBXML::CheckRow(PGLOBAL g, bool b) TabNode->AddText(g, "\n\t"); RowNode = TabNode->AddChildNode(g, Rowname, RowNode); } else { - strcpy(g->Message, MSG(NO_ROW_NODE)); + snprintf(g->Message, sizeof(g->Message), MSG(NO_ROW_NODE)); return true; } // endif Rowname } @@ -1552,7 +1552,7 @@ bool XMLCOL::ParseXpath(PGLOBAL g, bool mode) if (Tdbp->Mulnode && !strncmp(p, Tdbp->Mulnode, p2 - p)) { if (!Tdbp->Xpand && mode) { - strcpy(g->Message, MSG(CONCAT_SUBNODE)); + snprintf(g->Message, sizeof(g->Message), MSG(CONCAT_SUBNODE)); return true; } else Inod = i; // Index of multiple node @@ -1845,7 +1845,7 @@ void XMLCOL::WriteColumn(PGLOBAL g) } // endfor k if (ColNode == NULL) { - strcpy(g->Message, MSG(COL_ALLOC_ERR)); + snprintf(g->Message, sizeof(g->Message), MSG(COL_ALLOC_ERR)); throw (int)TYPE_AM_XML; } // endif ColNode @@ -1864,7 +1864,7 @@ void XMLCOL::WriteColumn(PGLOBAL g) AttNode = ColNode->AddProperty(g, Xname, Vxap); if (ValNode == NULL && AttNode == NULL) { - strcpy(g->Message, MSG(VAL_ALLOC_ERR)); + snprintf(g->Message, sizeof(g->Message), MSG(VAL_ALLOC_ERR)); throw (int)TYPE_AM_XML; } // endif ValNode @@ -2106,7 +2106,7 @@ void XMULCOL::WriteColumn(PGLOBAL g) } // endfor k if (ColNode == NULL) { - strcpy(g->Message, MSG(COL_ALLOC_ERR)); + snprintf(g->Message, sizeof(g->Message), MSG(COL_ALLOC_ERR)); throw (int)TYPE_AM_XML; } // endif ColNode @@ -2125,7 +2125,7 @@ void XMULCOL::WriteColumn(PGLOBAL g) AttNode = ColNode->AddProperty(g, Xname, Vxap); if (ValNode == NULL && AttNode == NULL) { - strcpy(g->Message, MSG(VAL_ALLOC_ERR)); + snprintf(g->Message, sizeof(g->Message), MSG(VAL_ALLOC_ERR)); throw (int)TYPE_AM_XML; } // endif ValNode @@ -2167,7 +2167,7 @@ void XPOSCOL::ReadColumn(PGLOBAL g) return; // Same row than the last read if (Tdbp->Clist == NULL) { - strcpy(g->Message, MSG(MIS_TAG_LIST)); + snprintf(g->Message, sizeof(g->Message), MSG(MIS_TAG_LIST)); throw (int)TYPE_AM_XML; } // endif Clist @@ -2237,7 +2237,7 @@ void XPOSCOL::WriteColumn(PGLOBAL g) /* Find the column and value nodes to update or insert. */ /*********************************************************************/ if (Tdbp->Clist == NULL) { - strcpy(g->Message, MSG(MIS_TAG_LIST)); + snprintf(g->Message, sizeof(g->Message), MSG(MIS_TAG_LIST)); throw (int)TYPE_AM_XML; } // endif Clist diff --git a/storage/connect/value.cpp b/storage/connect/value.cpp index 7265b2ed0ca..344b0dea50f 100644 --- a/storage/connect/value.cpp +++ b/storage/connect/value.cpp @@ -59,7 +59,7 @@ #if defined(_DEBUG) #define CheckType(V) if (Type != V->GetType()) { \ PGLOBAL& g = Global; \ - strcpy(g->Message, MSG(VALTYPE_NOMATCH)); \ + snprintf(g->Message, sizeof(g->Message), MSG(VALTYPE_NOMATCH)); \ throw Type; #else #define CheckType(V) @@ -556,7 +556,7 @@ BYTE VALUE::TestValue(PVAL vp) /***********************************************************************/ bool VALUE::Compute(PGLOBAL g, PVAL *, int, OPVAL) { - strcpy(g->Message, "Compute not implemented for this value type"); + snprintf(g->Message, sizeof(g->Message), "Compute not implemented for this value type"); return true; } // end of Compute @@ -1051,11 +1051,11 @@ TYPE TYPVAL::SafeAdd(TYPE n1, TYPE n2) if ((n2 > 0) && (n < n1)) { // Overflow - strcpy(g->Message, MSG(FIX_OVFLW_ADD)); + snprintf(g->Message, sizeof(g->Message), MSG(FIX_OVFLW_ADD)); throw 138; } else if ((n2 < 0) && (n > n1)) { // Underflow - strcpy(g->Message, MSG(FIX_UNFLW_ADD)); + snprintf(g->Message, sizeof(g->Message), MSG(FIX_UNFLW_ADD)); throw 138; } // endif's n2 @@ -1079,11 +1079,11 @@ TYPE TYPVAL::SafeMult(TYPE n1, TYPE n2) if (n > MinMaxVal(true)) { // Overflow - strcpy(g->Message, MSG(FIX_OVFLW_TIMES)); + snprintf(g->Message, sizeof(g->Message), MSG(FIX_OVFLW_TIMES)); throw 138; } else if (n < MinMaxVal(false)) { // Underflow - strcpy(g->Message, MSG(FIX_UNFLW_TIMES)); + snprintf(g->Message, sizeof(g->Message), MSG(FIX_UNFLW_TIMES)); throw 138; } // endif's n2 @@ -1119,7 +1119,7 @@ bool TYPVAL::Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op) break; case OP_DIV: if (!val[1]) { - strcpy(g->Message, MSG(ZERO_DIVIDE)); + snprintf(g->Message, sizeof(g->Message),MSG(ZERO_DIVIDE)); return true; } // endif @@ -1173,7 +1173,7 @@ bool TYPVAL::Compall(PGLOBAL g, PVAL *vp, int np, OPVAL op) case OP_DIV: if (val[0]) { if (!val[1]) { - strcpy(g->Message, MSG(ZERO_DIVIDE)); + snprintf(g->Message, sizeof(g->Message), MSG(ZERO_DIVIDE)); return true; } // endif @@ -1190,7 +1190,7 @@ bool TYPVAL::Compall(PGLOBAL g, PVAL *vp, int np, OPVAL op) break; default: // snprintf(g->Message, sizeof(g->Message), MSG(BAD_EXP_OPER), op); - strcpy(g->Message, "Function not supported"); + snprintf(g->Message, sizeof(g->Message), "Function not supported"); return true; } // endswitch op @@ -1701,7 +1701,7 @@ bool TYPVAL::Compute(PGLOBAL g, PVAL *vp, int np, OPVAL op) break; default: // snprintf(g->Message, sizeof(g->Message), MSG(BAD_EXP_OPER), op); - strcpy(g->Message, "Function not supported"); + snprintf(g->Message, sizeof(g->Message), "Function not supported"); return true; } // endswitch op @@ -2616,7 +2616,7 @@ bool DTVAL::MakeDate(PGLOBAL g, int *val, int nval) if (MakeTime(&datm)) { if (g) { - strcpy(g->Message, MSG(BAD_DATETIME)); + snprintf(g->Message, sizeof(g->Message), MSG(BAD_DATETIME)); rc = true; } else Tval = 0; diff --git a/storage/connect/xindex.cpp b/storage/connect/xindex.cpp index 4bcbbfd4235..471339a7126 100644 --- a/storage/connect/xindex.cpp +++ b/storage/connect/xindex.cpp @@ -45,6 +45,7 @@ //nclude "array.h" #include "filamtxt.h" #include "tabdos.h" +#include "m_string.h" #if defined(VCT_SUPPORT) #include "tabvct.h" #endif // VCT_SUPPORT @@ -857,7 +858,8 @@ bool XINDEX::SaveIndex(PGLOBAL g, PIXDEF sxp) char fname[_MAX_FNAME]; _splitpath(defp->GetOfn(), drive, direc, fname, NULL); - strcat(strcat(fname, "_"), Xdp->GetName()); + safe_strcat(fname, sizeof(fname), "_"); + safe_strcat(fname, sizeof(fname), Xdp->GetName()); _makepath(fn, drive, direc, fname, ftype); sxp = NULL; } else { @@ -1011,7 +1013,8 @@ bool XINDEX::Init(PGLOBAL g) char fname[_MAX_FNAME]; _splitpath(defp->GetOfn(), drive, direc, fname, NULL); - strcat(strcat(fname, "_"), Xdp->GetName()); + safe_strcat(fname, sizeof(fname), "_"); + safe_strcat(fname, sizeof(fname), Xdp->GetName()); _makepath(fn, drive, direc, fname, ftype); } else { id = ID; @@ -1264,7 +1267,8 @@ bool XINDEX::MapInit(PGLOBAL g) char fname[_MAX_FNAME]; _splitpath(defp->GetOfn(), drive, direc, fname, NULL); - strcat(strcat(fname, "_"), Xdp->GetName()); + safe_strcat(fname, sizeof(fname), "_"); + safe_strcat(fname, sizeof(fname), Xdp->GetName()); _makepath(fn, drive, direc, fname, ftype); } else { id = ID; @@ -1479,7 +1483,8 @@ bool XINDEX::GetAllSizes(PGLOBAL g,/* int &ndif,*/ int &numk) char fname[_MAX_FNAME]; _splitpath(defp->GetOfn(), drive, direc, fname, NULL); - strcat(strcat(fname, "_"), Xdp->GetName()); + safe_strcat(fname, sizeof(fname), "_"); + safe_strcat(fname, sizeof(fname), Xdp->GetName()); _makepath(fn, drive, direc, fname, ftype); } else { id = ID; diff --git a/storage/innobase/btr/btr0cur.cc b/storage/innobase/btr/btr0cur.cc index a4dd5061381..b70cfaaa67a 100644 --- a/storage/innobase/btr/btr0cur.cc +++ b/storage/innobase/btr/btr0cur.cc @@ -845,10 +845,13 @@ static ulint btr_node_ptr_max_size(const dict_index_t* index) break; } /* fall through */ + case DATA_FIXBINARY: + case DATA_BINARY: case DATA_VARMYSQL: case DATA_CHAR: case DATA_MYSQL: - /* CHAR(0) and VARCHAR(0) are possible + /* BINARY(0), VARBINARY(0), + CHAR(0) and VARCHAR(0) are possible data type definitions in MariaDB. The InnoDB internal SQL parser maps CHAR to DATA_VARCHAR, so DATA_CHAR (or diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 32b40c58a9b..bd0c0d372f6 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -275,11 +275,14 @@ buf_flush_relocate_on_flush_list( } /** Note that a block is no longer dirty, while not removing -it from buf_pool.flush_list */ -inline void buf_page_t::write_complete(bool temporary) +it from buf_pool.flush_list +@param temporary whether the page belongs to the temporary tablespace +@param error whether an error may have occurred while writing */ +inline void buf_page_t::write_complete(bool temporary, bool error) { ut_ad(temporary == fsp_is_system_temporary(id().space())); - if (temporary) + if (UNIV_UNLIKELY(error)); + else if (temporary) { ut_ad(oldest_modification() == 2); oldest_modification_= 0; @@ -316,8 +319,9 @@ inline void buf_pool_t::n_flush_dec() } /** Complete write of a file page from buf_pool. -@param request write request */ -void buf_page_write_complete(const IORequest &request) +@param request write request +@param error whether the write may have failed */ +void buf_page_write_complete(const IORequest &request, bool error) { ut_ad(request.is_write()); ut_ad(!srv_read_only_mode); @@ -350,8 +354,9 @@ void buf_page_write_complete(const IORequest &request) /* We must hold buf_pool.mutex while releasing the block, so that no other thread can access it before we have freed it. */ mysql_mutex_lock(&buf_pool.mutex); - bpage->write_complete(temp); - buf_LRU_free_page(bpage, true); + bpage->write_complete(temp, error); + if (!error) + buf_LRU_free_page(bpage, true); mysql_mutex_unlock(&buf_pool.mutex); buf_pool.n_flush_dec(); @@ -361,7 +366,7 @@ void buf_page_write_complete(const IORequest &request) if (state < buf_page_t::WRITE_FIX_REINIT && request.node->space->use_doublewrite()) buf_dblwr.write_completed(); - bpage->write_complete(false); + bpage->write_complete(false, error); } } diff --git a/storage/innobase/buf/buf0lru.cc b/storage/innobase/buf/buf0lru.cc index 8a25e9c5266..a608e831608 100644 --- a/storage/innobase/buf/buf0lru.cc +++ b/storage/innobase/buf/buf0lru.cc @@ -849,7 +849,13 @@ relocate_compressed: mysql_mutex_lock(&buf_pool.flush_list_mutex); new (b) buf_page_t(*bpage); b->frame = nullptr; - b->set_state(buf_page_t::UNFIXED + 1); + { + ut_d(uint32_t s=) b->fix(); + ut_ad(s == buf_page_t::FREED + || s == buf_page_t::UNFIXED + || s == buf_page_t::IBUF_EXIST + || s == buf_page_t::REINIT); + } break; default: if (zip || !bpage->zip.data || !bpage->frame) { diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index d7c810d69ff..e8ae0dc107d 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -2789,7 +2789,7 @@ func_exit: #include -void IORequest::write_complete() const +void IORequest::write_complete(int io_error) const { ut_ad(fil_validate_skip()); ut_ad(node); @@ -2804,13 +2804,13 @@ void IORequest::write_complete() const ut_ad(type == IORequest::WRITE_ASYNC); } else - buf_page_write_complete(*this); + buf_page_write_complete(*this, io_error); node->complete_write(); node->space->release(); } -void IORequest::read_complete() const +void IORequest::read_complete(int io_error) const { ut_ad(fil_validate_skip()); ut_ad(node); @@ -2823,18 +2823,25 @@ void IORequest::read_complete() const and never issue asynchronous reads of change buffer pages. */ const page_id_t id(bpage->id()); - if (dberr_t err= bpage->read_complete(*node)) + if (UNIV_UNLIKELY(io_error != 0)) { + sql_print_error("InnoDB: Read error %d of page " UINT32PF " in file %s", + io_error, id.page_no(), node->name); + buf_pool.corrupted_evict(bpage, buf_page_t::READ_FIX); + corrupted: if (recv_recovery_is_on() && !srv_force_recovery) { mysql_mutex_lock(&recv_sys.mutex); recv_sys.set_corrupt_fs(); mysql_mutex_unlock(&recv_sys.mutex); } - + } + else if (dberr_t err= bpage->read_complete(*node)) + { if (err != DB_FAIL) ib::error() << "Failed to read page " << id.page_no() << " from file '" << node->name << "': " << err; + goto corrupted; } node->space->release(); diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 57ba0fac255..afdb88e0bcb 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -8107,6 +8107,10 @@ calc_row_difference( trx_t* const trx = prebuilt->trx; doc_id_t doc_id = FTS_NULL_DOC_ID; uint16_t num_v = 0; +#ifndef DBUG_OFF + uint vers_fields = 0; +#endif + prebuilt->versioned_write = table->versioned_write(VERS_TRX_ID); const bool skip_virtual = ha_innobase::omits_virtual_cols(*table->s); ut_ad(!srv_read_only_mode); @@ -8119,6 +8123,14 @@ calc_row_difference( for (uint i = 0; i < table->s->fields; i++) { field = table->field[i]; + +#ifndef DBUG_OFF + if (!field->vers_sys_field() + && !field->vers_update_unversioned()) { + ++vers_fields; + } +#endif + const bool is_virtual = !field->stored_in_db(); if (is_virtual && skip_virtual) { num_v++; @@ -8436,6 +8448,21 @@ calc_row_difference( ut_a(buf <= (byte*) original_upd_buff + buff_len); + const TABLE_LIST *tl= table->pos_in_table_list; + const uint8 op_map= tl->trg_event_map | tl->slave_fk_event_map; + /* Used to avoid reading history in FK check on DELETE (see MDEV-16210). */ + prebuilt->upd_node->is_delete = + (op_map & trg2bit(TRG_EVENT_DELETE) + && table->versioned(VERS_TIMESTAMP)) + ? VERSIONED_DELETE : NO_DELETE; + + if (prebuilt->versioned_write) { + /* Guaranteed by CREATE TABLE, but anyway we make sure we + generate history only when there are versioned fields. */ + DBUG_ASSERT(vers_fields); + prebuilt->upd_node->vers_make_update(trx); + } + ut_ad(uvect->validate()); return(DB_SUCCESS); } @@ -8614,45 +8641,23 @@ ha_innobase::update_row( MySQL that the row is not really updated and it should not increase the count of updated rows. This is fix for http://bugs.mysql.com/29157 */ - if (m_prebuilt->versioned_write - && thd_sql_command(m_user_thd) != SQLCOM_ALTER_TABLE - /* Multiple UPDATE of same rows in single transaction create - historical rows only once. */ - && trx->id != table->vers_start_id()) { - error = row_insert_for_mysql((byte*) old_row, - m_prebuilt, - ROW_INS_HISTORICAL); - if (error != DB_SUCCESS) { - goto func_exit; - } - } DBUG_RETURN(HA_ERR_RECORD_IS_THE_SAME); } else { - const bool vers_set_fields = m_prebuilt->versioned_write - && m_prebuilt->upd_node->update->affects_versioned(); - const bool vers_ins_row = vers_set_fields - && thd_sql_command(m_user_thd) != SQLCOM_ALTER_TABLE; - - TABLE_LIST *tl= table->pos_in_table_list; - uint8 op_map= tl->trg_event_map | tl->slave_fk_event_map; - /* This is not a delete */ - m_prebuilt->upd_node->is_delete = - (vers_set_fields && !vers_ins_row) || - (op_map & trg2bit(TRG_EVENT_DELETE) && - table->versioned(VERS_TIMESTAMP)) - ? VERSIONED_DELETE - : NO_DELETE; - if (m_prebuilt->upd_node->is_delete) { trx->fts_next_doc_id = 0; } + /* row_start was updated by vers_make_update() + in calc_row_difference() */ error = row_update_for_mysql(m_prebuilt); - if (error == DB_SUCCESS && vers_ins_row + if (error == DB_SUCCESS && m_prebuilt->versioned_write /* Multiple UPDATE of same rows in single transaction create historical rows only once. */ && trx->id != table->vers_start_id()) { + /* UPDATE is not used by ALTER TABLE. Just precaution + as we don't need history generation for ALTER TABLE. */ + ut_ad(thd_sql_command(m_user_thd) != SQLCOM_ALTER_TABLE); error = row_insert_for_mysql((byte*) old_row, m_prebuilt, ROW_INS_HISTORICAL); @@ -12380,7 +12385,7 @@ create_table_info_t::create_foreign_keys() } while (Key* key = key_it++) { - if (key->type != Key::FOREIGN_KEY) + if (key->type != Key::FOREIGN_KEY || key->old) continue; if (tmp_table) { diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc index 1cffeb6230a..b725522e397 100644 --- a/storage/innobase/handler/handler0alter.cc +++ b/storage/innobase/handler/handler0alter.cc @@ -3208,7 +3208,7 @@ innobase_get_foreign_key_info( *n_add_fk = 0; for (Key& key : alter_info->key_list) { - if (key.type != Key::FOREIGN_KEY) { + if (key.type != Key::FOREIGN_KEY || key.old) { continue; } @@ -7742,6 +7742,71 @@ static bool alter_templ_needs_rebuild(const TABLE* altered_table, const Alter_inplace_info* ha_alter_info, const dict_table_t* table); +/** Check whether the column is present in table foreign key +relations. +@param table table which has foreign key relation +@param col column to be checked +@param col_name column name to be display during error +@param drop_fk Drop foreign key constraint +@param n_drop_fk number of drop foreign keys +@param add_fk Newly added foreign key constraint +@param n_add_fk number of newly added foreign constraint */ +static +bool check_col_is_in_fk_indexes( + const dict_table_t *table, const dict_col_t *col, + const char* col_name, + span drop_fk, + span add_fk) +{ + char *fk_id= nullptr; + + for (dict_foreign_set::iterator it= table->foreign_set.begin(); + it!= table->foreign_set.end();) + { + if (std::find(drop_fk.begin(), drop_fk.end(), (*it)) + != drop_fk.end()) + goto next_item; + for (ulint i= 0; i < (*it)->n_fields; i++) + if ((*it)->foreign_index->fields[i].col == col) + { + fk_id= (*it)->id; + goto err_exit; + } +next_item: + it++; + } + + for (const auto &a : add_fk) + { + for (ulint i= 0; i < a->n_fields; i++) + { + if (a->foreign_index->fields[i].col == col) + { + fk_id= a->id; + goto err_exit; + } + } + } + + for (const auto &f : table->referenced_set) + { + for (ulint i= 0; i < f->n_fields; i++) + { + if (f->referenced_index->fields[i].col == col) + { + my_error(ER_FK_COLUMN_CANNOT_CHANGE_CHILD, MYF(0), + col_name, f->id, f->foreign_table_name); + return true; + } + } + } + return false; +err_exit: + my_error(ER_FK_COLUMN_CANNOT_CHANGE, MYF(0), col_name, + fk_id ? fk_id : + (std::string(table->name.m_name) + "_ibfk_0").c_str()); + return true; +} /** Allows InnoDB to update internal structures with concurrent writes blocked (provided that check_if_supported_inplace_alter() @@ -7767,7 +7832,7 @@ ha_innobase::prepare_inplace_alter_table( dict_foreign_t**drop_fk; /*!< Foreign key constraints to drop */ ulint n_drop_fk; /*!< Number of foreign keys to drop */ dict_foreign_t**add_fk = NULL; /*!< Foreign key constraints to drop */ - ulint n_add_fk; /*!< Number of foreign keys to drop */ + ulint n_add_fk= 0; /*!< Number of foreign keys to drop */ dict_table_t* indexed_table; /*!< Table where indexes are created */ mem_heap_t* heap; const char** col_names; @@ -8285,8 +8350,6 @@ check_if_can_drop_indexes: } } - n_add_fk = 0; - if (ha_alter_info->handler_flags & ALTER_ADD_FOREIGN_KEY) { ut_ad(!m_prebuilt->trx->check_foreigns); @@ -8320,6 +8383,12 @@ err_exit: m_prebuilt->trx); } + for (uint i = 0; i < n_add_fk; i++) { + if (add_fk[i]) { + dict_foreign_free(add_fk[i]); + } + } + if (heap) { mem_heap_free(heap); } @@ -8338,6 +8407,33 @@ err_exit: } } + /** Alter shouldn't support if the foreign and referenced + index columns are modified */ + if (ha_alter_info->handler_flags + & ALTER_COLUMN_TYPE_CHANGE_BY_ENGINE) { + List_iterator it( + ha_alter_info->alter_info->create_list); + for (uint i = 0; i < table->s->fields; i++) { + Field* field = table->field[i]; + Create_field *f= it++; + if (!f->field || field->is_equal(*f)) + continue; + + const char* col_name= field->field_name.str; + dict_col_t *col= dict_table_get_nth_col( + m_prebuilt->table, i); + if (check_col_is_in_fk_indexes( + m_prebuilt->table, col, col_name, + span( + const_cast( + drop_fk), n_drop_fk), + span( + const_cast( + add_fk), n_add_fk))) + goto err_exit; + } + } + if (ha_alter_info->handler_flags & ALTER_RENAME_INDEX) { for (const Alter_inplace_info::Rename_key_pair& pair : ha_alter_info->rename_keys) { diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index 6d3ec65b1d3..333e22dc1d0 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -774,8 +774,10 @@ public: dberr_t read_complete(const fil_node_t &node); /** Note that a block is no longer dirty, while not removing - it from buf_pool.flush_list */ - inline void write_complete(bool temporary); + it from buf_pool.flush_list + @param temporary whether the page belongs to the temporary tablespace + @param error whether an error may have occurred while writing */ + inline void write_complete(bool temporary, bool error); /** Write a flushable page to a file or free a freeable block. @param evict whether to evict the page on write completion diff --git a/storage/innobase/include/buf0flu.h b/storage/innobase/include/buf0flu.h index 31fe4446681..0cce514b2d2 100644 --- a/storage/innobase/include/buf0flu.h +++ b/storage/innobase/include/buf0flu.h @@ -58,8 +58,9 @@ buf_flush_relocate_on_flush_list( buf_page_t* dpage); /*!< in/out: destination block */ /** Complete write of a file page from buf_pool. -@param request write request */ -void buf_page_write_complete(const IORequest &request); +@param request write request +@param error whether the write may have failed */ +void buf_page_write_complete(const IORequest &request, bool error); /** Assign the full crc32 checksum for non-compressed page. @param[in,out] page page to be updated */ diff --git a/storage/innobase/include/lock0types.h b/storage/innobase/include/lock0types.h index dc57a31c5f8..995fd273481 100644 --- a/storage/innobase/include/lock0types.h +++ b/storage/innobase/include/lock0types.h @@ -145,6 +145,25 @@ operator<<(std::ostream& out, const lock_rec_t& lock) #endif /* @} */ +/** +Checks if the `mode` is LOCK_S or LOCK_X (possibly ORed with LOCK_WAIT or +LOCK_REC) which means the lock is a +Next Key Lock, a.k.a. LOCK_ORDINARY, as opposed to Predicate Lock, +GAP lock, Insert Intention or Record Lock. +@param mode A mode and flags, of a lock. +@return true if the only bits set in `mode` are LOCK_S or LOCK_X and optionally +LOCK_WAIT or LOCK_REC */ +static inline bool lock_mode_is_next_key_lock(ulint mode) +{ + static_assert(LOCK_ORDINARY == 0, "LOCK_ORDINARY must be 0 (no flags)"); + ut_ad((mode & LOCK_TABLE) == 0); + mode&= ~LOCK_WAIT; + ut_ad((mode & LOCK_WAIT) == 0); + ut_ad(((mode & ~(LOCK_MODE_MASK)) == LOCK_ORDINARY) == + (mode == LOCK_S || mode == LOCK_X)); + return (mode & ~(LOCK_MODE_MASK)) == LOCK_ORDINARY; +} + /** Lock struct; protected by lock_sys.latch */ struct ib_lock_t { @@ -194,6 +213,13 @@ struct ib_lock_t return(type_mode & LOCK_REC_NOT_GAP); } + /** @return true if the lock is a Next Key Lock */ + bool is_next_key_lock() const + { + return !(type_mode & LOCK_TABLE) && + lock_mode_is_next_key_lock(type_mode); + } + bool is_insert_intention() const { return(type_mode & LOCK_INSERT_INTENTION); diff --git a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h index 54f7ceeb4c0..c9db6a1fb09 100644 --- a/storage/innobase/include/os0file.h +++ b/storage/innobase/include/os0file.h @@ -212,8 +212,8 @@ public: bool is_LRU() const { return (type & (WRITE_LRU ^ WRITE_ASYNC)) != 0; } bool is_async() const { return (type & (READ_SYNC ^ READ_ASYNC)) != 0; } - void write_complete() const; - void read_complete() const; + void write_complete(int io_error) const; + void read_complete(int io_error) const; void fake_read_complete(os_offset_t offset) const; /** If requested, free storage space associated with a section of the file. diff --git a/storage/innobase/include/trx0sys.h b/storage/innobase/include/trx0sys.h index 4ac33a37ecd..0398e8da791 100644 --- a/storage/innobase/include/trx0sys.h +++ b/storage/innobase/include/trx0sys.h @@ -625,9 +625,21 @@ public: sizeof(trx_id_t))); if (element) { + /* rw_trx_hash_t::erase() sets element->trx to nullptr under + element->mutex protection before removing the element from hash table. + If the element was removed before the mutex acquisition, element->trx + will be equal to nullptr. */ + DEBUG_SYNC_C("before_trx_hash_find_element_mutex_enter"); element->mutex.wr_lock(); + /* element_trx can't point to reused object now. If transaction was + deregistered before element->mutex acquisition, element->trx is nullptr. + It can't be deregistered while element->mutex is held. */ + trx_t *element_trx = element->trx; lf_hash_search_unpin(pins); - if ((trx= element->trx)) { + /* The *element can be reused now, as element->trx value is stored + locally in element_trx. */ + DEBUG_SYNC_C("after_trx_hash_find_element_mutex_enter"); + if ((trx= element_trx)) { DBUG_ASSERT(trx_id == trx->id); ut_d(validate_element(trx)); if (do_ref_count) @@ -640,12 +652,19 @@ public: trx->mutex is released, and it will have to be rechecked by the caller after reacquiring the mutex. */ + /* trx_t::commit_in_memory() sets the state to + TRX_STATE_COMMITTED_IN_MEMORY before deregistering the transaction. + It also waits for any implicit-to-explicit lock conversions to cease + after deregistering. */ if (trx->state == TRX_STATE_COMMITTED_IN_MEMORY) trx= nullptr; else trx->reference(); } } + /* element's lifetime is equal to the hash lifetime, that's why + element->mutex is valid here despite the element is unpinned. In the + worst case some thread will wait for element->mutex releasing. */ element->mutex.wr_unlock(); } if (!caller_trx) diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index 6a7e4a2843e..0bb14f5fcf7 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -1368,7 +1368,7 @@ which does NOT check for deadlocks or lock compatibility! @param[in,out] trx transaction @param[in] caller_owns_trx_mutex TRUE if caller owns the transaction mutex */ TRANSACTIONAL_TARGET -static void lock_rec_add_to_queue(unsigned type_mode, hash_cell_t &cell, +static void lock_rec_add_to_queue(unsigned type_mode, const hash_cell_t &cell, const page_id_t id, const page_t *page, ulint heap_no, dict_index_t *index, trx_t *trx, bool caller_owns_trx_mutex) @@ -1469,6 +1469,51 @@ create: caller_owns_trx_mutex); } +/** A helper function for lock_rec_lock_slow(), which grants a Next Key Lock +(either LOCK_X or LOCK_S as specified by `mode`) on <`block`,`heap_no`> in the +`index` to the `trx`, assuming that it already has a granted `held_lock`, which +is at least as strong as mode|LOCK_REC_NOT_GAP. It does so by either reusing the +lock if it already covers the gap, or by ensuring a separate GAP Lock, which in +combination with Record Lock satisfies the request. +@param[in] held_lock a lock granted to `trx` which is at least as strong + as mode|LOCK_REC_NOT_GAP +@param[in] mode requested lock mode: LOCK_X or LOCK_S +@param[in] cell lock hash table cell +@param[in] id page identifier +@param[in] page buffer block containing the record +@param[in] heap_no heap number of the record to be locked +@param[in] index index of record to be locked +@param[in] trx the transaction requesting the Next Key Lock */ +static void lock_reuse_for_next_key_lock(const lock_t *held_lock, + unsigned mode, + const hash_cell_t &cell, + const page_id_t id, + const page_t *page, ulint heap_no, + dict_index_t *index, trx_t *trx) +{ + ut_ad(trx->mutex_is_owner()); + ut_ad(mode == LOCK_S || mode == LOCK_X); + ut_ad(lock_mode_is_next_key_lock(mode)); + + if (!held_lock->is_record_not_gap()) + { + ut_ad(held_lock->is_next_key_lock()); + return; + } + + /* We have a Record Lock granted, so we only need a GAP Lock. We assume + that GAP Locks do not conflict with anything. Therefore a GAP Lock + could be granted to us right now if we've requested: */ + mode|= LOCK_GAP; + ut_ad(nullptr == + lock_rec_other_has_conflicting(mode, cell, id, heap_no, trx)); + + /* It might be the case we already have one, so we first check that. */ + if (lock_rec_has_expl(mode, cell, id, heap_no, trx) == nullptr) + lock_rec_add_to_queue(mode, cell, id, page, heap_no, index, trx, true); +} + + /*********************************************************************//** Tries to lock the specified record in the mode requested. If not immediately possible, enqueues a waiting lock request. This is a low-level function @@ -1537,8 +1582,17 @@ lock_rec_lock( lock->type_mode != mode || lock_rec_get_n_bits(lock) <= heap_no) { + + unsigned checked_mode= (heap_no != PAGE_HEAP_NO_SUPREMUM && + lock_mode_is_next_key_lock(mode)) + ? mode | LOCK_REC_NOT_GAP + : mode; + + const lock_t *held_lock= + lock_rec_has_expl(checked_mode, g.cell(), id, heap_no, trx); + /* Do nothing if the trx already has a strong enough lock on rec */ - if (!lock_rec_has_expl(mode, g.cell(), id, heap_no, trx)) + if (!held_lock) { if (lock_t *c_lock= lock_rec_other_has_conflicting(mode, g.cell(), id, heap_no, trx)) @@ -1558,6 +1612,16 @@ lock_rec_lock( err= DB_SUCCESS_LOCKED_REC; } } + /* If checked_mode == mode, trx already has a strong enough lock on rec */ + else if (checked_mode != mode) + { + /* As check_mode != mode, the mode is Next Key Lock, which can not be + emulated by implicit lock (which are LOCK_REC_NOT_GAP only). */ + ut_ad(!impl); + + lock_reuse_for_next_key_lock(held_lock, mode, g.cell(), id, + block->page.frame, heap_no, index, trx); + } } else if (!impl) { @@ -5568,6 +5632,8 @@ lock_sec_rec_read_check_and_lock( ut_ad(lock_rec_queue_validate(false, block->page.id(), rec, index, offsets)); + DEBUG_SYNC_C("lock_sec_rec_read_check_and_lock_has_locked"); + return(err); } diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index f078a98acca..7310bc5b3f7 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -3785,25 +3785,51 @@ inline fil_space_t *fil_system_t::find(const char *path) const /** Thread-safe function which sorts flush_list by oldest_modification */ static void log_sort_flush_list() { - mysql_mutex_lock(&buf_pool.flush_list_mutex); + /* Ensure that oldest_modification() cannot change during std::sort() */ + for (;;) + { + os_aio_wait_until_no_pending_writes(false); + mysql_mutex_lock(&buf_pool.flush_list_mutex); + if (buf_pool.flush_list_active()) + my_cond_wait(&buf_pool.done_flush_list, + &buf_pool.flush_list_mutex.m_mutex); + else if (!os_aio_pending_writes()) + break; + mysql_mutex_unlock(&buf_pool.flush_list_mutex); + } const size_t size= UT_LIST_GET_LEN(buf_pool.flush_list); std::unique_ptr list(new buf_page_t *[size]); + /* Copy the dirty blocks from buf_pool.flush_list to an array for sorting. */ size_t idx= 0; - for (buf_page_t *p= UT_LIST_GET_FIRST(buf_pool.flush_list); p; - p= UT_LIST_GET_NEXT(list, p)) - list.get()[idx++]= p; + for (buf_page_t *p= UT_LIST_GET_FIRST(buf_pool.flush_list); p; ) + { + const lsn_t lsn{p->oldest_modification()}; + ut_ad(lsn > 2 || lsn == 1); + buf_page_t *n= UT_LIST_GET_NEXT(list, p); + if (lsn > 1) + list.get()[idx++]= p; + else + buf_pool.delete_from_flush_list(p); + p= n; + } - std::sort(list.get(), list.get() + size, + std::sort(list.get(), list.get() + idx, [](const buf_page_t *lhs, const buf_page_t *rhs) { - return rhs->oldest_modification() < lhs->oldest_modification(); + const lsn_t l{lhs->oldest_modification()}; + const lsn_t r{rhs->oldest_modification()}; + DBUG_ASSERT(l > 2); DBUG_ASSERT(r > 2); + return r < l; }); UT_LIST_INIT(buf_pool.flush_list, &buf_page_t::list); - for (size_t i= 0; i < size; i++) + for (size_t i= 0; i < idx; i++) + { UT_LIST_ADD_LAST(buf_pool.flush_list, list[i]); + DBUG_ASSERT(list[i]->oldest_modification() > 2); + } mysql_mutex_unlock(&buf_pool.flush_list_mutex); } diff --git a/storage/innobase/os/os0file.cc b/storage/innobase/os/os0file.cc index 217cf153b59..69a1d8f433d 100644 --- a/storage/innobase/os/os0file.cc +++ b/storage/innobase/os/os0file.cc @@ -3411,21 +3411,6 @@ os_file_get_status( return(ret); } -static void io_callback_errorcheck(const tpool::aiocb *cb) -{ - if (cb->m_err != DB_SUCCESS) - { - const IORequest &request= *static_cast - (static_cast(cb->m_userdata)); - ib::fatal() << "IO Error: " << cb->m_err << " during " << - (request.is_async() ? "async " : "sync ") << - (request.is_LRU() ? "lru " : "") << - (cb->m_opcode == tpool::aio_opcode::AIO_PREAD ? "read" : "write") << - " of " << cb->m_len << " bytes, for file " << cb->m_fh << ", returned " << - cb->m_ret_len; - } -} - static void fake_io_callback(void *c) { tpool::aiocb *cb= static_cast(c); @@ -3439,10 +3424,10 @@ static void read_io_callback(void *c) { tpool::aiocb *cb= static_cast(c); ut_ad(cb->m_opcode == tpool::aio_opcode::AIO_PREAD); - io_callback_errorcheck(cb); ut_ad(read_slots->contains(cb)); - static_cast - (static_cast(cb->m_userdata))->read_complete(); + const IORequest &request= *static_cast + (static_cast(cb->m_userdata)); + request.read_complete(cb->m_err); read_slots->release(cb); } @@ -3451,8 +3436,17 @@ static void write_io_callback(void *c) tpool::aiocb *cb= static_cast(c); ut_ad(cb->m_opcode == tpool::aio_opcode::AIO_PWRITE); ut_ad(write_slots->contains(cb)); - static_cast - (static_cast(cb->m_userdata))->write_complete(); + const IORequest &request= *static_cast + (static_cast(cb->m_userdata)); + + if (UNIV_UNLIKELY(cb->m_err != 0)) + ib::info () << "IO Error: " << cb->m_err + << "during write of " + << cb->m_len << " bytes, for file " + << request.node->name << "(" << cb->m_fh << "), returned " + << cb->m_ret_len; + + request.write_complete(cb->m_err); write_slots->release(cb); } diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index 5f2748b7dca..bdee0ed138b 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -2405,7 +2405,10 @@ row_ins_duplicate_error_in_clust( duplicate: trx->error_info = cursor->index(); err = DB_DUPLICATE_KEY; - if (cursor->index()->table->versioned() + if (thr->prebuilt + && thr->prebuilt->upd_node + && thr->prebuilt->upd_node->is_delete + == VERSIONED_DELETE && entry->vers_history_row()) { ulint trx_id_len; diff --git a/storage/innobase/row/row0mysql.cc b/storage/innobase/row/row0mysql.cc index 4692fa98035..24312ba75b4 100644 --- a/storage/innobase/row/row0mysql.cc +++ b/storage/innobase/row/row0mysql.cc @@ -1675,12 +1675,8 @@ row_update_for_mysql(row_prebuilt_t* prebuilt) ut_ad(!prebuilt->versioned_write || node->table->versioned()); - if (prebuilt->versioned_write) { - if (node->is_delete == VERSIONED_DELETE) { - node->vers_make_delete(trx); - } else if (node->update->affects_versioned()) { - node->vers_make_update(trx); - } + if (prebuilt->versioned_write && node->is_delete == VERSIONED_DELETE) { + node->vers_make_delete(trx); } for (;;) { diff --git a/storage/innobase/row/row0upd.cc b/storage/innobase/row/row0upd.cc index fe88fce58a2..fafe32d029f 100644 --- a/storage/innobase/row/row0upd.cc +++ b/storage/innobase/row/row0upd.cc @@ -2929,9 +2929,8 @@ error_handling: void thd_get_query_start_data(THD *thd, char *buf); /** Appends row_start or row_end field to update vector and sets a -CURRENT_TIMESTAMP/trx->id value to it. -Supposed to be called only by make_versioned_update() and -make_versioned_delete(). +CURRENT_TIMESTAMP/trx->id value to it. Called by vers_make_update() and +vers_make_delete(). @param[in] trx transaction @param[in] vers_sys_idx table->row_start or table->row_end */ void upd_node_t::vers_update_fields(const trx_t *trx, ulint idx) diff --git a/storage/maria/aria_chk.c b/storage/maria/aria_chk.c index 7d5598f06b5..143110dc1be 100644 --- a/storage/maria/aria_chk.c +++ b/storage/maria/aria_chk.c @@ -436,7 +436,8 @@ static struct my_option my_long_options[] = "Size of sort buffer. Used by --recover", &check_param.orig_sort_buffer_length, &check_param.orig_sort_buffer_length, 0, GET_ULL, REQUIRED_ARG, - SORT_BUFFER_INIT, MIN_SORT_BUFFER, SIZE_T_MAX, MALLOC_OVERHEAD, 1L, 0}, + SORT_BUFFER_INIT, MARIA_MIN_SORT_MEMORY, SIZE_T_MAX/10, MALLOC_OVERHEAD, + 1L, 0}, { "sort_key_blocks", OPT_SORT_KEY_BLOCKS, "Internal buffer for sorting keys; Don't touch :)", &check_param.sort_key_blocks, diff --git a/storage/maria/ha_maria.cc b/storage/maria/ha_maria.cc index 10ec791f186..66dd98673a5 100644 --- a/storage/maria/ha_maria.cc +++ b/storage/maria/ha_maria.cc @@ -269,7 +269,7 @@ static MYSQL_THDVAR_ULONGLONG(sort_buffer_size, PLUGIN_VAR_RQCMDARG, "The buffer that is allocated when sorting the index when doing a " "REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE.", NULL, NULL, - SORT_BUFFER_INIT, MIN_SORT_BUFFER, SIZE_T_MAX/2, 1); + SORT_BUFFER_INIT, MARIA_MIN_SORT_MEMORY, SIZE_T_MAX/16, 1); static MYSQL_THDVAR_ENUM(stats_method, PLUGIN_VAR_RQCMDARG, "Specifies how Aria index statistics collection code should treat " @@ -292,7 +292,8 @@ static MYSQL_SYSVAR_BOOL(used_for_temp_tables, "Whether temporary tables should be MyISAM or Aria", 0, 0, 1); -static MYSQL_SYSVAR_BOOL(encrypt_tables, maria_encrypt_tables, PLUGIN_VAR_OPCMDARG, +static MYSQL_SYSVAR_BOOL(encrypt_tables, maria_encrypt_tables, + PLUGIN_VAR_OPCMDARG, "Encrypt tables (only for tables with ROW_FORMAT=PAGE (default) " "and not FIXED/DYNAMIC)", 0, 0, 0); diff --git a/storage/maria/ma_check.c b/storage/maria/ma_check.c index f470d3691c1..02cf81b12a7 100644 --- a/storage/maria/ma_check.c +++ b/storage/maria/ma_check.c @@ -2485,9 +2485,8 @@ static int initialize_variables_for_repair(HA_CHECK *param, tmp= (size_t) MY_MIN(sort_info->filelength, (my_off_t) (SIZE_T_MAX/10/threads)); tmp= MY_MAX(tmp * 8 * threads, (size_t) 65536); /* Some margin */ - param->sort_buffer_length= MY_MIN(param->orig_sort_buffer_length, - tmp); - set_if_smaller(param->sort_buffer_length, tmp); + param->sort_buffer_length= MY_MIN(param->orig_sort_buffer_length, tmp); + set_if_bigger(param->sort_buffer_length, MARIA_MIN_SORT_MEMORY); /* Protect against too big sort buffer length */ #if SIZEOF_SIZE_T >= 8 set_if_smaller(param->sort_buffer_length, 16LL*1024LL*1024LL*1024LL); @@ -4615,6 +4614,8 @@ int maria_repair_parallel(HA_CHECK *param, register MARIA_HA *info, #else param->sort_buffer_length*sort_param[i].key_length/total_key_length; #endif + set_if_bigger(sort_param[i].sortbuff_size, MARIA_MIN_SORT_MEMORY); + if (mysql_thread_create(key_thread_find_all_keys, &sort_param[i].thr, &thr_attr, _ma_thr_find_all_keys, (void *) (sort_param+i))) diff --git a/storage/maria/ma_create.c b/storage/maria/ma_create.c index bac820f3501..7fd739d13a8 100644 --- a/storage/maria/ma_create.c +++ b/storage/maria/ma_create.c @@ -978,7 +978,6 @@ int maria_create(const char *name, enum data_file_type datafile_type, for (i=0; i < uniques ; i++) { tmp_keydef.keysegs=1; - tmp_keydef.flag= HA_UNIQUE_CHECK; tmp_keydef.block_length= (uint16) maria_block_size; tmp_keydef.keylength= MARIA_UNIQUE_HASH_LENGTH + pointer; tmp_keydef.minlength=tmp_keydef.maxlength=tmp_keydef.keylength; @@ -1065,6 +1064,8 @@ int maria_create(const char *name, enum data_file_type datafile_type, if (encrypted) { + DBUG_ASSERT(share.data_file_name.length == 0); + share.data_file_name.str= (char*) name; /* For error reporting */ if (ma_crypt_create(&share) || ma_crypt_write(&share, file)) goto err; diff --git a/storage/maria/ma_crypt.c b/storage/maria/ma_crypt.c index a69ebf3928f..1714fc6ee58 100644 --- a/storage/maria/ma_crypt.c +++ b/storage/maria/ma_crypt.c @@ -100,6 +100,7 @@ static void crypt_data_scheme_locker(struct st_encryption_scheme *scheme, int ma_crypt_create(MARIA_SHARE* share) { + uint key_version; MARIA_CRYPT_DATA *crypt_data= (MARIA_CRYPT_DATA*)my_malloc(PSI_INSTRUMENT_ME, sizeof(MARIA_CRYPT_DATA), MYF(MY_ZEROFILL)); crypt_data->scheme.type= CRYPT_SCHEME_1; @@ -110,6 +111,16 @@ ma_crypt_create(MARIA_SHARE* share) my_random_bytes((uchar*)&crypt_data->space, sizeof(crypt_data->space)); share->crypt_data= crypt_data; share->crypt_page_header_space= CRYPT_SCHEME_1_KEY_VERSION_SIZE; + + key_version = encryption_key_get_latest_version(crypt_data->scheme.key_id); + if (unlikely(key_version == ENCRYPTION_KEY_VERSION_INVALID)) + { + my_errno= HA_ERR_NO_ENCRYPTION; + my_printf_error(HA_ERR_NO_ENCRYPTION, + "Initialization of encryption failed for %s", MYF(0), + share->data_file_name.str); + return 1; + } return 0; } @@ -145,7 +156,7 @@ ma_crypt_write(MARIA_SHARE* share, File file) } uchar* -ma_crypt_read(MARIA_SHARE* share, uchar *buff) +ma_crypt_read(MARIA_SHARE* share, uchar *buff, my_bool silent) { uchar type= buff[0]; uchar iv_length= buff[1]; @@ -155,9 +166,9 @@ ma_crypt_read(MARIA_SHARE* share, uchar *buff) iv_length != sizeof(((MARIA_CRYPT_DATA*)1)->scheme.iv) + 4) { my_printf_error(HA_ERR_UNSUPPORTED, - "Unsupported crypt scheme! type: %d iv_length: %d\n", - MYF(ME_FATAL|ME_ERROR_LOG), - type, iv_length); + "Unsupported crypt scheme type: %d iv_length: %d\n", + MYF(ME_ERROR_LOG | (silent ? ME_WARNING : ME_FATAL)), + type, iv_length); return 0; } @@ -166,6 +177,7 @@ ma_crypt_read(MARIA_SHARE* share, uchar *buff) /* opening a table */ MARIA_CRYPT_DATA *crypt_data= (MARIA_CRYPT_DATA*)my_malloc(PSI_INSTRUMENT_ME, sizeof(MARIA_CRYPT_DATA), MYF(MY_ZEROFILL)); + uint key_version; crypt_data->scheme.type= type; mysql_mutex_init(key_CRYPT_DATA_lock, &crypt_data->lock, @@ -175,6 +187,17 @@ ma_crypt_read(MARIA_SHARE* share, uchar *buff) crypt_data->space= uint4korr(buff + 2); memcpy(crypt_data->scheme.iv, buff + 6, sizeof(crypt_data->scheme.iv)); share->crypt_data= crypt_data; + + key_version= encryption_key_get_latest_version(crypt_data->scheme.key_id); + if (unlikely(key_version == ENCRYPTION_KEY_VERSION_INVALID)) + { + my_errno= HA_ERR_NO_ENCRYPTION; + my_printf_error(HA_ERR_NO_ENCRYPTION, + "Initialization of encryption failed for %s", + MYF(ME_ERROR_LOG | (silent ? ME_WARNING : ME_FATAL)), + share->data_file_name.str); + return 0; + } } share->crypt_page_header_space= CRYPT_SCHEME_1_KEY_VERSION_SIZE; @@ -462,7 +485,7 @@ static int ma_encrypt(MARIA_SHARE *share, MARIA_CRYPT_DATA *crypt_data, uint32 dstlen= 0; /* Must be set because of error message */ *key_version = encryption_key_get_latest_version(crypt_data->scheme.key_id); - if (*key_version == ENCRYPTION_KEY_VERSION_INVALID) + if (unlikely(*key_version == ENCRYPTION_KEY_VERSION_INVALID)) { /* We use this error for both encryption and decryption, as in normal @@ -470,7 +493,7 @@ static int ma_encrypt(MARIA_SHARE *share, MARIA_CRYPT_DATA *crypt_data, */ my_errno= HA_ERR_DECRYPTION_FAILED; my_printf_error(HA_ERR_DECRYPTION_FAILED, - "Unknown key id %u for %s. Can't continue!", + "Unknown encryption key id %u for %s. Can't continue!", MYF(ME_FATAL|ME_ERROR_LOG), crypt_data->scheme.key_id, share->open_file_name.str); diff --git a/storage/maria/ma_crypt.h b/storage/maria/ma_crypt.h index 811b319bc0c..acaf36ee831 100644 --- a/storage/maria/ma_crypt.h +++ b/storage/maria/ma_crypt.h @@ -26,7 +26,8 @@ uint ma_crypt_get_index_page_header_space(struct st_maria_share *); uint ma_crypt_get_file_length(); /* bytes needed in file */ int ma_crypt_create(struct st_maria_share *); /* create encryption data */ int ma_crypt_write(struct st_maria_share *, File); /* write encryption data */ -uchar* ma_crypt_read(struct st_maria_share *, uchar *buff); /* read crypt data*/ +uchar* ma_crypt_read(struct st_maria_share *, uchar *buff, + my_bool silent); /* read crypt data*/ void ma_crypt_set_data_pagecache_callbacks(struct st_pagecache_file *file, struct st_maria_share *share); diff --git a/storage/maria/ma_delete_table.c b/storage/maria/ma_delete_table.c index 92b683c993e..ebd94cdbdd8 100644 --- a/storage/maria/ma_delete_table.c +++ b/storage/maria/ma_delete_table.c @@ -43,11 +43,13 @@ int maria_delete_table(const char *name) 'open_for_repair' to be able to open even a crashed table. */ my_errno= 0; - if (!(info= maria_open(name, O_RDONLY, HA_OPEN_FOR_REPAIR, 0))) + if (!(info= maria_open(name, O_RDONLY, + (HA_OPEN_FOR_DROP | HA_OPEN_FOR_REPAIR), 0))) { sync_dir= 0; /* Ignore not found errors and wrong symlink errors */ - if (my_errno != ENOENT && my_errno != HA_WRONG_CREATE_OPTION) + if (my_errno != ENOENT && my_errno != HA_WRONG_CREATE_OPTION && + my_errno != HA_ERR_NO_ENCRYPTION) got_error= my_errno; } else diff --git a/storage/maria/ma_open.c b/storage/maria/ma_open.c index 7702355b7d1..ad98a534393 100644 --- a/storage/maria/ma_open.c +++ b/storage/maria/ma_open.c @@ -957,7 +957,8 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags, if (MY_TEST(share->base.extra_options & MA_EXTRA_OPTIONS_ENCRYPTED)) { - if (!(disk_pos= ma_crypt_read(share, disk_pos))) + if (!(disk_pos= ma_crypt_read(share, disk_pos, + MY_TEST(open_flags & HA_OPEN_FOR_DROP)))) goto err; } diff --git a/storage/maria/ma_sort.c b/storage/maria/ma_sort.c index f02a7a81020..de6f5b8b288 100644 --- a/storage/maria/ma_sort.c +++ b/storage/maria/ma_sort.c @@ -29,12 +29,10 @@ /* static variables */ -#undef MIN_SORT_MEMORY #undef DISK_BUFFER_SIZE #define MERGEBUFF 15 #define MERGEBUFF2 31 -#define MIN_SORT_MEMORY (4096-MALLOC_OVERHEAD) #define DISK_BUFFER_SIZE (IO_SIZE*128) /* How many keys we can keep in memory */ @@ -145,11 +143,11 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages, sort_keys= (uchar **) NULL; error= 1; maxbuffer=1; - memavl=MY_MAX(sortbuff_size,MIN_SORT_MEMORY); + memavl=MY_MAX(sortbuff_size,MARIA_MIN_SORT_MEMORY); records= info->sort_info->max_records; sort_length= info->key_length; - while (memavl >= MIN_SORT_MEMORY) + while (memavl >= MARIA_MIN_SORT_MEMORY) { /* Check if we can fit all keys into memory */ if (((ulonglong) (records + 1) * @@ -179,8 +177,7 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages, maxbuffer_org= maxbuffer; if (memavl < sizeof(BUFFPEK) * maxbuffer || (keys= (memavl-sizeof(BUFFPEK)*maxbuffer)/ - (sort_length+sizeof(char*))) <= 1 || - keys < maxbuffer) + (sort_length+sizeof(char*))) <= 1) { _ma_check_print_error(info->sort_info->param, "aria_sort_buffer_size is too small. Current aria_sort_buffer_size: %llu rows: %llu sort_length: %u", @@ -189,6 +186,15 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages, my_errno= ENOMEM; goto err; } + if (keys < maxbuffer) + { + /* + There must be sufficient memory for at least one key per BUFFPEK, + otherwise repair by sort/parallel repair cannot operate. + */ + maxbuffer= (uint) keys; + break; + } } while ((maxbuffer= (size_t) (records/(keys-1)+1)) != maxbuffer_org); } @@ -208,10 +214,10 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages, break; } old_memavl=memavl; - if ((memavl=memavl/4*3) < MIN_SORT_MEMORY && old_memavl > MIN_SORT_MEMORY) - memavl=MIN_SORT_MEMORY; + if ((memavl=memavl/4*3) < MARIA_MIN_SORT_MEMORY && old_memavl > MARIA_MIN_SORT_MEMORY) + memavl=MARIA_MIN_SORT_MEMORY; } - if (memavl < MIN_SORT_MEMORY) + if (memavl < MARIA_MIN_SORT_MEMORY) { /* purecov: begin inspected */ _ma_check_print_error(info->sort_info->param, @@ -233,6 +239,20 @@ int _ma_create_index_by_sort(MARIA_SORT_PARAM *info, my_bool no_messages, == HA_POS_ERROR) goto err; /* purecov: tested */ + if (maxbuffer >= keys) + { + /* + merge_many_buff will crash if maxbuffer > keys as then we cannot store in memory + the keys for each buffer. + */ + keys= maxbuffer + 1; + if (!(sort_keys= ((uchar **) + my_realloc(PSI_INSTRUMENT_ME, sort_keys, + (size_t) (keys*(sort_length+sizeof(char*))+ + HA_FT_MAXBYTELEN), MYF(MY_FREE_ON_ERROR))))) + goto err; + } + info->sort_info->param->stage++; /* Merge stage */ if (maxbuffer == 0) @@ -387,12 +407,12 @@ static my_bool _ma_thr_find_all_keys_exec(MARIA_SORT_PARAM* sort_param) bzero((char*) &sort_param->unique, sizeof(sort_param->unique)); sortbuff_size= sort_param->sortbuff_size; - memavl= MY_MAX(sortbuff_size, MIN_SORT_MEMORY); + memavl= MY_MAX(sortbuff_size, MARIA_MIN_SORT_MEMORY); idx= (ha_keys) sort_param->sort_info->max_records; sort_length= sort_param->key_length; maxbuffer= 1; - while (memavl >= MIN_SORT_MEMORY) + while (memavl >= MARIA_MIN_SORT_MEMORY) { if ((my_off_t) (idx+1)*(sort_length+sizeof(char*)) <= (my_off_t) memavl) keys= idx+1; @@ -442,11 +462,11 @@ static my_bool _ma_thr_find_all_keys_exec(MARIA_SORT_PARAM* sort_param) break; } old_memavl= memavl; - if ((memavl= memavl/4*3) < MIN_SORT_MEMORY && - old_memavl > MIN_SORT_MEMORY) - memavl= MIN_SORT_MEMORY; + if ((memavl= memavl/4*3) < MARIA_MIN_SORT_MEMORY && + old_memavl > MARIA_MIN_SORT_MEMORY) + memavl= MARIA_MIN_SORT_MEMORY; } - if (memavl < MIN_SORT_MEMORY) + if (memavl < MARIA_MIN_SORT_MEMORY) { /* purecov: begin inspected */ _ma_check_print_error(sort_param->sort_info->param, @@ -626,7 +646,7 @@ int _ma_thr_write_keys(MARIA_SORT_PARAM *sort_param) if (!mergebuf) { length=(size_t)param->sort_buffer_length; - while (length >= MIN_SORT_MEMORY) + while (length >= MARIA_MIN_SORT_MEMORY) { if ((mergebuf= my_malloc(PSI_INSTRUMENT_ME, (size_t) length, MYF(0)))) break; diff --git a/storage/maria/maria_def.h b/storage/maria/maria_def.h index c7aef97072b..91e1b10a7ed 100644 --- a/storage/maria/maria_def.h +++ b/storage/maria/maria_def.h @@ -332,6 +332,8 @@ void _ma_update_auto_increment_key(HA_CHECK *param, MARIA_HA *info, #define MARIA_MAX_TREE_LEVELS 32 #define MARIA_MAX_RECORD_ON_STACK 16384 +#define MARIA_MIN_SORT_MEMORY (16384-MALLOC_OVERHEAD) + /* maria_open() flag, specific for maria_pack */ #define HA_OPEN_IGNORE_MOVED_STATE (1U << 30) @@ -1576,7 +1578,6 @@ typedef struct st_maria_block_info #define PAGE_BUFFER_INIT MY_ALIGN_DOWN(1024L*1024L*256L-MALLOC_OVERHEAD, 8192) #define READ_BUFFER_INIT MY_ALIGN_DOWN(1024L*256L-MALLOC_OVERHEAD, 1024) #define SORT_BUFFER_INIT MY_ALIGN_DOWN(1024L*1024L*256L-MALLOC_OVERHEAD, 1024) -#define MIN_SORT_BUFFER 4096U #define fast_ma_writeinfo(INFO) if (!(INFO)->s->tot_locks) (void) _ma_writeinfo((INFO),0) #define fast_ma_readinfo(INFO) ((INFO)->lock_type == F_UNLCK) && _ma_readinfo((INFO),F_RDLCK,1) diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_found_rows.test b/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_found_rows.test index 08acc357d3b..4d5bc7ea8e5 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_found_rows.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/fulltext_found_rows.test @@ -41,7 +41,9 @@ INSERT INTO diaries VALUES(6, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼") SELECT SQL_CALC_FOUND_ROWS * FROM diaries WHERE MATCH(content) AGAINST("今日 天気" IN BOOLEAN MODE) ORDER BY day LIMIT 0,5; +--disable_ps2_protocol SELECT FOUND_ROWS(); +--enable_ps2_protocol DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_multithread.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_multithread.test index 4857286ac98..6078e908c7f 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_multithread.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_multithread.test @@ -43,7 +43,9 @@ CONNECTION default; enable_query_log; SHOW STATUS LIKE 'mroonga_count_skip'; +--disable_ps2_protocol SELECT COUNT(*) FROM diaries WHERE MATCH(title) AGAINST("mroonga" IN BOOLEAN MODE); +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_single_thread.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_single_thread.test index d0116e7f1c5..c699c20e565 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_single_thread.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_after_insert_single_thread.test @@ -32,7 +32,9 @@ INSERT INTO diaries VALUES("It's funny."); INSERT INTO diaries VALUES("Happy birthday!"); SHOW STATUS LIKE 'mroonga_count_skip'; +--disable_ps2_protocol SELECT COUNT(*) FROM diaries WHERE MATCH(title) AGAINST("mroonga" IN BOOLEAN MODE); +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_disabled.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_disabled.test index d84112b4952..c911694c1ba 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_disabled.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_disabled.test @@ -38,8 +38,10 @@ INSERT INTO diaries VALUES(5, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Šæ—¥ã¾ã§ã¿ãŸ SET mroonga_enable_optimization=FALSE; +--disable_ps2_protocol SELECT COUNT(*) FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE); +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_and.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_and.test index 691497be13e..4881ae43f46 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_and.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_and.test @@ -35,7 +35,9 @@ INSERT INTO users (id, age) VALUES (2, 29); INSERT INTO users (id, age) VALUES (2, 29); INSERT INTO users (id, age) VALUES (3, 29); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id = 2 AND age = 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_between.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_between.test index 76675fdeb76..34c8bd0ae51 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_between.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_between.test @@ -34,7 +34,9 @@ INSERT INTO users (age) VALUES (30); INSERT INTO users (age) VALUES (31); INSERT INTO users (age) VALUES (32),(33),(34),(35),(36),(37); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE age BETWEEN 28 AND 30; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_equal.test index b422e06e5fd..dedf4543d76 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_equal.test @@ -33,7 +33,9 @@ INSERT INTO users (age) VALUES (29); INSERT INTO users (age) VALUES (29); INSERT INTO users (age) VALUES (29); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE age = 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_boolean_mode.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_boolean_mode.test index b59ca7f552f..b99e9b7a3fb 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_boolean_mode.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_boolean_mode.test @@ -33,8 +33,10 @@ INSERT INTO memos (content) VALUES ('Mroonga is good.'); INSERT INTO memos (content) VALUES ('Mroonga is very good.'); INSERT INTO memos (content) VALUES ('Mroonga uses Groonga.'); +--disable_ps2_protocol SELECT COUNT(*) FROM memos WHERE MATCH(content) AGAINST('+Groonga' IN BOOLEAN MODE); +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_natural_language_mode.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_natural_language_mode.test index c8de7b95cbc..e4cba0d2c43 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_natural_language_mode.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_full_text_search_in_natural_language_mode.test @@ -33,8 +33,10 @@ INSERT INTO memos (content) VALUES ('Mroonga is good.'); INSERT INTO memos (content) VALUES ('Mroonga is very good.'); INSERT INTO memos (content) VALUES ('Mroonga uses Groonga.'); +--disable_ps2_protocol SELECT COUNT(*) FROM memos WHERE MATCH(content) AGAINST('Groonga'); +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater.test index fb5c336cd4c..904bf0c534d 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater.test @@ -34,7 +34,9 @@ INSERT INTO users (age) VALUES (30); INSERT INTO users (age) VALUES (31); INSERT INTO users (age) VALUES (1),(2),(3),(4),(5),(6); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE age > 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater_equal.test index c897d8d88de..40571d7c234 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_greater_equal.test @@ -34,7 +34,9 @@ INSERT INTO users (age) VALUES (30); INSERT INTO users (age) VALUES (31); INSERT INTO users (age) VALUES (1),(2),(3),(4),(5),(6); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE age >= 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less.test index f03156d545b..ddfee173ccf 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less.test @@ -34,7 +34,9 @@ INSERT INTO users (age) VALUES (30); INSERT INTO users (age) VALUES (31); INSERT INTO users (age) VALUES (32),(33),(34),(35),(36),(37); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE age < 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less_equal.test index 20863705bf4..0c5af3cdd52 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_less_equal.test @@ -34,7 +34,9 @@ INSERT INTO users (age) VALUES (30); INSERT INTO users (age) VALUES (31); INSERT INTO users (age) VALUES (32),(33),(34),(35),(36),(37); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE age <= 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_not_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_not_equal.test index 3948d218a69..f75c8b4e4fd 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_not_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_index_not_equal.test @@ -33,7 +33,9 @@ INSERT INTO users (age) VALUES (29); INSERT INTO users (age) VALUES (29); INSERT INTO users (age) VALUES (29); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE age <> 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_multiple_conditions.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_multiple_conditions.test index 917d6a1b4d6..07387cea956 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_multiple_conditions.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_multiple_conditions.test @@ -32,7 +32,9 @@ INSERT INTO users (id, age) VALUES (1, 29); INSERT INTO users (id, age) VALUES (2, 29); INSERT INTO users (id, age) VALUES (3, 29); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id = 3 AND age = 29; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_between.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_between.test index 25d6c734fe1..1aef072cb1b 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_between.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_between.test @@ -33,7 +33,9 @@ INSERT INTO users (id) VALUES (4); INSERT INTO users (id) VALUES (5); INSERT INTO users (id) VALUES (32),(33),(34),(35),(36),(37); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id BETWEEN 2 AND 4; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_equal.test index c0db5729425..24fe09a0402 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_equal.test @@ -32,7 +32,9 @@ INSERT INTO users (id) VALUES (3); INSERT INTO users (id) VALUES (4); INSERT INTO users (id) VALUES (5); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id = 3; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater.test index f91cf19310f..be77d4c8bf6 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater.test @@ -33,7 +33,10 @@ INSERT INTO users (id) VALUES (4); INSERT INTO users (id) VALUES (5); INSERT INTO users (id) VALUES (-1),(-2),(-3),(-4); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id > 3; +--enable_ps2_protocol + SHOW STATUS LIKE 'mroonga_count_skip'; DROP TABLE users; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater_equal.test index dd374012257..f82a322a623 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_greater_equal.test @@ -33,7 +33,9 @@ INSERT INTO users (id) VALUES (4); INSERT INTO users (id) VALUES (5); INSERT INTO users (id) VALUES (-1),(-2),(-3),(-4); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id >= 3; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less.test index 529dfde678e..741d1bca68d 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less.test @@ -32,7 +32,9 @@ INSERT INTO users (id) VALUES (3); INSERT INTO users (id) VALUES (4); INSERT INTO users (id) VALUES (5); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id < 3; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less_equal.test index d2a863ae43b..248ace5678e 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_less_equal.test @@ -32,7 +32,9 @@ INSERT INTO users (id) VALUES (3); INSERT INTO users (id) VALUES (4); INSERT INTO users (id) VALUES (5); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id <= 3; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_not_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_not_equal.test index 7e8c3180ccf..277c4afacc5 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_not_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_count_skip_primary_key_not_equal.test @@ -32,7 +32,9 @@ INSERT INTO users (id) VALUES (3); INSERT INTO users (id) VALUES (4); INSERT INTO users (id) VALUES (5); +--disable_ps2_protocol SELECT COUNT(*) FROM users WHERE id <> 3; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_count_skip'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_disabled.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_disabled.test index c0dab28363b..79fb9ddf3f5 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_disabled.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_disabled.test @@ -45,10 +45,12 @@ INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼") SET mroonga_enable_optimization=FALSE; +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND month = 11 ORDER BY day LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_multiple_match_againsts.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_multiple_match_againsts.test index ce1f63604e7..6de18c57547 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_multiple_match_againsts.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_multiple_match_againsts.test @@ -44,11 +44,13 @@ INSERT INTO memos VALUES(8, "title 1-a", "content b-1"); INSERT INTO memos VALUES(9, "title 2-b", "content b-2"); INSERT INTO memos VALUES(7, "title 2-c", "content b-3"); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(title) AGAINST("+1" IN BOOLEAN MODE) AND MATCH(content) AGAINST("+a" IN BOOLEAN MODE) ORDER BY id LIMIT 1,3; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_no_limit.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_no_limit.test index 99abc0469fb..0e0fe6454ae 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_no_limit.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_not_optimized_no_limit.test @@ -43,9 +43,11 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) ORDER BY day; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_cp932.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_cp932.test index 19c2bc4009a..9da4c7e30d2 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_cp932.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_cp932.test @@ -34,10 +34,12 @@ INSERT INTO memos VALUES(2, " INSERT INTO memos VALUES(3, "¡“ú‚̓Tƒ{ƒeƒ“‚ð‚à‚ç‚Á‚½B"); INSERT INTO memos VALUES(1, "¡“ú‚Í“V‹C‚ª‚æ‚­‚Ă悩‚Á‚½B"); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(“à—e) AGAINST("¡“ú" IN BOOLEAN MODE) ORDER BY ޝ•ÊŽq LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between.test index 9ad4a6966b4..a6903197c52 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between.test @@ -37,10 +37,12 @@ INSERT INTO diaries VALUES(3, "2011-11-11 12:23:32", "I will do something today! INSERT INTO diaries VALUES(4, "2011-11-11 12:23:33", "I don't want to anything today..."); INSERT INTO diaries VALUES(5, "2011-11-11 12:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND date BETWEEN "2011-11-11 12:23:31" AND "2011-11-11 12:23:33" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between_over.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between_over.test index 170e979613e..add0056dbee 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between_over.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_between_over.test @@ -37,10 +37,12 @@ INSERT INTO diaries VALUES(3, "2011-11-11 12:23:32", "I will do something today! INSERT INTO diaries VALUES(4, "2011-11-11 12:23:33", "I don't want to anything today..."); INSERT INTO diaries VALUES(5, "2011-11-11 12:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND date BETWEEN "2011-11-11 12:23:31" AND "2011-11-11 12:23:43" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_equal.test index 32555b2a448..306a7bfb591 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_equal.test @@ -37,10 +37,12 @@ INSERT INTO diaries VALUES(3, "2011-11-11 12:23:34", "I will do something today! INSERT INTO diaries VALUES(4, "2011-11-11 12:23:34", "I don't want to anything today..."); INSERT INTO diaries VALUES(5, "2011-11-11 12:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND date = "2011-11-11 12:23:34" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than.test index 9c4c8754750..5a07338662e 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than.test @@ -37,10 +37,12 @@ INSERT INTO diaries VALUES(3, "2011-11-11 12:23:32", "I will do something today! INSERT INTO diaries VALUES(4, "2011-11-11 12:23:33", "I don't want to anything today..."); INSERT INTO diaries VALUES(5, "2011-11-11 12:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND date > "2011-11-11 12:23:31" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than_or_equal.test index 375080ca70b..997035c419b 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_greater_than_or_equal.test @@ -37,10 +37,12 @@ INSERT INTO diaries VALUES(3, "2011-11-11 12:23:32", "I will do something today! INSERT INTO diaries VALUES(4, "2011-11-11 12:23:33", "I don't want to anything today..."); INSERT INTO diaries VALUES(5, "2011-11-11 12:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND date >= "2011-11-11 12:23:31" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than.test index cdd4a2ba19d..d3395d3fe9a 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than.test @@ -37,10 +37,12 @@ INSERT INTO diaries VALUES(3, "2011-11-11 12:23:32", "I will do something today! INSERT INTO diaries VALUES(4, "2011-11-11 12:23:33", "I don't want to anything today..."); INSERT INTO diaries VALUES(5, "2011-11-11 12:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND date < "2011-11-11 12:23:33" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than_or_equal.test index b0af56e0e19..37ec453d37d 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_datetime_less_than_or_equal.test @@ -37,10 +37,12 @@ INSERT INTO diaries VALUES(3, "2011-11-11 12:23:32", "I will do something today! INSERT INTO diaries VALUES(4, "2011-11-11 12:23:33", "I don't want to anything today..."); INSERT INTO diaries VALUES(5, "2011-11-11 12:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND date <= "2011-11-11 12:23:33" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_duplicated_order_by_columns.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_duplicated_order_by_columns.test index e9d1ca2909e..7c8df7a9072 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_duplicated_order_by_columns.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_duplicated_order_by_columns.test @@ -33,10 +33,12 @@ CREATE TABLE ids ( INSERT INTO ids VALUES (1, 'first'); +--disable_ps2_protocol SELECT * FROM ids WHERE MATCH(text) AGAINST('+first' IN BOOLEAN MODE) ORDER BY id, id LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_name.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_name.test index 3a4f4faa2fb..36d2a40fb8b 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_name.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_name.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(2, 'Mroonga', 'Mroonga is great!'); INSERT INTO memos VALUES(3, 'Mroonga', 'Mroonga is a MySQL storage engine.'); INSERT INTO memos VALUES(4, 'Mroonga', 'Mroonga is based on Groonga.'); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("+Groonga" IN BOOLEAN MODE) AND tag = 'Mroonga' ORDER BY id LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_value.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_value.test index b8126b3fc83..599d157d054 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_value.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_enum_value.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(2, 'Mroonga', 'Mroonga is great!'); INSERT INTO memos VALUES(3, 'Mroonga', 'Mroonga is a MySQL storage engine.'); INSERT INTO memos VALUES(4, 'Mroonga', 'Mroonga is based on Groonga.'); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("+Groonga" IN BOOLEAN MODE) AND tag = 2 ORDER BY id LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_have_primary_key.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_have_primary_key.test index 64f5a605567..94097ec99a3 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_have_primary_key.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_have_primary_key.test @@ -41,7 +41,9 @@ INSERT INTO diaries VALUES(4, 2011, 11, 11, "帰りé“", "今日ã¯å¤©æ°—ãŒã‚ˆ INSERT INTO diaries VALUES(5, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(6, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日 天気" IN BOOLEAN MODE) ORDER BY day LIMIT 0,5; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between.test index 2fa838ea069..922d6edcfe0 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between.test @@ -36,10 +36,12 @@ INSERT INTO memos VALUES(3, "I will do something today!"); INSERT INTO memos VALUES(4, "I don't want to anything today..."); INSERT INTO memos VALUES(5, "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND id BETWEEN 2 AND 4 ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between_over.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between_over.test index 5981c99f870..afd60af4b99 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between_over.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_between_over.test @@ -36,10 +36,12 @@ INSERT INTO memos VALUES(3, "I will do something today!"); INSERT INTO memos VALUES(4, "I don't want to anything today..."); INSERT INTO memos VALUES(5, "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND id BETWEEN 2 AND 6 ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_equal.test index f2158a8224f..495dc1bb25c 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_equal.test @@ -43,10 +43,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND month = 11 ORDER BY day LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than.test index 856c9f71055..8c4167202b5 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than.test @@ -43,10 +43,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND day > 10 ORDER BY day LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than_or_equal.test index 6115bf68a79..04674ee8477 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_greater_than_or_equal.test @@ -43,10 +43,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND day >= 10 ORDER BY day LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than.test index f5001bdf980..7917405a04b 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than.test @@ -43,10 +43,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_Protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND day < 12 ORDER BY day LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than_or_equal.test index 790e8f14bd1..5da40dea8c4 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_int_less_than_or_equal.test @@ -43,10 +43,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND day <= 12 ORDER BY day LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_primary_key.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_primary_key.test index 2aad7f0f7b5..69a13e226c9 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_primary_key.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_primary_key.test @@ -41,7 +41,9 @@ INSERT INTO diaries VALUES(4, 2011, 11, 11, "帰りé“", "今日ã¯å¤©æ°—ãŒã‚ˆ INSERT INTO diaries VALUES(5, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(6, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日 天気" IN BOOLEAN MODE) ORDER BY day LIMIT 0,5; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_where_clause.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_where_clause.test index 72889f96be5..2ccdc9db6e1 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_where_clause.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_no_where_clause.test @@ -30,7 +30,9 @@ insert into t1 values(5,50,"aa ii uu ii oo",null); show status like 'mroonga_fast_order_limit'; +--disable_ps2_protocol select *, match(c3) against("ii") from t1 order by c1 desc limit 2; +--enable_ps2_protocol show status like 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_asc.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_asc.test index c58d7353d0b..02037064163 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_asc.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_asc.test @@ -43,9 +43,11 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) ORDER BY day ASC LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_desc.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_desc.test index a979e88cb15..51dad46b05a 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_desc.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_desc.test @@ -43,9 +43,11 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) ORDER BY day DESC LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_id.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_id.test index 6bf3c6a8ceb..0bb6a7fc366 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_id.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_id.test @@ -44,10 +44,12 @@ INSERT INTO diaries VALUES(NULL, 5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã® INSERT INTO diaries VALUES(NULL, 6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(NULL, 7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) ORDER BY _id LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_match_against.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_match_against.test index bd86c6a2778..4f8d5cf6683 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_match_against.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_order_by_match_against.test @@ -43,10 +43,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) ORDER BY MATCH(content) AGAINST("今日" IN BOOLEAN MODE) LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_select_match_against.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_select_match_against.test index 5272037098c..0b0476d6882 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_select_match_against.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_select_match_against.test @@ -43,11 +43,13 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT *, MATCH(content) AGAINST("今日" IN BOOLEAN MODE) FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) ORDER BY MATCH(content) AGAINST("今日" IN BOOLEAN MODE) LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between.test index 23bb71032d3..56ba51a3f49 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(3, "1:23:32", "I will do something today!"); INSERT INTO memos VALUES(4, "1:23:33", "I don't want to anything today..."); INSERT INTO memos VALUES(5, "1:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND writing_time BETWEEN "1:23:31" AND "1:23:33" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between_over.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between_over.test index 2450f8a2d0c..dfb6d3161f9 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between_over.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_between_over.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(3, "1:23:32", "I will do something today!"); INSERT INTO memos VALUES(4, "1:23:33", "I don't want to anything today..."); INSERT INTO memos VALUES(5, "1:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND writing_time BETWEEN "1:23:31" AND "1:23:43" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_equal.test index 46dc7cb5d48..e1c1111fb31 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_equal.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(3, "1:23:34", "I will do something today!"); INSERT INTO memos VALUES(4, "1:23:34", "I don't want to anything today..."); INSERT INTO memos VALUES(5, "1:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND writing_time = "1:23:34" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than.test index 62acda78dc5..fed76bc5486 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(3, "1:23:32", "I will do something today!"); INSERT INTO memos VALUES(4, "1:23:33", "I don't want to anything today..."); INSERT INTO memos VALUES(5, "1:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND writing_time > "1:23:31" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than_or_equal.test index ee706c5f3e0..32fadbeedc6 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_greater_than_or_equal.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(3, "1:23:32", "I will do something today!"); INSERT INTO memos VALUES(4, "1:23:33", "I don't want to anything today..."); INSERT INTO memos VALUES(5, "1:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND writing_time >= "1:23:31" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than.test index 01764064cc7..849726da6e6 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(3, "1:23:32", "I will do something today!"); INSERT INTO memos VALUES(4, "1:23:33", "I don't want to anything today..."); INSERT INTO memos VALUES(5, "1:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND writing_time < "1:23:33" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than_or_equal.test index 51423125bbf..ecfc743437d 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_time_less_than_or_equal.test @@ -37,10 +37,12 @@ INSERT INTO memos VALUES(3, "1:23:32", "I will do something today!"); INSERT INTO memos VALUES(4, "1:23:33", "I don't want to anything today..."); INSERT INTO memos VALUES(5, "1:23:34", "I'm sleepy today."); +--disable_ps2_protocol SELECT * FROM memos WHERE MATCH(content) AGAINST("today" IN BOOLEAN MODE) AND writing_time <= "1:23:33" ORDER BY id LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_with_index.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_with_index.test index c3456c25827..5fc4342efe4 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_with_index.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_with_index.test @@ -44,10 +44,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND title = "hello" ORDER BY day LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_without_index.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_without_index.test index 2ce06201ee3..8536e559c29 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_without_index.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_varchar_equal_without_index.test @@ -43,10 +43,12 @@ INSERT INTO diaries VALUES(5, 2011, 11, 13, "ã¯ã‚Œ", "天気ãŒã‚ˆã„ã®ã¯ä»Š INSERT INTO diaries VALUES(6, 2011, 12, 1, "ä¹…ã—ã¶ã‚Š", "å¤©æ°—ãŒæ‚ªã„ã‹ã‚‰ãšã£ã¨ç•™å®ˆç•ªã€‚"); INSERT INTO diaries VALUES(7, 2011, 12, 2, "åˆé›ª", "今日ã®å¤©æ°—ã¯é›ªï¼"); +--disable_ps2_protocol SELECT * FROM diaries WHERE MATCH(content) AGAINST("今日" IN BOOLEAN MODE) AND title = "hello" ORDER BY day LIMIT 1; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between.test index c07368fb4da..4d2b8a52cd9 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between.test @@ -41,10 +41,12 @@ INSERT INTO mroonga_releases (release_title, release_year) INSERT INTO mroonga_releases (release_title, release_year) VALUES ("Mroonga 4.0 will be released", "2014"); +--disable_ps2_protocol SELECT * FROM mroonga_releases WHERE release_year BETWEEN "11" AND "2013" AND MATCH(release_title) AGAINST("Mroonga" IN BOOLEAN MODE) ORDER BY id DESC LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between_over.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between_over.test index 599cc8fa097..5b253483fc0 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between_over.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_between_over.test @@ -41,10 +41,12 @@ INSERT INTO mroonga_releases (release_title, release_year) INSERT INTO mroonga_releases (release_title, release_year) VALUES ("Mroonga 4.0 will be released", "2014"); +--disable_ps2_protocol SELECT * FROM mroonga_releases WHERE release_year BETWEEN "11" AND "2015" AND MATCH(release_title) AGAINST("Mroonga" IN BOOLEAN MODE) ORDER BY id DESC LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_equal.test index 35ce60663fb..bdb848dec06 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_equal.test @@ -43,10 +43,12 @@ INSERT INTO mroonga_releases (release_title, release_year) INSERT INTO mroonga_releases (release_title, release_year) VALUES ("Mroonga 4.0 will be released", "2014"); +--disable_ps2_protocol SELECT * FROM mroonga_releases WHERE release_year = "11" AND MATCH(release_title) AGAINST("Mroonga" IN BOOLEAN MODE) ORDER BY id DESC LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than.test index 88bb6a27ffc..9bc429fe563 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than.test @@ -41,10 +41,12 @@ INSERT INTO mroonga_releases (release_title, release_year) INSERT INTO mroonga_releases (release_title, release_year) VALUES ("Mroonga 4.0 will be released", "2014"); +--disable_ps2_protocol SELECT * FROM mroonga_releases WHERE release_year > "11" AND MATCH(release_title) AGAINST("Mroonga" IN BOOLEAN MODE) ORDER BY id ASC LIMIT 2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than_or_equal.test index 64b9f831caf..76c01606949 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_greater_than_or_equal.test @@ -41,10 +41,12 @@ INSERT INTO mroonga_releases (release_title, release_year) INSERT INTO mroonga_releases (release_title, release_year) VALUES ("Mroonga 4.0 will be released", "2014"); +--disable_ps2_protocol SELECT * FROM mroonga_releases WHERE release_year >= "11" AND MATCH(release_title) AGAINST("Mroonga" IN BOOLEAN MODE) ORDER BY id ASC LIMIT 2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than.test index 5f3f89fe77a..fb8130b5864 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than.test @@ -41,10 +41,12 @@ INSERT INTO mroonga_releases (release_title, release_year) INSERT INTO mroonga_releases (release_title, release_year) VALUES ("Mroonga 4.0 will be released", "2014"); +--disable_ps2_protocol SELECT * FROM mroonga_releases WHERE release_year < "13" AND MATCH(release_title) AGAINST("Mroonga" IN BOOLEAN MODE) ORDER BY id DESC LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than_or_equal.test b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than_or_equal.test index 5db8d96eadb..270dce85258 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than_or_equal.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/optimization_order_limit_optimized_year_less_than_or_equal.test @@ -41,10 +41,12 @@ INSERT INTO mroonga_releases (release_title, release_year) INSERT INTO mroonga_releases (release_title, release_year) VALUES ("Mroonga 4.0 will be released", "2014"); +--disable_ps2_protocol SELECT * FROM mroonga_releases WHERE release_year <= "13" AND MATCH(release_title) AGAINST("Mroonga" IN BOOLEAN MODE) ORDER BY id DESC LIMIT 1,2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/storage/t/variable_enable_operations_recording_insert.test b/storage/mroonga/mysql-test/mroonga/storage/t/variable_enable_operations_recording_insert.test index 2a77a0133a5..970f04582f0 100644 --- a/storage/mroonga/mysql-test/mroonga/storage/t/variable_enable_operations_recording_insert.test +++ b/storage/mroonga/mysql-test/mroonga/storage/t/variable_enable_operations_recording_insert.test @@ -29,7 +29,9 @@ CREATE TABLE diaries ( SELECT mroonga_command('truncate mroonga_operations'); INSERT INTO diaries VALUES("Unlogged: Research for Mroonga"); +--disable_ps2_protocol SELECT mroonga_command('load --table mroonga_operations --values "[{}]"'); +--enable_ps2_protocol SELECT mroonga_command('select mroonga_operations --output_columns _id'); SET GLOBAL mroonga_enable_operations_recording = false; @@ -37,7 +39,9 @@ FLUSH TABLES; SELECT mroonga_command('truncate mroonga_operations'); INSERT INTO diaries VALUES("Logged: Research for Mroonga"); +--disable_ps2_protocol SELECT mroonga_command('load --table mroonga_operations --values "[{}]"'); +--enable_ps2_protocol SELECT mroonga_command('select mroonga_operations --output_columns _id'); DROP TABLE diaries; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_TODO_SPLIT_ME.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_TODO_SPLIT_ME.test index a47e73f5bfb..b00f1ea5169 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_TODO_SPLIT_ME.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_TODO_SPLIT_ME.test @@ -36,6 +36,7 @@ insert into t1 values(3,30,"ii si ii se ii"); insert into t1 values(4,40,"ta ti tu te to"); insert into t1 values(5,50,"aa ii uu ii oo"); +--disable_ps2_protocol select c3, match(c3) against("ii") from t1 where match(c3) against("ii") order by match(c3) against("ii") desc; show status like 'mroonga_fast_order_limit'; @@ -54,6 +55,7 @@ show status like 'mroonga_fast_order_limit'; select count(*) from t1 where match(c3) against("ii") limit 1; show status like 'mroonga_fast_order_limit'; +--enable_ps2_protocol drop table t1; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_direction.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_direction.test index 21180eb9593..8b579dc3ea0 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_direction.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_direction.test @@ -37,11 +37,13 @@ INSERT INTO memos VALUES(5, "Mroonga is great"); SHOW STATUS LIKE 'mroonga_fast_order_limit'; +--disable_ps2_protocol SELECT id, content FROM memos WHERE MATCH(content) AGAINST("+Mroonga" IN BOOLEAN MODE) ORDER BY id LIMIT 2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_where_clause.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_where_clause.test index d40328299b6..824c373bf95 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_where_clause.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_no_where_clause.test @@ -37,7 +37,9 @@ insert into t1 values(5,50,"aa ii uu ii oo"); show status like 'mroonga_fast_order_limit'; +--disable_ps2_protocol select *, match(c3) against("ii") from t1 order by c1 desc limit 1; +--enable_ps2_protocol show status like 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_order_by_primary_key.test b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_order_by_primary_key.test index 2513df8e734..4d2236b7c12 100644 --- a/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_order_by_primary_key.test +++ b/storage/mroonga/mysql-test/mroonga/wrapper/t/optimization_order_limit_order_by_primary_key.test @@ -37,11 +37,13 @@ INSERT INTO memos VALUES(5, "Groonga is fast"); SHOW STATUS LIKE 'mroonga_fast_order_limit'; +--disable_ps2_protocol SELECT id, content FROM memos WHERE MATCH(content) AGAINST("+Mroonga" IN BOOLEAN MODE) ORDER BY id DESC LIMIT 2; +--enable_ps2_protocol SHOW STATUS LIKE 'mroonga_fast_order_limit'; diff --git a/storage/mroonga/vendor/groonga/CMakeLists.txt b/storage/mroonga/vendor/groonga/CMakeLists.txt index 27afb935467..5b25ada4f5b 100644 --- a/storage/mroonga/vendor/groonga/CMakeLists.txt +++ b/storage/mroonga/vendor/groonga/CMakeLists.txt @@ -15,7 +15,7 @@ # https://buildbot.askmonty.org/buildbot/builders/work-amd64-valgrind/builds/5263/steps/compile/logs/stdio # says CMake 2.6.2... We want to drop old software support... -cmake_minimum_required(VERSION 2.6.2) +cmake_minimum_required(VERSION 2.8.12) # cmake_minimum_required(VERSION 2.6.4) # CentOS 5 set(GRN_PROJECT_NAME "groonga") set(GRN_PROJECT_LABEL "Groonga") diff --git a/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/CMakeLists.txt b/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/CMakeLists.txt index 4c2aa343089..96f9b3e6bbf 100644 --- a/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/CMakeLists.txt +++ b/storage/mroonga/vendor/groonga/vendor/plugins/groonga-normalizer-mysql/CMakeLists.txt @@ -15,7 +15,7 @@ # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, # MA 02110-1335 USA -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 2.8.12) if(NOT DEFINED GROONGA_NORMALIZER_MYSQL_PROJECT_NAME) set(GROONGA_NORMALIZER_MYSQL_PROJECT_NAME "groonga-normalizer-mysql") endif() diff --git a/storage/myisam/ha_myisam.cc b/storage/myisam/ha_myisam.cc index c0419da7e71..34809f41a29 100644 --- a/storage/myisam/ha_myisam.cc +++ b/storage/myisam/ha_myisam.cc @@ -80,7 +80,7 @@ static MYSQL_THDVAR_ULONG(repair_threads, PLUGIN_VAR_RQCMDARG, static MYSQL_THDVAR_ULONGLONG(sort_buffer_size, PLUGIN_VAR_RQCMDARG, "The buffer that is allocated when sorting the index when doing " "a REPAIR or when creating indexes with CREATE INDEX or ALTER TABLE", NULL, NULL, - SORT_BUFFER_INIT, MIN_SORT_BUFFER, SIZE_T_MAX, 1); + SORT_BUFFER_INIT, MIN_SORT_BUFFER, SIZE_T_MAX/16, 1); static MYSQL_SYSVAR_BOOL(use_mmap, opt_myisam_use_mmap, PLUGIN_VAR_NOCMDARG, "Use memory mapping for reading and writing MyISAM tables", NULL, NULL, FALSE); diff --git a/storage/myisam/mi_check.c b/storage/myisam/mi_check.c index b4187ffc7dc..87e51816d81 100644 --- a/storage/myisam/mi_check.c +++ b/storage/myisam/mi_check.c @@ -2945,6 +2945,8 @@ int mi_repair_parallel(HA_CHECK *param, register MI_INFO *info, #else param->sort_buffer_length*sort_param[i].key_length/total_key_length; #endif + set_if_bigger(sort_param[i].sortbuff_size, MIN_SORT_BUFFER); + if ((error= mysql_thread_create(mi_key_thread_find_all_keys, &sort_param[i].thr, &thr_attr, thr_find_all_keys, diff --git a/storage/myisam/mi_create.c b/storage/myisam/mi_create.c index 63950a3fc1d..8ad6446f620 100644 --- a/storage/myisam/mi_create.c +++ b/storage/myisam/mi_create.c @@ -754,7 +754,6 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs, for (i=0; i < uniques ; i++) { tmp_keydef.keysegs=1; - tmp_keydef.flag= HA_UNIQUE_CHECK; tmp_keydef.block_length= (uint16)myisam_block_size; tmp_keydef.keylength= MI_UNIQUE_HASH_LENGTH + pointer; tmp_keydef.minlength=tmp_keydef.maxlength=tmp_keydef.keylength; diff --git a/storage/myisam/sort.c b/storage/myisam/sort.c index 198e669bbb4..375c1840f3e 100644 --- a/storage/myisam/sort.c +++ b/storage/myisam/sort.c @@ -176,8 +176,7 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, maxbuffer_org= maxbuffer; if (memavl < sizeof(BUFFPEK) * maxbuffer || (keys= (memavl-sizeof(BUFFPEK)*maxbuffer)/ - (sort_length+sizeof(char*))) <= 1 || - keys < maxbuffer) + (sort_length+sizeof(char*))) <= 1) { mi_check_print_error(info->sort_info->param, "myisam_sort_buffer_size is too small. Current myisam_sort_buffer_size: %llu rows: %llu sort_length: %u", @@ -186,6 +185,15 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, my_errno= ENOMEM; goto err; } + if (keys < maxbuffer) + { + /* + There must be sufficient memory for at least one key per BUFFPEK, + otherwise repair by sort/parallel repair cannot operate. + */ + keys= maxbuffer; + break; + } } while ((maxbuffer= (size_t) (records/(keys-1)+1)) != maxbuffer_org); } @@ -229,6 +237,20 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages, &tempfile,&tempfile_for_exceptions)) == HA_POS_ERROR) goto err; /* purecov: tested */ + if (maxbuffer >= keys) + { + /* + merge_many_buff will crash if maxbuffer >= keys as then we cannot store in memory + the keys for each buffer. + */ + keys= maxbuffer + 1; + if (!(sort_keys= ((uchar **) + my_realloc(PSI_INSTRUMENT_ME, sort_keys, + (size_t) (keys*(sort_length+sizeof(char*))+ + HA_FT_MAXBYTELEN), MYF(MY_FREE_ON_ERROR))))) + goto err; + } + if (maxbuffer == 0) { if (!no_messages) diff --git a/storage/oqgraph/CMakeLists.txt b/storage/oqgraph/CMakeLists.txt index e725f9712ea..2cb02727a64 100644 --- a/storage/oqgraph/CMakeLists.txt +++ b/storage/oqgraph/CMakeLists.txt @@ -1,6 +1,6 @@ set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") -SET(CPACK_RPM_oqgraph-engine_PACKAGE_SUMMARY "OQGraph storage engine for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_oqgraph-engine_PACKAGE_SUMMARY "OQGraph storage engine for MariaDB server" PARENT_SCOPE) SET(CPACK_RPM_oqgraph-engine_PACKAGE_DESCRIPTION "The Open Query GRAPH computation engine, or OQGRAPH as the engine itself is called, allows you to handle hierarchies (tree structures) and complex graphs (nodes having many connections in several directions). diff --git a/storage/rocksdb/CMakeLists.txt b/storage/rocksdb/CMakeLists.txt index 3f61562560c..70a0e68343b 100644 --- a/storage/rocksdb/CMakeLists.txt +++ b/storage/rocksdb/CMakeLists.txt @@ -1,6 +1,6 @@ # TODO: Copyrights -SET(CPACK_RPM_rocksdb-engine_PACKAGE_SUMMARY "RocksDB storage engine for MariaDB" PARENT_SCOPE) +SET(CPACK_RPM_rocksdb-engine_PACKAGE_SUMMARY "RocksDB storage engine for MariaDB server" PARENT_SCOPE) 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) diff --git a/storage/rocksdb/rdb_i_s.cc b/storage/rocksdb/rdb_i_s.cc index a3d284dfa64..c830c59a38b 100644 --- a/storage/rocksdb/rdb_i_s.cc +++ b/storage/rocksdb/rdb_i_s.cc @@ -65,7 +65,16 @@ namespace RDB_CFSTATS_FIELD { enum { CF_NAME = 0, STAT_TYPE, VALUE }; } // namespace RDB_CFSTATS_FIELD -using namespace Show; + +using Column = Show::Column; +using CEnd = Show::CEnd; +using Varchar = Show::Varchar; +using SShort = Show::SShort; +using SLong = Show::SLong; +using SLonglong = Show::SLonglong; +using ULonglong = Show::ULonglong; +using Double = Show::Double; + static ST_FIELD_INFO rdb_i_s_cfstats_fields_info[] = { Column("CF_NAME", Varchar(NAME_LEN + 1), NOT_NULL), 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 9cf4ce99dc3..f680cd438cf 100644 --- a/storage/spider/mysql-test/spider/bg/t/basic_sql.test +++ b/storage/spider/mysql-test/spider/bg/t/basic_sql.test @@ -889,7 +889,9 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT found_rows(); +--enable_ps2_protocol --echo --echo select high_priority diff --git a/storage/spider/mysql-test/spider/bg/t/direct_aggregate.test b/storage/spider/mysql-test/spider/bg/t/direct_aggregate.test index 5c0c37f483d..4b33069245f 100644 --- a/storage/spider/mysql-test/spider/bg/t/direct_aggregate.test +++ b/storage/spider/mysql-test/spider/bg/t/direct_aggregate.test @@ -126,6 +126,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -137,6 +138,7 @@ SELECT MAX(a) FROM ta_l WHERE a < 5; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/bg/t/direct_aggregate_part.test b/storage/spider/mysql-test/spider/bg/t/direct_aggregate_part.test index cb0b55e9788..95747516df2 100644 --- a/storage/spider/mysql-test/spider/bg/t/direct_aggregate_part.test +++ b/storage/spider/mysql-test/spider/bg/t/direct_aggregate_part.test @@ -132,6 +132,7 @@ if ($HAVE_PARTITION) (4, 'd', '2003-11-30 05:01:03'), (5, 'c', '2001-12-31 23:59:59'); --enable_query_log + --disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l2; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -143,6 +144,7 @@ if ($HAVE_PARTITION) eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l2 WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; + --enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/bg/t/ha.test b/storage/spider/mysql-test/spider/bg/t/ha.test index c36b7363a6d..1924b908668 100644 --- a/storage/spider/mysql-test/spider/bg/t/ha.test +++ b/storage/spider/mysql-test/spider/bg/t/ha.test @@ -477,7 +477,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo active standby test @@ -841,7 +843,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bg/t/spider_fixes.test b/storage/spider/mysql-test/spider/bg/t/spider_fixes.test index b222f494ba1..538674a3ff4 100644 --- a/storage/spider/mysql-test/spider/bg/t/spider_fixes.test +++ b/storage/spider/mysql-test/spider/bg/t/spider_fixes.test @@ -152,8 +152,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a < 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -194,8 +196,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a <= 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -917,7 +921,9 @@ SELECT a, b, c FROM ta_l_int ORDER BY a; --echo direct order limit --connection master_1 eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; +--disable_ps2_protocol SELECT a, b, c FROM ta_l_int ORDER BY a LIMIT 3; +--enable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; diff --git a/storage/spider/mysql-test/spider/bugfix/disabled.def b/storage/spider/mysql-test/spider/bugfix/disabled.def index e19ea07b76b..99443c854e5 100644 --- a/storage/spider/mysql-test/spider/bugfix/disabled.def +++ b/storage/spider/mysql-test/spider/bugfix/disabled.def @@ -1 +1,2 @@ wait_timeout : MDEV-26045 +mdev_29904 : MDEV-31101 diff --git a/storage/spider/mysql-test/spider/bugfix/r/index.result b/storage/spider/mysql-test/spider/bugfix/r/index.result index 2aa0b56ef06..334d3db9443 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/index.result +++ b/storage/spider/mysql-test/spider/bugfix/r/index.result @@ -85,9 +85,7 @@ DROP FUNCTION spider_copy_tables; DROP FUNCTION spider_ping_table; DROP FUNCTION spider_bg_direct_sql; DROP FUNCTION spider_direct_sql; -UNINSTALL PLUGIN spider_wrapper_protocols; -UNINSTALL PLUGIN spider_alloc_mem; -UNINSTALL PLUGIN spider; +UNINSTALL SONAME IF EXISTS "ha_spider"; Warnings: Warning 1620 Plugin is busy and will be uninstalled on shutdown DROP TABLE IF EXISTS mysql.spider_xa; diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result index b2edaff6918..72921d2e695 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_26541.result @@ -1,14 +1,13 @@ # # MDEV-26541 Undefined symbol: _ZTI12ha_partition when attempting to use ha_spider.so in UBSAN builds # -INSTALL PLUGIN spider SONAME 'ha_spider.so'; +INSTALL SONAME 'ha_spider.so'; DROP FUNCTION spider_flush_table_mon_cache; DROP FUNCTION spider_copy_tables; DROP FUNCTION spider_ping_table; DROP FUNCTION spider_bg_direct_sql; DROP FUNCTION spider_direct_sql; -UNINSTALL PLUGIN spider_alloc_mem; -UNINSTALL PLUGIN spider; +UNINSTALL SONAME IF EXISTS "ha_spider"; DROP TABLE IF EXISTS mysql.spider_xa; DROP TABLE IF EXISTS mysql.spider_xa_member; DROP TABLE IF EXISTS mysql.spider_xa_failed_log; diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_29447.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_29447.result new file mode 100644 index 00000000000..358e131fcf2 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_29447.result @@ -0,0 +1,33 @@ +# +# MDEV-29447 SIGSEGV in spider_db_open_item_field and SIGSEGV spider_db_print_item_type, on SELECT +# +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 +connection child2_1; +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +CREATE TABLE tbl_a ( +a INT +) ENGINE=InnoDB DEFAULT CHARSET=utf8; +connection master_1; +CREATE DATABASE auto_test_local; +USE auto_test_local; +CREATE TABLE tbl_a ( +a INT +) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='table "tbl_a", srv "s_2_1"'; +SELECT TRIM(LEADING 'c' FROM a) FROM tbl_a; +TRIM(LEADING 'c' FROM a) +connection child2_1; +DROP DATABASE auto_test_remote; +connection master_1; +DROP DATABASE auto_test_local; +for master_1 +for child2 +child2_1 +child2_2 +child2_3 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_30981.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_30981.result new file mode 100644 index 00000000000..6db36e2b46c --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_30981.result @@ -0,0 +1,12 @@ +# +# MDEV-30981 Spider UBSAN: null pointer passed as argument 2, which is declared to never be null in spider_create_trx_alter_table on ALTER +# +for master_1 +for child2 +for child3 +CREATE TABLE t (c INT) ENGINE=Spider PARTITION BY LIST (c) (PARTITION p VALUES IN (1,2)); +ALTER TABLE t ENGINE=InnoDB; +drop table t; +for master_1 +for child2 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result new file mode 100644 index 00000000000..dd951933fff --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_31338.result @@ -0,0 +1,15 @@ +# +# MDEV-31338 UBSAN: runtime error: member access within null pointer of type 'struct SPIDER_FIELD_CHAIN' and SIGSEGV in spider_db_open_item_ident on SELECT +# +for master_1 +for child2 +for child3 +CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t (c BLOB) ENGINE=InnoDB; +CREATE TABLE ts (c BLOB) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +SELECT TRIM(BOTH ' ' FROM c) FROM ts ORDER BY c; +TRIM(BOTH ' ' FROM c) +drop table t, ts; +for master_1 +for child2 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result new file mode 100644 index 00000000000..26feb14c3fc --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_31524.result @@ -0,0 +1,50 @@ + +MDEV-31524 Spider variables that double as table params overriding mechanism is buggy + +for master_1 +for child2 +for child3 +SET @old_spider_read_only_mode = @@session.spider_read_only_mode; +CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +set session spider_read_only_mode = default; +create table t2 (c int); +create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv_mdev_31524",TABLE "t2"'; +/* 1 */ insert into t1 values (42); +drop table t1, t2; +set session spider_read_only_mode = 1; +create table t2 (c int); +create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv_mdev_31524",TABLE "t2"'; +/* 2 */ insert into t1 values (42); +ERROR HY000: Table 'test.t1' is read only +drop table t1, t2; +set session spider_read_only_mode = -1; +Warnings: +Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release +create table t2 (c int); +create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "srv_mdev_31524",TABLE "t2"'; +/* 3 */ insert into t1 values (42); +drop table t1, t2; +SET session spider_read_only_mode = default; +create table t2 (c int); +create table t1 (c int) ENGINE=Spider COMMENT='read_only_mode "1", WRAPPER "mysql", srv "srv_mdev_31524",TABLE "t2"'; +/* 4 */ insert into t1 values (42); +ERROR HY000: Table 'test.t1' is read only +drop table t1, t2; +set session spider_read_only_mode = 1; +create table t2 (c int); +create table t1 (c int) ENGINE=Spider COMMENT='read_only_mode "0", WRAPPER "mysql", srv "srv_mdev_31524",TABLE "t2"'; +/* 5 */ insert into t1 values (42); +drop table t1, t2; +SET session spider_read_only_mode = -1; +Warnings: +Warning 138 The option value -1 (use table value) is deprecated and will be removed in a future release +create table t2 (c int); +create table t1 (c int) ENGINE=Spider COMMENT='read_only_mode "1", WRAPPER "mysql", srv "srv_mdev_31524",TABLE "t2"'; +/* 6 */ insert into t1 values (42); +ERROR HY000: Table 'test.t1' is read only +drop table t1, t2; +drop server srv_mdev_31524; +SET session spider_read_only_mode = @old_spider_read_only_mode; +for master_1 +for child2 +for child3 diff --git a/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mariadb.result b/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mariadb.result index a0103695d5a..1b5a0891fd1 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mariadb.result +++ b/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mariadb.result @@ -50,7 +50,7 @@ pkey connection child2_1; SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%sql_mode%'; argument -set session transaction isolation level repeatable read;set session autocommit = 1;set session sql_log_off = 0;set session wait_timeout = 604800;set session sql_mode = 'real_as_float,ignore_bad_table_options,no_unsigned_subtraction,no_dir_in_create,no_auto_value_on_zero,strict_trans_tables,strict_all_tables,no_zero_in_date,no_zero_date,allow_invalid_dates,error_for_division_by_zero,no_auto_create_user,high_not_precedence,no_engine_substitution,pad_char_to_full_length,empty_string_is_null,simultaneous_assignment,time_round_fractional';set session time_zone = '+00:00';set @`spider_lc_./auto_test_remote/tbl_a` = '-xxxxxxxxxxxx-xxxxx-./auto_test_local/tbl_a-';start transaction +set session transaction isolation level repeatable read;set session autocommit = 1;set session sql_log_off = 0;set session wait_timeout = 604800;set session sql_mode = 'real_as_float,ignore_bad_table_options,no_unsigned_subtraction,no_dir_in_create,no_auto_value_on_zero,strict_trans_tables,strict_all_tables,no_zero_in_date,no_zero_date,allow_invalid_dates,error_for_division_by_zero,no_auto_create_user,high_not_precedence,no_engine_substitution,pad_char_to_full_length,empty_string_is_null,simultaneous_assignment,time_round_fractional';set session time_zone = '+00:00';set @`spider_lc_./auto_test_remote/tbl_a` = '-xxxxxxxxxxxx-xxxxx-./auto_test_local/tbl_a-' SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%sql_mode%' SELECT pkey FROM tbl_a ORDER BY pkey; pkey diff --git a/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mysql.result b/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mysql.result index e75378a5e40..73bb4e9410c 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mysql.result +++ b/storage/spider/mysql-test/spider/bugfix/r/sql_mode_mysql.result @@ -50,7 +50,7 @@ pkey connection child2_1; SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%sql_mode%'; argument -set session transaction isolation level repeatable read;set session autocommit = 1;set session sql_log_off = 0;set session wait_timeout = 604800;set session sql_mode = 'real_as_float,ignore_bad_table_options,no_unsigned_subtraction,no_dir_in_create,no_auto_value_on_zero,strict_trans_tables,strict_all_tables,no_zero_in_date,no_zero_date,allow_invalid_dates,error_for_division_by_zero,no_auto_create_user,high_not_precedence,no_engine_substitution,pad_char_to_full_length';set session time_zone = '+00:00';set @`spider_lc_./auto_test_remote/tbl_a` = '-xxxxxxxxxxxx-xxxxx-./auto_test_local/tbl_a-';start transaction +set session transaction isolation level repeatable read;set session autocommit = 1;set session sql_log_off = 0;set session wait_timeout = 604800;set session sql_mode = 'real_as_float,ignore_bad_table_options,no_unsigned_subtraction,no_dir_in_create,no_auto_value_on_zero,strict_trans_tables,strict_all_tables,no_zero_in_date,no_zero_date,allow_invalid_dates,error_for_division_by_zero,no_auto_create_user,high_not_precedence,no_engine_substitution,pad_char_to_full_length';set session time_zone = '+00:00';set @`spider_lc_./auto_test_remote/tbl_a` = '-xxxxxxxxxxxx-xxxxx-./auto_test_local/tbl_a-' SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%sql_mode%' SELECT pkey FROM tbl_a ORDER BY pkey; pkey diff --git a/storage/spider/mysql-test/spider/bugfix/t/checksum_table_with_quick_mode_3.test b/storage/spider/mysql-test/spider/bugfix/t/checksum_table_with_quick_mode_3.test index 5dc4a88c842..de2dd90a500 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/checksum_table_with_quick_mode_3.test +++ b/storage/spider/mysql-test/spider/bugfix/t/checksum_table_with_quick_mode_3.test @@ -52,7 +52,9 @@ TRUNCATE TABLE mysql.general_log; CHECKSUM TABLE tbl_a EXTENDED; --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --echo diff --git a/storage/spider/mysql-test/spider/bugfix/t/cp932_column.test b/storage/spider/mysql-test/spider/bugfix/t/cp932_column.test index 8bd0d40cb60..119179702ec 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/cp932_column.test +++ b/storage/spider/mysql-test/spider/bugfix/t/cp932_column.test @@ -59,7 +59,9 @@ SET NAMES utf8; --connection child2_1 SET NAMES cp932; +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; SET NAMES utf8; diff --git a/storage/spider/mysql-test/spider/bugfix/t/delete_with_float_column.inc b/storage/spider/mysql-test/spider/bugfix/t/delete_with_float_column.inc index 349808824e7..a4def9b3dc8 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/delete_with_float_column.inc +++ b/storage/spider/mysql-test/spider/bugfix/t/delete_with_float_column.inc @@ -78,7 +78,9 @@ sync_with_master; SET SESSION sql_log_bin= 0; --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --connection slave1_1 diff --git a/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_comma_pwd.test b/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_comma_pwd.test index 0b7d51190a7..ede4144a524 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_comma_pwd.test +++ b/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_comma_pwd.test @@ -19,7 +19,9 @@ eval CREATE TEMPORARY TABLE tmp_a ( ) $MASTER_1_ENGINE2; --enable_query_log +--disable_ps2_protocol eval $DIRECT_SQL_COMMAND; +--enable_ps2_protocol SELECT pkey FROM tmp_a; --echo diff --git a/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.test b/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.test index 139af5c83c9..01fcc20bbe1 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.test +++ b/storage/spider/mysql-test/spider/bugfix/t/direct_sql_with_tmp_table.test @@ -19,7 +19,9 @@ eval CREATE TEMPORARY TABLE tmp_a ( ) $MASTER_1_ENGINE2; --enable_query_log +--disable_ps2_protocol eval $DIRECT_SQL_COMMAND; +--enable_ps2_protocol SELECT pkey FROM tmp_a; --echo diff --git a/storage/spider/mysql-test/spider/bugfix/t/group_by_order_by_limit.test b/storage/spider/mysql-test/spider/bugfix/t/group_by_order_by_limit.test index f1de6d5d25f..96c2ea6c849 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/group_by_order_by_limit.test +++ b/storage/spider/mysql-test/spider/bugfix/t/group_by_order_by_limit.test @@ -66,6 +66,7 @@ TRUNCATE TABLE mysql.general_log; --connection child2_2 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT skey, count(*) cnt FROM tbl_a GROUP BY skey ORDER BY cnt DESC, skey DESC LIMIT 5; @@ -76,6 +77,7 @@ eval $CHILD2_1_SELECT_TABLES; --connection child2_2 eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/insert_select.test b/storage/spider/mysql-test/spider/bugfix/t/insert_select.test index 381e72f7b1b..c2ac615e2ac 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/insert_select.test +++ b/storage/spider/mysql-test/spider/bugfix/t/insert_select.test @@ -79,7 +79,9 @@ INSERT IGNORE INTO tbl_b (SELECT skey, CAST(CONCAT(dt, ' ', tm) AS datetime) FRO INSERT IGNORE INTO tbl_b (SELECT skey, CAST(CONCAT(dt, ' ', tm) AS datetime) FROM tbl_a WHERE skey = 5 AND dt > DATE_ADD('2012-12-01', INTERVAL -10 DAY)); --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --echo diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_19866.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_19866.test index 05b753ae8bb..0b8ce69cd73 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_19866.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_19866.test @@ -63,6 +63,7 @@ TRUNCATE TABLE mysql.general_log; TRUNCATE TABLE mysql.general_log; --connection master_1 +--disable_ps2_protocol SELECT * FROM tbl_a; SELECT * FROM tbl_a WHERE pkey = 1; SELECT * FROM tbl_a; @@ -76,6 +77,7 @@ eval $CHILD2_1_SELECT_TABLES; --connection child2_2 eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit 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 3f522b4f6f5..3d1ccf3ce6a 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_20100.test @@ -57,6 +57,7 @@ INSERT INTO tbl_a (a, b, c) VALUES TRUNCATE TABLE mysql.general_log; --connection master_1 +--disable_ps2_protocol SELECT a, b, c FROM tbl_a PARTITION (pt2) WHERE b = 'c'; SELECT a, b, c FROM tbl_a PARTITION (pt1,pt2); SELECT a, b, c FROM tbl_a PARTITION (pt3) WHERE b = 'c'; @@ -65,9 +66,12 @@ SELECT a, b, c FROM tbl_a PARTITION (pt1) WHERE b = 'c'; SELECT a, b, c FROM tbl_a PARTITION (pt1,pt3); SELECT a, b, c FROM tbl_a PARTITION (pt1) WHERE b = 'c'; SELECT a, b, c FROM tbl_a PARTITION (pt2,pt3); +--enable_ps2_protocol --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol --disable_ps_protocol eval $CHILD2_1_SELECT_TABLES; --enable_ps_protocol diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_20502.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_20502.test index 2d6ff5b4663..1cd1c689372 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_20502.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_20502.test @@ -47,6 +47,7 @@ INSERT INTO tbl_a (val) VALUES (1); --connection child2_1 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT id, 0 AS const, val FROM tbl_a; SELECT 1+2, id, 0 AS const, val, val+10, (SELECT tbl_a.val+1 FROM tbl_a) AS sq @@ -60,6 +61,7 @@ FROM tbl_a GROUP BY val; --connection child2_1 eval $CHILD2_1_SELECT_ARGUMENT1; eval $CHILD2_1_SELECT_TABLES; +--enable_ps2_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 16836cfce28..c1a9aaa4e9d 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_21884.test @@ -75,11 +75,15 @@ INSERT INTO tb_l (a, b, c) VALUES TRUNCATE TABLE mysql.general_log; --connection master_1 +--disable_ps2_protocol SELECT STRAIGHT_JOIN b.a, b.b FROM tb_l a, tbl_a b WHERE a.a = b.a; +--enable_ps2_protocol --connection child2_1 SET NAMES utf8; +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol --disable_ps_protocol eval $CHILD2_1_SELECT_TABLES; --enable_ps_protocol diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test index ffd99390748..bf6cb255d02 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_26541.test @@ -2,14 +2,14 @@ --echo # MDEV-26541 Undefined symbol: _ZTI12ha_partition when attempting to use ha_spider.so in UBSAN builds --echo # -if (`select not(count(*)) from information_schema.system_variables where variable_name='have_sanitizer' and global_value="UBSAN"`) +if (`select not(count(*)) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like "%UBSAN%"`) { --skip test needs to be run with UBSAN } # init spider -INSTALL PLUGIN spider SONAME 'ha_spider.so'; +INSTALL SONAME 'ha_spider.so'; let $PLUGIN_NAME= spider_flush_table_mon_cache; let $PLUGIN_EXIST= @@ -20,21 +20,4 @@ while (!$PLUGIN_EXIST) `SELECT COUNT(*) FROM mysql.func WHERE name = '$PLUGIN_NAME'`; } -# deinit spider - -DROP FUNCTION spider_flush_table_mon_cache; -DROP FUNCTION spider_copy_tables; -DROP FUNCTION spider_ping_table; -DROP FUNCTION spider_bg_direct_sql; -DROP FUNCTION spider_direct_sql; -UNINSTALL PLUGIN spider_alloc_mem; -UNINSTALL PLUGIN spider; -DROP TABLE IF EXISTS mysql.spider_xa; -DROP TABLE IF EXISTS mysql.spider_xa_member; -DROP TABLE IF EXISTS mysql.spider_xa_failed_log; -DROP TABLE IF EXISTS mysql.spider_tables; -DROP TABLE IF EXISTS mysql.spider_link_mon_servers; -DROP TABLE IF EXISTS mysql.spider_link_failed_log; -DROP TABLE IF EXISTS mysql.spider_table_position_for_recovery; -DROP TABLE IF EXISTS mysql.spider_table_sts; -DROP TABLE IF EXISTS mysql.spider_table_crd; +--source ../../include/clean_up_spider.inc diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_27172.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_27172.test index 60c0ad42921..d6e2ff2c8df 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_27172.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_27172.test @@ -48,6 +48,7 @@ eval CREATE TABLE tbl_a ( KEY k (greeting) ) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='table "tbl_a", srv "s_2_1"'; +--disable_ps2_protocol INSERT INTO tbl_a VALUES (1, "Hi!"),(2, "Aloha!"),(3, "Aloha!!!"); SELECT * FROM tbl_a WHERE greeting = "Aloha!" AND CASE greeting WHEN "Aloha!" THEN "one" ELSE 'more' END = "one"; # hack to disable GBH @@ -76,6 +77,7 @@ SELECT * FROM tbl_c WHERE greeting = "Aloha!" --connection child2_1 SELECT argument FROM mysql.general_log WHERE argument LIKE 'select `id`,`greeting` from %'; +--enable_ps2_protocol --connection child2_1 SET @@global.general_log = @general_log_backup; diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29447.cnf b/storage/spider/mysql-test/spider/bugfix/t/mdev_29447.cnf new file mode 100644 index 00000000000..05dfd8a0bce --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29447.cnf @@ -0,0 +1,3 @@ +!include include/default_mysqld.cnf +!include ../my_1_1.cnf +!include ../my_2_1.cnf diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_29447.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_29447.test new file mode 100644 index 00000000000..60250be6481 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_29447.test @@ -0,0 +1,37 @@ +--echo # +--echo # MDEV-29447 SIGSEGV in spider_db_open_item_field and SIGSEGV spider_db_print_item_type, on SELECT +--echo # + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +--connection child2_1 +CREATE DATABASE auto_test_remote; +USE auto_test_remote; +eval CREATE TABLE tbl_a ( + a INT +) $CHILD2_1_ENGINE $CHILD2_1_CHARSET; + +--connection master_1 +CREATE DATABASE auto_test_local; +USE auto_test_local; +eval CREATE TABLE tbl_a ( + a INT +) $MASTER_1_ENGINE $MASTER_1_CHARSET COMMENT='table "tbl_a", srv "s_2_1"'; + +SELECT TRIM(LEADING 'c' FROM a) FROM tbl_a; + +--connection child2_1 +DROP DATABASE auto_test_remote; + +--connection master_1 +DROP DATABASE auto_test_local; + +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_query_log +--enable_result_log diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_30370.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_30370.test index 99e56ab062a..0e982d90ba6 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_30370.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_30370.test @@ -1,3 +1,4 @@ +--source include/have_wsrep.inc --echo # --echo # MDEV-30370 mariadbd hangs when running with --wsrep-recover and --plugin-load-add=ha_spider.so --echo # diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test new file mode 100644 index 00000000000..cc24ce82ce4 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_30981.test @@ -0,0 +1,24 @@ +--echo # +--echo # MDEV-30981 Spider UBSAN: null pointer passed as argument 2, which is declared to never be null in spider_create_trx_alter_table on ALTER +--echo # + +if (`select not(count(*)) from information_schema.system_variables where variable_name='have_sanitizer' and global_value like "%UBSAN%"`) +{ +--skip test needs to be run with UBSAN +} + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +CREATE TABLE t (c INT) ENGINE=Spider PARTITION BY LIST (c) (PARTITION p VALUES IN (1,2)); +ALTER TABLE t ENGINE=InnoDB; +drop table t; + +--disable_query_log +--disable_result_log +--source ../t/test_deinit.inc +--enable_query_log +--enable_result_log diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test new file mode 100644 index 00000000000..95ca7c1253c --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_31338.test @@ -0,0 +1,22 @@ +--echo # +--echo # MDEV-31338 UBSAN: runtime error: member access within null pointer of type 'struct SPIDER_FIELD_CHAIN' and SIGSEGV in spider_db_open_item_ident on SELECT +--echo # +--source include/have_innodb.inc + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +evalp CREATE SERVER srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); +CREATE TABLE t (c BLOB) ENGINE=InnoDB; +CREATE TABLE ts (c BLOB) ENGINE=Spider COMMENT='WRAPPER "mysql",srv "srv",TABLE "t"'; +SELECT TRIM(BOTH ' ' FROM c) FROM ts ORDER BY c; +drop table t, ts; + +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test new file mode 100644 index 00000000000..64cbf4154aa --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_31524.test @@ -0,0 +1,73 @@ +--echo +--echo MDEV-31524 Spider variables that double as table params overriding mechanism is buggy +--echo + +--disable_query_log +--disable_result_log +--source ../../t/test_init.inc +--enable_result_log +--enable_query_log + +--let $srv=srv_mdev_31524 +SET @old_spider_read_only_mode = @@session.spider_read_only_mode; +evalp CREATE SERVER $srv FOREIGN DATA WRAPPER MYSQL OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); + +# when the user does not set var nor the table option, the default +# value (0 in this case) takes effect. +set session spider_read_only_mode = default; +create table t2 (c int); +eval create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "$srv",TABLE "t2"'; +/* 1 */ insert into t1 values (42); +drop table t1, t2; + +# when the user sets var but not the table option, the var should be +# take effect. +set session spider_read_only_mode = 1; +create table t2 (c int); +eval create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "$srv",TABLE "t2"'; +--error 12518 +/* 2 */ insert into t1 values (42); +drop table t1, t2; + +# when the user sets var to -1 and does not set the table option, the +# default value takes effect. +set session spider_read_only_mode = -1; +create table t2 (c int); +eval create table t1 (c int) ENGINE=Spider COMMENT='WRAPPER "mysql", srv "$srv",TABLE "t2"'; +/* 3 */ insert into t1 values (42); +drop table t1, t2; + +# when the user does not set the var, but sets the table option, the +# table option should take effect +SET session spider_read_only_mode = default; +create table t2 (c int); +eval create table t1 (c int) ENGINE=Spider COMMENT='read_only_mode "1", WRAPPER "mysql", srv "$srv",TABLE "t2"'; +--error 12518 +/* 4 */ insert into t1 values (42); +drop table t1, t2; + +# when the user sets both var and table option, the table option +# should take precedence +set session spider_read_only_mode = 1; +create table t2 (c int); +eval create table t1 (c int) ENGINE=Spider COMMENT='read_only_mode "0", WRAPPER "mysql", srv "$srv",TABLE "t2"'; +/* 5 */ insert into t1 values (42); +drop table t1, t2; + +# when the user sets the var to -1 and sets the table option, the +# table option should take effect +SET session spider_read_only_mode = -1; +create table t2 (c int); +eval create table t1 (c int) ENGINE=Spider COMMENT='read_only_mode "1", WRAPPER "mysql", srv "$srv",TABLE "t2"'; +--error 12518 +/* 6 */ insert into t1 values (42); +drop table t1, t2; + +eval drop server $srv; + +SET session spider_read_only_mode = @old_spider_read_only_mode; +--disable_query_log +--disable_result_log +--source ../../t/test_deinit.inc +--enable_result_log +--enable_query_log diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test index 235edc10d12..3fd9e623887 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_0.test @@ -73,6 +73,7 @@ TRUNCATE TABLE mysql.general_log; --connection child2_2 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; @@ -135,6 +136,7 @@ eval $CHILD2_1_SELECT_TABLES; --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test index 01fa0cb5128..940fa61c598 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_1.test @@ -73,6 +73,7 @@ TRUNCATE TABLE mysql.general_log; --connection child2_2 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; @@ -135,6 +136,7 @@ eval $CHILD2_1_SELECT_TABLES; --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test index 3ea8138e755..e9270a2ee93 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_2.test @@ -73,6 +73,7 @@ TRUNCATE TABLE mysql.general_log; --connection child2_2 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; @@ -135,6 +136,7 @@ eval $CHILD2_1_SELECT_TABLES; --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test index bc926b0a296..ad042aadfed 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test +++ b/storage/spider/mysql-test/spider/bugfix/t/quick_mode_3.test @@ -74,6 +74,7 @@ TRUNCATE TABLE mysql.general_log; --connection child2_2 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; @@ -136,6 +137,7 @@ eval $CHILD2_1_SELECT_TABLES; --replace_regex /tmp_spider_bka_0x[0-9a-f]*/tmp_spider_bka_xxxx/ eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_insert.test b/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_insert.test index 2beb9d9d7e4..d4c0db1e7cc 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_insert.test +++ b/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_insert.test @@ -56,7 +56,9 @@ exec $MYSQL -v -v -u root -h localhost -P $MASTER_1_MYPORT -S $MASTER_1_MYSOCK - --enable_query_log --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; TRUNCATE TABLE mysql.general_log; @@ -67,7 +69,9 @@ exec $MYSQL -v -v -u root -h localhost -P $MASTER_1_MYPORT -S $MASTER_1_MYSOCK - --enable_query_log --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; TRUNCATE TABLE mysql.general_log; @@ -78,7 +82,9 @@ exec $MYSQL -v -v -u root -h localhost -P $MASTER_1_MYPORT -S $MASTER_1_MYSOCK - --enable_query_log --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --echo diff --git a/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_update.test b/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_update.test index 50d9f345dfb..a5f63978a22 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_update.test +++ b/storage/spider/mysql-test/spider/bugfix/t/return_found_rows_update.test @@ -58,7 +58,9 @@ exec $MYSQL -v -v -u root -h localhost --default-character-set=latin1 -P $MASTER --enable_query_log --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --echo diff --git a/storage/spider/mysql-test/spider/bugfix/t/select_by_null.test b/storage/spider/mysql-test/spider/bugfix/t/select_by_null.test index 1f540b2a15f..feb7df57f02 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/select_by_null.test +++ b/storage/spider/mysql-test/spider/bugfix/t/select_by_null.test @@ -52,7 +52,9 @@ TRUNCATE TABLE mysql.general_log; SELECT pkey FROM tbl_a WHERE NULL; --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --echo diff --git a/storage/spider/mysql-test/spider/bugfix/t/select_with_backquote.test b/storage/spider/mysql-test/spider/bugfix/t/select_with_backquote.test index 4c4d687cf89..b511b05bf01 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/select_with_backquote.test +++ b/storage/spider/mysql-test/spider/bugfix/t/select_with_backquote.test @@ -48,6 +48,7 @@ FLUSH TABLES; --connection child2_1 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SET NAMES utf8; SELECT `pkey`, LEFT(`txt_utf8`, 4) FROM `auto_test_local`.`tbl_a` ORDER BY LEFT(`txt_utf8`, 4) LIMIT 3; @@ -56,6 +57,7 @@ SELECT `pkey`, LEFT(`txt_utf8`, 4) FROM `auto_test_local`.`tbl_a` ORDER BY LEFT( SET NAMES utf8; eval $CHILD2_1_SELECT_ARGUMENT1; eval $CHILD2_1_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.test b/storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.test index c608ae018ea..3d4280e35e4 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.test +++ b/storage/spider/mysql-test/spider/bugfix/t/slave_trx_isolation.test @@ -70,8 +70,11 @@ sync_with_master; SET SESSION sql_log_bin= 0; --connection child2_1 + +--disable_ps2_protocol --replace_regex /-[0-9a-f]{12}-[0-9a-f]+-/-xxxxxxxxxxxx-xxxxx-/ eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --connection slave1_1 diff --git a/storage/spider/mysql-test/spider/bugfix/t/sql_mode.inc b/storage/spider/mysql-test/spider/bugfix/t/sql_mode.inc index f094b1f80a3..c4b17f6a837 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/sql_mode.inc +++ b/storage/spider/mysql-test/spider/bugfix/t/sql_mode.inc @@ -44,6 +44,7 @@ INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); --connection child2_1 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT * FROM tbl_a ORDER BY pkey; @@ -51,6 +52,7 @@ SELECT * FROM tbl_a ORDER BY pkey; --replace_regex /-[0-9a-f]{12}-[0-9a-f]+-/-xxxxxxxxxxxx-xxxxx-/ eval $CHILD2_1_SELECT_ARGUMENT1; eval $CHILD2_1_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/strict_group_by.test b/storage/spider/mysql-test/spider/bugfix/t/strict_group_by.test index 8b8da46d56c..a084be372fa 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/strict_group_by.test +++ b/storage/spider/mysql-test/spider/bugfix/t/strict_group_by.test @@ -68,14 +68,20 @@ TRUNCATE TABLE mysql.general_log; --connection master_1 FLUSH TABLES; +--disable_ps2_protocol SELECT count(pkey) cnt, skey FROM tbl_a; +--enable_ps2_protocol --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --connection child2_2 +--disable_ps2_protocol eval $CHILD2_2_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_2_SELECT_TABLES; --echo diff --git a/storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.test b/storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.test index 4f980140a31..d32af31674a 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.test +++ b/storage/spider/mysql-test/spider/bugfix/t/wrapper_mariadb.test @@ -45,6 +45,7 @@ INSERT INTO tbl_a (pkey) VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); --connection child2_1 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT * FROM tbl_a ORDER BY pkey; @@ -53,6 +54,7 @@ SELECT * FROM tbl_a ORDER BY pkey; replace_regex /order by t0.`pkey`/order by `pkey`/; eval $CHILD2_1_SELECT_ARGUMENT1; eval $CHILD2_1_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/bugfix/t/xa_cmd.test b/storage/spider/mysql-test/spider/bugfix/t/xa_cmd.test index 9ae528071e3..1e831453e41 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/xa_cmd.test +++ b/storage/spider/mysql-test/spider/bugfix/t/xa_cmd.test @@ -49,7 +49,9 @@ XA PREPARE 'test'; XA COMMIT 'test'; --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --echo diff --git a/storage/spider/mysql-test/spider/feature/t/checksum_table_parallel.inc b/storage/spider/mysql-test/spider/feature/t/checksum_table_parallel.inc index 13e5053d64c..83c3ffd6c54 100644 --- a/storage/spider/mysql-test/spider/feature/t/checksum_table_parallel.inc +++ b/storage/spider/mysql-test/spider/feature/t/checksum_table_parallel.inc @@ -60,6 +60,7 @@ INSERT INTO tbl_a (pkey) VALUES (20),(21),(22),(23),(24),(25),(26),(27),(28),(29 --echo --echo select test 1 +--disable_ps2_protocol --connection child2_1 TRUNCATE TABLE mysql.general_log; LOCK TABLE tbl_a WRITE; @@ -88,6 +89,7 @@ eval $CHILD2_2_SELECT_TABLES; --connection master_1 reap; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/handler/t/basic_sql.test b/storage/spider/mysql-test/spider/handler/t/basic_sql.test index 9cf4ce99dc3..f680cd438cf 100644 --- a/storage/spider/mysql-test/spider/handler/t/basic_sql.test +++ b/storage/spider/mysql-test/spider/handler/t/basic_sql.test @@ -889,7 +889,9 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT found_rows(); +--enable_ps2_protocol --echo --echo select high_priority diff --git a/storage/spider/mysql-test/spider/handler/t/direct_aggregate.test b/storage/spider/mysql-test/spider/handler/t/direct_aggregate.test index 5c0c37f483d..4b33069245f 100644 --- a/storage/spider/mysql-test/spider/handler/t/direct_aggregate.test +++ b/storage/spider/mysql-test/spider/handler/t/direct_aggregate.test @@ -126,6 +126,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -137,6 +138,7 @@ SELECT MAX(a) FROM ta_l WHERE a < 5; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/handler/t/direct_aggregate_part.test b/storage/spider/mysql-test/spider/handler/t/direct_aggregate_part.test index cb0b55e9788..95747516df2 100644 --- a/storage/spider/mysql-test/spider/handler/t/direct_aggregate_part.test +++ b/storage/spider/mysql-test/spider/handler/t/direct_aggregate_part.test @@ -132,6 +132,7 @@ if ($HAVE_PARTITION) (4, 'd', '2003-11-30 05:01:03'), (5, 'c', '2001-12-31 23:59:59'); --enable_query_log + --disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l2; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -143,6 +144,7 @@ if ($HAVE_PARTITION) eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l2 WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; + --enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/handler/t/ha.test b/storage/spider/mysql-test/spider/handler/t/ha.test index c36b7363a6d..1924b908668 100644 --- a/storage/spider/mysql-test/spider/handler/t/ha.test +++ b/storage/spider/mysql-test/spider/handler/t/ha.test @@ -477,7 +477,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo active standby test @@ -841,7 +843,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/handler/t/spider_fixes.test b/storage/spider/mysql-test/spider/handler/t/spider_fixes.test index 5a3c1d1c893..85ea279ec79 100644 --- a/storage/spider/mysql-test/spider/handler/t/spider_fixes.test +++ b/storage/spider/mysql-test/spider/handler/t/spider_fixes.test @@ -152,8 +152,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a < 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -194,8 +196,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a <= 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -916,10 +920,11 @@ SELECT a, b, c FROM ta_l_int ORDER BY a; --echo 2.25 --echo direct order limit --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; SELECT a, b, c FROM ta_l_int ORDER BY a LIMIT 3; eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; - +--enable_ps2_protocol --echo --echo 2.26 diff --git a/storage/spider/mysql-test/spider/include/clean_up_spider.inc b/storage/spider/mysql-test/spider/include/clean_up_spider.inc new file mode 100644 index 00000000000..1f0659dc98a --- /dev/null +++ b/storage/spider/mysql-test/spider/include/clean_up_spider.inc @@ -0,0 +1,15 @@ +DROP FUNCTION spider_flush_table_mon_cache; +DROP FUNCTION spider_copy_tables; +DROP FUNCTION spider_ping_table; +DROP FUNCTION spider_bg_direct_sql; +DROP FUNCTION spider_direct_sql; +UNINSTALL SONAME IF EXISTS "ha_spider"; +DROP TABLE IF EXISTS mysql.spider_xa; +DROP TABLE IF EXISTS mysql.spider_xa_member; +DROP TABLE IF EXISTS mysql.spider_xa_failed_log; +DROP TABLE IF EXISTS mysql.spider_tables; +DROP TABLE IF EXISTS mysql.spider_link_mon_servers; +DROP TABLE IF EXISTS mysql.spider_link_failed_log; +DROP TABLE IF EXISTS mysql.spider_table_position_for_recovery; +DROP TABLE IF EXISTS mysql.spider_table_sts; +DROP TABLE IF EXISTS mysql.spider_table_crd; diff --git a/storage/spider/mysql-test/spider/include/deinit_spider.inc b/storage/spider/mysql-test/spider/include/deinit_spider.inc index dd474c59bc7..1d55e3b3d5f 100644 --- a/storage/spider/mysql-test/spider/include/deinit_spider.inc +++ b/storage/spider/mysql-test/spider/include/deinit_spider.inc @@ -28,23 +28,7 @@ if (`SELECT IF($PLUGIN_VERSION = 3, 1, 0)`) DROP TABLE IF EXISTS mysql.spider_rewritten_tables; } } -DROP FUNCTION spider_flush_table_mon_cache; -DROP FUNCTION spider_copy_tables; -DROP FUNCTION spider_ping_table; -DROP FUNCTION spider_bg_direct_sql; -DROP FUNCTION spider_direct_sql; -UNINSTALL PLUGIN spider_wrapper_protocols; -UNINSTALL PLUGIN spider_alloc_mem; -UNINSTALL PLUGIN spider; -DROP TABLE IF EXISTS mysql.spider_xa; -DROP TABLE IF EXISTS mysql.spider_xa_member; -DROP TABLE IF EXISTS mysql.spider_xa_failed_log; -DROP TABLE IF EXISTS mysql.spider_tables; -DROP TABLE IF EXISTS mysql.spider_link_mon_servers; -DROP TABLE IF EXISTS mysql.spider_link_failed_log; -DROP TABLE IF EXISTS mysql.spider_table_position_for_recovery; -DROP TABLE IF EXISTS mysql.spider_table_sts; -DROP TABLE IF EXISTS mysql.spider_table_crd; +--source clean_up_spider.inc if ($VERSION_COMPILE_OS_WIN) { if ($MASTER_1_MYPORT) diff --git a/storage/spider/mysql-test/spider/r/variable_deprecation.result b/storage/spider/mysql-test/spider/r/variable_deprecation.result index cc267f7d363..9e6908a1eb5 100644 --- a/storage/spider/mysql-test/spider/r/variable_deprecation.result +++ b/storage/spider/mysql-test/spider/r/variable_deprecation.result @@ -49,7 +49,7 @@ Warnings: Warning 1287 '@@spider_udf_ds_bulk_insert_rows' is deprecated and will be removed in a future release SHOW VARIABLES LIKE "spider_udf_ds_bulk_insert_rows"; Variable_name Value -spider_udf_ds_bulk_insert_rows -1 +spider_udf_ds_bulk_insert_rows 3000 SET spider_udf_ds_table_loop_mode = 1; Warnings: Warning 1287 '@@spider_udf_ds_table_loop_mode' is deprecated and will be removed in a future release 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 39b5b5535bb..ec4639ed666 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 @@ -61,7 +61,9 @@ INSERT INTO tbl_b (bkey,akey) VALUES (0,0),(1,1),(2,2),(3,3),(4,4),(5,4),(6,3),( TRUNCATE TABLE mysql.general_log; --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; +--enable_ps2_protocol --connection child2_1 --disable_ps_protocol 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 652f7d15177..52d9b52ddb5 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 @@ -61,7 +61,9 @@ INSERT INTO tbl_b (bkey,akey) VALUES (0,0),(1,1),(2,2),(3,3),(4,4),(5,4),(6,3),( TRUNCATE TABLE mysql.general_log; --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; +--enable_ps2_protocol --connection child2_1 --disable_ps_protocol diff --git a/storage/spider/mysql-test/spider/regression/e1121/t/load_data.inc b/storage/spider/mysql-test/spider/regression/e1121/t/load_data.inc index 8c1aa4e651f..080ba735a32 100644 --- a/storage/spider/mysql-test/spider/regression/e1121/t/load_data.inc +++ b/storage/spider/mysql-test/spider/regression/e1121/t/load_data.inc @@ -41,7 +41,9 @@ eval CREATE TABLE tbl_a ( INSERT INTO tbl_a (pkey,val) VALUES (0,0),(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9); --disable_query_log --echo SELECT pkey,val INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' FROM tbl_a ORDER BY pkey; +--disable_ps2_protocol eval SELECT pkey,val INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' FROM tbl_a ORDER BY pkey; +--enable_ps2_protocol --enable_query_log eval $COMMAND_BEFORE_LOAD_DATA; @@ -54,12 +56,16 @@ TRUNCATE TABLE mysql.general_log; --connection master_1 --disable_query_log --echo LOAD DATA $OPTION_LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' $OPTION_WORD INTO TABLE tbl_a; +--disable_ps2_protocol eval LOAD DATA $OPTION_LOCAL INFILE '$MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' $OPTION_WORD INTO TABLE tbl_a; +--enable_ps2_protocol --enable_query_log --remove_file $MYSQLTEST_VARDIR/tmp/spider_outfile.tsv --connection child2_1 +--disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; +--enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; --echo diff --git a/storage/spider/mysql-test/spider/regression/e112122/t/group_by_order_by_limit_ok.test b/storage/spider/mysql-test/spider/regression/e112122/t/group_by_order_by_limit_ok.test index 2a70098ed1b..868886a284e 100644 --- a/storage/spider/mysql-test/spider/regression/e112122/t/group_by_order_by_limit_ok.test +++ b/storage/spider/mysql-test/spider/regression/e112122/t/group_by_order_by_limit_ok.test @@ -66,6 +66,7 @@ TRUNCATE TABLE mysql.general_log; --connection child2_2 TRUNCATE TABLE mysql.general_log; +--disable_ps2_protocol --connection master_1 SELECT skey, count(*) cnt FROM tbl_a GROUP BY skey ORDER BY cnt DESC, skey DESC LIMIT 5; @@ -76,6 +77,7 @@ eval $CHILD2_1_SELECT_TABLES; --connection child2_2 eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/regression/e112122/t/load_data_part.inc b/storage/spider/mysql-test/spider/regression/e112122/t/load_data_part.inc index e66550f9a90..fd31047ab58 100644 --- a/storage/spider/mysql-test/spider/regression/e112122/t/load_data_part.inc +++ b/storage/spider/mysql-test/spider/regression/e112122/t/load_data_part.inc @@ -54,7 +54,9 @@ eval CREATE TABLE tbl_a ( INSERT INTO tbl_a (pkey,val) VALUES (0,0),(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9); --disable_query_log --echo SELECT pkey,val INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' FROM tbl_a ORDER BY pkey; +--disable_ps_protocol eval SELECT pkey,val INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' FROM tbl_a ORDER BY pkey; +--enable_ps2_protocol --enable_query_log eval $COMMAND_BEFORE_LOAD_DATA; @@ -70,10 +72,13 @@ TRUNCATE TABLE mysql.general_log; --connection master_1 --disable_query_log --echo LOAD DATA $OPTION_LOCAL INFILE 'MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' $OPTION_WORD INTO TABLE tbl_a; +--disable_ps2_protocol eval LOAD DATA $OPTION_LOCAL INFILE '$MYSQLTEST_VARDIR/tmp/spider_outfile.tsv' $OPTION_WORD INTO TABLE tbl_a; +--enable_ps2_protocol --enable_query_log --remove_file $MYSQLTEST_VARDIR/tmp/spider_outfile.tsv +--disable_ps2_protocol --connection child2_1 eval $CHILD2_1_SELECT_ARGUMENT1; eval $CHILD2_1_SELECT_TABLES; @@ -81,6 +86,7 @@ eval $CHILD2_1_SELECT_TABLES; --connection child2_2 eval $CHILD2_2_SELECT_ARGUMENT1; eval $CHILD2_2_SELECT_TABLES; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/auto_increment.test b/storage/spider/mysql-test/spider/t/auto_increment.test index 12d93ca3e72..c5f272f5c44 100644 --- a/storage/spider/mysql-test/spider/t/auto_increment.test +++ b/storage/spider/mysql-test/spider/t/auto_increment.test @@ -144,6 +144,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT * FROM tbl_a; if ($USE_CHILD_GROUP2) { @@ -164,6 +165,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/basic_sql.test b/storage/spider/mysql-test/spider/t/basic_sql.test index 5f71b0b92a2..b5a9b2f41cd 100644 --- a/storage/spider/mysql-test/spider/t/basic_sql.test +++ b/storage/spider/mysql-test/spider/t/basic_sql.test @@ -889,7 +889,9 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT found_rows(); +--enable_ps2_protocol --echo --echo select high_priority diff --git a/storage/spider/mysql-test/spider/t/checksum_table_with_quick_mode_3.test b/storage/spider/mysql-test/spider/t/checksum_table_with_quick_mode_3.test index d108fda7e41..e0fa7a84674 100644 --- a/storage/spider/mysql-test/spider/t/checksum_table_with_quick_mode_3.test +++ b/storage/spider/mysql-test/spider/t/checksum_table_with_quick_mode_3.test @@ -96,7 +96,9 @@ if ($USE_CHILD_GROUP2) --connection child2_1 if ($USE_GENERAL_LOG) { + --disable_ps2_protocol eval $CHILD2_1_SELECT_ARGUMENT1; + --enable_ps2_protocol } eval $CHILD2_1_SELECT_TABLES; if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/t/direct_aggregate.test b/storage/spider/mysql-test/spider/t/direct_aggregate.test index 5c0c37f483d..4b33069245f 100644 --- a/storage/spider/mysql-test/spider/t/direct_aggregate.test +++ b/storage/spider/mysql-test/spider/t/direct_aggregate.test @@ -126,6 +126,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -137,6 +138,7 @@ SELECT MAX(a) FROM ta_l WHERE a < 5; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/t/direct_aggregate_part.test b/storage/spider/mysql-test/spider/t/direct_aggregate_part.test index cb0b55e9788..95747516df2 100644 --- a/storage/spider/mysql-test/spider/t/direct_aggregate_part.test +++ b/storage/spider/mysql-test/spider/t/direct_aggregate_part.test @@ -132,6 +132,7 @@ if ($HAVE_PARTITION) (4, 'd', '2003-11-30 05:01:03'), (5, 'c', '2001-12-31 23:59:59'); --enable_query_log + --disable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT COUNT(*) FROM ta_l2; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; @@ -143,6 +144,7 @@ if ($HAVE_PARTITION) eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; SELECT MIN(a) FROM ta_l2 WHERE a > 1; eval $MASTER_1_CHECK_DIRECT_AGGREGATE_STATUS; + --enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) diff --git a/storage/spider/mysql-test/spider/t/direct_join.test b/storage/spider/mysql-test/spider/t/direct_join.test index 3f7c692d2c2..634b958f9f9 100644 --- a/storage/spider/mysql-test/spider/t/direct_join.test +++ b/storage/spider/mysql-test/spider/t/direct_join.test @@ -155,6 +155,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c FROM tbl_a a, tbl_b b, tbl_c c WHERE a.a = b.a and a.a = c.a ORDER BY a.b DESC LIMIT 1,2; if ($USE_CHILD_GROUP2) @@ -176,6 +177,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo Test JOIN on a constant table. @@ -301,6 +303,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT count(0) FROM tbl_person tp INNER JOIN tbl_ncd_cm_person tncp ON tp.id = tncp.person_id WHERE 1 = 1 AND tp.hr_status != "99" AND tp.hr_status != "2" AND tp.region_code LIKE CONCAT(CONCAT('%', '51041110620301', '%')) AND tp.id = '24FC3F0A5119432BAE13DD65AABAA39C' AND tncp.diseaseKind_id = '52A0328740914BCE86ED10A4D2521816' AND tp.region = 510411; if ($USE_CHILD_GROUP2) { @@ -322,6 +325,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_join_using.test b/storage/spider/mysql-test/spider/t/direct_join_using.test index 819e56ff21c..3ecfb292c89 100644 --- a/storage/spider/mysql-test/spider/t/direct_join_using.test +++ b/storage/spider/mysql-test/spider/t/direct_join_using.test @@ -155,6 +155,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c FROM tbl_a a join tbl_b b using(a) join tbl_c c using(a) ORDER BY a.b DESC; if ($USE_CHILD_GROUP2) @@ -176,6 +177,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_left_join.test b/storage/spider/mysql-test/spider/t/direct_left_join.test index e09b6a12488..c9784b047ed 100644 --- a/storage/spider/mysql-test/spider/t/direct_left_join.test +++ b/storage/spider/mysql-test/spider/t/direct_left_join.test @@ -155,6 +155,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c FROM tbl_a a left join tbl_b b on a.a = b.a left join tbl_c c on a.a = c.a ORDER BY a.b DESC; if ($USE_CHILD_GROUP2) @@ -176,6 +177,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_left_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_left_join_nullable.test index dc67a01b4b2..7c69d73d335 100644 --- a/storage/spider/mysql-test/spider/t/direct_left_join_nullable.test +++ b/storage/spider/mysql-test/spider/t/direct_left_join_nullable.test @@ -170,6 +170,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c, d.a FROM tbl_d a left join tbl_c b on a.a = b.a left join tbl_b c on b.c = c.c left join tbl_a d on c.b = d.b ORDER BY a.a DESC; if ($USE_CHILD_GROUP2) @@ -191,6 +192,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_left_right_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_left_right_join_nullable.test index 9d5a990e0ba..dd407482713 100644 --- a/storage/spider/mysql-test/spider/t/direct_left_right_join_nullable.test +++ b/storage/spider/mysql-test/spider/t/direct_left_right_join_nullable.test @@ -170,6 +170,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c, d.a FROM tbl_a a left join tbl_b b on a.a = b.a left join tbl_c c on b.c = c.c right join tbl_d d on c.b = d.b ORDER BY d.a DESC; if ($USE_CHILD_GROUP2) @@ -191,6 +192,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_left_right_left_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_left_right_left_join_nullable.test index 90e3666957d..3de0c310464 100644 --- a/storage/spider/mysql-test/spider/t/direct_left_right_left_join_nullable.test +++ b/storage/spider/mysql-test/spider/t/direct_left_right_left_join_nullable.test @@ -170,6 +170,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c, d.a FROM tbl_a a left join tbl_b b on a.a = b.a right join tbl_c c on b.c = c.c left join tbl_d d on c.b = d.b ORDER BY d.a DESC; if ($USE_CHILD_GROUP2) @@ -191,6 +192,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_right_join.test b/storage/spider/mysql-test/spider/t/direct_right_join.test index 0c0496651d6..d124f75a230 100644 --- a/storage/spider/mysql-test/spider/t/direct_right_join.test +++ b/storage/spider/mysql-test/spider/t/direct_right_join.test @@ -155,6 +155,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c FROM tbl_a a right join tbl_b b on a.a = b.a right join tbl_c c on a.a = c.a ORDER BY a.b DESC; if ($USE_CHILD_GROUP2) @@ -176,6 +177,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_right_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_right_join_nullable.test index 3ab4a30ea84..cdb2d4e6e58 100644 --- a/storage/spider/mysql-test/spider/t/direct_right_join_nullable.test +++ b/storage/spider/mysql-test/spider/t/direct_right_join_nullable.test @@ -170,6 +170,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c, d.a FROM tbl_a a right join tbl_b b on a.a = b.a right join tbl_c c on b.c = c.c right join tbl_d d on c.b = d.b ORDER BY d.a DESC; if ($USE_CHILD_GROUP2) @@ -191,6 +192,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_right_left_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_right_left_join_nullable.test index fefe255890d..cff40bfdeef 100644 --- a/storage/spider/mysql-test/spider/t/direct_right_left_join_nullable.test +++ b/storage/spider/mysql-test/spider/t/direct_right_left_join_nullable.test @@ -170,6 +170,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c, d.a FROM tbl_a a right join tbl_b b on a.a = b.a right join tbl_c c on b.c = c.c left join tbl_d d on c.b = d.b ORDER BY d.a DESC; if ($USE_CHILD_GROUP2) @@ -191,6 +192,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/direct_right_left_right_join_nullable.test b/storage/spider/mysql-test/spider/t/direct_right_left_right_join_nullable.test index 48882d27939..cd677a4bb8d 100644 --- a/storage/spider/mysql-test/spider/t/direct_right_left_right_join_nullable.test +++ b/storage/spider/mysql-test/spider/t/direct_right_left_right_join_nullable.test @@ -170,6 +170,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol SELECT a.a, c.b, c.c, d.a FROM tbl_a a right join tbl_b b on a.a = b.a left join tbl_c c on b.c = c.c right join tbl_d d on c.b = d.b ORDER BY d.a DESC; if ($USE_CHILD_GROUP2) @@ -191,6 +192,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/ha.test b/storage/spider/mysql-test/spider/t/ha.test index c36b7363a6d..1924b908668 100644 --- a/storage/spider/mysql-test/spider/t/ha.test +++ b/storage/spider/mysql-test/spider/t/ha.test @@ -477,7 +477,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo active standby test @@ -841,7 +843,9 @@ if ($USE_CHILD_GROUP3) } --connection master_1 +--disable_ps2_protocol eval $MASTER_1_CHANGE_HA_MON; +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/partition_cond_push.test b/storage/spider/mysql-test/spider/t/partition_cond_push.test index 4bcfc2aa386..e47209ef220 100644 --- a/storage/spider/mysql-test/spider/t/partition_cond_push.test +++ b/storage/spider/mysql-test/spider/t/partition_cond_push.test @@ -154,6 +154,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT value FROM tbl_a WHERE value < 100; if ($USE_CHILD_GROUP2) { @@ -186,6 +187,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/partition_fulltext.test b/storage/spider/mysql-test/spider/t/partition_fulltext.test index cd9f9b05e9d..1b31fa05534 100644 --- a/storage/spider/mysql-test/spider/t/partition_fulltext.test +++ b/storage/spider/mysql-test/spider/t/partition_fulltext.test @@ -158,6 +158,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT pkey, words FROM tbl_a WHERE match(words) against('+ghi' in boolean mode); if ($USE_CHILD_GROUP2) { @@ -190,6 +191,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/partition_join_pushdown_for_single_partition.test b/storage/spider/mysql-test/spider/t/partition_join_pushdown_for_single_partition.test index f4e155be5e2..753014d5da7 100644 --- a/storage/spider/mysql-test/spider/t/partition_join_pushdown_for_single_partition.test +++ b/storage/spider/mysql-test/spider/t/partition_join_pushdown_for_single_partition.test @@ -156,6 +156,7 @@ insert into tbl_a values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); insert into tbl_b values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); --connection master_1 +--disable_ps2_protocol SELECT sum(a.value), count(b.value2) FROM tbl_a a, tbl_b b WHERE a.value = b.value2 AND a.value = 5; SELECT sum(a.value), count(b.value2) FROM tbl_a a, tbl_b b WHERE a.value = 5 and b.value2 = 5; if ($USE_CHILD_GROUP2) @@ -189,6 +190,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/partition_mrr.test b/storage/spider/mysql-test/spider/t/partition_mrr.test index 710e2781242..199e25a3252 100644 --- a/storage/spider/mysql-test/spider/t/partition_mrr.test +++ b/storage/spider/mysql-test/spider/t/partition_mrr.test @@ -168,6 +168,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -203,6 +204,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/pushdown_not_like.test b/storage/spider/mysql-test/spider/t/pushdown_not_like.test index a5fc3c0af68..45b88e52044 100644 --- a/storage/spider/mysql-test/spider/t/pushdown_not_like.test +++ b/storage/spider/mysql-test/spider/t/pushdown_not_like.test @@ -104,6 +104,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 +--disable_ps2_protocol select * from ta_l where b not like 'a%'; if ($USE_CHILD_GROUP2) { @@ -113,7 +114,7 @@ if ($USE_CHILD_GROUP2) SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select%'; } } - +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/quick_mode_0.test b/storage/spider/mysql-test/spider/t/quick_mode_0.test index 6945d97a049..070d9e40548 100644 --- a/storage/spider/mysql-test/spider/t/quick_mode_0.test +++ b/storage/spider/mysql-test/spider/t/quick_mode_0.test @@ -123,6 +123,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -151,6 +152,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_6; @@ -181,6 +183,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -209,6 +212,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_0; @@ -239,6 +243,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -267,6 +272,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/quick_mode_1.test b/storage/spider/mysql-test/spider/t/quick_mode_1.test index d382d5dbe95..a2c2bf87844 100644 --- a/storage/spider/mysql-test/spider/t/quick_mode_1.test +++ b/storage/spider/mysql-test/spider/t/quick_mode_1.test @@ -123,6 +123,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -151,6 +152,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_6; @@ -181,6 +183,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -209,6 +212,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_0; @@ -239,6 +243,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -267,6 +272,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/quick_mode_2.test b/storage/spider/mysql-test/spider/t/quick_mode_2.test index ebb889868a6..12a48a904a2 100644 --- a/storage/spider/mysql-test/spider/t/quick_mode_2.test +++ b/storage/spider/mysql-test/spider/t/quick_mode_2.test @@ -123,6 +123,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -151,6 +152,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_6; @@ -181,6 +183,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -209,6 +212,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_0; @@ -239,6 +243,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -267,6 +272,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/quick_mode_3.test b/storage/spider/mysql-test/spider/t/quick_mode_3.test index 5992284f301..65851a5bf3e 100644 --- a/storage/spider/mysql-test/spider/t/quick_mode_3.test +++ b/storage/spider/mysql-test/spider/t/quick_mode_3.test @@ -123,6 +123,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -151,6 +152,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_6; @@ -181,6 +183,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -209,6 +212,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --connection master_1 eval $MASTER_1_SET_QUICK_PAGE_BYTE_0; @@ -239,6 +243,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a.pkey FROM tbl_a a, tbl_b b WHERE a.pkey = b.pkey; if ($USE_CHILD_GROUP2) { @@ -267,6 +272,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo deinit diff --git a/storage/spider/mysql-test/spider/t/slave_trx_isolation.test b/storage/spider/mysql-test/spider/t/slave_trx_isolation.test index f7f41358f51..a3a3fad8677 100644 --- a/storage/spider/mysql-test/spider/t/slave_trx_isolation.test +++ b/storage/spider/mysql-test/spider/t/slave_trx_isolation.test @@ -106,11 +106,13 @@ if ($USE_CHILD_GROUP2) --disable_result_log } --connection child2_1 + --disable_ps2_protocol if ($USE_GENERAL_LOG) { --replace_regex /-[0-9a-f]{12}-[0-9a-f]+-/-xxxxxxxxxxxx-xxxxx-/ eval $CHILD2_1_SELECT_ARGUMENT1; } + --enable_ps2_protocol eval $CHILD2_1_SELECT_TABLES; if (!$OUTPUT_CHILD_GROUP2) { diff --git a/storage/spider/mysql-test/spider/t/spider_fixes.test b/storage/spider/mysql-test/spider/t/spider_fixes.test index 47bc225d614..338cd28a238 100644 --- a/storage/spider/mysql-test/spider/t/spider_fixes.test +++ b/storage/spider/mysql-test/spider/t/spider_fixes.test @@ -152,8 +152,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a < 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -194,8 +196,10 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_l WHERE a <= 5 ORDER BY a DESC LIMIT 3; +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -917,7 +921,9 @@ SELECT a, b, c FROM ta_l_int ORDER BY a; --echo direct order limit --connection master_1 eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; +--disable_ps2_protocol SELECT a, b, c FROM ta_l_int ORDER BY a LIMIT 3; +--enable_ps2_protocol eval $MASTER_1_CHECK_DIRECT_ORDER_LIMIT_STATUS; diff --git a/storage/spider/mysql-test/spider/t/timestamp.test b/storage/spider/mysql-test/spider/t/timestamp.test index 225851a9d13..47d637bb0c5 100644 --- a/storage/spider/mysql-test/spider/t/timestamp.test +++ b/storage/spider/mysql-test/spider/t/timestamp.test @@ -171,6 +171,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT *, unix_timestamp(col_ts) FROM tbl_a; if ($USE_CHILD_GROUP2) { @@ -191,6 +192,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo DELETEs @@ -214,6 +216,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 DELETE FROM tbl_a WHERE col_ts='1970-01-01 01:00:01'; +--disable_ps2_protocol SELECT *, unix_timestamp(col_ts) FROM tbl_a; if ($USE_CHILD_GROUP2) { @@ -234,6 +237,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { if (!$OUTPUT_CHILD_GROUP2) @@ -256,6 +260,7 @@ if ($USE_CHILD_GROUP2) SET @@timestamp=1; INSERT INTO tbl_a VALUES (1, now(), now()); SET @@timestamp=0; +--disable_ps2_protocol SELECT *, unix_timestamp(col_ts) FROM tbl_a; if ($USE_CHILD_GROUP2) { @@ -276,6 +281,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo UPDATEs @@ -299,6 +305,7 @@ if ($USE_CHILD_GROUP2) } --connection master_1 UPDATE tbl_a SET col_ts=col_dt; +--disable_ps2_protocol SELECT *, unix_timestamp(col_ts) FROM tbl_a; if ($USE_CHILD_GROUP2) { @@ -319,6 +326,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo Lookups @@ -341,6 +349,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > '2018-01-01'; SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts < '2018-10-28 02:30:00'; SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE '2018-10-28 02:30:00' > col_ts; @@ -367,6 +376,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo Drop the index on the timestamp column @@ -419,6 +429,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts > '2018-01-01'; SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE col_ts < '2018-10-28 02:30:00'; SELECT *, unix_timestamp(col_ts) FROM tbl_a WHERE '2018-10-28 02:30:00' > col_ts; @@ -445,6 +456,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo Test the TIMESTAMP function @@ -471,6 +483,7 @@ if ($USE_CHILD_GROUP2) } } --connection master_1 +--disable_ps2_protocol SELECT * FROM tbl_f; SELECT TIMESTAMP(col_d, col_t) FROM tbl_f; SELECT TIMESTAMP('2018-06-25', col_t) FROM tbl_f; @@ -495,6 +508,7 @@ if ($USE_CHILD_GROUP2) --enable_result_log } } +--enable_ps2_protocol --echo --echo Restore Time Zone settings diff --git a/storage/spider/mysql-test/spider/t/udf_pushdown.inc b/storage/spider/mysql-test/spider/t/udf_pushdown.inc index 160e8af21b2..df9742a35b8 100644 --- a/storage/spider/mysql-test/spider/t/udf_pushdown.inc +++ b/storage/spider/mysql-test/spider/t/udf_pushdown.inc @@ -1,8 +1,10 @@ --echo --echo ##### test SELECTs ##### --connection master_1 +--disable_ps2_protocol SELECT * FROM ta_l WHERE id = plusone(1); SELECT * FROM ta_l WHERE id IN (plusone(1), plusone(2)) AND a = plusone(32); +--enable_ps2_protocol if ($USE_CHILD_GROUP2) { diff --git a/storage/spider/spd_copy_tables.cc b/storage/spider/spd_copy_tables.cc index 4b2f5174ce0..d4f40ea196b 100644 --- a/storage/spider/spd_copy_tables.cc +++ b/storage/spider/spd_copy_tables.cc @@ -60,12 +60,6 @@ int spider_udf_set_copy_tables_param_default( } } - if (copy_tables->bulk_insert_interval == -1) - copy_tables->bulk_insert_interval = 10; - if (copy_tables->bulk_insert_rows == -1) - copy_tables->bulk_insert_rows = 100; - if (copy_tables->use_table_charset == -1) - copy_tables->use_table_charset = 1; if (copy_tables->use_transaction == -1) copy_tables->use_transaction = 1; if (copy_tables->bg_mode == -1) diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc index 055dcd984b1..ccc31a6bb77 100644 --- a/storage/spider/spd_db_conn.cc +++ b/storage/spider/spd_db_conn.cc @@ -10287,7 +10287,7 @@ int spider_db_udf_copy_tables( error_num = result->get_errno(); if (error_num == HA_ERR_END_OF_FILE) { - if (roop_count < copy_tables->bulk_insert_rows) + if (roop_count < bulk_insert_rows) { end_of_file = TRUE; if (roop_count) @@ -10311,8 +10311,6 @@ int spider_db_udf_copy_tables( pthread_mutex_unlock(&tmp_conn->mta_conn_mutex); goto error_db_query; } - bulk_insert_rows = spider_param_udf_ct_bulk_insert_rows( - copy_tables->bulk_insert_rows); if ( select_ct->append_key_order_str(key_info, 0, FALSE) || select_ct->append_limit(0, bulk_insert_rows) || diff --git a/storage/spider/spd_db_mysql.cc b/storage/spider/spd_db_mysql.cc index 52df7c6b982..ddf0aa7e95f 100644 --- a/storage/spider/spd_db_mysql.cc +++ b/storage/spider/spd_db_mysql.cc @@ -5518,6 +5518,13 @@ int spider_db_mbase_util::append_unlock_table( DBUG_RETURN(0); } +/** + The function check if the given item_func and its arguments can be pushed + down to a data node. If so and str != NULL, the function also print, to str, + the string corresponding to the item_func. + + @return 0: success, otherwise: error + */ int spider_db_mbase_util::open_item_func( Item_func *item_func, ha_spider *spider, @@ -5526,6 +5533,173 @@ int spider_db_mbase_util::open_item_func( uint alias_length, bool use_fields, spider_fields *fields +) { + DBUG_ENTER("spider_db_mbase_util::open_item_func"); + + int error = check_item_func(item_func, spider, alias, + alias_length, use_fields, fields); + if (error) + DBUG_RETURN(error); + if (!str) + DBUG_RETURN(0); + + DBUG_RETURN(print_item_func(item_func, spider, str, alias, + alias_length, use_fields, fields)); +} + +static bool item_func_is_timestampdiff( + const char *func_name, + int func_name_length +) { + return func_name_length == 13 && + !strncasecmp("timestampdiff", func_name, func_name_length); +} + +static bool not_func_should_be_skipped( + Item_func *item_func +){ + DBUG_ENTER("not_func_should_be_skipped"); + DBUG_ASSERT(item_func->functype() == Item_func::NOT_FUNC); + Item **item_list = item_func->arguments(); + + if (item_list[0]->type() == Item::COND_ITEM) + { + DBUG_PRINT("info",("spider item_list[0] is COND_ITEM")); + Item_cond *item_cond = (Item_cond *) item_list[0]; + if (item_cond->functype() == Item_func::COND_AND_FUNC) + { + DBUG_PRINT("info",("spider item_cond is COND_AND_FUNC")); + List_iterator_fast lif(*(item_cond->argument_list())); + bool has_expr_cache_item = FALSE; + bool has_isnotnull_func = FALSE; + bool has_other_item = FALSE; + while(Item *item = lif++) + { + if ( + item->type() == Item::EXPR_CACHE_ITEM + ) { + DBUG_PRINT("info",("spider EXPR_CACHE_ITEM")); + has_expr_cache_item = TRUE; + } else + if ( + item->type() == Item::FUNC_ITEM && + ((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC + ) { + DBUG_PRINT("info",("spider ISNOTNULL_FUNC")); + has_isnotnull_func = TRUE; + } else { + DBUG_PRINT("info",("spider has other item")); + DBUG_PRINT("info",("spider COND type=%d", item->type())); + has_other_item = TRUE; + } + } + if (has_expr_cache_item && has_isnotnull_func && !has_other_item) + { + DBUG_PRINT("info",("spider NOT EXISTS skip")); + DBUG_RETURN(TRUE); + } + } + } + DBUG_RETURN(FALSE); +} + +/** + Check if the given item_func and its arguments can be pushed down to + a data node. This function is recursive because we need to also check + the arguments of the item_func. + + @return 0: success, otherwise: error + */ +int spider_db_mbase_util::check_item_func( + Item_func *item_func, + ha_spider *spider, + const char *alias, + uint alias_length, + bool use_fields, + spider_fields *fields +) { + int use_pushdown_udf; + DBUG_ENTER("spider_db_mbase_util::check_item_func"); + + Item_func::Functype func_type = item_func->functype(); + DBUG_PRINT("info",("spider functype = %d", func_type)); + + const char *func_name = (char*) item_func->func_name(); + int func_name_length = strlen(func_name); + DBUG_PRINT("info",("spider func_name = %s", func_name)); + + /* The blacklist of the functions that cannot be pushed down */ + switch (func_type) + { + case Item_func::TRIG_COND_FUNC: + case Item_func::CASE_SEARCHED_FUNC: + case Item_func::CASE_SIMPLE_FUNC: + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + case Item_func::NOT_FUNC: + /* Why the following check is necessary? */ + if (not_func_should_be_skipped(item_func)) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + break; + case Item_func::FUNC_SP: + case Item_func::UDF_FUNC: + /* Notes on merging regarding MDEV-29447: please refer to the + following commits for build error or merge conflicts: + 10.6: 1ed20b993b0dd4e95450cab2e8347e5bf4617a69 + 10.9: dd316b6e20265cfd832bb5585cb4c96e716387c8 + 10.10-11: 3f67f110ba1b23a89c5ede0fbeeb203cf5e164f4 + 11.0-1: 17ba6748afa8834df5658361088e6c8e65aca16f + Please remove this comment after merging. */ + use_pushdown_udf= spider_param_use_pushdown_udf( + spider->wide_handler->trx->thd, spider->share->use_pushdown_udf); + if (!use_pushdown_udf) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + break; + case Item_func::FT_FUNC: + if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + break; +#ifndef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC + case Item_func::UNKNOWN_FUNC: + if (item_func_is_timestampdiff(func_name, func_name_length)) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); + break; +#endif + default: + break; + } + /* End of the blacklist */ + + /* Check the arguments recursively */ + if (uint item_count = item_func->argument_count()) + { + Item **item_list = item_func->arguments(); + for (uint roop_count = 0; roop_count < item_count; roop_count++) + { + Item *item = item_list[roop_count]; + if (int error_num = spider_db_print_item_type(item, NULL, spider, NULL, + alias, alias_length, dbton_id, use_fields, fields)) + DBUG_RETURN(error_num); + } + } + + DBUG_RETURN(0); +} + +/** + The function print the string corresponding to the given item_func to str. + The function is assumed to be called only when the check by the function + check_item_func() has passed. + + @return 0: success, otherwise: error + */ +int spider_db_mbase_util::print_item_func( + Item_func *item_func, + ha_spider *spider, + spider_string *str, + const char *alias, + uint alias_length, + bool use_fields, + spider_fields *fields ) { int error_num; Item *item, **item_list = item_func->arguments(); @@ -5542,13 +5716,15 @@ int spider_db_mbase_util::open_item_func( last_str_length = SPIDER_SQL_NULL_CHAR_LEN; int use_pushdown_udf; bool merge_func = FALSE; - DBUG_ENTER("spider_db_mbase_util::open_item_func"); - if (str) - { - if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); - } + DBUG_ENTER("spider_db_mbase_util::print_item_func"); + DBUG_ASSERT(!check_item_func(item_func, spider, alias, alias_length, + use_fields, fields)); + DBUG_ASSERT(str); + + if (str->reserve(SPIDER_SQL_OPEN_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + DBUG_PRINT("info",("spider functype = %d", item_func->functype())); switch (item_func->functype()) { @@ -5597,14 +5773,9 @@ int spider_db_mbase_util::open_item_func( { if ( !strncasecmp("rand", func_name, func_name_length) && -#ifdef SPIDER_Item_args_arg_count_IS_PROTECTED !item_func->argument_count() -#else - !item_func->arg_count -#endif ) { - if (str) - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(spider_db_open_item_int(item_func, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields)); } else if ( @@ -5614,38 +5785,36 @@ int spider_db_mbase_util::open_item_func( /* item_count == 1 means this TRIM() is without a remove_str */ item = item_list[0]; Item *item_tmp = item_list[1]; - if (str) + + if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT)) { - if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT)) - { - /* 1. append 'TRIM(BOTH ' */ - if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + - SPIDER_SQL_TRIM_BOTH_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, - SPIDER_SQL_OPEN_PAREN_LEN); - str->q_append(SPIDER_SQL_TRIM_BOTH_STR, SPIDER_SQL_TRIM_BOTH_LEN); - /* 2. append "remove_str"*/ - if ((error_num = spider_db_print_item_type( - item_tmp, NULL, spider, str, alias, alias_length, dbton_id, - use_fields, fields))) - DBUG_RETURN(error_num); - /* 3. append ' FROM ' */ - if (str->reserve(SPIDER_SQL_FROM_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); - /* 4. append `field` */ - if ((error_num = spider_db_print_item_type( - item, NULL, spider, str, alias, alias_length, dbton_id, - use_fields, fields))) - DBUG_RETURN(error_num); - /* 5. append ')' */ - if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, - SPIDER_SQL_CLOSE_PAREN_LEN); - } + /* 1. append 'TRIM(BOTH ' */ + if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + + SPIDER_SQL_TRIM_BOTH_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, + SPIDER_SQL_OPEN_PAREN_LEN); + str->q_append(SPIDER_SQL_TRIM_BOTH_STR, SPIDER_SQL_TRIM_BOTH_LEN); + /* 2. append "remove_str"*/ + if ((error_num = spider_db_print_item_type( + item_tmp, NULL, spider, str, alias, alias_length, dbton_id, + use_fields, fields))) + DBUG_RETURN(error_num); + /* 3. append ' FROM ' */ + if (str->reserve(SPIDER_SQL_FROM_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); + /* 4. append `field` */ + if ((error_num = spider_db_print_item_type( + item, NULL, spider, str, alias, alias_length, dbton_id, + use_fields, fields))) + DBUG_RETURN(error_num); + /* 5. append ')' */ + if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, + SPIDER_SQL_CLOSE_PAREN_LEN); } item_count -= 2; break; @@ -5661,50 +5830,47 @@ int spider_db_mbase_util::open_item_func( /* item_count == 2 means this TRIM(LEADING/TRAILING ...) is with a remove_str */ item = item_list[0]; Item *item_tmp = item_list[1]; - if (str) + if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT)) { - if (item_tmp->is_of_type(Item::CONST_ITEM, STRING_RESULT)) - { - /* 1. append 'TRIM(LEADING ' or 'TRIM(TRAILING ' */ - if (func_name[0] == 'l' || func_name[0] == 'L') - { /* ltrim */ - if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + - SPIDER_SQL_TRIM_LEADING_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, - SPIDER_SQL_OPEN_PAREN_LEN); - str->q_append(SPIDER_SQL_TRIM_LEADING_STR, SPIDER_SQL_TRIM_LEADING_LEN); - } else - { /* rtrim */ - if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + - SPIDER_SQL_TRIM_TRAILING_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, - SPIDER_SQL_OPEN_PAREN_LEN); - str->q_append(SPIDER_SQL_TRIM_TRAILING_STR, SPIDER_SQL_TRIM_TRAILING_LEN); - } - /* 2. append "remove_str"*/ - if ((error_num = spider_db_print_item_type( - item_tmp, NULL, spider, str, alias, alias_length, dbton_id, - use_fields, fields))) - DBUG_RETURN(error_num); - /* 3. append ' FROM ' */ - if (str->reserve(SPIDER_SQL_FROM_LEN)) + /* 1. append 'TRIM(LEADING ' or 'TRIM(TRAILING ' */ + if (func_name[0] == 'l' || func_name[0] == 'L') + { /* ltrim */ + if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + + SPIDER_SQL_TRIM_LEADING_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); - /* 4. append `field` */ - if ((error_num = spider_db_print_item_type( - item, NULL, spider, str, alias, alias_length, dbton_id, - use_fields, fields))) - DBUG_RETURN(error_num); - /* 5. append ')' */ - if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) + str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, + SPIDER_SQL_OPEN_PAREN_LEN); + str->q_append(SPIDER_SQL_TRIM_LEADING_STR, SPIDER_SQL_TRIM_LEADING_LEN); + } else + { /* rtrim */ + if (str->reserve(SPIDER_SQL_TRIM_LEN + SPIDER_SQL_OPEN_PAREN_LEN + + SPIDER_SQL_TRIM_TRAILING_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, - SPIDER_SQL_CLOSE_PAREN_LEN); + str->q_append(SPIDER_SQL_TRIM_STR, SPIDER_SQL_TRIM_LEN); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, + SPIDER_SQL_OPEN_PAREN_LEN); + str->q_append(SPIDER_SQL_TRIM_TRAILING_STR, SPIDER_SQL_TRIM_TRAILING_LEN); } + /* 2. append "remove_str"*/ + if ((error_num = spider_db_print_item_type( + item_tmp, NULL, spider, str, alias, alias_length, dbton_id, + use_fields, fields))) + DBUG_RETURN(error_num); + /* 3. append ' FROM ' */ + if (str->reserve(SPIDER_SQL_FROM_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_FROM_STR, SPIDER_SQL_FROM_LEN); + /* 4. append `field` */ + if ((error_num = spider_db_print_item_type( + item, NULL, spider, str, alias, alias_length, dbton_id, + use_fields, fields))) + DBUG_RETURN(error_num); + /* 5. append ')' */ + if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, + SPIDER_SQL_CLOSE_PAREN_LEN); } item_count -= 2; break; @@ -5727,23 +5893,19 @@ int spider_db_mbase_util::open_item_func( !strncasecmp("curdate", func_name, func_name_length) || !strncasecmp("curtime", func_name, func_name_length) ) { - if (str) - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields)); } else if ( !strncasecmp("convert", func_name, func_name_length) ) { - if (str) - { - if (str->reserve(func_name_length * 2 + SPIDER_SQL_OPEN_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, - SPIDER_SQL_OPEN_PAREN_LEN); - last_str = SPIDER_SQL_CLOSE_PAREN_STR; - last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; - } + if (str->reserve(func_name_length * 2 + SPIDER_SQL_OPEN_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, + SPIDER_SQL_OPEN_PAREN_LEN); + last_str = SPIDER_SQL_CLOSE_PAREN_STR; + last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; break; } } else if (func_name_length == 8 && @@ -5752,8 +5914,7 @@ int spider_db_mbase_util::open_item_func( !strncasecmp("utc_time", func_name, func_name_length) ) ) { - if (str) - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields)); } else if (func_name_length == 9 && @@ -5771,14 +5932,12 @@ int spider_db_mbase_util::open_item_func( break; } else if (!strncasecmp("column_get", func_name, func_name_length)) { - if (str) - { - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); - } + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + func_name = SPIDER_SQL_COMMA_STR; func_name_length = SPIDER_SQL_COMMA_LEN; separator_str = SPIDER_SQL_COMMA_STR; @@ -5813,15 +5972,12 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } + if (str->reserve(SPIDER_SQL_CAST_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } last_str = SPIDER_SQL_AS_DATE_STR; last_str_length = SPIDER_SQL_AS_DATE_LEN; @@ -5852,15 +6008,12 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } + if (str->reserve(SPIDER_SQL_CAST_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } last_str = SPIDER_SQL_AS_TIME_STR; last_str_length = SPIDER_SQL_AS_TIME_LEN; @@ -5870,8 +6023,7 @@ int spider_db_mbase_util::open_item_func( { if (!strncasecmp("utc_timestamp", func_name, func_name_length)) { - if (str) - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields)); } else if (!strncasecmp("timestampdiff", func_name, func_name_length)) @@ -5879,64 +6031,62 @@ int spider_db_mbase_util::open_item_func( #ifdef ITEM_FUNC_TIMESTAMPDIFF_ARE_PUBLIC Item_func_timestamp_diff *item_func_timestamp_diff = (Item_func_timestamp_diff *) item_func; - if (str) + const char *interval_str; + uint interval_len; + switch (item_func_timestamp_diff->int_type) { - const char *interval_str; - uint interval_len; - switch (item_func_timestamp_diff->int_type) - { - case INTERVAL_YEAR: - interval_str = SPIDER_SQL_YEAR_STR; - interval_len = SPIDER_SQL_YEAR_LEN; - break; - case INTERVAL_QUARTER: - interval_str = SPIDER_SQL_QUARTER_STR; - interval_len = SPIDER_SQL_QUARTER_LEN; - break; - case INTERVAL_MONTH: - interval_str = SPIDER_SQL_MONTH_STR; - interval_len = SPIDER_SQL_MONTH_LEN; - break; - case INTERVAL_WEEK: - interval_str = SPIDER_SQL_WEEK_STR; - interval_len = SPIDER_SQL_WEEK_LEN; - break; - case INTERVAL_DAY: - interval_str = SPIDER_SQL_DAY_STR; - interval_len = SPIDER_SQL_DAY_LEN; - break; - case INTERVAL_HOUR: - interval_str = SPIDER_SQL_HOUR_STR; - interval_len = SPIDER_SQL_HOUR_LEN; - break; - case INTERVAL_MINUTE: - interval_str = SPIDER_SQL_MINUTE_STR; - interval_len = SPIDER_SQL_MINUTE_LEN; - break; - case INTERVAL_SECOND: - interval_str = SPIDER_SQL_SECOND_STR; - interval_len = SPIDER_SQL_SECOND_LEN; - break; - case INTERVAL_MICROSECOND: - interval_str = SPIDER_SQL_MICROSECOND_STR; - interval_len = SPIDER_SQL_MICROSECOND_LEN; - break; - default: - interval_str = ""; - interval_len = 0; - break; - } - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN + - interval_len + SPIDER_SQL_COMMA_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); - str->q_append(interval_str, interval_len); - str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); + case INTERVAL_YEAR: + interval_str = SPIDER_SQL_YEAR_STR; + interval_len = SPIDER_SQL_YEAR_LEN; + break; + case INTERVAL_QUARTER: + interval_str = SPIDER_SQL_QUARTER_STR; + interval_len = SPIDER_SQL_QUARTER_LEN; + break; + case INTERVAL_MONTH: + interval_str = SPIDER_SQL_MONTH_STR; + interval_len = SPIDER_SQL_MONTH_LEN; + break; + case INTERVAL_WEEK: + interval_str = SPIDER_SQL_WEEK_STR; + interval_len = SPIDER_SQL_WEEK_LEN; + break; + case INTERVAL_DAY: + interval_str = SPIDER_SQL_DAY_STR; + interval_len = SPIDER_SQL_DAY_LEN; + break; + case INTERVAL_HOUR: + interval_str = SPIDER_SQL_HOUR_STR; + interval_len = SPIDER_SQL_HOUR_LEN; + break; + case INTERVAL_MINUTE: + interval_str = SPIDER_SQL_MINUTE_STR; + interval_len = SPIDER_SQL_MINUTE_LEN; + break; + case INTERVAL_SECOND: + interval_str = SPIDER_SQL_SECOND_STR; + interval_len = SPIDER_SQL_SECOND_LEN; + break; + case INTERVAL_MICROSECOND: + interval_str = SPIDER_SQL_MICROSECOND_STR; + interval_len = SPIDER_SQL_MICROSECOND_LEN; + break; + default: + interval_str = ""; + interval_len = 0; + break; } + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN + + interval_len + SPIDER_SQL_COMMA_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); + str->q_append(interval_str, interval_len); + str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); + if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider, - str, alias, alias_length, dbton_id, use_fields, fields))) + str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); if (str) { @@ -5945,14 +6095,14 @@ int spider_db_mbase_util::open_item_func( str->q_append(SPIDER_SQL_COMMA_STR, SPIDER_SQL_COMMA_LEN); } if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider, - str, alias, alias_length, dbton_id, use_fields, fields))) + str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); if (str) { if (str->reserve(SPIDER_SQL_CLOSE_PAREN_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, - SPIDER_SQL_CLOSE_PAREN_LEN); + SPIDER_SQL_CLOSE_PAREN_LEN); } DBUG_RETURN(0); #else @@ -5987,31 +6137,28 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + char *tmp_ptr, *tmp_ptr2; + DBUG_ASSERT(tmp_str.length() == 0); + tmp_str.set_charset(str->charset()); + tmp_str.init_calc_mem(123); + tmp_str.reserve(MAX_FIELD_WIDTH); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - char *tmp_ptr, *tmp_ptr2; - DBUG_ASSERT(tmp_str.length() == 0); - tmp_str.set_charset(str->charset()); - tmp_str.init_calc_mem(123); - tmp_str.reserve(MAX_FIELD_WIDTH); - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } - item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); - tmp_str.mem_calc(); - if (tmp_str.reserve(1)) + if (str->reserve(SPIDER_SQL_CAST_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - tmp_ptr = tmp_str.c_ptr_quick(); - DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); - while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_BINARY_STR))) - tmp_ptr = tmp_ptr2 + 1; - last_str = tmp_ptr - 1; - last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } + item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); + tmp_str.mem_calc(); + if (tmp_str.reserve(1)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + tmp_ptr = tmp_str.c_ptr_quick(); + DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); + while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_BINARY_STR))) + tmp_ptr = tmp_ptr2 + 1; + last_str = tmp_ptr - 1; + last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; break; } else if (!strncasecmp("cast_as_signed", func_name, func_name_length)) { @@ -6039,15 +6186,12 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } + if (str->reserve(SPIDER_SQL_CAST_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } last_str = SPIDER_SQL_AS_SIGNED_STR; last_str_length = SPIDER_SQL_AS_SIGNED_LEN; @@ -6081,15 +6225,12 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } + if (str->reserve(SPIDER_SQL_CAST_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } last_str = SPIDER_SQL_AS_UNSIGNED_STR; last_str_length = SPIDER_SQL_AS_UNSIGNED_LEN; @@ -6121,31 +6262,28 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + char *tmp_ptr, *tmp_ptr2; + DBUG_ASSERT(tmp_str.length() == 0); + tmp_str.set_charset(str->charset()); + tmp_str.init_calc_mem(124); + tmp_str.reserve(MAX_FIELD_WIDTH); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - char *tmp_ptr, *tmp_ptr2; - DBUG_ASSERT(tmp_str.length() == 0); - tmp_str.set_charset(str->charset()); - tmp_str.init_calc_mem(124); - tmp_str.reserve(MAX_FIELD_WIDTH); - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } - item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); - tmp_str.mem_calc(); - if (tmp_str.reserve(1)) + if (str->reserve(SPIDER_SQL_CAST_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - tmp_ptr = tmp_str.c_ptr_quick(); - DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); - while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_DECIMAL_STR))) - tmp_ptr = tmp_ptr2 + 1; - last_str = tmp_ptr - 1; - last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } + item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); + tmp_str.mem_calc(); + if (tmp_str.reserve(1)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + tmp_ptr = tmp_str.c_ptr_quick(); + DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); + while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_DECIMAL_STR))) + tmp_ptr = tmp_ptr2 + 1; + last_str = tmp_ptr - 1; + last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; break; } else if (!strncasecmp("cast_as_datetime", func_name, func_name_length)) @@ -6174,15 +6312,12 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } + if (str->reserve(SPIDER_SQL_CAST_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } last_str = SPIDER_SQL_AS_DATETIME_STR; last_str_length = SPIDER_SQL_AS_DATETIME_LEN; @@ -6200,41 +6335,32 @@ int spider_db_mbase_util::open_item_func( if ((error_num = spider_db_print_item_type(item_list[0], NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); - if (str) + if (item_date_add_interval->date_sub_interval) { - if (item_date_add_interval->date_sub_interval) - { - if (str->reserve(SPIDER_SQL_NEGINTERVAL_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_NEGINTERVAL_STR, - SPIDER_SQL_NEGINTERVAL_LEN); - } else { - if (str->reserve(SPIDER_SQL_INTERVAL_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_INTERVAL_STR, SPIDER_SQL_INTERVAL_LEN); - } + if (str->reserve(SPIDER_SQL_NEGINTERVAL_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_NEGINTERVAL_STR, + SPIDER_SQL_NEGINTERVAL_LEN); + } else { + if (str->reserve(SPIDER_SQL_INTERVAL_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_INTERVAL_STR, SPIDER_SQL_INTERVAL_LEN); } if ((error_num = spider_db_print_item_type(item_list[1], NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); - if (str) - { - if (str->reserve(func_name_length + SPIDER_SQL_CLOSE_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, - SPIDER_SQL_CLOSE_PAREN_LEN); - } + if (str->reserve(func_name_length + SPIDER_SQL_CLOSE_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, + SPIDER_SQL_CLOSE_PAREN_LEN); DBUG_RETURN(0); } } - if (str) - { - if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); - } + if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); func_name = SPIDER_SQL_COMMA_STR; func_name_length = SPIDER_SQL_COMMA_LEN; separator_str = SPIDER_SQL_COMMA_STR; @@ -6243,8 +6369,7 @@ int spider_db_mbase_util::open_item_func( last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; break; case Item_func::NOW_FUNC: - if (str) - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields)); case Item_func::CHAR_TYPECAST_FUNC: @@ -6274,97 +6399,54 @@ int spider_db_mbase_util::open_item_func( } } - if (str) + char *tmp_ptr, *tmp_ptr2; + DBUG_ASSERT(tmp_str.length() == 0); + tmp_str.set_charset(str->charset()); + tmp_str.init_calc_mem(125); + tmp_str.reserve(MAX_FIELD_WIDTH); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + if (!merge_func) { - char *tmp_ptr, *tmp_ptr2; - DBUG_ASSERT(tmp_str.length() == 0); - tmp_str.set_charset(str->charset()); - tmp_str.init_calc_mem(125); - tmp_str.reserve(MAX_FIELD_WIDTH); - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); - if (!merge_func) - { - if (str->reserve(SPIDER_SQL_CAST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); - } - item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); - tmp_str.mem_calc(); - if (tmp_str.reserve(1)) + if (str->reserve(SPIDER_SQL_CAST_LEN)) DBUG_RETURN(HA_ERR_OUT_OF_MEM); - tmp_ptr = tmp_str.c_ptr_quick(); - DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); - while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_CHAR_STR))) - tmp_ptr = tmp_ptr2 + 1; - last_str = tmp_ptr - 1; - last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; + str->q_append(SPIDER_SQL_CAST_STR, SPIDER_SQL_CAST_LEN); } + item_func->print(tmp_str.get_str(), QT_TO_SYSTEM_CHARSET); + tmp_str.mem_calc(); + if (tmp_str.reserve(1)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + tmp_ptr = tmp_str.c_ptr_quick(); + DBUG_PRINT("info",("spider tmp_ptr = %s", tmp_ptr)); + while ((tmp_ptr2 = strstr(tmp_ptr, SPIDER_SQL_AS_CHAR_STR))) + tmp_ptr = tmp_ptr2 + 1; + last_str = tmp_ptr - 1; + last_str_length = strlen(last_str) - SPIDER_SQL_CLOSE_PAREN_LEN; } break; case Item_func::NOT_FUNC: DBUG_PRINT("info",("spider NOT_FUNC")); - if (item_list[0]->type() == Item::COND_ITEM) - { - DBUG_PRINT("info",("spider item_list[0] is COND_ITEM")); - Item_cond *item_cond = (Item_cond *) item_list[0]; - if (item_cond->functype() == Item_func::COND_AND_FUNC) - { - DBUG_PRINT("info",("spider item_cond is COND_AND_FUNC")); - List_iterator_fast lif(*(item_cond->argument_list())); - bool has_expr_cache_item = FALSE; - bool has_isnotnull_func = FALSE; - bool has_other_item = FALSE; - while((item = lif++)) - { -#ifdef SPIDER_HAS_EXPR_CACHE_ITEM - if ( - item->type() == Item::EXPR_CACHE_ITEM - ) { - DBUG_PRINT("info",("spider EXPR_CACHE_ITEM")); - has_expr_cache_item = TRUE; - } else -#endif - if ( - item->type() == Item::FUNC_ITEM && - ((Item_func *) item)->functype() == Item_func::ISNOTNULL_FUNC - ) { - DBUG_PRINT("info",("spider ISNOTNULL_FUNC")); - has_isnotnull_func = TRUE; - } else { - DBUG_PRINT("info",("spider has other item")); - DBUG_PRINT("info",("spider COND type=%d", item->type())); - has_other_item = TRUE; - } - } - if (has_expr_cache_item && has_isnotnull_func && !has_other_item) - { - DBUG_PRINT("info",("spider NOT EXISTS skip")); - DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); - } - } - } - if (str) + if (not_func_should_be_skipped(item_func)) + DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); { LEX_CSTRING org_func_name= item_func->func_name_cstring(); func_name = org_func_name.str; func_name_length = org_func_name.length; - if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); } + if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); break; case Item_func::NEG_FUNC: - if (str) { LEX_CSTRING org_func_name= item_func->func_name_cstring(); func_name = org_func_name.str; func_name_length = org_func_name.length; - if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); } + if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); break; case Item_func::IN_FUNC: if (((Item_func_opt_neg *) item_func)->negated) @@ -6411,18 +6493,17 @@ int spider_db_mbase_util::open_item_func( definition). Users can turn it on if they know what they are doing. */ DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); - if (str) { LEX_CSTRING org_func_name= item_func->func_name_cstring(); func_name = org_func_name.str; func_name_length = org_func_name.length; - DBUG_PRINT("info",("spider func_name = %s", func_name)); - DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); - if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); } + DBUG_PRINT("info",("spider func_name = %s", func_name)); + DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); + if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); func_name = SPIDER_SQL_COMMA_STR; func_name_length = SPIDER_SQL_COMMA_LEN; separator_str = SPIDER_SQL_COMMA_STR; @@ -6433,8 +6514,7 @@ int spider_db_mbase_util::open_item_func( case Item_func::TRIG_COND_FUNC: DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); case Item_func::GUSERVAR_FUNC: - if (str) - str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); + str->length(str->length() - SPIDER_SQL_OPEN_PAREN_LEN); if (item_func->result_type() == STRING_RESULT) DBUG_RETURN(spider_db_open_item_string(item_func, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields)); @@ -6445,28 +6525,22 @@ int spider_db_mbase_util::open_item_func( if (spider_db_check_ft_idx(item_func, spider) == MAX_KEY) DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); start_item = 1; - if (str) - { - if (str->reserve(SPIDER_SQL_MATCH_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN); - } + if (str->reserve(SPIDER_SQL_MATCH_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_MATCH_STR, SPIDER_SQL_MATCH_LEN); separator_str = SPIDER_SQL_COMMA_STR; separator_str_length = SPIDER_SQL_COMMA_LEN; last_str = SPIDER_SQL_CLOSE_PAREN_STR; last_str_length = SPIDER_SQL_CLOSE_PAREN_LEN; break; case Item_func::SP_EQUALS_FUNC: - if (str) - { - func_name = SPIDER_SQL_MBR_EQUAL_STR; - func_name_length = SPIDER_SQL_MBR_EQUAL_LEN; - DBUG_PRINT("info",("spider func_name = %s", func_name)); - DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); - if (str->reserve(func_name_length)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - } + func_name = SPIDER_SQL_MBR_EQUAL_STR; + func_name_length = SPIDER_SQL_MBR_EQUAL_LEN; + DBUG_PRINT("info",("spider func_name = %s", func_name)); + DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); + if (str->reserve(func_name_length)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); func_name = SPIDER_SQL_COMMA_STR; func_name_length = SPIDER_SQL_COMMA_LEN; separator_str = SPIDER_SQL_COMMA_STR; @@ -6481,25 +6555,17 @@ int spider_db_mbase_util::open_item_func( case Item_func::SP_WITHIN_FUNC: case Item_func::SP_CONTAINS_FUNC: case Item_func::SP_OVERLAPS_FUNC: - if (str) { LEX_CSTRING org_func_name= item_func->func_name_cstring(); func_name = org_func_name.str; func_name_length = org_func_name.length; - DBUG_PRINT("info",("spider func_name = %s", func_name)); - DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); - if (str->reserve( -#ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR - SPIDER_SQL_MBR_LEN + -#endif - func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); -#ifndef SPIDER_ITEM_GEOFUNC_NAME_HAS_MBR - str->q_append(SPIDER_SQL_MBR_STR, SPIDER_SQL_MBR_LEN); -#endif - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); } + DBUG_PRINT("info",("spider func_name = %s", func_name)); + DBUG_PRINT("info",("spider func_name_length = %d", func_name_length)); + if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); func_name = SPIDER_SQL_COMMA_STR; func_name_length = SPIDER_SQL_COMMA_LEN; separator_str = SPIDER_SQL_COMMA_STR; @@ -6515,109 +6581,33 @@ int spider_db_mbase_util::open_item_func( case Item_func::GE_FUNC: case Item_func::GT_FUNC: case Item_func::XOR_FUNC: - if (str) + func_name = (char*) item_func->func_name(); + func_name_length = strlen(func_name); + break; + case Item_func::LIKE_FUNC: + if (((Item_func_like *)item_func)->get_negated()) + { + func_name = SPIDER_SQL_NOT_LIKE_STR; + func_name_length = SPIDER_SQL_NOT_LIKE_LEN; + } + else { LEX_CSTRING org_func_name= item_func->func_name_cstring(); func_name = org_func_name.str; func_name_length = org_func_name.length; } break; - case Item_func::LIKE_FUNC: -#ifdef SPIDER_LIKE_FUNC_HAS_GET_NEGATED - if (str) - { - if (((Item_func_like *)item_func)->get_negated()) - { - func_name = SPIDER_SQL_NOT_LIKE_STR; - func_name_length = SPIDER_SQL_NOT_LIKE_LEN; - } - else - { - LEX_CSTRING org_func_name= item_func->func_name_cstring(); - func_name = org_func_name.str; - func_name_length = org_func_name.length; - } - } - break; -#else DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); -#endif case Item_func::CASE_SEARCHED_FUNC: case Item_func::CASE_SIMPLE_FUNC: -#ifdef ITEM_FUNC_CASE_PARAMS_ARE_PUBLIC - Item_func_case *item_func_case = (Item_func_case *) item_func; - if (str) - { - if (str->reserve(SPIDER_SQL_CASE_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_CASE_STR, SPIDER_SQL_CASE_LEN); - } - if (item_func_case->first_expr_num != -1) - { - if ((error_num = spider_db_print_item_type( - item_list[item_func_case->first_expr_num], NULL, spider, str, - alias, alias_length, dbton_id, use_fields, fields))) - DBUG_RETURN(error_num); - } - for (roop_count = 0; roop_count < item_func_case->ncases; - roop_count += 2) - { - if (str) - { - if (str->reserve(SPIDER_SQL_WHEN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_WHEN_STR, SPIDER_SQL_WHEN_LEN); - } - if ((error_num = spider_db_print_item_type( - item_list[roop_count], NULL, spider, str, - alias, alias_length, dbton_id, use_fields, fields))) - DBUG_RETURN(error_num); - if (str) - { - if (str->reserve(SPIDER_SQL_THEN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_THEN_STR, SPIDER_SQL_THEN_LEN); - } - if ((error_num = spider_db_print_item_type( - item_list[roop_count + 1], NULL, spider, str, - alias, alias_length, dbton_id, use_fields, fields))) - DBUG_RETURN(error_num); - } - if (item_func_case->else_expr_num != -1) - { - if (str) - { - if (str->reserve(SPIDER_SQL_ELSE_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_ELSE_STR, SPIDER_SQL_ELSE_LEN); - } - if ((error_num = spider_db_print_item_type( - item_list[item_func_case->else_expr_num], NULL, spider, str, - alias, alias_length, dbton_id, use_fields, fields))) - DBUG_RETURN(error_num); - } - if (str) - { - if (str->reserve(SPIDER_SQL_END_LEN + SPIDER_SQL_CLOSE_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_END_STR, SPIDER_SQL_END_LEN); - str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, - SPIDER_SQL_CLOSE_PAREN_LEN); - } - DBUG_RETURN(0); -#else DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); -#endif case Item_func::JSON_EXTRACT_FUNC: func_name = (char*) item_func->func_name(); func_name_length = strlen(func_name); - if (str) - { - if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); - } + if (str->reserve(func_name_length + SPIDER_SQL_OPEN_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_OPEN_PAREN_STR, SPIDER_SQL_OPEN_PAREN_LEN); func_name = SPIDER_SQL_COMMA_STR; func_name_length = SPIDER_SQL_COMMA_LEN; separator_str = SPIDER_SQL_COMMA_STR; @@ -6631,12 +6621,9 @@ int spider_db_mbase_util::open_item_func( if (spider_param_skip_default_condition(thd, share->skip_default_condition)) DBUG_RETURN(ER_SPIDER_COND_SKIP_NUM); - if (str) - { - LEX_CSTRING org_func_name= item_func->func_name_cstring(); - func_name = org_func_name.str; - func_name_length = org_func_name.length; - } + LEX_CSTRING org_func_name= item_func->func_name_cstring(); + func_name = org_func_name.str; + func_name_length = org_func_name.length; break; } DBUG_PRINT("info",("spider func_name = %s", func_name)); @@ -6669,14 +6656,11 @@ int spider_db_mbase_util::open_item_func( func_name = separator_str; func_name_length = separator_str_length; } - if (str) - { - if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN * 2)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); - str->q_append(func_name, func_name_length); - str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); - } + if (str->reserve(func_name_length + SPIDER_SQL_SPACE_LEN * 2)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); + str->q_append(func_name, func_name_length); + str->q_append(SPIDER_SQL_SPACE_STR, SPIDER_SQL_SPACE_LEN); } /* Print the last operand value */ @@ -6689,61 +6673,49 @@ int spider_db_mbase_util::open_item_func( if (item_func->functype() == Item_func::FT_FUNC) { Item_func_match *item_func_match = (Item_func_match *)item_func; - if (str) - { - if (str->reserve(SPIDER_SQL_AGAINST_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN); - } + if (str->reserve(SPIDER_SQL_AGAINST_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_AGAINST_STR, SPIDER_SQL_AGAINST_LEN); item = item_list[0]; if ((error_num = spider_db_print_item_type(item, NULL, spider, str, alias, alias_length, dbton_id, use_fields, fields))) DBUG_RETURN(error_num); - if (str) - { - if (str->reserve( - ((item_func_match->match_flags & FT_BOOL) ? - SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) + - ((item_func_match->match_flags & FT_EXPAND) ? - SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0) - )) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - if (item_func_match->match_flags & FT_BOOL) - str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR, - SPIDER_SQL_IN_BOOLEAN_MODE_LEN); - if (item_func_match->match_flags & FT_EXPAND) - str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR, - SPIDER_SQL_WITH_QUERY_EXPANSION_LEN); - } + if (str->reserve( + ((item_func_match->match_flags & FT_BOOL) ? + SPIDER_SQL_IN_BOOLEAN_MODE_LEN : 0) + + ((item_func_match->match_flags & FT_EXPAND) ? + SPIDER_SQL_WITH_QUERY_EXPANSION_LEN : 0) + )) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + if (item_func_match->match_flags & FT_BOOL) + str->q_append(SPIDER_SQL_IN_BOOLEAN_MODE_STR, + SPIDER_SQL_IN_BOOLEAN_MODE_LEN); + if (item_func_match->match_flags & FT_EXPAND) + str->q_append(SPIDER_SQL_WITH_QUERY_EXPANSION_STR, + SPIDER_SQL_WITH_QUERY_EXPANSION_LEN); } else if (item_func->functype() == Item_func::UNKNOWN_FUNC) { if ( func_name_length == 7 && !strncasecmp("convert", func_name, func_name_length) ) { - if (str) - { - Item_func_conv_charset *item_func_conv_charset = - (Item_func_conv_charset *)item_func; - CHARSET_INFO *conv_charset = - item_func_conv_charset->SPIDER_Item_func_conv_charset_conv_charset; - uint cset_length = conv_charset->cs_name.length; - if (str->reserve(SPIDER_SQL_USING_LEN + cset_length)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN); - str->q_append(conv_charset->cs_name.str, cset_length); - } + Item_func_conv_charset *item_func_conv_charset = + (Item_func_conv_charset *)item_func; + CHARSET_INFO *conv_charset = + item_func_conv_charset->SPIDER_Item_func_conv_charset_conv_charset; + uint cset_length = conv_charset->cs_name.length; + if (str->reserve(SPIDER_SQL_USING_LEN + cset_length)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(SPIDER_SQL_USING_STR, SPIDER_SQL_USING_LEN); + str->q_append(conv_charset->cs_name.str, cset_length); } } - if (str) - { - if (merge_func) - str->length(str->length() - SPIDER_SQL_CLOSE_PAREN_LEN); - if (str->reserve(last_str_length + SPIDER_SQL_CLOSE_PAREN_LEN)) - DBUG_RETURN(HA_ERR_OUT_OF_MEM); - str->q_append(last_str, last_str_length); - str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); - } + if (merge_func) + str->length(str->length() - SPIDER_SQL_CLOSE_PAREN_LEN); + if (str->reserve(last_str_length + SPIDER_SQL_CLOSE_PAREN_LEN)) + DBUG_RETURN(HA_ERR_OUT_OF_MEM); + str->q_append(last_str, last_str_length); + str->q_append(SPIDER_SQL_CLOSE_PAREN_STR, SPIDER_SQL_CLOSE_PAREN_LEN); DBUG_RETURN(0); } diff --git a/storage/spider/spd_db_mysql.h b/storage/spider/spd_db_mysql.h index 0d121416653..2b2f7aa5153 100644 --- a/storage/spider/spd_db_mysql.h +++ b/storage/spider/spd_db_mysql.h @@ -126,6 +126,25 @@ public: bool use_fields, spider_fields *fields ) override; +protected: + int check_item_func( + Item_func *item_func, + ha_spider *spider, + const char *alias, + uint alias_length, + bool use_fields, + spider_fields *fields + ); + int print_item_func( + Item_func *item_func, + ha_spider *spider, + spider_string *str, + const char *alias, + uint alias_length, + bool use_fields, + spider_fields *fields + ); +public: int open_item_sum_func( Item_sum *item_sum, ha_spider *spider, diff --git a/storage/spider/spd_direct_sql.cc b/storage/spider/spd_direct_sql.cc index be26009e6f5..68544e2ba5f 100644 --- a/storage/spider/spd_direct_sql.cc +++ b/storage/spider/spd_direct_sql.cc @@ -1366,22 +1366,10 @@ int spider_udf_set_direct_sql_param_default( } } - if (direct_sql->table_loop_mode == -1) - direct_sql->table_loop_mode = 0; if (direct_sql->priority == -1) direct_sql->priority = 1000000; - if (direct_sql->connect_timeout == -1) - direct_sql->connect_timeout = 6; - if (direct_sql->net_read_timeout == -1) - direct_sql->net_read_timeout = 600; - if (direct_sql->net_write_timeout == -1) - direct_sql->net_write_timeout = 600; - if (direct_sql->bulk_insert_rows == -1) - direct_sql->bulk_insert_rows = 3000; if (direct_sql->connection_channel == -1) direct_sql->connection_channel = 0; - if (direct_sql->use_real_table == -1) - direct_sql->use_real_table = 0; if (direct_sql->error_rw_mode == -1) direct_sql->error_rw_mode = 0; for (roop_count = 0; roop_count < direct_sql->table_count; roop_count++) diff --git a/storage/spider/spd_param.cc b/storage/spider/spd_param.cc index c1b84ed4452..f04ecf4a17c 100644 --- a/storage/spider/spd_param.cc +++ b/storage/spider/spd_param.cc @@ -1,4 +1,5 @@ /* Copyright (C) 2008-2018 Kentoku Shiba + Copyright (C) 2023 MariaDB plc This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -13,6 +14,26 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ +/** + @file + + There are several kinds of spider parameters. + + - sysvar/thdvar that are not table parameters. These variables do + not appear in a `SPIDER_SHARE`. Examples include `support_xa` and + `conn_recycle_mode`. Their values are commonly retrieved by + `SPIDER_SYSVAR_VALUE_FUNC()` and `SPIDER_THDVAR_VALUE_FUNC()` + - sysvar/thdvar that are also table parameters. These variables + commonly appear in a `SPIDER_SHARE`. Examples include + `read_only_mode` and `use_table_charset`. Table parameter values + override variable values, and their values are commonly retrieved + by `SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC()` and + `SPIDER_THDVAR_OVERRIDE_VALUE_FUNC()`. + - table parameters that are not sysvar/thdvar. Examples include + host and username. They are not handled in this file which is only + concerned with global/session variables +*/ + #define MYSQL_SERVER 1 #include #include "mysql_version.h" @@ -37,6 +58,57 @@ extern struct st_maria_plugin spider_i_s_wrapper_protocols_maria; extern volatile ulonglong spider_mon_table_cache_version; extern volatile ulonglong spider_mon_table_cache_version_req; +/* + Define a function returning the value of a global variable. +*/ +#define SPIDER_SYSVAR_VALUE_FUNC(param_type, param_name) \ + param_type spider_param_ ## param_name() \ + { \ + return SYSVAR(param_name); \ + } + +/* + Define a function returning the value of a session variable. +*/ +#define SPIDER_THDVAR_VALUE_FUNC(param_type, param_name) \ + param_type spider_param_ ## param_name(THD *thd) \ + { \ + return THDVAR(thd, param_name); \ + } + +/* + Define a function returning the value of a table param that is also a + global variable. + + If the table param value is not -1, use the table param value. + Otherwise if the variable value is not -1, use the variable value. + Otherwise use the default variable value. +*/ +#define SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(param_type, param_name) \ + param_type spider_param_ ## param_name(param_type param_name) \ + { \ + return param_name != -1 ? param_name : \ + SYSVAR(param_name) != -1 ? SYSVAR(param_name) : \ + MYSQL_SYSVAR_NAME(param_name).def_val; \ + } + +/* + Define a function returning the value of a table param that is also a + session variable. + + If the table param value is not -1, use the table param value. + Otherwise if the variable value is not -1, use the variable value. + Otherwise use the default variable value. +*/ +#define SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(param_type, param_name) \ + param_type spider_param_ ## param_name(THD* thd, \ + param_type param_name) \ + { \ + return param_name != -1 ? param_name : \ + THDVAR(thd, param_name) != -1 ? THDVAR(thd, param_name) : \ + MYSQL_SYSVAR_NAME(param_name).def_val; \ + } + static int spider_direct_update(THD *thd, SHOW_VAR *var, char *buff) { int error_num = 0; @@ -166,11 +238,7 @@ static void spider_var_deprecated_longlong(THD *thd, st_mysql_sys_var *, } } -my_bool spider_param_support_xa() -{ - DBUG_ENTER("spider_param_support_xa"); - DBUG_RETURN(spider_support_xa); -} +SPIDER_SYSVAR_VALUE_FUNC(my_bool, support_xa) static my_bool spider_connect_mutex; static MYSQL_SYSVAR_BOOL( @@ -183,11 +251,7 @@ static MYSQL_SYSVAR_BOOL( FALSE ); -my_bool spider_param_connect_mutex() -{ - DBUG_ENTER("spider_param_connect_mutex"); - DBUG_RETURN(spider_connect_mutex); -} +SPIDER_SYSVAR_VALUE_FUNC(my_bool, connect_mutex) static uint spider_connect_error_interval; /* @@ -206,11 +270,7 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_connect_error_interval() -{ - DBUG_ENTER("spider_param_connect_error_interval"); - DBUG_RETURN(spider_connect_error_interval); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, connect_error_interval) static uint spider_table_init_error_interval; /* @@ -229,15 +289,11 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_table_init_error_interval() -{ - DBUG_ENTER("spider_param_table_init_error_interval"); - DBUG_RETURN(spider_table_init_error_interval); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, table_init_error_interval) static int spider_use_table_charset; /* - -1 :use table parameter + -1 :fallback to default 0 :use utf8 1 :use table charset */ @@ -254,13 +310,7 @@ static MYSQL_SYSVAR_INT( 0 ); -int spider_param_use_table_charset( - int use_table_charset -) { - DBUG_ENTER("spider_param_use_table_charset"); - DBUG_RETURN(spider_use_table_charset == -1 ? - use_table_charset : spider_use_table_charset); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(int, use_table_charset) /* 0: no recycle @@ -279,12 +329,7 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_conn_recycle_mode( - THD *thd -) { - DBUG_ENTER("spider_param_conn_recycle_mode"); - DBUG_RETURN(THDVAR(thd, conn_recycle_mode)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, conn_recycle_mode) /* 0: weak @@ -302,12 +347,7 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_conn_recycle_strict( - THD *thd -) { - DBUG_ENTER("spider_param_conn_recycle_strict"); - DBUG_RETURN(THDVAR(thd, conn_recycle_strict)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, conn_recycle_strict) /* FALSE: no sync @@ -322,12 +362,7 @@ static MYSQL_THDVAR_BOOL( TRUE /* def */ ); -bool spider_param_sync_trx_isolation( - THD *thd -) { - DBUG_ENTER("spider_param_sync_trx_isolation"); - DBUG_RETURN(THDVAR(thd, sync_trx_isolation)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, sync_trx_isolation) /* FALSE: no use @@ -342,12 +377,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_use_consistent_snapshot( - THD *thd -) { - DBUG_ENTER("spider_param_use_consistent_snapshot"); - DBUG_RETURN(THDVAR(thd, use_consistent_snapshot)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, use_consistent_snapshot) /* FALSE: off @@ -362,12 +392,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_internal_xa( - THD *thd -) { - DBUG_ENTER("spider_param_internal_xa"); - DBUG_RETURN(THDVAR(thd, internal_xa)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, internal_xa) /* 0 :err when use a spider table @@ -387,12 +412,7 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_internal_xa_snapshot( - THD *thd -) { - DBUG_ENTER("spider_param_internal_xa_snapshot"); - DBUG_RETURN(THDVAR(thd, internal_xa_snapshot)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, internal_xa_snapshot) /* 0 :off @@ -411,12 +431,7 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_force_commit( - THD *thd -) { - DBUG_ENTER("spider_param_force_commit"); - DBUG_RETURN(THDVAR(thd, force_commit)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, force_commit) /* 0: register all XA transaction @@ -434,15 +449,10 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_xa_register_mode( - THD *thd -) { - DBUG_ENTER("spider_param_xa_register_mode"); - DBUG_RETURN(THDVAR(thd, xa_register_mode)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, xa_register_mode) /* - -1 :use table parameter + -1 :fallback to default 0-:offset */ static MYSQL_THDVAR_LONGLONG( @@ -457,17 +467,10 @@ static MYSQL_THDVAR_LONGLONG( 0 /* blk */ ); -longlong spider_param_internal_offset( - THD *thd, - longlong internal_offset -) { - DBUG_ENTER("spider_param_internal_offset"); - DBUG_RETURN(THDVAR(thd, internal_offset) < 0 ? - internal_offset : THDVAR(thd, internal_offset)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, internal_offset) /* - -1 :use table parameter + -1 :fallback to default 0-:limit */ static MYSQL_THDVAR_LONGLONG( @@ -482,17 +485,10 @@ static MYSQL_THDVAR_LONGLONG( 0 /* blk */ ); -longlong spider_param_internal_limit( - THD *thd, - longlong internal_limit -) { - DBUG_ENTER("spider_param_internal_limit"); - DBUG_RETURN(THDVAR(thd, internal_limit) < 0 ? - internal_limit : THDVAR(thd, internal_limit)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, internal_limit) /* - -1 :use table parameter + -1 :fallback to default 0-:number of rows at a select */ static MYSQL_THDVAR_LONGLONG( @@ -507,17 +503,10 @@ static MYSQL_THDVAR_LONGLONG( 0 /* blk */ ); -longlong spider_param_split_read( - THD *thd, - longlong split_read -) { - DBUG_ENTER("spider_param_split_read"); - DBUG_RETURN(THDVAR(thd, split_read) < 0 ? - split_read : THDVAR(thd, split_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, split_read) /* - -1 :use table parameter + -1 :fallback to default 0 :doesn't use "offset" and "limit" for "split_read" 1-:magnification */ @@ -533,17 +522,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -double spider_param_semi_split_read( - THD *thd, - double semi_split_read -) { - DBUG_ENTER("spider_param_semi_split_read"); - DBUG_RETURN(THDVAR(thd, semi_split_read) < 0 ? - semi_split_read : THDVAR(thd, semi_split_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(double, semi_split_read) /* - -1 :use table parameter + -1 :fallback to default 0-:the limit value */ static MYSQL_THDVAR_LONGLONG( @@ -558,17 +540,10 @@ static MYSQL_THDVAR_LONGLONG( 0 /* blk */ ); -longlong spider_param_semi_split_read_limit( - THD *thd, - longlong semi_split_read_limit -) { - DBUG_ENTER("spider_param_semi_split_read_limit"); - DBUG_RETURN(THDVAR(thd, semi_split_read_limit) < 0 ? - semi_split_read_limit : THDVAR(thd, semi_split_read_limit)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, semi_split_read_limit) /* - -1 :use table parameter + -1 :fallback to default 0 :no alloc 1-:alloc size */ @@ -584,17 +559,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_init_sql_alloc_size( - THD *thd, - int init_sql_alloc_size -) { - DBUG_ENTER("spider_param_init_sql_alloc_size"); - DBUG_RETURN(THDVAR(thd, init_sql_alloc_size) < 0 ? - init_sql_alloc_size : THDVAR(thd, init_sql_alloc_size)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, init_sql_alloc_size) /* - -1 :use table parameter + -1 :fallback to default 0 :off 1 :on */ @@ -610,17 +578,15 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_reset_sql_alloc( - THD *thd, - int reset_sql_alloc -) { - DBUG_ENTER("spider_param_reset_sql_alloc"); - DBUG_RETURN(THDVAR(thd, reset_sql_alloc) < 0 ? - reset_sql_alloc : THDVAR(thd, reset_sql_alloc)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, reset_sql_alloc) + +#if defined(HS_HAS_SQLCOM) && defined(HAVE_HANDLERSOCKET) + +SPIDER_THDVAR_OVERRIDE_VALUE_FUN(longlong, hs_result_free_size) +#endif /* - -1 :use table parameter + -1 :fallback to default 0 :off 1 :on */ @@ -636,17 +602,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_multi_split_read( - THD *thd, - int multi_split_read -) { - DBUG_ENTER("spider_param_multi_split_read"); - DBUG_RETURN(THDVAR(thd, multi_split_read) < 0 ? - multi_split_read : THDVAR(thd, multi_split_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, multi_split_read) /* - -1 :use table parameter + -1 :fallback to default 0-:max order columns */ static MYSQL_THDVAR_INT( @@ -661,14 +620,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_max_order( - THD *thd, - int max_order -) { - DBUG_ENTER("spider_param_max_order"); - DBUG_RETURN(THDVAR(thd, max_order) < 0 ? - max_order : THDVAR(thd, max_order)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, max_order) /* -1 :off @@ -689,12 +641,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_semi_trx_isolation( - THD *thd -) { - DBUG_ENTER("spider_param_semi_trx_isolation"); - DBUG_RETURN(THDVAR(thd, semi_trx_isolation)); -} +SPIDER_THDVAR_VALUE_FUNC(int, semi_trx_isolation) static int spider_param_semi_table_lock_check( MYSQL_THD thd, @@ -747,13 +694,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_semi_table_lock( - THD *thd, - int semi_table_lock -) { - DBUG_ENTER("spider_param_semi_table_lock"); - DBUG_RETURN((semi_table_lock & THDVAR(thd, semi_table_lock))); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, semi_table_lock) static int spider_param_semi_table_lock_connection_check( MYSQL_THD thd, @@ -807,14 +748,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_semi_table_lock_connection( - THD *thd, - int semi_table_lock_connection -) { - DBUG_ENTER("spider_param_semi_table_lock_connection"); - DBUG_RETURN(THDVAR(thd, semi_table_lock_connection) == -1 ? - semi_table_lock_connection : THDVAR(thd, semi_table_lock_connection)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, semi_table_lock_connection) /* 0-:block_size @@ -831,15 +765,10 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_block_size( - THD *thd -) { - DBUG_ENTER("spider_param_block_size"); - DBUG_RETURN(THDVAR(thd, block_size)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, block_size) /* - -1 :use table parameter + -1 :fallback to default 0 :off 1 :lock in share mode 2 :for update @@ -856,14 +785,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_selupd_lock_mode( - THD *thd, - int selupd_lock_mode -) { - DBUG_ENTER("spider_param_selupd_lock_mode"); - DBUG_RETURN(THDVAR(thd, selupd_lock_mode) == -1 ? - selupd_lock_mode : THDVAR(thd, selupd_lock_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, selupd_lock_mode) /* FALSE: no sync @@ -878,12 +800,7 @@ static MYSQL_THDVAR_BOOL( TRUE /* def */ ); -bool spider_param_sync_autocommit( - THD *thd -) { - DBUG_ENTER("spider_param_sync_autocommit"); - DBUG_RETURN(THDVAR(thd, sync_autocommit)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, sync_autocommit) /* FALSE: not use @@ -898,12 +815,7 @@ static MYSQL_THDVAR_BOOL( TRUE /* def */ ); -bool spider_param_use_default_database( - THD *thd -) { - DBUG_ENTER("spider_param_use_default_database"); - DBUG_RETURN(THDVAR(thd, use_default_database)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, use_default_database) /* -1 :don't know or does not matter; don't send 'SET SQL_LOG_OFF' statement @@ -922,15 +834,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_internal_sql_log_off( - THD *thd -) { - DBUG_ENTER("spider_param_internal_sql_log_off"); - DBUG_RETURN(THDVAR(thd, internal_sql_log_off)); -} +SPIDER_THDVAR_VALUE_FUNC(int, internal_sql_log_off) /* - -1 :use table parameter + -1 :fallback to default 0-:bulk insert size */ static MYSQL_THDVAR_INT( @@ -945,17 +852,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_bulk_size( - THD *thd, - int bulk_size -) { - DBUG_ENTER("spider_param_bulk_size"); - DBUG_RETURN(THDVAR(thd, bulk_size) < 0 ? - bulk_size : THDVAR(thd, bulk_size)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, bulk_size) /* - -1 :use table parameter + -1 :fallback to default 0 : Send "update" and "delete" statements one by one. 1 : Send collected multiple "update" and "delete" statements. (Collected statements are sent one by one) @@ -974,17 +874,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_bulk_update_mode( - THD *thd, - int bulk_update_mode -) { - DBUG_ENTER("spider_param_bulk_update_mode"); - DBUG_RETURN(THDVAR(thd, bulk_update_mode) == -1 ? - bulk_update_mode : THDVAR(thd, bulk_update_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, bulk_update_mode) /* - -1 :use table parameter + -1 :fallback to default 0-:bulk update size */ static MYSQL_THDVAR_INT( @@ -999,17 +892,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_bulk_update_size( - THD *thd, - int bulk_update_size -) { - DBUG_ENTER("spider_param_bulk_update_size"); - DBUG_RETURN(THDVAR(thd, bulk_update_size) == -1 ? - bulk_update_size : THDVAR(thd, bulk_update_size)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, bulk_update_size) /* - -1 :use table parameter + -1 :fallback to default 0-:buffer size */ static MYSQL_THDVAR_INT( @@ -1024,17 +910,18 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_buffer_size( - THD *thd, - int buffer_size -) { - DBUG_ENTER("spider_param_buffer_size"); - DBUG_RETURN(THDVAR(thd, buffer_size) == -1 ? - buffer_size : THDVAR(thd, buffer_size)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, buffer_size) /* - -1 :use table parameter + Notes on merge conflicts (remove after merging): + 10.5: 48faa20db848012e2187a09e05aba832078cb82e + 10.6: 51ff9eddf7c0aaf1e022fcb3b48ec36835df7785 + 10.9: 06a61b8e453126c2de1649073f247d34e85f9702 + 10.10: 90cd0c156f5bb53fd058d2bbfb83f850ffae6722 + 10.11+: 124eb662700708f3c4b0fb77968f8b854d6bb4aa +*/ +/* + -1 :fallback to default 0 :off 1 :on */ @@ -1050,17 +937,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_internal_optimize( - THD *thd, - int internal_optimize -) { - DBUG_ENTER("spider_param_internal_optimize"); - DBUG_RETURN(THDVAR(thd, internal_optimize) == -1 ? - internal_optimize : THDVAR(thd, internal_optimize)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, internal_optimize) /* - -1 :use table parameter + -1 :fallback to default 0 :off 1 :on */ @@ -1076,14 +956,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_internal_optimize_local( - THD *thd, - int internal_optimize_local -) { - DBUG_ENTER("spider_param_internal_optimize_local"); - DBUG_RETURN(THDVAR(thd, internal_optimize_local) == -1 ? - internal_optimize_local : THDVAR(thd, internal_optimize_local)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, internal_optimize_local) /* FALSE: off @@ -1098,12 +971,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_use_flash_logs( - THD *thd -) { - DBUG_ENTER("spider_param_use_flash_logs"); - DBUG_RETURN(THDVAR(thd, use_flash_logs)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, use_flash_logs) /* 0 :off @@ -1122,12 +990,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_use_snapshot_with_flush_tables( - THD *thd -) { - DBUG_ENTER("spider_param_use_snapshot_with_flush_tables"); - DBUG_RETURN(THDVAR(thd, use_snapshot_with_flush_tables)); -} +SPIDER_THDVAR_VALUE_FUNC(int, use_snapshot_with_flush_tables) /* FALSE: off @@ -1142,12 +1005,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_use_all_conns_snapshot( - THD *thd -) { - DBUG_ENTER("spider_param_use_all_conns_snapshot"); - DBUG_RETURN(THDVAR(thd, use_all_conns_snapshot)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, use_all_conns_snapshot) /* FALSE: off @@ -1162,12 +1020,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_lock_exchange( - THD *thd -) { - DBUG_ENTER("spider_param_lock_exchange"); - DBUG_RETURN(THDVAR(thd, lock_exchange)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, lock_exchange) /* FALSE: off @@ -1182,12 +1035,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_internal_unlock( - THD *thd -) { - DBUG_ENTER("spider_param_internal_unlock"); - DBUG_RETURN(THDVAR(thd, internal_unlock)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, internal_unlock) /* FALSE: off @@ -1202,15 +1050,10 @@ static MYSQL_THDVAR_BOOL( TRUE /* def */ ); -bool spider_param_semi_trx( - THD *thd -) { - DBUG_ENTER("spider_param_semi_trx"); - DBUG_RETURN(THDVAR(thd, semi_trx)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, semi_trx) /* - -1 :use table parameter + -1 :fallback to default 0-:seconds of timeout */ static MYSQL_THDVAR_INT( @@ -1225,19 +1068,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_connect_timeout( - THD *thd, - int connect_timeout -) { - DBUG_ENTER("spider_param_connect_timeout"); - if (thd) - DBUG_RETURN(THDVAR(thd, connect_timeout) == -1 ? - connect_timeout : THDVAR(thd, connect_timeout)); - DBUG_RETURN(connect_timeout); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, connect_timeout) /* - -1 :use table parameter + -1 :fallback to default 0-:seconds of timeout */ static MYSQL_THDVAR_INT( @@ -1252,19 +1086,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_net_read_timeout( - THD *thd, - int net_read_timeout -) { - DBUG_ENTER("spider_param_net_read_timeout"); - if (thd) - DBUG_RETURN(THDVAR(thd, net_read_timeout) == -1 ? - net_read_timeout : THDVAR(thd, net_read_timeout)); - DBUG_RETURN(net_read_timeout); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, net_read_timeout) /* - -1 :use table parameter + -1 :fallback to default 0-:seconds of timeout */ static MYSQL_THDVAR_INT( @@ -1279,19 +1104,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_net_write_timeout( - THD *thd, - int net_write_timeout -) { - DBUG_ENTER("spider_param_net_write_timeout"); - if (thd) - DBUG_RETURN(THDVAR(thd, net_write_timeout) == -1 ? - net_write_timeout : THDVAR(thd, net_write_timeout)); - DBUG_RETURN(net_write_timeout); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, net_write_timeout) /* - -1 :use table parameter + -1 :fallback to default 0 :It acquires it collectively. 1 :Acquisition one by one.If it discontinues once, and it will need it later, it retrieves it again when there is interrupt on the way. @@ -1310,17 +1126,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_quick_mode( - THD *thd, - int quick_mode -) { - DBUG_ENTER("spider_param_quick_mode"); - DBUG_RETURN(THDVAR(thd, quick_mode) < 0 ? - quick_mode : THDVAR(thd, quick_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, quick_mode) /* - -1 :use table parameter + -1 :fallback to default 0-:number of records */ static MYSQL_THDVAR_LONGLONG( @@ -1335,17 +1144,10 @@ static MYSQL_THDVAR_LONGLONG( 0 /* blk */ ); -longlong spider_param_quick_page_size( - THD *thd, - longlong quick_page_size -) { - DBUG_ENTER("spider_param_quick_page_size"); - DBUG_RETURN(THDVAR(thd, quick_page_size) < 0 ? - quick_page_size : THDVAR(thd, quick_page_size)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, quick_page_size) /* - -1 :use table parameter + -1 :fallback to default 0-:the limitation of memory size */ static MYSQL_THDVAR_LONGLONG( @@ -1360,17 +1162,10 @@ static MYSQL_THDVAR_LONGLONG( 0 /* blk */ ); -longlong spider_param_quick_page_byte( - THD *thd, - longlong quick_page_byte -) { - DBUG_ENTER("spider_param_quick_page_byte"); - DBUG_RETURN(THDVAR(thd, quick_page_byte) < 0 ? - quick_page_byte : THDVAR(thd, quick_page_byte)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, quick_page_byte) /* - -1 :use table parameter + -1 :fallback to default 0 :It doesn't use low memory mode. 1 :It uses low memory mode. */ @@ -1386,17 +1181,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_low_mem_read( - THD *thd, - int low_mem_read -) { - DBUG_ENTER("spider_param_low_mem_read"); - DBUG_RETURN(THDVAR(thd, low_mem_read) < 0 ? - low_mem_read : THDVAR(thd, low_mem_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, low_mem_read) /* - -1 :use table parameter + -1 :fallback to default 0 :Use index columns if select statement can solve by using index, otherwise use all columns. 1 :Use columns that are judged necessary. @@ -1413,17 +1201,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_select_column_mode( - THD *thd, - int select_column_mode -) { - DBUG_ENTER("spider_param_select_column_mode"); - DBUG_RETURN(THDVAR(thd, select_column_mode) == -1 ? - select_column_mode : THDVAR(thd, select_column_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, select_column_mode) /* - -1 :use table parameter + -1 :fallback to default 0 :background search is disabled 1 :background search is used if search with no lock 2 :background search is used if search with no lock or shared lock @@ -1441,17 +1222,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_bgs_mode( - THD *thd, - int bgs_mode -) { - DBUG_ENTER("spider_param_bgs_mode"); - DBUG_RETURN(THDVAR(thd, bgs_mode) < 0 ? - bgs_mode : THDVAR(thd, bgs_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, bgs_mode) /* - -1 :use table parameter + -1 :fallback to default 0 :records is gotten usually 1-:number of records */ @@ -1467,17 +1241,10 @@ static MYSQL_THDVAR_LONGLONG( 0 /* blk */ ); -longlong spider_param_bgs_first_read( - THD *thd, - longlong bgs_first_read -) { - DBUG_ENTER("spider_param_bgs_first_read"); - DBUG_RETURN(THDVAR(thd, bgs_first_read) < 0 ? - bgs_first_read : THDVAR(thd, bgs_first_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, bgs_first_read) /* - -1 :use table parameter + -1 :fallback to default 0 :records is gotten usually 1-:number of records */ @@ -1493,17 +1260,10 @@ static MYSQL_THDVAR_LONGLONG( 0 /* blk */ ); -longlong spider_param_bgs_second_read( - THD *thd, - longlong bgs_second_read -) { - DBUG_ENTER("spider_param_bgs_second_read"); - DBUG_RETURN(THDVAR(thd, bgs_second_read) < 0 ? - bgs_second_read : THDVAR(thd, bgs_second_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, bgs_second_read) /* - -1 :use table parameter + -1 :fallback to default 0 :records is gotten usually 1-:number of records */ @@ -1519,17 +1279,10 @@ static MYSQL_THDVAR_LONGLONG( 0 /* blk */ ); -longlong spider_param_first_read( - THD *thd, - longlong first_read -) { - DBUG_ENTER("spider_param_first_read"); - DBUG_RETURN(THDVAR(thd, first_read) < 0 ? - first_read : THDVAR(thd, first_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, first_read) /* - -1 :use table parameter + -1 :fallback to default 0 :records is gotten usually 1-:number of records */ @@ -1545,17 +1298,10 @@ static MYSQL_THDVAR_LONGLONG( 0 /* blk */ ); -longlong spider_param_second_read( - THD *thd, - longlong second_read -) { - DBUG_ENTER("spider_param_second_read"); - DBUG_RETURN(THDVAR(thd, second_read) < 0 ? - second_read : THDVAR(thd, second_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, second_read) /* - -1 :use table parameter + -1 :fallback to default 0 :always get the newest information 1-:interval */ @@ -1571,17 +1317,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -double spider_param_crd_interval( - THD *thd, - double crd_interval -) { - DBUG_ENTER("spider_param_crd_interval"); - DBUG_RETURN(THDVAR(thd, crd_interval) == -1 ? - crd_interval : THDVAR(thd, crd_interval)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(double, crd_interval) /* - -1 :use table parameter + -1 :fallback to default 0 :use table parameter 1 :use show command 2 :use information schema @@ -1599,17 +1338,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_crd_mode( - THD *thd, - int crd_mode -) { - DBUG_ENTER("spider_param_crd_mode"); - DBUG_RETURN(THDVAR(thd, crd_mode) <= 0 ? - crd_mode : THDVAR(thd, crd_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, crd_mode) /* - -1 :use table parameter + -1 :fallback to default 0 :No synchronization. 1 :Cardinality is synchronized when opening a table. Then no synchronization. @@ -1627,17 +1359,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_crd_sync( - THD *thd, - int crd_sync -) { - DBUG_ENTER("spider_param_crd_sync"); - DBUG_RETURN(THDVAR(thd, crd_sync) == -1 ? - crd_sync : THDVAR(thd, crd_sync)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, crd_sync) /* - -1 :use table parameter + -1 :fallback to default 0 :The crd_weight is used as a fixed value. 1 :The crd_weight is used as an addition value. 2 :The crd_weight is used as a multiplication value. @@ -1654,17 +1379,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_crd_type( - THD *thd, - int crd_type -) { - DBUG_ENTER("spider_param_crd_type"); - DBUG_RETURN(THDVAR(thd, crd_type) == -1 ? - crd_type : THDVAR(thd, crd_type)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, crd_type) /* - -1 :use table parameter + -1 :fallback to default 0-:weight */ static MYSQL_THDVAR_INT( @@ -1679,17 +1397,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -double spider_param_crd_weight( - THD *thd, - double crd_weight -) { - DBUG_ENTER("spider_param_crd_weight"); - DBUG_RETURN(THDVAR(thd, crd_weight) == -1 ? - crd_weight : THDVAR(thd, crd_weight)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(double, crd_weight) /* - -1 :use table parameter + -1 :fallback to default 0 :Background confirmation is disabled 1 :Background confirmation is enabled (create thread per table/partition) 2 :Background confirmation is enabled (use static threads) @@ -1706,17 +1417,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_crd_bg_mode( - THD *thd, - int crd_bg_mode -) { - DBUG_ENTER("spider_param_crd_bg_mode"); - DBUG_RETURN(THDVAR(thd, crd_bg_mode) == -1 ? - crd_bg_mode : THDVAR(thd, crd_bg_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, crd_bg_mode) /* - -1 :use table parameter + -1 :fallback to default 0 :always get the newest information 1-:interval */ @@ -1732,17 +1436,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -double spider_param_sts_interval( - THD *thd, - double sts_interval -) { - DBUG_ENTER("spider_param_sts_interval"); - DBUG_RETURN(THDVAR(thd, sts_interval) == -1 ? - sts_interval : THDVAR(thd, sts_interval)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(double, sts_interval) /* - -1 :use table parameter + -1 :fallback to default 0 :use table parameter 1 :use show command 2 :use information schema @@ -1759,17 +1456,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_sts_mode( - THD *thd, - int sts_mode -) { - DBUG_ENTER("spider_param_sts_mode"); - DBUG_RETURN(THDVAR(thd, sts_mode) <= 0 ? - sts_mode : THDVAR(thd, sts_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, sts_mode) /* - -1 :use table parameter + -1 :fallback to default 0 :No synchronization. 1 :Table state is synchronized when opening a table. Then no synchronization. @@ -1787,17 +1477,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_sts_sync( - THD *thd, - int sts_sync -) { - DBUG_ENTER("spider_param_sts_sync"); - DBUG_RETURN(THDVAR(thd, sts_sync) == -1 ? - sts_sync : THDVAR(thd, sts_sync)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, sts_sync) /* - -1 :use table parameter + -1 :fallback to default 0 :Background confirmation is disabled 1 :Background confirmation is enabled (create thread per table/partition) 2 :Background confirmation is enabled (use static threads) @@ -1814,14 +1497,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_sts_bg_mode( - THD *thd, - int sts_bg_mode -) { - DBUG_ENTER("spider_param_sts_bg_mode"); - DBUG_RETURN(THDVAR(thd, sts_bg_mode) == -1 ? - sts_bg_mode : THDVAR(thd, sts_bg_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, sts_bg_mode) /* 0 :always ping @@ -1839,15 +1515,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -double spider_param_ping_interval_at_trx_start( - THD *thd -) { - DBUG_ENTER("spider_param_ping_interval_at_trx_start"); - DBUG_RETURN(THDVAR(thd, ping_interval_at_trx_start)); -} +SPIDER_THDVAR_VALUE_FUNC(double, ping_interval_at_trx_start) /* - -1 :use table parameter + -1 :fallback to default 0 :normal mode 1 :quick mode 2 :set 0 value @@ -1864,14 +1535,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_auto_increment_mode( - THD *thd, - int auto_increment_mode -) { - DBUG_ENTER("spider_param_auto_increment_mode"); - DBUG_RETURN(THDVAR(thd, auto_increment_mode) == -1 ? - auto_increment_mode : THDVAR(thd, auto_increment_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, auto_increment_mode) /* FALSE: off @@ -1886,12 +1550,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_same_server_link( - THD *thd -) { - DBUG_ENTER("spider_param_same_server_link"); - DBUG_RETURN(THDVAR(thd, same_server_link)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, same_server_link) /* FALSE: transmits @@ -1907,15 +1566,10 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -bool spider_param_local_lock_table( - THD *thd -) { - DBUG_ENTER("spider_param_local_lock_table"); - DBUG_RETURN(THDVAR(thd, local_lock_table)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, local_lock_table) /* - -1 :use table parameter + -1 :fallback to default 0 :don't transmit 1 :transmits */ @@ -1931,17 +1585,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_use_pushdown_udf( - THD *thd, - int use_pushdown_udf -) { - DBUG_ENTER("spider_param_use_pushdown_udf"); - DBUG_RETURN(THDVAR(thd, use_pushdown_udf) == -1 ? - use_pushdown_udf : THDVAR(thd, use_pushdown_udf)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, use_pushdown_udf) /* - -1 :use table parameter + -1 :fallback to default 0 :duplicate check on local server 1 :avoid duplicate check on local server */ @@ -1957,14 +1604,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_direct_dup_insert( - THD *thd, - int direct_dup_insert -) { - DBUG_ENTER("spider_param_direct_dup_insert"); - DBUG_RETURN(THDVAR(thd, direct_dup_insert) < 0 ? - direct_dup_insert : THDVAR(thd, direct_dup_insert)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, direct_dup_insert) static uint spider_udf_table_lock_mutex_count; /* @@ -1983,11 +1623,7 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_udf_table_lock_mutex_count() -{ - DBUG_ENTER("spider_param_udf_table_lock_mutex_count"); - DBUG_RETURN(spider_udf_table_lock_mutex_count); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, udf_table_lock_mutex_count) static uint spider_udf_table_mon_mutex_count; /* @@ -2006,11 +1642,7 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_udf_table_mon_mutex_count() -{ - DBUG_ENTER("spider_param_udf_table_mon_mutex_count"); - DBUG_RETURN(spider_udf_table_mon_mutex_count); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, udf_table_mon_mutex_count) /* 1-:number of rows @@ -2021,23 +1653,16 @@ static MYSQL_THDVAR_LONGLONG( "Number of rows for bulk inserting", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 3000, /* def */ -1, /* min */ 9223372036854775807LL, /* max */ 0 /* blk */ ); -longlong spider_param_udf_ds_bulk_insert_rows( - THD *thd, - longlong udf_ds_bulk_insert_rows -) { - DBUG_ENTER("spider_param_udf_ds_bulk_insert_rows"); - DBUG_RETURN(THDVAR(thd, udf_ds_bulk_insert_rows) <= 0 ? - udf_ds_bulk_insert_rows : THDVAR(thd, udf_ds_bulk_insert_rows)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, udf_ds_bulk_insert_rows) /* - -1 :use table parameter + -1 :fallback to default 0 :drop records 1 :insert last table 2 :insert first table and loop again @@ -2048,20 +1673,13 @@ static MYSQL_THDVAR_INT( "Table loop mode if the number of tables in table list are less than the number of result sets", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 2, /* max */ 0 /* blk */ ); -int spider_param_udf_ds_table_loop_mode( - THD *thd, - int udf_ds_table_loop_mode -) { - DBUG_ENTER("spider_param_udf_ds_table_loop_mode"); - DBUG_RETURN(THDVAR(thd, udf_ds_table_loop_mode) == -1 ? - udf_ds_table_loop_mode : THDVAR(thd, udf_ds_table_loop_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, udf_ds_table_loop_mode) static char *spider_remote_access_charset; /* @@ -2077,11 +1695,7 @@ static MYSQL_SYSVAR_STR( NULL ); -char *spider_param_remote_access_charset() -{ - DBUG_ENTER("spider_param_remote_access_charset"); - DBUG_RETURN(spider_remote_access_charset); -} +SPIDER_SYSVAR_VALUE_FUNC(char*, remote_access_charset) static int spider_remote_autocommit; /* @@ -2102,11 +1716,7 @@ static MYSQL_SYSVAR_INT( 0 ); -int spider_param_remote_autocommit() -{ - DBUG_ENTER("spider_param_remote_autocommit"); - DBUG_RETURN(spider_remote_autocommit); -} +SPIDER_SYSVAR_VALUE_FUNC(int, remote_autocommit) static char *spider_remote_time_zone; /* @@ -2122,11 +1732,7 @@ static MYSQL_SYSVAR_STR( NULL ); -char *spider_param_remote_time_zone() -{ - DBUG_ENTER("spider_param_remote_time_zone"); - DBUG_RETURN(spider_remote_time_zone); -} +SPIDER_SYSVAR_VALUE_FUNC(char *, remote_time_zone) static int spider_remote_sql_log_off; /* @@ -2147,11 +1753,7 @@ static MYSQL_SYSVAR_INT( 0 ); -int spider_param_remote_sql_log_off() -{ - DBUG_ENTER("spider_param_remote_sql_log_off"); - DBUG_RETURN(spider_remote_sql_log_off); -} +SPIDER_SYSVAR_VALUE_FUNC(int, remote_sql_log_off) static int spider_remote_trx_isolation; /* @@ -2174,11 +1776,7 @@ static MYSQL_SYSVAR_INT( 0 ); -int spider_param_remote_trx_isolation() -{ - DBUG_ENTER("spider_param_remote_trx_isolation"); - DBUG_RETURN(spider_remote_trx_isolation); -} +SPIDER_SYSVAR_VALUE_FUNC(int, remote_trx_isolation) static char *spider_remote_default_database; /* @@ -2194,11 +1792,7 @@ static MYSQL_SYSVAR_STR( NULL ); -char *spider_param_remote_default_database() -{ - DBUG_ENTER("spider_param_remote_default_database"); - DBUG_RETURN(spider_remote_default_database); -} +SPIDER_SYSVAR_VALUE_FUNC(char *, remote_default_database) /* 0-:connect retry interval (micro second) @@ -2265,12 +1859,11 @@ char *spider_param_bka_engine( char *bka_engine ) { DBUG_ENTER("spider_param_bka_engine"); - DBUG_RETURN(THDVAR(thd, bka_engine) ? - THDVAR(thd, bka_engine) : bka_engine); + DBUG_RETURN(bka_engine ? bka_engine : THDVAR(thd, bka_engine)); } /* - -1 :use table parameter + -1 :fallback to default 0 :use union all 1 :use temporary table */ @@ -2286,18 +1879,11 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_bka_mode( - THD *thd, - int bka_mode -) { - DBUG_ENTER("spider_param_bka_mode"); - DBUG_RETURN(THDVAR(thd, bka_mode) == -1 ? - bka_mode : THDVAR(thd, bka_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, bka_mode) static int spider_udf_ct_bulk_insert_interval; /* - -1 : The UDF parameter is adopted. + -1 : Fallback to default. 0 or more : Milliseconds. */ static MYSQL_SYSVAR_INT( @@ -2307,23 +1893,17 @@ static MYSQL_SYSVAR_INT( "The interval time between bulk insert and next bulk insert at coping", NULL, NULL, - -1, + 10, -1, 2147483647, 0 ); -int spider_param_udf_ct_bulk_insert_interval( - int udf_ct_bulk_insert_interval -) { - DBUG_ENTER("spider_param_udf_ct_bulk_insert_interval"); - DBUG_RETURN(spider_udf_ct_bulk_insert_interval < 0 ? - udf_ct_bulk_insert_interval : spider_udf_ct_bulk_insert_interval); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(int, udf_ct_bulk_insert_interval) static longlong spider_udf_ct_bulk_insert_rows; /* - -1,0 : The UDF parameter is adopted. + -1,0 : Fallback to default. 1 or more : Number of rows. */ static MYSQL_SYSVAR_LONGLONG( @@ -2333,22 +1913,16 @@ static MYSQL_SYSVAR_LONGLONG( "The number of rows inserted with bulk insert of one time at coping", NULL, NULL, - -1, + 100, -1, 9223372036854775807LL, 0 ); -longlong spider_param_udf_ct_bulk_insert_rows( - longlong udf_ct_bulk_insert_rows -) { - DBUG_ENTER("spider_param_udf_ct_bulk_insert_rows"); - DBUG_RETURN(spider_udf_ct_bulk_insert_rows <= 0 ? - udf_ct_bulk_insert_rows : spider_udf_ct_bulk_insert_rows); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(longlong, udf_ct_bulk_insert_rows) /* - -1 :use table parameter + -1 :fallback to default 0 :not use 1 :use handler */ @@ -2364,17 +1938,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_use_handler( - THD *thd, - int use_handler -) { - DBUG_ENTER("spider_param_use_handler"); - DBUG_RETURN(THDVAR(thd, use_handler) == -1 ? - use_handler : THDVAR(thd, use_handler)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, use_handler) /* - -1 :use table parameter + -1 :fallback to default 0 :return error if error 1 :return 0 record if error */ @@ -2390,17 +1957,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_error_read_mode( - THD *thd, - int error_read_mode -) { - DBUG_ENTER("spider_param_error_read_mode"); - DBUG_RETURN(THDVAR(thd, error_read_mode) == -1 ? - error_read_mode : THDVAR(thd, error_read_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, error_read_mode) /* - -1 :use table parameter + -1 :fallback to default 0 :return error if error 1 :return 0 record if error */ @@ -2416,17 +1976,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_error_write_mode( - THD *thd, - int error_write_mode -) { - DBUG_ENTER("spider_param_error_write_mode"); - DBUG_RETURN(THDVAR(thd, error_write_mode) == -1 ? - error_write_mode : THDVAR(thd, error_write_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, error_write_mode) /* - -1 :use table parameter + -1 :fallback to default 0 :not skip 1 :skip */ @@ -2442,17 +1995,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_skip_default_condition( - THD *thd, - int skip_default_condition -) { - DBUG_ENTER("spider_param_skip_default_condition"); - DBUG_RETURN(THDVAR(thd, skip_default_condition) == -1 ? - skip_default_condition : THDVAR(thd, skip_default_condition)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, skip_default_condition) /* - -1 :use table parameter + -1 :fallback to default 0 :not skip 1 :skip parallel search if query is not SELECT statement 2 :skip parallel search if query has SQL_NO_CACHE @@ -2470,17 +2016,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_skip_parallel_search( - THD *thd, - int skip_parallel_search -) { - DBUG_ENTER("spider_param_skip_parallel_search"); - DBUG_RETURN(THDVAR(thd, skip_parallel_search) == -1 ? - skip_parallel_search : THDVAR(thd, skip_parallel_search)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, skip_parallel_search) /* - -1 :use table parameter + -1 :fallback to default 0 :not send directly 1-:send directly */ @@ -2496,17 +2035,10 @@ static MYSQL_THDVAR_LONGLONG( 0 /* blk */ ); -longlong spider_param_direct_order_limit( - THD *thd, - longlong direct_order_limit -) { - DBUG_ENTER("spider_param_direct_order_limit"); - DBUG_RETURN(THDVAR(thd, direct_order_limit) == -1 ? - direct_order_limit : THDVAR(thd, direct_order_limit)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(longlong, direct_order_limit) /* - -1 :use table parameter + -1 :fallback to default 0 :writable 1 :read only */ @@ -2522,18 +2054,11 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_read_only_mode( - THD *thd, - int read_only_mode -) { - DBUG_ENTER("spider_param_read_only_mode"); - DBUG_RETURN(THDVAR(thd, read_only_mode) == -1 ? - read_only_mode : THDVAR(thd, read_only_mode)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, read_only_mode) /* - -1 :use UDF parameter + -1 :fallback to default 0 :can not use 1 :can use */ @@ -2543,20 +2068,13 @@ static MYSQL_THDVAR_INT( "Use real table for temporary table list", /* comment */ NULL, /* check */ NULL, /* update */ - -1, /* def */ + 0, /* def */ -1, /* min */ 1, /* max */ 0 /* blk */ ); -int spider_param_udf_ds_use_real_table( - THD *thd, - int udf_ds_use_real_table -) { - DBUG_ENTER("spider_param_udf_ds_use_real_table"); - DBUG_RETURN(THDVAR(thd, udf_ds_use_real_table) == -1 ? - udf_ds_use_real_table : THDVAR(thd, udf_ds_use_real_table)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, udf_ds_use_real_table) static my_bool spider_general_log; static MYSQL_SYSVAR_BOOL( @@ -2569,11 +2087,7 @@ static MYSQL_SYSVAR_BOOL( FALSE ); -my_bool spider_param_general_log() -{ - DBUG_ENTER("spider_param_general_log"); - DBUG_RETURN(spider_general_log); -} +SPIDER_SYSVAR_VALUE_FUNC(my_bool, general_log) /* FALSE: no pushdown hints @@ -2588,12 +2102,7 @@ static MYSQL_THDVAR_BOOL( FALSE /* def */ ); -my_bool spider_param_index_hint_pushdown( - THD *thd -) { - DBUG_ENTER("spider_param_index_hint_pushdown"); - DBUG_RETURN(THDVAR(thd, index_hint_pushdown)); -} +SPIDER_THDVAR_VALUE_FUNC(my_bool, index_hint_pushdown) static uint spider_max_connections; static MYSQL_SYSVAR_UINT( @@ -2609,11 +2118,7 @@ static MYSQL_SYSVAR_UINT( 0 /* blk */ ); -uint spider_param_max_connections() -{ - DBUG_ENTER("spider_param_max_connections"); - DBUG_RETURN(spider_max_connections); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, max_connections) static uint spider_conn_wait_timeout; static MYSQL_SYSVAR_UINT( @@ -2629,11 +2134,7 @@ static MYSQL_SYSVAR_UINT( 0 /* blk */ ); -uint spider_param_conn_wait_timeout() -{ - DBUG_ENTER("spider_param_conn_wait_timeout"); - DBUG_RETURN(spider_conn_wait_timeout); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, conn_wait_timeout) static uint spider_log_result_errors; /* @@ -2656,11 +2157,7 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_log_result_errors() -{ - DBUG_ENTER("spider_param_log_result_errors"); - DBUG_RETURN(spider_log_result_errors); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, log_result_errors) static uint spider_log_result_error_with_sql; /* @@ -2682,11 +2179,7 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_log_result_error_with_sql() -{ - DBUG_ENTER("spider_param_log_result_error_with_sql"); - DBUG_RETURN(spider_log_result_error_with_sql); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, log_result_error_with_sql) /* 0: server_id + thread_id @@ -2704,15 +2197,10 @@ static MYSQL_THDVAR_UINT( 0 /* blk */ ); -uint spider_param_internal_xa_id_type( - THD *thd -) { - DBUG_ENTER("spider_param_internal_xa_id_type"); - DBUG_RETURN(THDVAR(thd, internal_xa_id_type)); -} +SPIDER_THDVAR_VALUE_FUNC(uint, internal_xa_id_type) /* - -1 :use table parameter + -1 :fallback to default 0 :OFF 1 :automatic channel 2-63 :use custom channel @@ -2729,14 +2217,7 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_casual_read( - THD *thd, - int casual_read -) { - DBUG_ENTER("spider_param_casual_read"); - DBUG_RETURN(THDVAR(thd, casual_read) == -1 ? - casual_read : THDVAR(thd, casual_read)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, casual_read) static my_bool spider_dry_access; static MYSQL_SYSVAR_BOOL( @@ -2749,14 +2230,10 @@ static MYSQL_SYSVAR_BOOL( FALSE ); -my_bool spider_param_dry_access() -{ - DBUG_ENTER("spider_param_dry_access"); - DBUG_RETURN(spider_dry_access); -} +SPIDER_SYSVAR_VALUE_FUNC(my_bool, dry_access) /* - -1 :use table parameter + -1 :fallback to default 0 :fast 1 :correct delete row number */ @@ -2772,17 +2249,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_delete_all_rows_type( - THD *thd, - int delete_all_rows_type -) { - DBUG_ENTER("spider_param_delete_all_rows_type"); - DBUG_RETURN(THDVAR(thd, delete_all_rows_type) == -1 ? - delete_all_rows_type : THDVAR(thd, delete_all_rows_type)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, delete_all_rows_type) /* - -1 :use table parameter + -1 :fallback to default 0 :compact 1 :add original table name */ @@ -2798,17 +2268,10 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_bka_table_name_type( - THD *thd, - int bka_table_name_type -) { - DBUG_ENTER("spider_param_bka_table_name_type"); - DBUG_RETURN(THDVAR(thd, bka_table_name_type) == -1 ? - bka_table_name_type : THDVAR(thd, bka_table_name_type)); -} +SPIDER_THDVAR_OVERRIDE_VALUE_FUNC(int, bka_table_name_type) /* - -1 :use table parameter + -1 :fallback to default 0 :off 1 :on */ @@ -2824,16 +2287,11 @@ static MYSQL_THDVAR_INT( 0 /* blk */ ); -int spider_param_use_cond_other_than_pk_for_update( - THD *thd -) { - DBUG_ENTER("spider_param_reset_sql_alloc"); - DBUG_RETURN(THDVAR(thd, use_cond_other_than_pk_for_update)); -} +SPIDER_THDVAR_VALUE_FUNC(int, use_cond_other_than_pk_for_update) static int spider_store_last_sts; /* - -1 : use table parameter + -1 : fallback to default 0 : do not store 1 : do store */ @@ -2850,17 +2308,11 @@ static MYSQL_SYSVAR_INT( 0 ); -int spider_param_store_last_sts( - int store_last_sts -) { - DBUG_ENTER("spider_param_store_last_sts"); - DBUG_RETURN(spider_store_last_sts == -1 ? - store_last_sts : spider_store_last_sts); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(int, store_last_sts) static int spider_store_last_crd; /* - -1 : use table parameter + -1 : fallback to default 0 : do not store 1 : do store */ @@ -2877,17 +2329,11 @@ static MYSQL_SYSVAR_INT( 0 ); -int spider_param_store_last_crd( - int store_last_crd -) { - DBUG_ENTER("spider_param_store_last_crd"); - DBUG_RETURN(spider_store_last_crd == -1 ? - store_last_crd : spider_store_last_crd); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(int, store_last_crd) static int spider_load_sts_at_startup; /* - -1 : use table parameter + -1 : fallback to default 0 : do not load 1 : do load */ @@ -2904,17 +2350,11 @@ static MYSQL_SYSVAR_INT( 0 ); -int spider_param_load_sts_at_startup( - int load_sts_at_startup -) { - DBUG_ENTER("spider_param_load_sts_at_startup"); - DBUG_RETURN(spider_load_sts_at_startup == -1 ? - load_sts_at_startup : spider_load_sts_at_startup); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(int, load_sts_at_startup) static int spider_load_crd_at_startup; /* - -1 : use table parameter + -1 : fallback to default 0 : do not load 1 : do load */ @@ -2931,13 +2371,7 @@ static MYSQL_SYSVAR_INT( 0 ); -int spider_param_load_crd_at_startup( - int load_crd_at_startup -) { - DBUG_ENTER("spider_param_load_crd_at_startup"); - DBUG_RETURN(spider_load_crd_at_startup == -1 ? - load_crd_at_startup : spider_load_crd_at_startup); -} +SPIDER_SYSVAR_OVERRIDE_VALUE_FUNC(int, load_crd_at_startup) static uint spider_table_sts_thread_count; /* @@ -2956,11 +2390,7 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_table_sts_thread_count() -{ - DBUG_ENTER("spider_param_table_sts_thread_count"); - DBUG_RETURN(spider_table_sts_thread_count); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, table_sts_thread_count) static uint spider_table_crd_thread_count; /* @@ -2979,11 +2409,7 @@ static MYSQL_SYSVAR_UINT( 0 ); -uint spider_param_table_crd_thread_count() -{ - DBUG_ENTER("spider_param_table_crd_thread_count"); - DBUG_RETURN(spider_table_crd_thread_count); -} +SPIDER_SYSVAR_VALUE_FUNC(uint, table_crd_thread_count) static int spider_slave_trx_isolation; /* @@ -3006,11 +2432,7 @@ static MYSQL_SYSVAR_INT( 0 /* blk */ ); -int spider_param_slave_trx_isolation() -{ - DBUG_ENTER("spider_param_slave_trx_isolation"); - DBUG_RETURN(spider_slave_trx_isolation); -} +SPIDER_SYSVAR_VALUE_FUNC(int, slave_trx_isolation) /* -1 :not set @@ -3075,12 +2497,7 @@ static MYSQL_THDVAR_BOOL( TRUE /* def */ ); -bool spider_param_sync_sql_mode( - THD *thd -) { - DBUG_ENTER("spider_param_sync_sql_mode"); - DBUG_RETURN(THDVAR(thd, sync_sql_mode)); -} +SPIDER_THDVAR_VALUE_FUNC(bool, sync_sql_mode) /* -1 : use table parameter diff --git a/storage/spider/spd_table.cc b/storage/spider/spd_table.cc index 2c39ad359f2..90750602af1 100644 --- a/storage/spider/spd_table.cc +++ b/storage/spider/spd_table.cc @@ -3819,138 +3819,22 @@ int spider_set_connect_info_default( if (share->monitoring_sid[roop_count] == -1) share->monitoring_sid[roop_count] = global_system_variables.server_id; - if (share->use_handlers[roop_count] == -1) - share->use_handlers[roop_count] = 0; - if (share->connect_timeouts[roop_count] == -1) - share->connect_timeouts[roop_count] = 6; - if (share->net_read_timeouts[roop_count] == -1) - share->net_read_timeouts[roop_count] = 600; - if (share->net_write_timeouts[roop_count] == -1) - share->net_write_timeouts[roop_count] = 600; if (share->access_balances[roop_count] == -1) share->access_balances[roop_count] = 100; - if (share->bka_table_name_types[roop_count] == -1) - share->bka_table_name_types[roop_count] = 0; - if (share->strict_group_bys[roop_count] == -1) - share->strict_group_bys[roop_count] = 1; } - if (share->sts_bg_mode == -1) - share->sts_bg_mode = 2; - if (share->sts_interval == -1) - share->sts_interval = 10; - if (share->sts_mode == -1) - share->sts_mode = 1; - if (share->sts_sync == -1) - share->sts_sync = 0; - if (share->store_last_sts == -1) - share->store_last_sts = 1; - if (share->load_sts_at_startup == -1) - share->load_sts_at_startup = 1; - if (share->crd_bg_mode == -1) - share->crd_bg_mode = 2; - if (share->crd_interval == -1) - share->crd_interval = 51; - if (share->crd_mode == -1) - share->crd_mode = 1; - if (share->crd_sync == -1) - share->crd_sync = 0; - if (share->store_last_crd == -1) - share->store_last_crd = 1; - if (share->load_crd_at_startup == -1) - share->load_crd_at_startup = 1; - if (share->crd_type == -1) - share->crd_type = 2; - if (share->crd_weight == -1) - share->crd_weight = 2; - if (share->internal_offset == -1) - share->internal_offset = 0; - if (share->internal_limit == -1) - share->internal_limit = 9223372036854775807LL; - if (share->split_read == -1) - share->split_read = 9223372036854775807LL; - if (share->semi_split_read == -1) - share->semi_split_read = 2; - if (share->semi_split_read_limit == -1) - share->semi_split_read_limit = 9223372036854775807LL; - if (share->init_sql_alloc_size == -1) - share->init_sql_alloc_size = 1024; - if (share->reset_sql_alloc == -1) - share->reset_sql_alloc = 1; - if (share->multi_split_read == -1) - share->multi_split_read = 100; - if (share->max_order == -1) - share->max_order = 32767; - if (share->semi_table_lock == -1) - share->semi_table_lock = 0; - if (share->semi_table_lock_conn == -1) - share->semi_table_lock_conn = 1; - if (share->selupd_lock_mode == -1) - share->selupd_lock_mode = 1; if (share->query_cache == -1) share->query_cache = 0; if (share->query_cache_sync == -1) share->query_cache_sync = 0; - if (share->bulk_size == -1) - share->bulk_size = 16000; - if (share->bulk_update_mode == -1) - share->bulk_update_mode = 0; - if (share->bulk_update_size == -1) - share->bulk_update_size = 16000; - if (share->buffer_size == -1) - share->buffer_size = 16000; - if (share->internal_optimize == -1) - share->internal_optimize = 0; - if (share->internal_optimize_local == -1) - share->internal_optimize_local = 0; if (share->scan_rate == -1) share->scan_rate = 1; if (share->read_rate == -1) share->read_rate = 0.0002; if (share->priority == -1) share->priority = 1000000; - if (share->quick_mode == -1) - share->quick_mode = 3; - if (share->quick_page_size == -1) - share->quick_page_size = 1024; - if (share->quick_page_byte == -1) - share->quick_page_byte = 10485760; - if (share->low_mem_read == -1) - share->low_mem_read = 1; if (share->table_count_mode == -1) share->table_count_mode = 0; - if (share->select_column_mode == -1) - share->select_column_mode = 1; - if (share->bgs_mode == -1) - share->bgs_mode = 0; - if (share->bgs_first_read == -1) - share->bgs_first_read = 2; - if (share->bgs_second_read == -1) - share->bgs_second_read = 100; - if (share->first_read == -1) - share->first_read = 0; - if (share->second_read == -1) - share->second_read = 0; - if (share->auto_increment_mode == -1) - share->auto_increment_mode = 0; - if (share->use_table_charset == -1) - share->use_table_charset = 1; - if (share->use_pushdown_udf == -1) - share->use_pushdown_udf = 1; - if (share->skip_default_condition == -1) - share->skip_default_condition = 0; - if (share->skip_parallel_search == -1) - share->skip_parallel_search = 0; - if (share->direct_dup_insert == -1) - share->direct_dup_insert = 0; - if (share->direct_order_limit == -1) - share->direct_order_limit = 9223372036854775807LL; - if (share->read_only_mode == -1) - share->read_only_mode = 0; - if (share->error_read_mode == -1) - share->error_read_mode = 0; - if (share->error_write_mode == -1) - share->error_write_mode = 0; if (share->active_link_count == -1) share->active_link_count = share->all_link_count; #ifdef HA_CAN_FORCE_BULK_UPDATE @@ -3961,14 +3845,6 @@ int spider_set_connect_info_default( if (share->force_bulk_delete == -1) share->force_bulk_delete = 0; #endif - if (share->casual_read == -1) - share->casual_read = 0; - if (share->delete_all_rows_type == -1) - { - share->delete_all_rows_type = 1; - } - if (share->bka_mode == -1) - share->bka_mode = 1; if (!share->bka_engine) { DBUG_PRINT("info",("spider create default bka_engine")); @@ -3984,6 +3860,7 @@ int spider_set_connect_info_default( DBUG_RETURN(0); } + int spider_set_connect_info_default_db_table( SPIDER_SHARE *share, const char *db_name, diff --git a/storage/spider/spd_trx.cc b/storage/spider/spd_trx.cc index 29dddee5b98..5af8f683bd0 100644 --- a/storage/spider/spd_trx.cc +++ b/storage/spider/spd_trx.cc @@ -399,12 +399,28 @@ int spider_free_trx_alter_table( DBUG_RETURN(0); } +/** Copy a string from one array to another */ +static inline void spider_maybe_memcpy_indexed_string( + char **dests, + char **srcs, + const uint* lengths, + const int idx, + char *&ptr) +{ + if (size_t len= sizeof(char) * lengths[idx]) + { + dests[idx]= ptr; + memcpy(ptr, srcs[idx], len); + ptr+= len + 1; + } +} + int spider_create_trx_alter_table( SPIDER_TRX *trx, SPIDER_SHARE *share, bool now_create ) { - int error_num, roop_count; + int error_num, link_idx; SPIDER_ALTER_TABLE *alter_table, *share_alter; char *tmp_name; char **tmp_server_names; @@ -633,163 +649,82 @@ int spider_create_trx_alter_table( alter_table->tmp_tgt_drivers_lengths = tmp_tgt_drivers_lengths; alter_table->tmp_static_link_ids_lengths = tmp_static_link_ids_lengths; - size_t len; - for(roop_count = 0; roop_count < (int) share->all_link_count; roop_count++) + for(link_idx = 0; link_idx < (int) share->all_link_count; link_idx++) { - if ((len= - sizeof(char) * share_alter->tmp_server_names_lengths[roop_count])) - { - tmp_server_names[roop_count]= tmp_server_names_char; - memcpy(tmp_server_names_char, share_alter->tmp_server_names[roop_count], - len); - tmp_server_names_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_server_names, share_alter->tmp_server_names, + share_alter->tmp_server_names_lengths, link_idx, tmp_server_names_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_table_names_lengths[roop_count])) - { - tmp_tgt_table_names[roop_count]= tmp_tgt_table_names_char; - memcpy(tmp_tgt_table_names_char, - share_alter->tmp_tgt_table_names[roop_count], len); - tmp_tgt_table_names_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_table_names, share_alter->tmp_tgt_table_names, + share_alter->tmp_tgt_table_names_lengths, link_idx, tmp_tgt_table_names_char); - if ((len= sizeof(char) * share_alter->tmp_tgt_dbs_lengths[roop_count])) - { - tmp_tgt_dbs[roop_count]= tmp_tgt_dbs_char; - memcpy(tmp_tgt_dbs_char, share_alter->tmp_tgt_dbs[roop_count], len); - tmp_tgt_dbs_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_dbs, share_alter->tmp_tgt_dbs, + share_alter->tmp_tgt_dbs_lengths, link_idx, tmp_tgt_dbs_char); - if ((len= sizeof(char) * share_alter->tmp_tgt_hosts_lengths[roop_count])) - { - tmp_tgt_hosts[roop_count]= tmp_tgt_hosts_char; - memcpy(tmp_tgt_hosts_char, share_alter->tmp_tgt_hosts[roop_count], len); - tmp_tgt_hosts_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_hosts, share_alter->tmp_tgt_hosts, + share_alter->tmp_tgt_hosts_lengths, link_idx, tmp_tgt_hosts_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_usernames_lengths[roop_count])) - { - tmp_tgt_usernames[roop_count]= tmp_tgt_usernames_char; - memcpy(tmp_tgt_usernames_char, - share_alter->tmp_tgt_usernames[roop_count], len); - tmp_tgt_usernames_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_usernames, share_alter->tmp_tgt_usernames, + share_alter->tmp_tgt_usernames_lengths, link_idx, tmp_tgt_usernames_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_passwords_lengths[roop_count])) - { - tmp_tgt_passwords[roop_count]= tmp_tgt_passwords_char; - memcpy(tmp_tgt_passwords_char, - share_alter->tmp_tgt_passwords[roop_count], len); - tmp_tgt_passwords_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_passwords, share_alter->tmp_tgt_passwords, + share_alter->tmp_tgt_passwords_lengths, link_idx, tmp_tgt_passwords_char); - if ((len= sizeof(char) * share_alter->tmp_tgt_sockets_lengths[roop_count])) - { - tmp_tgt_sockets[roop_count]= tmp_tgt_sockets_char; - memcpy(tmp_tgt_sockets_char, share_alter->tmp_tgt_sockets[roop_count], - len); - tmp_tgt_sockets_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_sockets, share_alter->tmp_tgt_sockets, + share_alter->tmp_tgt_sockets_lengths, link_idx, tmp_tgt_sockets_char); - if ((len= - sizeof(char) * share_alter->tmp_tgt_wrappers_lengths[roop_count])) - { - tmp_tgt_wrappers[roop_count]= tmp_tgt_wrappers_char; - memcpy(tmp_tgt_wrappers_char, share_alter->tmp_tgt_wrappers[roop_count], - len); - tmp_tgt_wrappers_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_wrappers, share_alter->tmp_tgt_wrappers, + share_alter->tmp_tgt_wrappers_lengths, link_idx, tmp_tgt_wrappers_char); - if ((len= sizeof(char) * share_alter->tmp_tgt_ssl_cas_lengths[roop_count])) - { - tmp_tgt_ssl_cas[roop_count]= tmp_tgt_ssl_cas_char; - memcpy(tmp_tgt_ssl_cas_char, share_alter->tmp_tgt_ssl_cas[roop_count], - len); - tmp_tgt_ssl_cas_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_ssl_cas, share_alter->tmp_tgt_ssl_cas, + share_alter->tmp_tgt_ssl_cas_lengths, link_idx, tmp_tgt_ssl_cas_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_ssl_capaths_lengths[roop_count])) - { - tmp_tgt_ssl_capaths[roop_count]= tmp_tgt_ssl_capaths_char; - memcpy(tmp_tgt_ssl_capaths_char, - share_alter->tmp_tgt_ssl_capaths[roop_count], len); - tmp_tgt_ssl_capaths_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_ssl_capaths, share_alter->tmp_tgt_ssl_capaths, + share_alter->tmp_tgt_ssl_capaths_lengths, link_idx, tmp_tgt_ssl_capaths_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_ssl_certs_lengths[roop_count])) - { - tmp_tgt_ssl_certs[roop_count]= tmp_tgt_ssl_certs_char; - memcpy(tmp_tgt_ssl_certs_char, - share_alter->tmp_tgt_ssl_certs[roop_count], len); - tmp_tgt_ssl_certs_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_ssl_certs, share_alter->tmp_tgt_ssl_certs, + share_alter->tmp_tgt_ssl_certs_lengths, link_idx, tmp_tgt_ssl_certs_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_ssl_ciphers_lengths[roop_count])) - { - tmp_tgt_ssl_ciphers[roop_count]= tmp_tgt_ssl_ciphers_char; - memcpy(tmp_tgt_ssl_ciphers_char, - share_alter->tmp_tgt_ssl_ciphers[roop_count], len); - tmp_tgt_ssl_ciphers_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_ssl_ciphers, share_alter->tmp_tgt_ssl_ciphers, + share_alter->tmp_tgt_ssl_ciphers_lengths, link_idx, tmp_tgt_ssl_ciphers_char); - if ((len= sizeof(char) * share_alter->tmp_tgt_ssl_keys_lengths[roop_count])) - { - tmp_tgt_ssl_keys[roop_count]= tmp_tgt_ssl_keys_char; - memcpy(tmp_tgt_ssl_keys_char, share_alter->tmp_tgt_ssl_keys[roop_count], - len); - tmp_tgt_ssl_keys_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_ssl_keys, share_alter->tmp_tgt_ssl_keys, + share_alter->tmp_tgt_ssl_keys_lengths, link_idx, tmp_tgt_ssl_keys_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_default_files_lengths[roop_count])) - { - tmp_tgt_default_files[roop_count]= tmp_tgt_default_files_char; - memcpy(tmp_tgt_default_files_char, - share_alter->tmp_tgt_default_files[roop_count], len); - tmp_tgt_default_files_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_default_files, share_alter->tmp_tgt_default_files, + share_alter->tmp_tgt_default_files_lengths, link_idx, tmp_tgt_default_files_char); - if ((len= sizeof(char) * - share_alter->tmp_tgt_default_groups_lengths[roop_count])) - { - tmp_tgt_default_groups[roop_count]= tmp_tgt_default_groups_char; - memcpy(tmp_tgt_default_groups_char, - share_alter->tmp_tgt_default_groups[roop_count], len); - tmp_tgt_default_groups_char+= len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_tgt_default_groups, share_alter->tmp_tgt_default_groups, + share_alter->tmp_tgt_default_groups_lengths, link_idx, tmp_tgt_default_groups_char); + spider_maybe_memcpy_indexed_string( + tmp_tgt_dsns, share_alter->tmp_tgt_dsns, + share_alter->tmp_tgt_dsns_lengths, link_idx, tmp_tgt_dsns_char); - tmp_tgt_dsns[roop_count] = tmp_tgt_dsns_char; - memcpy(tmp_tgt_dsns_char, share_alter->tmp_tgt_dsns[roop_count], - sizeof(char) * share_alter->tmp_tgt_dsns_lengths[roop_count]); - tmp_tgt_dsns_char += - share_alter->tmp_tgt_dsns_lengths[roop_count] + 1; + spider_maybe_memcpy_indexed_string( + tmp_tgt_filedsns, share_alter->tmp_tgt_filedsns, + share_alter->tmp_tgt_filedsns_lengths, link_idx, tmp_tgt_filedsns_char); - tmp_tgt_filedsns[roop_count] = tmp_tgt_filedsns_char; - memcpy(tmp_tgt_filedsns_char, share_alter->tmp_tgt_filedsns[roop_count], - sizeof(char) * share_alter->tmp_tgt_filedsns_lengths[roop_count]); - tmp_tgt_filedsns_char += - share_alter->tmp_tgt_filedsns_lengths[roop_count] + 1; + spider_maybe_memcpy_indexed_string( + tmp_tgt_drivers, share_alter->tmp_tgt_drivers, + share_alter->tmp_tgt_drivers_lengths, link_idx, tmp_tgt_drivers_char); - tmp_tgt_drivers[roop_count] = tmp_tgt_drivers_char; - memcpy(tmp_tgt_drivers_char, share_alter->tmp_tgt_drivers[roop_count], - sizeof(char) * share_alter->tmp_tgt_drivers_lengths[roop_count]); - tmp_tgt_drivers_char += - share_alter->tmp_tgt_drivers_lengths[roop_count] + 1; - - if ((len= sizeof(char) * - share_alter->tmp_static_link_ids_lengths[roop_count])) - { - tmp_static_link_ids[roop_count] = tmp_static_link_ids_char; - memcpy(tmp_static_link_ids_char, - share_alter->tmp_static_link_ids[roop_count], len); - tmp_static_link_ids_char += len + 1; - } + spider_maybe_memcpy_indexed_string( + tmp_static_link_ids, share_alter->tmp_static_link_ids, + share_alter->tmp_static_link_ids_lengths, link_idx, tmp_static_link_ids_char); } memcpy(tmp_tgt_ports, share_alter->tmp_tgt_ports, diff --git a/strings/ctype-bin.c b/strings/ctype-bin.c index fcccc896bbf..e6b2fcf6b6d 100644 --- a/strings/ctype-bin.c +++ b/strings/ctype-bin.c @@ -86,7 +86,7 @@ static int my_strnncoll_binary(CHARSET_INFO * cs __attribute__((unused)), my_bool t_is_prefix) { size_t len=MY_MIN(slen,tlen); - int cmp= memcmp(s,t,len); + int cmp= len ? memcmp(s, t, len) : 0; return cmp ? cmp : (int)((t_is_prefix ? len : slen) - tlen); } @@ -147,7 +147,7 @@ static int my_strnncoll_8bit_bin(CHARSET_INFO * cs __attribute__((unused)), my_bool t_is_prefix) { size_t len=MY_MIN(slen,tlen); - int cmp= memcmp(s,t,len); + int cmp= len ? memcmp(s, t, len) : 0; return cmp ? cmp : (int)((t_is_prefix ? len : slen) - tlen); } diff --git a/strings/json_lib.c b/strings/json_lib.c index 920fb1d4a89..52c173f3604 100644 --- a/strings/json_lib.c +++ b/strings/json_lib.c @@ -416,7 +416,7 @@ static int read_strn(json_engine_t *j) return 1; j->state= j->stack[j->stack_p]; - j->value_len= (int)(j->s.c_str - j->value) - 1; + j->value_len= (int)(j->s.c_str - j->value) - j->s.c_next_len; return 0; } diff --git a/tests/async_queries.c b/tests/async_queries.c index 3f4a16da1e6..8509b414f6e 100644 --- a/tests/async_queries.c +++ b/tests/async_queries.c @@ -371,7 +371,7 @@ main(int argc, char *argv[]) if (err) exit(err); if (tty_password) - opt_password= get_tty_password(NullS); + opt_password= my_get_tty_password(NullS); if (opt_query_file) { diff --git a/tests/code_quality/cppcheck_ignorelist.txt b/tests/code_quality/cppcheck_ignorelist.txt new file mode 100644 index 00000000000..268bf8108d4 --- /dev/null +++ b/tests/code_quality/cppcheck_ignorelist.txt @@ -0,0 +1,251 @@ +client/mysql.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +client/mysql_upgrade.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +client/mysqladmin.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +client/mysqlbinlog.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +client/mysqlcheck.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +client/mysqlimport.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +client/mysqlshow.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +client/mysqltest.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +dbug/tests.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +lexyy.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +mysql-test/lib/My/SafeProcess/safe_process_win.cc: error: Uninitialized variable: message_text +mysys/mf_keycache.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +mysys/my_delete.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +mysys/my_fopen.c: error: Return value of allocation function 'freopen' is not stored. +mysys/my_getsystime.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +mysys/my_pread.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +mysys/my_rename.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +mysys/my_winfile.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +mysys/my_write.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +mysys/thr_lock.c: error: There is an unknown macro here somewhere. Configuration is required. If MYSQL_TABLE_WAIT_VARIABLES is a macro then please configure it. +mysys/tree.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +pcre/pcrecpp.cc: warning: Uninitialized variable: kmat +pcre/pcrecpp.h: error: syntax error +pcre/pcregrep.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/audit_null/audit_null.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_ed25519/server_ed25519.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_examples/auth_0x0100.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_examples/dialog_examples.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_examples/qa_auth_interface.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_examples/qa_auth_server.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_examples/test_plugin.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_gssapi/server_plugin.cc: error: syntax error +plugin/auth_gssapi/sspi.h: error: #include nested too deeply +plugin/auth_pam/auth_pam.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_pam/auth_pam_v1.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_pipe/auth_pipe.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/auth_socket/auth_socket.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/aws_key_management/aws_key_management_plugin.cc: error: syntax error +plugin/cracklib_password_check/cracklib_password_check.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/daemon_example/daemon_example.cc: error: syntax error +plugin/debug_key_management/debug_key_management_plugin.cc: error: syntax error +plugin/disks/information_schema_disks.cc: error: syntax error +plugin/example_key_management/example_key_management_plugin.cc: error: syntax error +plugin/feedback/feedback.cc: error: syntax error +plugin/file_key_management/file_key_management_plugin.cc: error: syntax error +plugin/fulltext/plugin_example.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/handler_socket/handlersocket/handlersocket.cpp: error: syntax error +plugin/locale_info/locale_info.cc: error: syntax error +plugin/metadata_lock_info/metadata_lock_info.cc: error: syntax error +plugin/metadata_lock_info/metadata_lock_info.cc: error: syntax error +plugin/qc_info/qc_info.cc: error: syntax error +plugin/query_response_time/plugin.cc: error: syntax error +plugin/query_response_time/query_response_time.cc: error: Array 'm_count[41]' accessed at index 43, which is out of bounds. +plugin/query_response_time/query_response_time.cc: error: Array 'm_total[41]' accessed at index 43, which is out of bounds. +plugin/server_audit/server_audit.c: error: Uninitialized variable: &tm_time +plugin/server_audit/server_audit.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/server_audit/server_audit.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/server_audit/server_audit.c: error: Uninitialized variable: &tm_time +plugin/simple_password_check/simple_password_check.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/sql_errlog/sql_errlog.c: error: Found a exit path from function with non-void return type that has missing return statement +plugin/sql_errlog/sql_errlog.c: error: Uninitialized variable: &t +plugin/user_variables/user_variables.cc: error: syntax error +plugin/userstat/userstat.cc: error: syntax error +plugin/versioning/versioning.cc: error: syntax error +plugin/wsrep_info/plugin.cc: error: syntax error +sql-common/client.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +sql-common/client_plugin.c: error: va_list 'unused' used before va_start() was called. +sql-common/client_plugin.c: error: va_list 'unused' used before va_start() was called. +sql-common/client_plugin.c: error: va_list 'unused' used before va_start() was called. +sql-common/client_plugin.c: error: va_list 'unused' used before va_start() was called. +sql/debug_sync.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE is a macro then please configure it. +sql/gcalc_slicescan.cc: warning: Possible null pointer dereference: first_bottom_point +sql/gen_lex_hash.cc: error: Common realloc mistake: 'hash_map' nulled but not freed upon failure +sql/handler.h: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +sql/log.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +sql/log_event.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +sql/log_event_old.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +sql/net_serv.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +sql/protocol.h: error: syntax error +sql/rpl_utility.h: error: There is an unknown macro here somewhere. Configuration is required. If CPP_UNNAMED_NS_START is a macro then please configure it. +sql/semisync_slave.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +sql/sql_select.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +sql/sql_string.cc: warning: Iterators to containers from different expressions 'to' and 'from' are used together. +sql/table.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +sql/winservice.c: error: Resource leak: mysql_upgrade_info +sql/wsrep_thd.h: error: failed to expand 'wsrep_create_appliers', Wrong number of parameters for macro 'wsrep_create_appliers'. +storage/archive/azio.c: error: Syntax Error: AST broken, 'if' doesn't have two operands. +storage/archive/ha_archive.cc: error: syntax error +storage/blackhole/ha_blackhole.cc: error: syntax error +storage/cassandra/gen-cpp/Cassandra_server.skeleton.cpp: error: Found a exit path from function with non-void return type that has missing return statement +storage/cassandra/ha_cassandra.cc: error: syntax error +storage/connect/connect.cc: error: Uninitialized variable: lg +storage/connect/domdoc.cpp: error: syntax error +storage/connect/ha_connect.cc: error: syntax error +storage/connect/myconn.cpp: error: Unmatched '{'. Configuration: 'ALPHA;MYSQL_PREPARED_STATEMENTS'. +storage/connect/myconn.cpp: error: Unmatched '{'. Configuration: 'MYSQL_PREPARED_STATEMENTS'. +storage/connect/odbconn.cpp: warning: Uninitialized variable: b +storage/connect/odbconn.cpp: warning: Uninitialized variable: b +storage/connect/odbconn.cpp: warning: Uninitialized variable: b +storage/connect/plugutil.cpp: error: Width 255 given in format string (no. 2) is larger than destination buffer 'stmsg[200]', use %199[^\"] to prevent overflowing it. +storage/connect/plugutil.cpp: error: Width 255 given in format string (no. 1) is larger than destination buffer 'stmsg[200]', use %199[^\"] to prevent overflowing it. +storage/connect/tabjson.cpp: warning: Possible null pointer dereference: Val +storage/connect/tabmul.cpp: error: Uninitialized variable: buf +storage/connect/tabmul.cpp: error: Uninitialized variable: buf +storage/connect/tabmul.cpp: error: Uninitialized variable: buf +storage/connect/taboccur.cpp: warning: Uninitialized variable: *pcrp +storage/connect/unzip.c: warning: Uninitialized variable: *pzlib_filefunc64_32_def.zopen32_file +storage/connect/value.cpp: error: Signed integer overflow for expression 'n*126230400'. +storage/connect/zip.c: warning: Uninitialized variable: *pzlib_filefunc64_32_def.zopen32_file +storage/csv/ha_tina.cc: error: syntax error +storage/example/ha_example.cc: error: syntax error +storage/federated/ha_federated.cc: error: syntax error +storage/heap/ha_heap.cc: error: syntax error +storage/innobase/btr/btr0btr.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/btr/btr0cur.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/btr/btr0defragment.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. +storage/innobase/btr/btr0sea.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/buf/buf0buf.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/buf/buf0dump.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. +storage/innobase/buf/buf0flu.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. +storage/innobase/buf/buf0lru.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/dict/dict0crea.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/dict/dict0dict.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/dict/dict0load.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/dict/dict0stats.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/dict/dict0stats_bg.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. +storage/innobase/fil/fil0crypt.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/fil/fil0fil.cc: error: syntax error +storage/innobase/fsp/fsp0file.cc: error: Resource leak: file +storage/innobase/fsp/fsp0fsp.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/fts/fts0fts.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/fts/fts0opt.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/fts/fts0que.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/gis/gis0rtree.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/gis/gis0sea.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/handler/ha_innodb.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/handler/handler0alter.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/handler/i_s.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/ibuf/ibuf0ibuf.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/ibuf/ibuf0ibuf.cc: error: failed to expand 'ibuf_bitmap_page_get_bits', Wrong number of parameters for macro 'ibuf_bitmap_page_get_bits'. +storage/innobase/lock/lock0lock.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/lock/lock0wait.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/lock/lock0wait.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/log/log0log.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/log/log0recv.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/os/os0file.cc: error: syntax error +storage/innobase/page/page0page.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/page/page0zip.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/pars/pars0pars.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/row/row0ftsort.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/row/row0import.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/row/row0ins.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/row/row0log.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/row/row0merge.cc: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/innobase/row/row0mysql.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/row/row0quiesce.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/row/row0sel.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/row/row0umod.cc: error: There is an unknown macro here somewhere. Configuration is required. If ut_d is a macro then please configure it. +storage/innobase/row/row0upd.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/row/row0vers.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/srv/srv0conc.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ALIGNED is a macro then please configure it. +storage/innobase/srv/srv0srv.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/srv/srv0start.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ATTRIBUTE is a macro then please configure it. +storage/innobase/trx/trx0i_s.cc: error: Array 'table_cache->chunks[39]' accessed at index 39, which is out of bounds. +storage/innobase/trx/trx0i_s.cc: error: Array 'table_cache->chunks[39]' accessed at index 39, which is out of bounds. +storage/innobase/trx/trx0purge.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/trx/trx0rec.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/trx/trx0roll.cc: error: There is an unknown macro here somewhere. Configuration is required. If DECLARE_THREAD is a macro then please configure it. +storage/innobase/trx/trx0trx.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/innobase/trx/trx0undo.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ha_maria.cc: error: syntax error +storage/maria/ma_bitmap.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_blockrec.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_check.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_checkpoint.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_delete.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/maria/ma_delete.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_ft_parser.c: error: Address of local auto-variable assigned to a function parameter. +storage/maria/ma_key.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_loghandler.c: warning: Uninitialized variable: data->current_offset +storage/maria/ma_open.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/maria/ma_pagecache.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_pagecache.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_range.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_recovery_util.c: error: va_start() or va_copy() called subsequently on 'args' without va_end() in between. +storage/maria/ma_rkey.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_rt_index.c: error: failed to expand 'rt_PAGE_END', Wrong number of parameters for macro 'rt_PAGE_END'. +storage/maria/ma_search.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_sp_key.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_update.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/maria/ma_update.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/ma_write.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/maria/ma_write.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/maria/maria_pack.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/ft_parser.c: error: Address of local auto-variable assigned to a function parameter. +storage/myisam/ha_myisam.cc: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_check.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_close.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/myisam/mi_delete.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_key.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_locking.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_open.c: error: There is an unknown macro here somewhere. Configuration is required. If DBUG_EXECUTE_IF is a macro then please configure it. +storage/myisam/mi_range.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_rkey.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_search.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_update.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/mi_write.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisam/myisampack.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +storage/myisammrg/ha_myisammrg.cc: error: syntax error +storage/oqgraph/ha_oqgraph.cc: error: syntax error +storage/perfschema/ha_perfschema.cc: error: syntax error +storage/perfschema/pfs_instr.h: error: Uninitialized variable: m_has_io_stats +storage/perfschema/pfs_instr.h: error: Uninitialized variable: m_has_lock_stats +storage/perfschema/pfs_instr_class.cc: error: There is an unknown macro here somewhere. Configuration is required. If MY_ALIGNED is a macro then please configure it. +storage/perfschema/table_accounts.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_esgs_by_account_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_esgs_by_host_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_esgs_by_user_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_esms_by_account_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_esms_by_host_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_esms_by_user_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_events_waits.cc: error: Uninitialized struct member: wait.m_wait_class +storage/perfschema/table_events_waits.cc: error: Uninitialized variable: wait +storage/perfschema/table_events_waits.cc: error: Uninitialized struct member: wait.m_wait_class +storage/perfschema/table_ews_by_account_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_ews_by_host_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_ews_by_user_by_event_name.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_hosts.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_setup_actors.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_threads.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/perfschema/table_users.cc: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +storage/sequence/sequence.cc: error: syntax error +storage/test_sql_discovery/test_sql_discovery.cc: error: syntax error +strings/decimal.c: warning: Possible null pointer dereference: to +strings/dump_map.c: error: Array 'fromstat[256]' accessed at index 256, which is out of bounds. +tests/mysql_client_fw.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +tests/thread_test.c: error: There is an unknown macro here somewhere. Configuration is required. If STRINGIFY_ARG is a macro then please configure it. +unittest/mysys/dynstring-t.c: error: syntax error +unittest/mysys/queues-t.c: error: Uninitialized variable: i +unittest/mysys/waiting_threads-t.c: error: Uninitialized variable: m +unittest/mytap/tap.c: error: va_list 'ap' used before va_start() was called. +unittest/mytap/tap.c: error: va_list 'ap' used before va_start() was called. +unittest/mytap/tap.c: error: va_list 'ap' used before va_start() was called. +unittest/mytap/tap.c: error: va_list 'ap' used before va_start() was called. +vio/viosocket.c: error: There is an unknown macro here somewhere. Configuration is required. If MYSQL_SOCKET_WAIT_VARIABLES is a macro then please configure it. +vio/viosocket.c: error: There is an unknown macro here somewhere. Configuration is required. If MYSQL_SOCKET_WAIT_VARIABLES is a macro then please configure it. +vio/viosslfactories.c: error: There is an unknown macro here somewhere. Configuration is required. If ; is a macro then please configure it. +vio/viotest-sslconnect.cc: error: Memory pointed to by 'vio' is freed twice. +vio/viotest-sslconnect.cc: error: Memory pointed to by 'ssl_connector' is freed twice. +wsrep-lib/src/server_state.cpp: error: syntax error: keyword 'try' is not allowed in global scope +wsrep-lib/src/thread_service_v1.cpp: error: Rethrowing current exception with 'throw;', it seems there is no current exception to rethrow. If there is no current exception this calls std::terminate(). More: https://isocpp.org/wiki/faq/exceptions#throw-without-an-object diff --git a/tests/code_quality/flawfinder_ignorelist.json b/tests/code_quality/flawfinder_ignorelist.json new file mode 100644 index 00000000000..7b598689693 --- /dev/null +++ b/tests/code_quality/flawfinder_ignorelist.json @@ -0,0 +1,622 @@ +{ + "$schema": "https://schemastore.azurewebsites.net/schemas/json/sarif-2.1.0-rtm.5.json", + "version": "2.1.0", + "runs": [ + { + "tool": { + "driver": { + "name": "Flawfinder", + "version": "2.0.19", + "informationUri": "https://dwheeler.com/flawfinder/", + "supportedTaxonomies": [ + { + "name": "CWE", + "guid": "FFC64C90-42B6-44CE-8BEB-F6B7DAE649E5" + } + ] + } + }, + "columnKind": "utf16CodeUnits", + "results": [ + { + "ruleId": "FF1010", + "level": "error", + "message": { + "text": "buffer/strncat:Easily used incorrectly (e.g., incorrectly computing the correct maximum size to add) [MS-banned] (CWE-120)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/portability/file.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 5, + "endColumn": 39, + "snippet": { + "text": " strncat(buf, path, TOKU_PATH_MAX);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "02af921b7054342955d8e30b196aa5ffdc3b1ac019e26c92823a7ab171d2b1fa" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/ft/logger/logformat.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 5, + "endColumn": 40, + "snippet": { + "text": " chmod(headerpath, S_IRUSR|S_IWUSR);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "085f579f942967e5c81fff75af832721b7b9bc59e54a7a9ebc086065cf56be13" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1035", + "level": "error", + "message": { + "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/portability/file.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 25, + "endColumn": 63, + "snippet": { + "text": " ssize_t s = readlink(fdname, lname, sizeof lname);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "0dba1d2cdc995ccf30ad8fe5ce3ccf8795bd4f5a207f65c627affa2ef388496c" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1035", + "level": "error", + "message": { + "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./extra/mariabackup/xtrabackup.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 17, + "endColumn": 57, + "snippet": { + "text": " ssize_t ret = readlink(\"/proc/self/exe\", buf, size-1);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "11523490c7f8cba115bce125bbce94de5cd5e7f66d4dd07a391aac70fbbdd353" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./client/mysqltest.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 13, + "endColumn": 38, + "snippet": { + "text": " err_code= chmod(ds_file.str, mode);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "12a7fa6bbd4c81be975838bae2b7b26fe841acaf9804e6d0299188683e230908" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/ft/logger/logformat.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 5, + "endColumn": 38, + "snippet": { + "text": " chmod(codepath, S_IRUSR|S_IWUSR);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "2827dedcdf10af2bf4105f3d48e30575238fa2552603cdcb09d536b288808f0e" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1014", + "level": "error", + "message": { + "text": "buffer/gets:Does not check for buffer overflows (CWE-120, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./extra/readline/tilde.c", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 12, + "endColumn": 24, + "snippet": { + "text": " if (!gets (line))" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "34a940ccc6e0248a2cf725e8a0c3f808d1f36d47fc814bd9daadb17f5563d357" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./sql/sql_class.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 10, + "endColumn": 28, + "snippet": { + "text": " (void) chmod(path, 0644);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "3f97fd0452062ab69db87a04222a17c37c216c4e28e2ae3622730da8dd070d2e" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./mysys/my_chmod.c", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 7, + "endColumn": 25, + "snippet": { + "text": " if (chmod(name, mode))" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "46805eec1d288b072d4edb3214822220d394307195be79a33ec3bce455d14750" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1010", + "level": "error", + "message": { + "text": "buffer/strncat:Easily used incorrectly (e.g., incorrectly computing the correct maximum size to add) [MS-banned] (CWE-120)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/ft/tests/recovery-datadir-is-file.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 9, + "endColumn": 47, + "snippet": { + "text": " strncat(buf, testfile, TOKU_PATH_MAX);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "4ca2dff1e35445f7997a9979cdd006d89befcc89922cf5d4a60bc9c07126a78d" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1035", + "level": "error", + "message": { + "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./mysys/my_symlink.c", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 15, + "endColumn": 56, + "snippet": { + "text": " if ((length=readlink(filename, to, FN_REFLEN-1)) < 0)" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "7da5207ac0f5baba73c026472a2d3805eed92931852575db64f513702977dd70" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1031", + "level": "error", + "message": { + "text": "race/chown:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./mysys/my_redel.c", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 7, + "endColumn": 49, + "snippet": { + "text": " if (chown(to, statbuf.st_uid, statbuf.st_gid))" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "97d2cfe4cb9428e812b796eb39c27f28dc8b198ab9655c2aff8c442de39bdcfe" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/ft/logger/logformat.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 9, + "endColumn": 50, + "snippet": { + "text": " chmod(codepath, S_IRUSR|S_IRGRP|S_IROTH);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "a62b28fca5c6218ee4731e78bb3eacb93604fae20c91c69cccad3834973e70d5" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1035", + "level": "error", + "message": { + "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/rocksdb/rocksdb/port/stack_trace.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 15, + "endColumn": 54, + "snippet": { + "text": " auto read = readlink(link, name, sizeof(name) - 1);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "acb399f2a4a15ef8da36c47631bc4ee4bcc1bb0577dfbda141d2eb5d7723af40" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1035", + "level": "error", + "message": { + "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./sql/signal_handler.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 13, + "endColumn": 66, + "snippet": { + "text": " if ((len= readlink(\"/proc/self/cwd\", buff, sizeof(buff))) >= 0)" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "b55a5f3db29b1ce25e12f94e4ea344ed7fb0e63a230cf6b6deb42c28de924457" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./mysys/my_copy.c", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 9, + "endColumn": 46, + "snippet": { + "text": " if (chmod(to, stat_buff.st_mode & 07777))" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "bddb795a7efbd73a4387bbd33fd4f9e505b4f759d784e5d51f60cc43011ee610" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1031", + "level": "error", + "message": { + "text": "race/chown:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./mysys/my_copy.c", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 9, + "endColumn": 55, + "snippet": { + "text": " if (chown(to, stat_buff.st_uid, stat_buff.st_gid))" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "c63a81105d753de4762cbcab48d9700f7069da3cd9d57bf4329a6d20fad288aa" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/ft/logger/logformat.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 9, + "endColumn": 52, + "snippet": { + "text": " chmod(headerpath, S_IRUSR|S_IRGRP|S_IROTH);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "cc51b21d9b803a08b6c619b63abf77f4ca9ce247db0ef1b81f4bd83dfb95f3d8" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./sql/mysqld.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 12, + "endColumn": 71, + "snippet": { + "text": " (void) chmod(mysqld_unix_port,S_IFSOCK);\t/* Fix solaris 2.6 bug */" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "d0c4f1302290e2367e246ef7c8d3ea69589cbc4bc148e0efdd4c283fa03cbe01" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1033", + "level": "error", + "message": { + "text": "race/chmod:This accepts filename arguments; if an attacker can move those files, a race condition results. (CWE-362)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./mysys/my_redel.c", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 7, + "endColumn": 42, + "snippet": { + "text": " if (chmod(to, statbuf.st_mode & 07777))" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "e11b8df9cbb9e459e4d67a0af5e627b6b1285c78fe23f5a1c823285da96495a8" + }, + "rank": 1.0 + }, + { + "ruleId": "FF1035", + "level": "error", + "message": { + "text": "race/readlink:This accepts filename arguments; if an attacker can move those files or change the link content, a race condition results. Also, it does not terminate with ASCII NUL. (CWE-362, CWE-20)." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "./storage/tokudb/PerconaFT/portability/file.cc", + "uriBaseId": "SRCROOT" + }, + "region": { + "startColumn": 29, + "endColumn": 67, + "snippet": { + "text": " ssize_t n = readlink(fname, symname, MY_MAX_PATH);" + } + } + } + } + ], + "fingerprints": { + "contextHash/v1": "e307b1923cc852324e3050b3e4423be7ac4d1d64af274b70b897a85b1cde815f" + }, + "rank": 1.0 + } + ], + "externalPropertyFileReferences": { + "taxonomies": [ + { + "location": { + "uri": "https://raw.githubusercontent.com/sarif-standard/taxonomies/main/CWE_v4.4.sarif" + }, + "guid": "FFC64C90-42B6-44CE-8BEB-F6B7DAE649E5" + } + ] + } + } + ] +} diff --git a/tests/mysql_client_fw.c b/tests/mysql_client_fw.c index bfa7f296300..5c0c7ce2354 100644 --- a/tests/mysql_client_fw.c +++ b/tests/mysql_client_fw.c @@ -1366,7 +1366,7 @@ static void get_options(int *argc, char ***argv) exit(ho_error); if (tty_password) - opt_password= get_tty_password(NullS); + opt_password= my_get_tty_password(NullS); return; } diff --git a/tests/mysql_client_test.c b/tests/mysql_client_test.c index 528eece56b8..448868950c7 100644 --- a/tests/mysql_client_test.c +++ b/tests/mysql_client_test.c @@ -21583,6 +21583,49 @@ static void test_mdev20261() myquery(rc); } +static void test_mdev_30159() +{ + MYSQL_RES *result; + int rc; + + myheader("test_mdev_30159"); + + rc= mysql_query(mysql, "create table t1 (" + " name varchar(100)," + " typ varchar(100)" + ")"); + myquery(rc); + rc= mysql_query(mysql, "insert into t1 values (1,1),(2,2),(3,3),(4,4),(5,5)," + "(6,6),(7,7),(8,8),(9,9),(10,10)"); + myquery(rc); + rc= mysql_query(mysql, "insert into t1 values ('', 'value'),('', 'value')"); + myquery(rc); + rc= mysql_query(mysql, "create table t2 (" + " servername varchar(100)" + ")"); + myquery(rc); + rc= mysql_query(mysql, "insert into t2 values (1),(2),(3),(4),(5)," + "(6),(7),(8),(9),(10)"); + myquery(rc); + rc= mysql_query(mysql, "create view v1 as" + " select * from t2" + " where" + " `t2`.`servername` regexp ( select" + " group_concat(`t1`.`name` separator '|')" + " from `t1`" + " where `t1`.`typ`" + " like 'value')"); + myquery(rc); + + result= mysql_list_fields(mysql, "v1", NULL); + mytest(result); + mysql_free_result(result); + + rc= mysql_query(mysql, "drop view v1"); + myquery(rc); + rc= mysql_query(mysql, "drop table t1, t2"); + myquery(rc); +} static void test_execute_direct() { @@ -22106,6 +22149,7 @@ static struct my_tests_st my_tests[]= { { "test_mdev_16128", test_mdev_16128 }, { "test_mdev18408", test_mdev18408 }, { "test_mdev20261", test_mdev20261 }, + { "test_mdev_30159", test_mdev_30159 }, { "test_execute_direct", test_execute_direct }, { "test_cache_metadata", test_cache_metadata}, { "test_mdev_10075", test_mdev_10075}, diff --git a/tests/thread_test.c b/tests/thread_test.c index a40b4d20870..8242811c744 100644 --- a/tests/thread_test.c +++ b/tests/thread_test.c @@ -174,7 +174,7 @@ static void get_options(int argc, char **argv) free_defaults(argv); if (tty_password) - password=get_tty_password(NullS); + password=my_get_tty_password(NullS); return; } diff --git a/wsrep-lib b/wsrep-lib index e238c0d240c..7dafce8403d 160000 --- a/wsrep-lib +++ b/wsrep-lib @@ -1 +1 @@ -Subproject commit e238c0d240c2557229b0523a4a032f3cf8b41639 +Subproject commit 7dafce8403d4088ddc8748f2e08eae13b1f225b6