1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-23 21:49:02 +03:00
Files
sqlite/ext/vec1/test/vec1intck.test
dan e32fbe0c23 Import vec1 sources into directory ext/vec1/ of this project.
FossilOrigin-Name: 3a0876d973868be7b6f4156a434cd09098c7ab1abdc7f0ef4f3d12a03de68b24
2026-09-30 14:49:16 +00:00

294 lines
7.5 KiB
Plaintext

# 2026-04-01
#
# 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 vec1intck
vec1_load db
do_execsql_test 1.0 {
CREATE VIRTUAL TABLE mytbl USING vec1(a, b);
WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000 )
INSERT INTO mytbl SELECT random_vector(32), 'val'||i FROM s;
INSERT INTO mytbl(cmd, arg) VALUES('rebuild', (
SELECT vec1_train(a, '{codesize:8}') FROM mytbl
));
}
do_execsql_test 1.1 {
SELECT length(val) FROM mytbl_idx;
} {12076}
do_execsql_test 1.2 {
PRAGMA integrity_check
} {ok}
proc set_ntombstone {val n} {
set be32 [binary format I $n]
return [string replace $val 8 11 $be32]
}
db funct set_ntombstone set_ntombstone
do_execsql_test 1.3 {
UPDATE mytbl_idx SET val = set_ntombstone(val, 4);
} {}
do_execsql_test 1.4 {
PRAGMA integrity_check
} {{mytbl: bad tombstone count}}
do_execsql_test 2.0 {
INSERT INTO mytbl(cmd) VALUES('rebuild');
}
proc zero_pq {val i} {
set iOff [expr 12 + 1000*4 + $i]
set ret $val
for {set jj 0} {$jj < 8} {incr jj} {
set ret [string replace $ret $iOff $iOff [binary format c 0]]
incr iOff 16
}
return $ret
}
db func zero_pq zero_pq
do_execsql_test 2.1 {
UPDATE mytbl_idx SET val = zero_pq(val, 4);
} {}
do_execsql_test 2.2 {
PRAGMA integrity_check
} {{mytbl: %_idx PQ does not match calculated PQ for row 5}}
#------------------------------------------------------------------
do_execsql_test 3.0 {
INSERT INTO mytbl(cmd, arg) VALUES('rebuild', (
SELECT vec1_train(a, '{nbucket:16,codesize:32}') FROM mytbl
));
}
# Replace the vector for row 555 with a copy of the bucket vector that
# is most distant from the current vector. The idea being to pick a
# value guaranteed to be assigned to a different bucket than the current
# vector.
model2tbl model mytbl
do_execsql_test 3.1 {
UPDATE mytbl_base SET vector =
(SELECT coarse FROM model ORDER BY vec1_l2_distance(vector, coarse) DESC)
WHERE id=555;
}
do_execsql_test 3.2 {
PRAGMA integrity_check
} {{mytbl: vector from row 555 is in wrong bucket}}
do_execsql_test 3.3 {
UPDATE mytbl_base SET vector = random_vector(31) WHERE id=555;
}
do_execsql_test 3.4 {
PRAGMA integrity_check
} {{mytbl: vector in %_base row 555 is wrong size}}
do_execsql_test 3.5 {
UPDATE mytbl_base SET vector = random_vector(32);
INSERT INTO mytbl(cmd, arg) VALUES('rebuild', (
SELECT vec1_train(a, '{nbucket:16,codesize:32}') FROM mytbl
));
}
do_execsql_test 3.6 {
UPDATE mytbl_base SET c0 = 'hello world' WHERE id=555
}
do_execsql_test 3.7 {
PRAGMA integrity_check
} {{mytbl: meta-value value mismatch for row 555}}
do_execsql_test 3.8 {
UPDATE mytbl_base SET vector = random_vector(32);
INSERT INTO mytbl(cmd, arg) VALUES('rebuild', (
SELECT vec1_train(a, '{codesize:16}') FROM mytbl
));
}
proc shorten {val} {
string range $val 0 end-1
}
db func shorten shorten
do_execsql_test 3.9 {
UPDATE mytbl_idx SET val = shorten(val);
PRAGMA integrity_check;
} {
{mytbl: %_idx entry id=1 is corrupt}
}
do_execsql_test 3.10 {
INSERT INTO mytbl(cmd, arg) VALUES('rebuild', (
SELECT vec1_train(a, '{nbucket:16}') FROM mytbl
));
}
do_execsql_test 3.11 {
UPDATE mytbl_base SET vector = vector+1 WHERE id=555;
PRAGMA integrity_check;
} {
{mytbl: bucket value in %_base row 555 is incorrect}
}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 4.0 {
CREATE VIRTUAL TABLE v1 USING vec1(x, a, b);
WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 )
INSERT INTO v1(rowid, x, a, b)
SELECT 10_000_000_000 + i, random_vector(8), 20_000_000_000+i, i FROM s;
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
}
do_execsql_test 4.1 {
SELECT count(*) FROM v1;
DELETE FROM v1 WHERE rowid = 10_000_000_000 + 35;
SELECT count(*) FROM v1;
} {100 99}
do_execsql_test 4.2 {
PRAGMA integrity_check
} {ok}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 5.0 {
CREATE VIRTUAL TABLE v1 USING vec1(x, a);
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
INSERT INTO v1 VALUES(random_vector(8), 'helloworld');
INSERT INTO v1 VALUES(random_vector(8), 4.5);
INSERT INTO v1 VALUES(random_vector(8), 1000);
INSERT INTO v1 VALUES(random_vector(8), X'12345678');
PRAGMA integrity_check
} {ok}
foreach {tn update err} {
1 { UPDATE v1_base SET c0='helloWORLD' WHERE id=1 }
{v1: meta-value value mismatch for row 1}
2 { UPDATE v1_base SET c0='helloworld2' WHERE id=1 }
{v1: meta-value value mismatch for row 1}
3 { UPDATE v1_base SET c0=4.5 WHERE id=1 }
{v1: meta-value value mismatch for row 1}
4 { UPDATE v1_base SET c0=5.5 WHERE id=2 }
{v1: meta-value value mismatch for row 2}
5 { UPDATE v1_base SET c0=1001 WHERE id=3 }
{v1: meta-value value mismatch for row 3}
6 { UPDATE v1_base SET c0=5 WHERE id=2 }
{v1: meta-value value mismatch for row 2}
7 { UPDATE v1_base SET c0='textvalue' WHERE id=2 }
{v1: meta-value value mismatch for row 2}
8 { UPDATE v1_base SET c0=X'ABCDEF' WHERE id=2 }
{v1: meta-value value mismatch for row 2}
9 { UPDATE v1_base SET c0=X'ABCDEF' WHERE id=4 }
{v1: meta-value value mismatch for row 4}
10 { UPDATE v1_base SET c0=X'00ABCDEF' WHERE id=4 }
{v1: meta-value value mismatch for row 4}
11 { DELETE FROM v1_base WHERE id=1 }
{v1: %_idx row 1 missing from %_base}
12 { INSERT INTO v1_base(id, vector, c0) VALUES(555,random_vector(8),'xyz') }
{v1: wrong number of entries in %_base - have 5, expect 4}
} {
execsql BEGIN
execsql $update
do_execsql_test 5.$tn {
PRAGMA integrity_check
} [list $err]
execsql ROLLBACK
}
#-------------------------------------------------------------------------
reset_db
vec1_load db
execsql { SELECT vec1_config('nthread', 4) }
do_execsql_test 6.0 {
CREATE VIRTUAL TABLE v1 USING vec1(x, a);
INSERT INTO v1 VALUES(random_vector(8), 1.2);
INSERT INTO v1 VALUES(random_vector(8), 4.5);
INSERT INTO v1 VALUES(random_vector(8), 1000);
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
PRAGMA integrity_check;
} {ok}
do_execsql_test 6.1 {
UPDATE v1 SET a = (rowid*1000);
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
INSERT INTO v1 VALUES(random_vector(8), NULL);
PRAGMA integrity_check;
} {ok}
do_execsql_test 6.2.1 {
INSERT INTO v1 VALUES(random_vector(8), 1.234);
PRAGMA integrity_check;
} {ok}
do_execsql_test 6.2.2 {
INSERT INTO v1 VALUES(random_vector(8), 'text');
PRAGMA integrity_check;
} {ok}
do_execsql_test 6.3 {
UPDATE v1 SET a = (rowid*1000);
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
INSERT INTO v1 VALUES(random_vector(8), 10_000_000_000);
PRAGMA integrity_check;
} {ok}
do_execsql_test 6.4 {
UPDATE v1 SET a = (rowid*1000);
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
INSERT INTO v1 VALUES(random_vector(8), -10_000_000_000);
PRAGMA integrity_check;
} {ok}
do_execsql_test 6.5 {
UPDATE v1 SET a = rowid;
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
INSERT INTO v1 VALUES(random_vector(8), -1);
PRAGMA integrity_check;
} {ok}
finish_test