[groonga-dev,04876] Re: Mroongaバグ報告(6)

Back to archive index
Horimoto Yasuhiro horim****@clear*****
2021年 7月 6日 (火) 16:28:20 JST


堀本です。

原因と対処方法がわかったので、報告いたします。
原因はMroongaのバグでした。

以下の提示いただいたクエリーを実行した際
MariaDBのオプティマイザーは、IN句内のサブクエリーを実行した結果のテーブルと
IN句の外側のテーブル(Posts)テーブルをSEMI JOINで結合します。

SELECT Id, ChannelId, RootId
   FROM Posts p3
  WHERE Id IN (
   SELECT * FROM
     (SELECT RootId
        FROM Posts
       WHERE UpdateAt > 1617352409099 AND
             ChannelId = 'i9rsh6im4ffepfpdgm51hjze3a'
       LIMIT 1000)
    temp_tab);

IN句の中のサブクエリーの結果は以下のようになり、
以下の表の値と、Posts.Idの値が同じレコードを抽出します。

つまり、''(空文字)と"twn3smcaei8wjbqsm8bcmo8qah"と一致する
Posts.Idを持つレコードを抽出します。

+----------------------------+
| RootId                     |
+----------------------------+
|                            |
|                            |
|                            |
|                            |
|                            |
|                            |
| twn3smcaei8wjbqsm8bcmo8qah |
|                            |
|                            |
|                            |
|                            |
|                            |
|                            |
|                            |
|                            |
|                            |
|                            |
|                            |
|                            |
|                            |
+----------------------------+
20 rows in set (0.001 sec)

この時、Mroongaを使用していると、''と一致するレコードとして
任意のIDを持つレコードを抽出してしまい、意図しないIDのレコードが結果に含まれてしまいます。
InnoDBでは、再現しないため、Mroonga特有の問題です。

Mroongaを修正しますが、さしあたっては以下の対処方法で
正しい結果が得られます。

今回の問題は、''のような空文字のレコードを持つ表との結合
で発生します。したがって、''のようなレコードが含まれないように
することで現象の発生を防げます。

RootIdはIdと比較しており、IdはNOT NULL属性なので、RootIdが''なレコード
は除外しても問題ないと考えます。

そのため、問題のクエリーのIN句の中のサブクエリーに
以下のように、RootId <> ''を追加してRootIdが''なレコードを除外します。
このようにすることで、期待する結果が得られます。

SELECT Id, ChannelId, RootId
   FROM Posts p3
  WHERE Id IN (
   SELECT * FROM
     (SELECT RootId
        FROM Posts
       WHERE UpdateAt > 1617352409099 AND
             ChannelId = 'i9rsh6im4ffepfpdgm51hjze3a' AND
             RootId <> ''
       LIMIT 1000)
    temp_tab);

Mroongaの修正が完了しましたら、また改めて連絡します。

以上です。失礼いたします。

From: 渡部克仁 <watan****@ksw*****>
Subject: [groonga-dev,04875] Mroongaバグ報告(6)
Date: Mon, 5 Jul 2021 13:13:26 +0900

> 【秘密】関係者外秘
> To:堀本様
> 
> 渡部@国際ソフトウェアと申します。
> 
> 状況をお知らせいただきありがとうございます。
> 再現でき調査中とのこと、承知いたしました。
> 
> 申し訳ありませんが、引き続きよろしくお願いいたします。
> 
> 
> On 2021/07/05 12:00, groon****@lists***** wrote:
>> groonga-dev
>> メーリングリストへの投稿は以下のアドレスに送ってください.
>> 	groon****@lists*****
>> Webブラウザを使って入退会するには以下のURLにどうぞ.
>> 	https://lists.osdn.me/mailman/listinfo/groonga-dev
>> メールを使う場合,件名(Subject:)または本文に help
>> と書いて以下の アドレスに送信してください.
>> 	groon****@lists*****
>> メーリングリストの管理者への連絡は,以下のアドレスにお願いします.
>> 	groon****@lists*****
>> 返信する場合,件名を書き直して内容がわかるようにしてください.
>> そのままだと,以下のようになってしまいます.
>> "Re: groonga-dev まとめ読み, XX 巻 XX 号"
>> 本日の話題:
>>     1. [groonga-dev,04874] Re: Mroongaバグ報告(5) (Horimoto Yasuhiro)
>> ----------------------------------------------------------------------
>> Message: 1
>> Date: Mon, 05 Jul 2021 10:44:44 +0900 (JST)
>> From: Horimoto Yasuhiro <horim****@clear*****>
>> To: groon****@lists*****
>> Subject: [groonga-dev,04874] Re: Mroongaバグ報告(5)
>> Message-ID:
>> 	<20210****@clear*****>
>> Content-Type: Text/Plain; charset=utf-8
>> 堀本と申します。
>> こちらですが、頂いたデータで再現できました。ありがとうございます。
>> 現在、原因を調査中ですので、もう少々お待ちください。
>> 以上です。失礼いたします。
>> From: 渡部克仁 <watan****@ksw*****>
>> Subject: [groonga-dev,04873] Mroongaバグ報告(5)
>> Date: Fri, 2 Jul 2021 13:27:17 +0900
>> 
>>> 【秘密】関係者外秘
>>> To:須藤様
>>>
>>> 渡部@国際ソフトウェアと申します。
>>>
>>> 6/18(金)に下記データを提出させていただきましたが、
>>> その後の状況はいかがでしょうか。
>>> 進展の有無に関わらずお知らせいただければ幸いです。
>>>
>>> ご多忙中の所、恐れ入りますがよろしくお願いいたします。
>>>
>>>
>>> On 2021/06/18 10:48, 渡部克仁 wrote:
>>>> 【秘密】関係者外秘
>>>> To:須藤様
>>>> 渡部@国際ソフトウェアと申します。
>>>> ご返信ありがとうございます。
>>>> ご質問の件、以下にご回答いたします。
>>>>> ↓で再現するということなのでId, ChannelId, RootId, UpdateAt,
>>>>> ChannelIdのカラムだけあると再現データを作れそうなのですが、
>>>>> そのデータだけ提供してもらうことはできますか?
>>>>>
>>>>> SELECT Id, ChannelId, RootId
>>>>>     FROM Posts p3
>>>>>    WHERE Id IN (
>>>>>     SELECT * FROM
>>>>>       (SELECT RootId
>>>>>          FROM Posts
>>>>>         WHERE UpdateAt > 1617352409099 AND
>>>>>               ChannelId = 'i9rsh6im4ffepfpdgm51hjze3a'
>>>>>         LIMIT 1000)
>>>>>      temp_tab);
>>>>>
>>>> 以下のクエリーの実行結果を送付いたします。
>>>> SELECT Id, ChannelId, RootId, UpdateAt FROM Posts;
>>>> 以上、よろしくお願いいたします。
>>>
>>> _______________________________________________
>>> groonga-dev mailing list
>>> groon****@lists*****
>>> https://lists.osdn.me/mailman/listinfo/groonga-dev
>> ------------------------------
>> Subject: まとめ読みフッタ
>> _______________________________________________
>> groonga-dev mailing list
>> groon****@lists*****
>> https://lists.osdn.me/mailman/listinfo/groonga-dev
>> ------------------------------
>> 以上: groonga-dev まとめ読み, 149 巻, 2 号
>> ***************************************************
>> 
> 
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> https://lists.osdn.me/mailman/listinfo/groonga-dev


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