From b0f2d681bdfd6a5b3e90d092f9d924f943b4fc5f Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Wed, 10 Nov 2010 16:51:39 -0500
Subject: [PATCH] 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 f3b6a389ff4..8a99df1356c 100644
--- a/src/backend/utils/adt/geo_ops.c
+++ b/src/backend/utils/adt/geo_ops.c
@@ -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;
-- 
GitLab