code: func (p *PhysicalMergeJoin) ExplainInfo() string {
  	buffer := bytes.NewBufferString(p.JoinType.String())
  	if len(p.LeftKeys) > 0 {
  		fmt.Fprintf(buffer, ", left key:%s",
  			expression.ExplainColumnList(p.LeftKeys))
  	}
  	if len(p.RightKeys) > 0 {
  		fmt.Fprintf(buffer, ", right key:%s",
  			expression.ExplainColumnList(p.RightKeys))
  	}
  	if len(p.LeftConditions) > 0 {
  		fmt.Fprintf(buffer, ", left cond:%s", p.LeftConditions)
  	}
  	if len(p.RightConditions) > 0 {
  		fmt.Fprintf(buffer, ", right cond:%s",
  			expression.SortedExplainExpressionList(p.RightConditions))
  	}
  	if len(p.OtherConditions) > 0 {
  		fmt.Fprintf(buffer, ", other cond:%s",
  			expression.SortedExplainExpressionList(p.OtherConditions))
  	}
  	return buffer.String()
  }
docs: // ExplainInfo implements PhysicalPlan interface.