From 362ca3398336a3a892e8020530f0c68d4f2d1d01 Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Thu, 21 May 2020 00:13:38 +0100 Subject: [PATCH] Fix query string escaping in engine URLs (Fixes #5341) --- lib/sqlalchemy/engine/url.py | 2 +- test/engine/test_parseconnect.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/sqlalchemy/engine/url.py b/lib/sqlalchemy/engine/url.py index 5950fa0217..7b7a0047ce 100644 --- a/lib/sqlalchemy/engine/url.py +++ b/lib/sqlalchemy/engine/url.py @@ -96,7 +96,7 @@ class URL(object): keys = list(self.query) keys.sort() s += "?" + "&".join( - "%s=%s" % (k, element) + "%s=%s" % (util.quote_plus(k), util.quote_plus(element)) for k in keys for element in util.to_list(self.query[k]) ) diff --git a/test/engine/test_parseconnect.py b/test/engine/test_parseconnect.py index 1277425c15..77b882f2c1 100644 --- a/test/engine/test_parseconnect.py +++ b/test/engine/test_parseconnect.py @@ -147,6 +147,11 @@ class URLTest(fixtures.TestBase): "dialect://user:pass@host/db?arg1=param1&arg2=param2&arg2=param3", ) + test_url = "dialect://user:pass@host/db?arg1%3D=param1&arg2=param+2" + u = url.make_url(test_url) + eq_(u.query, {"arg1=": "param1", "arg2": "param 2"}) + eq_(str(u), test_url) + def test_comparison(self): components = ( "drivername", -- 2.47.3