summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2022-06-05 20:40:41 +0000
committerGerrit Code Review <gerrit@ci3.zzzcomputing.com>2022-06-05 20:40:41 +0000
commit6e538cf64adfef7f604e3b0d976405a27b8e3d27 (patch)
treee147e056f50e353887429fa67fda79928e06c437 /test
parent1508aed47261fe17180aa12fb312aebb0dd3c615 (diff)
parent466ed5b53a3af83f337c93be95715e4b3ab1255e (diff)
downloadsqlalchemy-6e538cf64adfef7f604e3b0d976405a27b8e3d27.tar.gz
Merge "Generalize RETURNING and suppor for MariaDB / SQLite" into main
Diffstat (limited to 'test')
-rw-r--r--test/dialect/oracle/test_dialect.py2
-rw-r--r--test/dialect/oracle/test_types.py4
-rw-r--r--test/engine/test_deprecations.py58
-rw-r--r--test/orm/test_defaults.py6
-rw-r--r--test/orm/test_events.py2
-rw-r--r--test/orm/test_naturalpks.py4
-rw-r--r--test/orm/test_unitofwork.py7
-rw-r--r--test/orm/test_unitofworkv2.py12
-rw-r--r--test/orm/test_update_delete.py60
-rw-r--r--test/orm/test_versioning.py231
-rw-r--r--test/requirements.py2
-rw-r--r--test/sql/test_defaults.py21
-rw-r--r--test/sql/test_insert.py10
-rw-r--r--test/sql/test_insert_exec.py30
-rw-r--r--test/sql/test_returning.py313
-rw-r--r--test/sql/test_sequences.py26
-rw-r--r--test/sql/test_type_expressions.py2
17 files changed, 439 insertions, 351 deletions
diff --git a/test/dialect/oracle/test_dialect.py b/test/dialect/oracle/test_dialect.py
index 8d74c1f48..eda0fc986 100644
--- a/test/dialect/oracle/test_dialect.py
+++ b/test/dialect/oracle/test_dialect.py
@@ -626,7 +626,7 @@ class CompatFlagsTest(fixtures.TestBase, AssertsCompiledSQL):
dialect.initialize(Mock())
# oracle 8 / 8i support returning
- assert dialect.implicit_returning
+ assert dialect.insert_returning
assert not dialect._supports_char_length
assert not dialect.use_ansi
diff --git a/test/dialect/oracle/test_types.py b/test/dialect/oracle/test_types.py
index 799a5e7b6..23df01a0b 100644
--- a/test/dialect/oracle/test_types.py
+++ b/test/dialect/oracle/test_types.py
@@ -229,7 +229,7 @@ class TypesTest(fixtures.TestBase):
[(2, "value 2 ")],
)
- @testing.requires.returning
+ @testing.requires.insert_returning
def test_int_not_float(self, metadata, connection):
m = metadata
t1 = Table("t1", m, Column("foo", Integer))
@@ -243,7 +243,7 @@ class TypesTest(fixtures.TestBase):
assert x == 5
assert isinstance(x, int)
- @testing.requires.returning
+ @testing.requires.insert_returning
def test_int_not_float_no_coerce_decimal(self, metadata):
engine = testing_engine(options=dict(coerce_to_decimal=False))
diff --git a/test/engine/test_deprecations.py b/test/engine/test_deprecations.py
index 5b723b871..f7602f98a 100644
--- a/test/engine/test_deprecations.py
+++ b/test/engine/test_deprecations.py
@@ -4,13 +4,8 @@ from unittest.mock import Mock
import sqlalchemy as tsa
from sqlalchemy import create_engine
from sqlalchemy import event
-from sqlalchemy import exc
-from sqlalchemy import insert
-from sqlalchemy import Integer
-from sqlalchemy import MetaData
from sqlalchemy import pool
from sqlalchemy import select
-from sqlalchemy import String
from sqlalchemy import testing
from sqlalchemy.engine import BindTyping
from sqlalchemy.engine import reflection
@@ -29,10 +24,7 @@ from sqlalchemy.testing import is_
from sqlalchemy.testing import is_instance_of
from sqlalchemy.testing import mock
from sqlalchemy.testing.assertions import expect_deprecated
-from sqlalchemy.testing.assertions import expect_raises_message
from sqlalchemy.testing.engines import testing_engine
-from sqlalchemy.testing.schema import Column
-from sqlalchemy.testing.schema import Table
def _string_deprecation_expect():
@@ -442,55 +434,11 @@ class ImplicitReturningFlagTest(fixtures.TestBase):
@testing.combinations(True, False, None, argnames="implicit_returning")
def test_implicit_returning_engine_parameter(self, implicit_returning):
if implicit_returning is None:
- e = engines.testing_engine()
+ engines.testing_engine()
else:
with assertions.expect_deprecated(ce_implicit_returning):
- e = engines.testing_engine(
+ engines.testing_engine(
options={"implicit_returning": implicit_returning}
)
- if implicit_returning is None:
- eq_(
- e.dialect.implicit_returning,
- testing.db.dialect.implicit_returning,
- )
- else:
- eq_(e.dialect.implicit_returning, implicit_returning)
-
- t = Table(
- "t",
- MetaData(),
- Column("id", Integer, primary_key=True),
- Column("data", String(50)),
- )
-
- t2 = Table(
- "t",
- MetaData(),
- Column("id", Integer, primary_key=True),
- Column("data", String(50)),
- implicit_returning=False,
- )
-
- with e.connect() as conn:
- stmt = insert(t).values(data="data")
-
- if implicit_returning:
- if not testing.requires.returning.enabled:
- with expect_raises_message(
- exc.CompileError, "RETURNING is not supported"
- ):
- stmt.compile(conn)
- else:
- eq_(stmt.compile(conn).implicit_returning, [t.c.id])
- elif (
- implicit_returning is None
- and testing.db.dialect.implicit_returning
- ):
- eq_(stmt.compile(conn).implicit_returning, [t.c.id])
- else:
- eq_(stmt.compile(conn).implicit_returning, [])
-
- # table setting it to False disables it
- stmt2 = insert(t2).values(data="data")
- eq_(stmt2.compile(conn).implicit_returning, [])
+ # parameter has no effect
diff --git a/test/orm/test_defaults.py b/test/orm/test_defaults.py
index fc8e455ea..7860f5eb1 100644
--- a/test/orm/test_defaults.py
+++ b/test/orm/test_defaults.py
@@ -278,7 +278,7 @@ class ComputedDefaultsOnUpdateTest(fixtures.MappedTest):
asserter.assert_(
Conditional(
- eager and testing.db.dialect.implicit_returning,
+ eager and testing.db.dialect.insert_returning,
[
Conditional(
testing.db.dialect.insert_executemany_returning,
@@ -361,7 +361,7 @@ class ComputedDefaultsOnUpdateTest(fixtures.MappedTest):
eq_(t1.bar, 5 + 42)
eq_(t2.bar, 6 + 42)
- if eager and testing.db.dialect.implicit_returning:
+ if eager and testing.db.dialect.update_returning:
asserter.assert_(
CompiledSQL(
"UPDATE test SET foo=%(foo)s "
@@ -462,7 +462,7 @@ class IdentityDefaultsOnUpdateTest(fixtures.MappedTest):
asserter.assert_(
Conditional(
- testing.db.dialect.implicit_returning,
+ testing.db.dialect.insert_returning,
[
Conditional(
testing.db.dialect.insert_executemany_returning,
diff --git a/test/orm/test_events.py b/test/orm/test_events.py
index be1919614..7e1b29cb1 100644
--- a/test/orm/test_events.py
+++ b/test/orm/test_events.py
@@ -3411,7 +3411,7 @@ class RefreshFlushInReturningTest(fixtures.MappedTest):
s.add(t1)
s.flush()
- if testing.requires.returning.enabled:
+ if testing.requires.insert_returning.enabled:
# ordering is deterministic in this test b.c. the routine
# appends the "returning" params before the "prefetch"
# ones. if there were more than one attribute in each category,
diff --git a/test/orm/test_naturalpks.py b/test/orm/test_naturalpks.py
index 0dc71f8b3..64c033ec4 100644
--- a/test/orm/test_naturalpks.py
+++ b/test/orm/test_naturalpks.py
@@ -157,7 +157,7 @@ class NaturalPKTest(fixtures.MappedTest):
assert sess.get(User, "jack") is None
assert sess.get(User, "ed").fullname == "jack"
- @testing.requires.returning
+ @testing.requires.update_returning
def test_update_to_sql_expr(self):
users, User = self.tables.users, self.classes.User
@@ -169,6 +169,8 @@ class NaturalPKTest(fixtures.MappedTest):
sess.add(u1)
sess.flush()
+ # note this is the primary key, so you need UPDATE..RETURNING
+ # to catch this
u1.username = User.username + " jones"
sess.flush()
diff --git a/test/orm/test_unitofwork.py b/test/orm/test_unitofwork.py
index 39223a355..881eee4dd 100644
--- a/test/orm/test_unitofwork.py
+++ b/test/orm/test_unitofwork.py
@@ -1214,7 +1214,7 @@ class DefaultTest(fixtures.MappedTest):
session = fixture_session()
session.add(h1)
- if testing.db.dialect.implicit_returning:
+ if testing.db.dialect.insert_returning:
self.sql_count_(1, session.flush)
else:
self.sql_count_(2, session.flush)
@@ -3502,7 +3502,10 @@ class NoRowInsertedTest(fixtures.TestBase):
"""
__backend__ = True
- __requires__ = ("returning",)
+
+ # the test manipulates INSERTS to become UPDATES to simulate
+ # "INSERT that returns no row" so both are needed
+ __requires__ = ("insert_returning", "update_returning")
@testing.fixture
def null_server_default_fixture(self, registry, connection):
diff --git a/test/orm/test_unitofworkv2.py b/test/orm/test_unitofworkv2.py
index 7f4c04652..68099a7a0 100644
--- a/test/orm/test_unitofworkv2.py
+++ b/test/orm/test_unitofworkv2.py
@@ -2409,7 +2409,7 @@ class EagerDefaultsTest(fixtures.MappedTest):
s.add_all([t1, t2])
- if testing.db.dialect.implicit_returning:
+ if testing.db.dialect.insert_returning:
self.assert_sql_execution(
testing.db,
s.flush,
@@ -2469,7 +2469,7 @@ class EagerDefaultsTest(fixtures.MappedTest):
testing.db,
s.commit,
Conditional(
- testing.db.dialect.implicit_returning,
+ testing.db.dialect.insert_returning,
[
Conditional(
testing.db.dialect.insert_executemany_returning,
@@ -2541,7 +2541,7 @@ class EagerDefaultsTest(fixtures.MappedTest):
testing.db,
s.flush,
Conditional(
- testing.db.dialect.implicit_returning,
+ testing.db.dialect.update_returning,
[
CompiledSQL(
"UPDATE test2 SET foo=%(foo)s "
@@ -2633,7 +2633,7 @@ class EagerDefaultsTest(fixtures.MappedTest):
t4.foo = 8
t4.bar = text("5 + 7")
- if testing.db.dialect.implicit_returning:
+ if testing.db.dialect.update_returning:
self.assert_sql_execution(
testing.db,
s.flush,
@@ -3211,7 +3211,7 @@ class EnsureCacheTest(UOWTest):
class ORMOnlyPrimaryKeyTest(fixtures.TestBase):
@testing.requires.identity_columns
- @testing.requires.returning
+ @testing.requires.insert_returning
def test_a(self, base, run_test):
class A(base):
__tablename__ = "a"
@@ -3224,7 +3224,7 @@ class ORMOnlyPrimaryKeyTest(fixtures.TestBase):
run_test(A, A())
@testing.requires.sequences_as_server_defaults
- @testing.requires.returning
+ @testing.requires.insert_returning
def test_b(self, base, run_test):
seq = Sequence("x_seq")
diff --git a/test/orm/test_update_delete.py b/test/orm/test_update_delete.py
index 427e49e5e..22d827be9 100644
--- a/test/orm/test_update_delete.py
+++ b/test/orm/test_update_delete.py
@@ -9,6 +9,7 @@ from sqlalchemy import func
from sqlalchemy import insert
from sqlalchemy import Integer
from sqlalchemy import lambda_stmt
+from sqlalchemy import MetaData
from sqlalchemy import or_
from sqlalchemy import select
from sqlalchemy import String
@@ -56,6 +57,19 @@ class UpdateDeleteTest(fixtures.MappedTest):
Column("user_id", ForeignKey("users.id")),
)
+ m = MetaData()
+ users_no_returning = Table(
+ "users",
+ m,
+ Column(
+ "id", Integer, primary_key=True, test_needs_autoincrement=True
+ ),
+ Column("name", String(32)),
+ Column("age_int", Integer),
+ implicit_returning=False,
+ )
+ cls.tables.users_no_returning = users_no_returning
+
@classmethod
def setup_classes(cls):
class User(cls.Comparable):
@@ -64,6 +78,9 @@ class UpdateDeleteTest(fixtures.MappedTest):
class Address(cls.Comparable):
pass
+ class UserNoReturning(cls.Comparable):
+ pass
+
@classmethod
def insert_data(cls, connection):
users = cls.tables.users
@@ -96,6 +113,16 @@ class UpdateDeleteTest(fixtures.MappedTest):
)
cls.mapper_registry.map_imperatively(Address, addresses)
+ UserNoReturning = cls.classes.UserNoReturning
+ users_no_returning = cls.tables.users_no_returning
+ cls.mapper_registry.map_imperatively(
+ UserNoReturning,
+ users_no_returning,
+ properties={
+ "age": users_no_returning.c.age_int,
+ },
+ )
+
@testing.combinations("table", "mapper", "both", argnames="bind_type")
@testing.combinations(
"update", "insert", "delete", argnames="statement_type"
@@ -445,7 +472,7 @@ class UpdateDeleteTest(fixtures.MappedTest):
{"age": User.age + 10}, synchronize_session="fetch"
)
- if testing.db.dialect.full_returning:
+ if testing.db.dialect.update_returning:
asserter.assert_(
CompiledSQL(
"UPDATE users SET age_int=(users.age_int + %(age_int_1)s) "
@@ -857,8 +884,12 @@ class UpdateDeleteTest(fixtures.MappedTest):
list(zip([25, 37, 29, 27])),
)
- def test_update_fetch_returning(self):
- User = self.classes.User
+ @testing.combinations(True, False, argnames="implicit_returning")
+ def test_update_fetch_returning(self, implicit_returning):
+ if implicit_returning:
+ User = self.classes.User
+ else:
+ User = self.classes.UserNoReturning
sess = fixture_session()
@@ -873,7 +904,7 @@ class UpdateDeleteTest(fixtures.MappedTest):
# the "fetch" strategy, new in 1.4, so there is no expiry
eq_([john.age, jack.age, jill.age, jane.age], [25, 37, 29, 27])
- if testing.db.dialect.full_returning:
+ if implicit_returning and testing.db.dialect.update_returning:
asserter.assert_(
CompiledSQL(
"UPDATE users SET age_int=(users.age_int - %(age_int_1)s) "
@@ -919,7 +950,7 @@ class UpdateDeleteTest(fixtures.MappedTest):
# the "fetch" strategy, new in 1.4, so there is no expiry
eq_([john.age, jack.age, jill.age, jane.age], [25, 37, 29, 27])
- if testing.db.dialect.full_returning:
+ if testing.db.dialect.update_returning:
asserter.assert_(
CompiledSQL(
"UPDATE users SET age_int=(users.age_int - %(age_int_1)s) "
@@ -942,7 +973,7 @@ class UpdateDeleteTest(fixtures.MappedTest):
),
)
- @testing.requires.full_returning
+ @testing.requires.update_returning
def test_update_explicit_returning(self):
User = self.classes.User
@@ -974,7 +1005,7 @@ class UpdateDeleteTest(fixtures.MappedTest):
),
)
- @testing.requires.full_returning
+ @testing.requires.update_returning
def test_no_fetch_w_explicit_returning(self):
User = self.classes.User
@@ -994,8 +1025,12 @@ class UpdateDeleteTest(fixtures.MappedTest):
):
sess.execute(stmt)
- def test_delete_fetch_returning(self):
- User = self.classes.User
+ @testing.combinations(True, False, argnames="implicit_returning")
+ def test_delete_fetch_returning(self, implicit_returning):
+ if implicit_returning:
+ User = self.classes.User
+ else:
+ User = self.classes.UserNoReturning
sess = fixture_session()
@@ -1009,7 +1044,7 @@ class UpdateDeleteTest(fixtures.MappedTest):
synchronize_session="fetch"
)
- if testing.db.dialect.full_returning:
+ if implicit_returning and testing.db.dialect.delete_returning:
asserter.assert_(
CompiledSQL(
"DELETE FROM users WHERE users.age_int > %(age_int_1)s "
@@ -1054,7 +1089,7 @@ class UpdateDeleteTest(fixtures.MappedTest):
stmt, execution_options={"synchronize_session": "fetch"}
)
- if testing.db.dialect.full_returning:
+ if testing.db.dialect.delete_returning:
asserter.assert_(
CompiledSQL(
"DELETE FROM users WHERE users.age_int > %(age_int_1)s "
@@ -2148,7 +2183,7 @@ class SingleTablePolymorphicTest(fixtures.DeclarativeMappedTest):
class LoadFromReturningTest(fixtures.MappedTest):
__backend__ = True
- __requires__ = ("full_returning",)
+ __requires__ = ("insert_returning",)
@classmethod
def define_tables(cls, metadata):
@@ -2197,6 +2232,7 @@ class LoadFromReturningTest(fixtures.MappedTest):
},
)
+ @testing.requires.update_returning
def test_load_from_update(self, connection):
User = self.classes.User
diff --git a/test/orm/test_versioning.py b/test/orm/test_versioning.py
index 4898cb122..abd5833be 100644
--- a/test/orm/test_versioning.py
+++ b/test/orm/test_versioning.py
@@ -1347,6 +1347,7 @@ class InheritanceTwoVersionIdsTest(fixtures.MappedTest):
class ServerVersioningTest(fixtures.MappedTest):
run_define_tables = "each"
+
__backend__ = True
@classmethod
@@ -1432,7 +1433,7 @@ class ServerVersioningTest(fixtures.MappedTest):
lambda ctx: [{"value": "f1"}],
)
]
- if not testing.db.dialect.implicit_returning:
+ if not testing.db.dialect.insert_returning:
# DBs without implicit returning, we must immediately
# SELECT for the new version id
statements.append(
@@ -1460,34 +1461,46 @@ class ServerVersioningTest(fixtures.MappedTest):
f1.value = "f2"
- statements = [
- # note that the assertsql tests the rule against
- # "default" - on a "returning" backend, the statement
- # includes "RETURNING"
- CompiledSQL(
- "UPDATE version_table SET version_id=2, value=:value "
- "WHERE version_table.id = :version_table_id AND "
- "version_table.version_id = :version_table_version_id",
- lambda ctx: [
- {
- "version_table_id": 1,
- "version_table_version_id": 1,
- "value": "f2",
- }
- ],
- )
- ]
- if not testing.db.dialect.implicit_returning:
+ if testing.db.dialect.update_returning:
+ statements = [
+ CompiledSQL(
+ "UPDATE version_table SET version_id=2, value=:value "
+ "WHERE version_table.id = :version_table_id AND "
+ "version_table.version_id = :version_table_version_id "
+ "RETURNING version_table.version_id",
+ lambda ctx: [
+ {
+ "version_table_id": 1,
+ "version_table_version_id": 1,
+ "value": "f2",
+ }
+ ],
+ enable_returning=True,
+ )
+ ]
+ else:
# DBs without implicit returning, we must immediately
# SELECT for the new version id
- statements.append(
+ statements = [
+ CompiledSQL(
+ "UPDATE version_table SET version_id=2, value=:value "
+ "WHERE version_table.id = :version_table_id AND "
+ "version_table.version_id = :version_table_version_id",
+ lambda ctx: [
+ {
+ "version_table_id": 1,
+ "version_table_version_id": 1,
+ "value": "f2",
+ }
+ ],
+ ),
CompiledSQL(
"SELECT version_table.version_id "
"AS version_table_version_id "
"FROM version_table WHERE version_table.id = :pk_1",
lambda ctx: [{"pk_1": 1}],
- )
- )
+ ),
+ ]
with conditional_sane_rowcount_warnings(
update=True, only_returning=True
):
@@ -1512,8 +1525,9 @@ class ServerVersioningTest(fixtures.MappedTest):
eq_(f1.version_id, 2)
+ @testing.requires.sane_rowcount_w_returning
@testing.requires.updateable_autoincrement_pks
- @testing.requires.returning
+ @testing.requires.update_returning
def test_sql_expr_w_mods_bump(self):
sess = self._fixture()
@@ -1544,72 +1558,111 @@ class ServerVersioningTest(fixtures.MappedTest):
f2.value = "f2a"
f3.value = "f3a"
- statements = [
- # note that the assertsql tests the rule against
- # "default" - on a "returning" backend, the statement
- # includes "RETURNING"
- CompiledSQL(
- "UPDATE version_table SET version_id=2, value=:value "
- "WHERE version_table.id = :version_table_id AND "
- "version_table.version_id = :version_table_version_id",
- lambda ctx: [
- {
- "version_table_id": 1,
- "version_table_version_id": 1,
- "value": "f1a",
- }
- ],
- ),
- CompiledSQL(
- "UPDATE version_table SET version_id=2, value=:value "
- "WHERE version_table.id = :version_table_id AND "
- "version_table.version_id = :version_table_version_id",
- lambda ctx: [
- {
- "version_table_id": 2,
- "version_table_version_id": 1,
- "value": "f2a",
- }
- ],
- ),
- CompiledSQL(
- "UPDATE version_table SET version_id=2, value=:value "
- "WHERE version_table.id = :version_table_id AND "
- "version_table.version_id = :version_table_version_id",
- lambda ctx: [
- {
- "version_table_id": 3,
- "version_table_version_id": 1,
- "value": "f3a",
- }
- ],
- ),
- ]
- if not testing.db.dialect.implicit_returning:
- # DBs without implicit returning, we must immediately
+ if testing.db.dialect.update_returning:
+ statements = [
+ CompiledSQL(
+ "UPDATE version_table SET version_id=2, value=:value "
+ "WHERE version_table.id = :version_table_id AND "
+ "version_table.version_id = :version_table_version_id "
+ "RETURNING version_table.version_id",
+ lambda ctx: [
+ {
+ "version_table_id": 1,
+ "version_table_version_id": 1,
+ "value": "f1a",
+ }
+ ],
+ enable_returning=True,
+ ),
+ CompiledSQL(
+ "UPDATE version_table SET version_id=2, value=:value "
+ "WHERE version_table.id = :version_table_id AND "
+ "version_table.version_id = :version_table_version_id "
+ "RETURNING version_table.version_id",
+ lambda ctx: [
+ {
+ "version_table_id": 2,
+ "version_table_version_id": 1,
+ "value": "f2a",
+ }
+ ],
+ enable_returning=True,
+ ),
+ CompiledSQL(
+ "UPDATE version_table SET version_id=2, value=:value "
+ "WHERE version_table.id = :version_table_id AND "
+ "version_table.version_id = :version_table_version_id "
+ "RETURNING version_table.version_id",
+ lambda ctx: [
+ {
+ "version_table_id": 3,
+ "version_table_version_id": 1,
+ "value": "f3a",
+ }
+ ],
+ enable_returning=True,
+ ),
+ ]
+ else:
+ # DBs without update returning, we must immediately
# SELECT for the new version id
- statements.extend(
- [
- CompiledSQL(
- "SELECT version_table.version_id "
- "AS version_table_version_id "
- "FROM version_table WHERE version_table.id = :pk_1",
- lambda ctx: [{"pk_1": 1}],
- ),
- CompiledSQL(
- "SELECT version_table.version_id "
- "AS version_table_version_id "
- "FROM version_table WHERE version_table.id = :pk_1",
- lambda ctx: [{"pk_1": 2}],
- ),
- CompiledSQL(
- "SELECT version_table.version_id "
- "AS version_table_version_id "
- "FROM version_table WHERE version_table.id = :pk_1",
- lambda ctx: [{"pk_1": 3}],
- ),
- ]
- )
+ statements = [
+ CompiledSQL(
+ "UPDATE version_table SET version_id=2, value=:value "
+ "WHERE version_table.id = :version_table_id AND "
+ "version_table.version_id = :version_table_version_id",
+ lambda ctx: [
+ {
+ "version_table_id": 1,
+ "version_table_version_id": 1,
+ "value": "f1a",
+ }
+ ],
+ ),
+ CompiledSQL(
+ "UPDATE version_table SET version_id=2, value=:value "
+ "WHERE version_table.id = :version_table_id AND "
+ "version_table.version_id = :version_table_version_id",
+ lambda ctx: [
+ {
+ "version_table_id": 2,
+ "version_table_version_id": 1,
+ "value": "f2a",
+ }
+ ],
+ ),
+ CompiledSQL(
+ "UPDATE version_table SET version_id=2, value=:value "
+ "WHERE version_table.id = :version_table_id AND "
+ "version_table.version_id = :version_table_version_id",
+ lambda ctx: [
+ {
+ "version_table_id": 3,
+ "version_table_version_id": 1,
+ "value": "f3a",
+ }
+ ],
+ ),
+ CompiledSQL(
+ "SELECT version_table.version_id "
+ "AS version_table_version_id "
+ "FROM version_table WHERE version_table.id = :pk_1",
+ lambda ctx: [{"pk_1": 1}],
+ ),
+ CompiledSQL(
+ "SELECT version_table.version_id "
+ "AS version_table_version_id "
+ "FROM version_table WHERE version_table.id = :pk_1",
+ lambda ctx: [{"pk_1": 2}],
+ ),
+ CompiledSQL(
+ "SELECT version_table.version_id "
+ "AS version_table_version_id "
+ "FROM version_table WHERE version_table.id = :pk_1",
+ lambda ctx: [{"pk_1": 3}],
+ ),
+ ]
+
with conditional_sane_rowcount_warnings(
update=True, only_returning=True
):
@@ -1638,6 +1691,7 @@ class ServerVersioningTest(fixtures.MappedTest):
with conditional_sane_rowcount_warnings(delete=True):
self.assert_sql_execution(testing.db, sess.flush, *statements)
+ @testing.requires.independent_connections
@testing.requires.sane_rowcount_w_returning
def test_concurrent_mod_err_expire_on_commit(self):
sess = self._fixture()
@@ -1662,6 +1716,7 @@ class ServerVersioningTest(fixtures.MappedTest):
sess.commit,
)
+ @testing.requires.independent_connections
@testing.requires.sane_rowcount_w_returning
def test_concurrent_mod_err_noexpire_on_commit(self):
sess = self._fixture(expire_on_commit=False)
diff --git a/test/requirements.py b/test/requirements.py
index f5cbbbf8d..6870fba2f 100644
--- a/test/requirements.py
+++ b/test/requirements.py
@@ -416,7 +416,7 @@ class DefaultRequirements(SuiteRequirements):
@property
def sql_expressions_inserted_as_primary_key(self):
- return only_if([self.returning, self.sqlite])
+ return only_if([self.insert_returning, self.sqlite])
@property
def computed_columns_on_update_returning(self):
diff --git a/test/sql/test_defaults.py b/test/sql/test_defaults.py
index 0fa51e04c..08911a6c5 100644
--- a/test/sql/test_defaults.py
+++ b/test/sql/test_defaults.py
@@ -870,7 +870,7 @@ class DefaultRoundTripTest(fixtures.TablesTest):
class CTEDefaultTest(fixtures.TablesTest):
- __requires__ = ("ctes", "returning", "ctes_on_dml")
+ __requires__ = ("ctes", "insert_returning", "ctes_on_dml")
__backend__ = True
@classmethod
@@ -993,8 +993,11 @@ class PKDefaultTest(fixtures.TestBase):
return go
+ @testing.crashes(
+ "+mariadbconnector", "https://jira.mariadb.org/browse/CONPY-206"
+ )
@testing.combinations(
- (True, testing.requires.returning),
+ (True, testing.requires.insert_returning),
(False,),
argnames="implicit_returning",
)
@@ -1278,7 +1281,7 @@ class SpecialTypePKTest(fixtures.TestBase):
# we don't pre-fetch 'server_default'.
if "server_default" in kw and (
- not testing.db.dialect.implicit_returning
+ not testing.db.dialect.insert_returning
or not implicit_returning
):
eq_(r.inserted_primary_key, (None,))
@@ -1321,15 +1324,18 @@ class SpecialTypePKTest(fixtures.TestBase):
def test_server_default_no_autoincrement(self):
self._run_test(server_default="1", autoincrement=False)
+ @testing.crashes(
+ "+mariadbconnector", "https://jira.mariadb.org/browse/CONPY-206"
+ )
def test_clause(self):
stmt = select(cast("INT_1", type_=self.MyInteger)).scalar_subquery()
self._run_test(default=stmt)
- @testing.requires.returning
+ @testing.requires.insert_returning
def test_no_implicit_returning(self):
self._run_test(implicit_returning=False)
- @testing.requires.returning
+ @testing.requires.insert_returning
def test_server_default_no_implicit_returning(self):
self._run_test(server_default="1", autoincrement=False)
@@ -1363,7 +1369,7 @@ class ServerDefaultsOnPKTest(fixtures.TestBase):
eq_(r.inserted_primary_key, (None,))
eq_(list(connection.execute(t.select())), [("key_one", "data")])
- @testing.requires.returning
+ @testing.requires.insert_returning
@testing.provide_metadata
def test_string_default_on_insert_with_returning(self, connection):
"""With implicit_returning, we get a string PK default back no
@@ -1441,8 +1447,9 @@ class ServerDefaultsOnPKTest(fixtures.TestBase):
else:
eq_(list(connection.execute(t2.select())), [(5, "data")])
- @testing.requires.returning
+ @testing.requires.insert_returning
@testing.provide_metadata
+ @testing.fails_on("sqlite", "sqlite doesn't like our default trick here")
def test_int_default_on_insert_with_returning(self, connection):
metadata = self.metadata
t = Table(
diff --git a/test/sql/test_insert.py b/test/sql/test_insert.py
index 3a6217f67..808b047a2 100644
--- a/test/sql/test_insert.py
+++ b/test/sql/test_insert.py
@@ -332,10 +332,10 @@ class InsertTest(_InsertTestBase, fixtures.TablesTest, AssertsCompiledSQL):
table1 = self.tables.mytable
stmt = table1.insert().returning(table1.c.myid)
- assert_raises_message(
- exc.CompileError,
- "RETURNING is not supported by this dialect's statement compiler.",
- stmt.compile,
+ self.assert_compile(
+ stmt,
+ "INSERT INTO mytable (myid, name, description) "
+ "VALUES (:myid, :name, :description) RETURNING mytable.myid",
dialect=default.DefaultDialect(),
)
@@ -1028,7 +1028,7 @@ class InsertImplicitReturningTest(
Column("q", Integer),
)
- dialect = postgresql.dialect(implicit_returning=True)
+ dialect = postgresql.dialect()
dialect.insert_null_pk_still_autoincrements = (
insert_null_still_autoincrements
)
diff --git a/test/sql/test_insert_exec.py b/test/sql/test_insert_exec.py
index 45f4098b2..3e51e9450 100644
--- a/test/sql/test_insert_exec.py
+++ b/test/sql/test_insert_exec.py
@@ -100,8 +100,9 @@ class InsertExecTest(fixtures.TablesTest):
# verify implicit_returning is working
if (
- connection.dialect.implicit_returning
+ connection.dialect.insert_returning
and table_.implicit_returning
+ and not connection.dialect.postfetch_lastrowid
):
ins = table_.insert()
comp = ins.compile(connection, column_keys=list(values))
@@ -146,7 +147,7 @@ class InsertExecTest(fixtures.TablesTest):
@testing.requires.supports_autoincrement_w_composite_pk
@testing.combinations(
- (True, testing.requires.returning),
+ (True, testing.requires.insert_returning),
(False,),
argnames="implicit_returning",
)
@@ -173,7 +174,7 @@ class InsertExecTest(fixtures.TablesTest):
@testing.requires.supports_autoincrement_w_composite_pk
@testing.combinations(
- (True, testing.requires.returning),
+ (True, testing.requires.insert_returning),
(False,),
argnames="implicit_returning",
)
@@ -200,7 +201,7 @@ class InsertExecTest(fixtures.TablesTest):
)
@testing.combinations(
- (True, testing.requires.returning),
+ (True, testing.requires.insert_returning),
(False,),
argnames="implicit_returning",
)
@@ -223,7 +224,7 @@ class InsertExecTest(fixtures.TablesTest):
@testing.requires.sequences
@testing.combinations(
- (True, testing.requires.returning),
+ (True, testing.requires.insert_returning),
(False,),
argnames="implicit_returning",
)
@@ -251,7 +252,7 @@ class InsertExecTest(fixtures.TablesTest):
@testing.requires.sequences
@testing.combinations(
- (True, testing.requires.returning),
+ (True, testing.requires.insert_returning),
(False,),
argnames="implicit_returning",
)
@@ -277,7 +278,7 @@ class InsertExecTest(fixtures.TablesTest):
)
@testing.combinations(
- (True, testing.requires.returning),
+ (True, testing.requires.insert_returning),
(False,),
argnames="implicit_returning",
)
@@ -299,7 +300,7 @@ class InsertExecTest(fixtures.TablesTest):
@testing.requires.supports_autoincrement_w_composite_pk
@testing.combinations(
- (True, testing.requires.returning),
+ (True, testing.requires.insert_returning),
(False,),
argnames="implicit_returning",
)
@@ -338,6 +339,7 @@ class InsertExecTest(fixtures.TablesTest):
self.metadata,
Column("x", Integer, primary_key=True),
Column("y", Integer),
+ implicit_returning=False,
)
t.create(connection)
with mock.patch.object(
@@ -403,12 +405,16 @@ class InsertExecTest(fixtures.TablesTest):
eq_(r.inserted_primary_key, (None,))
@testing.requires.empty_inserts
- @testing.requires.returning
- def test_no_inserted_pk_on_returning(self, connection):
+ @testing.requires.insert_returning
+ def test_no_inserted_pk_on_returning(
+ self, connection, close_result_when_finished
+ ):
users = self.tables.users
result = connection.execute(
users.insert().returning(users.c.user_id, users.c.user_name)
)
+ close_result_when_finished(result)
+
assert_raises_message(
exc.InvalidRequestError,
r"Can't call inserted_primary_key when returning\(\) is used.",
@@ -566,7 +572,7 @@ class TableInsertTest(fixtures.TablesTest):
inserted_primary_key=(1,),
)
- @testing.requires.returning
+ @testing.requires.insert_returning
def test_uppercase_direct_params_returning(self, connection):
t = self.tables.foo
self._test(
@@ -599,7 +605,7 @@ class TableInsertTest(fixtures.TablesTest):
inserted_primary_key=(),
)
- @testing.requires.returning
+ @testing.requires.insert_returning
def test_direct_params_returning(self, connection):
t = self._fixture()
self._test(
diff --git a/test/sql/test_returning.py b/test/sql/test_returning.py
index bacdbaf3f..c458e3262 100644
--- a/test/sql/test_returning.py
+++ b/test/sql/test_returning.py
@@ -199,8 +199,8 @@ class ReturnCombinationTests(fixtures.TestBase, AssertsCompiledSQL):
)
-class ReturningTest(fixtures.TablesTest, AssertsExecutionResults):
- __requires__ = ("returning",)
+class InsertReturningTest(fixtures.TablesTest, AssertsExecutionResults):
+ __requires__ = ("insert_returning",)
__backend__ = True
run_create_tables = "each"
@@ -286,26 +286,6 @@ class ReturningTest(fixtures.TablesTest, AssertsExecutionResults):
row = result.first()
eq_(row[0], 30)
- def test_update_returning(self, connection):
- table = self.tables.tables
- connection.execute(
- table.insert(),
- [{"persons": 5, "full": False}, {"persons": 3, "full": False}],
- )
-
- result = connection.execute(
- table.update()
- .values(dict(full=True))
- .where(table.c.persons > 4)
- .returning(table.c.id)
- )
- eq_(result.fetchall(), [(1,)])
-
- result2 = connection.execute(
- select(table.c.id, table.c.full).order_by(table.c.id)
- )
- eq_(result2.fetchall(), [(1, True), (2, False)])
-
@testing.fails_on(
"mssql",
"driver has unknown issue with string concatenation "
@@ -339,6 +319,94 @@ class ReturningTest(fixtures.TablesTest, AssertsExecutionResults):
)
eq_(result2.fetchall(), [(1, "FOOsomegoofyBAR")])
+ def test_no_ipk_on_returning(self, connection, close_result_when_finished):
+ table = self.tables.tables
+ result = connection.execute(
+ table.insert().returning(table.c.id), {"persons": 1, "full": False}
+ )
+ close_result_when_finished(result)
+ assert_raises_message(
+ sa_exc.InvalidRequestError,
+ r"Can't call inserted_primary_key when returning\(\) is used.",
+ getattr,
+ result,
+ "inserted_primary_key",
+ )
+
+ def test_insert_returning(self, connection):
+ table = self.tables.tables
+ result = connection.execute(
+ table.insert().returning(table.c.id), {"persons": 1, "full": False}
+ )
+
+ eq_(result.fetchall(), [(1,)])
+
+ @testing.requires.multivalues_inserts
+ def test_multirow_returning(self, connection):
+ table = self.tables.tables
+ ins = (
+ table.insert()
+ .returning(table.c.id, table.c.persons)
+ .values(
+ [
+ {"persons": 1, "full": False},
+ {"persons": 2, "full": True},
+ {"persons": 3, "full": False},
+ ]
+ )
+ )
+ result = connection.execute(ins)
+ eq_(result.fetchall(), [(1, 1), (2, 2), (3, 3)])
+
+ @testing.fails_on_everything_except(
+ "postgresql", "mariadb>=10.5", "sqlite>=3.34"
+ )
+ def test_literal_returning(self, connection):
+ if testing.against("mariadb"):
+ quote = "`"
+ else:
+ quote = '"'
+ if testing.against("postgresql"):
+ literal_true = "true"
+ else:
+ literal_true = "1"
+
+ result4 = connection.exec_driver_sql(
+ "insert into tables (id, persons, %sfull%s) "
+ "values (5, 10, %s) returning persons"
+ % (quote, quote, literal_true)
+ )
+ eq_([dict(row._mapping) for row in result4], [{"persons": 10}])
+
+
+class UpdateReturningTest(fixtures.TablesTest, AssertsExecutionResults):
+ __requires__ = ("update_returning",)
+ __backend__ = True
+
+ run_create_tables = "each"
+
+ define_tables = InsertReturningTest.define_tables
+
+ def test_update_returning(self, connection):
+ table = self.tables.tables
+ connection.execute(
+ table.insert(),
+ [{"persons": 5, "full": False}, {"persons": 3, "full": False}],
+ )
+
+ result = connection.execute(
+ table.update()
+ .values(dict(full=True))
+ .where(table.c.persons > 4)
+ .returning(table.c.id)
+ )
+ eq_(result.fetchall(), [(1,)])
+
+ result2 = connection.execute(
+ select(table.c.id, table.c.full).order_by(table.c.id)
+ )
+ eq_(result2.fetchall(), [(1, True), (2, False)])
+
def test_update_returning_w_expression_one(self, connection):
table = self.tables.tables
connection.execute(
@@ -388,7 +456,6 @@ class ReturningTest(fixtures.TablesTest, AssertsExecutionResults):
[(1, "FOOnewgoofyBAR"), (2, "FOOsomegoofy2BAR")],
)
- @testing.requires.full_returning
def test_update_full_returning(self, connection):
table = self.tables.tables
connection.execute(
@@ -404,69 +471,14 @@ class ReturningTest(fixtures.TablesTest, AssertsExecutionResults):
)
eq_(result.fetchall(), [(1, True), (2, True)])
- @testing.requires.full_returning
- def test_delete_full_returning(self, connection):
- table = self.tables.tables
- connection.execute(
- table.insert(),
- [{"persons": 5, "full": False}, {"persons": 3, "full": False}],
- )
-
- result = connection.execute(
- table.delete().returning(table.c.id, table.c.full)
- )
- eq_(result.fetchall(), [(1, False), (2, False)])
-
- def test_insert_returning(self, connection):
- table = self.tables.tables
- result = connection.execute(
- table.insert().returning(table.c.id), {"persons": 1, "full": False}
- )
- eq_(result.fetchall(), [(1,)])
-
- @testing.requires.multivalues_inserts
- def test_multirow_returning(self, connection):
- table = self.tables.tables
- ins = (
- table.insert()
- .returning(table.c.id, table.c.persons)
- .values(
- [
- {"persons": 1, "full": False},
- {"persons": 2, "full": True},
- {"persons": 3, "full": False},
- ]
- )
- )
- result = connection.execute(ins)
- eq_(result.fetchall(), [(1, 1), (2, 2), (3, 3)])
-
- def test_no_ipk_on_returning(self, connection):
- table = self.tables.tables
- result = connection.execute(
- table.insert().returning(table.c.id), {"persons": 1, "full": False}
- )
- assert_raises_message(
- sa_exc.InvalidRequestError,
- r"Can't call inserted_primary_key when returning\(\) is used.",
- getattr,
- result,
- "inserted_primary_key",
- )
+class DeleteReturningTest(fixtures.TablesTest, AssertsExecutionResults):
+ __requires__ = ("delete_returning",)
+ __backend__ = True
- @testing.fails_on_everything_except("postgresql")
- def test_literal_returning(self, connection):
- if testing.against("postgresql"):
- literal_true = "true"
- else:
- literal_true = "1"
+ run_create_tables = "each"
- result4 = connection.exec_driver_sql(
- 'insert into tables (id, persons, "full") '
- "values (5, 10, %s) returning persons" % literal_true
- )
- eq_([dict(row._mapping) for row in result4], [{"persons": 10}])
+ define_tables = InsertReturningTest.define_tables
def test_delete_returning(self, connection):
table = self.tables.tables
@@ -487,7 +499,7 @@ class ReturningTest(fixtures.TablesTest, AssertsExecutionResults):
class CompositeStatementTest(fixtures.TestBase):
- __requires__ = ("returning",)
+ __requires__ = ("insert_returning",)
__backend__ = True
@testing.provide_metadata
@@ -517,7 +529,7 @@ class CompositeStatementTest(fixtures.TestBase):
class SequenceReturningTest(fixtures.TablesTest):
- __requires__ = "returning", "sequences"
+ __requires__ = "insert_returning", "sequences"
__backend__ = True
@classmethod
@@ -552,7 +564,7 @@ class KeyReturningTest(fixtures.TablesTest, AssertsExecutionResults):
"""test returning() works with columns that define 'key'."""
- __requires__ = ("returning",)
+ __requires__ = ("insert_returning",)
__backend__ = True
@classmethod
@@ -583,8 +595,8 @@ class KeyReturningTest(fixtures.TablesTest, AssertsExecutionResults):
assert row[table.c.foo_id] == row["id"] == 1
-class ReturnDefaultsTest(fixtures.TablesTest):
- __requires__ = ("returning",)
+class InsertReturnDefaultsTest(fixtures.TablesTest):
+ __requires__ = ("insert_returning",)
run_define_tables = "each"
__backend__ = True
@@ -639,67 +651,99 @@ class ReturnDefaultsTest(fixtures.TablesTest):
[1, 0],
)
- def test_chained_update_pk(self, connection):
+ def test_insert_non_default(self, connection):
+ """test that a column not marked at all as a
+ default works with this feature."""
+
t1 = self.tables.t1
- connection.execute(t1.insert().values(upddef=1))
result = connection.execute(
- t1.update().values(data="d1").return_defaults(t1.c.upddef)
+ t1.insert().values(upddef=1).return_defaults(t1.c.data)
)
eq_(
- [result.returned_defaults._mapping[k] for k in (t1.c.upddef,)], [1]
+ [
+ result.returned_defaults._mapping[k]
+ for k in (t1.c.id, t1.c.data)
+ ],
+ [1, None],
)
- def test_arg_update_pk(self, connection):
+ def test_insert_sql_expr(self, connection):
+ from sqlalchemy import literal
+
t1 = self.tables.t1
- connection.execute(t1.insert().values(upddef=1))
result = connection.execute(
- t1.update().return_defaults(t1.c.upddef).values(data="d1")
+ t1.insert().return_defaults().values(insdef=literal(10) + 5)
)
+
eq_(
- [result.returned_defaults._mapping[k] for k in (t1.c.upddef,)], [1]
+ result.returned_defaults._mapping,
+ {"id": 1, "data": None, "insdef": 15, "upddef": None},
)
- def test_insert_non_default(self, connection):
- """test that a column not marked at all as a
- default works with this feature."""
+ def test_insert_non_default_plus_default(self, connection):
+ t1 = self.tables.t1
+ result = connection.execute(
+ t1.insert()
+ .values(upddef=1)
+ .return_defaults(t1.c.data, t1.c.insdef)
+ )
+ eq_(
+ dict(result.returned_defaults._mapping),
+ {"id": 1, "data": None, "insdef": 0},
+ )
+ eq_(result.inserted_primary_key, (1,))
+ def test_insert_all(self, connection):
t1 = self.tables.t1
result = connection.execute(
- t1.insert().values(upddef=1).return_defaults(t1.c.data)
+ t1.insert().values(upddef=1).return_defaults()
)
eq_(
- [
- result.returned_defaults._mapping[k]
- for k in (t1.c.id, t1.c.data)
- ],
- [1, None],
+ dict(result.returned_defaults._mapping),
+ {"id": 1, "data": None, "insdef": 0},
)
+ eq_(result.inserted_primary_key, (1,))
- def test_update_non_default(self, connection):
- """test that a column not marked at all as a
- default works with this feature."""
+class UpdatedReturnDefaultsTest(fixtures.TablesTest):
+ __requires__ = ("update_returning",)
+ run_define_tables = "each"
+ __backend__ = True
+
+ define_tables = InsertReturnDefaultsTest.define_tables
+
+ def test_chained_update_pk(self, connection):
t1 = self.tables.t1
connection.execute(t1.insert().values(upddef=1))
result = connection.execute(
- t1.update().values(upddef=2).return_defaults(t1.c.data)
+ t1.update().values(data="d1").return_defaults(t1.c.upddef)
)
eq_(
- [result.returned_defaults._mapping[k] for k in (t1.c.data,)],
- [None],
+ [result.returned_defaults._mapping[k] for k in (t1.c.upddef,)], [1]
)
- def test_insert_sql_expr(self, connection):
- from sqlalchemy import literal
-
+ def test_arg_update_pk(self, connection):
t1 = self.tables.t1
+ connection.execute(t1.insert().values(upddef=1))
result = connection.execute(
- t1.insert().return_defaults().values(insdef=literal(10) + 5)
+ t1.update().return_defaults(t1.c.upddef).values(data="d1")
)
+ eq_(
+ [result.returned_defaults._mapping[k] for k in (t1.c.upddef,)], [1]
+ )
+
+ def test_update_non_default(self, connection):
+ """test that a column not marked at all as a
+ default works with this feature."""
+ t1 = self.tables.t1
+ connection.execute(t1.insert().values(upddef=1))
+ result = connection.execute(
+ t1.update().values(upddef=2).return_defaults(t1.c.data)
+ )
eq_(
- result.returned_defaults._mapping,
- {"id": 1, "data": None, "insdef": 15, "upddef": None},
+ [result.returned_defaults._mapping[k] for k in (t1.c.data,)],
+ [None],
)
def test_update_sql_expr(self, connection):
@@ -713,19 +757,6 @@ class ReturnDefaultsTest(fixtures.TablesTest):
eq_(result.returned_defaults._mapping, {"upddef": 15})
- def test_insert_non_default_plus_default(self, connection):
- t1 = self.tables.t1
- result = connection.execute(
- t1.insert()
- .values(upddef=1)
- .return_defaults(t1.c.data, t1.c.insdef)
- )
- eq_(
- dict(result.returned_defaults._mapping),
- {"id": 1, "data": None, "insdef": 0},
- )
- eq_(result.inserted_primary_key, (1,))
-
def test_update_non_default_plus_default(self, connection):
t1 = self.tables.t1
connection.execute(t1.insert().values(upddef=1))
@@ -739,17 +770,6 @@ class ReturnDefaultsTest(fixtures.TablesTest):
{"data": None, "upddef": 1},
)
- def test_insert_all(self, connection):
- t1 = self.tables.t1
- result = connection.execute(
- t1.insert().values(upddef=1).return_defaults()
- )
- eq_(
- dict(result.returned_defaults._mapping),
- {"id": 1, "data": None, "insdef": 0},
- )
- eq_(result.inserted_primary_key, (1,))
-
def test_update_all(self, connection):
t1 = self.tables.t1
connection.execute(t1.insert().values(upddef=1))
@@ -758,7 +778,14 @@ class ReturnDefaultsTest(fixtures.TablesTest):
)
eq_(dict(result.returned_defaults._mapping), {"upddef": 1})
- @testing.requires.insert_executemany_returning
+
+class InsertManyReturnDefaultsTest(fixtures.TablesTest):
+ __requires__ = ("insert_executemany_returning",)
+ run_define_tables = "each"
+ __backend__ = True
+
+ define_tables = InsertReturnDefaultsTest.define_tables
+
def test_insert_executemany_no_defaults_passed(self, connection):
t1 = self.tables.t1
result = connection.execute(
@@ -802,7 +829,6 @@ class ReturnDefaultsTest(fixtures.TablesTest):
lambda: result.inserted_primary_key,
)
- @testing.requires.insert_executemany_returning
def test_insert_executemany_insdefault_passed(self, connection):
t1 = self.tables.t1
result = connection.execute(
@@ -846,7 +872,6 @@ class ReturnDefaultsTest(fixtures.TablesTest):
lambda: result.inserted_primary_key,
)
- @testing.requires.insert_executemany_returning
def test_insert_executemany_only_pk_passed(self, connection):
t1 = self.tables.t1
result = connection.execute(
diff --git a/test/sql/test_sequences.py b/test/sql/test_sequences.py
index be74153ce..19f95c661 100644
--- a/test/sql/test_sequences.py
+++ b/test/sql/test_sequences.py
@@ -218,9 +218,15 @@ class SequenceExecTest(fixtures.TestBase):
@testing.combinations(
("implicit_returning",),
("no_implicit_returning",),
- ("explicit_returning", testing.requires.returning),
- ("return_defaults_no_implicit_returning", testing.requires.returning),
- ("return_defaults_implicit_returning", testing.requires.returning),
+ ("explicit_returning", testing.requires.insert_returning),
+ (
+ "return_defaults_no_implicit_returning",
+ testing.requires.insert_returning,
+ ),
+ (
+ "return_defaults_implicit_returning",
+ testing.requires.insert_returning,
+ ),
argnames="returning",
)
@testing.requires.multivalues_inserts
@@ -264,17 +270,17 @@ class SequenceExecTest(fixtures.TestBase):
("no_implicit_returning",),
(
"explicit_returning",
- testing.requires.returning
+ testing.requires.insert_returning
+ testing.requires.insert_executemany_returning,
),
(
"return_defaults_no_implicit_returning",
- testing.requires.returning
+ testing.requires.insert_returning
+ testing.requires.insert_executemany_returning,
),
(
"return_defaults_implicit_returning",
- testing.requires.returning
+ testing.requires.insert_returning
+ testing.requires.insert_executemany_returning,
),
argnames="returning",
@@ -318,7 +324,7 @@ class SequenceExecTest(fixtures.TestBase):
[(1, "d1"), (2, "d2"), (3, "d3")],
)
- @testing.requires.returning
+ @testing.requires.insert_returning
def test_inserted_pk_implicit_returning(self, connection, metadata):
"""test inserted_primary_key contains the result when
pk_col=next_value(), when implicit returning is used."""
@@ -435,7 +441,7 @@ class SequenceTest(fixtures.TestBase, testing.AssertsCompiledSQL):
assert not self._has_sequence(connection, "s1")
assert not self._has_sequence(connection, "s2")
- @testing.requires.returning
+ @testing.requires.insert_returning
@testing.requires.supports_sequence_for_autoincrement_column
@testing.provide_metadata
def test_freestanding_sequence_via_autoinc(self, connection):
@@ -545,7 +551,7 @@ class TableBoundSequenceTest(fixtures.TablesTest):
return go
@testing.combinations(
- (True, testing.requires.returning),
+ (True, testing.requires.insert_returning),
(False,),
argnames="implicit_returning",
)
@@ -571,7 +577,7 @@ class TableBoundSequenceTest(fixtures.TablesTest):
)
@testing.combinations(
- (True, testing.requires.returning),
+ (True, testing.requires.insert_returning),
(False,),
argnames="implicit_returning",
)
diff --git a/test/sql/test_type_expressions.py b/test/sql/test_type_expressions.py
index 70c8839e3..901be7132 100644
--- a/test/sql/test_type_expressions.py
+++ b/test/sql/test_type_expressions.py
@@ -496,7 +496,7 @@ class TypeDecRoundTripTest(fixtures.TablesTest, RoundTripTestBase):
class ReturningTest(fixtures.TablesTest):
- __requires__ = ("returning",)
+ __requires__ = ("insert_returning",)
@classmethod
def define_tables(cls, metadata):