Repository: spark
Updated Branches:
  refs/heads/branch-2.0 b52e639a8 -> 57d65e511


[SPARK-16703][SQL] Remove extra whitespace in SQL generation for window 
functions

## What changes were proposed in this pull request?

This PR fixes a minor formatting issue of `WindowSpecDefinition.sql` when no 
partitioning expressions are present.

Before:

```sql
( ORDER BY `a` ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
```

After:

```sql
(ORDER BY `a` ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
```

## How was this patch tested?

New test case added in `ExpressionSQLBuilderSuite`.

Author: Cheng Lian <l...@databricks.com>

Closes #14334 from liancheng/window-spec-sql-format.

(cherry picked from commit 7ea6d282b925819ddb3874a67b3c9da8cc41f131)
Signed-off-by: Reynold Xin <r...@databricks.com>


Project: http://git-wip-us.apache.org/repos/asf/spark/repo
Commit: http://git-wip-us.apache.org/repos/asf/spark/commit/57d65e51
Tree: http://git-wip-us.apache.org/repos/asf/spark/tree/57d65e51
Diff: http://git-wip-us.apache.org/repos/asf/spark/diff/57d65e51

Branch: refs/heads/branch-2.0
Commit: 57d65e5111e281d3d5224c5ea11005c89718f791
Parents: b52e639
Author: Cheng Lian <l...@databricks.com>
Authored: Mon Jul 25 09:42:39 2016 -0700
Committer: Reynold Xin <r...@databricks.com>
Committed: Mon Jul 25 09:42:47 2016 -0700

----------------------------------------------------------------------
 .../expressions/windowExpressions.scala         |  6 ++--
 .../sqlgen/aggregate_functions_and_window.sql   |  2 +-
 .../sqlgen/regular_expressions_and_window.sql   |  2 +-
 .../test/resources/sqlgen/window_basic_1.sql    |  2 +-
 .../test/resources/sqlgen/window_basic_2.sql    |  2 +-
 .../catalyst/ExpressionSQLBuilderSuite.scala    | 35 ++++++++++++++++++--
 6 files changed, 40 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/spark/blob/57d65e51/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/windowExpressions.scala
----------------------------------------------------------------------
diff --git 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/windowExpressions.scala
 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/windowExpressions.scala
index c0b453d..e35192c 100644
--- 
a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/windowExpressions.scala
+++ 
b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/windowExpressions.scala
@@ -82,16 +82,16 @@ case class WindowSpecDefinition(
     val partition = if (partitionSpec.isEmpty) {
       ""
     } else {
-      "PARTITION BY " + partitionSpec.map(_.sql).mkString(", ")
+      "PARTITION BY " + partitionSpec.map(_.sql).mkString(", ") + " "
     }
 
     val order = if (orderSpec.isEmpty) {
       ""
     } else {
-      "ORDER BY " + orderSpec.map(_.sql).mkString(", ")
+      "ORDER BY " + orderSpec.map(_.sql).mkString(", ") + " "
     }
 
-    s"($partition $order ${frameSpecification.toString})"
+    s"($partition$order${frameSpecification.toString})"
   }
 }
 

http://git-wip-us.apache.org/repos/asf/spark/blob/57d65e51/sql/hive/src/test/resources/sqlgen/aggregate_functions_and_window.sql
----------------------------------------------------------------------
diff --git 
a/sql/hive/src/test/resources/sqlgen/aggregate_functions_and_window.sql 
b/sql/hive/src/test/resources/sqlgen/aggregate_functions_and_window.sql
index 3a29bcf..c94f53b 100644
--- a/sql/hive/src/test/resources/sqlgen/aggregate_functions_and_window.sql
+++ b/sql/hive/src/test/resources/sqlgen/aggregate_functions_and_window.sql
@@ -1,4 +1,4 @@
 -- This file is automatically generated by LogicalPlanToSQLSuite.
 SELECT MAX(c) + COUNT(a) OVER () FROM parquet_t2 GROUP BY a, b
 
--------------------------------------------------------------------------------
-SELECT `gen_attr` AS `(max(c) + count(a) OVER (  ROWS BETWEEN UNBOUNDED 
PRECEDING AND UNBOUNDED FOLLOWING))` FROM (SELECT (`gen_attr` + `gen_attr`) AS 
`gen_attr` FROM (SELECT gen_subquery_1.`gen_attr`, gen_subquery_1.`gen_attr`, 
count(`gen_attr`) OVER (  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED 
FOLLOWING) AS `gen_attr` FROM (SELECT max(`gen_attr`) AS `gen_attr`, `gen_attr` 
FROM (SELECT `a` AS `gen_attr`, `b` AS `gen_attr`, `c` AS `gen_attr`, `d` AS 
`gen_attr` FROM `default`.`parquet_t2`) AS gen_subquery_0 GROUP BY `gen_attr`, 
`gen_attr`) AS gen_subquery_1) AS gen_subquery_2) AS gen_subquery_3
+SELECT `gen_attr` AS `(max(c) + count(a) OVER (ROWS BETWEEN UNBOUNDED 
PRECEDING AND UNBOUNDED FOLLOWING))` FROM (SELECT (`gen_attr` + `gen_attr`) AS 
`gen_attr` FROM (SELECT gen_subquery_1.`gen_attr`, gen_subquery_1.`gen_attr`, 
count(`gen_attr`) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED 
FOLLOWING) AS `gen_attr` FROM (SELECT max(`gen_attr`) AS `gen_attr`, `gen_attr` 
FROM (SELECT `a` AS `gen_attr`, `b` AS `gen_attr`, `c` AS `gen_attr`, `d` AS 
`gen_attr` FROM `default`.`parquet_t2`) AS gen_subquery_0 GROUP BY `gen_attr`, 
`gen_attr`) AS gen_subquery_1) AS gen_subquery_2) AS gen_subquery_3

http://git-wip-us.apache.org/repos/asf/spark/blob/57d65e51/sql/hive/src/test/resources/sqlgen/regular_expressions_and_window.sql
----------------------------------------------------------------------
diff --git 
a/sql/hive/src/test/resources/sqlgen/regular_expressions_and_window.sql 
b/sql/hive/src/test/resources/sqlgen/regular_expressions_and_window.sql
index 7d837d4..a790948 100644
--- a/sql/hive/src/test/resources/sqlgen/regular_expressions_and_window.sql
+++ b/sql/hive/src/test/resources/sqlgen/regular_expressions_and_window.sql
@@ -1,4 +1,4 @@
 -- This file is automatically generated by LogicalPlanToSQLSuite.
 SELECT MAX(key) OVER (PARTITION BY key % 3) + key FROM parquet_t1
 
--------------------------------------------------------------------------------
-SELECT `gen_attr` AS `(max(key) OVER (PARTITION BY (key % CAST(3 AS BIGINT))  
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) + key)` FROM (SELECT 
(`gen_attr` + `gen_attr`) AS `gen_attr` FROM (SELECT gen_subquery_1.`gen_attr`, 
gen_subquery_1.`gen_attr`, max(`gen_attr`) OVER (PARTITION BY `gen_attr`  ROWS 
BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS `gen_attr` FROM (SELECT 
`gen_attr`, (`gen_attr` % CAST(3 AS BIGINT)) AS `gen_attr` FROM (SELECT `key` 
AS `gen_attr`, `value` AS `gen_attr` FROM `default`.`parquet_t1`) AS 
gen_subquery_0) AS gen_subquery_1) AS gen_subquery_2) AS gen_subquery_3
+SELECT `gen_attr` AS `(max(key) OVER (PARTITION BY (key % CAST(3 AS BIGINT)) 
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) + key)` FROM (SELECT 
(`gen_attr` + `gen_attr`) AS `gen_attr` FROM (SELECT gen_subquery_1.`gen_attr`, 
gen_subquery_1.`gen_attr`, max(`gen_attr`) OVER (PARTITION BY `gen_attr` ROWS 
BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS `gen_attr` FROM (SELECT 
`gen_attr`, (`gen_attr` % CAST(3 AS BIGINT)) AS `gen_attr` FROM (SELECT `key` 
AS `gen_attr`, `value` AS `gen_attr` FROM `default`.`parquet_t1`) AS 
gen_subquery_0) AS gen_subquery_1) AS gen_subquery_2) AS gen_subquery_3

http://git-wip-us.apache.org/repos/asf/spark/blob/57d65e51/sql/hive/src/test/resources/sqlgen/window_basic_1.sql
----------------------------------------------------------------------
diff --git a/sql/hive/src/test/resources/sqlgen/window_basic_1.sql 
b/sql/hive/src/test/resources/sqlgen/window_basic_1.sql
index 73f343d..f86ca5e 100644
--- a/sql/hive/src/test/resources/sqlgen/window_basic_1.sql
+++ b/sql/hive/src/test/resources/sqlgen/window_basic_1.sql
@@ -1,4 +1,4 @@
 -- This file is automatically generated by LogicalPlanToSQLSuite.
 SELECT MAX(value) OVER (PARTITION BY key % 3) FROM parquet_t1
 
--------------------------------------------------------------------------------
-SELECT `gen_attr` AS `max(value) OVER (PARTITION BY (key % CAST(3 AS BIGINT))  
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)` FROM (SELECT 
`gen_attr` FROM (SELECT gen_subquery_1.`gen_attr`, gen_subquery_1.`gen_attr`, 
max(`gen_attr`) OVER (PARTITION BY `gen_attr`  ROWS BETWEEN UNBOUNDED PRECEDING 
AND UNBOUNDED FOLLOWING) AS `gen_attr` FROM (SELECT `gen_attr`, (`gen_attr` % 
CAST(3 AS BIGINT)) AS `gen_attr` FROM (SELECT `key` AS `gen_attr`, `value` AS 
`gen_attr` FROM `default`.`parquet_t1`) AS gen_subquery_0) AS gen_subquery_1) 
AS gen_subquery_2) AS gen_subquery_3
+SELECT `gen_attr` AS `max(value) OVER (PARTITION BY (key % CAST(3 AS BIGINT)) 
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)` FROM (SELECT 
`gen_attr` FROM (SELECT gen_subquery_1.`gen_attr`, gen_subquery_1.`gen_attr`, 
max(`gen_attr`) OVER (PARTITION BY `gen_attr` ROWS BETWEEN UNBOUNDED PRECEDING 
AND UNBOUNDED FOLLOWING) AS `gen_attr` FROM (SELECT `gen_attr`, (`gen_attr` % 
CAST(3 AS BIGINT)) AS `gen_attr` FROM (SELECT `key` AS `gen_attr`, `value` AS 
`gen_attr` FROM `default`.`parquet_t1`) AS gen_subquery_0) AS gen_subquery_1) 
AS gen_subquery_2) AS gen_subquery_3

http://git-wip-us.apache.org/repos/asf/spark/blob/57d65e51/sql/hive/src/test/resources/sqlgen/window_basic_2.sql
----------------------------------------------------------------------
diff --git a/sql/hive/src/test/resources/sqlgen/window_basic_2.sql 
b/sql/hive/src/test/resources/sqlgen/window_basic_2.sql
index 3ddb87f..15559ac 100644
--- a/sql/hive/src/test/resources/sqlgen/window_basic_2.sql
+++ b/sql/hive/src/test/resources/sqlgen/window_basic_2.sql
@@ -2,4 +2,4 @@
 SELECT key, value, ROUND(AVG(key) OVER (), 2)
 FROM parquet_t1 ORDER BY key
 
--------------------------------------------------------------------------------
-SELECT `gen_attr` AS `key`, `gen_attr` AS `value`, `gen_attr` AS 
`round(avg(key) OVER (  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED 
FOLLOWING), 2)` FROM (SELECT `gen_attr`, `gen_attr`, round(`gen_attr`, 2) AS 
`gen_attr` FROM (SELECT gen_subquery_1.`gen_attr`, gen_subquery_1.`gen_attr`, 
avg(`gen_attr`) OVER (  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED 
FOLLOWING) AS `gen_attr` FROM (SELECT `gen_attr`, `gen_attr` FROM (SELECT `key` 
AS `gen_attr`, `value` AS `gen_attr` FROM `default`.`parquet_t1`) AS 
gen_subquery_0) AS gen_subquery_1) AS gen_subquery_2 ORDER BY `gen_attr` ASC) 
AS parquet_t1
+SELECT `gen_attr` AS `key`, `gen_attr` AS `value`, `gen_attr` AS 
`round(avg(key) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED 
FOLLOWING), 2)` FROM (SELECT `gen_attr`, `gen_attr`, round(`gen_attr`, 2) AS 
`gen_attr` FROM (SELECT gen_subquery_1.`gen_attr`, gen_subquery_1.`gen_attr`, 
avg(`gen_attr`) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) 
AS `gen_attr` FROM (SELECT `gen_attr`, `gen_attr` FROM (SELECT `key` AS 
`gen_attr`, `value` AS `gen_attr` FROM `default`.`parquet_t1`) AS 
gen_subquery_0) AS gen_subquery_1) AS gen_subquery_2 ORDER BY `gen_attr` ASC) 
AS parquet_t1

http://git-wip-us.apache.org/repos/asf/spark/blob/57d65e51/sql/hive/src/test/scala/org/apache/spark/sql/catalyst/ExpressionSQLBuilderSuite.scala
----------------------------------------------------------------------
diff --git 
a/sql/hive/src/test/scala/org/apache/spark/sql/catalyst/ExpressionSQLBuilderSuite.scala
 
b/sql/hive/src/test/scala/org/apache/spark/sql/catalyst/ExpressionSQLBuilderSuite.scala
index c8bf20d..fef726c 100644
--- 
a/sql/hive/src/test/scala/org/apache/spark/sql/catalyst/ExpressionSQLBuilderSuite.scala
+++ 
b/sql/hive/src/test/scala/org/apache/spark/sql/catalyst/ExpressionSQLBuilderSuite.scala
@@ -20,8 +20,7 @@ package org.apache.spark.sql.catalyst
 import java.sql.Timestamp
 
 import org.apache.spark.sql.catalyst.dsl.expressions._
-import org.apache.spark.sql.catalyst.expressions.{If, Literal}
-
+import org.apache.spark.sql.catalyst.expressions.{If, Literal, 
SpecifiedWindowFrame, WindowSpecDefinition}
 
 class ExpressionSQLBuilderSuite extends SQLBuilderTest {
   test("literal") {
@@ -79,4 +78,36 @@ class ExpressionSQLBuilderSuite extends SQLBuilderTest {
     checkSQL(-'a.int, "(-`a`)")
     checkSQL(-('a.int + 'b.int), "(-(`a` + `b`))")
   }
+
+  test("window specification") {
+    val frame = SpecifiedWindowFrame.defaultWindowFrame(
+      hasOrderSpecification = true,
+      acceptWindowFrame = true
+    )
+
+    checkSQL(
+      WindowSpecDefinition('a.int :: Nil, Nil, frame),
+      s"(PARTITION BY `a` $frame)"
+    )
+
+    checkSQL(
+      WindowSpecDefinition('a.int :: 'b.string :: Nil, Nil, frame),
+      s"(PARTITION BY `a`, `b` $frame)"
+    )
+
+    checkSQL(
+      WindowSpecDefinition(Nil, 'a.int.asc :: Nil, frame),
+      s"(ORDER BY `a` ASC $frame)"
+    )
+
+    checkSQL(
+      WindowSpecDefinition(Nil, 'a.int.asc :: 'b.string.desc :: Nil, frame),
+      s"(ORDER BY `a` ASC, `b` DESC $frame)"
+    )
+
+    checkSQL(
+      WindowSpecDefinition('a.int :: 'b.string :: Nil, 'c.int.asc :: 
'd.string.desc :: Nil, frame),
+      s"(PARTITION BY `a`, `b` ORDER BY `c` ASC, `d` DESC $frame)"
+    )
+  }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org
For additional commands, e-mail: commits-h...@spark.apache.org

Reply via email to