Skip to content

Commit ce04a0b

Browse files
committed
expression:add real sig for logicalAnd/Or
Signed-off-by: jingyugao <1121087373@qq.com>
1 parent 702854f commit ce04a0b

8 files changed

+118
-22
lines changed

expression/builtin_op.go

+90-14
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@ var (
3737
)
3838

3939
var (
40-
_ builtinFunc = &builtinLogicAndSig{}
41-
_ builtinFunc = &builtinLogicOrSig{}
40+
_ builtinFunc = &builtinIntLogicAndSig{}
41+
_ builtinFunc = &builtinRealLogicAndSig{}
42+
_ builtinFunc = &builtinIntLogicOrSig{}
43+
_ builtinFunc = &builtinRealLogicOrSig{}
4244
_ builtinFunc = &builtinLogicXorSig{}
4345
_ builtinFunc = &builtinRealIsTrueSig{}
4446
_ builtinFunc = &builtinDecimalIsTrueSig{}
@@ -67,24 +69,33 @@ func (c *logicAndFunctionClass) getFunction(ctx sessionctx.Context, args []Expre
6769
if err != nil {
6870
return nil, err
6971
}
72+
argTp0, argTp1 := args[0].GetType().EvalType(), args[1].GetType().EvalType()
73+
if argTp0 == types.ETReal || argTp1 == types.ETReal || argTp0 == types.ETDecimal || argTp1 == types.ETDecimal {
74+
bf := newBaseBuiltinFuncWithTp(ctx, args, types.ETInt, types.ETReal, types.ETReal)
75+
sig := &builtinRealLogicAndSig{bf}
76+
sig.setPbCode(tipb.ScalarFuncSig_RealLogicalAnd)
77+
sig.tp.Flen = 1
78+
return sig, nil
79+
}
80+
7081
bf := newBaseBuiltinFuncWithTp(ctx, args, types.ETInt, types.ETInt, types.ETInt)
71-
sig := &builtinLogicAndSig{bf}
72-
sig.setPbCode(tipb.ScalarFuncSig_LogicalAnd)
82+
sig := &builtinIntLogicAndSig{bf}
83+
sig.setPbCode(tipb.ScalarFuncSig_IntLogicalAnd)
7384
sig.tp.Flen = 1
7485
return sig, nil
7586
}
7687

77-
type builtinLogicAndSig struct {
88+
type builtinIntLogicAndSig struct {
7889
baseBuiltinFunc
7990
}
8091

81-
func (b *builtinLogicAndSig) Clone() builtinFunc {
82-
newSig := &builtinLogicAndSig{}
92+
func (b *builtinIntLogicAndSig) Clone() builtinFunc {
93+
newSig := &builtinIntLogicAndSig{}
8394
newSig.cloneFrom(&b.baseBuiltinFunc)
8495
return newSig
8596
}
8697

87-
func (b *builtinLogicAndSig) evalInt(row chunk.Row) (int64, bool, error) {
98+
func (b *builtinIntLogicAndSig) evalInt(row chunk.Row) (int64, bool, error) {
8899
arg0, isNull0, err := b.args[0].EvalInt(b.ctx, row)
89100
if err != nil || (!isNull0 && arg0 == 0) {
90101
return 0, err != nil, err
@@ -99,6 +110,31 @@ func (b *builtinLogicAndSig) evalInt(row chunk.Row) (int64, bool, error) {
99110
return 1, false, nil
100111
}
101112

113+
type builtinRealLogicAndSig struct {
114+
baseBuiltinFunc
115+
}
116+
117+
func (b *builtinRealLogicAndSig) Clone() builtinFunc {
118+
newSig := &builtinRealLogicAndSig{}
119+
newSig.cloneFrom(&b.baseBuiltinFunc)
120+
return newSig
121+
}
122+
123+
func (b *builtinRealLogicAndSig) evalInt(row chunk.Row) (int64, bool, error) {
124+
arg0, isNull0, err := b.args[0].EvalReal(b.ctx, row)
125+
if err != nil || (!isNull0 && arg0 == 0) {
126+
return 0, err != nil, err
127+
}
128+
arg1, isNull1, err := b.args[1].EvalReal(b.ctx, row)
129+
if err != nil || (!isNull1 && arg1 == 0) {
130+
return 0, err != nil, err
131+
}
132+
if isNull0 || isNull1 {
133+
return 0, true, nil
134+
}
135+
return 1, false, nil
136+
}
137+
102138
type logicOrFunctionClass struct {
103139
baseFunctionClass
104140
}
@@ -108,24 +144,64 @@ func (c *logicOrFunctionClass) getFunction(ctx sessionctx.Context, args []Expres
108144
if err != nil {
109145
return nil, err
110146
}
147+
argTp0, argTp1 := args[0].GetType().EvalType(), args[1].GetType().EvalType()
148+
if argTp0 == types.ETReal || argTp1 == types.ETReal || argTp0 == types.ETDecimal || argTp1 == types.ETDecimal {
149+
bf := newBaseBuiltinFuncWithTp(ctx, args, types.ETInt, types.ETReal, types.ETReal)
150+
sig := &builtinRealLogicOrSig{bf}
151+
sig.setPbCode(tipb.ScalarFuncSig_RealLogicalOr)
152+
sig.tp.Flen = 1
153+
return sig, nil
154+
}
155+
111156
bf := newBaseBuiltinFuncWithTp(ctx, args, types.ETInt, types.ETInt, types.ETInt)
112157
bf.tp.Flen = 1
113-
sig := &builtinLogicOrSig{bf}
114-
sig.setPbCode(tipb.ScalarFuncSig_LogicalOr)
158+
sig := &builtinIntLogicOrSig{bf}
159+
sig.setPbCode(tipb.ScalarFuncSig_IntLogicalOr)
115160
return sig, nil
116161
}
117162

118-
type builtinLogicOrSig struct {
163+
type builtinRealLogicOrSig struct {
164+
baseBuiltinFunc
165+
}
166+
167+
func (b *builtinRealLogicOrSig) Clone() builtinFunc {
168+
newSig := &builtinRealLogicOrSig{}
169+
newSig.cloneFrom(&b.baseBuiltinFunc)
170+
return newSig
171+
}
172+
173+
func (b *builtinRealLogicOrSig) evalInt(row chunk.Row) (int64, bool, error) {
174+
arg0, isNull0, err := b.args[0].EvalReal(b.ctx, row)
175+
if err != nil {
176+
return 0, true, err
177+
}
178+
if !isNull0 && arg0 != 0 {
179+
return 1, false, nil
180+
}
181+
arg1, isNull1, err := b.args[1].EvalReal(b.ctx, row)
182+
if err != nil {
183+
return 0, true, err
184+
}
185+
if !isNull1 && arg1 != 0 {
186+
return 1, false, nil
187+
}
188+
if isNull0 || isNull1 {
189+
return 0, true, nil
190+
}
191+
return 0, false, nil
192+
}
193+
194+
type builtinIntLogicOrSig struct {
119195
baseBuiltinFunc
120196
}
121197

122-
func (b *builtinLogicOrSig) Clone() builtinFunc {
123-
newSig := &builtinLogicOrSig{}
198+
func (b *builtinIntLogicOrSig) Clone() builtinFunc {
199+
newSig := &builtinIntLogicOrSig{}
124200
newSig.cloneFrom(&b.baseBuiltinFunc)
125201
return newSig
126202
}
127203

128-
func (b *builtinLogicOrSig) evalInt(row chunk.Row) (int64, bool, error) {
204+
func (b *builtinIntLogicOrSig) evalInt(row chunk.Row) (int64, bool, error) {
129205
arg0, isNull0, err := b.args[0].EvalInt(b.ctx, row)
130206
if err != nil {
131207
return 0, true, err

expression/builtin_op_test.go

+8
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ func (s *testEvaluatorSuite) TestLogicAnd(c *C) {
9191
{[]interface{}{0, nil}, 0, false, false},
9292
{[]interface{}{nil, 0}, 0, false, false},
9393
{[]interface{}{nil, 1}, 0, true, false},
94+
{[]interface{}{0.1, 0.1}, 1, false, false},
95+
{[]interface{}{0.1, 0}, 0, false, false},
96+
{[]interface{}{0, 0.1}, 0, false, false},
97+
{[]interface{}{nil, 0.1}, 0, true, false},
9498

9599
{[]interface{}{errors.New("must error"), 1}, 0, false, true},
96100
}
@@ -305,6 +309,10 @@ func (s *testEvaluatorSuite) TestLogicOr(c *C) {
305309
{[]interface{}{1, nil}, 1, false, false},
306310
{[]interface{}{nil, 1}, 1, false, false},
307311
{[]interface{}{nil, 0}, 0, true, false},
312+
{[]interface{}{0.1, 0.1}, 1, false, false},
313+
{[]interface{}{0.1, 0}, 1, false, false},
314+
{[]interface{}{0, 0.1}, 1, false, false},
315+
{[]interface{}{nil, 0.1}, 1, false, false},
308316

309317
{[]interface{}{errors.New("must error"), 1}, 0, false, true},
310318
}

expression/distsql_builtin.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -305,10 +305,14 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti
305305
case tipb.ScalarFuncSig_FloorReal:
306306
f = &builtinFloorRealSig{base}
307307

308-
case tipb.ScalarFuncSig_LogicalAnd:
309-
f = &builtinLogicAndSig{base}
310-
case tipb.ScalarFuncSig_LogicalOr:
311-
f = &builtinLogicOrSig{base}
308+
case tipb.ScalarFuncSig_IntLogicalAnd:
309+
f = &builtinIntLogicAndSig{base}
310+
case tipb.ScalarFuncSig_RealLogicalAnd:
311+
f = &builtinRealLogicAndSig{base}
312+
case tipb.ScalarFuncSig_IntLogicalOr:
313+
f = &builtinIntLogicOrSig{base}
314+
case tipb.ScalarFuncSig_RealLogicalOr:
315+
f = &builtinRealLogicOrSig{base}
312316
case tipb.ScalarFuncSig_LogicalXor:
313317
f = &builtinLogicXorSig{base}
314318
case tipb.ScalarFuncSig_BitAndSig:

expression/distsql_builtin_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -453,12 +453,12 @@ func (s *testEvalSuite) TestEval(c *C) {
453453
types.NewDecimalDatum(newMyDecimal(c, "1.23")),
454454
},
455455
{
456-
scalarFunctionExpr(tipb.ScalarFuncSig_LogicalAnd,
456+
scalarFunctionExpr(tipb.ScalarFuncSig_IntLogicalAnd,
457457
toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewIntDatum(1))),
458458
types.NewIntDatum(1),
459459
},
460460
{
461-
scalarFunctionExpr(tipb.ScalarFuncSig_LogicalOr,
461+
scalarFunctionExpr(tipb.ScalarFuncSig_IntLogicalOr,
462462
toPBFieldType(newIntFieldType()), datumExpr(c, types.NewIntDatum(1)), datumExpr(c, types.NewIntDatum(0))),
463463
types.NewIntDatum(1),
464464
},

expression/expr_to_pb.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ func ExpressionsToPB(sc *stmtctx.StatementContext, exprs []Expression, client kv
5959
// Merge multiple converted pb expression into a CNF.
6060
pbCNF = &tipb.Expr{
6161
Tp: tipb.ExprType_ScalarFunc,
62-
Sig: tipb.ScalarFuncSig_LogicalAnd,
62+
Sig: tipb.ScalarFuncSig_IntLogicalAnd,
6363
Children: []*tipb.Expr{pbCNF, pbExpr},
6464
FieldType: ToPBFieldType(retTypeOfAnd),
6565
}

expression/util_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ func (s *testUtilSuite) TestClone(c *check.C) {
117117
&builtinInetAtonSig{}, &builtinInetNtoaSig{}, &builtinInet6AtonSig{}, &builtinInet6NtoaSig{}, &builtinIsIPv4Sig{},
118118
&builtinIsIPv4CompatSig{}, &builtinIsIPv4MappedSig{}, &builtinIsIPv6Sig{}, &builtinUUIDSig{}, &builtinNameConstIntSig{},
119119
&builtinNameConstRealSig{}, &builtinNameConstDecimalSig{}, &builtinNameConstTimeSig{}, &builtinNameConstDurationSig{}, &builtinNameConstStringSig{},
120-
&builtinNameConstJSONSig{}, &builtinLogicAndSig{}, &builtinLogicOrSig{}, &builtinLogicXorSig{}, &builtinRealIsTrueSig{},
120+
&builtinNameConstJSONSig{}, &builtinIntLogicAndSig{}, &builtinRealLogicAndSig{}, &builtinIntLogicOrSig{}, &builtinRealLogicOrSig{}, &builtinLogicXorSig{}, &builtinRealIsTrueSig{},
121121
&builtinDecimalIsTrueSig{}, &builtinIntIsTrueSig{}, &builtinRealIsFalseSig{}, &builtinDecimalIsFalseSig{}, &builtinIntIsFalseSig{},
122122
&builtinUnaryMinusIntSig{}, &builtinDecimalIsNullSig{}, &builtinDurationIsNullSig{}, &builtinIntIsNullSig{}, &builtinRealIsNullSig{},
123123
&builtinStringIsNullSig{}, &builtinTimeIsNullSig{}, &builtinUnaryNotRealSig{}, &builtinUnaryNotDecimalSig{}, &builtinUnaryNotIntSig{}, &builtinSleepSig{}, &builtinInIntSig{},

go.mod

+4
Original file line numberDiff line numberDiff line change
@@ -75,3 +75,7 @@ require (
7575
sourcegraph.com/sourcegraph/appdash v0.0.0-20180531100431-4c381bd170b4
7676
sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67
7777
)
78+
79+
replace github.com/pingcap/tipb => github.com/jingyugao/tipb v0.0.0-20190911070230-03bcdbb81a3f
80+
81+
go 1.13

go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ github.com/grpc-ecosystem/grpc-gateway v1.5.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpg
101101
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
102102
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
103103
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
104+
github.com/jingyugao/tipb v0.0.0-20190806070524-16909e03435e h1:SgfzTAMEcs003GgjRX+iwP50/myD5xKUd/E6pAXvZhs=
105+
github.com/jingyugao/tipb v0.0.0-20190806070524-16909e03435e/go.mod h1:EBxLpOvivm5T+SDsuT+icoNOaQGLvz2kBmMfKzhmIJ4=
106+
github.com/jingyugao/tipb v0.0.0-20190911070230-03bcdbb81a3f h1:mtQuOG0TM05qjRfmOAm5nMzo2igGZHW99faxOKfwFNw=
107+
github.com/jingyugao/tipb v0.0.0-20190911070230-03bcdbb81a3f/go.mod h1:EBxLpOvivm5T+SDsuT+icoNOaQGLvz2kBmMfKzhmIJ4=
104108
github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo=
105109
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
106110
github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs=

0 commit comments

Comments
 (0)