Let plan_parser err out when modulo zero (#8535)

Signed-off-by: yudong.cai <yudong.cai@zilliz.com>
pull/8545/head
Cai Yudong 2021-09-26 09:42:02 +08:00 committed by GitHub
parent 9497ba5523
commit 68f73302a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 12 deletions

View File

@ -47,7 +47,7 @@ func (optimizer *optimizer) Exit(node *ant_ast.Node) {
} else if i, ok := node.Node.(*ant_ast.FloatNode); ok {
patch(&ant_ast.FloatNode{Value: -i.Value})
} else {
optimizer.err = fmt.Errorf("can only make a number negative")
optimizer.err = fmt.Errorf("invalid data type")
return
}
case "+":
@ -56,7 +56,7 @@ func (optimizer *optimizer) Exit(node *ant_ast.Node) {
} else if i, ok := node.Node.(*ant_ast.FloatNode); ok {
patch(&ant_ast.FloatNode{Value: i.Value})
} else {
optimizer.err = fmt.Errorf("can only make a number positive")
optimizer.err = fmt.Errorf("invalid data type")
return
}
}
@ -78,7 +78,7 @@ func (optimizer *optimizer) Exit(node *ant_ast.Node) {
} else if leftInteger && rightInteger {
patch(&ant_ast.IntegerNode{Value: integerNodeLeft.Value + integerNodeRight.Value})
} else {
optimizer.err = fmt.Errorf("can only add two number")
optimizer.err = fmt.Errorf("invalid data type")
return
}
case "-":
@ -91,7 +91,7 @@ func (optimizer *optimizer) Exit(node *ant_ast.Node) {
} else if leftInteger && rightInteger {
patch(&ant_ast.IntegerNode{Value: integerNodeLeft.Value - integerNodeRight.Value})
} else {
optimizer.err = fmt.Errorf("can only subtract two number")
optimizer.err = fmt.Errorf("invalid data type")
return
}
case "*":
@ -104,43 +104,47 @@ func (optimizer *optimizer) Exit(node *ant_ast.Node) {
} else if leftInteger && rightInteger {
patch(&ant_ast.IntegerNode{Value: integerNodeLeft.Value * integerNodeRight.Value})
} else {
optimizer.err = fmt.Errorf("can only multiply two number")
optimizer.err = fmt.Errorf("invalid data type")
return
}
case "/":
if leftFloat && rightFloat {
if floatNodeRight.Value == 0 {
optimizer.err = fmt.Errorf("number divide by zero")
optimizer.err = fmt.Errorf("divide by zero")
return
}
patch(&ant_ast.FloatNode{Value: floatNodeLeft.Value / floatNodeRight.Value})
} else if leftFloat && rightInteger {
if integerNodeRight.Value == 0 {
optimizer.err = fmt.Errorf("number divide by zero")
optimizer.err = fmt.Errorf("divide by zero")
return
}
patch(&ant_ast.FloatNode{Value: floatNodeLeft.Value / float64(integerNodeRight.Value)})
} else if leftInteger && rightFloat {
if floatNodeRight.Value == 0 {
optimizer.err = fmt.Errorf("number divide by zero")
optimizer.err = fmt.Errorf("divide by zero")
return
}
patch(&ant_ast.FloatNode{Value: float64(integerNodeLeft.Value) / floatNodeRight.Value})
} else if leftInteger && rightInteger {
if integerNodeRight.Value == 0 {
optimizer.err = fmt.Errorf("number divide by zero")
optimizer.err = fmt.Errorf("divide by zero")
return
}
patch(&ant_ast.IntegerNode{Value: integerNodeLeft.Value / integerNodeRight.Value})
} else {
optimizer.err = fmt.Errorf("can only divide two number")
optimizer.err = fmt.Errorf("invalid data type")
return
}
case "%":
if leftInteger && rightInteger {
if integerNodeRight.Value == 0 {
optimizer.err = fmt.Errorf("modulo by zero")
return
}
patch(&ant_ast.IntegerNode{Value: integerNodeLeft.Value % integerNodeRight.Value})
} else {
optimizer.err = fmt.Errorf("can only modulus two integer")
optimizer.err = fmt.Errorf("invalid data type")
return
}
case "**":
@ -153,7 +157,7 @@ func (optimizer *optimizer) Exit(node *ant_ast.Node) {
} else if leftInteger && rightInteger {
patch(&ant_ast.IntegerNode{Value: int(math.Pow(float64(integerNodeLeft.Value), float64(integerNodeRight.Value)))})
} else {
optimizer.err = fmt.Errorf("can only pow two number")
optimizer.err = fmt.Errorf("invalid data type")
return
}
}

View File

@ -140,6 +140,8 @@ func TestParseExpr_Naive(t *testing.T) {
"FloatField > aa / 2.0",
// "%"
"FloatField > 1 % aa",
"FloatField > 1 % 0",
"FloatField > 1 % 0.0",
// "**"
"FloatField > 1 ** aa",
"FloatField > aa ** 2.0",