Fix parsing CLOB, BINARY, VARBINARY, BLOB data type (#618)

* fix(parser): parse clob, binary, varbinary, blob data type

* feat(tests): parse_cast tests for LOB, BINARY datatype
This commit is contained in:
ding-young 2022-09-28 20:02:30 +09:00 committed by GitHub
parent 6afd194e94
commit 6c8f31c367
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 51 additions and 0 deletions

View file

@ -3390,6 +3390,10 @@ impl<'a> Parser<'a> {
Ok(DataType::Char(self.parse_optional_precision()?)) 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::UUID => Ok(DataType::Uuid),
Keyword::DATE => Ok(DataType::Date), Keyword::DATE => Ok(DataType::Date),
Keyword::DATETIME => Ok(DataType::Datetime), Keyword::DATETIME => Ok(DataType::Datetime),
@ -3603,6 +3607,13 @@ impl<'a> Parser<'a> {
} }
} }
pub fn parse_precision(&mut self) -> Result<u64, ParserError> {
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<Option<u64>, ParserError> { pub fn parse_optional_precision(&mut self) -> Result<Option<u64>, ParserError> {
if self.consume_token(&Token::LParen) { if self.consume_token(&Token::LParen) {
let n = self.parse_literal_uint()?; let n = self.parse_literal_uint()?;

View file

@ -1649,6 +1649,46 @@ fn parse_cast() {
}, },
expr_from_projection(only(&select.projection)) 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] #[test]