Commit 70e646bd authored by StefanoPetrilli's avatar StefanoPetrilli Committed by Sergei Golubchik

MDEV-34177: Implements ST_PointFromGeoHash

The GIS function ST_PointFromGeoHash takes in input a geohash and
returns a point where the x is the longitude and the y is the latitude.
The latitude is returned as a numeric value in the interval [180, -180].
The longitude is returned as a numeric value in the interval [90, -90].
If the argument is NULL, the return value is NULL. If the argument is
invalid, an ER_GIS_INVALID_DATA is thrown.

Author: StefanoPetrilli <stefanop_1999@hotmail.it>
Co-authored-by: default avatarkevincheng2 <chengyf112@gmail.com>
Co-authored-by: default avatarCatalin Besleaga <catalin.besleaga@oracle.com>
Co-authored-by: default avatarGleb Shchepa <gleb.shchepa@oracle.com>
Co-authored-by: default avatarTatiana Azundris Nuernberg <tatjana.nuernberg@oracle.com>
Co-authored-by: default avatarMartin Hansson <martin.hansson@oracle.com>
Co-authored-by: default avatarDeepa Dixit <deepa.dixit@oracle.com>
Co-authored-by: default avatarHans H Melby <hans.h.melby@oracle.com>
Co-authored-by: default avatarJens Even Berg Blomsøy <jens.even.blomsoy@oracle.com>
Co-authored-by: default avatarErlend Dahl <erlend.dahl@oracle.com>
Co-authored-by: default avatarNorvald H. Ryeng <norvald.ryeng@oracle.com>
Co-authored-by: default avatarBennyWang <benny.wang@oracle.com>
Co-authored-by: default avatarDavid.Zhao <david.zhao@oracle.com>
Co-authored-by: default avatarErik Froseth <erik.froseth@oracle.com>
parent 7c6c55e9
......@@ -482,6 +482,283 @@ NULL
83.7602082514146
31.8700305354552
19.7074618731612
# valid characters
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("0", 0))
POINT(-158 -68)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("z", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("z", 0))
POINT(158 68)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0z", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("0z", 0))
POINT(-141 -48)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("xbpb", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("xbpb", 0))
POINT(180 0)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("8000", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("8000", 0))
POINT(-180 0)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("s000", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("s000", 0))
POINT(0 0)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789", 0))
POINT(-179.55743 -82.774507)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("9876543210", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("9876543210", 0))
POINT(-107.79609 1.770175)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("bcdefghjkmnpqrstuvwxyz", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("bcdefghjkmnpqrstuvwxyz", 0))
POINT(-142.6078415216915 54.11408847964353)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb", 0))
POINT(179.55743439816956 82.77450549262497)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz", 0))
POINT(180 90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("bpbpbpbpbpbpbpbpbpbp", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("bpbpbpbpbpbpbpbpbpbp", 0))
POINT(-180 90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("pbpbpbpbpbpbpbpbpbpb", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("pbpbpbpbpbpbpbpbpbpb", 0))
POINT(180 -90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("00000000000000000000", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("00000000000000000000", 0))
POINT(-180 -90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("gzzzzzzzzzzzzzzzzzzz", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("gzzzzzzzzzzzzzzzzzzz", 0))
POINT(0 90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("5bpbpbpbpbpbpbpbpbpb", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("5bpbpbpbpbpbpbpbpbpb", 0))
POINT(0 -90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("7zzzzzzzzzzzzzzzzzzz", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("7zzzzzzzzzzzzzzzzzzz", 0))
POINT(0 0)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("rzzzzzzzzzzzzzzzzzzz", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("rzzzzzzzzzzzzzzzzzzz", 0))
POINT(180 0)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("2pbpbpbpbpbpbpbpbpbp", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("2pbpbpbpbpbpbpbpbpbp", 0))
POINT(-180 0)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0000000000zzzzzzzzzz", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("0000000000zzzzzzzzzz", 0))
POINT(-179.999989271164 -89.999994635582)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zzzzzzzzzz0000000000", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("zzzzzzzzzz0000000000", 0))
POINT(179.999989271164 89.999994635582)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("s000000001z7wsg7zzm6", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("s000000001z7wsg7zzm6", 0))
POINT(0.00001 0.00001)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("ebpbpbpbpcbe9kuebp6d", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("ebpbpbpbpcbe9kuebp6d", 0))
POINT(-0.00001 0.00001)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("kpbpbpbpbnpkqe5kpbtm", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("kpbpbpbpbnpkqe5kpbtm", 0))
POINT(0.00001 -0.00001)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("7zzzzzzzzy0s37hs00dt", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("7zzzzzzzzy0s37hs00dt", 0))
POINT(-0.00001 -0.00001)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("tzzzzzzzzzzzzzzzzzzz", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("tzzzzzzzzzzzzzzzzzzz", 0))
POINT(90 45)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("9zzzzzzzzzzzzzzzzzzz", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("9zzzzzzzzzzzzzzzzzzz", 0))
POINT(-90 45)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("jzzzzzzzzzzzzzzzzzzz", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("jzzzzzzzzzzzzzzzzzzz", 0))
POINT(90 -45)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("1zzzzzzzzzzzzzzzzzzz", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("1zzzzzzzzzzzzzzzzzzz", 0))
POINT(-90 -45)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zbzurypzpgxczbzurypz", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("zbzurypzpgxczbzurypz", 0))
POINT(180 50)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("5zpgxczbzurypzpgxczb", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("5zpgxczbzurypzpgxczb", 0))
POINT(0 -50)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z", 0))
POINT(-145.16129032258067 -49.35483870967742)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789bcdefghjkmnpqrstuvwxyz", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789bcdefghjkmnpqrstuvwxyz", 0))
POINT(-179.55743439816956 -82.77450549262497)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789BCDEFGHJKMNPQRSTUVWXYZ", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789BCDEFGHJKMNPQRSTUVWXYZ", 0))
POINT(-179.55743439816956 -82.77450549262497)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb9876543210", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb9876543210", 0))
POINT(179.55743439816956 82.77450549262497)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("ZYXWVUTSRQPNMKJHGFEDCB9876543210", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("ZYXWVUTSRQPNMKJHGFEDCB9876543210", 0))
POINT(179.55743439816956 82.77450549262497)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("1e1", " "));
ST_ASTEXT(ST_POINTFROMGEOHASH("1e1", " "))
POINT(-110 -72)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("100", " 0"));
ST_ASTEXT(ST_POINTFROMGEOHASH("100", " 0"))
POINT(-134 -89)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(CAST(100 AS CHAR), 0));
ST_ASTEXT(ST_POINTFROMGEOHASH(CAST(100 AS CHAR), 0))
POINT(-134 -89)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("10111000110001111001", "0"));
ST_ASTEXT(ST_POINTFROMGEOHASH("10111000110001111001", "0"))
POINT(-133.549761770805 -89.8242133801793)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("11111111111111111111", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("11111111111111111111", 0))
POINT(-133.548387096774 -84.1935483870967)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("99999999999999999999", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("99999999999999999999", 0))
POINT(-110.3225806451612 8.7096774193548)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("00000000000000000000", " ***** "));
ST_ASTEXT(ST_POINTFROMGEOHASH("00000000000000000000", " ***** "))
POINT(-180 -90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("00000000000000000000", " 0 "));
ST_ASTEXT(ST_POINTFROMGEOHASH("00000000000000000000", " 0 "))
POINT(-180 -90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz", (CAST(0 AS CHAR))));
ST_ASTEXT(ST_POINTFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz", (CAST(0 AS CHAR))))
POINT(180 90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(NULL, 0));
ST_ASTEXT(ST_POINTFROMGEOHASH(NULL, 0))
NULL
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(null, 0));
ST_ASTEXT(ST_POINTFROMGEOHASH(null, 0))
NULL
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("tzzzzzzzzzzzzzzzzzzz", NULL));
ST_ASTEXT(ST_POINTFROMGEOHASH("tzzzzzzzzzzzzzzzzzzz", NULL))
NULL
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("9zzzzzzzzzzzzzzzzzzz", null));
ST_ASTEXT(ST_POINTFROMGEOHASH("9zzzzzzzzzzzzzzzzzzz", null))
NULL
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(CAST("012" AS BINARY), 0));
ST_ASTEXT(ST_POINTFROMGEOHASH(CAST("012" AS BINARY), 0))
POINT(-179 -82)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz", (CAST(0 AS BINARY))));
ST_ASTEXT(ST_POINTFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz", (CAST(0 AS BINARY))))
POINT(180 90)
# invalid characters and inputs
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123a45", 0));
ERROR HY000: Incorrect geohash value: '0123a45' for function st_pointfromgeohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("xyzi", 0));
ERROR HY000: Incorrect geohash value: 'xyzi' for function st_pointfromgeohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zyxLwv", 0));
ERROR HY000: Incorrect geohash value: 'zyxLwv' for function st_pointfromgeohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("bcdjo", 0));
ERROR HY000: Incorrect geohash value: 'bcdjo' for function st_pointfromgeohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zyx**wv", 0));
ERROR HY000: Incorrect geohash value: 'zyx**wv' for function st_pointfromgeohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("1 2 3 4", 0));
ERROR HY000: Incorrect geohash value: '1 2 3 4' for function st_pointfromgeohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("1''2345", 0));
ERROR HY000: Incorrect geohash value: '1''2345' for function st_pointfromgeohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("12.345", 0));
ERROR HY000: Incorrect geohash value: '12.345' for function st_pointfromgeohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(" ", 0));
ERROR HY000: Incorrect geohash value: ' ' for function st_pointfromgeohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("NULL", 0));
ERROR HY000: Incorrect geohash value: 'NULL' for function st_pointfromgeohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0a 0d", 0));
ERROR HY000: Incorrect geohash value: '0a 0d' for function st_pointfromgeohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("-100", 0));
ERROR HY000: Incorrect geohash value: '-100' for function st_pointfromgeohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("", 2000));
ERROR HY000: Incorrect geohash value: '' for function st_pointfromgeohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(9876543210, 0));
ERROR 22023: Invalid GIS data provided to function ST_PointFromGeoHash.
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(0123456789, 0));
ERROR 22023: Invalid GIS data provided to function ST_PointFromGeoHash.
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(1e1, 0));
ERROR 22023: Invalid GIS data provided to function ST_PointFromGeoHash.
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("123",));
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 '))' at line 1
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(,"456"));
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 '"456"))' at line 1
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(,));
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 '))' at line 1
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123456"789));
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 '789))' at line 1
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("7zzzzzzzzzzzzzzzzzzz", ****));
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 '****))' at line 1
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz"));
ERROR 42000: Incorrect parameter count in the call to native function 'ST_POINTFROMGEOHASH'
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH());
ERROR 42000: Incorrect parameter count in the call to native function 'ST_POINTFROMGEOHASH'
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(abcdef));
ERROR 42000: Incorrect parameter count in the call to native function 'ST_POINTFROMGEOHASH'
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH((1, 1), 1));
ERROR 21000: Operand should contain 1 column(s)
# very long geohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789bcdefghjkmnpqrstuvwxyz0123456789bc"
"defghjkmnpqrstuvwxyz0123456789bcdefghjkmnpqr"
"stuvwxyz0123456789bcdefghjkmnpqrstuvwxyz", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789bcdefghjkmnpqrstuvwxyz0123456789bc"
"defghjkmnpqrstuvwxyz0123456789bcdefghjkmnpqr"
"stuvwxyz0123456789bcdefghjkmnpqrstuvwxyz", 0))
POINT(-179.55743439816956 -82.77450549262497)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789BCDEFGHJKMNPQRSTUVWXYZ0123456789BC"
"DEFGHJKMNPQRSTUVWXYZ0123456789BCDEFGHJKMNPQR"
"STUVWXYZ0123456789BCDEFGHJKMNPQRSTUVWXYZ", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789BCDEFGHJKMNPQRSTUVWXYZ0123456789BC"
"DEFGHJKMNPQRSTUVWXYZ0123456789BCDEFGHJKMNPQR"
"STUVWXYZ0123456789BCDEFGHJKMNPQRSTUVWXYZ", 0))
POINT(-179.55743439816956 -82.77450549262497)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb9876543210zyxwvutsrqpn"
"mkjhgfedcb9876543210zyxwvutsrqpnmkjhgfedcb98"
"76543210zyxwvutsrqpnmkjhgfedcb9876543210", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb9876543210zyxwvutsrqpn"
"mkjhgfedcb9876543210zyxwvutsrqpnmkjhgfedcb98"
"76543210zyxwvutsrqpnmkjhgfedcb9876543210", 0))
POINT(179.55743439816956 82.77450549262497)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("ZYXWVUTSRQPNMKJHGFEDCB9876543210ZYXWVUTSRQPN"
"MKJHGFEDCB9876543210ZYXWVUTSRQPNMKJHGFEDCB98"
"76543210ZYXWVUTSRQPNMKJHGFEDCB9876543210", 0));
ST_ASTEXT(ST_POINTFROMGEOHASH("ZYXWVUTSRQPNMKJHGFEDCB9876543210ZYXWVUTSRQPN"
"MKJHGFEDCB9876543210ZYXWVUTSRQPNMKJHGFEDCB98"
"76543210ZYXWVUTSRQPNMKJHGFEDCB9876543210", 0))
POINT(179.55743439816956 82.77450549262497)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789bcdefghjkmnpqrstuvwxyz0123456789bc"
"defghjkmnpqrstuvwxyz0123456789bcdefghjkmnpqr"
"stuvwxyz0123456789bcdefghjkmnpqrstuvwxyz0123"
"456789bcdefghjkmnpqrstuvwxyz0123456789bcdefg"
"hjkmnpqrstuvwxyz0123456789bcdefghjkmnpqrstuv"
"wxyz01234567890123456789bcdefghjkmnpqrstuvwx"
"yz0123456789bcdefghjkmnpqrstuvwxyz0123456789"
"bcdefghjkmnpqrstuvwxyz0123456789bcdefghjkmnp"
"qrstuvwxyz0123456789bcdefghjkmnpqrstuvwxyz01"
"23456789bcdefghjkmnpqrstuvwxyz0123456789bcde"
"fghjkmnpqrstuvwxyz", 4326));
ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789bcdefghjkmnpqrstuvwxyz0123456789bc"
"defghjkmnpqrstuvwxyz0123456789bcdefghjkmnpqr"
"stuvwxyz0123456789bcdefghjkmnpqrstuvwxyz0123"
POINT(-179.55743439816956 -82.77450549262497)
# different random geohash values
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(hash_value,0)) FROM geohashes;
ST_ASTEXT(ST_POINTFROMGEOHASH(hash_value,0))
POINT(-180 -90)
POINT(180 90)
NULL
POINT(1 1)
POINT(-0.1 -0.1)
POINT(1 0.4)
POINT(-158 -68)
POINT(158 68)
POINT(-105.343666081393 -27.3374899367448)
POINT(75.4258807526218 37.4347752334972)
POINT(113.2506169687463 82.269670295412)
POINT(4.4253282778628 -74.168840669129)
POINT(-113.9241805635394 23.9696161514665)
POINT(-132.9724051824284 -45.5852718924236)
POINT(102.7417962437673 29.763254995923)
POINT(60.7886982739903 83.7602082514146)
POINT(128.908488386749 31.8700305354552)
POINT(-37.292723368146 19.7074618731612)
# Test create table from SELECT statement
CREATE TABLE t1 AS SELECT ST_POINTFROMGEOHASH("0123", 4326);
EXPLAIN t1;
Field Type Null Key Default Extra
ST_POINTFROMGEOHASH("0123", 4326) geometry YES NULL
DROP TABLE t1;
# valid inputs
SELECT ST_GEOHASH(0,0,1);
ST_GEOHASH(0,0,1)
......@@ -973,8 +1250,128 @@ SELECT ST_LATFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(20 -20)'),10));
ST_LATFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(20 -20)'),10))
-20
#=============================================================
# ST_POINTFROMGEOHASH()
#=============================================================
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(180,90,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(180,90,20),0))
POINT(180 90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(180,-90,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(180,-90,20),0))
POINT(180 -90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-180,90,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-180,90,20),0))
POINT(-180 90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-180,-90,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-180,-90,20),0))
POINT(-180 -90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(180,0,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(180,0,20),0))
POINT(180 0)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-180,0,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-180,0,20),0))
POINT(-180 0)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,90,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,90,20),0))
POINT(0 90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,-90,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,-90,20),0))
POINT(0 -90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,0,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,0,20),0))
POINT(0 0)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-0,0,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-0,0,20),0))
POINT(0 0)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,-0,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,-0,20),0))
POINT(0 0)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0.10,90,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0.10,90,20),0))
POINT(0.1 90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(100,45,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(100,45,20),0))
POINT(100 45)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(179.999999,90,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(179.999999,90,20),0))
POINT(179.999999 90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-179.999999,0,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-179.999999,0,20),0))
POINT(-179.999999 0)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(180,89.999999,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(180,89.999999,20),0))
POINT(180 89.999999)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,-89.999999,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,-89.999999,20),0))
POINT(0 -89.999999)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(18*10,900/10,20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(18*10,900/10,20),0))
POINT(180 90)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(100 50)'),10),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(100 50)'),10),0))
POINT(100 50)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(10 10)'),10),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(10 10)'),10),0))
POINT(10 10)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-10 10)'),10),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-10 10)'),10),0))
POINT(-10 10)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(1.000 1.00010)'),10),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(1.000 1.00010)'),10),0))
POINT(1 1.0001)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-1.000 -1.1010)'),10),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-1.000 -1.1010)'),10),0))
POINT(-1 -1.101)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(1.00101 1.000)'),10),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(1.00101 1.000)'),10),0))
POINT(1.00101 1)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-1.00101 -1.0000)'),20),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-1.00101 -1.0000)'),20),0))
POINT(-1.00101 -1)
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(20 20)'),10),0));
ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(20 20)'),10),0))
POINT(20 20)
#=============================================================
# ST_GEOHASH()
#=============================================================
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("upbp",0),4);
ST_GEOHASH(ST_POINTFROMGEOHASH("upbp",0),4)
upbp
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("h000",0),8);
ST_GEOHASH(ST_POINTFROMGEOHASH("h000",0),8)
h0000000
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("s000",0),10);
ST_GEOHASH(ST_POINTFROMGEOHASH("s000",0),10)
s000000000
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("zzzzm",0),10);
ST_GEOHASH(ST_POINTFROMGEOHASH("zzzzm",0),10)
zzzzmtz1my
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("pbpbt",0),10);
ST_GEOHASH(ST_POINTFROMGEOHASH("pbpbt",0),10)
pbpbtdpntc
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("bpbp6",0),10);
ST_GEOHASH(ST_POINTFROMGEOHASH("bpbp6",0),10)
bpbp6mbc6n
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("0000d",0),10);
ST_GEOHASH(ST_POINTFROMGEOHASH("0000d",0),10)
0000d60yd1
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("xbpbpbpbp",0),9);
ST_GEOHASH(ST_POINTFROMGEOHASH("xbpbpbpbp",0),9)
xbpbpbpbp
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("800000000",0),12);
ST_GEOHASH(ST_POINTFROMGEOHASH("800000000",0),12)
800000000000
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz",0),20);
ST_GEOHASH(ST_POINTFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz",0),20)
zzzzzzzzzzzzzzzzzzzz
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("00000000000000000000",0),20);
ST_GEOHASH(ST_POINTFROMGEOHASH("00000000000000000000",0),20)
00000000000000000000
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("pbpbpbpbpbpbpbpbpbpb",0),20);
ST_GEOHASH(ST_POINTFROMGEOHASH("pbpbpbpbpbpbpbpbpbpb",0),20)
pbpbpbpbpbpbpbpbpbpb
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("bpbpbpbpbpbpbpbpbpbp",0),20);
ST_GEOHASH(ST_POINTFROMGEOHASH("bpbpbpbpbpbpbpbpbpbp",0),20)
bpbpbpbpbpbpbpbpbpbp
SELECT ST_GEOHASH(ST_LONGFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz"),ST_LATFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz"),20);
ST_GEOHASH(ST_LONGFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz"),ST_LATFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz"),20)
zzzzzzzzzzzzzzzzzzzz
......@@ -1066,6 +1463,70 @@ ST_LATFROMGEOHASH(
CAST("0123456789bcdefghjkmnpqrstuvwxyz0123456789BCDEFGHJKMNPQRSTUVWXYZ"
AS CHAR CHARACTER SET utf8) COLLATE utf8_hungarian_ci)
-82.77450549262497
SELECT
ST_ASTEXT(
ST_POINTFROMGEOHASH(
CAST("0123456789bcdefghjkmnpqrstuvwxyz0123456789BCDEFGHJKMNPQRSTUVWXYZ"
AS CHAR CHARACTER SET utf8) COLLATE utf8_persian_ci,
4326
)
);
ST_ASTEXT(
ST_POINTFROMGEOHASH(
CAST("0123456789bcdefghjkmnpqrstuvwxyz0123456789BCDEFGHJKMNPQRSTUVWXYZ"
AS CHAR CHARACTER SET utf8) COLLATE utf8_persian_ci,
4326
)
)
POINT(-179.55743439816956 -82.77450549262497)
SELECT
ST_ASTEXT(
ST_POINTFROMGEOHASH(
CAST("0123456789bcdefghjkmnpqrstuvwxyz0123456789BCDEFGHJKMNPQRSTUVWXYZ"
AS CHAR CHARACTER SET utf8) COLLATE utf8_czech_ci,
4326
)
);
ST_ASTEXT(
ST_POINTFROMGEOHASH(
CAST("0123456789bcdefghjkmnpqrstuvwxyz0123456789BCDEFGHJKMNPQRSTUVWXYZ"
AS CHAR CHARACTER SET utf8) COLLATE utf8_czech_ci,
4326
)
)
POINT(-179.55743439816956 -82.77450549262497)
SELECT
ST_ASTEXT(
ST_POINTFROMGEOHASH(
CAST("0123456789bcdefghjkmnpqrstuvwxyz0123456789BCDEFGHJKMNPQRSTUVWXYZ"
AS CHAR CHARACTER SET utf8) COLLATE utf8_unicode_ci,
4326
)
);
ST_ASTEXT(
ST_POINTFROMGEOHASH(
CAST("0123456789bcdefghjkmnpqrstuvwxyz0123456789BCDEFGHJKMNPQRSTUVWXYZ"
AS CHAR CHARACTER SET utf8) COLLATE utf8_unicode_ci,
4326
)
)
POINT(-179.55743439816956 -82.77450549262497)
SELECT
ST_ASTEXT(
ST_POINTFROMGEOHASH(
CAST("0123456789bcdefghjkmnpqrstuvwxyz0123456789BCDEFGHJKMNPQRSTUVWXYZ"
AS CHAR CHARACTER SET utf8) COLLATE utf8_hungarian_ci,
4326
)
);
ST_ASTEXT(
ST_POINTFROMGEOHASH(
CAST("0123456789bcdefghjkmnpqrstuvwxyz0123456789BCDEFGHJKMNPQRSTUVWXYZ"
AS CHAR CHARACTER SET utf8) COLLATE utf8_hungarian_ci,
4326
)
)
POINT(-179.55743439816956 -82.77450549262497)
CREATE TABLE t1 (val DOUBLE);
INSERT INTO t1 (val) VALUES (12.2);
SELECT val INTO @double FROM t1;
......@@ -1094,6 +1555,23 @@ ST_LATFROMGEOHASH(@geohash)
SELECT ST_LATFROMGEOHASH(@null);
ST_LATFROMGEOHASH(@null)
NULL
PREPARE stmt FROM "SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(?, 0))";
EXECUTE stmt USING @geohash;
ST_ASTEXT(ST_POINTFROMGEOHASH(?, 0))
POINT(-178.7755 -80.0156)
DEALLOCATE PREPARE stmt;
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(@geohash, 0));
ST_ASTEXT(ST_POINTFROMGEOHASH(@geohash, 0))
POINT(-178.7755 -80.0156)
SET @srid = 4326;
PREPARE stmt FROM "SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(\"00\", ?))";
EXECUTE stmt USING @srid;
ST_ASTEXT(ST_POINTFROMGEOHASH("00", ?))
POINT(-174 -87)
DEALLOCATE PREPARE stmt;
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("00", @srid));
ST_ASTEXT(ST_POINTFROMGEOHASH("00", @srid))
POINT(-174 -87)
SET @maxlen = 3;
PREPARE stmt FROM "SELECT ST_GeoHash(POINT(10, 10), ?)";
EXECUTE stmt USING @maxlen;
......@@ -1155,6 +1633,8 @@ ST_GeoHash(@double, @double, 10)
s60tmsgy0s
SELECT ST_GeoHash(POINT(10, 10), @double);
ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
SELECT ST_POINTFROMGEOHASH("00", @double);
ERROR 22023: Invalid GIS data provided to function ST_PointFromGeoHash.
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (a VARCHAR(255));
INSERT INTO t1 (a) VALUES (' ');
......@@ -1162,16 +1642,38 @@ SELECT ST_LONGFROMGEOHASH(a) FROM t1;
ERROR HY000: Incorrect geohash value: ' ' for function st_longfromgeohash
SELECT ST_LATFROMGEOHASH(a) FROM t1;
ERROR HY000: Incorrect geohash value: ' ' for function st_latfromgeohash
SELECT ST_POINTFROMGEOHASH(a, 0) FROM t1;
ERROR HY000: Incorrect geohash value: ' ' for function st_pointfromgeohash
DELETE FROM t1;
INSERT INTO t1 VALUES ('swpwwwwww'), ('guqtjvooguqtjvoo');
SELECT ST_LONGFROMGEOHASH(a) FROM t1;
ERROR HY000: Incorrect geohash value: 'guqtjvooguqtjvoo' for function st_longfromgeohash
SELECT ST_LATFROMGEOHASH(a) FROM t1;
ERROR HY000: Incorrect geohash value: 'guqtjvooguqtjvoo' for function st_latfromgeohash
SELECT ST_POINTFROMGEOHASH(a, 0) FROM t1;
ERROR HY000: Incorrect geohash value: 'guqtjvooguqtjvoo' for function st_pointfromgeohash
# Clean up
DROP TABLE geohashes;
DROP TABLE t1;
#
# Bug#22165582 ST_*FROMGEOHASH ROUNDS INCORRECTLY
#
SELECT ST_GeoHash(ST_PointFromGeoHash('xkcd', 0), 4);
ST_GeoHash(ST_PointFromGeoHash('xkcd', 0), 4)
xkcd
SELECT ST_LongFromGeoHash('xkcd');
ST_LongFromGeoHash('xkcd')
148.5
SELECT ST_LatFromGeoHash('xkcd');
ST_LatFromGeoHash('xkcd')
27.2
SELECT ST_GeoHash(ST_PointFromGeoHash('ebrb', 0), 4);
ST_GeoHash(ST_PointFromGeoHash('ebrb', 0), 4)
s020
SELECT ST_LatFromGeoHash('m7s9pyctu9bbwqkgbw5x6vutzkztd9szjh86gmz9w9nsz6792d');
ST_LatFromGeoHash('m7s9pyctu9bbwqkgbw5x6vutzkztd9szjh86gmz9w9nsz6792d')
-25.098643334722453
#
# Bug#22838668 CRASH IN ITEM_FUNC_LATLONGFROMGEOHASH::VAL_REAL
# WITH BAD PARAMETERS
#
......@@ -1203,3 +1705,19 @@ LINESTRING(POINT(1, 1))
ST_LongFromGeoHash(UpdateXML(1, NULL, NULL))
);
ERROR HY000: Illegal parameter data type double for operation 'st_disjoint'
#
# Bug#25912557 ST_LATFROMGEOHASH/ST_LONGFROMGEOHASH ODD INPUT TYPE
# REQUIREMENT
#
CREATE TABLE t1 (col1 CHAR(4));
INSERT INTO t1 VALUES ('bbbb');
SELECT ST_LatFromGeohash(col1) FROM t1;
ST_LatFromGeohash(col1)
49.3
SELECT ST_LongFromGeohash(col1) FROM t1;
ST_LongFromGeohash(col1)
-145
SELECT ST_AsText(ST_PointFromGeohash(col1, 4326)) FROM t1;
ST_AsText(ST_PointFromGeohash(col1, 4326))
POINT(-145 49.3)
DROP TABLE t1;
# Copyright (c) 2014, Oracle and/or its affiliates
# Copyright (c) 2024, MariaDB Corporation.
#
......@@ -412,6 +411,230 @@ SELECT ST_LATFROMGEOHASH("ZYXWVUTSRQPNMKJHGFEDCB9876543210ZYXWVUTSRQPNMKJHGFEDC"
--echo # different random geohash values
SELECT ST_LATFROMGEOHASH(hash_value) FROM geohashes;
#####################################################################
# ST_POINTFROMGEOHASH()
#####################################################################
# Check for all valid characters and inputs
--echo # valid characters
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("z", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0z", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("xbpb", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("8000", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("s000", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("9876543210", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("bcdefghjkmnpqrstuvwxyz", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("bpbpbpbpbpbpbpbpbpbp", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("pbpbpbpbpbpbpbpbpbpb", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("00000000000000000000", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("gzzzzzzzzzzzzzzzzzzz", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("5bpbpbpbpbpbpbpbpbpb", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("7zzzzzzzzzzzzzzzzzzz", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("rzzzzzzzzzzzzzzzzzzz", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("2pbpbpbpbpbpbpbpbpbp", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0000000000zzzzzzzzzz", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zzzzzzzzzz0000000000", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("s000000001z7wsg7zzm6", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("ebpbpbpbpcbe9kuebp6d", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("kpbpbpbpbnpkqe5kpbtm", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("7zzzzzzzzy0s37hs00dt", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("tzzzzzzzzzzzzzzzzzzz", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("9zzzzzzzzzzzzzzzzzzz", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("jzzzzzzzzzzzzzzzzzzz", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("1zzzzzzzzzzzzzzzzzzz", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zbzurypzpgxczbzurypz", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("5zpgxczbzurypzpgxczb", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789bcdefghjkmnpqrstuvwxyz", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789BCDEFGHJKMNPQRSTUVWXYZ", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb9876543210", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("ZYXWVUTSRQPNMKJHGFEDCB9876543210", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("1e1", " "));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("100", " 0"));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(CAST(100 AS CHAR), 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("10111000110001111001", "0"));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("11111111111111111111", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("99999999999999999999", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("00000000000000000000", " ***** "));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("00000000000000000000", " 0 "));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz", (CAST(0 AS CHAR))));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(NULL, 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(null, 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("tzzzzzzzzzzzzzzzzzzz", NULL));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("9zzzzzzzzzzzzzzzzzzz", null));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(CAST("012" AS BINARY), 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz", (CAST(0 AS BINARY))));
# Invalid characters and inputs
--echo # invalid characters and inputs
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123a45", 0));
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("xyzi", 0));
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zyxLwv", 0));
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("bcdjo", 0));
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zyx**wv", 0));
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("1 2 3 4", 0));
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("1''2345", 0));
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("12.345", 0));
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(" ", 0));
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("NULL", 0));
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0a 0d", 0));
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("-100", 0));
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("", 2000));
--error ER_GIS_INVALID_DATA
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(9876543210, 0));
--error ER_GIS_INVALID_DATA
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(0123456789, 0));
--error ER_GIS_INVALID_DATA
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(1e1, 0));
--error ER_PARSE_ERROR
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("123",));
--error ER_PARSE_ERROR
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(,"456"));
--error ER_PARSE_ERROR
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(,));
--error ER_PARSE_ERROR
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123456"789));
--error ER_PARSE_ERROR
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("7zzzzzzzzzzzzzzzzzzz", ****));
--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz"));
--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH());
--error ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(abcdef));
--error ER_OPERAND_COLUMNS
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH((1, 1), 1));
# Test geohashes that are long
--echo # very long geohash
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789bcdefghjkmnpqrstuvwxyz0123456789bc"
"defghjkmnpqrstuvwxyz0123456789bcdefghjkmnpqr"
"stuvwxyz0123456789bcdefghjkmnpqrstuvwxyz", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789BCDEFGHJKMNPQRSTUVWXYZ0123456789BC"
"DEFGHJKMNPQRSTUVWXYZ0123456789BCDEFGHJKMNPQR"
"STUVWXYZ0123456789BCDEFGHJKMNPQRSTUVWXYZ", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb9876543210zyxwvutsrqpn"
"mkjhgfedcb9876543210zyxwvutsrqpnmkjhgfedcb98"
"76543210zyxwvutsrqpnmkjhgfedcb9876543210", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("ZYXWVUTSRQPNMKJHGFEDCB9876543210ZYXWVUTSRQPN"
"MKJHGFEDCB9876543210ZYXWVUTSRQPNMKJHGFEDCB98"
"76543210ZYXWVUTSRQPNMKJHGFEDCB9876543210", 0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("0123456789bcdefghjkmnpqrstuvwxyz0123456789bc"
"defghjkmnpqrstuvwxyz0123456789bcdefghjkmnpqr"
"stuvwxyz0123456789bcdefghjkmnpqrstuvwxyz0123"
"456789bcdefghjkmnpqrstuvwxyz0123456789bcdefg"
"hjkmnpqrstuvwxyz0123456789bcdefghjkmnpqrstuv"
"wxyz01234567890123456789bcdefghjkmnpqrstuvwx"
"yz0123456789bcdefghjkmnpqrstuvwxyz0123456789"
"bcdefghjkmnpqrstuvwxyz0123456789bcdefghjkmnp"
"qrstuvwxyz0123456789bcdefghjkmnpqrstuvwxyz01"
"23456789bcdefghjkmnpqrstuvwxyz0123456789bcde"
"fghjkmnpqrstuvwxyz", 4326));
--echo # different random geohash values
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(hash_value,0)) FROM geohashes;
--echo # Test create table from SELECT statement
CREATE TABLE t1 AS SELECT ST_POINTFROMGEOHASH("0123", 4326);
EXPLAIN t1;
DROP TABLE t1;
#####################################################################
# ST_GEOHASH()
#####################################################################
......@@ -891,9 +1114,90 @@ SELECT ST_LATFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-100 -1.00101)'),20))
SELECT ST_LATFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(20 -20)'),10));
--echo #=============================================================
--echo # ST_POINTFROMGEOHASH()
--echo #=============================================================
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(180,90,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(180,-90,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-180,90,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-180,-90,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(180,0,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-180,0,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,90,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,-90,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,0,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-0,0,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,-0,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0.10,90,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(100,45,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(179.999999,90,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(-179.999999,0,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(180,89.999999,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(0,-89.999999,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(18*10,900/10,20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(100 50)'),10),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(10 10)'),10),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-10 10)'),10),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(1.000 1.00010)'),10),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-1.000 -1.1010)'),10),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(1.00101 1.000)'),10),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(-1.00101 -1.0000)'),20),0));
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(ST_GEOHASH(ST_GEOMFROMTEXT('POINT(20 20)'),10),0));
--echo #=============================================================
--echo # ST_GEOHASH()
--echo #=============================================================
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("upbp",0),4);
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("h000",0),8);
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("s000",0),10);
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("zzzzm",0),10);
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("pbpbt",0),10);
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("bpbp6",0),10);
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("0000d",0),10);
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("xbpbpbpbp",0),9);
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("800000000",0),12);
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz",0),20);
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("00000000000000000000",0),20);
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("pbpbpbpbpbpbpbpbpbpb",0),20);
SELECT ST_GEOHASH(ST_POINTFROMGEOHASH("bpbpbpbpbpbpbpbpbpbp",0),20);
SELECT ST_GEOHASH(ST_LONGFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz"),ST_LATFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz"),20);
......@@ -955,6 +1259,43 @@ SELECT
ST_LATFROMGEOHASH(
CAST("0123456789bcdefghjkmnpqrstuvwxyz0123456789BCDEFGHJKMNPQRSTUVWXYZ"
AS CHAR CHARACTER SET utf8) COLLATE utf8_hungarian_ci);
SELECT
ST_ASTEXT(
ST_POINTFROMGEOHASH(
CAST("0123456789bcdefghjkmnpqrstuvwxyz0123456789BCDEFGHJKMNPQRSTUVWXYZ"
AS CHAR CHARACTER SET utf8) COLLATE utf8_persian_ci,
4326
)
);
SELECT
ST_ASTEXT(
ST_POINTFROMGEOHASH(
CAST("0123456789bcdefghjkmnpqrstuvwxyz0123456789BCDEFGHJKMNPQRSTUVWXYZ"
AS CHAR CHARACTER SET utf8) COLLATE utf8_czech_ci,
4326
)
);
SELECT
ST_ASTEXT(
ST_POINTFROMGEOHASH(
CAST("0123456789bcdefghjkmnpqrstuvwxyz0123456789BCDEFGHJKMNPQRSTUVWXYZ"
AS CHAR CHARACTER SET utf8) COLLATE utf8_unicode_ci,
4326
)
);
SELECT
ST_ASTEXT(
ST_POINTFROMGEOHASH(
CAST("0123456789bcdefghjkmnpqrstuvwxyz0123456789BCDEFGHJKMNPQRSTUVWXYZ"
AS CHAR CHARACTER SET utf8) COLLATE utf8_hungarian_ci,
4326
)
);
#####################################################################
# Bug#19383904
#####################################################################
......@@ -979,6 +1320,17 @@ DEALLOCATE PREPARE stmt;
SELECT ST_LATFROMGEOHASH(@geohash);
SELECT ST_LATFROMGEOHASH(@null);
PREPARE stmt FROM "SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(?, 0))";
EXECUTE stmt USING @geohash;
DEALLOCATE PREPARE stmt;
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(@geohash, 0));
SET @srid = 4326;
PREPARE stmt FROM "SELECT ST_ASTEXT(ST_POINTFROMGEOHASH(\"00\", ?))";
EXECUTE stmt USING @srid;
DEALLOCATE PREPARE stmt;
SELECT ST_ASTEXT(ST_POINTFROMGEOHASH("00", @srid));
SET @maxlen = 3;
PREPARE stmt FROM "SELECT ST_GeoHash(POINT(10, 10), ?)";
EXECUTE stmt USING @maxlen;
......@@ -1015,6 +1367,8 @@ SELECT ST_GeoHash(@double, @double, 10);
--error ER_GIS_INVALID_DATA
SELECT ST_GeoHash(POINT(10, 10), @double);
--error ER_GIS_INVALID_DATA
SELECT ST_POINTFROMGEOHASH("00", @double);
#####################################################################
# Bug#20293609
......@@ -1027,6 +1381,8 @@ INSERT INTO t1 (a) VALUES (' ');
SELECT ST_LONGFROMGEOHASH(a) FROM t1;
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_LATFROMGEOHASH(a) FROM t1;
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_POINTFROMGEOHASH(a, 0) FROM t1;
DELETE FROM t1;
INSERT INTO t1 VALUES ('swpwwwwww'), ('guqtjvooguqtjvoo');
......@@ -1034,12 +1390,23 @@ INSERT INTO t1 VALUES ('swpwwwwww'), ('guqtjvooguqtjvoo');
SELECT ST_LONGFROMGEOHASH(a) FROM t1;
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_LATFROMGEOHASH(a) FROM t1;
--error ER_WRONG_VALUE_FOR_TYPE
SELECT ST_POINTFROMGEOHASH(a, 0) FROM t1;
--echo # Clean up
DROP TABLE geohashes;
DROP TABLE t1;
--echo #
--echo # Bug#22165582 ST_*FROMGEOHASH ROUNDS INCORRECTLY
--echo #
SELECT ST_GeoHash(ST_PointFromGeoHash('xkcd', 0), 4);
SELECT ST_LongFromGeoHash('xkcd');
SELECT ST_LatFromGeoHash('xkcd');
SELECT ST_GeoHash(ST_PointFromGeoHash('ebrb', 0), 4);
SELECT ST_LatFromGeoHash('m7s9pyctu9bbwqkgbw5x6vutzkztd9szjh86gmz9w9nsz6792d');
--echo #
--echo # Bug#22838668 CRASH IN ITEM_FUNC_LATLONGFROMGEOHASH::VAL_REAL
--echo # WITH BAD PARAMETERS
......@@ -1075,3 +1442,14 @@ DO ST_Disjoint(
),
ST_LongFromGeoHash(UpdateXML(1, NULL, NULL))
);
--echo #
--echo # Bug#25912557 ST_LATFROMGEOHASH/ST_LONGFROMGEOHASH ODD INPUT TYPE
--echo # REQUIREMENT
--echo #
CREATE TABLE t1 (col1 CHAR(4));
INSERT INTO t1 VALUES ('bbbb');
SELECT ST_LatFromGeohash(col1) FROM t1;
SELECT ST_LongFromGeohash(col1) FROM t1;
SELECT ST_AsText(ST_PointFromGeohash(col1, 4326)) FROM t1;
DROP TABLE t1;
\ No newline at end of file
......@@ -3022,6 +3022,7 @@ bool Item_func_latlongfromgeohash::is_invalid_geohash_field(
case MYSQL_TYPE_VARCHAR:
case MYSQL_TYPE_LONG_BLOB:
case MYSQL_TYPE_GEOMETRY:
case MYSQL_TYPE_STRING:
return false;
default:
return true;
......@@ -3029,6 +3030,7 @@ bool Item_func_latlongfromgeohash::is_invalid_geohash_field(
}
double Item_func_latlongfromgeohash::val_real()
{
null_value= 1;
......@@ -3071,6 +3073,87 @@ double Item_func_latlongfromgeohash::val_real()
return latitude;
}
bool Item_func_pointfromgeohash::is_invalid_SRID_field
(enum_field_types field_type)
{
switch (field_type)
{
case MYSQL_TYPE_NULL:
case MYSQL_TYPE_LONG:
case MYSQL_TYPE_VARCHAR:
case MYSQL_TYPE_LONGLONG:
return false;
default:
return true;
}
}
String *Item_func_pointfromgeohash::val_str(String *str)
{
DBUG_ASSERT(fixed());
null_value= 1;
String *input_value;
uint32 srid;
if (args[0]->null_value || args[1]->null_value)
return NULL;
if (is_invalid_SRID_field(args[1]->field_type()) ||
Item_func_latlongfromgeohash::is_invalid_geohash_field(
args[0]->field_type()
))
{
my_error(ER_GIS_INVALID_DATA, MYF(0), "ST_PointFromGeoHash");
return NULL;
}
input_value= args[0]->val_str(&buf);
if (args[0]->null_value)
{
args[0]->null_value= 0;
return NULL;
}
if (input_value->length() == 0)
{
my_error(ER_WRONG_VALUE_FOR_TYPE, MYF(0), "geohash",
input_value->c_ptr_safe(), func_name());
return NULL;
}
srid= static_cast<uint32>(args[1]->val_uint());
if (args[1]->null_value)
{
my_error(ER_WRONG_VALUE_FOR_TYPE, MYF(0), "geohash",
input_value->c_ptr_safe(), func_name());
return NULL;
}
double latitude= 0.0, longitude= 0.0;
if (Item_func_latlongfromgeohash::decode_geohash(input_value, &latitude, &longitude)) {
my_error(ER_WRONG_VALUE_FOR_TYPE, MYF(0), "geohash",
input_value->c_ptr_safe(), func_name());
return NULL;
}
str->set_charset(&my_charset_bin);
str->length(0);
if (str->reserve(SRID_SIZE + WKB_HEADER_SIZE + POINT_DATA_SIZE))
return NULL;
str->q_append((uint32) srid);
str->q_append((char) Geometry::wkb_ndr);
str->q_append((uint32) Geometry::wkb_point);
str->q_append(longitude);
str->q_append(latitude);
null_value= 0;
return str;
}
String *Item_func_pointonsurface::val_str(String *str)
{
Gcalc_operation_transporter trn(&func, &collector);
......@@ -3546,6 +3629,22 @@ class Create_func_longfromgeohash : public Create_func_arg1
};
class Create_func_pointfromgeohash : public Create_func_arg2
{
public:
Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override
{
return new (thd->mem_root) Item_func_pointfromgeohash(thd, arg1, arg2);
}
static Create_func_pointfromgeohash s_singleton;
protected:
Create_func_pointfromgeohash() = default;
virtual ~Create_func_pointfromgeohash() = default;
};
class Create_func_endpoint : public Create_func_arg1
{
public:
......@@ -4401,6 +4500,7 @@ Create_func_distance_sphere Create_func_distance_sphere::s_singleton;
Create_func_geohash Create_func_geohash::s_singleton;
Create_func_latfromgeohash Create_func_latfromgeohash ::s_singleton;
Create_func_longfromgeohash Create_func_longfromgeohash ::s_singleton;
Create_func_pointfromgeohash Create_func_pointfromgeohash ::s_singleton;
Create_func_endpoint Create_func_endpoint::s_singleton;
Create_func_envelope Create_func_envelope::s_singleton;
Create_func_equals Create_func_equals::s_singleton;
......@@ -4527,6 +4627,7 @@ static Native_func_registry func_array_geom[] =
{ { STRING_WITH_LEN("GEOHASH") }, GEOM_BUILDER(Create_func_geohash)},
{ { STRING_WITH_LEN("LATFROMGEOHASH") }, GEOM_BUILDER(Create_func_latfromgeohash)},
{ { STRING_WITH_LEN("LONGFROMGEOHASH") }, GEOM_BUILDER(Create_func_longfromgeohash)},
{ { STRING_WITH_LEN("POINTFROMGEOHASH") }, GEOM_BUILDER(Create_func_pointfromgeohash)},
{ { STRING_WITH_LEN("SRID") }, GEOM_BUILDER(Create_func_srid)},
{ { STRING_WITH_LEN("ST_AREA") }, GEOM_BUILDER(Create_func_area)},
{ { STRING_WITH_LEN("STARTPOINT") }, GEOM_BUILDER(Create_func_startpoint)},
......@@ -4611,6 +4712,7 @@ static Native_func_registry func_array_geom[] =
{ { STRING_WITH_LEN("ST_GEOHASH") }, GEOM_BUILDER(Create_func_geohash)},
{ { STRING_WITH_LEN("ST_LATFROMGEOHASH") }, GEOM_BUILDER(Create_func_latfromgeohash)},
{ { STRING_WITH_LEN("ST_LONGFROMGEOHASH") }, GEOM_BUILDER(Create_func_longfromgeohash)},
{ { STRING_WITH_LEN("ST_POINTFROMGEOHASH") }, GEOM_BUILDER(Create_func_pointfromgeohash)},
{ { STRING_WITH_LEN("TOUCHES") }, GEOM_BUILDER(Create_func_touches)},
{ { STRING_WITH_LEN("WITHIN") }, GEOM_BUILDER(Create_func_within)},
{ { STRING_WITH_LEN("X") }, GEOM_BUILDER(Create_func_x)},
......
......@@ -1256,13 +1256,13 @@ class Item_func_latlongfromgeohash : public Item_real_func {
String buf;
static const uint8_t geohash_alphabet[256];
const bool decode_longitude;
static bool is_invalid_geohash_field(enum_field_types field_type);
public:
Item_func_latlongfromgeohash(THD *thd, Item *a, bool start_on_even_bit_arg)
: Item_real_func(thd, a),
decode_longitude(start_on_even_bit_arg) {}
double val_real() override;
static bool is_invalid_geohash_field(const enum_field_types field_type);
static bool decode_geohash(String *geohash, double *result_latitude,
double *result_longitude);
static double round_latlongitude(double latlongitude, double error_range,
......@@ -1300,6 +1300,26 @@ class Item_func_longfromgeohash: public Item_func_latlongfromgeohash
};
class Item_func_pointfromgeohash: public Item_geometry_func
{
private:
String buf;
static bool is_invalid_SRID_field(const enum_field_types field_type);
public:
Item_func_pointfromgeohash(THD *thd, Item *a, Item *b)
:Item_geometry_func(thd, a, b) {}
LEX_CSTRING func_name_cstring() const override
{
static LEX_CSTRING name= {STRING_WITH_LEN("st_pointfromgeohash") };
return name;
}
String *val_str(String *) override;
Item *do_get_copy(THD *thd) const override
{ return get_item_copy<Item_func_pointfromgeohash>(thd, this); }
};
class Item_func_pointonsurface: public Item_geometry_func_args_geometry
{
String tmp_value;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment