diff --git a/internal/core/src/query/PlanProto.cpp b/internal/core/src/query/PlanProto.cpp index bca61c934bf0fb8fbdbc6fdc48854cfa539716f2..b8bd6981e939236222a84ad89a91029eb7c97930 100644 --- a/internal/core/src/query/PlanProto.cpp +++ b/internal/core/src/query/PlanProto.cpp @@ -342,22 +342,16 @@ ProtoParser::ParseBinaryRangeExpr(const proto::plan::BinaryRangeExpr& expr_pb) { return ExtractBinaryRangeExprImpl( field_id, data_type, expr_pb); } - case DataType::INT8: { - return ExtractBinaryRangeExprImpl( - field_id, data_type, expr_pb); - } - case DataType::INT16: { - return ExtractBinaryRangeExprImpl( - field_id, data_type, expr_pb); - } - case DataType::INT32: { - return ExtractBinaryRangeExprImpl( - field_id, data_type, expr_pb); - } + + // see also: https://github.com/milvus-io/milvus/issues/23646. + case DataType::INT8: + case DataType::INT16: + case DataType::INT32: case DataType::INT64: { return ExtractBinaryRangeExprImpl( field_id, data_type, expr_pb); } + case DataType::FLOAT: { return ExtractBinaryRangeExprImpl( field_id, data_type, expr_pb); diff --git a/internal/core/src/query/visitors/ExecExprVisitor.cpp b/internal/core/src/query/visitors/ExecExprVisitor.cpp index 1a59306524560e45f721f16e1bd981089291166c..62362c3c9b7473d70c57d3d46f7d7e37c20b2e0a 100644 --- a/internal/core/src/query/visitors/ExecExprVisitor.cpp +++ b/internal/core/src/query/visitors/ExecExprVisitor.cpp @@ -939,12 +939,33 @@ ExecExprVisitor::ExecBinaryRangeVisitorDispatcher(BinaryRangeExpr& expr_raw) bool lower_inclusive = expr.lower_inclusive_; bool upper_inclusive = expr.upper_inclusive_; - IndexInnerType val1 = expr.lower_value_; - IndexInnerType val2 = expr.upper_value_; + + // see also: https://github.com/milvus-io/milvus/issues/23646. + typedef std::conditional_t, + int64_t, + IndexInnerType> + HighPrecisionType; + + auto val1 = static_cast(expr.lower_value_); + auto val2 = static_cast(expr.upper_value_); auto index_func = [&](Index* index) { + if constexpr (std::is_integral_v) { + if (gt_ub(val1)) { + return TargetBitmap(index->Size(), false); + } else if (lt_lb(val1)) { + val1 = std::numeric_limits::min(); + } + + if (gt_ub(val2)) { + val2 = std::numeric_limits::max(); + } else if (lt_lb(val2)) { + return TargetBitmap(index->Size(), false); + } + } return index->Range(val1, lower_inclusive, val2, upper_inclusive); }; + if (lower_inclusive && upper_inclusive) { auto elem_func = [val1, val2](MayConstRef x) { return (val1 <= x && x <= val2); diff --git a/internal/core/unittest/test_query.cpp b/internal/core/unittest/test_query.cpp index 8830f082766e8e56442b3e7c2e6250224ff6c454..708159d683885b0852e3205f60c43ffb069b6dac 100644 --- a/internal/core/unittest/test_query.cpp +++ b/internal/core/unittest/test_query.cpp @@ -701,7 +701,7 @@ TEST(Query, FillSegment) { auto dataset = DataGen(schema, N); const auto std_vec = dataset.get_col(FieldId(101)); // ids field const auto std_vfloat_vec = - dataset.get_col(FieldId(100)); // vector field + dataset.get_col(FieldId(100)); // vector field const auto std_i32_vec = dataset.get_col(FieldId(102)); // scalar field