null+****@clear*****
null+****@clear*****
2011年 3月 9日 (水) 16:34:34 JST
Kouhei Sutou 2011-03-09 07:34:34 +0000 (Wed, 09 Mar 2011) New Revision: 4d53c4a3a743d3081b76fdcdece447bea2238f8c Log: add max latitude and longitude value checks. Modified files: lib/geo.c test/unit/story/test-taiyaki.c Modified: lib/geo.c (+20 -0) =================================================================== --- lib/geo.c 2011-03-09 07:31:07 +0000 (2168911) +++ lib/geo.c 2011-03-09 07:34:34 +0000 (6455d29) @@ -715,6 +715,26 @@ grn_geo_search_in_rectangle(grn_ctx *ctx, grn_obj *obj, grn_obj **args, int narg goto exit; } + if (geo_point2->latitude >= GRN_GEO_MAX_LATITUDE) { + ERR(GRN_INVALID_ARGUMENT, + "geo_in_rectangle(): geo point2's latitude is too big: <%d>(max:%d): " + "(%d,%d) (%d,%d)", + GRN_GEO_MAX_LATITUDE, geo_point2->latitude, + geo_point1->latitude, geo_point1->longitude, + geo_point2->latitude, geo_point2->longitude); + goto exit; + } + + if (geo_point2->longitude >= GRN_GEO_MAX_LONGITUDE) { + ERR(GRN_INVALID_ARGUMENT, + "geo_in_rectangle(): geo point2's longitude is too big: <%d>(max:%d): " + "(%d,%d) (%d,%d)", + GRN_GEO_MAX_LONGITUDE, geo_point2->longitude, + geo_point1->latitude, geo_point1->longitude, + geo_point2->latitude, geo_point2->longitude); + goto exit; + } + latitude_distance = geo_point1->latitude - geo_point2->latitude; longitude_distance = geo_point2->longitude - geo_point1->longitude; if (latitude_distance > longitude_distance) { Modified: test/unit/story/test-taiyaki.c (+34 -0) =================================================================== --- test/unit/story/test-taiyaki.c 2011-03-09 07:31:07 +0000 (0b93e1e) +++ test/unit/story/test-taiyaki.c 2011-03-09 07:34:34 +0000 (2d0e95f) @@ -27,6 +27,8 @@ void test_in_rectangle_long_longitude(void); void test_in_rectangle_over_border(void); void test_in_rectangle_over_latitude1(void); void test_in_rectangle_over_longitude1(void); +void test_in_rectangle_over_latitude2(void); +void test_in_rectangle_over_longitude2(void); void test_sort(void); void test_filter_by_tag_and_sort_by_distance_from_tokyo_tocho(void); void test_in_circle_and_tag(void); @@ -239,6 +241,38 @@ test_in_rectangle_over_longitude1(void) } void +test_in_rectangle_over_latitude2(void) +{ + grn_test_assert_send_command_error( + context, + GRN_INVALID_ARGUMENT, + "geo_in_rectangle(): geo point2's latitude is too big: " + "<1296000000>(max:1296000000): " + "(131281920,505723679) (1296000000,505954080", + "select Shops " + "--sortby '+name' " + "--output_columns 'name, location' " + "--filter " + "'geo_in_rectangle(location, \"35.73360x139.7394\", \"360.0x139.7714\")'"); +} + +void +test_in_rectangle_over_longitude2(void) +{ + grn_test_assert_send_command_error( + context, + GRN_INVALID_ARGUMENT, + "geo_in_rectangle(): geo point2's longitude is too big: " + "<648000000>(max:648000000): " + "(131281920,505723679) (130508208,648000000)", + "select Shops " + "--sortby '+name' " + "--output_columns 'name, location' " + "--filter " + "'geo_in_rectangle(location, \"35.73360x139.7394\", \"35.62614x180.0\")'"); +} + +void test_sort(void) { gdouble yurakucho_latitude = 35.67487;