null+****@clear*****
null+****@clear*****
2011年 9月 1日 (木) 15:58:42 JST
Kouhei Sutou 2011-09-01 06:58:42 +0000 (Thu, 01 Sep 2011) New Revision: b60c531b018c987a1f3ba108cec074f3010f0831 Log: [cast][geo] add max/min value check. Modified files: lib/db.c test/unit/core/test-command-load.c Modified: lib/db.c (+8 -1) =================================================================== --- lib/db.c 2011-09-01 04:25:48 +0000 (af2ba76) +++ lib/db.c 2011-09-01 06:58:42 +0000 (e9181dc) @@ -4269,7 +4269,14 @@ grn_obj_cast(grn_ctx *ctx, grn_obj *src, grn_obj *dest, int addp) } } if (!rc && cur == str_end) { - GRN_GEO_POINT_SET(ctx, dest, latitude, longitude); + if ((-GRN_GEO_MAX_LATITUDE <= latitude && + latitude <= GRN_GEO_MAX_LATITUDE) && + (-GRN_GEO_MAX_LONGITUDE <= longitude && + longitude <= GRN_GEO_MAX_LONGITUDE)) { + GRN_GEO_POINT_SET(ctx, dest, latitude, longitude); + } else { + rc = GRN_INVALID_ARGUMENT; + } } else { rc = GRN_INVALID_ARGUMENT; } Modified: test/unit/core/test-command-load.c (+92 -1) =================================================================== --- test/unit/core/test-command-load.c 2011-09-01 04:25:48 +0000 (9682446) +++ test/unit/core/test-command-load.c 2011-09-01 06:58:42 +0000 (c5f48f0) @@ -43,6 +43,10 @@ void data_each(void); void test_each(gconstpointer data); void test_vector_reference_column(void); void test_invalid_int32_value(void); +void data_valid_geo_point_valid(void); +void test_valid_geo_point_value(gconstpointer data); +void data_invalid_geo_point_valid(void); +void test_invalid_geo_point_value(gconstpointer data); static gchar *tmp_directory; static const gchar *database_path; @@ -593,5 +597,92 @@ test_invalid_int32_value(void) "load --table Users\n" "[\n" "{\"age\": \"invalid number!\"}\n" - "]"); + "]\n"); + send_command("]\n"); + cut_assert_equal_string( + "[[[1]," + "[[\"_id\",\"UInt32\"]," + "[\"age\",\"Int32\"]]," + "[1,0]]]", + send_command("select Users")); +} + +void +data_valid_geo_point_value(void) +{ +#define ADD_DATUM(label, location) \ + gcut_add_datum(label " (" location ")", \ + "location", G_TYPE_STRING, location, \ + NULL) + + ADD_DATUM("too large latitude", "324000000x502419287"); + ADD_DATUM("too small latitude", "-324000000x502419287"); + ADD_DATUM("too large longitude", "128514964x648000000"); + ADD_DATUM("too small longitude", "128514964x-648000000"); + +#undef ADD_DATUM +} + +void +test_valid_geo_point_value(gconstpointer data) +{ + assert_send_command("table_create Shops TABLE_HASH_KEY ShortText"); + assert_send_command("column_create Shops location COLUMN_SCALAR WGS84GeoPoint"); + cut_assert_equal_string( + "1", + send_command( + cut_take_printf("load --table Shops\n" + "[\n" + "{\"_key\": \"たかね\", \"location\": \"%s\"}\n" + "]\n", + gcut_data_get_string(data, "location")))); + cut_assert_equal_string( + cut_take_printf("[[[1]," + "[[\"_id\",\"UInt32\"]," + "[\"_key\",\"ShortText\"]," + "[\"location\",\"WGS84GeoPoint\"]]," + "[1,\"たかね\",\"%s\"]]]", + gcut_data_get_string(data, "location")), + send_command("select Shops")); +} + +void +data_invalid_geo_point_value(void) +{ +#define ADD_DATUM(label, location) \ + gcut_add_datum(label " (" location ")", \ + "location", G_TYPE_STRING, location, \ + NULL) + + ADD_DATUM("too large latitude", "324000001x502419287"); + ADD_DATUM("too small latitude", "-324000001x502419287"); + ADD_DATUM("too large longitude", "128514964x648000001"); + ADD_DATUM("too small longitude", "128514964x-648000001"); + +#undef ADD_DATUM +} + +void +test_invalid_geo_point_value(gconstpointer data) +{ + assert_send_command("table_create Shops TABLE_HASH_KEY ShortText"); + assert_send_command("column_create Shops location COLUMN_SCALAR WGS84GeoPoint"); + grn_test_assert_send_command_error( + context, + GRN_INVALID_ARGUMENT, + cut_take_printf("failed to cast to <WGS84GeoPoint>: <\"%s\">", + gcut_data_get_string(data, "location")), + cut_take_printf("load --table Shops\n" + "[\n" + "{\"_key\": \"たかね\", \"location\": \"%s\"}\n" + "]\n", + gcut_data_get_string(data, "location"))); + send_command("]\n"); + cut_assert_equal_string( + "[[[1]," + "[[\"_id\",\"UInt32\"]," + "[\"_key\",\"ShortText\"]," + "[\"location\",\"WGS84GeoPoint\"]]," + "[1,\"たかね\",\"0x0\"]]]", + send_command("select Shops")); }