# 2026-01-17 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # # source [file join [file dirname [info script]] vec1_common.tcl] set testprefix vec1meta vec1_load db do_execsql_test 1.0 { CREATE VIRTUAL TABLE v1 USING vec1(v, a, b); } do_execsql_test 1.1 { SELECT v, a, b FROM v1 } do_execsql_test 1.2 { PRAGMA table_info = v1_base; } { 0 id INTEGER 0 {} 1 1 vector BLOB 0 {} 0 2 c0 {} 0 {} 0 3 c1 {} 0 {} 0 } do_execsql_test 1.3 { PRAGMA table_xinfo = v1; } { 0 cmd {} 0 {} 0 1 1 arg {} 0 {} 0 1 2 distance {} 0 {} 0 1 3 v BLOB 0 {} 0 0 4 a {} 0 {} 0 0 5 b {} 0 {} 0 0 } do_execsql_test 1.4 { INSERT INTO v1 VALUES(random_vector(32), 'A', 'B'); } do_execsql_test 1.5 { SELECT length(v), a, b FROM v1 } {128 A B} #------------------------------------------------------------------------- reset_db vec1_load db # There should be a limit of 256 meta-value columns. Check that this is # enforced. do_test 2.0 { set lInt [list] set res "" for {set ii 0} {$ii < 5000} {incr ii} { lappend lInt "c$ii" set ct "CREATE VIRTUAL TABLE v$ii USING vec1 (v, [join $lInt ,])" if {[catch {execsql $ct} res]} { break } } list $ii $res } {256 {too many meta-data columns (max is 256)}} #------------------------------------------------------------------------- reset_db vec1_load db do_execsql_test 3.0 { CREATE VIRTUAL TABLE v1 USING vec1(v, meta, m2); INSERT INTO v1(cmd, v) VALUES('rebuild', '{index:"flat"}'); INSERT INTO v1 VALUES(random_vector(32), 1234, 0); INSERT INTO v1 VALUES(random_vector(32), 4321, 1); } do_execsql_test 3.1 { PRAGMA integrity_check; } {ok} do_execsql_test 3.2 { INSERT INTO v1(cmd, v) VALUES('rebuild', '{index:"flat"}'); } do_execsql_test 3.3 { PRAGMA integrity_check; } {ok} #------------------------------------------------------------------------- reset_db vec1_load db do_execsql_test 4.1 { CREATE VIRTUAL TABLE v1 USING vec1(v, m1, m2); INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}'); WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<5000 ) INSERT INTO v1 SELECT random_vector(64), i, i+1 FROM s; PRAGMA integrity_check; } {ok} set T [db one {SELECT vec1_train(v, '{nbucket:32, codesize:16}') FROM v1}] do_execsql_test 4.2 { INSERT INTO v1(cmd, arg) VALUES('rebuild', $T); PRAGMA integrity_check; } {ok} execsql { SELECT vec1_config('nthread', 2) } do_execsql_test 4.3 { PRAGMA integrity_check; } {ok} #------------------------------------------------------------------------- reset_db vec1_load db do_execsql_test 5.1 { CREATE VIRTUAL TABLE v1 USING vec1(v, m1, m2); INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}'); BEGIN; INSERT INTO v1(v, m1, m2) VALUES(random_vector(16), 1, 10); INSERT INTO v1(v, m1, m2) VALUES(random_vector(16), 2, 20); INSERT INTO v1(v, m1, m2) VALUES(random_vector(16), 3, 10); INSERT INTO v1(v, m1, m2) VALUES(random_vector(16), 1, 20); INSERT INTO v1(v, m1, m2) VALUES(random_vector(16), 2, 10); INSERT INTO v1(v, m1, m2) VALUES(random_vector(16), 3, 20); INSERT INTO v1(v, m1, m2) VALUES(random_vector(16), 1, 10); INSERT INTO v1(v, m1, m2) VALUES(random_vector(16), 2, 20); INSERT INTO v1(v, m1, m2) VALUES(random_vector(16), 3, 10); COMMIT; PRAGMA integrity_check; } {ok} do_execsql_test 5.2.1 { SELECT rowid FROM v1(random_vector(16), 3) WHERE m1=3 ORDER BY 1 } {3 6 9} do_execsql_test 5.2.2 { SELECT rowid FROM v1(random_vector(16), 4) WHERE m2=20 ORDER BY 1 } {2 4 6 8} do_execsql_test 5.2.3 { SELECT rowid FROM v1(random_vector(16), 3) WHERE m1=3.0 ORDER BY 1 } {3 6 9} do_execsql_test 5.2.4 { SELECT rowid FROM v1(random_vector(16), 4) WHERE m2=20.0 ORDER BY 1 } {2 4 6 8} do_execsql_test 5.3 { INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"none"}'); } do_execsql_test 5.4.1 { SELECT rowid FROM v1(random_vector(16), 3) WHERE m1=3 ORDER BY 1 } {3 6 9} do_execsql_test 5.4.2 { SELECT rowid FROM v1(random_vector(16), 4) WHERE m2=20 ORDER BY 1 } {2 4 6 8} do_execsql_test 5.4.3 { SELECT rowid FROM v1(random_vector(16), 3) WHERE m1=3.0 ORDER BY 1 } {3 6 9} do_execsql_test 5.4.4 { SELECT rowid FROM v1(random_vector(16), 4) WHERE m2=20.0 ORDER BY 1 } {2 4 6 8} do_execsql_test 5.5 { SELECT rowid FROM v1(random_vector(16), 4) WHERE m2=x'1234' ORDER BY 1 } #------------------------------------------------------------------------- reset_db vec1_load db set nRow [expr 200] do_execsql_test 6.0 { CREATE VIRTUAL TABLE x1 USING vec1(v, x); WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<$nRow ) INSERT INTO x1 SELECT random_vector(8), i FROM s; INSERT INTO x1(cmd, arg) VALUES('rebuild', '{index:"flat"}'); } do_test 6.1 { for {set ii 1} {$ii<=$nRow} {incr ii} { set val [db one { SELECT rowid FROM x1(random_vector(8), 1) WHERE x=$ii }] if {$val!=$ii} { error "failed for row $ii ($val)" } } } {} do_execsql_test 6.2 { PRAGMA integrity_check } {ok} #------------------------------------------------------------------------- reset_db vec1_load db set nRow [expr 200] do_execsql_test 7.0 { CREATE VIRTUAL TABLE x1 USING vec1(v, x); WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<$nRow ) INSERT INTO x1 SELECT random_vector(8), (i%7) FROM s; UPDATE x1 SET x=NULL WHERE x=6; INSERT INTO x1(cmd, arg) VALUES('rebuild', '{index:"flat"}'); } do_execsql_test 7.1 { PRAGMA integrity_check } {ok} set nExpect [expr {$nRow/7}] do_execsql_test 7.2 { SELECT count(*) FROM x1(random_vector(8), $nExpect) WHERE x IS NULL } $nExpect for {set ii 0} {$ii<6} {incr ii} { do_execsql_test 7.3.$ii { SELECT count(*) FROM x1(random_vector(8), $nExpect) WHERE x = $ii } $nExpect } set nExpect [expr $nExpect+1] do_execsql_test 7.4 { SELECT rowid FROM x1(random_vector(8), $nExpect) WHERE x IS NULL ORDER BY 1 } [db eval { SELECT rowid FROM x1 WHERE (rowid%7)==6 }] for {set ii 0} {$ii<6} {incr ii} { do_execsql_test 7.5.$ii { SELECT rowid FROM x1(random_vector(8), $nExpect) WHERE x = $ii ORDER BY 1 } [db eval { SELECT rowid FROM x1 WHERE (rowid%7)==$ii }] } finish_test