Problem with ROWs and UNION

Started by eleinalmost 21 years ago4 messagesbugs
Jump to latest
#1elein
elein@varlena.com

Problem with ROW types in UNION.

1. UNION of ROW types fails with operator error.

create type addrs as (
addr text,
city text,
state char(2),
zip text);

--
-- UNION of ROWS doesn't work (simply wrong)
--
select ROW('4514 Cherry St','Oakland','CA','94666')::addrs
UNION
select ROW('4515 Cherry St','Oakland','CA','94666')::addrs;
-- ERROR: could not identify an ordering operator for type addrs
-- HINT: Use an explicit ordering operator or modify the query.

--
-- But select * containing rows does work.
--
create table people (
name text,
fname text,
addr addrs
);
insert into people values ('ae','aem',ROW('4514 Cherry St','Oakland','CA','94666') );
insert into people values ('go','ggo',ROW('4515 Cherry St','Oakland','CA','94666') );

select * from people;
name | fname | addr
------+-------+-------------------------------------
ae | aem | ("4514 Cherry St",Oakland,CA,94666)
go | ggo | ("4515 Cherry St",Oakland,CA,94666)
(2 rows)

=============================================================
elein@varlena.com Varlena, LLC www.varlena.com
(510)655-2584(o) (510)543-6079(c)
PostgreSQL Consulting, Support & Training

PostgreSQL General Bits http://www.varlena.com/GeneralBits/
==============================================================
I have always depended on the [QA] of strangers.

#2Alvaro Herrera
alvherre@surnet.cl
In reply to: elein (#1)
Re: Problem with ROWs and UNION

On Thu, May 12, 2005 at 12:32:48PM -0700, elein wrote:

--
-- UNION of ROWS doesn't work (simply wrong)
--
select ROW('4514 Cherry St','Oakland','CA','94666')::addrs
UNION
select ROW('4515 Cherry St','Oakland','CA','94666')::addrs;
-- ERROR: could not identify an ordering operator for type addrs
-- HINT: Use an explicit ordering operator or modify the query.

UNION ALL does work:

alvherre=# select ROW('4514 Cherry St','Oakland','CA','94666')::addrs
UNION ALL
select ROW('4515 Cherry St','Oakland','CA','94666')::addrs;
row
-------------------------------------
("4514 Cherry St",Oakland,CA,94666)
("4515 Cherry St",Oakland,CA,94666)
(2 filas)

I think the error message is misleading though, because the user has no
way to specify the ordering operator to UNION.

I think you could create a btree operator class to make it all work.

--
Alvaro Herrera (<alvherre[a]surnet.cl>)
"And as an added bonus, now my computer goes to the toilet for me, leaving me
free to spend time on more useful activities! yay slug codefests!" (C. Parker)

#3elein
elein@varlena.com
In reply to: Alvaro Herrera (#2)
Re: Problem with ROWs and UNION

On Thu, May 12, 2005 at 03:57:18PM -0400, Alvaro Herrera wrote:

On Thu, May 12, 2005 at 12:32:48PM -0700, elein wrote:

--
-- UNION of ROWS doesn't work (simply wrong)
--
select ROW('4514 Cherry St','Oakland','CA','94666')::addrs
UNION
select ROW('4515 Cherry St','Oakland','CA','94666')::addrs;
-- ERROR: could not identify an ordering operator for type addrs
-- HINT: Use an explicit ordering operator or modify the query.

UNION ALL does work:

alvherre=# select ROW('4514 Cherry St','Oakland','CA','94666')::addrs
UNION ALL
select ROW('4515 Cherry St','Oakland','CA','94666')::addrs;
row
-------------------------------------
("4514 Cherry St",Oakland,CA,94666)
("4515 Cherry St",Oakland,CA,94666)
(2 filas)

This makes sense because the UNION needs to have the ordering/
comparative operators to eliminate duplicates.

It is a work around, but I think there needs to be a ROW
ordering operator added.

I think the error message is misleading though, because the user has no
way to specify the ordering operator to UNION.

I think you could create a btree operator class to make it all work.

--elein
elein@varlena.com

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#2)
Re: Problem with ROWs and UNION

Alvaro Herrera <alvherre@surnet.cl> writes:

I think you could create a btree operator class to make it all work.

Hm. Given that we've managed to build a general opclass for arrays,
I suppose it should be possible for records too. Hardly trivial though.

A closely related point is fixing row comparisons to obey the SQL
semantics properly.

regards, tom lane