diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 8f4cefa76..36ac2fd28 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -5471,7 +5471,14 @@ impl<'a> Parser<'a> { )?, }, // Case when Snowflake Semi-structured data like key:value - Keyword::NoKeyword | Keyword::LOCATION | Keyword::TYPE | Keyword::DATE if dialect_of!(self is SnowflakeDialect | GenericDialect) => { + Keyword::NoKeyword + | Keyword::LOCATION + | Keyword::TYPE + | Keyword::DATE + | Keyword::START + | Keyword::END + if dialect_of!(self is SnowflakeDialect | GenericDialect) => + { Ok(Value::UnQuotedString(w.value)) } _ => self.expected( diff --git a/tests/sqlparser_snowflake.rs b/tests/sqlparser_snowflake.rs index 8954a17f5..64c47e254 100644 --- a/tests/sqlparser_snowflake.rs +++ b/tests/sqlparser_snowflake.rs @@ -229,6 +229,24 @@ fn parse_json_using_colon() { ); snowflake().one_statement_parses_to("SELECT a:b::int FROM t", "SELECT CAST(a:b AS INT) FROM t"); + + let sql = "SELECT a:start, a:end FROM t"; + let select = snowflake().verified_only_select(sql); + assert_eq!( + vec![ + SelectItem::UnnamedExpr(Expr::JsonAccess { + left: Box::new(Expr::Identifier(Ident::new("a"))), + operator: JsonOperator::Colon, + right: Box::new(Expr::Value(Value::UnQuotedString("start".to_string()))), + }), + SelectItem::UnnamedExpr(Expr::JsonAccess { + left: Box::new(Expr::Identifier(Ident::new("a"))), + operator: JsonOperator::Colon, + right: Box::new(Expr::Value(Value::UnQuotedString("end".to_string()))), + }) + ], + select.projection + ); } #[test]