mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 07:01:59 +00:00
Fixed geohashesInBox argument range
This commit is contained in:
parent
5a0f356cd6
commit
97a1cc1b52
@ -260,10 +260,10 @@ void geohashDecode(const char * encoded_string, size_t encoded_len, Float64 * lo
|
||||
*latitude = decodeCoordinate(lat_encoded, LAT_MIN, LAT_MAX, singleCoordBitsPrecision(precision, LATITUDE));
|
||||
}
|
||||
|
||||
GeohashesInBoxPreparedArgs geohashesInBoxPrepare(const Float64 longitude_min,
|
||||
const Float64 latitude_min,
|
||||
const Float64 longitude_max,
|
||||
const Float64 latitude_max,
|
||||
GeohashesInBoxPreparedArgs geohashesInBoxPrepare(Float64 longitude_min,
|
||||
Float64 latitude_min,
|
||||
Float64 longitude_max,
|
||||
Float64 latitude_max,
|
||||
uint8_t precision)
|
||||
{
|
||||
precision = geohashPrecision(precision);
|
||||
@ -273,6 +273,11 @@ GeohashesInBoxPreparedArgs geohashesInBoxPrepare(const Float64 longitude_min,
|
||||
return {};
|
||||
}
|
||||
|
||||
longitude_min = std::max(longitude_min, LON_MIN);
|
||||
longitude_max = std::min(longitude_max, LON_MAX);
|
||||
latitude_min = std::max(latitude_min, LAT_MIN);
|
||||
latitude_max = std::min(latitude_max, LAT_MAX);
|
||||
|
||||
const auto lon_step = getSpan(precision, LONGITUDE);
|
||||
const auto lat_step = getSpan(precision, LATITUDE);
|
||||
|
||||
|
@ -120,7 +120,7 @@ public:
|
||||
// Actually write geohashes into preallocated buffer.
|
||||
geohashesInBox(prepared_args, out);
|
||||
|
||||
for (UInt8 i = 1; i <= prepared_args.items_count ; ++i)
|
||||
for (UInt64 i = 1; i <= prepared_args.items_count ; ++i)
|
||||
{
|
||||
res_strings_offsets.push_back(starting_offset + (prepared_args.precision + 1) * i);
|
||||
}
|
||||
|
@ -37,4 +37,6 @@ zooming
|
||||
['s7w1z0gs3y0z','s7w1z0gs3y1p','s7w1z0gs3y1r','s7w1z0gs3y1x','s7w1z0gs3y2b','s7w1z0gs3y2c','s7w1z0gs3y2f','s7w1z0gs3y2g','s7w1z0gs3y2u','s7w1z0gs3y2v','s7w1z0gs3y30','s7w1z0gs3y31','s7w1z0gs3y32','s7w1z0gs3y33','s7w1z0gs3y34','s7w1z0gs3y35','s7w1z0gs3y36','s7w1z0gs3y37','s7w1z0gs3y38','s7w1z0gs3y39','s7w1z0gs3y3d','s7w1z0gs3y3e','s7w1z0gs3y3h','s7w1z0gs3y3j','s7w1z0gs3y3k','s7w1z0gs3y3m','s7w1z0gs3y3s','s7w1z0gs3y3t']
|
||||
['s7w1z0gs3y0z','s7w1z0gs3y1p','s7w1z0gs3y1r','s7w1z0gs3y1x','s7w1z0gs3y2b','s7w1z0gs3y2c','s7w1z0gs3y2f','s7w1z0gs3y2g','s7w1z0gs3y2u','s7w1z0gs3y2v','s7w1z0gs3y30','s7w1z0gs3y31','s7w1z0gs3y32','s7w1z0gs3y33','s7w1z0gs3y34','s7w1z0gs3y35','s7w1z0gs3y36','s7w1z0gs3y37','s7w1z0gs3y38','s7w1z0gs3y39','s7w1z0gs3y3d','s7w1z0gs3y3e','s7w1z0gs3y3h','s7w1z0gs3y3j','s7w1z0gs3y3k','s7w1z0gs3y3m','s7w1z0gs3y3s','s7w1z0gs3y3t']
|
||||
['s7w1z0gs3y0z','s7w1z0gs3y1p','s7w1z0gs3y1r','s7w1z0gs3y1x','s7w1z0gs3y2b','s7w1z0gs3y2c','s7w1z0gs3y2f','s7w1z0gs3y2g','s7w1z0gs3y2u','s7w1z0gs3y2v','s7w1z0gs3y30','s7w1z0gs3y31','s7w1z0gs3y32','s7w1z0gs3y33','s7w1z0gs3y34','s7w1z0gs3y35','s7w1z0gs3y36','s7w1z0gs3y37','s7w1z0gs3y38','s7w1z0gs3y39','s7w1z0gs3y3d','s7w1z0gs3y3e','s7w1z0gs3y3h','s7w1z0gs3y3j','s7w1z0gs3y3k','s7w1z0gs3y3m','s7w1z0gs3y3s','s7w1z0gs3y3t']
|
||||
input values are clamped to -90..90, -180..180 range
|
||||
32768
|
||||
errors
|
||||
|
@ -5,41 +5,46 @@
|
||||
-- except for the cases when JS-version produces result outside of given region,
|
||||
-- typically at wrap points: poles, 0-latitude and 0-longitude.
|
||||
|
||||
select 'center';
|
||||
SELECT 'center';
|
||||
SELECT arraySort(geohashesInBox(-1.0, -1.0, 1.0, 1.0, 3));
|
||||
SELECT arraySort(geohashesInBox(-0.1, -0.1, 0.1, 0.1, 5));
|
||||
SELECT arraySort(geohashesInBox(-0.01, -0.01, 0.01, 0.01, 5));
|
||||
|
||||
select 'north pole';
|
||||
SELECT 'north pole';
|
||||
SELECT arraySort(geohashesInBox(-180.0, 89.0, -179.0, 90.0, 3));
|
||||
SELECT arraySort(geohashesInBox(-1.0, 89.0, 0.0, 90.0, 3));
|
||||
SELECT arraySort(geohashesInBox(0.0, 89.0, 1.0, 90.0, 3));
|
||||
SELECT arraySort(geohashesInBox(179.0, 89.0, 180.0, 90.0, 3));
|
||||
|
||||
select 'south pole';
|
||||
SELECT 'south pole';
|
||||
SELECT arraySort(geohashesInBox(-180.0, -90.0, -179.0, -89.0, 3));
|
||||
SELECT arraySort(geohashesInBox(-1.0, -90.0, 0.0, -89.0, 3));
|
||||
SELECT arraySort(geohashesInBox(0.0, -90.0, 1.0, -89.0, 3));
|
||||
SELECT arraySort(geohashesInBox(179.0, -90.0, 180.0, -89.0, 3));
|
||||
|
||||
select 'wrap point around equator';
|
||||
SELECT 'wrap point around equator';
|
||||
SELECT arraySort(geohashesInBox(179.0, -1.0, 180.0, 0.0, 3));
|
||||
SELECT arraySort(geohashesInBox(179.0, 0.0, 180.0, 1.0, 3));
|
||||
SELECT arraySort(geohashesInBox(-180.0, -1.0, -179.0, 0.0, 3));
|
||||
SELECT arraySort(geohashesInBox(-180.0, 0.0, -179.0, 1.0, 3));
|
||||
|
||||
select 'arbitrary values in all 4 quarters';
|
||||
SELECT 'arbitrary values in all 4 quarters';
|
||||
SELECT arraySort(geohashesInBox(98.36, 7.88, 98.37, 7.89, 6));
|
||||
SELECT arraySort(geohashesInBox(53.8, 27.6, 53.9, 27.7, 5));
|
||||
SELECT arraySort(geohashesInBox(-49.26, -25.38, -49.25, -25.37, 6));
|
||||
SELECT arraySort(geohashesInBox(23.11, -82.37, 23.12, -82.36, 6));
|
||||
|
||||
select 'small range always produces array of length 1';
|
||||
SELECT lon/5 - 180 as lon1, lat/5 - 90 as lat1, lon1 as lon2, lat1 as lat2, geohashesInBox(lon1, lat1, lon2, lat2, 1) as g FROM (SELECT arrayJoin(range(360*5)) as lon, arrayJoin(range(180*5)) as lat) WHERE length(g) != 1;
|
||||
SELECT lon/5 - 40 as lon1, lat/5 - 20 as lat1, lon1 as lon2, lat1 as lat2, geohashesInBox(lon1, lat1, lon2, lat2, 12) as g FROM (SELECT arrayJoin(range(80*5)) as lon, arrayJoin(range(10*5)) as lat) WHERE length(g) != 1;
|
||||
SELECT lon/5 - 40 as lon1, lat/5 - 20 as lat1, lon1 + 0.0000000001 as lon2, lat1 + 0.0000000001 as lat2, geohashesInBox(lon1, lat1, lon2, lat2, 1) as g FROM (SELECT arrayJoin(range(80*5)) as lon, arrayJoin(range(10*5)) as lat) WHERE length(g) != 1;
|
||||
SELECT 'small range always produces array of length 1';
|
||||
SELECT lon/5 - 180 AS lon1, lat/5 - 90 AS lat1, lon1 AS lon2, lat1 AS lat2, geohashesInBox(lon1, lat1, lon2, lat2, 1) AS g
|
||||
FROM (SELECT arrayJoin(range(360*5)) AS lon, arrayJoin(range(180*5)) AS lat) WHERE length(g) != 1;
|
||||
|
||||
select 'zooming';
|
||||
SELECT lon/5 - 40 AS lon1, lat/5 - 20 AS lat1, lon1 AS lon2, lat1 AS lat2, geohashesInBox(lon1, lat1, lon2, lat2, 12) AS g
|
||||
FROM (SELECT arrayJoin(range(80*5)) AS lon, arrayJoin(range(10*5)) AS lat) WHERE length(g) != 1;
|
||||
|
||||
SELECT lon/5 - 40 AS lon1, lat/5 - 20 AS lat1, lon1 + 0.0000000001 AS lon2, lat1 + 0.0000000001 AS lat2, geohashesInBox(lon1, lat1, lon2, lat2, 1) AS g
|
||||
FROM (SELECT arrayJoin(range(80*5)) AS lon, arrayJoin(range(10*5)) AS lat) WHERE length(g) != 1;
|
||||
|
||||
SELECT 'zooming';
|
||||
SELECT arraySort(geohashesInBox(20.0, 20.0, 21.0, 21.0, 2));
|
||||
SELECT arraySort(geohashesInBox(20.0, 20.0, 21.0, 21.0, 3));
|
||||
SELECT arraySort(geohashesInBox(20.0, 20.0, 21.0, 21.0, 4));
|
||||
@ -56,8 +61,12 @@ SELECT arraySort(geohashesInBox(20.0, 20.0, 20.000001, 20.000001, 12));
|
||||
SELECT arraySort(geohashesInBox(20.0, 20.0, 20.000001, 20.000001, 13));
|
||||
SELECT arraySort(geohashesInBox(20.0, 20.0, 20.000001, 20.000001, 14));
|
||||
|
||||
select 'errors';
|
||||
SELECT 'input values are clamped to -90..90, -180..180 range';
|
||||
SELECT length(geohashesInBox(-inf, -inf, inf, inf, 3));
|
||||
|
||||
SELECT 'errors';
|
||||
SELECT geohashesInBox(); -- { serverError 42 } -- not enough arguments
|
||||
SELECT geohashesInBox(1, 2, 3, 4, 5); -- { serverError 43 } -- wrong types of arguments
|
||||
SELECT geohashesInBox(toFloat32(1.0), 2.0, 3.0, 4.0, 5); -- { serverError 43 } -- all lats and longs should be of the same type
|
||||
SELECT geohashesInBox(24.48, 40.56, 24.785, 40.81, 12); -- { serverError 128 } -- to many elements in array
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user