[Groonga-commit] groonga/groonga [master] [cast][geo] add max/min value check.

Zurück zum Archiv-Index

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




Groonga-commit メーリングリストの案内
Zurück zum Archiv-Index