alamb commented on code in PR #15743:
URL: https://github.com/apache/datafusion/pull/15743#discussion_r2075226062


##########
datafusion/sql/src/statement.rs:
##########
@@ -710,6 +710,25 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
                     *statement,
                     &mut planner_context,
                 )?;
+
+                //Get inferred data_types from the plan if it is empty in the 
prepare statement
+                let data_types = match data_types.is_empty() {

Review Comment:
   is there a reason to use a match rather than just if/else?
   
   ```suggestion
                   let data_types = if data_types.is_empty() {
   ```
   ...
   ?



##########
datafusion/sql/src/statement.rs:
##########
@@ -710,6 +710,25 @@ impl<S: ContextProvider> SqlToRel<'_, S> {
                     *statement,
                     &mut planner_context,
                 )?;
+
+                //Get inferred data_types from the plan if it is empty in the 
prepare statement
+                let data_types = match data_types.is_empty() {
+                    true => {
+                        let mut data_types: Vec<DataType> = plan
+                            .get_parameter_types()?
+                            .iter()
+                            .filter_map(|d| match d {
+                                (_, Some(v)) => Some(v.clone()),
+                                _ => None,
+                            })
+                            .collect::<Vec<DataType>>();
+                        data_types.sort();
+                        
planner_context.with_prepare_param_data_types(data_types.clone());
+                        data_types
+                    }
+                    false => data_types,
+                };
+

Review Comment:
   yes, I agree making the behavior change in a separate PR might be better
   
   Perhaps we could add a method on the `Prepare` struct that would return the 
parameter types (or walk over the expressions in the plan calling infer types 
if the parameter types are not specified)
   
   
https://docs.rs/datafusion/latest/datafusion/logical_expr/struct.Prepare.html#structfield.data_types
   
   So then the test would look like
   
   ```rust
   #[test]
   fn test_infer_types_from_join() {
       let sql =
           "SELECT id, order_id FROM person JOIN orders ON id = customer_id and 
age = $1";
   
       let plan = logical_plan(sql).unwrap();
       assert_snapshot!(
           plan,
           @r#"
       Projection: person.id, orders.order_id
         Inner Join:  Filter: person.id = orders.customer_id AND person.age = $1
           TableScan: person
           TableScan: orders
       "#
       );
   
       // NEW: verify the parameter types
       let LogicalPlan::Prepare(prepare) = plan else {
         panic!("Expected prepare, got {plan:?}");
       };
   
       // call new function to create or infer the datatypes
       assert_eq!(prepare.get_or_infer_datatypes(), vec![DataType::Int32]);
   ```



-- 
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

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