Fix line_construct_pm() for the case of "infinite" (DBL_MAX) slope.
authorTom Lane <[email protected]>
Wed, 10 Nov 2010 21:51:39 +0000 (16:51 -0500)
committerTom Lane <[email protected]>
Wed, 10 Nov 2010 21:52:24 +0000 (16:52 -0500)
This code was just plain wrong: what you got was not a line through the
given point but a line almost indistinguishable from the Y-axis, although
not truly vertical.  The only caller that tries to use this function with
m == DBL_MAX is dist_ps_internal for the case where the lseg is horizontal;
it would end up producing the distance from the given point to the place
where the lseg's line crosses the Y-axis.  That function is used by other
operators too, so there are several operators that could compute wrong
distances from a line segment to something else.  Per bug #5745 from
jindiax.

Back-patch to all supported branches.

src/backend/utils/adt/geo_ops.c

index f3b6a389ff407d3a742a4344648dc50796ee753e..8a99df1356cfdbce44840d8b59052ffd1f0872f9 100644 (file)
@@ -1072,13 +1072,20 @@ line_construct_pm(Point *pt, double m)
 {
    LINE       *result = (LINE *) palloc(sizeof(LINE));
 
-   /* use "mx - y + yinter = 0" */
-   result->A = m;
-   result->B = -1.0;
    if (m == DBL_MAX)
-       result->C = pt->y;
+   {
+       /* vertical - use "x = C" */
+       result->A = -1;
+       result->B = 0;
+       result->C = pt->x;
+   }
    else
+   {
+       /* use "mx - y + yinter = 0" */
+       result->A = m;
+       result->B = -1.0;
        result->C = pt->y - m * pt->x;
+   }
 
 #ifdef NOT_USED
    result->m = m;