From 82a1d4096fbfe94e2fa626d65d5c3beb2c6afa37 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Tue, 2 Aug 2022 16:18:18 -0400 Subject: 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 --- test/sql/test_insert.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'test/sql') 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.""" -- cgit v1.2.1