@@ -107,7 +107,7 @@ where
107
107
if input. is_empty ( ) {
108
108
return Err ( ParseVectorError :: EmptyString { } ) ;
109
109
}
110
- let mut dims: usize = 0 ;
110
+ let mut dims: usize = usize :: MAX ;
111
111
let left = ' a: {
112
112
for position in 0 ..input. len ( ) - 1 {
113
113
match input[ position] {
@@ -130,6 +130,10 @@ where
130
130
b'/' => {
131
131
token. reverse ( ) ;
132
132
let s = unsafe { std:: str:: from_utf8_unchecked ( & token[ ..] ) } ;
133
+ // two `dims` are found
134
+ if dims != usize:: MAX {
135
+ return Err ( ParseVectorError :: BadCharacter { position } ) ;
136
+ }
133
137
dims = s
134
138
. parse :: < usize > ( )
135
139
. map_err ( |_| ParseVectorError :: BadParsing { position } ) ?;
@@ -144,6 +148,12 @@ where
144
148
}
145
149
return Err ( ParseVectorError :: BadParentheses { character : '}' } ) ;
146
150
} ;
151
+ // `dims` is not found
152
+ if dims == usize:: MAX {
153
+ return Err ( ParseVectorError :: BadCharacter {
154
+ position : input. len ( ) ,
155
+ } ) ;
156
+ }
147
157
let mut indexes = Vec :: < u32 > :: new ( ) ;
148
158
let mut values = Vec :: < T > :: new ( ) ;
149
159
let mut index: u32 = u32:: MAX ;
@@ -203,6 +213,9 @@ where
203
213
_ => return Err ( ParseVectorError :: BadCharacter { position } ) ,
204
214
}
205
215
}
216
+ // A valid case is either
217
+ // - empty string: ""
218
+ // - end with number when a index is extracted:"1:2, 3:4"
206
219
if state != ParseState :: Start && ( state != ParseState :: Number || index == u32:: MAX ) {
207
220
return Err ( ParseVectorError :: BadCharacter { position : right } ) ;
208
221
}
@@ -283,6 +296,7 @@ mod tests {
283
296
"{0:, 1:2}/5" ,
284
297
"{0:1, 1}/5" ,
285
298
"/2" ,
299
+ "{}/1/2" ,
286
300
] ;
287
301
for e in exprs {
288
302
let ret = parse_pgvector_svector ( e. as_bytes ( ) , |s| s. parse :: < F32 > ( ) . ok ( ) ) ;
0 commit comments