From fdde6eacac4aa8a8dd8a21f012122d8eb40f6d0f Mon Sep 17 00:00:00 2001 From: Mark Leslie Date: Thu, 2 Jul 2009 00:32:31 +0000 Subject: [PATCH] Fixed the inappropriate minpoint checking of circular strings within curvepoly, as reported in ticket 212, comment... 7ish. git-svn-id: http://svn.osgeo.org/postgis/branches/1.4@4244 b70326c6-7e19-0410-871a-916f4a2858ee --- liblwgeom/lwgparse.c | 6 ++++-- regress/sql-mm-curvepoly.sql | 3 +++ regress/sql-mm-curvepoly_expected | 4 ++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/liblwgeom/lwgparse.c b/liblwgeom/lwgparse.c index 87827f99d..cb1314574 100644 --- a/liblwgeom/lwgparse.c +++ b/liblwgeom/lwgparse.c @@ -770,8 +770,8 @@ check_curvepolygon_minpoints() tuple *tp = the_geom.stack->next; /* Current tuple */ int i, j, k; /* Loop counters */ int num, mum, lum; /* subgeom, point counts */ + int minpoints; int count = 0; /* Running counter for compound curve */ - int minpoints = 4; num = tp->uu.nn.num; LWDEBUG(3, "check_curvepolygon_minpoints"); @@ -779,6 +779,7 @@ check_curvepolygon_minpoints() /* Check each sub-geom for minpoints */ for (i = 0; i < num; i++) { + minpoints = 3; tp = tp->next; LWDEBUGF(5, "Subgeom type %d: %p", tp->uu.nn.type, tp); switch (TYPE_GETTYPE(tp->uu.nn.type)) @@ -808,6 +809,7 @@ check_curvepolygon_minpoints() } break; case LINETYPE: + minpoints = 4; case CIRCSTRINGTYPE: tp = tp->next; mum = tp->uu.nn.num; @@ -818,7 +820,7 @@ check_curvepolygon_minpoints() if (mum < minpoints) { LWDEBUGF(5, "Minpoint check failed: needed %d, got %d", - minpoints, count); + minpoints, mum); LWGEOM_WKT_VALIDATION_ERROR(PARSER_ERROR_MOREPOINTS, tp->uu.nn.parse_location); } break; diff --git a/regress/sql-mm-curvepoly.sql b/regress/sql-mm-curvepoly.sql index 8e4c3a1e3..337dab11f 100644 --- a/regress/sql-mm-curvepoly.sql +++ b/regress/sql-mm-curvepoly.sql @@ -505,3 +505,6 @@ SELECT 'segmentize count', ST_NPoints(ST_CurveToLine(ST_GeomFromEWKT('CURVEPOLYG SELECT 'segmentize/desegmentize 1', ST_NRings(ST_LineToCurve(ST_CurveToLine(ST_GeomFromEWKT('CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0,2 1,2 3,4 3),(4 3,4 5,1 4,0 0)))')))); SELECT 'segmentize/desegmentize 2', ST_NPoints(ST_LineToCurve(ST_CurveToLine(ST_GeomFromEWKT('CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0,2 1,2 3,4 3),(4 3,4 5,1 4,0 0)))')))); SELECT 'segmentize/desegmentize 3', ST_NPoints(ST_ExteriorRing(ST_LineToCurve(ST_CurveToLine(ST_GeomFromEWKT('CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0,2 1,2 3,4 3),(4 3,4 5,1 4,0 0)))'))))); +SELECT ST_GeomFromEWKT('CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 4 5, 1 4, 0 0)), CIRCULARSTRING(1.7 1, 1.4 0.4, 1.7 1) )'); +SELECT ST_GeomFromEWKT('CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 4 5, 1 4, 0 0)), (1.7 1, 1.4 0.4, 1.7 1) )'); +SELECT ST_GeomFromEWKT('CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 0 0)), CIRCULARSTRING(1.7 1, 1.4 0.4, 1.7 1) )'); diff --git a/regress/sql-mm-curvepoly_expected b/regress/sql-mm-curvepoly_expected index 55b1beb87..83e26307b 100644 --- a/regress/sql-mm-curvepoly_expected +++ b/regress/sql-mm-curvepoly_expected @@ -161,3 +161,7 @@ segmentize count|132 segmentize/desegmentize 1|0 segmentize/desegmentize 2|9 segmentize/desegmentize 3|9 +010D0000000200000001090000000200000001080000000500000000000000000000000000000000000000000000000000004000000000000000000000000000000040000000000000F03F00000000000000400000000000000840000000000000104000000000000008400102000000040000000000000000001040000000000000084000000000000010400000000000001440000000000000F03F000000000000104000000000000000000000000000000000010800000003000000333333333333FB3F000000000000F03F666666666666F63F9A9999999999D93F333333333333FB3F000000000000F03F +ERROR: geometry requires more points +HINT: "..., 1 4, 0 0)), (1.7 1, 1.4 0.4, 1.7 1)" <-- parse error at position 112 within geometry +010D0000000200000001090000000200000001080000000500000000000000000000000000000000000000000000000000004000000000000000000000000000000040000000000000F03F00000000000000400000000000000840000000000000104000000000000008400102000000020000000000000000001040000000000000084000000000000000000000000000000000010800000003000000333333333333FB3F000000000000F03F666666666666F63F9A9999999999D93F333333333333FB3F000000000000F03F -- 2.49.0