mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
Fix for bug #28837: MyISAM storage engine error (134) doing delete with
self-join When doing DELETE with self-join on a MyISAM or MERGE table, it could happen that a record being retrieved in join_read_next_same() has already been deleted by previous iterations. That caused the engine's index_next_same() method to fail with HA_ERR_RECORD_DELETED error and the whole DELETE query to be aborted with an error. Fixed by suppressing the HA_ERR_RECORD_DELETED error in hy_myisam::index_next_same() and ha_myisammrg::index_next_same(). Since HA_ERR_RECORD_DELETED can only be returned by MyISAM, there is no point in filtering this error in the SQL layer.
This commit is contained in:
@@ -876,4 +876,41 @@ CHECK TABLE tm1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.tm1 check status OK
|
||||
DROP TABLE tm1, t1, t2;
|
||||
CREATE TABLE t1 (id INT NOT NULL, ref INT NOT NULL, INDEX (id)) ENGINE=MyISAM;
|
||||
CREATE TABLE t2 LIKE t1;
|
||||
INSERT INTO t2 (id, ref) VALUES (1,3), (2,1), (3,2), (4,5), (4,4);
|
||||
INSERT INTO t1 SELECT * FROM t2;
|
||||
INSERT INTO t1 SELECT * FROM t2;
|
||||
CREATE TABLE t3 (id INT NOT NULL, ref INT NOT NULL, INDEX (id)) ENGINE=MERGE
|
||||
UNION(t1);
|
||||
SELECT * FROM t3 AS a INNER JOIN t3 AS b USING (id) WHERE a.ref < b.ref;
|
||||
id ref ref
|
||||
4 4 5
|
||||
4 4 5
|
||||
4 4 5
|
||||
4 4 5
|
||||
SELECT * FROM t3;
|
||||
id ref
|
||||
1 3
|
||||
2 1
|
||||
3 2
|
||||
4 5
|
||||
4 4
|
||||
1 3
|
||||
2 1
|
||||
3 2
|
||||
4 5
|
||||
4 4
|
||||
DELETE FROM a USING t3 AS a INNER JOIN t3 AS b USING (id) WHERE a.ref < b.ref;
|
||||
SELECT * FROM t3;
|
||||
id ref
|
||||
1 3
|
||||
2 1
|
||||
3 2
|
||||
4 5
|
||||
1 3
|
||||
2 1
|
||||
3 2
|
||||
4 5
|
||||
DROP TABLE t1, t2, t3;
|
||||
End of 5.0 tests
|
||||
|
||||
Reference in New Issue
Block a user