[Groonga-commit] groonga/groonga [master] [column][create] add error value to error message on too long name. refs #952

アーカイブの一覧に戻る

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);




Groonga-commit メーリングリストの案内
アーカイブの一覧に戻る