From f1ef856ee4fa45bcd2143bf164dab61f6f17ce63 Mon Sep 17 00:00:00 2001 From: Yadong Qi Date: Mon, 7 Dec 2015 11:47:05 +0800 Subject: [PATCH] Invoke the right sameResult function when plan is warpped with SubQueries --- .../catalyst/plans/logical/LogicalPlan.scala | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/LogicalPlan.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/LogicalPlan.scala index 8f8747e105932..de25a8b9fa76d 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/LogicalPlan.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/LogicalPlan.scala @@ -120,16 +120,25 @@ abstract class LogicalPlan extends QueryPlan[LogicalPlan] with Logging { * can do better should override this function. */ def sameResult(plan: LogicalPlan): Boolean = { - val cleanLeft = EliminateSubQueries(this) - val cleanRight = EliminateSubQueries(plan) - - cleanLeft.getClass == cleanRight.getClass && - cleanLeft.children.size == cleanRight.children.size && { - logDebug( - s"[${cleanRight.cleanArgs.mkString(", ")}] == [${cleanLeft.cleanArgs.mkString(", ")}]") - cleanRight.cleanArgs == cleanLeft.cleanArgs - } && - (cleanLeft.children, cleanRight.children).zipped.forall(_ sameResult _) + val hasSubQueriesInLeft = this.collect { case _: Subquery => }.nonEmpty + val hasSubQueriesInRight = plan.collect { case _: Subquery => }.nonEmpty + + if (hasSubQueriesInLeft || hasSubQueriesInRight) { + val cleanLeft = EliminateSubQueries(this) + val cleanRight = EliminateSubQueries(plan) + cleanLeft.sameResult(cleanRight) + } else { + val cleanLeft = this + val cleanRight = plan + + cleanLeft.getClass == cleanRight.getClass && + cleanLeft.children.size == cleanRight.children.size && { + logDebug( + s"[${cleanRight.cleanArgs.mkString(", ")}] == [${cleanLeft.cleanArgs.mkString(", ")}]") + cleanRight.cleanArgs == cleanLeft.cleanArgs + } && + (cleanLeft.children, cleanRight.children).zipped.forall(_ sameResult _) + } } /** Args that have cleaned such that differences in expression id should not affect equality */