[postgis-commits] svn - r3264 - branches/1.3/lwgeom
postgis-commits at postgis.refractions.net
postgis-commits at postgis.refractions.net
Thu Nov 6 09:13:49 PST 2008
Author: mcayland
Date: 2008-11-06 09:13:49 -0800 (Thu, 06 Nov 2008)
New Revision: 3264
Modified:
branches/1.3/lwgeom/lwgeom_dump.c
Log:
Fix for GBT#66: ST_Dump kills backend when fed CIRCULAR STRING. With thanks to Regina Obe.
Modified: branches/1.3/lwgeom/lwgeom_dump.c
===================================================================
--- branches/1.3/lwgeom/lwgeom_dump.c 2008-11-06 17:05:31 UTC (rev 3263)
+++ branches/1.3/lwgeom/lwgeom_dump.c 2008-11-06 17:13:49 UTC (rev 3264)
@@ -23,6 +23,7 @@
#include "wktparse.h"
/*#define PGIS_DEBUG 1 */
+int lwgeom_contains_subgeoms(int type);
Datum LWGEOM_dump(PG_FUNCTION_ARGS);
Datum LWGEOM_dump_rings(PG_FUNCTION_ARGS);
@@ -44,6 +45,28 @@
#define LAST(x) ((x)->stack[(x)->stacklen-1])
#define POP(x) (--((x)->stacklen))
+/* Helper function to determine whether or not a geometry type is MULTI or not.
+ TODO: this is a candidate for adding to liblwgeom, hence its name */
+int
+lwgeom_contains_subgeoms(int type)
+{
+ /* Return TRUE if the geometry contains sub-geometries */
+ switch(type)
+ {
+ case MULTIPOINTTYPE:
+ case MULTIPOLYGONTYPE:
+ case COLLECTIONTYPE:
+ case COMPOUNDTYPE:
+ case MULTICURVETYPE:
+ case MULTISURFACETYPE:
+ return -1;
+ break;
+
+ default:
+ return 0;
+ }
+}
+
PG_FUNCTION_INFO_V1(LWGEOM_dump);
Datum LWGEOM_dump(PG_FUNCTION_ARGS)
{
@@ -79,7 +102,7 @@
state->root = lwgeom;
state->stacklen=0;
- if ( TYPE_GETTYPE(lwgeom->type) >= MULTIPOINTTYPE )
+ if ( lwgeom_contains_subgeoms(TYPE_GETTYPE(lwgeom->type)) )
{
/*
* Push a GEOMDUMPNODE on the state stack
@@ -126,7 +149,7 @@
/* Handled simple geometries */
if ( ! state->root ) SRF_RETURN_DONE(funcctx);
- if ( TYPE_GETTYPE(state->root->type) < MULTIPOINTTYPE )
+ if ( ! lwgeom_contains_subgeoms(TYPE_GETTYPE(state->root->type)) )
{
values[0] = "{}";
values[1] = lwgeom_to_hexwkb(state->root, -1);
@@ -145,16 +168,16 @@
if ( node->idx < lwcoll->ngeoms )
{
lwgeom = lwcoll->geoms[node->idx];
- if ( TYPE_GETTYPE(lwgeom->type) < MULTIPOINTTYPE )
+ if ( ! lwgeom_contains_subgeoms(TYPE_GETTYPE(lwgeom->type)) )
{
- /* write address of current geom */
- ptr=address; *ptr++='{';
- for (i=0; i<state->stacklen; i++)
- {
- if ( i ) ptr += sprintf(ptr, ",");
- ptr += sprintf(ptr, "%d", state->stack[i]->idx+1);
- }
- *ptr++='}'; *ptr='\0';
+ /* write address of current geom */
+ ptr=address; *ptr++='{';
+ for (i=0; i<state->stacklen; i++)
+ {
+ if ( i ) ptr += sprintf(ptr, ",");
+ ptr += sprintf(ptr, "%d", state->stack[i]->idx+1);
+ }
+ *ptr++='}'; *ptr='\0';
break;
}
More information about the postgis-commits
mailing list