mirror of
https://github.com/asg017/sqlite-vec.git
synced 2026-04-25 08:46:49 +02:00
vec_blob_close proper handling
This commit is contained in:
parent
21d442903e
commit
7a1b14976a
1 changed files with 41 additions and 7 deletions
48
sqlite-vec.c
48
sqlite-vec.c
|
|
@ -3432,7 +3432,7 @@ int vec0_result_id(vec0_vtab *p, sqlite3_context *context, i64 rowid) {
|
||||||
int vec0_get_vector_data(vec0_vtab *pVtab, i64 rowid, int vector_column_idx,
|
int vec0_get_vector_data(vec0_vtab *pVtab, i64 rowid, int vector_column_idx,
|
||||||
void **outVector, int *outVectorSize) {
|
void **outVector, int *outVectorSize) {
|
||||||
vec0_vtab *p = pVtab;
|
vec0_vtab *p = pVtab;
|
||||||
int rc;
|
int rc, brc;
|
||||||
i64 chunk_id;
|
i64 chunk_id;
|
||||||
i64 chunk_offset;
|
i64 chunk_offset;
|
||||||
size_t size;
|
size_t size;
|
||||||
|
|
@ -3492,7 +3492,13 @@ int vec0_get_vector_data(vec0_vtab *pVtab, i64 rowid, int vector_column_idx,
|
||||||
rc = SQLITE_OK;
|
rc = SQLITE_OK;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
sqlite3_blob_close(vectorBlob);
|
brc = sqlite3_blob_close(vectorBlob);
|
||||||
|
if((rc == SQLITE_OK) && (brc != SQLITE_OK) ) {
|
||||||
|
vtab_set_error(
|
||||||
|
&p->base, VEC_INTERAL_ERROR "unknown error, could not close vector blob, please file an issue");
|
||||||
|
return brc;
|
||||||
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4799,6 +4805,7 @@ int vec0Filter_knn_chunks_iter(vec0_vtab *p, sqlite3_stmt *stmtChunks,
|
||||||
topk_distances[i] = tmp_topk_distances[i];
|
topk_distances[i] = tmp_topk_distances[i];
|
||||||
}
|
}
|
||||||
k_used = used;
|
k_used = used;
|
||||||
|
// blobVectors is always opened with read-only permissions, so this never fails.
|
||||||
sqlite3_blob_close(blobVectors);
|
sqlite3_blob_close(blobVectors);
|
||||||
blobVectors = NULL;
|
blobVectors = NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -4821,6 +4828,7 @@ cleanup:
|
||||||
sqlite3_free(bmRowids);
|
sqlite3_free(bmRowids);
|
||||||
sqlite3_free(baseVectors);
|
sqlite3_free(baseVectors);
|
||||||
sqlite3_free(chunk_distances);
|
sqlite3_free(chunk_distances);
|
||||||
|
// blobVectors is always opened with read-only permissions, so this never fails.
|
||||||
sqlite3_blob_close(blobVectors);
|
sqlite3_blob_close(blobVectors);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
@ -5467,10 +5475,15 @@ done:
|
||||||
|
|
||||||
// blobChunksValidity and pValidity are stale, pointing to the previous
|
// blobChunksValidity and pValidity are stale, pointing to the previous
|
||||||
// (full) chunk. to re-assign them
|
// (full) chunk. to re-assign them
|
||||||
sqlite3_blob_close(*blobChunksValidity);
|
rc = sqlite3_blob_close(*blobChunksValidity);
|
||||||
sqlite3_free((void *)*bufferChunksValidity);
|
sqlite3_free((void *)*bufferChunksValidity);
|
||||||
*blobChunksValidity = NULL;
|
*blobChunksValidity = NULL;
|
||||||
*bufferChunksValidity = NULL;
|
*bufferChunksValidity = NULL;
|
||||||
|
if(rc != SQLITE_OK) {
|
||||||
|
vtab_set_error(&p->base, VEC_INTERAL_ERROR "unknown error, blobChunksValidity could not be closed, please file an issue.");
|
||||||
|
rc = SQLITE_ERROR;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowChunksName,
|
rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowChunksName,
|
||||||
"validity", *chunk_rowid, 1, blobChunksValidity);
|
"validity", *chunk_rowid, 1, blobChunksValidity);
|
||||||
|
|
@ -5566,7 +5579,7 @@ int vec0Update_InsertWriteFinalStep(vec0_vtab *p, i64 chunk_rowid,
|
||||||
void *vectorDatas[],
|
void *vectorDatas[],
|
||||||
sqlite3_blob *blobChunksValidity,
|
sqlite3_blob *blobChunksValidity,
|
||||||
const unsigned char *bufferChunksValidity) {
|
const unsigned char *bufferChunksValidity) {
|
||||||
int rc;
|
int rc, brc;
|
||||||
sqlite3_blob *blobChunksRowids = NULL;
|
sqlite3_blob *blobChunksRowids = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -5606,6 +5619,7 @@ int vec0Update_InsertWriteFinalStep(vec0_vtab *p, i64 chunk_rowid,
|
||||||
p->schemaName, p->shadowVectorChunksNames[i], chunk_rowid, expected,
|
p->schemaName, p->shadowVectorChunksNames[i], chunk_rowid, expected,
|
||||||
actual);
|
actual);
|
||||||
rc = SQLITE_ERROR;
|
rc = SQLITE_ERROR;
|
||||||
|
// already error, can ignore result code
|
||||||
sqlite3_blob_close(blobVectors);
|
sqlite3_blob_close(blobVectors);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
};
|
};
|
||||||
|
|
@ -5619,10 +5633,19 @@ int vec0Update_InsertWriteFinalStep(vec0_vtab *p, i64 chunk_rowid,
|
||||||
"could not write vector blob on %s.%s.%lld",
|
"could not write vector blob on %s.%s.%lld",
|
||||||
p->schemaName, p->shadowVectorChunksNames[i], chunk_rowid);
|
p->schemaName, p->shadowVectorChunksNames[i], chunk_rowid);
|
||||||
rc = SQLITE_ERROR;
|
rc = SQLITE_ERROR;
|
||||||
|
// already error, can ignore result code
|
||||||
sqlite3_blob_close(blobVectors);
|
sqlite3_blob_close(blobVectors);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
sqlite3_blob_close(blobVectors);
|
rc = sqlite3_blob_close(blobVectors);
|
||||||
|
if(rc != SQLITE_OK) {
|
||||||
|
vtab_set_error(&p->base,
|
||||||
|
VEC_INTERAL_ERROR
|
||||||
|
"could not close vector blob on %s.%s.%lld",
|
||||||
|
p->schemaName, p->shadowVectorChunksNames[i], chunk_rowid);
|
||||||
|
rc = SQLITE_ERROR;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -5663,7 +5686,13 @@ int vec0Update_InsertWriteFinalStep(vec0_vtab *p, i64 chunk_rowid,
|
||||||
rc = vec0_rowids_update_position(p, rowid, chunk_rowid, chunk_offset);
|
rc = vec0_rowids_update_position(p, rowid, chunk_rowid, chunk_offset);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
sqlite3_blob_close(blobChunksRowids);
|
brc = sqlite3_blob_close(blobChunksRowids);
|
||||||
|
if((rc == SQLITE_OK) && (brc != SQLITE_OK) ) {
|
||||||
|
vtab_set_error(
|
||||||
|
&p->base, VEC_INTERAL_ERROR "could not close rowids blob on %s.%s.%lld",
|
||||||
|
p->schemaName, p->shadowChunksName, chunk_rowid);
|
||||||
|
return brc;
|
||||||
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5794,8 +5823,13 @@ cleanup:
|
||||||
for (int i = 0; i < numReadVectors; i++) {
|
for (int i = 0; i < numReadVectors; i++) {
|
||||||
cleanups[i](vectorDatas[i]);
|
cleanups[i](vectorDatas[i]);
|
||||||
}
|
}
|
||||||
sqlite3_blob_close(blobChunksValidity);
|
|
||||||
sqlite3_free((void *)bufferChunksValidity);
|
sqlite3_free((void *)bufferChunksValidity);
|
||||||
|
int brc = sqlite3_blob_close(blobChunksValidity);
|
||||||
|
if((rc == SQLITE_OK) && (brc != SQLITE_OK) ) {
|
||||||
|
vtab_set_error(
|
||||||
|
&p->base, VEC_INTERAL_ERROR "unknown error, blobChunksValidity could not be closed, please file an issue");
|
||||||
|
return brc;
|
||||||
|
}
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue