[MDEV-13360] too long values in mysql.innodb_table_stats.table_name Created: 2017-07-20  Updated: 2022-07-09  Resolved: 2022-07-09

Status: Closed
Project: MariaDB Server
Component/s: Storage Engine - InnoDB, Storage Engine - XtraDB
Affects Version/s: 10.0, 10.1, 10.2
Fix Version/s: N/A

Type: Bug Priority: Minor
Reporter: Sergei Golubchik Assignee: Unassigned
Resolution: Won't Fix Votes: 1
Labels: upstream, upstream-fixed

Issue Links:
Problem/Incident
causes MDEV-13274 mysql_upgrade fails if dbname+tablena... Closed
Relates
relates to MDEV-14637 Latching order violation during btr_c... Closed
relates to MDEV-15020 Server hangs due to InnoDB persistent... Closed

 Description   

create table extralongname_extralongname_extralongname_extralongname_ext (
  id int(10) unsigned not null,
  created_date date not null,
  created timestamp not null,
  primary key (created,id,created_date)
) engine=innodb stats_persistent=1 default charset=latin1
  partition by range (year(created_date))
  subpartition by hash (month(created_date))
  subpartitions 2 (
    partition p2007 values less than (2008),
    partition p2008 values less than (2009)
  );
select length(table_name) from mysql.innodb_table_stats;

The last statement returns 79, even though the column is defined as varchar(64).

This can potentially fail in the upper layer in many different ways. For example, it makes copying ALTER TABLE to fail with "duplicate key value".

The same applies to innodb_index_stats too.



 Comments   
Comment by Marko Mäkelä [ 2018-11-06 ]

The necessary length for table_name is actually 199 characters, because the name can include up to 3 components: table, partition, and subpartition name, each being 64 characters. With delimiters, the maximum length is 199 characters, or 597 bytes (actually a little less, because the delimiters are 1-byte characters).

InnoDB uses its internal SQL parser for updating the persistent statistics, and it would ignore the declared maximum length. This would ultimately cause trouble in MySQL 5.7 (MariaDB 10.2), because InnoDB could hang due to mispredicting page splits (MDEV-14637).

In MariaDB, we should eventually get rid of these problematic tables and make the InnoDB data files more self-contained by storing the statistics directly in the .ibd files (MDEV-15020).

If a too old server is started with newer data files, it would refuse startup. Hopefully there will be no need to revise the InnoDB statistics table definitions after MDEV-14637.

Comment by Hartmut Holzgraefe [ 2018-11-27 ]

Fixed by the InnoDB 5.7.23 merge in MariaDB 10.2.18 and 10.3.9?

Comment by Hartmut Holzgraefe [ 2019-03-29 ]

I was actually off by one, it was fixed in 10.2.17 via

Merge Revision #976f920514 2018-08-03 08:37:05 +0300 - MDEV-16850 Merge new release of InnoDB 5.7.23 to 10.2

Comment by Hartmut Holzgraefe [ 2019-03-29 ]

Also fixed in 10.3.9

Comment by Hartmut Holzgraefe [ 2019-03-29 ]

Still present in current 10.1.38 though ....

Comment by Daniel Black [ 2022-07-09 ]

10.2 out of support now.

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