Skip to content

Expression column_refs does not return outer referenced columns in subqueries #15046

@helgikrs

Description

@helgikrs

Describe the bug

Calling column_refs() on a subquery expression returns no column references, even if the subquery contains outer references.

PushDownFilter optimization uses the column_refs() to compare against the columns returned from prevent_predicate_push_down_columns() on an extension node. The effect of this is that a subquery in a filter may get pushed below an extension node when it shouldn't.

To Reproduce

    let outer_ref = Expr::OuterReferenceColumn(DataType::Int64, Column::new(None::<String>, "a"));
    let plan = LogicalPlanBuilder::empty(true)
        .project(vec![outer_ref.clone()])
        .unwrap()
        .build()
        .unwrap();

    let subq = Subquery {
        subquery: Arc::new(plan),
        outer_ref_columns: vec![outer_ref],
    };

    let expr = Expr::Exists(Exists::new(subq, false));

    println!("{:?}", expr.column_refs());

Expected behavior

column_refs() should return the outer columns used by the subquery expression.

Additional context

The relevant code is here. It just collects Expr::Columns within self.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions