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\"]]'");
+}