Bug #1670

複合index利用時にWHERE条件「<」が正常に動作しない

Added by Kentoku SHIBA over 5 years ago. Updated over 5 years ago.

Status:完了チェック待ちStart date:03/15/2013
Priority:NormalDue date:
Assignee:Kentoku SHIBA% Done:

80%

Category:-
Target version:-

Description

久しぶりに投稿します。堀越と申します。

以下の環境にて、二つのsmallintにまたがる複合indexを使った際、
少なり(less than)のクエリだけ期待通りに動かない問題がありましたのでご報告です。

環境)
CentOS 6.3 (64bit)
groonga.x86_64   3.0.1-1.el6_9.wing
mysql56-mroonga.x86_64   3.01-1.el6_10.wing
(WING☆さん、いつもありがとうございます)

SCHEMA)
CREATE TABLE test (
  id int unsigned, primary key auto_increment,
  word text,
  year smallint unsigned,
  month smallint unsigned,
  fulltext index(word),
  index `ym` (year,month)) ENGINE=mroonga default charset utf8;

DATA)
INSERT INTO test (word,year,month) VALUES
('abc',1999,1),('def',2000,1),('ghi',2001,1),('jkl',2002,1);

正常)
mysql> SELECT * FROM test WHERE year > 2000;
+----+------+------+-------+
| id | word | year | month |
+----+------+------+-------+
|  3 | ghi  | 2001 |     1 |
|  4 | jkl  | 2002 |     1 |
+----+------+------+-------+
2 rows in set (0.01 sec)

異常)
mysql> SELECT * FROM test WHERE year < 2000;
Empty set (0.01 sec)


なお、以下のように複合indexでなかった場合は再現しません。
SCHEMA)
CREATE TABLE TEST (
  id int unsigned, primary key auto_increment,
  word text,
  year smallint unsigned,
  month smallint unsigned,
  fulltext index(word),
  index `year` (year),  #分割
  index `month` (month) #分割
) ENGINE=mroonga default charset utf8;

正常)
mysql> SELECT * FROM test WHERE year < 2000;
+----+------+------+-------+
| id | word | year | month |
+----+------+------+-------+
|  1 | abc  | 1999 |     1 |
+----+------+------+-------+
1 row in set (0.01 sec)

一応手元の環境では100%の再現性があるようでしたが、
他に必要な情報などあればお知らせください。

複合indexを使わなければ問題なさそうなので緊急性は低そうですが
ご確認の程、何卒よろしくお願いいたします。

History

#1 Updated by Kentoku SHIBA over 5 years ago

  • Status changed from 担当者作業中 to 完了チェック待ち
  • % Done changed from 10 to 80

確認を進めたところ、not null属性がないカラムの複合キーインデックスで 同様の現象となっていた。 groongaのストレージモードでは、現在nullをサポートしていないため、 複合キー変換ロジックでnullを無視するように修正した。

Also available in: Atom PDF