comphead commented on code in PR #5638:
URL: https://github.com/apache/arrow-datafusion/pull/5638#discussion_r1141068734
##########
datafusion/sql/src/expr/mod.rs:
##########
@@ -499,36 +499,33 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
}
}
-/// Find all `PlaceHolder` tokens in a logical plan, and try to infer their
type from context
-fn infer_placeholder_types(expr: Expr, schema: DFSchema) -> Result<Expr> {
- rewrite_expr(expr, |expr| {
- let expr = match expr {
- Expr::BinaryExpr(BinaryExpr { left, op, right }) => {
- let left = (*left).clone();
- let right = (*right).clone();
- let lt = left.get_type(&schema);
- let rt = right.get_type(&schema);
- let left = match (&left, rt) {
- (Expr::Placeholder { id, data_type }, Ok(dt)) =>
Expr::Placeholder {
- id: id.clone(),
- data_type: Some(data_type.clone().unwrap_or(dt)),
- },
- _ => left.clone(),
- };
- let right = match (&right, lt) {
- (Expr::Placeholder { id, data_type }, Ok(dt)) =>
Expr::Placeholder {
- id: id.clone(),
- data_type: Some(data_type.clone().unwrap_or(dt)),
- },
- _ => right.clone(),
- };
- Expr::BinaryExpr(BinaryExpr {
- left: Box::new(left),
- op,
- right: Box::new(right),
- })
+// modifies expr if it is a placeholder with datatype of right
+fn rewrite_placeholder(expr: &mut Expr, other: &Expr, schema: &DFSchema) ->
Result<()> {
+ if let Expr::Placeholder { id: _, data_type } = expr {
+ if data_type.is_none() {
+ let other_dt = other.get_type(schema);
+ match other_dt {
+ Err(e) => {
+ return Err(e.context(format!(
+ "Can not find type of {other} needed to infer type of
{expr}"
+ )))?;
+ }
+ Ok(dt) => {
+ *data_type = Some(dt);
+ }
}
- _ => expr.clone(),
+ };
+ }
+ Ok(())
+}
+
+/// Find all [`Expr::PlaceHolder`] tokens in a logical plan, and try to infer
their type from context
+fn infer_placeholder_types(expr: Expr, schema: &DFSchema) -> Result<Expr> {
+ rewrite_expr(expr, |mut expr| {
+ // Default to assuming the arguments are the same type
+ if let Expr::BinaryExpr(BinaryExpr { left, op: _, right }) = &mut expr
{
+ rewrite_placeholder(left.as_mut(), right.as_ref(), schema)?;
+ rewrite_placeholder(right.as_mut(), left.as_ref(), schema)?;
Review Comment:
Much more concise!
--
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]