diff --git a/sql/opt_range.cc b/sql/opt_range.cc
index cb5a0604733..e419c470db5 100644
--- a/sql/opt_range.cc
+++ b/sql/opt_range.cc
@@ -15673,6 +15673,76 @@ print_sel_arg_key(Field *field, const uchar *key, String *out)
   dbug_tmp_restore_column_maps(table->read_set, table->write_set, old_sets);
 }
 
+const char *dbug_print_sel_arg(SEL_ARG *sel_arg);
+
+static String dbug_print_sel_tree_buf;
+
+const char *dbug_print_sel_tree(SEL_TREE *tree, int ident_level)
+{
+  StringBuffer<128> out;
+  StringBuffer<32> ident;
+  for (int  i=0; i<ident_level; i++)
+    ident.append(' ');
+
+  out.append(ident);
+  out.append("SEL_TREE{\n");
+
+  // Dump tree->keys
+  for (uint idx= 0; idx < tree->keys.size(); idx++)
+  {
+    SEL_ARG *key= tree->keys[idx];
+    if (key)
+    {
+      out.append(ident);
+      out.append("  ");
+      out.append(dbug_print_sel_arg(key));
+      out.append("\n");
+    }
+  }
+
+  // Dump tree->merges
+  if (tree->merges.elements)
+  {
+    out.append(ident);
+    out.append("  ");
+    out.append("merges={\n");
+
+    List_iterator<SEL_IMERGE> it(tree->merges);
+    for (SEL_IMERGE *el= it++; el; el= it++)
+    {
+      out.append(ident);
+      out.append("  ");
+      out.append("  ");
+      out.append("SEL_IMERGE {\n");
+      for (SEL_TREE **st= el->trees; st!= el->trees_next; st++)
+      {
+        /*out.append(ident);
+        out.append("  ");
+        out.append("  ");
+        out.append("  ");*/
+        // print SEL_TREE
+        out.append(dbug_print_sel_tree(*st, ident_level+6));
+        out.append("\n");
+      }
+      out.append(ident);
+      out.append("  ");
+      out.append("  ");
+      out.append("}\n"); // SEL_IMERGE
+
+    }
+
+    out.append(ident);
+    out.append("  ");
+    out.append("}\n"); // merges
+
+  }
+  out.append(ident);
+  out.append("}\n");
+  dbug_print_sel_tree_buf.length(0);
+  dbug_print_sel_tree_buf.append(out.c_ptr_safe());
+  return dbug_print_sel_tree_buf.c_ptr_safe();
+}
+
 
 /*
   @brief
@@ -15688,13 +15758,16 @@ print_sel_arg_key(Field *field, const uchar *key, String *out)
 const char *dbug_print_sel_arg(SEL_ARG *sel_arg)
 {
   StringBuffer<64> buf;
-  String &out= dbug_print_sel_arg_buf;
+  StringBuffer<128> out;//= dbug_print_sel_arg_buf;
   out.length(0);
 
   if (!sel_arg)
   {
     out.append("NULL");
-    goto end;
+    // goto end;
+    dbug_print_sel_arg_buf.length(0);
+    dbug_print_sel_arg_buf.append(out.c_ptr_safe());
+    return dbug_print_sel_arg_buf.c_ptr_safe();
   }
 
   out.append("SEL_ARG(");
@@ -15719,34 +15792,75 @@ const char *dbug_print_sel_arg(SEL_ARG *sel_arg)
   {
     out.append("type=");
     out.append(stype);
-    goto end;
+    //    goto end;
+    dbug_print_sel_arg_buf.length(0);
+    dbug_print_sel_arg_buf.append(out.c_ptr_safe());
+    return dbug_print_sel_arg_buf.c_ptr_safe();
   }
 
-  if (sel_arg->min_flag & NO_MIN_RANGE)
+  SEL_ARG *left_arg = sel_arg->first();
+  if (left_arg->min_flag & NO_MIN_RANGE)
     out.append("-inf");
   else
   {
-    print_sel_arg_key(sel_arg->field, sel_arg->min_value, &buf);
+    print_sel_arg_key(left_arg->field, left_arg->min_value, &buf);
     out.append(buf);
   }
 
-  out.append((sel_arg->min_flag & NEAR_MIN)? "<" : "<=");
+  out.append((left_arg->min_flag & NEAR_MIN)? "<" : "<=");
+
+  if (left_arg != sel_arg)
+    out.append("..");
 
   out.append(sel_arg->field->field_name);
 
-  out.append((sel_arg->max_flag & NEAR_MAX)? "<" : "<=");
+  SEL_ARG *right_arg = sel_arg->last();
+  if (right_arg != sel_arg)
+    out.append("..");
+  out.append((right_arg->max_flag & NEAR_MAX)? "<" : "<=");
 
-  if (sel_arg->max_flag & NO_MAX_RANGE)
+  if (right_arg->max_flag & NO_MAX_RANGE)
     out.append("+inf");
   else
   {
-    print_sel_arg_key(sel_arg->field, sel_arg->max_value, &buf);
+    print_sel_arg_key(right_arg->field, right_arg->max_value, &buf);
+    out.append(buf);
+  }
+  
+  // elements, and next_key_part...
+  if (sel_arg->elements > 1)
+  {
+    char buf[64];
+    snprintf(buf, sizeof(buf), ", elems=%d", (int)sel_arg->elements);
     out.append(buf);
   }
 
+
+  if (sel_arg->next_key_part) // TODOOO
+  {
+
+    bool nkp_same=true;
+    for (SEL_ARG *sa= left_arg; sa!=right_arg; sa=sa->next)
+    {
+      if (sa->next_key_part != sel_arg->next_key_part)
+        nkp_same=false;
+    }
+    if (right_arg->next_key_part != sel_arg->next_key_part)
+      nkp_same= false;
+
+    const char *p;
+    if (nkp_same)
+      p= dbug_print_sel_arg(sel_arg->next_key_part);
+    else
+       p="varied";
+    out.append(", nkp=");
+    out.append(p);
+  }
   out.append(")");
 
-end:
+//end:
+  dbug_print_sel_arg_buf.length(0);
+  dbug_print_sel_arg_buf.append(out.c_ptr_safe());
   return dbug_print_sel_arg_buf.c_ptr_safe();
 }
 
