Skip to content

Commit 1bf4f32

Browse files
committed
Fix
1 parent 5e82548 commit 1bf4f32

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/optimizer/NormalizeFloatingNumbers.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,10 +129,10 @@ object NormalizeFloatingNumbers extends Rule[LogicalPlan] {
129129
Coalesce(children.map(normalize))
130130

131131
case _ if expr.dataType.isInstanceOf[StructType] =>
132-
val fields = expr.dataType.asInstanceOf[StructType].fields.indices.map { i =>
133-
normalize(GetStructField(expr, i))
132+
val fields = expr.dataType.asInstanceOf[StructType].fieldNames.zipWithIndex.map {
133+
case (name, i) => Seq(Literal(name), normalize(GetStructField(expr, i)))
134134
}
135-
val struct = CreateStruct(fields)
135+
val struct = CreateNamedStruct(fields.flatten.toSeq)
136136
KnownFloatingPointNormalized(If(IsNull(expr), Literal(null, struct.dataType), struct))
137137

138138
case _ if expr.dataType.isInstanceOf[ArrayType] =>

sql/core/src/test/scala/org/apache/spark/sql/DataFrameAggregateSuite.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,6 +1043,14 @@ class DataFrameAggregateSuite extends QueryTest
10431043
checkAnswer(sql(queryTemplate("FIRST")), Row(1))
10441044
checkAnswer(sql(queryTemplate("LAST")), Row(3))
10451045
}
1046+
1047+
test("SPARK-32906: struct field names should not change after normalizing floats") {
1048+
val df = Seq(Tuple1(Tuple2(-0.0d, Double.NaN)), Tuple1(Tuple2(0.0d, Double.NaN))).toDF("k")
1049+
val aggs = df.distinct().queryExecution.sparkPlan.collect { case a: HashAggregateExec => a }
1050+
assert(aggs.length == 2)
1051+
assert(aggs.head.output.map(_.dataType.simpleString).head ===
1052+
aggs.last.output.map(_.dataType.simpleString).head)
1053+
}
10461054
}
10471055

10481056
case class B(c: Option[Double])

0 commit comments

Comments
 (0)