diff --git a/sql/select_handler.cc b/sql/select_handler.cc
index 795ed8eb641..2f45a4e49ca 100644
--- a/sql/select_handler.cc
+++ b/sql/select_handler.cc
@@ -104,7 +104,9 @@ bool select_handler::send_data()
 {
   DBUG_ENTER("Pushdown_select::send_data");
 
-  if (select->join->result->send_data(result_columns))
+  int res= select->join->result->send_data(result_columns);
+  // "-1" means "duplicate when executing UNION"
+  if (res && res != -1)
     DBUG_RETURN(true);
 
   DBUG_RETURN(false);
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index 9382625a747..00e96356e71 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -5495,7 +5495,8 @@ void st_select_lex::set_explain_type(bool on_the_fly)
       using_materialization= TRUE;
   }
 
-  if (master_unit()->thd->lex->first_select_lex() == this)
+  //if (master_unit()->thd->lex->first_select_lex() == this)
+  if (pushdown_select)
   {
     if (pushdown_select)
       type= pushed_select_text;
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index b76ec6d14f3..87eebe45c4d 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -1842,6 +1842,8 @@ int JOIN::optimize()
   join_optimization_state init_state= optimization_state;
   if (select_lex->pushdown_select)
   {
+    if (optimization_state == JOIN::OPTIMIZATION_DONE)
+      return 0;
     // Do same as JOIN::optimize_inner does:
     fields= &select_lex->item_list;
 
@@ -4907,8 +4909,8 @@ void JOIN::cleanup_item_list(List<Item> &items) const
 select_handler *find_select_handler(THD *thd,
                                     SELECT_LEX* select_lex)
 {
-  if (select_lex->next_select())
-    return 0;
+ // if (select_lex->next_select())
+ //   return 0;
   if (select_lex->master_unit()->outer_select())
     return 0;
 
diff --git a/sql/sql_union.cc b/sql/sql_union.cc
index e8bdbcba2f2..8c62d1e0ac8 100644
--- a/sql/sql_union.cc
+++ b/sql/sql_union.cc
@@ -2054,6 +2054,8 @@ void st_select_lex_unit::optimize_bag_operation(bool is_outer_distinct)
 }
 
 
+select_handler *find_select_handler(THD *thd,
+                                    SELECT_LEX* select_lex);
 /**
   Run optimization phase.
 
@@ -2141,6 +2143,9 @@ bool st_select_lex_unit::optimize()
           (lim.is_unlimited() || sl->braces) ?
           sl->options & ~OPTION_FOUND_ROWS : sl->options | found_rows_for_union;
 
+        // psergey:
+        sl->pushdown_select= find_select_handler(thd, sl);
+        
 	saved_error= sl->join->optimize();
       }
 
