| Bug #31732 | row count(*) overflows after 32-bit integer precision in spite of being bigint | ||
|---|---|---|---|
| Submitted: | 21 Oct 2007 1:14 | Modified: | 11 Dec 2007 19:18 |
| Reporter: | Cengiz Gunay | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: DML | Severity: | S2 (Serious) |
| Version: | 5.0.45 | OS: | Linux (SuSE 10.3 x86_64) |
| Assigned to: | Assigned Account | CPU Architecture: | Any |
| Tags: | 32-bit, 32bit, 64-bit, 64bit, BIGINT, count, INT, INTEGER, overflow, row | ||
[21 Oct 2007 1:14]
Cengiz Gunay
[23 Nov 2007 13:09]
Sveta Smirnova
Thank you for the report. Please indicate storage engine you have problem with.
[27 Nov 2007 21:03]
Cengiz Gunay
I don't understand the question. The first sentence in my report clearly says that I'm using the MyISAM engine. I guess it took you a month to ask this question.
[3 Dec 2007 9:11]
Sveta Smirnova
Thank you for the feedback. Please provide output of select @@big_tables;
[3 Dec 2007 17:05]
Cengiz Gunay
mysql> select @@big_tables; +--------------+ | @@big_tables | +--------------+ | 0 | +--------------+ 1 row in set (0.00 sec)
[8 Dec 2007 15:58]
Sveta Smirnova
Thank you for hte feedback. Could you please also provide output of SHOW TABLE STATUS for problematic table and indicate which package do you use. If you compiled MySQL yourself please provide configuration line.
[10 Dec 2007 19:44]
Cengiz Gunay
mysql> show table status from sensordb like 'sensor_values'; +---------------+--------+---------+------------+------------+----------------+--------------+-------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+------------------------------------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +---------------+--------+---------+------------+------------+----------------+--------------+-------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+------------------------------------+ | sensor_values | MyISAM | 10 | Fixed | 2777958656 | 109 | 304135815936 | 12103423998558207 | 95866478592 | 0 | NULL | 2007-11-22 10:21:30 | 2007-12-04 11:36:21 | NULL | latin1_swedish_ci | NULL | | Sensor values from all three cells | +---------------+--------+---------+------------+------------+----------------+--------------+-------------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+------------------------------------+ 1 row in set (0.00 sec) Above the number of rows is wrong, it exhibits the overflow problem. It should be close to seven billion instead. Indeed, searches in the table use the correct number of rows. I am using the SuSE RPMs: mysql-client-5.0.45-22 mysql-5.0.45-22 Do I need to compile MySQL myself to get the row count right? If so, what compilation setting do I need to use?
[10 Dec 2007 23:28]
Sveta Smirnova
Thank you for the feedback.
I finally got how to repeat the problem.
1. Use binary compiled without option --with-big-tables.
2. Create table t1(f1 int)
3. Fill this table with more than 4294967295 rows.
4. Restart server.
mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select count(*) from t3;
+------------+
| count(*) |
+------------+
| 3221225473 |
+------------+
1 row in set (0.00 sec)
mysql> insert into t3 select * from t2; select count(*) from t3;
Query OK, 1073741824 rows affected (17 min 2.81 sec)
Records: 1073741824 Duplicates: 0 Warnings: 0
+------------+
| count(*) |
+------------+
| 4294967297 |
+------------+
1 row in set (0.00 sec)
mysql> show table status like 't3'\G
*************************** 1. row ***************************
Name: t3
Engine: MyISAM
Version: 10
Row_format: Fixed
Rows: 4294967298
Avg_row_length: 7
Data_length: 30064771086
Max_data_length: 1970324836974591
Index_length: 1024
Data_free: 0
Auto_increment: NULL
Create_time: 2007-12-10 22:17:48
Update_time: 2007-12-11 00:03:12
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
mysql> \q
Bye
$./bin/mysqladmin shutdown -uroot --socket=/tmp/mysql_ssmirnova.sock
$./libexec/mysqld --defaults-file=support-files/my-small.cnf --basedir=. --datadir=./data --log-error --socket=/tmp/mysql_ssmirnova.sock --port=33050 --bind-address=127.0.0.1 &
$ ./bin/mysql -uroot --socket=/tmp/mysql_ssmirnova.sock
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.54-debug Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select count(*) from t3;
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)
mysql> show table status like 't3'\G
*************************** 1. row ***************************
Name: t3
Engine: MyISAM
Version: 10
Row_format: Fixed
Rows: 2
Avg_row_length: 15032385543
Data_length: 30064771086
Max_data_length: 1970324836974591
Index_length: 1024
Data_free: 0
Auto_increment: NULL
Create_time: 2007-12-10 22:17:48
Update_time: 2007-12-11 00:03:12
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
mysql>
[10 Dec 2007 23:30]
Sveta Smirnova
> Do I need to compile MySQL myself to get the row count right? If so, what compilation setting do I need to use? Binaries whould be compiled with --with-big-tables option. Binaries provided by MySQL are compiled with this option.
[11 Dec 2007 19:18]
Cengiz Gunay
Thank you for figuring this out! I will try to compile my own version or get the binaries from MySQL to test this. If that solves my problem, I will notify the SuSE people reponsible for the mysql packages.
