Skip to content

Commit ceb42fa

Browse files
committed
Fix: parse & generate Length properly in clickhouse
1 parent e141960 commit ceb42fa

File tree

5 files changed

+11
-7
lines changed

5 files changed

+11
-7
lines changed

sqlglot/dialects/clickhouse.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
inline_array_sql,
1212
json_extract_segments,
1313
json_path_key_only_name,
14+
length_or_char_length_sql,
1415
no_pivot_sql,
1516
build_json_extract_path,
1617
rename_func,
@@ -261,6 +262,7 @@ class Parser(parser.Parser):
261262
"JSONEXTRACTSTRING": build_json_extract_path(
262263
exp.JSONExtractScalar, zero_based_indexing=False
263264
),
265+
"LENGTH": lambda args: exp.Length(this=seq_get(args, 0), binary=True),
264266
"MAP": parser.build_var_map,
265267
"MATCH": exp.RegexpLike.from_arg_list,
266268
"RANDCANONICAL": exp.Rand.from_arg_list,
@@ -979,6 +981,7 @@ class Generator(generator.Generator):
979981
exp.JSONExtractScalar: json_extract_segments("JSONExtractString", quoted_index=False),
980982
exp.JSONPathKey: json_path_key_only_name,
981983
exp.JSONPathRoot: lambda *_: "",
984+
exp.Length: length_or_char_length_sql,
982985
exp.Map: lambda self, e: _lower_func(var_map_sql(self, e)),
983986
exp.Median: rename_func("median"),
984987
exp.Nullif: rename_func("nullIf"),

sqlglot/dialects/dialect.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1754,3 +1754,8 @@ def no_make_interval_sql(self: Generator, expression: exp.MakeInterval, sep: str
17541754
args.append(f"{value} {unit}")
17551755

17561756
return f"INTERVAL '{self.format_args(*args, sep=sep)}'"
1757+
1758+
1759+
def length_or_char_length_sql(self: Generator, expression: exp.Length) -> str:
1760+
length_func = "LENGTH" if expression.args.get("binary") else "CHAR_LENGTH"
1761+
return self.func(length_func, expression.this)

sqlglot/dialects/mysql.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
datestrtodate_sql,
1212
build_formatted_time,
1313
isnull_to_is_null,
14+
length_or_char_length_sql,
1415
locate_to_strposition,
1516
max_or_greatest,
1617
min_or_least,
@@ -730,6 +731,7 @@ class Generator(generator.Generator):
730731
e: f"""GROUP_CONCAT({self.sql(e, "this")} SEPARATOR {self.sql(e, "separator") or "','"})""",
731732
exp.ILike: no_ilike_sql,
732733
exp.JSONExtractScalar: arrow_json_extract_sql,
734+
exp.Length: length_or_char_length_sql,
733735
exp.LogicalOr: rename_func("MAX"),
734736
exp.LogicalAnd: rename_func("MIN"),
735737
exp.Max: max_or_greatest,
@@ -1263,7 +1265,3 @@ def attimezone_sql(self, expression: exp.AtTimeZone) -> str:
12631265

12641266
def isascii_sql(self, expression: exp.IsAscii) -> str:
12651267
return f"REGEXP_LIKE({self.sql(expression.this)}, '^[[:ascii:]]*$')"
1266-
1267-
def length_sql(self, expression: exp.Length) -> str:
1268-
length_func = "LENGTH" if expression.args.get("binary") else "CHAR_LENGTH"
1269-
return self.func(length_func, expression.this)

sqlglot/expressions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6154,7 +6154,7 @@ class Right(Func):
61546154

61556155
class Length(Func):
61566156
arg_types = {"this": True, "binary": False, "encoding": False}
6157-
_sql_names = ["LENGTH", "LEN"]
6157+
_sql_names = ["LENGTH", "LEN", "CHAR_LENGTH", "CHARACTER_LENGTH"]
61586158

61596159

61606160
class Levenshtein(Func):

sqlglot/parser.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,6 @@ class Parser(metaclass=_Parser):
188188
this=seq_get(args, 0), nulls_excluded=dialect.ARRAY_AGG_INCLUDES_NULLS is None or None
189189
),
190190
"CHAR": lambda args: exp.Chr(expressions=args),
191-
"CHAR_LENGTH": exp.Length.from_arg_list,
192-
"CHARACTER_LENGTH": exp.Length.from_arg_list,
193191
"CHR": lambda args: exp.Chr(expressions=args),
194192
"COUNT": lambda args: exp.Count(this=seq_get(args, 0), expressions=args[1:], big_int=True),
195193
"CONCAT": lambda args, dialect: exp.Concat(

0 commit comments

Comments
 (0)