ユーザー定義関数のエラー
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とした。