[groonga-dev,03179] Re: mroongaで同一レコードの登録、削除、登録を行うとユニークキー重複エラー発生

Back to archive index

Kouhei Sutou kou****@clear*****
2015年 4月 20日 (月) 23:00:11 JST


須藤です。

報告ありがとうございます。

これは、Groongaのパトリシアトライの実装のバグっぽいですね。。。

森さん、masterにこのケースのテストを追加しておいたので確認し
てもらえませんか?
  https://github.com/groonga/groonga/blob/master/test/command/suite/tables/patricia_trie/delete.expected

↓を実行すると_grn_pat_del()で

  % test/command/run-test.sh test/command/suite/tables/patricia_trie/delete.test 

↓というエラーがでるようになります。

  no delinfo found 3

これ、"3"というキーを_grn_pat_add()するときが問題な気がする
んですよねぇ。

個人的には↓かなぁと思うんですが、pat_nodeがterminatedなのっ
てこういう状況のときのことをいうのかよくわかっていません。

diff --git a/lib/pat.c b/lib/pat.c
index c5dacc0..afa8957 100644
--- a/lib/pat.c
+++ b/lib/pat.c
@@ -667,6 +667,9 @@ _grn_pat_add(grn_ctx *ctx, grn_pat *pat, const uint8_t *key, uint32_t size, uint
       for (c = 0, d = key; min && *s == *d; c += 16, s++, d++, min--);
       if (min) {
         for (xor = *s ^ *d, mask = 0x80; !(xor & mask); mask >>= 1, c += 2);
+        if (min == 1 && mask == (0x80 >> 7)) {
+          c++;
+        }
       } else {
         c--;
       }


In <CAPYq****@mail*****>
  "[groonga-dev,03177] mroongaで同一レコードの登録、削除、登録を行うとユニークキー重複エラー発生" on Mon, 20 Apr 2015 11:57:15 +0900,
  yuya sako <ysgon****@gmail*****> wrote:

> ※先日、当MLに投稿いたしましたが、過去ログを確認しましたところ、
>  4/19時点で投稿内容が残ってりませんでした為、念のため再投稿させていた
> だきます。
> 
> mroongaを使い始めた者なのですが、下記事象が発生いたしました。
> 使い方に問題があるものなのかどうか等、ご教示頂けますと助かります。
> 
> お手数をおかけいたしますが、よろしくお願いいたします。
> 
> [事象]
> 複数レコードをINSERT
>> INSERTしたレコードを全てDELETE
>> 再度同じレコードをINSERT
> 
> を行うと、そのうち1件で下記エラーが発生いたします。
> 
> ERROR 1062 (23000): Duplicate entry 'カラムの値' for key 'uid'
> 
> ※再現手順を下記に記載いたしました。
> 
> [使用環境]
> # uname -a
> Linux localhost1.local 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42
> UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
> 
> # mysql --version
> mysql Ver 14.14 Distrib 5.6.23, for Linux (x86_64) using EditLine
> wrapper
> 
> mysql> show variables like '%mroonga%';
> +----------------------------------------+---------------+
> | Variable_name | Value |
> +----------------------------------------+---------------+
> | mroonga_action_on_fulltext_query_error | ERROR_AND_LOG |
> | mroonga_boolean_mode_syntax_flags | DEFAULT |
> | mroonga_database_path_prefix | |
> | mroonga_default_parser | TokenBigram |
> | mroonga_default_wrapper_engine | |
> | mroonga_dry_write | OFF |
> | mroonga_enable_optimization | ON |
> | mroonga_libgroonga_support_lz4 | OFF |
> | mroonga_libgroonga_support_zlib | ON |
> | mroonga_libgroonga_version | 5.0.2 |
> | mroonga_lock_timeout | 10000000 |
> | mroonga_log_file | groonga.log |
> | mroonga_log_level | NOTICE |
> | mroonga_match_escalation_threshold | 0 |
> | mroonga_vector_column_delimiter | |
> | mroonga_version | 5.01 |
> +----------------------------------------+---------------+
> 
> [再現手順]
> (1)テーブルの作成
> 
> CREATE TABLE `uk_test` (
> id int(10) unsigned not null,
> uid varchar(150) not null,
> data text not null,
> primary key (id),
> unique key uid (uid)
> ) ENGINE=mroonga DEFAULT CHARSET=utf8;
> 
> (2)データをINSERT
> INSERT INTO uk_test (id,uid, data) VALUES (1,'uid2','');
> INSERT INTO uk_test (id,uid, data) VALUES (2,'uid1','');
> INSERT INTO uk_test (id,uid, data) VALUES (3,'uid3','');
> INSERT INTO uk_test (id,uid, data) VALUES (4,'uid4','');
> 
> (3)データをDELETE
> DELETE FROM uk_test WHERE `id`='1';
> DELETE FROM uk_test WHERE `id`='2';
> DELETE FROM uk_test WHERE `id`='3';
> DELETE FROM uk_test WHERE `id`='4';
> 
> (4)上記(2)と同じデータをINSERT
> INSERT INTO uk_test (id,uid, data) VALUES (1,'uid2','');
> INSERT INTO uk_test (id,uid, data) VALUES (2,'uid1','');
> INSERT INTO uk_test (id,uid, data) VALUES (3,'uid3','');
> INSERT INTO uk_test (id,uid, data) VALUES (4,'uid4','');
> 
> [補足-1]
> 上記(2)、(4)で実行するINSER文を下記にしますと、事象が再現しなくなりま
> す。
> INSERT INTO uk_test (id,uid, data) VALUES (1,'uid1','');
> INSERT INTO uk_test (id,uid, data) VALUES (2,'uid2','');
> INSERT INTO uk_test (id,uid, data) VALUES (3,'uid3','');
> INSERT INTO uk_test (id,uid, data) VALUES (4,'uid4','');
> 
> [補足-2]
> 上記(2)、(4)で実行するINSER文は下記3件でも、事象が再現いたします。
> INSERT INTO uk_test (id,uid, data) VALUES (1,'uid2','');
> INSERT INTO uk_test (id,uid, data) VALUES (2,'uid1','');
> INSERT INTO uk_test (id,uid, data) VALUES (3,'uid3','');
> 
> 以上よろしくお願いいたします。
> 
> -------------------------------------------------
> 酒匂祐也
> ysgon****@gmail*****




groonga-dev メーリングリストの案内
Back to archive index