diff --git a/velox/exec/Window.cpp b/velox/exec/Window.cpp index 303fa045e5e83..af3ff72f6f82c 100644 --- a/velox/exec/Window.cpp +++ b/velox/exec/Window.cpp @@ -284,8 +284,13 @@ void updateKRowsOffsetsColumn( // moves ahead. int precedingFactor = isKPreceding ? -1 : 1; for (auto i = 0; i < numRows; i++) { - rawFrameBounds[i] = - (startRow + i) + vector_size_t(precedingFactor * offsets[i]); + auto startValue = (int64_t)(startRow + i) + precedingFactor * offsets[i]; + // Considers integer overflow case. + if (startValue != (int32_t)startValue) { + rawFrameBounds[i] = startValue < 0 ? 0 : numRows - 1; + } else { + rawFrameBounds[i] = startValue; + } } } @@ -300,8 +305,16 @@ void Window::updateKRowsFrameBounds( if (frameArg.index == kConstantChannel) { auto constantOffset = frameArg.constant.value(); auto startValue = - startRow + (isKPreceding ? -constantOffset : constantOffset); - std::iota(rawFrameBounds, rawFrameBounds + numRows, startValue); + (isKPreceding ? -constantOffset : constantOffset) + startRow; + for (int i = 0; i < numRows; i++) { + // Considers integer overflow case. + if (startValue != (int32_t)startValue) { + rawFrameBounds[i] = startValue < 0 ? 0 : numRows - 1; + } else { + rawFrameBounds[i] = startValue; + } + startValue = startValue + 1; + } } else { currentPartition_->extractColumn( frameArg.index, partitionOffset_, numRows, 0, frameArg.value);