Fix an oversight in checking whether a join with LATERAL refs is legal.
authorTom Lane
Fri, 31 Jul 2015 23:26:33 +0000 (19:26 -0400)
committerTom Lane
Fri, 31 Jul 2015 23:26:33 +0000 (19:26 -0400)
commita4df781c9037584d66a6f04b0b010a5bab0b509b
tree12d883e53004ef3a0350c7182dd228a8fa6409d6
parentcaae9f764699e44e2e95394b90f48d4429b8ea3f
Fix an oversight in checking whether a join with LATERAL refs is legal.

In many cases, we can implement a semijoin as a plain innerjoin by first
passing the righthand-side relation through a unique-ification step.
However, one of the cases where this does NOT work is where the RHS has
a LATERAL reference to the LHS; that makes the RHS dependent on the LHS
so that unique-ification is meaningless.  joinpath.c understood this,
and so would not generate any join paths of this kind ... but join_is_legal
neglected to check for the case, so it would think that we could do it.
The upshot would be a "could not devise a query plan for the given query"
failure once we had failed to generate any join paths at all for the bogus
join pair.

Back-patch to 9.3 where LATERAL was added.
src/backend/optimizer/path/joinrels.c
src/test/regress/expected/join.out
src/test/regress/sql/join.sql