From 927dbbdeb6a4be625660abf9431ae33f2037953e Mon Sep 17 00:00:00 2001 From: artorias1024 Date: Thu, 19 Dec 2024 10:29:59 +0800 Subject: [PATCH 1/3] Supports parsing DOUBLE data types with precision. --- src/ast/data_type.rs | 4 ++-- src/parser/mod.rs | 4 +++- tests/sqlparser_mysql.rs | 11 +++++++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/ast/data_type.rs b/src/ast/data_type.rs index b53b8f0d2..02aa6cc9f 100644 --- a/src/ast/data_type.rs +++ b/src/ast/data_type.rs @@ -254,7 +254,7 @@ pub enum DataType { /// [postgresql]: https://www.postgresql.org/docs/15/datatype.html Float8, /// Double - Double, + Double(ExactNumberInfo), /// Double PRECISION e.g. [standard], [postgresql] /// /// [standard]: https://jakewheat.github.io/sql-overview/sql-2016-foundation-grammar.html#approximate-numeric-type @@ -508,7 +508,7 @@ impl fmt::Display for DataType { DataType::Float4 => write!(f, "FLOAT4"), DataType::Float32 => write!(f, "Float32"), DataType::Float64 => write!(f, "FLOAT64"), - DataType::Double => write!(f, "DOUBLE"), + DataType::Double(info) => write!(f, "DOUBLE{info}"), DataType::Float8 => write!(f, "FLOAT8"), DataType::DoublePrecision => write!(f, "DOUBLE PRECISION"), DataType::Bool => write!(f, "BOOL"), diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 94d63cf80..ca8caf64c 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -8114,7 +8114,9 @@ impl<'a> Parser<'a> { if self.parse_keyword(Keyword::PRECISION) { Ok(DataType::DoublePrecision) } else { - Ok(DataType::Double) + Ok(DataType::Double( + self.parse_exact_number_optional_precision_scale()? + )) } } Keyword::TINYINT => { diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs index bc7bf2f88..f834876c5 100644 --- a/tests/sqlparser_mysql.rs +++ b/tests/sqlparser_mysql.rs @@ -3022,3 +3022,14 @@ fn parse_longblob_type() { fn parse_begin_without_transaction() { mysql().verified_stmt("BEGIN"); } + + +#[test] +fn parse_double_precision() { + mysql().verified_stmt("CREATE TABLE foo (bar DOUBLE)"); + mysql().verified_stmt("CREATE TABLE foo (bar DOUBLE(11,0))"); + mysql().one_statement_parses_to("CREATE TABLE foo (bar DOUBLE(11, 0))","CREATE TABLE foo (bar DOUBLE(11,0))"); + + +} + From 4b189aec09ddaf97c2a41993c8580caaf7b0e64e Mon Sep 17 00:00:00 2001 From: artorias1024 Date: Thu, 19 Dec 2024 10:38:28 +0800 Subject: [PATCH 2/3] Update the data type from DataType::Double to DataType::Double(ExactNumberInfo::None). --- tests/sqlparser_common.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 1bf9383af..17d431148 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -3003,7 +3003,7 @@ fn parse_create_table() { }, ColumnDef { name: "lat".into(), - data_type: DataType::Double, + data_type: DataType::Double(ExactNumberInfo::None), collation: None, options: vec![ColumnOptionDef { name: None, @@ -3012,7 +3012,7 @@ fn parse_create_table() { }, ColumnDef { name: "lng".into(), - data_type: DataType::Double, + data_type: DataType::Double(ExactNumberInfo::None), collation: None, options: vec![], }, @@ -3192,7 +3192,7 @@ fn parse_create_table_with_constraint_characteristics() { }, ColumnDef { name: "lat".into(), - data_type: DataType::Double, + data_type: DataType::Double(ExactNumberInfo::None), collation: None, options: vec![ColumnOptionDef { name: None, @@ -3201,7 +3201,7 @@ fn parse_create_table_with_constraint_characteristics() { }, ColumnDef { name: "lng".into(), - data_type: DataType::Double, + data_type: DataType::Double(ExactNumberInfo::None), collation: None, options: vec![], }, @@ -3832,7 +3832,7 @@ fn parse_create_external_table() { }, ColumnDef { name: "lat".into(), - data_type: DataType::Double, + data_type: DataType::Double(ExactNumberInfo::None), collation: None, options: vec![ColumnOptionDef { name: None, @@ -3841,7 +3841,7 @@ fn parse_create_external_table() { }, ColumnDef { name: "lng".into(), - data_type: DataType::Double, + data_type: DataType::Double(ExactNumberInfo::None), collation: None, options: vec![], }, From ae2117144be4a2b5315de812adf75dd376c6ed79 Mon Sep 17 00:00:00 2001 From: artorias1024 Date: Thu, 19 Dec 2024 17:57:58 +0800 Subject: [PATCH 3/3] cargo fmt fix --- src/parser/mod.rs | 2 +- tests/sqlparser_mysql.rs | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index ca8caf64c..2c9fbc9d2 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -8115,7 +8115,7 @@ impl<'a> Parser<'a> { Ok(DataType::DoublePrecision) } else { Ok(DataType::Double( - self.parse_exact_number_optional_precision_scale()? + self.parse_exact_number_optional_precision_scale()?, )) } } diff --git a/tests/sqlparser_mysql.rs b/tests/sqlparser_mysql.rs index f834876c5..4a4e79611 100644 --- a/tests/sqlparser_mysql.rs +++ b/tests/sqlparser_mysql.rs @@ -3023,13 +3023,12 @@ fn parse_begin_without_transaction() { mysql().verified_stmt("BEGIN"); } - #[test] fn parse_double_precision() { mysql().verified_stmt("CREATE TABLE foo (bar DOUBLE)"); mysql().verified_stmt("CREATE TABLE foo (bar DOUBLE(11,0))"); - mysql().one_statement_parses_to("CREATE TABLE foo (bar DOUBLE(11, 0))","CREATE TABLE foo (bar DOUBLE(11,0))"); - - + mysql().one_statement_parses_to( + "CREATE TABLE foo (bar DOUBLE(11, 0))", + "CREATE TABLE foo (bar DOUBLE(11,0))", + ); } -