Skip to content

Alias metadata may be lost when the physical expression is created #27156

Open

Description

@paleolimbot

Describe the bug

When a (non literal) logical alias gets converted to a physical expression, its PhysicalExpr equivalent doesn't have the same return field. I'm not sure if aliases are special cased in such a way that this matters in practice.

To Reproduce

#[test]
fn non_literal_alias_metadata_differs_between_logical_and_physical() -> Result<()> {
    let schema = Schema::new(vec![Field::new("value", DataType::Int64, false)]);
    let df_schema = DFSchema::try_from(schema.clone())?;

    let metadata = FieldMetadata::from(HashMap::from([(
        "source".to_string(),
        "alias".to_string(),
    )]));

    let expr = col("value").alias_with_metadata("aliased_value", Some(metadata));

    let logical_field = expr.to_field(&df_schema)?.1;
    let physical_expr = create_physical_expr(
        &expr,
        &df_schema,
        &ExecutionProps::new(),
        &PhysicalPlanningContext::default(),
    )?;
    let physical_field = physical_expr.return_field(&schema)?;

    // Logical Alias applies its supplied metadata.
    assert_eq!(
        logical_field.metadata().get("source").map(String::as_str),
        Some("alias")
    );

    // Physical lowering removes a non-literal Alias and its metadata.
    assert_eq!(physical_field.metadata().get("source"), None);

    Ok(())
}

Expected behavior

I believe a property we want to hold is that an expr and its create_physical_expr equivalent should always give the same return field.

Additional context

No response

Willingness to contribute

None

Activity

  1. added theissue type on Nov 6, 2026
  2. Phoenix500526 commented on Nov 6, 2026

    @Phoenix500526
    Contributor

    take

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions