summaryrefslogtreecommitdiff
path: root/test/sql
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2019-12-20 11:40:10 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2019-12-20 12:50:06 -0500
commitc6554ac52bfb7ce9ecd30ec777ce90adfe7861d2 (patch)
tree420c1d9538da694e8a5513c555dca4b19998bd8c /test/sql
parentc54b27ab123a4bf29ba7bc76924e188e2bc88e9f (diff)
downloadsqlalchemy-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.py46
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"])