[Groonga-commit] groonga/groonga [master] [set-value] check cast error.

Back to archive index

null+****@clear***** null+****@clear*****
2011年 9月 1日 (木) 13:25:48 JST


Kouhei Sutou	2011-09-01 04:25:48 +0000 (Thu, 01 Sep 2011)

  New Revision: 046d37d5a109c6ac5425a2051b7df5b86b6a8def

  Log:
    [set-value] check cast error.

  Modified files:
    lib/db.c
    test/unit/core/test-command-load.c

  Modified: lib/db.c (+16 -5)
===================================================================
--- lib/db.c    2011-09-01 04:22:19 +0000 (5f0d415)
+++ lib/db.c    2011-09-01 04:25:48 +0000 (af2ba76)
@@ -4864,12 +4864,23 @@ grn_obj_set_value(grn_ctx *ctx, grn_obj *obj, grn_id id,
         uint32_t element_size = ((grn_ra *)obj)->header->element_size;
         GRN_OBJ_INIT(&buf, GRN_BULK, 0, range);
         if (range != value->header.domain) {
-          grn_obj_cast(ctx, value, &buf, GRN_TRUE);
-          value_ = &buf;
-          v = GRN_BULK_HEAD(&buf);
-          s = GRN_BULK_VSIZE(&buf);
+          rc = grn_obj_cast(ctx, value, &buf, GRN_TRUE);
+          if (rc) {
+            grn_obj *range_obj;
+            range_obj = grn_ctx_at(ctx, range);
+            REPORT_CAST_ERROR(range_obj, value);
+            grn_obj_unlink(ctx, range_obj);
+          } else {
+            value_ = &buf;
+            v = GRN_BULK_HEAD(&buf);
+            s = GRN_BULK_VSIZE(&buf);
+          }
+        } else {
+          rc = GRN_SUCCESS;
         }
-        if (element_size < s) {
+        if (rc) {
+          /* do nothing because it already has error. */
+        } else if (element_size < s) {
           ERR(GRN_INVALID_ARGUMENT, "too long value (%d)", s);
         } else {
           void *p = grn_ra_ref(ctx, (grn_ra *)obj, id);

  Modified: test/unit/core/test-command-load.c (+15 -0)
===================================================================
--- test/unit/core/test-command-load.c    2011-09-01 04:22:19 +0000 (8fe7bc5)
+++ test/unit/core/test-command-load.c    2011-09-01 04:25:48 +0000 (9682446)
@@ -42,6 +42,7 @@ void test_invalid_table_name(void);
 void data_each(void);
 void test_each(gconstpointer data);
 void test_vector_reference_column(void);
+void test_invalid_int32_value(void);
 
 static gchar *tmp_directory;
 static const gchar *database_path;
@@ -580,3 +581,17 @@ test_vector_reference_column(void)
     send_command("select Users"));
 }
 
+void
+test_invalid_int32_value(void)
+{
+  assert_send_command("table_create Users TABLE_NO_KEY");
+  assert_send_command("column_create Users age COLUMN_SCALAR Int32");
+  grn_test_assert_send_command_error(
+    context,
+    GRN_INVALID_ARGUMENT,
+    "failed to cast to <Int32>: <\"invalid number!\">",
+    "load --table Users\n"
+    "[\n"
+    "{\"age\": \"invalid number!\"}\n"
+    "]");
+}




Groonga-commit メーリングリストの案内
Back to archive index