expression: support timestampdiff pushdown to tikv (#59366)
close pingcap/tidb#59365
This commit is contained in:
@ -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()
|
||||
|
||||
@ -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,
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user