diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-10-13 20:33:24 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-10-14 12:51:14 -0400 |
| commit | 41dc71ad2fc1963a44e5f308f53aed6b8d7d662a (patch) | |
| tree | fb678b21f16469e591326511530bb1cec6e57772 /test/sql/test_update.py | |
| parent | 8a55fb6017b01c5b7503be2bedfa82b9663f8a94 (diff) | |
| download | sqlalchemy-41dc71ad2fc1963a44e5f308f53aed6b8d7d662a.tar.gz | |
Use separate label generator for column_label naming convention
Fixed bug where a table that would have a column label overlap with a plain
column name, such as "foo.id AS foo_id" vs. "foo.foo_id", would prematurely
generate the ``._label`` attribute for a column before this overlap could
be detected due to the use of the ``index=True`` or ``unique=True`` flag on
the column in conjunction with the default naming convention of
``"column_0_label"``. This would then lead to failures when ``._label``
were used later to generate a bound parameter name, in particular those
used by the ORM when generating the WHERE clause for an UPDATE statement.
The issue has been fixed by using an alternate ``._label`` accessor for DDL
generation that does not affect the state of the :class:`.Column`. The
accessor also bypasses the key-deduplication step as it is not necessary
for DDL, the naming is now consistently ``"<tablename>_<columnname>"``
without any subsequent numeric symbols when used in DDL.
Fixes: #4911
Change-Id: Iabf5fd3250738d800d6e41a2a3a27a7ce2405e7d
Diffstat (limited to 'test/sql/test_update.py')
| -rw-r--r-- | test/sql/test_update.py | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/test/sql/test_update.py b/test/sql/test_update.py index 9309ca45a..e625b7d9c 100644 --- a/test/sql/test_update.py +++ b/test/sql/test_update.py @@ -292,6 +292,26 @@ class UpdateTest(_UpdateFromTestBase, fixtures.TablesTest, AssertsCompiledSQL): "UPDATE foo SET id=:id, foo_id=:foo_id WHERE foo.id = :foo_id_1", ) + def test_labels_no_collision_index(self): + """test for [ticket:4911] """ + + t = Table( + "foo", + MetaData(), + Column("id", Integer, index=True), + Column("foo_id", Integer), + ) + + self.assert_compile( + t.update().where(t.c.id == 5), + "UPDATE foo SET id=:id, foo_id=:foo_id WHERE foo.id = :id_1", + ) + + self.assert_compile( + t.update().where(t.c.id == bindparam(key=t.c.id._label)), + "UPDATE foo SET id=:id, foo_id=:foo_id WHERE foo.id = :foo_id_1", + ) + def test_inline_defaults(self): m = MetaData() foo = Table("foo", m, Column("id", Integer)) |
