code: func FoldConstant(ctx context.Context, expr Expression) Expression {
  	scalarFunc, ok := expr.(*ScalarFunction)
  	if !ok {
  		return expr
  	}
  	if _, isDynamic := DynamicFuncs[scalarFunc.FuncName.L]; isDynamic {
  		return expr
  	}
  	args := scalarFunc.GetArgs()
  	canFold := true
  	for i := 0; i < len(args); i++ {
  		foldedArg := FoldConstant(ctx, args[i])
  		scalarFunc.GetArgs()[i] = foldedArg
  		if _, ok := foldedArg.(*Constant); !ok {
  			canFold = false
  		}
  	}
  	if !canFold {
  		return expr
  	}
  	value, err := scalarFunc.Eval(nil, ctx)
  	if err != nil {
  		log.Printf("There may exist an error during constant folding. The function name is %s, args are %s", scalarFunc.FuncName, args)
  		return expr
  	}
  	return &Constant{
  		Value:   value,
  		RetType: scalarFunc.RetType,
  	}
  }
docs: // FoldConstant does constant folding optimization on an expression.