From: Sandro Santilli Date: Wed, 12 Jan 2005 07:37:10 +0000 (+0000) Subject: setSRID() and force_2d() changed to use PG_LWGEOM_construct() entry point, X-Git-Tag: pgis_1_0_0RC1~22 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4131b79a4d42bf2626d9e786995dbe12c8ec918f;p=postgis setSRID() and force_2d() changed to use PG_LWGEOM_construct() entry point, for AUTOCACHE_BBOX support. git-svn-id: http://svn.osgeo.org/postgis/trunk@1282 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/lwgeom/BBOXCACHE_BEHAVIOURS b/lwgeom/BBOXCACHE_BEHAVIOURS index 6b1e1f0ec..2561a654f 100644 --- a/lwgeom/BBOXCACHE_BEHAVIOURS +++ b/lwgeom/BBOXCACHE_BEHAVIOURS @@ -81,8 +81,11 @@ section also use it. [ WHEN_SIMPLE (use input bbox if present) ] noop(geometry) *LWG* ExteriorRing(geometry) *LWG* - SetSRID(geometry,int4) **SRL** - force_2d(geometry) **SRL** + SetSRID(geometry,int4) *SRL* + + # doesn't change bbox cache status if input is already 2d + force_2d(geometry) *SRL* + force_3dz(geometry) **SRL** force_3d(geometry) **SRL** force_3dm(geometry) **SRL** diff --git a/lwgeom/lwgeom_functions_basic.c b/lwgeom/lwgeom_functions_basic.c index 3e18b7160..4e883fb8d 100644 --- a/lwgeom/lwgeom_functions_basic.c +++ b/lwgeom/lwgeom_functions_basic.c @@ -1156,6 +1156,7 @@ PG_FUNCTION_INFO_V1(LWGEOM_force_2d); Datum LWGEOM_force_2d(PG_FUNCTION_ARGS) { PG_LWGEOM *geom = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); + char *srl; PG_LWGEOM *result; size_t size = 0; @@ -1163,16 +1164,13 @@ Datum LWGEOM_force_2d(PG_FUNCTION_ARGS) if ( lwgeom_ndims(geom->type) == 2 ) PG_RETURN_POINTER(geom); // allocate a larger for safety and simplicity - result = (PG_LWGEOM *) lwalloc(geom->size); + srl = (char *) lwalloc(geom->size); lwgeom_force2d_recursive(SERIALIZED_FORM(geom), - SERIALIZED_FORM(result), &size); + srl, &size); - // we can safely avoid this... memory will be freed at - // end of query processing anyway. - //result = lwrealloc(result, size+4); - - result->size = size+4; + result = PG_LWGEOM_construct(srl, pglwgeom_getSRID(geom), + lwgeom_hasBBOX(geom->type)); PG_RETURN_POINTER(result); } diff --git a/lwgeom/lwgeom_ogc.c b/lwgeom/lwgeom_ogc.c index d1d4579fb..31c5c338c 100644 --- a/lwgeom/lwgeom_ogc.c +++ b/lwgeom/lwgeom_ogc.c @@ -84,11 +84,12 @@ Datum LWGEOM_getSRID(PG_FUNCTION_ARGS) PG_FUNCTION_INFO_V1(LWGEOM_setSRID); Datum LWGEOM_setSRID(PG_FUNCTION_ARGS) { - PG_LWGEOM *lwgeom = (PG_LWGEOM *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); + PG_LWGEOM *geom = (PG_LWGEOM *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0)); int newSRID = PG_GETARG_INT32(1); PG_LWGEOM *result; - result = pglwgeom_setSRID(lwgeom, newSRID); + result = PG_LWGEOM_construct(SERIALIZED_FORM(geom), newSRID, + lwgeom_hasBBOX(geom->type)); PG_RETURN_POINTER(result); }