diff -Narup ./022_mariadb-10.0.15-auto_increment/sql/ha_partition.cc ./023_mariadb-10.0.15-partition_parallel_search2/sql/ha_partition.cc
--- ./022_mariadb-10.0.15-auto_increment/sql/ha_partition.cc	2014-11-29 17:05:30.813505210 +0900
+++ ./023_mariadb-10.0.15-partition_parallel_search2/sql/ha_partition.cc	2014-11-29 17:05:41.677420762 +0900
@@ -58,6 +58,7 @@
 #include "sql_plugin.h"
 #include "sql_show.h"                        // append_identifier
 #include "sql_admin.h"                       // SQL_ADMIN_MSG_TEXT_SIZE
+#include "sql_select.h"
 
 #include "debug_sync.h"
 
@@ -5367,9 +5368,12 @@ int ha_partition::rnd_next(uchar *buf)
     if (!bulk_access_executing)
     {
 #endif
-    error = handle_pre_scan(FALSE, FALSE);
-    if (error)
-      DBUG_RETURN(error);
+      if (check_parallel_search())
+        error= handle_pre_scan(FALSE, TRUE);
+      else
+        error= handle_pre_scan(FALSE, FALSE);
+      if (m_pre_calling || error)
+        DBUG_RETURN(error);
 #ifdef HA_CAN_BULK_ACCESS
     }
 #endif
@@ -6271,7 +6275,10 @@ int ha_partition::common_first_last(ucha
   {
     if (!bulk_access_executing)
     {
-      error = handle_pre_scan(FALSE, FALSE);
+      if (check_parallel_search())
+        error= handle_pre_scan(FALSE, TRUE);
+      else
+        error= handle_pre_scan(FALSE, FALSE);
       if (m_pre_calling || error)
         return error;
     }
@@ -6996,6 +7003,136 @@ int ha_partition::partition_scan_set_up(
 }
 
 
+bool ha_partition::check_parallel_search()
+{
+  TABLE_LIST *table_list= table->pos_in_table_list;
+  DBUG_ENTER("ha_partition::check_parallel_search");
+  if (table_list)
+  {
+    while (table_list->parent_l)
+      table_list = table_list->parent_l;
+    st_select_lex *select_lex= table_list->select_lex;
+    DBUG_PRINT("info",("partition select_lex=%p", select_lex));
+    if (select_lex)
+    {
+      if (!select_lex->explicit_limit)
+      {
+        DBUG_PRINT("info",("partition explicit_limit=FALSE"));
+        DBUG_PRINT("info",("partition TRUE"));
+        DBUG_RETURN(TRUE);
+      }
+      JOIN *join = select_lex->join;
+      DBUG_PRINT("info",("partition join=%p", join));
+      if (join && join->skip_sort_order)
+      {
+        DBUG_PRINT("info",("partition order_list.elements=%u",
+          select_lex->order_list.elements));
+        if (select_lex->order_list.elements)
+        {
+          Item *item = *select_lex->order_list.first->item;
+          DBUG_PRINT("info",("partition item=%p", item));
+          DBUG_PRINT("info",("partition item->type()=%u", item->type()));
+          DBUG_PRINT("info",("partition m_part_info->part_type=%u",
+            m_part_info->part_type));
+          DBUG_PRINT("info",("partition m_is_sub_partitioned=%s",
+            m_is_sub_partitioned ? "TRUE" : "FALSE"));
+          DBUG_PRINT("info",("partition m_part_info->part_expr=%p",
+            m_part_info->part_expr));
+          if (
+            item->type() == Item::FIELD_ITEM &&
+            m_part_info->part_type == RANGE_PARTITION &&
+            !m_is_sub_partitioned &&
+            (
+              !m_part_info->part_expr ||
+              m_part_info->part_expr->type() == Item::FIELD_ITEM
+            )
+          ) {
+            Field *order_field = ((Item_field *)item)->field;
+            DBUG_PRINT("info",("partition order_field=%p", order_field));
+            if (order_field && order_field->table == table_list->table)
+            {
+              Field *part_field = m_part_info->full_part_field_array[0];
+#ifdef HANDLER_HAS_TOP_TABLE_FIELDS
+              if (set_top_table_fields)
+                order_field = top_table_field[order_field->field_index];
+#endif
+              DBUG_PRINT("info",("partition order_field=%p", order_field));
+              DBUG_PRINT("info",("partition part_field=%p", part_field));
+              if (part_field == order_field)
+              {
+                DBUG_PRINT("info",("partition FALSE by order"));
+                DBUG_RETURN(FALSE);
+              }
+            }
+          }
+          DBUG_PRINT("info",("partition have order"));
+          DBUG_PRINT("info",("partition TRUE"));
+          DBUG_RETURN(TRUE);
+        }
+        DBUG_PRINT("info",("partition group_list.elements=%u",
+          select_lex->group_list.elements));
+        if (select_lex->group_list.elements)
+        {
+          Item *item = *select_lex->group_list.first->item;
+          DBUG_PRINT("info",("partition item=%p", item));
+          DBUG_PRINT("info",("partition item->type()=%u", item->type()));
+          DBUG_PRINT("info",("partition m_part_info->part_type=%u",
+            m_part_info->part_type));
+          DBUG_PRINT("info",("partition m_is_sub_partitioned=%s",
+            m_is_sub_partitioned ? "TRUE" : "FALSE"));
+          DBUG_PRINT("info",("partition m_part_info->part_expr=%p",
+            m_part_info->part_expr));
+          if (
+            item->type() == Item::FIELD_ITEM &&
+            m_part_info->part_type == RANGE_PARTITION &&
+            !m_is_sub_partitioned &&
+            (
+              !m_part_info->part_expr ||
+              m_part_info->part_expr->type() == Item::FIELD_ITEM
+            )
+          ) {
+            Field *group_field = ((Item_field *)item)->field;
+            DBUG_PRINT("info",("partition group_field=%p", group_field));
+            if (group_field && group_field->table == table_list->table)
+            {
+              Field *part_field = m_part_info->full_part_field_array[0];
+#ifdef HANDLER_HAS_TOP_TABLE_FIELDS
+              if (set_top_table_fields)
+                group_field = top_table_field[group_field->field_index];
+#endif
+              DBUG_PRINT("info",("partition group_field=%p", group_field));
+              DBUG_PRINT("info",("partition part_field=%p", part_field));
+              if (part_field == group_field)
+              {
+                DBUG_PRINT("info",("partition FALSE by group"));
+                DBUG_RETURN(FALSE);
+              }
+            }
+          }
+          DBUG_PRINT("info",("partition have group"));
+          DBUG_PRINT("info",("partition TRUE"));
+          DBUG_RETURN(TRUE);
+        }
+      } else if (
+        select_lex->order_list.elements ||
+        select_lex->group_list.elements
+      ) {
+        DBUG_PRINT("info",("partition is not skip_order"));
+        DBUG_PRINT("info",("partition order_list.elements=%u",
+          select_lex->order_list.elements));
+        DBUG_PRINT("info",("partition group_list.elements=%u",
+          select_lex->group_list.elements));
+        DBUG_PRINT("info",("partition TRUE"));
+        DBUG_RETURN(TRUE);
+      }
+      DBUG_PRINT("info",("partition is not skip_order"));
+    }
+  }
+  DBUG_PRINT("info",("partition FALSE"));
+  DBUG_RETURN(FALSE);
+}
+
+
 int ha_partition::handle_pre_scan(bool reverse_order, bool use_parallel)
 {
   uint i;
@@ -7295,8 +7432,12 @@ int ha_partition::handle_ordered_index_s
 
   if (!bulk_access_executing)
   {
-    error = handle_pre_scan(reverse_order,
-                            (m_pre_calling ? m_pre_call_use_parallel : TRUE));
+    if (m_pre_calling)
+      error = handle_pre_scan(reverse_order, m_pre_call_use_parallel);
+    else if (check_parallel_search())
+      error = handle_pre_scan(reverse_order, TRUE);
+    else
+      error = handle_pre_scan(reverse_order, FALSE);
     if (m_pre_calling || error)
       DBUG_RETURN(error);
   }
diff -Narup ./022_mariadb-10.0.15-auto_increment/sql/ha_partition.h ./023_mariadb-10.0.15-partition_parallel_search2/sql/ha_partition.h
--- ./022_mariadb-10.0.15-auto_increment/sql/ha_partition.h	2014-11-29 17:05:30.814563902 +0900
+++ ./023_mariadb-10.0.15-partition_parallel_search2/sql/ha_partition.h	2014-11-29 17:05:41.679796954 +0900
@@ -778,6 +778,7 @@ private:
   int common_index_read(uchar * buf, bool have_start_key);
   int common_first_last(uchar * buf);
   int partition_scan_set_up(uchar * buf, bool idx_read_flag);
+  bool check_parallel_search();
   int handle_pre_scan(bool reverse_order, bool use_parallel);
   int handle_unordered_next(uchar * buf, bool next_same);
   int handle_unordered_scan_next_partition(uchar * buf);
