code: func (p *Aggregation) convert2PhysicalPlanHash() (*physicalPlanInfo, error) {
  	childInfo, err := p.children[0].(LogicalPlan).convert2PhysicalPlan(&requiredProperty{})
  	if err != nil {
  		return nil, errors.Trace(err)
  	}
  	distinct := false
  	for _, fun := range p.AggFuncs {
  		if fun.IsDistinct() {
  			distinct = true
  			break
  		}
  	}
  	if !distinct {
  		if x, ok := childInfo.p.(physicalDistSQLPlan); ok {
  			info := p.convert2PhysicalPlanFinalHash(x, childInfo)
  			if info != nil {
  				return info, nil
  			}
  		}
  	}
  	return p.convert2PhysicalPlanCompleteHash(childInfo), nil
  }
docs: // convert2PhysicalPlanHash converts the logical aggregation to the physical hash aggregation.