From e3692f4681e958e1ed2110494636032e5d53b710 Mon Sep 17 00:00:00 2001 From: Jichao Sun <4977515+JichaoS@users.noreply.github.com> Date: Thu, 9 May 2024 03:50:15 -0700 Subject: [PATCH] Support array indexing for duckdb (#1265) --- src/parser/mod.rs | 2 +- tests/sqlparser_duckdb.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index ca5f06ba..57a86260 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 37fbbfbf..a84da537 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 + ); +}