diff --git a/cmake/submodules.cmake b/cmake/submodules.cmake index 0eae3e1176b..91f9f9e487a 100644 --- a/cmake/submodules.cmake +++ b/cmake/submodules.cmake @@ -28,7 +28,7 @@ IF(GIT_EXECUTABLE AND EXISTS "${CMAKE_SOURCE_DIR}/.git") RESULT_VARIABLE update_result) ELSE() MESSAGE(STATUS "Updating submodules") - EXECUTE_PROCESS(COMMAND "${GIT_EXECUTABLE}" submodule update --init --recursive + EXECUTE_PROCESS(COMMAND "${GIT_EXECUTABLE}" submodule update --init --recursive --depth=1 WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" RESULT_VARIABLE update_result) ENDIF() diff --git a/mysql-test/suite/funcs_1/r/is_tables_is_embedded.result b/mysql-test/suite/funcs_1/r/is_tables_is_embedded.result index e9ce9b91d08..597eb002841 100644 --- a/mysql-test/suite/funcs_1/r/is_tables_is_embedded.result +++ b/mysql-test/suite/funcs_1/r/is_tables_is_embedded.result @@ -458,6 +458,8 @@ TABLE_COLLATION utf8_general_ci CHECKSUM NULL CREATE_OPTIONS #CO# TABLE_COMMENT #TC# +MAX_INDEX_LENGTH #MIL# +TEMPORARY Y user_comment Separator ----------------------------------------------------- TABLE_CATALOG def @@ -831,6 +833,8 @@ TABLE_COLLATION utf8_general_ci CHECKSUM NULL CREATE_OPTIONS #CO# TABLE_COMMENT #TC# +MAX_INDEX_LENGTH #MIL# +TEMPORARY Y user_comment Separator ----------------------------------------------------- TABLE_CATALOG def @@ -1570,6 +1574,8 @@ TABLE_COLLATION utf8_general_ci CHECKSUM NULL CREATE_OPTIONS #CO# TABLE_COMMENT #TC# +MAX_INDEX_LENGTH #MIL# +TEMPORARY Y user_comment Separator ----------------------------------------------------- TABLE_CATALOG def @@ -1943,6 +1949,8 @@ TABLE_COLLATION utf8_general_ci CHECKSUM NULL CREATE_OPTIONS #CO# TABLE_COMMENT #TC# +MAX_INDEX_LENGTH #MIL# +TEMPORARY Y user_comment Separator ----------------------------------------------------- TABLE_CATALOG def diff --git a/mysql-test/suite/innodb/r/instant_alter_debug,redundant.rdiff b/mysql-test/suite/innodb/r/instant_alter_debug,redundant.rdiff new file mode 100644 index 00000000000..eafa8e5725d --- /dev/null +++ b/mysql-test/suite/innodb/r/instant_alter_debug,redundant.rdiff @@ -0,0 +1,6 @@ +@@ -509,4 +509,4 @@ + FROM information_schema.global_status + WHERE variable_name = 'innodb_instant_alter_column'; + instants +-35 ++36 diff --git a/mysql-test/suite/innodb/r/instant_alter_debug.result b/mysql-test/suite/innodb/r/instant_alter_debug.result index 72b47bc6e20..fa7ebabd0af 100644 --- a/mysql-test/suite/innodb/r/instant_alter_debug.result +++ b/mysql-test/suite/innodb/r/instant_alter_debug.result @@ -443,6 +443,27 @@ SET GLOBAL innodb_limit_optimistic_insert_debug=@save_limit; SELECT * FROM t1; c2 c DROP TABLE t1; +# +# MDEV-25236 Online log apply fails for ROW_FORMAT=REDUNDANT tables +# +CREATE TABLE t1 +(a INT NOT NULL, b INT, c INT, d INT, e INT, f INT, g INT, h INT, i TEXT) +ENGINE=InnoDB; +ALTER TABLE t1 MODIFY a INT NULL; +SET DEBUG_SYNC='innodb_inplace_alter_table_enter SIGNAL alter WAIT_FOR go'; +ALTER TABLE t1 ADD PRIMARY KEY (a); +connect con1,localhost,root,,; +set DEBUG_SYNC='now WAIT_FOR alter'; +BEGIN; +INSERT INTO t1 SET a=0, i=REPEAT('1', 10000); +ROLLBACK; +set DEBUG_SYNC='now SIGNAL go'; +connection default; +disconnect con1; +SELECT * FROM t1; +a b c d e f g h i +DROP TABLE t1; +SET DEBUG_SYNC=RESET; # End of 10.4 tests # # MDEV-22867 Assertion instant.n_core_fields == n_core_fields diff --git a/mysql-test/suite/innodb/t/instant_alter_debug.test b/mysql-test/suite/innodb/t/instant_alter_debug.test index dcce4b29119..b553dc3ad74 100644 --- a/mysql-test/suite/innodb/t/instant_alter_debug.test +++ b/mysql-test/suite/innodb/t/instant_alter_debug.test @@ -512,6 +512,32 @@ SET GLOBAL innodb_limit_optimistic_insert_debug=@save_limit; SELECT * FROM t1; DROP TABLE t1; +--echo # +--echo # MDEV-25236 Online log apply fails for ROW_FORMAT=REDUNDANT tables +--echo # + +CREATE TABLE t1 +(a INT NOT NULL, b INT, c INT, d INT, e INT, f INT, g INT, h INT, i TEXT) +ENGINE=InnoDB; + +ALTER TABLE t1 MODIFY a INT NULL; + +SET DEBUG_SYNC='innodb_inplace_alter_table_enter SIGNAL alter WAIT_FOR go'; +send ALTER TABLE t1 ADD PRIMARY KEY (a); +connect(con1,localhost,root,,); +set DEBUG_SYNC='now WAIT_FOR alter'; +BEGIN; +INSERT INTO t1 SET a=0, i=REPEAT('1', 10000); +ROLLBACK; +set DEBUG_SYNC='now SIGNAL go'; +connection default; +reap; + +disconnect con1; +SELECT * FROM t1; +DROP TABLE t1; +SET DEBUG_SYNC=RESET; + --echo # End of 10.4 tests --echo # diff --git a/storage/innobase/rem/rem0rec.cc b/storage/innobase/rem/rem0rec.cc index c4886101499..902f3f2d5ca 100644 --- a/storage/innobase/rem/rem0rec.cc +++ b/storage/innobase/rem/rem0rec.cc @@ -248,6 +248,8 @@ enum rec_leaf_format { in ROW_FORMAT=COMPACT,DYNAMIC,COMPRESSED. This is a special case of rec_init_offsets() and rec_get_offsets_func(). @tparam mblob whether the record includes a metadata BLOB +@tparam redundant_temp whether the record belongs to a temporary file + of a ROW_FORMAT=REDUNDANT table @param[in] rec leaf-page record @param[in] index the index that the record belongs in @param[in] n_core number of core fields (index->n_core_fields) @@ -255,7 +257,7 @@ This is a special case of rec_init_offsets() and rec_get_offsets_func(). NULL to refer to index->fields[].col->def_val @param[in,out] offsets offsets, with valid rec_offs_n_fields(offsets) @param[in] format record format */ -template +template static inline void rec_init_offsets_comp_ordinary( @@ -286,7 +288,9 @@ rec_init_offsets_comp_ordinary( const unsigned n_core_null_bytes = UNIV_UNLIKELY(index->n_core_fields != n_core) ? UT_BITS_IN_BYTES(unsigned(index->get_n_nullable(n_core))) - : index->n_core_null_bytes; + : (redundant_temp + ? UT_BITS_IN_BYTES(index->n_nullable) + : index->n_core_null_bytes); if (mblob) { ut_ad(index->table->instant); @@ -1121,8 +1125,8 @@ rec_get_nth_field_offs_old( } /** Determine the size of a data tuple prefix in ROW_FORMAT=COMPACT. -@tparam mblob whether the record includes a metadata BLOB -@tparam redundant_temp whether to use the ROW_FORMAT=REDUNDANT format +@tparam mblob whether the record includes a metadata BLOB +@tparam redundant_temp whether to use the ROW_FORMAT=REDUNDANT format @param[in] index record descriptor; dict_table_is_comp() is assumed to hold, even if it doesn't @param[in] dfield array of data fields @@ -1169,7 +1173,9 @@ rec_get_converted_size_comp_prefix_low( - n_core_fields); } else { ut_ad(n_fields <= n_core_fields); - extra_size += index->n_core_null_bytes; + extra_size += redundant_temp + ? UT_BITS_IN_BYTES(index->n_nullable) + : index->n_core_null_bytes; } ulint data_size = 0; @@ -1811,10 +1817,19 @@ rec_init_offsets_temp( if it was emptied during an ALTER TABLE operation. */ ut_ad(index->n_core_fields == n_core || !index->is_instant()); ut_ad(index->n_core_fields >= n_core); - rec_init_offsets_comp_ordinary(rec, index, offsets, n_core, def_val, - status == REC_STATUS_INSTANT - ? REC_LEAF_TEMP_INSTANT - : REC_LEAF_TEMP); + if (index->table->not_redundant()) { + rec_init_offsets_comp_ordinary( + rec, index, offsets, n_core, def_val, + status == REC_STATUS_INSTANT + ? REC_LEAF_TEMP_INSTANT + : REC_LEAF_TEMP); + } else { + rec_init_offsets_comp_ordinary( + rec, index, offsets, n_core, def_val, + status == REC_STATUS_INSTANT + ? REC_LEAF_TEMP_INSTANT + : REC_LEAF_TEMP); + } } /** Determine the offset to each field in temporary file. @@ -1829,9 +1844,15 @@ rec_init_offsets_temp( rec_offs* offsets) { ut_ad(!index->is_instant()); - rec_init_offsets_comp_ordinary(rec, index, offsets, - index->n_core_fields, NULL, - REC_LEAF_TEMP); + if (index->table->not_redundant()) { + rec_init_offsets_comp_ordinary( + rec, index, offsets, + index->n_core_fields, NULL, REC_LEAF_TEMP); + } else { + rec_init_offsets_comp_ordinary( + rec, index, offsets, + index->n_core_fields, NULL, REC_LEAF_TEMP); + } } /** Convert a data tuple prefix to the temporary file format.