code: func (p *PhysicalHashJoin) ExplainInfo() string {
  	buffer := bytes.NewBufferString(p.JoinType.String())
  	fmt.Fprintf(buffer, ", inner:%s", p.Children()[p.InnerChildIdx].ExplainID())
  	if len(p.EqualConditions) > 0 {
  		fmt.Fprintf(buffer, ", equal:%v", p.EqualConditions)
  	}
  	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.