]> granicus.if.org Git - postgresql/commit
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:20:20 +0000 (09:20 +0300)
commit9b3ef66afe132e1f71e2577f513f28bee5fef39e
tree6b8fbf877e0ef48ac150eacdf914ae3b0028f124
parent0e34d82538bd48fc537d512539cee014654a45e1
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