mirror of
https://git.osgeo.org/gitea/postgis/postgis
synced 2024-10-23 00:22:38 +00:00
Better error messages for SRID mismatch.
Closes #4110 Closes https://github.com/postgis/postgis/pull/455 git-svn-id: http://svn.osgeo.org/postgis/trunk@17673 b70326c6-7e19-0410-871a-916f4a2858ee
This commit is contained in:
parent
0ac59543fe
commit
e8de17d061
1
NEWS
1
NEWS
|
@ -194,6 +194,7 @@ Additional features enabled if you are running Proj6+ and PostgreSQL 12
|
|||
- #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
|
||||
|
|
|
@ -398,3 +398,31 @@ gserialized_get_sortable_hash(const GSERIALIZED *g)
|
|||
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);
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@ GSERIALIZED *gserialized_set_gbox(GSERIALIZED *g, GBOX *gbox);
|
|||
* 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.
|
||||
|
|
|
@ -249,9 +249,6 @@ typedef enum LWORD_T {
|
|||
*/
|
||||
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.
|
||||
*/
|
||||
|
|
|
@ -329,16 +329,6 @@ char *lwmessage_truncate(char *str, int startpos, int endpos, int maxlength, int
|
|||
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)
|
||||
{
|
||||
|
|
|
@ -160,6 +160,16 @@ GSERIALIZED *geometry_serialize(LWGEOM *lwgeom);
|
|||
*/
|
||||
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.
|
||||
|
|
|
@ -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 @@ Datum geography_distance_knn(PG_FUNCTION_ARGS)
|
|||
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 @@ Datum geography_distance_uncached(PG_FUNCTION_ARGS)
|
|||
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,8 +218,7 @@ Datum geography_distance(PG_FUNCTION_ARGS)
|
|||
if (PG_NARGS() > 2)
|
||||
use_spheroid = PG_GETARG_BOOL(2);
|
||||
|
||||
|
||||
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);
|
||||
|
@ -283,6 +282,8 @@ Datum geography_dwithin(PG_FUNCTION_ARGS)
|
|||
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 @@ Datum geography_dwithin(PG_FUNCTION_ARGS)
|
|||
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 @@ Datum geography_distance_tree(PG_FUNCTION_ARGS)
|
|||
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 @@ Datum geography_distance_tree(PG_FUNCTION_ARGS)
|
|||
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 @@ Datum geography_dwithin_uncached(PG_FUNCTION_ARGS)
|
|||
/* 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 @@ Datum geography_dwithin_uncached(PG_FUNCTION_ARGS)
|
|||
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 @@ Datum geography_covers(PG_FUNCTION_ARGS)
|
|||
/* 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 @@ Datum geography_coveredby(PG_FUNCTION_ARGS)
|
|||
/* 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) )
|
||||
{
|
||||
|
|
|
@ -537,6 +537,7 @@ Datum BOX2D_construct(PG_FUNCTION_ARGS)
|
|||
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 @@ Datum BOX2D_construct(PG_FUNCTION_ARGS)
|
|||
PG_RETURN_NULL();
|
||||
}
|
||||
|
||||
error_if_srid_mismatch(minpoint->srid, maxpoint->srid);
|
||||
|
||||
result = gbox_new(lwflags(0, 0, 0));
|
||||
|
||||
/* Process X min/max */
|
||||
|
|
|
@ -570,7 +570,7 @@ Datum BOX3D_construct(PG_FUNCTION_ARGS)
|
|||
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);
|
||||
|
|
|
@ -33,7 +33,6 @@
|
|||
#include "lwgeom_rtree.h"
|
||||
#include "lwgeom_functions_analytic.h"
|
||||
|
||||
|
||||
#include "access/htup_details.h"
|
||||
|
||||
/* Prototypes */
|
||||
|
@ -479,7 +478,7 @@ Datum ST_LineCrossingDirection(PG_FUNCTION_ARGS)
|
|||
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);
|
||||
|
|
|
@ -604,8 +604,7 @@ Datum LWGEOM_closestpoint(PG_FUNCTION_ARGS)
|
|||
LWGEOM *point;
|
||||
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__);
|
||||
|
||||
point = lwgeom_closest_point(lwgeom1, lwgeom2);
|
||||
|
||||
|
@ -634,8 +633,7 @@ Datum LWGEOM_shortestline2d(PG_FUNCTION_ARGS)
|
|||
LWGEOM *theline;
|
||||
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__);
|
||||
|
||||
theline = lwgeom_closest_line(lwgeom1, lwgeom2);
|
||||
|
||||
|
@ -664,8 +662,7 @@ Datum LWGEOM_longestline2d(PG_FUNCTION_ARGS)
|
|||
LWGEOM *theline;
|
||||
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__);
|
||||
|
||||
theline = lwgeom_furthest_line(lwgeom1, lwgeom2);
|
||||
|
||||
|
@ -692,8 +689,7 @@ Datum ST_Distance(PG_FUNCTION_ARGS)
|
|||
GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
|
||||
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__);
|
||||
|
||||
mindist = lwgeom_mindistance2d(lwgeom1, lwgeom2);
|
||||
|
||||
|
@ -731,7 +727,7 @@ Datum LWGEOM_dwithin(PG_FUNCTION_ARGS)
|
|||
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 @@ Datum LWGEOM_dfullywithin(PG_FUNCTION_ARGS)
|
|||
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,8 +784,7 @@ Datum LWGEOM_maxdistance2d_linestring(PG_FUNCTION_ARGS)
|
|||
GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
|
||||
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_maxdistance2d(lwgeom1, lwgeom2);
|
||||
|
||||
|
@ -816,8 +811,7 @@ Datum LWGEOM_closestpoint3d(PG_FUNCTION_ARGS)
|
|||
LWGEOM *point;
|
||||
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__);
|
||||
|
||||
point = lwgeom_closest_point_3d(lwgeom1, lwgeom2);
|
||||
// point = lw_dist3d_distancepoint(lwgeom1, lwgeom2, lwgeom1->srid, DIST_MIN);
|
||||
|
@ -848,8 +842,7 @@ Datum LWGEOM_shortestline3d(PG_FUNCTION_ARGS)
|
|||
LWGEOM *theline;
|
||||
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__);
|
||||
|
||||
theline = lwgeom_closest_line_3d(lwgeom1, lwgeom2);
|
||||
// theline = lw_dist3d_distanceline(lwgeom1, lwgeom2, lwgeom1->srid, DIST_MIN);
|
||||
|
@ -880,8 +873,7 @@ Datum LWGEOM_longestline3d(PG_FUNCTION_ARGS)
|
|||
LWGEOM *theline;
|
||||
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__);
|
||||
|
||||
theline = lwgeom_furthest_line_3d(lwgeom1, lwgeom2);
|
||||
// theline = lw_dist3d_distanceline(lwgeom1, lwgeom2, lwgeom1->srid, DIST_MAX);
|
||||
|
@ -910,8 +902,7 @@ Datum ST_3DDistance(PG_FUNCTION_ARGS)
|
|||
GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
|
||||
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__);
|
||||
|
||||
mindist = lwgeom_mindistance3d(lwgeom1, lwgeom2);
|
||||
|
||||
|
@ -934,8 +925,7 @@ Datum ST_3DIntersects(PG_FUNCTION_ARGS)
|
|||
GSERIALIZED *geom2 = PG_GETARG_GSERIALIZED_P(1);
|
||||
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__);
|
||||
|
||||
mindist = lwgeom_mindistance3d_tolerance(lwgeom1, lwgeom2, 0.0);
|
||||
|
||||
|
@ -968,7 +958,7 @@ Datum LWGEOM_dwithin3d(PG_FUNCTION_ARGS)
|
|||
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 @@ Datum LWGEOM_dfullywithin3d(PG_FUNCTION_ARGS)
|
|||
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 @@ Datum LWGEOM_maxdistance3d(PG_FUNCTION_ARGS)
|
|||
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 @@ Datum LWGEOM_collect(PG_FUNCTION_ARGS)
|
|||
|
||||
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 @@ Datum LWGEOM_collect(PG_FUNCTION_ARGS)
|
|||
}
|
||||
|
||||
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 @@ Datum LWGEOM_collect_garray(PG_FUNCTION_ARGS)
|
|||
|
||||
/* 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 @@ Datum LWGEOM_makeline_garray(PG_FUNCTION_ARGS)
|
|||
/* 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 @@ Datum LWGEOM_makeline(PG_FUNCTION_ARGS)
|
|||
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,11 +2562,9 @@ Datum optimistic_overlap(PG_FUNCTION_ARGS)
|
|||
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);
|
||||
|
||||
error_if_srid_mismatch(geom1->srid, geom2->srid);
|
||||
gserialized_error_if_srid_mismatch(pg_geom1, pg_geom2, __func__);
|
||||
|
||||
if (geom1->type != POLYGONTYPE)
|
||||
{
|
||||
|
|
|
@ -199,7 +199,7 @@ Datum ST_InterpolatePoint(PG_FUNCTION_ARGS)
|
|||
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 @@ Datum LWGEOM_line_locate_point(PG_FUNCTION_ARGS)
|
|||
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));
|
||||
|
|
|
@ -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 @@ Datum pgis_union_geometry_array(PG_FUNCTION_ARGS)
|
|||
|
||||
/* 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 @@ Datum pgis_geometry_union_transfn(PG_FUNCTION_ARGS)
|
|||
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,8 +1679,7 @@ Datum overlaps(PG_FUNCTION_ARGS)
|
|||
|
||||
geom1 = PG_GETARG_GSERIALIZED_P(0);
|
||||
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__);
|
||||
|
||||
/* A.Overlaps(Empty) == FALSE */
|
||||
if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
|
||||
|
@ -1737,8 +1734,7 @@ Datum contains(PG_FUNCTION_ARGS)
|
|||
GEOSGeometry *g1, *g2;
|
||||
GBOX box1, box2;
|
||||
PrepGeomCache *prep_cache;
|
||||
|
||||
error_if_srid_mismatch(gserialized_get_srid(geom1), gserialized_get_srid(geom2));
|
||||
gserialized_error_if_srid_mismatch(geom1, geom2, __func__);
|
||||
|
||||
/* A.Contains(Empty) == FALSE */
|
||||
if (gserialized_is_empty(geom1) || gserialized_is_empty(geom2))
|
||||
|
@ -1877,8 +1873,7 @@ Datum containsproperly(PG_FUNCTION_ARGS)
|
|||
|
||||
geom1 = PG_GETARG_GSERIALIZED_P(0);
|
||||
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__);
|
||||
|
||||
/* A.ContainsProperly(Empty) == FALSE */
|
||||
if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
|
||||
|
@ -1952,7 +1947,7 @@ Datum covers(PG_FUNCTION_ARGS)
|
|||
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,8 +2077,7 @@ Datum coveredby(PG_FUNCTION_ARGS)
|
|||
|
||||
geom1 = PG_GETARG_GSERIALIZED_P(0);
|
||||
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__);
|
||||
|
||||
/* A.CoveredBy(Empty) == FALSE */
|
||||
if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
|
||||
|
@ -2196,8 +2190,7 @@ Datum crosses(PG_FUNCTION_ARGS)
|
|||
|
||||
geom1 = PG_GETARG_GSERIALIZED_P(0);
|
||||
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__);
|
||||
|
||||
/* A.Crosses(Empty) == FALSE */
|
||||
if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
|
||||
|
@ -2253,8 +2246,7 @@ Datum ST_Intersects(PG_FUNCTION_ARGS)
|
|||
|
||||
geom1 = PG_GETARG_GSERIALIZED_P(0);
|
||||
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__);
|
||||
|
||||
/* A.Intersects(Empty) == FALSE */
|
||||
if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
|
||||
|
@ -2379,8 +2371,7 @@ Datum touches(PG_FUNCTION_ARGS)
|
|||
|
||||
geom1 = PG_GETARG_GSERIALIZED_P(0);
|
||||
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__);
|
||||
|
||||
/* A.Touches(Empty) == FALSE */
|
||||
if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
|
||||
|
@ -2437,8 +2428,7 @@ Datum disjoint(PG_FUNCTION_ARGS)
|
|||
|
||||
geom1 = PG_GETARG_GSERIALIZED_P(0);
|
||||
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__);
|
||||
|
||||
/* A.Disjoint(Empty) == TRUE */
|
||||
if ( gserialized_is_empty(geom1) || gserialized_is_empty(geom2) )
|
||||
|
@ -2496,11 +2486,10 @@ Datum relate_pattern(PG_FUNCTION_ARGS)
|
|||
|
||||
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,19 +2539,13 @@ Datum relate_full(PG_FUNCTION_ARGS)
|
|||
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);
|
||||
|
||||
|
@ -2609,8 +2592,7 @@ Datum ST_Equals(PG_FUNCTION_ARGS)
|
|||
|
||||
geom1 = PG_GETARG_GSERIALIZED_P(0);
|
||||
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__);
|
||||
|
||||
/* Empty == Empty */
|
||||
if ( gserialized_is_empty(geom1) && gserialized_is_empty(geom2) )
|
||||
|
@ -2815,11 +2797,8 @@ LWGEOM** ARRAY2LWGEOM(ArrayType* array, uint32_t nelems, int* is3d, int* srid)
|
|||
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 @@ GEOSGeometry** ARRAY2GEOS(ArrayType* array, uint32_t nelems, int* is3d, int* sri
|
|||
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,12 +3237,11 @@ Datum ST_Split(PG_FUNCTION_ARGS)
|
|||
LWGEOM *lwgeom_in, *lwblade_in, *lwgeom_out;
|
||||
|
||||
in = PG_GETARG_GSERIALIZED_P(0);
|
||||
lwgeom_in = lwgeom_from_gserialized(in);
|
||||
|
||||
blade_in = PG_GETARG_GSERIALIZED_P(1);
|
||||
lwblade_in = lwgeom_from_gserialized(blade_in);
|
||||
gserialized_error_if_srid_mismatch(in, blade_in, __func__);
|
||||
|
||||
error_if_srid_mismatch(lwgeom_in->srid, lwblade_in->srid);
|
||||
lwgeom_in = lwgeom_from_gserialized(in);
|
||||
lwblade_in = lwgeom_from_gserialized(blade_in);
|
||||
|
||||
lwgeom_out = lwgeom_split(lwgeom_in, lwblade_in);
|
||||
lwgeom_free(lwgeom_in);
|
||||
|
|
|
@ -489,12 +489,11 @@ Datum geometry_distance_spheroid(PG_FUNCTION_ARGS)
|
|||
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 )
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in a new issue