mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
bug 801466 ST_INTERSECTION() returns invalid value on empty intersection in maria-5.3-gis.
We didn't implement an empty geometry. And returning NULL instead of it is not quite correct. So here is the implementation of the empty value as GEOMETRYCOLLECTION(). per-file comments: mysql-test/r/gis-precise.result bug 801466 ST_INTERSECTION() returns invalid value on empty intersection in maria-5.3-gis. test result updated. mysql-test/r/gis.result bug 801466 ST_INTERSECTION() returns invalid value on empty intersection in maria-5.3-gis. test result updated. mysql-test/t/gis-precise.test bug 801466 ST_INTERSECTION() returns invalid value on empty intersection in maria-5.3-gis. test case added. mysql-test/t/gis.test bug 801466 ST_INTERSECTION() returns invalid value on empty intersection in maria-5.3-gis. test case added. sql/field.cc bug 801466 ST_INTERSECTION() returns invalid value on empty intersection in maria-5.3-gis. store GEOMETRYCOLLECTION() properly. sql/gcalc_tools.cc bug 801466 ST_INTERSECTION() returns invalid value on empty intersection in maria-5.3-gis. create the GEOMETRYCOLLECTION() for the empty result. sql/gstream.h bug 801466 ST_INTERSECTION() returns invalid value on empty intersection in maria-5.3-gis. next_symbol() added. sql/spatial.cc bug 801466 ST_INTERSECTION() returns invalid value on empty intersection in maria-5.3-gis. code modified to handle 0 geometries in the GEOMETRYCOLLECTION properly.
This commit is contained in:
parent
c937b7588f
commit
eefff87652
8 changed files with 55 additions and 22 deletions
|
@ -317,3 +317,6 @@ AsText( ST_UNION(
|
|||
PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 7 5 , 2 0 , 2 2 ) ) ') ,
|
||||
PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 3 3 , 2 5 , 2 2 ) ) ') ) )
|
||||
POLYGON((2 0,2 5,3 3,3 2,7 5,2 0))
|
||||
SELECT AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)')));
|
||||
AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)')))
|
||||
GEOMETRYCOLLECTION()
|
||||
|
|
|
@ -66,7 +66,8 @@ INSERT INTO gis_multi_polygon VALUES
|
|||
(119, MPolyFromWKB(AsWKB(MultiPolygon(Polygon(LineString(Point(0, 3), Point(3, 3), Point(3, 0), Point(0, 3)))))));
|
||||
INSERT INTO gis_geometrycollection VALUES
|
||||
(120, GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
|
||||
(121, GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9))))));
|
||||
(121, GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9)))))),
|
||||
(122, GeomFromText('GeometryCollection()'));
|
||||
INSERT into gis_geometry SELECT * FROM gis_point;
|
||||
INSERT into gis_geometry SELECT * FROM gis_line;
|
||||
INSERT into gis_geometry SELECT * FROM gis_polygon;
|
||||
|
@ -109,6 +110,7 @@ SELECT fid, AsText(g) FROM gis_geometrycollection;
|
|||
fid AsText(g)
|
||||
120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
|
||||
121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
|
||||
122 GEOMETRYCOLLECTION()
|
||||
SELECT fid, AsText(g) FROM gis_geometry;
|
||||
fid AsText(g)
|
||||
101 POINT(10 10)
|
||||
|
@ -132,6 +134,7 @@ fid AsText(g)
|
|||
119 MULTIPOLYGON(((0 3,3 3,3 0,0 3)))
|
||||
120 GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,10 10))
|
||||
121 GEOMETRYCOLLECTION(POINT(44 6),LINESTRING(3 6,7 9))
|
||||
122 GEOMETRYCOLLECTION()
|
||||
SELECT fid, Dimension(g) FROM gis_geometry;
|
||||
fid Dimension(g)
|
||||
101 0
|
||||
|
@ -155,6 +158,7 @@ fid Dimension(g)
|
|||
119 2
|
||||
120 1
|
||||
121 1
|
||||
122 0
|
||||
SELECT fid, GeometryType(g) FROM gis_geometry;
|
||||
fid GeometryType(g)
|
||||
101 POINT
|
||||
|
@ -178,6 +182,7 @@ fid GeometryType(g)
|
|||
119 MULTIPOLYGON
|
||||
120 GEOMETRYCOLLECTION
|
||||
121 GEOMETRYCOLLECTION
|
||||
122 GEOMETRYCOLLECTION
|
||||
SELECT fid, IsEmpty(g) FROM gis_geometry;
|
||||
fid IsEmpty(g)
|
||||
101 0
|
||||
|
@ -201,6 +206,7 @@ fid IsEmpty(g)
|
|||
119 0
|
||||
120 0
|
||||
121 0
|
||||
122 0
|
||||
SELECT fid, AsText(Envelope(g)) FROM gis_geometry;
|
||||
fid AsText(Envelope(g))
|
||||
101 POLYGON((10 10,10 10,10 10,10 10,10 10))
|
||||
|
@ -224,9 +230,10 @@ fid AsText(Envelope(g))
|
|||
119 POLYGON((0 0,3 0,3 3,0 3,0 0))
|
||||
120 POLYGON((0 0,10 0,10 10,0 10,0 0))
|
||||
121 POLYGON((3 6,44 6,44 9,3 9,3 6))
|
||||
122 POLYGON((1.79769313486232e+308 1.79769313486232e+308,-1.79769313486232e+308 1.79769313486232e+308,-1.79769313486232e+308 -1.79769313486232e+308,1.79769313486232e+308 -1.79769313486232e+308,1.79769313486232e+308 1.79769313486232e+308))
|
||||
explain extended select Dimension(g), GeometryType(g), IsEmpty(g), AsText(Envelope(g)) from gis_geometry;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE gis_geometry ALL NULL NULL NULL NULL 21 100.00
|
||||
1 SIMPLE gis_geometry ALL NULL NULL NULL NULL 22 100.00
|
||||
Warnings:
|
||||
Note 1003 select st_dimension(`test`.`gis_geometry`.`g`) AS `Dimension(g)`,st_geometrytype(`test`.`gis_geometry`.`g`) AS `GeometryType(g)`,st_isempty(`test`.`gis_geometry`.`g`) AS `IsEmpty(g)`,st_astext(st_envelope(`test`.`gis_geometry`.`g`)) AS `AsText(Envelope(g))` from `test`.`gis_geometry`
|
||||
SELECT fid, X(g) FROM gis_point;
|
||||
|
@ -345,6 +352,7 @@ SELECT fid, NumGeometries(g) from gis_geometrycollection;
|
|||
fid NumGeometries(g)
|
||||
120 2
|
||||
121 2
|
||||
122 0
|
||||
explain extended SELECT fid, NumGeometries(g) from gis_multi_point;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE gis_multi_point ALL NULL NULL NULL NULL 3 100.00
|
||||
|
@ -369,10 +377,12 @@ SELECT fid, AsText(GeometryN(g, 2)) from gis_geometrycollection;
|
|||
fid AsText(GeometryN(g, 2))
|
||||
120 LINESTRING(0 0,10 10)
|
||||
121 LINESTRING(3 6,7 9)
|
||||
122 NULL
|
||||
SELECT fid, AsText(GeometryN(g, 1)) from gis_geometrycollection;
|
||||
fid AsText(GeometryN(g, 1))
|
||||
120 POINT(0 0)
|
||||
121 POINT(44 6)
|
||||
122 NULL
|
||||
explain extended SELECT fid, AsText(GeometryN(g, 2)) from gis_multi_point;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE gis_multi_point ALL NULL NULL NULL NULL 3 100.00
|
||||
|
@ -386,16 +396,21 @@ FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second
|
|||
first second w c o e d t i r
|
||||
120 120 1 1 0 1 0 1 1 1
|
||||
120 121 0 0 1 0 0 0 1 0
|
||||
120 122 0 1 0 0 1 0 0 0
|
||||
121 120 0 0 1 0 0 0 1 0
|
||||
121 121 1 1 0 1 0 1 1 1
|
||||
121 122 0 1 0 0 1 0 0 0
|
||||
122 120 1 0 0 0 1 0 0 0
|
||||
122 121 1 0 0 0 1 0 0 0
|
||||
122 122 1 1 0 1 1 0 0 0
|
||||
explain extended SELECT g1.fid as first, g2.fid as second,
|
||||
Within(g1.g, g2.g) as w, Contains(g1.g, g2.g) as c, Overlaps(g1.g, g2.g) as o,
|
||||
Equals(g1.g, g2.g) as e, Disjoint(g1.g, g2.g) as d, Touches(g1.g, g2.g) as t,
|
||||
Intersects(g1.g, g2.g) as i, Crosses(g1.g, g2.g) as r
|
||||
FROM gis_geometrycollection g1, gis_geometrycollection g2 ORDER BY first, second;
|
||||
id select_type table type possible_keys key key_len ref rows filtered Extra
|
||||
1 SIMPLE g1 ALL NULL NULL NULL NULL 2 100.00 Using temporary; Using filesort
|
||||
1 SIMPLE g2 ALL NULL NULL NULL NULL 2 100.00 Using join buffer (flat, BNL join)
|
||||
1 SIMPLE g1 ALL NULL NULL NULL NULL 3 100.00 Using temporary; Using filesort
|
||||
1 SIMPLE g2 ALL NULL NULL NULL NULL 3 100.00 Using join buffer (flat, BNL join)
|
||||
Warnings:
|
||||
Note 1003 select `test`.`g1`.`fid` AS `first`,`test`.`g2`.`fid` AS `second`,st_within(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `w`,st_contains(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `c`,mbroverlaps(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `o`,mbrequals(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `e`,mbrdisjoint(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `d`,st_touches(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `t`,mbrintersects(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `i`,st_crosses(`test`.`g1`.`g`,`test`.`g2`.`g`) AS `r` from `test`.`gis_geometrycollection` `g1` join `test`.`gis_geometrycollection` `g2` order by `test`.`g1`.`fid`,`test`.`g2`.`fid`
|
||||
DROP TABLE gis_point, gis_line, gis_polygon, gis_multi_point, gis_multi_line, gis_multi_polygon, gis_geometrycollection, gis_geometry;
|
||||
|
|
|
@ -200,4 +200,7 @@ SELECT AsText( ST_UNION(
|
|||
PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 7 5 , 2 0 , 2 2 ) ) ') ,
|
||||
PolygonFromText(' POLYGON( ( 2 2 , 3 2 , 3 3 , 2 5 , 2 2 ) ) ') ) );
|
||||
|
||||
#bug 801466 ST_INTERSECTION() returns invalid value on empty intersection in maria-5.3-gis
|
||||
|
||||
SELECT AsText(ST_INTERSECTION(LinestringFromText('LINESTRING(1 1, 2 2)'), GeometryFromText('LINESTRING(3 3, 4 4)')));
|
||||
|
||||
|
|
|
@ -62,7 +62,8 @@ INSERT INTO gis_multi_polygon VALUES
|
|||
|
||||
INSERT INTO gis_geometrycollection VALUES
|
||||
(120, GeomCollFromText('GEOMETRYCOLLECTION(POINT(0 0), LINESTRING(0 0,10 10))')),
|
||||
(121, GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9))))));
|
||||
(121, GeometryFromWKB(AsWKB(GeometryCollection(Point(44, 6), LineString(Point(3, 6), Point(7, 9)))))),
|
||||
(122, GeomFromText('GeometryCollection()'));
|
||||
|
||||
INSERT into gis_geometry SELECT * FROM gis_point;
|
||||
INSERT into gis_geometry SELECT * FROM gis_line;
|
||||
|
|
|
@ -8008,7 +8008,7 @@ int Field_geom::store(const char *from, uint length, CHARSET_INFO *cs)
|
|||
goto err;
|
||||
// Check given WKB
|
||||
uint32 wkb_type;
|
||||
if (length < SRID_SIZE + WKB_HEADER_SIZE + SIZEOF_STORED_DOUBLE*2)
|
||||
if (length < SRID_SIZE + WKB_HEADER_SIZE + 4)
|
||||
goto err;
|
||||
wkb_type= uint4korr(from + SRID_SIZE + 1);
|
||||
if (wkb_type < (uint32) Geometry::wkb_point ||
|
||||
|
|
|
@ -137,6 +137,8 @@ int Gcalc_function::count_internal()
|
|||
cur_func+= 4;
|
||||
if (next_func == op_shape)
|
||||
return i_states[c_op & ~(op_any | op_not)] ^ mask;
|
||||
if (n_ops == 0)
|
||||
return mask;
|
||||
|
||||
result= count_internal();
|
||||
|
||||
|
@ -442,11 +444,9 @@ void Gcalc_result_receiver::reset()
|
|||
|
||||
int Gcalc_result_receiver::get_result_typeid()
|
||||
{
|
||||
if (!n_shapes)
|
||||
return 0;
|
||||
|
||||
if (collection_result)
|
||||
if (!n_shapes || collection_result)
|
||||
return Geometry::wkb_geometrycollection;
|
||||
|
||||
switch (common_shapetype)
|
||||
{
|
||||
case Gcalc_function::shape_polygon:
|
||||
|
@ -1186,6 +1186,7 @@ int Gcalc_operation_reducer::get_result(Gcalc_result_receiver *storage)
|
|||
poly_instance *polygons= NULL;
|
||||
|
||||
*m_res_hook= NULL;
|
||||
|
||||
while (m_result)
|
||||
{
|
||||
Gcalc_function::shape_type shape= m_result->type;
|
||||
|
|
|
@ -57,6 +57,14 @@ public:
|
|||
m_cur++;
|
||||
return 0;
|
||||
}
|
||||
/* Returns the next notempty character. */
|
||||
char next_symbol()
|
||||
{
|
||||
skip_space();
|
||||
if (m_cur >= m_limit)
|
||||
return 0; /* EOL meet. */
|
||||
return *m_cur;
|
||||
}
|
||||
void set_error_msg(const char *msg);
|
||||
|
||||
// caller should free this pointer
|
||||
|
|
|
@ -2075,19 +2075,22 @@ bool Gis_geometry_collection::init_from_wkt(Gis_read_stream *trs, String *wkb)
|
|||
return 1;
|
||||
wkb->length(wkb->length()+4); // Reserve space for points
|
||||
|
||||
for (;;)
|
||||
if (trs->next_symbol() != ')')
|
||||
{
|
||||
if (!(g= create_from_wkt(&buffer, trs, wkb)))
|
||||
return 1;
|
||||
|
||||
if (g->get_class_info()->m_type_id == wkb_geometrycollection)
|
||||
for (;;)
|
||||
{
|
||||
trs->set_error_msg("Unexpected GEOMETRYCOLLECTION");
|
||||
return 1;
|
||||
if (!(g= create_from_wkt(&buffer, trs, wkb)))
|
||||
return 1;
|
||||
|
||||
if (g->get_class_info()->m_type_id == wkb_geometrycollection)
|
||||
{
|
||||
trs->set_error_msg("Unexpected GEOMETRYCOLLECTION");
|
||||
return 1;
|
||||
}
|
||||
n_objects++;
|
||||
if (trs->skip_char(',')) // Didn't find ','
|
||||
break;
|
||||
}
|
||||
n_objects++;
|
||||
if (trs->skip_char(',')) // Didn't find ','
|
||||
break;
|
||||
}
|
||||
|
||||
wkb->write_at_position(no_pos, n_objects);
|
||||
|
@ -2208,10 +2211,9 @@ bool Gis_geometry_collection::get_data_as_wkt(String *txt,
|
|||
geom->set_data_ptr(data, (uint) (m_data_end - data));
|
||||
if (geom->as_wkt(txt, &data))
|
||||
return 1;
|
||||
if (txt->append(STRING_WITH_LEN(","), 512))
|
||||
if (n_objects && txt->append(STRING_WITH_LEN(","), 512))
|
||||
return 1;
|
||||
}
|
||||
txt->length(txt->length() - 1);
|
||||
*end= data;
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue