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"));
}