diff --git a/CHANGELOG.md b/CHANGELOG.md index 5df6332..1f286de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ## 0.4.3 (unreleased) +- Fixed infinite values with vector addition and subtraction - Fixed compilation error when `float8` is pass by reference - Fixed compilation error on PowerPC - Fixed segmentation fault with index creation on i386 diff --git a/src/vector.c b/src/vector.c index 13ff514..392d98a 100644 --- a/src/vector.c +++ b/src/vector.c @@ -656,6 +656,10 @@ vector_add(PG_FUNCTION_ARGS) for (int i = 0, imax = a->dim; i < imax; i++) rx[i] = ax[i] + bx[i]; + for (int i = 0, imax = a->dim; i < imax; i++) + if (isinf(rx[i])) + float_overflow_error(); + PG_RETURN_POINTER(result); } @@ -682,6 +686,10 @@ vector_sub(PG_FUNCTION_ARGS) for (int i = 0, imax = a->dim; i < imax; i++) rx[i] = ax[i] - bx[i]; + for (int i = 0, imax = a->dim; i < imax; i++) + if (isinf(rx[i])) + float_overflow_error(); + PG_RETURN_POINTER(result); } diff --git a/test/expected/functions.out b/test/expected/functions.out index bbcea4d..0272282 100644 --- a/test/expected/functions.out +++ b/test/expected/functions.out @@ -4,12 +4,16 @@ SELECT '[1,2,3]'::vector + '[4,5,6]'; [5,7,9] (1 row) +SELECT '[3e38]'::vector + '[3e38]'; +ERROR: value out of range: overflow SELECT '[1,2,3]'::vector - '[4,5,6]'; ?column? ------------ [-3,-3,-3] (1 row) +SELECT '[-3e38]'::vector - '[3e38]'; +ERROR: value out of range: overflow SELECT vector_dims('[1,2,3]'); vector_dims ------------- diff --git a/test/sql/functions.sql b/test/sql/functions.sql index 91f0570..e4d3317 100644 --- a/test/sql/functions.sql +++ b/test/sql/functions.sql @@ -1,5 +1,7 @@ SELECT '[1,2,3]'::vector + '[4,5,6]'; +SELECT '[3e38]'::vector + '[3e38]'; SELECT '[1,2,3]'::vector - '[4,5,6]'; +SELECT '[-3e38]'::vector - '[3e38]'; SELECT vector_dims('[1,2,3]');