You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@datafusion.apache.org by "goldmedal (via GitHub)" <gi...@apache.org> on 2024/11/06 04:44:44 UTC

[I] Unparse SubqueryAlias with the pushdown TableScan fail [datafusion]

goldmedal opened a new issue, #13272:
URL: https://github.com/apache/datafusion/issues/13272

   ### Describe the bug
   
   I tried to unparse an optimized plan but encountered a 'field not found' issue. The unoptimized plan unparses correctly, suggesting a bug in the unparsing for `TableScan` with some pushdown. I've provided the reproduction program in the next section and the execution result below.
   
   ## The executed result
   ```sql
   ## Input SQL: 
   SELECT
     customer_view.c_custkey,
     customer_view.c_name,
     customer_view.custkey_plus
   FROM
     (
       SELECT
         customer.c_custkey,
         customer.c_name,
         customer.custkey_plus
       FROM
         (
           SELECT
             customer.c_custkey,
             CAST(customer.c_custkey AS BIGINT) + 1 AS custkey_plus,
             customer.c_name
           FROM
             (
               SELECT
                 customer.c_custkey AS c_custkey,
                 customer.c_name AS c_name
               FROM
                 customer
             ) AS customer
         ) AS customer
     ) AS customer_view
       
   ## Unoptimized Plan
   Projection: customer_view.c_custkey, customer_view.c_name, customer_view.custkey_plus
     SubqueryAlias: customer_view
       Projection: customer.c_custkey, customer.c_name, customer.custkey_plus
         SubqueryAlias: customer
           Projection: customer.c_custkey, CAST(customer.c_custkey AS Int64) + Int64(1) AS custkey_plus, customer.c_name
             SubqueryAlias: customer
               Projection: customer.c_custkey, customer.c_name
                 TableScan: customer
   
   ## Unparse unoptimized plan:
   SELECT customer_view.c_custkey, customer_view.c_name, customer_view.custkey_plus FROM (SELECT customer.c_custkey, customer.c_name, customer.custkey_plus FROM (SELECT customer.c_custkey, (CAST(customer.c_custkey AS BIGINT) + 1) AS custkey_plus, customer.c_name FROM (SELECT customer.c_custkey, customer.c_name FROM customer) AS customer) AS customer) AS customer_view
   
   ## Optimized Plan
   SubqueryAlias: customer_view
     Projection: customer.c_custkey, customer.c_name, customer.custkey_plus
       SubqueryAlias: customer
         Projection: customer.c_custkey, CAST(customer.c_custkey AS Int64) + Int64(1) AS custkey_plus, customer.c_name
           SubqueryAlias: customer
             TableScan: customer projection=[c_custkey, c_name]
   
   
   Error: Schema error: No field named customer_view.c_custkey. Valid fields are customer.c_custkey, custkey_plus, customer.c_name.
   ```
   
   
   ### To Reproduce
   
   The executable main:
   
   ```rust
   #[tokio::main]
   pub async fn main() -> Result<()> {
       let ctx = SessionContext::new();
       let sql = r#"
   SELECT
     customer_view.c_custkey,
     customer_view.c_name,
     customer_view.custkey_plus
   FROM
     (
       SELECT
         customer.c_custkey,
         customer.c_name,
         customer.custkey_plus
       FROM
         (
           SELECT
             customer.c_custkey,
             CAST(customer.c_custkey AS BIGINT) + 1 AS custkey_plus,
             customer.c_name
           FROM
             (
               SELECT
                 customer.c_custkey AS c_custkey,
                 customer.c_name AS c_name
               FROM
                 customer
             ) AS customer
         ) AS customer
     ) AS customer_view
       "#;
       ctx.register_batch("customer", customer())?;
       println!("Input SQL: {}", sql);
       let plan = ctx.sql(sql).await?.into_unoptimized_plan();
       println!("## Unoptimized Plan");
       println!("{}", plan);
       let result = plan_to_sql(&plan)?;
       println!("Unparse unoptimized plan: {}", result);
   
       let plan = ctx.sql(sql).await?.into_optimized_plan()?;
       println!("## Optimized Plan");
       println!("{}", plan);
       match plan_to_sql(&plan) {
           Ok(sql) => {
               println!("{}", sql);
           }
           Err(e) => {
               eprintln!("Error: {}", e);
           }
       }
       Ok(())
   }
   
   
   /// Return a RecordBatch with made up data about customer
   fn customer() -> RecordBatch {
       let custkey: ArrayRef = Arc::new(Int64Array::from(vec![1, 2, 3]));
       let name: ArrayRef =
           Arc::new(StringArray::from_iter_values(["Gura", "Azki", "Ina"]));
       RecordBatch::try_from_iter(vec![("c_custkey", custkey), ("c_name", name)])
           .unwrap()
   }
   ```
   
   ### Expected behavior
   
   The optimized plan should be unparsed well.
   
   ### Additional context
   
   The full backtrace:
   ```
   backtrace:    0: std::backtrace_rs::backtrace::libunwind::trace
                at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/../../backtrace/src/backtrace/libunwind.rs:116:5
      1: std::backtrace_rs::backtrace::trace_unsynchronized
                at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
      2: std::backtrace::Backtrace::create
                at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/backtrace.rs:331:13
      3: std::backtrace::Backtrace::capture
                at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/std/src/backtrace.rs:296:9
      4: datafusion_common::error::DataFusionError::get_back_trace
                at ./datafusion/common/src/error.rs:398:30
      5: datafusion_common::error::field_not_found
                at ./datafusion/common/src/error.rs:603:27
      6: datafusion_common::dfschema::DFSchema::field_with_qualified_name::{{closure}}
                at ./datafusion/common/src/dfschema.rs:529:28
      7: core::option::Option<T>::ok_or_else
                at /rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14/library/core/src/option.rs:1269:25
      8: datafusion_common::dfschema::DFSchema::field_with_qualified_name
                at ./datafusion/common/src/dfschema.rs:527:19
      9: datafusion_common::dfschema::DFSchema::field_from_column
                at ./datafusion/common/src/dfschema.rs:537:24
     10: <datafusion_common::dfschema::DFSchema as datafusion_common::dfschema::ExprSchema>::data_type_and_nullable
                at ./datafusion/common/src/dfschema.rs:961:21
     11: <P as datafusion_common::dfschema::ExprSchema>::data_type_and_nullable
                at ./datafusion/common/src/dfschema.rs:943:9
     12: <datafusion_expr::expr::Expr as datafusion_expr::expr_schema::ExprSchemable>::data_type_and_nullable
                at ./datafusion/expr/src/expr_schema.rs:379:32
     13: <datafusion_expr::expr::Expr as datafusion_expr::expr_schema::ExprSchemable>::to_field
                at ./datafusion/expr/src/expr_schema.rs:423:37
     14: datafusion_expr::utils::exprlist_to_fields::{{closure}}
                at ./datafusion/expr/src/utils.rs:757:26
   ...
     29: datafusion_expr::utils::exprlist_to_fields
                at ./datafusion/expr/src/utils.rs:703:18
     30: datafusion_expr::logical_plan::plan::projection_schema
                at ./datafusion/expr/src/logical_plan/plan.rs:2143:37
     31: datafusion_expr::logical_plan::plan::Projection::try_new
                at ./datafusion/expr/src/logical_plan/plan.rs:2093:33
     32: datafusion_expr::logical_plan::builder::project
                at ./datafusion/expr/src/logical_plan/builder.rs:1553:5
     33: datafusion_expr::logical_plan::builder::LogicalPlanBuilder::project
                at ./datafusion/expr/src/logical_plan/builder.rs:473:9
     34: datafusion_sql::unparser::plan::<impl datafusion_sql::unparser::Unparser>::unparse_table_scan_pushdown
                at ./datafusion/sql/src/unparser/plan.rs:820:25
     35: datafusion_sql::unparser::plan::<impl datafusion_sql::unparser::Unparser>::select_to_sql_recursively
                at ./datafusion/sql/src/unparser/plan.rs:567:43
     36: datafusion_sql::unparser::plan::<impl datafusion_sql::unparser::Unparser>::select_to_sql_expr
                at ./datafusion/sql/src/unparser/plan.rs:142:9
     37: datafusion_sql::unparser::plan::<impl datafusion_sql::unparser::Unparser>::select_to_sql_statement
                at ./datafusion/sql/src/unparser/plan.rs:127:20
     38: datafusion_sql::unparser::plan::<impl datafusion_sql::unparser::Unparser>::plan_to_sql
                at ./datafusion/sql/src/unparser/plan.rs:109:43
     39: datafusion_sql::unparser::plan::plan_to_sql
                at ./datafusion/sql/src/unparser/plan.rs:86:5
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org
For additional commands, e-mail: github-help@datafusion.apache.org


Re: [I] Unparse SubqueryAlias with the pushdown TableScan fail [datafusion]

Posted by "goldmedal (via GitHub)" <gi...@apache.org>.
goldmedal closed issue #13272: Unparse SubqueryAlias with the pushdown TableScan fail
URL: https://github.com/apache/datafusion/issues/13272


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org
For additional commands, e-mail: github-help@datafusion.apache.org