From d4e47fcfe5f719fcb9370c44c3f590d18ef97d76 Mon Sep 17 00:00:00 2001 From: Seoyoung Lee Date: Thu, 22 Sep 2022 00:17:59 +0900 Subject: [PATCH 1/2] fix(parser): parse clob, binary, varbinary, blob data type --- src/parser.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/parser.rs b/src/parser.rs index 968b1a5dd..af63604ec 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -3142,6 +3142,10 @@ impl<'a> Parser<'a> { Ok(DataType::Char(self.parse_optional_precision()?)) } } + Keyword::CLOB => Ok(DataType::Clob(self.parse_precision()?)), + Keyword::BINARY => Ok(DataType::Binary(self.parse_precision()?)), + Keyword::VARBINARY => Ok(DataType::Varbinary(self.parse_precision()?)), + Keyword::BLOB => Ok(DataType::Blob(self.parse_precision()?)), Keyword::UUID => Ok(DataType::Uuid), Keyword::DATE => Ok(DataType::Date), Keyword::DATETIME => Ok(DataType::Datetime), @@ -3355,6 +3359,13 @@ impl<'a> Parser<'a> { } } + pub fn parse_precision(&mut self) -> Result { + self.expect_token(&Token::LParen)?; + let n = self.parse_literal_uint()?; + self.expect_token(&Token::RParen)?; + Ok(n) + } + pub fn parse_optional_precision(&mut self) -> Result, ParserError> { if self.consume_token(&Token::LParen) { let n = self.parse_literal_uint()?; From dfadc85047c935efc42c7c863def12cc42abc764 Mon Sep 17 00:00:00 2001 From: Seoyoung Lee Date: Wed, 28 Sep 2022 14:45:27 +0900 Subject: [PATCH 2/2] feat(tests): parse_cast tests for LOB, BINARY datatype --- tests/sqlparser_common.rs | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index d2d2646cd..3616870a0 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -1647,6 +1647,46 @@ fn parse_cast() { }, expr_from_projection(only(&select.projection)) ); + + let sql = "SELECT CAST(id AS CLOB(50)) FROM customer"; + let select = verified_only_select(sql); + assert_eq!( + &Expr::Cast { + expr: Box::new(Expr::Identifier(Ident::new("id"))), + data_type: DataType::Clob(50) + }, + expr_from_projection(only(&select.projection)) + ); + + let sql = "SELECT CAST(id AS BINARY(50)) FROM customer"; + let select = verified_only_select(sql); + assert_eq!( + &Expr::Cast { + expr: Box::new(Expr::Identifier(Ident::new("id"))), + data_type: DataType::Binary(50) + }, + expr_from_projection(only(&select.projection)) + ); + + let sql = "SELECT CAST(id AS VARBINARY(50)) FROM customer"; + let select = verified_only_select(sql); + assert_eq!( + &Expr::Cast { + expr: Box::new(Expr::Identifier(Ident::new("id"))), + data_type: DataType::Varbinary(50) + }, + expr_from_projection(only(&select.projection)) + ); + + let sql = "SELECT CAST(id AS BLOB(50)) FROM customer"; + let select = verified_only_select(sql); + assert_eq!( + &Expr::Cast { + expr: Box::new(Expr::Identifier(Ident::new("id"))), + data_type: DataType::Blob(50) + }, + expr_from_projection(only(&select.projection)) + ); } #[test]