[postgis-commits] svn - r3263 - trunk/lwgeom
postgis-commits at postgis.refractions.net
postgis-commits at postgis.refractions.net
Thu Nov 6 09:05:32 PST 2008
Author: mcayland
Date: 2008-11-06 09:05:31 -0800 (Thu, 06 Nov 2008)
New Revision: 3263
Modified:
trunk/lwgeom/lwgeom_dump.c
Log:
Fix for GBT#66: ST_Dump kills backend when fed CIRCULAR STRING. With thanks to Regina Obe.
Modified: trunk/lwgeom/lwgeom_dump.c
===================================================================
--- trunk/lwgeom/lwgeom_dump.c 2008-11-06 16:12:11 UTC (rev 3262)
+++ trunk/lwgeom/lwgeom_dump.c 2008-11-06 17:05:31 UTC (rev 3263)
@@ -38,6 +38,29 @@
#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)
{
@@ -73,7 +96,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
@@ -120,7 +143,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, PARSER_CHECK_NONE, -1);
@@ -139,16 +162,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