in file rax.c, the comment within function raxRemove claims the following:
* Example of case "1". A tree stores the keys "FOO" = 1 and
* "FOOBAR" = 2:
*
*
* "FOO" -> "BAR" -> [] (2)
* (1)
*
* After the removal of "FOO" the tree can be compressed as:
*
* "FOOBAR" -> [] (2)
*
However, the logic associated with variable trycompress didn't take compress node into account.
The two predicates if (h->size == 0) and else if (h->size == 1) don't catch the intermediate compress node obviously.
This demo shows the real scenario: 1) insertion of key "foo", value 1. 2) insertion of key "foobar", value 2. 3) insertion of key "foobarzxc", value 3. 4) deletion of key "foobarzxc". 5) deletion of key "foobar".
// after 1/2/3
"foo" -> "bar"=0x7ffc7cbdb69c -> "zxc"=0x7ffc7cbdb64c -> []=0x7ffc7cbdb5fc
// after 4/5
"foo" -> "bar" -> "zxc" -> []=0x7ffc7cbdb5fc
Not "foobarzxc" -> []=0x7ffc7cbdb5fc as expected
Anyway, this only prolongs the recompression and no bug is incurred. @antirez
Comment From: antirez
Thank you @MEDSMEDS, please could you resubmit to https://github.com/antirez/rax ? Thank you.
Comment From: antirez
(Btw excellent bug report)
Comment From: MEDSMEDS
done. btw all the best for your future adventure.