diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2020-09-29 14:17:42 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2020-09-29 16:46:56 -0400 |
| commit | f483573aa640efb79e8b1ec6c1faac6f79d9d8fe (patch) | |
| tree | d53426d5ca4424647c0bd711c8ce0c5e548e4fe0 /test/sql | |
| parent | 147f0969301184b952366f39195caaabe6d63dbf (diff) | |
| download | sqlalchemy-f483573aa640efb79e8b1ec6c1faac6f79d9d8fe.tar.gz | |
Scan for tables without relying upon whereclause
Fixed bug where an UPDATE statement against a JOIN using MySQL multi-table
format would fail to include the table prefix for the target table if the
statement had no WHERE clause, as only the WHERE clause were scanned to
detect a "multi table update" at that particular point. The target
is now also scanned if it's a JOIN to get the leftmost table as the
primary table and the additional entries as additional FROM entries.
Fixes: #5617
Change-Id: I26d74afebe06e28af28acf960258f170a1627823
Diffstat (limited to 'test/sql')
| -rw-r--r-- | test/sql/test_update.py | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/test/sql/test_update.py b/test/sql/test_update.py index 201e6c64f..ec96af207 100644 --- a/test/sql/test_update.py +++ b/test/sql/test_update.py @@ -1016,7 +1016,7 @@ class UpdateFromCompileTest( dialect="mysql", ) - def test_update_from_join_mysql(self): + def test_update_from_join_mysql_whereclause(self): users, addresses = self.tables.users, self.tables.addresses j = users.join(addresses) @@ -1034,6 +1034,73 @@ class UpdateFromCompileTest( dialect=mysql.dialect(), ) + def test_update_from_join_mysql_no_whereclause_one(self): + users, addresses = self.tables.users, self.tables.addresses + + j = users.join(addresses) + self.assert_compile( + update(j).values(name="newname"), + "" + "UPDATE users " + "INNER JOIN addresses ON users.id = addresses.user_id " + "SET users.name=%s", + checkparams={"name": "newname"}, + dialect=mysql.dialect(), + ) + + def test_update_from_join_mysql_no_whereclause_two(self): + users, addresses = self.tables.users, self.tables.addresses + + j = users.join(addresses) + self.assert_compile( + update(j).values({users.c.name: addresses.c.email_address}), + "" + "UPDATE users " + "INNER JOIN addresses ON users.id = addresses.user_id " + "SET users.name=addresses.email_address", + checkparams={}, + dialect=mysql.dialect(), + ) + + def test_update_from_join_mysql_no_whereclause_three(self): + users, addresses, dingalings = ( + self.tables.users, + self.tables.addresses, + self.tables.dingalings, + ) + + j = users.join(addresses).join(dingalings) + self.assert_compile( + update(j).values({users.c.name: dingalings.c.id}), + "" + "UPDATE users " + "INNER JOIN addresses ON users.id = addresses.user_id " + "INNER JOIN dingalings ON addresses.id = dingalings.address_id " + "SET users.name=dingalings.id", + checkparams={}, + dialect=mysql.dialect(), + ) + + def test_update_from_join_mysql_no_whereclause_four(self): + users, addresses, dingalings = ( + self.tables.users, + self.tables.addresses, + self.tables.dingalings, + ) + + j = users.join(addresses).join(dingalings) + + self.assert_compile( + update(j).values(name="foo"), + "" + "UPDATE users " + "INNER JOIN addresses ON users.id = addresses.user_id " + "INNER JOIN dingalings ON addresses.id = dingalings.address_id " + "SET users.name=%s", + checkparams={"name": "foo"}, + dialect=mysql.dialect(), + ) + def test_render_table(self): users, addresses = self.tables.users, self.tables.addresses |
