Re: [SQL] Re: [HACKERS] Counting bool flags in a complex query - Mailing list pgsql-hackers

From Tom Lane
Subject Re: [SQL] Re: [HACKERS] Counting bool flags in a complex query
Date
Msg-id 11614.932162204@sss.pgh.pa.us
Whole thread Raw
In response to Re: [HACKERS] Counting bool flags in a complex query  (Michael Richards <miker@scifair.acadiau.ca>)
List pgsql-hackers
Michael Richards <miker@scifair.acadiau.ca> writes:
>> For example,
>> 
>> create table z1 (f1 int4, f2 int4);
>> CREATE
>> select f1 as f2, f2 from z1 order by f2;
>> f2|f2
>> --+--
>> (0 rows)
>> 
>> Which column do you think it's ordering by?  Which column *should* it
>> order by?  I think this ought to draw an "ambiguous column label" error

> Good point. Is there anything in the SQL standard that defined how this
> "is supposed" to work?

After looking at the SQL spec I think the above definitely ought to draw
an error.  We have the following verbiage concerning the column names
for the result of a SELECT:
           a) If the i-th <derived column> in the <select list> specifies             an <as clause> that contains a
<columnname> C, then the             <column name> of the i-th column of the result is C.
 
           b) If the i-th <derived column> in the <select list> does not             specify an <as clause> and the
<valueexpression> of that             <derived column> is a single <column reference>, then the             <column
name>of the i-th column of the result is C.
 
           c) Otherwise, the <column name> of the i-th column of the <query             specification> is
implementation-dependentand different             from the <column name> of any column, other than itself, of
 a table referenced by any <table reference> contained in the             SQL-statement.
 

which Postgres does indeed follow, and we see from (a) and (b) that "f2"
is the required column name for both columns of the SELECT result.
Now ORDER BY says
           a) If a <sort specification> contains a <column name>, then T             shall contain exactly one column
withthat <column name> and             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^             the <sort specification> identifies
thatcolumn.
 

which sure looks to me like it mandates an error for the example
statement.

However, since SQL doesn't consider the possibility of expressions as
ORDER BY entries, we are more or less on our own for those.  An
expression appearing in the target list of a SELECT is not allowed to
refer to columns by their "AS" names (and this does seem to be mandated
by SQL92).  So I think it makes sense to carry over the same restriction
to ORDER BY.
        regards, tom lane


pgsql-hackers by date:

Previous
From: Michael Richards
Date:
Subject: Re: [HACKERS] Counting bool flags in a complex query
Next
From: Tom Lane
Date:
Subject: Re: AW: [HACKERS] shared lib names