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

305 lines
7.9 KiB
Plaintext

# 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 vec1meta3
vec1_load db
proc create_table {name nMeta} {
set meta ""
for {set i 0} {$i<$nMeta} {incr i} {
append meta ", m$i"
}
execsql "CREATE VIRTUAL TABLE $name USING vec1(v $meta)"
}
do_test 1.0 {
create_table v1 100
} {}
do_test 1.1 {
create_table v2 256
} {}
do_test 1.2 {
list [catch { create_table v3 257 } msg] $msg
} {1 {too many meta-data columns (max is 256)}}
do_test 1.3 {
set vals ""
for {set i 0} {$i<256} {incr i} {
append vals ", $i"
}
execsql "INSERT INTO v2 VALUES( random_vector(8) $vals )"
} {}
do_test 1.4 {
for {set i 0} {$i<256} {incr i} {
set r [execsql "SELECT rowid FROM v2( random_vector(8), 1 ) WHERE m$i = $i"]
if {$r!="1"} { error "unexpected: $r" }
}
set {} {}
} {}
do_execsql_test 1.5 {
SELECT rowid FROM v2( random_vector(8), 1 )
WHERE m1 = 1 AND m2 = 2 AND m5 = 5 AND m4 = 4 AND m3 = 3;
} {1}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 2.0 {
CREATE VIRTUAL TABLE x1 USING vec1(v, a, b);
CREATE TABLE t1(z);
INSERT INTO x1 VALUES(random_vector(8), 10, 20);
INSERT INTO t1 VALUES(10);
}
do_execsql_test 2.1 {
SELECT x1.b FROM x1(random_vector(8), 5), t1 WHERE z=a;
} {20}
do_execsql_test 2.1 {
SELECT x1.b FROM x1(random_vector(8), 5) ORDER BY x1.rowid LIMIT 5
} {20}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 3.0 {
CREATE VIRTUAL TABLE x1 USING vec1(v, a, b);
INSERT INTO x1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
INSERT INTO x1 VALUES(random_vector(8), 10, 20);
INSERT INTO x1 VALUES(random_vector(8), 20, 30);
}
do_execsql_test 3.1 {
INSERT INTO x1 VALUES(random_vector(8), 20_000_000_000, 40);
} {}
#-------------------------------------------------------------------------
# https://sqlite.org/vec1/forumpost/0fd4e91444
#
reset_db
vec1_load db
do_execsql_test 4.0 {
CREATE VIRTUAL TABLE d_blob USING vec1(embedding, title, checksum);
CREATE VIRTUAL TABLE d_text USING vec1(embedding, title, checksum);
CREATE VIRTUAL TABLE d_none USING vec1(embedding, title, checksum);
INSERT INTO d_blob(cmd,arg) VALUES('rebuild','{index:"flat"}');
INSERT INTO d_text(cmd,arg) VALUES('rebuild','{index:"flat"}');
INSERT INTO d_none(cmd,arg) VALUES('rebuild','{index:"none"}');
}
do_execsql_test 4.1 {
WITH RECURSIVE r(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM r WHERE i<200 )
INSERT INTO d_blob(rowid, embedding, title, checksum)
SELECT i, vec1_from_json('['||i||','||(i*2)||',0,0]'), 'runbook '||i,
CAST(printf('%08d', i) AS BLOB)
FROM r;
WITH RECURSIVE r(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM r WHERE i<200 )
INSERT INTO d_text(rowid, embedding, title, checksum)
SELECT i, vec1_from_json('['||i||','||(i*2)||',0,0]'), 'runbook '||i,
printf('%08d', i) FROM r;
WITH RECURSIVE r(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM r WHERE i<200 )
INSERT INTO d_none(rowid, embedding, title, checksum)
SELECT i, vec1_from_json('['||i||','||(i*2)||',0,0]'), 'runbook '||i,
CAST(printf('%08d', i) AS BLOB)
FROM r;
}
foreach tab {d_none d_text d_blob} {
do_execsql_test 4.2.$tab.1 "
DELETE FROM $tab WHERE rowid%2<>0;
"
# Check that the filtered query can see the 100 survivors
do_execsql_test 4.2.$tab.2 [subst -nocommands {
SELECT count(*)
FROM $tab (vec1_from_json('[9,18,0,0]'), 900)
WHERE checksum IS NOT NULL
}] {100}
}
do_execsql_test 4.3.1 {
SELECT count(*)
FROM d_blob(vec1_from_json('[9,18,0,0]'),'{K:900}')
WHERE checksum = CAST('00000100' AS BLOB)
} 1
do_execsql_test 4.3.2 {
SELECT count(*)
FROM d_none(vec1_from_json('[9,18,0,0]'),'{K:900}')
WHERE checksum = CAST('00000100' AS BLOB)
} 1
do_execsql_test 4.3.3 {
SELECT count(*)
FROM d_text(vec1_from_json('[9,18,0,0]'),'{K:900}')
WHERE checksum = '00000100'
} 1
do_execsql_test 4.4 {
PRAGMA integrity_check
} {ok}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 5.0 {
CREATE VIRTUAL TABLE v1 USING vec1(v, a);
INSERT INTO v1 VALUES(random_vector(8), 1);
INSERT INTO v1 VALUES(random_vector(8), 2);
INSERT INTO v1 VALUES(random_vector(8), 3);
INSERT INTO v1 VALUES(random_vector(8), 4);
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
}
do_execsql_test 5.1 {
SELECT rowid FROM v1( random_vector(8), 100 ) WHERE a=500;
}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 6.1.1 {
CREATE VIRTUAL TABLE v1 USING vec1(v, t);
WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000 )
INSERT INTO v1 SELECT random_vector(16), 'tag' || hex(randomblob(1000)) FROM s;
}
do_execsql_test 6.1.2 {
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
PRAGMA integrity_check;
} {ok}
do_execsql_test 6.1.3 {
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"none"}');
} {}
sqlite3_limit db SQLITE_LIMIT_LENGTH 1000000
do_catchsql_test 6.1.4 {
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
} {1 {string or blob too big}}
do_execsql_test 6.1.5 {
PRAGMA integrity_check;
} {ok}
sqlite3_limit db SQLITE_LIMIT_LENGTH 100000000
do_execsql_test 6.1.6 {
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
PRAGMA integrity_check;
} {ok}
do_execsql_test 6.2.0 {
DROP TABLE IF EXISTS v1;
CREATE VIRTUAL TABLE v1 USING vec1(v, t);
WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000 )
INSERT INTO v1 SELECT random_vector(200), 'tag' || hex(randomblob(1)) FROM s;
}
sqlite3_limit db SQLITE_LIMIT_LENGTH 500000
do_catchsql_test 6.2.1 {
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
} {1 {string or blob too big}}
do_execsql_test 6.2.2 {
PRAGMA integrity_check;
} {ok}
sqlite3_limit db SQLITE_LIMIT_LENGTH 100000000
do_execsql_test 6.2.3 {
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
UPDATE v1_idx SET val = NULL;
}
do_execsql_test 6.2.4 {
PRAGMA integrity_check;
} {{v1: %_idx entry id=1 is corrupt}}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 7.0 {
CREATE VIRTUAL TABLE b1 USING vec1(c1, c2);
INSERT INTO b1 VALUES(random_vector(10), 'hello');
INSERT INTO b1 VALUES(random_vector(10), 'world');
INSERT INTO b1 VALUES(random_vector(10), 'one');
INSERT INTO b1 VALUES(random_vector(10), 'one');
INSERT INTO b1 VALUES(random_vector(10), 'world');
INSERT INTO b1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
}
do_execsql_test 7.1 {
SELECT rowid FROM b1(random_vector(10), 10)
WHERE c2 = 'ONE' COLLATE nocase
ORDER BY 1
} {3 4}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 8.0 {
CREATE VIRTUAL TABLE docs USING vec1(embedding, title, size_kb, priority);
INSERT INTO docs(rowid, embedding, title, size_kb, priority)
SELECT i,
vec1_from_json('['||i||',0,0,0]'),
'runbook '||i, (i%5)*100, (i%3)+1
FROM (
WITH RECURSIVE r(i) AS (
SELECT 1 UNION ALL SELECT i+1 FROM r WHERE i<60
)
SELECT i FROM r
);
}
foreach {tn where res} {
1 "priority IN (1,2) AND size_kb=100" 8
2 "size_kb=100 AND priority IN (1,2)" 8
4 "size_kb IN (100,200) AND priority = 1" 8
5 "priority IN (1,2)" 20
6 "size_kb = 100" 12
3 "priority IN (1,2) AND size_kb > 50" 20
} {
breakpoint
do_execsql_test 8.1.$tn "
SELECT count(*)
FROM docs( vec1_from_json('\[1,0,0,0\]'), 20 )
WHERE $where
" [list $res]
}
finish_test