summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2021-08-02 11:41:00 +0200
committerOleksandr Byelkin <sanja@mariadb.com>2021-08-02 11:41:00 +0200
commit7f264997dd21c5126350a9a5f0cc0960afdd1229 (patch)
treeff937359abac9b26e72d96d2b00c93db8c46fff8
parent1423cf5e3dcb3c50047f086a5933fe77006cf242 (diff)
parentb549af69137023ce0f93d312a10d61e467dca07f (diff)
downloadmariadb-git-mariadb-10.3.31.tar.gz
Merge branch '10.2' into 10.3mariadb-10.3.31
-rw-r--r--mysql-test/main/processlist_notembedded.result1
-rw-r--r--mysql-test/main/processlist_notembedded.test7
-rw-r--r--mysql-test/suite/gcol/inc/gcol_partition.inc12
-rw-r--r--mysql-test/suite/gcol/r/gcol_partition_innodb.result11
-rw-r--r--mysql-test/suite/gcol/r/gcol_partition_myisam.result11
-rw-r--r--mysql-test/suite/gcol/r/innodb_virtual_index.result14
-rw-r--r--mysql-test/suite/gcol/t/innodb_virtual_index.test20
-rw-r--r--sql/table.cc15
-rw-r--r--storage/innobase/handler/handler0alter.cc78
9 files changed, 119 insertions, 50 deletions
diff --git a/mysql-test/main/processlist_notembedded.result b/mysql-test/main/processlist_notembedded.result
index 26ca4ef8d0d..46b1f0669cb 100644
--- a/mysql-test/main/processlist_notembedded.result
+++ b/mysql-test/main/processlist_notembedded.result
@@ -28,6 +28,7 @@ id select_type table type possible_keys key key_len ref rows Extra
Warnings:
Note 1003 select sleep(100000)
KILL QUERY $con_id;
+disconnect con1;
#
# End of 10.2 tests
#
diff --git a/mysql-test/main/processlist_notembedded.test b/mysql-test/main/processlist_notembedded.test
index cc577200368..35cac36bb95 100644
--- a/mysql-test/main/processlist_notembedded.test
+++ b/mysql-test/main/processlist_notembedded.test
@@ -1,4 +1,3 @@
-source include/have_debug.inc;
source include/have_debug_sync.inc;
source include/not_embedded.inc;
source include/count_sessions.inc;
@@ -37,8 +36,6 @@ connection default;
SET DEBUG_SYNC = 'RESET';
-source include/wait_until_count_sessions.inc;
-
--echo #
--echo # End of 5.5 tests
--echo #
@@ -52,8 +49,12 @@ source include/wait_until_count_sessions.inc;
--send select sleep(100000)
--connection default
+let $wait_condition= SELECT COUNT(*)=1 FROM information_schema.processlist where state='User sleep';
+source include/wait_condition.inc;
evalp SHOW EXPLAIN FOR $con_id;
evalp KILL QUERY $con_id;
+disconnect con1;
+source include/wait_until_count_sessions.inc;
--echo #
--echo # End of 10.2 tests
diff --git a/mysql-test/suite/gcol/inc/gcol_partition.inc b/mysql-test/suite/gcol/inc/gcol_partition.inc
index 4e4af4f0023..50a743c0153 100644
--- a/mysql-test/suite/gcol/inc/gcol_partition.inc
+++ b/mysql-test/suite/gcol/inc/gcol_partition.inc
@@ -169,3 +169,15 @@ CREATE TABLE t1 (
INSERT INTO t1 () VALUES (),();
UPDATE t1 SET a = 0 WHERE b IS NULL ORDER BY pk;
DROP TABLE t1;
+
+--echo #
+--echo # MDEV-26220 Server crashes with indexed by prefix virtual column
+--echo #
+
+CREATE TABLE t1 (pk INT PRIMARY KEY, a INT, b CHAR(20), c CHAR(20) AS (b),
+ KEY (c(10),a)) PARTITION BY HASH(pk);
+INSERT INTO t1 (pk,a,b) VALUES (1,10,'foo'),(2,11,'baz');
+SELECT a FROM t1;
+
+# Cleanup
+DROP TABLE t1;
diff --git a/mysql-test/suite/gcol/r/gcol_partition_innodb.result b/mysql-test/suite/gcol/r/gcol_partition_innodb.result
index d3f211c9b9a..e61c0a26417 100644
--- a/mysql-test/suite/gcol/r/gcol_partition_innodb.result
+++ b/mysql-test/suite/gcol/r/gcol_partition_innodb.result
@@ -104,6 +104,17 @@ INSERT INTO t1 () VALUES (),();
UPDATE t1 SET a = 0 WHERE b IS NULL ORDER BY pk;
DROP TABLE t1;
#
+# MDEV-26220 Server crashes with indexed by prefix virtual column
+#
+CREATE TABLE t1 (pk INT PRIMARY KEY, a INT, b CHAR(20), c CHAR(20) AS (b),
+KEY (c(10),a)) PARTITION BY HASH(pk);
+INSERT INTO t1 (pk,a,b) VALUES (1,10,'foo'),(2,11,'baz');
+SELECT a FROM t1;
+a
+11
+10
+DROP TABLE t1;
+#
# MDEV-16980 Wrongly set tablename len while opening the
# table for purge thread
#
diff --git a/mysql-test/suite/gcol/r/gcol_partition_myisam.result b/mysql-test/suite/gcol/r/gcol_partition_myisam.result
index 75e216f903b..e54b0ad83c6 100644
--- a/mysql-test/suite/gcol/r/gcol_partition_myisam.result
+++ b/mysql-test/suite/gcol/r/gcol_partition_myisam.result
@@ -101,6 +101,17 @@ KEY (b,d)
INSERT INTO t1 () VALUES (),();
UPDATE t1 SET a = 0 WHERE b IS NULL ORDER BY pk;
DROP TABLE t1;
+#
+# MDEV-26220 Server crashes with indexed by prefix virtual column
+#
+CREATE TABLE t1 (pk INT PRIMARY KEY, a INT, b CHAR(20), c CHAR(20) AS (b),
+KEY (c(10),a)) PARTITION BY HASH(pk);
+INSERT INTO t1 (pk,a,b) VALUES (1,10,'foo'),(2,11,'baz');
+SELECT a FROM t1;
+a
+11
+10
+DROP TABLE t1;
DROP VIEW IF EXISTS v1,v2;
DROP TABLE IF EXISTS t1,t2,t3;
DROP PROCEDURE IF EXISTS p1;
diff --git a/mysql-test/suite/gcol/r/innodb_virtual_index.result b/mysql-test/suite/gcol/r/innodb_virtual_index.result
index 2e9b762500d..aafe65b7fa3 100644
--- a/mysql-test/suite/gcol/r/innodb_virtual_index.result
+++ b/mysql-test/suite/gcol/r/innodb_virtual_index.result
@@ -296,3 +296,17 @@ Table Op Msg_type Msg_text
test.t1 optimize note Table does not support optimize, doing recreate + analyze instead
test.t1 optimize status OK
DROP TABLE t1;
+#
+# MDEV-20154 Assertion `len <= col->len || ((col->mtype) == 5
+# || (col->mtype) == 14)' failed in row_merge_buf_add
+#
+CREATE TABLE t1 (
+a VARCHAR(2500),
+b VARCHAR(2499) AS (a) VIRTUAL
+) ENGINE=InnoDB;
+INSERT INTO t1 (a) VALUES ('foo');
+ALTER TABLE t1 MODIFY a VARCHAR(2600), ALGORITHM=INPLACE;
+ALTER TABLE t1 ADD KEY (b), ALGORITHM=INPLACE;
+# Cleanup
+DROP TABLE t1;
+# End of 10.2 tests
diff --git a/mysql-test/suite/gcol/t/innodb_virtual_index.test b/mysql-test/suite/gcol/t/innodb_virtual_index.test
index 94c3b7f9204..46ffadcdd8c 100644
--- a/mysql-test/suite/gcol/t/innodb_virtual_index.test
+++ b/mysql-test/suite/gcol/t/innodb_virtual_index.test
@@ -314,3 +314,23 @@ CREATE TABLE t1 (id INT PRIMARY KEY, a CHAR(3),
INSERT INTO t1 (id,a) VALUES (1,'foo');
OPTIMIZE TABLE t1;
DROP TABLE t1;
+
+--echo #
+--echo # MDEV-20154 Assertion `len <= col->len || ((col->mtype) == 5
+--echo # || (col->mtype) == 14)' failed in row_merge_buf_add
+--echo #
+
+CREATE TABLE t1 (
+ a VARCHAR(2500),
+ b VARCHAR(2499) AS (a) VIRTUAL
+) ENGINE=InnoDB;
+INSERT INTO t1 (a) VALUES ('foo');
+
+ALTER TABLE t1 MODIFY a VARCHAR(2600), ALGORITHM=INPLACE;
+ALTER TABLE t1 ADD KEY (b), ALGORITHM=INPLACE;
+
+--echo # Cleanup
+DROP TABLE t1;
+
+--echo # End of 10.2 tests
+
diff --git a/sql/table.cc b/sql/table.cc
index 00db9d7135a..be734b734bc 100644
--- a/sql/table.cc
+++ b/sql/table.cc
@@ -3436,6 +3436,21 @@ enum open_frm_error open_table_from_share(THD *thd, TABLE_SHARE *share,
/* Update to use trigger fields */
switch_defaults_to_nullable_trigger_fields(outparam);
+
+ for (uint k= 0; k < share->keys; k++)
+ {
+ KEY &key_info= outparam->key_info[k];
+ uint parts = (share->use_ext_keys ? key_info.ext_key_parts :
+ key_info.user_defined_key_parts);
+ for (uint p= 0; p < parts; p++)
+ {
+ KEY_PART_INFO &kp= key_info.key_part[p];
+ if (kp.field != outparam->field[kp.fieldnr - 1])
+ {
+ kp.field->vcol_info = outparam->field[kp.fieldnr - 1]->vcol_info;
+ }
+ }
+ }
}
#ifdef WITH_PARTITION_STORAGE_ENGINE
diff --git a/storage/innobase/handler/handler0alter.cc b/storage/innobase/handler/handler0alter.cc
index 69a962564d4..ff7c355f2dd 100644
--- a/storage/innobase/handler/handler0alter.cc
+++ b/storage/innobase/handler/handler0alter.cc
@@ -6245,6 +6245,10 @@ alter_fill_stored_column(
}
}
+static bool alter_templ_needs_rebuild(const TABLE* altered_table,
+ const Alter_inplace_info* ha_alter_info,
+ const dict_table_t* table);
+
/** Allows InnoDB to update internal structures with concurrent
writes blocked (provided that check_if_supported_inplace_alter()
@@ -6394,11 +6398,7 @@ ha_innobase::prepare_inplace_alter_table(
ha_alter_info->key_count)) {
err_exit_no_heap:
DBUG_ASSERT(m_prebuilt->trx->dict_operation_lock_mode == 0);
- if (ha_alter_info->handler_flags & ~INNOBASE_INPLACE_IGNORE) {
-
- online_retry_drop_indexes(
- m_prebuilt->table, m_user_thd);
- }
+ online_retry_drop_indexes(m_prebuilt->table, m_user_thd);
DBUG_RETURN(true);
}
@@ -6849,9 +6849,9 @@ err_exit:
== ALTER_OPTIONS
&& !alter_options_need_rebuild(ha_alter_info, table))) {
+ ha_innobase_inplace_ctx *ctx = NULL;
if (heap) {
- ha_alter_info->handler_ctx
- = new ha_innobase_inplace_ctx(
+ ctx = new ha_innobase_inplace_ctx(
m_prebuilt,
drop_index, n_drop_index,
rename_index, n_rename_index,
@@ -6864,15 +6864,11 @@ err_exit:
|| !thd_is_strict_mode(m_user_thd)),
alt_opt.page_compressed,
alt_opt.page_compression_level);
+ ha_alter_info->handler_ctx = ctx;
}
DBUG_ASSERT(m_prebuilt->trx->dict_operation_lock_mode == 0);
- if (ha_alter_info->handler_flags & ~(INNOBASE_INPLACE_IGNORE)) {
-
- online_retry_drop_indexes(
- m_prebuilt->table, m_user_thd);
-
- }
+ online_retry_drop_indexes(m_prebuilt->table, m_user_thd);
if ((ha_alter_info->handler_flags
& ALTER_DROP_VIRTUAL_COLUMN)
@@ -6887,6 +6883,24 @@ err_exit:
DBUG_RETURN(true);
}
+ if (!(ha_alter_info->handler_flags & INNOBASE_ALTER_DATA)
+ && alter_templ_needs_rebuild(altered_table, ha_alter_info,
+ ctx->new_table)
+ && ctx->new_table->n_v_cols > 0) {
+ /* Changing maria record structure may end up here only
+ if virtual columns were altered. In this case, however,
+ vc_templ should be rebuilt. Since we don't actually
+ change any stored data, we can just dispose vc_templ;
+ it will be recreated on next ha_innobase::open(). */
+
+ DBUG_ASSERT(ctx->new_table == ctx->old_table);
+
+ dict_free_vc_templ(ctx->new_table->vc_templ);
+ UT_DELETE(ctx->new_table->vc_templ);
+
+ ctx->new_table->vc_templ = NULL;
+ }
+
DBUG_RETURN(false);
}
@@ -7000,35 +7014,6 @@ found_col:
add_fts_doc_id_idx));
}
-/** Check that the column is part of a virtual index(index contains
-virtual column) in the table
-@param[in] table Table containing column
-@param[in] col column to be checked
-@return true if this column is indexed with other virtual columns */
-static
-bool
-dict_col_in_v_indexes(
- dict_table_t* table,
- dict_col_t* col)
-{
- for (dict_index_t* index = dict_table_get_next_index(
- dict_table_get_first_index(table)); index != NULL;
- index = dict_table_get_next_index(index)) {
- if (!dict_index_has_virtual(index)) {
- continue;
- }
- for (ulint k = 0; k < index->n_fields; k++) {
- dict_field_t* field
- = dict_index_get_nth_field(index, k);
- if (field->col->ind == col->ind) {
- return(true);
- }
- }
- }
-
- return(false);
-}
-
/* Check whether a columnn length change alter operation requires
to rebuild the template.
@param[in] altered_table TABLE object for new version of table.
@@ -7040,9 +7025,9 @@ to rebuild the template.
static
bool
alter_templ_needs_rebuild(
- TABLE* altered_table,
- Alter_inplace_info* ha_alter_info,
- dict_table_t* table)
+ const TABLE* altered_table,
+ const Alter_inplace_info* ha_alter_info,
+ const dict_table_t* table)
{
ulint i = 0;
List_iterator_fast<Create_field> cf_it(
@@ -7054,8 +7039,7 @@ alter_templ_needs_rebuild(
for (ulint j=0; j < table->n_cols; j++) {
dict_col_t* cols
= dict_table_get_nth_col(table, j);
- if (cf->length > cols->len
- && dict_col_in_v_indexes(table, cols)) {
+ if (cf->length > cols->len) {
return(true);
}
}