Better detecting invalid figures

This commit is contained in:
Nikita Mikhaylov 2023-07-18 16:26:10 +02:00
parent 58c5e91047
commit a06631f0db
9 changed files with 40 additions and 22 deletions

View File

@ -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();

View File

@ -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());

View File

@ -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()));
} }

View File

@ -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());

View File

@ -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());

View File

@ -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);

View File

@ -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);

View File

@ -0,0 +1 @@
SELECT geoToS2(toFloat64(toUInt64(-1)), toFloat64(toUInt64(-1))); -- { serverError BAD_ARGUMENTS }