@@ -5,18 +5,25 @@ use base::scalar::*;
55use base:: vector:: * ;
66use pgrx:: pg_sys:: Oid ;
77use std:: ffi:: { CStr , CString } ;
8+ use std:: fmt:: Write ;
89
910#[ pgrx:: pg_extern( immutable, strict, parallel_safe) ]
1011fn _vectors_svecf32_in ( input : & CStr , _oid : Oid , _typmod : i32 ) -> SVecf32Output {
11- use crate :: utils:: parse:: parse_pgvector_svector;
12+ use crate :: utils:: parse:: { parse_pgvector_svector, svector_filter_nonzero } ;
1213 let v = parse_pgvector_svector ( input. to_bytes ( ) , |s| s. parse :: < F32 > ( ) . ok ( ) ) ;
1314 match v {
1415 Err ( e) => {
1516 bad_literal ( & e. to_string ( ) ) ;
1617 }
1718 Ok ( ( indexes, values, dims) ) => {
1819 check_value_dims_1048575 ( dims) ;
19- SVecf32Output :: new ( SVecf32Borrowed :: new ( dims as u32 , & indexes, & values) )
20+ check_index_in_bound ( & indexes, dims) ;
21+ let ( non_zero_indexes, non_zero_values) = svector_filter_nonzero ( & indexes, & values) ;
22+ SVecf32Output :: new ( SVecf32Borrowed :: new (
23+ dims as u32 ,
24+ & non_zero_indexes,
25+ & non_zero_values,
26+ ) )
2027 }
2128 }
2229}
@@ -27,16 +34,16 @@ fn _vectors_svecf32_out(vector: SVecf32Input<'_>) -> CString {
2734 let mut buffer = String :: new ( ) ;
2835 buffer. push ( '{' ) ;
2936 let svec = vector. for_borrow ( ) ;
30- let mut need_splitter = true ;
37+ let mut need_splitter = false ;
3138 for ( & index, & value) in svec. indexes ( ) . iter ( ) . zip ( svec. values ( ) . iter ( ) ) {
3239 match need_splitter {
33- true => {
34- buffer . push_str ( format ! ( "{}:{}" , index, value) . as_str ( ) ) ;
35- need_splitter = false ;
40+ false => {
41+ write ! ( buffer , "{}:{}" , index, value) . unwrap ( ) ;
42+ need_splitter = true ;
3643 }
37- false => buffer . push_str ( format ! ( ", {}:{}" , index, value) . as_str ( ) ) ,
44+ true => write ! ( buffer , ", {}:{}" , index, value) . unwrap ( ) ,
3845 }
3946 }
40- buffer . push_str ( format ! ( "}}/{}" , dims) . as_str ( ) ) ;
47+ write ! ( buffer , "}}/{}" , dims) . unwrap ( ) ;
4148 CString :: new ( buffer) . unwrap ( )
4249}
0 commit comments