Skip to content

Commit

Permalink
MDEV-11828: innodb_page_size=64k must reject ROW_FORMAT=REDUNDANT rec…
Browse files Browse the repository at this point in the history
…ords longer than 16383 bytes

In all InnoDB row formats, the pointers or lengths stored in the record
header can be at most 14 bits, that is, count up to 16383.
In ROW_FORMAT=REDUNDANT, this limits the maximum possible record length
to 16383 bytes. In other ROW_FORMAT, it could merely limit the maximum
length of variable-length fields.

When MySQL 5.7 introduced innodb_page_size=32k and 64k, the maximum
record length was limited to 16383 bytes (I hope 16383, not 16384,
to be able to distinguish from a record whose length is 0 bytes).
This change is present in MariaDB Server 10.2.

btr_cur_optimistic_update(): Restrict maximum record size to 16K-1
for REDUNDANT and 64K page size.

dict_index_too_big_for_tree(): The maximum allowed record size
is half a B-tree page or 16K(-1 for REDUNDANT) for 64K page size.

convert_error_code_to_mysql(): Fix error message to print
correct limits.

my_error_innodb(): Fix error message to print correct limits.

page_zip_rec_needs_ext() : record size was already restricted to 16K.
Restrict REDUNDANT to 16K-1.

rem0rec.h: Introduce REDUNDANT_REC_MAX_DATA_SIZE (16K-1)
and COMPRESSED_REC_MAX_DATA_SIZE (16K).
  • Loading branch information
Jan Lindström committed Jul 12, 2017
1 parent 9e11e05 commit 9284e8b
Show file tree
Hide file tree
Showing 24 changed files with 2,170 additions and 198 deletions.
96 changes: 21 additions & 75 deletions mysql-test/suite/innodb/r/innodb-64k.result
Original file line number Diff line number Diff line change
Expand Up @@ -11,80 +11,26 @@ variable_value
65536
# Test 4) The maximum row size is dependent upon the page size.
SET SESSION innodb_strict_mode = ON;
CREATE TABLE t1 (
c01 char(200), c02 char(200), c03 char(200), c04 char(200), c05 char(200),
c06 char(200), c07 char(200), c08 char(200), c09 char(200), c10 char(200),
c11 char(200), c12 char(200), c13 char(200), c14 char(200), c15 char(200),
c16 char(200), c17 char(200), c18 char(200), c19 char(200), c20 char(200),
c21 char(200), c22 char(200), c23 char(200), c24 char(200), c25 char(200),
c26 char(200), c27 char(200), c28 char(200), c29 char(200), c30 char(200),
c31 char(200), c32 char(200), c33 char(200), c34 char(200), c35 char(200),
c36 char(200), c37 char(200), c38 char(200), c39 char(200), c40 char(200),
c41 char(200), c42 char(200), c43 char(200), c44 char(200), c45 char(200),
c46 char(200), c47 char(200), c48 char(200), c49 char(200), c50 char(200),
c51 char(200), c52 char(200), c53 char(200), c54 char(200), c55 char(200),
c56 char(200), c57 char(200), c58 char(200), c59 char(200), c60 char(200),
c61 char(200), c62 char(200), c63 char(200), c64 char(200), c65 char(200),
c66 char(200), c67 char(200), c68 char(200), c69 char(200), c70 char(200),
c71 char(200), c72 char(200), c73 char(200), c74 char(200), c75 char(200),
c76 char(200), c77 char(200), c78 char(200), c79 char(200), c80 char(200),
c101 char(200), c102 char(200), c103 char(200), c104 char(200), c105 char(200),
c106 char(200), c107 char(200), c108 char(200), c109 char(200), c110 char(200),
c111 char(200), c112 char(200), c113 char(200), c114 char(200), c115 char(200),
c116 char(200), c117 char(200), c118 char(200), c119 char(200), c120 char(200),
c121 char(200), c122 char(200), c123 char(200), c124 char(200), c125 char(200),
c126 char(200), c127 char(200), c128 char(200), c129 char(200), c130 char(200),
c131 char(200), c132 char(200), c133 char(200), c134 char(200), c135 char(200),
c136 char(200), c137 char(200), c138 char(200), c139 char(200), c140 char(200),
c141 char(200), c142 char(200), c143 char(200), c144 char(200), c145 char(200),
c146 char(200), c147 char(200), c148 char(200), c149 char(200), c150 char(200),
c151 char(200), c152 char(200), c153 char(200), c154 char(200), c155 char(200),
c156 char(200), c157 char(200), c158 char(200), c159 char(200), c160 char(200),
c161 char(200), c162 char(200), c163 char(200), c164 char(200), c165 char(200),
c166 char(200), c167 char(200), c168 char(200), c169 char(200), c170 char(200),
c171 char(200), c172 char(200), c173 char(200), c174 char(200), c175 char(200),
c176 char(200), c177 char(200), c178 char(200), c179 char(200), c180 char(200),
c190 char(200),
c81 char(143)
) ROW_FORMAT=redundant;
DROP TABLE t1;
CREATE TABLE t1 (
c01 char(200), c02 char(200), c03 char(200), c04 char(200), c05 char(200),
c06 char(200), c07 char(200), c08 char(200), c09 char(200), c10 char(200),
c11 char(200), c12 char(200), c13 char(200), c14 char(200), c15 char(200),
c16 char(200), c17 char(200), c18 char(200), c19 char(200), c20 char(200),
c21 char(200), c22 char(200), c23 char(200), c24 char(200), c25 char(200),
c26 char(200), c27 char(200), c28 char(200), c29 char(200), c30 char(200),
c31 char(200), c32 char(200), c33 char(200), c34 char(200), c35 char(200),
c36 char(200), c37 char(200), c38 char(200), c39 char(200), c40 char(200),
c41 char(200), c42 char(200), c43 char(200), c44 char(200), c45 char(200),
c46 char(200), c47 char(200), c48 char(200), c49 char(200), c50 char(200),
c51 char(200), c52 char(200), c53 char(200), c54 char(200), c55 char(200),
c56 char(200), c57 char(200), c58 char(200), c59 char(200), c60 char(200),
c61 char(200), c62 char(200), c63 char(200), c64 char(200), c65 char(200),
c66 char(200), c67 char(200), c68 char(200), c69 char(200), c70 char(200),
c71 char(200), c72 char(200), c73 char(200), c74 char(200), c75 char(200),
c76 char(200), c77 char(200), c78 char(200), c79 char(200), c80 char(200),
c101 char(200), c102 char(200), c103 char(200), c104 char(200), c105 char(200),
c106 char(200), c107 char(200), c108 char(200), c109 char(200), c110 char(200),
c111 char(200), c112 char(200), c113 char(200), c114 char(200), c115 char(200),
c116 char(200), c117 char(200), c118 char(200), c119 char(200), c120 char(200),
c121 char(200), c122 char(200), c123 char(200), c124 char(200), c125 char(200),
c126 char(200), c127 char(200), c128 char(200), c129 char(200), c130 char(200),
c131 char(200), c132 char(200), c133 char(200), c134 char(200), c135 char(200),
c136 char(200), c137 char(200), c138 char(200), c139 char(200), c140 char(200),
c141 char(200), c142 char(200), c143 char(200), c144 char(200), c145 char(200),
c146 char(200), c147 char(200), c148 char(200), c149 char(200), c150 char(200),
c151 char(200), c152 char(200), c153 char(200), c154 char(200), c155 char(200),
c156 char(200), c157 char(200), c158 char(200), c159 char(200), c160 char(200),
c161 char(200), c162 char(200), c163 char(200), c164 char(200), c165 char(200),
c166 char(200), c167 char(200), c168 char(200), c169 char(200), c170 char(200),
c171 char(200), c172 char(200), c173 char(200), c174 char(200), c175 char(200),
c176 char(200), c177 char(200), c178 char(200), c179 char(200), c180 char(200),
c190 char(200),
c81 char(144)
) ROW_FORMAT=redundant;
ERROR 42000: Row size too large (> max_row_size). 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.
SELECT @@innodb_strict_mode;
@@innodb_strict_mode
1
CREATE TABLE tab5(col1 CHAR (255), col2 CHAR (255), col3 CHAR(255),col4 CHAR(255), col5 CHAR(255),
col6 CHAR(255), col7 CHAR(255), col8 CHAR(255), col9 CHAR(255),col10 CHAR(255), col11 CHAR(255),
col12 CHAR(255), col13 CHAR(255),col14 CHAR(255),col15 CHAR(255),col16 CHAR(255), col17 CHAR(255),
col18 CHAR(255),col19 CHAR(255),col20 CHAR(255),col21 CHAR(255),col22 CHAR(255), col23 CHAR(255),
col24 CHAR(255),col25 CHAR(255),col26 CHAR(255),col27 CHAR(255),col28 CHAR(255), col29 CHAR(255),
col30 CHAR(255),col31 CHAR(255),col32 CHAR(255),col33 CHAR(255),col34 CHAR(255), col35 CHAR(255),
col36 CHAR(255),col37 CHAR(255),col38 CHAR(255),col39 CHAR(255),col40 CHAR(255), col41 CHAR(255),
col42 CHAR(255),col43 CHAR(255),col44 CHAR(255),col45 CHAR(255),col46 CHAR(255), col47 CHAR(255),
col48 CHAR(255),col49 CHAR(255),col50 CHAR(255),col51 CHAR(255),col52 CHAR(255), col53 CHAR(255),
col54 CHAR(255),col55 CHAR(255),col56 CHAR(255),col57 CHAR(255),col58 CHAR(255), col59 CHAR(255),
col60 CHAR(255),col61 CHAR(255),col62 CHAR(255),col63 CHAR(255),col64 CHAR(255), col65 CHAR(255))
ENGINE = innodb ROW_FORMAT=REDUNDANT;
ERROR 42000: Row size too large (> 16382). 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.
show warnings;
Level Code Message
Error 1118 Row size too large (> 16382). 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 1030 Got error 139 "Too big row" from storage engine InnoDB
CREATE TABLE t1 (
c01 char(200), c02 char(200), c03 char(200), c04 char(200), c05 char(200),
c06 char(200), c07 char(200), c08 char(200), c09 char(200), c10 char(200),
Expand Down Expand Up @@ -379,7 +325,7 @@ CREATE INDEX xtc1c5 ON t1 (cc(767),dc(767));
CREATE INDEX xte1e5 ON t1 (ec(767),fc(767));
UPDATE t1 SET t=@e;
CREATE INDEX xt5k1f6 ON t1 (lc(767),mc(767));
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 32702. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
ERROR 42000: Row size too large. The maximum row size for the used table type, not counting BLOBs, is 16383. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
Expand Down
Loading

0 comments on commit 9284e8b

Please sign in to comment.