mirror of
https://github.com/sqlite/sqlite.git
synced 2026-10-23 21:49:02 +03:00
248 lines
6.1 KiB
Plaintext
248 lines
6.1 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 vec1cat
|
|
vec1_load db
|
|
|
|
do_execsql_test 1.0 {
|
|
PRAGMA table_info = vec1cat
|
|
} {
|
|
0 database {} 0 {} 0
|
|
1 name {} 0 {} 0
|
|
2 model {} 0 {} 0
|
|
3 qprofile {} 0 {} 0
|
|
}
|
|
|
|
do_execsql_test 1.1 {
|
|
CREATE VIRTUAL TABLE x1 USING vec1(x);
|
|
SELECT database, name FROM vec1cat;
|
|
} {
|
|
main x1
|
|
}
|
|
|
|
db close
|
|
sqlite3 db test.db
|
|
vec1_load db
|
|
|
|
do_execsql_test 1.2 {
|
|
SELECT database, name, model FROM vec1cat;
|
|
} {
|
|
main x1 {{"index": "none", "distance": "l2"}}
|
|
}
|
|
|
|
do_execsql_test 1.3 {
|
|
INSERT INTO x1(cmd, arg) VALUES( 'rebuild', '{index:"flat", distance:"cos"}');
|
|
}
|
|
|
|
do_execsql_test 1.4 {
|
|
SELECT database, name, model FROM vec1cat;
|
|
} {
|
|
main x1 {{"index": "flat", "distance": "cos"}}
|
|
}
|
|
|
|
db close
|
|
sqlite3 db test.db
|
|
vec1_load db
|
|
|
|
do_execsql_test 1.5 {
|
|
SELECT database, name, model FROM vec1cat;
|
|
} {
|
|
main x1 {{"index": "flat", "distance": "cos"}}
|
|
}
|
|
|
|
do_execsql_test 1.6 {
|
|
INSERT INTO x1(cmd, arg) VALUES('rebuild', (
|
|
WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000)
|
|
SELECT vec1_train(random_vector(16), '{nbucket:8, codesize:8}') FROM s
|
|
));
|
|
SELECT database, name, model FROM vec1cat;
|
|
} {
|
|
main x1
|
|
{{"index": "trained", "distance": "l2", "nbucket": 8, "quantizer": "pq", "codesize": 8, "residual": true, "wht": false}}
|
|
}
|
|
|
|
do_execsql_test 1.7 {
|
|
CREATE VIRTUAL TABLE temp.x2 USING vec1(x);
|
|
SELECT rowid, database, name, model FROM vec1cat;
|
|
} {
|
|
1 temp x2
|
|
{{"index": "none", "distance": "l2"}}
|
|
2 main x1
|
|
{{"index": "trained", "distance": "l2", "nbucket": 8, "quantizer": "pq", "codesize": 8, "residual": true, "wht": false}}
|
|
}
|
|
|
|
foreach {tn spec res} {
|
|
|
|
1 {nbucket:0, codesize:8} {
|
|
"index": "trained", "distance": "l2", "nbucket": 0,
|
|
"quantizer": "pq", "codesize": 8,
|
|
"residual": false, "wht": false
|
|
}
|
|
|
|
2 {nbucket:8, codesize:0} {
|
|
"index": "trained", "distance": "l2", "nbucket": 8,
|
|
"quantizer": "none", "codesize": 0,
|
|
"residual": false, "wht": false
|
|
}
|
|
|
|
3 {nbucket:0, codesize:8, opq:1} {
|
|
"index": "trained", "distance": "l2", "nbucket": 0,
|
|
"quantizer": "opq", "codesize": 8,
|
|
"residual": false, "wht": false
|
|
}
|
|
|
|
4 {codesize:2, quantizer: "bq", distance: "cos"} {
|
|
"index": "trained", "distance": "cos", "nbucket": 0,
|
|
"quantizer": "bq", "codesize": 2,
|
|
"residual": false, "wht": true
|
|
}
|
|
|
|
5 {codesize:1, nbucket: 16, quantizer: "bq", distance: "l2", wht: 0} {
|
|
"index": "trained", "distance": "l2", "nbucket": 16,
|
|
"quantizer": "bq", "codesize": 1,
|
|
"residual": true, "wht": false
|
|
}
|
|
|
|
6 {codesize:0, nbucket: 0} {
|
|
"index":"flat", "distance":"l2"
|
|
}
|
|
|
|
7 {} {
|
|
"index":"flat", "distance":"l2"
|
|
}
|
|
|
|
} {
|
|
|
|
set model [db one {
|
|
WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000)
|
|
SELECT vec1_train(random_vector(16), '{'||$spec||'}') FROM s
|
|
}]
|
|
|
|
set output [db one { SELECT json('{' || $res || '}') }]
|
|
|
|
do_execsql_test 1.8.$tn.1 {
|
|
INSERT INTO x1(cmd, arg) VALUES( 'rebuild', $model );
|
|
SELECT json(model) FROM vec1cat WHERE name='x1';
|
|
} [list $output]
|
|
|
|
if {[db one {SELECT json_extract($output, '$.index')=='trained'}]} {
|
|
set model [db one {
|
|
WITH s(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000)
|
|
SELECT vec1_train(random_vector(16), $output) FROM s
|
|
}]
|
|
} else {
|
|
set model $output
|
|
}
|
|
do_execsql_test 1.8.$tn.2 {
|
|
INSERT INTO x1(cmd, arg) VALUES( 'rebuild', $model );
|
|
SELECT json(model) FROM vec1cat WHERE name='x1';
|
|
} [list $output]
|
|
}
|
|
|
|
#-------------------------------------------------------------------------
|
|
reset_db
|
|
vec1_load db
|
|
|
|
do_execsql_test 2.0 {
|
|
CREATE VIRTUAL TABLE x1 USING vec1(x);
|
|
CREATE VIRTUAL TABLE x2 USING vec1(y);
|
|
CREATE VIRTUAL TABLE x3 USING vec1(z);
|
|
}
|
|
|
|
do_execsql_test 2.1 {
|
|
SELECT rowid, name FROM vec1cat
|
|
} {
|
|
1 x3 2 x2 3 x1
|
|
}
|
|
|
|
do_test 2.2 {
|
|
list [catch {
|
|
db eval {
|
|
SELECT rowid, name FROM vec1cat
|
|
} {
|
|
if {$name=="x2"} {
|
|
db eval {
|
|
DROP TABLE x2;
|
|
DROP TABLE x1;
|
|
}
|
|
}
|
|
}
|
|
} msg] $msg
|
|
} {1 {database table is locked}}
|
|
|
|
do_execsql_test 2.3 {
|
|
SELECT qprofile FROM vec1cat WHERE name='x1';
|
|
} {{{
|
|
"total": {"cnt": 0, "cycle": 0},
|
|
"init": {"cnt": 0, "cycle": 0},
|
|
"coarse": {"cnt": 0, "cycle": 0},
|
|
"idxread": {"cnt": 0, "cycle": 0},
|
|
"metaread": {"cnt": 0, "cycle": 0},
|
|
"metascan": {"cnt": 0, "cycle": 0},
|
|
"lut": {"cnt": 0, "cycle": 0},
|
|
"pqscan": {"cnt": 0, "cycle": 0},
|
|
"finalsort": {"cnt": 0, "cycle": 0}
|
|
}}}
|
|
|
|
#-------------------------------------------------------------------------
|
|
reset_db
|
|
vec1_load db
|
|
do_execsql_test 3.0 {
|
|
CREATE VIRTUAL TABLE x2 USING vec1(y);
|
|
INSERT INTO x2 VALUES( random_vector(13) );
|
|
INSERT INTO x2 VALUES( random_vector(13) );
|
|
INSERT INTO x2 VALUES( random_vector(13) );
|
|
INSERT INTO x2 VALUES( random_vector(13) );
|
|
INSERT INTO x2 VALUES( random_vector(13) );
|
|
|
|
INSERT INTO x2(cmd, arg) VALUES('rebuild', (
|
|
WITH s(i) AS ( VALUES (1) UNION ALL SELECT i+1 FROM s WHERE i<512 )
|
|
SELECT vec1_train( random_vector(13), '{nbucket:8}' ) FROM s
|
|
))
|
|
}
|
|
|
|
do_execsql_test 3.1 {
|
|
SELECT count(distance) FROM x2;
|
|
} 5
|
|
|
|
#-------------------------------------------------------------------------
|
|
reset_db
|
|
vec1_load db
|
|
do_execsql_test 4.0 {
|
|
CREATE VIRTUAL TABLE x1 USING vec1(y, a);
|
|
|
|
INSERT INTO x1(cmd, arg) VALUES('rebuild', (
|
|
WITH s(i) AS ( VALUES (1) UNION ALL SELECT i+1 FROM s WHERE i<512 )
|
|
SELECT vec1_train(
|
|
random_vector(32), '{nbucket:8, codesize:8, distance:"cos"}'
|
|
) FROM s
|
|
))
|
|
}
|
|
|
|
do_execsql_test 4.1 {
|
|
INSERT INTO x1 (rowid, y, a) VALUES(10, random_vector(32), 4556);
|
|
}
|
|
|
|
do_execsql_test 4.2 {
|
|
SELECT key FROM json_each( (SELECT distance FROM x1) )
|
|
} {bucket coarse_error reconstruction_error code}
|
|
|
|
do_execsql_test 4.3 {
|
|
SELECT typeof(distance) FROM x1(random_vector(32), '{nprobe:8, K:5}')
|
|
} {real}
|
|
|
|
|
|
finish_test
|
|
|