1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

MDEV-35721 UBSAN: runtime error: -nan outside range

Prevent division by zero when reading table statistics
This commit is contained in:
Dave Gosselin
2025-02-04 13:42:18 -05:00
committed by Daniel Black
parent 669f719cc2
commit 00fa5b8676
3 changed files with 44 additions and 1 deletions

View File

@@ -0,0 +1,21 @@
CREATE TABLE t (c1 VARCHAR(10),c2 VARCHAR(10),PRIMARY KEY(c1,c2),FULLTEXT KEY k (c2)) ENGINE=InnoDB;
INSERT INTO t VALUES ('a','b');
DROP TABLE t;
CREATE TABLE t (c1 VARCHAR(10),c2 VARCHAR(10),PRIMARY KEY(c1,c2),FULLTEXT KEY k (c2)) ENGINE=InnoDB;
DELETE FROM t;
DROP TABLE t;
CREATE TABLE t (a INT(1),d INT(1),b VARCHAR(1),c CHAR(1),c3 INT(1) GENERATED ALWAYS AS ((a + LENGTH (d))) STORED,c2 CHAR(1) GENERATED ALWAYS AS (SUBSTR(b,0,0)) VIRTUAL,k1 CHAR(1) GENERATED ALWAYS AS (SUBSTR(b,0,0)) VIRTUAL,PRIMARY KEY(b (1),a,d),KEY d (d),KEY a (a),KEY c_renamed (c (1),b (1)),KEY b (b (1),c (1),a),KEY k1 (k1),KEY a_2 (a,k1),KEY k1_2 (k1,d)) DEFAULT CHARSET=latin1 ENGINE=InnoDB;
DELETE FROM t;
DROP TABLE t;
CREATE TABLE t (a INT,ROW_START TIMESTAMP(6) AS ROW START,ROW_END TIMESTAMP(6) AS ROW END,PERIOD FOR SYSTEM_TIME(ROW_START,ROW_END),INDEX (ROW_START),INDEX (ROW_END),PRIMARY KEY(ROW_END,a,ROW_START),INDEX (ROW_END,ROW_START,a)) WITH SYSTEM VERSIONING ENGINE=InnoDB;
SHOW INDEX FROM t;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Ignored
t 0 PRIMARY 1 ROW_END A 0 NULL NULL BTREE NO
t 0 PRIMARY 2 a A 0 NULL NULL BTREE NO
t 0 PRIMARY 3 ROW_START A 0 NULL NULL BTREE NO
t 1 ROW_START 1 ROW_START A 0 NULL NULL BTREE NO
t 1 ROW_END 1 ROW_END A 0 NULL NULL BTREE NO
t 1 ROW_END_2 1 ROW_END A 0 NULL NULL BTREE NO
t 1 ROW_END_2 2 ROW_START A 0 NULL NULL BTREE NO
t 1 ROW_END_2 3 a A 0 NULL NULL BTREE NO
DROP TABLE t;

View File

@@ -0,0 +1,22 @@
--source include/have_innodb.inc
CREATE TABLE t (c1 VARCHAR(10),c2 VARCHAR(10),PRIMARY KEY(c1,c2),FULLTEXT KEY k (c2)) ENGINE=InnoDB;
INSERT INTO t VALUES ('a','b');
DROP TABLE t;
CREATE TABLE t (c1 VARCHAR(10),c2 VARCHAR(10),PRIMARY KEY(c1,c2),FULLTEXT KEY k (c2)) ENGINE=InnoDB;
DELETE FROM t;
DROP TABLE t;
CREATE TABLE t (a INT(1),d INT(1),b VARCHAR(1),c CHAR(1),c3 INT(1) GENERATED ALWAYS AS ((a + LENGTH (d))) STORED,c2 CHAR(1) GENERATED ALWAYS AS (SUBSTR(b,0,0)) VIRTUAL,k1 CHAR(1) GENERATED ALWAYS AS (SUBSTR(b,0,0)) VIRTUAL,PRIMARY KEY(b (1),a,d),KEY d (d),KEY a (a),KEY c_renamed (c (1),b (1)),KEY b (b (1),c (1),a),KEY k1 (k1),KEY a_2 (a,k1),KEY k1_2 (k1,d)) DEFAULT CHARSET=latin1 ENGINE=InnoDB;
DELETE FROM t;
DROP TABLE t;
CREATE TABLE t (a INT,ROW_START TIMESTAMP(6) AS ROW START,ROW_END TIMESTAMP(6) AS ROW END,PERIOD FOR SYSTEM_TIME(ROW_START,ROW_END),INDEX (ROW_START),INDEX (ROW_END),PRIMARY KEY(ROW_END,a,ROW_START),INDEX (ROW_END,ROW_START,a)) WITH SYSTEM VERSIONING ENGINE=InnoDB;
SHOW INDEX FROM t;
DROP TABLE t;

View File

@@ -3139,7 +3139,7 @@ read_statistics_for_table(THD *thd, TABLE *table,
double avg_frequency= pk_read_stats->get_avg_frequency(j-1);
set_if_smaller(avg_frequency, 1);
double val= (pk_read_stats->get_avg_frequency(j) /
avg_frequency);
avg_frequency > 0 ? avg_frequency : 1);
index_statistics->set_avg_frequency (l, val);
}
}