From: Tom Lane Date: Wed, 10 Nov 2010 21:51:39 +0000 (-0500) Subject: Fix line_construct_pm() for the case of "infinite" (DBL_MAX) slope. X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=5abb72f9af64339ed97eb991b0bd3456bd651f8e;p=users%2Fc2main%2Fpostgres.git Fix line_construct_pm() for the case of "infinite" (DBL_MAX) slope. 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. --- diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c index 24157a53c5..10fc79f116 100644 --- a/src/backend/utils/adt/geo_ops.c +++ b/src/backend/utils/adt/geo_ops.c @@ -1070,13 +1070,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;