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);
ST_IsRing(NULL)
-1
NULL
#
# 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));
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_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_DIMENSION(POINT(1,1)) 3 10 1 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_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))
1 -1 -1 0 NULL NULL NULL 0
1 0 -1 0 NULL NULL NULL 0
#
# 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
0
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;
c
1
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;
c
0
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())'));
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;
c
0
@ -281,7 +285,9 @@ c
1
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION('
'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)),'
'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
@ -290,20 +296,29 @@ SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(1
'MULTIPOINT(0 0,10 10)),'
'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))))'));
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),'
'MULTIPOINT(0 0,10 10)),'
'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))),'
'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)))))'));
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),'
'MULTIPOINT(0 0,10 10)),'
'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))),'
'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),'
'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)),'
@ -323,43 +338,59 @@ c
SELECT ST_ISVALID();
ERROR 42000: Incorrect parameter count in the call to native function 'ST_ISVALID'
SELECT ST_ISVALID(NULL);
ERROR 22023: Invalid GIS data provided to function st_isvalid.
ST_ISVALID(NULL)
NULL
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()'));
ERROR 22023: Invalid GIS data provided to function st_isvalid.
ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING()'))
NULL
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()'));
ERROR 22023: Invalid GIS data provided to function st_isvalid.
ST_ISVALID(ST_GEOMFROMTEXT('MULTIPOINT()'))
NULL
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((()))'));
ERROR 22023: Invalid GIS data provided to function st_isvalid.
ST_ISVALID(ST_GEOMFROMTEXT('MULTIPOLYGON((()))'))
NULL
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)'));
ERROR 22023: Invalid GIS data provided to function st_isvalid.
ST_ISVALID(ST_GEOMFROMTEXT('POINT(! 0)'))
NULL
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
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)'));
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)'));
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)'));
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)'));
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))'));
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))'));
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))'));
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))'));
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));
ST_ISVALID(ST_GEOMFROMTEXT(@star_center,-1024))
1

View File

@ -219,20 +219,16 @@ SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION()'));
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(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(LINESTRING(0 0),POINT(10 10))')) c;
--error ER_GIS_INVALID_DATA
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(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;
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION('
'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)),'
'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),'
'MULTIPOINT(0 0,10 10)),'
'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))))'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),'
'MULTIPOINT(0 0,10 10)),'
'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))),'
'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)))))'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(10 10),'
'MULTIPOINT(0 0,10 10)),'
'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
SELECT ST_ISVALID();
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(NULL);
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT()'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING()'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POLYGON(())'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTIPOINT()'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTILINESTRING(())'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('MULTIPOLYGON((()))'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(a 0)'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(! 0)'));
--error ER_PARSE_ERROR
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT('!' 0)'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('POINT(12,34 0)'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(a 0,10 10)'));
--error ER_GIS_INVALID_DATA
SELECT ST_ISVALID(ST_GEOMFROMTEXT('LINESTRING(0 0,! 10)'));
--error ER_PARSE_ERROR
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)'));
--error ER_GIS_INVALID_DATA
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))'));
--error ER_PARSE_ERROR
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(@star_center,-1024));

View File

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