From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | Bernd von den Brincken <bvdb(at)asa(dot)de> |
Cc: | pgsql-sql(at)postgresql(dot)org |
Subject: | Re: Named column in a Function fails at ORDER BY (PgSQL 7.1) |
Date: | 2002-04-03 21:46:51 |
Message-ID: | 12792.1017870411@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-sql |
Bernd von den Brincken <bvdb(at)asa(dot)de> writes:
> on the occasion of a subselect I found a behavior in PostgreSQL 7.1 that I
> consider faulty, but would like to hear comments before complaining to the
> hackers:
Too late ;-)
> Here is the example - this fails with "ERROR: Attribute 'max_date' not
> found":
> SELECT content, datetime AS max_date
> FROM cftext
> ORDER by date_part('hour', max_date)
> Whereas this works both:
> a) SELECT content, datetime AS max_date
> FROM cftext
> ORDER by max_date
> b) SELECT content, datetime AS max_date
> FROM cftext
> ORDER by date_part('hour', datetime)
Right. The SQL92 spec disallows expressions in ORDER BY, and states that
the ORDER BY items are either names or numbers of *output columns* of
the SELECT. Thus, only your alternative (a) is legal per spec.
Postgres chooses to also allow sorting on expressions that are not in
the output list --- but such expressions are considered to be additional
expressions over the input columns. Essentially it's a way to write
SELECT content,
datetime AS max_date,
date_part('hour', datetime) AS order_val
FROM cftext
ORDER BY order_val
(which would be a spec-legal construct) and then tell the system you
didn't really want to see the order_val column in your output.
SQL99 seems to have (incompatibly) redefined ORDER BY to allow
expressions over the output column names, but I don't have a lot of
appetite for breaking existing applications in order to conform to the
SQL99 definition.
I do not have any sympathy for the notion that we should accept either
input or output column names in such expressions, if that's what you
were hoping to suggest. It's ambiguous.
> Now in this example the alternative works fine, but if you use a Sub-SELECT
> there is no alternative to a named result column.
Why not? You can always do something like
SELECT * FROM (SELECT ... ) AS T
ORDER BY x;
which is legal under both SQL specs.
regards, tom lane
From | Date | Subject | |
---|---|---|---|
Next Message | Josh Berkus | 2002-04-03 21:57:44 | Re: date manipulation |
Previous Message | Ewald Geschwinde | 2002-04-03 21:14:24 | Re: date manipulation |