This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch 
gh-readonly-queue/main/pr-2080-67684c84d4c2589356c411ea4917dcf1defcd77c
in repository https://gitbox.apache.org/repos/asf/datafusion-sqlparser-rs.git

commit bc6e1d6e1a960c0c220c712a16b5046f563a5f6e
Author: Andriy Romanov <[email protected]>
AuthorDate: Thu Oct 30 02:20:41 2025 -0700

    Added TIMESTAMP_NTZ type support with precision to Snowflake dialect (#2080)
---
 src/ast/data_type.rs          |  6 ++++--
 src/parser/mod.rs             |  4 +++-
 tests/sqlparser_databricks.rs |  6 +++---
 tests/sqlparser_snowflake.rs  | 15 +++++++++++++++
 4 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/src/ast/data_type.rs b/src/ast/data_type.rs
index f8523e84..6da6a90d 100644
--- a/src/ast/data_type.rs
+++ b/src/ast/data_type.rs
@@ -375,7 +375,7 @@ pub enum DataType {
     /// Databricks timestamp without time zone. See [1].
     ///
     /// [1]: 
https://docs.databricks.com/aws/en/sql/language-manual/data-types/timestamp-ntz-type
-    TimestampNtz,
+    TimestampNtz(Option<u64>),
     /// Interval type.
     Interval {
         /// [PostgreSQL] fields specification like `INTERVAL YEAR TO MONTH`.
@@ -676,7 +676,9 @@ 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::TimestampNtz(precision) => {
+                format_type_with_optional_length(f, "TIMESTAMP_NTZ", 
precision, false)
+            }
             DataType::Datetime64(precision, timezone) => {
                 format_clickhouse_datetime_precision_and_timezone(
                     f,
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index b44171c7..1248c918 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -10542,7 +10542,9 @@ impl<'a> Parser<'a> {
                     self.parse_optional_precision()?,
                     TimezoneInfo::Tz,
                 )),
-                Keyword::TIMESTAMP_NTZ => Ok(DataType::TimestampNtz),
+                Keyword::TIMESTAMP_NTZ => {
+                    
Ok(DataType::TimestampNtz(self.parse_optional_precision()?))
+                }
                 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 e01611b6..92b63533 100644
--- a/tests/sqlparser_databricks.rs
+++ b/tests/sqlparser_databricks.rs
@@ -328,7 +328,7 @@ fn data_type_timestamp_ntz() {
     assert_eq!(
         databricks().verified_expr("TIMESTAMP_NTZ '2025-03-29T18:52:00'"),
         Expr::TypedString(TypedString {
-            data_type: DataType::TimestampNtz,
+            data_type: DataType::TimestampNtz(None),
             value: ValueWithSpan {
                 value: 
Value::SingleQuotedString("2025-03-29T18:52:00".to_owned()),
                 span: Span::empty(),
@@ -345,7 +345,7 @@ fn data_type_timestamp_ntz() {
             expr: Box::new(Expr::Nested(Box::new(Expr::Identifier(
                 "created_at".into()
             )))),
-            data_type: DataType::TimestampNtz,
+            data_type: DataType::TimestampNtz(None),
             format: None
         }
     );
@@ -357,7 +357,7 @@ fn data_type_timestamp_ntz() {
                 columns,
                 vec![ColumnDef {
                     name: "x".into(),
-                    data_type: DataType::TimestampNtz,
+                    data_type: DataType::TimestampNtz(None),
                     options: vec![],
                 }]
             );
diff --git a/tests/sqlparser_snowflake.rs b/tests/sqlparser_snowflake.rs
index e7a12834..2be5eae8 100644
--- a/tests/sqlparser_snowflake.rs
+++ b/tests/sqlparser_snowflake.rs
@@ -4638,6 +4638,21 @@ fn test_create_database() {
     assert!(err.contains("Expected"), "Unexpected error: {err}");
 }
 
+#[test]
+fn test_timestamp_ntz_with_precision() {
+    snowflake().verified_stmt("SELECT CAST('2024-01-01 01:00:00' AS 
TIMESTAMP_NTZ(1))");
+    snowflake().verified_stmt("SELECT CAST('2024-01-01 01:00:00' AS 
TIMESTAMP_NTZ(9))");
+
+    let select =
+        snowflake().verified_only_select("SELECT CAST('2024-01-01 01:00:00' AS 
TIMESTAMP_NTZ(9))");
+    match expr_from_projection(only(&select.projection)) {
+        Expr::Cast { data_type, .. } => {
+            assert_eq!(*data_type, DataType::TimestampNtz(Some(9)));
+        }
+        _ => unreachable!(),
+    }
+}
+
 #[test]
 fn test_drop_constraints() {
     snowflake().verified_stmt("ALTER TABLE tbl DROP PRIMARY KEY");


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to