@@ -252,11 +252,29 @@ int vectorParseSqliteBlob(
252252 Vector * pVector ,
253253 char * * pzErrMsg
254254){
255+ const unsigned char * pBlob ;
256+ size_t nBlobSize ;
257+
258+ assert ( sqlite3_value_type (arg ) == SQLITE_BLOB );
259+
260+ pBlob = sqlite3_value_blob (arg );
261+ nBlobSize = sqlite3_value_bytes (arg );
262+ if ( nBlobSize % 2 == 1 ){
263+ nBlobSize -- ;
264+ }
265+
266+ if ( nBlobSize < vectorDataSize (pVector -> type , pVector -> dims ) ){
267+ * pzErrMsg = sqlite3_mprintf ("invalid vector: not enough bytes: type=%d, dims=%d, size=%ull" , pVector -> type , pVector -> dims , nBlobSize );
268+ return SQLITE_ERROR ;
269+ }
270+
255271 switch (pVector -> type ) {
256272 case VECTOR_TYPE_FLOAT32 :
257- return vectorF32ParseSqliteBlob (arg , pVector , pzErrMsg );
273+ vectorF32DeserializeFromBlob (pVector , pBlob , nBlobSize );
274+ return 0 ;
258275 case VECTOR_TYPE_FLOAT64 :
259- return vectorF64ParseSqliteBlob (arg , pVector , pzErrMsg );
276+ vectorF64DeserializeFromBlob (pVector , pBlob , nBlobSize );
277+ return 0 ;
260278 default :
261279 assert (0 );
262280 }
@@ -384,20 +402,47 @@ void vectorMarshalToText(
384402 }
385403}
386404
387- void vectorSerialize (
405+ void vectorSerializeWithType (
388406 sqlite3_context * context ,
389407 const Vector * pVector
390408){
409+ unsigned char * pBlob ;
410+ size_t nBlobSize , nDataSize ;
411+
412+ assert ( pVector -> dims <= MAX_VECTOR_SZ );
413+
414+ nDataSize = vectorDataSize (pVector -> type , pVector -> dims );
415+ nBlobSize = nDataSize ;
416+ if ( pVector -> type != VECTOR_TYPE_FLOAT32 ){
417+ nBlobSize += (nBlobSize % 2 == 0 ? 1 : 2 );
418+ }
419+
420+ if ( nBlobSize == 0 ){
421+ sqlite3_result_zeroblob (context , 0 );
422+ return ;
423+ }
424+
425+ pBlob = sqlite3_malloc64 (nBlobSize );
426+ if ( pBlob == NULL ){
427+ sqlite3_result_error_nomem (context );
428+ return ;
429+ }
430+
431+ if ( pVector -> type != VECTOR_TYPE_FLOAT32 ){
432+ pBlob [nBlobSize - 1 ] = pVector -> type ;
433+ }
434+
391435 switch (pVector -> type ) {
392436 case VECTOR_TYPE_FLOAT32 :
393- vectorF32Serialize ( context , pVector );
437+ vectorF32SerializeToBlob ( pVector , pBlob , nDataSize );
394438 break ;
395439 case VECTOR_TYPE_FLOAT64 :
396- vectorF64Serialize ( context , pVector );
440+ vectorF64SerializeToBlob ( pVector , pBlob , nDataSize );
397441 break ;
398442 default :
399443 assert (0 );
400444 }
445+ sqlite3_result_blob (context , (char * )pBlob , nBlobSize , sqlite3_free );
401446}
402447
403448size_t vectorSerializeToBlob (const Vector * pVector , unsigned char * pBlob , size_t nBlobSize ){
@@ -412,18 +457,6 @@ size_t vectorSerializeToBlob(const Vector *pVector, unsigned char *pBlob, size_t
412457 return 0 ;
413458}
414459
415- size_t vectorDeserializeFromBlob (Vector * pVector , const unsigned char * pBlob , size_t nBlobSize ){
416- switch (pVector -> type ) {
417- case VECTOR_TYPE_FLOAT32 :
418- return vectorF32DeserializeFromBlob (pVector , pBlob , nBlobSize );
419- case VECTOR_TYPE_FLOAT64 :
420- return vectorF64DeserializeFromBlob (pVector , pBlob , nBlobSize );
421- default :
422- assert (0 );
423- }
424- return 0 ;
425- }
426-
427460void vectorInitFromBlob (Vector * pVector , const unsigned char * pBlob , size_t nBlobSize ){
428461 switch (pVector -> type ) {
429462 case VECTOR_TYPE_FLOAT32 :
@@ -470,7 +503,7 @@ static void vectorFuncHintedType(
470503 sqlite3_free (pzErrMsg );
471504 goto out_free_vec ;
472505 }
473- vectorSerialize (context , pVector );
506+ vectorSerializeWithType (context , pVector );
474507out_free_vec :
475508 vectorFree (pVector );
476509}
0 commit comments