From 5e7111ef27fa95d998465c7b3a5bb0c47e8b9ad2 Mon Sep 17 00:00:00 2001
From: ggnmstr <jora.babayan@gmail.com>
Date: Sat, 29 Jul 2023 15:32:23 +0700
Subject: [PATCH] Fix sline_sline_pos, add tests for degenerate polygons

---
 expected/poly.out |  9 +++++++++
 sql/poly.sql      |  6 ++++++
 src/line.c        | 18 +++++++++---------
 3 files changed, 24 insertions(+), 9 deletions(-)

diff --git a/expected/poly.out b/expected/poly.out
index a705483..180e06f 100644
--- a/expected/poly.out
+++ b/expected/poly.out
@@ -350,6 +350,15 @@ SELECT spoly '{(0d,0d),(10d,10d),(0d,10d),(10d,0d)}';
 ERROR:  spherepoly_from_array: a line segment overlaps or polygon too large
 LINE 1: SELECT spoly '{(0d,0d),(10d,10d),(0d,10d),(10d,0d)}';
                      ^
+--- degenerate polygons -----
+SELECT spoly '{(0d,1d),(0d,2d),(0d,3d)}';
+ERROR:  spherepoly_from_array: a line segment overlaps or polygon too large
+LINE 1: SELECT spoly '{(0d,1d),(0d,2d),(0d,3d)}';
+                     ^
+SELECT spoly '{(1d,0d),(2d,0d),(3d,0d)}';
+ERROR:  spherepoly_from_array: a line segment overlaps or polygon too large
+LINE 1: SELECT spoly '{(1d,0d),(2d,0d),(3d,0d)}';
+                     ^
 --- functions
 SELECT npoints( spoly '{(10d,0d),(10d,1d),(15d,0d)}');
  npoints 
diff --git a/sql/poly.sql b/sql/poly.sql
index 52cedd7..bdfbef8 100644
--- a/sql/poly.sql
+++ b/sql/poly.sql
@@ -96,6 +96,12 @@ SELECT spoly_deg(NULL::float8[]);
 
 SELECT spoly '{(0d,0d),(10d,10d),(0d,10d),(10d,0d)}';
 
+--- degenerate polygons -----
+
+SELECT spoly '{(0d,1d),(0d,2d),(0d,3d)}';
+
+SELECT spoly '{(1d,0d),(2d,0d),(3d,0d)}';
+
 --- functions
 
 SELECT npoints( spoly '{(10d,0d),(10d,1d),(15d,0d)}');
diff --git a/src/line.c b/src/line.c
index 315adfb..b8d1195 100644
--- a/src/line.c
+++ b/src/line.c
@@ -494,15 +494,6 @@ sline_sline_pos(const SLine *l1, const SLine *l2)
 	vector3d_spoint(&p[2], &v[1][0]);
 	vector3d_spoint(&p[3], &v[1][1]);
 
-	/* check connected lines */
-	if (FPgt(il2->length, 0.0) && (vector3d_eq(&v[0][0], &v[1][0]) ||
-								   vector3d_eq(&v[0][0], &v[1][1]) ||
-								   vector3d_eq(&v[0][1], &v[1][0]) ||
-								   vector3d_eq(&v[0][1], &v[1][1])))
-	{
-		return PGS_LINE_CONNECT;
-	}
-
 	/* Check, sl2 is at equator */
 	if (FPzero(p[2].lat) && FPzero(p[3].lat))
 	{
@@ -527,6 +518,15 @@ sline_sline_pos(const SLine *l1, const SLine *l2)
 		return PGS_LINE_AVOID;
 	}
 
+	/* check connected lines */
+	if (FPgt(il2->length, 0.0) && (vector3d_eq(&v[0][0], &v[1][0]) ||
+								   vector3d_eq(&v[0][0], &v[1][1]) ||
+								   vector3d_eq(&v[0][1], &v[1][0]) ||
+								   vector3d_eq(&v[0][1], &v[1][1])))
+	{
+		return PGS_LINE_CONNECT;
+	}
+
 	/* Now sl2 is not at equator */
 
 	if (FPle(il2->length, seg_length))