MDEV-35960 st_isvalid(NULL) should not end up with an error, but return NULL.

Now these return NULL if the argument is NULL and an error if the
argument is not a valid geometry.
This commit is contained in:
Alexey Botchkov 2025-03-05 15:15:53 +04:00 committed by Dave Gosselin
parent 4b720b027d
commit 38cc216634
4 changed files with 70 additions and 59 deletions

View File

@ -1840,7 +1840,7 @@ disjoint
# #
select ST_IsRing(NULL); select ST_IsRing(NULL);
ST_IsRing(NULL) ST_IsRing(NULL)
-1 NULL
# #
# MDEV-8675 Different results of GIS functions on NULL vs NOT NULL columns # MDEV-8675 Different results of GIS functions on NULL vs NOT NULL columns
# #
@ -4398,7 +4398,7 @@ ST_NUMPOINTS(POINT(1,1)),
ST_SRID(POINT(1,1)); ST_SRID(POINT(1,1));
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def ST_ISSIMPLE(POINT(1,1)) 3 2 1 Y 32896 0 63 def ST_ISSIMPLE(POINT(1,1)) 3 2 1 Y 32896 0 63
def ST_ISRING(POINT(1,1)) 3 2 2 Y 32896 0 63 def ST_ISRING(POINT(1,1)) 3 2 1 Y 32896 0 63
def ST_ISCLOSED(POINT(1,1)) 3 2 2 Y 32896 0 63 def ST_ISCLOSED(POINT(1,1)) 3 2 2 Y 32896 0 63
def ST_DIMENSION(POINT(1,1)) 3 10 1 Y 32896 0 63 def ST_DIMENSION(POINT(1,1)) 3 10 1 Y 32896 0 63
def ST_NUMGEOMETRIES(POINT(1,1)) 3 10 0 Y 32896 0 63 def ST_NUMGEOMETRIES(POINT(1,1)) 3 10 0 Y 32896 0 63
@ -4406,7 +4406,7 @@ def ST_NUMINTERIORRINGS(POINT(1,1)) 3 10 0 Y 32896 0 63
def ST_NUMPOINTS(POINT(1,1)) 3 10 0 Y 32896 0 63 def ST_NUMPOINTS(POINT(1,1)) 3 10 0 Y 32896 0 63
def ST_SRID(POINT(1,1)) 3 10 1 Y 32896 0 63 def ST_SRID(POINT(1,1)) 3 10 1 Y 32896 0 63
ST_ISSIMPLE(POINT(1,1)) ST_ISRING(POINT(1,1)) ST_ISCLOSED(POINT(1,1)) ST_DIMENSION(POINT(1,1)) ST_NUMGEOMETRIES(POINT(1,1)) ST_NUMINTERIORRINGS(POINT(1,1)) ST_NUMPOINTS(POINT(1,1)) ST_SRID(POINT(1,1)) ST_ISSIMPLE(POINT(1,1)) ST_ISRING(POINT(1,1)) ST_ISCLOSED(POINT(1,1)) ST_DIMENSION(POINT(1,1)) ST_NUMGEOMETRIES(POINT(1,1)) ST_NUMINTERIORRINGS(POINT(1,1)) ST_NUMPOINTS(POINT(1,1)) ST_SRID(POINT(1,1))
1 -1 -1 0 NULL NULL NULL 0 1 0 -1 0 NULL NULL NULL 0
# #
# MDEV-12803 Improve function parameter data type control # MDEV-12803 Improve function parameter data type control
# #

View File

@ -247,19 +247,23 @@ SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0))')) c;
c c
0 0
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION()))')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION()))'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION()))'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,10 10))')) c; SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,10 10))')) c;
c c
1 1
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,10 10)))')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,10 10)))'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,10 10)))'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0),POINT(10 10))')) c; SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0),POINT(10 10))')) c;
c c
0 0
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0),GEOMETRYCOLLECTION())')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0),GEOMETRYCOLLECTION())'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0),GEOMETRYCOLLECTION())'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,1 1,2 2,0 0)),GEOMETRYCOLLECTION())')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,1 1,2 2,0 0)),GEOMETRYCOLLECTION())'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,1 1,2 2,0 0)),GEOMETRYCOLLECTION())'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,10 10,20 20),POLYGON((0 0,10 10,100 100,0 0)))')) c; SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,10 10,20 20),POLYGON((0 0,10 10,100 100,0 0)))')) c;
c c
0 0
@ -281,7 +285,9 @@ c
1 1
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(' SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION('
'GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0)))))')); 'GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0)))))'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION('
'GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0)))))'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)),' SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)),'
'MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0)),((10 10,10 15,15 15,15 10,10 10))))')) c; 'MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0)),((10 10,10 15,15 15,15 10,10 10))))')) c;
c c
@ -290,20 +296,29 @@ SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(1
'MULTIPOINT(0 0,10 10)),' 'MULTIPOINT(0 0,10 10)),'
'GEOMETRYCOLLECTION(LINESTRING(1 1,2 2,3 3),' 'GEOMETRYCOLLECTION(LINESTRING(1 1,2 2,3 3),'
'MULTILINESTRING((0 0,0 10,10 10,10 0),(10 10,10 15,15 15,10 10))))')); 'MULTILINESTRING((0 0,0 10,10 10,10 0),(10 10,10 15,15 15,10 10))))'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),'
'MULTIPOINT(0 0,10 10)),'
'GEOMETRYCOLLECTION(LIN
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),' SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),'
'MULTIPOINT(0 0,10 10)),' 'MULTIPOINT(0 0,10 10)),'
'GEOMETRYCOLLECTION(LINESTRING(1 1,2 2,3 3),' 'GEOMETRYCOLLECTION(LINESTRING(1 1,2 2,3 3),'
'MULTILINESTRING((0 0,0 10,10 10,10 0),(10 10,10 15,15 15,10 10))),' 'MULTILINESTRING((0 0,0 10,10 10,10 0),(10 10,10 15,15 15,10 10))),'
'GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)),' 'GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)),'
'MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0)),((10 10,10 15,15 15,15 10,10 10)))))')); 'MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0)),((10 10,10 15,15 15,15 10,10 10)))))'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),'
'MULTIPOINT(0 0,10 10)),'
'GEOMETRYCOLLECTION(LIN
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),' SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),'
'MULTIPOINT(0 0,10 10)),' 'MULTIPOINT(0 0,10 10)),'
'GEOMETRYCOLLECTION(LINESTRING(1 1,2 2,3 3),' 'GEOMETRYCOLLECTION(LINESTRING(1 1,2 2,3 3),'
'MULTILINESTRING((0 0,0 10,10 10,10 0),(10 10,10 15,15 15,10 10))),' 'MULTILINESTRING((0 0,0 10,10 10,10 0),(10 10,10 15,15 15,10 10))),'
'GEOMETRYCOLLECTION(GEOMETRYCOLLECTION()))')); 'GEOMETRYCOLLECTION(GEOMETRYCOLLECTION()))'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),'
'MULTIPOINT(0 0,10 10)),'
'GEOMETRYCOLLECTION(LIN
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(0 0),' SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(0 0),'
'LINESTRING(1 1,2 2,3 3),' 'LINESTRING(1 1,2 2,3 3),'
'POLYGON((0 0,0 10,10 10,10 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)),' 'POLYGON((0 0,0 10,10 10,10 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)),'
@ -323,43 +338,59 @@ c
SELECT ST_ISVALID(); SELECT ST_ISVALID();
ERROR 42000: Incorrect parameter count in the call to native function 'ST_ISVALID' ERROR 42000: Incorrect parameter count in the call to native function 'ST_ISVALID'
SELECT ST_ISVALID(NULL); SELECT ST_ISVALID(NULL);
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(NULL)
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT()')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT()'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('POINT()'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING()')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING()'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING()'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON(())')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON(())'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('POLYGON(())'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTIPOINT()')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTIPOINT()'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('MULTIPOINT()'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTILINESTRING(())')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTILINESTRING(())'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('MULTILINESTRING(())'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTIPOLYGON((()))')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTIPOLYGON((()))'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('MULTIPOLYGON((()))'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(a 0)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(a 0)'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('POINT(a 0)'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(! 0)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(! 0)'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('POINT(! 0)'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT('!' 0)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT('!' 0)'));
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)'))' at line 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)'))' at line 1
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(12,34 0)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(12,34 0)'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('POINT(12,34 0)'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(a 0,10 10)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(a 0,10 10)'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(a 0,10 10)'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(0 0,! 10)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(0 0,! 10)'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(0 0,! 10)'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING('!' 0,10 10)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING('!' 0,10 10)'));
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)'))' at line 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)'))' at line 1
SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(12,34 0,10 10)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(12,34 0,10 10)'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(12,34 0,10 10)'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((a 0,10 10,10 0,0 0))')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((a 0,10 10,10 0,0 0))'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((a 0,10 10,10 0,0 0))'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((0 0,! 10,10 0,0 0))')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((0 0,! 10,10 0,0 0))'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((0 0,! 10,10 0,0 0))'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON(('!' 0,10 10,10 0,0 0))')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON(('!' 0,10 10,10 0,0 0))'));
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))'))' at line 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))'))' at line 1
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((12,34 0,10 10,10 0,0 0))')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((12,34 0,10 10,10 0,0 0))'));
ERROR 22023: Invalid GIS data provided to function st_isvalid. ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((12,34 0,10 10,10 0,0 0))'))
NULL
SELECT ST_ISVALID(ST_GEOMFROMTEXT(@star_center,-1024)); SELECT ST_ISVALID(ST_GEOMFROMTEXT(@star_center,-1024));
ST_ISVALID(ST_GEOMFROMTEXT(@star_center,-1024)) ST_ISVALID(ST_GEOMFROMTEXT(@star_center,-1024))
1 1

View File

@ -219,20 +219,16 @@ SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION()'));
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0))')) c; SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0))')) c;
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION()))')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(GEOMETRYCOLLECTION()))'));
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,10 10))')) c; SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,10 10))')) c;
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,10 10)))')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),MULTIPOINT(0 0,10 10)))'));
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0),POINT(10 10))')) c; SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0),POINT(10 10))')) c;
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0),GEOMETRYCOLLECTION())')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0),GEOMETRYCOLLECTION())'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,1 1,2 2,0 0)),GEOMETRYCOLLECTION())')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,1 1,2 2,0 0)),GEOMETRYCOLLECTION())'));
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,10 10,20 20),POLYGON((0 0,10 10,100 100,0 0)))')) c; SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(LINESTRING(0 0,10 10,20 20),POLYGON((0 0,10 10,100 100,0 0)))')) c;
@ -249,25 +245,21 @@ SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(10 10),'
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0)))')) c; SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0)))')) c;
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(' SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION('
'GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0)))))')); 'GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0)))))'));
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)),' SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)),'
'MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0)),((10 10,10 15,15 15,15 10,10 10))))')) c; 'MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0)),((10 10,10 15,15 15,15 10,10 10))))')) c;
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),' SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),'
'MULTIPOINT(0 0,10 10)),' 'MULTIPOINT(0 0,10 10)),'
'GEOMETRYCOLLECTION(LINESTRING(1 1,2 2,3 3),' 'GEOMETRYCOLLECTION(LINESTRING(1 1,2 2,3 3),'
'MULTILINESTRING((0 0,0 10,10 10,10 0),(10 10,10 15,15 15,10 10))))')); 'MULTILINESTRING((0 0,0 10,10 10,10 0),(10 10,10 15,15 15,10 10))))'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),' SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),'
'MULTIPOINT(0 0,10 10)),' 'MULTIPOINT(0 0,10 10)),'
'GEOMETRYCOLLECTION(LINESTRING(1 1,2 2,3 3),' 'GEOMETRYCOLLECTION(LINESTRING(1 1,2 2,3 3),'
'MULTILINESTRING((0 0,0 10,10 10,10 0),(10 10,10 15,15 15,10 10))),' 'MULTILINESTRING((0 0,0 10,10 10,10 0),(10 10,10 15,15 15,10 10))),'
'GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)),' 'GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0,0 0),(4 4,4 6,6 6,6 4,4 4)),'
'MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0)),((10 10,10 15,15 15,15 10,10 10)))))')); 'MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0,0 0)),((10 10,10 15,15 15,15 10,10 10)))))'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),' SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),'
'MULTIPOINT(0 0,10 10)),' 'MULTIPOINT(0 0,10 10)),'
'GEOMETRYCOLLECTION(LINESTRING(1 1,2 2,3 3),' 'GEOMETRYCOLLECTION(LINESTRING(1 1,2 2,3 3),'
@ -292,61 +284,45 @@ SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(MULTILINESTRING((-7 -2,-9
--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT --error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
SELECT ST_ISVALID(); SELECT ST_ISVALID();
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(NULL); SELECT ST_ISVALID(NULL);
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT()')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT()'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING()')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING()'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON(())')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON(())'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTIPOINT()')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTIPOINT()'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTILINESTRING(())')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTILINESTRING(())'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTIPOLYGON((()))')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTIPOLYGON((()))'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(a 0)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(a 0)'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(! 0)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(! 0)'));
--error ER_PARSE_ERROR --error ER_PARSE_ERROR
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT('!' 0)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT('!' 0)'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(12,34 0)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(12,34 0)'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(a 0,10 10)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(a 0,10 10)'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(0 0,! 10)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(0 0,! 10)'));
--error ER_PARSE_ERROR --error ER_PARSE_ERROR
SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING('!' 0,10 10)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING('!' 0,10 10)'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(12,34 0,10 10)')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(12,34 0,10 10)'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((a 0,10 10,10 0,0 0))')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((a 0,10 10,10 0,0 0))'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((0 0,! 10,10 0,0 0))')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((0 0,! 10,10 0,0 0))'));
--error ER_PARSE_ERROR --error ER_PARSE_ERROR
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON(('!' 0,10 10,10 0,0 0))')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON(('!' 0,10 10,10 0,0 0))'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((12,34 0,10 10,10 0,0 0))')); SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON((12,34 0,10 10,10 0,0 0))'));
SELECT ST_ISVALID(ST_GEOMFROMTEXT(@star_center,-1024)); SELECT ST_ISVALID(ST_GEOMFROMTEXT(@star_center,-1024));

View File

@ -2093,6 +2093,7 @@ longlong Item_func_isvalid::val_int()
if ((args[0]->null_value || if ((args[0]->null_value ||
!(geometry= Geometry::construct(&buffer, wkb->ptr(), wkb->length())))) !(geometry= Geometry::construct(&buffer, wkb->ptr(), wkb->length()))))
{ {
if (!args[0]->null_value)
my_error(ER_GIS_INVALID_DATA, MYF(0), func_name()); my_error(ER_GIS_INVALID_DATA, MYF(0), func_name());
null_value= 1; null_value= 1;
return 1; return 1;
@ -2200,8 +2201,10 @@ longlong Item_func_issimple::val_int()
if ((args[0]->null_value || if ((args[0]->null_value ||
!(geometry= Geometry::construct(&buffer, swkb->ptr(), swkb->length())))) !(geometry= Geometry::construct(&buffer, swkb->ptr(), swkb->length()))))
{ {
/* We got NULL as an argument. Have to return -1 */ if (!args[0]->null_value)
DBUG_RETURN(-1); my_error(ER_GIS_INVALID_DATA, MYF(0), func_name());
null_value= 1;
DBUG_RETURN(0);
} }
if (geometry->get_class_info()->m_type_id == Geometry::wkb_point) if (geometry->get_class_info()->m_type_id == Geometry::wkb_point)
@ -2316,14 +2319,15 @@ longlong Item_func_isring::val_int()
null_value= 0; null_value= 0;
if (!swkb || if (!swkb ||
args[0]->null_value || args[0]->null_value ||
!(geom= Geometry::construct(&buffer, swkb->ptr(), swkb->length())) || !(geom= Geometry::construct(&buffer, swkb->ptr(), swkb->length())))
geom->is_closed(&isclosed))
{ {
/* IsRing(NULL) should return -1 */ if (!args[0]->null_value)
return -1; my_error(ER_GIS_INVALID_DATA, MYF(0), func_name());
null_value= 1;
return 0;
} }
if (!isclosed) if (geom->is_closed(&isclosed) || !isclosed)
return 0; return 0;
return Item_func_issimple::val_int(); return Item_func_issimple::val_int();