code: func (c *compareFunctionClass) refineArgs(ctx sessionctx.Context, args []Expression) []Expression {
  	arg0Type, arg1Type := args[0].GetType(), args[1].GetType()
  	arg0IsInt := arg0Type.EvalType() == types.ETInt
  	arg1IsInt := arg1Type.EvalType() == types.ETInt
  	arg0, arg0IsCon := args[0].(*Constant)
  	arg1, arg1IsCon := args[1].(*Constant)
  	isAlways, finalArg0, finalArg1 := false, args[0], args[1]
  	// int non-constant [cmp] non-int constant
  	if arg0IsInt && !arg0IsCon && !arg1IsInt && arg1IsCon {
  		finalArg1, isAlways = RefineComparedConstant(ctx, mysql.HasUnsignedFlag(arg0Type.Flag), arg1, c.op)
  	}
  	// non-int constant [cmp] int non-constant
  	if arg1IsInt && !arg1IsCon && !arg0IsInt && arg0IsCon {
  		finalArg0, isAlways = RefineComparedConstant(ctx, mysql.HasUnsignedFlag(arg1Type.Flag), arg0, symmetricOp[c.op])
  	}
  	if !isAlways {
  		return []Expression{finalArg0, finalArg1}
  	}
  	switch c.op {
  	case opcode.LT, opcode.LE:
  		// This will always be true.
  		return []Expression{Zero.Clone(), One.Clone()}
  	case opcode.EQ, opcode.NullEQ, opcode.GT, opcode.GE:
  		// This will always be false.
  		return []Expression{One.Clone(), Zero.Clone()}
  	}
  	return args
  }
docs: // refineArgs will rewrite the arguments if the compare expression is `int column <cmp> non-int constant` or
  // `non-int constant <cmp> int column`. E.g., `a < 1.1` will be rewritten to `a < 2`.