From 00c5e38ef879078b25fd7fe2d34ecb8bc422f292 Mon Sep 17 00:00:00 2001 From: AugustoFKL Date: Tue, 27 Sep 2022 14:35:49 -0300 Subject: [PATCH] Adding DOUBLE PRECISION to data types, parsing it, and tests --- src/ast/data_type.rs | 8 +++++++- src/parser.rs | 21 +++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/ast/data_type.rs b/src/ast/data_type.rs index 3a6ebf4cd..f3fa5001f 100644 --- a/src/ast/data_type.rs +++ b/src/ast/data_type.rs @@ -67,8 +67,13 @@ pub enum DataType { UnsignedBigInt(Option), /// Floating point e.g. REAL Real, - /// Double e.g. DOUBLE PRECISION + /// Double Double, + /// Double PRECISION e.g. [standard], [postgresql] + /// + /// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#approximate-numeric-type + /// [postgresql]: https://www.postgresql.org/docs/current/datatype-numeric.html + DoublePrecision, /// Boolean Boolean, /// Date @@ -154,6 +159,7 @@ impl fmt::Display for DataType { } DataType::Real => write!(f, "REAL"), DataType::Double => write!(f, "DOUBLE"), + DataType::DoublePrecision => write!(f, "DOUBLE PRECISION"), DataType::Boolean => write!(f, "BOOLEAN"), DataType::Date => write!(f, "DATE"), DataType::Time => write!(f, "TIME"), diff --git a/src/parser.rs b/src/parser.rs index 503ef07db..cbc9c8bcb 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -3319,8 +3319,11 @@ impl<'a> Parser<'a> { Keyword::FLOAT => Ok(DataType::Float(self.parse_optional_precision()?)), Keyword::REAL => Ok(DataType::Real), Keyword::DOUBLE => { - let _ = self.parse_keyword(Keyword::PRECISION); - Ok(DataType::Double) + if self.parse_keyword(Keyword::PRECISION) { + Ok(DataType::DoublePrecision) + } else { + Ok(DataType::Double) + } } Keyword::TINYINT => { let optional_precision = self.parse_optional_precision(); @@ -5211,4 +5214,18 @@ mod tests { assert_eq!(ast.to_string(), sql.to_string()); }); } + + // TODO add tests for all data types? https://github.com/sqlparser-rs/sqlparser-rs/issues/2 + #[test] + fn test_parse_data_type() { + test_parse_data_type("DOUBLE PRECISION", "DOUBLE PRECISION"); + test_parse_data_type("DOUBLE", "DOUBLE"); + + fn test_parse_data_type(input: &str, expected: &str) { + all_dialects().run_parser_method(input, |parser| { + let data_type = parser.parse_data_type().unwrap().to_string(); + assert_eq!(data_type, expected); + }); + } + } }