diff --git a/executor/executor_test.go b/executor/executor_test.go index f638a45b9fd69..cc7faa10403ca 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -9055,3 +9055,15 @@ func (s *testSuite) TestIssue23602(c *C) { "[└─TableRangeScan 2.00 cop[tikv] table:t range:[1,2], keep order:false")) tk.MustQuery("SELECT a FROM t WHERE a BETWEEN 0xFFFFFFFFFFFFFFF5 AND X'FFFFFFFFFFFFFFFA'").Check(testkit.Rows("18446744073709551605", "18446744073709551610")) } + +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;") + } +} diff --git a/session/session.go b/session/session.go index 75b8cb84ef38c..bc2f10352adc3 100644 --- a/session/session.go +++ b/session/session.go @@ -1714,10 +1714,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)