Skip to content

Commit

Permalink
planner: check the ignore-plan-cache hint in insert-stmt (#40080) (#…
Browse files Browse the repository at this point in the history
…40694)

ref #39717, close #40079
  • Loading branch information
ti-chi-bot authored Jan 18, 2023
1 parent c1bb1fa commit d1dcac6
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 10 deletions.
10 changes: 5 additions & 5 deletions executor/seqtest/prepared_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -420,14 +420,14 @@ func TestPreparedInsert(t *testing.T) {
err = counter.Write(pb)
require.NoError(t, err)
hit := pb.GetCounter().GetValue()
require.Equal(t, float64(1), hit)
require.Equal(t, float64(0), hit) // insert-values-stmt cannot use the plan cache
}
tk.MustExec(`set @a=3,@b=3; execute stmt_insert using @a, @b;`)
if flag {
err = counter.Write(pb)
require.NoError(t, err)
hit := pb.GetCounter().GetValue()
require.Equal(t, float64(2), hit)
require.Equal(t, float64(0), hit)
}

result := tk.MustQuery("select id, c1 from prepare_test where id = ?", 1)
Expand All @@ -443,21 +443,21 @@ func TestPreparedInsert(t *testing.T) {
err = counter.Write(pb)
require.NoError(t, err)
hit := pb.GetCounter().GetValue()
require.Equal(t, float64(2), hit)
require.Equal(t, float64(0), hit)
}
tk.MustExec(`set @a=2; execute stmt_insert_select using @a;`)
if flag {
err = counter.Write(pb)
require.NoError(t, err)
hit := pb.GetCounter().GetValue()
require.Equal(t, float64(3), hit)
require.Equal(t, float64(1), hit)
}
tk.MustExec(`set @a=3; execute stmt_insert_select using @a;`)
if flag {
err = counter.Write(pb)
require.NoError(t, err)
hit := pb.GetCounter().GetValue()
require.Equal(t, float64(4), hit)
require.Equal(t, float64(2), hit)
}

result = tk.MustQuery("select id, c1 from prepare_test where id = ?", 101)
Expand Down
23 changes: 23 additions & 0 deletions planner/core/plan_cache_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,29 @@ func TestIssue38533(t *testing.T) {
tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0"))
}

func TestIgnoreInsertStmt(t *testing.T) {
store := testkit.CreateMockStore(t)
tk := testkit.NewTestKit(t, store)
tk.MustExec("use test")
tk.MustExec("create table t (a int)")

// do not cache native insert-stmt
tk.MustExec("prepare st from 'insert into t values (1)'")
tk.MustExec("execute st")
tk.MustExec("execute st")
tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0"))

// ignore-hint in insert-stmt can work
tk.MustExec("prepare st from 'insert into t select * from t'")
tk.MustExec("execute st")
tk.MustExec("execute st")
tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1"))
tk.MustExec("prepare st from 'insert /*+ ignore_plan_cache() */ into t select * from t'")
tk.MustExec("execute st")
tk.MustExec("execute st")
tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0"))
}

func TestIssue38710(t *testing.T) {
store := testkit.CreateMockStore(t)
tk := testkit.NewTestKit(t, store)
Expand Down
15 changes: 15 additions & 0 deletions planner/core/plan_cacheable_checker.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,21 @@ func (checker *cacheableChecker) Enter(in ast.Node) (out ast.Node, skipChildren
return in, true
}
}
case *ast.InsertStmt:
if node.Select == nil {
// do not cache insert-values-stmt like 'insert into t values (...)' since
// no performance benefit and to save memory.
checker.cacheable = false
checker.reason = "ignore insert-values-stmt"
return in, true
}
for _, hints := range node.TableHints {
if hints.HintName.L == HintIgnorePlanCache {
checker.cacheable = false
checker.reason = "ignore plan cache by hint"
return in, true
}
}
case *ast.VariableExpr, *ast.ExistsSubqueryExpr, *ast.SubqueryExpr:
checker.cacheable = false
checker.reason = "query has sub-queries is un-cacheable"
Expand Down
4 changes: 3 additions & 1 deletion planner/core/plan_cacheable_checker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,9 @@ func TestCacheable(t *testing.T) {

tableRefsClause := &ast.TableRefsClause{TableRefs: &ast.Join{Left: &ast.TableSource{Source: tbl}}}
// test InsertStmt
stmt = &ast.InsertStmt{Table: tableRefsClause}
stmt = &ast.InsertStmt{Table: tableRefsClause} // insert-values-stmt
require.False(t, core.Cacheable(stmt, is))
stmt = &ast.InsertStmt{Table: tableRefsClause, Select: &ast.SelectStmt{}} // insert-select-stmt
require.True(t, core.Cacheable(stmt, is))

// test DeleteStmt
Expand Down
8 changes: 4 additions & 4 deletions sessiontxn/txn_rc_tso_optimize_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ func TestRcTSOCmdCountForPrepareExecuteNormal(t *testing.T) {
tk.MustExec("commit")
}
countTsoRequest, countTsoUseConstant, countWaitTsoOracle := getAllTsoCounter(sctx)
require.Equal(t, uint64(398), countTsoRequest.(uint64))
require.Equal(t, uint64(496), countTsoRequest.(uint64))
require.Equal(t, uint64(594), countTsoUseConstant.(uint64))
require.Equal(t, uint64(198), countWaitTsoOracle.(uint64))

Expand Down Expand Up @@ -137,7 +137,7 @@ func TestRcTSOCmdCountForPrepareExecuteNormal(t *testing.T) {
tk.MustExec("commit")
}
count := sctx.Value(sessiontxn.TsoRequestCount)
require.Equal(t, uint64(594), count)
require.Equal(t, uint64(693), count)
}

func TestRcTSOCmdCountForPrepareExecuteExtra(t *testing.T) {
Expand Down Expand Up @@ -234,7 +234,7 @@ func TestRcTSOCmdCountForPrepareExecuteExtra(t *testing.T) {
tk.MustExec("commit")
}
countTsoRequest, countTsoUseConstant, countWaitTsoOracle = getAllTsoCounter(sctx)
require.Equal(t, uint64(16), countTsoRequest.(uint64))
require.Equal(t, uint64(20), countTsoRequest.(uint64))
require.Equal(t, uint64(5), countTsoUseConstant.(uint64))
require.Equal(t, uint64(5), countWaitTsoOracle.(uint64))

Expand Down Expand Up @@ -412,7 +412,7 @@ func TestRcTSOCmdCountForPrepareExecuteExtra(t *testing.T) {
require.Nil(t, stmt)
tk.MustExec("commit")
countTsoRequest, countTsoUseConstant, countWaitTsoOracle = getAllTsoCounter(sctx)
require.Equal(t, uint64(3), countTsoRequest.(uint64))
require.Equal(t, uint64(4), countTsoRequest.(uint64))
require.Equal(t, uint64(2), countTsoUseConstant.(uint64))
require.Equal(t, 0, countWaitTsoOracle.(int))
tk.MustQuery("SELECT * FROM t1 WHERE id1 = 1").Check(testkit.Rows("1 1 1"))
Expand Down

0 comments on commit d1dcac6

Please sign in to comment.