Skip to content
This repository was archived by the owner on Apr 30, 2026. It is now read-only.

Commit 68a7454

Browse files
committed
fix: select-by non-agg path error cleanup and scope safety
- Release previously collected agg_results on error in both the aggregation and non-aggregation eval-group paths (memory leak) - Check ray_env_push_scope return value before binding columns (prevents corrupting outer scope on depth overflow)
1 parent 985c95e commit 68a7454

1 file changed

Lines changed: 13 additions & 3 deletions

File tree

src/ops/query.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,10 @@ ray_t* ray_select_fn(ray_t** args, int64_t n) {
450450
}
451451
if (!src_col_val) {
452452
src_col_val = ray_eval(agg_col_expr);
453-
if (RAY_IS_ERR(src_col_val)) { ray_release(groups); if (eval_tbl != tbl) ray_release(eval_tbl); ray_release(tbl); return src_col_val; }
453+
if (RAY_IS_ERR(src_col_val)) {
454+
for (int ai = 0; ai < n_agg_out; ai++) { if (agg_results[ai]) ray_release(agg_results[ai]); }
455+
ray_release(groups); if (eval_tbl != tbl) ray_release(eval_tbl); ray_release(tbl); return src_col_val;
456+
}
454457
}
455458

456459
/* For each group, compute aggregation */
@@ -486,7 +489,11 @@ ray_t* ray_select_fn(ray_t** args, int64_t n) {
486489
/* Non-aggregation expression (lambda, arithmetic, etc.):
487490
* bind table columns into scope, evaluate the expression
488491
* on the full table, then gather the last value per group. */
489-
ray_env_push_scope();
492+
if (ray_env_push_scope() != RAY_OK) {
493+
for (int ai = 0; ai < n_agg_out; ai++) { if (agg_results[ai]) ray_release(agg_results[ai]); }
494+
ray_release(groups); if (eval_tbl != tbl) ray_release(eval_tbl); ray_release(tbl);
495+
return ray_error("oom", NULL);
496+
}
490497
int64_t enc = ray_table_ncols(eval_tbl);
491498
for (int64_t ci = 0; ci < enc; ci++) {
492499
int64_t cn = ray_table_col_name(eval_tbl, ci);
@@ -495,7 +502,10 @@ ray_t* ray_select_fn(ray_t** args, int64_t n) {
495502
}
496503
ray_t* full_val = ray_eval(val_expr_item);
497504
ray_env_pop_scope();
498-
if (RAY_IS_ERR(full_val)) { ray_release(groups); if (eval_tbl != tbl) ray_release(eval_tbl); ray_release(tbl); return full_val; }
505+
if (RAY_IS_ERR(full_val)) {
506+
for (int ai = 0; ai < n_agg_out; ai++) { if (agg_results[ai]) ray_release(agg_results[ai]); }
507+
ray_release(groups); if (eval_tbl != tbl) ray_release(eval_tbl); ray_release(tbl); return full_val;
508+
}
499509

500510
ray_t* agg_vec = NULL;
501511
ray_t** grp_items = (ray_t**)ray_data(groups);

0 commit comments

Comments
 (0)