summaryrefslogtreecommitdiffstats
path: root/sqlglot/dialects/clickhouse.py
diff options
context:
space:
mode:
Diffstat (limited to 'sqlglot/dialects/clickhouse.py')
-rw-r--r--sqlglot/dialects/clickhouse.py15
1 files changed, 12 insertions, 3 deletions
diff --git a/sqlglot/dialects/clickhouse.py b/sqlglot/dialects/clickhouse.py
index 9126c4b..8f60df2 100644
--- a/sqlglot/dialects/clickhouse.py
+++ b/sqlglot/dialects/clickhouse.py
@@ -64,6 +64,7 @@ class ClickHouse(Dialect):
"MAP": parse_var_map,
"MATCH": exp.RegexpLike.from_arg_list,
"UNIQ": exp.ApproxDistinct.from_arg_list,
+ "XOR": lambda args: exp.Xor(expressions=args),
}
FUNCTIONS_WITH_ALIASED_ARGS = {*parser.Parser.FUNCTIONS_WITH_ALIASED_ARGS, "TUPLE"}
@@ -95,6 +96,7 @@ class ClickHouse(Dialect):
TokenType.ASOF,
TokenType.ANTI,
TokenType.SEMI,
+ TokenType.ARRAY,
}
TABLE_ALIAS_TOKENS = {*parser.Parser.TABLE_ALIAS_TOKENS} - {
@@ -103,6 +105,7 @@ class ClickHouse(Dialect):
TokenType.ANTI,
TokenType.SETTINGS,
TokenType.FORMAT,
+ TokenType.ARRAY,
}
LOG_DEFAULTS_TO_LN = True
@@ -160,8 +163,11 @@ class ClickHouse(Dialect):
schema: bool = False,
joins: bool = False,
alias_tokens: t.Optional[t.Collection[TokenType]] = None,
+ parse_bracket: bool = False,
) -> t.Optional[exp.Expression]:
- this = super()._parse_table(schema=schema, joins=joins, alias_tokens=alias_tokens)
+ this = super()._parse_table(
+ schema=schema, joins=joins, alias_tokens=alias_tokens, parse_bracket=parse_bracket
+ )
if self._match(TokenType.FINAL):
this = self.expression(exp.Final, this=this)
@@ -204,8 +210,10 @@ class ClickHouse(Dialect):
self._match_set(self.JOIN_KINDS) and self._prev,
)
- def _parse_join(self, skip_join_token: bool = False) -> t.Optional[exp.Join]:
- join = super()._parse_join(skip_join_token)
+ def _parse_join(
+ self, skip_join_token: bool = False, parse_bracket: bool = False
+ ) -> t.Optional[exp.Join]:
+ join = super()._parse_join(skip_join_token=skip_join_token, parse_bracket=True)
if join:
join.set("global", join.args.pop("method", None))
@@ -318,6 +326,7 @@ class ClickHouse(Dialect):
exp.RegexpLike: lambda self, e: f"match({self.format_args(e.this, e.expression)})",
exp.StrPosition: lambda self, e: f"position({self.format_args(e.this, e.args.get('substr'), e.args.get('position'))})",
exp.VarMap: lambda self, e: _lower_func(var_map_sql(self, e)),
+ exp.Xor: lambda self, e: self.func("xor", e.this, e.expression, *e.expressions),
}
PROPERTIES_LOCATION = {