From 706bbfd0fe71023cd2f61be2a8939ce6ec5b60df Mon Sep 17 00:00:00 2001 From: Roman Borschel Date: Sat, 29 Mar 2025 20:25:21 +0100 Subject: [PATCH 1/2] Add support for Databricks TIMESTAMP_NTZ. --- src/ast/data_type.rs | 5 +++++ src/keywords.rs | 1 + src/parser/mod.rs | 1 + tests/sqlparser_databricks.rs | 42 +++++++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+) diff --git a/src/ast/data_type.rs b/src/ast/data_type.rs index 57bc67441..dc523696a 100644 --- a/src/ast/data_type.rs +++ b/src/ast/data_type.rs @@ -312,6 +312,10 @@ pub enum DataType { /// /// [1]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#datetime-type Timestamp(Option, TimezoneInfo), + /// Databricks timestamp without time zone. See [1]. + /// + /// [1]: https://docs.databricks.com/aws/en/sql/language-manual/data-types/timestamp-ntz-type + TimestampNtz, /// Interval Interval, /// JSON type @@ -567,6 +571,7 @@ impl fmt::Display for DataType { DataType::Timestamp(precision, timezone_info) => { format_datetime_precision_and_tz(f, "TIMESTAMP", precision, timezone_info) } + DataType::TimestampNtz => write!(f, "TIMESTAMP_NTZ"), DataType::Datetime64(precision, timezone) => { format_clickhouse_datetime_precision_and_timezone( f, diff --git a/src/keywords.rs b/src/keywords.rs index 349c9ffb0..82dd7914e 100644 --- a/src/keywords.rs +++ b/src/keywords.rs @@ -875,6 +875,7 @@ define_keywords!( TIME, TIMESTAMP, TIMESTAMPTZ, + TIMESTAMP_NTZ, TIMETZ, TIMEZONE, TIMEZONE_ABBR, diff --git a/src/parser/mod.rs b/src/parser/mod.rs index adaae2862..2b61529ff 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -9247,6 +9247,7 @@ impl<'a> Parser<'a> { self.parse_optional_precision()?, TimezoneInfo::Tz, )), + Keyword::TIMESTAMP_NTZ => Ok(DataType::TimestampNtz), Keyword::TIME => { let precision = self.parse_optional_precision()?; let tz = if self.parse_keyword(Keyword::WITH) { diff --git a/tests/sqlparser_databricks.rs b/tests/sqlparser_databricks.rs index 3b36d7a13..58693e7c4 100644 --- a/tests/sqlparser_databricks.rs +++ b/tests/sqlparser_databricks.rs @@ -317,3 +317,45 @@ fn parse_databricks_struct_function() { }) ); } + +#[test] +fn data_type_timestamp_ntz() { + // Literal + assert_eq!( + databricks().verified_expr("TIMESTAMP_NTZ '2025-03-29T18:52:00'"), + Expr::TypedString { + data_type: DataType::TimestampNtz, + value: Value::SingleQuotedString("2025-03-29T18:52:00".to_owned()) + } + ); + + // Cast + assert_eq!( + databricks().verified_expr("(created_at)::TIMESTAMP_NTZ"), + Expr::Cast { + kind: CastKind::DoubleColon, + expr: Box::new(Expr::Nested( + Box::new(Expr::Identifier("created_at".into())) + )), + data_type: DataType::TimestampNtz, + format: None + } + ); + + // Column definition + match databricks().verified_stmt("CREATE TABLE foo (x TIMESTAMP_NTZ)") { + Statement::CreateTable(CreateTable { columns, .. }) => { + assert_eq!( + columns, + vec![ + ColumnDef { + name: "x".into(), + data_type: DataType::TimestampNtz, + options: vec![], + } + ] + ); + } + s => panic!("Unexpected statement: {:?}", s), + } +} From 20d5683931f2185a18fe6803c81d978527efeccc Mon Sep 17 00:00:00 2001 From: Roman Borschel Date: Mon, 31 Mar 2025 13:31:58 +0200 Subject: [PATCH 2/2] Address cargo fmt errors. --- tests/sqlparser_databricks.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/tests/sqlparser_databricks.rs b/tests/sqlparser_databricks.rs index 58693e7c4..88aae499a 100644 --- a/tests/sqlparser_databricks.rs +++ b/tests/sqlparser_databricks.rs @@ -334,9 +334,9 @@ fn data_type_timestamp_ntz() { databricks().verified_expr("(created_at)::TIMESTAMP_NTZ"), Expr::Cast { kind: CastKind::DoubleColon, - expr: Box::new(Expr::Nested( - Box::new(Expr::Identifier("created_at".into())) - )), + expr: Box::new(Expr::Nested(Box::new(Expr::Identifier( + "created_at".into() + )))), data_type: DataType::TimestampNtz, format: None } @@ -347,13 +347,11 @@ fn data_type_timestamp_ntz() { Statement::CreateTable(CreateTable { columns, .. }) => { assert_eq!( columns, - vec![ - ColumnDef { - name: "x".into(), - data_type: DataType::TimestampNtz, - options: vec![], - } - ] + vec![ColumnDef { + name: "x".into(), + data_type: DataType::TimestampNtz, + options: vec![], + }] ); } s => panic!("Unexpected statement: {:?}", s),