code: func AggFuncToPBExpr(sc *stmtctx.StatementContext, client kv.Client, aggFunc *AggFuncDesc) *tipb.Expr {
  	if aggFunc.HasDistinct {
  		return nil
  	}
  	pc := expression.NewPBConverter(client, sc)
  	var tp tipb.ExprType
  	switch aggFunc.Name {
  	case ast.AggFuncCount:
  		tp = tipb.ExprType_Count
  	case ast.AggFuncFirstRow:
  		tp = tipb.ExprType_First
  	case ast.AggFuncGroupConcat:
  		tp = tipb.ExprType_GroupConcat
  	case ast.AggFuncMax:
  		tp = tipb.ExprType_Max
  	case ast.AggFuncMin:
  		tp = tipb.ExprType_Min
  	case ast.AggFuncSum:
  		tp = tipb.ExprType_Sum
  	case ast.AggFuncAvg:
  		tp = tipb.ExprType_Avg
  	case ast.AggFuncBitOr:
  		tp = tipb.ExprType_Agg_BitOr
  	case ast.AggFuncBitXor:
  		tp = tipb.ExprType_Agg_BitXor
  	case ast.AggFuncBitAnd:
  		tp = tipb.ExprType_Agg_BitAnd
  	}
  	if !client.IsRequestTypeSupported(kv.ReqTypeSelect, int64(tp)) {
  		return nil
  	}
  
  	children := make([]*tipb.Expr, 0, len(aggFunc.Args))
  	for _, arg := range aggFunc.Args {
  		pbArg := pc.ExprToPB(arg)
  		if pbArg == nil {
  			return nil
  		}
  		children = append(children, pbArg)
  	}
  	return &tipb.Expr{Tp: tp, Children: children, FieldType: expression.ToPBFieldType(aggFunc.RetTp)}
  }
docs: // AggFuncToPBExpr converts aggregate function to pb.