datafusion icon indicating copy to clipboard operation
datafusion copied to clipboard

Substrait doesn't support alias in projection

Open waynexia opened this issue 2 years ago • 2 comments

Describe the bug

SQLs like these will fail:

SELECT a as alias_a, a FROM data;

or

SELECT a as alias_a FROM data ORDER BY a;

The error message looks like

Error: Plan("Projections require unique expression names but the expression \"data.a\" at position 0 and \"data.a\" at position 1 have the same name. Consider aliasing (\"AS\") one of them.")

To Reproduce

Adding case in datafusion/substrait/tests/roundtrip_logical_plan.rs like:

    #[tokio::test]
    async fn roundtrip_alias_in_projection() -> Result<()> {
        roundtrip("SELECT a as alias_a, a FROM data").await
    }

Expected behavior

It should generate correct LogicalPlan without error

Additional context

No response

waynexia avatar May 30 '23 14:05 waynexia

https://github.com/apache/arrow-datafusion/pull/5077/files#diff-7bd0ab7829b96498566ab887a4003134c38092e96441b8f5c8ccdb297478884eR384-R386 processes Expr::Alias but it isn't supported yet.

#[tokio::test]
async fn roundtrip_field_alias() -> Result<()> {
    roundtrip("SELECT data.a as b FROM data").await
}

Fails with

Projection: data.a AS b
  TableScan: data projection=[a]
TableScan: data projection=[a]
thread 'cases::roundtrip_logical_plan::roundtrip_field_alias' panicked at 'assertion failed: `(left == right)`
  left: `"Projection: data.a AS b\n  TableScan: data projection=[a]"`,
 right: `"TableScan: data projection=[a]"`

waynexia avatar Nov 13 '23 08:11 waynexia

Looks like it was fix in https://github.com/apache/datafusion/pull/10829

killme2008 avatar Jun 25 '24 19:06 killme2008

Yea @waynexia I think this one should be fixed!

The included test case almost works, the plan isn't exactly the same after the roundtrip, but effectively still the same:

assertion `left == right` failed
  left: "Projection: data.a AS alias_a, data.a\n  TableScan: data projection=[a]"
 right: "Projection: data.a AS alias_a, data.a AS data.a__temp__0 AS a\n  TableScan: data projection=[a]"

Blizzara avatar May 21 '25 17:05 Blizzara