Skip to content

Commit

Permalink
*: support sig push down in mocktikv. (#4364)
Browse files Browse the repository at this point in the history
  • Loading branch information
hanfei1991 committed Aug 30, 2017
1 parent 2ae9abe commit d739d7f
Show file tree
Hide file tree
Showing 5 changed files with 341 additions and 8 deletions.
6 changes: 2 additions & 4 deletions expression/builtin_arithmetic.go
Expand Up @@ -268,7 +268,7 @@ func (c *arithmeticMinusFunctionClass) getFunction(args []Expression, ctx contex
bf := newBaseBuiltinFuncWithTp(args, ctx, tpDecimal, tpDecimal, tpDecimal)
setFlenDecimal4RealOrDecimal(bf.tp, args[0].GetType(), args[1].GetType(), false)
sig := &builtinArithmeticMinusDecimalSig{baseDecimalBuiltinFunc{bf}}
sig.setPbCode(tipb.ScalarFuncSig_PlusDecimal)
sig.setPbCode(tipb.ScalarFuncSig_MinusDecimal)
return sig.setSelf(sig), nil
} else {
bf := newBaseBuiltinFuncWithTp(args, ctx, tpInt, tpInt, tpInt)
Expand All @@ -277,7 +277,7 @@ func (c *arithmeticMinusFunctionClass) getFunction(args []Expression, ctx contex
bf.tp.Flag |= mysql.UnsignedFlag
}
sig := &builtinArithmeticMinusIntSig{baseIntBuiltinFunc: baseIntBuiltinFunc{bf}}
sig.setPbCode(tipb.ScalarFuncSig_PlusInt)
sig.setPbCode(tipb.ScalarFuncSig_MinusInt)
return sig.setSelf(sig), nil
}
}
Expand Down Expand Up @@ -497,13 +497,11 @@ func (c *arithmeticDivideFunctionClass) getFunction(args []Expression, ctx conte
bf := newBaseBuiltinFuncWithTp(args, ctx, tpReal, tpReal, tpReal)
c.setType4DivReal(bf.tp)
sig := &builtinArithmeticDivideRealSig{baseRealBuiltinFunc{bf}}
sig.setPbCode(tipb.ScalarFuncSig_MultiplyReal)
return sig.setSelf(sig), nil
}
bf := newBaseBuiltinFuncWithTp(args, ctx, tpDecimal, tpDecimal, tpDecimal)
c.setType4DivDecimal(bf.tp, tpA, tpB)
sig := &builtinArithmeticDivideDecimalSig{baseDecimalBuiltinFunc{bf}}
sig.setPbCode(tipb.ScalarFuncSig_MultiplyDecimal)
return sig.setSelf(sig), nil
}

Expand Down
326 changes: 326 additions & 0 deletions expression/distsql_builtin.go
Expand Up @@ -14,10 +14,13 @@
package expression

import (
"fmt"
"time"

"github.com/juju/errors"
"github.com/pingcap/tidb/ast"
"github.com/pingcap/tidb/context"
"github.com/pingcap/tidb/model"
"github.com/pingcap/tidb/mysql"
"github.com/pingcap/tidb/sessionctx/variable"
"github.com/pingcap/tidb/util/codec"
Expand Down Expand Up @@ -83,6 +86,326 @@ var distFuncs = map[tipb.ExprType]string{
tipb.ExprType_JsonObject: ast.JSONObject,
}

func pbTypeToFieldType(tp *tipb.FieldType) *types.FieldType {
return &types.FieldType{
Tp: byte(tp.Tp),
Flag: uint(tp.Flag),
Flen: int(tp.Flen),
Decimal: int(tp.Decimal),
Charset: tp.Charset,
Collate: mysql.Collations[uint8(tp.Collate)],
}
}

func getSignatureByPB(ctx context.Context, sigCode tipb.ScalarFuncSig, tp *tipb.FieldType, args []Expression) (f builtinFunc, e error) {
fieldTp := pbTypeToFieldType(tp)
base := newBaseBuiltinFunc(args, ctx)
base.tp = fieldTp
switch sigCode {
case tipb.ScalarFuncSig_CastIntAsInt:
f = &builtinCastIntAsIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastRealAsInt:
f = &builtinCastRealAsIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastDecimalAsInt:
f = &builtinCastDecimalAsIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastDurationAsInt:
f = &builtinCastDurationAsIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastTimeAsInt:
f = &builtinCastTimeAsIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastStringAsInt:
f = &builtinCastStringAsIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastJsonAsInt:
f = &builtinCastJSONAsIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastIntAsReal:
f = &builtinCastIntAsRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastRealAsReal:
f = &builtinCastRealAsRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastDecimalAsReal:
f = &builtinCastDecimalAsRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastDurationAsReal:
f = &builtinCastDurationAsRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastTimeAsReal:
f = &builtinCastTimeAsRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastStringAsReal:
f = &builtinCastStringAsRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastJsonAsReal:
f = &builtinCastJSONAsRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastIntAsDecimal:
f = &builtinCastIntAsDecimalSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastRealAsDecimal:
f = &builtinCastRealAsDecimalSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastDecimalAsDecimal:
f = &builtinCastDecimalAsDecimalSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastDurationAsDecimal:
f = &builtinCastDurationAsDecimalSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastTimeAsDecimal:
f = &builtinCastTimeAsDecimalSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastStringAsDecimal:
f = &builtinCastStringAsDecimalSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastJsonAsDecimal:
f = &builtinCastJSONAsDecimalSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastIntAsTime:
f = &builtinCastIntAsTimeSig{baseTimeBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastRealAsTime:
f = &builtinCastRealAsTimeSig{baseTimeBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastDecimalAsTime:
f = &builtinCastDecimalAsTimeSig{baseTimeBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastDurationAsTime:
f = &builtinCastDurationAsTimeSig{baseTimeBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastTimeAsTime:
f = &builtinCastTimeAsTimeSig{baseTimeBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastStringAsTime:
f = &builtinCastStringAsTimeSig{baseTimeBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastJsonAsTime:
f = &builtinCastJSONAsTimeSig{baseTimeBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastIntAsString:
f = &builtinCastIntAsStringSig{baseStringBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastRealAsString:
f = &builtinCastRealAsStringSig{baseStringBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastDecimalAsString:
f = &builtinCastDecimalAsStringSig{baseStringBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastDurationAsString:
f = &builtinCastDurationAsStringSig{baseStringBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastTimeAsString:
f = &builtinCastTimeAsStringSig{baseStringBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastStringAsString:
f = &builtinCastStringAsStringSig{baseStringBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastJsonAsString:
f = &builtinCastJSONAsStringSig{baseStringBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastIntAsDuration:
f = &builtinCastIntAsDurationSig{baseDurationBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastRealAsDuration:
f = &builtinCastRealAsDurationSig{baseDurationBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastDecimalAsDuration:
f = &builtinCastDecimalAsDurationSig{baseDurationBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastDurationAsDuration:
f = &builtinCastDurationAsDurationSig{baseDurationBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastTimeAsDuration:
f = &builtinCastTimeAsDurationSig{baseDurationBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastStringAsDuration:
f = &builtinCastStringAsDurationSig{baseDurationBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastIntAsJson:
f = &builtinCastIntAsJSONSig{baseJSONBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastRealAsJson:
f = &builtinCastRealAsJSONSig{baseJSONBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastDecimalAsJson:
f = &builtinCastDecimalAsJSONSig{baseJSONBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastTimeAsJson:
f = &builtinCastTimeAsJSONSig{baseJSONBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastDurationAsJson:
f = &builtinCastDurationAsJSONSig{baseJSONBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastStringAsJson:
f = &builtinCastStringAsJSONSig{baseJSONBuiltinFunc{base}}
case tipb.ScalarFuncSig_CastJsonAsJson:
f = &builtinCastJSONAsJSONSig{baseJSONBuiltinFunc{base}}
case tipb.ScalarFuncSig_GTInt:
f = &builtinGTIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_GEInt:
f = &builtinGEIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LTInt:
f = &builtinLTIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LEInt:
f = &builtinLEIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_EQInt:
f = &builtinEQIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_NEInt:
f = &builtinNEIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_NullEQInt:
f = &builtinNullEQIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_GTReal:
f = &builtinGTRealSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_GEReal:
f = &builtinGERealSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LTReal:
f = &builtinLTRealSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LEReal:
f = &builtinLERealSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_EQReal:
f = &builtinEQRealSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_NEReal:
f = &builtinNERealSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_NullEQReal:
f = &builtinNullEQRealSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_GTDecimal:
f = &builtinGTDecimalSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_GEDecimal:
f = &builtinGEDecimalSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LTDecimal:
f = &builtinLTDecimalSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LEDecimal:
f = &builtinLEDecimalSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_EQDecimal:
f = &builtinEQDecimalSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_NEDecimal:
f = &builtinNEDecimalSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_NullEQDecimal:
f = &builtinNullEQDecimalSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_GTTime:
f = &builtinGTTimeSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_GETime:
f = &builtinGETimeSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LTTime:
f = &builtinLTTimeSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LETime:
f = &builtinLETimeSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_EQTime:
f = &builtinEQTimeSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_NETime:
f = &builtinNETimeSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_NullEQTime:
f = &builtinNullEQTimeSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_GTDuration:
f = &builtinGTDurationSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_GEDuration:
f = &builtinGEDurationSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LTDuration:
f = &builtinLTDurationSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LEDuration:
f = &builtinLEDurationSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_EQDuration:
f = &builtinEQDurationSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_NEDuration:
f = &builtinNEDurationSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_NullEQDuration:
f = &builtinNullEQDurationSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_GTString:
f = &builtinGTStringSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_GEString:
f = &builtinGEStringSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LTString:
f = &builtinLTStringSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LEString:
f = &builtinLEStringSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_EQString:
f = &builtinEQStringSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_NEString:
f = &builtinNEStringSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_NullEQString:
f = &builtinNullEQStringSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_GTJson:
f = &builtinGTJSONSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_GEJson:
f = &builtinGEJSONSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LTJson:
f = &builtinLTJSONSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LEJson:
f = &builtinLEJSONSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_EQJson:
f = &builtinEQJSONSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_NEJson:
f = &builtinNEJSONSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_NullEQJson:
f = &builtinNullEQJSONSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_PlusInt:
f = &builtinArithmeticPlusIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_PlusDecimal:
f = &builtinArithmeticPlusDecimalSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_PlusReal:
f = &builtinArithmeticPlusRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_MinusInt:
f = &builtinArithmeticMinusIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_MinusDecimal:
f = &builtinArithmeticMinusDecimalSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_MinusReal:
f = &builtinArithmeticMinusRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_MultiplyInt:
f = &builtinArithmeticMultiplyIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_MultiplyDecimal:
f = &builtinArithmeticMultiplyDecimalSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_MultiplyReal:
f = &builtinArithmeticMultiplyRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_AbsInt:
f = &builtinAbsIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_AbsReal:
f = &builtinAbsRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_AbsDecimal:
f = &builtinAbsDecSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_CeilIntToInt:
f = &builtinCeilIntToIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_CeilIntToDec:
f = &builtinCeilIntToDecSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_CeilDecToInt:
f = &builtinCeilDecToIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_CeilReal:
f = &builtinCeilRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_FloorIntToInt:
f = &builtinFloorIntToIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_FloorIntToDec:
f = &builtinFloorIntToDecSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_FloorDecToInt:
f = &builtinFloorDecToIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_FloorReal:
f = &builtinFloorRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_LogicalAnd:
f = &builtinLogicAndSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LogicalOr:
f = &builtinLogicOrSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_LogicalXor:
f = &builtinLogicXorSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_UnaryNot:
f = &builtinUnaryNotSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_UnaryMinusInt:
f = &builtinUnaryMinusIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_UnaryMinusReal:
f = &builtinUnaryMinusRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_UnaryMinusDecimal:
f = &builtinUnaryMinusDecimalSig{baseDecimalBuiltinFunc{base}, false}
case tipb.ScalarFuncSig_DecimalIsNull:
f = &builtinDecimalIsNullSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_DurationIsNull:
f = &builtinDurationIsNullSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_RealIsNull:
f = &builtinRealIsNullSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_StringIsNull:
f = &builtinStringIsNullSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_IntIsNull:
f = &builtinIntIsNullSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_IfNullReal:
f = &builtinIfNullRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_IfNullInt:
f = &builtinIfNullIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_IfNullDecimal:
f = &builtinIfNullDecimalSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_IfNullString:
f = &builtinIfNullStringSig{baseStringBuiltinFunc{base}}
case tipb.ScalarFuncSig_IfNullTime:
f = &builtinIfNullTimeSig{baseTimeBuiltinFunc{base}}
case tipb.ScalarFuncSig_IfNullDuration:
f = &builtinIfNullTimeSig{baseTimeBuiltinFunc{base}}
case tipb.ScalarFuncSig_IfReal:
f = &builtinIfRealSig{baseRealBuiltinFunc{base}}
case tipb.ScalarFuncSig_IfInt:
f = &builtinIfIntSig{baseIntBuiltinFunc{base}}
case tipb.ScalarFuncSig_IfDecimal:
f = &builtinIfDecimalSig{baseDecimalBuiltinFunc{base}}
case tipb.ScalarFuncSig_IfString:
f = &builtinIfStringSig{baseStringBuiltinFunc{base}}
case tipb.ScalarFuncSig_IfTime:
f = &builtinIfTimeSig{baseTimeBuiltinFunc{base}}
case tipb.ScalarFuncSig_IfDuration:
f = &builtinIfDurationSig{baseDurationBuiltinFunc{base}}
default:
e = errFunctionNotExists.GenByArgs(sigCode)
return nil, errors.Trace(e)
}
f.setSelf(f)
return f, nil
}

func newDistSQLFunctionBySig(sc *variable.StatementContext, sigCode tipb.ScalarFuncSig, tp *tipb.FieldType, args []Expression) (Expression, error) {
ctx := mock.NewContext()
ctx.GetSessionVars().StmtCtx = sc
f, err := getSignatureByPB(ctx, sigCode, tp, args)
if err != nil {
return nil, errors.Trace(err)
}
return &ScalarFunction{
FuncName: model.NewCIStr(fmt.Sprintf("sig_%T", f)),
Function: f,
RetType: f.getRetTp(),
}, nil
}

// newDistSQLFunction only creates function for mock-tikv.
func newDistSQLFunction(sc *variable.StatementContext, exprType tipb.ExprType, args []Expression) (Expression, error) {
name, ok := distFuncs[exprType]
Expand Down Expand Up @@ -145,6 +468,9 @@ func PBToExpr(expr *tipb.Expr, tps []*types.FieldType, sc *variable.StatementCon
}
args = append(args, arg)
}
if expr.Tp == tipb.ExprType_ScalarFunc {
return newDistSQLFunctionBySig(sc, *expr.Sig, expr.FieldType, args)
}
return newDistSQLFunction(sc, expr.Tp, args)
}

Expand Down
6 changes: 6 additions & 0 deletions expression/expr_to_pb.go
Expand Up @@ -491,5 +491,11 @@ func (pc pbConverter) convertToPBExpr(expr *ScalarFunction, tp tipb.ExprType) *t
}
children = append(children, pbArg)
}
if pc.client.IsRequestTypeSupported(kv.ReqTypeDAG, kv.ReqSubTypeSignature) {
code := expr.Function.PbCode()
if code > 0 {
return &tipb.Expr{Tp: tipb.ExprType_ScalarFunc, Sig: &code, Children: children, FieldType: toPBFieldType(expr.RetType)}
}
}
return &tipb.Expr{Tp: tp, Children: children}
}

0 comments on commit d739d7f

Please sign in to comment.