From ebb7d70268be38f49db34ebdc115e18eed3e1dff Mon Sep 17 00:00:00 2001 From: chAnge <50198008+chAngeZhaoZhanBo@users.noreply.github.com> Date: Thu, 5 Aug 2021 14:55:13 +0800 Subject: [PATCH] expression: Support mathematical functions pushdown to tiflash (#25596) --- expression/expr_to_pb_test.go | 56 +++++++++++++++++++++++++++++++++-- expression/expression.go | 3 +- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/expression/expr_to_pb_test.go b/expression/expr_to_pb_test.go index 8f7c328118..6024503cc3 100644 --- a/expression/expr_to_pb_test.go +++ b/expression/expr_to_pb_test.go @@ -755,7 +755,7 @@ func (s *testEvaluatorSuite) TestExprPushDownToFlash(c *C) { c.Assert(err, IsNil) exprs = append(exprs, function) - // ScalarFuncSig_CeilDecimalToDecimal + // ScalarFuncSig_CeilDecToDec function, err = NewFunction(mock.NewContext(), ast.Ceil, types.NewFieldType(mysql.TypeNewDecimal), decimalColumn) c.Assert(err, IsNil) exprs = append(exprs, function) @@ -770,16 +770,66 @@ func (s *testEvaluatorSuite) TestExprPushDownToFlash(c *C) { c.Assert(err, IsNil) exprs = append(exprs, function) - // ScalarFuncSig_FloorDecimalToInt + // ScalarFuncSig_FloorDecToInt function, err = NewFunction(mock.NewContext(), ast.Floor, types.NewFieldType(mysql.TypeLonglong), decimalColumn) c.Assert(err, IsNil) exprs = append(exprs, function) - // ScalarFuncSig_FloorDecimalToDecimal + // ScalarFuncSig_FloorDecToDec function, err = NewFunction(mock.NewContext(), ast.Floor, types.NewFieldType(mysql.TypeNewDecimal), decimalColumn) c.Assert(err, IsNil) exprs = append(exprs, function) + // ScalarFuncSig_Log1Arg + function, err = NewFunction(mock.NewContext(), ast.Log, types.NewFieldType(mysql.TypeDouble), realColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // ScalarFuncSig_Log2Args + function, err = NewFunction(mock.NewContext(), ast.Log, types.NewFieldType(mysql.TypeDouble), realColumn, realColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // ScalarFuncSig_Log2 + function, err = NewFunction(mock.NewContext(), ast.Log2, types.NewFieldType(mysql.TypeDouble), realColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // ScalarFuncSig_Log10 + function, err = NewFunction(mock.NewContext(), ast.Log10, types.NewFieldType(mysql.TypeDouble), realColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // ScalarFuncSig_Exp + function, err = NewFunction(mock.NewContext(), ast.Exp, types.NewFieldType(mysql.TypeDouble), realColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // ScalarFuncSig_Pow + function, err = NewFunction(mock.NewContext(), ast.Pow, types.NewFieldType(mysql.TypeDouble), realColumn, realColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // ScalarFuncSig_Radians + function, err = NewFunction(mock.NewContext(), ast.Radians, types.NewFieldType(mysql.TypeDouble), realColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // ScalarFuncSig_Degrees + function, err = NewFunction(mock.NewContext(), ast.Degrees, types.NewFieldType(mysql.TypeDouble), realColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // ScalarFuncSig_CRC32 + function, err = NewFunction(mock.NewContext(), ast.CRC32, types.NewFieldType(mysql.TypeLonglong), stringColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // ScalarFuncSig_Conv + function, err = NewFunction(mock.NewContext(), ast.Conv, types.NewFieldType(mysql.TypeDouble), stringColumn, intColumn, intColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + // Replace function, err = NewFunction(mock.NewContext(), ast.Replace, types.NewFieldType(mysql.TypeString), stringColumn, stringColumn, stringColumn) c.Assert(err, IsNil) diff --git a/expression/expression.go b/expression/expression.go index a73c6df8ba..f84f75cb90 100644 --- a/expression/expression.go +++ b/expression/expression.go @@ -1017,7 +1017,8 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { ast.Concat, ast.ConcatWS, ast.Year, ast.Month, ast.Day, ast.DateDiff, ast.TimestampDiff, ast.DateFormat, ast.FromUnixTime, - ast.Sqrt, + ast.Sqrt, ast.Log, ast.Log2, ast.Log10, ast.Ln, ast.Exp, ast.Pow, ast.Sign, + ast.Radians, ast.Degrees, ast.Conv, ast.CRC32, ast.JSONLength: return true case ast.Substr, ast.Substring, ast.Left, ast.Right, ast.CharLength: