From 8855656626202e541bd2c95bc023e820a022322f Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Wed, 15 Feb 2023 18:28:12 -0500 Subject: [PATCH] prevent float tests from running on asyncmy asyncmy 0.2.7 has had a loss in float precision for even very low numbers of significant digits. Change-Id: Iec6d2650943eeaa8e854f21990f6565d73331f8c References: https://github.com/long2ice/asyncmy/issues/56 --- lib/sqlalchemy/testing/requirements.py | 14 ++++++++++++++ lib/sqlalchemy/testing/suite/test_types.py | 6 ++---- test/dialect/mysql/test_types.py | 2 ++ test/requirements.py | 4 ++++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/sqlalchemy/testing/requirements.py b/lib/sqlalchemy/testing/requirements.py index 6e325ea663..9bfc94e78a 100644 --- a/lib/sqlalchemy/testing/requirements.py +++ b/lib/sqlalchemy/testing/requirements.py @@ -1178,6 +1178,20 @@ class SuiteRequirements(Requirements): """ return exclusions.open() + @property + def literal_float_coercion(self): + """target backend will return the exact float value 15.7563 + with only four significant digits from this statement: + + SELECT :param + + where :param is the Python float 15.7563 + + i.e. it does not return 15.75629997253418 + + """ + return exclusions.open() + @property def floats_to_four_decimals(self): """target backend can return a floating-point number with four diff --git a/lib/sqlalchemy/testing/suite/test_types.py b/lib/sqlalchemy/testing/suite/test_types.py index 36fd7f247c..d6a74b220c 100644 --- a/lib/sqlalchemy/testing/suite/test_types.py +++ b/lib/sqlalchemy/testing/suite/test_types.py @@ -945,6 +945,7 @@ class NumericTest(_LiteralRoundTripFixture, fixtures.TestBase): filter_=lambda n: n is not None and round(n, 5) or None, ) + @testing.requires.literal_float_coercion def test_float_coerce_round_trip(self, connection): expr = 15.7563 @@ -1199,10 +1200,7 @@ class JSONTest(_LiteralRoundTripFixture, fixtures.TablesTest): ("integer", None), ("float", 28.5), ("float", None), - ( - "float", - 1234567.89, - ), + ("float", 1234567.89, testing.requires.literal_float_coercion), ("numeric", 1234567.89), # this one "works" because the float value you see here is # lost immediately to floating point stuff diff --git a/test/dialect/mysql/test_types.py b/test/dialect/mysql/test_types.py index eca1051e21..989d50d494 100644 --- a/test/dialect/mysql/test_types.py +++ b/test/dialect/mysql/test_types.py @@ -471,6 +471,8 @@ class TypeRoundTripTest(fixtures.TestBase, AssertsExecutionResults): # fixed in mysql-connector as of 2.0.1, # see https://bugs.mysql.com/bug.php?id=73266 + + @testing.requires.literal_float_coercion def test_precision_float_roundtrip(self, metadata, connection): t = Table( "t", diff --git a/test/requirements.py b/test/requirements.py index d91f056732..923d98b462 100644 --- a/test/requirements.py +++ b/test/requirements.py @@ -1333,6 +1333,10 @@ class DefaultRequirements(SuiteRequirements): "sqlite doesn't return Decimal objects without special handlers", ) + @property + def literal_float_coercion(self): + return skip_if("+asyncmy") + @property def infinity_floats(self): return fails_on_everything_except( -- 2.47.2