← Back to team overview

maria-developers team mailing list archive

Re: Rev 2750: BUG#31480: Incorrect result for nested subquery when executed via semi join in file:///home/psergey/dev/maria-5.3-subqueries-r3/

 

Igor,

On Thu, Jan 28, 2010 at 06:25:40PM +0300, Sergey Petrunya wrote:
> At file:///home/psergey/dev/maria-5.3-subqueries-r3/
> 
> ------------------------------------------------------------
> revno: 2750
> revision-id: psergey@xxxxxxxxxxxx-20100128152533-q0dicbcuu9fvol5p
> parent: psergey@xxxxxxxxxxxx-20100128134833-9000udjp5wa3tsff
> committer: Sergey Petrunya <psergey@xxxxxxxxxxxx>
> branch nick: maria-5.3-subqueries-r3
> timestamp: Thu 2010-01-28 18:25:33 +0300
> message:
>   BUG#31480: Incorrect result for nested subquery when executed via semi join
>   - Make Item_subselect store its "depth", distance to 
>     furthest_correlated_ancestor, and bitmaps of tables that it depends on in
>     ancestor tables. This allows to have Item_subselect to update its attributes
>     when it has been pulled out from a select to its parent.

Ok, I have ported the fix and it worked, but now I realize that the fix in this
form probably won't be useful for FROM flattening. The problem is that current 
fix depends on the fact that the process of pullout is done as follows:

 - all tables in the parent select remain there and keep their table_map bits.
 - tables from the child select are added into the parent select and assigned
   the free bits.
This means that 
1. subquery predicates that were originally in the parent select do not depend
   on tables from the child select and hence do not their used_tables() to be
   updated.
2. subquery predicates that were in the child select do need their
   used_tables() to be updated but the new used_tables() can be calculated
   from the old ones.

For FROM subqueries, this approach won't work. Consider an example:

SELECT * FROM ot1, 
              (SELECT ... FROM it1, it2) tbl 
WHERE 
  oe IN (SELECT .. WHERE .. tbl.col1 ...) OR ...  # --(subq1)

Here, before the flattening subquery predicate will have
 
  subq1->used_tables() = {tbl} 

but after the flattening it will become 

  subq1->used_tables() = <whatever of (it1, it2) are used in tbl.col1>
.

This means that I'll have to modify the code to do this. I've already started
to do that.

BR
 Sergey
-- 
Sergey Petrunia, Software Developer
Monty Program AB, http://askmonty.org
Blog: http://s.petrunia.net/blog



References