Fix logical expression (#26513)

Signed-off-by: longjiquan <jiquan.long@zilliz.com>
This commit is contained in:
Jiquan Long 2023-08-22 15:44:22 +08:00 committed by GitHub
parent bed034a44b
commit d9aa8ff545
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 6 additions and 3 deletions

View File

@ -780,7 +780,7 @@ func (v *ParserVisitor) VisitUnary(ctx *parser.UnaryContext) interface{} {
case parser.PlanParserADD: case parser.PlanParserADD:
return childExpr return childExpr
case parser.PlanParserNOT: 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 fmt.Errorf("%s op can only be applied on boolean expression", unaryLogicalNameMap[parser.PlanParserNOT])
} }
return &ExprWithType{ return &ExprWithType{
@ -828,7 +828,7 @@ func (v *ParserVisitor) VisitLogicalOr(ctx *parser.LogicalOrContext) interface{}
leftExpr = getExpr(left) leftExpr = getExpr(left)
rightExpr = getExpr(right) 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") return fmt.Errorf("'or' can only be used between boolean expressions")
} }
expr := &planpb.Expr{ expr := &planpb.Expr{
@ -876,7 +876,7 @@ func (v *ParserVisitor) VisitLogicalAnd(ctx *parser.LogicalAndContext) interface
leftExpr = getExpr(left) leftExpr = getExpr(left)
rightExpr = getExpr(right) 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") return fmt.Errorf("'and' can only be used between boolean expressions")
} }
expr := &planpb.Expr{ expr := &planpb.Expr{

View File

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