Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 38 additions & 28 deletions sql/core/src/test/scala/org/apache/spark/sql/SubquerySuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -55,62 +55,72 @@ class SubquerySuite extends QueryTest with SharedSQLContext {
}

test("simple uncorrelated scalar subquery") {
assertResult(Array(Row(1))) {
sql("select (select 1 as b) as b").collect()
}
checkAnswer(
sql("select (select 1 as b) as b"),
Array(Row(1))
)

assertResult(Array(Row(3))) {
sql("select (select (select 1) + 1) + 1").collect()
}
checkAnswer(
sql("select (select (select 1) + 1) + 1"),
Array(Row(3))
)

// string type
assertResult(Array(Row("s"))) {
sql("select (select 's' as s) as b").collect()
}
checkAnswer(
sql("select (select 's' as s) as b"),
Array(Row("s"))
)
}

test("uncorrelated scalar subquery in CTE") {
assertResult(Array(Row(1))) {
checkAnswer(
sql("with t2 as (select 1 as b, 2 as c) " +
"select a from (select 1 as a union all select 2 as a) t " +
"where a = (select max(b) from t2) ").collect()
}
"where a = (select max(b) from t2) "),
Array(Row(1))
)
}

test("uncorrelated scalar subquery should return null if there is 0 rows") {
assertResult(Array(Row(null))) {
sql("select (select 's' as s limit 0) as b").collect()
}
checkAnswer(
sql("select (select 's' as s limit 0) as b"),
Array(Row(null))
)
}

test("runtime error when the number of rows is greater than 1") {
val error2 = intercept[RuntimeException] {
sql("select (select a from (select 1 as a union all select 2 as a) t) as b").collect()
}
assert(error2.getMessage.contains(
"more than one row returned by a subquery used as an expression"))
"more than one row returned by a subquery used as an expression")
)
}

test("uncorrelated scalar subquery on a DataFrame generated query") {
val df = Seq((1, "one"), (2, "two"), (3, "three")).toDF("key", "value")
df.registerTempTable("subqueryData")

assertResult(Array(Row(4))) {
sql("select (select key from subqueryData where key > 2 order by key limit 1) + 1").collect()
}
checkAnswer(
sql("select (select key from subqueryData where key > 2 order by key limit 1) + 1"),
Array(Row(4))
)

assertResult(Array(Row(-3))) {
sql("select -(select max(key) from subqueryData)").collect()
}
checkAnswer(
sql("select -(select max(key) from subqueryData)"),
Array(Row(-3))
)

assertResult(Array(Row(null))) {
sql("select (select value from subqueryData limit 0)").collect()
}
checkAnswer(
sql("select (select value from subqueryData limit 0)"),
Array(Row(null))
)

assertResult(Array(Row("two"))) {
checkAnswer(
sql("select (select min(value) from subqueryData" +
" where key = (select max(key) from subqueryData) - 1)").collect()
}
" where key = (select max(key) from subqueryData) - 1)"),
Array(Row("two"))
)
}

test("EXISTS predicate subquery") {
Expand Down