prestodb/presto · error · SemanticException
INVALID_WINDOW_FRAME
INVALID_WINDOW_FRAME
Error message
Window frame start cannot be UNBOUNDED FOLLOWING
What it means
Analysis error from analyzeWindowFrame: the window frame's start bound was specified as UNBOUNDED FOLLOWING, which is logically incoherent (the frame cannot start at the end). Only a frame END may be unbounded following; the faulty input is the frame start specification in the OVER clause.
Source
Thrown at presto-main-base/src/main/java/com/facebook/presto/sql/analyzer/StatementAnalyzer.java:4211
analyzeWindowFrame(window.getFrame().get());
}
FunctionKind kind = functionAndTypeResolver.getFunctionMetadata(analysis.getFunctionHandle(windowFunction)).getFunctionKind();
if (kind != AGGREGATE && kind != WINDOW) {
throw new SemanticException(MUST_BE_WINDOW_FUNCTION, node, "Not a window function: %s", windowFunction.getName());
}
}
return windowFunctions;
}
private void analyzeWindowFrame(WindowFrame frame)
{
FrameBound.Type startType = frame.getStart().getType();
FrameBound.Type endType = frame.getEnd().orElseGet(() -> new FrameBound(CURRENT_ROW)).getType();
if (startType == UNBOUNDED_FOLLOWING) {
throw new SemanticException(INVALID_WINDOW_FRAME, frame, "Window frame start cannot be UNBOUNDED FOLLOWING");
}
if (endType == UNBOUNDED_PRECEDING) {
throw new SemanticException(INVALID_WINDOW_FRAME, frame, "Window frame end cannot be UNBOUNDED PRECEDING");
}
if ((startType == CURRENT_ROW) && (endType == PRECEDING)) {
throw new SemanticException(INVALID_WINDOW_FRAME, frame, "Window frame starting from CURRENT ROW cannot end with PRECEDING");
}
if ((startType == FOLLOWING) && (endType == PRECEDING)) {
throw new SemanticException(INVALID_WINDOW_FRAME, frame, "Window frame starting from FOLLOWING cannot end with PRECEDING");
}
if ((startType == FOLLOWING) && (endType == CURRENT_ROW)) {
throw new SemanticException(INVALID_WINDOW_FRAME, frame, "Window frame starting from FOLLOWING cannot end with CURRENT ROW");
}
}
private void analyzeHaving(QuerySpecification node, Scope scope)
{
if (node.getHaving().isPresent()) {View on GitHub (pinned to 55bb57d202)
Solutions
- Use UNBOUNDED PRECEDING or CURRENT ROW as the frame start
- Swap the bounds: RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
- Omit the frame to use the default RANGE UNBOUNDED PRECEDING
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at presto-main-base/src/main/java/com/facebook/presto/sql/analyzer/StatementAnalyzer.java:4211 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04).
Data as JSON: /api/errors/465876802b454627.
Report an issue: GitHub.