diff --git a/pkg/expression/expr_to_pb_test.go b/pkg/expression/expr_to_pb_test.go index cd94586ab1..51d70bb9b0 100644 --- a/pkg/expression/expr_to_pb_test.go +++ b/pkg/expression/expr_to_pb_test.go @@ -1852,6 +1852,21 @@ func TestExprPushDownToTiKV(t *testing.T) { retType: types.NewFieldType(mysql.TypeDatetime), args: []Expression{stringColumn, NewStrConst("%h%y")}, }, + { + functionName: ast.TimestampDiff, + retType: types.NewFieldType(mysql.TypeLong), + args: []Expression{NewStrConst("Second"), datetimeColumn, datetimeColumn}, + }, + { + functionName: ast.TimestampDiff, + retType: types.NewFieldType(mysql.TypeLong), + args: []Expression{NewStrConst("DAY"), datetimeColumn, datetimeColumn}, + }, + { + functionName: ast.TimestampDiff, + retType: types.NewFieldType(mysql.TypeLong), + args: []Expression{NewStrConst("year"), datetimeColumn, datetimeColumn}, + }, } ctx = mock.NewContext() diff --git a/pkg/expression/infer_pushdown.go b/pkg/expression/infer_pushdown.go index ea36c72a3e..ff1fa69127 100644 --- a/pkg/expression/infer_pushdown.go +++ b/pkg/expression/infer_pushdown.go @@ -210,7 +210,7 @@ func scalarExprSupportedByTiKV(ctx EvalContext, sf *ScalarFunction) bool { /* ast.DayName */ ast.DayOfMonth, ast.DayOfWeek, ast.DayOfYear, /* ast.Weekday */ ast.WeekOfYear, ast.Year, ast.FromDays, /* ast.ToDays */ - ast.PeriodAdd, ast.PeriodDiff /*ast.TimestampDiff, ast.DateAdd*/, ast.FromUnixTime, + ast.PeriodAdd, ast.PeriodDiff, ast.TimestampDiff, ast.FromUnixTime, /* ast.LastDay */ ast.Sysdate, ast.StrToDate, diff --git a/tests/integrationtest/r/expression/issues.result b/tests/integrationtest/r/expression/issues.result index d285a669aa..eb784dd5dc 100644 --- a/tests/integrationtest/r/expression/issues.result +++ b/tests/integrationtest/r/expression/issues.result @@ -531,14 +531,14 @@ insert into t2 value (1,2,date'2020-05-08'); explain format = 'brief' SELECT /*+ INL_MERGE_JOIN(t1,t2) */ COUNT(*) FROM t1 LEFT JOIN t2 ON t1.id = t2.order_id WHERE t1.ns = 'a' AND t1.org_id IN (1) AND t1.status IN (2,6,10) AND timestampdiff(month, t2.begin_time, date'2020-05-06') = 0; id estRows task access object operator info StreamAgg 1.00 root funcs:count(1)->Column#10 -└─IndexJoin 0.03 root inner join, inner:Selection, outer key:expression__issues.t1.id, inner key:expression__issues.t2.order_id, equal cond:eq(expression__issues.t1.id, expression__issues.t2.order_id) +└─IndexJoin 0.03 root inner join, inner:IndexLookUp, outer key:expression__issues.t1.id, inner key:expression__issues.t2.order_id, equal cond:eq(expression__issues.t1.id, expression__issues.t2.order_id) ├─TableReader(Build) 0.02 root data:Selection │ └─Selection 0.02 cop[tikv] eq(cast(expression__issues.t1.org_id, double BINARY), 1), eq(expression__issues.t1.ns, "a"), in(expression__issues.t1.status, 2, 6, 10) │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo - └─Selection(Probe) 0.03 root eq(timestampdiff("MONTH", expression__issues.t2.begin_time, 2020-05-06), 0) - └─IndexLookUp 0.04 root - ├─IndexRangeScan(Build) 0.04 cop[tikv] table:t2, index:idx_oid(order_id) range: decided by [eq(expression__issues.t2.order_id, expression__issues.t1.id)], keep order:false, stats:pseudo - └─TableRowIDScan(Probe) 0.04 cop[tikv] table:t2 keep order:false, stats:pseudo + └─IndexLookUp(Probe) 0.03 root + ├─IndexRangeScan(Build) 0.04 cop[tikv] table:t2, index:idx_oid(order_id) range: decided by [eq(expression__issues.t2.order_id, expression__issues.t1.id)], keep order:false, stats:pseudo + └─Selection(Probe) 0.03 cop[tikv] eq(timestampdiff("MONTH", expression__issues.t2.begin_time, 2020-05-06), 0) + └─TableRowIDScan 0.04 cop[tikv] table:t2 keep order:false, stats:pseudo SELECT /*+ INL_MERGE_JOIN(t1,t2) */ COUNT(*) FROM t1 LEFT JOIN t2 ON t1.id = t2.order_id WHERE t1.ns = 'a' AND t1.org_id IN (1) AND t1.status IN (2,6,10) AND timestampdiff(month, t2.begin_time, date'2020-05-06') = 0; COUNT(*) 1