Skip to content

Commit 333e3c7

Browse files
committed
Fix(optimizer)!: ConcatWs args set incorrectly in simplify_concat
1 parent 2284484 commit 333e3c7

2 files changed

Lines changed: 14 additions & 5 deletions

File tree

sqlglot/optimizer/simplify.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1296,15 +1296,15 @@ def simplify_concat(self, expression):
12961296
sep_expr, *expressions = expression.expressions
12971297
sep = sep_expr.name
12981298
concat_type = exp.ConcatWs
1299-
args = {}
13001299
else:
13011300
expressions = expression.expressions
13021301
sep = ""
13031302
concat_type = exp.Concat
1304-
args = {
1305-
"safe": expression.args.get("safe"),
1306-
"coalesce": expression.args.get("coalesce"),
1307-
}
1303+
1304+
args = {
1305+
"safe": expression.args.get("safe"),
1306+
"coalesce": expression.args.get("coalesce"),
1307+
}
13081308

13091309
new_args = []
13101310
for is_string_group, group in itertools.groupby(

tests/test_optimizer.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,15 @@ def test_simplify(self):
894894
self.assertEqual("CONCAT('a', x, 'bc')", simplified_concat.sql(dialect="presto"))
895895
self.assertEqual("CONCAT('a', x, 'bc')", simplified_safe_concat.sql())
896896

897+
# Both Databricks' and DuckDB's CONCAT_WS skip NULL args, so no CASE wrapping is needed
898+
concat_ws = parse_one("CONCAT_WS(' ', a, NULL, 'b', 'c')", read="databricks")
899+
simplified_concat_ws = optimizer.simplify.simplify(concat_ws)
900+
901+
self.assertEqual(simplified_concat_ws.args["coalesce"], True)
902+
self.assertEqual(
903+
"CONCAT_WS(' ', a, NULL, 'b c')", simplified_concat_ws.sql(dialect="duckdb")
904+
)
905+
897906
anon_unquoted_str = parse_one("anonymous(x, y)")
898907
self.assertEqual(optimizer.simplify.gen(anon_unquoted_str), "ANONYMOUS(x,y)")
899908

0 commit comments

Comments
 (0)