From: Mark Leslie Date: Thu, 2 Jul 2009 08:31:24 +0000 (+0000) Subject: Making the changes from r4244 and r4245 onto trunk, addressing ticket 212. X-Git-Tag: 1.5.0b1~606 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=10d24712cdd3c9f55d25733546381203019969c7;p=postgis Making the changes from r4244 and r4245 onto trunk, addressing ticket 212. git-svn-id: http://svn.osgeo.org/postgis/trunk@4246 b70326c6-7e19-0410-871a-916f4a2858ee --- 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/postgis/lwgeom_ogc.c b/postgis/lwgeom_ogc.c index 440d4ec20..eea231175 100644 --- a/postgis/lwgeom_ogc.c +++ b/postgis/lwgeom_ogc.c @@ -177,6 +177,16 @@ lwgeom_numpoints_linestring_recursive(const uchar *serialized) LWDEBUG(2, "lwgeom_numpoints_linestring_recursive called."); + /* + * CURVEPOLY and COMPOUND have no concept of numpoints but look like + * collections once inspected. Fast-fail on these here. + */ + if (lwgeom_getType(inspected->type) == COMPOUNDTYPE || + lwgeom_getType(inspected->type) == CURVEPOLYTYPE) + { + return -1; + } + for (i=0; ingeometries; i++) { int32 npoints; @@ -192,6 +202,10 @@ lwgeom_numpoints_linestring_recursive(const uchar *serialized) { return ((LWLINE *)geom)->points->npoints; } + else if (lwgeom_getType(geom->type) == CIRCSTRINGTYPE) + { + return ((LWCIRCSTRING *)geom)->points->npoints; + } subgeom = lwgeom_getsubgeometry_inspected(inspected, i); if ( subgeom == NULL ) diff --git a/regress/sql-mm-circularstring.sql b/regress/sql-mm-circularstring.sql index 56c4231da..c62bde515 100644 --- a/regress/sql-mm-circularstring.sql +++ b/regress/sql-mm-circularstring.sql @@ -385,3 +385,4 @@ SELECT DropGeometryColumn('public', 'circularstring', 'the_geom_3dm'); SELECT DropGeometryColumn('public', 'circularstring', 'the_geom_2d'); DROP TABLE public.circularstring; SELECT ST_asText(ST_box2d('CIRCULARSTRING(220268.439465645 150415.359530563,220227.333322076 150505.561285879,220227.353105332 150406.434743975)'::geometry)); +SELECT ST_NumPoints(ST_GeomFromEWKT('CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3)')); diff --git a/regress/sql-mm-circularstring_expected b/regress/sql-mm-circularstring_expected index e023d7645..2ba6cca74 100644 --- a/regress/sql-mm-circularstring_expected +++ b/regress/sql-mm-circularstring_expected @@ -155,3 +155,4 @@ public.circularstring.the_geom_3dz effectively removed. public.circularstring.the_geom_3dm effectively removed. public.circularstring.the_geom_2d effectively removed. POLYGON((220187.375 150406.421875,220187.375 150506.71875,220288.828125 150506.71875,220288.828125 150406.421875,220187.375 150406.421875)) +5 diff --git a/regress/sql-mm-compoundcurve.sql b/regress/sql-mm-compoundcurve.sql index ca5f2a1fa..4dfed88ed 100644 --- a/regress/sql-mm-compoundcurve.sql +++ b/regress/sql-mm-compoundcurve.sql @@ -315,4 +315,4 @@ SELECT 'valid wkb compound curve 2', ST_asEWKT(ST_GeomFromEWKB(decode('010900000 SELECT 'valid wkb compound curve 3', ST_asEWKT(ST_GeomFromEWKB(decode('0109000000010000000102000000030000000CE586D73CF36240BBC46888F0523BC0102E91C951E76240DF90A1BEC0F841C0F970C100FFD7624074ADE6CE86CD3BC0', 'hex'))); SELECT 'valid wkb compound curve 4', ST_asEWKT(ST_GeomFromEWKB(decode('0109000000020000000102000000030000009FE5797057376340E09398B1B2373BC05AAE0A165F0963409F6760A2493D3DC0DB6286DFB057634082D8A1B32F843EC0010800000005000000DB6286DFB057634082D8A1B32F843EC0DB6286DFB057634082D8A1B32F843EC075B4E4D0C60C634031FA5D1A371540C0D7197CED9B636340A3CB59A7630A41C050F4A72AC0FB6240974769FCE3CF41C0', 'hex'))); SELECT 'valid wkb compound curve 5', ST_asEWKT(ST_GeomFromEWKB(decode('010900000003000000010800000003000000468280E724BC6340BF4B46210B973BC0F890AEA18D8063402D9664151D483CC0EED64BB6EE726340903CA5BDA0863AC0010200000004000000EED64BB6EE726340903CA5BDA0863AC09FE5797057376340E09398B1B2373BC05AAE0A165F0963409F6760A2493D3DC0DB6286DFB057634082D8A1B32F843EC0010800000005000000DB6286DFB057634082D8A1B32F843EC0DB6286DFB057634082D8A1B32F843EC075B4E4D0C60C634031FA5D1A371540C0D7197CED9B636340A3CB59A7630A41C050F4A72AC0FB6240974769FCE3CF41C0', 'hex'))); - +SELECT 'null response', ST_NumPoints(ST_GeomFromEWKT('COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 4 5, 1 4, 0 0))')); diff --git a/regress/sql-mm-compoundcurve_expected b/regress/sql-mm-compoundcurve_expected index 49029f0bb..b6c4c30e8 100644 --- a/regress/sql-mm-compoundcurve_expected +++ b/regress/sql-mm-compoundcurve_expected @@ -106,3 +106,4 @@ valid wkb compound curve 2|COMPOUNDCURVE((153.72942375 -27.2175704,152.29285719 valid wkb compound curve 3|COMPOUNDCURVE((151.60117699 -27.32398274,151.22873381 -35.9433821,150.74987829 -27.80283826)) valid wkb compound curve 4|COMPOUNDCURVE((153.72942375 -27.2175704,152.29285719 -29.23940482,154.74034096 -30.51635287),CIRCULARSTRING(154.74034096 -30.51635287,154.74034096 -30.51635287,152.39926953 -32.16574411,155.11278414 -34.08116619,151.86720784 -35.62414508)) valid wkb compound curve 5|COMPOUNDCURVE(CIRCULARSTRING(157.87950492 -27.59001358,156.01728901 -28.28169378,155.59163966 -26.52589021),(155.59163966 -26.52589021,153.72942375 -27.2175704,152.29285719 -29.23940482,154.74034096 -30.51635287),CIRCULARSTRING(154.74034096 -30.51635287,154.74034096 -30.51635287,152.39926953 -32.16574411,155.11278414 -34.08116619,151.86720784 -35.62414508)) +null response| diff --git a/regress/sql-mm-curvepoly.sql b/regress/sql-mm-curvepoly.sql index d66a670bc..24e1b91fc 100644 --- a/regress/sql-mm-curvepoly.sql +++ b/regress/sql-mm-curvepoly.sql @@ -501,4 +501,7 @@ SELECT 'valid ewkb curve polygon 2', ST_asEWKT(ST_GeomFromEWKB(decode('010d00000 SELECT 'valid ewkb curve polygon 3', ST_asEWKT(ST_GeomFromEWKB(decode('010d00000001000000010800000007000000ccdf061ad9f3614054093e6d99093ec0ab9085dbb6dd614081540229216040c0ebd7a828c33e62409bf026782a7e41c0000000c06bb2624000000020adb440c08e632f616ead6240c9f7b0bf1dd33dc09011eec0de4362407dd6672f76323ec0ccdf061ad9f3614054093e6d99093ec0', 'hex'))); SELECT 'valid ewkb curve polygon 4', ST_asEWKT(ST_GeomFromEWKB(decode('010d00000002000000010800000007000000ccdf061ad9f3614054093e6d99093ec0ab9085dbb6dd614081540229216040c0ebd7a828c33e62409bf026782a7e41c0000000c06bb2624000000020adb440c08e632f616ead6240c9f7b0bf1dd33dc09011eec0de4362407dd6672f76323ec0ccdf061ad9f3614054093e6d99093ec00102000000060000006844c4fe011b6240342e2993e0423fc0d45daf9d93066240c4a0c305d62240c000000080ac31624000000020fbbe40c0000000e0107f6240000000c0a10440c04e1c0c14624c6240bf3fb6405c793fc06844c4fe011b6240342e2993e0423fc0', 'hex'))); SELECT 'valid ewkb curve polygon 5', ST_asEWKT(ST_GeomFromEWKB(decode('010d00000002000000010200000007000000ccdf061ad9f3614054093e6d99093ec0ab9085dbb6dd614081540229216040c0ebd7a828c33e62409bf026782a7e41c0000000c06bb2624000000020adb440c08e632f616ead6240c9f7b0bf1dd33dc09011eec0de4362407dd6672f76323ec0ccdf061ad9f3614054093e6d99093ec00109000000030000000108000000030000006844c4fe011b6240342e2993e0423fc0d45daf9d93066240c4a0c305d62240c000000080ac31624000000020fbbe40c001020000000200000000000080ac31624000000020fbbe40c0000000e0107f6240000000c0a10440c0010800000003000000000000e0107f6240000000c0a10440c04e1c0c14624c6240bf3fb6405c793fc06844c4fe011b6240342e2993e0423fc0', 'hex'))); - +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) )'); +SELECT 'null response', ST_NumPoints(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) )')); diff --git a/regress/sql-mm-curvepoly_expected b/regress/sql-mm-curvepoly_expected index 16edeee8b..c327e53ff 100644 --- a/regress/sql-mm-curvepoly_expected +++ b/regress/sql-mm-curvepoly_expected @@ -157,3 +157,8 @@ valid ewkb curve polygon 2|CURVEPOLYGON((143.620251668383 -30.0374973560768,142. valid ewkb curve polygon 3|CURVEPOLYGON(CIRCULARSTRING(143.620251668383 -30.0374973560768,142.928571472997 -32.751011968744,145.961323098919 -34.9856710615288,149.575653076172 -33.4115333557129,149.419724075848 -29.8246726805735,146.120941605547 -30.1971158627043,143.620251668383 -30.0374973560768)) valid ewkb curve polygon 4|CURVEPOLYGON(CIRCULARSTRING(143.620251668383 -30.0374973560768,142.928571472997 -32.751011968744,145.961323098919 -34.9856710615288,149.575653076172 -33.4115333557129,149.419724075848 -29.8246726805735,146.120941605547 -30.1971158627043,143.620251668383 -30.0374973560768),(144.843993552527 -31.2612392402209,144.205519526017 -32.2721564488616,145.552307128906 -33.4920387268066,147.970809936523 -32.0361862182617,146.386972449926 -31.4740639157242,144.843993552527 -31.2612392402209)) valid ewkb curve polygon 5|CURVEPOLYGON((143.620251668383 -30.0374973560768,142.928571472997 -32.751011968744,145.961323098919 -34.9856710615288,149.575653076172 -33.4115333557129,149.419724075848 -29.8246726805735,146.120941605547 -30.1971158627043,143.620251668383 -30.0374973560768),COMPOUNDCURVE(CIRCULARSTRING(144.843993552527 -31.2612392402209,144.205519526017 -32.2721564488616,145.552307128906 -33.4920387268066),(145.552307128906 -33.4920387268066,147.970809936523 -32.0361862182617),CIRCULARSTRING(147.970809936523 -32.0361862182617,146.386972449926 -31.4740639157242,144.843993552527 -31.2612392402209))) +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 +null response|