From 3277195b68f514b2158c2b705b8130bc914318f6 Mon Sep 17 00:00:00 2001 From: Liang-Chi Hsieh Date: Sun, 8 Sep 2024 23:52:37 -0700 Subject: [PATCH] fix: Fallback to Spark when cannot resolve AttributeReference --- .../org/apache/comet/serde/QueryPlanSerde.scala | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/spark/src/main/scala/org/apache/comet/serde/QueryPlanSerde.scala b/spark/src/main/scala/org/apache/comet/serde/QueryPlanSerde.scala index d77fac471..dbc3a1d80 100644 --- a/spark/src/main/scala/org/apache/comet/serde/QueryPlanSerde.scala +++ b/spark/src/main/scala/org/apache/comet/serde/QueryPlanSerde.scala @@ -1710,12 +1710,20 @@ object QueryPlanSerde extends Logging with ShimQueryPlanSerde with CometExprShim if (dataType.isDefined) { if (binding) { - val boundRef = BindReferences - .bindReference(attr, inputs, allowFailures = false) - .asInstanceOf[BoundReference] + // Spark may produce unresolvable attributes in some cases, + // for example https://github.com/apache/datafusion-comet/issues/925. + // So, we allow the binding to fail. + val boundRef: Any = BindReferences + .bindReference(attr, inputs, allowFailures = true) + + if (boundRef.isInstanceOf[AttributeReference]) { + withInfo(attr, s"cannot resolve $attr among ${inputs.mkString(", ")}") + return None + } + val boundExpr = ExprOuterClass.BoundReference .newBuilder() - .setIndex(boundRef.ordinal) + .setIndex(boundRef.asInstanceOf[BoundReference].ordinal) .setDatatype(dataType.get) .build()