Skip to content

Commit 4dbf2b3

Browse files
committed
Add error handling to CaseBuilder methods to preserve builder state
1 parent 10af0f1 commit 4dbf2b3

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

python/tests/test_expr.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,24 @@ def traverse_logical_plan(plan):
200200
assert not variant.negated()
201201

202202

203+
def test_case_builder_error_preserves_builder_state():
204+
case_builder = functions.when(lit(True), lit(1))
205+
206+
with pytest.raises(Exception) as exc_info:
207+
case_builder.otherwise(lit("bad"))
208+
209+
err_msg = str(exc_info.value)
210+
assert "multiple data types" in err_msg
211+
assert "CaseBuilder has already been consumed" not in err_msg
212+
213+
with pytest.raises(Exception) as exc_info:
214+
case_builder.end()
215+
216+
err_msg = str(exc_info.value)
217+
assert "multiple data types" in err_msg
218+
assert "CaseBuilder has already been consumed" not in err_msg
219+
220+
203221
def test_expr_getitem() -> None:
204222
ctx = SessionContext()
205223
data = {

src/expr/conditional_expr.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,23 @@ impl PyCaseBuilder {
8383

8484
fn otherwise(&self, else_expr: PyExpr) -> PyDataFusionResult<PyExpr> {
8585
let mut builder = self.take_case_builder()?;
86-
let expr = builder.otherwise(else_expr.expr)?;
87-
Ok(expr.clone().into())
86+
match builder.otherwise(else_expr.expr) {
87+
Ok(expr) => Ok(expr.clone().into()),
88+
Err(err) => {
89+
self.store_case_builder(builder)?;
90+
Err(err.into())
91+
}
92+
}
8893
}
8994

9095
fn end(&self) -> PyDataFusionResult<PyExpr> {
9196
let builder = self.take_case_builder()?;
92-
let expr = builder.end()?;
93-
Ok(expr.clone().into())
97+
match builder.end() {
98+
Ok(expr) => Ok(expr.clone().into()),
99+
Err(err) => {
100+
self.store_case_builder(builder)?;
101+
Err(err.into())
102+
}
103+
}
94104
}
95105
}

0 commit comments

Comments
 (0)