diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-10-03 14:09:54 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-10-03 15:02:00 -0400 |
| commit | e21afbcd8c78e4e3f9400da1a2565472682de825 (patch) | |
| tree | b50a003712cff0d1b84e1f6e42b126dbdfaa7ac8 /lib/sqlalchemy/testing/suite | |
| parent | 334bad16792666a096c2cbe2dd8936eaaefa0251 (diff) | |
| download | sqlalchemy-e21afbcd8c78e4e3f9400da1a2565472682de825.tar.gz | |
call setinputsizes for cx_Oracle.DATETIME
Restored adding cx_Oracle.DATETIME to the setinputsizes() call when a
SQLAlchemy :class:`.Date`, :class:`.DateTime` or :class:`.Time` datatype is
used, so that in the case where a bound parameter is passed as NULL
in some complex queries (in particular this happens with some lazy load
situations), the type is still present. This was removed
in the 1.2 series for arbitrary reasons.
Also adds a suite test for this generic situation.
What's not clear is that do we really need setinputsizes() for all
datatypes if we are supporting NULL in bound parameters.
Fixes: #4886
Change-Id: If99215c31861f9ea6f60a30d47f2f320adc4797f
Diffstat (limited to 'lib/sqlalchemy/testing/suite')
| -rw-r--r-- | lib/sqlalchemy/testing/suite/test_types.py | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/sqlalchemy/testing/suite/test_types.py b/lib/sqlalchemy/testing/suite/test_types.py index 37428c545..435ab4689 100644 --- a/lib/sqlalchemy/testing/suite/test_types.py +++ b/lib/sqlalchemy/testing/suite/test_types.py @@ -14,7 +14,9 @@ from ..schema import Column from ..schema import Table from ... import and_ from ... import BigInteger +from ... import bindparam from ... import Boolean +from ... import case from ... import cast from ... import Date from ... import DateTime @@ -291,6 +293,33 @@ class _DateFixture(_LiteralRoundTripFixture): compare = self.compare or self.data self._literal_round_trip(self.datatype, [self.data], [compare]) + @testing.requires.standalone_null_binds_whereclause + def test_null_bound_comparison(self): + # this test is based on an Oracle issue observed in #4886. + # passing NULL for an expression that needs to be interpreted as + # a certain type, does the DBAPI have the info it needs to do this. + date_table = self.tables.date_table + with config.db.connect() as conn: + result = conn.execute( + date_table.insert(), {"date_data": self.data} + ) + id_ = result.inserted_primary_key[0] + stmt = select([date_table.c.id]).where( + case( + [ + ( + bindparam("foo", type_=self.datatype) != None, + bindparam("foo", type_=self.datatype), + ) + ], + else_=date_table.c.date_data, + ) + == date_table.c.date_data + ) + + row = conn.execute(stmt, {"foo": None}).first() + eq_(row[0], id_) + class DateTimeTest(_DateFixture, fixtures.TablesTest): __requires__ = ("datetime",) |
