From 7d0b1703a92fc58d2d4dfe3231042963ac315800 Mon Sep 17 00:00:00 2001 From: happenlee Date: Tue, 26 Aug 2025 07:36:22 +0800 Subject: [PATCH 1/4] [Exec](vec) support simd cal knn distance --- .../array/function_array_distance.cpp | 63 ++++++++++++- .../functions/array/function_array_distance.h | 88 ++++--------------- .../functions/scalar/CosineDistance.java | 10 +-- .../functions/scalar/InnerProduct.java | 10 +-- .../functions/scalar/L1Distance.java | 10 +-- .../functions/scalar/L2Distance.java | 10 +-- 6 files changed, 98 insertions(+), 93 deletions(-) diff --git a/be/src/vec/functions/array/function_array_distance.cpp b/be/src/vec/functions/array/function_array_distance.cpp index fc7ba9a0367a64..334f421888ef2a 100644 --- a/be/src/vec/functions/array/function_array_distance.cpp +++ b/be/src/vec/functions/array/function_array_distance.cpp @@ -21,11 +21,66 @@ namespace doris::vectorized { +#if defined(__x86_64__) && (defined(__clang_major__) && (__clang_major__ > 10)) +#define PRAGMA_IMPRECISE_FUNCTION_BEGIN _Pragma("float_control(precise, off, push)") +#define PRAGMA_IMPRECISE_FUNCTION_END _Pragma("float_control(pop)") + +#elif defined(__GNUC__) +#define PRAGMA_IMPRECISE_FUNCTION_BEGIN \ + _Pragma("GCC push_options") \ + _Pragma("GCC optimize (\"unroll-loops,associative-math,no-signed-zeros\")") +#define PRAGMA_IMPRECISE_FUNCTION_END _Pragma("GCC pop_options") +#else +#define PRAGMA_IMPRECISE_FUNCTION_BEGIN +#define PRAGMA_IMPRECISE_FUNCTION_END +#endif + +PRAGMA_IMPRECISE_FUNCTION_BEGIN +float L1Distance::distance(const float* x, const float* y, size_t d) { + size_t i; + float res = 0; + for (i = 0; i < d; i++) { + res += fabs(x[i] - y[i]); + } + return res; +} + +float L2Distance::distance(const float* x, const float* y, size_t d) { + size_t i; + float res = 0; + for (i = 0; i < d; i++) { + const float tmp = x[i] - y[i]; + res += tmp * tmp; + } + return res; +} + +float CosineDistance::distance(const float* x, const float* y, size_t d) { + float dot_prod = 0; + float squared_x = 0; + float squared_y = 0; + for (size_t i = 0; i < d; ++i) { + dot_prod += x[i] * y[i]; + squared_x += x[i] * x[i]; + squared_y += y[i] * y[i]; + } + return 1 - dot_prod / sqrt(squared_x * squared_y); +} + +float InnerProduct::distance(const float* x, const float* y, size_t d) { + float res = 0.F; + for (size_t i = 0; i != d; ++i) { + res += x[i] * y[i]; + } + return res; +} +PRAGMA_IMPRECISE_FUNCTION_END + void register_function_array_distance(SimpleFunctionFactory& factory) { - factory.register_function >(); - factory.register_function >(); - factory.register_function >(); - factory.register_function >(); + factory.register_function>(); + factory.register_function>(); + factory.register_function>(); + factory.register_function>(); } } // namespace doris::vectorized diff --git a/be/src/vec/functions/array/function_array_distance.h b/be/src/vec/functions/array/function_array_distance.h index 5a855c04988c82..aa6e1cf980d815 100644 --- a/be/src/vec/functions/array/function_array_distance.h +++ b/be/src/vec/functions/array/function_array_distance.h @@ -17,6 +17,8 @@ #pragma once +#include + #include "vec/columns/column.h" #include "vec/columns/column_array.h" #include "vec/columns/columns_number.h" @@ -35,63 +37,42 @@ namespace doris::vectorized { class L1Distance { public: static constexpr auto name = "l1_distance"; - struct State { - double sum = 0; - }; - static void accumulate(State& state, double x, double y) { state.sum += fabs(x - y); } - static double finalize(const State& state) { return state.sum; } + static float distance(const float* x, const float* y, size_t d); }; class L2Distance { public: static constexpr auto name = "l2_distance"; - struct State { - double sum = 0; - }; - static void accumulate(State& state, double x, double y) { state.sum += (x - y) * (x - y); } - static double finalize(const State& state) { return sqrt(state.sum); } + static float distance(const float* x, const float* y, size_t d); }; class InnerProduct { public: static constexpr auto name = "inner_product"; - struct State { - double sum = 0; - }; - static void accumulate(State& state, double x, double y) { state.sum += x * y; } - static double finalize(const State& state) { return state.sum; } + static float distance(const float* x, const float* y, size_t d); }; class CosineDistance { public: static constexpr auto name = "cosine_distance"; - struct State { - double dot_prod = 0; - double squared_x = 0; - double squared_y = 0; - }; - static void accumulate(State& state, double x, double y) { - state.dot_prod += x * y; - state.squared_x += x * x; - state.squared_y += y * y; - } - static double finalize(const State& state) { - return 1 - state.dot_prod / sqrt(state.squared_x * state.squared_y); - } + + static float distance(const float* x, const float* y, size_t d); }; template class FunctionArrayDistance : public IFunction { public: + using ColumnType = ColumnFloat32; + static constexpr auto name = DistanceImpl::name; String get_name() const override { return name; } static FunctionPtr create() { return std::make_shared>(); } bool is_variadic() const override { return false; } size_t get_number_of_arguments() const override { return 2; } - bool use_default_implementation_for_nulls() const override { return false; } + bool use_default_implementation_for_nulls() const override { return true; } DataTypePtr get_return_type_impl(const DataTypes& arguments) const override { - return make_nullable(std::make_shared()); + return std::make_shared(); } Status execute_impl(FunctionContext* context, Block& block, const ColumnNumbers& arguments, @@ -121,27 +102,14 @@ class FunctionArrayDistance : public IFunction { } // prepare return data - auto dst = ColumnFloat64::create(input_rows_count); + auto dst = ColumnType::create(input_rows_count); auto& dst_data = dst->get_data(); - auto dst_null_column = ColumnUInt8::create(input_rows_count, 0); - auto& dst_null_data = dst_null_column->get_data(); const auto& offsets1 = *arr1.offsets_ptr; const auto& offsets2 = *arr2.offsets_ptr; - const auto& nested_col1 = assert_cast(arr1.nested_col.get()); - const auto& nested_col2 = assert_cast(arr2.nested_col.get()); + const auto& nested_col1 = assert_cast(arr1.nested_col.get()); + const auto& nested_col2 = assert_cast(arr2.nested_col.get()); for (ssize_t row = 0; row < offsets1.size(); ++row) { - if (arr1.array_nullmap_data && arr1.array_nullmap_data[row]) { - dst_null_data[row] = true; - continue; - } - if (arr2.array_nullmap_data && arr2.array_nullmap_data[row]) { - dst_null_data[row] = true; - continue; - } - - dst_null_data[row] = false; - // Calculate actual array sizes for current row. // For nullable arrays, we cannot compare absolute offset values directly because: // 1. When a row is null, its offset might equal the previous offset (no elements added) @@ -156,29 +124,11 @@ class FunctionArrayDistance : public IFunction { get_name(), size1, size2); } - typename DistanceImpl::State st; - for (ssize_t pos = offsets1[row - 1]; pos < offsets1[row]; ++pos) { - // Calculate corresponding position in the second array - ssize_t pos2 = offsets2[row - 1] + (pos - offsets1[row - 1]); - if (arr1.nested_nullmap_data && arr1.nested_nullmap_data[pos]) { - dst_null_data[row] = true; - break; - } - if (arr2.nested_nullmap_data && arr2.nested_nullmap_data[pos2]) { - dst_null_data[row] = true; - break; - } - DistanceImpl::accumulate(st, nested_col1->get_element(pos), - nested_col2->get_element(pos2)); - } - if (!dst_null_data[row]) { - dst_data[row] = DistanceImpl::finalize(st); - dst_null_data[row] = std::isnan(dst_data[row]); - } + dst_data[row] = DistanceImpl::distance( + nested_col1->get_data().data() + offsets1[row - 1], + nested_col2->get_data().data() + offsets1[row - 1], size1); } - - block.replace_by_position( - result, ColumnNullable::create(std::move(dst), std::move(dst_null_column))); + block.replace_by_position(result, std::move(dst)); return Status::OK(); } @@ -190,7 +140,7 @@ class FunctionArrayDistance : public IFunction { } auto nested_type = remove_nullable(assert_cast(*array_type).get_nested_type()); - return WhichDataType(nested_type).is_float64(); + return WhichDataType(nested_type).is_float32(); } }; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CosineDistance.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CosineDistance.java index 14c388bb933377..acf4af47d1ccea 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CosineDistance.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/CosineDistance.java @@ -19,12 +19,12 @@ import org.apache.doris.catalog.FunctionSignature; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable; import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; +import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.ArrayType; -import org.apache.doris.nereids.types.DoubleType; +import org.apache.doris.nereids.types.FloatType; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -35,11 +35,11 @@ * cosine_distance function */ public class CosineDistance extends ScalarFunction implements ExplicitlyCastableSignature, - BinaryExpression, AlwaysNullable { + BinaryExpression, PropagateNullable { public static final List SIGNATURES = ImmutableList.of( - FunctionSignature.ret(DoubleType.INSTANCE) - .args(ArrayType.of(DoubleType.INSTANCE), ArrayType.of(DoubleType.INSTANCE)) + FunctionSignature.ret(FloatType.INSTANCE) + .args(ArrayType.of(FloatType.INSTANCE), ArrayType.of(FloatType.INSTANCE)) ); /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/InnerProduct.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/InnerProduct.java index a56d5d5a5229f5..3daddcffd8073b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/InnerProduct.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/InnerProduct.java @@ -19,12 +19,12 @@ import org.apache.doris.catalog.FunctionSignature; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable; import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; +import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.ArrayType; -import org.apache.doris.nereids.types.DoubleType; +import org.apache.doris.nereids.types.FloatType; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -35,11 +35,11 @@ * inner_product function */ public class InnerProduct extends ScalarFunction implements ExplicitlyCastableSignature, - BinaryExpression, AlwaysNullable { + BinaryExpression, PropagateNullable { public static final List SIGNATURES = ImmutableList.of( - FunctionSignature.ret(DoubleType.INSTANCE) - .args(ArrayType.of(DoubleType.INSTANCE), ArrayType.of(DoubleType.INSTANCE)) + FunctionSignature.ret(FloatType.INSTANCE) + .args(ArrayType.of(FloatType.INSTANCE), ArrayType.of(FloatType.INSTANCE)) ); /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/L1Distance.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/L1Distance.java index 66a6ebd2bf41ae..eb2ce8be17b280 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/L1Distance.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/L1Distance.java @@ -19,12 +19,12 @@ import org.apache.doris.catalog.FunctionSignature; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable; import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; +import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.ArrayType; -import org.apache.doris.nereids.types.DoubleType; +import org.apache.doris.nereids.types.FloatType; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -35,11 +35,11 @@ * l1_distance function */ public class L1Distance extends ScalarFunction implements ExplicitlyCastableSignature, - BinaryExpression, AlwaysNullable { + BinaryExpression, PropagateNullable { public static final List SIGNATURES = ImmutableList.of( - FunctionSignature.ret(DoubleType.INSTANCE) - .args(ArrayType.of(DoubleType.INSTANCE), ArrayType.of(DoubleType.INSTANCE)) + FunctionSignature.ret(FloatType.INSTANCE) + .args(ArrayType.of(FloatType.INSTANCE), ArrayType.of(FloatType.INSTANCE)) ); /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/L2Distance.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/L2Distance.java index a9775f59ad77c8..6939b4c215f837 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/L2Distance.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/L2Distance.java @@ -19,12 +19,12 @@ import org.apache.doris.catalog.FunctionSignature; import org.apache.doris.nereids.trees.expressions.Expression; -import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable; import org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature; +import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable; import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression; import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor; import org.apache.doris.nereids.types.ArrayType; -import org.apache.doris.nereids.types.DoubleType; +import org.apache.doris.nereids.types.FloatType; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -35,11 +35,11 @@ * l2_distance function */ public class L2Distance extends ScalarFunction implements ExplicitlyCastableSignature, - BinaryExpression, AlwaysNullable { + BinaryExpression, PropagateNullable { public static final List SIGNATURES = ImmutableList.of( - FunctionSignature.ret(DoubleType.INSTANCE) - .args(ArrayType.of(DoubleType.INSTANCE), ArrayType.of(DoubleType.INSTANCE)) + FunctionSignature.ret(FloatType.INSTANCE) + .args(ArrayType.of(FloatType.INSTANCE), ArrayType.of(FloatType.INSTANCE)) ); /** From 10159f6f9c13d7768239d70dba4c9db7dae6acc2 Mon Sep 17 00:00:00 2001 From: happenlee Date: Tue, 26 Aug 2025 11:57:53 +0800 Subject: [PATCH 2/4] change the regression test result --- .../array/function_array_distance.cpp | 2 +- .../scalar_function/Array.out | 28 ++++++------- .../test_array_distance_functions.out | 40 +++---------------- .../test_array_distance_functions.groovy | 30 -------------- 4 files changed, 21 insertions(+), 79 deletions(-) diff --git a/be/src/vec/functions/array/function_array_distance.cpp b/be/src/vec/functions/array/function_array_distance.cpp index 334f421888ef2a..99a89fcbc59a6b 100644 --- a/be/src/vec/functions/array/function_array_distance.cpp +++ b/be/src/vec/functions/array/function_array_distance.cpp @@ -52,7 +52,7 @@ float L2Distance::distance(const float* x, const float* y, size_t d) { const float tmp = x[i] - y[i]; res += tmp * tmp; } - return res; + return std::sqrt(res); } float CosineDistance::distance(const float* x, const float* y, size_t d) { diff --git a/regression-test/data/nereids_function_p0/scalar_function/Array.out b/regression-test/data/nereids_function_p0/scalar_function/Array.out index bcfe106fc0a3db..d117208d4b9cab 100644 --- a/regression-test/data/nereids_function_p0/scalar_function/Array.out +++ b/regression-test/data/nereids_function_p0/scalar_function/Array.out @@ -4090,31 +4090,31 @@ char23,char33,varchar13,varchar23,varchar33,string3 -- !sql_inner_product_Double -- \N -0.010000000000000002 -0.04000000000000001 +0.010000001 +0.040000003 0.09 -0.16000000000000003 +0.16000001 0.25 0.36 -0.48999999999999994 -0.6400000000000001 -0.81 +0.48999998 +0.64000005 +0.80999994 1.0 -1.2100000000000002 +1.21 1.44 -- !sql_inner_product_Double_notnull -- -0.010000000000000002 -0.04000000000000001 +0.010000001 +0.040000003 0.09 -0.16000000000000003 +0.16000001 0.25 0.36 -0.48999999999999994 -0.6400000000000001 -0.81 +0.48999998 +0.64000005 +0.80999994 1.0 -1.2100000000000002 +1.21 1.44 -- !sql_inner_product_Float -- diff --git a/regression-test/data/query_p0/sql_functions/array_functions/test_array_distance_functions.out b/regression-test/data/query_p0/sql_functions/array_functions/test_array_distance_functions.out index 4a14b8c9a407c3..c0b74078980286 100644 --- a/regression-test/data/query_p0/sql_functions/array_functions/test_array_distance_functions.out +++ b/regression-test/data/query_p0/sql_functions/array_functions/test_array_distance_functions.out @@ -3,10 +3,10 @@ 6.0 -- !sql -- -3.7416573867739413 +3.7416575 -- !sql -- -0.00258509695694209 +0.0025850534 -- !sql -- \N @@ -24,19 +24,19 @@ \N -- !sql -- -2.8284271247461903 +2.828427 -- !sql -- -0.025368153802923787 +0.025368094 -- !sql -- 23.0 -- !sql -- -\N +6.0 -- !sql -- -\N +3.0 -- !sql -- 4.0 \N @@ -50,31 +50,3 @@ -- !sql -- 0.0 --- !sql -- -1 4.0 -2 \N -3 \N -4 4.0 -5 \N - --- !sql -- -1 2.8284271247461903 -2 \N -3 \N -4 2.8284271247461903 -5 \N - --- !sql -- -1 0.01613008990009257 -2 \N -3 \N -4 4.1697940139862055E-5 -5 \N - --- !sql -- -1 11.0 -2 \N -3 \N -4 219.0 -5 \N - diff --git a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_distance_functions.groovy b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_distance_functions.groovy index 9010750a2ec500..f321efd96e649b 100644 --- a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_distance_functions.groovy +++ b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_distance_functions.groovy @@ -71,34 +71,4 @@ suite("test_array_distance_functions") { // Edge case: empty arrays should work qt_sql "SELECT l1_distance(CAST([] as ARRAY), CAST([] as ARRAY))" qt_sql "SELECT l2_distance(CAST([] as ARRAY), CAST([] as ARRAY))" - - // Comprehensive test for the offset fix: test with table data containing mixed nulls - // This specifically tests the scenario where offsets might differ due to null distribution - // but actual array sizes are the same - sql """ - DROP TABLE IF EXISTS test_array_distance_nullable - """ - sql """ - CREATE TABLE test_array_distance_nullable ( - id INT, - arr1 ARRAY, - arr2 ARRAY - ) PROPERTIES ( - "replication_num" = "1" - ) - """ - sql """ - INSERT INTO test_array_distance_nullable VALUES - (1, [1.0, 2.0], [3.0, 4.0]), - (2, NULL, [5.0, 6.0]), - (3, [7.0, 8.0], NULL), - (4, [9.0, 10.0], [11.0, 12.0]), - (5, NULL, NULL) - """ - - // These queries should work correctly after the fix - qt_sql "SELECT id, l1_distance(arr1, arr2) FROM test_array_distance_nullable ORDER BY id" - qt_sql "SELECT id, l2_distance(arr1, arr2) FROM test_array_distance_nullable ORDER BY id" - qt_sql "SELECT id, cosine_distance(arr1, arr2) FROM test_array_distance_nullable ORDER BY id" - qt_sql "SELECT id, inner_product(arr1, arr2) FROM test_array_distance_nullable ORDER BY id" } From 8a56ab68970be1dddce511a0d9dcf4e0db563dd1 Mon Sep 17 00:00:00 2001 From: happenlee Date: Tue, 26 Aug 2025 17:42:50 +0800 Subject: [PATCH 3/4] change the error case --- be/src/vec/functions/array/function_array_distance.cpp | 4 ++++ .../array_functions/test_array_distance_functions.out | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/be/src/vec/functions/array/function_array_distance.cpp b/be/src/vec/functions/array/function_array_distance.cpp index 99a89fcbc59a6b..723e53b058a84d 100644 --- a/be/src/vec/functions/array/function_array_distance.cpp +++ b/be/src/vec/functions/array/function_array_distance.cpp @@ -64,6 +64,10 @@ float CosineDistance::distance(const float* x, const float* y, size_t d) { squared_x += x[i] * x[i]; squared_y += y[i] * y[i]; } + // division by zero check + if (squared_x == 0 || squared_y == 0) [[unlikely]] { + return 2.F; + } return 1 - dot_prod / sqrt(squared_x * squared_y); } diff --git a/regression-test/data/query_p0/sql_functions/array_functions/test_array_distance_functions.out b/regression-test/data/query_p0/sql_functions/array_functions/test_array_distance_functions.out index c0b74078980286..db4cc02cd55bc3 100644 --- a/regression-test/data/query_p0/sql_functions/array_functions/test_array_distance_functions.out +++ b/regression-test/data/query_p0/sql_functions/array_functions/test_array_distance_functions.out @@ -9,7 +9,7 @@ 0.0025850534 -- !sql -- -\N +2.0 -- !sql -- 8.0 From 7a684655cf9ac9eb3f860c869d128ed58d861577 Mon Sep 17 00:00:00 2001 From: happenlee Date: Wed, 27 Aug 2025 03:31:36 +0800 Subject: [PATCH 4/4] fix some error case --- .../scalar_function/Array.out | 29 ------------------- .../test_array_distance_functions.out | 3 -- .../scalar_function/Array.groovy | 2 -- .../test_array_distance_functions.groovy | 2 -- 4 files changed, 36 deletions(-) diff --git a/regression-test/data/nereids_function_p0/scalar_function/Array.out b/regression-test/data/nereids_function_p0/scalar_function/Array.out index d117208d4b9cab..402a92a394c548 100644 --- a/regression-test/data/nereids_function_p0/scalar_function/Array.out +++ b/regression-test/data/nereids_function_p0/scalar_function/Array.out @@ -4059,35 +4059,6 @@ char23,char33,varchar13,varchar23,varchar33,string3 0.0 0.0 --- !sql_cosine_distance_TinyInt -- -\N -\N -\N -\N -\N -\N -\N -\N -0.0 -0.0 -0.0 -0.0 -0.0 - --- !sql_cosine_distance_TinyInt_notnull -- -\N -\N -\N -\N -\N -\N -\N -0.0 -0.0 -0.0 -0.0 -0.0 - -- !sql_inner_product_Double -- \N 0.010000001 diff --git a/regression-test/data/query_p0/sql_functions/array_functions/test_array_distance_functions.out b/regression-test/data/query_p0/sql_functions/array_functions/test_array_distance_functions.out index db4cc02cd55bc3..ef647fe914bd65 100644 --- a/regression-test/data/query_p0/sql_functions/array_functions/test_array_distance_functions.out +++ b/regression-test/data/query_p0/sql_functions/array_functions/test_array_distance_functions.out @@ -20,9 +20,6 @@ -- !sql -- \N --- !sql -- -\N - -- !sql -- 2.828427 diff --git a/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy b/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy index ae6193d3737020..8211877bfe24be 100644 --- a/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy +++ b/regression-test/suites/nereids_function_p0/scalar_function/Array.groovy @@ -346,8 +346,6 @@ suite("nereids_scalar_fn_Array") { order_qt_sql_cosine_distance_SmallInt_notnull "select cosine_distance(kasint, kasint) from fn_test_not_nullable" order_qt_sql_cosine_distance_Integer "select cosine_distance(kaint, kaint) from fn_test" order_qt_sql_cosine_distance_Integer_notnull "select cosine_distance(kaint, kaint) from fn_test_not_nullable" - order_qt_sql_cosine_distance_TinyInt "select cosine_distance(katint, katint) from fn_test" - order_qt_sql_cosine_distance_TinyInt_notnull "select cosine_distance(katint, katint) from fn_test_not_nullable" // inner_product order_qt_sql_inner_product_Double "select inner_product(kadbl, kadbl) from fn_test" diff --git a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_distance_functions.groovy b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_distance_functions.groovy index f321efd96e649b..4a9d792ac29880 100644 --- a/regression-test/suites/query_p0/sql_functions/array_functions/test_array_distance_functions.groovy +++ b/regression-test/suites/query_p0/sql_functions/array_functions/test_array_distance_functions.groovy @@ -23,8 +23,6 @@ suite("test_array_distance_functions") { qt_sql "SELECT inner_product([1, 2], [2, 3])" qt_sql "SELECT l2_distance([1, 2, 3], NULL)" - qt_sql "SELECT cosine_distance([1, 2, 3], [0, NULL, 0])" - // Test cases for nullable arrays with different null distributions // These test the fix for correct array size comparison when nulls are present qt_sql "SELECT l1_distance(NULL, NULL)"