Repository: spark Updated Branches: refs/heads/master 575a13279 -> b374a2583
[SPARK-12102][SQL] Cast a non-nullable struct field to a nullable field during analysis Compare both left and right side of the case expression ignoring nullablity when checking for type equality. Author: Dilip Biswal <[email protected]> Closes #10156 from dilipbiswal/spark-12102. Project: http://git-wip-us.apache.org/repos/asf/spark/repo Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/b374a258 Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/b374a258 Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/b374a258 Branch: refs/heads/master Commit: b374a25831af031f461716c52b615665aa5392c2 Parents: 575a132 Author: Dilip Biswal <[email protected]> Authored: Tue Dec 22 15:21:49 2015 -0800 Committer: Yin Huai <[email protected]> Committed: Tue Dec 22 15:21:49 2015 -0800 ---------------------------------------------------------------------- .../sql/catalyst/expressions/conditionalExpressions.scala | 4 +++- .../org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/spark/blob/b374a258/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/conditionalExpressions.scala ---------------------------------------------------------------------- diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/conditionalExpressions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/conditionalExpressions.scala index 40b1eec..f79c867 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/conditionalExpressions.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/conditionalExpressions.scala @@ -91,7 +91,9 @@ trait CaseWhenLike extends Expression { // both then and else expressions should be considered. def valueTypes: Seq[DataType] = (thenList ++ elseValue).map(_.dataType) - def valueTypesEqual: Boolean = valueTypes.distinct.size == 1 + def valueTypesEqual: Boolean = valueTypes.size <= 1 || valueTypes.sliding(2, 1).forall { + case Seq(dt1, dt2) => dt1.sameType(dt2) + } override def checkInputDataTypes(): TypeCheckResult = { if (valueTypesEqual) { http://git-wip-us.apache.org/repos/asf/spark/blob/b374a258/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala ---------------------------------------------------------------------- diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala index aeeca80..fa823e3 100644 --- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala +++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/analysis/AnalysisSuite.scala @@ -274,4 +274,10 @@ class AnalysisSuite extends AnalysisTest { assert(lits(1) >= min && lits(1) <= max) assert(lits(0) == lits(1)) } + + test("SPARK-12102: Ignore nullablity when comparing two sides of case") { + val relation = LocalRelation('a.struct('x.int), 'b.struct('x.int.withNullability(false))) + val plan = relation.select(CaseWhen(Seq(Literal(true), 'a, 'b)).as("val")) + assertAnalysisSuccess(plan) + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
