関数定義の確認

昨日に引き続き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)

となる。