From: Jorgen Loland Date: December 1 2010 11:32am Subject: Re: bzr commit into mysql-trunk branch (roy.lyseng:3287) Bug#57525 List-Archive: http://lists.mysql.com/commits/125641 Message-Id: <4CF63263.1040207@oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit On 12/01/2010 12:22 PM, Roy Lyseng wrote: > Hi Jørgen, > > On 01.12.10 09.41, Jorgen Loland wrote: >> Roy, >> >> thank you for the patch. I agree to the logic of setting >> OUTER_REF_TABLE_BIT in >> all selects that have subselects with outer dependencies. However, I >> wonder if >> this is the correct place to fix the bug. See comment below. >> >> > === modified file 'sql/item.cc' >> > --- a/sql/item.cc 2010-11-14 18:09:32 +0000 >> > +++ b/sql/item.cc 2010-11-18 09:47:04 +0000 >> > @@ -2359,17 +2366,16 @@ void Item_field::fix_after_pullout(st_se >> > */ >> > st_select_lex *child_select= context->select_lex; >> > >> > - if (child_select->outer_select() != depended_from) >> > + while (child_select->outer_select() != depended_from) >> > { >> > /* >> > The subquery on this level is outer-correlated with respect to the >> field >> > */ >> > Item_subselect *subq_predicate= child_select->master_unit()->item; >> > - subq_predicate->used_tables_cache|= OUTER_REF_TABLE_BIT; >> > - } >> > >> > - while (child_select->outer_select() != depended_from) >> > + subq_predicate->used_tables_cache|= OUTER_REF_TABLE_BIT; >> > child_select= child_select->outer_select(); >> > + } >> >> AFAIU, the problem in this bug was that SELECT C did not have ORTB set >> after >> semijoin transformation but with the patch it does: >> >> Before semijoin >> --------------- >> A - t1 <- OUTER_REF_TABLE_BIT not set >> \ >> B - t2 <- OUTER_REF_TABLE_BIT not set >> \ >> C - t3 <- OUTER_REF_TABLE_BIT not set >> \ >> D - t4 <- ORTB set, depended_from points to A >> where t1.x=t4.y >> >> >> After semijoining B into A >> -------------------------- >> A - t1, t2 <- OUTER_REF_TABLE_BIT not set >> \ >> C - t3 <- pre-patch: OUTER_REF_TABLE_BIT not set >> \ post-patch: OUTER_REF_TABLE_BIT set >> D - t4 <- ORTB set, depended_from points to A >> where t1.x=t4.y >> >> With the logic that SELECT C should have ORTB set because it contains a >> subselect that has a dependency to ot1, wouldn't it be more correct to >> set this >> bit both for SELECT B and C during the prepare stage rather than >> during semijoin >> transformation? >> > > Sorry for confusing you - the ORTB is indeed set for subquery predicates > in SELECT B and C after initial resolver stage. So my patch just tries > to preserve that information during fix_after_pullout() calls. Aahh... in that case: patch approved. -- Jørgen Løland | Senior Software Engineer | +47 73842138 Oracle MySQL Trondheim, Norway