@@ -40,13 +40,13 @@ object SimplifyExtractValueOps extends Rule[LogicalPlan] {
4040 // Remove redundant field extraction.
4141 case GetStructField (createNamedStruct : CreateNamedStruct , ordinal, _) =>
4242 createNamedStruct.valExprs(ordinal)
43- case GetStructField (updateFields : UpdateFields , ordinal, _) =>
44- val structExpr = updateFields .structExpr
45- updateFields .newExprs(ordinal) match {
43+ case GetStructField (u : UpdateFields , ordinal, _) if ! u.structExpr. isInstanceOf [ UpdateFields ] =>
44+ val structExpr = u .structExpr
45+ u .newExprs(ordinal) match {
4646 // if the struct itself is null, then any value extracted from it (expr) will be null
4747 // so we don't need to wrap expr in If(IsNull(struct), Literal(null, expr.dataType), expr)
4848 case expr : GetStructField if expr.child.semanticEquals(structExpr) => expr
49- case expr => If (IsNull (ultimateStruct( structExpr) ), Literal (null , expr.dataType), expr)
49+ case expr => If (IsNull (structExpr), Literal (null , expr.dataType), expr)
5050 }
5151 // Remove redundant array indexing.
5252 case GetArrayStructFields (CreateArray (elems, useStringTypeWhenEmpty), field, ordinal, _, _) =>
@@ -69,10 +69,4 @@ object SimplifyExtractValueOps extends Rule[LogicalPlan] {
6969 case GetMapValue (CreateMap (elems, _), key) => CaseKeyWhen (key, elems)
7070 }
7171 }
72-
73- @ scala.annotation.tailrec
74- private def ultimateStruct (expr : Expression ): Expression = expr match {
75- case e : UpdateFields => ultimateStruct(e.structExpr)
76- case e => e
77- }
7872}
0 commit comments