@@ -5,17 +5,24 @@ use base::scalar::*;
5
5
use base:: vector:: * ;
6
6
use pgrx:: pg_sys:: Oid ;
7
7
use std:: ffi:: { CStr , CString } ;
8
+ use std:: fmt:: Write ;
8
9
9
10
#[ pgrx:: pg_extern( immutable, strict, parallel_safe) ]
10
11
fn _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 } ;
12
13
let v = parse_pgvector_svector ( input. to_bytes ( ) , |s| s. parse :: < F32 > ( ) . ok ( ) ) ;
13
14
match v {
14
15
Err ( e) => {
15
16
bad_literal ( & e. to_string ( ) ) ;
16
17
}
17
- Ok ( ( indexes, values, dims) ) => {
18
+ Ok ( ParsedSvector {
19
+ all_indexes,
20
+ indexes,
21
+ values,
22
+ dims,
23
+ } ) => {
18
24
check_value_dims_1048575 ( dims) ;
25
+ check_index_in_bound ( all_indexes, dims) ;
19
26
SVecf32Output :: new ( SVecf32Borrowed :: new ( dims as u32 , & indexes, & values) )
20
27
}
21
28
}
@@ -27,16 +34,16 @@ fn _vectors_svecf32_out(vector: SVecf32Input<'_>) -> CString {
27
34
let mut buffer = String :: new ( ) ;
28
35
buffer. push ( '{' ) ;
29
36
let svec = vector. for_borrow ( ) ;
30
- let mut need_splitter = true ;
37
+ let mut need_splitter = false ;
31
38
for ( & index, & value) in svec. indexes ( ) . iter ( ) . zip ( svec. values ( ) . iter ( ) ) {
32
39
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 ;
36
43
}
37
- false => buffer . push_str ( format ! ( ", {}:{}" , index, value) . as_str ( ) ) ,
44
+ true => write ! ( buffer , ", {}:{}" , index, value) . unwrap ( ) ,
38
45
}
39
46
}
40
- buffer . push_str ( format ! ( "}}/{}" , dims) . as_str ( ) ) ;
47
+ write ! ( buffer , "}}/{}" , dims) . unwrap ( ) ;
41
48
CString :: new ( buffer) . unwrap ( )
42
49
}
0 commit comments