diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2010-11-10 16:51:39 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2010-11-10 16:54:44 -0500 |
commit | 1a6b4396013bc369a59df9ab3a637fe31f6d9ff5 (patch) | |
tree | 907290836c88de753e0d7963d6c39f73ece9799f /src | |
parent | 2ff82b6e67f7f3910620ca0d7ca9117e375b65e4 (diff) | |
download | postgresql-1a6b4396013bc369a59df9ab3a637fe31f6d9ff5.tar.gz postgresql-1a6b4396013bc369a59df9ab3a637fe31f6d9ff5.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/utils/adt/geo_ops.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/backend/utils/adt/geo_ops.c b/src/backend/utils/adt/geo_ops.c index d3683d53714..1c0552371ed 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; |