Odd Timestamp Error WAS Re: Function Creation Error - Mailing list pgsql-novice

From Joshua Kramer
Subject Odd Timestamp Error WAS Re: Function Creation Error
Date
Msg-id Pine.LNX.4.64.0704080440040.16068@localhost.localdomain
Whole thread Raw
In response to Re: Function Creation Error  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: Odd Timestamp Error WAS Re: Function Creation Error
List pgsql-novice
Thanks, Tom.  Now I've spent many hours fighting over a really odd error
message.  In my Postgres 8.2.3 (CentOS 4.4, RPMS packaged by PGDG) log, I
see this error:

LOG:  statement: INSERT INTO auth_tickets (user_id,
expire_datetime, init_datetime, init_ip_addr, ticket_serial) VALUES ('2',
'now() + 6 * interval ''1 hour''', 'now()', '192.168.2.2',
'44d6e7d4b2e87632a65cd34501aeea614bffde5f')
ERROR:  invalid input syntax for type timestamp: "now() + 6 * interval '1
hour'"

Basically, it does not like it when I insert this string into a timestamp
field:

now() + 6 * interval '1 hour'

But, check this out.  I can do the following, with no errors, and storing
valid data in the table:

create table test ( field1 timestamp, field2 varchar(50));
insert into test values (cast(now() + 6 * interval '1 hour' AS timestamp),
"Test 1");
insert into test values (now() + 6 * interval '1 hour', 'Test 2');

I've also tried this string with the same results on both tables:

now() + interval '6 hour'

The only difference is this: the auth_tickets table used to have the
expire_datetime as a "timestamp without timezone" but I modified the field
to simply be "timestamp".  Also, with auth_tickets I'm inserting from an
ADODB-based PHP application, and with the test table I'm using psql
command line client.

Any ideas?

Cheers,
-J


On Sat, 7 Apr 2007, Tom Lane wrote:

> Joshua Kramer <josh@globalherald.net> writes:
>> I have a function definition built with pgadmin3 that looks like this:
>
>> CREATE FUNCTION "fnGenerateAuthTicket"(p_ticket_serial character varying,
>> p_expire_hours integer, p_user_id integer, p_ip_addr inet) RETURNS
>> character varying AS
>> $BODY$
>> insert into auth_tickets(user_id, expire_datetime, init_datetime,
>> init_ip_addr, ticket_serial)
>>          values (p_user_id, now() + interval 'p_expire_hours
>> hours', now(), p_ip_addr, p_ticket_serial);
>> $BODY$
>> LANGUAGE 'sql' VOLATILE;
>
>> pgadmin3 gives me an error, "Error: column p_user_id does not exist at
>> character 280".  The function examples I've seen show that you use the
>> variable parameter names just like normal fields, and that's what I'm
>> doing here.  I'm not sure where the error comes from.
>
> The SQL function language doesn't (yet) know how to reference parameters
> by name --- you'd need to write $1 for p_ticket_serial etc.  Or use
> plpgsql, which does know about parameter names.
>
>> Also, is my use of interval correct?
>
> No, as you suspected, it isn't.  The best way to do this is to use
> number-times-interval multiplication:
>
>     $2 * interval '1 hour'
>
>             regards, tom lane
>
>

pgsql-novice by date:

Previous
From: Tom Lane
Date:
Subject: Re: Function Creation Error
Next
From: Tom Lane
Date:
Subject: Re: Odd Timestamp Error WAS Re: Function Creation Error