small fixes

This commit is contained in:
Alex Garcia 2024-11-14 12:06:50 -08:00
parent ab1f6f2c99
commit 3965029726
2 changed files with 36 additions and 17 deletions

4
TODO
View file

@ -13,7 +13,9 @@
- perf: LEFT JOIN aux table to rowids query in vec0_cursor for rowid/point stmts, to avoid N lookup queries - perf: LEFT JOIN aux table to rowids query in vec0_cursor for rowid/point stmts, to avoid N lookup queries
# metadata filtering # metadata filtering
- boolean comparisons
- text comparisons (long)
- skip invalid validity entries in knn filter?
- null! - null!
- date/datetime - date/datetime
- later - later

View file

@ -4054,6 +4054,7 @@ int vec0_result_metadata_value_for_rowid(vec0_vtab *p, i64 rowid, int metadata_i
if(rc != SQLITE_OK) { if(rc != SQLITE_OK) {
return rc; return rc;
} }
switch(p->metadata_columns[metadata_idx].kind) { switch(p->metadata_columns[metadata_idx].kind) {
case VEC0_METADATA_COLUMN_KIND_BOOLEAN: { case VEC0_METADATA_COLUMN_KIND_BOOLEAN: {
u8 block; u8 block;
@ -4082,7 +4083,6 @@ int vec0_result_metadata_value_for_rowid(vec0_vtab *p, i64 rowid, int metadata_i
} }
sqlite3_result_double(context, value); sqlite3_result_double(context, value);
break; break;
break;
} }
case VEC0_METADATA_COLUMN_KIND_TEXT: { case VEC0_METADATA_COLUMN_KIND_TEXT: {
u8 view[VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; u8 view[VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH];
@ -4098,16 +4098,20 @@ int vec0_result_metadata_value_for_rowid(vec0_vtab *p, i64 rowid, int metadata_i
sqlite3_stmt * stmt; sqlite3_stmt * stmt;
const char * zSql = sqlite3_mprintf("SELECT data FROM " VEC0_SHADOW_METADATA_TEXT_DATA_NAME " WHERE rowid = ?", p->schemaName, p->tableName, metadata_idx); const char * zSql = sqlite3_mprintf("SELECT data FROM " VEC0_SHADOW_METADATA_TEXT_DATA_NAME " WHERE rowid = ?", p->schemaName, p->tableName, metadata_idx);
if(!zSql) { if(!zSql) {
abort(); rc = SQLITE_ERROR;
goto done;
} }
rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL); rc = sqlite3_prepare_v2(p->db, zSql, -1, &stmt, NULL);
sqlite3_free((void *) zSql);
if(rc != SQLITE_OK) { if(rc != SQLITE_OK) {
abort(); goto done;
} }
sqlite3_bind_int64(stmt, 1, rowid); sqlite3_bind_int64(stmt, 1, rowid);
rc = sqlite3_step(stmt); rc = sqlite3_step(stmt);
if(rc != SQLITE_ROW) { if(rc != SQLITE_ROW) {
abort(); sqlite3_finalize(stmt);
rc = SQLITE_ERROR;
goto done;
} }
sqlite3_result_value(context, sqlite3_column_value(stmt, 0)); sqlite3_result_value(context, sqlite3_column_value(stmt, 0));
sqlite3_finalize(stmt); sqlite3_finalize(stmt);
@ -4117,7 +4121,7 @@ int vec0_result_metadata_value_for_rowid(vec0_vtab *p, i64 rowid, int metadata_i
} }
} }
done: done:
// blobValue is read-only, will not fail pn close // blobValue is read-only, will not fail on close
sqlite3_blob_close(blobValue); sqlite3_blob_close(blobValue);
return rc; return rc;
@ -5728,6 +5732,7 @@ int vec0_chunks_iter(vec0_vtab * p, const char * idxStr, int argc, sqlite3_value
int idxStrLength = strlen(idxStr); int idxStrLength = strlen(idxStr);
// "1" refers to the initial vec0_query_plan char, 4 is the number of chars per "element" // "1" refers to the initial vec0_query_plan char, 4 is the number of chars per "element"
int numValueEntries = (idxStrLength-1) / 4; int numValueEntries = (idxStrLength-1) / 4;
assert(argc == numValueEntries);
int rc; int rc;
sqlite3_str * s = sqlite3_str_new(NULL); sqlite3_str * s = sqlite3_str_new(NULL);
@ -6107,6 +6112,7 @@ int vec0Filter_knn_chunks_iter(vec0_vtab *p, sqlite3_stmt *stmtChunks,
int idxStrLength = strlen(idxStr); int idxStrLength = strlen(idxStr);
int numValueEntries = (idxStrLength-1) / 4; int numValueEntries = (idxStrLength-1) / 4;
assert(numValueEntries == argc);
int hasMetadataFilters = 0; int hasMetadataFilters = 0;
for(int i = 0; i < argc; i++) { for(int i = 0; i < argc; i++) {
int idx = 1 + (i * 4); int idx = 1 + (i * 4);
@ -6217,15 +6223,19 @@ int vec0Filter_knn_chunks_iter(vec0_vtab *p, sqlite3_stmt *stmtChunks,
if(!metadataBlobs[metadata_idx]) { if(!metadataBlobs[metadata_idx]) {
rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowMetadataChunksNames[metadata_idx], "data", chunk_id, 0, &metadataBlobs[metadata_idx]); rc = sqlite3_blob_open(p->db, p->schemaName, p->shadowMetadataChunksNames[metadata_idx], "data", chunk_id, 0, &metadataBlobs[metadata_idx]);
vtab_set_error(&p->base, "Could not open metadata blob");
if(rc != SQLITE_OK) { if(rc != SQLITE_OK) {
abort(); // TODO goto cleanup;
} }
} }
bitmap_clear(bmMetadata, p->chunk_size); bitmap_clear(bmMetadata, p->chunk_size);
rc = vec0_set_metadata_filter_bitmap(p, metadata_idx, operator, argv[i], metadataBlobs[metadata_idx], chunk_id, bmMetadata, p->chunk_size); rc = vec0_set_metadata_filter_bitmap(p, metadata_idx, operator, argv[i], metadataBlobs[metadata_idx], chunk_id, bmMetadata, p->chunk_size);
if(rc != SQLITE_OK) { if(rc != SQLITE_OK) {
abort(); // TODO vtab_set_error(&p->base, "Could not filter metadata fields");
if(rc != SQLITE_OK) {
goto cleanup;
}
} }
bitmap_and_inplace(b, bmMetadata, p->chunk_size); bitmap_and_inplace(b, bmMetadata, p->chunk_size);
} }
@ -6791,6 +6801,9 @@ static int vec0Column_fullscan(vec0_vtab *pVtab, vec0_cursor *pCur,
} }
} }
else if(vec0_column_idx_is_metadata(pVtab, i)) { else if(vec0_column_idx_is_metadata(pVtab, i)) {
if(sqlite3_vtab_nochange(context)) {
return SQLITE_OK;
}
int metadata_idx = vec0_column_idx_to_metadata_idx(pVtab, i); int metadata_idx = vec0_column_idx_to_metadata_idx(pVtab, i);
int rc = vec0_result_metadata_value_for_rowid(pVtab, rowid, metadata_idx, context); int rc = vec0_result_metadata_value_for_rowid(pVtab, rowid, metadata_idx, context);
if(rc != SQLITE_OK) { if(rc != SQLITE_OK) {
@ -6858,7 +6871,17 @@ static int vec0Column_point(vec0_vtab *pVtab, vec0_cursor *pCur,
sqlite3_result_error_code(context, rc); sqlite3_result_error_code(context, rc);
} }
} }
// TODO result metadata else if(vec0_column_idx_is_metadata(pVtab, i)) {
if(sqlite3_vtab_nochange(context)) {
return SQLITE_OK;
}
i64 rowid = pCur->point_data->rowid;
int metadata_idx = vec0_column_idx_to_metadata_idx(pVtab, i);
int rc = vec0_result_metadata_value_for_rowid(pVtab, rowid, metadata_idx, context);
if(rc != SQLITE_OK) {
sqlite3_result_error(context, "fuck todo", -1);
}
}
return SQLITE_OK; return SQLITE_OK;
} }
@ -7423,7 +7446,7 @@ int vec0_write_metadata_value(vec0_vtab *p, int metadata_column_idx, i64 rowid,
goto done; goto done;
} }
char * s = sqlite3_value_text(v); const char * s = (const char *) sqlite3_value_text(v);
int n = sqlite3_value_bytes(v); int n = sqlite3_value_bytes(v);
u8 view[VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH]; u8 view[VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH];
memset(view, 0, VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH); memset(view, 0, VEC0_METADATA_TEXT_VIEW_BUFFER_LENGTH);
@ -8016,12 +8039,6 @@ int vec0Update_UpdateAuxColumn(vec0_vtab *p, int auxiliary_column_idx, sqlite3_v
return SQLITE_OK; return SQLITE_OK;
} }
int vec0Update_UpdateMetadataColumn(vec0_vtab *p, int metadata_column_idx, sqlite3_value * value, i64 rowid) {
int rc;
return rc;
}
int vec0Update_UpdateVectorColumn(vec0_vtab *p, i64 chunk_id, i64 chunk_offset, int vec0Update_UpdateVectorColumn(vec0_vtab *p, i64 chunk_id, i64 chunk_offset,
int i, sqlite3_value *valueVector) { int i, sqlite3_value *valueVector) {
int rc; int rc;
@ -8137,7 +8154,7 @@ int vec0Update_Update(sqlite3_vtab *pVTab, int argc, sqlite3_value **argv) {
if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_PARTITION) { if(p->user_column_kinds[i] != SQLITE_VEC0_USER_COLUMN_KIND_PARTITION) {
continue; continue;
} }
int partition_key_idx = p->user_column_idxs[i]; //int partition_key_idx = p->user_column_idxs[i];
sqlite3_value * value = argv[2+VEC0_COLUMN_USERN_START + i]; sqlite3_value * value = argv[2+VEC0_COLUMN_USERN_START + i];
if(sqlite3_value_nochange(value)) { if(sqlite3_value_nochange(value)) {
continue; continue;