mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 17:12:03 +00:00
Better detecting invalid figures
This commit is contained in:
parent
58c5e91047
commit
a06631f0db
@ -20,6 +20,7 @@ namespace ErrorCodes
|
|||||||
{
|
{
|
||||||
extern const int ILLEGAL_TYPE_OF_ARGUMENT;
|
extern const int ILLEGAL_TYPE_OF_ARGUMENT;
|
||||||
extern const int ILLEGAL_COLUMN;
|
extern const int ILLEGAL_COLUMN;
|
||||||
|
extern const int BAD_ARGUMENTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@ -108,6 +109,12 @@ public:
|
|||||||
|
|
||||||
/// S2 acceptes point as (latitude, longitude)
|
/// S2 acceptes point as (latitude, longitude)
|
||||||
S2LatLng lat_lng = S2LatLng::FromDegrees(lat, lon);
|
S2LatLng lat_lng = S2LatLng::FromDegrees(lat, lon);
|
||||||
|
|
||||||
|
if (!lat_lng.is_valid())
|
||||||
|
throw Exception(ErrorCodes::BAD_ARGUMENTS,
|
||||||
|
"Point is invalid. For valid point the latitude is between -90 and 90 degrees inclusive"
|
||||||
|
"and the longitude is between -180 and 180 degrees inclusive.");
|
||||||
|
|
||||||
S2CellId id(lat_lng);
|
S2CellId id(lat_lng);
|
||||||
|
|
||||||
dst_data[row] = id.id();
|
dst_data[row] = id.id();
|
||||||
|
@ -114,13 +114,18 @@ public:
|
|||||||
const auto hi = S2CellId(data_hi[row]);
|
const auto hi = S2CellId(data_hi[row]);
|
||||||
const auto point = S2CellId(data_point[row]);
|
const auto point = S2CellId(data_point[row]);
|
||||||
|
|
||||||
if (!lo.is_valid() || !hi.is_valid())
|
S2LatLngRect rect(lo.ToLatLng(), hi.ToLatLng());
|
||||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Rectangle is not valid");
|
|
||||||
|
|
||||||
if (!point.is_valid())
|
if (!point.is_valid())
|
||||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Point is not valid");
|
throw Exception(ErrorCodes::BAD_ARGUMENTS,
|
||||||
|
"Point is invalid. For valid point the latitude is between -90 and 90 degrees inclusive"
|
||||||
|
"and the longitude is between -180 and 180 degrees inclusive.");
|
||||||
|
|
||||||
S2LatLngRect rect(lo.ToLatLng(), hi.ToLatLng());
|
if (!rect.is_valid())
|
||||||
|
throw Exception(ErrorCodes::BAD_ARGUMENTS,
|
||||||
|
"Rectangle is invalid. For valid rectangles the latitude bounds do not exceed"
|
||||||
|
"Pi/2 in absolute value and the longitude bounds do not exceed Pi in absolute value."
|
||||||
|
"Also, if either the latitude or longitude bound is empty then both must be.");
|
||||||
|
|
||||||
rect.AddPoint(point.ToPoint());
|
rect.AddPoint(point.ToPoint());
|
||||||
|
|
||||||
|
@ -107,13 +107,18 @@ public:
|
|||||||
const auto hi = S2CellId(data_hi[row]);
|
const auto hi = S2CellId(data_hi[row]);
|
||||||
const auto point = S2CellId(data_point[row]);
|
const auto point = S2CellId(data_point[row]);
|
||||||
|
|
||||||
if (!lo.is_valid() || !hi.is_valid())
|
S2LatLngRect rect(lo.ToLatLng(), hi.ToLatLng());
|
||||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Rectangle is not valid");
|
|
||||||
|
|
||||||
if (!point.is_valid())
|
if (!point.is_valid())
|
||||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Point is not valid");
|
throw Exception(ErrorCodes::BAD_ARGUMENTS,
|
||||||
|
"Point is invalid. For valid point the latitude is between -90 and 90 degrees inclusive"
|
||||||
|
"and the longitude is between -180 and 180 degrees inclusive.");
|
||||||
|
|
||||||
S2LatLngRect rect(lo.ToLatLng(), hi.ToLatLng());
|
if (!rect.is_valid())
|
||||||
|
throw Exception(ErrorCodes::BAD_ARGUMENTS,
|
||||||
|
"Rectangle is invalid. For valid rectangles the latitude bounds do not exceed"
|
||||||
|
"Pi/2 in absolute value and the longitude bounds do not exceed Pi in absolute value."
|
||||||
|
"Also, if either the latitude or longitude bound is empty then both must be.");
|
||||||
|
|
||||||
dst_data.emplace_back(rect.Contains(point.ToLatLng()));
|
dst_data.emplace_back(rect.Contains(point.ToLatLng()));
|
||||||
}
|
}
|
||||||
|
@ -128,15 +128,15 @@ public:
|
|||||||
const auto lo2 = S2CellId(data_lo2[row]);
|
const auto lo2 = S2CellId(data_lo2[row]);
|
||||||
const auto hi2 = S2CellId(data_hi2[row]);
|
const auto hi2 = S2CellId(data_hi2[row]);
|
||||||
|
|
||||||
if (!lo1.is_valid() || !hi1.is_valid())
|
|
||||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "First rectangle is not valid");
|
|
||||||
|
|
||||||
if (!lo2.is_valid() || !hi2.is_valid())
|
|
||||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Second rectangle is not valid");
|
|
||||||
|
|
||||||
S2LatLngRect rect1(lo1.ToLatLng(), hi1.ToLatLng());
|
S2LatLngRect rect1(lo1.ToLatLng(), hi1.ToLatLng());
|
||||||
S2LatLngRect rect2(lo2.ToLatLng(), hi2.ToLatLng());
|
S2LatLngRect rect2(lo2.ToLatLng(), hi2.ToLatLng());
|
||||||
|
|
||||||
|
if (!rect1.is_valid() || !rect2.is_valid())
|
||||||
|
throw Exception(ErrorCodes::BAD_ARGUMENTS,
|
||||||
|
"Rectangle is invalid. For valid rectangles the latitude bounds do not exceed"
|
||||||
|
"Pi/2 in absolute value and the longitude bounds do not exceed Pi in absolute value."
|
||||||
|
"Also, if either the latitude or longitude bound is empty then both must be.");
|
||||||
|
|
||||||
S2LatLngRect rect_intersection = rect1.Intersection(rect2);
|
S2LatLngRect rect_intersection = rect1.Intersection(rect2);
|
||||||
|
|
||||||
vec_res_first.emplace_back(S2CellId(rect_intersection.lo()).id());
|
vec_res_first.emplace_back(S2CellId(rect_intersection.lo()).id());
|
||||||
|
@ -126,15 +126,15 @@ public:
|
|||||||
const auto lo2 = S2CellId(data_lo2[row]);
|
const auto lo2 = S2CellId(data_lo2[row]);
|
||||||
const auto hi2 = S2CellId(data_hi2[row]);
|
const auto hi2 = S2CellId(data_hi2[row]);
|
||||||
|
|
||||||
if (!lo1.is_valid() || !hi1.is_valid())
|
|
||||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "First rectangle is not valid");
|
|
||||||
|
|
||||||
if (!lo2.is_valid() || !hi2.is_valid())
|
|
||||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Second rectangle is not valid");
|
|
||||||
|
|
||||||
S2LatLngRect rect1(lo1.ToLatLng(), hi1.ToLatLng());
|
S2LatLngRect rect1(lo1.ToLatLng(), hi1.ToLatLng());
|
||||||
S2LatLngRect rect2(lo2.ToLatLng(), hi2.ToLatLng());
|
S2LatLngRect rect2(lo2.ToLatLng(), hi2.ToLatLng());
|
||||||
|
|
||||||
|
if (!rect1.is_valid() || !rect2.is_valid())
|
||||||
|
throw Exception(ErrorCodes::BAD_ARGUMENTS,
|
||||||
|
"Rectangle is invalid. For valid rectangles the latitude bounds do not exceed"
|
||||||
|
"Pi/2 in absolute value and the longitude bounds do not exceed Pi in absolute value."
|
||||||
|
"Also, if either the latitude or longitude bound is empty then both must be.");
|
||||||
|
|
||||||
S2LatLngRect rect_union = rect1.Union(rect2);
|
S2LatLngRect rect_union = rect1.Union(rect2);
|
||||||
|
|
||||||
vec_res_first.emplace_back(S2CellId(rect_union.lo()).id());
|
vec_res_first.emplace_back(S2CellId(rect_union.lo()).id());
|
||||||
|
@ -97,7 +97,7 @@ public:
|
|||||||
const auto id = S2CellId(data_id[row]);
|
const auto id = S2CellId(data_id[row]);
|
||||||
|
|
||||||
if (!id.is_valid())
|
if (!id.is_valid())
|
||||||
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Point is not valid");
|
throw Exception(ErrorCodes::BAD_ARGUMENTS, "CellId is invalid.");
|
||||||
|
|
||||||
S2Point point = id.ToPoint();
|
S2Point point = id.ToPoint();
|
||||||
S2LatLng ll(point);
|
S2LatLng ll(point);
|
||||||
|
@ -337,7 +337,7 @@ public:
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
std::lock_guard lock(mutex);
|
std::lock_guard lock(mutex);
|
||||||
queue.emplace(file_segment->key(), file_segment->offset(), file_segment);
|
queue.push(DownloadInfo{file_segment->key(), file_segment->offset(), file_segment});
|
||||||
}
|
}
|
||||||
|
|
||||||
CurrentMetrics::add(CurrentMetrics::FilesystemCacheDownloadQueueElements);
|
CurrentMetrics::add(CurrentMetrics::FilesystemCacheDownloadQueueElements);
|
||||||
|
1
tests/queries/0_stateless/02816_s2_invalid_point.sql
Normal file
1
tests/queries/0_stateless/02816_s2_invalid_point.sql
Normal file
@ -0,0 +1 @@
|
|||||||
|
SELECT geoToS2(toFloat64(toUInt64(-1)), toFloat64(toUInt64(-1))); -- { serverError BAD_ARGUMENTS }
|
Loading…
Reference in New Issue
Block a user