Thread: BUG #9041: Strange error message with LATERAL and mixed WHERE/ON conditions

BUG #9041: Strange error message with LATERAL and mixed WHERE/ON conditions

From
levertond@googlemail.com
Date:
The following bug has been logged on the website:

Bug reference:      9041
Logged by:          David Leverton
Email address:      levertond@googlemail.com
PostgreSQL version: 9.3.2
Operating system:   Oracle Enterprise Linux 5 x86_64
Description:

The following query fails with the message "JOIN qualification cannot refer
to other relations":

SELECT *
FROM (SELECT 1 AS x) x
CROSS JOIN (SELECT 1 AS y) y
LEFT JOIN LATERAL (
  SELECT *
  FROM (SELECT 1 AS z) z
  WHERE z.z = x.x
) z ON z.z = y.y;

I don't see why this shouldn't be legal, but if it isn't it should at least
give a less vague error message.

(For the record, the mixture of WHERE and ON is because in the real query,
the LATERAL subquery including the WHERE clause is actually an inlineable
SRF call.)

Postgres was installed using the pgrpms.org packages, and all settings other
than listen_addresses are at their default values.
levertond@googlemail.com writes:
> The following query fails with the message "JOIN qualification cannot refer
> to other relations":

> SELECT *
> FROM (SELECT 1 AS x) x
> CROSS JOIN (SELECT 1 AS y) y
> LEFT JOIN LATERAL (
>   SELECT *
>   FROM (SELECT 1 AS z) z
>   WHERE z.z = x.x
> ) z ON z.z = y.y;

> I don't see why this shouldn't be legal, but if it isn't it should at least
> give a less vague error message.

Yeah, that query looks legal to me too.  It's tripping over a planner bug,
and the error report is from an internal consistency check, which explains
its not-too-user-friendly nature.  Will fix, thanks for the report!

            regards, tom lane