morit****@razil*****
morit****@razil*****
2009年 8月 9日 (日) 22:12:52 JST
ご指摘ありがとうございます。
さっそく取り込ませていただきました。
>>> Kouhei Sutou さんは書きました:
> 須藤です。
>
> grn_obj_column(context, table, "nonexistent", strlen("nonexistent"))
> など、存在しないカラムを指定すると落ちてしまいます。
>
> --
> 須藤 功平 <kou****@clear*****>
> 株式会社クリアコード (http://www.clear-code.com/)
>
>
> diff --git a/lib/db.c b/lib/db.c
> index 07f8844..02bc179 100644
> --- a/lib/db.c
> +++ b/lib/db.c
> @@ -2605,8 +2605,8 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned name
> /* if obj->header.type == GRN_TYPE ... lookup table */
> for (rp = &res; ; rp = &(*rp)->next) {
> grn_obj *column = grn_obj_column_(ctx, obj, name, len);
> - *rp = accessor_new(ctx);
> if (column) {
> + *rp = accessor_new(ctx);
> (*rp)->obj = column;
> /*
> switch (column->header.type) {
> @@ -2621,6 +2621,12 @@ grn_obj_get_accessor(grn_ctx *ctx, grn_obj *obj, const char *name, unsigned name
> (*rp)->action = GRN_ACCESSOR_GET_COLUMN_VALUE;
> break;
> } else {
> + if (!obj->header.domain) {
> + ERR(GRN_INVALID_ARGUMENT, "no such column: <%s>", name);
> + res = NULL;
> + goto exit;
> + }
> + *rp = accessor_new(ctx);
> (*rp)->obj = obj;
> obj = grn_ctx_at(ctx, obj->header.domain);
> switch (obj->header.type) {
> diff --git a/test/unit/core/test-table.c b/test/unit/core/test-table.c
> index e82824c..b68f212 100644
> --- a/test/unit/core/test-table.c
> +++ b/test/unit/core/test-table.c
> @@ -32,6 +32,7 @@ void data_temporary_table_default_tokenizer(void);
> void test_temporary_table_default_tokenizer(gpointer data);
> void data_temporary_table_add(void);
> void test_temporary_table_add(gpointer data);
> +void test_nonexistent_column(void);
>
> static grn_logger_info *logger;
> static grn_ctx context;
> @@ -152,3 +153,22 @@ test_temporary_table_add(gpointer data)
>
> cut_assert_equal_int(1, grn_table_size(&context, table));
> }
> +
> +void
> +test_nonexistent_column(void)
> +{
> + grn_obj *table;
> + char table_name[] = "users";
> + char nonexistent_column_name[] = "nonexistent";
> +
> + table = grn_table_create(&context, table_name, strlen(table_name),
> + NULL,
> + GRN_OBJ_TABLE_NO_KEY,
> + NULL, NULL);
> + grn_test_assert_null(&context,
> + grn_obj_column(&context, table,
> + nonexistent_column_name,
> + strlen(nonexistent_column_name)));
> + grn_test_assert_error(GRN_INVALID_ARGUMENT, "no such column: <nonexistent>",
> + &context);
> +}
> diff --git a/test/unit/lib/grn-assertions.c b/test/unit/lib/grn-assertions.c
> index acafa69..be87970 100644
> --- a/test/unit/lib/grn-assertions.c
> +++ b/test/unit/lib/grn-assertions.c
> @@ -98,6 +98,31 @@ grn_test_assert_context_helper (grn_ctx *context, const gchar *expression)
> }
>
> void
> +grn_test_assert_error_helper (grn_rc expected_rc, const gchar *expected_message,
> + grn_ctx *context, const gchar *expression)
> +{
> + if (!context) {
> + cut_set_message("context should not NULL");
> + cut_assert_null_helper(context, expression);
> + } else if (context->rc == expected_rc &&
> + cut_equal_string(expected_message, context->errbuf)) {
> + cut_test_pass();
> + } else {
> + cut_test_fail(cut_take_printf("<%s>\n"
> + "expected: <%s>(%s)\n"
> + " actual: <%s>(%s)\n"
> + "%s:%d: %s():",
> + expression,
> + expected_message,
> + grn_rc_to_string(expected_rc),
> + context->errbuf,
> + grn_rc_to_string(context->rc),
> + context->errfile, context->errline,
> + context->errfunc));
> + }
> +}
> +
> +void
> grn_test_assert_null_helper (grn_ctx *context,
> grn_obj *object, const gchar *expression)
> {
> diff --git a/test/unit/lib/grn-assertions.h b/test/unit/lib/grn-assertions.h
> index b29aefb..9f45ded 100644
> --- a/test/unit/lib/grn-assertions.h
> +++ b/test/unit/lib/grn-assertions.h
> @@ -42,10 +42,15 @@
> grn_test_assert_not_nil_helper((expression), #expression), \
> grn_test_assert_not_nil(expression))
>
> -#define grn_test_assert_context(expression) \
> +#define grn_test_assert_context(context) \
> cut_trace_with_info_expression( \
> - grn_test_assert_context_helper((expression), #expression), \
> - grn_test_assert_context(expression))
> + grn_test_assert_context_helper((context), #context), \
> + grn_test_assert_context(context))
> +
> +#define grn_test_assert_error(rc, message, context) \
> + cut_trace_with_info_expression( \
> + grn_test_assert_error_helper((rc), (message), (context), #context), \
> + grn_test_assert_error(context))
>
> #define grn_test_assert_null(context, object) \
> cut_trace_with_info_expression( \
> @@ -71,6 +76,10 @@ void grn_test_assert_not_nil_helper (grn_id id,
> const gchar *expression);
> void grn_test_assert_context_helper (grn_ctx *context,
> const gchar *expression);
> +void grn_test_assert_error_helper (grn_rc expected_rc,
> + const gchar *expected_message,
> + grn_ctx *context,
> + const gchar *expression);
> void grn_test_assert_null_helper (grn_ctx *context,
> grn_obj *object,
> const gchar *expression);
>
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
>
--
morita