diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2022-12-02 14:09:05 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@ci3.zzzcomputing.com> | 2022-12-02 14:09:05 +0000 |
| commit | 7ab9061217ef498edfa79c603885690a3f2cd529 (patch) | |
| tree | 201b843d4aa4f034a44771913cf604528440db58 /test | |
| parent | 123fffd7bf159d5b1c5a6a3e54f50945dc48ab2a (diff) | |
| parent | e3b905be21f392b17817decff5e1e76f02ccad03 (diff) | |
| download | sqlalchemy-7ab9061217ef498edfa79c603885690a3f2cd529.tar.gz | |
Merge "disable setinputsizes only for true DBAPI executemany" into main
Diffstat (limited to 'test')
| -rw-r--r-- | test/dialect/mssql/test_engine.py | 129 |
1 files changed, 68 insertions, 61 deletions
diff --git a/test/dialect/mssql/test_engine.py b/test/dialect/mssql/test_engine.py index 6b895e3f1..57c6274e7 100644 --- a/test/dialect/mssql/test_engine.py +++ b/test/dialect/mssql/test_engine.py @@ -419,69 +419,55 @@ class FastExecutemanyTest(fixtures.TestBase): conn.execute(t.insert(), {"id": 200, "data": "data_200"}) - @testing.fixture - def fe_engine(self, testing_engine): - def go(use_fastexecutemany, apply_setinputsizes_flag): - engine = testing_engine( - options={ - "fast_executemany": use_fastexecutemany, - "use_setinputsizes": apply_setinputsizes_flag, - } - ) - return engine - - return go - - @testing.combinations( - ( - "setinputsizeshook", - True, - ), - ( - "nosetinputsizeshook", - False, - ), - argnames="include_setinputsizes", - id_="ia", - ) - @testing.combinations( - ( - "setinputsizesflag", - True, - ), - ( - "nosetinputsizesflag", - False, - ), - argnames="apply_setinputsizes_flag", - id_="ia", - ) - @testing.combinations( - ( - "fastexecutemany", - True, - ), - ( - "nofastexecutemany", - False, - ), - argnames="use_fastexecutemany", - id_="ia", - ) - def test_insert_floats( + @testing.variation("add_event", [True, False]) + @testing.variation("setinputsizes", [True, False]) + @testing.variation("fastexecutemany", [True, False]) + @testing.variation("insertmanyvalues", [True, False]) + @testing.variation("broken_types", [True, False]) + def test_insert_typing( self, metadata, - fe_engine, - include_setinputsizes, - use_fastexecutemany, - apply_setinputsizes_flag, + testing_engine, + add_event, + fastexecutemany, + setinputsizes, + insertmanyvalues, + broken_types, ): + """tests for executemany + datatypes that are sensitive to + "setinputsizes" + + Issues tested here include: + + #6058 - turn off setinputsizes by default, since it breaks with + fast_executemany (version 1.4) + + #8177 - turn setinputsizes back **on** by default, just skip it only + for cursor.executemany() calls when fast_executemany is set; + otherwise use it. (version 2.0) + + #8917 - oops, we added "insertmanyvalues" but forgot to adjust the + check in #8177 above to accommodate for this, so + setinputsizes was getting turned off for "insertmanyvalues" + if fast_executemany was still set + + """ # changes for issue #8177 have eliminated all current expected # failures, but we'll leave this here in case we need it again - expect_failure = False + # (... four months pass ...) + # surprise! we need it again. woop! for #8917 + expect_failure = ( + broken_types and not setinputsizes and insertmanyvalues + ) - engine = fe_engine(use_fastexecutemany, apply_setinputsizes_flag) + engine = testing_engine( + options={ + "fast_executemany": fastexecutemany, + "use_setinputsizes": setinputsizes, + "use_insertmanyvalues": insertmanyvalues, + } + ) observations = Table( "Observations", @@ -489,6 +475,7 @@ class FastExecutemanyTest(fixtures.TestBase): Column("id", Integer, nullable=False, primary_key=True), Column("obs1", Numeric(19, 15), nullable=True), Column("obs2", Numeric(19, 15), nullable=True), + Column("obs3", String(10)), schema="test_schema", ) with engine.begin() as conn: @@ -499,20 +486,33 @@ class FastExecutemanyTest(fixtures.TestBase): "id": 1, "obs1": Decimal("60.1722066045792"), "obs2": Decimal("24.929289808227466"), + "obs3": "obs3", }, { "id": 2, "obs1": Decimal("60.16325715615476"), "obs2": Decimal("24.93886459535008"), + "obs3": 5 if broken_types else "obs3", }, { "id": 3, "obs1": Decimal("60.16445165123469"), "obs2": Decimal("24.949856300109516"), + "obs3": 7 if broken_types else "obs3", }, ] - if include_setinputsizes: + assert_records = [ + { + "id": rec["id"], + "obs1": rec["obs1"], + "obs2": rec["obs2"], + "obs3": str(rec["obs3"]), + } + for rec in records + ] + + if add_event: canary = mock.Mock() @event.listens_for(engine, "do_setinputsizes") @@ -543,16 +543,23 @@ class FastExecutemanyTest(fixtures.TestBase): ) .mappings() .all(), - records, + assert_records, ) - if include_setinputsizes: - if apply_setinputsizes_flag: + if add_event: + if setinputsizes: eq_( canary.mock_calls, [ # float for int? this seems wrong - mock.call([float, float, float]), + mock.call( + [ + float, + float, + float, + engine.dialect.dbapi.SQL_VARCHAR, + ] + ), mock.call([]), ], ) |
