2024-05-10 20:51:42 -07:00
|
|
|
#include "sqlite3.h"
|
|
|
|
|
#include "sqlite-vec.h"
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
#include <assert.h>
|
|
|
|
|
|
|
|
|
|
int main(int argc, char *argv[]) {
|
|
|
|
|
int rc = SQLITE_OK;
|
|
|
|
|
sqlite3 *db;
|
|
|
|
|
sqlite3_stmt *stmt;
|
|
|
|
|
|
|
|
|
|
rc = sqlite3_auto_extension((void (*)())sqlite3_vec_init);
|
|
|
|
|
assert(rc == SQLITE_OK);
|
|
|
|
|
|
|
|
|
|
rc = sqlite3_open(":memory:", &db);
|
|
|
|
|
assert(rc == SQLITE_OK);
|
|
|
|
|
|
|
|
|
|
rc = sqlite3_prepare_v2(db, "SELECT sqlite_version(), vec_version()", -1, &stmt, NULL);
|
|
|
|
|
assert(rc == SQLITE_OK);
|
|
|
|
|
|
|
|
|
|
rc = sqlite3_step(stmt);
|
|
|
|
|
printf("sqlite_version=%s, vec_version=%s\n", sqlite3_column_text(stmt, 0), sqlite3_column_text(stmt, 1));
|
|
|
|
|
sqlite3_finalize(stmt);
|
|
|
|
|
|
|
|
|
|
static const struct {
|
|
|
|
|
sqlite3_int64 id;
|
2024-05-11 00:21:44 -07:00
|
|
|
float vector[4];
|
2024-05-10 20:51:42 -07:00
|
|
|
} items[] = {
|
2024-05-11 00:21:44 -07:00
|
|
|
{1, {0.1, 0.1, 0.1, 0.1}},
|
|
|
|
|
{2, {0.2, 0.2, 0.2, 0.2}},
|
|
|
|
|
{3, {0.3, 0.3, 0.3, 0.3}},
|
|
|
|
|
{4, {0.4, 0.4, 0.4, 0.4}},
|
|
|
|
|
{5, {0.5, 0.5, 0.5, 0.5}},
|
2024-05-10 20:51:42 -07:00
|
|
|
};
|
2024-05-11 00:21:44 -07:00
|
|
|
float query[4] = {0.3, 0.3, 0.3, 0.3};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rc = sqlite3_prepare_v2(db, "CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[4])", -1, &stmt, NULL);
|
|
|
|
|
assert(rc == SQLITE_OK);
|
|
|
|
|
rc = sqlite3_step(stmt);
|
|
|
|
|
assert(rc == SQLITE_DONE);
|
|
|
|
|
sqlite3_finalize(stmt);
|
2024-05-10 20:51:42 -07:00
|
|
|
|
|
|
|
|
rc = sqlite3_exec(db, "BEGIN", NULL, NULL, NULL);
|
|
|
|
|
assert(rc == SQLITE_OK);
|
|
|
|
|
rc = sqlite3_prepare_v2(db, "INSERT INTO vec_items(rowid, embedding) VALUES (?, ?)", -1, &stmt, NULL);
|
|
|
|
|
assert(rc == SQLITE_OK);
|
|
|
|
|
for (unsigned long i = 0; i < sizeof(items) / sizeof(items[0]); i++) {
|
|
|
|
|
sqlite3_bind_int64(stmt, 1, items[i].id);
|
|
|
|
|
sqlite3_bind_blob(stmt, 2, items[i].vector, sizeof(items[i].vector), SQLITE_STATIC);
|
|
|
|
|
rc = sqlite3_step(stmt);
|
|
|
|
|
assert(rc == SQLITE_DONE);
|
|
|
|
|
sqlite3_reset(stmt);
|
|
|
|
|
}
|
|
|
|
|
sqlite3_finalize(stmt);
|
|
|
|
|
rc = sqlite3_exec(db, "COMMIT", NULL, NULL, NULL);
|
|
|
|
|
assert(rc == SQLITE_OK);
|
|
|
|
|
|
|
|
|
|
rc = sqlite3_prepare_v2(db,
|
|
|
|
|
"SELECT "
|
|
|
|
|
" rowid, "
|
|
|
|
|
" distance "
|
|
|
|
|
"FROM vec_items "
|
|
|
|
|
"WHERE embedding MATCH ?1 "
|
|
|
|
|
"ORDER BY distance "
|
2024-05-11 00:21:44 -07:00
|
|
|
"LIMIT 3 "
|
2024-05-10 20:51:42 -07:00
|
|
|
, -1, &stmt, NULL);
|
|
|
|
|
assert(rc == SQLITE_OK);
|
|
|
|
|
|
|
|
|
|
sqlite3_bind_blob(stmt, 1, query, sizeof(query), SQLITE_STATIC);
|
|
|
|
|
|
|
|
|
|
while(1) {
|
|
|
|
|
rc = sqlite3_step(stmt);
|
|
|
|
|
if(rc == SQLITE_DONE) break;
|
|
|
|
|
assert(rc==SQLITE_ROW);
|
|
|
|
|
sqlite3_int64 rowid = sqlite3_column_int64(stmt, 0);
|
|
|
|
|
double distance = sqlite3_column_double(stmt, 1);
|
|
|
|
|
printf("rowid=%lld distance=%f\n", rowid, distance);
|
|
|
|
|
}
|
|
|
|
|
sqlite3_finalize(stmt);
|
|
|
|
|
sqlite3_close(db);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|