Skip to content

Commit f357b47

Browse files
StefanoPetrillikevincheng2Catalin BesleagaGlebShchepaTatiana Azundris Nuernberg
authored andcommitted
MDEV-34159: Implements ST_LatFromGeoHash
The GIS function ST_LatFromGeoHash takes in input a geohash and returns its latitude. The latitude 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_INCORRECT_TYPE is thrown. Author: StefanoPetrilli <stefanop_1999@hotmail.it> Co-authored-by: kevincheng2 <chengyf112@gmail.com> Co-authored-by: Catalin Besleaga <catalin.besleaga@oracle.com> Co-authored-by: Gleb Shchepa <gleb.shchepa@oracle.com> Co-authored-by: Tatiana Azundris Nuernberg <tatjana.nuernberg@oracle.com> Co-authored-by: Martin Hansson <martin.hansson@oracle.com> Co-authored-by: Deepa Dixit <deepa.dixit@oracle.com> Co-authored-by: Hans H Melby <hans.h.melby@oracle.com> Co-authored-by: Jens Even Berg Blomsøy <jens.even.blomsoy@oracle.com> Co-authored-by: Erlend Dahl <erlend.dahl@oracle.com> Co-authored-by: Norvald H. Ryeng <norvald.ryeng@oracle.com> Co-authored-by: BennyWang <benny.wang@oracle.com> Co-authored-by: David.Zhao <david.zhao@oracle.com> Co-authored-by: Erik Froseth <erik.froseth@oracle.com>
1 parent 1401d2f commit f357b47

File tree

4 files changed

+733
-0
lines changed

4 files changed

+733
-0
lines changed

mysql-test/main/spatial_utility_function_geohash.result

Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,254 @@
1+
CREATE TABLE geohashes (gid INT NOT NULL PRIMARY KEY, hash_value VARCHAR(255));
2+
INSERT INTO geohashes VALUES
3+
(1, "000000000000000000000"),
4+
(2, "zzzzzzzzzzzzzzzzzzzzz"),
5+
(3, NULL),
6+
(4, "s00t"),
7+
(5, "7zzzm"),
8+
(6, "s00d"),
9+
(7, "0"),
10+
(8, "z"),
11+
(9, "3ejh6z75ddt2d839zh2u"),
12+
(10, "twtsuqg3q7vh3nrbt0nn"),
13+
(11, "yw8s10dxddhe4s06nsph"),
14+
(12, "h4g4h9yrjtgzvewxm0ru"),
15+
(13, "9kqbredcnhq1b44ue48s"),
16+
(14, "1pckwjkqw3km0v6ye5d2"),
17+
(15, "wm313fnr92ggsysm64e6"),
18+
(16, "vqghx20fx6d8r5vfkbgf"),
19+
(17, "wvetm3u23kr9r6663k31"),
20+
(18, "e5t2p7sk291vpyb08pwu");
21+
# valid characters
22+
SELECT ST_LATFROMGEOHASH("0");
23+
ST_LATFROMGEOHASH("0")
24+
-68
25+
SELECT ST_LATFROMGEOHASH("z");
26+
ST_LATFROMGEOHASH("z")
27+
68
28+
SELECT ST_LATFROMGEOHASH("0z");
29+
ST_LATFROMGEOHASH("0z")
30+
-48
31+
SELECT ST_LATFROMGEOHASH("xbpb");
32+
ST_LATFROMGEOHASH("xbpb")
33+
0
34+
SELECT ST_LATFROMGEOHASH("8000");
35+
ST_LATFROMGEOHASH("8000")
36+
0
37+
SELECT ST_LATFROMGEOHASH("s000");
38+
ST_LATFROMGEOHASH("s000")
39+
0
40+
SELECT ST_LATFROMGEOHASH("0123456789");
41+
ST_LATFROMGEOHASH("0123456789")
42+
-82.774507
43+
SELECT ST_LATFROMGEOHASH("9876543210");
44+
ST_LATFROMGEOHASH("9876543210")
45+
1.770175
46+
SELECT ST_LATFROMGEOHASH("bcdefghjkmnpqrstuvwxyz");
47+
ST_LATFROMGEOHASH("bcdefghjkmnpqrstuvwxyz")
48+
54.11408847964353
49+
SELECT ST_LATFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb");
50+
ST_LATFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb")
51+
82.77450549262497
52+
SELECT ST_LATFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz");
53+
ST_LATFROMGEOHASH("zzzzzzzzzzzzzzzzzzzz")
54+
90
55+
SELECT ST_LATFROMGEOHASH("bpbpbpbpbpbpbpbpbpbp");
56+
ST_LATFROMGEOHASH("bpbpbpbpbpbpbpbpbpbp")
57+
90
58+
SELECT ST_LATFROMGEOHASH("pbpbpbpbpbpbpbpbpbpb");
59+
ST_LATFROMGEOHASH("pbpbpbpbpbpbpbpbpbpb")
60+
-90
61+
SELECT ST_LATFROMGEOHASH("00000000000000000000");
62+
ST_LATFROMGEOHASH("00000000000000000000")
63+
-90
64+
SELECT ST_LATFROMGEOHASH("gzzzzzzzzzzzzzzzzzzz");
65+
ST_LATFROMGEOHASH("gzzzzzzzzzzzzzzzzzzz")
66+
90
67+
SELECT ST_LATFROMGEOHASH("5bpbpbpbpbpbpbpbpbpb");
68+
ST_LATFROMGEOHASH("5bpbpbpbpbpbpbpbpbpb")
69+
-90
70+
SELECT ST_LATFROMGEOHASH("7zzzzzzzzzzzzzzzzzzz");
71+
ST_LATFROMGEOHASH("7zzzzzzzzzzzzzzzzzzz")
72+
0
73+
SELECT ST_LATFROMGEOHASH("rzzzzzzzzzzzzzzzzzzz");
74+
ST_LATFROMGEOHASH("rzzzzzzzzzzzzzzzzzzz")
75+
0
76+
SELECT ST_LATFROMGEOHASH("2pbpbpbpbpbpbpbpbpbp");
77+
ST_LATFROMGEOHASH("2pbpbpbpbpbpbpbpbpbp")
78+
0
79+
SELECT ST_LATFROMGEOHASH("0000000000zzzzzzzzzz");
80+
ST_LATFROMGEOHASH("0000000000zzzzzzzzzz")
81+
-89.999994635582
82+
SELECT ST_LATFROMGEOHASH("zzzzzzzzzz0000000000");
83+
ST_LATFROMGEOHASH("zzzzzzzzzz0000000000")
84+
89.999994635582
85+
SELECT ST_LATFROMGEOHASH("s000000001z7wsg7zzm6");
86+
ST_LATFROMGEOHASH("s000000001z7wsg7zzm6")
87+
0.00001
88+
SELECT ST_LATFROMGEOHASH("ebpbpbpbpcbe9kuebp6d");
89+
ST_LATFROMGEOHASH("ebpbpbpbpcbe9kuebp6d")
90+
0.00001
91+
SELECT ST_LATFROMGEOHASH("kpbpbpbpbnpkqe5kpbtm");
92+
ST_LATFROMGEOHASH("kpbpbpbpbnpkqe5kpbtm")
93+
-0.00001
94+
SELECT ST_LATFROMGEOHASH("7zzzzzzzzy0s37hs00dt");
95+
ST_LATFROMGEOHASH("7zzzzzzzzy0s37hs00dt")
96+
-0.00001
97+
SELECT ST_LATFROMGEOHASH("tzzzzzzzzzzzzzzzzzzz");
98+
ST_LATFROMGEOHASH("tzzzzzzzzzzzzzzzzzzz")
99+
45
100+
SELECT ST_LATFROMGEOHASH("9zzzzzzzzzzzzzzzzzzz");
101+
ST_LATFROMGEOHASH("9zzzzzzzzzzzzzzzzzzz")
102+
45
103+
SELECT ST_LATFROMGEOHASH("jzzzzzzzzzzzzzzzzzzz");
104+
ST_LATFROMGEOHASH("jzzzzzzzzzzzzzzzzzzz")
105+
-45
106+
SELECT ST_LATFROMGEOHASH("1zzzzzzzzzzzzzzzzzzz");
107+
ST_LATFROMGEOHASH("1zzzzzzzzzzzzzzzzzzz")
108+
-45
109+
SELECT ST_LATFROMGEOHASH("zbzurypzpgxczbzurypz");
110+
ST_LATFROMGEOHASH("zbzurypzpgxczbzurypz")
111+
50
112+
SELECT ST_LATFROMGEOHASH("5zpgxczbzurypzpgxczb");
113+
ST_LATFROMGEOHASH("5zpgxczbzurypzpgxczb")
114+
-50
115+
SELECT ST_LATFROMGEOHASH("0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z");
116+
ST_LATFROMGEOHASH("0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z0z")
117+
-49.35483870967742
118+
SELECT ST_LATFROMGEOHASH("0123456789bcdefghjkmnpqrstuvwxyz");
119+
ST_LATFROMGEOHASH("0123456789bcdefghjkmnpqrstuvwxyz")
120+
-82.77450549262497
121+
SELECT ST_LATFROMGEOHASH("0123456789BCDEFGHJKMNPQRSTUVWXYZ");
122+
ST_LATFROMGEOHASH("0123456789BCDEFGHJKMNPQRSTUVWXYZ")
123+
-82.77450549262497
124+
SELECT ST_LATFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb9876543210");
125+
ST_LATFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb9876543210")
126+
82.77450549262497
127+
SELECT ST_LATFROMGEOHASH("ZYXWVUTSRQPNMKJHGFEDCB9876543210");
128+
ST_LATFROMGEOHASH("ZYXWVUTSRQPNMKJHGFEDCB9876543210")
129+
82.77450549262497
130+
SELECT ST_LATFROMGEOHASH("1e1");
131+
ST_LATFROMGEOHASH("1e1")
132+
-72
133+
SELECT ST_LATFROMGEOHASH("100");
134+
ST_LATFROMGEOHASH("100")
135+
-89
136+
SELECT ST_LATFROMGEOHASH(CAST(100 AS CHAR));
137+
ST_LATFROMGEOHASH(CAST(100 AS CHAR))
138+
-89
139+
SELECT ST_LATFROMGEOHASH("10111000110001111001");
140+
ST_LATFROMGEOHASH("10111000110001111001")
141+
-89.8242133801793
142+
SELECT ST_LATFROMGEOHASH("11111111111111111111");
143+
ST_LATFROMGEOHASH("11111111111111111111")
144+
-84.1935483870967
145+
SELECT ST_LATFROMGEOHASH("99999999999999999999");
146+
ST_LATFROMGEOHASH("99999999999999999999")
147+
8.7096774193548
148+
SELECT ST_LATFROMGEOHASH(NULL);
149+
ST_LATFROMGEOHASH(NULL)
150+
NULL
151+
SELECT ST_LATFROMGEOHASH(null);
152+
ST_LATFROMGEOHASH(null)
153+
NULL
154+
SELECT ST_LATFROMGEOHASH(CAST("012" AS BINARY));
155+
ST_LATFROMGEOHASH(CAST("012" AS BINARY))
156+
-82
157+
# invalid characters and inputs
158+
SELECT ST_LATFROMGEOHASH("0123a45");
159+
ERROR HY000: Incorrect geohash value: '0123a45' for function st_latfromgeohash
160+
SELECT ST_LATFROMGEOHASH("xyzi");
161+
ERROR HY000: Incorrect geohash value: 'xyzi' for function st_latfromgeohash
162+
SELECT ST_LATFROMGEOHASH("zyxLwv");
163+
ERROR HY000: Incorrect geohash value: 'zyxLwv' for function st_latfromgeohash
164+
SELECT ST_LATFROMGEOHASH("bcdjo");
165+
ERROR HY000: Incorrect geohash value: 'bcdjo' for function st_latfromgeohash
166+
SELECT ST_LATFROMGEOHASH("zyx**wv");
167+
ERROR HY000: Incorrect geohash value: 'zyx**wv' for function st_latfromgeohash
168+
SELECT ST_LATFROMGEOHASH("1 2 3 4");
169+
ERROR HY000: Incorrect geohash value: '1 2 3 4' for function st_latfromgeohash
170+
SELECT ST_LATFROMGEOHASH("1''2345");
171+
ERROR HY000: Incorrect geohash value: '1''2345' for function st_latfromgeohash
172+
SELECT ST_LATFROMGEOHASH("12.345");
173+
ERROR HY000: Incorrect geohash value: '12.345' for function st_latfromgeohash
174+
SELECT ST_LATFROMGEOHASH(" ");
175+
ERROR HY000: Incorrect geohash value: ' ' for function st_latfromgeohash
176+
SELECT ST_LATFROMGEOHASH("NULL");
177+
ERROR HY000: Incorrect geohash value: 'NULL' for function st_latfromgeohash
178+
SELECT ST_LATFROMGEOHASH("-100");
179+
ERROR HY000: Incorrect geohash value: '-100' for function st_latfromgeohash
180+
SELECT ST_LATFROMGEOHASH("");
181+
ERROR HY000: Incorrect geohash value: '' for function st_latfromgeohash
182+
SELECT ST_LATFROMGEOHASH(9876543210);
183+
ERROR 22023: Invalid GIS data provided to function ST_LatFromGeohash.
184+
SELECT ST_LATFROMGEOHASH(0123456789);
185+
ERROR 22023: Invalid GIS data provided to function ST_LatFromGeohash.
186+
SELECT ST_LATFROMGEOHASH(1e1);
187+
ERROR 22023: Invalid GIS data provided to function ST_LatFromGeohash.
188+
SELECT ST_LATFROMGEOHASH();
189+
ERROR 42000: Incorrect parameter count in the call to native function 'ST_LATFROMGEOHASH'
190+
SELECT ST_LATFROMGEOHASH("123","456");
191+
ERROR 42000: Incorrect parameter count in the call to native function 'ST_LATFROMGEOHASH'
192+
SELECT ST_LATFROMGEOHASH("123",);
193+
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
194+
SELECT ST_LATFROMGEOHASH(,"456");
195+
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
196+
SELECT ST_LATFROMGEOHASH(,);
197+
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
198+
SELECT ST_LATFROMGEOHASH("0123456"789);
199+
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
200+
SELECT ST_LATFROMGEOHASH(abcdef);
201+
ERROR 42S22: Unknown column 'abcdef' in 'field list'
202+
# very long geohash
203+
SELECT ST_LATFROMGEOHASH("0123456789bcdefghjkmnpqrstuvwxyz0123456789bcdefghjkmn"
204+
"pqrstuvwxyz0123456789bcdefghjkmnpqrstuvwxyz0123456789"
205+
"bcdefghjkmnpqrstuvwxyz");
206+
ST_LATFROMGEOHASH("0123456789bcdefghjkmnpqrstuvwxyz0123456789bcdefghjkmn"
207+
"pqrstuvwxyz0123456789bcdefghjkmnpqrstuvwxyz0123456789"
208+
"bcdefghjkmnpqrstuvwxyz")
209+
-82.77450549262497
210+
SELECT ST_LATFROMGEOHASH("0123456789BCDEFGHJKMNPQRSTUVWXYZ0123456789BCDEFGHJKMN"
211+
"PQRSTUVWXYZ0123456789BCDEFGHJKMNPQRSTUVWXYZ0123456789"
212+
"BCDEFGHJKMNPQRSTUVWXYZ");
213+
ST_LATFROMGEOHASH("0123456789BCDEFGHJKMNPQRSTUVWXYZ0123456789BCDEFGHJKMN"
214+
"PQRSTUVWXYZ0123456789BCDEFGHJKMNPQRSTUVWXYZ0123456789"
215+
"BCDEFGHJKMNPQRSTUVWXYZ")
216+
-82.77450549262497
217+
SELECT ST_LATFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb9876543210zyxwvutsrqpnmkjhgfedc"
218+
"b9876543210zyxwvutsrqpnmkjhgfedcb9876543210zyxwvutsrq"
219+
"pnmkjhgfedcb9876543210");
220+
ST_LATFROMGEOHASH("zyxwvutsrqpnmkjhgfedcb9876543210zyxwvutsrqpnmkjhgfedc"
221+
"b9876543210zyxwvutsrqpnmkjhgfedcb9876543210zyxwvutsrq"
222+
"pnmkjhgfedcb9876543210")
223+
82.77450549262497
224+
SELECT ST_LATFROMGEOHASH("ZYXWVUTSRQPNMKJHGFEDCB9876543210ZYXWVUTSRQPNMKJHGFEDC"
225+
"B9876543210ZYXWVUTSRQPNMKJHGFEDCB9876543210ZYXWVUTSRQ"
226+
"PNMKJHGFEDCB9876543210");
227+
ST_LATFROMGEOHASH("ZYXWVUTSRQPNMKJHGFEDCB9876543210ZYXWVUTSRQPNMKJHGFEDC"
228+
"B9876543210ZYXWVUTSRQPNMKJHGFEDCB9876543210ZYXWVUTSRQ"
229+
"PNMKJHGFEDCB9876543210")
230+
82.77450549262497
231+
# different random geohash values
232+
SELECT ST_LATFROMGEOHASH(hash_value) FROM geohashes;
233+
ST_LATFROMGEOHASH(hash_value)
234+
-90
235+
90
236+
NULL
237+
1
238+
-0.1
239+
0.4
240+
-68
241+
68
242+
-27.3374899367448
243+
37.4347752334972
244+
82.269670295412
245+
-74.168840669129
246+
23.9696161514665
247+
-45.5852718924236
248+
29.763254995923
249+
83.7602082514146
250+
31.8700305354552
251+
19.7074618731612
1252
# valid inputs
2253
SELECT ST_GEOHASH(0,0,1);
3254
ST_GEOHASH(0,0,1)
@@ -362,3 +613,5 @@ SELECT ST_GEOHASH(ST_DIFFERENCE(ST_GEOMFROMTEXT('POINT(180 90)'),ST_GEOMFROMTEXT
362613
ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
363614
SELECT ST_GEOHASH(ST_SYMDIFFERENCE(ST_GEOMFROMTEXT('POINT(180 90)'),ST_GEOMFROMTEXT('POINT(0 0)')),20);
364615
ERROR 22023: Invalid GIS data provided to function ST_GeoHash.
616+
# Clean up
617+
DROP TABLE geohashes;

0 commit comments

Comments
 (0)