[MDEV-20256] "Row size too large" on latest release (10.3.17) Created: 2019-08-05  Updated: 2019-10-23  Resolved: 2019-08-05

Status: Closed
Project: MariaDB Server
Component/s: Storage Engine - InnoDB
Affects Version/s: 10.3.17
Fix Version/s: N/A

Type: Bug Priority: Major
Reporter: Patrick Bollinger Assignee: Eugene Kosov (Inactive)
Resolution: Not a Bug Votes: 0
Labels: None
Environment:

Docker


Issue Links:
Duplicate
duplicates MDEV-20268 create table fails with row size too ... Closed
duplicates MDEV-20346 Cannot create a certain table: Row si... Closed
Relates
relates to MDEV-16969 Fix error message as promised in upst... Open
relates to MDEV-19292 "Row size too large" error when creat... Closed
relates to MDEV-20448 Add link to release notes about "Row ... Closed
relates to MDEV-23521 Implement an InnoDB row format that c... Open

 Description   

When creating a table with a number of varchars, MariaDB 10.3.17 throws the error "ERROR 1118 (42000): Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline."

I tested this against MariaDB 3.10.16 and it works OK and is able to create the table. I also tested against MySQL 5.7.27 and verified that it works OK and is able to create the table. All testing was done using Docker images of the respective versions.

I feel this relates to MDEV-19292.

Here is the original query that was failing:

CREATE DATABASE IF NOT EXISTS `test`;
USE `test`;
DROP TABLE IF EXISTS `row_too_big`;
CREATE TABLE IF NOT EXISTS `row_too_big`
(
    `column0` bool NOT NULL,
    `column1` bool NOT NULL,
    `column2` bool NOT NULL,
    `column3` bool NOT NULL,
    `column4` bool NOT NULL,
    `column5` bool NOT NULL,
    `column6` bool NOT NULL,
    `column7` bool NOT NULL,
    `column8` bool NOT NULL,
    `column9` bool NOT NULL,
    `column10` bool NOT NULL,
    `column11` bool NOT NULL,
    `column12` bool NOT NULL,
    `column13` bool NOT NULL,
    `column14` bool NOT NULL,
    `column15` bool NOT NULL,
    `column16` bool NOT NULL,
    `column17` bool NOT NULL,
    `column18` date NULL,
    `column19` date NULL,
    `column20` date NULL,
    `column21` date NULL,
    `column22` date NULL,
    `column23` date NULL,
    `column24` date NULL,
    `column25` date NULL,
    `column26` date NULL,
    `column27` date NULL,
    `column28` date NULL,
    `column29` date NULL,
    `column30` date NULL,
    `column31` datetime(6) NOT NULL,
    `column32` datetime(6) NOT NULL,
    `column33` datetime(6) NULL,
    `column34` datetime(6) NULL,
    `column35` datetime(6) NULL,
    `column36` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `column37` integer NOT NULL,
    `column38` integer NOT NULL,
    `column39` integer NOT NULL,
    `column40` integer NULL UNIQUE,
    `column41` integer NULL,
    `column42` integer NULL,
    `column43` integer NULL,
    `column44` integer NULL,
    `column45` integer NULL,
    `column46` longtext NOT NULL,
    `column47` longtext NULL,
    `column48` longtext NULL,
    `column49` longtext NULL,
    `column50` longtext NULL,
    `column51` longtext NULL,
    `column52` longtext NULL,
    `column53` longtext NULL,
    `column54` longtext NULL,
    `column55` longtext NULL,
    `column56` longtext NULL,
    `column57` numeric(12, 2) NULL,
    `column58` numeric(12, 2) NULL,
    `column59` smallint UNSIGNED NULL,
    `column60` varchar(1) NOT NULL,
    `column61` varchar(2) NOT NULL,
    `column62` varchar(2) NOT NULL,
    `column63` varchar(2) NULL,
    `column64` varchar(2) NULL,
    `column65` varchar(2) NULL,
    `column66` varchar(4) NOT NULL,
    `column67` varchar(7) NOT NULL,
    `column68` varchar(7) NOT NULL,
    `column69` varchar(8) NOT NULL,
    `column70` varchar(8) NULL,
    `column71` varchar(8) NULL,
    `column72` varchar(16) NOT NULL,
    `column73` varchar(16) NOT NULL,
    `column74` varchar(16) NULL,
    `column75` varchar(16) NULL,
    `column76` varchar(16) NULL,
    `column77` varchar(16) NULL,
    `column78` varchar(16) NULL,
    `column79` varchar(16) NULL,
    `column80` varchar(16) NULL,
    `column81` varchar(16) NULL,
    `column82` varchar(16) NULL,
    `column83` varchar(16) NULL,
    `column84` varchar(16) NULL,
    `column85` varchar(20) NULL,
    `column86` varchar(20) NULL,
    `column87` varchar(30) NOT NULL,
    `column88` varchar(32) NOT NULL,
    `column89` varchar(32) NOT NULL,
    `column90` varchar(32) NULL,
    `column91` varchar(32) NULL,
    `column92` varchar(32) NULL,
    `column93` varchar(32) NULL,
    `column94` varchar(32) NULL,
    `column95` varchar(32) NULL,
    `column96` varchar(32) NULL,
    `column97` varchar(32) NULL,
    `column98` varchar(32) NULL,
    `column99` varchar(32) NULL,
    `column100` varchar(32) NULL,
    `column101` varchar(32) NULL,
    `column102` varchar(32) NULL,
    `column103` varchar(32) NULL,
    `column104` varchar(32) NULL,
    `column105` varchar(32) NULL,
    `column106` varchar(32) NULL,
    `column107` varchar(32) NULL,
    `column108` varchar(32) NULL,
    `column109` varchar(32) NULL,
    `column110` varchar(32) NULL,
    `column111` varchar(32) NULL,
    `column112` varchar(64) NOT NULL,
    `column113` varchar(64) NOT NULL,
    `column114` varchar(64) NOT NULL,
    `column115` varchar(64) NULL,
    `column116` varchar(64) NULL,
    `column117` varchar(64) NULL,
    `column118` varchar(64) NULL,
    `column119` varchar(64) NULL,
    `column120` varchar(64) NULL,
    `column121` varchar(64) NULL,
    `column122` varchar(64) NULL,
    `column123` varchar(64) NULL,
    `column124` varchar(64) NULL,
    `column125` varchar(64) NULL,
    `column126` varchar(64) NULL,
    `column127` varchar(64) NULL,
    `column128` varchar(64) NULL,
    `column129` varchar(64) NULL,
    `column130` varchar(64) NULL,
    `column131` varchar(64) NULL,
    `column132` varchar(64) NULL,
    `column133` varchar(64) NULL,
    `column134` varchar(64) NULL,
    `column135` varchar(64) NULL,
    `column136` varchar(64) NULL,
    `column137` varchar(64) NULL,
    `column138` varchar(64) NULL,
    `column139` varchar(64) NULL,
    `column140` varchar(64) NULL,
    `column141` varchar(64) NULL,
    `column142` varchar(64) NULL,
    `column143` varchar(64) NULL,
    `column144` varchar(64) NULL,
    `column145` varchar(64) NULL,
    `column146` varchar(64) NULL,
    `column147` varchar(64) NULL,
    `column148` varchar(64) NULL,
    `column149` varchar(64) NULL,
    `column150` varchar(64) NULL,
    `column151` varchar(64) NULL,
    `column152` varchar(64) NULL,
    `column153` varchar(64) NULL,
    `column154` varchar(64) NULL,
    `column155` varchar(64) NULL,
    `column156` varchar(64) NULL,
    `column157` varchar(64) NULL,
    `column158` varchar(64) NULL,
    `column159` varchar(64) NULL,
    `column160` varchar(64) NULL,
    `column161` varchar(64) NULL,
    `column162` varchar(128) NOT NULL,
    `column163` varchar(128) NULL,
    `column164` varchar(128) NULL,
    `column165` varchar(128) NULL,
    `column166` varchar(128) NULL,
    `column167` varchar(128) NULL,
    `column168` varchar(128) NULL,
    `column169` varchar(128) NULL,
    `column170` varchar(128) NULL,
    `column171` varchar(128) NULL,
    `column172` varchar(128) NULL,
    `column173` varchar(128) NULL,
    `column174` varchar(128) NULL,
    `column175` varchar(128) NULL,
    `column176` varchar(128) NULL,
    `column177` varchar(128) NULL,
    `column178` varchar(128) NULL,
    `column179` varchar(128) NULL,
    `column180` varchar(254) NULL,
    `column181` varchar(254) NULL,
    `column182` varchar(254) NULL,
    `column183` varchar(254) NULL,
    `column184` varchar(255) NULL,
    `column185` varchar(256) NULL,
    `column186` varchar(256) NULL,
    `column187` varchar(256) NULL,
    `column188` varchar(256) NULL
);

Here is a simplified version where if you comment the first column, the query will work OK, but leaving as is will result in the error.

CREATE DATABASE IF NOT EXISTS `test`;
USE `test`;
DROP TABLE IF EXISTS `row_too_big`;
CREATE TABLE IF NOT EXISTS `row_too_big`
(
    `column0` numeric(12, 2) NULL,
    `column1` smallint UNSIGNED NULL,
    `column2` varchar(1) NOT NULL,
    `column3` varchar(2) NOT NULL,
    `column4` varchar(2) NOT NULL,
    `column5` varchar(2) NULL,
    `column6` varchar(2) NULL,
    `column7` varchar(2) NULL,
    `column8` varchar(4) NOT NULL,
    `column9` varchar(7) NOT NULL,
    `column10` varchar(7) NOT NULL,
    `column11` varchar(8) NOT NULL,
    `column12` varchar(8) NULL,
    `column13` varchar(8) NULL,
    `column14` varchar(16) NOT NULL,
    `column15` varchar(16) NOT NULL,
    `column16` varchar(16) NULL,
    `column17` varchar(16) NULL,
    `column18` varchar(16) NULL,
    `column19` varchar(16) NULL,
    `column20` varchar(16) NULL,
    `column21` varchar(16) NULL,
    `column22` varchar(16) NULL,
    `column23` varchar(16) NULL,
    `column24` varchar(16) NULL,
    `column25` varchar(16) NULL,
    `column26` varchar(16) NULL,
    `column27` varchar(20) NULL,
    `column28` varchar(20) NULL,
    `column29` varchar(30) NOT NULL,
    `column30` varchar(32) NOT NULL,
    `column31` varchar(32) NOT NULL,
    `column32` varchar(32) NULL,
    `column33` varchar(32) NULL,
    `column34` varchar(32) NULL,
    `column35` varchar(32) NULL,
    `column36` varchar(32) NULL,
    `column37` varchar(32) NULL,
    `column38` varchar(32) NULL,
    `column39` varchar(32) NULL,
    `column40` varchar(32) NULL,
    `column41` varchar(32) NULL,
    `column42` varchar(32) NULL,
    `column43` varchar(32) NULL,
    `column44` varchar(32) NULL,
    `column45` varchar(32) NULL,
    `column46` varchar(32) NULL,
    `column47` varchar(32) NULL,
    `column48` varchar(32) NULL,
    `column49` varchar(32) NULL,
    `column50` varchar(32) NULL,
    `column51` varchar(32) NULL,
    `column52` varchar(32) NULL,
    `column53` varchar(32) NULL,
    `column54` varchar(64) NOT NULL,
    `column55` varchar(64) NOT NULL,
    `column56` varchar(64) NOT NULL,
    `column57` varchar(64) NULL,
    `column58` varchar(64) NULL,
    `column59` varchar(64) NULL,
    `column60` varchar(64) NULL,
    `column61` varchar(64) NULL,
    `column62` varchar(64) NULL,
    `column63` varchar(64) NULL,
    `column64` varchar(64) NULL,
    `column65` varchar(64) NULL,
    `column66` varchar(64) NULL,
    `column67` varchar(64) NULL,
    `column68` varchar(64) NULL,
    `column69` varchar(64) NULL,
    `column70` varchar(64) NULL,
    `column71` varchar(64) NULL,
    `column72` varchar(64) NULL,
    `column73` varchar(64) NULL,
    `column74` varchar(64) NULL,
    `column75` varchar(64) NULL,
    `column76` varchar(64) NULL,
    `column77` varchar(64) NULL,
    `column78` varchar(64) NULL,
    `column79` varchar(64) NULL,
    `column80` varchar(64) NULL,
    `column81` varchar(64) NULL,
    `column82` varchar(64) NULL,
    `column83` varchar(64) NULL,
    `column84` varchar(64) NULL,
    `column85` varchar(64) NULL,
    `column86` varchar(64) NULL,
    `column87` varchar(64) NULL,
    `column88` varchar(64) NULL,
    `column89` varchar(64) NULL,
    `column90` varchar(64) NULL,
    `column91` varchar(64) NULL,
    `column92` varchar(64) NULL,
    `column93` varchar(64) NULL,
    `column94` varchar(64) NULL,
    `column95` varchar(64) NULL,
    `column96` varchar(64) NULL,
    `column97` varchar(64) NULL,
    `column98` varchar(64) NULL,
    `column99` varchar(64) NULL,
    `column100` varchar(64) NULL,
    `column101` varchar(64) NULL,
    `column102` varchar(64) NULL,
    `column103` varchar(64) NULL,
    `column104` varchar(128) NOT NULL,
    `column105` varchar(128) NULL,
    `column106` varchar(128) NULL,
    `column107` varchar(128) NULL,
    `column108` varchar(128) NULL,
    `column109` varchar(128) NULL,
    `column110` varchar(128) NULL,
    `column111` varchar(128) NULL,
    `column112` varchar(128) NULL,
    `column113` varchar(128) NULL,
    `column114` varchar(128) NULL,
    `column115` varchar(128) NULL,
    `column116` varchar(128) NULL,
    `column117` varchar(128) NULL,
    `column118` varchar(128) NULL,
    `column119` varchar(128) NULL,
    `column120` varchar(128) NULL,
    `column121` varchar(128) NULL,
    `column122` varchar(254) NULL,
    `column123` varchar(254) NULL,
    `column124` varchar(254) NULL,
    `column125` varchar(254) NULL,
    `column126` varchar(255) NULL,
    `column127` varchar(256) NULL,
    `column128` varchar(256) NULL,
    `column129` varchar(256) NULL,
    `column130` varchar(256) NULL
);



 Comments   
Comment by Eugene Kosov (Inactive) [ 2019-08-05 ]

Yes, it is related to MDEV-19292
Older version counts max row size incorrectly. It's fixed in newer version. Documentation fixed too: https://mariadb.com/kb/en/library/innodb-storage-formats/#overflow-pages-with-the-dynamic-row-format

If you want to create such a table you may temporary disable innodb_strict_mode https://mariadb.com/kb/en/library/innodb-strict-mode/

Comment by Patrick Bollinger [ 2019-08-05 ]

Oh OK, thank you for the clarification.

For VARBINARY and VARCHAR columns, only values longer than 255 bytes are considered for storage on overflow pages.

Since the majority of the VARCHAR columns in my query are <256 bytes/characters, they are not considered for storage on overflow pages, which is why MariaDB produces the error.

Comment by Eugene Kosov (Inactive) [ 2019-08-05 ]

Right. Only check was fixed. Logic on putting fields to overflow was not changed.
I'm closing the issue.

Generated at Thu Feb 08 08:58:04 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.