code: func (s *joinReorderDPSolver) makeBushyJoin(cartesianJoinGroup []LogicalPlan, otherConds []expression.Expression) LogicalPlan {
  	for len(cartesianJoinGroup) > 1 {
  		resultJoinGroup := make([]LogicalPlan, 0, len(cartesianJoinGroup))
  		for i := 0; i < len(cartesianJoinGroup); i += 2 {
  			if i+1 == len(cartesianJoinGroup) {
  				resultJoinGroup = append(resultJoinGroup, cartesianJoinGroup[i])
  				break
  			}
  			// TODO:Since the other condition may involve more than two tables, e.g. t1.a = t2.b+t3.c.
  			//  So We'll need a extra stage to deal with it.
  			// Currently, we just add it when building cartesianJoinGroup.
  			mergedSchema := expression.MergeSchema(cartesianJoinGroup[i].Schema(), cartesianJoinGroup[i+1].Schema())
  			var usedOtherConds []expression.Expression
  			otherConds, usedOtherConds = expression.FilterOutInPlace(otherConds, func(expr expression.Expression) bool {
  				return expression.ExprFromSchema(expr, mergedSchema)
  			})
  			resultJoinGroup = append(resultJoinGroup, s.newJoin(cartesianJoinGroup[i], cartesianJoinGroup[i+1], nil, usedOtherConds))
  		}
  		cartesianJoinGroup = resultJoinGroup
  	}
  	return cartesianJoinGroup[0]
  }
docs: // Make cartesian join as bushy tree.