Skip to content

Commit e585283

Browse files
committed
Simplify volatile tests
1 parent c55117e commit e585283

File tree

1 file changed

+14
-41
lines changed
  • crates/duckdb/src/vscalar

1 file changed

+14
-41
lines changed

crates/duckdb/src/vscalar/mod.rs

Lines changed: 14 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -415,9 +415,8 @@ mod test {
415415
let mut output_vec = output.flat_vector();
416416
let data = output_vec.as_mut_slice::<i64>();
417417

418-
for i in 0..len {
419-
let count = NON_VOLATILE_COUNTER.fetch_add(1, Ordering::SeqCst);
420-
data[i] = count as i64;
418+
for item in data.iter_mut().take(len) {
419+
*item = NON_VOLATILE_COUNTER.fetch_add(1, Ordering::SeqCst) as i64;
421420
}
422421
Ok(())
423422
}
@@ -444,9 +443,8 @@ mod test {
444443
let mut output_vec = output.flat_vector();
445444
let data = output_vec.as_mut_slice::<i64>();
446445

447-
for i in 0..len {
448-
let count = VOLATILE_COUNTER.fetch_add(1, Ordering::SeqCst);
449-
data[i] = count as i64;
446+
for item in data.iter_mut().take(len) {
447+
*item = VOLATILE_COUNTER.fetch_add(1, Ordering::SeqCst) as i64;
450448
}
451449
Ok(())
452450
}
@@ -467,27 +465,15 @@ mod test {
467465
fn test_volatile_scalar() -> Result<(), Box<dyn Error>> {
468466
let conn = Connection::open_in_memory()?;
469467

470-
// Reset counter
471468
VOLATILE_COUNTER.store(0, Ordering::SeqCst);
472-
473-
// Register volatile counter
474469
conn.register_scalar_function::<VolatileCounterScalar>("volatile_counter")?;
475470

476-
// Query should get different values for each row
477-
let mut stmt = conn.prepare("SELECT volatile_counter() FROM generate_series(1, 5)")?;
478-
let mut rows = stmt.query([])?;
479-
480-
let mut values = Vec::new();
481-
while let Some(row) = rows.next()? {
482-
let val: i64 = row.get(0)?;
483-
values.push(val);
484-
}
471+
let values: Vec<i64> = conn
472+
.prepare("SELECT volatile_counter() FROM generate_series(1, 5)")?
473+
.query_map([], |row| row.get(0))?
474+
.collect::<Result<_, _>>()?;
485475

486-
// Each value should be unique (counter increments)
487-
assert_eq!(values.len(), 5);
488-
for (i, val) in values.iter().enumerate() {
489-
assert_eq!(*val, i as i64, "Row {} should have counter value {}", i, i);
490-
}
476+
assert_eq!(values, [0, 1, 2, 3, 4]);
491477

492478
Ok(())
493479
}
@@ -496,28 +482,15 @@ mod test {
496482
fn test_non_volatile_scalar() -> Result<(), Box<dyn Error>> {
497483
let conn = Connection::open_in_memory()?;
498484

499-
// Reset counter
500485
NON_VOLATILE_COUNTER.store(0, Ordering::SeqCst);
501-
502-
// Register non-volatile counter
503486
conn.register_scalar_function::<CounterScalar>("non_volatile_counter")?;
504487

505-
// Query should get the SAME value for all rows (optimized as constant)
506-
let mut stmt = conn.prepare("SELECT non_volatile_counter() FROM generate_series(1, 5)")?;
507-
let mut rows = stmt.query([])?;
508-
509-
let mut values = Vec::new();
510-
while let Some(row) = rows.next()? {
511-
let val: i64 = row.get(0)?;
512-
values.push(val);
513-
}
488+
// Constant folding should make every row identical
489+
let distinct_count: i64 = conn
490+
.prepare("SELECT COUNT(DISTINCT non_volatile_counter()) FROM generate_series(1, 5)")?
491+
.query_row([], |row| row.get(0))?;
514492

515-
// All values should be the same (function was only called once)
516-
assert_eq!(values.len(), 5);
517-
let first_val = values[0];
518-
for val in values.iter() {
519-
assert_eq!(*val, first_val, "All rows should have the same value when not volatile");
520-
}
493+
assert_eq!(distinct_count, 1);
521494

522495
Ok(())
523496
}

0 commit comments

Comments
 (0)