Обсуждение: Curiously confused query parser.
Welcome to the POSTGRESQL interactive sql monitor: Please read the file COPYRIGHT for copyright terms of POSTGRESQL [PostgreSQL 6.6.0 on i386-unknown-freebsd3.2, compiled by gcc 2.7.2.1] (a side note - wouldn't it be helpful to have a little more info about the build, namely its time stamp and/or the CVS time stamp) test=> \d ord Table = ord +----------------------------------+----------------------------------+----- --+ | Field | Type | Length| +----------------------------------+----------------------------------+----- --+ | id | int4 | 4 | | pos | int4 | 4 | | tp | int4 | 4 | +----------------------------------+----------------------------------+----- --+ test=> select * from ord; id|pos|tp --+---+--1| 1| 12| 2| 13| 3| 24| 1| 25| 3| 1 (5 rows) This query is fine: test=> select o1.id from ord as o1, ord as o2 where o1.pos>2 and o2.pos<2 test-> and o1.tp=o2.tp; id --53 (2 rows) And this one is invalid: test=> select o1.id from ord as o1, ord as o2 where o1.pos>2 and o2.pos<2 test-> and o1.tp=o2.tp and ord.id>3; id --5533 (4 rows) This query should probably fail instead of returning an invalid result. MS SQL 6.5 does just that: Msg 107, Level 16, State 3 The column prefix 'ord' does not match with a table name or alias name used in the query. Gene Sokolov
"Gene Sokolov" <hook@aktrad.ru> writes:
> This query is fine:
> test=> select o1.id from ord as o1, ord as o2 where o1.pos>2 and o2.pos<2
test-> and o1.tp=o2.tp;
> id
> --
> 5
> 3
> (2 rows)
> And this one is invalid:
> test=> select o1.id from ord as o1, ord as o2 where o1.pos>2 and o2.pos<2
test-> and o1.tp=o2.tp and ord.id>3;
> id
> --
> 5
> 5
> 3
> 3
> (4 rows)
It's not invalid, at least not according to Postgres' view of the world;
your reference to ord.id adds an implicit "FROM ord AS ord" to the FROM
clause, turning the query into a 3-way join. The output is correct for
that interpretation.
Implicit FROM clauses are a POSTQUEL leftover that is not to be found
in the SQL92 spec. There's been some talk of emitting a warning message
when one is added, because we do regularly see questions from confused
users. But if we took the feature out entirely, we'd doubtless break
some existing applications :-(
regards, tom lane
Gene Sokolov wrote:
> And this one is invalid:
>
> test=> select o1.id from ord as o1, ord as o2 where o1.pos>2 and o2.pos<2
> test-> and o1.tp=o2.tp and ord.id>3;
> id
> --
> 5
> 5
> 3
> 3
> (4 rows)
>
> This query should probably fail instead of returning an invalid result. MS
> SQL 6.5 does just that:
>
> Msg 107, Level 16, State 3
> The column prefix 'ord' does not match with a table name or alias name used
> in the query.
Seems PostgreSQL tries to be a little too smart. It
automatically adds another rangetable entry for ORD, so the
query is executed as
test=> select o1.id from ord as o1, ord as o2, ord as auto_rte
test-> where o1.pos>2 and o2.pos<2
test-> and o1.tp=o2.tp and auto_rte.id>3;
For this query, the result is O.K.
I don't know if this is according to the SQL specs and MS is
wrong, or if PostgreSQL is violating the specs. Thomas?
Jan
--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me. #
#========================================= wieck@debis.com (Jan Wieck) #