From b92ef252de1e22d0ff194d87aafafbb8b632bec7 Mon Sep 17 00:00:00 2001 From: Regina Obe Date: Sat, 4 May 2013 01:16:37 +0000 Subject: [PATCH] #2293: patch to throw an error for curved geoms on ST_DumpPoints rather than crash. git-svn-id: http://svn.osgeo.org/postgis/trunk@11346 b70326c6-7e19-0410-871a-916f4a2858ee --- postgis/lwgeom_dumppoints.c | 11 +++++------ regress/dumppoints.sql | 20 ++++++++++++++++++++ regress/dumppoints_expected | 2 ++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/postgis/lwgeom_dumppoints.c b/postgis/lwgeom_dumppoints.c index 6e42daaec..9559cb100 100644 --- a/postgis/lwgeom_dumppoints.c +++ b/postgis/lwgeom_dumppoints.c @@ -192,18 +192,17 @@ Datum LWGEOM_dumppoints(PG_FUNCTION_ARGS) { if (state->pt == 0) lwpoint = lwgeom_as_lwpoint(lwgeom); break; case LINETYPE: - case CIRCSTRINGTYPE: line = lwgeom_as_lwline(lwgeom); if (line->points && state->pt <= line->points->npoints) { lwpoint = lwline_get_lwpoint((LWLINE*)lwgeom, state->pt); } break; - case CURVEPOLYTYPE: + case CIRCSTRINGTYPE: + ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION), + errmsg("Invalid Geometry type circstring passed to ST_DumpPoints()"))); default: - /* TODO error? */ - if (--state->stacklen == 0) SRF_RETURN_DONE(funcctx); - state->pathlen--; - continue; + ereport(ERROR, (errcode(ERRCODE_DATA_EXCEPTION), + errmsg("Invalid Geometry type passed to ST_DumpPoints()"))); } /* diff --git a/regress/dumppoints.sql b/regress/dumppoints.sql index 7c85f2157..8ad24ded1 100644 --- a/regress/dumppoints.sql +++ b/regress/dumppoints.sql @@ -157,3 +157,23 @@ FROM ( )'::geometry AS geom ) AS g ) j; + +SELECT path, ST_AsText(geom) +FROM ( + SELECT (ST_DumpPoints(g.geom)).* + FROM + (SELECT 'SRID=4326;CURVEPOLYGON( + CIRCULARSTRING(-71.0821 42.3036, -71.4821 42.3036, + -71.7821 42.7036, -71.0821 42.7036, -71.0821 42.3036), + (-71.1821 42.4036, -71.3821 42.6036, -71.3821 42.4036, -71.1821 42.4036) + )'::geometry as geom +) as g +) j; + +SELECT path, ST_AsText(geom) +FROM ( + SELECT (ST_DumpPoints(g.geom)).* + FROM ( +SELECT 'CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1))'::geometry as geom +) as g +) j; diff --git a/regress/dumppoints_expected b/regress/dumppoints_expected index 78b41ddbf..a2b384fa9 100644 --- a/regress/dumppoints_expected +++ b/regress/dumppoints_expected @@ -82,3 +82,5 @@ {5,1,2,2}|POINT(5 6) {5,1,2,3}|POINT(6 6) {5,1,2,4}|POINT(5 5) +ERROR: Invalid Geometry type circstring passed to ST_DumpPoints() +ERROR: Invalid Geometry type circstring passed to ST_DumpPoints() -- 2.50.1