summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/testing
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2022-06-10 12:57:53 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2022-06-10 13:23:20 -0400
commitbc0367c670cc1376b90ab2309085bd660ec317c9 (patch)
treebfb1a99c07e084c402442b46922c79a39662e2ef /lib/sqlalchemy/testing
parentb171f5d2e488c46a664847644e65d5dc03759840 (diff)
downloadsqlalchemy-bc0367c670cc1376b90ab2309085bd660ec317c9.tar.gz
resolve large ints to BigInteger
The in-place type detection for Python integers, as occurs with an expression such as ``literal(25)``, will now apply value-based adaption as well to accommodate Python large integers, where the datatype determined will be :class:`.BigInteger` rather than :class:`.Integer`. This accommodates for dialects such as that of asyncpg which both sends implicit typing information to the driver as well as is sensitive to numeric scale. Fixes: #7909 Change-Id: I1cd3ec2676c9bb03ffedb600695252bd0037ba02
Diffstat (limited to 'lib/sqlalchemy/testing')
-rw-r--r--lib/sqlalchemy/testing/suite/test_types.py33
1 files changed, 31 insertions, 2 deletions
diff --git a/lib/sqlalchemy/testing/suite/test_types.py b/lib/sqlalchemy/testing/suite/test_types.py
index f1e376837..391379956 100644
--- a/lib/sqlalchemy/testing/suite/test_types.py
+++ b/lib/sqlalchemy/testing/suite/test_types.py
@@ -565,8 +565,37 @@ class IntegerTest(_LiteralRoundTripFixture, fixtures.TestBase):
def test_literal(self, literal_round_trip):
literal_round_trip(Integer, [5], [5])
- def test_huge_int(self, integer_round_trip):
- integer_round_trip(BigInteger, 1376537018368127)
+ def _huge_ints():
+
+ return testing.combinations(
+ 2147483649, # 32 bits
+ 2147483648, # 32 bits
+ 2147483647, # 31 bits
+ 2147483646, # 31 bits
+ -2147483649, # 32 bits
+ -2147483648, # 32 interestingly, asyncpg accepts this one as int32
+ -2147483647, # 31
+ -2147483646, # 31
+ 0,
+ 1376537018368127,
+ -1376537018368127,
+ argnames="intvalue",
+ )
+
+ @_huge_ints()
+ def test_huge_int_auto_accommodation(self, connection, intvalue):
+ """test #7909"""
+
+ eq_(
+ connection.scalar(
+ select(intvalue).where(literal(intvalue) == intvalue)
+ ),
+ intvalue,
+ )
+
+ @_huge_ints()
+ def test_huge_int(self, integer_round_trip, intvalue):
+ integer_round_trip(BigInteger, intvalue)
@testing.fixture
def integer_round_trip(self, metadata, connection):