diff --git a/expression/expr_to_pb_test.go b/expression/expr_to_pb_test.go index b215fc499cd1f..037d706a2f2b3 100644 --- a/expression/expr_to_pb_test.go +++ b/expression/expr_to_pb_test.go @@ -724,6 +724,109 @@ func (s *testEvaluatorSuite) TestExprPushDownToFlash(c *C) { c.Assert(err, IsNil) exprs = append(exprs, function) +<<<<<<< HEAD +======= + // CastStringAsReal + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeDouble), stringColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // Substring2ArgsUTF8 + function, err = NewFunction(mock.NewContext(), ast.Substr, types.NewFieldType(mysql.TypeString), stringColumn, intColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // Substring3ArgsUTF8 + function, err = NewFunction(mock.NewContext(), ast.Substr, types.NewFieldType(mysql.TypeString), stringColumn, intColumn, intColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // ScalarFuncSig_RoundReal + function, err = NewFunction(mock.NewContext(), ast.Round, types.NewFieldType(mysql.TypeDouble), realColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // ScalarFuncSig_RoundInt + function, err = NewFunction(mock.NewContext(), ast.Round, types.NewFieldType(mysql.TypeLonglong), intColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // concat + function, err = NewFunction(mock.NewContext(), ast.Concat, types.NewFieldType(mysql.TypeString), stringColumn, intColumn, realColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // UnixTimestampCurrent + function, err = NewFunction(mock.NewContext(), ast.UnixTimestamp, types.NewFieldType(mysql.TypeLonglong)) + c.Assert(err, IsNil) + _, ok := function.(*Constant) + c.Assert(ok, IsTrue) + + // UnixTimestampInt + datetimeColumn.RetType.Decimal = 0 + function, err = NewFunction(mock.NewContext(), ast.UnixTimestamp, types.NewFieldType(mysql.TypeLonglong), datetimeColumn) + c.Assert(err, IsNil) + c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_UnixTimestampInt) + exprs = append(exprs, function) + + // UnixTimestampDecimal + datetimeColumn.RetType.Decimal = types.UnspecifiedLength + function, err = NewFunction(mock.NewContext(), ast.UnixTimestamp, types.NewFieldType(mysql.TypeNewDecimal), datetimeColumn) + c.Assert(err, IsNil) + c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_UnixTimestampDec) + exprs = append(exprs, function) + + // Year + function, err = NewFunction(mock.NewContext(), ast.Year, types.NewFieldType(mysql.TypeLonglong), datetimeColumn) + c.Assert(err, IsNil) + c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_Year) + exprs = append(exprs, function) + + // Day + function, err = NewFunction(mock.NewContext(), ast.Day, types.NewFieldType(mysql.TypeLonglong), datetimeColumn) + c.Assert(err, IsNil) + c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_DayOfMonth) + exprs = append(exprs, function) + + // Datediff + function, err = NewFunction(mock.NewContext(), ast.DateDiff, types.NewFieldType(mysql.TypeLonglong), datetimeColumn, datetimeColumn) + c.Assert(err, IsNil) + c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_DateDiff) + exprs = append(exprs, function) + + // Datesub + function, err = NewFunction(mock.NewContext(), ast.DateSub, types.NewFieldType(mysql.TypeDatetime), datetimeColumn, intColumn, stringColumn) + c.Assert(err, IsNil) + c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_SubDateDatetimeInt) + exprs = append(exprs, function) + function, err = NewFunction(mock.NewContext(), ast.DateSub, types.NewFieldType(mysql.TypeDatetime), stringColumn, intColumn, stringColumn) + c.Assert(err, IsNil) + c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_SubDateStringInt) + exprs = append(exprs, function) + function, err = NewFunction(mock.NewContext(), ast.SubDate, types.NewFieldType(mysql.TypeDatetime), datetimeColumn, intColumn, stringColumn) + c.Assert(err, IsNil) + c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_SubDateDatetimeInt) + exprs = append(exprs, function) + + // castTimeAsString: + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), datetimeColumn) + c.Assert(err, IsNil) + c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_CastTimeAsString) + exprs = append(exprs, function) + + // concat_ws + function, err = NewFunction(mock.NewContext(), ast.ConcatWS, types.NewFieldType(mysql.TypeString), stringColumn, stringColumn, stringColumn) + c.Assert(err, IsNil) + c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_ConcatWS) + exprs = append(exprs, function) + + // StrToDateDateTime + function, err = NewFunction(mock.NewContext(), ast.StrToDate, types.NewFieldType(mysql.TypeDatetime), stringColumn, stringColumn) + c.Assert(err, IsNil) + c.Assert(function.(*ScalarFunction).Function.PbCode(), Equals, tipb.ScalarFuncSig_StrToDateDatetime) + exprs = append(exprs, function) + +>>>>>>> 6154335ac... expression: Support push function year,day,datediff,datesub,castTimeAsString,concat_ws down to TiFlash. (#25097) canPush := CanExprsPushDown(sc, exprs, client, kv.TiFlash) c.Assert(canPush, Equals, true) diff --git a/expression/expression.go b/expression/expression.go index 26bf0fb6e18bf..4cf0a24d0cde8 100644 --- a/expression/expression.go +++ b/expression/expression.go @@ -1101,6 +1101,7 @@ func canFuncBePushed(sf *ScalarFunction, storeType kv.StoreType) bool { ret = true } case +<<<<<<< HEAD ast.Substring, ast.Substr: switch sf.Function.PbCode() { @@ -1111,6 +1112,60 @@ func canFuncBePushed(sf *ScalarFunction, storeType kv.StoreType) bool { } case ast.Rand: switch sf.Function.PbCode() { +======= + ast.LogicOr, ast.LogicAnd, ast.UnaryNot, ast.BitNeg, ast.Xor, ast.And, ast.Or, + ast.GE, ast.LE, ast.EQ, ast.NE, ast.LT, ast.GT, ast.In, ast.IsNull, ast.Like, + ast.Plus, ast.Minus, ast.Div, ast.Mul, /*ast.Mod,*/ + ast.If, ast.Ifnull, ast.Case, + ast.Concat, ast.ConcatWS, + ast.Year, ast.Month, ast.Day, + ast.DateDiff, ast.TimestampDiff, ast.DateFormat, ast.FromUnixTime, + ast.JSONLength: + return true + case ast.Substr, ast.Substring: + switch function.Function.PbCode() { + case + tipb.ScalarFuncSig_Substring2ArgsUTF8, + tipb.ScalarFuncSig_Substring3ArgsUTF8: + return true + } + case ast.Cast: + switch function.Function.PbCode() { + case tipb.ScalarFuncSig_CastIntAsInt, tipb.ScalarFuncSig_CastIntAsReal, tipb.ScalarFuncSig_CastIntAsDecimal, tipb.ScalarFuncSig_CastIntAsString, tipb.ScalarFuncSig_CastIntAsTime, + tipb.ScalarFuncSig_CastRealAsInt, tipb.ScalarFuncSig_CastRealAsReal, tipb.ScalarFuncSig_CastRealAsDecimal, tipb.ScalarFuncSig_CastRealAsString, tipb.ScalarFuncSig_CastRealAsTime, + tipb.ScalarFuncSig_CastStringAsInt, tipb.ScalarFuncSig_CastStringAsReal, tipb.ScalarFuncSig_CastStringAsDecimal, tipb.ScalarFuncSig_CastStringAsString, tipb.ScalarFuncSig_CastStringAsTime, + tipb.ScalarFuncSig_CastDecimalAsInt /*, tipb.ScalarFuncSig_CastDecimalAsReal*/, tipb.ScalarFuncSig_CastDecimalAsDecimal, tipb.ScalarFuncSig_CastDecimalAsString, tipb.ScalarFuncSig_CastDecimalAsTime, + tipb.ScalarFuncSig_CastTimeAsInt /*, tipb.ScalarFuncSig_CastTimeAsReal*/, tipb.ScalarFuncSig_CastTimeAsDecimal, tipb.ScalarFuncSig_CastTimeAsTime, tipb.ScalarFuncSig_CastTimeAsString: + return true + } + case ast.DateAdd, ast.AddDate: + switch function.Function.PbCode() { + case tipb.ScalarFuncSig_AddDateDatetimeInt, tipb.ScalarFuncSig_AddDateStringInt: + return true + } + case ast.DateSub, ast.SubDate: + switch function.Function.PbCode() { + case tipb.ScalarFuncSig_SubDateDatetimeInt, tipb.ScalarFuncSig_SubDateStringInt: + return true + } + case ast.UnixTimestamp: + switch function.Function.PbCode() { + case tipb.ScalarFuncSig_UnixTimestampInt, tipb.ScalarFuncSig_UnixTimestampDec: + return true + } + case ast.Round: + switch function.Function.PbCode() { + case tipb.ScalarFuncSig_RoundInt, tipb.ScalarFuncSig_RoundReal: + return true + } + case ast.Extract: + switch function.Function.PbCode() { + case tipb.ScalarFuncSig_ExtractDatetime: + return true + } + case ast.StrToDate: + switch function.Function.PbCode() { +>>>>>>> 6154335ac... expression: Support push function year,day,datediff,datesub,castTimeAsString,concat_ws down to TiFlash. (#25097) case tipb.ScalarFuncSig_RandWithSeedFirstGen: ret = true