7.2.1: pg_dump of UNIONed VIEWs broken

Started by Ian Morganalmost 24 years ago7 messagesbugs
Jump to latest
#1Ian Morgan
imorgan@webcon.net

PostgreSQL 7.2.1's pg_dump prduces bad SQL for VIEW's.

The SQL for CREATE VIEW as output by pg_dump generates an error, because the
appropriate nesting of SELECTs with parentheses is missing:
ERROR: parser: parse error at or near "SELECT"

Original SQL:

CREATE VIEW "agents" as (
(
SELECT DISTINCT
employees.contact_id
FROM
employees
ORDER BY
employees.contact_id
)
UNION
(
SELECT DISTINCT
contractors.contact_id
FROM
contractors
ORDER BY
contractors.contact_id
)
);

As output by pg_dump:

CREATE VIEW "agents" as SELECT DISTINCT employees.contact_id FROM employees
ORDER BY employees.contact_id UNION SELECT DISTINCT contractors.contact_id
FROM contractors ORDER BY contractors.contact_id;

As you can see, the nesting is entirely lost.

Regards,
Ian Morgan
--
-------------------------------------------------------------------
Ian E. Morgan Vice President & C.O.O. Webcon, Inc.
imorgan@webcon.net PGP: #2DA40D07 www.webcon.net
* Customized Linux network solutions for your business *
-------------------------------------------------------------------

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ian Morgan (#1)
Re: 7.2.1: pg_dump of UNIONed VIEWs broken

Ian Morgan <imorgan@webcon.net> writes:

The SQL for CREATE VIEW as output by pg_dump generates an error, because the
appropriate nesting of SELECTs with parentheses is missing:

Hmm. You shouldn't *need* parentheses in most cases ...

CREATE VIEW "agents" as (
(
SELECT DISTINCT
employees.contact_id
FROM
employees
ORDER BY
employees.contact_id
)
UNION
(
SELECT DISTINCT
contractors.contact_id
FROM
contractors
ORDER BY
contractors.contact_id
)
);

although I suppose this is a counterexample. Would it help any to point
out that ORDER BY inside an arm of a UNION is a complete waste of
cycles? That's probably why it didn't occur to anyone to test this.

BTW, the SELECT DISTINCTs are also a waste of cycles, since UNION will
do that anyway.

regards, tom lane

#3Ian Morgan
imorgan@webcon.net
In reply to: Tom Lane (#2)
Re: 7.2.1: pg_dump of UNIONed VIEWs broken

On Mon, 22 Apr 2002, Tom Lane wrote:

Ian Morgan <imorgan@webcon.net> writes:

The SQL for CREATE VIEW as output by pg_dump generates an error, because the
appropriate nesting of SELECTs with parentheses is missing:

Hmm. You shouldn't *need* parentheses in most cases ...

CREATE VIEW "agents" as (
(
SELECT DISTINCT
employees.contact_id
FROM
employees
ORDER BY
employees.contact_id
)
UNION
(
SELECT DISTINCT
contractors.contact_id
FROM
contractors
ORDER BY
contractors.contact_id
)
);

although I suppose this is a counterexample. Would it help any to point
out that ORDER BY inside an arm of a UNION is a complete waste of
cycles? That's probably why it didn't occur to anyone to test this.

BTW, the SELECT DISTINCTs are also a waste of cycles, since UNION will
do that anyway.

Interesting observations. I knew the ORDER BYs were irrelevant, but hadn't
gotten around to removing them. The DISTINCTs, on the other hand were a
throwback to some old queries, and I completely missed that the UNION would
do that for me.. hehe.. oops.

Anyhow, rewriting the select:

Works:

SELECT employees.contact_id FROM employees
UNION
SELECT contractors.contact_id FROM contractors;

Does not work:

SELECT employees.contact_id FROM employees ORDER BY employees.contact_id
UNION
SELECT contractors.contact_id FROM contractors ORDER BY contractors.contact_id;

Even if adding ORDER BY to a UNION is really sub-optimal SQL, shouldn't
pg_dump (and even psql's \d <viewname>) produce SQL that actually works for
any query that was originally accepted when creating the VIEW?
Otherwise, maybe having ORDER BY in a VIEW's SELECT should be made illegal?

Regards,
Ian Morgan
--
-------------------------------------------------------------------
Ian E. Morgan Vice President & C.O.O. Webcon, Inc.
imorgan@webcon.net PGP: #2DA40D07 www.webcon.net
* Customized Linux network solutions for your business *
-------------------------------------------------------------------

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Ian Morgan (#3)
Re: 7.2.1: pg_dump of UNIONed VIEWs broken

Ian Morgan <imorgan@webcon.net> writes:

Even if adding ORDER BY to a UNION is really sub-optimal SQL, shouldn't
pg_dump (and even psql's \d <viewname>) produce SQL that actually
works

I didn't say it wasn't a bug ;-) ... just pointing out that fixing it
doesn't seem very high priority. I'll do something about it next time
I have occasion to touch ruleutils.c.

regards, tom lane

#5Bruce Momjian
bruce@momjian.us
In reply to: Ian Morgan (#1)
Re: 7.2.1: pg_dump of UNIONed VIEWs broken

Can someone phrase a TODO item for me?

---------------------------------------------------------------------------

Ian Morgan wrote:

PostgreSQL 7.2.1's pg_dump prduces bad SQL for VIEW's.

The SQL for CREATE VIEW as output by pg_dump generates an error, because the
appropriate nesting of SELECTs with parentheses is missing:
ERROR: parser: parse error at or near "SELECT"

Original SQL:

CREATE VIEW "agents" as (
(
SELECT DISTINCT
employees.contact_id
FROM
employees
ORDER BY
employees.contact_id
)
UNION
(
SELECT DISTINCT
contractors.contact_id
FROM
contractors
ORDER BY
contractors.contact_id
)
);

As output by pg_dump:

CREATE VIEW "agents" as SELECT DISTINCT employees.contact_id FROM employees
ORDER BY employees.contact_id UNION SELECT DISTINCT contractors.contact_id
FROM contractors ORDER BY contractors.contact_id;

As you can see, the nesting is entirely lost.

Regards,
Ian Morgan
--
-------------------------------------------------------------------
Ian E. Morgan Vice President & C.O.O. Webcon, Inc.
imorgan@webcon.net PGP: #2DA40D07 www.webcon.net
* Customized Linux network solutions for your business *
-------------------------------------------------------------------

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo@postgresql.org so that your
message can get through to the mailing list cleanly

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
#6Ian Morgan
imorgan@webcon.net
In reply to: Bruce Momjian (#5)
Re: 7.2.1: pg_dump of UNIONed VIEWs broken

On Tue, 23 Apr 2002, Bruce Momjian wrote:

Can someone phrase a TODO item for me?

How about:
Fix pg_get_viewdef() to output fully nested selects

Regards,
Ian Morgan
--
-------------------------------------------------------------------
Ian E. Morgan Vice President & C.O.O. Webcon, Inc.
imorgan@webcon.net PGP: #2DA40D07 www.webcon.net
* Customized Linux network solutions for your business *
-------------------------------------------------------------------

Show quoted text

Ian Morgan wrote:

PostgreSQL 7.2.1's pg_dump prduces bad SQL for VIEW's.

The SQL for CREATE VIEW as output by pg_dump generates an error, because the
appropriate nesting of SELECTs with parentheses is missing:
ERROR: parser: parse error at or near "SELECT"

Original SQL:

CREATE VIEW "agents" as (
(
SELECT DISTINCT
employees.contact_id
FROM
employees
ORDER BY
employees.contact_id
)
UNION
(
SELECT DISTINCT
contractors.contact_id
FROM
contractors
ORDER BY
contractors.contact_id
)
);

As output by pg_dump:

CREATE VIEW "agents" as SELECT DISTINCT employees.contact_id FROM employees
ORDER BY employees.contact_id UNION SELECT DISTINCT contractors.contact_id
FROM contractors ORDER BY contractors.contact_id;

As you can see, the nesting is entirely lost.

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Bruce Momjian (#5)
Re: 7.2.1: pg_dump of UNIONed VIEWs broken

Bruce Momjian <pgman@candle.pha.pa.us> writes:

Can someone phrase a TODO item for me?

It's already done (not committed yet though).

regards, tom lane