diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-12-28 12:04:07 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2022-12-28 14:24:29 -0500 |
commit | 510caee2e68d8665577d67bbc4afda7bbca31f9f (patch) | |
tree | 0958619986859d414f5cf5f928f7e1d55a7c87b2 /test/sql/test_external_traversal.py | |
parent | 9b879cee072e112f43f70c5b42df4577798a6eb5 (diff) | |
download | sqlalchemy-510caee2e68d8665577d67bbc4afda7bbca31f9f.tar.gz |
ensure whereclause, returning copied as tuples
Fixed issue in the internal SQL traversal for DML statements like
:class:`_dml.Update` and :class:`_dml.Delete` which would cause among other
potential issues, a specific issue using lambda statements with the ORM
update/delete feature.
Fixes: #9033
Change-Id: I76428049cb767ba302fbea89555114bf63ab8687
(cherry picked from commit e68173bf7d296b2948abed06f79c7cbd0ab66b0d)
Diffstat (limited to 'test/sql/test_external_traversal.py')
-rw-r--r-- | test/sql/test_external_traversal.py | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/test/sql/test_external_traversal.py b/test/sql/test_external_traversal.py index 37363273b..7a058bfcd 100644 --- a/test/sql/test_external_traversal.py +++ b/test/sql/test_external_traversal.py @@ -2693,7 +2693,7 @@ class ValuesBaseTest(fixtures.TestBase, AssertsCompiledSQL): """Tests the generative capability of Insert, Update""" - __dialect__ = "default" + __dialect__ = "default_enhanced" # fixme: consolidate converage from elsewhere here and expand @@ -2935,3 +2935,41 @@ class ValuesBaseTest(fixtures.TestBase, AssertsCompiledSQL): "UPDATE construct does not support multiple parameter sets.", stmt.compile, ) + + @testing.variation("stmt_type", ["update", "delete"]) + def test_whereclause_returning_adapted(self, stmt_type): + """test #9033""" + + if stmt_type.update: + stmt = ( + t1.update() + .where(t1.c.col1 == 10) + .values(col1=15) + .returning(t1.c.col1) + ) + elif stmt_type.delete: + stmt = t1.delete().where(t1.c.col1 == 10).returning(t1.c.col1) + else: + stmt_type.fail() + + stmt = visitors.replacement_traverse(stmt, {}, lambda elem: None) + + assert isinstance(stmt._where_criteria, tuple) + assert isinstance(stmt._returning, tuple) + + stmt = stmt.where(t1.c.col2 == 5).returning(t1.c.col2) + + if stmt_type.update: + self.assert_compile( + stmt, + "UPDATE table1 SET col1=:col1 WHERE table1.col1 = :col1_1 " + "AND table1.col2 = :col2_1 RETURNING table1.col1, table1.col2", + ) + elif stmt_type.delete: + self.assert_compile( + stmt, + "DELETE FROM table1 WHERE table1.col1 = :col1_1 " + "AND table1.col2 = :col2_1 RETURNING table1.col1, table1.col2", + ) + else: + stmt_type.fail() |