関数定義の確認
昨日に引き続きgenerate_seriesの内容が知りたかったので。
generate_seriesのオーバーロード関数一覧を取得
# select proname, prorettype, proargtypes, prosrc from pg_proc where proname = 'generate_series'; proname | prorettype | proargtypes | prosrc -----------------+------------+----------------+----------------------------- generate_series | 23 | 23 23 23 | generate_series_step_int4 generate_series | 23 | 23 23 | generate_series_int4 generate_series | 20 | 20 20 20 | generate_series_step_int8 generate_series | 20 | 20 20 | generate_series_int8 generate_series | 1114 | 1114 1114 1186 | generate_series_timestamp generate_series | 1184 | 1184 1184 1186 | generate_series_timestamptz
prorettype が引数の型、proargtypesが引数の数と型、prosrcが関数のソースとなる。
型情報は
# select oid,typname from pg_type where oid in(23, 20, 1114, 1186, 1184 ); oid | typname ------+------------- 20 | int8 23 | int4 1114 | timestamp 1184 | timestamptz 1186 | interval
にて確認。
ということで1つめの関数は generate_series(int4, int4, int4)でreturn int4 という関数となる。
timestampとintervalもあるのか。
examle...
# select * from generate_series( to_timestamp('20121201','YYYYMMDD'),to_timestamp('20121225','YYYYMMDD'), '1 day' ); generate_series ------------------------ 2012-12-01 00:00:00+09 2012-12-02 00:00:00+09 2012-12-03 00:00:00+09 2012-12-04 00:00:00+09 2012-12-05 00:00:00+09
で、関数の処理定義はdefinitionで'generate_series_step_int4'と指しているので、
postgresqlのソースの /src/backend/utils/adt/int.c の
Datum generate_series_step_int4(PG_FUNCTION_ARGS)
となる。