From e2bc1afd32aee2f55c9d62d66e94c8e5635b93f2 Mon Sep 17 00:00:00 2001 From: Alexander Beedie Date: Fri, 12 Jan 2024 12:54:11 +0400 Subject: [PATCH] Adds support for JSONB datatype --- src/ast/data_type.rs | 5 ++++- src/keywords.rs | 1 + src/parser/mod.rs | 1 + tests/sqlparser_common.rs | 10 ++++++++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/ast/data_type.rs b/src/ast/data_type.rs index 6b0ecd8154..6b082a1fb9 100644 --- a/src/ast/data_type.rs +++ b/src/ast/data_type.rs @@ -196,8 +196,10 @@ pub enum DataType { Timestamp(Option, TimezoneInfo), /// Interval Interval, - /// JSON type used in BigQuery + /// JSON type JSON, + /// Binary JSON type + JSONB, /// Regclass used in postgresql serial Regclass, /// Text @@ -340,6 +342,7 @@ impl fmt::Display for DataType { } DataType::Interval => write!(f, "INTERVAL"), DataType::JSON => write!(f, "JSON"), + DataType::JSONB => write!(f, "JSONB"), DataType::Regclass => write!(f, "REGCLASS"), DataType::Text => write!(f, "TEXT"), DataType::String(size) => format_type_with_optional_length(f, "STRING", size, false), diff --git a/src/keywords.rs b/src/keywords.rs index 1dd43d430d..4e7fc78898 100644 --- a/src/keywords.rs +++ b/src/keywords.rs @@ -366,6 +366,7 @@ define_keywords!( JAR, JOIN, JSON, + JSONB, JSONFILE, JSON_TABLE, JULIAN, diff --git a/src/parser/mod.rs b/src/parser/mod.rs index b2646af6de..55cf6052d4 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -5641,6 +5641,7 @@ impl<'a> Parser<'a> { // parse_interval for a taste. Keyword::INTERVAL => Ok(DataType::Interval), Keyword::JSON => Ok(DataType::JSON), + Keyword::JSONB => Ok(DataType::JSONB), Keyword::REGCLASS => Ok(DataType::Regclass), Keyword::STRING => Ok(DataType::String(self.parse_optional_precision()?)), Keyword::TEXT => Ok(DataType::Text), diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index eadc176962..e74f586f10 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -2172,6 +2172,16 @@ fn parse_cast() { }, expr_from_projection(only(&select.projection)) ); + + let sql = "SELECT CAST(details AS JSONB) FROM customer"; + let select = verified_only_select(sql); + assert_eq!( + &Expr::Cast { + expr: Box::new(Expr::Identifier(Ident::new("details"))), + data_type: DataType::JSONB, + }, + expr_from_projection(only(&select.projection)) + ); } #[test]