Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@ case class GetStructField(child: Expression, ordinal: Int, name: Option[String]

override protected def withNewChildInternal(newChild: Expression): GetStructField =
copy(child = newChild)

def metadata: Metadata = childSchema(ordinal).metadata
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -168,11 +168,8 @@ case class Alias(child: Expression, name: String)(
override def metadata: Metadata = {
explicitMetadata.getOrElse {
child match {
case named: NamedExpression =>
val builder = new MetadataBuilder().withMetadata(named.metadata)
nonInheritableMetadataKeys.foreach(builder.remove)
builder.build()

case named: NamedExpression => removeNonInheritableMetadata(named.metadata)
case structField: GetStructField => removeNonInheritableMetadata(structField.metadata)
case _ => Metadata.empty
}
}
Expand Down Expand Up @@ -207,6 +204,12 @@ case class Alias(child: Expression, name: String)(
""
}

private def removeNonInheritableMetadata(metadata: Metadata): Metadata = {
val builder = new MetadataBuilder().withMetadata(metadata)
nonInheritableMetadataKeys.foreach(builder.remove)
builder.build()
}

override def toString: String = s"$child AS $name#${exprId.id}$typeSuffix$delaySuffix"

override protected final def otherCopyArgs: Seq[AnyRef] = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ package org.apache.spark.sql.catalyst.expressions

import org.apache.spark.SparkFunSuite
import org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute
import org.apache.spark.sql.types.IntegerType
import org.apache.spark.sql.types.{IntegerType, MetadataBuilder, StringType, StructField, StructType}

class NamedExpressionSuite extends SparkFunSuite {

Expand Down Expand Up @@ -51,4 +51,17 @@ class NamedExpressionSuite extends SparkFunSuite {
val attr13 = UnresolvedAttribute("`a.b`")
assert(attr13.sql === "`a.b`")
}

test("SPARK-34805: non inheritable metadata should be removed from child struct in Alias") {
val nonInheritableMetadataKey = "non-inheritable-key"
val metadata = new MetadataBuilder()
.putString(nonInheritableMetadataKey, "value1")
.putString("key", "value2")
.build()
val structType = StructType(Seq(StructField("value", StringType, metadata = metadata)))
val alias = Alias(GetStructField(AttributeReference("a", structType)(), 0), "my-alias")(
nonInheritableMetadataKeys = Seq(nonInheritableMetadataKey))
assert(!alias.metadata.contains(nonInheritableMetadataKey))
assert(alias.metadata.contains("key"))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,19 @@ class ColumnExpressionSuite extends QueryTest with SharedSparkSession {
assert(newCol.expr.asInstanceOf[NamedExpression].metadata.getString("key") === "value")
}

test("SPARK-34805: as propagates metadata from nested column") {
val metadata = new MetadataBuilder
metadata.putString("key", "value")
val df = spark.createDataFrame(sparkContext.emptyRDD[Row],
StructType(Seq(
StructField("parent", StructType(Seq(
StructField("child", StringType, metadata = metadata.build())
))))
))
val newCol = df("parent.child")
assert(newCol.expr.asInstanceOf[NamedExpression].metadata.getString("key") === "value")
}

test("collect on column produced by a binary operator") {
val df = Seq((1, 2, 3)).toDF("a", "b", "c")
checkAnswer(df.select(df("a") + df("b")), Seq(Row(3)))
Expand Down