Bug #21310 Trees in SQL causing a "crashed" table with MyISAM storage engine
| Submitted: | 27 Jul 2006 10:14 | Modified: | 7 Feb 2007 12:18 |
|---|---|---|---|
| Reporter: | Poeydomenge Frederic | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: MyISAM storage engine | Severity: | S2 (Serious) |
| Version: | 4.1, 5.0.25-BK, 5.0.22 | OS: | Linux (Debian GNU/Linux) |
| Assigned to: | Sergey Vojtovich | CPU Architecture: | Any |
[27 Jul 2006 10:14]
Poeydomenge Frederic
[27 Jul 2006 10:52]
Valeriy Kravchuk
Thank you for a bug report. Verified just as described with 5.0.25-BK on Linux:
openxs@suse:~/dbs/5.0> bin/mysql -uroot test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8 to server version: 5.0.25
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> DROP TABLE IF EXISTS `foo`;
Query OK, 0 rows affected (0.01 sec)
CRmysql> CREATE TABLE `foo` (
-> `id` smallint(5) unsigned NOT NULL default '0',
-> `node` tinyint(3) unsigned NOT NULL,
-> `parent_node` tinyint(3) unsigned NULL,
-> `depth` tinyint(4) unsigned NULL,
-> `lineage` varchar(255) NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO `foo` VALUES (1, 100,NULL, NULL, NULL);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO `foo` VALUES (2, 101, 100, NULL, NULL);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `foo` VALUES (3, 102, 100, NULL, NULL);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `foo` VALUES (4, 103, 100, NULL, NULL);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `foo` VALUES (5, 104, 101, NULL, NULL);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `foo` VALUES (6, 105, 101, NULL, NULL);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `foo` VALUES (7, 106, 104, NULL, NULL);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `foo` VALUES (8, 107, 102, NULL, NULL);
Query OK, 1 row affected (0.00 sec)
mysql> UPDATE foo SET depth = 0, lineage = '/' WHERE ISNULL(parent_node);
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> UPDATE foo SET depth = NULL, lineage = NULL WHERE NOT ISNULL(parent_node
);
Query OK, 0 rows affected (0.00 sec)
Rows matched: 7 Changed: 0 Warnings: 0
mysql> UPDATE
-> foo AS T
-> INNER JOIN foo AS P ON (T.parent_node = P.node)
-> SET
-> T.depth = P.depth + 1,
-> T.lineage = LTRIM(CONCAT(P.lineage, T.parent_node, '/'))
-> WHERE
-> P.depth >= 0
-> AND NOT ISNULL(P.lineage)
-> AND ISNULL(T.depth);
Query OK, 3 rows affected (0.01 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> UPDATE foo AS T INNER JOIN foo AS P ON (T.parent_node = P.no
de) SET T.depth = P.depth + 1, T.lineage = LTRIM(CONCAT(P.lineage, T.pa
rent_node, '/')) WHERE P.depth >= 0 AND NOT ISNULL(P.lineage) AND
ISNULL(T.depth);
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> UPDATE foo AS T INNER JOIN foo AS P ON (T.parent_node = P.no
de) SET T.depth = P.depth + 1, T.lineage = LTRIM(CONCAT(P.lineage, T.pa
rent_node, '/')) WHERE P.depth >= 0 AND NOT ISNULL(P.lineage) AND
ISNULL(T.depth);
ERROR 1194 (HY000): Table 'P' is marked as crashed and should be repaired
mysql> select * from foo;
+----+------+-------------+-------+---------------+
| id | node | parent_node | depth | lineage |
+----+------+-------------+-------+---------------+
| 1 | 100 | NULL | 0 | / |
| 2 | 101 | 100 | 1 | /100/ |
| 3 | 102 | 100 | 1 | /100/ |
| 4 | 103 | 100 | 1 | /100/ |
| 5 | 104 | 101 | 2 | /100/101/ |
| 6 | 105 | 101 | 2 | /100/101/ |
| 7 | 106 | 104 | 3 | /100/101/104/ |
| 8 | 107 | 102 | 2 | /100/102/ |
+----+------+-------------+-------+---------------+
8 rows in set (0.00 sec)
mysql> analyze table foo;
+----------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------+---------+----------+----------+
| test.foo | analyze | status | OK |
+----------+---------+----------+----------+
1 row in set (0.01 sec)
[21 Oct 2006 8:44]
Sergey Vojtovich
This problem was introduced with fix for bug#18036. I was able to create simplier test case: CREATE TABLE t1(a VARCHAR(16)); INSERT INTO t1 VALUES('aaaaaaaa'),(NULL); UPDATE t1 AS ta1, t1 AS ta2 SET ta1.a='aaaaaaaaaaaaaaaa';
[27 Oct 2006 17:35]
Sergey Vojtovich
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/14499 ChangeSet@1.2534, 2006-10-27 22:23:10+05:00, svoj@mysql.com +3 -0 BUG#21310 - Trees in SQL causing a "crashed" table with MyISAM storage engine An update that used a join of a table to itself and modified the table on one side of the join reported the table as crashed. This problem was introduced with fix for BUG#18036. Do not rely on (tables_to_update & table->map) while determining whether to use record cache for self-joined table updates. It must be disabled for both: table that is opened for reading and table that is opened for writing.
[23 Nov 2006 15:54]
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/15767 ChangeSet@1.2534, 2006-11-23 19:50:37+04:00, svoj@mysql.com +3 -0 BUG#21310 - Trees in SQL causing a "crashed" table with MyISAM storage engine An update that used a join of a table to itself and modified the table on one side of the join reported the table as crashed or updated wrong rows. Fixed by creating temporary table for self-joined multi update statement.
[20 Dec 2006 15:05]
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/17222 ChangeSet@1.2534, 2006-12-20 19:05:35+04:00, svoj@mysql.com +4 -0 BUG#21310 - Trees in SQL causing a "crashed" table with MyISAM storage engine An update that used a join of a table to itself and modified the table on one side of the join reported the table as crashed or updated wrong rows. Fixed by creating temporary table for self-joined multi update statement.
[25 Jan 2007 9:28]
Sergey Vojtovich
Pushed to trees currently marked as 5.0.36 and 5.1.15.
[5 Feb 2007 11:40]
Sergey Vojtovich
Pushed to tree currently marked as 4.1.23.
[7 Feb 2007 12:18]
MC Brown
A note has been added to the 4.1.23, 5.0.36 and 5.1.15 changelogs.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.065 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.