Skip to content

Commit

Permalink
[BugFix] "first_value" with "ignore nulls" and "rows between unbounde…
Browse files Browse the repository at this point in the history
…d preceding and unbounded following result is wrong (#56467)

Signed-off-by: before-Sunrise <[email protected]>
(cherry picked from commit e9fba8d)
  • Loading branch information
before-Sunrise authored and mergify[bot] committed Mar 4, 2025
1 parent 28d4e69 commit d523752
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,8 @@ public static WindowOperator standardize(AnalyticExpr analyticExpr) {
if (windowFrame != null
&& windowFrame.getLeftBoundary().getType() == AnalyticWindow.BoundaryType.UNBOUNDED_PRECEDING
&& windowFrame.getRightBoundary().getType() != AnalyticWindow.BoundaryType.PRECEDING
&& callExpr.getFnName().getFunction().equalsIgnoreCase(AnalyticExpr.FIRSTVALUE)) {
&& callExpr.getFnName().getFunction().equalsIgnoreCase(AnalyticExpr.FIRSTVALUE) &&
!callExpr.getIgnoreNulls()) {
windowFrame.setRightBoundary(new AnalyticWindow.Boundary(AnalyticWindow.BoundaryType.CURRENT_ROW, null));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1416,4 +1416,13 @@ public void testFirstLastValueReverse() throws Exception {
" 1:SORT\n" +
" | order by: <slot 1> 1: v1 ASC, <slot 2> 2: v2 DESC");
}

@Test
public void testFirstValueIgnoreNulls() throws Exception {
String sql =
"select v1,v2,v3, first_value(v3 ignore nulls) over (partition by v1 order by v2" +
" rows between unbounded PRECEDING and unbounded following) from t0";
String plan = getFragmentPlan(sql);
assertContains(plan, "window: ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING");
}
}
8 changes: 4 additions & 4 deletions test/sql/test_window_function/R/test_basic_window_function
Original file line number Diff line number Diff line change
Expand Up @@ -2339,7 +2339,7 @@ SELECT SUM(wv), AVG(wv), MIN(wv), MAX(wv) FROM (SELECT FIRST_VALUE(v2) OVER(ORDE
-- !result
SELECT SUM(wv), AVG(wv), MIN(wv), MAX(wv) FROM (SELECT FIRST_VALUE(v2 IGNORE NULLS) OVER(ORDER BY v5 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS wv FROM t1) a;
-- result:
245844.00000 3.00000000000 3.00000 3.00000
295008.00000 3.00000000000 3.00000 3.00000
-- !result
SELECT SUM(wv), AVG(wv), MIN(wv), MAX(wv) FROM (SELECT FIRST_VALUE(v2 IGNORE NULLS) OVER(ORDER BY v5 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS wv FROM t1) a;
-- result:
Expand All @@ -2351,7 +2351,7 @@ SELECT SUM(wv), AVG(wv), MIN(wv), MAX(wv) FROM (SELECT FIRST_VALUE(v2 IGNORE NUL
-- !result
SELECT SUM(wv), AVG(wv), MIN(wv), MAX(wv) FROM (SELECT FIRST_VALUE(v2 IGNORE NULLS) OVER(ORDER BY v5 ROWS BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING) AS wv FROM t1) a;
-- result:
245844.00000 3.00000000000 3.00000 3.00000
245874.00000 3.00000000000 3.00000 3.00000
-- !result
SELECT SUM(wv), AVG(wv), MIN(wv), MAX(wv) FROM (SELECT FIRST_VALUE(v2 IGNORE NULLS) OVER(ORDER BY v5 ROWS BETWEEN 10 PRECEDING AND 5 PRECEDING) AS wv FROM t1) a;
-- result:
Expand Down Expand Up @@ -2411,7 +2411,7 @@ SELECT SUM(wv), AVG(wv), MIN(wv), MAX(wv) FROM (SELECT FIRST_VALUE(v2) OVER(PART
-- !result
SELECT SUM(wv), AVG(wv), MIN(wv), MAX(wv) FROM (SELECT FIRST_VALUE(v2 IGNORE NULLS) OVER(PARTITION BY v1 ORDER BY v5 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS wv FROM t1) a;
-- result:
115520.00000 2.34949560690 1.00000 103.00000
231040.00000 2.34949560690 1.00000 103.00000
-- !result
SELECT SUM(wv), AVG(wv), MIN(wv), MAX(wv) FROM (SELECT FIRST_VALUE(v2 IGNORE NULLS) OVER(PARTITION BY v1 ORDER BY v5 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS wv FROM t1) a;
-- result:
Expand All @@ -2423,7 +2423,7 @@ SELECT SUM(wv), AVG(wv), MIN(wv), MAX(wv) FROM (SELECT FIRST_VALUE(v2 IGNORE NUL
-- !result
SELECT SUM(wv), AVG(wv), MIN(wv), MAX(wv) FROM (SELECT FIRST_VALUE(v2 IGNORE NULLS) OVER(PARTITION BY v1 ORDER BY v5 ROWS BETWEEN UNBOUNDED PRECEDING AND 10 FOLLOWING) AS wv FROM t1) a;
-- result:
115520.00000 2.34949560690 1.00000 103.00000
116406.00000 2.36568711133 1.00000 103.00000
-- !result
SELECT SUM(wv), AVG(wv), MIN(wv), MAX(wv) FROM (SELECT FIRST_VALUE(v2 IGNORE NULLS) OVER(PARTITION BY v1 ORDER BY v5 ROWS BETWEEN 10 PRECEDING AND 5 PRECEDING) AS wv FROM t1) a;
-- result:
Expand Down

0 comments on commit d523752

Please sign in to comment.