From 94f1b6171c03bfb94cc018d0a4a8cb3cd19b5c26 Mon Sep 17 00:00:00 2001 From: OmarAbdo Date: Tue, 20 Oct 2026 17:40:26 +0300 Subject: [PATCH] MDEV-41639 VEC_DISTANCE_COSINE returns 0 for small-magnitude vectors calc_distance_cosine() multiplied float operands in float precision, so squares of components below ~1e-23 underflowed to 0, and the result became NaN. Convert the operands to double before multiplying. --- mysql-test/main/vector_small_cosine.result | 12 ++++++++++++ mysql-test/main/vector_small_cosine.test | 6 ++++++ sql/item_vectorfunc.cc | 2 +- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 mysql-test/main/vector_small_cosine.result create mode 100644 mysql-test/main/vector_small_cosine.test diff --git a/mysql-test/main/vector_small_cosine.result b/mysql-test/main/vector_small_cosine.result new file mode 100644 index 0000000000000..0c0b0e7a11c94 --- /dev/null +++ b/mysql-test/main/vector_small_cosine.result @@ -0,0 +1,12 @@ +# +# MDEV-41639 VEC_DISTANCE_COSINE returns 0 for small-magnitude vectors +# +SELECT ROUND(VEC_DISTANCE_COSINE(VEC_FromText('[1e-23,0]'), VEC_FromText('[0,1e-23]')), 6) AS orth; +orth +1.000000 +SELECT ROUND(VEC_DISTANCE_COSINE(VEC_FromText('[1e-23,0]'), VEC_FromText('[-1e-23,0]')), 6) AS opp; +opp +2.000000 +SELECT ROUND(VEC_DISTANCE_COSINE(VEC_FromText('[1e-30,1e-30]'), VEC_FromText('[1e-30,1e-30]')), 6) AS same; +same +0.000000 diff --git a/mysql-test/main/vector_small_cosine.test b/mysql-test/main/vector_small_cosine.test new file mode 100644 index 0000000000000..2f7125e7a0ebb --- /dev/null +++ b/mysql-test/main/vector_small_cosine.test @@ -0,0 +1,6 @@ +--echo # +--echo # MDEV-41639 VEC_DISTANCE_COSINE returns 0 for small-magnitude vectors +--echo # +SELECT ROUND(VEC_DISTANCE_COSINE(VEC_FromText('[1e-23,0]'), VEC_FromText('[0,1e-23]')), 6) AS orth; +SELECT ROUND(VEC_DISTANCE_COSINE(VEC_FromText('[1e-23,0]'), VEC_FromText('[-1e-23,0]')), 6) AS opp; +SELECT ROUND(VEC_DISTANCE_COSINE(VEC_FromText('[1e-30,1e-30]'), VEC_FromText('[1e-30,1e-30]')), 6) AS same; diff --git a/sql/item_vectorfunc.cc b/sql/item_vectorfunc.cc index 89e8f82e11283..a5a04877fa614 100644 --- a/sql/item_vectorfunc.cc +++ b/sql/item_vectorfunc.cc @@ -40,7 +40,7 @@ static double calc_distance_cosine(float *v1, float *v2, size_t v_len) double dotp=0, abs1=0, abs2=0; for (size_t i= 0; i < v_len; i++, v1++, v2++) { - float f1= get_float(v1), f2= get_float(v2); + double f1= get_float(v1), f2= get_float(v2); abs1+= f1 * f1; abs2+= f2 * f2; dotp+= f1 * f2;