Обсуждение: 7.2.1: pg_dump of UNIONed VIEWs broken

Поиск
Список
Период
Сортировка

7.2.1: pg_dump of UNIONed VIEWs broken

От
Ian Morgan
Дата:
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  *
-------------------------------------------------------------------

Re: 7.2.1: pg_dump of UNIONed VIEWs broken

От
Tom Lane
Дата:
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

Re: 7.2.1: pg_dump of UNIONed VIEWs broken

От
Ian Morgan
Дата:
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  *
-------------------------------------------------------------------

Re: 7.2.1: pg_dump of UNIONed VIEWs broken

От
Tom Lane
Дата:
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

Re: 7.2.1: pg_dump of UNIONed VIEWs broken

От
Bruce Momjian
Дата:
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

Re: 7.2.1: pg_dump of UNIONed VIEWs broken

От
Ian Morgan
Дата:
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  *
-------------------------------------------------------------------



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

Re: 7.2.1: pg_dump of UNIONed VIEWs broken

От
Tom Lane
Дата:
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