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