heterodb/pg-strom

EXTRACTでnot a recognized unit name

Closed this issue · 8 comments

EXTRACTでmicrosecondsとmillisecondsを使用しようとするとエラーが生じます。

postgres=#  SELECT id, EXTRACT (milliseconds FROM t1) v1
postgres-#   FROM rt_datetime
postgres-#  WHERE id > 0;
ERROR:  xpu_timelib.cu:3314  not a recognized unit name
HINT:  device at GPU-0, function at extract_decode_unit

全体クエリ

DROP TABLE IF EXISTS rt_datetime;
CREATE TABLE rt_datetime (
  id      int,
  t1      time,
  t2      time,
  t3      time,
  t4      time
);

INSERT INTO rt_datetime (
  SELECT x, pgstrom.random_time(1.0),
            pgstrom.random_time(1.0),
            pgstrom.random_time(1.0),
            pgstrom.random_time(1.0)
    FROM generate_series(1, 1000000) AS x
);

SET pg_strom.enable_gpuscan = on;
EXPLAIN
SELECT id, EXTRACT (microseconds FROM t1) v1,
           EXTRACT (milliseconds FROM t2) v2,
           EXTRACT (second FROM t3) v3,
           EXTRACT (minute FROM t4) v4,
           EXTRACT (hour FROM t1) v5
  FROM rt_datetime
 WHERE id > 0;

c54b8fff6196ea1a8791dbc4422f200d3a50fb23 で修正しました。

unit-nameが10文字で定義されているので、strcmp()ではなくstrncmp()でなければダメという。。。

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

再度確認したところ、以下で同様のエラーが継続しておりました。

century, decade, day, dow, doy, isodow,isoyear, month, quarter, timezone, timezone_hour, timezone_minute, week,year

postgres=# SELECT id, EXTRACT (century         FROM t1) v1
postgres-#   FROM rt_datetime
postgres-#  WHERE id > 0;
postgres=# SELECT id, EXTRACT (decade          FROM t1) v3 FROM rt_dat
etime WHERE id > 0;
ERROR:  xpu_timelib.cu:3735  unsupported unit of time
HINT:  device at GPU-0, function at pgfn_extract_time
postgres=# SELECT id, EXTRACT (day FROM t1) v3 FROM rt_datetime WHERE 
id > 0;
ERROR:  xpu_timelib.cu:3735  unsupported unit of time
HINT:  device at GPU-0, function at pgfn_extract_time
postgres=# SELECT id, EXTRACT (decade FROM t1) v3 FROM rt_datetime WHE
RE id > 0;
ERROR:  xpu_timelib.cu:3735  unsupported unit of time
HINT:  device at GPU-0, function at pgfn_extract_time
postgres=# SELECT id, EXTRACT (dow FROM t1) v3 FROM rt_datetime WHERE 
id > 0;
ERROR:  xpu_timelib.cu:3735  unsupported unit of time
HINT:  device at GPU-0, function at pgfn_extract_time
postgres=# SELECT id, EXTRACT (doy FROM t1) v3 FROM rt_datetime WHERE 
id > 0;
ERROR:  xpu_timelib.cu:3735  unsupported unit of time
HINT:  device at GPU-0, function at pgfn_extract_time
postgres=# SELECT id, EXTRACT (epoch FROM t1) v3 FROM rt_datetime WHER
E id > 0;

こちら、time型ではdowとかdecadeとかの単位がサポートされていないので、意図した動作ですね。
(意図しない動作でエラーが発生する事を regression test に含めておくのは大変よいと思います)
もう少しエラーメッセージが分かりやすい方がよいかと思い、fa63b6401dacef0137e8275297fb94a91393aab9 で修正しました。

また cd57adc でテキスト比較に strncmp を使いましたが、予めTOKMAXLENに切り詰めておくことでstrcmpでよくなり、また地味にスタックを節約しています。

ドキュメントの記載だけではちょっと分かりにくいんですけどね。。。
https://www.postgresql.jp/document/15/html/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT

承知しました。確認しました。
一方で、timestampz型からtimezone,timezone_hour,timezone_minuteの取り出しでも

ERROR:  xpu_timelib.cu:3487  unsupported unit of timestamp
HINT:  device at GPU-0, function at __pg_extract_timestamp_common

が発生しております。pg_strom.enabled=offでは成功するのでPostgreSQL自体の仕様とはアンマッチのように思いますが、どう捉えればよいでしょうか?

すいません。ケアレスミスでした。
timestampとtimestamptzで同じ関数を使っているのですが、上記のunit名はtimestamptzの時のみ有効になるものでしたね。
3e6a027cdac3e4fe49994bb3f4966b2d7808a4a2 にて修正しています。

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