postgres.git / summary / log / commit / refs

commit    90e8efa338dd2f9b96edce8fc2f033ea9ca5b1c7
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Wed Nov 10 21:51:39 2010 +0000
First released in: 9.1.0, 8.1.23, 8.2.19, 8.3.13, 8.4.6, 9.0.2

    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.


src/backend/utils/adt/geo_ops.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c index a1ee2f7cf63..21c07978459 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; [parent: 55425d372143]