Amazon RedShiftのユーザー定義関数でエラー VARCHAR指定に注意!

ユーザー定義関数のエラー

URLからホスト名を取得するユーザー定義関数(UDF)を作り、
RedShift Spectrumを使った集計処理に使っていたところ、
エラーが出てしまった。

CREATE FUNCTION f_hostname(url VARCHAR)
RETURNS varchar
IMMUTABLE AS $
import urlparse
import urllib
url = urllib.unquote(url).decode('utf8')
return urlparse.urlparse(url).hostname
$ LANGUAGE plpythonu;
SQLSTATE[XX000]: Internal error: 7 ERROR: Value too long for character type
DETAIL:
-----------------------------------------------
error: Value too long for character type
code: 8001
context: Value too long for type character varying(256)
query: 3120
location: funcs_string.hpp:395
process: query0_79 [pid=1406]
----------------------------------------------

暗黙の前提

実は、VARCHARを長さの指定なしで使うとデフォルト長が256となり、
それ以上の長さの文字列を渡すとエラーになってしまうのだ。

長さの指定子なしで VARCHAR データ型を使用すると、デフォルト長は 256 になります。

Amazon Redshift / 文字型

URLで256文字以上の文字列が出現することは、ざらにある。

明示的に、VARCHARの長さを指定することで、エラーを回避した。

CREATE FUNCTION f_hostname(url VARCHAR(2048))
RETURNS varchar(2048)
IMMUTABLE AS $
import urlparse
import urllib
url = urllib.unquote(url).decode('utf8')
return urlparse.urlparse(url).hostname
$ LANGUAGE plpythonu;

URLの長さは仕様上制限がないが、常識的な範囲で2048とした。