mirror of
https://gitee.com/milvus-io/milvus.git
synced 2025-12-08 01:58:34 +08:00
Don't panic when receive unsupported expr (#26414)
Signed-off-by: cai.zhang <cai.zhang@zilliz.com>
This commit is contained in:
parent
855a04539a
commit
90b12d04b4
@ -190,6 +190,10 @@ func (v *ParserVisitor) VisitAddSub(ctx *parser.AddSubContext) interface{} {
|
|||||||
return fmt.Errorf("invalid arithmetic expression, left: %s, op: %s, right: %s", ctx.Expr(0).GetText(), ctx.GetOp(), ctx.Expr(1).GetText())
|
return fmt.Errorf("invalid arithmetic expression, left: %s, op: %s, right: %s", ctx.Expr(0).GetText(), ctx.GetOp(), ctx.Expr(1).GetText())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if typeutil.IsArrayType(leftExpr.dataType) || typeutil.IsArrayType(rightExpr.dataType) {
|
||||||
|
return fmt.Errorf("invalid expression, array is not supported for AddSub")
|
||||||
|
}
|
||||||
|
|
||||||
if (!typeutil.IsArithmetic(leftExpr.dataType) && !typeutil.IsJSONType(leftExpr.dataType)) ||
|
if (!typeutil.IsArithmetic(leftExpr.dataType) && !typeutil.IsJSONType(leftExpr.dataType)) ||
|
||||||
(!typeutil.IsArithmetic(rightExpr.dataType) && !typeutil.IsJSONType(rightExpr.dataType)) {
|
(!typeutil.IsArithmetic(rightExpr.dataType) && !typeutil.IsJSONType(rightExpr.dataType)) {
|
||||||
return fmt.Errorf("'%s' can only be used between integer or floating or json field expressions", arithNameMap[ctx.GetOp().GetTokenType()])
|
return fmt.Errorf("'%s' can only be used between integer or floating or json field expressions", arithNameMap[ctx.GetOp().GetTokenType()])
|
||||||
@ -268,6 +272,10 @@ func (v *ParserVisitor) VisitMulDivMod(ctx *parser.MulDivModContext) interface{}
|
|||||||
return fmt.Errorf("invalid arithmetic expression, left: %s, op: %s, right: %s", ctx.Expr(0).GetText(), ctx.GetOp(), ctx.Expr(1).GetText())
|
return fmt.Errorf("invalid arithmetic expression, left: %s, op: %s, right: %s", ctx.Expr(0).GetText(), ctx.GetOp(), ctx.Expr(1).GetText())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if typeutil.IsArrayType(leftExpr.dataType) || typeutil.IsArrayType(rightExpr.dataType) {
|
||||||
|
return fmt.Errorf("invalid expression, array is not supported for MulDivMod")
|
||||||
|
}
|
||||||
|
|
||||||
if (!typeutil.IsArithmetic(leftExpr.dataType) && !typeutil.IsJSONType(leftExpr.dataType)) ||
|
if (!typeutil.IsArithmetic(leftExpr.dataType) && !typeutil.IsJSONType(leftExpr.dataType)) ||
|
||||||
(!typeutil.IsArithmetic(rightExpr.dataType) && !typeutil.IsJSONType(rightExpr.dataType)) {
|
(!typeutil.IsArithmetic(rightExpr.dataType) && !typeutil.IsJSONType(rightExpr.dataType)) {
|
||||||
return fmt.Errorf("'%s' can only be used between integer or floating expressions", arithNameMap[ctx.GetOp().GetTokenType()])
|
return fmt.Errorf("'%s' can only be used between integer or floating expressions", arithNameMap[ctx.GetOp().GetTokenType()])
|
||||||
@ -338,6 +346,10 @@ func (v *ParserVisitor) VisitEquality(ctx *parser.EqualityContext) interface{} {
|
|||||||
rightExpr = getExpr(right)
|
rightExpr = getExpr(right)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if typeutil.IsArrayType(leftExpr.dataType) || typeutil.IsArrayType(rightExpr.dataType) {
|
||||||
|
return fmt.Errorf("invalid expression, array is not supported for Equality")
|
||||||
|
}
|
||||||
|
|
||||||
expr, err := HandleCompare(ctx.GetOp().GetTokenType(), leftExpr, rightExpr)
|
expr, err := HandleCompare(ctx.GetOp().GetTokenType(), leftExpr, rightExpr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -391,6 +403,10 @@ func (v *ParserVisitor) VisitRelational(ctx *parser.RelationalContext) interface
|
|||||||
rightExpr = getExpr(right)
|
rightExpr = getExpr(right)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if typeutil.IsArrayType(leftExpr.dataType) || typeutil.IsArrayType(rightExpr.dataType) {
|
||||||
|
return fmt.Errorf("invalid expression, array is not supported for Relational")
|
||||||
|
}
|
||||||
|
|
||||||
expr, err := HandleCompare(ctx.GetOp().GetTokenType(), leftExpr, rightExpr)
|
expr, err := HandleCompare(ctx.GetOp().GetTokenType(), leftExpr, rightExpr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@ -1935,3 +1935,70 @@ func Test_InvalidJSONContainsAny(t *testing.T) {
|
|||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
assert.Nil(t, plan)
|
assert.Nil(t, plan)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Test_UnsupportedExpr(t *testing.T) {
|
||||||
|
schema := newTestSchema()
|
||||||
|
expr := ""
|
||||||
|
var err error
|
||||||
|
var plan *planpb.PlanNode
|
||||||
|
|
||||||
|
expr = `A == [1, 2, 3]`
|
||||||
|
plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{
|
||||||
|
Topk: 0,
|
||||||
|
MetricType: "",
|
||||||
|
SearchParams: "",
|
||||||
|
RoundDecimal: 0,
|
||||||
|
})
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Nil(t, plan)
|
||||||
|
|
||||||
|
expr = `Int64Field == [1, 2, 3]`
|
||||||
|
plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{
|
||||||
|
Topk: 0,
|
||||||
|
MetricType: "",
|
||||||
|
SearchParams: "",
|
||||||
|
RoundDecimal: 0,
|
||||||
|
})
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Nil(t, plan)
|
||||||
|
|
||||||
|
expr = `Int64Field > [1, 2, 3]`
|
||||||
|
plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{
|
||||||
|
Topk: 0,
|
||||||
|
MetricType: "",
|
||||||
|
SearchParams: "",
|
||||||
|
RoundDecimal: 0,
|
||||||
|
})
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Nil(t, plan)
|
||||||
|
|
||||||
|
expr = `Int64Field + [1, 2, 3] == 10`
|
||||||
|
plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{
|
||||||
|
Topk: 0,
|
||||||
|
MetricType: "",
|
||||||
|
SearchParams: "",
|
||||||
|
RoundDecimal: 0,
|
||||||
|
})
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Nil(t, plan)
|
||||||
|
|
||||||
|
expr = `Int64Field % [1, 2, 3] == 10`
|
||||||
|
plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{
|
||||||
|
Topk: 0,
|
||||||
|
MetricType: "",
|
||||||
|
SearchParams: "",
|
||||||
|
RoundDecimal: 0,
|
||||||
|
})
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Nil(t, plan)
|
||||||
|
|
||||||
|
expr = `[1, 2, 3] < Int64Field < [4, 5, 6]`
|
||||||
|
plan, err = CreateSearchPlan(schema, expr, "FloatVectorField", &planpb.QueryInfo{
|
||||||
|
Topk: 0,
|
||||||
|
MetricType: "",
|
||||||
|
SearchParams: "",
|
||||||
|
RoundDecimal: 0,
|
||||||
|
})
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Nil(t, plan)
|
||||||
|
}
|
||||||
|
|||||||
@ -108,6 +108,11 @@ func toValueExpr(n *planpb.GenericValue) *ExprWithType {
|
|||||||
expr: expr,
|
expr: expr,
|
||||||
dataType: schemapb.DataType_VarChar,
|
dataType: schemapb.DataType_VarChar,
|
||||||
}
|
}
|
||||||
|
case *planpb.GenericValue_ArrayVal:
|
||||||
|
return &ExprWithType{
|
||||||
|
expr: expr,
|
||||||
|
dataType: schemapb.DataType_Array,
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user