summaryrefslogtreecommitdiff
path: root/test/sql/test_insert.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2022-08-02 16:18:18 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2022-08-05 10:07:15 -0400
commit82a1d4096fbfe94e2fa626d65d5c3beb2c6afa37 (patch)
treebaca62a1a0784f192e65402f824319b0403c6847 /test/sql/test_insert.py
parent0027b3a4bc54599ac8102a4a3d81d8007738903e (diff)
downloadsqlalchemy-82a1d4096fbfe94e2fa626d65d5c3beb2c6afa37.tar.gz
include column.default, column.onupdate in eager_defaults
Fixed bug in the behavior of the :paramref:`_orm.Mapper.eager_defaults` parameter such that client-side SQL default or onupdate expressions in the table definition alone will trigger a fetch operation using RETURNING or SELECT when the ORM emits an INSERT or UPDATE for the row. Previously, only server side defaults established as part of table DDL and/or server-side onupdate expressions would trigger this fetch, even though client-side SQL expressions would be included when the fetch was rendered. Fixes: #7438 Change-Id: Iba719298ba4a26d185edec97ba77d2d54585e5a4
Diffstat (limited to 'test/sql/test_insert.py')
-rw-r--r--test/sql/test_insert.py27
1 files changed, 27 insertions, 0 deletions
diff --git a/test/sql/test_insert.py b/test/sql/test_insert.py
index 071f595f3..61e0783e4 100644
--- a/test/sql/test_insert.py
+++ b/test/sql/test_insert.py
@@ -1,4 +1,7 @@
#! coding:utf-8
+from __future__ import annotations
+
+from typing import Tuple
from sqlalchemy import bindparam
from sqlalchemy import Column
@@ -66,6 +69,30 @@ class _InsertTestBase:
class InsertTest(_InsertTestBase, fixtures.TablesTest, AssertsCompiledSQL):
__dialect__ = "default"
+ @testing.combinations(
+ ((), ("z",), ()),
+ (("x",), (), ()),
+ (("x",), ("y",), ("x", "y")),
+ (("x", "y"), ("y",), ("x", "y")),
+ )
+ def test_return_defaults_generative(
+ self,
+ initial_keys: Tuple[str, ...],
+ second_keys: Tuple[str, ...],
+ expected_keys: Tuple[str, ...],
+ ):
+ t = table("foo", column("x"), column("y"), column("z"))
+
+ initial_cols = tuple(t.c[initial_keys])
+ second_cols = tuple(t.c[second_keys])
+ expected = set(t.c[expected_keys])
+
+ stmt = t.insert().return_defaults(*initial_cols)
+ eq_(stmt._return_defaults_columns, initial_cols)
+ stmt = stmt.return_defaults(*second_cols)
+ assert isinstance(stmt._return_defaults_columns, tuple)
+ eq_(set(stmt._return_defaults_columns), expected)
+
def test_binds_that_match_columns(self):
"""test bind params named after column names
replace the normal SET/VALUES generation."""