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

   ### Describe the bug
   
   Parameterized queries with placeholders before `IN <subquery>` are not 
inferred. For example,
   
   ```sql
   SELECT * FROM my_table WHERE $1 IN (SELECT A FROM my_table WHERE B > 3);
   ```
   
   ### To Reproduce
   
   ```rust
   // Schema for my_table: A (Int32), B (Int32)
   let schema = Arc::new(Schema::new(vec![
       Field::new("A", DataType::Int32, true),
       Field::new("B", DataType::Int32, true),
   ]));
   
   let source = Arc::new(LogicalTableSource::new(schema.clone()));
   
   // SELECT * FROM my_table WHERE $1 IN (SELECT A FROM my_table WHERE B > 3);
   let placeholder = Expr::Placeholder(Placeholder {
       id: "$1".to_string(),
       data_type: None,
   });
   
   // Subquery: SELECT A FROM my_table WHERE B > 3
   let subquery_filter = Expr::BinaryExpr(BinaryExpr {
       left: Box::new(col("B")),
       op: Operator::Gt,
       right: Box::new(Expr::Literal(ScalarValue::Int32(Some(3)))),
   });
   
   let subquery_scan = LogicalPlan::TableScan(TableScan {
       table_name: TableReference::from("my_table"),
       source,
       projected_schema: Arc::new(DFSchema::try_from(schema.clone())?),
       projection: None,
       filters: vec![subquery_filter.clone()],
       fetch: None,
   });
   
   let projected_fields = vec![Field::new("A", DataType::Int32, true)];
   let projected_schema = Arc::new(DFSchema::from_unqualified_fields(
       projected_fields.into(),
       Default::default(),
   )?);
   
   let subquery = Subquery {
       subquery: Arc::new(LogicalPlan::Projection(Projection {
           expr: vec![col("A")],
           input: Arc::new(subquery_scan),
           schema: projected_schema,
       })),
       outer_ref_columns: vec![],
   };
   
   let in_subquery = Expr::InSubquery(InSubquery {
       expr: Box::new(placeholder),
       subquery,
       negated: false,
   });
   
   let df_schema = DFSchema::try_from(schema)?;
   
   let (inferred_expr, contains_placeholder) =
       in_subquery.infer_placeholder_types(&df_schema)?;
   
   assert!(
       contains_placeholder,
       "Expression should contain a placeholder"
   );
   
   match inferred_expr {
       Expr::InSubquery(in_subquery) => match *in_subquery.expr {
           Expr::Placeholder(placeholder) => {
               assert_eq!(
                   placeholder.data_type,
                   Some(DataType::Int32),
                   "Placeholder $1 should infer Int32"
               );
           }
           _ => panic!("Expected Placeholder expression in InSubquery"),
       },
       _ => panic!("Expected InSubquery expression"),
   }
   ```
   
   ```shell
   assertion `left == right` failed: Placeholder $1 should infer Int32
     left: None
    right: Some(Int32)
   ```
   
   ### Expected behavior
   
   Assertions pass.
   
   ### Additional context
   
   _No response_


-- 
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-unsubscr...@datafusion.apache.org.apache.org

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


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

Reply via email to