diff --git a/expression/builtin_time.go b/expression/builtin_time.go index 42b37ada48c38..251d9ab901d6d 100644 --- a/expression/builtin_time.go +++ b/expression/builtin_time.go @@ -3516,10 +3516,10 @@ func (c *unixTimestampFunctionClass) getFunction(ctx sessionctx.Context, args [] argType := args[0].GetType() argEvaltp := argType.EvalType() if argEvaltp == types.ETString { - // Treat types.ETString as unspecified decimal. - retDecimal = types.UnspecifiedLength - if cnst, ok := args[0].(*Constant); ok { - tmpStr, _, err := cnst.EvalString(ctx, chunk.Row{}) + if _, ok := args[0].(*Column); ok { + retDecimal = types.UnspecifiedLength + } else { + tmpStr, _, err := args[0].EvalString(ctx, chunk.Row{}) if err != nil { return nil, err } diff --git a/expression/builtin_time_test.go b/expression/builtin_time_test.go index 72f1b3b16e5f8..7574b0ee71b78 100644 --- a/expression/builtin_time_test.go +++ b/expression/builtin_time_test.go @@ -1616,6 +1616,22 @@ func (s *testEvaluatorSuite) TestUnixTimestamp(c *C) { c.Assert(err, IsNil) c.Assert(d.IsNull(), Equals, true) + // https://github.com/pingcap/tidb/issues/9729 + // Test UNIX_TIMESTAMP(@a). + resetStmtContext(s.ctx) + s.ctx.GetSessionVars().Users["a"] = "1970-01-01 08:00:01" + args = []types.Datum{types.NewStringDatum("a")} + getVarFunc, err := newFunctionForTest(s.ctx, ast.GetVar, s.datumsToConstants(args)...) + c.Assert(err, IsNil) + funcArgs := make([]Expression, 0, 1) + funcArgs = append(funcArgs, getVarFunc) + f, err = fc.getFunction(s.ctx, funcArgs) + c.Assert(err, IsNil) + d, err = evalBuiltinFunc(f, chunk.Row{}) + c.Assert(err, IsNil) + c.Assert(d.Kind(), Equals, types.KindInt64) + c.Assert(d.GetInt64(), Equals, int64(28801)) + // Set the time_zone variable, because UnixTimestamp() result depends on it. s.ctx.GetSessionVars().TimeZone = time.UTC tests := []struct {