diff --git a/src/dialect/generic.rs b/src/dialect/generic.rs index 8bec45b28..92d720a0b 100644 --- a/src/dialect/generic.rs +++ b/src/dialect/generic.rs @@ -103,4 +103,8 @@ impl Dialect for GenericDialect { fn supports_limit_comma(&self) -> bool { true } + + fn supports_asc_desc_in_column_definition(&self) -> bool { + true + } } diff --git a/src/dialect/mod.rs b/src/dialect/mod.rs index 29ad0b98a..744f5a8c8 100644 --- a/src/dialect/mod.rs +++ b/src/dialect/mod.rs @@ -557,6 +557,10 @@ pub trait Dialect: Debug + Any { fn supports_explain_with_utility_options(&self) -> bool { false } + + fn supports_asc_desc_in_column_definition(&self) -> bool { + false + } } /// This represents the operators for which precedence must be defined diff --git a/src/dialect/sqlite.rs b/src/dialect/sqlite.rs index 5c563bf4a..95717f9fd 100644 --- a/src/dialect/sqlite.rs +++ b/src/dialect/sqlite.rs @@ -77,4 +77,8 @@ impl Dialect for SQLiteDialect { fn supports_limit_comma(&self) -> bool { true } + + fn supports_asc_desc_in_column_definition(&self) -> bool { + true + } } diff --git a/src/parser/mod.rs b/src/parser/mod.rs index a4445e04d..5da21b57d 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -6175,6 +6175,20 @@ impl<'a> Parser<'a> { Ok(Some(ColumnOption::DialectSpecific(vec![ Token::make_keyword("AUTOINCREMENT"), ]))) + } else if self.parse_keyword(Keyword::ASC) + && self.dialect.supports_asc_desc_in_column_definition() + { + // Support ASC for SQLite + Ok(Some(ColumnOption::DialectSpecific(vec![ + Token::make_keyword("ASC"), + ]))) + } else if self.parse_keyword(Keyword::DESC) + && self.dialect.supports_asc_desc_in_column_definition() + { + // Support DESC for SQLite + Ok(Some(ColumnOption::DialectSpecific(vec![ + Token::make_keyword("DESC"), + ]))) } else if self.parse_keywords(&[Keyword::ON, Keyword::UPDATE]) && dialect_of!(self is MySqlDialect | GenericDialect) { diff --git a/tests/sqlparser_sqlite.rs b/tests/sqlparser_sqlite.rs index d7fd3b896..85f2f9409 100644 --- a/tests/sqlparser_sqlite.rs +++ b/tests/sqlparser_sqlite.rs @@ -237,6 +237,43 @@ fn parse_create_table_auto_increment() { } } +#[test] +fn parse_create_table_primary_key_asc_desc() { + let expected_column_def = |kind| ColumnDef { + name: "bar".into(), + data_type: DataType::Int(None), + collation: None, + options: vec![ + ColumnOptionDef { + name: None, + option: ColumnOption::Unique { + is_primary: true, + characteristics: None, + }, + }, + ColumnOptionDef { + name: None, + option: ColumnOption::DialectSpecific(vec![Token::make_keyword(kind)]), + }, + ], + }; + + let sql = "CREATE TABLE foo (bar INT PRIMARY KEY ASC)"; + match sqlite_and_generic().verified_stmt(sql) { + Statement::CreateTable(CreateTable { columns, .. }) => { + assert_eq!(vec![expected_column_def("ASC")], columns); + } + _ => unreachable!(), + } + let sql = "CREATE TABLE foo (bar INT PRIMARY KEY DESC)"; + match sqlite_and_generic().verified_stmt(sql) { + Statement::CreateTable(CreateTable { columns, .. }) => { + assert_eq!(vec![expected_column_def("DESC")], columns); + } + _ => unreachable!(), + } +} + #[test] fn parse_create_sqlite_quote() { let sql = "CREATE TABLE `PRIMARY` (\"KEY\" INT, [INDEX] INT)";