Skip to content

Commit 8a8561e

Browse files
committed
fix: by comments
Signed-off-by: cutecutecat <[email protected]>
1 parent 0fbe5fc commit 8a8561e

File tree

3 files changed

+178
-224
lines changed

3 files changed

+178
-224
lines changed

src/datatype/text_svecf32.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,25 @@ use base::scalar::*;
55
use base::vector::*;
66
use pgrx::pg_sys::Oid;
77
use std::ffi::{CStr, CString};
8+
use std::fmt::Write;
89

910
#[pgrx::pg_extern(immutable, strict, parallel_safe)]
1011
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, 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
}

src/error.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,20 @@ ADVICE: Check if dimensions of the vector are among 1 and 1_048_575."
6969
NonZeroU32::new(dims as u32).unwrap()
7070
}
7171

72+
pub fn check_index_in_bound(indexes: &[u32], dims: usize) -> NonZeroU32 {
73+
let mut last: u32 = 0;
74+
for (i, index) in indexes.iter().enumerate() {
75+
if i > 0 && last == *index {
76+
error!("Indexes need to be unique, but there are more than one same index {index}")
77+
}
78+
if *index >= dims as u32 {
79+
error!("Index out of bounds: the dim is {dims} but the index is {index}");
80+
}
81+
last = *index;
82+
}
83+
NonZeroU32::new(dims as u32).unwrap()
84+
}
85+
7286
pub fn bad_literal(hint: &str) -> ! {
7387
error!(
7488
"\

0 commit comments

Comments
 (0)