|
17 | 17 |
|
18 | 18 | package org.apache.spark.sql
|
19 | 19 |
|
20 |
| -import java.sql.{Date, Timestamp} |
21 |
| - |
22 |
| -import scala.collection.mutable |
| 20 | +import org.scalatest.Matchers.the |
23 | 21 |
|
24 | 22 | import org.apache.spark.TestUtils.{assertNotSpilled, assertSpilled}
|
25 | 23 | import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction, Window}
|
26 | 24 | import org.apache.spark.sql.functions._
|
27 | 25 | import org.apache.spark.sql.internal.SQLConf
|
28 | 26 | import org.apache.spark.sql.test.SharedSQLContext
|
29 | 27 | import org.apache.spark.sql.types._
|
30 |
| -import org.apache.spark.unsafe.types.CalendarInterval |
31 | 28 |
|
32 | 29 | /**
|
33 | 30 | * Window function testing for DataFrame API.
|
@@ -624,4 +621,41 @@ class DataFrameWindowFunctionsSuite extends QueryTest with SharedSQLContext {
|
624 | 621 | }
|
625 | 622 | }
|
626 | 623 | }
|
| 624 | + |
| 625 | + test("SPARK-24575: Window functions inside WHERE and HAVING clauses") { |
| 626 | + def checkAnalysisError(df: => DataFrame): Unit = { |
| 627 | + val thrownException = the [AnalysisException] thrownBy { |
| 628 | + df.queryExecution.analyzed |
| 629 | + } |
| 630 | + assert(thrownException.message.contains("window functions inside WHERE and HAVING clauses")) |
| 631 | + } |
| 632 | + |
| 633 | + checkAnalysisError(testData2.select('a).where(rank().over(Window.orderBy('b)) === 1)) |
| 634 | + checkAnalysisError(testData2.where('b === 2 && rank().over(Window.orderBy('b)) === 1)) |
| 635 | + checkAnalysisError( |
| 636 | + testData2.groupBy('a) |
| 637 | + .agg(avg('b).as("avgb")) |
| 638 | + .where('a > 'avgb && rank().over(Window.orderBy('a)) === 1)) |
| 639 | + checkAnalysisError( |
| 640 | + testData2.groupBy('a) |
| 641 | + .agg(max('b).as("maxb"), sum('b).as("sumb")) |
| 642 | + .where(rank().over(Window.orderBy('a)) === 1)) |
| 643 | + checkAnalysisError( |
| 644 | + testData2.groupBy('a) |
| 645 | + .agg(max('b).as("maxb"), sum('b).as("sumb")) |
| 646 | + .where('sumb === 5 && rank().over(Window.orderBy('a)) === 1)) |
| 647 | + |
| 648 | + checkAnalysisError(sql("SELECT a FROM testData2 WHERE RANK() OVER(ORDER BY b) = 1")) |
| 649 | + checkAnalysisError(sql("SELECT * FROM testData2 WHERE b = 2 AND RANK() OVER(ORDER BY b) = 1")) |
| 650 | + checkAnalysisError( |
| 651 | + sql("SELECT * FROM testData2 GROUP BY a HAVING a > AVG(b) AND RANK() OVER(ORDER BY a) = 1")) |
| 652 | + checkAnalysisError( |
| 653 | + sql("SELECT a, MAX(b), SUM(b) FROM testData2 GROUP BY a HAVING RANK() OVER(ORDER BY a) = 1")) |
| 654 | + checkAnalysisError( |
| 655 | + sql( |
| 656 | + s"""SELECT a, MAX(b) |
| 657 | + |FROM testData2 |
| 658 | + |GROUP BY a |
| 659 | + |HAVING SUM(b) = 5 AND RANK() OVER(ORDER BY a) = 1""".stripMargin)) |
| 660 | + } |
627 | 661 | }
|
0 commit comments