@@ -8471,6 +8471,101 @@ int vec0Update_Delete_DeleteRowids(vec0_vtab *p, i64 rowid) {
84718471 return rc ;
84728472}
84738473
8474+ // Clear the rowid slot in v_chunks.rowids for the given chunk/offset
8475+ int vec0Update_Delete_ClearRowid (vec0_vtab * p , i64 chunk_id , i64 chunk_offset ) {
8476+ int rc ;
8477+ sqlite3_blob * blobChunksRowids = NULL ;
8478+
8479+ rc = sqlite3_blob_open (p -> db , p -> schemaName , p -> shadowChunksName , "rowids" ,
8480+ chunk_id , 1 , & blobChunksRowids );
8481+ if (rc != SQLITE_OK ) {
8482+ vtab_set_error (& p -> base , "could not open rowids blob for %s.%s.%lld" ,
8483+ p -> schemaName , p -> shadowChunksName , chunk_id );
8484+ return SQLITE_ERROR ;
8485+ }
8486+
8487+ i64 expected = p -> chunk_size * sizeof (i64 );
8488+ i64 actual = sqlite3_blob_bytes (blobChunksRowids );
8489+ if (expected != actual ) {
8490+ vtab_set_error (& p -> base ,
8491+ VEC_INTERAL_ERROR
8492+ "rowids blob size mismatch on %s.%s.%lld. Expected %lld, actual %lld" ,
8493+ p -> schemaName , p -> shadowChunksName , chunk_id , expected , actual );
8494+ sqlite3_blob_close (blobChunksRowids );
8495+ return SQLITE_ERROR ;
8496+ }
8497+
8498+ i64 zero = 0 ;
8499+ rc = sqlite3_blob_write (blobChunksRowids , & zero , sizeof (i64 ),
8500+ chunk_offset * sizeof (i64 ));
8501+ int brc = sqlite3_blob_close (blobChunksRowids );
8502+ if (rc != SQLITE_OK ) {
8503+ vtab_set_error (& p -> base , "could not write rowids blob on %s.%s.%lld" ,
8504+ p -> schemaName , p -> shadowChunksName , chunk_id );
8505+ return rc ;
8506+ }
8507+ if (brc != SQLITE_OK ) {
8508+ vtab_set_error (& p -> base ,
8509+ "could not close rowids blob on %s.%s.%lld" ,
8510+ p -> schemaName , p -> shadowChunksName , chunk_id );
8511+ return brc ;
8512+ }
8513+ return SQLITE_OK ;
8514+ }
8515+
8516+ // Clear the vector bytes for each vector column at the given chunk/offset
8517+ int vec0Update_Delete_ClearVectors (vec0_vtab * p , i64 chunk_id , i64 chunk_offset ) {
8518+ for (int i = 0 ; i < p -> numVectorColumns ; i ++ ) {
8519+ int rc ;
8520+ sqlite3_blob * blobVectors = NULL ;
8521+
8522+ rc = sqlite3_blob_open (p -> db , p -> schemaName , p -> shadowVectorChunksNames [i ],
8523+ "vectors" , chunk_id , 1 , & blobVectors );
8524+ if (rc != SQLITE_OK ) {
8525+ vtab_set_error (& p -> base , "Could not open vectors blob for %s.%s.%lld" ,
8526+ p -> schemaName , p -> shadowVectorChunksNames [i ], chunk_id );
8527+ return rc ;
8528+ }
8529+
8530+ i64 expected = p -> chunk_size * vector_column_byte_size (p -> vector_columns [i ]);
8531+ i64 actual = sqlite3_blob_bytes (blobVectors );
8532+ if (expected != actual ) {
8533+ vtab_set_error (& p -> base ,
8534+ VEC_INTERAL_ERROR
8535+ "vector blob size mismatch on %s.%s.%lld. Expected %lld, actual %lld" ,
8536+ p -> schemaName , p -> shadowVectorChunksNames [i ], chunk_id , expected , actual );
8537+ sqlite3_blob_close (blobVectors );
8538+ return SQLITE_ERROR ;
8539+ }
8540+
8541+ size_t nbytes = vector_column_byte_size (p -> vector_columns [i ]);
8542+ void * zeros = sqlite3_malloc (nbytes );
8543+ if (!zeros ) {
8544+ sqlite3_blob_close (blobVectors );
8545+ return SQLITE_NOMEM ;
8546+ }
8547+ memset (zeros , 0 , nbytes );
8548+ rc = vec0_write_vector_to_vector_blob (blobVectors , chunk_offset , zeros ,
8549+ p -> vector_columns [i ].dimensions ,
8550+ p -> vector_columns [i ].element_type );
8551+ sqlite3_free (zeros );
8552+
8553+ int brc = sqlite3_blob_close (blobVectors );
8554+ if (rc != SQLITE_OK ) {
8555+ vtab_set_error (& p -> base , "Could not write to vectors blob for %s.%s.%lld" ,
8556+ p -> schemaName , p -> shadowVectorChunksNames [i ], chunk_id );
8557+ return rc ;
8558+ }
8559+ if (brc != SQLITE_OK ) {
8560+ vtab_set_error (& p -> base ,
8561+ "Could not commit blob transaction for vectors blob for %s.%s.%lld" ,
8562+ p -> schemaName , p -> shadowVectorChunksNames [i ], chunk_id );
8563+ return brc ;
8564+ }
8565+ }
8566+ return SQLITE_OK ;
8567+ }
8568+
84748569int vec0Update_Delete_DeleteAux (vec0_vtab * p , i64 rowid ) {
84758570 int rc ;
84768571 sqlite3_stmt * stmt = NULL ;
@@ -8611,9 +8706,17 @@ int vec0Update_Delete(sqlite3_vtab *pVTab, sqlite3_value *idValue) {
86118706
86128707 // 3. zero out rowid in chunks.rowids
86138708 // https://github.com/asg017/sqlite-vec/issues/54
8709+ rc = vec0Update_Delete_ClearRowid (p , chunk_id , chunk_offset );
8710+ if (rc != SQLITE_OK ) {
8711+ return rc ;
8712+ }
86148713
86158714 // 4. zero out any data in vector chunks tables
86168715 // https://github.com/asg017/sqlite-vec/issues/54
8716+ rc = vec0Update_Delete_ClearVectors (p , chunk_id , chunk_offset );
8717+ if (rc != SQLITE_OK ) {
8718+ return rc ;
8719+ }
86178720
86188721 // 5. delete from _rowids table
86198722 rc = vec0Update_Delete_DeleteRowids (p , rowid );
0 commit comments