| Bug #35273 | Corrupted table if using GIS index | ||
|---|---|---|---|
| Submitted: | 13 Mar 2008 16:02 | Modified: | 17 Mar 2008 22:11 |
| Reporter: | Guilhem Bichot | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Maria storage engine | Severity: | S3 (Non-critical) |
| Version: | 5.1-maria | OS: | Any |
| Assigned to: | Guilhem Bichot | CPU Architecture: | Any |
[13 Mar 2008 16:24]
Guilhem Bichot
When this bug is fixed, please run the attached maria-gis-rtree.test to see if there are next bugs.
[13 Mar 2008 16:24]
Guilhem Bichot
test file for GIS Maria bugs
Attachment: maria-g (application/octet-stream, text), 0 bytes.
[13 Mar 2008 16:25]
Guilhem Bichot
test file for GIS Maria bugs
Attachment: maria-gis-rtree.test (application/octet-stream, text), 41.47 KiB.
[17 Mar 2008 21:32]
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/44157 ChangeSet@1.2617, 2008-03-17 22:31:50+01:00, guilhem@gbichot4.local +3 -0 Fix for BUG#35273 "Corrupted table if using GIS index": when modifying R-tree indices we forgot to unpin pages (causing flush at-end-of-statement to fail - because page is pinned - and thus mark table corrupted) and also to unlock key_del (causing assertion failure info->used_key_del==0 at maria_close()).

Description: Use this (taken from gis-rtree.test): -- source include/have_geometry.inc set storage_engine=maria; # # test of rtree (using with spatial data) # --disable_warnings DROP TABLE IF EXISTS t1, t2; --enable_warnings CREATE TABLE t1 ( fid INT NOT NULL AUTO_INCREMENT PRIMARY KEY, g GEOMETRY NOT NULL, SPATIAL KEY(g) ) Transactional=0; SHOW CREATE TABLE t1; let $1=150; let $2=150; while ($1) { eval INSERT INTO t1 (g) VALUES (GeomFromText('LineString($1 $1, $2 $2)')); dec $1; inc $2; } It will say in the error log that t1.MAI is corrupted How to repeat: see description Suggested fix: at the end of one INSERT, the table is unlocked, which causes a flush of all index pages (expected, table is not transactional) and this flush fails because it finds one page is pinned. This page was pinned by a ma_write_keypage(). Either it should not have been pinned, or it should have been unpinned before the flush (I assume the latter is the good solution).