diff --git a/sqlglot/parser.py b/sqlglot/parser.py index c2a8eafb52..26d26fcdb6 100644 --- a/sqlglot/parser.py +++ b/sqlglot/parser.py @@ -8749,12 +8749,17 @@ def _parse_revoke(self) -> exp.Revoke | exp.Command: ) def _parse_overlay(self) -> exp.Overlay: + def _parse_overlay_arg(text: str) -> t.Optional[exp.Expression]: + return ( + self._match(TokenType.COMMA) or self._match_text_seq(text) + ) and self._parse_bitwise() + return self.expression( exp.Overlay, this=self._parse_bitwise(), - expression=self._match_text_seq("PLACING") and self._parse_bitwise(), - from_=self._match_text_seq("FROM") and self._parse_bitwise(), - for_=self._match_text_seq("FOR") and self._parse_bitwise(), + expression=_parse_overlay_arg("PLACING"), + from_=_parse_overlay_arg("FROM"), + for_=_parse_overlay_arg("FOR"), ) def _parse_format_name(self) -> exp.Property: diff --git a/tests/dialects/test_databricks.py b/tests/dialects/test_databricks.py index 68cbf34d0c..eb54917f69 100644 --- a/tests/dialects/test_databricks.py +++ b/tests/dialects/test_databricks.py @@ -425,3 +425,18 @@ def test_to_char_is_numeric_transpile_to_cast(self): def test_qdcolon(self): self.validate_identity("SELECT '20'?::INTEGER", "SELECT TRY_CAST('20' AS INTEGER)") + + def test_overlay(self): + self.validate_identity( + "SELECT OVERLAY('Spark SQL', 'ANSI ', 7, 0)", + "SELECT OVERLAY('Spark SQL' PLACING 'ANSI ' FROM 7 FOR 0)", + ) + self.validate_identity( + "SELECT OVERLAY('Spark SQL' PLACING 'CORE' FROM 7)", + ) + self.validate_identity( + "SELECT OVERLAY(ENCODE('Spark SQL', 'utf-8') PLACING ENCODE('_', 'utf-8') FROM 6)", + ) + self.validate_identity( + "SELECT OVERLAY('Spark SQL' PLACING 'ANSI ' FROM 7 FOR 0)", + )