aboutsummaryrefslogtreecommitdiff
path: root/sql/core/src
diff options
context:
space:
mode:
Diffstat (limited to 'sql/core/src')
-rw-r--r--sql/core/src/test/resources/sql-tests/inputs/subquery/negative-cases/invalid-correlation.sql74
-rw-r--r--sql/core/src/test/resources/sql-tests/results/subquery/negative-cases/invalid-correlation.sql.out96
-rw-r--r--sql/core/src/test/scala/org/apache/spark/sql/SubquerySuite.scala23
3 files changed, 143 insertions, 50 deletions
diff --git a/sql/core/src/test/resources/sql-tests/inputs/subquery/negative-cases/invalid-correlation.sql b/sql/core/src/test/resources/sql-tests/inputs/subquery/negative-cases/invalid-correlation.sql
index cf93c5a835..e22cade936 100644
--- a/sql/core/src/test/resources/sql-tests/inputs/subquery/negative-cases/invalid-correlation.sql
+++ b/sql/core/src/test/resources/sql-tests/inputs/subquery/negative-cases/invalid-correlation.sql
@@ -1,42 +1,72 @@
-- The test file contains negative test cases
-- of invalid queries where error messages are expected.
-create temporary view t1 as select * from values
+CREATE TEMPORARY VIEW t1 AS SELECT * FROM VALUES
(1, 2, 3)
-as t1(t1a, t1b, t1c);
+AS t1(t1a, t1b, t1c);
-create temporary view t2 as select * from values
+CREATE TEMPORARY VIEW t2 AS SELECT * FROM VALUES
(1, 0, 1)
-as t2(t2a, t2b, t2c);
+AS t2(t2a, t2b, t2c);
-create temporary view t3 as select * from values
+CREATE TEMPORARY VIEW t3 AS SELECT * FROM VALUES
(3, 1, 2)
-as t3(t3a, t3b, t3c);
+AS t3(t3a, t3b, t3c);
-- TC 01.01
-- The column t2b in the SELECT of the subquery is invalid
-- because it is neither an aggregate function nor a GROUP BY column.
-select t1a, t2b
-from t1, t2
-where t1b = t2c
-and t2b = (select max(avg)
- from (select t2b, avg(t2b) avg
- from t2
- where t2a = t1.t1b
+SELECT t1a, t2b
+FROM t1, t2
+WHERE t1b = t2c
+AND t2b = (SELECT max(avg)
+ FROM (SELECT t2b, avg(t2b) avg
+ FROM t2
+ WHERE t2a = t1.t1b
)
)
;
-- TC 01.02
-- Invalid due to the column t2b not part of the output from table t2.
-select *
-from t1
-where t1a in (select min(t2a)
- from t2
- group by t2c
- having t2c in (select max(t3c)
- from t3
- group by t3b
- having t3b > t2b ))
+SELECT *
+FROM t1
+WHERE t1a IN (SELECT min(t2a)
+ FROM t2
+ GROUP BY t2c
+ HAVING t2c IN (SELECT max(t3c)
+ FROM t3
+ GROUP BY t3b
+ HAVING t3b > t2b ))
;
+-- TC 01.03
+-- Invalid due to mixure of outer and local references under an AggegatedExpression
+-- in a correlated predicate
+SELECT t1a
+FROM t1
+GROUP BY 1
+HAVING EXISTS (SELECT 1
+ FROM t2
+ WHERE t2a < min(t1a + t2a));
+
+-- TC 01.04
+-- Invalid due to mixure of outer and local references under an AggegatedExpression
+SELECT t1a
+FROM t1
+WHERE t1a IN (SELECT t2a
+ FROM t2
+ WHERE EXISTS (SELECT 1
+ FROM t3
+ GROUP BY 1
+ HAVING min(t2a + t3a) > 1));
+
+-- TC 01.05
+-- Invalid due to outer reference appearing in projection list
+SELECT t1a
+FROM t1
+WHERE t1a IN (SELECT t2a
+ FROM t2
+ WHERE EXISTS (SELECT min(t2a)
+ FROM t3));
+
diff --git a/sql/core/src/test/resources/sql-tests/results/subquery/negative-cases/invalid-correlation.sql.out b/sql/core/src/test/resources/sql-tests/results/subquery/negative-cases/invalid-correlation.sql.out
index f7bbb35aad..e4b1a2dbc6 100644
--- a/sql/core/src/test/resources/sql-tests/results/subquery/negative-cases/invalid-correlation.sql.out
+++ b/sql/core/src/test/resources/sql-tests/results/subquery/negative-cases/invalid-correlation.sql.out
@@ -1,11 +1,11 @@
-- Automatically generated by SQLQueryTestSuite
--- Number of queries: 5
+-- Number of queries: 8
-- !query 0
-create temporary view t1 as select * from values
+CREATE TEMPORARY VIEW t1 AS SELECT * FROM VALUES
(1, 2, 3)
-as t1(t1a, t1b, t1c)
+AS t1(t1a, t1b, t1c)
-- !query 0 schema
struct<>
-- !query 0 output
@@ -13,9 +13,9 @@ struct<>
-- !query 1
-create temporary view t2 as select * from values
+CREATE TEMPORARY VIEW t2 AS SELECT * FROM VALUES
(1, 0, 1)
-as t2(t2a, t2b, t2c)
+AS t2(t2a, t2b, t2c)
-- !query 1 schema
struct<>
-- !query 1 output
@@ -23,9 +23,9 @@ struct<>
-- !query 2
-create temporary view t3 as select * from values
+CREATE TEMPORARY VIEW t3 AS SELECT * FROM VALUES
(3, 1, 2)
-as t3(t3a, t3b, t3c)
+AS t3(t3a, t3b, t3c)
-- !query 2 schema
struct<>
-- !query 2 output
@@ -33,13 +33,13 @@ struct<>
-- !query 3
-select t1a, t2b
-from t1, t2
-where t1b = t2c
-and t2b = (select max(avg)
- from (select t2b, avg(t2b) avg
- from t2
- where t2a = t1.t1b
+SELECT t1a, t2b
+FROM t1, t2
+WHERE t1b = t2c
+AND t2b = (SELECT max(avg)
+ FROM (SELECT t2b, avg(t2b) avg
+ FROM t2
+ WHERE t2a = t1.t1b
)
)
-- !query 3 schema
@@ -50,17 +50,67 @@ grouping expressions sequence is empty, and 't2.`t2b`' is not an aggregate funct
-- !query 4
-select *
-from t1
-where t1a in (select min(t2a)
- from t2
- group by t2c
- having t2c in (select max(t3c)
- from t3
- group by t3b
- having t3b > t2b ))
+SELECT *
+FROM t1
+WHERE t1a IN (SELECT min(t2a)
+ FROM t2
+ GROUP BY t2c
+ HAVING t2c IN (SELECT max(t3c)
+ FROM t3
+ GROUP BY t3b
+ HAVING t3b > t2b ))
-- !query 4 schema
struct<>
-- !query 4 output
org.apache.spark.sql.AnalysisException
resolved attribute(s) t2b#x missing from min(t2a)#x,t2c#x in operator !Filter t2c#x IN (list#x [t2b#x]);
+
+
+-- !query 5
+SELECT t1a
+FROM t1
+GROUP BY 1
+HAVING EXISTS (SELECT 1
+ FROM t2
+ WHERE t2a < min(t1a + t2a))
+-- !query 5 schema
+struct<>
+-- !query 5 output
+org.apache.spark.sql.AnalysisException
+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`.;
+
+
+-- !query 6
+SELECT t1a
+FROM t1
+WHERE t1a IN (SELECT t2a
+ FROM t2
+ WHERE EXISTS (SELECT 1
+ FROM t3
+ GROUP BY 1
+ HAVING min(t2a + t3a) > 1))
+-- !query 6 schema
+struct<>
+-- !query 6 output
+org.apache.spark.sql.AnalysisException
+Found an aggregate expression in a correlated predicate that has both outer and local references, which is not supported yet. Aggregate expression: min((t2.`t2a` + t3.`t3a`)), Outer references: t2.`t2a`, Local references: t3.`t3a`.;
+
+
+-- !query 7
+SELECT t1a
+FROM t1
+WHERE t1a IN (SELECT t2a
+ FROM t2
+ WHERE EXISTS (SELECT min(t2a)
+ FROM t3))
+-- !query 7 schema
+struct<>
+-- !query 7 output
+org.apache.spark.sql.AnalysisException
+Expressions referencing the outer query are not supported outside of WHERE/HAVING clauses:
+Aggregate [min(outer(t2a#x)) AS min(outer())#x]
++- SubqueryAlias t3
+ +- Project [t3a#x, t3b#x, t3c#x]
+ +- SubqueryAlias t3
+ +- LocalRelation [t3a#x, t3b#x, t3c#x]
+;
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"))
}
}