1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-23 21:49:02 +03:00
Files
sqlite/ext/vec1/test/vec1train.test
2026-10-07 21:12:50 +00:00

200 lines
5.3 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 vec1train
vec1_load db
do_execsql_test 1.0 {
CREATE TABLE t1(a);
WITH s(i) AS (
VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<1000
) INSERT INTO t1 SELECT random_vector(16) FROM s;
}
do_catchsql_test 1.1 {
SELECT vec1_train(a, '{codesize: "large"}') FROM t1
} {1 {vec1: codesize must be set to an integer value between 1 and 256, or 0}}
do_catchsql_test 1.2 {
SELECT vec1_train(a, '{codesize: 16, nthread: -1}') FROM t1
} {1 {vec1: nthread must be set to an integer value between 1 and 128}}
do_catchsql_test 1.3 {
SELECT vec1_train(a, '{codesize: 1024}') FROM t1
} {1 {vec1: codesize must be set to an integer value between 1 and 256, or 0}}
do_catchsql_test 1.4 {
SELECT vec1_train(a, '{codesize: 8, opq: "yes"}') FROM t1
} {1 {vec1: opq must be set to a boolean value}}
do_catchsql_test 1.5 {
SELECT vec1_train(a, '{codesize: 8, opq: 555}') FROM t1
} {1 {vec1: opq must be set to a boolean value}}
do_execsql_test 2.0 {
CREATE VIRTUAL TABLE u1 USING vec1(a);
}
do_catchsql_test 2.1 {
INSERT INTO u1(cmd, arg) VALUES('rebuild', '{param: 1234}');
} {1 {vec1: unknown parameter: param}}
do_execsql_test 3.0 {
CREATE TABLE t2(x);
INSERT INTO t2 VALUES(random_vector(16));
INSERT INTO t2 VALUES(random_vector(16));
INSERT INTO t2 VALUES(random_vector(16));
INSERT INTO t2 VALUES('');
}
do_catchsql_test 3.1 {
SELECT vec1_train(x, '{codesize: 8}') FROM t2
} {1 {vec1_train: bad argument}}
do_execsql_test 3.2.0 {
UPDATE t2 SET x=randomblob(7) WHERE rowid=4;
}
do_catchsql_test 3.2.1 {
SELECT vec1_train(x, '{codesize: 8}') FROM t2
} {1 {vec1_train: bad argument}}
do_execsql_test 3.3.0 {
UPDATE t2 SET x=random_vector(20) WHERE rowid=4;
}
do_catchsql_test 3.3.1 {
SELECT vec1_train(x, '{codesize: 8}') FROM t2
} {1 {vec1_train: bad argument}}
do_catchsql_test 3.3.2 {
SELECT vec1_train(x) FROM t2
} {1 {vec1_train: bad argument}}
do_execsql_test 3.4.0 {
UPDATE t2 SET x=random_vector(16) WHERE rowid=4;
}
#do_catchsql_test 3.4.1 {
# SELECT vec1_train(x, '{codesize: 12}') FROM t2
#} {1 {vec1_train: vector size (16) must be a multiple of codesize (12)}}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 4.0 {
CREATE TABLE x1(v);
}
do_catchsql_test 4.1 {
SELECT vec1_train(v, '{nbucket: 8}') FROM x1
} {1 {too few training vectors (have 0, require more than that)}}
do_execsql_test 4.2 {
WITH s(i) AS (
VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<100
) INSERT INTO x1 SELECT random_vector(16) FROM s;
}
do_catchsql_test 4.3 {
SELECT vec1_train(v, '{nbucket: 8, progress: "nofunc"}') FROM x1
} {1 {no such function: nofunc}}
proc errorfunc {args} {
error "this is an error!"
}
db func errorfunc errorfunc
do_catchsql_test 4.4 {
SELECT vec1_train(v, '{nbucket: 8, progress: "errorfunc"}') FROM x1
} {1 {this is an error!}}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 5.0 {
CREATE VIRTUAL TABLE v1 USING vec1(a);
WITH s(i) AS (
VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<1000
) INSERT INTO v1 SELECT random_vector(16) FROM s;
}
do_catchsql_test 5.1 {
INSERT INTO v1(cmd, arg) VALUES(
'rebuild', (SELECT substr( (
SELECT vec1_train(a, '{codesize: 8}') FROM v1
), 1, 2000))
);
} {1 {vec1: model size mismatch: have 2000, expected 16408}}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 6.0 {
CREATE VIRTUAL TABLE v1 USING vec1(a);
WITH s(i) AS (
VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<12
) INSERT INTO v1 SELECT random_vector(16) FROM s;
}
proc myprofile {args} {}
db func myprofile myprofile
do_catchsql_test 6.1 {
INSERT INTO v1(cmd, arg) VALUES('rebuild', (
SELECT vec1_train(a, '{quantizer:"pq", profile: "myprofile"}') FROM v1
));
} {1 {too few training vectors (require 512, have 12)}}
#-------------------------------------------------------------------------
# vec1_train() is SQLITE_DIRECTONLY. It may not be used within a view
# or trigger.
#
reset_db
vec1_load db
do_execsql_test 7.0 {
CREATE TABLE t1(a);
WITH s(i) AS (
VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<100
) INSERT INTO t1 SELECT random_vector(16) FROM s;
CREATE TABLE log(x);
}
do_execsql_test 7.1.0 {
CREATE VIEW v1 AS SELECT vec1_train(a) FROM t1;
CREATE VIEW v2 AS SELECT vec1_train(a, '{nbucket: 8}') FROM t1;
}
do_catchsql_test 7.1.1 {
SELECT * FROM v1
} {1 {unsafe use of vec1_train()}}
do_catchsql_test 7.1.2 {
SELECT * FROM v2
} {1 {unsafe use of vec1_train()}}
do_execsql_test 7.2.0 {
CREATE TABLE t2(x);
CREATE TRIGGER tr1 AFTER INSERT ON t2 BEGIN
INSERT INTO log SELECT vec1_train(a, '{nbucket: 8}') FROM t1;
END;
}
do_catchsql_test 7.2.1 {
INSERT INTO t2 VALUES(1);
} {1 {unsafe use of vec1_train()}}
do_execsql_test 7.2.2 {
SELECT count(*) FROM t2;
SELECT count(*) FROM log;
} {0 0}
finish_test