← Back to team overview

maria-developers team mailing list archive

bzr commit into file:///home/tsk/mprog/src/5.3-mwl68-unmerged/ branch (timour:2763)

 

#At file:///home/tsk/mprog/src/5.3-mwl68-unmerged/ based on revid:timour@xxxxxxxxxxxx-20100219215557-g1uohrur8bopfv7n

 2763 timour@xxxxxxxxxxxx	2010-02-22 [merge]
      Automerge with 5.3-subqueries

    modified:
      mysql-test/r/subselect_no_mat.result
      mysql-test/r/subselect_no_opts.result
      mysql-test/r/subselect_no_semijoin.result
      mysql-test/r/subselect_sj.result
      mysql-test/r/subselect_sj_jcl6.result
      mysql-test/t/subselect_no_mat.test
      mysql-test/t/subselect_no_opts.test
      mysql-test/t/subselect_no_semijoin.test
      mysql-test/t/subselect_sj.test
      sql/item.cc
      sql/item.h
      sql/item_subselect.cc
      sql/opt_table_elimination.cc
=== modified file 'mysql-test/r/subselect_no_mat.result'
--- a/mysql-test/r/subselect_no_mat.result	2010-02-17 21:59:41 +0000
+++ b/mysql-test/r/subselect_no_mat.result	2010-02-21 07:33:54 +0000
@@ -1,6 +1,6 @@
 show variables like 'optimizer_switch';
 Variable_name	Value
-optimizer_switch	index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on,table_elimination=on
+optimizer_switch	index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
 set optimizer_switch='materialization=off';
 drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t11,t12;
 select (select 2);
@@ -1360,9 +1360,9 @@ a
 3
 explain extended select * from t2 where t2.a in (select t1.a from t1,t3 where t1.b=t3.a);
 id	select_type	table	type	possible_keys	key	key_len	ref	rows	filtered	Extra
-1	PRIMARY	t2	index	a	a	5	NULL	4	100.00	Using where; Using index
-1	PRIMARY	t3	index	a	a	5	NULL	3	100.00	Using where; Using index
-1	PRIMARY	t1	ref	a	a	10	test.t2.a,test.t3.a	116	100.00	Using index; FirstMatch(t2)
+1	PRIMARY	t2	index	a	a	5	NULL	4	100.00	Using index
+1	PRIMARY	t3	index	a	a	5	NULL	3	100.00	Using index
+1	PRIMARY	t1	ref	a	a	10	test.t2.a,test.t3.a	116	100.61	Using index; FirstMatch(t2)
 Warnings:
 Note	1003	select `test`.`t2`.`a` AS `a` from `test`.`t2` semi join (`test`.`t1` join `test`.`t3`) where ((`test`.`t1`.`a` = `test`.`t2`.`a`) and (`test`.`t1`.`b` = `test`.`t3`.`a`))
 insert into t1 values (3,31);
@@ -4811,4 +4811,4 @@ End of 5.1 tests.
 set optimizer_switch=default;
 show variables like 'optimizer_switch';
 Variable_name	Value
-optimizer_switch	index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on,table_elimination=on
+optimizer_switch	index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on

=== modified file 'mysql-test/r/subselect_no_opts.result'
--- a/mysql-test/r/subselect_no_opts.result	2010-02-17 21:59:41 +0000
+++ b/mysql-test/r/subselect_no_opts.result	2010-02-21 07:33:54 +0000
@@ -1,6 +1,6 @@
 show variables like 'optimizer_switch';
 Variable_name	Value
-optimizer_switch	index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on,table_elimination=on
+optimizer_switch	index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
 set optimizer_switch='materialization=off,semijoin=off';
 drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t11,t12;
 select (select 2);
@@ -4811,4 +4811,4 @@ End of 5.1 tests.
 set optimizer_switch=default;
 show variables like 'optimizer_switch';
 Variable_name	Value
-optimizer_switch	index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on,table_elimination=on
+optimizer_switch	index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on

=== modified file 'mysql-test/r/subselect_no_semijoin.result'
--- a/mysql-test/r/subselect_no_semijoin.result	2010-02-17 21:59:41 +0000
+++ b/mysql-test/r/subselect_no_semijoin.result	2010-02-21 07:33:54 +0000
@@ -1,6 +1,6 @@
 show variables like 'optimizer_switch';
 Variable_name	Value
-optimizer_switch	index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on,table_elimination=on
+optimizer_switch	index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
 set optimizer_switch='semijoin=off';
 drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t11,t12;
 select (select 2);
@@ -4811,4 +4811,4 @@ End of 5.1 tests.
 set optimizer_switch=default;
 show variables like 'optimizer_switch';
 Variable_name	Value
-optimizer_switch	index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on,table_elimination=on
+optimizer_switch	index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on

=== modified file 'mysql-test/r/subselect_sj.result'
--- a/mysql-test/r/subselect_sj.result	2010-02-17 10:47:55 +0000
+++ b/mysql-test/r/subselect_sj.result	2010-02-21 07:53:12 +0000
@@ -202,39 +202,39 @@ BUG#37120 optimizer_switch allowable val
 
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
 set optimizer_switch='default,materialization=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=on,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=on
 set optimizer_switch='default,semijoin=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=off,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=off
 set optimizer_switch='default,loosescan=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=on,semijoin=on,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=on,semijoin=on
 set optimizer_switch='default,semijoin=off,materialization=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=off,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=off
 set optimizer_switch='default,materialization=off,semijoin=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=off,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=off
 set optimizer_switch='default,semijoin=off,materialization=off,loosescan=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=off,semijoin=off,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=off,semijoin=off
 set optimizer_switch='default,semijoin=off,loosescan=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=on,semijoin=off,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=on,semijoin=off
 set optimizer_switch='default,materialization=off,loosescan=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=off,semijoin=on,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=off,semijoin=on
 set optimizer_switch=default;
 drop table t0, t1, t2;
 drop table t10, t11, t12;

=== modified file 'mysql-test/r/subselect_sj_jcl6.result'
--- a/mysql-test/r/subselect_sj_jcl6.result	2010-02-17 10:47:55 +0000
+++ b/mysql-test/r/subselect_sj_jcl6.result	2010-02-21 07:53:12 +0000
@@ -206,39 +206,39 @@ BUG#37120 optimizer_switch allowable val
 
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=on
 set optimizer_switch='default,materialization=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=on,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=on
 set optimizer_switch='default,semijoin=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=off,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=on,semijoin=off
 set optimizer_switch='default,loosescan=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=on,semijoin=on,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=on,semijoin=on
 set optimizer_switch='default,semijoin=off,materialization=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=off,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=off
 set optimizer_switch='default,materialization=off,semijoin=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=off,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=on,materialization=off,semijoin=off
 set optimizer_switch='default,semijoin=off,materialization=off,loosescan=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=off,semijoin=off,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=off,semijoin=off
 set optimizer_switch='default,semijoin=off,loosescan=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=on,semijoin=off,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=on,semijoin=off
 set optimizer_switch='default,materialization=off,loosescan=off';
 select @@optimizer_switch;
 @@optimizer_switch
-index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=off,semijoin=on,table_elimination=on
+index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,index_condition_pushdown=on,firstmatch=on,loosescan=off,materialization=off,semijoin=on
 set optimizer_switch=default;
 drop table t0, t1, t2;
 drop table t10, t11, t12;

=== modified file 'mysql-test/t/subselect_no_mat.test'
--- a/mysql-test/t/subselect_no_mat.test	2010-01-17 14:51:10 +0000
+++ b/mysql-test/t/subselect_no_mat.test	2010-02-21 07:33:54 +0000
@@ -1,11 +1,13 @@
 # 
 # Run subselect.test without semi-join optimization (test materialize)
 #
+--replace_regex /,table_elimination=on//
 show variables like 'optimizer_switch';
 set optimizer_switch='materialization=off';
 
 --source t/subselect.test
 
 set optimizer_switch=default;
+--replace_regex /,table_elimination=on//
 show variables like 'optimizer_switch';
 

=== modified file 'mysql-test/t/subselect_no_opts.test'
--- a/mysql-test/t/subselect_no_opts.test	2010-01-17 14:51:10 +0000
+++ b/mysql-test/t/subselect_no_opts.test	2010-02-21 07:33:54 +0000
@@ -1,11 +1,13 @@
 # 
 # Run subselect.test without semi-join optimization (test materialize)
 #
+--replace_regex /,table_elimination=on//
 show variables like 'optimizer_switch';
 set optimizer_switch='materialization=off,semijoin=off';
 
 --source t/subselect.test
 
 set optimizer_switch=default;
+--replace_regex /,table_elimination=on//
 show variables like 'optimizer_switch';
 

=== modified file 'mysql-test/t/subselect_no_semijoin.test'
--- a/mysql-test/t/subselect_no_semijoin.test	2010-01-17 14:51:10 +0000
+++ b/mysql-test/t/subselect_no_semijoin.test	2010-02-21 07:33:54 +0000
@@ -1,11 +1,13 @@
 # 
 # Run subselect.test without semi-join optimization (test materialize)
 #
+--replace_regex /,table_elimination=on//
 show variables like 'optimizer_switch';
 set optimizer_switch='semijoin=off';
 
 --source t/subselect.test
 
 set optimizer_switch=default;
+--replace_regex /,table_elimination=on//
 show variables like 'optimizer_switch';
 

=== modified file 'mysql-test/t/subselect_sj.test'
--- a/mysql-test/t/subselect_sj.test	2010-02-11 23:59:58 +0000
+++ b/mysql-test/t/subselect_sj.test	2010-02-21 07:53:12 +0000
@@ -96,30 +96,39 @@ explain extended select * from t1 where 
 --echo BUG#37120 optimizer_switch allowable values not according to specification
 --echo
 
+--replace_regex /,table_elimination=on//
 select @@optimizer_switch; 
 
 set optimizer_switch='default,materialization=off';
+--replace_regex /,table_elimination=on//
 select @@optimizer_switch; 
 
 set optimizer_switch='default,semijoin=off';
+--replace_regex /,table_elimination=on//
 select @@optimizer_switch; 
 
 set optimizer_switch='default,loosescan=off';
+--replace_regex /,table_elimination=on//
 select @@optimizer_switch; 
 
 set optimizer_switch='default,semijoin=off,materialization=off';
+--replace_regex /,table_elimination=on//
 select @@optimizer_switch; 
 
 set optimizer_switch='default,materialization=off,semijoin=off';
+--replace_regex /,table_elimination=on//
 select @@optimizer_switch; 
 
 set optimizer_switch='default,semijoin=off,materialization=off,loosescan=off';
+--replace_regex /,table_elimination=on//
 select @@optimizer_switch; 
 
 set optimizer_switch='default,semijoin=off,loosescan=off';
+--replace_regex /,table_elimination=on//
 select @@optimizer_switch; 
 
 set optimizer_switch='default,materialization=off,loosescan=off';
+--replace_regex /,table_elimination=on//
 select @@optimizer_switch; 
 set optimizer_switch=default;
 

=== modified file 'sql/item.cc'
--- a/sql/item.cc	2010-02-11 23:59:58 +0000
+++ b/sql/item.cc	2010-02-21 06:32:23 +0000
@@ -1959,7 +1959,7 @@ void Item_field::reset_field(Field *f)
 bool Item_field::enumerate_field_refs_processor(uchar *arg)
 {
   Field_enumerator *fe= (Field_enumerator*)arg;
-  fe->visit_field(field);
+  fe->visit_field(this);
   return FALSE;
 }
 
@@ -5779,6 +5779,35 @@ Item_ref::Item_ref(Name_resolution_conte
     set_properties();
 }
 
+/*
+  A Field_enumerator-compatible class that invokes mark_as_dependent() for
+  each field that is a reference to some ancestor of current_select.
+*/
+class Dependency_marker: public Field_enumerator
+{
+public:
+  THD *thd;
+  st_select_lex *current_select;
+  virtual void visit_field(Item_field *item)
+  {
+    // Find which select the field is in. This is achieved by walking up 
+    // the select tree and looking for the table of interest.
+    st_select_lex *sel;
+    for (sel= current_select; sel; sel= sel->outer_select())
+    {
+      TABLE_LIST *tbl;
+      for (tbl= sel->leaf_tables; tbl; tbl= tbl->next_leaf)
+      {
+        if (tbl->table == item->field->table)
+        {
+          if (sel != current_select)
+            mark_as_dependent(thd, sel, current_select, item, item);
+          return;
+        }
+      }
+    }
+  }
+};
 
 /**
   Resolve the name of a reference to a column reference.
@@ -6038,6 +6067,20 @@ bool Item_ref::fix_fields(THD *thd, Item
                       last_checked_context->select_lex->nest_level);
     }
   }
+  else
+  {
+    ;
+    /*
+      It could be that we're referring to something that's in ancestor selects.
+      We must make an appropriate mark_as_dependent() call for each such
+      outside reference.
+    */
+    Dependency_marker dep_marker;
+    dep_marker.current_select= current_sel;
+    dep_marker.thd= thd;
+    (*ref)->walk(&Item::enumerate_field_refs_processor, FALSE,
+                 (uchar*)&dep_marker);
+  }
 
   DBUG_ASSERT(*ref);
   /*

=== modified file 'sql/item.h'
--- a/sql/item.h	2010-02-17 10:05:27 +0000
+++ b/sql/item.h	2010-02-21 06:32:23 +0000
@@ -1134,7 +1134,7 @@ public:
 class Field_enumerator
 {
 public:
-  virtual void visit_field(Field *field)= 0;
+  virtual void visit_field(Item_field *field)= 0;
   virtual ~Field_enumerator() {}; /* purecov: inspected */
 };
 
@@ -2378,7 +2378,12 @@ public:
     return ref ? (*ref)->real_item() : this;
   }
   bool walk(Item_processor processor, bool walk_subquery, uchar *arg)
-  { return (*ref)->walk(processor, walk_subquery, arg); }
+  { 
+    if (ref && *ref)
+      return (*ref)->walk(processor, walk_subquery, arg); 
+    else
+      return FALSE;
+  }
   bool enumerate_field_refs_processor(uchar *arg)
   { return (*ref)->enumerate_field_refs_processor(arg); }
   virtual void print(String *str, enum_query_type query_type);

=== modified file 'sql/item_subselect.cc'
--- a/sql/item_subselect.cc	2010-02-19 21:55:57 +0000
+++ b/sql/item_subselect.cc	2010-02-22 13:57:09 +0000
@@ -168,6 +168,11 @@ bool Item_subselect::fix_fields(THD *thd
   {
     done_first_fix_fields= TRUE;
     inside_first_fix_fields= TRUE;
+    upper_refs.empty();
+    /*
+      psergey-todo: remove _first_fix_fields calls, we need changes on every
+      execution
+    */
   }
 
   eliminated= FALSE;
@@ -182,6 +187,7 @@ bool Item_subselect::fix_fields(THD *thd
   changed= 1;
   inside_first_fix_fields= FALSE;
 
+
   if (!res)
   {
     // all transformation is done (used by prepared statements)
@@ -212,12 +218,14 @@ bool Item_subselect::fix_fields(THD *thd
       if (!(*ref)->fixed)
 	ret= (*ref)->fix_fields(thd, ref);
       thd->where= save_where;
+  done_first_fix_fields= FALSE;
       return ret;
     }
     // Is it one field subselect?
     if (engine->cols() > max_columns)
     {
       my_error(ER_OPERAND_COLUMNS, MYF(0), 1);
+  done_first_fix_fields= FALSE;
       return TRUE;
     }
     fix_length_and_dec();
@@ -234,6 +242,7 @@ bool Item_subselect::fix_fields(THD *thd
   fixed= 1;
 
 err:
+  done_first_fix_fields= FALSE;
   thd->where= save_where;
   return res;
 }
@@ -276,6 +285,7 @@ bool Item_subselect::mark_as_dependent(T
   return FALSE;
 }
 
+
 /*
   Adjust attributes after our parent select has been merged into grandparent
 
@@ -304,18 +314,19 @@ void Item_subselect::fix_after_pullout(s
   parent_select= new_parent;
 }
 
+
 class Field_fixer: public Field_enumerator
 {
 public:
   table_map used_tables; /* Collect used_tables here */
   st_select_lex *new_parent; /* Select we're in */
-  virtual void visit_field(Field *field)
+  virtual void visit_field(Item_field *item)
   {
     //for (TABLE_LIST *tbl= new_parent->leaf_tables; tbl; tbl= tbl->next_local)
     //{
     //  if (tbl->table == field->table)
     //  {
-        used_tables|= field->table->map;
+        used_tables|= item->field->table->map;
     //    return;
     //  }
     //}

=== modified file 'sql/opt_table_elimination.cc'
--- a/sql/opt_table_elimination.cc	2010-01-17 14:51:10 +0000
+++ b/sql/opt_table_elimination.cc	2010-02-21 06:32:23 +0000
@@ -922,8 +922,9 @@ public:
   Field_dependency_recorder(Dep_analysis_context *ctx_arg): ctx(ctx_arg)
   {}
   
-  void visit_field(Field *field)
+  void visit_field(Item_field *item)
   {
+    Field *field= item->field;
     Dep_value_table *tbl_dep;
     if ((tbl_dep= ctx->table_deps[field->table->tablenr]))
     {

# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: timour@xxxxxxxxxxxx-20100222135709-3568ya6z76hkwfzs
# target_branch: file:///home/tsk/mprog/src/5.3-mwl68-unmerged/
# testament_sha1: 4c6e85e0db24610ce71fcd5c7ac5b6f79c2c42cb
# timestamp: 2010-02-22 15:57:18 +0200
# base_revision_id: timour@xxxxxxxxxxxx-20100219215557-\
#   g1uohrur8bopfv7n
# 
# Begin bundle
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
yq1ygA==