temporal version of generate_series()

Started by Hitoshi Haradaover 18 years ago10 messagespatches
Jump to latest
#1Hitoshi Harada
umi.tanuki@gmail.com

I found a TODO item "Add temporal versions of generate_series()" and
wrote patch for generate_series(timestamp, timestamp, interval).

I just copied it from int4.c to timestamp.c and fit the data types in
timestamp and interval. I wonder if we need ones for timestamptz and
time?? If so, the implementation will be so similar that some kind of
generic approach should make things smart. For example, find add '+'
operator function from syscache and take anyelement as arguments.

# This is my first time to send a patch. If I did something wrong, I
appreciate your pointing me out.

Hitoshi Harada

Attachments:

generate_series_timestamp.20080423.patch.gzapplication/x-gzip; name=generate_series_timestamp.20080423.patch.gzDownload
#2Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Hitoshi Harada (#1)
Re: temporal version of generate_series()

H.Harada escribi�:

# This is my first time to send a patch. If I did something wrong, I
appreciate your pointing me out.

Brace positioning is off w.r.t. our conventions -- please fix that and
resubmit.

I have added this patch to the May commitfest.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

#3Hitoshi Harada
umi.tanuki@gmail.com
In reply to: Alvaro Herrera (#2)
Re: temporal version of generate_series()

2008/4/23 Alvaro Herrera <alvherre@commandprompt.com>:

H.Harada escribió:

# This is my first time to send a patch. If I did something wrong, I
appreciate your pointing me out.

Brace positioning is off w.r.t. our conventions -- please fix that and
resubmit.

Here's updated version. Thanks for your advice.

Hitoshi Harada

2008/4/23 Alvaro Herrera <alvherre@commandprompt.com>:

Show quoted text

H.Harada escribió:

# This is my first time to send a patch. If I did something wrong, I
appreciate your pointing me out.

Brace positioning is off w.r.t. our conventions -- please fix that and
resubmit.

I have added this patch to the May commitfest.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

Attachments:

generate_series_timestamp.20080424.patch.gzapplication/x-gzip; name=generate_series_timestamp.20080424.patch.gzDownload
#4Hitoshi Harada
umi.tanuki@gmail.com
In reply to: Hitoshi Harada (#3)
Re: temporal version of generate_series()

Here's the sync and updated patch.
It contains "strict" in catalog as well.

Hitoshi Harada

2008/4/24 H. Harada <umi.tanuki@gmail.com>:

Show quoted text

2008/4/23 Alvaro Herrera <alvherre@commandprompt.com>:

H.Harada escribió:

# This is my first time to send a patch. If I did something wrong, I
appreciate your pointing me out.

Brace positioning is off w.r.t. our conventions -- please fix that and
resubmit.

Here's updated version. Thanks for your advice.

Hitoshi Harada

2008/4/23 Alvaro Herrera <alvherre@commandprompt.com>:

H.Harada escribió:

# This is my first time to send a patch. If I did something wrong, I
appreciate your pointing me out.

Brace positioning is off w.r.t. our conventions -- please fix that and
resubmit.

I have added this patch to the May commitfest.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

Attachments:

generate_series_timestamp.20080501.patch.gzapplication/x-gzip; name=generate_series_timestamp.20080501.patch.gzDownload
#5Pavel Stehule
pavel.stehule@gmail.com
In reply to: Hitoshi Harada (#4)
Re: temporal version of generate_series()

Hello

why you don't use polymorphic types?

like:

create or replace function generate_time_series(anyelement,
anyelement, interval, OUT result anyelement)
returns setof anyelement as $$
begin
result := $1;
while (result <= $2) loop
return next;
result := result + $3;
end loop;
return;
end;
$$ language plpgsql;

Regards
Pavel Stehule

2008/5/1 H. Harada <umi.tanuki@gmail.com>:

Show quoted text

Here's the sync and updated patch.
It contains "strict" in catalog as well.

Hitoshi Harada

2008/4/24 H. Harada <umi.tanuki@gmail.com>:

2008/4/23 Alvaro Herrera <alvherre@commandprompt.com>:

H.Harada escribió:

# This is my first time to send a patch. If I did something wrong, I
appreciate your pointing me out.

Brace positioning is off w.r.t. our conventions -- please fix that and
resubmit.

Here's updated version. Thanks for your advice.

Hitoshi Harada

2008/4/23 Alvaro Herrera <alvherre@commandprompt.com>:

H.Harada escribió:

# This is my first time to send a patch. If I did something wrong, I
appreciate your pointing me out.

Brace positioning is off w.r.t. our conventions -- please fix that and
resubmit.

I have added this patch to the May commitfest.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

--
Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-patches

#6Hitoshi Harada
umi.tanuki@gmail.com
In reply to: Pavel Stehule (#5)
Re: temporal version of generate_series()

2008/5/1 Pavel Stehule <pavel.stehule@gmail.com>:

Hello

why you don't use polymorphic types?

Ah, good idea. I didn't think we could fix the third argument to
"interval" but "anyelement".
For a temporal version, it's reasonable.

Also, the name "generate_time_series" is better than before?

Hitoshi Harada

2008/5/1 Pavel Stehule <pavel.stehule@gmail.com>:

Show quoted text

Hello

why you don't use polymorphic types?

like:

create or replace function generate_time_series(anyelement,
anyelement, interval, OUT result anyelement)
returns setof anyelement as $$
begin
result := $1;
while (result <= $2) loop
return next;
result := result + $3;
end loop;
return;
end;
$$ language plpgsql;

Regards
Pavel Stehule

2008/5/1 H. Harada <umi.tanuki@gmail.com>:

Here's the sync and updated patch.
It contains "strict" in catalog as well.

Hitoshi Harada

2008/4/24 H. Harada <umi.tanuki@gmail.com>:

2008/4/23 Alvaro Herrera <alvherre@commandprompt.com>:

H.Harada escribió:

# This is my first time to send a patch. If I did something wrong, I
appreciate your pointing me out.

Brace positioning is off w.r.t. our conventions -- please fix that and
resubmit.

Here's updated version. Thanks for your advice.

Hitoshi Harada

2008/4/23 Alvaro Herrera <alvherre@commandprompt.com>:

H.Harada escribió:

# This is my first time to send a patch. If I did something wrong, I
appreciate your pointing me out.

Brace positioning is off w.r.t. our conventions -- please fix that and
resubmit.

I have added this patch to the May commitfest.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

--
Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-patches

#7Hitoshi Harada
umi.tanuki@gmail.com
In reply to: Hitoshi Harada (#6)
Re: temporal version of generate_series()

2008/5/1 H. Harada <umi.tanuki@gmail.com>:

2008/5/1 Pavel Stehule <pavel.stehule@gmail.com>:

Hello

why you don't use polymorphic types?

Ah, good idea. I didn't think we could fix the third argument to
"interval" but "anyelement".
For a temporal version, it's reasonable.

I was thinking about it again. There are 3 points:

a. It will get complicated in the function to resolve operator for
polymorphic types, including search for namespace and error (not
found) handling.
b. Other temporal data types than timestamp is easy to be casted from
timestamp results.
c. In the integer version of generate_series also it is possible to
cast the results to other numerical types though harder to cast them
to temporal data types.

So it would be better to keep current patch, isn't it?

postgres=# select generate_series('2008/05/01 20:00'::timestamp,
'2008/05/02 08:00'::timestamp
, '1 hour'::interval);
generate_series
---------------------
2008-05-01 20:00:00
2008-05-01 21:00:00
2008-05-01 22:00:00
2008-05-01 23:00:00
2008-05-02 00:00:00
2008-05-02 01:00:00
2008-05-02 02:00:00
2008-05-02 03:00:00
2008-05-02 04:00:00
2008-05-02 05:00:00
2008-05-02 06:00:00
2008-05-02 07:00:00
2008-05-02 08:00:00
(13 rows)

postgres=# select generate_series('2008/05/01 20:00'::timestamp,
'2008/05/02 08:00'::timestamp
, '1 hour'::interval)::time;
generate_series
-----------------
20:00:00
21:00:00
22:00:00
23:00:00
00:00:00
01:00:00
02:00:00
03:00:00
04:00:00
05:00:00
06:00:00
07:00:00
08:00:00
(13 rows)

postgres=# select generate_series('2008/05/01 20:00'::timestamp,
'2008/05/02 08:00'::timestamp
, '1 hour'::interval)::timestamptz;
generate_series
------------------------
2008-05-01 20:00:00+09
2008-05-01 21:00:00+09
2008-05-01 22:00:00+09
2008-05-01 23:00:00+09
2008-05-02 00:00:00+09
2008-05-02 01:00:00+09
2008-05-02 02:00:00+09
2008-05-02 03:00:00+09
2008-05-02 04:00:00+09
2008-05-02 05:00:00+09
2008-05-02 06:00:00+09
2008-05-02 07:00:00+09
2008-05-02 08:00:00+09
(13 rows)

postgres=# select generate_series('2008/05/01 20:00'::timestamp,
'2008/05/02 08:00'::timestamp
, '1 hour'::interval)::date;
generate_series
-----------------
2008-05-01
2008-05-01
2008-05-01
2008-05-01
2008-05-02
2008-05-02
2008-05-02
2008-05-02
2008-05-02
2008-05-02
2008-05-02
2008-05-02
2008-05-02
(13 rows)

Hitoshi Harada

2008/5/1 H. Harada <umi.tanuki@gmail.com>:

Show quoted text

2008/5/1 Pavel Stehule <pavel.stehule@gmail.com>:

Hello

why you don't use polymorphic types?

Ah, good idea. I didn't think we could fix the third argument to
"interval" but "anyelement".
For a temporal version, it's reasonable.

Also, the name "generate_time_series" is better than before?

Hitoshi Harada

2008/5/1 Pavel Stehule <pavel.stehule@gmail.com>:

Hello

why you don't use polymorphic types?

like:

create or replace function generate_time_series(anyelement,
anyelement, interval, OUT result anyelement)
returns setof anyelement as $$
begin
result := $1;
while (result <= $2) loop
return next;
result := result + $3;
end loop;
return;
end;
$$ language plpgsql;

Regards
Pavel Stehule

2008/5/1 H. Harada <umi.tanuki@gmail.com>:

Here's the sync and updated patch.
It contains "strict" in catalog as well.

Hitoshi Harada

2008/4/24 H. Harada <umi.tanuki@gmail.com>:

2008/4/23 Alvaro Herrera <alvherre@commandprompt.com>:

H.Harada escribió:

# This is my first time to send a patch. If I did something wrong, I
appreciate your pointing me out.

Brace positioning is off w.r.t. our conventions -- please fix that and
resubmit.

Here's updated version. Thanks for your advice.

Hitoshi Harada

2008/4/23 Alvaro Herrera <alvherre@commandprompt.com>:

H.Harada escribió:

# This is my first time to send a patch. If I did something wrong, I
appreciate your pointing me out.

Brace positioning is off w.r.t. our conventions -- please fix that and
resubmit.

I have added this patch to the May commitfest.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

--
Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-patches

#8Pavel Stehule
pavel.stehule@gmail.com
In reply to: Hitoshi Harada (#7)
Re: temporal version of generate_series()

2008/5/1 H. Harada <umi.tanuki@gmail.com>:

2008/5/1 H. Harada <umi.tanuki@gmail.com>:

2008/5/1 Pavel Stehule <pavel.stehule@gmail.com>:

Hello

why you don't use polymorphic types?

Ah, good idea. I didn't think we could fix the third argument to
"interval" but "anyelement".
For a temporal version, it's reasonable.

I was thinking about it again. There are 3 points:

a. It will get complicated in the function to resolve operator for
polymorphic types, including search for namespace and error (not
found) handling.

yes, it's true;

b. Other temporal data types than timestamp is easy to be casted from
timestamp results.
c. In the integer version of generate_series also it is possible to
cast the results to other numerical types though harder to cast them
to temporal data types.

So it would be better to keep current patch, isn't it?

I missing generator for date - casting from and to timestemp is
little bit ugly - but polymorphic types in C isn't good idea, I see
it.

Regards
Pavel Stehule

Show quoted text

postgres=# select generate_series('2008/05/01 20:00'::timestamp,
'2008/05/02 08:00'::timestamp
, '1 hour'::interval);
generate_series
---------------------
2008-05-01 20:00:00
2008-05-01 21:00:00
2008-05-01 22:00:00
2008-05-01 23:00:00
2008-05-02 00:00:00
2008-05-02 01:00:00
2008-05-02 02:00:00
2008-05-02 03:00:00
2008-05-02 04:00:00
2008-05-02 05:00:00
2008-05-02 06:00:00
2008-05-02 07:00:00
2008-05-02 08:00:00
(13 rows)

postgres=# select generate_series('2008/05/01 20:00'::timestamp,
'2008/05/02 08:00'::timestamp
, '1 hour'::interval)::time;
generate_series
-----------------
20:00:00
21:00:00
22:00:00
23:00:00
00:00:00
01:00:00
02:00:00
03:00:00
04:00:00
05:00:00
06:00:00
07:00:00
08:00:00
(13 rows)

postgres=# select generate_series('2008/05/01 20:00'::timestamp,
'2008/05/02 08:00'::timestamp
, '1 hour'::interval)::timestamptz;
generate_series
------------------------
2008-05-01 20:00:00+09
2008-05-01 21:00:00+09
2008-05-01 22:00:00+09
2008-05-01 23:00:00+09
2008-05-02 00:00:00+09
2008-05-02 01:00:00+09
2008-05-02 02:00:00+09
2008-05-02 03:00:00+09
2008-05-02 04:00:00+09
2008-05-02 05:00:00+09
2008-05-02 06:00:00+09
2008-05-02 07:00:00+09
2008-05-02 08:00:00+09
(13 rows)

postgres=# select generate_series('2008/05/01 20:00'::timestamp,
'2008/05/02 08:00'::timestamp
, '1 hour'::interval)::date;
generate_series
-----------------
2008-05-01
2008-05-01
2008-05-01
2008-05-01
2008-05-02
2008-05-02
2008-05-02
2008-05-02
2008-05-02
2008-05-02
2008-05-02
2008-05-02
2008-05-02
(13 rows)

Hitoshi Harada

2008/5/1 H. Harada <umi.tanuki@gmail.com>:

2008/5/1 Pavel Stehule <pavel.stehule@gmail.com>:

Hello

why you don't use polymorphic types?

Ah, good idea. I didn't think we could fix the third argument to
"interval" but "anyelement".
For a temporal version, it's reasonable.

Also, the name "generate_time_series" is better than before?

Hitoshi Harada

2008/5/1 Pavel Stehule <pavel.stehule@gmail.com>:

Hello

why you don't use polymorphic types?

like:

create or replace function generate_time_series(anyelement,
anyelement, interval, OUT result anyelement)
returns setof anyelement as $$
begin
result := $1;
while (result <= $2) loop
return next;
result := result + $3;
end loop;
return;
end;
$$ language plpgsql;

Regards
Pavel Stehule

2008/5/1 H. Harada <umi.tanuki@gmail.com>:

Here's the sync and updated patch.
It contains "strict" in catalog as well.

Hitoshi Harada

2008/4/24 H. Harada <umi.tanuki@gmail.com>:

2008/4/23 Alvaro Herrera <alvherre@commandprompt.com>:

H.Harada escribió:

# This is my first time to send a patch. If I did something wrong, I
appreciate your pointing me out.

Brace positioning is off w.r.t. our conventions -- please fix that and
resubmit.

Here's updated version. Thanks for your advice.

Hitoshi Harada

2008/4/23 Alvaro Herrera <alvherre@commandprompt.com>:

H.Harada escribió:

# This is my first time to send a patch. If I did something wrong, I
appreciate your pointing me out.

Brace positioning is off w.r.t. our conventions -- please fix that and
resubmit.

I have added this patch to the May commitfest.

--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.

--
Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-patches

#9Tom Lane
tgl@sss.pgh.pa.us
In reply to: Hitoshi Harada (#4)
Re: temporal version of generate_series()

"H.Harada" <umi.tanuki@gmail.com> writes:

Here's the sync and updated patch.
It contains "strict" in catalog as well.

Applied with some revisions ---

I added a timestamptz version; it didn't seem very appropriate to have
only a timestamp version.

You can't just pick a convenient-looking OID, you must use one that
the unused_oids script reports as free.

There was no check for a zero step size.

There was no documentation.

regards, tom lane

#10Hitoshi Harada
umi.tanuki@gmail.com
In reply to: Tom Lane (#9)
Re: temporal version of generate_series()

2008/5/5 Tom Lane <tgl@sss.pgh.pa.us>:

Applied with some revisions ---

I added a timestamptz version; it didn't seem very appropriate to have
only a timestamp version.

You can't just pick a convenient-looking OID, you must use one that
the unused_oids script reports as free.

I didn't know the unused_oids script. I'll try it next time.

Thanks for many notices anyway.

Hitoshi Harada