From 71b7dc0cd39d4964d1e36c87e9f1e50081187589 Mon Sep 17 00:00:00 2001 From: Yuanjia Zhang Date: Thu, 9 Feb 2023 18:06:31 +0800 Subject: [PATCH] planner: skip plan cache if the plan contains Shuffle operators (#41185) close pingcap/tidb#38335 --- planner/core/plan_cache.go | 15 +++++++++++++++ planner/core/plan_cache_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/planner/core/plan_cache.go b/planner/core/plan_cache.go index dbbed82a32e8f..7e8d691aaa1ae 100644 --- a/planner/core/plan_cache.go +++ b/planner/core/plan_cache.go @@ -343,6 +343,11 @@ func checkPlanCacheability(sctx sessionctx.Context, p Plan, paramNum int, limitP return } + if containShuffleOperator(pp) { + stmtCtx.SetSkipPlanCache(errors.New("skip plan-cache: get a Shuffle plan")) + return + } + if accessMVIndexWithIndexMerge(pp) { stmtCtx.SetSkipPlanCache(errors.New("skip plan-cache: the plan with IndexMerge accessing Multi-Valued Index is un-cacheable")) return @@ -735,6 +740,16 @@ func containTableDual(p PhysicalPlan) bool { return childContainTableDual } +func containShuffleOperator(p PhysicalPlan) bool { + if _, isShuffle := p.(*PhysicalShuffle); isShuffle { + return true + } + if _, isShuffleRecv := p.(*PhysicalShuffleReceiverStub); isShuffleRecv { + return true + } + return false +} + func accessMVIndexWithIndexMerge(p PhysicalPlan) bool { if idxMerge, ok := p.(*PhysicalIndexMergeReader); ok { if idxMerge.AccessMVIndex { diff --git a/planner/core/plan_cache_test.go b/planner/core/plan_cache_test.go index 4ecb7b3731317..44f56721dd62c 100644 --- a/planner/core/plan_cache_test.go +++ b/planner/core/plan_cache_test.go @@ -476,6 +476,31 @@ func TestIssue40679(t *testing.T) { tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 skip plan-cache: '1.1' may be converted to INT")) } +func TestIssue38335(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec(`CREATE TABLE PK_LP9463 ( + COL1 mediumint NOT NULL DEFAULT '77' COMMENT 'NUMERIC PK', + COL2 varchar(20) COLLATE utf8mb4_bin DEFAULT NULL, + COL4 datetime DEFAULT NULL, + COL3 bigint DEFAULT NULL, + COL5 float DEFAULT NULL, + PRIMARY KEY (COL1))`) + tk.MustExec(` +INSERT INTO PK_LP9463 VALUES (-7415279,'笚綷想摻癫梒偆荈湩窐曋繾鏫蘌憬稁渣½隨苆','1001-11-02 05:11:33',-3745331437675076296,-3.21618e38), +(-7153863,'鯷氤衡椻闍饑堀鱟垩啵緬氂哨笂序鉲秼摀巽茊','6800-06-20 23:39:12',-7871155140266310321,-3.04829e38), +(77,'娥藨潰眤徕菗柢礥蕶浠嶲憅榩椻鍙鑜堋ᛀ暵氎','4473-09-13 01:18:59',4076508026242316746,-1.9525e38), +(16614,'阖旕雐盬皪豧篣哙舄糗悄蟊鯴瞶珧赺潴嶽簤彉','2745-12-29 00:29:06',-4242415439257105874,2.71063e37)`) + tk.MustExec(`prepare stmt from 'SELECT *, rank() OVER (PARTITION BY col2 ORDER BY COL1) FROM PK_LP9463 WHERE col1 != ? AND col1 < ?'`) + tk.MustExec(`set @a=-8414766051197, @b=-8388608`) + tk.MustExec(`execute stmt using @a,@b`) + tk.MustExec(`set @a=16614, @b=16614`) + rows := tk.MustQuery(`execute stmt using @a,@b`).Sort() + tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("0")) + tk.MustQuery(`SELECT *, rank() OVER (PARTITION BY col2 ORDER BY COL1) FROM PK_LP9463 WHERE col1 != 16614 and col1 < 16614`).Sort().Check(rows.Rows()) +} + func TestIssue41032(t *testing.T) { store := testkit.CreateMockStore(t) tk := testkit.NewTestKit(t, store)