[postgis-tickets] r17673 - Better error messages for SRID mismatch.

Darafei komzpa at gmail.com
Sun Aug 4 04:37:34 PDT 2019


Author: komzpa
Date: 2019-08-04 04:37:34 -0700 (Sun, 04 Aug 2019)
New Revision: 17673

Modified:
   trunk/NEWS
   trunk/liblwgeom/gserialized.c
   trunk/liblwgeom/gserialized.h
   trunk/liblwgeom/liblwgeom.h.in
   trunk/liblwgeom/lwutil.c
   trunk/libpgcommon/lwgeom_pg.h
   trunk/postgis/geography_measurement.c
   trunk/postgis/lwgeom_box.c
   trunk/postgis/lwgeom_box3d.c
   trunk/postgis/lwgeom_functions_analytic.c
   trunk/postgis/lwgeom_functions_basic.c
   trunk/postgis/lwgeom_functions_lrs.c
   trunk/postgis/lwgeom_geos.c
   trunk/postgis/lwgeom_spheroid.c
   trunk/regress/core/ctors_expected
   trunk/regress/core/split_expected
Log:
Better error messages for SRID mismatch.
Closes #4110
Closes https://github.com/postgis/postgis/pull/455


Modified: trunk/NEWS
===================================================================
--- trunk/NEWS	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/NEWS	2019-08-04 11:37:34 UTC (rev 17673)
@@ -194,6 +194,7 @@
   - #4441, Make GiST penalty friendly to multi-column indexes and build single-column
            ones faster. (Darafei Praliaskouski)
   - #4403, Support for shp2pgsql ability to reproject with copy mode (-D) (Regina Obe)
+  - #4410, More descriptive error messages about SRID mismatch (Darafei Praliaskouski)
 
 * Fixes *
   - #4342, Move deprecated functions into legacy.sql file

Modified: trunk/liblwgeom/gserialized.c
===================================================================
--- trunk/liblwgeom/gserialized.c	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/liblwgeom/gserialized.c	2019-08-04 11:37:34 UTC (rev 17673)
@@ -398,3 +398,31 @@
 	else
 		return gbox_get_sortable_hash(&box, gserialized_get_srid(g));
 }
+
+void gserialized_error_if_srid_mismatch(const GSERIALIZED *g1, const GSERIALIZED *g2, const char *funcname);
+void
+gserialized_error_if_srid_mismatch(const GSERIALIZED *g1, const GSERIALIZED *g2, const char *funcname)
+{
+	int32_t srid1 = gserialized_get_srid(g1);
+	int32_t srid2 = gserialized_get_srid(g2);
+	if (srid1 != srid2)
+		lwerror("%s: Operation on mixed SRID geometries (%s, %d) != (%s, %d)",
+			funcname,
+			lwtype_name(gserialized1_get_type(g1)),
+			srid1,
+			lwtype_name(gserialized_get_type(g2)),
+			srid2);
+}
+
+void gserialized_error_if_srid_mismatch_reference(const GSERIALIZED *g1, const int32_t srid2, const char *funcname);
+void
+gserialized_error_if_srid_mismatch_reference(const GSERIALIZED *g1, const int32_t srid2, const char *funcname)
+{
+	int32_t srid1 = gserialized_get_srid(g1);
+	if (srid1 != srid2)
+		lwerror("%s: Operation on mixed SRID geometries %s %d != %d",
+			funcname,
+			lwtype_name(gserialized1_get_type(g1)),
+			srid1,
+			srid2);
+}

Modified: trunk/liblwgeom/gserialized.h
===================================================================
--- trunk/liblwgeom/gserialized.h	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/liblwgeom/gserialized.h	2019-08-04 11:37:34 UTC (rev 17673)
@@ -43,7 +43,7 @@
 * Remove the bounding box from a #GSERIALIZED. Returns a freshly
 * allocated #GSERIALIZED every time.
 */
-GSERIALIZED* gserialized_drop_gbox(GSERIALIZED *g)
+GSERIALIZED *gserialized_drop_gbox(GSERIALIZED *g);
 
 /**
 * Read the box from the #GSERIALIZED or calculate it if necessary.

Modified: trunk/liblwgeom/liblwgeom.h.in
===================================================================
--- trunk/liblwgeom/liblwgeom.h.in	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/liblwgeom/liblwgeom.h.in	2019-08-04 11:37:34 UTC (rev 17673)
@@ -249,9 +249,6 @@
 */
 extern int32_t clamp_srid(int32_t srid);
 
-/* Raise an lwerror if srids do not match */
-void error_if_srid_mismatch(int32_t srid1, int32_t srid2);
-
 /**
  * Global functions for memory/logging handlers.
  */

Modified: trunk/liblwgeom/lwutil.c
===================================================================
--- trunk/liblwgeom/lwutil.c	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/liblwgeom/lwutil.c	2019-08-04 11:37:34 UTC (rev 17673)
@@ -329,16 +329,6 @@
 	return output;
 }
 
-
-void
-error_if_srid_mismatch(int32_t srid1, int32_t srid2)
-{
-	if ( srid1 != srid2 )
-	{
-		lwerror("Operation on mixed SRID geometries");
-	}
-}
-
 int32_t
 clamp_srid(int32_t srid)
 {

Modified: trunk/libpgcommon/lwgeom_pg.h
===================================================================
--- trunk/libpgcommon/lwgeom_pg.h	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/libpgcommon/lwgeom_pg.h	2019-08-04 11:37:34 UTC (rev 17673)
@@ -161,6 +161,16 @@
 GSERIALIZED* geography_serialize(LWGEOM *lwgeom);
 
 /**
+ * Compare SRIDs of two GSERIALIZEDs and print informative error message if they differ.
+ */
+void gserialized_error_if_srid_mismatch(const GSERIALIZED *g1, const GSERIALIZED *g2, const char *funcname);
+
+/**
+ * Compare SRIDs of GSERIALIZEDs to reference and print informative error message if they differ.
+ */
+void gserialized_error_if_srid_mismatch_reference(const GSERIALIZED *g1, const int32_t srid, const char *funcname);
+
+/**
 * Pull out a gbox bounding box as fast as possible.
 * Tries to read cached box from front of serialized vardata.
 * If no cached box, calculates box from scratch.

Modified: trunk/postgis/geography_measurement.c
===================================================================
--- trunk/postgis/geography_measurement.c	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/postgis/geography_measurement.c	2019-08-04 11:37:34 UTC (rev 17673)
@@ -33,12 +33,12 @@
 #include <string.h>
 #include <stdio.h>
 
-#include "liblwgeom.h"         /* For standard geometry types. */
+#include "liblwgeom.h"                  /* For standard geometry types. */
 #include "liblwgeom_internal.h"         /* For FP comparators. */
-#include "lwgeom_pg.h"       /* For debugging macros. */
-#include "geography.h"	     /* For utility functions. */
+#include "lwgeom_pg.h"                  /* For debugging macros. */
+#include "geography.h"                  /* For utility functions. */
 #include "geography_measurement_trees.h" /* For circ_tree caching */
-#include "lwgeom_transform.h" /* For SRID functions */
+#include "lwgeom_transform.h"            /* For SRID functions */
 
 #ifdef PROJ_GEODESIC
 /* round to 10 nm precision */
@@ -83,11 +83,11 @@
 	g1 = PG_GETARG_GSERIALIZED_P(0);
 	g2 = PG_GETARG_GSERIALIZED_P(1);
 
+	gserialized_error_if_srid_mismatch(g1, g2, __func__);
+
 	/* Initialize spheroid */
 	spheroid_init_from_srid(fcinfo, gserialized_get_srid(g1), &s);
 
-	error_if_srid_mismatch(gserialized_get_srid(g1), gserialized_get_srid(g2));
-
 	/* Set to sphere if requested */
 	if ( ! use_spheroid )
 		s.a = s.b = s.radius;
@@ -154,7 +154,7 @@
 	if ( PG_NARGS() > 3 && ! PG_ARGISNULL(3) )
 		use_spheroid = PG_GETARG_BOOL(3);
 
-	error_if_srid_mismatch(gserialized_get_srid(g1), gserialized_get_srid(g2));
+	gserialized_error_if_srid_mismatch(g1, g2, __func__);
 
 	/* Initialize spheroid */
 	spheroid_init_from_srid(fcinfo, gserialized_get_srid(g1), &s);
@@ -218,9 +218,8 @@
 	if (PG_NARGS() > 2)
 		use_spheroid = PG_GETARG_BOOL(2);
 
+	gserialized_error_if_srid_mismatch(g1, g2, __func__);
 
-	error_if_srid_mismatch(gserialized_get_srid(g1), gserialized_get_srid(g2));
-
 	/* Initialize spheroid */
 	spheroid_init_from_srid(fcinfo, gserialized_get_srid(g1), &s);
 
@@ -283,6 +282,8 @@
 	double distance;
 	int dwithin = LW_FALSE;
 
+	gserialized_error_if_srid_mismatch(g1, g2, __func__);
+
 	/* Read our tolerance value. */
 	if ( PG_NARGS() > 2 && ! PG_ARGISNULL(2) )
 		tolerance = PG_GETARG_FLOAT8(2);
@@ -291,8 +292,6 @@
 	if ( PG_NARGS() > 3 && ! PG_ARGISNULL(3) )
 		use_spheroid = PG_GETARG_BOOL(3);
 
-	error_if_srid_mismatch(gserialized_get_srid(g1), gserialized_get_srid(g2));
-
 	/* Initialize spheroid */
 	spheroid_init_from_srid(fcinfo, gserialized_get_srid(g1), &s);
 
@@ -349,7 +348,9 @@
 	g1 = PG_GETARG_GSERIALIZED_P(0);
 	g2 = PG_GETARG_GSERIALIZED_P(1);
 
-	/* Return FALSE on empty arguments. */
+	gserialized_error_if_srid_mismatch(g1, g2, __func__);
+
+	/* Return zero on empty arguments. */
 	if ( gserialized_is_empty(g1) || gserialized_is_empty(g2) )
 	{
 		PG_FREE_IF_COPY(g1, 0);
@@ -365,8 +366,6 @@
 	if ( PG_NARGS() > 3 && ! PG_ARGISNULL(3) )
 		use_spheroid = PG_GETARG_BOOL(3);
 
-	error_if_srid_mismatch(gserialized_get_srid(g1), gserialized_get_srid(g2));
-
 	/* Initialize spheroid */
 	spheroid_init_from_srid(fcinfo, gserialized_get_srid(g1), &s);
 
@@ -404,6 +403,7 @@
 	/* Get our geometry objects loaded into memory. */
 	g1 = PG_GETARG_GSERIALIZED_P(0);
 	g2 = PG_GETARG_GSERIALIZED_P(1);
+	gserialized_error_if_srid_mismatch(g1, g2, __func__);
 
 	/* Read our tolerance value. */
 	if ( PG_NARGS() > 2 && ! PG_ARGISNULL(2) )
@@ -413,8 +413,6 @@
 	if ( PG_NARGS() > 3 && ! PG_ARGISNULL(3) )
 		use_spheroid = PG_GETARG_BOOL(3);
 
-	error_if_srid_mismatch(gserialized_get_srid(g1), gserialized_get_srid(g2));
-
 	/* Initialize spheroid */
 	spheroid_init_from_srid(fcinfo, gserialized_get_srid(g1), &s);
 
@@ -733,13 +731,12 @@
 	/* Get our geometry objects loaded into memory. */
 	g1 = PG_GETARG_GSERIALIZED_P(0);
 	g2 = PG_GETARG_GSERIALIZED_P(1);
+	gserialized_error_if_srid_mismatch(g1, g2, __func__);
 
 	/* Construct our working geometries */
 	lwgeom1 = lwgeom_from_gserialized(g1);
 	lwgeom2 = lwgeom_from_gserialized(g2);
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
-
 	/* EMPTY never intersects with another geometry */
 	if ( lwgeom_is_empty(lwgeom1) || lwgeom_is_empty(lwgeom2) )
 	{
@@ -775,13 +772,12 @@
 	/* Pick them up in reverse order to covers */
 	g1 = PG_GETARG_GSERIALIZED_P(1);
 	g2 = PG_GETARG_GSERIALIZED_P(0);
+	gserialized_error_if_srid_mismatch(g1, g2, __func__);
 
 	/* Construct our working geometries */
 	lwgeom1 = lwgeom_from_gserialized(g1);
 	lwgeom2 = lwgeom_from_gserialized(g2);
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
-
 	/* EMPTY never intersects with another geometry */
 	if ( lwgeom_is_empty(lwgeom1) || lwgeom_is_empty(lwgeom2) )
 	{

Modified: trunk/postgis/lwgeom_box.c
===================================================================
--- trunk/postgis/lwgeom_box.c	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/postgis/lwgeom_box.c	2019-08-04 11:37:34 UTC (rev 17673)
@@ -537,6 +537,7 @@
 	GBOX *result;
 	LWPOINT *minpoint, *maxpoint;
 	double min, max, tmp;
+	gserialized_error_if_srid_mismatch(pgmin, pgmax, __func__);
 
 	minpoint = (LWPOINT*)lwgeom_from_gserialized(pgmin);
 	maxpoint = (LWPOINT*)lwgeom_from_gserialized(pgmax);
@@ -552,8 +553,6 @@
 		PG_RETURN_NULL();
 	}
 
-	error_if_srid_mismatch(minpoint->srid, maxpoint->srid);
-
 	result = gbox_new(lwflags(0, 0, 0));
 
 	/* Process X min/max */

Modified: trunk/postgis/lwgeom_box3d.c
===================================================================
--- trunk/postgis/lwgeom_box3d.c	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/postgis/lwgeom_box3d.c	2019-08-04 11:37:34 UTC (rev 17673)
@@ -570,7 +570,7 @@
 		PG_RETURN_NULL();
 	}
 
-	error_if_srid_mismatch(minpoint->srid, maxpoint->srid);
+	gserialized_error_if_srid_mismatch(min, max, __func__);
 
 	getPoint3dz_p(((LWPOINT *)minpoint)->point, 0, &minp);
 	getPoint3dz_p(((LWPOINT *)maxpoint)->point, 0, &maxp);

Modified: trunk/postgis/lwgeom_functions_analytic.c
===================================================================
--- trunk/postgis/lwgeom_functions_analytic.c	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/postgis/lwgeom_functions_analytic.c	2019-08-04 11:37:34 UTC (rev 17673)
@@ -33,7 +33,6 @@
 #include "lwgeom_rtree.h"
 #include "lwgeom_functions_analytic.h"
 
-
 #include "access/htup_details.h"
 
 /* Prototypes */
@@ -479,7 +478,7 @@
 	GSERIALIZED *geom1 = PG_GETARG_GSERIALIZED_P(0);
 	GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
 	type1 = gserialized_get_type(geom1);
 	type2 = gserialized_get_type(geom2);

Modified: trunk/postgis/lwgeom_functions_basic.c
===================================================================
--- trunk/postgis/lwgeom_functions_basic.c	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/postgis/lwgeom_functions_basic.c	2019-08-04 11:37:34 UTC (rev 17673)
@@ -604,9 +604,8 @@
 	LWGEOM *point;
 	LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
 	LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
-
 	point = lwgeom_closest_point(lwgeom1, lwgeom2);
 
 	if (lwgeom_is_empty(point))
@@ -634,9 +633,8 @@
 	LWGEOM *theline;
 	LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
 	LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
-
 	theline = lwgeom_closest_line(lwgeom1, lwgeom2);
 
 	if (lwgeom_is_empty(theline))
@@ -664,9 +662,8 @@
 	LWGEOM *theline;
 	LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
 	LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
-
 	theline = lwgeom_furthest_line(lwgeom1, lwgeom2);
 
 	if (lwgeom_is_empty(theline))
@@ -692,9 +689,8 @@
 	GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
 	LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
 	LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
-
 	mindist = lwgeom_mindistance2d(lwgeom1, lwgeom2);
 
 	lwgeom_free(lwgeom1);
@@ -731,7 +727,7 @@
 		PG_RETURN_NULL();
 	}
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
 	mindist = lwgeom_mindistance2d_tolerance(lwgeom1, lwgeom2, tolerance);
 
@@ -763,7 +759,7 @@
 		PG_RETURN_NULL();
 	}
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
 	maxdist = lwgeom_maxdistance2d_tolerance(lwgeom1, lwgeom2, tolerance);
 
@@ -788,9 +784,8 @@
 	GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
 	LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
 	LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
-
 	maxdist = lwgeom_maxdistance2d(lwgeom1, lwgeom2);
 
 	PG_FREE_IF_COPY(geom1, 0);
@@ -816,9 +811,8 @@
 	LWGEOM *point;
 	LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
 	LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
-
 	point = lwgeom_closest_point_3d(lwgeom1, lwgeom2);
 	// point = lw_dist3d_distancepoint(lwgeom1, lwgeom2, lwgeom1->srid, DIST_MIN);
 
@@ -848,9 +842,8 @@
 	LWGEOM *theline;
 	LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
 	LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
-
 	theline = lwgeom_closest_line_3d(lwgeom1, lwgeom2);
 	// theline = lw_dist3d_distanceline(lwgeom1, lwgeom2, lwgeom1->srid, DIST_MIN);
 
@@ -880,9 +873,8 @@
 	LWGEOM *theline;
 	LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
 	LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
-
 	theline = lwgeom_furthest_line_3d(lwgeom1, lwgeom2);
 	// theline = lw_dist3d_distanceline(lwgeom1, lwgeom2, lwgeom1->srid, DIST_MAX);
 
@@ -910,9 +902,8 @@
 	GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
 	LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
 	LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
-
 	mindist = lwgeom_mindistance3d(lwgeom1, lwgeom2);
 
 	PG_FREE_IF_COPY(geom1, 0);
@@ -934,9 +925,8 @@
 	GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
 	LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
 	LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
-
 	mindist = lwgeom_mindistance3d_tolerance(lwgeom1, lwgeom2, 0.0);
 
 	PG_FREE_IF_COPY(geom1, 0);
@@ -968,7 +958,7 @@
 		PG_RETURN_NULL();
 	}
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
 	mindist = lwgeom_mindistance3d_tolerance(lwgeom1, lwgeom2, tolerance);
 
@@ -1001,7 +991,7 @@
 		PG_RETURN_NULL();
 	}
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 	maxdist = lwgeom_maxdistance3d_tolerance(lwgeom1, lwgeom2, tolerance);
 
 	PG_FREE_IF_COPY(geom1, 0);
@@ -1026,7 +1016,7 @@
 	LWGEOM *lwgeom1 = lwgeom_from_gserialized(geom1);
 	LWGEOM *lwgeom2 = lwgeom_from_gserialized(geom2);
 
-	error_if_srid_mismatch(lwgeom1->srid, lwgeom2->srid);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
 	maxdist = lwgeom_maxdistance3d(lwgeom1, lwgeom2);
 
@@ -1160,6 +1150,7 @@
 
 	gser1 = PG_GETARG_GSERIALIZED_P(0);
 	gser2 = PG_GETARG_GSERIALIZED_P(1);
+	gserialized_error_if_srid_mismatch(gser1, gser2, __func__);
 
 	POSTGIS_DEBUGF(3,
 		       "LWGEOM_collect(%s, %s): call",
@@ -1174,7 +1165,6 @@
 	}
 
 	srid = gserialized_get_srid(gser1);
-	error_if_srid_mismatch(srid, gserialized_get_srid(gser2));
 
 	lwgeoms[0] = lwgeom_from_gserialized(gser1);
 	lwgeoms[1] = lwgeom_from_gserialized(gser2);
@@ -1286,22 +1276,18 @@
 
 			/* COMPUTE_BBOX WHEN_SIMPLE */
 			if (lwgeoms[count]->bbox)
-			{
 				box = gbox_copy(lwgeoms[count]->bbox);
-			}
 		}
 		else
 		{
 			/* Check SRID homogeneity */
-			error_if_srid_mismatch(lwgeoms[count]->srid, srid);
+			gserialized_error_if_srid_mismatch_reference(geom, srid, __func__);
 
 			/* COMPUTE_BBOX WHEN_SIMPLE */
 			if (box)
 			{
 				if (lwgeoms[count]->bbox)
-				{
 					gbox_merge(lwgeoms[count]->bbox, box);
-				}
 				else
 				{
 					pfree(box);
@@ -1460,9 +1446,7 @@
 			/* TODO: also get ZMflags */
 		}
 		else
-		{
-			error_if_srid_mismatch(geoms[ngeoms - 1]->srid, srid);
-		}
+			gserialized_error_if_srid_mismatch_reference(geom, srid, __func__);
 
 		POSTGIS_DEBUGF(3, "%s: element %d deserialized", __func__, ngeoms);
 	}
@@ -1510,7 +1494,7 @@
 		PG_RETURN_NULL();
 	}
 
-	error_if_srid_mismatch(gserialized_get_srid(pglwg1), gserialized_get_srid(pglwg2));
+	gserialized_error_if_srid_mismatch(pglwg1, pglwg2, __func__);
 
 	lwgeoms[0] = lwgeom_from_gserialized(pglwg1);
 	lwgeoms[1] = lwgeom_from_gserialized(pglwg2);
@@ -2578,12 +2562,10 @@
 	double dist = PG_GETARG_FLOAT8(2);
 	GBOX g1_bvol;
 	double calc_dist;
-
 	LWGEOM *geom1 = lwgeom_from_gserialized(pg_geom1);
 	LWGEOM *geom2 = lwgeom_from_gserialized(pg_geom2);
+	gserialized_error_if_srid_mismatch(pg_geom1, pg_geom2, __func__);
 
-	error_if_srid_mismatch(geom1->srid, geom2->srid);
-
 	if (geom1->type != POLYGONTYPE)
 	{
 		elog(ERROR, "optimistic_overlap: first arg isn't a polygon\n");

Modified: trunk/postgis/lwgeom_functions_lrs.c
===================================================================
--- trunk/postgis/lwgeom_functions_lrs.c	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/postgis/lwgeom_functions_lrs.c	2019-08-04 11:37:34 UTC (rev 17673)
@@ -199,7 +199,7 @@
 		PG_RETURN_NULL();
 	}
 
-	error_if_srid_mismatch(gserialized_get_srid(gser_line), gserialized_get_srid(gser_point));
+	gserialized_error_if_srid_mismatch(gser_line, gser_point, __func__);
 
 	if ( ! gserialized_has_m(gser_line) )
 	{
@@ -237,7 +237,7 @@
 		PG_RETURN_NULL();
 	}
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
 	lwline = lwgeom_as_lwline(lwgeom_from_gserialized(geom1));
 	lwpoint = lwgeom_as_lwpoint(lwgeom_from_gserialized(geom2));

Modified: trunk/postgis/lwgeom_geos.c
===================================================================
--- trunk/postgis/lwgeom_geos.c	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/postgis/lwgeom_geos.c	2019-08-04 11:37:34 UTC (rev 17673)
@@ -44,7 +44,6 @@
 #include "liblwgeom.h"
 #include "lwgeom_rtree.h"
 #include "lwgeom_geos_prepared.h"
-
 #include "float.h" /* for DBL_DIG */
 
 
@@ -420,9 +419,7 @@
 
 		/* Check for SRID mismatch in array elements */
 		if ( gotsrid )
-		{
-			error_if_srid_mismatch(srid, gserialized_get_srid(gser_in));
-		}
+			gserialized_error_if_srid_mismatch_reference(gser_in, srid, __func__);
 		else
 		{
 			/* Initialize SRID/dimensions info */
@@ -570,7 +567,8 @@
 			if (state->srid != gserialized_get_srid(gser_in))
 				for (curgeom = 0; curgeom < state->ngeoms; curgeom++)
 					GEOSGeom_destroy(state->geoms[curgeom]);
-			error_if_srid_mismatch(state->srid, gserialized_get_srid(gser_in));
+
+			gserialized_error_if_srid_mismatch_reference(gser_in, state->srid, __func__);
 		}
 
 		if (!gserialized_is_empty(gser_in))
@@ -1681,9 +1679,8 @@
 
 	geom1 = PG_GETARG_GSERIALIZED_P(0);
 	geom2 = PG_GETARG_GSERIALIZED_P(1);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
-
 	/* A.Overlaps(Empty) == FALSE */
 	if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
 		PG_RETURN_BOOL(false);
@@ -1737,9 +1734,8 @@
 	GEOSGeometry *g1, *g2;
 	GBOX box1, box2;
 	PrepGeomCache *prep_cache;
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
-
 	/* A.Contains(Empty) == FALSE */
 	if (gserialized_is_empty(geom1) || gserialized_is_empty(geom2))
 		PG_RETURN_BOOL(false);
@@ -1877,9 +1873,8 @@
 
 	geom1 = PG_GETARG_GSERIALIZED_P(0);
 	geom2 = PG_GETARG_GSERIALIZED_P(1);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
-
 	/* A.ContainsProperly(Empty) == FALSE */
 	if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
 		PG_RETURN_BOOL(false);
@@ -1952,7 +1947,7 @@
 	if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
 		PG_RETURN_BOOL(false);
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
 	/*
 	 * short-circuit 1: if geom2 bounding box is not completely inside
@@ -2082,9 +2077,8 @@
 
 	geom1 = PG_GETARG_GSERIALIZED_P(0);
 	geom2 = PG_GETARG_GSERIALIZED_P(1);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
-
 	/* A.CoveredBy(Empty) == FALSE */
 	if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
 		PG_RETURN_BOOL(false);
@@ -2196,9 +2190,8 @@
 
 	geom1 = PG_GETARG_GSERIALIZED_P(0);
 	geom2 = PG_GETARG_GSERIALIZED_P(1);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
-
 	/* A.Crosses(Empty) == FALSE */
 	if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
 		PG_RETURN_BOOL(false);
@@ -2253,9 +2246,8 @@
 
 	geom1 = PG_GETARG_GSERIALIZED_P(0);
 	geom2 = PG_GETARG_GSERIALIZED_P(1);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
-
 	/* A.Intersects(Empty) == FALSE */
 	if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
 		PG_RETURN_BOOL(false);
@@ -2379,9 +2371,8 @@
 
 	geom1 = PG_GETARG_GSERIALIZED_P(0);
 	geom2 = PG_GETARG_GSERIALIZED_P(1);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
-
 	/* A.Touches(Empty) == FALSE */
 	if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
 		PG_RETURN_BOOL(false);
@@ -2437,9 +2428,8 @@
 
 	geom1 = PG_GETARG_GSERIALIZED_P(0);
 	geom2 = PG_GETARG_GSERIALIZED_P(1);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
-
 	/* A.Disjoint(Empty) == TRUE */
 	if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
 		PG_RETURN_BOOL(true);
@@ -2496,11 +2486,10 @@
 
 	geom1 = PG_GETARG_GSERIALIZED_P(0);
 	geom2 = PG_GETARG_GSERIALIZED_P(1);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
 	/* TODO handle empty */
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
-
 	initGEOS(lwpgnotice, lwgeom_geos_error);
 
 	g1 = POSTGIS2GEOS(geom1);
@@ -2550,20 +2539,14 @@
 	text *result;
 	int bnr = GEOSRELATE_BNR_OGC;
 
-	POSTGIS_DEBUG(2, "in relate_full()");
-
 	/* TODO handle empty */
-
 	geom1 = PG_GETARG_GSERIALIZED_P(0);
 	geom2 = PG_GETARG_GSERIALIZED_P(1);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
 	if ( PG_NARGS() > 2 )
-	{
 		bnr = PG_GETARG_INT32(2);
-	}
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
-
 	initGEOS(lwpgnotice, lwgeom_geos_error);
 
 	g1 = POSTGIS2GEOS(geom1 );
@@ -2609,9 +2592,8 @@
 
 	geom1 = PG_GETARG_GSERIALIZED_P(0);
 	geom2 = PG_GETARG_GSERIALIZED_P(1);
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
-
 	/* Empty == Empty */
 	if ( gserialized_is_empty(geom1) && gserialized_is_empty(geom2) )
 		PG_RETURN_BOOL(true);
@@ -2815,11 +2797,8 @@
 		    gotsrid = true;
 		    *srid = gserialized_get_srid(geom);
 	    }
-	    else if (*srid != gserialized_get_srid(geom))
-	    {
-		    error_if_srid_mismatch(*srid, gserialized_get_srid(geom));
-		    return NULL;
-	    }
+	    else
+		    gserialized_error_if_srid_mismatch_reference(geom, *srid, __func__);
 
 	    i++;
     }
@@ -2869,11 +2848,10 @@
 		else if (*srid != gserialized_get_srid(geom))
 		{
             uint32_t j;
-            error_if_srid_mismatch(*srid, gserialized_get_srid(geom));
-
             for (j = 0; j <= i; j++) {
 				GEOSGeom_destroy(geos_geoms[j]);
 			}
+			gserialized_error_if_srid_mismatch_reference(geom, *srid, __func__);
 			return NULL;
 		}
 
@@ -3259,13 +3237,12 @@
 	LWGEOM *lwgeom_in, *lwblade_in, *lwgeom_out;
 
 	in = PG_GETARG_GSERIALIZED_P(0);
+	blade_in = PG_GETARG_GSERIALIZED_P(1);
+	gserialized_error_if_srid_mismatch(in, blade_in, __func__);
+
 	lwgeom_in = lwgeom_from_gserialized(in);
-
-	blade_in = PG_GETARG_GSERIALIZED_P(1);
 	lwblade_in = lwgeom_from_gserialized(blade_in);
 
-	error_if_srid_mismatch(lwgeom_in->srid, lwblade_in->srid);
-
 	lwgeom_out = lwgeom_split(lwgeom_in, lwblade_in);
 	lwgeom_free(lwgeom_in);
 	lwgeom_free(lwblade_in);

Modified: trunk/postgis/lwgeom_spheroid.c
===================================================================
--- trunk/postgis/lwgeom_spheroid.c	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/postgis/lwgeom_spheroid.c	2019-08-04 11:37:34 UTC (rev 17673)
@@ -489,12 +489,11 @@
 	bool use_spheroid = PG_GETARG_BOOL(3);
 	LWGEOM *lwgeom1, *lwgeom2;
 	double distance;
+	gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
 
 	/* Calculate some other parameters on the spheroid */
 	spheroid_init(sphere, sphere->a, sphere->b);
 
-	error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
-
 	/* Catch sphere special case and re-jig spheroid appropriately */
 	if ( ! use_spheroid )
 	{

Modified: trunk/regress/core/ctors_expected
===================================================================
--- trunk/regress/core/ctors_expected	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/regress/core/ctors_expected	2019-08-04 11:37:34 UTC (rev 17673)
@@ -1,11 +1,11 @@
 32749
-ERROR:  Operation on mixed SRID geometries
+ERROR:  LWGEOM_collect: Operation on mixed SRID geometries (Point, 32749) != (Point, 32740)
 SRID=3;LINESTRING(0 0,1 1)
-ERROR:  Operation on mixed SRID geometries
+ERROR:  LWGEOM_makeline: Operation on mixed SRID geometries (Point, 0) != (Point, 3)
 ST_MakeLine1|LINESTRING(0 0,1 1,10 0)
 ST_MakeLine_agg1|LINESTRING(0 0,1 1,10 0,20 20,40 4,40 4,40 5,40 5,40 6,40 6,40 7,40 8)
 ST_MakeLine_agg2|LINESTRING(0 0,1 0,1 0)
 BOX(0 0,1 1)
-ERROR:  Operation on mixed SRID geometries
+ERROR:  BOX2D_construct: Operation on mixed SRID geometries (Point, 0) != (Point, 3)
 BOX3D(0 0 0,1 1 0)
-ERROR:  Operation on mixed SRID geometries
+ERROR:  BOX3D_construct: Operation on mixed SRID geometries (Point, 0) != (Point, 3)

Modified: trunk/regress/core/split_expected
===================================================================
--- trunk/regress/core/split_expected	2019-08-04 07:45:16 UTC (rev 17672)
+++ trunk/regress/core/split_expected	2019-08-04 11:37:34 UTC (rev 17673)
@@ -1,9 +1,9 @@
-ERROR:  Operation on mixed SRID geometries
+ERROR:  ST_Split: Operation on mixed SRID geometries (LineString, 10) != (Point, 5)
 1|SRID=10;GEOMETRYCOLLECTION(LINESTRING(0 0,5 0),LINESTRING(5 0,10 0))
 1.1|SRID=10;GEOMETRYCOLLECTION(LINESTRING(10 0,5 0),LINESTRING(5 0,0 0))
 2|SRID=10;GEOMETRYCOLLECTION(LINESTRING(0 0,10 0))
 3|SRID=10;GEOMETRYCOLLECTION(LINESTRING(0 0,10 0))
-ERROR:  Operation on mixed SRID geometries
+ERROR:  ST_Split: Operation on mixed SRID geometries (LineString, 10) != (LineString, 5)
 4|SRID=10;GEOMETRYCOLLECTION(LINESTRING(0 0,10 0))
 5|SRID=10;GEOMETRYCOLLECTION(LINESTRING(0 0,10 0))
 6|SRID=10;GEOMETRYCOLLECTION(LINESTRING(0 0,5 0),LINESTRING(5 0,10 0))



More information about the postgis-tickets mailing list