Support NUMERIC without precision or scale

https://jakewheat.github.io/sql-overview/sql-2011-foundation-grammar.html#exact-numeric-type
This commit is contained in:
Nickolay Ponomarev 2019-02-11 02:48:36 +03:00
parent 54c9ca8619
commit 23a0d032bd
2 changed files with 11 additions and 7 deletions

View file

@ -17,8 +17,8 @@ pub enum SQLType {
Varbinary(usize),
/// Large binary object e.g. BLOB(1000)
Blob(usize),
/// Decimal type with precision and optional scale e.g. DECIMAL(10,2)
Decimal(usize, Option<usize>),
/// Decimal type with optional precision and scale e.g. DECIMAL(10,2)
Decimal(Option<usize>, Option<usize>),
/// Small integer
SmallInt,
/// Integer
@ -75,9 +75,13 @@ impl ToString for SQLType {
SQLType::Blob(size) => format!("blob({})", size),
SQLType::Decimal(precision, scale) => {
if let Some(scale) = scale {
format!("numeric({},{})", precision, scale)
format!("numeric({},{})", precision.unwrap(), scale)
} else {
format!("numeric({})", precision)
if let Some(precision) = precision {
format!("numeric({})", precision)
} else {
format!("numeric")
}
}
}
SQLType::SmallInt => "smallint".to_string(),

View file

@ -1166,7 +1166,7 @@ impl Parser {
pub fn parse_optional_precision_scale(
&mut self,
) -> Result<(usize, Option<usize>), ParserError> {
) -> Result<(Option<usize>, Option<usize>), ParserError> {
if self.consume_token(&Token::LParen) {
let n = self.parse_literal_int()?;
let scale = if self.consume_token(&Token::Comma) {
@ -1175,9 +1175,9 @@ impl Parser {
None
};
self.expect_token(&Token::RParen)?;
Ok((n as usize, scale))
Ok((Some(n as usize), scale))
} else {
parser_err!("Expecting `(`")
Ok((None, None))
}
}