alamb commented on code in PR #5216:
URL: https://github.com/apache/arrow-datafusion/pull/5216#discussion_r1100515076
##########
datafusion/expr/src/logical_plan/plan.rs:
##########
@@ -710,31 +711,39 @@ impl LogicalPlan {
param_values: &[ScalarValue],
) -> Result<Expr, DataFusionError> {
rewrite_expr(expr, |expr| {
- if let Expr::Placeholder { id, data_type } = &expr {
- // convert id (in format $1, $2, ..) to idx (0, 1, ..)
- let idx = id[1..].parse::<usize>().map_err(|e| {
- DataFusionError::Internal(format!(
- "Failed to parse placeholder id: {e}"
- ))
- })? - 1;
- // value at the idx-th position in param_values should be the
value for the placeholder
- let value = param_values.get(idx).ok_or_else(|| {
- DataFusionError::Internal(format!(
- "No value found for placeholder with id {id}"
- ))
- })?;
- // check if the data type of the value matches the data type
of the placeholder
- if Some(value.get_datatype()) != *data_type {
- return Err(DataFusionError::Internal(format!(
- "Placeholder value type mismatch: expected {:?}, got
{:?}",
- data_type,
- value.get_datatype()
- )));
+ match &expr {
+ Expr::Placeholder { id, data_type } => {
+ // convert id (in format $1, $2, ..) to idx (0, 1, ..)
+ let idx = id[1..].parse::<usize>().map_err(|e| {
+ DataFusionError::Internal(format!(
+ "Failed to parse placeholder id: {e}"
+ ))
+ })? - 1;
+ // value at the idx-th position in param_values should be
the value for the placeholder
+ let value = param_values.get(idx).ok_or_else(|| {
+ DataFusionError::Internal(format!(
+ "No value found for placeholder with id {id}"
+ ))
+ })?;
+ // check if the data type of the value matches the data
type of the placeholder
+ if Some(value.get_datatype()) != *data_type {
+ return Err(DataFusionError::Internal(format!(
+ "Placeholder value type mismatch: expected {:?},
got {:?}",
+ data_type,
+ value.get_datatype()
+ )));
+ }
+ // Replace the placeholder with the value
+ Ok(Expr::Literal(value.clone()))
}
- // Replace the placeholder with the value
- Ok(Expr::Literal(value.clone()))
- } else {
- Ok(expr)
+ Expr::ScalarSubquery(qry) => {
Review Comment:
I was thinking that the recursion into ScalarSubquery would happen as part
of the ExprRewriter itself -- aka
https://github.com/apache/arrow-datafusion/blob/e222bd627b6e7974133364fed4600d74b4da6811/datafusion/expr/src/expr_rewriter.rs#L132
```rust
Expr::ScalarSubquery(_) => self.clone(),
```
Instead of `self.clone()` it would be something like you have in this PR
```rust
Expr::ScalarSubquery(qry) => self.clone(),
let rewritten_subquery = somehow_rewrite_all_exprs_in_query(rewriter)
Expr::ScalarSubquery(rewritten_subquery)
}
```
--
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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]