From d9aa8ff54566798dcd1915950b51fef72d10b6d6 Mon Sep 17 00:00:00 2001 From: Jiquan Long Date: Tue, 22 Aug 2023 15:44:22 +0800 Subject: [PATCH] Fix logical expression (#26513) Signed-off-by: longjiquan --- internal/parser/planparserv2/parser_visitor.go | 6 +++--- internal/parser/planparserv2/plan_parser_v2_test.go | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/internal/parser/planparserv2/parser_visitor.go b/internal/parser/planparserv2/parser_visitor.go index 40480b2422..a1e1422b0b 100644 --- a/internal/parser/planparserv2/parser_visitor.go +++ b/internal/parser/planparserv2/parser_visitor.go @@ -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{ diff --git a/internal/parser/planparserv2/plan_parser_v2_test.go b/internal/parser/planparserv2/plan_parser_v2_test.go index afa6da4d57..f2d0ab83b3 100644 --- a/internal/parser/planparserv2/plan_parser_v2_test.go +++ b/internal/parser/planparserv2/plan_parser_v2_test.go @@ -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)