[Groonga-commit] groonga/groonga [master] add nonexistent column check to load's --columns. #751

Back to archive index

null+****@clear***** null+****@clear*****
2010年 12月 8日 (水) 11:36:41 JST


Kouhei Sutou	2010-12-08 02:36:41 +0000 (Wed, 08 Dec 2010)

  New Revision: 0132bce47ccf43f465522a569934685951f52263

  Log:
    add nonexistent column check to load's --columns. #751
    
    Reported by Masahiro Tomita. Thanks!!!

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

  Modified: lib/db.c (+30 -2)
===================================================================
--- lib/db.c    2010-12-07 09:06:54 +0000 (7a14c49)
+++ lib/db.c    2010-12-08 02:36:41 +0000 (f0da3df)
@@ -8034,6 +8034,31 @@ json_read(grn_ctx *ctx, grn_loader *loader, const char *str, unsigned str_len)
   }
 }
 
+static grn_rc
+parse_load_columns(grn_ctx *ctx, grn_obj *table,
+                   const char *str, unsigned str_size, grn_obj *res)
+{
+  const char *p = (char *)str, *q, *r, *pe = p + str_size, *tokbuf[256];
+  while (p < pe) {
+    int i, n = tokenize(p, pe - p, tokbuf, 256, &q);
+    for (i = 0; i < n; i++) {
+      grn_obj *col;
+      r = tokbuf[i];
+      while (p < r && (' ' == *p || ',' == *p)) { p++; }
+      col = grn_obj_column(ctx, table, p, r - p);
+      if (!col) {
+        ERR(GRN_INVALID_ARGUMENT, "nonexistent column: <%.*s>", r - p, p);
+        goto exit;
+      }
+      GRN_PTR_PUT(ctx, res, col);
+      p = r;
+    }
+    p = q;
+  }
+exit:
+  return ctx->rc;
+}
+
 static grn_com_addr *addr;
 
 grn_rc
@@ -8066,8 +8091,10 @@ grn_load(grn_ctx *ctx, grn_content_type input_type,
       grn_obj parsed_columns;
 
       GRN_PTR_INIT(&parsed_columns, GRN_OBJ_VECTOR, GRN_ID_NIL);
-      grn_obj_columns(ctx, loader->table, columns, columns_len,
-                      &parsed_columns);
+      if (parse_load_columns(ctx, loader->table, columns, columns_len,
+                             &parsed_columns)) {
+        goto exit;
+      }
       n_columns = GRN_BULK_VSIZE(&parsed_columns) / sizeof(grn_obj *);
       for (i = 0; i < n_columns; i++) {
         grn_obj *column;
@@ -8115,5 +8142,6 @@ grn_load(grn_ctx *ctx, grn_content_type input_type,
     // todo
     break;
   }
+exit:
   GRN_API_RETURN(ctx->rc);
 }

  Modified: test/unit/core/test-command-load.c (+16 -0)
===================================================================
--- test/unit/core/test-command-load.c    2010-12-07 09:06:54 +0000 (7803606)
+++ test/unit/core/test-command-load.c    2010-12-08 02:36:41 +0000 (1438244)
@@ -31,6 +31,7 @@ void test_int32_key(void);
 void data_null(void);
 void test_null(gconstpointer data);
 void test_index_geo_point(void);
+void test_nonexistent_columns(void);
 
 static gchar *tmp_directory;
 
@@ -323,3 +324,18 @@ test_index_geo_point(void)
   cut_assert_equal_string(hit_result,
                           send_command(query));
 }
+
+void
+test_nonexistent_columns(void)
+{
+  assert_send_command("table_create Users TABLE_NO_KEY");
+  assert_send_command("column_create Users name COLUMN_SCALAR ShortText");
+  grn_test_assert_send_command_error(context,
+                                     GRN_INVALID_ARGUMENT,
+                                     "nonexistent column: <nonexistent>",
+                                     "load "
+                                     "--table Users "
+                                     "--columns nonexistent "
+                                     "--values "
+                                     "'[[\"nonexistent column value\"]]'");
+}




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