Fix bugs in SP-GiST search with range type's -|- (adjacent) operator.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 16 Jul 2014 06:10:54 +0000 (09:10 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Wed, 16 Jul 2014 06:19:06 +0000 (09:19 +0300)
commit1264ef31a399927f9fe02212e10980bf4ba7b9f2
tree23a87bc93e0f3d6bc2fbaf2fe2fd75693233d6bd
parentf15821eefd70941d4ec5bd77d75c1da5534ba6b2
Fix bugs in SP-GiST search with range type's -|- (adjacent) operator.

The consistent function contained several bugs:

* The "if (which2) { ... }"  block was broken. It compared the  argument's
lower bound against centroid's upper bound, while it was supposed to compare
the argument's upper bound against the centroid's lower bound (the comment
was correct, code was wrong). Also, it cleared bits in the "which1"
variable, while it was supposed to clear bits in "which2".

* If the argument's upper bound was equal to the centroid's lower bound, we
descended to both halves (= all quadrants). That's unnecessary, searching
the right quadrants is sufficient. This didn't lead to incorrect query
results, but was clearly wrong, and slowed down queries unnecessarily.

* In the case that argument's lower bound is adjacent to the centroid's
upper bound, we also don't need to visit all quadrants. Per similar
reasoning as previous point.

* The code where we compare the previous centroid with the current centroid
should match the code where we compare the current centroid with the
argument. The point of that code is to redo the calculation done in the
previous level, to see if we were supposed to traverse left or right (or up
or down), and if we actually did. If we moved in the different direction,
then we know there are no matches for bound.

Refactor the code and adds comments to make it more readable and easier to
reason about.

Backpatch to 9.3 where SP-GiST support for range types was introduced.
src/backend/utils/adt/rangetypes_spgist.c