Thread: Problem with CAST-ing - am I missing something?

Problem with CAST-ing - am I missing something?

From
Pól Ua Laoínecháin
Date:
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...



Re: Problem with CAST-ing - am I missing something?

From
Pól Ua Laoínecháin
Date:
Sorry folks - fiddle is here: https://dbfiddle.uk/bT4idNK6

Rgs,

Pól...



Re: Problem with CAST-ing - am I missing something?

From
Christophe Pettus
Date:

> 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
constructsthat, 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;





Re: Problem with CAST-ing - am I missing something?

From
Adrian Klaver
Date:
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.
PostgreSQLconstructs that, and then attempts to apply the cast.  There's no conversion path from that to TSTZRANGE, so
thesystem complains.  It's imaginable, I guess, that such a path could be added, but the right way to do it is what you
dohere:
 
> 
>> 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