Skip to content

Commit 4452f9b

Browse files
authored
Support specifying ASC/DESC in index columns (#249)
...by reusing `OrderByExpr` for `columns` in `Statement::CreateIndex`. This supports SQLite's indexed-column syntax https://www.sqlite.org/syntax/indexed-column.html MSSQL's (`ON <object> ( column [ ASC | DESC ] [ ,...n ] )`) https://docs.microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql?view=sql-server-ver15 And most of PostgreSQL syntax (except for opclass): `( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )` https://www.postgresql.org/docs/12/sql-createindex.html
1 parent 9e7e302 commit 4452f9b

File tree

3 files changed

+18
-5
lines changed

3 files changed

+18
-5
lines changed

src/ast/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ pub enum Statement {
498498
/// index name
499499
name: ObjectName,
500500
table_name: ObjectName,
501-
columns: Vec<Ident>,
501+
columns: Vec<OrderByExpr>,
502502
unique: bool,
503503
if_not_exists: bool,
504504
},

src/parser.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1142,7 +1142,9 @@ impl Parser {
11421142
let index_name = self.parse_object_name()?;
11431143
self.expect_keyword(Keyword::ON)?;
11441144
let table_name = self.parse_object_name()?;
1145-
let columns = self.parse_parenthesized_column_list(Mandatory)?;
1145+
self.expect_token(&Token::LParen)?;
1146+
let columns = self.parse_comma_separated(Parser::parse_order_by_expr)?;
1147+
self.expect_token(&Token::RParen)?;
11461148
Ok(Statement::CreateIndex {
11471149
name: index_name,
11481150
table_name,

tests/sqlparser_common.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3152,8 +3152,19 @@ fn ensure_multiple_dialects_are_tested() {
31523152

31533153
#[test]
31543154
fn parse_create_index() {
3155-
let sql = "CREATE UNIQUE INDEX IF NOT EXISTS idx_name ON test(name,age)";
3156-
let ident_vec = vec![Ident::new("name"), Ident::new("age")];
3155+
let sql = "CREATE UNIQUE INDEX IF NOT EXISTS idx_name ON test(name,age DESC)";
3156+
let indexed_columns = vec![
3157+
OrderByExpr {
3158+
expr: Expr::Identifier(Ident::new("name")),
3159+
asc: None,
3160+
nulls_first: None,
3161+
},
3162+
OrderByExpr {
3163+
expr: Expr::Identifier(Ident::new("age")),
3164+
asc: Some(false),
3165+
nulls_first: None,
3166+
},
3167+
];
31573168
match verified_stmt(sql) {
31583169
Statement::CreateIndex {
31593170
name,
@@ -3164,7 +3175,7 @@ fn parse_create_index() {
31643175
} => {
31653176
assert_eq!("idx_name", name.to_string());
31663177
assert_eq!("test", table_name.to_string());
3167-
assert_eq!(ident_vec, columns);
3178+
assert_eq!(indexed_columns, columns);
31683179
assert_eq!(true, unique);
31693180
assert_eq!(true, if_not_exists)
31703181
}

0 commit comments

Comments
 (0)