diff --git a/executor/executor_test.go b/executor/executor_test.go index 9be3fbc3921a6..d78ae6bdf55b3 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -8692,6 +8692,18 @@ func (s *testStaleTxnSuite) TestInvalidReadTemporaryTable(c *C) { } } +func (s *testSuite) TestCTEWithIndexLookupJoinDeadLock(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table t (a int(11) default null,b int(11) default null,key b (b),key ba (b))") + tk.MustExec("create table t1 (a int(11) default null,b int(11) default null,key idx_ab (a,b),key idx_a (a),key idx_b (b))") + tk.MustExec("create table t2 (a int(11) default null,b int(11) default null,key idx_ab (a,b),key idx_a (a),key idx_b (b))") + // It's easy to reproduce this problem in 30 times execution of IndexLookUpJoin. + for i := 0; i < 30; i++ { + tk.MustExec("with cte as (with cte1 as (select * from t2 use index(idx_ab) where a > 1 and b > 1) select * from cte1) select /*+use_index(t1 idx_ab)*/ * from cte join t1 on t1.a=cte.a;") + } +} + func (s *testSuite) TestEmptyTableSampleTemporaryTable(c *C) { tk := testkit.NewTestKit(c, s.store) // For mocktikv, safe point is not initialized, we manually insert it for snapshot to use. diff --git a/session/session.go b/session/session.go index 90b95c9f60eb2..c1d4c17a1a297 100644 --- a/session/session.go +++ b/session/session.go @@ -1679,10 +1679,10 @@ type execStmtResult struct { func (rs *execStmtResult) Close() error { se := rs.se - if err := resetCTEStorageMap(se); err != nil { + if err := rs.RecordSet.Close(); err != nil { return finishStmt(context.Background(), se, err, rs.sql) } - if err := rs.RecordSet.Close(); err != nil { + if err := resetCTEStorageMap(se); err != nil { return finishStmt(context.Background(), se, err, rs.sql) } return finishStmt(context.Background(), se, nil, rs.sql)