[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