Bug #14272 Federated Storage Engine does not use indexes on UPDATE
| Submitted: | 24 Oct 2005 20:39 | Modified: | 31 Oct 2005 19:39 |
|---|---|---|---|
| Reporter: | Patrick Galbraith | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server | Severity: | S2 (Serious) |
| Version: | OS: | Any (all) | |
| Assigned to: | Sergey Petrunya | CPU Architecture: | Any |
[24 Oct 2005 20:39]
Patrick Galbraith
[25 Oct 2005 1:22]
Patrick Galbraith
The fix for this isn't that it needs to call create where_from_key (that would be long term). The way this has to work for now is this - you call the select that gets the rows that are to be updated. If the WHERE clause is for any columns that are indexed, you call read_range_first, which gets those records, or if no index, full table scan (select * from). The problem seems to be much higher up. Some change, to the optimiser (?) now makes it fail if the where clause contains a regular index (not a primary key) that is also going to be changed in the SET part of the statement. Here's the scoop: CREATE TABLE `t1` ( `id` int(20) NOT NULL auto_increment, `name` varchar(32) NOT NULL default '', `other` int(20) NOT NULL default '0', `created` datetime NOT NULL, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `other` (`other`), KEY `created` (`created`) ) ENGINE=FEDERATED DEFAULT CHARSET=latin1 CONNECTION='mysql://root@localhost/test/t1' | mysql> select * from t1; +----+--------------+--------+---------------------+ | id | name | other | created | +----+--------------+--------+---------------------+ | 1 | First Name | 11111 | 2004-01-01 01:01:01 | | 2 | Second Name | 22222 | 2004-01-23 02:43:00 | | 3 | Third name | 33333 | 2004-02-14 02:14:00 | | 4 | Fourth Name | 44444 | 2003-04-05 00:00:00 | | 5 | Fifth Name | 55555 | 2001-02-02 02:02:02 | | 6 | Sixth Name | 66666 | 2005-06-06 15:30:00 | | 7 | Seventh Name | 77777 | 2003-12-12 18:32:00 | | 8 | Eigth Name | 88888 | 2005-03-12 11:00:00 | | 9 | Ninth Name | 99999 | 2005-03-12 11:00:01 | | 10 | Tenth Name | 101010 | 2005-03-12 12:00:01 | +----+--------------+--------+---------------------+ mysql> update t1 set name = '4th Name' where id = 4; Query OK, 1 row affected (0.09 sec) Rows matched: 1 Changed: 1 Warnings: 0 remote queries: SELECT `id`, `name`, `other`, `created` FROM `t1` WHERE ( (`id` = 4) ) AND ( (`id` <= 4) ) `t1` SET id = 4, name = '4th Name', other = 44444, created = '2003-04-05 00:00:00' WHERE id = 4 AND name = 'Fourth Name' AND other = 44444 AND created = '2003-04-05 00:00:00' mysql> update t1 set other = 44445 where name = '4th Name'; Query OK, 1 row affected (0.05 sec) Rows matched: 1 Changed: 1 Warnings: 0 remote queries: SELECT `id`, `name`, `other`, `created` FROM `t1` WHERE ( (`name` = '4th Name') ) AND ( (`name` <= '4th Name') ) UPDATE `t1` SET id = 4, name = '4th Name', other = 44445, created = '2003-04-05 00:00:00' WHERE id = 4 AND name = '4th Name' AND other = 44444 AND created = '2003-04-05 00:00:00' mysql> update t1 set name = 'Fourth Name' where other = 44445; Query OK, 1 row affected (0.04 sec) Rows matched: 1 Changed: 1 Warnings: 0 remote queries: SELECT `id`, `name`, `other`, `created` FROM `t1` WHERE ( (`other` = 44445) ) AND ( (`other` <= 44445) ) UPDATE `t1` SET id = 4, name = 'Fourth Name', other = 44445, created = '2003-04-05 00:00:00' WHERE id = 4 AND name = '4th Name' AND other = 44445 AND created = '2003-04-05 00:00:00' mysql> update t1 set name = '4th Name' where name = 'Fourth Name'; ERROR 1031 (HY000): Table storage engine for 't1' doesn't have this option mysql> update t1 set name = '4th Name' where other = 44445 and name = 'Fourth Name'; ERROR 1031 (HY000): Table storage engine for 't1' doesn't have this option mysql> update t1 set other= 44444 where other = 44445 and name = 'Fourth Name'; Query OK, 1 row affected (0.04 sec) Rows matched: 1 Changed: 1 Warnings: 0 remote queries: SELECT `id`, `name`, `other`, `created` FROM `t1` WHERE ( (`name` = 'Fourth Name') ) AND ( (`name` <= 'Fourth Name') ) UPDATE `t1` SET id = 4, name = 'Fourth Name', other = 44444, created = '2003-04-05 00:00:00' WHERE id = 4 AND name = 'Fourth Name' AND other = 44445 AND created = '2003-04-05 00:00:00' mysql> update t1 set other= 44444 where other = 44445; ERROR 1031 (HY000): Table storage engine for 't1' doesn't have this option mysql> update t1 set other= 44445 where other = 44444 and id = 4; Query OK, 1 row affected (0.10 sec) Rows matched: 1 Changed: 1 Warnings: 0 remote queries: SELECT `id`, `name`, `other`, `created` FROM `t1` WHERE ( (`id` = 4) ) AND ( (`id` <= 4) ) UPDATE `t1` SET id = 4, name = 'Fourth Name', other = 44445, created = '2003-04-05 00:00:00' WHERE id = 4 AND name = 'Fourth Name' AND other = 44444 AND created = '2003-04-05 00:00:00' Primary key doesn't have a problem: SELECT `id`, `name`, `other`, `created` FROM `t1` WHERE ( (`id` = 10) ) AND ( (`id` <= 10) ) UPDATE `t1` SET id = 11, name = 'Tenth Name', other = 101010, created = '2005-03-12 12:00:01' WHERE id = 10 AND name = 'Tenth Name' AND other = 101010 AND created = '2005-03-12 12:00:01'
[25 Oct 2005 12:29]
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/internals/31451
[27 Oct 2005 22:45]
Sergey Petrunya
Patch approved by Monty on irc.
[31 Oct 2005 6:22]
Sergey Petrunya
Fix pushed into 5.0.16 tree. (no need for documentation as it is does not appear in released versions)
[31 Oct 2005 19:39]
Paul DuBois
No changelog entry needed.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.042 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.