diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2018-05-24 11:27:15 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2018-05-24 11:27:15 +0300 |
commit | 6686dfcbbf74159a47cb1b3ffd36daed8a2fa420 (patch) | |
tree | 731e2288bfe7a903671a011d55c9de1ba863d779 | |
parent | a80e41043876b486d94a641e98ce2e6057c0a65e (diff) | |
parent | 52df8040264cc6f3226e78d371e4c1dd88dd22b6 (diff) | |
download | mariadb-git-6686dfcbbf74159a47cb1b3ffd36daed8a2fa420.tar.gz |
Merge 10.2 into 10.3
-rw-r--r-- | mysql-test/main/check.result | 33 | ||||
-rw-r--r-- | mysql-test/main/check.test | 24 | ||||
-rw-r--r-- | mysql-test/main/partition_open_files_limit.test | 4 | ||||
-rw-r--r-- | sql/sql_table.cc | 5 | ||||
-rw-r--r-- | storage/innobase/dict/dict0load.cc | 5 | ||||
-rw-r--r-- | storage/innobase/handler/handler0alter.cc | 2 | ||||
-rw-r--r-- | storage/innobase/handler/i_s.cc | 178 | ||||
-rw-r--r-- | storage/rocksdb/CMakeLists.txt | 3 | ||||
-rw-r--r-- | storage/rocksdb/mysql-test/rocksdb/r/issue255.result | 2 | ||||
-rw-r--r-- | storage/rocksdb/mysql-test/rocksdb/t/issue255.test | 2 |
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 |