diff --git a/expression/expr_to_pb_test.go b/expression/expr_to_pb_test.go index 4850c9f41bf42..1025f3c7fdcb1 100644 --- a/expression/expr_to_pb_test.go +++ b/expression/expr_to_pb_test.go @@ -528,6 +528,18 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) + // json_extract + function, err = NewFunction(mock.NewContext(), ast.JSONExtract, types.NewFieldType(mysql.TypeJSON), jsonColumn, stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + + // json_unquote argument is cast(json as string) + subFunc, subErr := NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), jsonColumn) + require.NoError(t, subErr) + function, err = NewFunction(mock.NewContext(), ast.JSONUnquote, types.NewFieldType(mysql.TypeString), subFunc) + require.NoError(t, err) + exprs = append(exprs, function) + // lpad function, err = NewFunction(mock.NewContext(), ast.Lpad, types.NewFieldType(mysql.TypeString), stringColumn, int32Column, stringColumn) require.NoError(t, err) @@ -639,6 +651,11 @@ func TestExprPushDownToFlash(t *testing.T) { require.NoError(t, err) exprs = append(exprs, function) + // CastJsonAsString + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), jsonColumn) + require.NoError(t, err) + exprs = append(exprs, function) + // CastIntAsTime function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeDatetime), intColumn) require.NoError(t, err) @@ -958,6 +975,11 @@ func TestExprPushDownToFlash(t *testing.T) { exprs = exprs[:0] + // json_unquote's argument is not cast(json as string) + function, err = NewFunction(mock.NewContext(), ast.JSONUnquote, types.NewFieldType(mysql.TypeString), stringColumn) + require.NoError(t, err) + exprs = append(exprs, function) + // Substring2Args: can not be pushed function, err = NewFunction(mock.NewContext(), ast.Substr, types.NewFieldType(mysql.TypeString), binaryStringColumn, intColumn) require.NoError(t, err) diff --git a/expression/expression.go b/expression/expression.go index d755f25fd29a4..024bac00ef960 100644 --- a/expression/expression.go +++ b/expression/expression.go @@ -1150,7 +1150,7 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { 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, ast.Repeat, + ast.JSONLength, ast.JSONExtract, ast.JSONUnquote, ast.Repeat, ast.InetNtoa, ast.InetAton, ast.Inet6Ntoa, ast.Inet6Aton, ast.Coalesce, ast.ASCII, ast.Length, ast.Trim, ast.Position, ast.Format, ast.Elt, ast.LTrim, ast.RTrim, ast.Lpad, ast.Rpad, @@ -1163,6 +1163,12 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { tipb.ScalarFuncSig_IfDuration, tipb.ScalarFuncSig_CaseWhenDuration: return false + case tipb.ScalarFuncSig_JsonUnquoteSig: + // TiFlash json_unquote now only supports json string generated by cast(json as string) + if childFunc, ok := function.GetArgs()[0].(*ScalarFunction); ok { + return childFunc.Function.PbCode() == tipb.ScalarFuncSig_CastJsonAsString + } + return false } return true case ast.Regexp, ast.RegexpLike, ast.RegexpInStr, ast.RegexpSubstr: @@ -1200,7 +1206,7 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { tipb.ScalarFuncSig_CastStringAsDecimal /*, tipb.ScalarFuncSig_CastDurationAsDecimal, tipb.ScalarFuncSig_CastJsonAsDecimal*/ : return function.RetType.IsDecimalValid() case tipb.ScalarFuncSig_CastDecimalAsString, tipb.ScalarFuncSig_CastIntAsString, tipb.ScalarFuncSig_CastRealAsString, tipb.ScalarFuncSig_CastTimeAsString, - tipb.ScalarFuncSig_CastStringAsString /*, tipb.ScalarFuncSig_CastDurationAsString, tipb.ScalarFuncSig_CastJsonAsString*/ : + tipb.ScalarFuncSig_CastStringAsString, tipb.ScalarFuncSig_CastJsonAsString /*, tipb.ScalarFuncSig_CastDurationAsString*/ : return true case tipb.ScalarFuncSig_CastDecimalAsTime, tipb.ScalarFuncSig_CastIntAsTime, tipb.ScalarFuncSig_CastRealAsTime, tipb.ScalarFuncSig_CastTimeAsTime, tipb.ScalarFuncSig_CastStringAsTime /*, tipb.ScalarFuncSig_CastDurationAsTime, tipb.ScalarFuncSig_CastJsonAsTime*/ :