diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-03-19 10:34:31 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2021-03-19 10:34:31 -0400 |
| commit | ed515f2ca16e1b40efe5ee0299417f8d6eb51b86 (patch) | |
| tree | 7e27deed98e467eea2fc0f99796869f358c1497c /test/sql | |
| parent | 37ef5f38523329f3e881c4f70d38d5589510af9f (diff) | |
| download | sqlalchemy-ed515f2ca16e1b40efe5ee0299417f8d6eb51b86.tar.gz | |
Correct for coercion from list args to positional for case
Fixed regression in the :func:`_sql.case` construct, where the "dictionary"
form of argument specification failed to work correctly if it were passed
positionally, rather than as a "whens" keyword argument.
Fixes: #6097
Change-Id: I4138f54309a08c8e4e63cfafc211176e0b9a76c7
Diffstat (limited to 'test/sql')
| -rw-r--r-- | test/sql/test_case_statement.py | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/test/sql/test_case_statement.py b/test/sql/test_case_statement.py index b44971cec..7dd66840f 100644 --- a/test/sql/test_case_statement.py +++ b/test/sql/test_case_statement.py @@ -154,6 +154,53 @@ class CaseTest(fixtures.TestBase, AssertsCompiledSQL): "CASE WHEN (test.col1 = :col1_1) THEN :param_1 ELSE :param_2 END", ) + @testing.combinations( + ( + (lambda t: ({"x": "y"}, t.c.col1, None)), + "CASE test.col1 WHEN :param_1 THEN :param_2 END", + ), + ( + (lambda t: ({"x": "y", "p": "q"}, t.c.col1, None)), + "CASE test.col1 WHEN :param_1 THEN :param_2 " + "WHEN :param_3 THEN :param_4 END", + ), + ( + (lambda t: ({t.c.col1 == 7: "x"}, None, 10)), + "CASE WHEN (test.col1 = :col1_1) THEN :param_1 ELSE :param_2 END", + ), + ( + (lambda t: ({t.c.col1 == 7: "x", t.c.col1 == 10: "y"}, None, 10)), + "CASE WHEN (test.col1 = :col1_1) THEN :param_1 " + "WHEN (test.col1 = :col1_2) THEN :param_2 ELSE :param_3 END", + ), + argnames="test_case, expected", + ) + @testing.combinations(("positional",), ("kwarg",), argnames="argstyle") + def test_when_dicts(self, argstyle, test_case, expected): + t = table("test", column("col1")) + + whens, value, else_ = testing.resolve_lambda(test_case, t=t) + + def _case_args(whens, value=None, else_=None): + kw = {} + if value is not None: + kw["value"] = value + if else_ is not None: + kw["else_"] = else_ + + if argstyle == "kwarg": + return case(whens=whens, **kw) + elif argstyle == "positional": + return case(whens, **kw) + + # note: 1.3 also does not allow this form + # case([whens], **kw) + + self.assert_compile( + _case_args(whens=whens, value=value, else_=else_), + expected, + ) + def test_text_doesnt_explode(self, connection): for s in [ |
