summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2021-11-25 18:22:59 +0000
committerGerrit Code Review <gerrit@ci3.zzzcomputing.com>2021-11-25 18:22:59 +0000
commit8ddb3ef165d0c2d6d7167bb861bb349e68b5e8df (patch)
tree1f61463f9888eedbd156b35858af266135f7d6e7 /test
parent3619f084bfb5208ae45686a0993d620b2711adf2 (diff)
parent939de240d31a5441ad7380738d410a976d4ecc3a (diff)
downloadsqlalchemy-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.py9
-rw-r--r--test/dialect/postgresql/test_query.py535
-rw-r--r--test/dialect/postgresql/test_types.py4
-rw-r--r--test/engine/test_deprecations.py12
-rw-r--r--test/engine/test_execute.py3
-rw-r--r--test/orm/test_lazy_relations.py2
-rw-r--r--test/requirements.py20
-rw-r--r--test/sql/test_type_expressions.py32
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)