diff --git a/mysql-test/main/gis.result b/mysql-test/main/gis.result index fd5344b6068..75a03eed377 100644 --- a/mysql-test/main/gis.result +++ b/mysql-test/main/gis.result @@ -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 # diff --git a/mysql-test/main/spatial_utility_function_isvalid.result b/mysql-test/main/spatial_utility_function_isvalid.result index 816956aacd1..e91d337e214 100644 --- a/mysql-test/main/spatial_utility_function_isvalid.result +++ b/mysql-test/main/spatial_utility_function_isvalid.result @@ -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 diff --git a/mysql-test/main/spatial_utility_function_isvalid.test b/mysql-test/main/spatial_utility_function_isvalid.test index 12b2080db38..001660f1cd3 100644 --- a/mysql-test/main/spatial_utility_function_isvalid.test +++ b/mysql-test/main/spatial_utility_function_isvalid.test @@ -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)); diff --git a/sql/item_geofunc.cc b/sql/item_geofunc.cc index 911d7b51f8f..78027e7dea2 100644 --- a/sql/item_geofunc.cc +++ b/sql/item_geofunc.cc @@ -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();