Skip to content

Commit 10cf7c1

Browse files
author
Aleksei Piianin
authored
Snowflake: Support dollar quoted comments (#1755)
1 parent f81aed6 commit 10cf7c1

File tree

3 files changed

+34
-23
lines changed

3 files changed

+34
-23
lines changed

src/dialect/snowflake.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -644,10 +644,7 @@ pub fn parse_create_stage(
644644
// [ comment ]
645645
if parser.parse_keyword(Keyword::COMMENT) {
646646
parser.expect_token(&Token::Eq)?;
647-
comment = Some(match parser.next_token().token {
648-
Token::SingleQuotedString(word) => Ok(word),
649-
_ => parser.expected("a comment statement", parser.peek_token()),
650-
}?)
647+
comment = Some(parser.parse_comment_value()?);
651648
}
652649

653650
Ok(Statement::CreateStage {

src/parser/mod.rs

+18-19
Original file line numberDiff line numberDiff line change
@@ -5451,11 +5451,7 @@ impl<'a> Parser<'a> {
54515451
&& self.parse_keyword(Keyword::COMMENT)
54525452
{
54535453
self.expect_token(&Token::Eq)?;
5454-
let next_token = self.next_token();
5455-
match next_token.token {
5456-
Token::SingleQuotedString(str) => Some(str),
5457-
_ => self.expected("string literal", next_token)?,
5458-
}
5454+
Some(self.parse_comment_value()?)
54595455
} else {
54605456
None
54615457
};
@@ -7059,21 +7055,28 @@ impl<'a> Parser<'a> {
70597055
pub fn parse_optional_inline_comment(&mut self) -> Result<Option<CommentDef>, ParserError> {
70607056
let comment = if self.parse_keyword(Keyword::COMMENT) {
70617057
let has_eq = self.consume_token(&Token::Eq);
7062-
let next_token = self.next_token();
7063-
match next_token.token {
7064-
Token::SingleQuotedString(str) => Some(if has_eq {
7065-
CommentDef::WithEq(str)
7066-
} else {
7067-
CommentDef::WithoutEq(str)
7068-
}),
7069-
_ => self.expected("comment", next_token)?,
7070-
}
7058+
let comment = self.parse_comment_value()?;
7059+
Some(if has_eq {
7060+
CommentDef::WithEq(comment)
7061+
} else {
7062+
CommentDef::WithoutEq(comment)
7063+
})
70717064
} else {
70727065
None
70737066
};
70747067
Ok(comment)
70757068
}
70767069

7070+
pub fn parse_comment_value(&mut self) -> Result<String, ParserError> {
7071+
let next_token = self.next_token();
7072+
let value = match next_token.token {
7073+
Token::SingleQuotedString(str) => str,
7074+
Token::DollarQuotedString(str) => str.value,
7075+
_ => self.expected("string literal", next_token)?,
7076+
};
7077+
Ok(value)
7078+
}
7079+
70777080
pub fn parse_optional_procedure_parameters(
70787081
&mut self,
70797082
) -> Result<Option<Vec<ProcedureParam>>, ParserError> {
@@ -7209,11 +7212,7 @@ impl<'a> Parser<'a> {
72097212
} else if self.parse_keywords(&[Keyword::NOT, Keyword::NULL]) {
72107213
Ok(Some(ColumnOption::NotNull))
72117214
} else if self.parse_keywords(&[Keyword::COMMENT]) {
7212-
let next_token = self.next_token();
7213-
match next_token.token {
7214-
Token::SingleQuotedString(value, ..) => Ok(Some(ColumnOption::Comment(value))),
7215-
_ => self.expected("string", next_token),
7216-
}
7215+
Ok(Some(ColumnOption::Comment(self.parse_comment_value()?)))
72177216
} else if self.parse_keyword(Keyword::NULL) {
72187217
Ok(Some(ColumnOption::Null))
72197218
} else if self.parse_keyword(Keyword::DEFAULT) {

tests/sqlparser_snowflake.rs

+15
Original file line numberDiff line numberDiff line change
@@ -976,6 +976,21 @@ fn parse_sf_create_or_replace_with_comment_for_snowflake() {
976976
}
977977
}
978978

979+
#[test]
980+
fn parse_sf_create_table_or_view_with_dollar_quoted_comment() {
981+
// Snowflake transforms dollar quoted comments into a common comment in DDL representation of creation
982+
snowflake()
983+
.one_statement_parses_to(
984+
r#"CREATE OR REPLACE TEMPORARY VIEW foo.bar.baz ("COL_1" COMMENT $$comment 1$$) COMMENT = $$view comment$$ AS (SELECT 1)"#,
985+
r#"CREATE OR REPLACE TEMPORARY VIEW foo.bar.baz ("COL_1" COMMENT 'comment 1') COMMENT = 'view comment' AS (SELECT 1)"#
986+
);
987+
988+
snowflake().one_statement_parses_to(
989+
r#"CREATE TABLE my_table (a STRING COMMENT $$comment 1$$) COMMENT = $$table comment$$"#,
990+
r#"CREATE TABLE my_table (a STRING COMMENT 'comment 1') COMMENT = 'table comment'"#,
991+
);
992+
}
993+
979994
#[test]
980995
fn test_sf_derived_table_in_parenthesis() {
981996
// Nesting a subquery in an extra set of parentheses is non-standard,

0 commit comments

Comments
 (0)