Skip to content

Field alias can't work in where clause #4288

@hengfeiyang

Description

@hengfeiyang

Describe the bug
It can't work like this:

SELECT foo AS bar FROM t WHERE bar > 10

I have the field foo just give it an alias bar then as a where clause, it will report the error:

Error: SchemaError(FieldNotFound { qualifier: None, name: "bar", valid_fields: Some(["t.foo"]) })

To Reproduce
Steps to reproduce the behavior:

Expected behavior

It can work.

Additional context

My demo code:

use std::sync::Arc;

use datafusion::arrow::array::Int32Array;
use datafusion::arrow::datatypes::{DataType, Field, Schema};
use datafusion::arrow::record_batch::RecordBatch;
use datafusion::datasource::MemTable;
use datafusion::error::Result;
use datafusion::from_slice::FromSlice;
use datafusion::prelude::SessionContext;

/// This example demonstrates how to use the DataFrame API against in-memory data.
#[tokio::main]
async fn main() -> Result<()> {
    // define a schema.
    let schema = Arc::new(Schema::new(vec![Field::new("foo", DataType::Int32, false)]));

    // define data.
    let batch = RecordBatch::try_new(
        schema.clone(),
        vec![Arc::new(Int32Array::from_slice([1, 10, 10, 100]))],
    )?;

    // declare a new context. In spark API, this corresponds to a new spark SQLsession
    let ctx = SessionContext::new();

    // declare a table in memory. In spark API, this corresponds to createDataFrame(...).
    let provider = MemTable::try_new(schema.clone(), vec![vec![batch]])?;
    ctx.register_table("t", Arc::new(provider))?;
    let df = ctx.sql("SELECT foo AS bar FROM t WHERE bar > 10").await?;

    // print the results
    df.show().await?;

    Ok(())
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions