37
37
)
38
38
39
39
var (
40
- _ builtinFunc = & builtinLogicAndSig {}
41
- _ builtinFunc = & builtinLogicOrSig {}
40
+ _ builtinFunc = & builtinIntLogicAndSig {}
41
+ _ builtinFunc = & builtinRealLogicAndSig {}
42
+ _ builtinFunc = & builtinIntLogicOrSig {}
43
+ _ builtinFunc = & builtinRealLogicOrSig {}
42
44
_ builtinFunc = & builtinLogicXorSig {}
43
45
_ builtinFunc = & builtinRealIsTrueSig {}
44
46
_ builtinFunc = & builtinDecimalIsTrueSig {}
@@ -67,24 +69,33 @@ func (c *logicAndFunctionClass) getFunction(ctx sessionctx.Context, args []Expre
67
69
if err != nil {
68
70
return nil , err
69
71
}
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
+
70
81
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 )
73
84
sig .tp .Flen = 1
74
85
return sig , nil
75
86
}
76
87
77
- type builtinLogicAndSig struct {
88
+ type builtinIntLogicAndSig struct {
78
89
baseBuiltinFunc
79
90
}
80
91
81
- func (b * builtinLogicAndSig ) Clone () builtinFunc {
82
- newSig := & builtinLogicAndSig {}
92
+ func (b * builtinIntLogicAndSig ) Clone () builtinFunc {
93
+ newSig := & builtinIntLogicAndSig {}
83
94
newSig .cloneFrom (& b .baseBuiltinFunc )
84
95
return newSig
85
96
}
86
97
87
- func (b * builtinLogicAndSig ) evalInt (row chunk.Row ) (int64 , bool , error ) {
98
+ func (b * builtinIntLogicAndSig ) evalInt (row chunk.Row ) (int64 , bool , error ) {
88
99
arg0 , isNull0 , err := b .args [0 ].EvalInt (b .ctx , row )
89
100
if err != nil || (! isNull0 && arg0 == 0 ) {
90
101
return 0 , err != nil , err
@@ -99,6 +110,31 @@ func (b *builtinLogicAndSig) evalInt(row chunk.Row) (int64, bool, error) {
99
110
return 1 , false , nil
100
111
}
101
112
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
+
102
138
type logicOrFunctionClass struct {
103
139
baseFunctionClass
104
140
}
@@ -108,24 +144,64 @@ func (c *logicOrFunctionClass) getFunction(ctx sessionctx.Context, args []Expres
108
144
if err != nil {
109
145
return nil , err
110
146
}
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
+
111
156
bf := newBaseBuiltinFuncWithTp (ctx , args , types .ETInt , types .ETInt , types .ETInt )
112
157
bf .tp .Flen = 1
113
- sig := & builtinLogicOrSig {bf }
114
- sig .setPbCode (tipb .ScalarFuncSig_LogicalOr )
158
+ sig := & builtinIntLogicOrSig {bf }
159
+ sig .setPbCode (tipb .ScalarFuncSig_IntLogicalOr )
115
160
return sig , nil
116
161
}
117
162
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 {
119
195
baseBuiltinFunc
120
196
}
121
197
122
- func (b * builtinLogicOrSig ) Clone () builtinFunc {
123
- newSig := & builtinLogicOrSig {}
198
+ func (b * builtinIntLogicOrSig ) Clone () builtinFunc {
199
+ newSig := & builtinIntLogicOrSig {}
124
200
newSig .cloneFrom (& b .baseBuiltinFunc )
125
201
return newSig
126
202
}
127
203
128
- func (b * builtinLogicOrSig ) evalInt (row chunk.Row ) (int64 , bool , error ) {
204
+ func (b * builtinIntLogicOrSig ) evalInt (row chunk.Row ) (int64 , bool , error ) {
129
205
arg0 , isNull0 , err := b .args [0 ].EvalInt (b .ctx , row )
130
206
if err != nil {
131
207
return 0 , true , err
0 commit comments