@@ -5,17 +5,24 @@ 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, ParsedSvector } ;
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 }
17- Ok ( ( indexes, values, dims) ) => {
18+ Ok ( ParsedSvector {
19+ all_indexes,
20+ indexes,
21+ values,
22+ dims,
23+ } ) => {
1824 check_value_dims_1048575 ( dims) ;
25+ check_index_in_bound ( all_indexes, dims) ;
1926 SVecf32Output :: new ( SVecf32Borrowed :: new ( dims as u32 , & indexes, & values) )
2027 }
2128 }
@@ -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