Commit 775c7bda authored by Stefano Petrilli's avatar Stefano Petrilli Committed by Sergei Golubchik

MDEV-34141: Implements the function ST_Simplify

The GIS function ST_Simplify takes ad input a geometry and a double. It
applies the Ramer-Douglas-Peucker algorithm on the geometry and returns
the resulting geometry. The tests have been cherry-picked from the MySQL
implementation of this function to grant compatibility among the two
implementations.
Co-authored-by: default avatarDavid Zhao <david.zhao@oracle.com>
Co-authored-by: default avatarPavan Naik <pavan.naik@oracle.com>
Co-authored-by: default avatarNorvald H. Ryeng <norvald.ryeng@oracle.com>
Co-authored-by: default avatarErlend Dahl <erlend.dahl@oracle.com>
Co-authored-by: default avatarJon Hauglid <jon.hauglid@oracle.com>
Co-authored-by: default avatarHans H Melby <hans.h.melby@oracle.com>
Co-authored-by: default avatarTor Didriksen <tor.didriksen@oracle.com>
parent 55d63e34
# Creating the spatial Geometry object
USE test;
CREATE TABLE gis_geometrycollection (fid INTEGER NOT NULL PRIMARY KEY, g GEOMETRY);
SET @star_elem_vertical= 'POLYGON((5 0,15 25,25 0,15 5,5 0))';
SET @star_elem_horizontal= 'POLYGON((25 0,0 15,30 15,22 10,25 0))';
SET @star_center= 'POINT(15 10)';
SET @star_top= 'POINT(15 25)';
SET @star_bottom_left= 'POINT(5 0)';
SET @star_bottom_right= 'POINT(25 0)';
SET @star_bottom_points= 'MULTIPOINT(5 0,25 0)';
SET @star_all_points= 'MULTIPOINT(5 0,25 0,15 10,15 25)';
SET @star_line_horizontal= 'LINESTRING(10 15,20 15)';
SET @star_line_vertical= 'LINESTRING(15 5,15 25)';
SET @star_top_to_center= 'LINESTRING(15 25,15 10)';
SET @star_lines_near_horizontal= 'MULTILINESTRING((25 0,0 15,15 30,0 5))';
SET @star_lines_near_vertical= 'MULTILINESTRING((0 5,15 25,0 25))';
SET @star= 'POLYGON((5 0,7 10,0 15,10 15,15 25,20 15,30 15,22 10,25 0,15 5,5 0))';
SET @star_of_elems='MULTIPOLYGON(((5 0,15 25,25 0,15 5,5 0)),((25 0,0 15,30 15,22 10,25 0)))';
SET @star_collection_elems='GEOMETRYCOLLECTION(MULTIPOLYGON(((5 0,15 25,25 0,15 5,5 0)),((25 0,0 15,30 15,22 10,25 0))),POLYGON((5 0,7 10,0 15,10 15,15 25,20 15,30 15,22 10,25 0,15 5,5 0)),LINESTRING(15 25,15 10),MULTIPOINT(5 0,25 0),POINT(15 25))';
SET @star_collection_multilinestr='GEOMETRYCOLLECTION(MULTIPOLYGON(((5 0,15 25,25 0,15 5,5 0)),((25 0,0 15,30 15,22 10,25 0))),POLYGON((5 0,7 10,0 15,10 15,15 25,20 15,30 15,22 10,25 0,15 5,5 0)),MULTILINESTRING((25 0,0 15,15 30,0 5)),LINESTRING(15 25,15 10),MULTIPOINT(5 0,25 0),POINT(15 25))';
INSERT INTO gis_geometrycollection VALUES
(100,ST_GEOMFROMTEXT(@star)),
(101,ST_GEOMFROMTEXT(@star_elem_vertical)),
(102,ST_GEOMFROMTEXT(@star_elem_horizontal)),
(103,ST_GEOMFROMTEXT(@star_of_elems)),
(104,ST_GEOMFROMTEXT(@star_top)),
(105,ST_GEOMFROMTEXT(@star_center)),
(106,ST_GEOMFROMTEXT(@star_bottom_left)),
(107,ST_GEOMFROMTEXT(@star_bottom_right)),
(108,ST_GEOMFROMTEXT(@star_bottom_points)),
(109,ST_GEOMFROMTEXT(@star_all_points)),
(110,ST_GEOMFROMTEXT(@star_line_horizontal)),
(111,ST_GEOMFROMTEXT(@star_line_vertical)),
(112,ST_GEOMFROMTEXT(@star_top_to_center)),
(113,ST_GEOMFROMTEXT(@star_lines_near_horizontal)),
(114,ST_GEOMFROMTEXT(@star_lines_near_vertical)),
(115,ST_GEOMFROMTEXT(@star_collection_elems)),
(116,ST_GEOMFROMTEXT(@star_collection_multilinestr));
# Checking the integrity of the above create/insert statements
# 17 rows.
SELECT count(ST_ASTEXT(g) != 'NULL') FROM gis_geometrycollection;
count(ST_ASTEXT(g) != 'NULL')
17
#####################################################################################
# ST_SIMPLIFY(point)
#####################################################################################
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(17 14)'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(17 14)'), 1))
POINT(17 14)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-8 2)'), 2));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-8 2)'), 2))
POINT(-8 2)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(9 0)'), 3));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(9 0)'), 3))
POINT(9 0)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(10 -8)'), 4));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(10 -8)'), 4))
POINT(10 -8)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(20 -2)'), 5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(20 -2)'), 5))
POINT(20 -2)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(7 13)'), 10));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(7 13)'), 10))
POINT(7 13)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-16 11)'), 1000));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-16 11)'), 1000))
POINT(-16 11)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-5 -2)'), 2000000));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-5 -2)'), 2000000))
POINT(-5 -2)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-10 6)'), 1234567890));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-10 6)'), 1234567890))
POINT(-10 6)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-16 -8)'), 111111111111));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-16 -8)'), 111111111111))
POINT(-16 -8)
#####################################################################################
# ST_SIMPLIFY(multipoint)
#####################################################################################
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(19 -4, -2 -6, -8 2)'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(19 -4, -2 -6, -8 2)'), 1))
MULTIPOINT(19 -4,-2 -6,-8 2)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-3 14, 19 8, 10 -8)'), 2));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-3 14, 19 8, 10 -8)'), 2))
MULTIPOINT(-3 14,19 8,10 -8)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(1 -8, -1 12, -11 16)'), 3));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(1 -8, -1 12, -11 16)'), 3))
MULTIPOINT(1 -8,-1 12,-11 16)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-16 11, -2 -7, -11 11)'), 4));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-16 11, -2 -7, -11 11)'), 4))
MULTIPOINT(-16 11,-2 -7,-11 11)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(19 12, 0 9, 5 10, 20 -16, 7 -17, 9 -18, 19 -7)'), 10));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(19 12, 0 9, 5 10, 20 -16, 7 -17, 9 -18, 19 -7)'), 10))
MULTIPOINT(19 12,0 9,5 10,20 -16,7 -17,9 -18,19 -7)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-1 11, -17 -11, -15 16, 6 -6, 11 -13, -4 -12, -13 -5)'), 1000));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-1 11, -17 -11, -15 16, 6 -6, 11 -13, -4 -12, -13 -5)'), 1000))
MULTIPOINT(-1 11,-17 -11,-15 16,6 -6,11 -13,-4 -12,-13 -5)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(17 -11, -19 -6, 5 17, -14 13, 20 13, 20 2, 0 -12)'), 200000));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(17 -11, -19 -6, 5 17, -14 13, 20 13, 20 2, 0 -12)'), 200000))
MULTIPOINT(17 -11,-19 -6,5 17,-14 13,20 13,20 2,0 -12)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-15 12, 17 -12, -7 14, 1 6, 19 -10, 11 -9, 0 -17)'), 9999999));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-15 12, 17 -12, -7 14, 1 6, 19 -10, 11 -9, 0 -17)'), 9999999))
MULTIPOINT(-15 12,17 -12,-7 14,1 6,19 -10,11 -9,0 -17)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(3 -13, 18 -2, -5 -13, -12 1, 20 0, -6 14, 5 -4)'), 1234567890));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(3 -13, 18 -2, -5 -13, -12 1, 20 0, -6 14, 5 -4)'), 1234567890))
MULTIPOINT(3 -13,18 -2,-5 -13,-12 1,20 0,-6 14,5 -4)
#####################################################################################
# ST_SIMPLIFY(linestring)
#####################################################################################
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,10 10)'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,10 10)'), 1))
LINESTRING(0 0,10 10)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5)'), 3.5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5)'), 3.5))
LINESTRING(0 0,5 0,5 5)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5)'), 3.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5)'), 3.6))
LINESTRING(0 0,5 5)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,4 4,6 -6,10 0)'), 5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,4 4,6 -6,10 0)'), 5))
LINESTRING(0 0,4 4,6 -6,10 0)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5,0 5,0 0)'), 3.5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5,0 5,0 0)'), 3.5))
LINESTRING(0 0,5 0,5 5,0 5,0 0)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5,0 5,0 0)'), 3.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5,0 5,0 0)'), 3.6))
LINESTRING(0 0,5 5,0 0)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,0 10,-5 5,0 0)'), 4.9));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,0 10,-5 5,0 0)'), 4.9))
LINESTRING(0 0,5 5,0 10,-5 5,0 0)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,0 10,-5 5,0 0)'), 5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,0 10,-5 5,0 0)'), 5))
LINESTRING(0 0,0 10,0 0)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,3 -3,5 5,7 -7,9 9,10 10)'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,3 -3,5 5,7 -7,9 9,10 10)'), 1))
LINESTRING(0 0,1 1,3 -3,5 5,7 -7,10 10)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.6))
LINESTRING(0 0,0 1,1 1,1 2,2 2,4 5,5 5)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.8));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.8))
LINESTRING(0 0,5 5)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 -1,4 0,5 1,6 0,7 -1,8 0,9 1,10 0)'), 0.9));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 -1,4 0,5 1,6 0,7 -1,8 0,9 1,10 0)'), 0.9))
LINESTRING(0 0,1 1,3 -1,5 1,7 -1,9 1,10 0)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 -1,4 0,5 1,6 0,7 -1,8 0,9 1,10 0)'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 -1,4 0,5 1,6 0,7 -1,8 0,9 1,10 0)'), 1))
LINESTRING(0 0,10 0)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)'), 0.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)'), 0.6))
LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)'), 0.8));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)'), 0.8))
LINESTRING(0 0,1 1,6 0,5 -1,0 0)
#####################################################################################
# ST_SIMPLIFY(multilinestring)
#####################################################################################
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10))'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10))'), 1))
MULTILINESTRING((0 0,10 10))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10),(0 0,5 0,5 5))'), 3.5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10),(0 0,5 0,5 5))'), 3.5))
MULTILINESTRING((0 0,10 10),(0 0,5 0,5 5))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10),(0 0,5 0,5 5))'), 3.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10),(0 0,5 0,5 5))'), 3.6))
MULTILINESTRING((0 0,10 10),(0 0,5 5))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 0,5 5),(0 0,5 0,5 5,0 5,0 0))'), 3.5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 0,5 5),(0 0,5 0,5 5,0 5,0 0))'), 3.5))
MULTILINESTRING((0 0,5 0,5 5),(0 0,5 0,5 5,0 5,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 0,5 5),(0 0,5 0,5 5,0 5,0 0))'), 3.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 0,5 5),(0 0,5 0,5 5,0 5,0 0))'), 3.6))
MULTILINESTRING((0 0,5 5),(0 0,5 5,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,0 10),(0 0,-5 5,0 10))'), 4.9));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,0 10),(0 0,-5 5,0 10))'), 4.9))
MULTILINESTRING((0 0,5 5,0 10),(0 0,-5 5,0 10))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,0 10),(0 0,-5 5,0 10))'), 5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,0 10),(0 0,-5 5,0 10))'), 5))
MULTILINESTRING((0 0,0 10),(0 0,0 10))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0))'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0))'), 1))
MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,10 10,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5),'
'(0 0,1 0,1 1,2 1,2 2,3 2,3 3,4 3,4 4,5 4,4 4))'), 0.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5),'
'(0 0,1 0,1 1,2 1,2 2,3 2,3 3,4 3,4 4,5 4,4 4))'), 0.6))
MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,4 5,5 5),(0 0,1 0,1 1,2 1,4 4,5 4,4 4))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5),'
'(0 0,1 0,1 1,2 1,2 2,3 2,3 3,4 3,4 4,5 4,4 4))'), 0.7));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5),'
'(0 0,1 0,1 1,2 1,2 2,3 2,3 3,4 3,4 4,5 4,4 4))'), 0.7))
MULTILINESTRING((0 0,0 1,5 5),(0 0,1 0,1 1,5 4,4 4))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))'), 0.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))'), 0.6))
MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))'), 0.8));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))'), 0.8))
MULTILINESTRING((0 0,1 1,6 0),(6 0,5 -1,0 0))
#####################################################################################
# ST_SIMPLIFY(polygon)
#####################################################################################
# Invalid geometry in input.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,4 4,6 -6,10 0,0 0,0 0,0 0))'), 5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,4 4,6 -6,10 0,0 0,0 0,0 0))'), 5))
POLYGON((0 0,4 4,6 -6,10 0,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'), 3.5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'), 3.5))
POLYGON((0 0,0 5,5 5,5 0,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'), 3.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'), 3.6))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,10 10,-10 10,0 0))'), 14));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,10 10,-10 10,0 0))'), 14))
POLYGON((0 0,10 10,-10 10,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,10 10,-10 10,0 0))'), 15));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,10 10,-10 10,0 0))'), 15))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,5 5,0 10,-5 5,0 0))'), 4.9));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,5 5,0 10,-5 5,0 0))'), 4.9))
POLYGON((0 0,5 5,0 10,-5 5,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,5 5,0 10,-5 5,0 0))'), 5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,5 5,0 10,-5 5,0 0))'), 5))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0))'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0))'), 1))
POLYGON((0 0,1 1,3 -3,5 5,7 -7,10 10,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 4.9));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 4.9))
POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 5))
POLYGON((5 0,10 10,-10 10,-10 -10,10 -10,5 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 12));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 12))
POLYGON((5 0,-10 10,-10 -10,5 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 17));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 17))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 1.4));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 1.4))
POLYGON((0 0,0 10,10 10,10 0,0 0),(4 4,4 6,6 6,6 4,4 4))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 1.5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 1.5))
POLYGON((0 0,0 10,10 10,10 0,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 7));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 7))
POLYGON((0 0,0 10,10 10,10 0,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 7.1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 7.1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 3));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 3))
POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 4));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 4))
POLYGON((10 2,5 2,5 10,-5 10,-10 -2,-5 -2,-5 -10,5 -10,10 2))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 5))
POLYGON((10 2,-5 10,-10 -2,5 -10,10 2))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 11));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 11))
NULL
#####################################################################################
# ST_SIMPLIFY(multipolygon)
#####################################################################################
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)))'), 3.5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)))'), 3.5))
MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)))'), 3.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)))'), 3.6))
NULL
# Invalid geometry in input.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0)))'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0)))'), 1))
MULTIPOLYGON(((0 0,1 1,3 -3,5 5,7 -7,10 10,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 1.4));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 1.4))
MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(4 4,4 6,6 6,6 4,4 4)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 1.5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 1.5))
MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 7));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 7))
MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 7.1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 7.1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 1.4));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 1.4))
MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((4 4,4 6,6 6,6 4,4 4)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 1.5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 1.5))
MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 7));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 7))
MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 7.1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 7.1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.5))
MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((0 0,0 -5,-5 -5,-5 0,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.6))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))'), 14));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))'), 14))
MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))'), 15));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))'), 15))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,5 5,0 10,-5 5,0 0)),((0 0,-5 -5,0 -10,5 -5,0 0)))'), 4.9));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,5 5,0 10,-5 5,0 0)),((0 0,-5 -5,0 -10,5 -5,0 0)))'), 4.9))
MULTIPOLYGON(((0 0,5 5,0 10,-5 5,0 0)),((0 0,-5 -5,0 -10,5 -5,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,5 5,0 10,-5 5,0 0)),((0 0,-5 -5,0 -10,5 -5,0 0)))'), 5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,5 5,0 10,-5 5,0 0)),((0 0,-5 -5,0 -10,5 -5,0 0)))'), 5))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,4 6,0 10,-4 6,0 0)),((0 0,-6 4,-10 0,-6 -4,0 0)),'
'((0 0,-4 -6,0 -10,4 -6,0 0)),((0 0,6 -4,10 0,6 4,0 0)))'), 3));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,4 6,0 10,-4 6,0 0)),((0 0,-6 4,-10 0,-6 -4,0 0)),'
'((0 0,-4 -6,0 -10,4 -6,0 0)),((0 0,6 -4,10 0,6 4,0 0)))'), 3))
MULTIPOLYGON(((0 0,4 6,0 10,-4 6,0 0)),((0 0,-6 4,-10 0,-6 -4,0 0)),((0 0,-4 -6,0 -10,4 -6,0 0)),((0 0,6 -4,10 0,6 4,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,4 6,0 10,-4 6,0 0)),((0 0,-6 4,-10 0,-6 -4,0 0)),'
'((0 0,-4 -6,0 -10,4 -6,0 0)),((0 0,6 -4,10 0,6 4,0 0)))'), 4));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,4 6,0 10,-4 6,0 0)),((0 0,-6 4,-10 0,-6 -4,0 0)),'
'((0 0,-4 -6,0 -10,4 -6,0 0)),((0 0,6 -4,10 0,6 4,0 0)))'), 4))
NULL
#####################################################################################
# ST_SIMPLIFY(geometrycollection)
#####################################################################################
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(0 0))'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(0 0))'), 1))
GEOMETRYCOLLECTION(POINT(0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOINT(0 0,1 0,1 1,2 0,2 2))'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOINT(0 0,1 0,1 1,2 0,2 2))'), 1))
GEOMETRYCOLLECTION(MULTIPOINT(0 0,1 0,1 1,2 0,2 2))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,5 0,5 5,0 5,0 0))'), 3.5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,5 0,5 5,0 5,0 0))'), 3.5))
GEOMETRYCOLLECTION(LINESTRING(0 0,5 0,5 5,0 5,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,5 0,5 5,0 5,0 0))'), 3.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,5 0,5 5,0 5,0 0))'), 3.6))
GEOMETRYCOLLECTION(LINESTRING(0 0,5 5,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,4 4,6 -6,10 0))'), 5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,4 4,6 -6,10 0))'), 5))
GEOMETRYCOLLECTION(LINESTRING(0 0,4 4,6 -6,10 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,0 4,4 4),(0 0,5 0,5 5,0 5,0 0)))'), 3.5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,0 4,4 4),(0 0,5 0,5 5,0 5,0 0)))'), 3.5))
GEOMETRYCOLLECTION(MULTILINESTRING((0 0,4 4),(0 0,5 0,5 5,0 5,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,0 5,5 5),(0 0,5 0,5 5,0 5,0 0)))'), 3.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,0 5,5 5),(0 0,5 0,5 5,0 5,0 0)))'), 3.6))
GEOMETRYCOLLECTION(MULTILINESTRING((0 0,5 5),(0 0,5 5,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0)))'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0)))'), 1))
GEOMETRYCOLLECTION(MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,10 10,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 7));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 7))
GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 8));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 8))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((0 0,0 -8,-8 -8,-8 0,0 0))))'), 7));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((0 0,0 -8,-8 -8,-8 0,0 0))))'), 7))
GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0))))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((0 0,0 -8,-8 -8,-8 0,0 0))))'), 8));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((0 0,0 -8,-8 -8,-8 0,0 0))))'), 8))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION()'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION()'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION())'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION())'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), LINESTRING(0 0,5 0,5 5))'), 3.5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), LINESTRING(0 0,5 0,5 5))'), 3.5))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), LINESTRING(0 0,5 0,5 5))'), 3.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), LINESTRING(0 0,5 0,5 5))'), 3.6))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 7));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 7))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 8));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 8))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,0 5,5 5,5 0,0 0),'
'POLYGON((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,0 5,5 5,5 0,0 0),'
GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,0 5,5 5,5 0,0 0),POLYGON((0 0,0 -5,-5 -5,-5 0,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,0 5,5 5,5 0,0 0),'
'POLYGON((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.6));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,0 5,5 5,5 0,0 0),'
GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,5 5,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'LINESTRING(0 0,5 5,0 10,-5 5,0 0),'
'POLYGON((0 0,-5 -5,0 -10,5 -5,0 0)))'), 4.9));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'LINESTRING(0 0,5 5,0 10,-5 5,0 0),'
'POLYGON((0 0,-5 -5,0 -10,5 -5,0 0)))'), 4.9))
GEOMETRYCOLLECTION(LINESTRING(0 0,5 5,0 10,-5 5,0 0),POLYGON((0 0,-5 -5,0 -10,5 -5,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'LINESTRING(0 0,5 5,0 10,-5 5,0 0),'
'POLYGON((0 0,-5 -5,0 -10,5 -5,0 0)))'), 5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'LINESTRING(0 0,5 5,0 10,-5 5,0 0),'
'POLYGON((0 0,-5 -5,0 -10,5 -5,0 0)))'), 5))
GEOMETRYCOLLECTION(LINESTRING(0 0,0 10,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'MULTILINESTRING((0 0,5 5,0 10,-5 5,0 0),(0 0,-5 -5,0 -10,5 -5,0 0)),'
'MULTIPOLYGON(((0 0,5 -5,10 0,5 5,0 0)),((0 0,-5 5,-10 0,-5 -5,0 0))))'), 4.9));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'MULTILINESTRING((0 0,5 5,0 10,-5 5,0 0),(0 0,-5 -5,0 -10,5 -5,0 0)),'
'MULTIPOLYGON(((0 0,5
GEOMETRYCOLLECTION(MULTILINESTRING((0 0,5 5,0 10,-5 5,0 0),(0 0,-5 -5,0 -10,5 -5,0 0)),MULTIPOLYGON(((0 0,5 -5,10 0,5 5,0 0)),((0 0,-5 5,-10 0,-5 -5,0 0))))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'MULTILINESTRING((0 0,5 5,0 10,-5 5,0 0),(0 0,-5 -5,0 -10,5 -5,0 0)),'
'MULTIPOLYGON(((0 0,5 -5,10 0,5 5,0 0)),((0 0,-5 5,-10 0,-5 -5,0 0))))'), 5));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'MULTILINESTRING((0 0,5 5,0 10,-5 5,0 0),(0 0,-5 -5,0 -10,5 -5,0 0)),'
'MULTIPOLYGON(((0 0,5
GEOMETRYCOLLECTION(MULTILINESTRING((0 0,0 10,0 0),(0 0,0 -10,0 0)))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),LINESTRING(0 0,5 0,0 -1,5 -1,0 -3,5 -3,0 -4,5 -4,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 2));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),LINESTRING(0 0,5 0,0 -1,5 -3,0 -4,5 -4,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 3));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),LINESTRING(0 0,5 0,0 -4,5 -4,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 4));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),LINESTRING(0 0,5 -4,0 0))
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 7));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),LINESTRING(0 0,0 0))
# Invalid geometry in input.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),'
'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),'
'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),'
GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,2.5 2.5,-2.5 7.5,0 10),POLYGON((0 0,5 0,0 -1,5 -1,0 -3,5 -3,0 -4,5 -4,0 0)),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))
# Invalid geometry in input.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),'
'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),'
'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 2));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),'
GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,2.5 2.5,-2.5 7.5,0 10),POLYGON((0 0,5 0,0 -1,5 -3,0 -4,5 -4,0 0)),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),MULTILINESTRING((0 0,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))
# Invalid geometry in input.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),'
'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),'
'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 3));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),'
GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,0 10),POLYGON((0 0,5 0,0 -4,5 -4,0 0)),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),MULTILINESTRING((0 0,0 0),(0 0,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))
# Invalid geometry in input.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),'
'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),'
'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 4));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),'
GEOMETRYCOLLECTION(POINT(0 0),LINESTRING(0 0,0 10),MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),MULTILINESTRING((0 0,0 0),(0 0,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)))
#####################################################################################
# ST_ASTEXT(ST_SIMPLIFY(geometry) with different SRID values
#####################################################################################
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_center,-1024), 1));
ERROR HY000: st_simplify has not been implemented for geographic spatial reference systems.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_all_points,-1), 1));
ERROR HY000: st_simplify has not been implemented for geographic spatial reference systems.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_top_to_center,0), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_top_to_center,0), 1))
LINESTRING(15 25,15 10)
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_lines_near_vertical,4326), 1));
ERROR HY000: st_simplify has not been implemented for geographic spatial reference systems.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_collection_elems,4294967295000), 1));
ERROR HY000: st_simplify has not been implemented for geographic spatial reference systems.
#####################################################################################
# Invalid function calls
#####################################################################################
SELECT ST_ASTEXT(ST_SIMPLIFY());
ERROR 42000: Incorrect parameter count in the call to native function 'ST_SIMPLIFY'
SELECT ST_ASTEXT(ST_SIMPLIFY(NULL));
ERROR 42000: Incorrect parameter count in the call to native function 'ST_SIMPLIFY'
SELECT ST_ASTEXT(ST_SIMPLIFY(NULL,1));
ST_ASTEXT(ST_SIMPLIFY(NULL,1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT()'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT()'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING()'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING()'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON(())'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON(())'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT()'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT()'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING(())'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING(())'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON((()))'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON((()))'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(a 0)'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(a 0)'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(! 0)'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(! 0)'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT('!' 0)'), 1));
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '!' 0)'), 1))' at line 1
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(12,34 0)'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(12,34 0)'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(a 0,10 10)'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(a 0,10 10)'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,! 10)'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,! 10)'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING('!' 0,10 10)'), 1));
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '!' 0,10 10)'), 1))' at line 1
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(12,34 0,10 10)'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(12,34 0,10 10)'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((a 0,10 10,10 0,0 0))'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((a 0,10 10,10 0,0 0))'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,! 10,10 0,0 0))'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,! 10,10 0,0 0))'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON(('!' 0,10 10,10 0,0 0))'), 1));
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '!' 0,10 10,10 0,0 0))'), 1))' at line 1
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((12,34 0,10 10,10 0,0 0))'), 1));
ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((12,34 0,10 10,10 0,0 0))'), 1))
NULL
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), 0));
ERROR HY000: Incorrect arguments to st_simplify
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), -1));
ERROR HY000: Incorrect arguments to st_simplify
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), -1024));
ERROR HY000: Incorrect arguments to st_simplify
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), 'a'));
ERROR HY000: Incorrect arguments to st_simplify
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), a));
ERROR 42S22: Unknown column 'a' in 'field list'
# Clean up
DROP TABLE gis_geometrycollection;
# Copyright (c) 2015, Oracle and/or its affiliates
# Copyright (c) 2024, MariaDB Corporation.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
############################################################################################
# Creating the spatial objects #
############################################################################################
--echo # Creating the spatial Geometry object
USE test;
CREATE TABLE gis_geometrycollection (fid INTEGER NOT NULL PRIMARY KEY, g GEOMETRY);
############################################################################################
# Inserting the values specific to the spatial objects #
############################################################################################
# Geometric elements constructing a star and some of its elememts as base
SET @star_elem_vertical= 'POLYGON((5 0,15 25,25 0,15 5,5 0))';
SET @star_elem_horizontal= 'POLYGON((25 0,0 15,30 15,22 10,25 0))';
SET @star_center= 'POINT(15 10)';
SET @star_top= 'POINT(15 25)';
SET @star_bottom_left= 'POINT(5 0)';
SET @star_bottom_right= 'POINT(25 0)';
SET @star_bottom_points= 'MULTIPOINT(5 0,25 0)';
SET @star_all_points= 'MULTIPOINT(5 0,25 0,15 10,15 25)';
SET @star_line_horizontal= 'LINESTRING(10 15,20 15)';
SET @star_line_vertical= 'LINESTRING(15 5,15 25)';
SET @star_top_to_center= 'LINESTRING(15 25,15 10)';
SET @star_lines_near_horizontal= 'MULTILINESTRING((25 0,0 15,15 30,0 5))';
SET @star_lines_near_vertical= 'MULTILINESTRING((0 5,15 25,0 25))';
SET @star= 'POLYGON((5 0,7 10,0 15,10 15,15 25,20 15,30 15,22 10,25 0,15 5,5 0))';
SET @star_of_elems='MULTIPOLYGON(((5 0,15 25,25 0,15 5,5 0)),((25 0,0 15,30 15,22 10,25 0)))';
SET @star_collection_elems='GEOMETRYCOLLECTION(MULTIPOLYGON(((5 0,15 25,25 0,15 5,5 0)),((25 0,0 15,30 15,22 10,25 0))),POLYGON((5 0,7 10,0 15,10 15,15 25,20 15,30 15,22 10,25 0,15 5,5 0)),LINESTRING(15 25,15 10),MULTIPOINT(5 0,25 0),POINT(15 25))';
SET @star_collection_multilinestr='GEOMETRYCOLLECTION(MULTIPOLYGON(((5 0,15 25,25 0,15 5,5 0)),((25 0,0 15,30 15,22 10,25 0))),POLYGON((5 0,7 10,0 15,10 15,15 25,20 15,30 15,22 10,25 0,15 5,5 0)),MULTILINESTRING((25 0,0 15,15 30,0 5)),LINESTRING(15 25,15 10),MULTIPOINT(5 0,25 0),POINT(15 25))';
--disable_warnings
INSERT INTO gis_geometrycollection VALUES
(100,ST_GEOMFROMTEXT(@star)),
(101,ST_GEOMFROMTEXT(@star_elem_vertical)),
(102,ST_GEOMFROMTEXT(@star_elem_horizontal)),
(103,ST_GEOMFROMTEXT(@star_of_elems)),
(104,ST_GEOMFROMTEXT(@star_top)),
(105,ST_GEOMFROMTEXT(@star_center)),
(106,ST_GEOMFROMTEXT(@star_bottom_left)),
(107,ST_GEOMFROMTEXT(@star_bottom_right)),
(108,ST_GEOMFROMTEXT(@star_bottom_points)),
(109,ST_GEOMFROMTEXT(@star_all_points)),
(110,ST_GEOMFROMTEXT(@star_line_horizontal)),
(111,ST_GEOMFROMTEXT(@star_line_vertical)),
(112,ST_GEOMFROMTEXT(@star_top_to_center)),
(113,ST_GEOMFROMTEXT(@star_lines_near_horizontal)),
(114,ST_GEOMFROMTEXT(@star_lines_near_vertical)),
(115,ST_GEOMFROMTEXT(@star_collection_elems)),
(116,ST_GEOMFROMTEXT(@star_collection_multilinestr));
--enable_warnings
--echo # Checking the integrity of the above create/insert statements
--echo # 17 rows.
SELECT count(ST_ASTEXT(g) != 'NULL') FROM gis_geometrycollection;
--echo #####################################################################################
--echo # ST_SIMPLIFY(point)
--echo #####################################################################################
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(17 14)'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-8 2)'), 2));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(9 0)'), 3));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(10 -8)'), 4));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(20 -2)'), 5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(7 13)'), 10));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-16 11)'), 1000));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-5 -2)'), 2000000));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-10 6)'), 1234567890));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(-16 -8)'), 111111111111));
--echo #####################################################################################
--echo # ST_SIMPLIFY(multipoint)
--echo #####################################################################################
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(19 -4, -2 -6, -8 2)'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-3 14, 19 8, 10 -8)'), 2));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(1 -8, -1 12, -11 16)'), 3));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-16 11, -2 -7, -11 11)'), 4));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(19 12, 0 9, 5 10, 20 -16, 7 -17, 9 -18, 19 -7)'), 10));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-1 11, -17 -11, -15 16, 6 -6, 11 -13, -4 -12, -13 -5)'), 1000));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(17 -11, -19 -6, 5 17, -14 13, 20 13, 20 2, 0 -12)'), 200000));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(-15 12, 17 -12, -7 14, 1 6, 19 -10, 11 -9, 0 -17)'), 9999999));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT(3 -13, 18 -2, -5 -13, -12 1, 20 0, -6 14, 5 -4)'), 1234567890));
--echo #####################################################################################
--echo # ST_SIMPLIFY(linestring)
--echo #####################################################################################
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,10 10)'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5)'), 3.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5)'), 3.6));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,4 4,6 -6,10 0)'), 5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5,0 5,0 0)'), 3.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 0,5 5,0 5,0 0)'), 3.6));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,0 10,-5 5,0 0)'), 4.9));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,5 5,0 10,-5 5,0 0)'), 5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,3 -3,5 5,7 -7,9 9,10 10)'), 1));
# TODO Bug #33739281 Some gis functions give different results with gcc11 in optimized mode on ARM
# SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.6));
# TODO Bug #33739281 Some gis functions give different results with gcc11 in optimized mode on ARM
# SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.7));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5)'), 0.8));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 -1,4 0,5 1,6 0,7 -1,8 0,9 1,10 0)'), 0.9));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 -1,4 0,5 1,6 0,7 -1,8 0,9 1,10 0)'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)'), 0.6));
# TODO Bug #33739281 Some gis functions give different results with gcc11 in optimized mode on ARM
# SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)'), 0.7));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,1 1,2 0,3 1,4 0,5 1,6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0)'), 0.8));
--echo #####################################################################################
--echo # ST_SIMPLIFY(multilinestring)
--echo #####################################################################################
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10))'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10),(0 0,5 0,5 5))'), 3.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,10 10),(0 0,5 0,5 5))'), 3.6));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 0,5 5),(0 0,5 0,5 5,0 5,0 0))'), 3.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 0,5 5),(0 0,5 0,5 5,0 5,0 0))'), 3.6));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,0 10),(0 0,-5 5,0 10))'), 4.9));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,5 5,0 10),(0 0,-5 5,0 10))'), 5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0))'), 1));
# TODO Bug #33739281 Some gis functions give different results with gcc11 in optimized mode on ARM
# SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5),'
# '(0 0,1 0,1 1,2 1,2 2,3 2,3 3,4 3,4 4,5 4,4 4))'), 0.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5),'
'(0 0,1 0,1 1,2 1,2 2,3 2,3 3,4 3,4 4,5 4,4 4))'), 0.6));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,0 1,1 1,1 2,2 2,2 3,3 3,3 4,4 4,4 5,5 5),'
'(0 0,1 0,1 1,2 1,2 2,3 2,3 3,4 3,4 4,5 4,4 4))'), 0.7));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))'), 0.6));
# TODO Bug #33739281 Some gis functions give different results with gcc11 in optimized mode on ARM
# SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))'), 0.7));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING((0 0,1 1,2 0,3 1,4 0,5 1,6 0),(6 0,5 -1,4 0,3 -1,2 0,1 -1,0 0))'), 0.8));
--echo #####################################################################################
--echo # ST_SIMPLIFY(polygon)
--echo #####################################################################################
--echo # Invalid geometry in input.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,4 4,6 -6,10 0,0 0,0 0,0 0))'), 5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'), 3.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 5,5 5,5 0,0 0))'), 3.6));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,10 10,-10 10,0 0))'), 14));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,10 10,-10 10,0 0))'), 15));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,5 5,0 10,-5 5,0 0))'), 4.9));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,5 5,0 10,-5 5,0 0))'), 5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0))'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 4.9));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 12));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((5 0,10 10,-10 10,-5 0,-10 -10,10 -10,5 0))'), 17));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 1.4));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 1.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 7));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4))'), 7.1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 3));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 4));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((10 2,5 2,5 10,-5 10,-5 2,-10 2,-10 -2,-5 -2,-5 -10,5 -10,5 -2,10 -2,10 2))'), 11));
--echo #####################################################################################
--echo # ST_SIMPLIFY(multipolygon)
--echo #####################################################################################
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)))'), 3.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)))'), 3.6));
--echo # Invalid geometry in input.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0)))'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 1.4));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 1.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 7));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)))'), 7.1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 1.4));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 1.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 7));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((4 4,4 6,6 6,6 4,4 4,4 4,4 4,4 4)))'), 7.1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 5,5 5,5 0,0 0)),((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.6));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))'), 14));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,10 10,-10 10,0 0)),((0 0,-10 -10,10 -10,0 0)))'), 15));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,5 5,0 10,-5 5,0 0)),((0 0,-5 -5,0 -10,5 -5,0 0)))'), 4.9));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,5 5,0 10,-5 5,0 0)),((0 0,-5 -5,0 -10,5 -5,0 0)))'), 5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,4 6,0 10,-4 6,0 0)),((0 0,-6 4,-10 0,-6 -4,0 0)),'
'((0 0,-4 -6,0 -10,4 -6,0 0)),((0 0,6 -4,10 0,6 4,0 0)))'), 3));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,4 6,0 10,-4 6,0 0)),((0 0,-6 4,-10 0,-6 -4,0 0)),'
'((0 0,-4 -6,0 -10,4 -6,0 0)),((0 0,6 -4,10 0,6 4,0 0)))'), 4));
--echo #####################################################################################
--echo # ST_SIMPLIFY(geometrycollection)
--echo #####################################################################################
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(0 0))'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOINT(0 0,1 0,1 1,2 0,2 2))'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,5 0,5 5,0 5,0 0))'), 3.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,5 0,5 5,0 5,0 0))'), 3.6));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,4 4,6 -6,10 0))'), 5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,0 4,4 4),(0 0,5 0,5 5,0 5,0 0)))'), 3.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,0 5,5 5),(0 0,5 0,5 5,0 5,0 0)))'), 3.6));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((0 0,1 1,3 -3,5 5,7 -7,9 9,10 10,0 0)))'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 7));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 8));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((0 0,0 -8,-8 -8,-8 0,0 0))))'), 7));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)),((0 0,0 -8,-8 -8,-8 0,0 0))))'), 8));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION()'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION())'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), LINESTRING(0 0,5 0,5 5))'), 3.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), LINESTRING(0 0,5 0,5 5))'), 3.6));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 7));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(), POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0)))'), 8));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,0 5,5 5,5 0,0 0),'
'POLYGON((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,0 5,5 5,5 0,0 0),'
'POLYGON((0 0,0 -5,-5 -5,-5 0,0 0)))'), 3.6));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'LINESTRING(0 0,5 5,0 10,-5 5,0 0),'
'POLYGON((0 0,-5 -5,0 -10,5 -5,0 0)))'), 4.9));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'LINESTRING(0 0,5 5,0 10,-5 5,0 0),'
'POLYGON((0 0,-5 -5,0 -10,5 -5,0 0)))'), 5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'MULTILINESTRING((0 0,5 5,0 10,-5 5,0 0),(0 0,-5 -5,0 -10,5 -5,0 0)),'
'MULTIPOLYGON(((0 0,5 -5,10 0,5 5,0 0)),((0 0,-5 5,-10 0,-5 -5,0 0))))'), 4.9));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'MULTILINESTRING((0 0,5 5,0 10,-5 5,0 0),(0 0,-5 -5,0 -10,5 -5,0 0)),'
'MULTIPOLYGON(((0 0,5 -5,10 0,5 5,0 0)),((0 0,-5 5,-10 0,-5 -5,0 0))))'), 5));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 2));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 3));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 4));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(10 10),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'LINESTRING(0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0))'), 7));
--echo # Invalid geometry in input.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),'
'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),'
'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 1));
--echo # Invalid geometry in input.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),'
'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),'
'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 2));
--echo # Invalid geometry in input.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),'
'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),'
'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 3));
--echo # Invalid geometry in input.
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION('
'POINT(0 0),'
'LINESTRING(0 0,2.5 2.5,0 5,-2.5 7.5,0 10),'
'POLYGON((0 0,5 0,0 -1,5 -1,0 -2,5 -2,0 -3,5 -3,0 -4,5 -4,0 0)),'
'MULTIPOINT(0 0,1 1,2 2,3 3,4 4,5 5),'
'MULTILINESTRING((0 0,1 1,-1 1,0 0),(0 0,2 2,-2 2,0 0),(0 0,3 3,-3 3,0 0),(0 0,4 4,-4 4,0 0)),'
'MULTIPOLYGON(((0 0,2.5 2.5,-2.5 2.5,0 0)),((0 0,-2.5 -2.5,2.5 -2.5,0 0))))'), 4));
--echo #####################################################################################
--echo # ST_ASTEXT(ST_SIMPLIFY(geometry) with different SRID values
--echo #####################################################################################
--error ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_center,-1024), 1));
--error ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_all_points,-1), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_top_to_center,0), 1));
--error ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_lines_near_vertical,4326), 1));
--error ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT(@star_collection_elems,4294967295000), 1));
--echo #####################################################################################
--echo # Invalid function calls
--echo #####################################################################################
--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
SELECT ST_ASTEXT(ST_SIMPLIFY());
--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
SELECT ST_ASTEXT(ST_SIMPLIFY(NULL));
SELECT ST_ASTEXT(ST_SIMPLIFY(NULL,1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT()'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING()'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON(())'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOINT()'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTILINESTRING(())'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('MULTIPOLYGON((()))'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(a 0)'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(! 0)'), 1));
--error ER_PARSE_ERROR
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT('!' 0)'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POINT(12,34 0)'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(a 0,10 10)'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(0 0,! 10)'), 1));
--error ER_PARSE_ERROR
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING('!' 0,10 10)'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('LINESTRING(12,34 0,10 10)'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((a 0,10 10,10 0,0 0))'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,! 10,10 0,0 0))'), 1));
--error ER_PARSE_ERROR
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON(('!' 0,10 10,10 0,0 0))'), 1));
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((12,34 0,10 10,10 0,0 0))'), 1));
--error ER_WRONG_ARGUMENTS
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), 0));
--error ER_WRONG_ARGUMENTS
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), -1));
--error ER_WRONG_ARGUMENTS
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), -1024));
--error ER_WRONG_ARGUMENTS
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), 'a'));
--error ER_BAD_FIELD_ERROR
SELECT ST_ASTEXT(ST_SIMPLIFY(ST_GEOMFROMTEXT('POLYGON((0 0,0 10,10 10,10 0,0 0,0 0,0 0,0 0))'), a));
--echo # Clean up
DROP TABLE gis_geometrycollection;
......@@ -2140,6 +2140,69 @@ longlong Item_func_issimple::val_int()
}
String *Item_func_simplify::val_str(String *str)
{
DBUG_ENTER("Item_func_simplify::val_str");
String *res= args[0]->val_str(&tmp_value);
double max_distance= (double) args[1]->val_real();
Geometry_buffer buffer;
Geometry *geometry;
uint32 num_points;
null_value= 1;
if ((null_value= (args[0]->null_value || args[1]->null_value)) ||
!(geometry= Geometry::construct(&buffer, res->ptr(), res->length())))
{
null_value= 1;
DBUG_RETURN(NULL);
}
if (max_distance <= 0)
{
my_error(ER_WRONG_ARGUMENTS, MYF(0), func_name());
null_value= 1;
DBUG_RETURN(NULL);
}
uint32 srid= uint4korr(res->ptr());
if (srid != 0)
{
my_error(ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS, MYF(0), func_name());
null_value= 1;
DBUG_RETURN(NULL);
}
if (geometry->get_class_info()->m_type_id == Geometry::wkb_point ||
geometry->get_class_info()->m_type_id == Geometry::wkb_multipoint)
{
str = res;
DBUG_RETURN(str);
}
if (geometry->get_class_info()->m_type_id == Geometry::wkb_linestring)
{
if (geometry->num_points(&num_points))
{
null_value= 1;
DBUG_RETURN(NULL);
}
if (num_points < 3)
{
str = res;
DBUG_RETURN(str);
}
}
if (geometry->simplify(str, max_distance))
{
null_value= 1;
DBUG_RETURN(NULL);
}
DBUG_RETURN(str);
}
longlong Item_func_isclosed::val_int()
{
DBUG_ASSERT(fixed());
......@@ -4243,6 +4306,22 @@ class Create_func_issimple : public Create_func_arg1
};
class Create_func_simplify : public Create_func_arg2
{
public:
Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override
{
return new (thd->mem_root) Item_func_simplify(thd, arg1, arg2);
}
static Create_func_simplify s_singleton;
protected:
Create_func_simplify() = default;
~Create_func_simplify() override = default;
};
class Create_func_numgeometries : public Create_func_arg1
{
public:
......@@ -4515,6 +4594,7 @@ Create_func_isempty Create_func_isempty::s_singleton;
Create_func_isvalid Create_func_isvalid::s_singleton;
Create_func_isring Create_func_isring::s_singleton;
Create_func_issimple Create_func_issimple::s_singleton;
Create_func_simplify Create_func_simplify::s_singleton;
Create_func_mbr_contains Create_func_mbr_contains::s_singleton;
Create_func_mbr_coveredby Create_func_mbr_coveredby::s_singleton;
Create_func_mbr_disjoint Create_func_mbr_disjoint::s_singleton;
......@@ -4585,6 +4665,7 @@ static Native_func_registry func_array_geom[] =
{ { STRING_WITH_LEN("ISVALID") }, GEOM_BUILDER(Create_func_isvalid)},
{ { STRING_WITH_LEN("ISRING") }, GEOM_BUILDER(Create_func_isring)},
{ { STRING_WITH_LEN("ISSIMPLE") }, GEOM_BUILDER(Create_func_issimple)},
{ { STRING_WITH_LEN("SIMPLIFY") }, GEOM_BUILDER(Create_func_simplify)},
{ { STRING_WITH_LEN("LINEFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)},
{ { STRING_WITH_LEN("LINEFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)},
{ { STRING_WITH_LEN("LINESTRINGFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)},
......@@ -4669,6 +4750,7 @@ static Native_func_registry func_array_geom[] =
{ { STRING_WITH_LEN("ST_ISVALID") }, GEOM_BUILDER(Create_func_isvalid)},
{ { STRING_WITH_LEN("ST_ISRING") }, GEOM_BUILDER(Create_func_isring)},
{ { STRING_WITH_LEN("ST_ISSIMPLE") }, GEOM_BUILDER(Create_func_issimple)},
{ { STRING_WITH_LEN("ST_SIMPLIFY") }, GEOM_BUILDER(Create_func_simplify)},
{ { STRING_WITH_LEN("ST_LENGTH") }, GEOM_BUILDER(Create_func_glength)},
{ { STRING_WITH_LEN("ST_LINEFROMTEXT") }, GEOM_BUILDER(Create_func_geometry_from_text)},
{ { STRING_WITH_LEN("ST_LINEFROMWKB") }, GEOM_BUILDER(Create_func_geometry_from_wkb)},
......
......@@ -971,6 +971,29 @@ class Item_func_issimple: public Item_long_func_args_geometry
{ return get_item_copy<Item_func_issimple>(thd, this); }
};
class Item_func_simplify: public Item_geometry_func_args_geometry
{
String tmp_value;
Gcalc_heap collector;
Gcalc_function func;
Gcalc_scan_iterator scan_it;
public:
Item_func_simplify(THD *thd, Item *a, Item *b)
:Item_geometry_func_args_geometry(thd, a, b) {}
LEX_CSTRING func_name_cstring() const override
{
static LEX_CSTRING name= {STRING_WITH_LEN("st_simplify") };
return name;
}
String *val_str(String *) override;
const Type_handler *type_handler() const override
{
return &type_handler_geometry;
}
Item *do_get_copy(THD *thd) const override
{ return get_item_copy<Item_func_simplify>(thd, this); }
};
class Item_func_isclosed: public Item_long_func_args_geometry
{
public:
......
......@@ -12291,3 +12291,5 @@ WARN_SORTING_ON_TRUNCATED_LENGTH
ER_INCORRECT_COLUMN_NAME_COUNT
eng "Incorrect column name count for derived table"
chi "派生表的列名计数不正确"
ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS
eng "%s has not been implemented for geographic spatial reference systems."
......@@ -20,6 +20,7 @@
#include "spatial.h"
#include "gstream.h" // Gis_read_stream
#include "sql_string.h" // String
#include <vector>
/* This is from item_func.h. Didn't want to #include the whole file. */
double my_double_round(double value, longlong dec, bool dec_unsigned,
......@@ -155,6 +156,79 @@ int MBR::coveredby(const MBR *mbr)
}
/********************** Ramer–Douglas–Peucker algorithm **********************/
static double perpendicular_distance(const st_point_2d& point,
const st_point_2d& line_start,
const st_point_2d& line_end) {
double difference_x= line_end.x - line_start.x;
double difference_y= line_end.y - line_start.y;
double magnitude = sqrt((difference_x * difference_x) +
(difference_y * difference_y));
if (magnitude > 0.0)
{
difference_x /= magnitude;
difference_y /= magnitude;
}
double point_vector_x= point.x - line_start.x;
double point_vector_y= point.y - line_start.y;
double point_vector_dot_product= ((difference_x * point_vector_x) +
(difference_y * point_vector_y));
double adjusted_x= point_vector_x - (point_vector_dot_product * difference_x);
double adjusted_y= point_vector_y - (point_vector_dot_product * difference_y);
return sqrt((adjusted_x * adjusted_x) + (adjusted_y * adjusted_y));
}
static void recursive_RDP(const std::vector<st_point_2d>& points,
const double max_distance,
std::vector<st_point_2d>& out,
const uint32 start, const uint32 end)
{
if (start >= end) return;
double greatest_distance= 0.0;
uint32 index= start;
for (uint32 i = start + 1; i < end; ++i) {
double dist = perpendicular_distance(points[i], points[start], points[end]);
if (dist > greatest_distance) {
index = i;
greatest_distance = dist;
}
}
if (greatest_distance > max_distance)
{
recursive_RDP(points, max_distance, out, start, index);
recursive_RDP(points, max_distance, out, index, end);
} else if (start != 0)
out.push_back(points[start]);
}
/*
Implements the Ramer–Douglas–Peucker. Given the points that compose a line,
finds a similar curve with fewer points. The simplified curve consists of a
subset of the points that defined the original curve.
https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm
*/
static void simplify_RDP(std::vector<st_point_2d>& points,
const double max_distance) {
std::vector<st_point_2d> result;
result.push_back(points.front());
recursive_RDP(points, max_distance, result, 0,(uint32) points.size() - 1);
result.push_back(points.back());
points = std::move(result);
}
/***************************** Gis_class_info *******************************/
Geometry::Class_info *Geometry::ci_collection[Geometry::wkb_last+1]=
......@@ -1545,6 +1619,53 @@ int Gis_line_string::is_valid(int *valid) const
}
int Gis_line_string::simplify(String *result, double max_distance) const {
Geometry_buffer buffer;
Geometry *geometry= NULL;
std::vector<st_point_2d> points;
double x, y;
uint32 n_points= 0;
if(this->num_points(&n_points))
return 1;
for (uint32 i = 1; i <= n_points; i++)
{
String wkb= 0;
if (wkb.reserve(SRID_SIZE + WKB_HEADER_SIZE + POINT_DATA_SIZE))
return 1;
wkb.q_append(SRID_PLACEHOLDER);
this->point_n(i, &wkb);
if (!(geometry= Geometry::construct(&buffer, wkb.ptr(), wkb.length())))
return 1;
if(((Gis_point *) geometry)->get_xy(&x, &y))
return 1;
points.push_back(st_point_2d{x, y});
}
simplify_RDP(points, max_distance);
result->length(0);
result->reserve(SRID_SIZE + WKB_HEADER_SIZE +
(POINT_DATA_SIZE * points.size()));
result->q_append(SRID_PLACEHOLDER);
result->q_append((char) wkb_ndr);
result->q_append((uint32) wkb_linestring);
result->q_append((uint32) points.size());
for (auto point : points)
{
result->q_append((double) point.x);
result->q_append((double) point.y);
}
return 0;
}
int Gis_line_string::num_points(uint32 *n_points) const
{
*n_points= uint4korr(m_data);
......@@ -2017,6 +2138,80 @@ int Gis_polygon::area(double *ar, const char **end_of_data) const
return 0;
}
int Gis_polygon::simplify(String *result, double max_distance) const
{
uint32 num_interior_ring= 0, num_invalid_ring= 0, num_points;
Geometry_buffer buffer;
Geometry *geometry= NULL;
String exterior_ring= 0;
exterior_ring.q_append(SRID_PLACEHOLDER);
if (this->num_interior_ring(&num_interior_ring) ||
this->exterior_ring(&exterior_ring) ||
!(geometry= Geometry::construct(&buffer, exterior_ring.ptr(),
exterior_ring.length())))
return 1;
if (geometry->simplify(&exterior_ring, max_distance))
return 1;
if (!(geometry= Geometry::construct(&buffer, exterior_ring.ptr(),
exterior_ring.length())))
return 1;
if (geometry->num_points(&num_points) || num_points <= 3)
return 1;
result->length(0);
result->reserve(SRID_SIZE + WKB_HEADER_SIZE);
result->q_append(SRID_PLACEHOLDER);
result->q_append((char) wkb_ndr);
result->q_append((uint32) wkb_polygon);
result->q_append((uint32) 1 + num_interior_ring);
result->append(exterior_ring.ptr() + SRID_SIZE + WKB_HEADER_SIZE,
(exterior_ring.length() - SRID_SIZE -
WKB_HEADER_SIZE));
for (uint32 i = 1; i <= num_interior_ring; i++)
{
String interior_ring= 0;
interior_ring.q_append((uint) 0);
if (this->interior_ring_n(i, &interior_ring) ||
!(geometry= Geometry::construct(&buffer, interior_ring.ptr(),
interior_ring.length())))
{
num_invalid_ring++;
continue;
}
if(geometry->simplify(&interior_ring, max_distance))
return 1;
if (!(geometry= Geometry::construct(&buffer, interior_ring.ptr(),
interior_ring.length())))
{
num_invalid_ring++;
continue;
}
if (geometry->num_points(&num_points))
return 1;
if (num_points <= 3)
{
num_invalid_ring++;
continue;
}
result->append(interior_ring.ptr() + SRID_SIZE + WKB_HEADER_SIZE,
(interior_ring.length() - SRID_SIZE - WKB_HEADER_SIZE));
}
result->write_at_position(SRID_SIZE + WKB_HEADER_SIZE,
((uint32) 1 + num_interior_ring -
num_invalid_ring));
return 0;
}
int Gis_polygon::exterior_ring(String *result) const
{
......@@ -2642,7 +2837,8 @@ bool Gis_multi_line_string::init_from_wkt(Gis_read_stream *trs, String *wkb)
if (wkb->reserve(1 + 4, 512))
return 1;
wkb->q_append((char) wkb_ndr); wkb->q_append((uint32) wkb_linestring);
wkb->q_append((char) wkb_ndr);
wkb->q_append((uint32) wkb_linestring);
if (trs->check_next_symbol('(') ||
ls.init_from_wkt(trs, wkb) ||
......@@ -2720,7 +2916,7 @@ uint Gis_multi_line_string::init_from_wkb(const char *wkb, uint len,
if (!(ls_len= ls.init_from_wkb(wkb + WKB_HEADER_SIZE, len,
(wkbByteOrder) wkb[0], res)))
return 0;
ls_len+= WKB_HEADER_SIZE;;
ls_len+= WKB_HEADER_SIZE;
wkb+= ls_len;
len-= ls_len;
}
......@@ -2993,6 +3189,37 @@ int Gis_multi_line_string::is_closed(int *closed) const
}
int Gis_multi_line_string::simplify(String *result, double max_distance) const
{
uint32 num_lines= 0;
Geometry_buffer buffer;
Geometry *geometry= NULL;
if (this->num_geometries(&num_lines))
return 1;
result->length(0);
result->reserve(SRID_SIZE + WKB_HEADER_SIZE);
result->q_append(SRID_PLACEHOLDER);
result->q_append((char) wkb_ndr);
result->q_append((uint32) wkb_multilinestring);
result->q_append((uint32) num_lines);
for (uint32 i = 1; i <= num_lines; i++)
{
String wkb= 0;
wkb.q_append((uint) 0);
this->geometry_n(i, &wkb);
if (!(geometry= Geometry::construct(&buffer, wkb.ptr(), wkb.length())))
return 1;
geometry->simplify(&wkb, max_distance);
result->append(wkb.ptr() + SRID_SIZE, wkb.length() - SRID_SIZE);
}
return 0;
}
int Gis_multi_line_string::store_shapes(Gcalc_shape_transporter *trn) const
{
uint32 n_lines;
......@@ -3446,6 +3673,48 @@ int Gis_multi_polygon::area(double *ar, const char **end_of_data) const
return 0;
}
int Gis_multi_polygon::simplify(String *result, double max_distance) const
{
uint32 num_polygon= 0, num_invalid_polygon= 0;
Geometry_buffer buffer;
Geometry *geometry= NULL;
if (this->num_geometries(&num_polygon))
return 1;
result->length(0);
result->reserve(SRID_SIZE + WKB_HEADER_SIZE);
result->q_append(SRID_PLACEHOLDER);
result->q_append((char) wkb_ndr);
result->q_append((uint32) wkb_multipolygon);
result->q_append((uint32) num_polygon);
for (uint32 i = 1; i <= num_polygon; i++)
{
String polygon= 0, simplified_polygon= 0;
polygon.q_append((uint) 0);
if (this->geometry_n(i, &polygon) ||
!(geometry= Geometry::construct(&buffer, polygon.ptr(),
polygon.length())))
return 1;
if(geometry->simplify(&simplified_polygon, max_distance))
{
num_invalid_polygon++;
continue;
}
result->append(simplified_polygon.ptr() + SRID_SIZE,
simplified_polygon.length() - SRID_SIZE);
}
if (num_polygon == num_invalid_polygon)
return 1;
result->write_at_position(SRID_SIZE + WKB_HEADER_SIZE,
((uint32) num_polygon - num_invalid_polygon));
return 0;
}
int Gis_multi_polygon::centroid(String *result) const
{
......@@ -3924,6 +4193,58 @@ int Gis_geometry_collection::area(double *ar, const char **end) const
}
int Gis_geometry_collection::simplify(String *result,
double max_distance) const
{
uint32 num_geometries= 0, num_invalid_geometries= 0;
Geometry_buffer buffer;
Geometry *geometry= NULL;
if (this->num_geometries(&num_geometries))
return 1;
result->length(0);
result->reserve(SRID_SIZE + BYTE_ORDER_SIZE + WKB_HEADER_SIZE);
result->q_append(SRID_PLACEHOLDER);
result->q_append((char) wkb_ndr);
result->q_append((uint32) wkb_geometrycollection);
result->q_append((uint32) num_geometries);
for (uint32 i = 1; i <= num_geometries; i++)
{
String wkb= 0, simplified_wkb= 0;
wkb.q_append((uint) 0);
if (this->geometry_n(i, &wkb) ||
!(geometry= Geometry::construct(&buffer, wkb.ptr(), wkb.length())))
return 1;
if (geometry->get_class_info()->m_type_id == Geometry::wkb_point ||
geometry->get_class_info()->m_type_id == Geometry::wkb_multipoint)
{
result->append(wkb.ptr() + SRID_SIZE, wkb.length() - SRID_SIZE);
continue;
}
if(geometry->simplify(&simplified_wkb, max_distance))
{
num_invalid_geometries++;
continue;
}
result->append(simplified_wkb.ptr() + SRID_SIZE,
simplified_wkb.length() - SRID_SIZE);
}
if (num_geometries == num_invalid_geometries)
return 1;
result->write_at_position(SRID_SIZE + WKB_HEADER_SIZE,
(uint32) num_geometries - num_invalid_geometries);
return 0;
}
int Gis_geometry_collection::geom_length(double *len, const char **end) const
{
uint32 n_objects;
......
......@@ -32,7 +32,7 @@ const uint32 SRID_PLACEHOLDER= 0;
const uint SIZEOF_STORED_DOUBLE= 8;
const uint BYTE_ORDER_SIZE= 1;
const uint POINT_DATA_SIZE= (SIZEOF_STORED_DOUBLE * 2);
const uint WKB_HEADER_SIZE= 1+4;
const uint WKB_HEADER_SIZE= BYTE_ORDER_SIZE + 4;
const uint32 GET_SIZE_ERROR= ((uint32) -1);
struct st_point_2d
......@@ -293,6 +293,7 @@ class Geometry
virtual int area(double *ar, const char **end) const { return -1;}
virtual int is_closed(int *closed) const { return -1; }
virtual int is_valid(int *valid) const { return -1; }
virtual int simplify(String* result, double max_distance) const { return -1; }
virtual int num_interior_ring(uint32 *n_int_rings) const { return -1; }
virtual int num_points(uint32 *n_points) const { return -1; }
virtual int num_geometries(uint32 *num) const { return -1; }
......@@ -411,6 +412,7 @@ class Gis_point: public Geometry
const char **end) const override;
bool get_mbr(MBR *mbr, const char **end) const override;
int is_valid(int *valid) const override;
int get_xy(double *x, double *y) const
{
const char *data= m_data;
......@@ -483,6 +485,7 @@ class Gis_line_string: public Geometry
int geom_length(double *len, const char **end) const override;
int area(double *ar, const char **end) const override;
int is_closed(int *closed) const override;
int simplify(String* result, double max_distance) const override;
int num_points(uint32 *n_points) const override;
int is_valid(int *valid) const override;
int start_point(String *point) const override;
......@@ -517,6 +520,7 @@ class Gis_polygon: public Geometry
bool get_mbr(MBR *mbr, const char **end) const override;
int is_valid(int *valid) const override;
int area(double *ar, const char **end) const override;
int simplify(String* result, double max_distance) const override;
int exterior_ring(String *result) const override;
int num_interior_ring(uint32 *n_int_rings) const override;
int interior_ring_n(uint32 num, String *result) const override;
......@@ -590,6 +594,7 @@ class Gis_multi_line_string: public Geometry
int geometry_n(uint32 num, String *result) const override;
int geom_length(double *len, const char **end) const override;
int is_closed(int *closed) const override;
int simplify(String* result, double max_distance) const override;
bool dimension(uint32 *dim, const char **end) const override
{
*dim= 1;
......@@ -620,6 +625,7 @@ class Gis_multi_polygon: public Geometry
int num_geometries(uint32 *num) const override;
int geometry_n(uint32 num, String *result) const override;
int area(double *ar, const char **end) const override;
int simplify(String* result, double max_distance) const override;
int centroid(String *result) const override;
bool dimension(uint32 *dim, const char **end) const override
{
......@@ -651,6 +657,7 @@ class Gis_geometry_collection: public Geometry
int is_valid(int *valid) const override;
bool get_mbr(MBR *mbr, const char **end) const override;
int area(double *ar, const char **end) const override;
int simplify(String* result, double max_distance) const override;
int geom_length(double *len, const char **end) const override;
int num_geometries(uint32 *num) const override;
int geometry_n(uint32 num, String *result) const override;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment