From 3c8e4e386fc8a0bbe05c9d163f496a2406b4955b Mon Sep 17 00:00:00 2001 From: parkma99 Date: Fri, 23 Jun 2023 22:30:27 +0800 Subject: [PATCH 1/3] add strict --- src/ast/helpers/stmt_create_table.rs | 10 ++++++++++ src/ast/mod.rs | 9 ++++++++- src/keywords.rs | 1 + src/parser.rs | 2 ++ tests/sqlparser_sqlite.rs | 9 +++++++++ 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/ast/helpers/stmt_create_table.rs b/src/ast/helpers/stmt_create_table.rs index cb1ad45e7..19809f4da 100644 --- a/src/ast/helpers/stmt_create_table.rs +++ b/src/ast/helpers/stmt_create_table.rs @@ -70,6 +70,7 @@ pub struct CreateTableBuilder { pub on_commit: Option, pub on_cluster: Option, pub order_by: Option>, + pub strict: bool, } impl CreateTableBuilder { @@ -100,6 +101,7 @@ impl CreateTableBuilder { on_commit: None, on_cluster: None, order_by: None, + strict: false, } } pub fn or_replace(mut self, or_replace: bool) -> Self { @@ -220,6 +222,11 @@ impl CreateTableBuilder { self } + pub fn strict(mut self, strict: bool) -> Self{ + self.strict = strict; + self + } + pub fn build(self) -> Statement { Statement::CreateTable { or_replace: self.or_replace, @@ -247,6 +254,7 @@ impl CreateTableBuilder { on_commit: self.on_commit, on_cluster: self.on_cluster, order_by: self.order_by, + strict: self.strict, } } } @@ -284,6 +292,7 @@ impl TryFrom for CreateTableBuilder { on_commit, on_cluster, order_by, + strict, } => Ok(Self { or_replace, temporary, @@ -310,6 +319,7 @@ impl TryFrom for CreateTableBuilder { on_commit, on_cluster, order_by, + strict, }), _ => Err(ParserError::ParserError(format!( "Expected create table statement, but received: {stmt}" diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 9c55c5d6d..e5ab7a9fc 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -1316,6 +1316,10 @@ pub enum Statement { /// than empty (represented as ()), the latter meaning "no sorting". /// order_by: Option>, + /// SQLite "STRICT" clause. + /// if the "STRICT" table-option keyword is added to the end, after the closing ")", + /// then strict typing rules apply to that table. + strict: bool, }, /// SQLite's `CREATE VIRTUAL TABLE .. USING ()` CreateVirtualTable { @@ -2219,6 +2223,7 @@ impl fmt::Display for Statement { on_commit, on_cluster, order_by, + strict, } => { // We want to allow the following options // Empty column list, allowed by PostgreSQL: @@ -2387,7 +2392,9 @@ impl fmt::Display for Statement { }; write!(f, " {on_commit}")?; } - + if *strict { + write!(f, " STRICT")?; + } Ok(()) } Statement::CreateVirtualTable { diff --git a/src/keywords.rs b/src/keywords.rs index a76a9c953..463899804 100644 --- a/src/keywords.rs +++ b/src/keywords.rs @@ -551,6 +551,7 @@ define_keywords!( STDOUT, STORAGE_INTEGRATION, STORED, + STRICT, STRING, SUBMULTISET, SUBSTRING, diff --git a/src/parser.rs b/src/parser.rs index a3f06047f..0b1421463 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -3485,6 +3485,7 @@ impl<'a> Parser<'a> { None }; + let strict = self.parse_keyword(Keyword::STRICT); Ok(CreateTableBuilder::new(table_name) .temporary(temporary) .columns(columns) @@ -3507,6 +3508,7 @@ impl<'a> Parser<'a> { .collation(collation) .on_commit(on_commit) .on_cluster(on_cluster) + .strict(strict) .build()) } diff --git a/tests/sqlparser_sqlite.rs b/tests/sqlparser_sqlite.rs index 31d2dd97f..08708d9a5 100644 --- a/tests/sqlparser_sqlite.rs +++ b/tests/sqlparser_sqlite.rs @@ -242,6 +242,15 @@ fn parse_similar_to() { chk(true); } +#[test] +fn parse_create_table_with_strict() { + let sql = "CREATE TABLE Fruits (id TEXT NOT NULL PRIMARY KEY) STRICT"; + if let Statement::CreateTable { name, strict, .. } = sqlite().verified_stmt(sql) { + assert_eq!(name.to_string(), "Fruits"); + assert_eq!(strict, true); + } +} + fn sqlite() -> TestedDialects { TestedDialects { dialects: vec![Box::new(SQLiteDialect {})], From 4f039d308db8abf39cef0d31c8610c0993cff268 Mon Sep 17 00:00:00 2001 From: parkma99 Date: Fri, 23 Jun 2023 22:32:20 +0800 Subject: [PATCH 2/3] fix fmt --- src/ast/helpers/stmt_create_table.rs | 2 +- src/ast/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ast/helpers/stmt_create_table.rs b/src/ast/helpers/stmt_create_table.rs index 19809f4da..2998935d9 100644 --- a/src/ast/helpers/stmt_create_table.rs +++ b/src/ast/helpers/stmt_create_table.rs @@ -222,7 +222,7 @@ impl CreateTableBuilder { self } - pub fn strict(mut self, strict: bool) -> Self{ + pub fn strict(mut self, strict: bool) -> Self { self.strict = strict; self } diff --git a/src/ast/mod.rs b/src/ast/mod.rs index e5ab7a9fc..5652cce19 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -1318,7 +1318,7 @@ pub enum Statement { order_by: Option>, /// SQLite "STRICT" clause. /// if the "STRICT" table-option keyword is added to the end, after the closing ")", - /// then strict typing rules apply to that table. + /// then strict typing rules apply to that table. strict: bool, }, /// SQLite's `CREATE VIRTUAL TABLE .. USING ()` From c75d8e19d877f81eb89a1d2385d9bdae4b4d954a Mon Sep 17 00:00:00 2001 From: Andrew Lamb Date: Fri, 23 Jun 2023 10:47:49 -0400 Subject: [PATCH 3/3] Fix clppy --- tests/sqlparser_sqlite.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/sqlparser_sqlite.rs b/tests/sqlparser_sqlite.rs index 08708d9a5..8f6cc7572 100644 --- a/tests/sqlparser_sqlite.rs +++ b/tests/sqlparser_sqlite.rs @@ -247,7 +247,7 @@ fn parse_create_table_with_strict() { let sql = "CREATE TABLE Fruits (id TEXT NOT NULL PRIMARY KEY) STRICT"; if let Statement::CreateTable { name, strict, .. } = sqlite().verified_stmt(sql) { assert_eq!(name.to_string(), "Fruits"); - assert_eq!(strict, true); + assert!(strict); } }