Fix logical expression (#26513)

Signed-off-by: longjiquan <jiquan.long@zilliz.com>
pull/26505/head
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:
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{
@ -828,7 +828,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{
@ -876,7 +876,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)