summaryrefslogtreecommitdiff
path: root/test/sql
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2021-03-19 10:34:31 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2021-03-19 10:34:31 -0400
commited515f2ca16e1b40efe5ee0299417f8d6eb51b86 (patch)
tree7e27deed98e467eea2fc0f99796869f358c1497c /test/sql
parent37ef5f38523329f3e881c4f70d38d5589510af9f (diff)
downloadsqlalchemy-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.py47
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 [