diff options
author | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2022-04-13 18:06:33 +0530 |
---|---|---|
committer | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2022-04-20 19:55:17 +0530 |
commit | 372b0e6355fbb6b7dc490b64da13e784c09aeec8 (patch) | |
tree | d001bb5d152937d69f696628df9084deb16986ee | |
parent | 84b135065cc074af00fb34355e2f9954cae5ec11 (diff) | |
download | mariadb-git-372b0e6355fbb6b7dc490b64da13e784c09aeec8.tar.gz |
MDEV-20194 Warnings inconsistently issued upon CHECK on table from older versions
The following condition has to added:
1) InnoDB fails to include the offset of the node pointer field
in non-leaf record for redundant row format.
2) If the Fixed length field does have only prefix length then
calculate the field maximum size as prefix length.
- Added the test case to test (2) and to check maximum number of
fields can exist in the index.
-rw-r--r-- | mysql-test/suite/innodb/r/row_size_error_log_warnings_3.result | 54 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/row_size_error_log_warnings_3.test | 55 | ||||
-rw-r--r-- | storage/innobase/handler/ha_innodb.cc | 6 |
3 files changed, 106 insertions, 9 deletions
diff --git a/mysql-test/suite/innodb/r/row_size_error_log_warnings_3.result b/mysql-test/suite/innodb/r/row_size_error_log_warnings_3.result index fba209dd2b5..d00ac938310 100644 --- a/mysql-test/suite/innodb/r/row_size_error_log_warnings_3.result +++ b/mysql-test/suite/innodb/r/row_size_error_log_warnings_3.result @@ -15,31 +15,71 @@ col_1 TEXT ,col_11 TEXT ) ENGINE=INNODB ROW_FORMAT=COMPACT; Warnings: -Warning 139 Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. TRUNCATE TABLE t1; Warnings: -Warning 139 Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. OPTIMIZE TABLE t1; Table Op Msg_type Msg_text test.t1 optimize note Table does not support optimize, doing recreate + analyze instead test.t1 optimize status OK Warnings: -Warning 139 Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ALTER TABLE t1 FORCE; Warnings: -Warning 139 Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. SET innodb_strict_mode = ON; TRUNCATE TABLE t1; Warnings: -Warning 139 Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. OPTIMIZE TABLE t1; Table Op Msg_type Msg_text test.t1 optimize note Table does not support optimize, doing recreate + analyze instead test.t1 optimize status OK Warnings: -Warning 139 Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. ALTER TABLE t1 FORCE; Warnings: -Warning 139 Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. +Warning 139 Row size too large (> NNNN). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. DROP TABLE t1; SET @@global.log_warnings = 2; +# +# MDEV-20194 Warnings inconsistently issued upon CHECK on +# table from older versions +# +set global innodb_compression_level=1; +CREATE TABLE t1( +f1 INT, f2 CHAR(200), f3 CHAR(200), +f4 CHAR(200), f5 CHAR(200), f6 CHAR(200), +f7 CHAR(200), f8 CHAR(200), f9 CHAR(200), +f10 CHAR(200), PRIMARY KEY(f1, f2(20), f3(20), f4(20)) +) ROW_FORMAT=COMPRESSED, ENGINE=InnoDB; +INSERT INTO t1 SELECT seq, repeat('a', 200), repeat('b', 200), +repeat('c', 200), repeat('d', 200), +repeat('d', 200), repeat('e', 200), +repeat('e', 200), repeat('f', 200), +repeat('g', 200) FROM seq_1_to_20; +DROP TABLE t1; +set global innodb_compression_level=default; +CREATE TABLE t1(f1 char(200), f2 char(200), f3 char(200), +f4 char(200), f5 char(200), f6 char(200), +f7 char(200), f8 char(200), f9 char(200), +f10 char(200), f11 char(200), f12 char(200), +f13 char(200), f14 char(200), f15 char(200), +f16 char(200), f17 char(200), f18 char(200), +f19 char(200), f20 char(200), f21 char(200), +f22 char(200), f23 char(200), f24 char(200), +f25 char(200), f26 char(200), f27 char(200), +f28 char(200), f29 char(200), f30 char(200), +f31 char(200), f32 char(200), f33 char(200), +primary key(f1(10), f2(10), f3(10), f4(10), +f5(10), f6(10), f7(10), f8(10), +f9(10), f10(10), f11(10), f12(10), +f13(10), f14(10), f15(10), f16(10), +f17(10), f18(10), f19(10), f20(10), +f21(10), f22(10), f23(10), f24(10), +f25(10), f26(10), f27(10), f28(10), +f29(10), f30(10), f31(10), f32(10), +f33(10))) +ENGINE=InnoDB; +ERROR 42000: Too many key parts specified; max 32 parts allowed diff --git a/mysql-test/suite/innodb/t/row_size_error_log_warnings_3.test b/mysql-test/suite/innodb/t/row_size_error_log_warnings_3.test index af6c15e0e6b..209c86a29b5 100644 --- a/mysql-test/suite/innodb/t/row_size_error_log_warnings_3.test +++ b/mysql-test/suite/innodb/t/row_size_error_log_warnings_3.test @@ -1,10 +1,14 @@ --source include/have_innodb.inc +--source include/have_sequence.inc +--source include/innodb_page_size_small.inc call mtr.add_suppression("InnoDB: Cannot add field .* in table .* because after adding it, the row size is .* which is greater than maximum allowed size (.*) for a record on index leaf page."); SET innodb_strict_mode = 0; SET @@global.log_warnings = 3; +# Check the Warning | 139 | Row size too large (> 16318) +--replace_regex /> [0-9]+/> NNNN/ CREATE TABLE t1 ( col_1 TEXT ,col_2 TEXT @@ -19,14 +23,65 @@ CREATE TABLE t1 ( ,col_11 TEXT ) ENGINE=INNODB ROW_FORMAT=COMPACT; --enable_warnings +--replace_regex /> [0-9]+/> NNNN/ TRUNCATE TABLE t1; +--replace_regex /> [0-9]+/> NNNN/ OPTIMIZE TABLE t1; +--replace_regex /> [0-9]+/> NNNN/ ALTER TABLE t1 FORCE; SET innodb_strict_mode = ON; +--replace_regex /> [0-9]+/> NNNN/ TRUNCATE TABLE t1; +--replace_regex /> [0-9]+/> NNNN/ OPTIMIZE TABLE t1; +--replace_regex /> [0-9]+/> NNNN/ ALTER TABLE t1 FORCE; DROP TABLE t1; --disable_warnings SET @@global.log_warnings = 2; + +--echo # +--echo # MDEV-20194 Warnings inconsistently issued upon CHECK on +--echo # table from older versions +--echo # +set global innodb_compression_level=1; +CREATE TABLE t1( + f1 INT, f2 CHAR(200), f3 CHAR(200), + f4 CHAR(200), f5 CHAR(200), f6 CHAR(200), + f7 CHAR(200), f8 CHAR(200), f9 CHAR(200), + f10 CHAR(200), PRIMARY KEY(f1, f2(20), f3(20), f4(20)) + ) ROW_FORMAT=COMPRESSED, ENGINE=InnoDB; + +INSERT INTO t1 SELECT seq, repeat('a', 200), repeat('b', 200), + repeat('c', 200), repeat('d', 200), + repeat('d', 200), repeat('e', 200), + repeat('e', 200), repeat('f', 200), + repeat('g', 200) FROM seq_1_to_20; +DROP TABLE t1; +set global innodb_compression_level=default; + +# Maximum field in the index + +--error ER_TOO_MANY_KEY_PARTS +CREATE TABLE t1(f1 char(200), f2 char(200), f3 char(200), + f4 char(200), f5 char(200), f6 char(200), + f7 char(200), f8 char(200), f9 char(200), + f10 char(200), f11 char(200), f12 char(200), + f13 char(200), f14 char(200), f15 char(200), + f16 char(200), f17 char(200), f18 char(200), + f19 char(200), f20 char(200), f21 char(200), + f22 char(200), f23 char(200), f24 char(200), + f25 char(200), f26 char(200), f27 char(200), + f28 char(200), f29 char(200), f30 char(200), + f31 char(200), f32 char(200), f33 char(200), + primary key(f1(10), f2(10), f3(10), f4(10), + f5(10), f6(10), f7(10), f8(10), + f9(10), f10(10), f11(10), f12(10), + f13(10), f14(10), f15(10), f16(10), + f17(10), f18(10), f19(10), f20(10), + f21(10), f22(10), f23(10), f24(10), + f25(10), f26(10), f27(10), f28(10), + f29(10), f30(10), f31(10), f32(10), + f33(10))) + ENGINE=InnoDB; diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 204f50b22c7..e28b8df5c61 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -12641,7 +12641,6 @@ bool create_table_info_t::row_size_is_acceptable( return true; } -/* FIXME: row size check has some flaws and should be improved */ dict_index_t::record_size_info_t dict_index_t::record_size_info() const { ut_ad(!(type & DICT_FTS)); @@ -12732,6 +12731,8 @@ dict_index_t::record_size_info_t dict_index_t::record_size_info() const { /* dict_index_add_col() should guarantee this */ ut_ad(!f.prefix_len || f.fixed_len == f.prefix_len); + if (f.prefix_len) + field_max_size= f.prefix_len; /* Fixed lengths are not encoded in ROW_FORMAT=COMPACT. */ goto add_field_size; @@ -12785,7 +12786,8 @@ dict_index_t::record_size_info_t dict_index_t::record_size_info() const unique columns, result.shortest_size equals the size of the node pointer record minus the node pointer column. */ if (i + 1 == dict_index_get_n_unique_in_tree(this) && - result.shortest_size + REC_NODE_PTR_SIZE >= page_ptr_max) + result.shortest_size + REC_NODE_PTR_SIZE + (comp ? 0 : 2) >= + page_ptr_max) { result.set_too_big(i); } |