diff --git a/extra/mariabackup/backup_copy.cc b/extra/mariabackup/backup_copy.cc index 7431d6c08eb..fb84153bdee 100644 --- a/extra/mariabackup/backup_copy.cc +++ b/extra/mariabackup/backup_copy.cc @@ -1938,7 +1938,7 @@ cleanup: ctxt->ret = ret; - os_thread_exit(NULL); + os_thread_exit(); OS_THREAD_DUMMY_RETURN; } diff --git a/extra/mariabackup/backup_mysql.cc b/extra/mariabackup/backup_mysql.cc index 8fe2e186919..edd369e6ea9 100644 --- a/extra/mariabackup/backup_mysql.cc +++ b/extra/mariabackup/backup_mysql.cc @@ -840,7 +840,7 @@ stop_thread: os_event_set(kill_query_thread_stopped); - os_thread_exit(NULL); + os_thread_exit(); OS_THREAD_DUMMY_RETURN; } diff --git a/mysql-test/include/search_pattern_in_file.inc b/mysql-test/include/search_pattern_in_file.inc index 3c5529989bb..21192b55efb 100644 --- a/mysql-test/include/search_pattern_in_file.inc +++ b/mysql-test/include/search_pattern_in_file.inc @@ -76,5 +76,6 @@ perl; my $res=@matches ? "FOUND " . scalar(@matches) : "NOT FOUND"; $ENV{SEARCH_FILE} =~ s{^.*?([^/\\]+)$}{$1}; print "$res /$search_pattern/ in $ENV{SEARCH_FILE}\n"; - exit $ENV{SEARCH_ABORT} && $res =~ /^$ENV{SEARCH_ABORT}/; + die "$ENV{SEARCH_ABORT}\n" + if $ENV{SEARCH_ABORT} && $res =~ /^$ENV{SEARCH_ABORT}/; EOF diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl index 70a2b049fc0..a931381d9cc 100755 --- a/mysql-test/mysql-test-run.pl +++ b/mysql-test/mysql-test-run.pl @@ -5052,6 +5052,11 @@ sub mysqld_start ($$) { } } + # "Dynamic" version of MYSQLD_CMD is reevaluated with each mysqld_start. + # Use it to restart the server at testing a failing server start (e.g + # due to incompatible options). + $ENV{'MYSQLD_LAST_CMD'}= "$exe @$args"; + if ( $opt_gdb || $opt_manual_gdb ) { gdb_arguments(\$args, \$exe, $mysqld->name()); @@ -5148,11 +5153,6 @@ sub mysqld_start ($$) { # Remember options used when starting $mysqld->{'started_opts'}= $extra_opts; - # "Dynamic" version of MYSQLD_CMD is reevaluated with each mysqld_start. - # Use it to restart the server at testing a failing server start (e.g - # due to incompatible options). - $ENV{'MYSQLD_LAST_CMD'}= "$exe @$args"; - return; } diff --git a/mysql-test/r/sp.result b/mysql-test/r/sp.result index f4e7a729367..a1af26cdda0 100644 --- a/mysql-test/r/sp.result +++ b/mysql-test/r/sp.result @@ -8088,6 +8088,34 @@ CALL sp1(); CALL sp1(); drop user 'foo'@'%'; drop procedure sp1; +# +# MDEV-10972: Insert from select / view / union -- +# repeatable crash in 10.1, 10.2 Linux/Mac/Windows +# +create table t (id int auto_increment primary key); +insert into t values (9494),(9495),(9496),(9497),(9498),(9499),(9500),(9501),(9502),(9503); +create VIEW v AS +select id from t +union +select id from t +; +drop procedure if exists p; +Warnings: +Note 1305 PROCEDURE test.p does not exist +create procedure p() +insert into tmp_t select t.id from ( +select id from v +union +select id from v +) sq +inner join t on (sq.id = t.id); +CALL p(); +ERROR 42S02: Table 'test.tmp_t' doesn't exist +create table tmp_t (id int null); +CALL p(); +drop procedure p; +drop view v; +drop table t, tmp_t; #End of 10.1 tests # # MDEV-11081: CURSOR for query with GROUP BY diff --git a/mysql-test/r/view.result b/mysql-test/r/view.result index d0d57e1b1e9..8767b737ca7 100644 --- a/mysql-test/r/view.result +++ b/mysql-test/r/view.result @@ -6603,6 +6603,41 @@ use test; drop database test_db; drop user foo@localhost; # +# MDEV-13523: Group By in a View, called within a Stored Routine +# causes Error Code 1356 when a non-root user runs the routine for +# a second time +# +CREATE DATABASE bugTest; +USE bugTest; +CREATE TABLE `procViewTable` (`id` int(10), `someText` varchar(50) NOT NULL); +insert into `procViewTable` values (1,'Test'), (2,'Test 2'); +CREATE USER 'procView'@'%'; +GRANT ALL PRIVILEGES ON `bugTest`.* TO 'procView'@'%'; +CREATE DEFINER=`procView`@`%` VIEW `procViewSimple` AS ( +select * from ( +select `id` from `bugTest`.`procViewTable` + ) `innerQuery` + group by `innerQuery`.`id` +); +connect con1,localhost,procView,,; +use bugTest; +prepare stmt from "SELECT * FROM procViewSimple"; +execute stmt; +id +1 +2 +execute stmt; +id +1 +2 +disconnect con1; +connection default; +drop user procView; +drop view procViewSimple; +drop table procViewTable; +use test; +drop database bugTest; +# # End of 10.2 tests # # diff --git a/mysql-test/suite/innodb/r/innodb-enlarge-blob.result b/mysql-test/suite/innodb/r/innodb-enlarge-blob.result index e74e954e360..8c8e9cf5007 100644 --- a/mysql-test/suite/innodb/r/innodb-enlarge-blob.result +++ b/mysql-test/suite/innodb/r/innodb-enlarge-blob.result @@ -1,37 +1,17 @@ -CREATE TABLE t1 (a LONGTEXT) ENGINE=INNODB DEFAULT CHARSET=UTF8 ROW_FORMAT=DYNAMIC; +CREATE TABLE t1 (a LONGTEXT) ENGINE=INNODB ROW_FORMAT=REDUNDANT; SHOW WARNINGS; Level Code Message -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B'); -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -UPDATE t1 SET a=CONCAT(a, RAND(), a); +INSERT INTO t1 SET a=CONCAT('A', SPACE(8000), 'B'); +INSERT INTO t1 SELECT a FROM t1; UPDATE t1 SET a=CONCAT(a, RAND(), a); UPDATE t1 SET a=CONCAT(a, RAND(), a); SELECT * from t1; DROP TABLE t1; -CREATE TABLE t1 (a LONGTEXT) ENGINE=INNODB DEFAULT CHARSET=UTF8 ROW_FORMAT=REDUNDANT; +CREATE TABLE t1 (a LONGTEXT) ENGINE=INNODB ROW_FORMAT=DYNAMIC; SHOW WARNINGS; Level Code Message -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B'); -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -UPDATE t1 SET a=CONCAT(a, RAND(), a); +INSERT INTO t1 SET a=CONCAT('A', SPACE(8000), 'B'); +INSERT INTO t1 SELECT a FROM t1; UPDATE t1 SET a=CONCAT(a, RAND(), a); UPDATE t1 SET a=CONCAT(a, RAND(), a); SELECT * from t1; diff --git a/mysql-test/suite/innodb/r/table_flags.result b/mysql-test/suite/innodb/r/table_flags.result index fdb2898dc81..0d636d84529 100644 --- a/mysql-test/suite/innodb/r/table_flags.result +++ b/mysql-test/suite/innodb/r/table_flags.result @@ -181,7 +181,6 @@ a SELECT * FROM tp; a DROP TABLE tr,tc,td,tz,tp; -ib_buffer_pool ib_logfile0 ib_logfile1 ibdata1 diff --git a/mysql-test/suite/innodb/t/innodb-enlarge-blob.opt b/mysql-test/suite/innodb/t/innodb-enlarge-blob.opt index 083a93dfc07..2f9bf78f82e 100644 --- a/mysql-test/suite/innodb/t/innodb-enlarge-blob.opt +++ b/mysql-test/suite/innodb/t/innodb-enlarge-blob.opt @@ -1,5 +1,4 @@ --innodb-file-per-table --innodb-buffer-pool-size=32M ---innodb-log-file-size=32M +--innodb-page-size=64k --innodb-strict-mode=OFF - diff --git a/mysql-test/suite/innodb/t/innodb-enlarge-blob.test b/mysql-test/suite/innodb/t/innodb-enlarge-blob.test index 84c23465a5c..65a64d299be 100644 --- a/mysql-test/suite/innodb/t/innodb-enlarge-blob.test +++ b/mysql-test/suite/innodb/t/innodb-enlarge-blob.test @@ -1,24 +1,13 @@ --source include/have_innodb.inc ---source include/innodb_page_size.inc # # MDEV-13227: Assertion failure len < 16384 in file rem0rec.cc line 1285 # Crashes with innodb_page_size=64K. Does not crash at <= 32K. # -CREATE TABLE t1 (a LONGTEXT) ENGINE=INNODB DEFAULT CHARSET=UTF8 ROW_FORMAT=DYNAMIC; +CREATE TABLE t1 (a LONGTEXT) ENGINE=INNODB ROW_FORMAT=REDUNDANT; SHOW WARNINGS; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B'); -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -UPDATE t1 SET a=CONCAT(a, RAND(), a); +INSERT INTO t1 SET a=CONCAT('A', SPACE(8000), 'B'); +INSERT INTO t1 SELECT a FROM t1; UPDATE t1 SET a=CONCAT(a, RAND(), a); UPDATE t1 SET a=CONCAT(a, RAND(), a); # random data no output we are only interested if fails @@ -27,20 +16,10 @@ SELECT * from t1; --enable_result_log DROP TABLE t1; -CREATE TABLE t1 (a LONGTEXT) ENGINE=INNODB DEFAULT CHARSET=UTF8 ROW_FORMAT=REDUNDANT; +CREATE TABLE t1 (a LONGTEXT) ENGINE=INNODB ROW_FORMAT=DYNAMIC; SHOW WARNINGS; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B'); -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -INSERT INTO t1 SELECT CONCAT('A', SPACE(4087), 'B') FROM t1; -UPDATE t1 SET a=CONCAT(a, RAND(), a); +INSERT INTO t1 SET a=CONCAT('A', SPACE(8000), 'B'); +INSERT INTO t1 SELECT a FROM t1; UPDATE t1 SET a=CONCAT(a, RAND(), a); UPDATE t1 SET a=CONCAT(a, RAND(), a); # random data no output we are only interested if fails diff --git a/mysql-test/suite/innodb/t/table_flags.test b/mysql-test/suite/innodb/t/table_flags.test index c64ff5ace20..2c0b55bcaae 100644 --- a/mysql-test/suite/innodb/t/table_flags.test +++ b/mysql-test/suite/innodb/t/table_flags.test @@ -204,6 +204,11 @@ DROP TABLE tr,tc,td,tz,tp; --let $restart_parameters= --source include/restart_mysqld.inc +--error 0,1 +--remove_file $bugdir/ibtmp1 +--error 0,1 +--remove_file $bugdir/ib_buffer_pool + --list_files $bugdir --remove_files_wildcard $bugdir --rmdir $bugdir diff --git a/mysql-test/t/sp.test b/mysql-test/t/sp.test index 4b7ee3723db..94d779de203 100644 --- a/mysql-test/t/sp.test +++ b/mysql-test/t/sp.test @@ -9549,6 +9549,37 @@ CALL sp1(); drop user 'foo'@'%'; drop procedure sp1; +--echo # +--echo # MDEV-10972: Insert from select / view / union -- +--echo # repeatable crash in 10.1, 10.2 Linux/Mac/Windows +--echo # + +create table t (id int auto_increment primary key); +insert into t values (9494),(9495),(9496),(9497),(9498),(9499),(9500),(9501),(9502),(9503); + +create VIEW v AS +select id from t +union +select id from t +; + +drop procedure if exists p; +create procedure p() +insert into tmp_t select t.id from ( + select id from v + union + select id from v +) sq +inner join t on (sq.id = t.id); + +--error ER_NO_SUCH_TABLE +CALL p(); +create table tmp_t (id int null); +CALL p(); + +drop procedure p; +drop view v; +drop table t, tmp_t; --echo #End of 10.1 tests diff --git a/mysql-test/t/view.test b/mysql-test/t/view.test index c24cb502d7b..fc6ee46c1ac 100644 --- a/mysql-test/t/view.test +++ b/mysql-test/t/view.test @@ -6312,6 +6312,44 @@ use test; drop database test_db; drop user foo@localhost; +--echo # +--echo # MDEV-13523: Group By in a View, called within a Stored Routine +--echo # causes Error Code 1356 when a non-root user runs the routine for +--echo # a second time +--echo # + +CREATE DATABASE bugTest; +USE bugTest; + +CREATE TABLE `procViewTable` (`id` int(10), `someText` varchar(50) NOT NULL); +insert into `procViewTable` values (1,'Test'), (2,'Test 2'); + +CREATE USER 'procView'@'%'; +GRANT ALL PRIVILEGES ON `bugTest`.* TO 'procView'@'%'; + +CREATE DEFINER=`procView`@`%` VIEW `procViewSimple` AS ( + select * from ( + select `id` from `bugTest`.`procViewTable` + ) `innerQuery` + group by `innerQuery`.`id` +); + +--connect (con1,localhost,procView,,) +use bugTest; + +prepare stmt from "SELECT * FROM procViewSimple"; +execute stmt; +execute stmt; + +# Cleanup +--disconnect con1 +--connection default +drop user procView; +drop view procViewSimple; +drop table procViewTable; +use test; +drop database bugTest; + --echo # --echo # End of 10.2 tests --echo # diff --git a/pcre/pcre_compile.c b/pcre/pcre_compile.c index 42f204cdfff..1a916693e69 100644 --- a/pcre/pcre_compile.c +++ b/pcre/pcre_compile.c @@ -1249,6 +1249,7 @@ else if ((c = *ptr) >= CHAR_8) break; + /* fall through */ /* Fall through with a digit less than 8 */ /* \0 always starts an octal number, but we may drop through to here with a @@ -5097,6 +5098,8 @@ for (;; ptr++) either not match or match, depending on whether the class is or is not negated. */ + /* fall through */ + default: if (local_negate && (xclass || tempptr[2] != CHAR_RIGHT_SQUARE_BRACKET)) @@ -7165,7 +7168,7 @@ for (;; ptr++) goto FAILED; } /* Fall through to handle (?P< as (?< is handled */ - + /* fall through */ /* ------------------------------------------------------------ */ DEFINE_NAME: /* Come here from (?< handling */ diff --git a/pcre/pcre_exec.c b/pcre/pcre_exec.c index 1a9bdd546ee..70ac2fea381 100644 --- a/pcre/pcre_exec.c +++ b/pcre/pcre_exec.c @@ -1053,6 +1053,8 @@ for (;;) group. At this point, the return is converted into MATCH_NOMATCH so that previous backup points can be taken. */ + /* fall through */ + case OP_ONCE: case OP_BRA: case OP_SBRA: diff --git a/plugin/metadata_lock_info/metadata_lock_info.cc b/plugin/metadata_lock_info/metadata_lock_info.cc index 9fe764ea30b..ef6fdd5cc5c 100644 --- a/plugin/metadata_lock_info/metadata_lock_info.cc +++ b/plugin/metadata_lock_info/metadata_lock_info.cc @@ -45,12 +45,6 @@ static const LEX_STRING metadata_lock_info_lock_mode[] = { { C_STRING_WITH_LEN("MDL_EXCLUSIVE") }, }; -static const LEX_STRING metadata_lock_info_duration[] = { - { C_STRING_WITH_LEN("MDL_STATEMENT") }, - { C_STRING_WITH_LEN("MDL_TRANSACTION") }, - { C_STRING_WITH_LEN("MDL_EXPLICIT") }, -}; - static ST_FIELD_INFO i_s_metadata_lock_info_fields_info[] = { {"THREAD_ID", 20, MYSQL_TYPE_LONGLONG, 0, @@ -129,8 +123,6 @@ static int i_s_metadata_lock_info_init( == MDL_key::NAMESPACE_END); compile_time_assert(sizeof(metadata_lock_info_lock_mode)/sizeof(LEX_STRING) == MDL_TYPE_END); - compile_time_assert(sizeof(metadata_lock_info_duration)/sizeof(LEX_STRING) - == MDL_DURATION_END); ST_SCHEMA_TABLE *schema = (ST_SCHEMA_TABLE *) p; DBUG_ENTER("i_s_metadata_lock_info_init"); diff --git a/scripts/wsrep_sst_rsync.sh b/scripts/wsrep_sst_rsync.sh index 23ee3df5d40..7acdf87b660 100644 --- a/scripts/wsrep_sst_rsync.sh +++ b/scripts/wsrep_sst_rsync.sh @@ -357,18 +357,18 @@ EOF readonly RSYNC_PORT=${WSREP_SST_OPT_PORT:-4444} # If the IP is local listen only in it - if is_local_ip $RSYNC_ADDR + if is_local_ip "$RSYNC_ADDR" then - rsync --daemon --no-detach --address $RSYNC_ADDR --port $RSYNC_PORT --config "$RSYNC_CONF" & + rsync --daemon --no-detach --address "$RSYNC_ADDR" --port "$RSYNC_PORT" --config "$RSYNC_CONF" & else # Not local, possibly a NAT, listen in all interface - rsync --daemon --no-detach --port $RSYNC_PORT --config "$RSYNC_CONF" & + rsync --daemon --no-detach --port "$RSYNC_PORT" --config "$RSYNC_CONF" & # Overwrite address with all RSYNC_ADDR="*" fi RSYNC_REAL_PID=$! - until check_pid_and_port $RSYNC_PID $RSYNC_REAL_PID $RSYNC_ADDR $RSYNC_PORT + until check_pid_and_port "$RSYNC_PID" "$RSYNC_REAL_PID" "$RSYNC_ADDR" "$RSYNC_PORT" do sleep 0.2 done diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 44e14c7a643..bd8dc1efa4c 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -7910,7 +7910,7 @@ uint32 ha_partition::calculate_key_hash_value(Field **field_array) case MYSQL_TYPE_BLOB: case MYSQL_TYPE_VAR_STRING: case MYSQL_TYPE_GEOMETRY: - /* fall through. */ + /* fall through */ default: DBUG_ASSERT(0); // New type? /* Fall through for default hashing (5.5). */ diff --git a/sql/sp.cc b/sql/sp.cc index bc7da657462..8f4acd40f10 100644 --- a/sql/sp.cc +++ b/sql/sp.cc @@ -807,6 +807,7 @@ static sp_head *sp_compile(THD *thd, String *defstr, sql_mode_t sql_mode, else { sp= thd->lex->sphead; + sp->set_select_number(thd->select_number); } thd->pop_internal_handler(); diff --git a/sql/sp_head.cc b/sql/sp_head.cc index ebd8dd5b8d2..5bd4ff95f9c 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -558,7 +558,7 @@ sp_head::sp_head(const Sp_handler *sph) m_defstr(null_clex_str), m_sp_cache_version(0), m_creation_ctx(0), - unsafe_flags(0), + unsafe_flags(0), m_select_number(1), m_created(0), m_modified(0), m_recursion_level(0), @@ -2041,8 +2041,26 @@ sp_head::execute_procedure(THD *thd, List *args) if (!err_status) { + /* + Normally the counter is not reset between parsing and first execution, + but it is possible in case of error to have parsing on one CALL and + first execution (where VIEW will be parsed and added). So we store the + counter after parsing and restore it before execution just to avoid + repeating SELECT numbers. + */ + thd->select_number= m_select_number; + err_status= execute(thd, TRUE); DBUG_PRINT("info", ("execute returned %d", (int) err_status)); + /* + This execution of the SP was aborted with an error (e.g. "Table not + found"). However it might still have consumed some numbers from the + thd->select_number counter. The next sp->exec() call must not use the + consumed numbers, so we remember the first free number (We know that + nobody will use it as this execution has stopped with an error). + */ + if (err_status) + set_select_number(thd->select_number); } if (save_log_general) diff --git a/sql/sp_head.h b/sql/sp_head.h index d7ef6fd0921..977e20a07b9 100644 --- a/sql/sp_head.h +++ b/sql/sp_head.h @@ -235,6 +235,7 @@ private: */ uint32 unsafe_flags; + uint m_select_number; public: inline Stored_program_creation_ctx *get_creation_ctx() { @@ -817,6 +818,8 @@ public: sp_pcontext *get_parse_context() { return m_pcont; } + void set_select_number(uint num) { m_select_number= num; } + bool check_execute_access(THD *thd) const; private: diff --git a/sql/sql_class.cc b/sql/sql_class.cc index 13db12b4f7e..9ce2cfb0a80 100644 --- a/sql/sql_class.cc +++ b/sql/sql_class.cc @@ -716,6 +716,7 @@ THD::THD(my_thread_id id, bool is_wsrep_applier) /* statement id */ 0), rli_fake(0), rgi_fake(0), rgi_slave(NULL), protocol_text(this), protocol_binary(this), + m_current_stage_key(0), in_sub_stmt(0), log_all_errors(0), binlog_unsafe_warning_flags(0), binlog_table_maps(0), diff --git a/sql/sql_table.cc b/sql/sql_table.cc index ebf1052d115..4006e3aec4d 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -1173,6 +1173,7 @@ static int execute_ddl_log_action(THD *thd, DDL_LOG_ENTRY *ddl_log_entry) action in the log entry by stepping up the phase. */ } + /* fall through */ case DDL_LOG_RENAME_ACTION: { error= TRUE; diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 35333dd2843..1c67a5a0dfc 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -1173,28 +1173,20 @@ buf_page_is_corrupted( } #ifndef UNIV_INNOCHECKSUM - -/** Prints a page to stderr. -@param[in] read_buf a database page -@param[in] page_size page size -@param[in] flags 0 or BUF_PAGE_PRINT_NO_CRASH or -BUF_PAGE_PRINT_NO_FULL */ +/** Dump a page to stderr. +@param[in] read_buf database page +@param[in] page_size page size */ +UNIV_INTERN void -buf_page_print( - const byte* read_buf, - const page_size_t& page_size, - ulint flags) +buf_page_print(const byte* read_buf, const page_size_t& page_size) { dict_index_t* index; - if (!(flags & BUF_PAGE_PRINT_NO_FULL)) { + ib::info() << "Page dump in ascii and hex (" + << page_size.physical() << " bytes):"; - ib::info() << "Page dump in ascii and hex (" - << page_size.physical() << " bytes):"; - - ut_print_buf(stderr, read_buf, page_size.physical()); - fputs("\nInnoDB: End of page dump\n", stderr); - } + ut_print_buf(stderr, read_buf, page_size.physical()); + fputs("\nInnoDB: End of page dump\n", stderr); if (page_size.is_compressed()) { /* Print compressed page. */ @@ -1351,8 +1343,6 @@ buf_page_print( stderr); break; } - - ut_ad(flags & BUF_PAGE_PRINT_NO_CRASH); } # ifdef PFS_GROUP_BUFFER_SYNC @@ -5976,8 +5966,7 @@ database_corrupted: << ". You may have to recover from " << "a backup."; - buf_page_print(frame, bpage->size, - BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(frame, bpage->size); ib::info() << "It is also possible that your" diff --git a/storage/innobase/buf/buf0dblwr.cc b/storage/innobase/buf/buf0dblwr.cc index 17b2229f1da..2bc3630d3f5 100644 --- a/storage/innobase/buf/buf0dblwr.cc +++ b/storage/innobase/buf/buf0dblwr.cc @@ -827,7 +827,7 @@ buf_dblwr_assert_on_corrupt_block( /*==============================*/ const buf_block_t* block) /*!< in: block to check */ { - buf_page_print(block->frame, univ_page_size, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(block->frame, univ_page_size); ib::fatal() << "Apparent corruption of an index page " << block->page.id diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc index cdf3d9bd997..5e7e5a2f21b 100644 --- a/storage/innobase/fil/fil0crypt.cc +++ b/storage/innobase/fil/fil0crypt.cc @@ -698,11 +698,12 @@ fil_space_encrypt( fprintf(stderr, "ok %d corrupted %d corrupted1 %d err %d different %d\n", ok , corrupted, corrupted1, err, different); fprintf(stderr, "src_frame\n"); - buf_page_print(src_frame, page_size, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(src_frame, page_size); fprintf(stderr, "encrypted_frame\n"); - buf_page_print(tmp, page_size, BUF_PAGE_PRINT_NO_CRASH); + buf_page_print(tmp, page_size); fprintf(stderr, "decrypted_frame\n"); - buf_page_print(tmp_mem, page_size, 0); + buf_page_print(tmp_mem, page_size); + ut_ad(0); } free(tmp_mem); diff --git a/storage/innobase/fil/fil0pagecompress.cc b/storage/innobase/fil/fil0pagecompress.cc index 83191c98b37..f2a7b7bd291 100644 --- a/storage/innobase/fil/fil0pagecompress.cc +++ b/storage/innobase/fil/fil0pagecompress.cc @@ -313,7 +313,8 @@ fil_compress_page( if (buf_page_is_corrupted(false, uncomp_page, univ_page_size, space)) { - buf_page_print(uncomp_page, univ_page_size, 0); + buf_page_print(uncomp_page, univ_page_size); + ut_ad(0); } ut_free(comp_page); @@ -641,6 +642,7 @@ err_exit: << " compression method: " << fil_get_compression_alg_name(compression_alg) << "."; - buf_page_print(buf, univ_page_size, 0); + buf_page_print(buf, univ_page_size); fil_space_release_for_io(space); + ut_ad(0); } diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index 67de1174d25..516898066aa 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -893,24 +893,13 @@ buf_print(void); /*============*/ #endif /* UNIV_DEBUG_PRINT || UNIV_DEBUG || UNIV_BUF_DEBUG */ -enum buf_page_print_flags { - /** Do not crash at the end of buf_page_print(). */ - BUF_PAGE_PRINT_NO_CRASH = 1, - /** Do not print the full page dump. */ - BUF_PAGE_PRINT_NO_FULL = 2 -}; - -/** Prints a page to stderr. -@param[in] read_buf a database page -@param[in] page_size page size -@param[in] flags 0 or BUF_PAGE_PRINT_NO_CRASH or -BUF_PAGE_PRINT_NO_FULL */ +/** Dump a page to stderr. +@param[in] read_buf database page +@param[in] page_size page size */ +UNIV_INTERN void -buf_page_print( - const byte* read_buf, - const page_size_t& page_size, - ulint flags); - +buf_page_print(const byte* read_buf, const page_size_t& page_size) + ATTRIBUTE_COLD __attribute__((nonnull)); /********************************************************************//** Decompress a block. @return TRUE if successful */ diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index b5bd132d198..eeb743cb180 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -3525,6 +3525,7 @@ recv_reset_logs( log_sys->next_checkpoint_no = 0; log_sys->last_checkpoint_lsn = 0; + memset(log_sys->buf, 0, log_sys->buf_size); log_block_init(log_sys->buf, log_sys->lsn); log_block_set_first_rec_group(log_sys->buf, LOG_BLOCK_HDR_SIZE); diff --git a/storage/innobase/row/row0sel.cc b/storage/innobase/row/row0sel.cc index c01f11024f6..984890791bd 100644 --- a/storage/innobase/row/row0sel.cc +++ b/storage/innobase/row/row0sel.cc @@ -1796,6 +1796,7 @@ rec_loop: switch (err) { case DB_SUCCESS_LOCKED_REC: err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; default: @@ -1856,6 +1857,7 @@ skip_lock: switch (err) { case DB_SUCCESS_LOCKED_REC: err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; default: @@ -4606,6 +4608,7 @@ wait_table_again: switch (err) { case DB_SUCCESS_LOCKED_REC: err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; default: @@ -4688,6 +4691,7 @@ rec_loop: switch (err) { case DB_SUCCESS_LOCKED_REC: err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; default: @@ -4949,6 +4953,7 @@ no_gap_lock: prebuilt->new_rec_locks = 1; } err = DB_SUCCESS; + /* fall through */ case DB_SUCCESS: break; case DB_LOCK_WAIT: diff --git a/storage/rocksdb/CMakeLists.txt b/storage/rocksdb/CMakeLists.txt index 5db6d888bb6..6db82119b45 100644 --- a/storage/rocksdb/CMakeLists.txt +++ b/storage/rocksdb/CMakeLists.txt @@ -146,7 +146,10 @@ ADD_CONVENIENCE_LIBRARY(rocksdb_aux_lib ADD_DEPENDENCIES(rocksdb_aux_lib GenError) # MARIAROCKS-TODO: how to properly depend on -lrt ? -TARGET_LINK_LIBRARIES(rocksdb_aux_lib rocksdblib ${ZLIB_LIBRARY} -lrt) +TARGET_LINK_LIBRARIES(rocksdb_aux_lib rocksdblib ${ZLIB_LIBRARY}) +if (UNIX AND NOT APPLE) + TARGET_LINK_LIBRARIES(rocksdb_aux_lib -lrt) +endif() TARGET_LINK_LIBRARIES(rocksdb rocksdb_aux_lib) @@ -182,7 +185,9 @@ ENDIF() # ADD_SUBDIRECTORY(unittest) #ENDIF() -SET(rocksdb_static_libs ${rocksdb_static_libs} "-lrt") +if (UNIX AND NOT APPLE) + SET(rocksdb_static_libs ${rocksdb_static_libs} "-lrt") +endif() ADD_LIBRARY(rocksdb_tools STATIC rocksdb/tools/ldb_tool.cc diff --git a/storage/rocksdb/ha_rocksdb.cc b/storage/rocksdb/ha_rocksdb.cc index e4d9ce02f10..3b01c883d92 100644 --- a/storage/rocksdb/ha_rocksdb.cc +++ b/storage/rocksdb/ha_rocksdb.cc @@ -173,7 +173,7 @@ Rdb_ddl_manager ddl_manager; const char *m_mysql_gtid; Rdb_binlog_manager binlog_manager; -#ifndef _WIN32 +#if !defined(_WIN32) && !defined(__APPLE__) Rdb_io_watchdog *io_watchdog = nullptr; #endif /** @@ -554,7 +554,7 @@ static void rocksdb_set_io_write_timeout( void *const var_ptr MY_ATTRIBUTE((__unused__)), const void *const save) { DBUG_ASSERT(save != nullptr); DBUG_ASSERT(rdb != nullptr); -#ifndef _WIN32 +#if !defined(_WIN32) && !defined(__APPLE__) DBUG_ASSERT(io_watchdog != nullptr); #endif @@ -563,7 +563,7 @@ static void rocksdb_set_io_write_timeout( const uint32_t new_val = *static_cast(save); rocksdb_io_write_timeout_secs = new_val; -#ifndef _WIN32 +#if !defined(_WIN32) && !defined(__APPLE__) io_watchdog->reset_timeout(rocksdb_io_write_timeout_secs); #endif RDB_MUTEX_UNLOCK_CHECK(rdb_sysvars_mutex); @@ -3984,7 +3984,7 @@ static int rocksdb_init_func(void *const p) { directories.push_back(myrocks::rocksdb_wal_dir); } -#ifndef _WIN32 +#if !defined(_WIN32) && !defined(__APPLE__) io_watchdog = new Rdb_io_watchdog(directories); io_watchdog->reset_timeout(rocksdb_io_write_timeout_secs); #endif @@ -4076,7 +4076,7 @@ static int rocksdb_done_func(void *const p) { delete commit_latency_stats; commit_latency_stats = nullptr; -#ifndef _WIN32 +#if !defined(_WIN32) && !defined(__APPLE__) delete io_watchdog; io_watchdog = nullptr; #endif diff --git a/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_rev_cf_and_data.result b/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_rev_cf_and_data.result index 4d259b5ea2f..6c38e030afb 100644 --- a/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_rev_cf_and_data.result +++ b/storage/rocksdb/mysql-test/rocksdb/r/bulk_load_rev_cf_and_data.result @@ -21,6 +21,7 @@ b CHAR(30), PRIMARY KEY(pk) COMMENT "rev:cf1", KEY(a) ) COLLATE 'latin1_bin' PARTITION BY KEY() PARTITIONS 4; +connect other,localhost,root,,; set session transaction isolation level repeatable read; select * from information_schema.rocksdb_dbstats where stat_type='DB_NUM_SNAPSHOTS'; STAT_TYPE VALUE @@ -29,6 +30,7 @@ start transaction with consistent snapshot; select * from information_schema.rocksdb_dbstats where stat_type='DB_NUM_SNAPSHOTS'; STAT_TYPE VALUE DB_NUM_SNAPSHOTS 1 +connection default; set rocksdb_bulk_load=1; set rocksdb_bulk_load_size=100000; LOAD DATA INFILE INTO TABLE t1; @@ -79,4 +81,5 @@ count(b) 5000000 longfilenamethatvalidatesthatthiswillgetdeleted.bulk_load.tmp test.bulk_load.tmp +disconnect other; DROP TABLE t1, t2, t3; diff --git a/storage/rocksdb/rdb_io_watchdog.cc b/storage/rocksdb/rdb_io_watchdog.cc index a599ba58aec..b41e9248d52 100644 --- a/storage/rocksdb/rdb_io_watchdog.cc +++ b/storage/rocksdb/rdb_io_watchdog.cc @@ -22,7 +22,7 @@ #include /* Rdb_io_watchdog doesn't work on Windows [yet] */ -#ifndef _WIN32 +#if !defined(_WIN32) && !defined(__APPLE__) namespace myrocks { diff --git a/storage/rocksdb/rdb_io_watchdog.h b/storage/rocksdb/rdb_io_watchdog.h index de8c1b9500e..c50547745df 100644 --- a/storage/rocksdb/rdb_io_watchdog.h +++ b/storage/rocksdb/rdb_io_watchdog.h @@ -35,7 +35,7 @@ namespace myrocks { // Rdb_io_watchdog does not support Windows ATM. -#ifndef _WIN32 +#if !defined(_WIN32) && !defined(__APPLE__) class Rdb_io_watchdog { const int RDB_IO_WRITE_BUFFER_SIZE = 4096;