diff options
| author | mike bayer <mike_mp@zzzcomputing.com> | 2021-11-25 18:22:59 +0000 |
|---|---|---|
| committer | Gerrit Code Review <gerrit@ci3.zzzcomputing.com> | 2021-11-25 18:22:59 +0000 |
| commit | 8ddb3ef165d0c2d6d7167bb861bb349e68b5e8df (patch) | |
| tree | 1f61463f9888eedbd156b35858af266135f7d6e7 /test | |
| parent | 3619f084bfb5208ae45686a0993d620b2711adf2 (diff) | |
| parent | 939de240d31a5441ad7380738d410a976d4ecc3a (diff) | |
| download | sqlalchemy-8ddb3ef165d0c2d6d7167bb861bb349e68b5e8df.tar.gz | |
Merge "propose emulated setinputsizes embedded in the compiler" into main
Diffstat (limited to 'test')
| -rw-r--r-- | test/dialect/postgresql/test_compiler.py | 9 | ||||
| -rw-r--r-- | test/dialect/postgresql/test_query.py | 535 | ||||
| -rw-r--r-- | test/dialect/postgresql/test_types.py | 4 | ||||
| -rw-r--r-- | test/engine/test_deprecations.py | 12 | ||||
| -rw-r--r-- | test/engine/test_execute.py | 3 | ||||
| -rw-r--r-- | test/orm/test_lazy_relations.py | 2 | ||||
| -rw-r--r-- | test/requirements.py | 20 | ||||
| -rw-r--r-- | test/sql/test_type_expressions.py | 32 |
8 files changed, 442 insertions, 175 deletions
diff --git a/test/dialect/postgresql/test_compiler.py b/test/dialect/postgresql/test_compiler.py index a04e2932a..2bdc57386 100644 --- a/test/dialect/postgresql/test_compiler.py +++ b/test/dialect/postgresql/test_compiler.py @@ -38,7 +38,6 @@ from sqlalchemy.dialects.postgresql import array_agg as pg_array_agg from sqlalchemy.dialects.postgresql import ExcludeConstraint from sqlalchemy.dialects.postgresql import insert from sqlalchemy.dialects.postgresql import TSRANGE -from sqlalchemy.dialects.postgresql.base import _ColonCast from sqlalchemy.dialects.postgresql.base import PGDialect from sqlalchemy.dialects.postgresql.psycopg2 import PGDialect_psycopg2 from sqlalchemy.orm import aliased @@ -98,14 +97,6 @@ class CompileTest(fixtures.TestBase, AssertsCompiledSQL): __dialect__ = postgresql.dialect() - def test_colon_cast_is_slots(self): - - c1 = _ColonCast(column("q"), String(50)) - - assert not hasattr(c1, "__dict__") - - self.assert_compile(c1, "q::VARCHAR(50)") - def test_update_returning(self): dialect = postgresql.dialect() table1 = table( diff --git a/test/dialect/postgresql/test_query.py b/test/dialect/postgresql/test_query.py index 04bce4e22..b488b146c 100644 --- a/test/dialect/postgresql/test_query.py +++ b/test/dialect/postgresql/test_query.py @@ -149,6 +149,13 @@ class InsertTest(fixtures.TestBase, AssertsExecutionResults): metadata.create_all(connection) self._assert_data_noautoincrement(connection, table) + def _ints_and_strs_setinputsizes(self, connection): + + return ( + connection.dialect._bind_typing_render_casts + and String().dialect_impl(connection.dialect).render_bind_cast + ) + def _assert_data_autoincrement(self, connection, table): """ invoked by: @@ -190,31 +197,64 @@ class InsertTest(fixtures.TestBase, AssertsExecutionResults): conn.execute(table.insert().inline(), {"data": "d8"}) - asserter.assert_( - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - {"id": 30, "data": "d1"}, - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - {"id": 1, "data": "d2"}, - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], - ), - DialectSQL( - "INSERT INTO testtable (data) VALUES (:data)", - [{"data": "d5"}, {"data": "d6"}], - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - [{"id": 33, "data": "d7"}], - ), - DialectSQL( - "INSERT INTO testtable (data) VALUES (:data)", [{"data": "d8"}] - ), - ) + if self._ints_and_strs_setinputsizes(connection): + asserter.assert_( + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + {"id": 30, "data": "d1"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + {"id": 1, "data": "d2"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data::VARCHAR(30))", + [{"data": "d5"}, {"data": "d6"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + [{"id": 33, "data": "d7"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data::VARCHAR(30))", + [{"data": "d8"}], + ), + ) + else: + asserter.assert_( + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + {"id": 30, "data": "d1"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + {"id": 1, "data": "d2"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data)", + [{"data": "d5"}, {"data": "d6"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + [{"id": 33, "data": "d7"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data)", + [{"data": "d8"}], + ), + ) eq_( conn.execute(table.select()).fetchall(), @@ -255,31 +295,64 @@ class InsertTest(fixtures.TestBase, AssertsExecutionResults): conn.execute(table.insert().inline(), {"id": 33, "data": "d7"}) conn.execute(table.insert().inline(), {"data": "d8"}) - asserter.assert_( - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - {"id": 30, "data": "d1"}, - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - {"id": 5, "data": "d2"}, - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], - ), - DialectSQL( - "INSERT INTO testtable (data) VALUES (:data)", - [{"data": "d5"}, {"data": "d6"}], - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - [{"id": 33, "data": "d7"}], - ), - DialectSQL( - "INSERT INTO testtable (data) VALUES (:data)", [{"data": "d8"}] - ), - ) + if self._ints_and_strs_setinputsizes(connection): + asserter.assert_( + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + {"id": 30, "data": "d1"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + {"id": 5, "data": "d2"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data::VARCHAR(30))", + [{"data": "d5"}, {"data": "d6"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + [{"id": 33, "data": "d7"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data::VARCHAR(30))", + [{"data": "d8"}], + ), + ) + else: + asserter.assert_( + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + {"id": 30, "data": "d1"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + {"id": 5, "data": "d2"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data)", + [{"data": "d5"}, {"data": "d6"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + [{"id": 33, "data": "d7"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data)", + [{"data": "d8"}], + ), + ) eq_( conn.execute(table.select()).fetchall(), @@ -336,32 +409,66 @@ class InsertTest(fixtures.TestBase, AssertsExecutionResults): conn.execute(table.insert().inline(), {"data": "d8"}) - asserter.assert_( - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - {"id": 30, "data": "d1"}, - ), - DialectSQL( - "INSERT INTO testtable (data) VALUES (:data) RETURNING " - "testtable.id", - {"data": "d2"}, - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], - ), - DialectSQL( - "INSERT INTO testtable (data) VALUES (:data)", - [{"data": "d5"}, {"data": "d6"}], - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - [{"id": 33, "data": "d7"}], - ), - DialectSQL( - "INSERT INTO testtable (data) VALUES (:data)", [{"data": "d8"}] - ), - ) + if self._ints_and_strs_setinputsizes(connection): + asserter.assert_( + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + {"id": 30, "data": "d1"}, + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES " + "(:data::VARCHAR(30)) RETURNING " + "testtable.id", + {"data": "d2"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data::VARCHAR(30))", + [{"data": "d5"}, {"data": "d6"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + [{"id": 33, "data": "d7"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data::VARCHAR(30))", + [{"data": "d8"}], + ), + ) + else: + asserter.assert_( + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + {"id": 30, "data": "d1"}, + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data) RETURNING " + "testtable.id", + {"data": "d2"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data)", + [{"data": "d5"}, {"data": "d6"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + [{"id": 33, "data": "d7"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data)", + [{"data": "d8"}], + ), + ) eq_( conn.execute(table.select()).fetchall(), @@ -404,32 +511,66 @@ class InsertTest(fixtures.TestBase, AssertsExecutionResults): conn.execute(table.insert().inline(), {"id": 33, "data": "d7"}) conn.execute(table.insert().inline(), {"data": "d8"}) - asserter.assert_( - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - {"id": 30, "data": "d1"}, - ), - DialectSQL( - "INSERT INTO testtable (data) VALUES (:data) RETURNING " - "testtable.id", - {"data": "d2"}, - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], - ), - DialectSQL( - "INSERT INTO testtable (data) VALUES (:data)", - [{"data": "d5"}, {"data": "d6"}], - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - [{"id": 33, "data": "d7"}], - ), - DialectSQL( - "INSERT INTO testtable (data) VALUES (:data)", [{"data": "d8"}] - ), - ) + if self._ints_and_strs_setinputsizes(connection): + asserter.assert_( + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + {"id": 30, "data": "d1"}, + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES " + "(:data::VARCHAR(30)) RETURNING " + "testtable.id", + {"data": "d2"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data::VARCHAR(30))", + [{"data": "d5"}, {"data": "d6"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + [{"id": 33, "data": "d7"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data::VARCHAR(30))", + [{"data": "d8"}], + ), + ) + else: + asserter.assert_( + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + {"id": 30, "data": "d1"}, + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data) RETURNING " + "testtable.id", + {"data": "d2"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data)", + [{"data": "d5"}, {"data": "d6"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + [{"id": 33, "data": "d7"}], + ), + DialectSQL( + "INSERT INTO testtable (data) VALUES (:data)", + [{"data": "d8"}], + ), + ) eq_( conn.execute(table.select()).fetchall(), @@ -466,35 +607,70 @@ class InsertTest(fixtures.TestBase, AssertsExecutionResults): conn.execute(table.insert().inline(), {"id": 33, "data": "d7"}) conn.execute(table.insert().inline(), {"data": "d8"}) - asserter.assert_( - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - {"id": 30, "data": "d1"}, - ), - CursorSQL("select nextval('my_seq')", consume_statement=False), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - {"id": 1, "data": "d2"}, - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (nextval('%s'), " - ":data)" % seqname, - [{"data": "d5"}, {"data": "d6"}], - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - [{"id": 33, "data": "d7"}], - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (nextval('%s'), " - ":data)" % seqname, - [{"data": "d8"}], - ), - ) + if self._ints_and_strs_setinputsizes(connection): + asserter.assert_( + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + {"id": 30, "data": "d1"}, + ), + CursorSQL("select nextval('my_seq')", consume_statement=False), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + {"id": 1, "data": "d2"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (nextval('%s'), " + ":data::VARCHAR(30))" % seqname, + [{"data": "d5"}, {"data": "d6"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + [{"id": 33, "data": "d7"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (nextval('%s'), " + ":data::VARCHAR(30))" % seqname, + [{"data": "d8"}], + ), + ) + else: + asserter.assert_( + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + {"id": 30, "data": "d1"}, + ), + CursorSQL("select nextval('my_seq')", consume_statement=False), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + {"id": 1, "data": "d2"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (nextval('%s'), " + ":data)" % seqname, + [{"data": "d5"}, {"data": "d6"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + [{"id": 33, "data": "d7"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (nextval('%s'), " + ":data)" % seqname, + [{"data": "d8"}], + ), + ) eq_( conn.execute(table.select()).fetchall(), [ @@ -530,35 +706,70 @@ class InsertTest(fixtures.TestBase, AssertsExecutionResults): conn.execute(table.insert().inline(), {"id": 33, "data": "d7"}) conn.execute(table.insert().inline(), {"data": "d8"}) - asserter.assert_( - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - {"id": 30, "data": "d1"}, - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES " - "(nextval('my_seq'), :data) RETURNING testtable.id", - {"data": "d2"}, - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (nextval('%s'), " - ":data)" % seqname, - [{"data": "d5"}, {"data": "d6"}], - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (:id, :data)", - [{"id": 33, "data": "d7"}], - ), - DialectSQL( - "INSERT INTO testtable (id, data) VALUES (nextval('%s'), " - ":data)" % seqname, - [{"data": "d8"}], - ), - ) + if self._ints_and_strs_setinputsizes(connection): + asserter.assert_( + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + {"id": 30, "data": "d1"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(nextval('my_seq'), :data::VARCHAR(30)) " + "RETURNING testtable.id", + {"data": "d2"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (nextval('%s'), " + ":data::VARCHAR(30))" % seqname, + [{"data": "d5"}, {"data": "d6"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(:id::INTEGER, :data::VARCHAR(30))", + [{"id": 33, "data": "d7"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (nextval('%s'), " + ":data::VARCHAR(30))" % seqname, + [{"data": "d8"}], + ), + ) + else: + asserter.assert_( + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + {"id": 30, "data": "d1"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES " + "(nextval('my_seq'), :data) RETURNING testtable.id", + {"data": "d2"}, + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + [{"id": 31, "data": "d3"}, {"id": 32, "data": "d4"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (nextval('%s'), " + ":data)" % seqname, + [{"data": "d5"}, {"data": "d6"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (:id, :data)", + [{"id": 33, "data": "d7"}], + ), + DialectSQL( + "INSERT INTO testtable (id, data) VALUES (nextval('%s'), " + ":data)" % seqname, + [{"data": "d8"}], + ), + ) eq_( connection.execute(table.select()).fetchall(), @@ -758,7 +969,9 @@ class MatchTest(fixtures.TablesTest, AssertsCompiledSQL): matchtable = self.tables.matchtable self.assert_compile( matchtable.c.title.match("somstr"), - "matchtable.title @@ to_tsquery(%s)", + # note we assume current tested DBAPIs use emulated setinputsizes + # here, the cast is not strictly necessary + "matchtable.title @@ to_tsquery(%s::VARCHAR(200))", ) def test_simple_match(self, connection): diff --git a/test/dialect/postgresql/test_types.py b/test/dialect/postgresql/test_types.py index acca0926e..4008881d2 100644 --- a/test/dialect/postgresql/test_types.py +++ b/test/dialect/postgresql/test_types.py @@ -1205,7 +1205,7 @@ class ArrayTest(AssertsCompiledSQL, fixtures.TestBase): self.assert_compile( expr, - "x IN (__[POSTCOMPILE_x_1~~~~REPL~~::myenum[]~~])", + "x IN (__[POSTCOMPILE_x_1])", dialect=postgresql.psycopg2.dialect(), ) @@ -1223,7 +1223,7 @@ class ArrayTest(AssertsCompiledSQL, fixtures.TestBase): self.assert_compile( expr, - "x IN (__[POSTCOMPILE_x_1~~~~REPL~~::VARCHAR(15)[]~~])", + "x IN (__[POSTCOMPILE_x_1])", dialect=postgresql.psycopg2.dialect(), ) diff --git a/test/engine/test_deprecations.py b/test/engine/test_deprecations.py index 77c5c6a22..b75d9c978 100644 --- a/test/engine/test_deprecations.py +++ b/test/engine/test_deprecations.py @@ -18,9 +18,11 @@ from sqlalchemy import String from sqlalchemy import testing from sqlalchemy import text from sqlalchemy import ThreadLocalMetaData +from sqlalchemy.engine import BindTyping from sqlalchemy.engine import reflection from sqlalchemy.engine.base import Connection from sqlalchemy.engine.base import Engine +from sqlalchemy.engine.default import DefaultDialect from sqlalchemy.engine.mock import MockConnection from sqlalchemy.testing import assert_raises from sqlalchemy.testing import assert_raises_message @@ -311,6 +313,16 @@ class CreateEngineTest(fixtures.TestBase): _initialize=False, ) + def test_dialect_use_setinputsizes_attr(self): + class MyDialect(DefaultDialect): + use_setinputsizes = True + + with testing.expect_deprecated( + "The dialect-level use_setinputsizes attribute is deprecated." + ): + md = MyDialect() + is_(md.bind_typing, BindTyping.SETINPUTSIZES) + class HandleInvalidatedOnConnectTest(fixtures.TestBase): __requires__ = ("sqlite",) diff --git a/test/engine/test_execute.py b/test/engine/test_execute.py index 4670297c1..317d0b692 100644 --- a/test/engine/test_execute.py +++ b/test/engine/test_execute.py @@ -30,6 +30,7 @@ from sqlalchemy import text from sqlalchemy import TypeDecorator from sqlalchemy import util from sqlalchemy import VARCHAR +from sqlalchemy.engine import BindTyping from sqlalchemy.engine import default from sqlalchemy.engine.base import Connection from sqlalchemy.engine.base import Engine @@ -3656,7 +3657,7 @@ class SetInputSizesTest(fixtures.TablesTest): # setinputsizes() called in order to work. with mock.patch.object( - engine.dialect, "use_setinputsizes", True + engine.dialect, "bind_typing", BindTyping.SETINPUTSIZES ), mock.patch.object( engine.dialect, "do_set_input_sizes", do_set_input_sizes ), mock.patch.object( diff --git a/test/orm/test_lazy_relations.py b/test/orm/test_lazy_relations.py index 7f2292986..cb83bb6f7 100644 --- a/test/orm/test_lazy_relations.py +++ b/test/orm/test_lazy_relations.py @@ -1582,7 +1582,7 @@ class TypeCoerceTest(fixtures.MappedTest, testing.AssertsExecutionResults): return sa.cast(col, Integer) def bind_expression(self, col): - return sa.cast(col, String(50)) + return sa.cast(sa.type_coerce(col, Integer), String(50)) @classmethod def define_tables(cls, metadata): diff --git a/test/requirements.py b/test/requirements.py index 967547ab9..eeb71323b 100644 --- a/test/requirements.py +++ b/test/requirements.py @@ -6,6 +6,7 @@ import sys from sqlalchemy import exc +from sqlalchemy.sql import sqltypes from sqlalchemy.sql import text from sqlalchemy.testing import exclusions from sqlalchemy.testing.exclusions import against @@ -213,6 +214,7 @@ class DefaultRequirements(SuiteRequirements): "mariadb+pymysql", "mariadb+cymysql", "mariadb+mysqlconnector", + "postgresql+asyncpg", "postgresql+pg8000", ] ) @@ -796,6 +798,24 @@ class DefaultRequirements(SuiteRequirements): ) @property + def string_type_isnt_subtype(self): + """target dialect does not have a dialect-specific subtype for String. + + This is used for a special type expression test which wants to + test the compiler with a subclass of String, where we don't want + the dialect changing that type when we grab the 'impl'. + + """ + + def go(config): + return ( + sqltypes.String().dialect_impl(config.db.dialect).__class__ + is sqltypes.String + ) + + return only_if(go) + + @property def empty_inserts_executemany(self): # waiting on https://jira.mariadb.org/browse/CONPY-152 return skip_if(["mariadb+mariadbconnector"]) + self.empty_inserts diff --git a/test/sql/test_type_expressions.py b/test/sql/test_type_expressions.py index cab4f6371..70c8839e3 100644 --- a/test/sql/test_type_expressions.py +++ b/test/sql/test_type_expressions.py @@ -9,6 +9,7 @@ from sqlalchemy import testing from sqlalchemy import TypeDecorator from sqlalchemy import union from sqlalchemy.sql import LABEL_STYLE_TABLENAME_PLUS_COL +from sqlalchemy.sql.type_api import UserDefinedType from sqlalchemy.testing import AssertsCompiledSQL from sqlalchemy.testing import eq_ from sqlalchemy.testing import fixtures @@ -431,6 +432,8 @@ class RoundTripTestBase: class StringRoundTripTest(fixtures.TablesTest, RoundTripTestBase): + __requires__ = ("string_type_isnt_subtype",) + @classmethod def define_tables(cls, metadata): class MyString(String): @@ -448,6 +451,29 @@ class StringRoundTripTest(fixtures.TablesTest, RoundTripTestBase): ) +class UserDefinedTypeRoundTripTest(fixtures.TablesTest, RoundTripTestBase): + @classmethod + def define_tables(cls, metadata): + class MyString(UserDefinedType): + cache_ok = True + + def get_col_spec(self, **kw): + return "VARCHAR(50)" + + def bind_expression(self, bindvalue): + return func.lower(bindvalue) + + def column_expression(self, col): + return func.upper(col) + + Table( + "test_table", + metadata, + Column("x", String(50)), + Column("y", MyString()), + ) + + class TypeDecRoundTripTest(fixtures.TablesTest, RoundTripTestBase): @classmethod def define_tables(cls, metadata): @@ -474,7 +500,11 @@ class ReturningTest(fixtures.TablesTest): @classmethod def define_tables(cls, metadata): - class MyString(String): + class MyString(TypeDecorator): + impl = String + + cache_ok = True + def column_expression(self, col): return func.lower(col) |
