Problem with CAST-ing - am I missing something?

Started by Pól Ua Laoínecháinover 2 years ago4 messagesgeneral
Jump to latest

Hi all,

One of the things I really like about PostgreSQL is that it normally
does what I expect it to do - very little cognitive dissonance. But
I'm puzzled by something I came across this evening - took me ages to
figure it out!

I have a table (sample) as follows (code on fiddle:):

CREATE TABLE test (ts, te)
AS VALUES ('2023-10-25 14:33:00'::TIMESTAMPTZ, '2023-10-25
15:56:00'::TIMESTAMPTZ);

Now, this doesn't work:

SELECT (ts, te)::TSTZRANGE FROM test;

but this does:

SELECT TSTZRANGE(ts, te) FROM test;

Bug? Niggle? Can anyone explain to me why this is? To me, it's obvious
what I want to do with the first statement - ideas, pointers, URLs,
whatever welcome.

TIA and rgs,

Pól...

In reply to: Pól Ua Laoínecháin (#1)
Re: Problem with CAST-ing - am I missing something?

Sorry folks - fiddle is here: https://dbfiddle.uk/bT4idNK6

Rgs,

Pól...

#3Christophe Pettus
xof@thebuild.com
In reply to: Pól Ua Laoínecháin (#1)
Re: Problem with CAST-ing - am I missing something?

On Oct 25, 2023, at 17:21, Pól Ua Laoínecháin <linehanp@tcd.ie> wrote:

SELECT (ts, te)::TSTZRANGE FROM test;

That syntax doesn't mean what you probably think it does. (ts, te) defines a record type with two fields. PostgreSQL constructs that, and then attempts to apply the cast. There's no conversion path from that to TSTZRANGE, so the system complains. It's imaginable, I guess, that such a path could be added, but the right way to do it is what you do here:

Show quoted text

SELECT TSTZRANGE(ts, te) FROM test;

#4Adrian Klaver
adrian.klaver@aklaver.com
In reply to: Christophe Pettus (#3)
Re: Problem with CAST-ing - am I missing something?

On 10/25/23 17:26, Christophe Pettus wrote:

On Oct 25, 2023, at 17:21, Pól Ua Laoínecháin <linehanp@tcd.ie> wrote:

SELECT (ts, te)::TSTZRANGE FROM test;

That syntax doesn't mean what you probably think it does. (ts, te) defines a record type with two fields. PostgreSQL constructs that, and then attempts to apply the cast. There's no conversion path from that to TSTZRANGE, so the system complains. It's imaginable, I guess, that such a path could be added, but the right way to do it is what you do here:

SELECT TSTZRANGE(ts, te) FROM test;

Or do something like:

select '[2023-10-25 14:33:00, 2023-10-25 15:56:00)'::TSTZRANGE;
tstzrange
-------------------------------------------------------
["10/25/2023 14:33:00 PDT","10/25/2023 15:56:00 PDT")

per:

https://www.postgresql.org/docs/current/rangetypes.html#RANGETYPES-IO

--
Adrian Klaver
adrian.klaver@aklaver.com