Merge remote-tracking branch 'origin/10.2' into bb-10.2-ext

This commit is contained in:
Alexander Barkov 2018-01-23 17:43:12 +04:00
commit ec6b8c546a
16 changed files with 262 additions and 71 deletions

View File

@ -433,6 +433,22 @@ datafiles_iter_free(datafiles_iter_t *it)
free(it);
}
void mdl_lock_all()
{
mdl_lock_init();
datafiles_iter_t *it = datafiles_iter_new(fil_system);
if (!it)
return;
while (fil_node_t *node = datafiles_iter_next(it)){
if (fil_is_user_tablespace_id(node->space->id)
&& check_if_skip_table(node->space->name))
continue;
mdl_lock_table(node->space->id);
}
datafiles_iter_free(it);
}
/* ======== Date copying thread context ======== */
typedef struct {
@ -2199,10 +2215,6 @@ xtrabackup_copy_datafile(fil_node_t* node, uint thread_n)
return(FALSE);
}
if (opt_lock_ddl_per_table) {
mdl_lock_table(node->space->id);
}
if (!changed_page_bitmap) {
read_filter = &rf_pass_through;
}
@ -3562,9 +3574,7 @@ xtrabackup_backup_func()
"or RENAME TABLE during the backup, inconsistent backup will be "
"produced.\n");
if (opt_lock_ddl_per_table) {
mdl_lock_init();
}
/* initialize components */
if(innodb_init_param()) {
@ -3879,6 +3889,10 @@ reread_log_header:
"files transfer\n", xtrabackup_parallel);
}
if (opt_lock_ddl_per_table) {
mdl_lock_all();
}
it = datafiles_iter_new(fil_system);
if (it == NULL) {
msg("mariabackup: Error: datafiles_iter_new() failed.\n");

View File

@ -5195,3 +5195,45 @@ t1 CREATE TABLE `t1` (
`b` bigint(10) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
DROP TABLE t1;
#
# MDEV-14603 signal 11 with short stacktrace
#
SET NAMES utf8;
CREATE TABLE t1(i INT);
CREATE PROCEDURE p1(tn VARCHAR(32))
EXECUTE IMMEDIATE CONCAT('ANALYZE TABLE ',tn);
CALL p1('t1');
Table Op Msg_type Msg_text
test.t1 analyze status Table is already up to date
DROP PROCEDURE p1;
DROP TABLE t1;
SET NAMES utf8;
CREATE PROCEDURE p1()
EXECUTE IMMEDIATE CONCAT('SELECT ',CONVERT(RAND() USING latin1));
CALL p1();
DROP PROCEDURE p1;
SET NAMES utf8;
CREATE PROCEDURE p1()
BEGIN
PREPARE stmt FROM CONCAT('SELECT ',CONVERT(RAND() USING latin1));
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END;
$$
CALL p1();
DROP PROCEDURE p1;
SET NAMES utf8;
CREATE PROCEDURE p1(a VARCHAR(10) CHARACTER SET utf8)
EXECUTE IMMEDIATE 'SELECT ?' USING CONCAT(a, CONVERT(RAND() USING latin1));
CALL p1('x');
DROP PROCEDURE p1;
SET NAMES utf8;
CREATE PROCEDURE p1(a VARCHAR(10) CHARACTER SET utf8)
BEGIN
PREPARE stmt FROM 'SELECT ?';
EXECUTE stmt USING CONCAT(a, CONVERT(RAND() USING latin1));
DEALLOCATE PREPARE stmt;
END;
$$
CALL p1('x');
DROP PROCEDURE p1;

View File

@ -3290,5 +3290,15 @@ FROM door as window;
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 'window' at line 2
DROP TABLE door;
#
# MDEV-13352: Server crashes in st_join_table::remove_duplicates
#
CREATE TABLE t1 (i INT);
INSERT INTO t1 VALUES (1),(2);
SELECT DISTINCT ROW_NUMBER() OVER(), i FROM t1 WHERE 0;
ROW_NUMBER() OVER() i
SELECT ROW_NUMBER() OVER(), i FROM t1 WHERE 0;
ROW_NUMBER() OVER() i
DROP TABLE t1;
#
# Start of 10.3 tests
#

View File

@ -4615,3 +4615,60 @@ DROP TABLE t1;
EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t1 AS SELECT 2147483647 AS a,? AS b' USING 2147483647;
SHOW CREATE TABLE t1;
DROP TABLE t1;
--echo #
--echo # MDEV-14603 signal 11 with short stacktrace
--echo #
SET NAMES utf8;
CREATE TABLE t1(i INT);
CREATE PROCEDURE p1(tn VARCHAR(32))
EXECUTE IMMEDIATE CONCAT('ANALYZE TABLE ',tn);
CALL p1('t1');
DROP PROCEDURE p1;
DROP TABLE t1;
SET NAMES utf8;
CREATE PROCEDURE p1()
EXECUTE IMMEDIATE CONCAT('SELECT ',CONVERT(RAND() USING latin1));
--disable_result_log
CALL p1();
--enable_result_log
DROP PROCEDURE p1;
SET NAMES utf8;
DELIMITER $$;
CREATE PROCEDURE p1()
BEGIN
PREPARE stmt FROM CONCAT('SELECT ',CONVERT(RAND() USING latin1));
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END;
$$
DELIMITER ;$$
--disable_result_log
CALL p1();
--enable_result_log
DROP PROCEDURE p1;
SET NAMES utf8;
CREATE PROCEDURE p1(a VARCHAR(10) CHARACTER SET utf8)
EXECUTE IMMEDIATE 'SELECT ?' USING CONCAT(a, CONVERT(RAND() USING latin1));
--disable_result_log
CALL p1('x');
--enable_result_log
DROP PROCEDURE p1;
SET NAMES utf8;
DELIMITER $$;
CREATE PROCEDURE p1(a VARCHAR(10) CHARACTER SET utf8)
BEGIN
PREPARE stmt FROM 'SELECT ?';
EXECUTE stmt USING CONCAT(a, CONVERT(RAND() USING latin1));
DEALLOCATE PREPARE stmt;
END;
$$
DELIMITER ;$$
--disable_result_log
CALL p1('x');
DROP PROCEDURE p1;

View File

@ -2058,6 +2058,15 @@ FROM door as window;
DROP TABLE door;
--echo #
--echo # MDEV-13352: Server crashes in st_join_table::remove_duplicates
--echo #
CREATE TABLE t1 (i INT);
INSERT INTO t1 VALUES (1),(2);
SELECT DISTINCT ROW_NUMBER() OVER(), i FROM t1 WHERE 0;
SELECT ROW_NUMBER() OVER(), i FROM t1 WHERE 0;
DROP TABLE t1;
--echo #
--echo # Start of 10.3 tests
--echo #

View File

@ -1288,6 +1288,25 @@ public:
};
class Item_change_list_savepoint: public Item_change_list
{
public:
Item_change_list_savepoint(Item_change_list *list)
{
list->move_elements_to(this);
}
void rollback(Item_change_list *list)
{
list->rollback_item_tree_changes();
move_elements_to(list);
}
~Item_change_list_savepoint()
{
DBUG_ASSERT(is_empty());
}
};
/**
Type of locked tables mode.
See comment for THD::locked_tables_mode for complete description.

View File

@ -2769,6 +2769,25 @@ void mysql_sql_stmt_prepare(THD *thd)
DBUG_VOID_RETURN;
}
/*
Make sure we call Prepared_statement::prepare() with an empty
THD::change_list. It can be non-empty as LEX::get_dynamic_sql_string()
calls fix_fields() for the Item containing the PS source,
e.g. on character set conversion:
SET NAMES utf8;
DELIMITER $$
CREATE PROCEDURE p1()
BEGIN
PREPARE stmt FROM CONCAT('SELECT ',CONVERT(RAND() USING latin1));
EXECUTE stmt;
END;
$$
DELIMITER ;
CALL p1();
*/
Item_change_list_savepoint change_list_savepoint(thd);
if (stmt->prepare(query.str, (uint) query.length))
{
/* Statement map deletes the statement on erase */
@ -2779,6 +2798,7 @@ void mysql_sql_stmt_prepare(THD *thd)
SESSION_TRACKER_CHANGED(thd, SESSION_STATE_CHANGE_TRACKER, NULL);
my_ok(thd, 0L, 0L, "Statement prepared");
}
change_list_savepoint.rollback(thd);
DBUG_VOID_RETURN;
}
@ -2810,7 +2830,28 @@ void mysql_sql_stmt_execute_immediate(THD *thd)
// See comments on thd->free_list in mysql_sql_stmt_execute()
Item *free_list_backup= thd->free_list;
thd->free_list= NULL;
/*
Make sure we call Prepared_statement::execute_immediate()
with an empty THD::change_list. It can be non empty as the above
LEX::prepared_stmt_params_fix_fields() and LEX::get_dynamic_str_string()
call fix_fields() for the PS source and PS parameter Items and
can do Item tree changes, e.g. on character set conversion:
- Example #1: Item tree changes in get_dynamic_str_string()
SET NAMES utf8;
CREATE PROCEDURE p1()
EXECUTE IMMEDIATE CONCAT('SELECT ',CONVERT(RAND() USING latin1));
CALL p1();
- Example #2: Item tree changes in prepared_stmt_param_fix_fields():
SET NAMES utf8;
CREATE PROCEDURE p1(a VARCHAR(10) CHARACTER SET utf8)
EXECUTE IMMEDIATE 'SELECT ?' USING CONCAT(a, CONVERT(RAND() USING latin1));
CALL p1('x');
*/
Item_change_list_savepoint change_list_savepoint(thd);
(void) stmt->execute_immediate(query.str, (uint) query.length);
change_list_savepoint.rollback(thd);
thd->free_items();
thd->free_list= free_list_backup;
@ -3208,7 +3249,27 @@ void mysql_sql_stmt_execute(THD *thd)
*/
Item *free_list_backup= thd->free_list;
thd->free_list= NULL; // Hide the external (e.g. "SET STATEMENT") Items
/*
Make sure we call Prepared_statement::execute_loop() with an empty
THD::change_list. It can be non-empty because the above
LEX::prepared_stmt_params_fix_fields() calls fix_fields() for
the PS parameter Items and can do some Item tree changes,
e.g. on character set conversion:
SET NAMES utf8;
DELIMITER $$
CREATE PROCEDURE p1(a VARCHAR(10) CHARACTER SET utf8)
BEGIN
PREPARE stmt FROM 'SELECT ?';
EXECUTE stmt USING CONCAT(a, CONVERT(RAND() USING latin1));
END;
$$
DELIMITER ;
CALL p1('x');
*/
Item_change_list_savepoint change_list_savepoint(thd);
(void) stmt->execute_loop(&expanded_query, FALSE, NULL, NULL);
change_list_savepoint.rollback(thd);
thd->free_items(); // Free items created by execute_loop()
/*
Now restore the "external" (e.g. "SET STATEMENT") Item list.

View File

@ -2733,7 +2733,15 @@ bool JOIN::make_aggr_tables_info()
curr_tab->having= having;
having->update_used_tables();
}
curr_tab->distinct= true;
/*
We only need DISTINCT operation if the join is not degenerate.
If it is, we must not request DISTINCT processing, because
remove_duplicates() assumes there is a preceding computation step (and
in the degenerate join, there's none)
*/
if (top_join_tab_count)
curr_tab->distinct= true;
having= NULL;
select_distinct= false;
}

View File

@ -16742,7 +16742,7 @@ innodb_show_mutex_status(
DBUG_ASSERT(hton == innodb_hton_ptr);
mutex_monitor->iterate(collector);
mutex_monitor.iterate(collector);
if (!collector.to_string(hton, thd, stat_print)) {
DBUG_RETURN(1);
@ -17888,12 +17888,14 @@ innobase_commit_by_xid(
}
if (trx_t* trx = trx_get_trx_by_xid(xid)) {
TrxInInnoDB trx_in_innodb(trx);
innobase_commit_low(trx);
ut_ad(trx->mysql_thd == NULL);
ut_ad(trx->in_innodb & TRX_FORCE_ROLLBACK_DISABLE);
/* use cases are: disconnected xa, slave xa, recovery */
trx_deregister_from_2pc(trx);
{
TrxInInnoDB trx_in_innodb(trx);
innobase_commit_low(trx);
ut_ad(trx->mysql_thd == NULL);
trx_deregister_from_2pc(trx);
}
ut_ad(!trx->will_lock); /* trx cache requirement */
trx_free_for_background(trx);
@ -17922,12 +17924,14 @@ innobase_rollback_by_xid(
}
if (trx_t* trx = trx_get_trx_by_xid(xid)) {
TrxInInnoDB trx_in_innodb(trx);
int ret = innobase_rollback_trx(trx);
trx_deregister_from_2pc(trx);
ut_ad(!trx->will_lock);
int ret;
ut_ad(trx->in_innodb & TRX_FORCE_ROLLBACK_DISABLE);
{
TrxInInnoDB trx_in_innodb(trx);
ret = innobase_rollback_trx(trx);
trx_deregister_from_2pc(trx);
ut_ad(!trx->will_lock);
}
trx_free_for_background(trx);
return(ret);
@ -18910,7 +18914,7 @@ innodb_monitor_set_option(
if (MONITOR_IS_ON(MONITOR_LATCHES)) {
mutex_monitor->enable();
mutex_monitor.enable();
}
break;
@ -18925,7 +18929,7 @@ innodb_monitor_set_option(
if (!MONITOR_IS_ON(MONITOR_LATCHES)) {
mutex_monitor->disable();
mutex_monitor.disable();
}
break;
@ -18934,13 +18938,13 @@ innodb_monitor_set_option(
if (monitor_id == (MONITOR_LATCHES)) {
mutex_monitor->reset();
mutex_monitor.reset();
}
break;
case MONITOR_RESET_ALL_VALUE:
srv_mon_reset_all(monitor_id);
mutex_monitor->reset();
mutex_monitor.reset();
break;
default:

View File

@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2016, 2017, MariaDB Corporation.
Copyright (c) 2016, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@ -4492,7 +4492,7 @@ ibuf_merge_or_delete_for_page(
return;
}
space = fil_space_acquire(page_id.space());
space = fil_space_acquire_silent(page_id.space());
if (UNIV_UNLIKELY(!space)) {
/* Do not try to read the bitmap page from the

View File

@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2013, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation.
Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@ -454,14 +454,7 @@ public:
void destroy()
UNIV_NOTHROW
{
latch_meta_t& meta = sync_latch_get_meta(m_id);
ut_ad(meta.get_id() == m_id);
meta.get_counter()->sum_deregister(m_count);
m_count = NULL;
ut_d(MutexDebug<MutexType>::destroy());
}

View File

@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation.
Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@ -640,14 +640,6 @@ public:
return(count);
}
/** Deregister the count. We don't do anything
@param[in] count The count instance to deregister */
void sum_deregister(Count* count)
UNIV_NOTHROW
{
/* Do nothing */
}
/** Register a single instance counter */
void single_register(Count* count)
UNIV_NOTHROW

View File

@ -164,7 +164,7 @@ public:
};
/** Defined in sync0sync.cc */
extern MutexMonitor* mutex_monitor;
extern MutexMonitor mutex_monitor;
/**
Creates, or rather, initializes a mutex object in a specified memory

View File

@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2014, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation.
Copyright (c) 2017, 2018, MariaDB Corporation.
Portions of this file contain modifications contributed and copyrighted by
Google, Inc. Those modifications are gratefully acknowledged and are described
@ -1705,7 +1705,7 @@ private:
};
/** Track latch creation location. For reducing the size of the latches */
static CreateTracker* create_tracker;
static CreateTracker create_tracker;
/** Register a latch, called when it is created
@param[in] ptr Latch instance that was created
@ -1717,7 +1717,7 @@ sync_file_created_register(
const char* filename,
uint16_t line)
{
create_tracker->register_latch(ptr, filename, line);
create_tracker.register_latch(ptr, filename, line);
}
/** Deregister a latch, called when it is destroyed
@ -1725,7 +1725,7 @@ sync_file_created_register(
void
sync_file_created_deregister(const void* ptr)
{
create_tracker->deregister_latch(ptr);
create_tracker.deregister_latch(ptr);
}
/** Get the string where the file was created. Its format is "name:line"
@ -1734,7 +1734,7 @@ sync_file_created_deregister(const void* ptr)
std::string
sync_file_created_get(const void* ptr)
{
return(create_tracker->get(ptr));
return(create_tracker.get(ptr));
}
/** Initializes the synchronization data structures. */
@ -1744,12 +1744,6 @@ sync_check_init()
ut_ad(!LatchDebug::s_initialized);
ut_d(LatchDebug::s_initialized = true);
/** For collecting latch statistic - SHOW ... MUTEX */
mutex_monitor = UT_NEW_NOKEY(MutexMonitor());
/** For trcking mutex creation location */
create_tracker = UT_NEW_NOKEY(CreateTracker());
sync_latch_meta_init();
/* Init the rw-lock & mutex list and create the mutex to protect it. */
@ -1773,14 +1767,6 @@ sync_check_close()
sync_array_close();
UT_DELETE(mutex_monitor);
mutex_monitor = NULL;
UT_DELETE(create_tracker);
create_tracker = NULL;
sync_latch_meta_destroy();
}

View File

@ -118,7 +118,7 @@ mysql_pfs_key_t trx_purge_latch_key;
#endif /* UNIV_PFS_RWLOCK */
/** For monitoring active mutexes */
MutexMonitor* mutex_monitor;
MutexMonitor mutex_monitor;
/**
Prints wait info of the sync system.

View File

@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation.
Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
@ -939,13 +939,9 @@ trx_sys_close(void)
|| srv_read_only_mode
|| srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO);
for (trx_t* trx = UT_LIST_GET_FIRST(trx_sys->rw_trx_list);
trx != NULL;
trx = UT_LIST_GET_FIRST(trx_sys->rw_trx_list)) {
trx_free_prepared(trx);
while (trx_t* trx = UT_LIST_GET_FIRST(trx_sys->rw_trx_list)) {
UT_LIST_REMOVE(trx_sys->rw_trx_list, trx);
trx_free_prepared(trx);
}
/* There can't be any active transactions. */