Skip to content

Commit 3e0c792

Browse files
committed
fix generate_series table function overflows
1 parent 1ab146a commit 3e0c792

2 files changed

Lines changed: 10 additions & 1 deletion

File tree

datafusion/functions-table/src/generate_series.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,11 @@ impl SeriesValue for i64 {
9898
}
9999

100100
fn advance(&mut self, step: &Self::StepType) -> Result<()> {
101-
*self += step;
101+
*self = self.checked_add(*step).ok_or_else(|| {
102+
datafusion_common::DataFusionError::Execution(
103+
"generate_series: integer overflow while advancing series".to_string(),
104+
)
105+
})?;
102106
Ok(())
103107
}
104108

datafusion/sqllogictest/test_files/table_functions.slt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,11 @@ SELECT * FROM generate_series(1, 2, 3, 4)
183183
statement error DataFusion error: Error during planning: Argument \#1 must be an INTEGER, TIMESTAMP, DATE or NULL, got Utf8
184184
SELECT * FROM generate_series('foo', 'bar')
185185

186+
# Regression test: generate_series with a step that would advance past i64::MAX must
187+
# return an execution error rather than panicking (overflow in integer iterator).
188+
statement error DataFusion error: Execution error: generate_series: integer overflow while advancing series
189+
SELECT * FROM generate_series(9223372036854775806, 9223372036854775807, 2)
190+
186191
# UDF and UDTF `generate_series` can be used simultaneously
187192
query ? rowsort
188193
SELECT generate_series(1, t1.end) FROM generate_series(3, 5) as t1(end)

0 commit comments

Comments
 (0)