Fix logical expression (#26513) (#26515)

Signed-off-by: longjiquan <jiquan.long@zilliz.com>
pull/26544/head
Jiquan Long 2023-08-22 15:46:23 +08:00 committed by GitHub
parent 9994d83c97
commit 408fad8f83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 6 additions and 3 deletions

View File

@ -758,7 +758,7 @@ func (v *ParserVisitor) VisitUnary(ctx *parser.UnaryContext) interface{} {
case parser.PlanParserADD:
return childExpr
case parser.PlanParserNOT:
if !typeutil.IsBoolType(childExpr.dataType) {
if !canBeExecuted(childExpr) {
return fmt.Errorf("%s op can only be applied on boolean expression", unaryLogicalNameMap[parser.PlanParserNOT])
}
return &ExprWithType{
@ -806,7 +806,7 @@ func (v *ParserVisitor) VisitLogicalOr(ctx *parser.LogicalOrContext) interface{}
leftExpr = getExpr(left)
rightExpr = getExpr(right)
if !typeutil.IsBoolType(leftExpr.dataType) || !typeutil.IsBoolType(rightExpr.dataType) {
if !canBeExecuted(leftExpr) || !canBeExecuted(rightExpr) {
return fmt.Errorf("'or' can only be used between boolean expressions")
}
expr := &planpb.Expr{
@ -854,7 +854,7 @@ func (v *ParserVisitor) VisitLogicalAnd(ctx *parser.LogicalAndContext) interface
leftExpr = getExpr(left)
rightExpr = getExpr(right)
if !typeutil.IsBoolType(leftExpr.dataType) || !typeutil.IsBoolType(rightExpr.dataType) {
if !canBeExecuted(leftExpr) || !canBeExecuted(rightExpr) {
return fmt.Errorf("'and' can only be used between boolean expressions")
}
expr := &planpb.Expr{

View File

@ -478,6 +478,9 @@ func TestExpr_Invalid(t *testing.T) {
`BoolField`,
`true`,
`false`,
`Int64Field > 100 and BoolField`,
`Int64Field < 100 or false`, // maybe this can be optimized.
`!BoolField`,
}
for _, exprStr := range exprStrs {
_, err := ParseExpr(helper, exprStr)