-
Notifications
You must be signed in to change notification settings - Fork 669
Description
Problem
Currently, we support struct syntax such as:
SELECT struct_col.field_1 FROM t1 However, if the column is a struct array, we cannot use SQL like:
SELECT struct_array_col[1].field_1 FROM t1 Additionally, we cannot access fields in structs created using a function (e.g., named_struct, the corresponding function in DataFusion):
SELECT named_struct('a', 1, 'b', 2).a To address this, we could use the Expr::MapAccess approach:
SELECT named_struct('a', 1, 'b', 2)['a'] However, the . syntax is more commonly used for structs, as seen in systems like DuckDB or BigQuery.
Proposal
Inspired from how Trino handles such expressions (DereferenceExpression), I propose introducing a new Expr variant:
/// Parses SQL expressions like `<base>.<field>`
DereferenceExpr {
base: Box<Expr>,
field: Ident,
} This could potentially replace CompoundIdentifier, as the latter is essentially a specific case of DereferenceExpr:
DereferenceExpr(DereferenceExpr(DereferenceExpr, Ident)) However, this change might break downstream projects. I prefer not to make such a breaking change in this issue.
After some research, I found that CompositeAccess has the same structure. We can enhance it to support the struct field access.
MapAccess is the better way.