null+****@clear*****
null+****@clear*****
2011年 6月 6日 (月) 17:30:27 JST
Kouhei Sutou 2011-06-06 08:30:27 +0000 (Mon, 06 Jun 2011) New Revision: f5206ac6f757a0de436ed15f622dfe28ba56fe70 Log: [column][create] add error value to error message on too long name. refs #952 Modified files: lib/db.c test/unit/core/test-command-column-create.c test/unit/lib/grn-test-utils.c test/unit/lib/grn-test-utils.h Modified: lib/db.c (+16 -4) =================================================================== --- lib/db.c 2011-06-06 08:00:37 +0000 (44d8629) +++ lib/db.c 2011-06-06 08:30:27 +0000 (389711e) @@ -2817,17 +2817,25 @@ grn_column_create(grn_ctx *ctx, grn_obj *table, db = DB_OBJ(table)->db; s = (grn_db *)db; if (!GRN_DB_P(s)) { - ERR(GRN_INVALID_ARGUMENT, "invalid db assigned"); + int table_name_len; + char table_name[GRN_PAT_MAX_KEY_SIZE]; + table_name_len = grn_obj_name(ctx, table, table_name, GRN_PAT_MAX_KEY_SIZE); + ERR(GRN_INVALID_ARGUMENT, + "[column][create]: invalid db assigned: <%.*s>.<%.*s>", + table_name_len, table_name, name_size, name); goto exit; } if (DB_OBJ(table)->id & GRN_OBJ_TMP_OBJECT) { - ERR(GRN_INVALID_ARGUMENT, "temporary table doesn't support column"); + ERR(GRN_INVALID_ARGUMENT, + "[column][create]: temporary table doesn't support column: <%.*s>", + name_size, name); goto exit; } { uint32_t s = 0; const char *n = _grn_table_key(ctx, ctx->impl->db, DB_OBJ(table)->id, &s); - GRN_LOG(ctx, GRN_LOG_NOTICE, "DDL:column_create %.*s %.*s", s, n, name_size, name); + GRN_LOG(ctx, GRN_LOG_NOTICE, + "DDL:column_create %.*s %.*s", s, n, name_size, name); } if (grn_db_check_name(ctx, name, name_size)) { GRN_DB_CHECK_NAME_ERR("[column][create]", name, name_size); @@ -2837,7 +2845,11 @@ grn_column_create(grn_ctx *ctx, grn_obj *table, int len = grn_pat_get_key(ctx, s->keys, domain, fullname, GRN_PAT_MAX_KEY_SIZE); if (name_size + 1 + len > GRN_PAT_MAX_KEY_SIZE) { - ERR(GRN_INVALID_ARGUMENT, "too long column name"); + ERR(GRN_INVALID_ARGUMENT, + "[column][create]: too long column name: required name_size(%d) < %d" + ": <%.*s>.<%.*s>", + name_size, GRN_PAT_MAX_KEY_SIZE - 1 - len, + len, fullname, name_size, name); goto exit; } fullname[len] = GRN_DB_DELIMITER; Modified: test/unit/core/test-command-column-create.c (+23 -0) =================================================================== --- test/unit/core/test-command-column-create.c 2011-06-06 08:00:37 +0000 (68b7fa3) +++ test/unit/core/test-command-column-create.c 2011-06-06 08:30:27 +0000 (965be00) @@ -25,6 +25,7 @@ void test_invalid_name(void); void test_missing_name(void); +void test_too_long_name(void); void test_nonexistent_table(void); void test_nonexistent_type(void); @@ -103,6 +104,28 @@ test_missing_name(void) } void +test_too_long_name(void) +{ + GString *command, *long_name; + + long_name = grn_long_name_new(4096 - strlen("Users")); + gcut_take_string(long_name); + command = gcut_take_new_string(""); + g_string_printf(command, + "column_create Users %s COLUMN_SCALAR ShortText", + long_name->str); + + assert_send_command("table_create Users"); + grn_test_assert_send_command_error( + context, + GRN_INVALID_ARGUMENT, + "[column][create]: too long column name" + ": required name_size(4091) < 4090" + ": <Users>.<aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeee", + command->str); +} + +void test_nonexistent_table(void) { grn_test_assert_send_command_error( Modified: test/unit/lib/grn-test-utils.c (+18 -0) =================================================================== --- test/unit/lib/grn-test-utils.c 2011-06-06 08:00:37 +0000 (34fdf65) +++ test/unit/lib/grn-test-utils.c 2011-06-06 08:30:27 +0000 (d2027a5) @@ -444,6 +444,24 @@ grn_long_path_new(const gchar *base_path, gssize max_size) return long_path; } +GString * +grn_long_name_new(gssize max_size) +{ + GString *long_name; + + long_name = g_string_new(NULL); + while (long_name->len < max_size) { + g_string_append(long_name, "aaaaaaaaaa"); + g_string_append(long_name, "bbbbbbbbbb"); + g_string_append(long_name, "cccccccccc"); + g_string_append(long_name, "dddddddddd"); + g_string_append(long_name, "eeeeeeeeee"); + } + g_string_set_size(long_name, max_size); + + return long_name; +} + GList * grn_test_pat_cursor_get_keys(grn_ctx *context, grn_table_cursor *cursor) { Modified: test/unit/lib/grn-test-utils.h (+1 -0) =================================================================== --- test/unit/lib/grn-test-utils.h 2011-06-06 08:00:37 +0000 (25e6ddb) +++ test/unit/lib/grn-test-utils.h 2011-06-06 08:30:27 +0000 (71774dc) @@ -63,6 +63,7 @@ void teardown_grn_logger (grn_logger_info *logger); GString *grn_long_path_new (const gchar *base_path, gssize max_size); +GString *grn_long_name_new (gssize max_size); GList *grn_test_pat_cursor_get_keys (grn_ctx *context, grn_table_cursor *cursor);