diff options
Diffstat (limited to 'sqlglot/dialects/snowflake.py')
-rw-r--r-- | sqlglot/dialects/snowflake.py | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/sqlglot/dialects/snowflake.py b/sqlglot/dialects/snowflake.py index 55a6bd3..bb46135 100644 --- a/sqlglot/dialects/snowflake.py +++ b/sqlglot/dialects/snowflake.py @@ -178,18 +178,25 @@ class Snowflake(Dialect): ), } + RANGE_PARSERS = { + **parser.Parser.RANGE_PARSERS, # type: ignore + TokenType.LIKE_ANY: lambda self, this: self._parse_escape( + self.expression(exp.LikeAny, this=this, expression=self._parse_bitwise()) + ), + TokenType.ILIKE_ANY: lambda self, this: self._parse_escape( + self.expression(exp.ILikeAny, this=this, expression=self._parse_bitwise()) + ), + } + class Tokenizer(tokens.Tokenizer): QUOTES = ["'", "$$"] STRING_ESCAPES = ["\\", "'"] - SINGLE_TOKENS = { - **tokens.Tokenizer.SINGLE_TOKENS, - "$": TokenType.PARAMETER, - } - KEYWORDS = { **tokens.Tokenizer.KEYWORDS, "EXCLUDE": TokenType.EXCEPT, + "ILIKE ANY": TokenType.ILIKE_ANY, + "LIKE ANY": TokenType.LIKE_ANY, "MATCH_RECOGNIZE": TokenType.MATCH_RECOGNIZE, "PUT": TokenType.COMMAND, "RENAME": TokenType.REPLACE, @@ -201,8 +208,14 @@ class Snowflake(Dialect): "SAMPLE": TokenType.TABLE_SAMPLE, } + SINGLE_TOKENS = { + **tokens.Tokenizer.SINGLE_TOKENS, + "$": TokenType.PARAMETER, + } + class Generator(generator.Generator): CREATE_TRANSIENT = True + PARAMETER_TOKEN = "$" TRANSFORMS = { **generator.Generator.TRANSFORMS, # type: ignore @@ -214,14 +227,15 @@ class Snowflake(Dialect): exp.If: rename_func("IFF"), exp.Map: lambda self, e: var_map_sql(self, e, "OBJECT_CONSTRUCT"), exp.VarMap: lambda self, e: var_map_sql(self, e, "OBJECT_CONSTRUCT"), - exp.Parameter: lambda self, e: f"${self.sql(e, 'this')}", exp.PartitionedByProperty: lambda self, e: f"PARTITION BY {self.sql(e, 'this')}", exp.Matches: rename_func("DECODE"), - exp.StrPosition: lambda self, e: f"{self.normalize_func('POSITION')}({self.format_args(e.args.get('substr'), e.this, e.args.get('position'))})", + exp.StrPosition: lambda self, e: self.func( + "POSITION", e.args.get("substr"), e.this, e.args.get("position") + ), exp.StrToTime: lambda self, e: f"TO_TIMESTAMP({self.sql(e, 'this')}, {self.format_time(e)})", exp.TimeStrToTime: timestrtotime_sql, exp.TimeToUnix: lambda self, e: f"EXTRACT(epoch_second FROM {self.sql(e, 'this')})", - exp.Trim: lambda self, e: f"TRIM({self.format_args(e.this, e.expression)})", + exp.Trim: lambda self, e: self.func("TRIM", e.this, e.expression), exp.UnixToTime: _unix_to_time_sql, exp.DayOfWeek: rename_func("DAYOFWEEK"), } @@ -236,6 +250,12 @@ class Snowflake(Dialect): "replace": "RENAME", } + def ilikeany_sql(self, expression: exp.ILikeAny) -> str: + return self.binary(expression, "ILIKE ANY") + + def likeany_sql(self, expression: exp.LikeAny) -> str: + return self.binary(expression, "LIKE ANY") + def except_op(self, expression): if not expression.args.get("distinct", False): self.unsupported("EXCEPT with All is not supported in Snowflake") |