Commit 6686dfcb authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.2 into 10.3

parents a80e4104 52df8040
......@@ -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;
......@@ -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;
......@@ -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)
......
......@@ -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();
......
......@@ -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;
}
}
......
......@@ -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. */
......
......@@ -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));
......
......@@ -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.
......
......@@ -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;
......
......@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment