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

395 lines
9.7 KiB
Plaintext

# 2026-03-12
#
# 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 vec1meta2
vec1_load db
do_execsql_test 1.0 {
CREATE VIRTUAL TABLE v1 USING vec1(v, m1);
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
INSERT INTO v1(rowid, v, m1) VALUES
(1, random_vector(8), '456'),
(2, random_vector(8), 456),
(3, random_vector(8), 456.0),
(4, random_vector(8), NULL),
(5, random_vector(8), 'some text'),
(6, random_vector(8), 'some other text'),
(7, random_vector(8), 'this text'),
(8, random_vector(8), X'ABCDEF'),
(9, random_vector(8), X'AC');
PRAGMA integrity_check;
} {ok}
foreach {tn where res} {
1 "m1 = 456" {2 3}
2 "m1 = 'this text'" {7}
3 "m1 = 'some text'" {5}
4 "m1 = NULL" {}
5 "m1 IS ?" {4}
6 "m1 > 555" {1 5 6 7 8 9}
7 "m1 >= 'some text'" {5 7 8 9}
8 "m1 = '456'" {1}
9 "m1 = X'ABCDEF'" {8}
10 "m1 = X'ac'" {9}
11 "m1 >= X'abcdef'" {8 9}
12 "m1 > X'abcdef'" {9}
13 "m1 IS NULL" {4}
14 "m1 IS NOT NULL" {1 2 3 5 6 7 8 9}
15 "m1 < 555" {2 3}
16 "m1 <= '456'" {1 2 3}
17 "m1 < 123.2" {}
18 "m1 < 123" {}
19 "m1 < 1123.2" {2 3}
20 "m1 < 456.0" {}
21 "m1 IS 456" {2 3}
22 "m1 > 'this'" {7 8 9}
23 "m1 = ''" {}
24 "m1 IS 'this text is'" {}
22 "m1 > X'ABCDEF1234'" {9}
23 "m1 > X'ABCD'" {8 9}
24 "m1 >= X''" {8 9}
25 "m1 ISNULL" {4}
} {
set K [llength $res]
if {$K==0} {set K 100}
do_execsql_test 1.1.$tn "
SELECT * FROM (
SELECT rowid FROM v1(random_vector(8)) WHERE $where LIMIT $K
) ORDER BY 1 LIMIT -1
" $res
}
#-------------------------------------------------------------------------
reset_db
vec1_load db
proc rval {} {
expr (rand() * 10.0)
}
db func rval rval
do_execsql_test 2.0 {
CREATE TABLE t1(v BLOB, m1, m2);
WITH s(i) AS (
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100
)
INSERT INTO t1 SELECT random_vector(12), rval(), rval() FROM s;
UPDATE t1 SET m1=NULL WHERE (rowid%7)==0;
UPDATE t1 SET m2=NULL WHERE (rowid%8)==0;
CREATE VIRTUAL TABLE v1 USING vec1(v, m1, m2);
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
INSERT INTO v1(rowid, v, m1, m2) SELECT rowid, v, m1, m2 FROM t1;
}
# Check the flags on the meta value arrays are set to 0x18.
#
# 0x08=real values.
# 0x10=contains null.
#
do_execsql_test 2.1 {
SELECT hex( substr(val, 1, 4) ) FROM v1_meta
} {00000018 00000018}
foreach t {2 3} {
foreach {tn expr} {
1 "m1 IS NULL"
2 "m1 < 1.0"
3 "m1 BETWEEN -2.5 AND 2.5"
4 "m1 < 4 AND m2 >= 4"
5 "m1 <= 'abc'"
6 "m1 IS NOT NULL"
7 "m1 < 1.1 AND m2 > 2.1"
} {
set expect [db eval "SELECT rowid FROM t1 WHERE $expr ORDER BY 1"]
do_execsql_test 2.$t.$tn.[llength $expect] "
SELECT rowid FROM v1(random_vector(12), 100) WHERE $expr ORDER BY 1
" $expect
}
do_execsql_test 2.$t.x {
PRAGMA integrity_check
} {ok}
do_execsql_test 2.$t.y {
INSERT INTO t1 VALUES(random_vector(12), 'abc', NULL);
INSERT INTO v1(rowid, v, m1, m2)
SELECT rowid, v, m1, m2 FROM t1 WHERE rowid=last_insert_rowid();
SELECT hex( substr(val, 1, 4) ) FROM v1_meta
} {00000011 00000018}
}
db func rval rval
proc rval {} {
expr {int(rand() * 255.0)}
}
do_execsql_test 2.4 {
DELETE FROM t1;
WITH s(i) AS (
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<300
)
INSERT INTO t1 SELECT random_vector(12), rval(), rval() FROM s;
UPDATE t1 SET m1=NULL WHERE m1<6 OR rowid=43;
UPDATE t1 SET m2=NULL WHERE m2<6 OR rowid=43;
DELETE FROM v1;
INSERT INTO v1(rowid, v, m1, m2) SELECT rowid, v, m1, m2 FROM t1;
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
}
do_execsql_test 2.5 {
SELECT hex( substr(val, 1, 4) ) FROM v1_meta
} {00000012 00000012}
foreach t {6 7 8} {
foreach {tn expr} {
1 "m1 IS NULL"
2 "m1 = 11"
3 "m1 < 22"
4 "m1 < 254"
5 "m1 > 180"
6 "m1 IS NULL AND m2 IS NULL"
7 "m1 = 10 AND m2>10"
8 "m1>0 AND m2<100"
9 "m1>=0"
10 "m1>=130"
11 "m1<=130"
12 "m1<='text'"
13 "m1>'text'"
14 "m1>1000"
15 "m1 = 100.0"
16 "m1 > 100.0"
17 "m1 < 100.0"
18 "m1 > 89.2"
19 "m1 < 89.9"
20 "m1 >= 89.9"
21 "m1 BETWEEN -1 AND 201.5"
22 "m1 = 101.2"
23 "m2 IS NOT NULL"
24 "m2 < NULL"
25 "m1 >= -1"
26 "m1 <= 255"
27 "m1 < 255.5"
28 "m1 < 253.5"
29 "m1 = NULL"
30 "m2 >= 0"
31 "m2 >= 3.99"
32 "m2 >= 13.99"
33 "m2 >= 200"
34 "m2 >= 300"
35 "m2 <= 0"
36 "m2 <= 3.99"
37 "m2 <= 135.99"
38 "m2 <= 200"
39 "m2 <= 300"
40 "m2 <= -10_000_000_000"
41 "m1 IN (10, 20, 30)"
42 "m1 IN ('10', 20, 30)"
43 "m1 IN (NULL, NULL)"
44 "m1 IN (NULL, 100, 101, 102)"
45 "m1 IN (1000, NULL, 8, -456.123)"
46 "m2 IN (10, 20, 30)"
47 "m2 IN ('10', 20, 30)"
48 "m2 IN (NULL, NULL)"
49 "m2 IN (NULL, 100, 101, 102)"
50 "m2 IN (1000, NULL, 8, -456.123)"
51 "m2 = X'ABCD'"
52 "m1 < X'ABCD'"
53 "m1 IS 132.5"
54 "m1 > -4.5"
55 "m2 >= -4.5"
56 "m2 < -4.5"
57 "m2 <= -4.5"
58 "m2 IS 132"
} {
set expect [db eval "SELECT rowid FROM t1 WHERE $expr ORDER BY 1"]
do_execsql_test 2.$t.$tn.[llength $expect] "
SELECT rowid FROM (
SELECT rowid FROM v1(random_vector(12)) WHERE $expr LIMIT 1000
) ORDER BY 1 LIMIT -1;
" $expect
}
do_execsql_test 2.$t.x {
PRAGMA integrity_check
} {ok}
if {$t==6} {
do_execsql_test 2.$t.y {
INSERT INTO t1 VALUES(random_vector(12), 1234, 'xyz');
INSERT INTO v1(rowid, v, m1, m2)
SELECT rowid, v, m1, m2 FROM t1 WHERE rowid=last_insert_rowid();
SELECT hex( substr(val, 1, 4) ) FROM v1_meta
} {00000014 00000011}
} else {
do_execsql_test 2.$t.z {
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"none"}');
}
}
}
#-------------------------------------------------------------------------
reset_db
vec1_load db
proc rval {} {
expr int(rand() * 100) * 100
}
db func rval rval
do_execsql_test 3.0 {
CREATE VIRTUAL TABLE v1 USING vec1(v, m1, m2);
CREATE TABLE t1(v, m1, m2);
WITH s(i) AS (
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<300
)
INSERT INTO t1 SELECT random_vector(15), rval(), rval() FROM s;
UPDATE t1 SET m1=NULL WHERE m1<500 OR rowid=43;
UPDATE t1 SET m2=NULL WHERE m2<500 OR rowid=43;
INSERT INTO v1 SELECT * FROM t1;
INSERT INTO v1(cmd, arg) VALUES('rebuild', '{index:"flat"}');
}
foreach t {1 2} {
foreach {tn expr} {
1 "m1 = 4500"
2 "m1 IS NULL"
3 "m1 IS NOT NULL"
4 "m1 < 1000"
5 "m2 > -1000"
4 "m1 < 'text'"
5 "m2 > 'text'"
6 "m1 < 4500.5"
7 "m1 <= 4500.5"
8 "m1 = NULL"
9 "m2 IN (1000, 1100, 1200, 1300)"
10 "m2 IN (3000, 3100, 3200, 3300, NULL, 'text')"
11 "m2 IN (10_000_000_000, 2147483647, -2147483649)"
} {
set expect [db eval "SELECT rowid FROM t1 WHERE $expr ORDER BY 1"]
do_execsql_test 3.$t.$tn.[llength $expect] "
SELECT rowid FROM (
SELECT rowid FROM v1(random_vector(15)) WHERE $expr LIMIT 1000
) ORDER BY 1 LIMIT -1;
" $expect
}
}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 4.0 {
CREATE VIRTUAL TABLE vec1tbl USING vec1(v, t);
INSERT INTO vec1tbl VALUES(
random_vector(8), hex(randomblob(100000))
);
SELECT length(t) FROM vec1tbl;
} {200000}
do_execsql_test 4.1 {
INSERT INTO vec1tbl(cmd, arg) VALUES('rebuild', '{index:"flat"}');
PRAGMA integrity_check;
} {ok}
do_execsql_test 4.2 {
DELETE FROM vec1tbl_meta;
PRAGMA integrity_check;
} {{vec1tbl: error reading meta-list id=1,meta=0}}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 5.0 {
CREATE VIRTUAL TABLE vec1tbl USING vec1(v, t, u);
WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<317 )
INSERT INTO vec1tbl SELECT random_vector(15), 120, NULL FROM s;
INSERT INTO vec1tbl(cmd, arg) VALUES('rebuild', '{index:"flat"}');
} {}
foreach {tn expr} {
1 "t = 120"
2 "u > 120"
3 "t > 100"
4 "t >= 101"
5 "u >= 101"
6 "t IN (100, 120, 140)"
} {
set res [db eval "SELECT rowid FROM vec1tbl WHERE $expr ORDER BY 1"]
do_execsql_test 5.1.$tn "
SELECT rowid FROM vec1tbl(random_vector(15), '{K:500}')
WHERE $expr ORDER BY 1
" $res
}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 5.0 {
CREATE VIRTUAL TABLE vec1tbl USING vec1(v, t, u, x);
INSERT INTO vec1tbl VALUES(random_vector(15), NULL, 2147483647, 1);
INSERT INTO vec1tbl VALUES(random_vector(15), 520, 2147483646, 2);
INSERT INTO vec1tbl VALUES(random_vector(15), NULL, 2147483645, 255);
INSERT INTO vec1tbl VALUES(random_vector(15), NULL, NULL, NULL);
INSERT INTO vec1tbl(cmd, arg) VALUES('rebuild', '{index:"flat"}');
} {}
foreach {tn expr} {
1 "u = 2147483647"
2 "u IS NULL"
3 "t = 2147483647"
4 "t IS NULL"
5 "x = 255"
6 "x IS NULL"
} {
set res [db eval "SELECT rowid FROM vec1tbl WHERE $expr ORDER BY 1"]
do_execsql_test 5.1.$tn "
SELECT rowid FROM vec1tbl(random_vector(15), '{K:500}')
WHERE $expr ORDER BY 1
" $res
}
finish_test