Home > Archive > PostgreSQL Bugs > May 2005 > Problem with ROWs and UNION









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Problem with ROWs and UNION
elein

2005-05-12, 8:24 pm

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('451
4 Cherry St','Oakland','CA','
94666') );
insert into people values ('go','ggo',ROW('451
5 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.


---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
joining column's datatypes do not match

Alvaro Herrera

2005-05-12, 8:24 pm

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)

---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

elein

2005-05-12, 8:24 pm

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 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

---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
joining column's datatypes do not match

Tom Lane

2005-05-12, 8:24 pm

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

---------------------------(end of broadcast)---------------------------
TIP 7: don't forget to increase your free space map settings

Sponsored Links





Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive | Programming forum archive

Copyright 2008 droptable.com