diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-12-20 11:40:10 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-12-20 12:50:06 -0500 |
| commit | c6554ac52bfb7ce9ecd30ec777ce90adfe7861d2 (patch) | |
| tree | 420c1d9538da694e8a5513c555dca4b19998bd8c /test/sql | |
| parent | c54b27ab123a4bf29ba7bc76924e188e2bc88e9f (diff) | |
| download | sqlalchemy-c6554ac52bfb7ce9ecd30ec777ce90adfe7861d2.tar.gz | |
Copy bind_processors when altering for expanding IN
Fixed issue where the collection of value processors on a
:class:`.Compiled` object would be mutated when "expanding IN" parameters
were used with a datatype that has bind value processors; in particular,
this would mean that when using statement caching and/or baked queries, the
same compiled._bind_processors collection would be mutated concurrently.
Since these processors are the same function for a given bind parameter
namespace every time, there was no actual negative effect of this issue,
however, the execution of a :class:`.Compiled` object should never be
causing any changes in its state, especially given that they are intended
to be thread-safe and reusable once fully constructed.
Fixes: #5048
Change-Id: I876d16bd7484eb05ce590397420552ac36da6e52
Diffstat (limited to 'test/sql')
| -rw-r--r-- | test/sql/test_query.py | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/test/sql/test_query.py b/test/sql/test_query.py index ba878cfbc..3b5e7dff2 100644 --- a/test/sql/test_query.py +++ b/test/sql/test_query.py @@ -752,6 +752,52 @@ class QueryTest(fixtures.TestBase): [(7, "jack"), (8, "fred")], ) + def test_expanding_in_dont_alter_compiled(self): + """test for issue #5048 """ + + class NameWithProcess(TypeDecorator): + impl = String + + def process_bind_param(self, value, dialect): + return value[3:] + + users = Table( + "query_users", + MetaData(), + Column("user_id", Integer, primary_key=True), + Column("user_name", NameWithProcess()), + ) + + with testing.db.connect() as conn: + conn.execute( + users.insert(), + [ + dict(user_id=7, user_name="AB jack"), + dict(user_id=8, user_name="BE fred"), + dict(user_id=9, user_name="GP ed"), + ], + ) + + stmt = ( + select([users]) + .where( + users.c.user_name.in_(bindparam("uname", expanding=True)) + ) + .order_by(users.c.user_id) + ) + + compiled = stmt.compile(testing.db) + eq_(len(compiled._bind_processors), 1) + + eq_( + conn.execute( + compiled, {"uname": ["HJ jack", "RR fred"]} + ).fetchall(), + [(7, "jack"), (8, "fred")], + ) + + eq_(len(compiled._bind_processors), 1) + @testing.fails_on("firebird", "uses sql-92 rules") @testing.fails_on("sybase", "uses sql-92 rules") @testing.skip_if(["mssql"]) |
