This is an automated email from the ASF dual-hosted git repository. jcamacho pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push: new 58d55e0 HIVE-23868: Windowing function spec: support 0 preceeding/following (Jason Dere via Jesus Camacho Rodriguez) 58d55e0 is described below commit 58d55e027dc173b0bed41ac2d38faa1d2b1ac892 Author: jdere <jd...@hortonworks.com> AuthorDate: Fri Jul 17 07:55:23 2020 -0700 HIVE-23868: Windowing function spec: support 0 preceeding/following (Jason Dere via Jesus Camacho Rodriguez) Closes apache/hive#1269 --- .../hadoop/hive/ql/parse/SemanticAnalyzer.java | 12 ++++-- .../queries/clientpositive/windowing_windowspec4.q | 19 ++++++++ .../llap/windowing_windowspec4.q.out | 50 ++++++++++++++++++++++ 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index aeaf8ac..1d013ae 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -14357,11 +14357,17 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer { else { int amt = Integer.parseInt(amtNode.getText()); - if ( amt <= 0 ) { + if ( amt < 0 ) { throw new SemanticException( - "Window Frame Boundary Amount must be a positive integer, provided amount is: " + amt); + "Window Frame Boundary Amount must be a non-negative integer, provided amount is: " + amt); + } else if (amt == 0) { + // Convert 0 PRECEDING/FOLLOWING to CURRENT ROW + LOG.info("Converting 0 {} to CURRENT ROW", bs.getDirection()); + bs.setDirection(Direction.CURRENT); + hasAmt = false; + } else { + bs.setAmt(amt); } - bs.setAmt(amt); } } diff --git a/ql/src/test/queries/clientpositive/windowing_windowspec4.q b/ql/src/test/queries/clientpositive/windowing_windowspec4.q index fcf0f25..ca2d9a8 100644 --- a/ql/src/test/queries/clientpositive/windowing_windowspec4.q +++ b/ql/src/test/queries/clientpositive/windowing_windowspec4.q @@ -17,3 +17,22 @@ sum(i) over (partition by type order by i rows between 1 preceding and 7 followi collect_set(i) over (partition by type order by i rows between 1 preceding and 7 following), count(i) over (partition by type order by i rows between 1 preceding and 7 following) from smalltable_windowing; + +-- 0 preceding/following should be the same as current row +select type, i, +max(i) over (partition by type order by i rows between 1 preceding and 0 following), +min(i) over (partition by type order by i rows between 1 preceding and 0 following), +max(i) over (partition by type order by i rows between 0 preceding and 1 following), +min(i) over (partition by type order by i rows between 0 preceding and 1 following), +max(i) over (partition by type order by i rows between 0 preceding and 0 following), +min(i) over (partition by type order by i rows between 0 preceding and 0 following) +from smalltable_windowing; + +select type, i, +max(i) over (partition by type order by i rows between 1 preceding and current row), +min(i) over (partition by type order by i rows between 1 preceding and current row), +max(i) over (partition by type order by i rows between current row and 1 following), +min(i) over (partition by type order by i rows between current row and 1 following), +max(i) over (partition by type order by i rows between current row and current row), +min(i) over (partition by type order by i rows between current row and current row) +from smalltable_windowing; diff --git a/ql/src/test/results/clientpositive/llap/windowing_windowspec4.q.out b/ql/src/test/results/clientpositive/llap/windowing_windowspec4.q.out index b668047..c8eca40 100644 --- a/ql/src/test/results/clientpositive/llap/windowing_windowspec4.q.out +++ b/ql/src/test/results/clientpositive/llap/windowing_windowspec4.q.out @@ -53,3 +53,53 @@ POSTHOOK: Input: default@smalltable_windowing a 1 3 1 1 3 2.0 6 [1,2,3] 3 a 2 3 1 1 3 2.0 6 [1,2,3] 3 a 3 3 2 2 3 2.5 5 [2,3] 2 +PREHOOK: query: select type, i, +max(i) over (partition by type order by i rows between 1 preceding and 0 following), +min(i) over (partition by type order by i rows between 1 preceding and 0 following), +max(i) over (partition by type order by i rows between 0 preceding and 1 following), +min(i) over (partition by type order by i rows between 0 preceding and 1 following), +max(i) over (partition by type order by i rows between 0 preceding and 0 following), +min(i) over (partition by type order by i rows between 0 preceding and 0 following) +from smalltable_windowing +PREHOOK: type: QUERY +PREHOOK: Input: default@smalltable_windowing +#### A masked pattern was here #### +POSTHOOK: query: select type, i, +max(i) over (partition by type order by i rows between 1 preceding and 0 following), +min(i) over (partition by type order by i rows between 1 preceding and 0 following), +max(i) over (partition by type order by i rows between 0 preceding and 1 following), +min(i) over (partition by type order by i rows between 0 preceding and 1 following), +max(i) over (partition by type order by i rows between 0 preceding and 0 following), +min(i) over (partition by type order by i rows between 0 preceding and 0 following) +from smalltable_windowing +POSTHOOK: type: QUERY +POSTHOOK: Input: default@smalltable_windowing +#### A masked pattern was here #### +a 1 1 1 2 1 1 1 +a 2 2 1 3 2 2 2 +a 3 3 2 3 3 3 3 +PREHOOK: query: select type, i, +max(i) over (partition by type order by i rows between 1 preceding and current row), +min(i) over (partition by type order by i rows between 1 preceding and current row), +max(i) over (partition by type order by i rows between current row and 1 following), +min(i) over (partition by type order by i rows between current row and 1 following), +max(i) over (partition by type order by i rows between current row and current row), +min(i) over (partition by type order by i rows between current row and current row) +from smalltable_windowing +PREHOOK: type: QUERY +PREHOOK: Input: default@smalltable_windowing +#### A masked pattern was here #### +POSTHOOK: query: select type, i, +max(i) over (partition by type order by i rows between 1 preceding and current row), +min(i) over (partition by type order by i rows between 1 preceding and current row), +max(i) over (partition by type order by i rows between current row and 1 following), +min(i) over (partition by type order by i rows between current row and 1 following), +max(i) over (partition by type order by i rows between current row and current row), +min(i) over (partition by type order by i rows between current row and current row) +from smalltable_windowing +POSTHOOK: type: QUERY +POSTHOOK: Input: default@smalltable_windowing +#### A masked pattern was here #### +a 1 1 1 2 1 1 1 +a 2 2 1 3 2 2 2 +a 3 3 2 3 3 3 3