sqlite-vector-rs 0.2.2

SQLite extension providing PGVector-like native vector types with HNSW indexing
Documentation
use sqlite_vector_rs::vtab::config::VectorTableConfig;
use sqlite_vector_rs::vtab::shadow::ShadowOps;

#[test]
fn create_data_table_sql_basic() {
    let args = vec!["vector", "main", "emb", "dim=3", "type=float4", "metric=l2"];
    let config = VectorTableConfig::parse(&args).unwrap();
    let sql = ShadowOps::create_data_table_sql(&config);
    assert!(sql.contains("\"emb_data\""));
    assert!(sql.contains("id INTEGER PRIMARY KEY AUTOINCREMENT"));
    assert!(sql.contains("vector BLOB NOT NULL"));
}

#[test]
fn create_data_table_sql_with_metadata() {
    let args = vec![
        "vector",
        "main",
        "emb",
        "dim=3",
        "type=float4",
        "metric=l2",
        "metadata=\"label TEXT, score REAL\"",
    ];
    let config = VectorTableConfig::parse(&args).unwrap();
    let sql = ShadowOps::create_data_table_sql(&config);
    assert!(sql.contains("label TEXT"));
    assert!(sql.contains("score REAL"));
}

#[test]
fn create_index_table_sql() {
    let args = vec!["vector", "main", "emb", "dim=3"];
    let config = VectorTableConfig::parse(&args).unwrap();
    let sql = ShadowOps::create_index_table_sql(&config);
    assert!(sql.contains("\"emb_index\""));
    assert!(sql.contains("key TEXT PRIMARY KEY"));
    assert!(sql.contains("value BLOB"));
}

#[test]
fn insert_data_sql_with_metadata() {
    let args = vec![
        "vector",
        "main",
        "emb",
        "dim=3",
        "type=float4",
        "metric=l2",
        "metadata=\"label TEXT\"",
    ];
    let config = VectorTableConfig::parse(&args).unwrap();
    let sql = ShadowOps::insert_data_sql(&config);
    assert!(sql.contains("\"emb_data\""));
    assert!(sql.contains("vector, label"));
    assert!(sql.contains("?, ?"));
}

#[test]
fn drop_shadow_tables() {
    let stmts = ShadowOps::drop_shadow_tables_sql("emb");
    assert_eq!(stmts.len(), 2);
    assert!(stmts[0].contains("\"emb_data\""));
    assert!(stmts[1].contains("\"emb_index\""));
}