Skip to content

Commit 1528ad0

Browse files
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]
1 parent 53f82a9 commit 1528ad0

File tree

3 files changed

+71
-36
lines changed

3 files changed

+71
-36
lines changed

mysql-test/main/spatial_utility_function_geohash.result

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ ST_GEOHASH(180,NULL,10)
816816
NULL
817817
SELECT ST_GEOHASH(180,90,NULL);
818818
ST_GEOHASH(180,90,NULL)
819-
zzzzzzzzzzzzzzzzzzzzzz
819+
NULL
820820
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(0 0)'),10);
821821
ST_GEOHASH(ST_GEOMFROMTEXT('POINT(0 0)'),10)
822822
s000000000
@@ -894,7 +894,7 @@ ST_GEOHASH(NULL,100)
894894
NULL
895895
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-0.0001 -0.0001)'),NULL);
896896
ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-0.0001 -0.0001)'),NULL)
897-
7zzzzzzzmtm7mzm00yd7z00s0y30g60000000000000000000000000000000000000000000000000000000000000000000000
897+
NULL
898898
SELECT ST_GEOHASH(ST_DIFFERENCE(ST_GEOMFROMTEXT('POINT(180 90)'),ST_GEOMFROMTEXT('POINT(0 0)')),20) c;
899899
c
900900
zzzzzzzzzzzzzzzzzzzz
@@ -957,15 +957,15 @@ ERROR HY000: Out of range error: Latitude should be [-90,90] in function ST_GeoH
957957
SELECT ST_GEOHASH(-180,-90.0000000000001,10);
958958
ERROR HY000: Out of range error: Latitude should be [-90,90] in function ST_GeoHash.
959959
SELECT ST_GEOHASH(180,90,0);
960-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
960+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
961961
SELECT ST_GEOHASH(-180,90,-1);
962-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
962+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
963963
SELECT ST_GEOHASH(180,-90,-100);
964-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
964+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
965965
SELECT ST_GEOHASH(-180,-90,101);
966-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
966+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
967967
SELECT ST_GEOHASH(0,90,1000);
968-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
968+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
969969
SELECT ST_GEOHASH("181",90,20);
970970
ERROR HY000: Out of range error: Longitude should be [-180,180] in function ST_GeoHash.
971971
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
975975
SELECT ST_GEOHASH(180,"-91",20);
976976
ERROR HY000: Out of range error: Latitude should be [-90,90] in function ST_GeoHash.
977977
SELECT ST_GEOHASH(180,90,"0");
978-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
978+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
979979
SELECT ST_GEOHASH(180,90,"-1");
980-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
980+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
981981
SELECT ST_GEOHASH(180,90,"-100");
982-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
982+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
983983
SELECT ST_GEOHASH(180,90,"101");
984-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
984+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
985985
SELECT ST_GEOHASH(180,90,"1000");
986-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
986+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
987987
SELECT ST_GEOHASH(180,90,"");
988-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
988+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
989989
SELECT ST_GEOHASH(180,90,"****");
990-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
990+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
991991
SELECT ST_GEOHASH();
992992
ERROR 42000: Incorrect parameter count in the call to native function 'ST_GEOHASH'
993993
SELECT ST_GEOHASH(1);
@@ -1039,29 +1039,29 @@ ERROR HY000: Out of range error: Latitude should be [-90,90] in function ST_GeoH
10391039
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-180 -90.0000000000001)'),10);
10401040
ERROR HY000: Out of range error: Latitude should be [-90,90] in function ST_GeoHash.
10411041
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(180 90)'),0);
1042-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
1042+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
10431043
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(180 -90)'),-1);
1044-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
1044+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
10451045
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-180 90)'),-100);
1046-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
1046+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
10471047
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-180 -90)'),101);
1048-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
1048+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
10491049
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(0 0)'),10000);
1050-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
1050+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
10511051
SELECT ST_GEOHASH(ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('POINT(180 90)'))),"0");
1052-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
1052+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
10531053
SELECT ST_GEOHASH(ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('POINT(180 -90)'))),"-1");
1054-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
1054+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
10551055
SELECT ST_GEOHASH(ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('POINT(-180 90)'))),"-100");
1056-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
1056+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
10571057
SELECT ST_GEOHASH(ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('POINT(-180 -90)'))),"101");
1058-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
1058+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
10591059
SELECT ST_GEOHASH(ST_GEOMFROMWKB(ST_ASWKB(ST_GEOMFROMTEXT('POINT(0 0)'))),"10000");
1060-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
1060+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
10611061
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(0 0)')," ");
1062-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
1062+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
10631063
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(0 0)'),"***");
1064-
ERROR HY000: Out of range error: max geohash length value in function ST_GeoHash.
1064+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
10651065
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(0 0)'));
10661066
ERROR 42000: Incorrect parameter count in the call to native function 'ST_GEOHASH'
10671067
SELECT ST_GEOHASH(ST_GEOMFROMTEXT(),20);
@@ -1085,9 +1085,9 @@ ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
10851085
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(0 0))'),10);
10861086
ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
10871087
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(180 90)'),20.0001);
1088-
ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
1088+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
10891089
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(180 90)'),(CAST(10 AS DATE)));
1090-
ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
1090+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
10911091
SELECT ST_GEOHASH(ST_INTERSECTION(ST_GEOMFROMTEXT('POINT(180 90)'),ST_GEOMFROMTEXT('POINT(1 1)')),20);
10921092
ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
10931093
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)
15161516
s1z
15171517
SELECT ST_GeoHash(POINT(10, 10), @null);
15181518
ST_GeoHash(POINT(10, 10), @null)
1519-
s1z0gs3y0zh7w1z0gs3y0zw
1519+
NULL
15201520
SET @point = POINT(10, 10);
15211521
PREPARE stmt FROM "SELECT ST_GeoHash(?, 10)";
15221522
EXECUTE stmt USING @point;
@@ -1565,7 +1565,7 @@ SELECT ST_GeoHash(@double, @double, 10);
15651565
ST_GeoHash(@double, @double, 10)
15661566
s60tmsgy0s
15671567
SELECT ST_GeoHash(POINT(10, 10), @double);
1568-
ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
1568+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
15691569
SELECT ST_POINTFROMGEOHASH("00", @double);
15701570
ERROR 22023: Invalid GIS data provided to function ST_PointFromGeoHash.
15711571
DROP TABLE IF EXISTS t1;
@@ -1661,3 +1661,19 @@ SELECT ST_LatFromGeoHash("ї");
16611661
ERROR HY000: Incorrect geohash value: '\0457' for function st_latfromgeohash
16621662
SELECT ST_LongFromGeoHash("ї");
16631663
ERROR HY000: Incorrect geohash value: '\0457' for function st_longfromgeohash
1664+
#
1665+
# MDEV-34158 st_geohash error reporting and null handling
1666+
#
1667+
SELECT ST_GeoHash(( POINTFROMTEXT(' POINT( 4 1 ) ') ), 1e0);
1668+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
1669+
SELECT ST_GeoHash(( POINTFROMTEXT(' POINT( 4 1 ) ') ), 0);
1670+
ERROR HY000: Out of range error: max_length parameter should be an integer in the range [1, 100] in function ST_GeoHash.
1671+
SELECT ST_GeoHash(45,-20,null);
1672+
ST_GeoHash(45,-20,null)
1673+
NULL
1674+
SELECT ST_GeoHash(0,-20,null);
1675+
ST_GeoHash(0,-20,null)
1676+
NULL
1677+
SELECT ST_GeoHash(( POINTFROMTEXT(' POINT( 4 1 ) ') ), NULL);
1678+
ST_GeoHash(( POINTFROMTEXT(' POINT( 4 1 ) ') ), NULL)
1679+
NULL

mysql-test/main/spatial_utility_function_geohash.test

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,10 +1006,10 @@ SELECT ST_GEOHASH(ST_GEOMFROMTEXT('MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0),(4 4,
10061006
--error ER_GIS_INVALID_DATA
10071007
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('GEOMETRYCOLLECTION(POINT(0 0))'),10);
10081008

1009-
--error ER_GIS_INVALID_DATA
1009+
--error ER_STD_OUT_OF_RANGE_ERROR
10101010
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(180 90)'),20.0001);
10111011

1012-
--error ER_GIS_INVALID_DATA
1012+
--error ER_STD_OUT_OF_RANGE_ERROR
10131013
SELECT ST_GEOHASH(ST_GEOMFROMTEXT('POINT(180 90)'),(CAST(10 AS DATE)));
10141014

10151015
--error ER_GIS_INVALID_DATA
@@ -1365,7 +1365,7 @@ DEALLOCATE PREPARE stmt;
13651365
SELECT ST_GeoHash(10, 10, @maxlen);
13661366
SELECT ST_GeoHash(@double, @double, 10);
13671367

1368-
--error ER_GIS_INVALID_DATA
1368+
--error ER_STD_OUT_OF_RANGE_ERROR
13691369
SELECT ST_GeoHash(POINT(10, 10), @double);
13701370
--error ER_GIS_INVALID_DATA
13711371
SELECT ST_POINTFROMGEOHASH("00", @double);
@@ -1461,3 +1461,14 @@ DROP TABLE t1;
14611461
SELECT ST_LatFromGeoHash("ї");
14621462
--error ER_WRONG_VALUE_FOR_TYPE
14631463
SELECT ST_LongFromGeoHash("ї");
1464+
1465+
--echo #
1466+
--echo # MDEV-34158 st_geohash error reporting and null handling
1467+
--echo #
1468+
--error ER_STD_OUT_OF_RANGE_ERROR
1469+
SELECT ST_GeoHash(( POINTFROMTEXT(' POINT( 4 1 ) ') ), 1e0);
1470+
--error ER_STD_OUT_OF_RANGE_ERROR
1471+
SELECT ST_GeoHash(( POINTFROMTEXT(' POINT( 4 1 ) ') ), 0);
1472+
SELECT ST_GeoHash(45,-20,null);
1473+
SELECT ST_GeoHash(0,-20,null);
1474+
SELECT ST_GeoHash(( POINTFROMTEXT(' POINT( 4 1 ) ') ), NULL);

sql/item_geofunc.cc

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2837,6 +2837,8 @@ String *Item_func_geohash::val_str_ascii(String *str)
28372837
longitude= args[0]->val_real();
28382838
latitude= args[1]->val_real();
28392839

2840+
// We need to check again because the val_real calls may set the null
2841+
// bit, depending on their implementation.
28402842
if (args[0]->null_value || args[1]->null_value)
28412843
return 0;
28422844

@@ -2845,7 +2847,9 @@ String *Item_func_geohash::val_str_ascii(String *str)
28452847

28462848
if (is_invalid_length_field(length_field->field_type()))
28472849
{
2848-
my_error(ER_GIS_INVALID_DATA, MYF(0), "ST_GeoHash");
2850+
my_error(ER_STD_OUT_OF_RANGE_ERROR, MYF(0),
2851+
"max_length parameter should be an integer in the range [1, 100]",
2852+
"ST_GeoHash");
28492853
return 0;
28502854
}
28512855

@@ -2865,12 +2869,16 @@ String *Item_func_geohash::val_str_ascii(String *str)
28652869

28662870
geohash_length= static_cast<uint>(length_field->val_int());
28672871
if (length_field->null_value)
2868-
geohash_length= MAX_GEOHASH_LENGTH;
2872+
{
2873+
null_value= 1;
2874+
return 0;
2875+
}
28692876

28702877
if (geohash_length <= MIN_GEOHASH_LENGTH ||
28712878
geohash_length > MAX_GEOHASH_LENGTH)
28722879
{
2873-
my_error(ER_STD_OUT_OF_RANGE_ERROR, MYF(0), "max geohash length value",
2880+
my_error(ER_STD_OUT_OF_RANGE_ERROR, MYF(0),
2881+
"max_length parameter should be an integer in the range [1, 100]",
28742882
"ST_GeoHash");
28752883
return 0;
28762884
}

0 commit comments

Comments
 (0)