[Groonga-commit] groonga/groonga [master] grn_pat_at() can't detect encoded key entry. #514

Back to archive index

null+****@clear***** null+****@clear*****
2010年 9月 15日 (水) 14:09:48 JST


Kouhei Sutou	2010-09-15 05:09:48 +0000 (Wed, 15 Sep 2010)

  New Revision: ecebc81a986df02439b3cd62207cbaad9b01f644

  Log:
    grn_pat_at() can't detect encoded key entry. #514

  Modified files:
    lib/pat.c
    test/unit/core/test-patricia-trie.c

  Modified: lib/pat.c (+11 -5)
===================================================================
--- lib/pat.c    2010-09-15 06:14:30 +0000 (63aaae7)
+++ lib/pat.c    2010-09-15 05:09:48 +0000 (3b08811)
@@ -793,15 +793,13 @@ grn_pat_add(grn_ctx *ctx, grn_pat *pat, const void *key, uint32_t key_size,
   return r0;
 }
 
-grn_id
-grn_pat_get(grn_ctx *ctx, grn_pat *pat, const void *key, uint32_t key_size, void **value)
+inline static grn_id
+_grn_pat_get(grn_ctx *ctx, grn_pat *pat, const void *key, uint32_t key_size, void **value)
 {
   grn_id r;
   pat_node *rn;
   int c0 = -1, c;
   uint32_t len = key_size * 16;
-  uint8_t keybuf[MAX_FIXED_KEY_SIZE];
-  KEY_ENCODE(pat, keybuf, key, key_size);
   PAT_AT(pat, 0, rn);
   for (r = rn->lr[1]; r;) {
     PAT_AT(pat, r, rn);
@@ -834,6 +832,14 @@ grn_pat_get(grn_ctx *ctx, grn_pat *pat, const void *key, uint32_t key_size, void
 }
 
 grn_id
+grn_pat_get(grn_ctx *ctx, grn_pat *pat, const void *key, uint32_t key_size, void **value)
+{
+  uint8_t keybuf[MAX_FIXED_KEY_SIZE];
+  KEY_ENCODE(pat, keybuf, key, key_size);
+  return _grn_pat_get(ctx, pat, key, key_size, value);
+}
+
+grn_id
 grn_pat_nextid(grn_ctx *ctx, grn_pat *pat, const void *key, uint32_t key_size)
 {
   grn_id r = GRN_ID_NIL;
@@ -1427,7 +1433,7 @@ grn_pat_at(grn_ctx *ctx, grn_pat *pat, grn_id id)
 {
   uint32_t key_size;
   const char *key = _grn_pat_key(ctx, pat, id, &key_size);
-  if (id == grn_pat_get(ctx, pat, key, key_size, NULL)) { return id; }
+  if (id == _grn_pat_get(ctx, pat, key, key_size, NULL)) { return id; }
   return GRN_ID_NIL;
 }
 

  Modified: test/unit/core/test-patricia-trie.c (+55 -2)
===================================================================
--- test/unit/core/test-patricia-trie.c    2010-09-15 06:14:30 +0000 (b3ec3bd)
+++ test/unit/core/test-patricia-trie.c    2010-09-15 05:09:48 +0000 (d7c1194)
@@ -44,11 +44,12 @@ void test_set_value(void);
 void test_set_value_with_null_value(void);
 void data_add_and_delete(void);
 void test_add_and_delete(gconstpointer data);
-void data_truncate(void);
-void test_truncate(gconstpointer data);
+void data_at(void);
+void test_at(gconstpointer data);
 
 static GArray *ids;
 static GList *expected_keys, *actual_keys;
+static grn_obj *database;
 
 void
 cut_setup(void)
@@ -786,3 +787,55 @@ test_truncate(gconstpointer data)
   grn_test_assert(grn_pat_truncate(context, trie));
   cut_assert_equal_uint(0, grn_pat_size(context, trie));
 }
+
+void
+data_at(void)
+{
+#define ADD_DATUM(label, commands)                      \
+  gcut_add_datum(label,                                 \
+                 "commands", G_TYPE_STRING, commands,   \
+                 NULL)
+
+  ADD_DATUM("Int32",
+            "table_create Pat TABLE_PAT_KEY Int32\n"
+            "load --table Pat\n"
+            "[{\"_key\": -29}]");
+  ADD_DATUM("UInt32",
+            "table_create Pat TABLE_PAT_KEY UInt32\n"
+            "load --table Pat\n"
+            "[{\"_key\": 29}]");
+  ADD_DATUM("GeoPoint",
+            "table_create Pat TABLE_PAT_KEY TokyoGeoPoint\n"
+            "load --table Pat\n"
+            "[{\"_key\": \"128467228x503222332\"}]");
+  ADD_DATUM("ShortText",
+            "table_create Pat TABLE_PAT_KEY ShortText\n"
+            "load --table Pat\n"
+            "[{\"_key\": \"niku\"}]");
+
+#undef ADD_DATUM
+}
+
+void
+test_at(gconstpointer data)
+{
+  grn_obj *pat;
+
+  cut_assert_open_context();
+
+  database = grn_db_create(context,
+                           cut_build_path(grn_test_get_tmp_dir(),
+                                          "patricia-trie.db",
+                                          NULL),
+                           NULL);
+  grn_test_assert_context(context);
+
+  assert_send_commands(gcut_data_get_string(data, "commands"));
+  pat = grn_ctx_get(context, "Pat", strlen("Pat"));
+  grn_test_assert_equal_id(context,
+                           1,
+                           grn_pat_at(context, (grn_pat *)pat, 1));
+  grn_test_assert_equal_id(context,
+                           0,
+                           grn_pat_at(context, (grn_pat *)pat, 2));
+}




Groonga-commit メーリングリストの案内
Back to archive index