From 39d8fb80ef42157b507a4a7c8d5565e97c73a4b7 Mon Sep 17 00:00:00 2001 From: qw4990 Date: Tue, 16 Apr 2019 14:40:22 +0800 Subject: [PATCH 1/5] add CopTasksDetails --- sessionctx/stmtctx/stmtctx.go | 45 +++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/sessionctx/stmtctx/stmtctx.go b/sessionctx/stmtctx/stmtctx.go index de6cd9fb1857e..3471c322ac644 100644 --- a/sessionctx/stmtctx/stmtctx.go +++ b/sessionctx/stmtctx/stmtctx.go @@ -15,6 +15,7 @@ package stmtctx import ( "math" + "sort" "sync" "time" @@ -95,6 +96,7 @@ type StatementContext struct { warnings []SQLWarn histogramsNotLoad bool execDetails execdetails.ExecDetails + allExecDetails []*execdetails.ExecDetails } // PrevAffectedRows is the affected-rows value(DDL is 0, DML is the number of affected rows). PrevAffectedRows int64 @@ -392,6 +394,7 @@ func (sc *StatementContext) MergeExecDetails(details *execdetails.ExecDetails, c sc.mu.execDetails.RequestCount++ sc.mu.execDetails.TotalKeys += details.TotalKeys sc.mu.execDetails.ProcessedKeys += details.ProcessedKeys + sc.mu.allExecDetails = append(sc.mu.allExecDetails, details) } sc.mu.execDetails.CommitDetail = commitDetails sc.mu.Unlock() @@ -423,3 +426,45 @@ func (sc *StatementContext) ShouldIgnoreOverflowError() bool { } return false } + +// CopTasksDetails returns some useful information of cop-tasks during execution. +func (sc *StatementContext) CopTasksDetails() *CopTasksDetails { + sc.mu.Lock() + defer sc.mu.Unlock() + n := len(sc.mu.allExecDetails) + d := &CopTasksDetails{ + NumCopTasks: n, + AvgProcessTime: sc.mu.execDetails.ProcessTime / time.Duration(n), + AvgWaitTime: sc.mu.execDetails.WaitTime / time.Duration(n), + } + + sort.Slice(sc.mu.allExecDetails, func(i, j int) bool { + return sc.mu.allExecDetails[i].ProcessTime < sc.mu.allExecDetails[j].ProcessTime + }) + d.P99ProcessTime = sc.mu.allExecDetails[n*9/10].ProcessTime + d.MaxProcessTime = sc.mu.allExecDetails[n-1].ProcessTime + d.MaxProcessAddress = sc.mu.allExecDetails[n-1].CalleeAddress + + sort.Slice(sc.mu.allExecDetails, func(i, j int) bool { + return sc.mu.allExecDetails[i].WaitTime < sc.mu.allExecDetails[j].WaitTime + }) + d.P99WaitTime = sc.mu.allExecDetails[n*9/10].WaitTime + d.MaxProcessTime = sc.mu.allExecDetails[n-1].WaitTime + d.MaxProcessAddress = sc.mu.allExecDetails[n-1].CalleeAddress + return d +} + +//CopTasksDetails collects some useful information of cop-tasks during execution. +type CopTasksDetails struct { + NumCopTasks int + + AvgProcessTime time.Duration + P99ProcessTime time.Duration + MaxProcessAddress string + MaxProcessTime time.Duration + + AvgWaitTime time.Duration + P99WaitTime time.Duration + MaxWaitAddress string + MaxWaitTime time.Duration +} From f0fe31f33805d325209d129f8b265f29dd01561e Mon Sep 17 00:00:00 2001 From: qw4990 Date: Tue, 16 Apr 2019 20:49:54 +0800 Subject: [PATCH 2/5] fix --- expression/constant_fold.go | 5 ++++- expression/integration_test.go | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/expression/constant_fold.go b/expression/constant_fold.go index 6bcc46a4f4112..12a3775dbfe85 100644 --- a/expression/constant_fold.go +++ b/expression/constant_fold.go @@ -117,7 +117,10 @@ func foldConstant(expr Expression) (Expression, bool) { constArgs[i] = One } } - dummyScalarFunc := NewFunctionInternal(x.GetCtx(), x.FuncName.L, x.GetType(), constArgs...) + dummyScalarFunc, err := newFunctionImpl(x.GetCtx(), false, x.FuncName.L, x.GetType(), constArgs...) + if err != nil { + return expr, isDeferredConst + } value, err := dummyScalarFunc.Eval(chunk.Row{}) if err != nil { return expr, isDeferredConst diff --git a/expression/integration_test.go b/expression/integration_test.go index 6bd91b57691bf..33b8f5a8076da 100644 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -4213,3 +4213,25 @@ func (s *testIntegrationSuite) TestDaynameArithmetic(c *C) { tk.MustQuery(c.sql).Check(testkit.Rows(c.result)) } } + +func (s *testIntegrationSuite) TestIssue10156(c *C) { + tk := testkit.NewTestKit(c, s.store) + defer s.cleanEnv(c) + + tk.MustExec("use test") + tk.MustExec("CREATE TABLE `t1` (`period_name` varchar(24) DEFAULT NULL ,`period_id` bigint(20) DEFAULT NULL ,`starttime` bigint(20) DEFAULT NULL)") + tk.MustExec("CREATE TABLE `t2` (`bussid` bigint(20) DEFAULT NULL,`ct` bigint(20) DEFAULT NULL)") + q := ` +select + a.period_name, + b.date8 +from + (select * from t1) a +left join + (select bussid,date(from_unixtime(ct)) date8 from t2) b +on + a.period_id = b.bussid +where + datediff(b.date8, date(from_unixtime(a.starttime))) >= 0` + tk.MustQuery(q) +} From 5507067cd4de5847205a50f0bc0ea2b6a0dd0e2a Mon Sep 17 00:00:00 2001 From: qw4990 Date: Tue, 16 Apr 2019 21:03:42 +0800 Subject: [PATCH 3/5] fix --- expression/constant_fold.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/expression/constant_fold.go b/expression/constant_fold.go index 12a3775dbfe85..adec69c78f8a0 100644 --- a/expression/constant_fold.go +++ b/expression/constant_fold.go @@ -117,7 +117,7 @@ func foldConstant(expr Expression) (Expression, bool) { constArgs[i] = One } } - dummyScalarFunc, err := newFunctionImpl(x.GetCtx(), false, x.FuncName.L, x.GetType(), constArgs...) + dummyScalarFunc, err := NewFunctionBase(x.GetCtx(), x.FuncName.L, x.GetType(), constArgs...) if err != nil { return expr, isDeferredConst } From 3ae4f71690493e2fd8f7de13d263c43ea4b1b168 Mon Sep 17 00:00:00 2001 From: qw4990 Date: Wed, 17 Apr 2019 10:46:54 +0800 Subject: [PATCH 4/5] fix --- sessionctx/stmtctx/stmtctx.go | 43 ----------------------------------- 1 file changed, 43 deletions(-) diff --git a/sessionctx/stmtctx/stmtctx.go b/sessionctx/stmtctx/stmtctx.go index 3471c322ac644..69c35315267a7 100644 --- a/sessionctx/stmtctx/stmtctx.go +++ b/sessionctx/stmtctx/stmtctx.go @@ -15,7 +15,6 @@ package stmtctx import ( "math" - "sort" "sync" "time" @@ -426,45 +425,3 @@ func (sc *StatementContext) ShouldIgnoreOverflowError() bool { } return false } - -// CopTasksDetails returns some useful information of cop-tasks during execution. -func (sc *StatementContext) CopTasksDetails() *CopTasksDetails { - sc.mu.Lock() - defer sc.mu.Unlock() - n := len(sc.mu.allExecDetails) - d := &CopTasksDetails{ - NumCopTasks: n, - AvgProcessTime: sc.mu.execDetails.ProcessTime / time.Duration(n), - AvgWaitTime: sc.mu.execDetails.WaitTime / time.Duration(n), - } - - sort.Slice(sc.mu.allExecDetails, func(i, j int) bool { - return sc.mu.allExecDetails[i].ProcessTime < sc.mu.allExecDetails[j].ProcessTime - }) - d.P99ProcessTime = sc.mu.allExecDetails[n*9/10].ProcessTime - d.MaxProcessTime = sc.mu.allExecDetails[n-1].ProcessTime - d.MaxProcessAddress = sc.mu.allExecDetails[n-1].CalleeAddress - - sort.Slice(sc.mu.allExecDetails, func(i, j int) bool { - return sc.mu.allExecDetails[i].WaitTime < sc.mu.allExecDetails[j].WaitTime - }) - d.P99WaitTime = sc.mu.allExecDetails[n*9/10].WaitTime - d.MaxProcessTime = sc.mu.allExecDetails[n-1].WaitTime - d.MaxProcessAddress = sc.mu.allExecDetails[n-1].CalleeAddress - return d -} - -//CopTasksDetails collects some useful information of cop-tasks during execution. -type CopTasksDetails struct { - NumCopTasks int - - AvgProcessTime time.Duration - P99ProcessTime time.Duration - MaxProcessAddress string - MaxProcessTime time.Duration - - AvgWaitTime time.Duration - P99WaitTime time.Duration - MaxWaitAddress string - MaxWaitTime time.Duration -} From b3e7d6d029b2294f208fd8dd14bf6f6814791118 Mon Sep 17 00:00:00 2001 From: qw4990 Date: Wed, 17 Apr 2019 10:48:04 +0800 Subject: [PATCH 5/5] fix --- sessionctx/stmtctx/stmtctx.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/sessionctx/stmtctx/stmtctx.go b/sessionctx/stmtctx/stmtctx.go index 69c35315267a7..de6cd9fb1857e 100644 --- a/sessionctx/stmtctx/stmtctx.go +++ b/sessionctx/stmtctx/stmtctx.go @@ -95,7 +95,6 @@ type StatementContext struct { warnings []SQLWarn histogramsNotLoad bool execDetails execdetails.ExecDetails - allExecDetails []*execdetails.ExecDetails } // PrevAffectedRows is the affected-rows value(DDL is 0, DML is the number of affected rows). PrevAffectedRows int64 @@ -393,7 +392,6 @@ func (sc *StatementContext) MergeExecDetails(details *execdetails.ExecDetails, c sc.mu.execDetails.RequestCount++ sc.mu.execDetails.TotalKeys += details.TotalKeys sc.mu.execDetails.ProcessedKeys += details.ProcessedKeys - sc.mu.allExecDetails = append(sc.mu.allExecDetails, details) } sc.mu.execDetails.CommitDetail = commitDetails sc.mu.Unlock()