s = "LINESTRING ZM EMPTY";
r = cu_wkt_in(s, WKT_ISO);
CU_ASSERT_STRING_EQUAL(r,s);
+ lwfree(r);
+
+ s = "LINESTRING Z (0 0 0 1, 0 1 0 1)";
+ r = cu_wkt_in(s, WKT_EXTENDED);
+ CU_ASSERT_STRING_EQUAL(r,"can not mix dimensionality in a geometry");
//printf("\nIN: %s\nOUT: %s\n",s,r);
lwfree(r);
+
}
static void test_wkt_in_polygon(void)
s = "POLYGON((0 0,0 1,1 1,0 0))";
r = cu_wkt_in(s, WKT_SFSQL);
CU_ASSERT_STRING_EQUAL(r,s);
+ lwfree(r);
+
+ s = "POLYGON Z ((0 0,0 10,10 10,10 0,0 0),(1 1 1,1 2 1,2 2 1,2 1 1,1 1 1))";
+ r = cu_wkt_in(s, WKT_SFSQL);
+ CU_ASSERT_STRING_EQUAL(r,"can not mix dimensionality in a geometry");
+ lwfree(r);
+
+ s = "POLYGON Z ((0 0,0 10,10 10,10 0,0 0),(1 1,1 2,2 2,2 1,1 1))";
+ r = cu_wkt_in(s, WKT_SFSQL);
+ CU_ASSERT_STRING_EQUAL(r,"can not mix dimensionality in a geometry");
//printf("\nIN: %s\nOUT: %s\n",s,r);
lwfree(r);
}
static void test_wkt_in_multisurface(void)
{
+ s = "SRID=4326;MULTICURVE(COMPOUNDCURVE(CIRCULARSTRING(0 0,1 1,1 0),(1 0,0 1)))";
+ r = cu_wkt_in(s, WKT_EXTENDED);
+ CU_ASSERT_STRING_EQUAL(r,s);
+ //printf("\nIN: %s\nOUT: %s\n",s,r);
+ lwfree(r);
+}
+
+static void test_wkt_in_tin(void)
+{
+ s = "TIN(((0 1 2,3 4 5,6 7 8,0 1 2)),((0 1 2,3 4 5,6 7 8,9 10 11,0 1 2)))";
+ r = cu_wkt_in(s, WKT_EXTENDED);
+ CU_ASSERT_STRING_EQUAL(r,"triangle must have exactly 4 points");
+ //printf("\nIN: %s\nOUT: %s\n",s,r);
+ lwfree(r);
}
static void test_wkt_in_polyhedralsurface(void)
PG_TEST(test_wkt_in_curvpolygon),
PG_TEST(test_wkt_in_multicurve),
PG_TEST(test_wkt_in_multisurface),
+ PG_TEST(test_wkt_in_tin),
PG_TEST(test_wkt_in_polyhedralsurface),
PG_TEST(test_wkt_in_errlocation),
CU_TEST_INFO_NULL
/* If the number of dimensions is not consistent, we have a problem. */
if( wkt_pointarray_dimensionality(pa, flags) == LW_FALSE )
{
+ ptarray_free(pa);
SET_PARSER_ERROR(PARSER_ERROR_MIXDIMS);
return NULL;
}
/* Only one point allowed in our point array! */
if( pa->npoints != 1 )
{
+ ptarray_free(pa);
SET_PARSER_ERROR(PARSER_ERROR_LESSPOINTS);
return NULL;
}
/* If the number of dimensions is not consistent, we have a problem. */
if( wkt_pointarray_dimensionality(pa, flags) == LW_FALSE )
{
+ ptarray_free(pa);
SET_PARSER_ERROR(PARSER_ERROR_MIXDIMS);
return NULL;
}
/* Apply check for not enough points, if requested. */
if( (global_parser_result.parser_check_flags & PARSER_CHECK_MINPOINTS) && (pa->npoints < 2) )
{
+ ptarray_free(pa);
SET_PARSER_ERROR(PARSER_ERROR_MOREPOINTS);
return NULL;
}
/* If the number of dimensions is not consistent, we have a problem. */
if( wkt_pointarray_dimensionality(pa, flags) == LW_FALSE )
{
+ ptarray_free(pa);
SET_PARSER_ERROR(PARSER_ERROR_MIXDIMS);
return NULL;
}
/* Apply check for not enough points, if requested. */
if( (global_parser_result.parser_check_flags & PARSER_CHECK_MINPOINTS) && (pa->npoints < 3) )
{
+ ptarray_free(pa);
SET_PARSER_ERROR(PARSER_ERROR_MOREPOINTS);
return NULL;
}
/* Apply check for odd number of points, if requested. */
if( (global_parser_result.parser_check_flags & PARSER_CHECK_ODD) && ((pa->npoints % 2) == 0) )
{
+ ptarray_free(pa);
SET_PARSER_ERROR(PARSER_ERROR_ODDPOINTS);
return NULL;
}
/* If the number of dimensions is not consistent, we have a problem. */
if( wkt_pointarray_dimensionality(pa, flags) == LW_FALSE )
{
+ ptarray_free(pa);
SET_PARSER_ERROR(PARSER_ERROR_MIXDIMS);
return NULL;
}
/* Triangles need four points. */
if( (pa->npoints != 4) )
{
+ ptarray_free(pa);
SET_PARSER_ERROR(PARSER_ERROR_TRIANGLEPOINTS);
return NULL;
}
/* Triangles need closure. */
if( ! ptarray_isclosed(pa) )
{
+ ptarray_free(pa);
SET_PARSER_ERROR(PARSER_ERROR_UNCLOSED);
return NULL;
}
/* Rings must agree on dimensionality */
if( FLAGS_NDIMS(poly->flags) != FLAGS_NDIMS(pa->flags) )
{
+ ptarray_free(pa);
+ lwgeom_free(poly);
SET_PARSER_ERROR(PARSER_ERROR_MIXDIMS);
return NULL;
}
/* Apply check for minimum number of points, if requested. */
if( (global_parser_result.parser_check_flags & PARSER_CHECK_MINPOINTS) && (pa->npoints < 4) )
{
+ ptarray_free(pa);
+ lwgeom_free(poly);
SET_PARSER_ERROR(PARSER_ERROR_MOREPOINTS);
return NULL;
}
if( (global_parser_result.parser_check_flags & PARSER_CHECK_CLOSURE) &&
! (dimcheck == 'Z' ? ptarray_isclosedz(pa) : ptarray_isclosed2d(pa)) )
{
+ ptarray_free(pa);
+ lwgeom_free(poly);
SET_PARSER_ERROR(PARSER_ERROR_UNCLOSED);
return NULL;
}
/* If something goes wrong adding a ring, error out. */
if ( LW_FAILURE == lwpoly_add_ring(lwgeom_as_lwpoly(poly), pa) )
{
+ ptarray_free(pa);
+ lwgeom_free(poly);
SET_PARSER_ERROR(PARSER_ERROR_OTHER);
return NULL;
}
{
if ( flagdims != FLAGS_NDIMS(poly->flags) )
{
+ lwgeom_free(poly);
SET_PARSER_ERROR(PARSER_ERROR_MIXDIMS);
return NULL;
}
/* Harmonize the flags in the sub-components with the wkt flags */
if( LW_FAILURE == wkt_parser_set_dims(poly, flags) )
{
+ lwgeom_free(poly);
SET_PARSER_ERROR(PARSER_ERROR_OTHER);
return NULL;
}
/* All the elements must agree on dimensionality */
if( FLAGS_NDIMS(poly->flags) != FLAGS_NDIMS(ring->flags) )
{
- SET_PARSER_ERROR(PARSER_ERROR_MIXDIMS);
LWDEBUG(4,"dimensionality does not match");
+ lwgeom_free(ring);
+ lwgeom_free(poly);
+ SET_PARSER_ERROR(PARSER_ERROR_MIXDIMS);
return NULL;
}
if( (global_parser_result.parser_check_flags & PARSER_CHECK_MINPOINTS) &&
(lwgeom_count_vertices(ring) < 4) )
{
- SET_PARSER_ERROR(PARSER_ERROR_MOREPOINTS);
LWDEBUG(4,"number of points is incorrect");
+ lwgeom_free(ring);
+ lwgeom_free(poly);
+ SET_PARSER_ERROR(PARSER_ERROR_MOREPOINTS);
return NULL;
}
if ( ! is_closed )
{
LWDEBUG(4,"ring is not closed");
+ lwgeom_free(ring);
+ lwgeom_free(poly);
SET_PARSER_ERROR(PARSER_ERROR_UNCLOSED);
return NULL;
}
if( LW_FAILURE == lwcurvepoly_add_ring(lwgeom_as_lwcurvepoly(poly), ring) )
{
- SET_PARSER_ERROR(PARSER_ERROR_OTHER);
LWDEBUG(4,"failed to add ring");
+ lwgeom_free(ring);
+ lwgeom_free(poly);
+ SET_PARSER_ERROR(PARSER_ERROR_OTHER);
return NULL;
}
/* If the number of dimensions are not consistent, we have a problem. */
if( flagdims != FLAGS_NDIMS(poly->flags) )
{
+ lwgeom_free(poly);
SET_PARSER_ERROR(PARSER_ERROR_MIXDIMS);
return NULL;
}
/* Harmonize the flags in the sub-components with the wkt flags */
if( LW_FAILURE == wkt_parser_set_dims(poly, flags) )
{
+ lwgeom_free(poly);
SET_PARSER_ERROR(PARSER_ERROR_OTHER);
return NULL;
}
/* All the elements must agree on dimensionality */
if( FLAGS_NDIMS(col->flags) != FLAGS_NDIMS(geom->flags) )
{
+ lwgeom_free(col);
+ lwgeom_free(geom);
SET_PARSER_ERROR(PARSER_ERROR_MIXDIMS);
return NULL;
}
if( LW_FAILURE == lwcompound_add_lwgeom((LWCOMPOUND*)col, geom) )
{
+ lwgeom_free(col);
+ lwgeom_free(geom);
SET_PARSER_ERROR(PARSER_ERROR_INCONTINUOUS);
return NULL;
}
/* All the elements must agree on dimensionality */
if( FLAGS_NDIMS(col->flags) != FLAGS_NDIMS(geom->flags) )
{
+ lwgeom_free(col);
+ lwgeom_free(geom);
SET_PARSER_ERROR(PARSER_ERROR_MIXDIMS);
return NULL;
}
/* If the number of dimensions are not consistent, we have a problem. */
if( flagdims != FLAGS_NDIMS(col->flags) )
{
+ lwgeom_free(col);
SET_PARSER_ERROR(PARSER_ERROR_MIXDIMS);
return NULL;
}
( (FLAGS_GET_Z(flags) != FLAGS_GET_Z(col->flags)) ||
(FLAGS_GET_M(flags) != FLAGS_GET_M(col->flags)) ) )
{
+ lwgeom_free(col);
SET_PARSER_ERROR(PARSER_ERROR_MIXDIMS);
return NULL;
}
/* Harmonize the collection dimensionality */
if( LW_FAILURE == wkt_parser_set_dims(col, flags) )
{
+ lwgeom_free(col);
SET_PARSER_ERROR(PARSER_ERROR_OTHER);
return NULL;
}