code: func (p *Aggregation) convert2PhysicalPlanFinalHash(x physicalDistSQLPlan, childInfo *physicalPlanInfo) *physicalPlanInfo {
  	agg := &PhysicalAggregation{
  		AggType:      FinalAgg,
  		AggFuncs:     p.AggFuncs,
  		GroupByItems: p.GroupByItems,
  	}
  	agg.tp = "HashAgg"
  	agg.allocator = p.allocator
  	agg.initIDAndContext(p.ctx)
  	agg.SetSchema(p.schema)
  	agg.HasGby = len(p.GroupByItems) > 0
  	schema := x.addAggregation(p.ctx, agg)
  	if schema.Len() == 0 {
  		return nil
  	}
  	x.(PhysicalPlan).SetSchema(schema)
  	info := addPlanToResponse(agg, childInfo)
  	info.count = uint64(float64(info.count) * aggFactor)
  	// if we build the final aggregation, it must be the best plan.
  	info.cost = 0
  	return info
  }
docs: // convert2PhysicalPlanFinalHash converts the logical aggregation to the final hash aggregation *physicalPlanInfo.