On 20.09.2017 23:19, Alexander Korotkov wrote:
On Wed, Sep 20, 2017 at 11:07 PM, Tom Lane <t...@sss.pgh.pa.us
<mailto:t...@sss.pgh.pa.us>> wrote:
Darafei Praliaskouski <m...@komzpa.net <mailto:m...@komzpa.net>> writes:
> I have some questions about the circles example though.
> * What is the reason for isnan check and swap of box ordinates
for circle? It wasn't in the code previously.
I hadn't paid any attention to this patch previously, but this comment
excited my curiosity, so I went and looked:
+ bbox->high.x = circle->center.x + circle->radius;
+ bbox->low.x = circle->center.x - circle->radius;
+ bbox->high.y = circle->center.y + circle->radius;
+ bbox->low.y = circle->center.y - circle->radius;
+
+ if (isnan(bbox->low.x))
+ {
+ double tmp = bbox->low.x;
+ bbox->low.x = bbox->high.x;
+ bbox->high.x = tmp;
+ }
Maybe I'm missing something, but it appears to me that it's
impossible for
bbox->low.x to be NaN unless circle->center.x and/or
circle->radius is a
NaN, in which case bbox->high.x would also have been computed as a
NaN,
making the swap entirely useless. Likewise for the Y case. There
may be
something useful to do about NaNs here, but this doesn't seem like it.
Yeah, +1.
It is possible for bbox->low.x to be NaN when circle->center.x is and
circle->radius are both +Infinity. Without this float-order-preserving
swapping
one regression test for KNN with ORDER BY index will be totally broken
(you can
try it: https://github.com/glukhovn/postgres/tree/knn). Unfortunately, I
do not
remember exactly why, but most likely because of the incorrect index
structure.
--
Nikita Glukhov
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company