[groonga-dev,00381] Re: 大きなint64整数の比較で不具合

Back to archive index

morit****@razil***** morit****@razil*****
2010年 10月 14日 (木) 18:58:34 JST


森です。

ご不便をおかけしています。

queryパラメータで「カラム名:演算子 引数」のような記述をした場合、
引数は全て文字列リテラルが指定されたものと見なしています。

そして、数値カラムの値と文字列値とを比較する時の型キャストのロジックが
徹底されていないためにこのような挙動となっています。

queryパラメータの代わりにfilterパラメータを使用して、
以下のように記述すると、期待されている通りに動作すると思います。

select --table Test --filter 'int64 <= 344494643000000'

ちなみに、

select --table Test --query int64:<=344494643000000

というクエリは、

select --table Test --filter 'int64 <= "344494643000000"'

と等価に扱われています。

いずれの記述でも正しく動作するように改良したいと思います。

以上どうぞよろしくお願いします。

>>> Itagaki Takahiro wrote,
> 板垣です。
> 
> Int64 型の列を一致以外の条件で検索すると、結果が正しくないケースがあるようです。
> 小さな整数 (123 など) では期待通りに動作するようなので、
> 例えば 32bit を超える範囲でのみ発生するのかもしれません。
> 
> タイムスタンプを格納しようとした際に見つけました。
> エポックからのマイクロ秒で表現すると、これくらいの大きな値になります。
> 
> ----
> table_create --name Test --flags TABLE_HASH_KEY --key_type ShortText
> column_create --table Test --name int64 --flags COLUMN_SCALAR --type Int64
> load --table Test
> [
> {"_key":"A","int64":344494643000000}
> ]
> select --table Test --query int64:344494643000000
> → 結果:1件
> select --table Test --query int64:<=344494643000000
> → 結果:0件
> ----
> 
> $ groonga --version
> groonga 1.0.2-122-g6e5c0fd
> [linux-gnu,x86_64,utf8,query-cache=0s,nfkc,mecab,epoll]
> configure options: < '--without-mecab'>
> 
> -- 
> Itagaki Takahiro
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
> 
--
morita




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