timestamptz型での不等号比較結果が不正となる
Closed this issue · 5 comments
0-kaz commented
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;
kaigai commented
b07d6429ee8fd5e9d630ca936043077aadf026e8
で修正しました。ポカミスでしたね。。。
0-kaz commented
ご対応ありがとうございました。
上記の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;
0-kaz commented
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;
kaigai commented
面目ない。
timestamptz - timestampの比較は、timestampをtimestamptzに直す時になぜか数値を100万倍していた事。
intervalの比較は、128bit値の比較をそのまま32bitにキャストしていた事によるビット落ちぽいです。
77f87215c9f2b045937ce282f68bec590b724b8b
で直しました。
0-kaz commented
ありがとうございました。修正確認できました。