@@ -27,6 +27,7 @@ import (
2727 "github.com/pingcap/tidb/pkg/parser"
2828 "github.com/pingcap/tidb/pkg/parser/ast"
2929 "github.com/pingcap/tidb/pkg/sessionctx"
30+ "github.com/pingcap/tidb/pkg/sessionctx/stmtctx"
3031 "github.com/pingcap/tidb/pkg/sessiontxn/staleread"
3132 "github.com/pingcap/tidb/pkg/store/mockstore"
3233 "github.com/pingcap/tidb/pkg/table/temptable"
@@ -428,3 +429,35 @@ func createProcessor(t *testing.T, se sessionctx.Context) staleread.Processor {
428429 require .Nil (t , processor .GetStalenessInfoSchema ())
429430 return processor
430431}
432+
433+ func TestConsistentCalculateAsOfTsExpr (t * testing.T ) {
434+ store := testkit .CreateMockStore (t , mockstore .WithStoreType (mockstore .EmbedUnistore ))
435+ tk := testkit .NewTestKit (t , store )
436+ tk .MustExec ("set time_zone = '+00:00'" )
437+ tk .Session ().GetSessionVars ().TimeZone = time .UTC
438+
439+ p := parser .New ()
440+ stmt , err := p .ParseOneStmt (`select now(3) - interval 1 second` , "" , "" )
441+ require .NoError (t , err )
442+ secondTsExpr := stmt .(* ast.SelectStmt ).Fields .Fields [0 ].Expr
443+ stmt , err = p .ParseOneStmt (`select now(3) - interval 3 second` , "" , "" )
444+ require .NoError (t , err )
445+ threeSecondTsExpr := stmt .(* ast.SelectStmt ).Fields .Fields [0 ].Expr
446+
447+ se := tk .Session ()
448+ se .GetSessionVars ().StmtCtx = stmtctx .NewStmtCtxWithTimeZone (time .UTC )
449+
450+ ts1 , err := staleread .CalculateAsOfTsExpr (context .Background (), se .GetPlanCtx (), secondTsExpr )
451+ require .NoError (t , err )
452+
453+ time .Sleep (10 * time .Millisecond )
454+
455+ ts2 , err := staleread .CalculateAsOfTsExpr (context .Background (), se .GetPlanCtx (), secondTsExpr )
456+ require .NoError (t , err )
457+ require .Equal (t , ts1 , ts2 )
458+
459+ ts3 , err := staleread .CalculateAsOfTsExpr (context .Background (), se .GetPlanCtx (), threeSecondTsExpr )
460+ require .NoError (t , err )
461+ require .True (t , ts3 < ts1 )
462+ require .Equal (t , ts1 - ts3 , uint64 (2000 << 18 ))
463+ }
0 commit comments