diff --git a/src/parser/mod.rs b/src/parser/mod.rs index ca5f06ba0..57a86260b 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -2547,7 +2547,7 @@ impl<'a> Parser<'a> { expr: Box::new(expr), }) } else if Token::LBracket == tok { - if dialect_of!(self is PostgreSqlDialect | GenericDialect) { + if dialect_of!(self is PostgreSqlDialect | DuckDbDialect | GenericDialect) { // parse index self.parse_array_index(expr) } else if dialect_of!(self is SnowflakeDialect) { diff --git a/tests/sqlparser_duckdb.rs b/tests/sqlparser_duckdb.rs index 37fbbfbfc..a84da5378 100644 --- a/tests/sqlparser_duckdb.rs +++ b/tests/sqlparser_duckdb.rs @@ -516,3 +516,29 @@ fn test_duckdb_named_argument_function_with_assignment_operator() { expr_from_projection(only(&select.projection)) ); } + +#[test] +fn test_array_index() { + let sql = r#"SELECT ['a', 'b', 'c'][3] AS three"#; + let select = duckdb().verified_only_select(sql); + let projection = &select.projection; + assert_eq!(1, projection.len()); + let expr = match &projection[0] { + SelectItem::ExprWithAlias { expr, .. } => expr, + _ => panic!("Expected an expression with alias"), + }; + assert_eq!( + &Expr::ArrayIndex { + obj: Box::new(Expr::Array(Array { + elem: vec![ + Expr::Value(Value::SingleQuotedString("a".to_owned())), + Expr::Value(Value::SingleQuotedString("b".to_owned())), + Expr::Value(Value::SingleQuotedString("c".to_owned())) + ], + named: false + })), + indexes: vec![Expr::Value(number("3"))] + }, + expr + ); +}