@@ -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