summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2018-05-24 11:27:15 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2018-05-24 11:27:15 +0300
commit6686dfcbbf74159a47cb1b3ffd36daed8a2fa420 (patch)
tree731e2288bfe7a903671a011d55c9de1ba863d779
parenta80e41043876b486d94a641e98ce2e6057c0a65e (diff)
parent52df8040264cc6f3226e78d371e4c1dd88dd22b6 (diff)
downloadmariadb-git-6686dfcbbf74159a47cb1b3ffd36daed8a2fa420.tar.gz
Merge 10.2 into 10.3
-rw-r--r--mysql-test/main/check.result33
-rw-r--r--mysql-test/main/check.test24
-rw-r--r--mysql-test/main/partition_open_files_limit.test4
-rw-r--r--sql/sql_table.cc5
-rw-r--r--storage/innobase/dict/dict0load.cc5
-rw-r--r--storage/innobase/handler/handler0alter.cc2
-rw-r--r--storage/innobase/handler/i_s.cc178
-rw-r--r--storage/rocksdb/CMakeLists.txt3
-rw-r--r--storage/rocksdb/mysql-test/rocksdb/r/issue255.result2
-rw-r--r--storage/rocksdb/mysql-test/rocksdb/t/issue255.test2
10 files changed, 150 insertions, 108 deletions
diff --git a/mysql-test/main/check.result b/mysql-test/main/check.result
index 341c4411298..e3dcda773f4 100644
--- a/mysql-test/main/check.result
+++ b/mysql-test/main/check.result
@@ -52,3 +52,36 @@ connection default;
UNLOCK TABLES;
DROP TABLE t1;
disconnect con1;
+#
+# MDEV-15338
+# Assertion `!table || (!table->read_set ||
+# bitmap_is_set(table->read_set, field_index))'
+# failed on dropping column with CHECK
+#
+CREATE TABLE t1 (a INT, b INT, CHECK (a>0)) ENGINE=MyISAM;
+INSERT INTO t1 VALUES (1,2),(3,4);
+ALTER TABLE t1 DROP COLUMN a;
+CREATE OR REPLACE TABLE t1 (a INT, b INT, CHECK (a>0)) ENGINE=MyISAM;
+ALTER TABLE t1 DROP COLUMN b;
+CREATE OR REPLACE TABLE t1 (a INT, b INT, c INT, CHECK (a+b>0)) ENGINE=MyISAM;
+ALTER TABLE t1 DROP COLUMN b;
+ERROR 42S22: Unknown column 'b' in 'CHECK'
+ALTER TABLE t1 DROP COLUMN a, DROP COLUMN b;
+CREATE OR REPLACE TABLE t1 (a INT, b INT, c INT, CHECK (a+b>0)) ENGINE=MyISAM;
+ALTER TABLE t1 DROP CONSTRAINT `CONSTRAINT_1`;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `b` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+CREATE OR REPLACE TABLE t1 (a INT, b INT, c INT, CHECK (a+b>0)) ENGINE=MyISAM;
+ALTER TABLE t1 DROP COLUMN b, DROP CONSTRAINT `CONSTRAINT_1`;
+SHOW CREATE TABLE t1;
+Table Create Table
+t1 CREATE TABLE `t1` (
+ `a` int(11) DEFAULT NULL,
+ `c` int(11) DEFAULT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1
+DROP TABLE t1;
diff --git a/mysql-test/main/check.test b/mysql-test/main/check.test
index 6a7b7253a59..cce8fd34c9c 100644
--- a/mysql-test/main/check.test
+++ b/mysql-test/main/check.test
@@ -79,3 +79,27 @@ disconnect con1;
# Wait till we reached the initial number of concurrent sessions
--source include/wait_until_count_sessions.inc
+
+--echo #
+--echo # MDEV-15338
+--echo # Assertion `!table || (!table->read_set ||
+--echo # bitmap_is_set(table->read_set, field_index))'
+--echo # failed on dropping column with CHECK
+--echo #
+
+CREATE TABLE t1 (a INT, b INT, CHECK (a>0)) ENGINE=MyISAM;
+INSERT INTO t1 VALUES (1,2),(3,4);
+ALTER TABLE t1 DROP COLUMN a;
+CREATE OR REPLACE TABLE t1 (a INT, b INT, CHECK (a>0)) ENGINE=MyISAM;
+ALTER TABLE t1 DROP COLUMN b;
+CREATE OR REPLACE TABLE t1 (a INT, b INT, c INT, CHECK (a+b>0)) ENGINE=MyISAM;
+--error ER_BAD_FIELD_ERROR
+ALTER TABLE t1 DROP COLUMN b;
+ALTER TABLE t1 DROP COLUMN a, DROP COLUMN b;
+CREATE OR REPLACE TABLE t1 (a INT, b INT, c INT, CHECK (a+b>0)) ENGINE=MyISAM;
+ALTER TABLE t1 DROP CONSTRAINT `CONSTRAINT_1`;
+SHOW CREATE TABLE t1;
+CREATE OR REPLACE TABLE t1 (a INT, b INT, c INT, CHECK (a+b>0)) ENGINE=MyISAM;
+ALTER TABLE t1 DROP COLUMN b, DROP CONSTRAINT `CONSTRAINT_1`;
+SHOW CREATE TABLE t1;
+DROP TABLE t1;
diff --git a/mysql-test/main/partition_open_files_limit.test b/mysql-test/main/partition_open_files_limit.test
index e62ebd0ade7..5a0bc9c7cb5 100644
--- a/mysql-test/main/partition_open_files_limit.test
+++ b/mysql-test/main/partition_open_files_limit.test
@@ -4,6 +4,10 @@
DROP TABLE IF EXISTS `t1`;
--enable_warnings
+call mtr.add_suppression("option 'table_open_cache'");
+call mtr.add_suppression("option 'max_connections'");
+
+
# On some platforms the lowest possible open_files_limit is too high...
let $max_open_files_limit= `SELECT @@open_files_limit > 511`;
if ($max_open_files_limit)
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 648e05a4116..0bf421ef0f6 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -10149,6 +10149,11 @@ copy_data_between_tables(THD *thd, TABLE *from, TABLE *to,
alter_table_manage_keys(to, from->file->indexes_are_disabled(), keys_onoff);
+ /* Set read map for all fields in from table */
+ from->default_column_bitmaps();
+ bitmap_set_all(from->read_set);
+ from->file->column_bitmaps_signal();
+
/* We can abort alter table for any table type */
thd->abort_on_warning= !ignore && thd->is_strict_mode();
diff --git a/storage/innobase/dict/dict0load.cc b/storage/innobase/dict/dict0load.cc
index 0fe11e11ac9..1f1a6c0bc48 100644
--- a/storage/innobase/dict/dict0load.cc
+++ b/storage/innobase/dict/dict0load.cc
@@ -2438,8 +2438,9 @@ dict_load_indexes(
&& static_cast<char>(*field)
== static_cast<char>(*TEMP_INDEX_PREFIX_STR)) {
/* Skip indexes whose name starts with
- TEMP_INDEX_PREFIX, because they will
- be dropped during crash recovery. */
+ TEMP_INDEX_PREFIX_STR, because they will
+ be dropped by row_merge_drop_temp_indexes()
+ during crash recovery. */
goto next_rec;
}
}
diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc
index 228e516551d..de0e587aa4d 100644
--- a/storage/innobase/handler/handler0alter.cc
+++ b/storage/innobase/handler/handler0alter.cc
@@ -8890,7 +8890,7 @@ commit_cache_norebuild(
(after renaming the indexes), so that in the
event of a crash, crash recovery will drop the
indexes, because it drops all indexes whose
- names start with TEMP_INDEX_PREFIX. Once we
+ names start with TEMP_INDEX_PREFIX_STR. Once we
have started dropping an index tree, there is
no way to roll it back. */
diff --git a/storage/innobase/handler/i_s.cc b/storage/innobase/handler/i_s.cc
index 3225a04fcb2..25dd9e9993d 100644
--- a/storage/innobase/handler/i_s.cc
+++ b/storage/innobase/handler/i_s.cc
@@ -256,60 +256,13 @@ field_store_string(
const char* str) /*!< in: NUL-terminated utf-8 string,
or NULL */
{
- int ret;
-
- if (str != NULL) {
-
- ret = field->store(str, static_cast<uint>(strlen(str)),
- system_charset_info);
- field->set_notnull();
- } else {
-
- ret = 0; /* success */
+ if (!str) {
field->set_null();
- }
-
- return(ret);
-}
-
-/*******************************************************************//**
-Store the name of an index in a MYSQL_TYPE_VARCHAR field.
-Handles the names of incomplete secondary indexes.
-@return 0 on success */
-static
-int
-field_store_index_name(
-/*===================*/
- Field* field, /*!< in/out: target field for
- storage */
- const char* index_name) /*!< in: NUL-terminated utf-8
- index name, possibly starting with
- TEMP_INDEX_PREFIX */
-{
- int ret;
-
- ut_ad(index_name != NULL);
- ut_ad(field->real_type() == MYSQL_TYPE_VARCHAR ||
- field->real_type() == MYSQL_TYPE_NULL);
-
- /* Since TEMP_INDEX_PREFIX is not a valid UTF8, we need to convert
- it to something else. */
- if (*index_name == *TEMP_INDEX_PREFIX_STR) {
- char buf[NAME_LEN + 1];
- buf[0] = '?';
- memcpy(buf + 1, index_name + 1, strlen(index_name));
- ret = field->store(
- buf, static_cast<uint>(strlen(buf)),
- system_charset_info);
- } else {
- ret = field->store(
- index_name, static_cast<uint>(strlen(index_name)),
- system_charset_info);
+ return 0;
}
field->set_notnull();
-
- return(ret);
+ return field->store(str, uint(strlen(str)), system_charset_info);
}
/*******************************************************************//**
@@ -932,12 +885,8 @@ fill_innodb_locks_from_cache(
buf, uint(bufend - buf), system_charset_info));
/* lock_index */
- if (row->lock_index != NULL) {
- OK(field_store_index_name(fields[IDX_LOCK_INDEX],
- row->lock_index));
- } else {
- fields[IDX_LOCK_INDEX]->set_null();
- }
+ OK(field_store_string(fields[IDX_LOCK_INDEX],
+ row->lock_index));
/* lock_space */
OK(field_store_ulint(fields[IDX_LOCK_SPACE],
@@ -1711,7 +1660,6 @@ i_s_cmp_per_index_fill_low(
for (iter = snap.begin(), i = 0; iter != snap.end(); iter++, i++) {
- char name[192];
dict_index_t* index = dict_index_find_on_id_low(iter->first);
if (index != NULL) {
@@ -1722,38 +1670,39 @@ i_s_cmp_per_index_fill_low(
db_utf8, sizeof(db_utf8),
table_utf8, sizeof(table_utf8));
- field_store_string(fields[IDX_DATABASE_NAME], db_utf8);
- field_store_string(fields[IDX_TABLE_NAME], table_utf8);
- field_store_index_name(fields[IDX_INDEX_NAME],
- index->name);
+ status = field_store_string(fields[IDX_DATABASE_NAME],
+ db_utf8)
+ || field_store_string(fields[IDX_TABLE_NAME],
+ table_utf8)
+ || field_store_string(fields[IDX_INDEX_NAME],
+ index->name);
} else {
/* index not found */
- snprintf(name, sizeof(name),
- "index_id:" IB_ID_FMT, iter->first);
- field_store_string(fields[IDX_DATABASE_NAME],
- "unknown");
- field_store_string(fields[IDX_TABLE_NAME],
- "unknown");
- field_store_string(fields[IDX_INDEX_NAME],
- name);
+ char name[MY_INT64_NUM_DECIMAL_DIGITS
+ + sizeof "index_id: "];
+ fields[IDX_DATABASE_NAME]->set_null();
+ fields[IDX_TABLE_NAME]->set_null();
+ fields[IDX_INDEX_NAME]->set_notnull();
+ status = fields[IDX_INDEX_NAME]->store(
+ name,
+ uint(snprintf(name, sizeof name,
+ "index_id: " IB_ID_FMT,
+ iter->first)),
+ system_charset_info);
}
- fields[IDX_COMPRESS_OPS]->store(
- iter->second.compressed, true);
-
- fields[IDX_COMPRESS_OPS_OK]->store(
- iter->second.compressed_ok, true);
-
- fields[IDX_COMPRESS_TIME]->store(
- iter->second.compressed_usec / 1000000, true);
-
- fields[IDX_UNCOMPRESS_OPS]->store(
- iter->second.decompressed, true);
-
- fields[IDX_UNCOMPRESS_TIME]->store(
- iter->second.decompressed_usec / 1000000, true);
-
- if (schema_table_store_record(thd, table)) {
+ if (status
+ || fields[IDX_COMPRESS_OPS]->store(
+ iter->second.compressed, true)
+ || fields[IDX_COMPRESS_OPS_OK]->store(
+ iter->second.compressed_ok, true)
+ || fields[IDX_COMPRESS_TIME]->store(
+ iter->second.compressed_usec / 1000000, true)
+ || fields[IDX_UNCOMPRESS_OPS]->store(
+ iter->second.decompressed, true)
+ || fields[IDX_UNCOMPRESS_TIME]->store(
+ iter->second.decompressed_usec / 1000000, true)
+ || schema_table_store_record(thd, table)) {
status = 1;
break;
}
@@ -1761,8 +1710,9 @@ i_s_cmp_per_index_fill_low(
threads to proceed. This could eventually result in the
contents of INFORMATION_SCHEMA.innodb_cmp_per_index being
inconsistent, but it is an acceptable compromise. */
- if (i % 1000 == 0) {
+ if (i == 1000) {
mutex_exit(&dict_sys->mutex);
+ i = 0;
mutex_enter(&dict_sys->mutex);
}
}
@@ -4914,9 +4864,11 @@ i_s_innodb_buffer_page_fill(
mutex_enter(&dict_sys->mutex);
- if (const dict_index_t* index =
- dict_index_get_if_in_cache_low(
- page_info->index_id)) {
+ const dict_index_t* index =
+ dict_index_get_if_in_cache_low(
+ page_info->index_id);
+
+ if (index) {
table_name_end = innobase_convert_name(
table_name, sizeof(table_name),
index->table->name.m_name,
@@ -4929,17 +4881,22 @@ i_s_innodb_buffer_page_fill(
table_name_end
- table_name),
system_charset_info)
- || field_store_index_name(
- fields
- [IDX_BUFFER_PAGE_INDEX_NAME],
- index->name);
+ || fields[IDX_BUFFER_PAGE_INDEX_NAME]
+ ->store(index->name,
+ uint(strlen(index->name)),
+ system_charset_info);
}
mutex_exit(&dict_sys->mutex);
OK(ret);
- fields[IDX_BUFFER_PAGE_TABLE_NAME]->set_notnull();
+ if (index) {
+ fields[IDX_BUFFER_PAGE_TABLE_NAME]
+ ->set_notnull();
+ fields[IDX_BUFFER_PAGE_INDEX_NAME]
+ ->set_notnull();
+ }
}
OK(fields[IDX_BUFFER_PAGE_NUM_RECS]->store(
@@ -5630,9 +5587,11 @@ i_s_innodb_buf_page_lru_fill(
mutex_enter(&dict_sys->mutex);
- if (const dict_index_t* index =
- dict_index_get_if_in_cache_low(
- page_info->index_id)) {
+ const dict_index_t* index =
+ dict_index_get_if_in_cache_low(
+ page_info->index_id);
+
+ if (index) {
table_name_end = innobase_convert_name(
table_name, sizeof(table_name),
index->table->name.m_name,
@@ -5645,17 +5604,22 @@ i_s_innodb_buf_page_lru_fill(
table_name_end
- table_name),
system_charset_info)
- || field_store_index_name(
- fields
- [IDX_BUF_LRU_PAGE_INDEX_NAME],
- index->name);
+ || fields[IDX_BUF_LRU_PAGE_INDEX_NAME]
+ ->store(index->name,
+ uint(strlen(index->name)),
+ system_charset_info);
}
mutex_exit(&dict_sys->mutex);
OK(ret);
- fields[IDX_BUF_LRU_PAGE_TABLE_NAME]->set_notnull();
+ if (index) {
+ fields[IDX_BUF_LRU_PAGE_TABLE_NAME]
+ ->set_notnull();
+ fields[IDX_BUF_LRU_PAGE_INDEX_NAME]
+ ->set_notnull();
+ }
}
OK(fields[IDX_BUF_LRU_PAGE_NUM_RECS]->store(
@@ -6601,7 +6565,15 @@ i_s_dict_fill_sys_indexes(
fields = table_to_fill->field;
- OK(field_store_index_name(fields[SYS_INDEX_NAME], index->name));
+ if (*index->name == *TEMP_INDEX_PREFIX_STR) {
+ /* Since TEMP_INDEX_PREFIX_STR is not valid UTF-8, we
+ need to convert it to something else. */
+ *const_cast<char*>(index->name()) = '?';
+ }
+
+ OK(fields[SYS_INDEX_NAME]->store(index->name,
+ uint(strlen(index->name)),
+ system_charset_info));
OK(fields[SYS_INDEX_ID]->store(longlong(index->id), true));
diff --git a/storage/rocksdb/CMakeLists.txt b/storage/rocksdb/CMakeLists.txt
index f90b07ee380..fea81beb745 100644
--- a/storage/rocksdb/CMakeLists.txt
+++ b/storage/rocksdb/CMakeLists.txt
@@ -19,6 +19,9 @@ IF(HAVE_SCHED_GETCPU)
ADD_DEFINITIONS(-DHAVE_SCHED_GETCPU=1 -DROCKSDB_SCHED_GETCPU_PRESENT)
ENDIF()
+IF(WITH_VALGRIND)
+ ADD_DEFINITIONS(-DROCKSDB_VALGRIND_RUN=1)
+ENDIF()
# We've had our builders hang during the build process. This prevents MariaRocks
# to be built on 32 bit intel OS kernels.
diff --git a/storage/rocksdb/mysql-test/rocksdb/r/issue255.result b/storage/rocksdb/mysql-test/rocksdb/r/issue255.result
index 5df1799ee35..c1d9ef4574c 100644
--- a/storage/rocksdb/mysql-test/rocksdb/r/issue255.result
+++ b/storage/rocksdb/mysql-test/rocksdb/r/issue255.result
@@ -46,7 +46,7 @@ pk
127
SHOW TABLE STATUS LIKE 't1';
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment Max_index_length Temporary
-t1 ROCKSDB 10 Fixed 2 15 30 0 0 0 127 NULL NULL NULL latin1_swedish_ci NULL 0 N
+t1 ROCKSDB # Fixed 2 # # # # # 127 NULL NULL NULL latin1_swedish_ci NULL 0 N
INSERT INTO t1 VALUES ();
ERROR 23000: Duplicate entry '127' for key 'PRIMARY'
SELECT * FROM t1;
diff --git a/storage/rocksdb/mysql-test/rocksdb/t/issue255.test b/storage/rocksdb/mysql-test/rocksdb/t/issue255.test
index d75f1e3c2a8..588b28fbee6 100644
--- a/storage/rocksdb/mysql-test/rocksdb/t/issue255.test
+++ b/storage/rocksdb/mysql-test/rocksdb/t/issue255.test
@@ -32,8 +32,8 @@ INSERT INTO t1 VALUES (5);
SHOW TABLE STATUS LIKE 't1';
INSERT INTO t1 VALUES (1000);
---replace_column 3 # 6 # 7 # 8 # 9 # 10 #
SELECT * FROM t1;
+--replace_column 3 # 6 # 7 # 8 # 9 # 10 #
SHOW TABLE STATUS LIKE 't1';
--error ER_DUP_ENTRY