code: func (p *PhysicalIndexJoin) ExplainInfo() string {
  	buffer := bytes.NewBufferString(p.JoinType.String())
  	fmt.Fprintf(buffer, ", inner:%s", p.Children()[1-p.OuterIndex].ExplainID())
  	if len(p.OuterJoinKeys) > 0 {
  		fmt.Fprintf(buffer, ", outer key:%s",
  			expression.ExplainColumnList(p.OuterJoinKeys))
  	}
  	if len(p.InnerJoinKeys) > 0 {
  		fmt.Fprintf(buffer, ", inner key:%s",
  			expression.ExplainColumnList(p.InnerJoinKeys))
  	}
  	if len(p.LeftConditions) > 0 {
  		fmt.Fprintf(buffer, ", left cond:%s",
  			expression.SortedExplainExpressionList(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.