Hi Øystein,
thank you for reviewing.
On 22.02.11 08.53, Øystein Grøvlen wrote:
> Hi Roy,
>
> Thanks for fixing this. The patch is approved. Some minor suggestions in-line.
>
>
> On 02/14/2011 04:01 PM, Roy Lyseng wrote:
> > #At file:///home/rl136806/mysql/repo/mysql-work5/ based on
> revid:roy.lyseng@stripped
> >
> > 3343 Roy Lyseng 2011-02-14
> > Bug#11766739: Crash in tmp_table_param::init() with semijoin=on
> >
> > Used to be bug#59919.
> >
> > A crash occurs when a certain subquery is transformed with a semi join
> > and a semi join materialization operation is attempted.
> > The subquery contains a nested join structure (an outer join where
> > the inner part is itself an inner join).
> > Function setup_sj_materialization() tries to lookup the embedding
> > semi join nest for an inner table of the subquery. However, it uses
> > the pointer tab->table->pos_in_table_list->embedding, pointing to
> > an outer join nest, instead of the correct pointer tab->emb_sj_nest.
> > When dereferencing this pointer, a crash occurs.
> >
> > mysql-test/include/subquery_sj.inc
> > Added test case for bug#11766739
> >
> > mysql-test/r/subquery_sj_all.result
> > mysql-test/r/subquery_sj_all_jcl6.result
> > mysql-test/r/subquery_sj_all_jcl7.result
> > mysql-test/r/subquery_sj_dupsweed.result
> > mysql-test/r/subquery_sj_dupsweed_jcl6.result
> > mysql-test/r/subquery_sj_dupsweed_jcl7.result
> > mysql-test/r/subquery_sj_firstmatch.result
> > mysql-test/r/subquery_sj_firstmatch_jcl6.result
> > mysql-test/r/subquery_sj_firstmatch_jcl7.result
> > mysql-test/r/subquery_sj_loosescan.result
> > mysql-test/r/subquery_sj_loosescan_jcl6.result
> > mysql-test/r/subquery_sj_loosescan_jcl7.result
> > mysql-test/r/subquery_sj_mat.result
> > mysql-test/r/subquery_sj_mat_jcl6.result
> > mysql-test/r/subquery_sj_mat_jcl7.result
> > mysql-test/r/subquery_sj_mat_nosj.result
> > mysql-test/r/subquery_sj_none.result
> > mysql-test/r/subquery_sj_none_jcl6.result
> > mysql-test/r/subquery_sj_none_jcl7.result
> > Added test results for bug#11766739
> >
> > sql/sql_select.cc
> > In setup_sj_materialization(), replaced use of pointer
> > tab->table->pos_in_table_list->embedding with
> > tab->emb_sj_nest.
> >
> > modified:
> > mysql-test/include/subquery_sj.inc
> > mysql-test/r/subquery_sj_all.result
> > mysql-test/r/subquery_sj_all_jcl6.result
> > mysql-test/r/subquery_sj_all_jcl7.result
> > mysql-test/r/subquery_sj_dupsweed.result
> > mysql-test/r/subquery_sj_dupsweed_jcl6.result
> > mysql-test/r/subquery_sj_dupsweed_jcl7.result
> > mysql-test/r/subquery_sj_firstmatch.result
> > mysql-test/r/subquery_sj_firstmatch_jcl6.result
> > mysql-test/r/subquery_sj_firstmatch_jcl7.result
> > mysql-test/r/subquery_sj_loosescan.result
> > mysql-test/r/subquery_sj_loosescan_jcl6.result
> > mysql-test/r/subquery_sj_loosescan_jcl7.result
> > mysql-test/r/subquery_sj_mat.result
> > mysql-test/r/subquery_sj_mat_jcl6.result
> > mysql-test/r/subquery_sj_mat_jcl7.result
> > mysql-test/r/subquery_sj_mat_nosj.result
> > mysql-test/r/subquery_sj_none.result
> > mysql-test/r/subquery_sj_none_jcl6.result
> > mysql-test/r/subquery_sj_none_jcl7.result
> > sql/sql_select.cc
> > === modified file 'mysql-test/include/subquery_sj.inc'
> > --- a/mysql-test/include/subquery_sj.inc 2011-01-27 11:38:22 +0000
> > +++ b/mysql-test/include/subquery_sj.inc 2011-02-14 15:01:33 +0000
> > @@ -3504,3 +3504,25 @@ deallocate prepare s;
> > DROP TABLE ot1, ot2, ot3, it1;
> >
> > --echo # End of the test for bug#57623.
> > +
> > +--echo #
> > +--echo # Bug#11766739: Crash in tmp_table_param::init() with semijoin=on
> > +--echo #
> > +
> > +CREATE TABLE a (f1 INTEGER NOT NULL) ENGINE=MyISAM;
> > +CREATE TABLE b (f1 INTEGER NOT NULL, f2 INTEGER) ENGINE=MyISAM;
>
> Suggestions, which you may feel free to ignore:
> - Use t1, t2 for table names.
Done.
> - "NOT NULL" is not significant and can be dropped to get a more
> minimal test case.
Done.
> - Since MyISAM is default in this test, it should not be necessary
> to specify engine. (I acknowledge that this error does not occur
> with Innodb since constant optimizations will not be done.)
I prefer to be explicit on this one.
>
> > +
> > +INSERT INTO a VALUES (1);
> > +INSERT INTO b VALUES (1,1), (2,1);
> > +
> > +let $query=
> > +SELECT * FROM b
> > +WHERE f2 IN (SELECT a.f1
> > + FROM a LEFT OUTER JOIN (b AS b1 JOIN b AS b2 ON 1=1) ON 1=1);
>
> How aboue "ON TRUE" instead of "ON 1=1"?
Done.
>
> > +
> > +eval EXPLAIN $query;
> > +eval $query;
> > +
> > +DROP TABLE a, b;
> > +
> > +--echo # End of the test for bug#11766739.
> >
>
> ...
>
> --
> Øystein
>