From d570c8450776da8a381c2e9c9814e1895d7a3893 Mon Sep 17 00:00:00 2001 From: Herman van Hovell Date: Tue, 22 Nov 2016 12:33:19 -0800 Subject: [PATCH] Add canEquals function --- .../spark/sql/catalyst/expressions/predicates.scala | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/predicates.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/predicates.scala index 2ad452b6a90ca..9682e1f6c2307 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/predicates.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/predicates.scala @@ -403,6 +403,11 @@ object Equality { case EqualNullSafe(l, r) => Some((l, r)) case _ => None } + + def canEquals(dataType: DataType): Boolean = dataType.existsRecursively { + case m: MapType => m.ordered + case _ => true + } } @ExpressionDescription( @@ -417,7 +422,7 @@ case class EqualTo(left: Expression, right: Expression) case TypeCheckResult.TypeCheckSuccess => // TODO: although map type is not orderable, technically map type should be able to be used // in equality comparison, remove this type check once we support it. - if (left.dataType.existsRecursively(_.isInstanceOf[MapType])) { + if (!Equality.canEquals(left.dataType)) { TypeCheckResult.TypeCheckFailure("Cannot use map type in EqualTo, but the actual " + s"input type is ${left.dataType.catalogString}.") } else { @@ -460,7 +465,7 @@ case class EqualNullSafe(left: Expression, right: Expression) extends BinaryComp case TypeCheckResult.TypeCheckSuccess => // TODO: although map type is not orderable, technically map type should be able to be used // in equality comparison, remove this type check once we support it. - if (left.dataType.existsRecursively(_.isInstanceOf[MapType])) { + if (!Equality.canEquals(left.dataType)) { TypeCheckResult.TypeCheckFailure("Cannot use map type in EqualNullSafe, but the actual " + s"input type is ${left.dataType.catalogString}.") } else {