From fbcc904e43f8de8e0cf5a9558c61b0ad06d2a055 Mon Sep 17 00:00:00 2001 From: qw4990 Date: Thu, 20 Apr 2023 15:50:44 +0800 Subject: [PATCH 1/5] fixup --- planner/core/plan_cache_param.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/planner/core/plan_cache_param.go b/planner/core/plan_cache_param.go index 1b968def6b5b8..8671431e6ac42 100644 --- a/planner/core/plan_cache_param.go +++ b/planner/core/plan_cache_param.go @@ -88,9 +88,7 @@ func (pr *paramReplacer) Leave(in ast.Node) (out ast.Node, ok bool) { } func (pr *paramReplacer) Reset() { - if pr.params != nil { - pr.params = pr.params[:0] - } + pr.params = nil } // GetParamSQLFromAST returns the parameterized SQL of this AST. From aa2c6f6375e4dcd193f79af3597220f6e9aec929 Mon Sep 17 00:00:00 2001 From: qw4990 Date: Thu, 20 Apr 2023 16:24:52 +0800 Subject: [PATCH 2/5] fixup --- planner/core/plan_cache_param_test.go | 38 +++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/planner/core/plan_cache_param_test.go b/planner/core/plan_cache_param_test.go index b051b61a44d30..0e6deaa59c737 100644 --- a/planner/core/plan_cache_param_test.go +++ b/planner/core/plan_cache_param_test.go @@ -16,9 +16,14 @@ package core import ( "context" + "fmt" + "math/rand" + "sync" "testing" + "time" "github.com/pingcap/tidb/parser" + "github.com/pingcap/tidb/parser/ast" "github.com/stretchr/testify/require" ) @@ -117,6 +122,39 @@ func TestParameterize(t *testing.T) { } } +func TestGetParamSQLFromASTConcurrently(t *testing.T) { + n := 100 + var sqls []string + for i := 0; i < n; i++ { + sqls = append(sqls, fmt.Sprintf(`insert into t values (%d, %d, %d)`, i*3+0, i*3+1, i*3+2)) + } + var stmts []ast.StmtNode + for _, sql := range sqls { + stmt, err := parser.New().ParseOneStmt(sql, "", "") + require.Nil(t, err) + stmts = append(stmts, stmt) + } + + var wg sync.WaitGroup + for i := 0; i < n; i++ { + wg.Add(1) + go func() { + for i := 0; i < 1000; i++ { + idx := rand.Intn(n) + _, vals, err := GetParamSQLFromAST(context.Background(), MockContext(), stmts[idx]) + require.Nil(t, err) + require.Equal(t, len(vals), 3) + require.Equal(t, vals[0].GetValue(), int64(idx*3+0)) + require.Equal(t, vals[1].GetValue(), int64(idx*3+1)) + require.Equal(t, vals[2].GetValue(), int64(idx*3+2)) + time.Sleep(time.Millisecond + time.Duration(rand.Intn(int(time.Millisecond)))) + } + wg.Done() + }() + } + wg.Wait() +} + func BenchmarkParameterizeSelect(b *testing.B) { paymentSelectCustomerForUpdate := `SELECT c_first, c_middle, c_last, c_street_1, c_street_2, c_city, c_state, c_zip, c_phone, c_credit, c_credit_lim, c_discount, c_balance, c_since FROM customer WHERE c_w_id = ? AND c_d_id = ?AND c_id = ? FOR UPDATE` From 106ae560c1a6e7ed743749329880ddf78ff8f3df Mon Sep 17 00:00:00 2001 From: qw4990 Date: Thu, 20 Apr 2023 16:54:02 +0800 Subject: [PATCH 3/5] fixup --- planner/core/plan_cache_param_test.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/planner/core/plan_cache_param_test.go b/planner/core/plan_cache_param_test.go index 0e6deaa59c737..0c2ae22faec6f 100644 --- a/planner/core/plan_cache_param_test.go +++ b/planner/core/plan_cache_param_test.go @@ -138,19 +138,18 @@ func TestGetParamSQLFromASTConcurrently(t *testing.T) { var wg sync.WaitGroup for i := 0; i < n; i++ { wg.Add(1) - go func() { + go func(id int) { for i := 0; i < 1000; i++ { - idx := rand.Intn(n) - _, vals, err := GetParamSQLFromAST(context.Background(), MockContext(), stmts[idx]) + _, vals, err := GetParamSQLFromAST(context.Background(), MockContext(), stmts[id]) require.Nil(t, err) require.Equal(t, len(vals), 3) - require.Equal(t, vals[0].GetValue(), int64(idx*3+0)) - require.Equal(t, vals[1].GetValue(), int64(idx*3+1)) - require.Equal(t, vals[2].GetValue(), int64(idx*3+2)) + require.Equal(t, vals[0].GetValue(), int64(id*3+0)) + require.Equal(t, vals[1].GetValue(), int64(id*3+1)) + require.Equal(t, vals[2].GetValue(), int64(id*3+2)) time.Sleep(time.Millisecond + time.Duration(rand.Intn(int(time.Millisecond)))) } wg.Done() - }() + }(i) } wg.Wait() } From ee4fb2965d07a6363711ee942d08d29e14bc1eb4 Mon Sep 17 00:00:00 2001 From: qw4990 Date: Thu, 20 Apr 2023 16:56:18 +0800 Subject: [PATCH 4/5] fixup --- planner/core/plan_cache_param.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/planner/core/plan_cache_param.go b/planner/core/plan_cache_param.go index 8671431e6ac42..20b6c78471f72 100644 --- a/planner/core/plan_cache_param.go +++ b/planner/core/plan_cache_param.go @@ -88,7 +88,7 @@ func (pr *paramReplacer) Leave(in ast.Node) (out ast.Node, ok bool) { } func (pr *paramReplacer) Reset() { - pr.params = nil + pr.params = make([]*driver.ValueExpr, 0, 4) } // GetParamSQLFromAST returns the parameterized SQL of this AST. From 24cc09cf83f9fcaa16543e7c3a0bc81df97ee74b Mon Sep 17 00:00:00 2001 From: qw4990 Date: Thu, 20 Apr 2023 17:14:42 +0800 Subject: [PATCH 5/5] make linter happy --- planner/core/plan_cache_param_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/planner/core/plan_cache_param_test.go b/planner/core/plan_cache_param_test.go index 0c2ae22faec6f..cd98b3ac683d0 100644 --- a/planner/core/plan_cache_param_test.go +++ b/planner/core/plan_cache_param_test.go @@ -124,11 +124,11 @@ func TestParameterize(t *testing.T) { func TestGetParamSQLFromASTConcurrently(t *testing.T) { n := 100 - var sqls []string + sqls := make([]string, 0, n) for i := 0; i < n; i++ { sqls = append(sqls, fmt.Sprintf(`insert into t values (%d, %d, %d)`, i*3+0, i*3+1, i*3+2)) } - var stmts []ast.StmtNode + stmts := make([]ast.StmtNode, 0, n) for _, sql := range sqls { stmt, err := parser.New().ParseOneStmt(sql, "", "") require.Nil(t, err)