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
にて修正しています。
解消確認できました。ありがとうございました。