aboutsummaryrefslogtreecommitdiff
path: root/sql/core/src/test/scala
diff options
context:
space:
mode:
authorDilip Biswal <dbiswal@us.ibm.com>2017-04-20 22:35:48 +0200
committerHerman van Hovell <hvanhovell@databricks.com>2017-04-20 22:35:48 +0200
commitd95e4d9d6a9705c534549add6d4a73d554e47274 (patch)
tree4aca11699cd4f3e775d22b9e34633d99e296ddd7 /sql/core/src/test/scala
parentb2ebadfd55283348b8a8b37e28075fca0798228a (diff)
downloadspark-d95e4d9d6a9705c534549add6d4a73d554e47274.tar.gz
spark-d95e4d9d6a9705c534549add6d4a73d554e47274.tar.bz2
spark-d95e4d9d6a9705c534549add6d4a73d554e47274.zip
[SPARK-20334][SQL] Return a better error message when correlated predicates contain aggregate expression that has mixture of outer and local references.
## What changes were proposed in this pull request? Address a follow up in [comment](https://github.com/apache/spark/pull/16954#discussion_r105718880) Currently subqueries with correlated predicates containing aggregate expression having mixture of outer references and local references generate a codegen error like following : ```SQL SELECT t1a FROM t1 GROUP BY 1 HAVING EXISTS (SELECT 1 FROM t2 WHERE t2a < min(t1a + t2a)); ``` Exception snippet. ``` Cannot evaluate expression: min((input[0, int, false] + input[4, int, false])) at org.apache.spark.sql.catalyst.expressions.Unevaluable$class.doGenCode(Expression.scala:226) at org.apache.spark.sql.catalyst.expressions.aggregate.AggregateExpression.doGenCode(interfaces.scala:87) at org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$genCode$2.apply(Expression.scala:106) at org.apache.spark.sql.catalyst.expressions.Expression$$anonfun$genCode$2.apply(Expression.scala:103) at scala.Option.getOrElse(Option.scala:121) at org.apache.spark.sql.catalyst.expressions.Expression.genCode(Expression.scala:103) ``` After this PR, a better error message is issued. ``` org.apache.spark.sql.AnalysisException Error in query: Found an aggregate expression in a correlated predicate that has both outer and local references, which is not supported yet. Aggregate expression: min((t1.`t1a` + t2.`t2a`)), Outer references: t1.`t1a`, Local references: t2.`t2a`.; ``` ## How was this patch tested? Added tests in SQLQueryTestSuite. Author: Dilip Biswal <dbiswal@us.ibm.com> Closes #17636 from dilipbiswal/subquery_followup1.
Diffstat (limited to 'sql/core/src/test/scala')
-rw-r--r--sql/core/src/test/scala/org/apache/spark/sql/SubquerySuite.scala23
1 files changed, 18 insertions, 5 deletions
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/SubquerySuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/SubquerySuite.scala
index 0f0199cbe2..131abf7c1e 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/SubquerySuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/SubquerySuite.scala
@@ -822,12 +822,25 @@ class SubquerySuite extends QueryTest with SharedSQLContext {
checkAnswer(
sql(
"""
- | select c2
- | from t1
- | where exists (select *
- | from t2 lateral view explode(arr_c2) q as c2
- where t1.c1 = t2.c1)""".stripMargin),
+ | SELECT c2
+ | FROM t1
+ | WHERE EXISTS (SELECT *
+ | FROM t2 LATERAL VIEW explode(arr_c2) q AS c2
+ WHERE t1.c1 = t2.c1)""".stripMargin),
Row(1) :: Row(0) :: Nil)
+
+ val msg1 = intercept[AnalysisException] {
+ sql(
+ """
+ | SELECT c1
+ | FROM t2
+ | WHERE EXISTS (SELECT *
+ | FROM t1 LATERAL VIEW explode(t2.arr_c2) q AS c2
+ | WHERE t1.c1 = t2.c1)
+ """.stripMargin)
+ }
+ assert(msg1.getMessage.contains(
+ "Expressions referencing the outer query are not supported outside of WHERE/HAVING"))
}
}