heterodb/pg-strom

timestamptz型での不等号比較結果が不正となる

Closed this issue · 5 comments

timestamptz型とdate型を<(不等号)で比較したときの結果が稀に不正となる。

SELECT id, tz1,d1, tz1 < d1 as v1 FROM rt_time WHERE id > 0;

結果:

  id  |              tz1              |     d1     | v1 
------+-------------------------------+------------+----
  545 | 2018-06-09 17:26:12.967818+09 | 2022-01-28 | f     ←tが正しい
  546 | 2023-03-01 02:17:07.406881+09 | 2024-09-06 | f     ←tが正しい
  547 | 2018-08-19 00:05:25.906719+09 | 2021-05-13 | f     ←tが正しい
  548 | 2022-03-21 16:09:39.214264+09 | 2021-03-01 | f     ←tが正しい
  549 | 2018-12-10 12:05:39.730078+09 | 2020-11-21 | f     ←tが正しい
  550 | 2015-08-04 23:25:00.273195+09 | 2020-12-30 | f     ←tが正しい
  551 | 2021-10-04 18:36:43.350681+09 | 2018-09-21 | f     ←これは正解
  552 | 2017-06-20 03:40:50.9251+09   | 2019-11-24 | f     ←tが正しい
DROP TABLE IF EXISTS rt_time;
CREATE TABLE rt_time (
  id   int,
  tz1    timestamptz,
  d1      date
);
SET timezone = 'Japan';
INSERT INTO rt_time (
  SELECT x
  ,pgstrom.random_timestamp(1.0)
  ,pgstrom.random_date(1.0)
    FROM generate_series(1,2000) x);

SET pg_strom.enabled=on;
SELECT id, tz1 < d1 as v1 
into testcompg
FROM rt_time WHERE id > 0;

SET pg_strom.enabled=off;
SELECT id, tz1 < d1 as v1 
into testcompp
FROM rt_time WHERE id > 0;

SELECT g.*,p.* FROM testcompg g,testcompp p WHERE g.id = p.id AND g.v1 <> p.v1;

b07d6429ee8fd5e9d630ca936043077aadf026e8 で修正しました。ポカミスでしたね。。。

ご対応ありがとうございました。
上記のdate型とtimestamptz型の組み合わせでは解消確認しました。
一方で、timestamp型とtimestamptz型の組み合わせでも発生していることを確認しました。ご確認お願い致します。

SELECT id, ts1,tsz2,ts1 <  tsz2    
  FROM rt_datetime                                       
 WHERE id > 0;
  id  |            ts1             |             tsz2              | ?column? 
------+----------------------------+-------------------------------+----------
 1025 | 2016-06-24 21:46:55.412984 | 2021-09-08 13:35:53.00953+02  | f
 1026 | 2018-03-23 20:41:48.97202  | 2017-12-14 18:40:12.230925+01 | f
 1027 | 2023-01-31 13:40:28.717413 | 2020-06-09 15:23:06.734837+02 | f
 1028 | 2023-10-25 17:37:18.622399 | 2024-12-11 03:33:39.02326+01  | t
 1029 | 2019-06-24 16:59:48.572025 | 2023-05-30 20:59:39.779876+02 | f
 1030 | 2021-08-24 02:59:42.90676  | 2018-03-12 09:24:15.606955+01 | f
 1031 | 2018-11-03 09:09:37.735531 | 2015-02-22 19:58:45.078272+01 | f
 1032 | 2021-01-15 02:02:59.76598  | 2015-11-18 15:49:24.88389+01  | t

全体クエリ

DROP TABLE IF EXISTS rt_time;
CREATE TABLE rt_time (
  id   int,
  tz1    timestamptz,
  ts1   timestamp    
);
INSERT INTO rt_time (
  SELECT x
  ,pgstrom.random_timestamp(1.0)
  ,pgstrom.random_timestamp(1.0)
    FROM generate_series(1,2000) x);

DROP TABLE IF EXISTS testcompg;
DROP TABLE IF EXISTS testcompp;

SET enable_seqscan=off;
SET timezone = 'Japan';

SET pg_strom.enabled=on;
SELECT id, tz1 < ts1 as v1 
into testcompg
FROM rt_time WHERE id > 0;

SET pg_strom.enabled=off;
SELECT id, tz1 < ts1 as v1 
into testcompp
FROM rt_time WHERE id > 0;

SELECT g.*,p.* FROM testcompg g,testcompp p WHERE g.id = p.id AND g.v1 <> p.v1;

interval型同士の比較でも同様の現象を確認しました。

DROP TABLE IF EXISTS rt_time;
CREATE TABLE rt_time (
  id   int,
  iv1    interval,
  iv2   interval    
);
INSERT INTO rt_time (
  SELECT x
  ,pgstrom.random_timestamp(0.5) - pgstrom.random_timestamp(0.5)
  ,pgstrom.random_timestamp(0.5) - pgstrom.random_timestamp(0.5)
    FROM generate_series(1,2000) x);

DROP TABLE IF EXISTS testcompg;
DROP TABLE IF EXISTS testcompp;

SET enable_seqscan=off;
SET timezone = 'Japan';

SET pg_strom.enabled=on;
SELECT id, iv1 < iv2 as v1 
into testcompg
FROM rt_time WHERE id > 0;

SET pg_strom.enabled=off;
SELECT id, iv1 < iv2 as v1 
into testcompp
FROM rt_time WHERE id > 0;

SELECT g.*,p.* FROM testcompg g,testcompp p WHERE g.id = p.id AND g.v1 <> p.v1;

面目ない。
timestamptz - timestampの比較は、timestampをtimestamptzに直す時になぜか数値を100万倍していた事。
intervalの比較は、128bit値の比較をそのまま32bitにキャストしていた事によるビット落ちぽいです。

77f87215c9f2b045937ce282f68bec590b724b8b で直しました。

ありがとうございました。修正確認できました。