mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-27 04:54:21 +01:00
When a divider cell is deleted from an index interior page, the following algorithm is used: 1. Find predecessor: Move to largest key in left subtree (self.prev()) 2. Create replacement: Convert predecessor leaf cell to interior cell format, using original cell's left child pointer 3. Replace: Drop original cell from parent page, insert replacement at same position 4. Cleanup: Delete predecessor from leaf page The error in our logic was that we always expected to only traverse down one level of the btree: ```rust let parent_page = self.stack.parent_page().unwrap(); let leaf_page = self.stack.top(); ``` This meant that when the deletion happened on say, level 1, and the replacement cell was taken from level 3, we actually inserted the replacement cell into level 2 instead of level 1. In #2106, this manifested as the following chain of pages, going from parent to children: 3 -> 111 -> 119 Cell was deleted from page 3 (whose left pointer is 111), and a replacement cell was taken from 119, incorrectly inserted into 111, and its left child pointer also set as 111! The fix is quite trivial: store the page we are on before we start traversing down. Closes #2106