From 273a80571eb5975b4a7b1f856c323e01dcbcd64f Mon Sep 17 00:00:00 2001 From: Anand Krishnamoorthi Date: Fri, 19 Dec 2025 11:21:39 -0600 Subject: [PATCH] fix: apply expression ordering to schedule in a safe way Signed-off-by: Anand Krishnamoorthi --- src/interpreter.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/interpreter.rs b/src/interpreter.rs index 2e551f1..af9faf0 100644 --- a/src/interpreter.rs +++ b/src/interpreter.rs @@ -3708,14 +3708,30 @@ impl Interpreter { .map_err(|err| anyhow!("schedule out of bounds: {err}"))? { for idx in 0..results.result.len() { + let exprs_len = results.result[idx].expressions.len(); + if query_schedule.order.len() != exprs_len { + let msg = format!( + "invalid schedule: expected {exprs_len} expression indices, found {}", + query_schedule.order.len() + ); + bail!(query.span.error(msg.as_str())); + } + let e = Expression { value: Value::Undefined, text: "".into(), location: Location { row: 0, col: 0 }, }; - let mut ordered_expressions = vec![e; results.result[idx].expressions.len()]; + let mut ordered_expressions = vec![e; exprs_len]; for (expr_idx, value) in results.result[idx].expressions.iter().enumerate() { let orig_idx = query_schedule.order[expr_idx] as usize; + if orig_idx >= exprs_len { + let msg = format!( + "invalid schedule expression index {orig_idx} for {} expressions", + exprs_len + ); + bail!(query.span.error(msg.as_str())); + } ordered_expressions[orig_idx] = value.clone(); } if !ordered_expressions