Browse Source

MDEV-34158 st_geohash error reporting and null handling

st_geohash returns NULL when the passed length is NULL.

st_geohash has clearer error reporting for lengths outside the range [1, 100]
pull/4005/head
Dave Gosselin 7 months ago
committed by Dave Gosselin
parent
commit
1528ad075a
  1. 76
      mysql-test/main/spatial_utility_function_geohash.result
  2. 17
      mysql-test/main/spatial_utility_function_geohash.test
  3. 14
      sql/item_geofunc.cc

76
mysql-test/main/spatial_utility_function_geohash.result

@ -816,7 +816,7 @@ ST_GEOHASH(180,NULL,10)
NULL
SELECT ST_GEOHASH(180,90,NULL);
ST_GEOHASH(180,90,NULL)
zzzzzzzzzzzzzzzzzzzzzz
NULL
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(0 0)'),10);
ST_GEOHASH(ST_GEOMFROMTEXT('POINT(0 0)'),10)
s000000000
@ -894,7 +894,7 @@ ST_GEOHASH(NULL,100)
NULL
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-0.0001 -0.0001)'),NULL);
ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-0.0001 -0.0001)'),NULL)
7zzzzzzzmtm7mzm00yd7z00s0y30g60000000000000000000000000000000000000000000000000000000000000000000000
NULL
SELECT ST_GEOHASH(ST_DIFFERENCE(ST_GEOMFROMTEXT('POINT(180 90)'),ST_GEOMFROMTEXT('POINT(0 0)')),20) c;
c
zzzzzzzzzzzzzzzzzzzz
@ -957,15 +957,15 @@ ERROR HY000: Out of range error: Latitude should be [-90,90] in function ST_GeoH
SELECT ST_GEOHASH(-180,-90.0000000000001,10);
ERROR HY000: Out of range error: Latitude should be [-90,90] in function ST_GeoHash.
SELECT ST_GEOHASH(180,90,0);
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(-180,90,-1);
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(180,-90,-100);
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(-180,-90,101);
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(0,90,1000);
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH("181",90,20);
ERROR HY000: Out of range error: Longitude should be [-180,180] in function ST_GeoHash.
SELECT ST_GEOHASH("-181",90,20);
@ -975,19 +975,19 @@ ERROR HY000: Out of range error: Latitude should be [-90,90] in function ST_GeoH
SELECT ST_GEOHASH(180,"-91",20);
ERROR HY000: Out of range error: Latitude should be [-90,90] in function ST_GeoHash.
SELECT ST_GEOHASH(180,90,"0");
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(180,90,"-1");
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(180,90,"-100");
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(180,90,"101");
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(180,90,"1000");
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(180,90,"");
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(180,90,"****");
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH();
ERROR 42000: Incorrect parameter count in the call to native function 'ST_GEOHASH'
SELECT ST_GEOHASH(1);
@ -1039,29 +1039,29 @@ ERROR HY000: Out of range error: Latitude should be [-90,90] in function ST_GeoH
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-180 -90.0000000000001)'),10);
ERROR HY000: Out of range error: Latitude should be [-90,90] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(180 90)'),0);
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(180 -90)'),-1);
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-180 90)'),-100);
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-180 -90)'),101);
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(0 0)'),10000);
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('POINT(180 90)'))),"0");
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('POINT(180 -90)'))),"-1");
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('POINT(-180 90)'))),"-100");
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('POINT(-180 -90)'))),"101");
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('POINT(0 0)'))),"10000");
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(0 0)')," ");
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(0 0)'),"***");
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(0 0)'));
ERROR 42000: Incorrect parameter count in the call to native function 'ST_GEOHASH'
SELECT ST_GEOHASH(ST_GEOMFROMTEXT(),20);
@ -1085,9 +1085,9 @@ ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(0 0))'),10);
ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(180 90)'),20.0001);
ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(180 90)'),(CAST(10 AS DATE)));
ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GEOHASH(ST_INTERSECTION(ST_GEOMFROMTEXT('POINT(180 90)'),ST_GEOMFROMTEXT('POINT(1 1)')),20);
ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
SELECT ST_GEOHASH(ST_UNION(ST_GEOMFROMTEXT('POINT(180 90)'),ST_GEOMFROMTEXT('POINT(-180 -90)')),20);
@ -1516,7 +1516,7 @@ ST_GeoHash(POINT(10, 10), @maxlen)
s1z
SELECT ST_GeoHash(POINT(10, 10), @null);
ST_GeoHash(POINT(10, 10), @null)
s1z0gs3y0zh7w1z0gs3y0zw
NULL
SET @point = POINT(10, 10);
PREPARE stmt FROM "SELECT ST_GeoHash(?, 10)";
EXECUTE stmt USING @point;
@ -1565,7 +1565,7 @@ SELECT ST_GeoHash(@double, @double, 10);
ST_GeoHash(@double, @double, 10)
s60tmsgy0s
SELECT ST_GeoHash(POINT(10, 10), @double);
ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_POINTFROMGEOHASH("00", @double);
ERROR 22023: Invalid GIS data provided to function ST_PointFromGeoHash.
DROP TABLE IF EXISTS t1;
@ -1661,3 +1661,19 @@ SELECT ST_LatFromGeoHash("ї");
ERROR HY000: Incorrect geohash value: '\0457' for function st_latfromgeohash
SELECT ST_LongFromGeoHash("ї");
ERROR HY000: Incorrect geohash value: '\0457' for function st_longfromgeohash
#
# MDEV-34158 st_geohash error reporting and null handling
#
SELECT ST_GeoHash(( POINTFROMTEXT(' POINT( 4 1 ) ') ), 1e0);
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GeoHash(( POINTFROMTEXT(' POINT( 4 1 ) ') ), 0);
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
SELECT ST_GeoHash(45,-20,null);
ST_GeoHash(45,-20,null)
NULL
SELECT ST_GeoHash(0,-20,null);
ST_GeoHash(0,-20,null)
NULL
SELECT ST_GeoHash(( POINTFROMTEXT(' POINT( 4 1 ) ') ), NULL);
ST_GeoHash(( POINTFROMTEXT(' POINT( 4 1 ) ') ), NULL)
NULL

17
mysql-test/main/spatial_utility_function_geohash.test

@ -1006,10 +1006,10 @@ SELECT ST_GEOHASH(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(4 4,
--error ER_GIS_INVALID_DATA
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(0 0))'),10);
--error ER_GIS_INVALID_DATA
--error ER_STD_OUT_OF_RANGE_ERROR
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(180 90)'),20.0001);
--error ER_GIS_INVALID_DATA
--error ER_STD_OUT_OF_RANGE_ERROR
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(180 90)'),(CAST(10 AS DATE)));
--error ER_GIS_INVALID_DATA
@ -1365,7 +1365,7 @@ DEALLOCATE PREPARE stmt;
SELECT ST_GeoHash(10, 10, @maxlen);
SELECT ST_GeoHash(@double, @double, 10);
--error ER_GIS_INVALID_DATA
--error ER_STD_OUT_OF_RANGE_ERROR
SELECT ST_GeoHash(POINT(10, 10), @double);
--error ER_GIS_INVALID_DATA
SELECT ST_POINTFROMGEOHASH("00", @double);
@ -1461,3 +1461,14 @@ DROP TABLE t1;
SELECT ST_LatFromGeoHash("ї");
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_LongFromGeoHash("ї");
--echo #
--echo # MDEV-34158 st_geohash error reporting and null handling
--echo #
--error ER_STD_OUT_OF_RANGE_ERROR
SELECT ST_GeoHash(( POINTFROMTEXT(' POINT( 4 1 ) ') ), 1e0);
--error ER_STD_OUT_OF_RANGE_ERROR
SELECT ST_GeoHash(( POINTFROMTEXT(' POINT( 4 1 ) ') ), 0);
SELECT ST_GeoHash(45,-20,null);
SELECT ST_GeoHash(0,-20,null);
SELECT ST_GeoHash(( POINTFROMTEXT(' POINT( 4 1 ) ') ), NULL);

14
sql/item_geofunc.cc

@ -2837,6 +2837,8 @@ String *Item_func_geohash::val_str_ascii(String *str)
longitude= args[0]->val_real();
latitude= args[1]->val_real();
// We need to check again because the val_real calls may set the null
// bit, depending on their implementation.
if (args[0]->null_value || args[1]->null_value)
return 0;
@ -2845,7 +2847,9 @@ String *Item_func_geohash::val_str_ascii(String *str)
if (is_invalid_length_field(length_field->field_type()))
{
my_error(ER_GIS_INVALID_DATA, MYF(0), "ST_GeoHash");
my_error(ER_STD_OUT_OF_RANGE_ERROR, MYF(0),
"max_length parameter should be an integer in the range [1, 100]",
"ST_GeoHash");
return 0;
}
@ -2865,12 +2869,16 @@ String *Item_func_geohash::val_str_ascii(String *str)
geohash_length= static_cast<uint>(length_field->val_int());
if (length_field->null_value)
geohash_length= MAX_GEOHASH_LENGTH;
{
null_value= 1;
return 0;
}
if (geohash_length <= MIN_GEOHASH_LENGTH ||
geohash_length > MAX_GEOHASH_LENGTH)
{
my_error(ER_STD_OUT_OF_RANGE_ERROR, MYF(0), "max geohash length value",
my_error(ER_STD_OUT_OF_RANGE_ERROR, MYF(0),
"max_length parameter should be an integer in the range [1, 100]",
"ST_GeoHash");
return 0;
}

Loading…
Cancel
Save