| Bug #38272 | timestamps fields incorrectly defaulted on update accross partitions. | ||
|---|---|---|---|
| Submitted: | 21 Jul 2008 21:50 | Modified: | 15 Sep 2008 13:59 |
| Reporter: | Dale Davenport | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Partitions | Severity: | S3 (Non-critical) |
| Version: | 5.1.24, 5.1.26 | OS: | Any |
| Assigned to: | Alexey Botchkov | CPU Architecture: | Any |
| Tags: | InnoDB Partition Timestamp | ||
[22 Jul 2008 6:46]
Valeriy Kravchuk
Thank you for a bug report. Verified just as described with 5.1.26-rc:
C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -uroot -proot -P3310 test
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.26-rc-community MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> DROP TABLE IF EXISTS `ts_test`;
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql>
mysql> CREATE TABLE `ts_test` (
-> `ID` bigint(20) NOT NULL AUTO_INCREMENT,
-> `createdDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-> `number` int,
-> PRIMARY KEY (`ID`, number)
-> ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8
-> PARTITION BY RANGE (number) (
-> PARTITION p0 VALUES LESS THAN (6),
-> PARTITION p1 VALUES LESS THAN (11)
-> );
Query OK, 0 rows affected (0.45 sec)
mysql> INSERT INTO ts_test SET number=1;
Query OK, 1 row affected (0.13 sec)
mysql> SELECT * FROM ts_test;
+----+---------------------+--------+
| ID | createdDate | number |
+----+---------------------+--------+
| 27 | 2008-07-22 09:43:14 | 1 |
+----+---------------------+--------+
1 row in set (0.01 sec)
mysql> SELECT SLEEP(5);
+----------+
| SLEEP(5) |
+----------+
| 0 |
+----------+
1 row in set (5.02 sec)
mysql> UPDATE ts_test SET number=3;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM ts_test;
+----+---------------------+--------+
| ID | createdDate | number |
+----+---------------------+--------+
| 27 | 2008-07-22 09:43:14 | 3 |
+----+---------------------+--------+
1 row in set (0.00 sec)
mysql> SELECT SLEEP(5);
+----------+
| SLEEP(5) |
+----------+
| 0 |
+----------+
1 row in set (5.00 sec)
mysql>
mysql> UPDATE ts_test SET number=6;
Query OK, 1 row affected (0.03 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM ts_test;
+----+---------------------+--------+
| ID | createdDate | number |
+----+---------------------+--------+
| 27 | 2008-07-22 09:43:24 | 6 |
+----+---------------------+--------+
1 row in set (0.00 sec)
[27 Jul 2008 14:20]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/50573 2680 Alexey Botchkov 2008-07-27 Bug#38272 timestamps fields incorrectly defaulted on update accross partitions. It's not Innodb-specific bug. ha_partition::update_row() didn't set table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET when orig_timestamp_type == TIMESTAMP_AUTO_SET_ON_INSERT. So that a partition sets the timestamp field when a record is moved to a different partition. Fixed by doing '= TIMESTAMP_NO_AUTO_SET' unconditionally. Also ha_partition::write_row() is fixed in same way as now Field_timestamp::set() is called twice in SET_ON_INSERT case. per-file messages: mysql-test/r/partition.result Bug#38272 timestamps fields incorrectly defaulted on update accross partitions. test result mysql-test/t/partition.test Bug#38272 timestamps fields incorrectly defaulted on update accross partitions. test case sql/ha_partition.cc Bug#38272 timestamps fields incorrectly defaulted on update accross partitions. Do table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET unconditionally in ha_partition::update_row and ::write_row()
[15 Aug 2008 18:26]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/51764 2704 Chad MILLER 2008-08-15 Bug#38272: timestamps fields incorrectly defaulted on \ update accross partitions. It's not Innodb-specific bug. ha_partition::update_row() didn't set table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET when orig_timestamp_type == TIMESTAMP_AUTO_SET_ON_INSERT. So that a partition sets the timestamp field when a record is moved to a different partition. Fixed by doing '= TIMESTAMP_NO_AUTO_SET' unconditionally. Also ha_partition::write_row() is fixed in same way as now Field_timestamp::set() is called twice in SET_ON_INSERT case. (Chad queues this patch on demand by Trudy/Davi.)
[15 Aug 2008 18:39]
Chad MILLER
Queued to 5.1-bugteam and 6.0-bugteam.
[15 Aug 2008 18:40]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/51767 2704 Chad MILLER 2008-08-15 Bug#38272: timestamps fields incorrectly defaulted on \ update accross partitions. It's not Innodb-specific bug. ha_partition::update_row() didn't set table->timestamp_field_type= TIMESTAMP_NO_AUTO_SET when orig_timestamp_type == TIMESTAMP_AUTO_SET_ON_INSERT. So that a partition sets the timestamp field when a record is moved to a different partition. Fixed by doing '= TIMESTAMP_NO_AUTO_SET' unconditionally. Also ha_partition::write_row() is fixed in same way as now Field_timestamp::set() is called twice in SET_ON_INSERT case. (Chad queues this patch on demand by Trudy/Davi.)
[21 Aug 2008 18:18]
Bugs System
Pushed into 5.1.28 (revid:chad@mysql.com-20080815182625-yfhxtes9hy8cxboq) (version source revid:sergefp@mysql.com-20080819132519-eimtstp3bx89ya9d) (pib:3)
[22 Aug 2008 8:17]
Jon Stephens
Documented in the 5.1.28 changelog as follows:
When a partitioned table had a TIMESTAMP column
defined with CURRENT_TIMESTAMP as the default but
with no ON UPDATE clause, the column's value was
incorrectly set to CURRENT_TIMESTAMP when
updating across partitions.
Set bug status back to Patch Queued pending merge to 6.0.
[14 Sep 2008 6:16]
Bugs System
Pushed into 6.0.7-alpha (revid:chad@mysql.com-20080815182625-yfhxtes9hy8cxboq) (version source revid:timothy.smith@sun.com-20080813081348-d1t79whh0xmepllq) (pib:3)
[15 Sep 2008 13:59]
Jon Stephens
Fix also documented in 6.0.7 changelog.

Description: If a partitioned table has a timestamp column with a default value of CURRENT_TIMESTAMP but no ON UPDATE value specified the value incorrectly gets set to CURRENT_TIMESTAMP when updating across partitions. It looks like when the row is moved to a different partition the on create default value is set even though the operation is an update. How to repeat: Example SQL ============================================= DROP TABLE IF EXISTS `ts_test`; CREATE TABLE `ts_test` ( `ID` bigint(20) NOT NULL AUTO_INCREMENT, `createdDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `number` int, PRIMARY KEY (`ID`, number) ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 PARTITION BY RANGE (number) ( PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11) ); INSERT INTO ts_test SET number=1; SELECT * FROM ts_test; SELECT SLEEP(5); UPDATE ts_test SET number=3; SELECT * FROM ts_test; SELECT SLEEP(5); UPDATE ts_test SET number=6; SELECT * FROM ts_test; ============================================= Example output: ============================================= mysql> source /Users/dale/ts_test.sql Query OK, 0 rows affected, 1 warning (0.00 sec) Query OK, 0 rows affected (0.07 sec) Query OK, 1 row affected (0.00 sec) +----+---------------------+--------+ | ID | createdDate | number | +----+---------------------+--------+ | 27 | 2008-07-21 15:44:35 | 1 | +----+---------------------+--------+ 1 row in set (0.00 sec) +----------+ | SLEEP(5) | +----------+ | 0 | +----------+ 1 row in set (5.00 sec) Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 +----+---------------------+--------+ | ID | createdDate | number | +----+---------------------+--------+ | 27 | 2008-07-21 15:44:35 | 3 | +----+---------------------+--------+ 1 row in set (0.00 sec) +----------+ | SLEEP(5) | +----------+ | 0 | +----------+ 1 row in set (5.00 sec) Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 +----+---------------------+--------+ | ID | createdDate | number | +----+---------------------+--------+ | 27 | 2008-07-21 15:44:45 | 6 | +----+---------------------+--------+ 1 row in set (0.00 sec) ============================================= Suggested fix: Unknown.