@@ -5,17 +5,19 @@ 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 { all_indexes , indexes, values, dims} ) => {
1819 check_value_dims_1048575 ( dims) ;
20+ check_index_in_bound ( all_indexes, dims) ;
1921 SVecf32Output :: new ( SVecf32Borrowed :: new ( dims as u32 , & indexes, & values) )
2022 }
2123 }
@@ -27,16 +29,16 @@ fn _vectors_svecf32_out(vector: SVecf32Input<'_>) -> CString {
2729 let mut buffer = String :: new ( ) ;
2830 buffer. push ( '{' ) ;
2931 let svec = vector. for_borrow ( ) ;
30- let mut need_splitter = true ;
32+ let mut need_splitter = false ;
3133 for ( & index, & value) in svec. indexes ( ) . iter ( ) . zip ( svec. values ( ) . iter ( ) ) {
3234 match need_splitter {
33- true => {
34- buffer . push_str ( format ! ( "{}:{}" , index, value) . as_str ( ) ) ;
35- need_splitter = false ;
35+ false => {
36+ write ! ( buffer , "{}:{}" , index, value) . unwrap ( ) ;
37+ need_splitter = true ;
3638 }
37- false => buffer . push_str ( format ! ( ", {}:{}" , index, value) . as_str ( ) ) ,
39+ true => write ! ( buffer , ", {}:{}" , index, value) . unwrap ( ) ,
3840 }
3941 }
40- buffer . push_str ( format ! ( "}}/{}" , dims) . as_str ( ) ) ;
42+ write ! ( buffer , "}}/{}" , dims) . unwrap ( ) ;
4143 CString :: new ( buffer) . unwrap ( )
4244}
0 commit comments