Re: Table name scope (was Re: [BUGS] Outer joins aren't working with views) - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Table name scope (was Re: [BUGS] Outer joins aren't working with views)
Date
Msg-id 21018.977076348@sss.pgh.pa.us
Whole thread Raw
In response to Re: Table name scope (was Re: [BUGS] Outer joins aren't working with views)  (Thomas Lockhart <lockhart@alumni.caltech.edu>)
Responses Re: Table name scope (was Re: [BUGS] Outer joins aren't working with views)  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
Thomas Lockhart <lockhart@alumni.caltech.edu> writes:
> In particular, how can

>   select t1.*, t2.* from t1 natural join t2;

> produce columns from t1 and t2 which are *not present* in the join "t1
> natural join t2"?

Very easily ;-)

>> What's even more interesting is that I can find no equivalent
>> text in SQL99.

> Of course. When they bloated the spec by a factor of three or four, they
> had to leave out the clear parts to save space ;)

Or they realized they blew it the first time.

> I'm pretty sure that the sections I quoted (in 7.7.7 in the draft
> document I have --  hopefully the same as what you have available?)
> cover this topic. In particular, NATURAL and USING joins are not the
> same as other inner or outer joins in the resulting set of available
> columns.

There's no question about what happens as far as the output of the join
is concerned.  However, 7.7.7 does not say word one about what is
implied by direct access (ie, qualified-name access) to the component
tables of the join.

I've been through the SQL99 draft again, and there is quite clearly NOT
any restriction corresponding to the old 6.4.2.b; so under SQL99 it is
legal to refer to A.ID and B.ID.  However, they do still have the idea
that A.* should omit ID: 7.11 <query specification> syntax rule 7.g.i
(concerning expansion of qualified asterisks) says
             i) If the basis is a <table or query name> or <correlation                name>, then let TQ be the table
associatedwith the basis.                The <select sublist> is equivalent to a <value expression>
sequencein which each <value expression> is a column                reference CR that references a column of TQ that is
not               a common column of a <joined table>. Each column of TQ                that is not a referenced common
columnshall be referenced                exactly once. The columns shall be referenced in the                ascending
sequenceof their ordinal positions within TQ.
 

which is essentially taken from 7.9.4 of the old spec.  This is a mess;
I wonder if the discrepancy between qualified-name access and asterisk
expansion is deliberate?  (Perhaps they felt that allowing qualified
name access was an extension that wouldn't break old code, but that they
couldn't change the asterisk expansion rule without breaking backwards
compatibility?)  It'd be nice to see if this is still true in SQL99
final.

> So there are two issues here which I hope to clarify: scoping
> on joins, and NATURAL and USING join column sets.

Two issues?  I thought we were only arguing about the latter one.
        regards, tom lane


pgsql-hackers by date:

Previous
From: "Michael Richards"
Date:
Subject: More Tuple Madness
Next
From: Tom Lane
Date:
Subject: Re: More Tuple Madness