diff --git a/test/expected/btree.out b/test/expected/btree.out new file mode 100644 index 0000000..999a160 --- /dev/null +++ b/test/expected/btree.out @@ -0,0 +1,61 @@ +SET enable_seqscan = off; +-- vector +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t (val); +SELECT * FROM t WHERE val = '[1,2,3]'; + val +--------- + [1,2,3] +(1 row) + +SELECT * FROM t ORDER BY val; + val +--------- + [0,0,0] + [1,1,1] + [1,2,3] + +(4 rows) + +DROP TABLE t; +-- halfvec +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t (val); +SELECT * FROM t WHERE val = '[1,2,3]'; + val +--------- + [1,2,3] +(1 row) + +SELECT * FROM t ORDER BY val; + val +--------- + [0,0,0] + [1,1,1] + [1,2,3] + +(4 rows) + +DROP TABLE t; +-- sparsevec +CREATE TABLE t (val sparsevec(3)); +INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); +CREATE INDEX ON t (val); +SELECT * FROM t WHERE val = '{1:1,2:2,3:3}/3'; + val +----------------- + {1:1,2:2,3:3}/3 +(1 row) + +SELECT * FROM t ORDER BY val; + val +----------------- + {}/3 + {1:1,2:1,3:1}/3 + {1:1,2:2,3:3}/3 + +(4 rows) + +DROP TABLE t; diff --git a/test/expected/hnsw_bit_hamming.out b/test/expected/hnsw_bit.out similarity index 63% rename from test/expected/hnsw_bit_hamming.out rename to test/expected/hnsw_bit.out index cd0fd96..047954a 100644 --- a/test/expected/hnsw_bit_hamming.out +++ b/test/expected/hnsw_bit.out @@ -1,4 +1,5 @@ SET enable_seqscan = off; +-- hamming CREATE TABLE t (val bit(3)); INSERT INTO t (val) VALUES (B'000'), (B'100'), (B'111'), (NULL); CREATE INDEX ON t USING hnsw (val bit_hamming_ops); @@ -19,7 +20,28 @@ SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <~> (SELECT NULL::bit)) t2; (1 row) DROP TABLE t; --- TODO move +-- jaccard +CREATE TABLE t (val bit(4)); +INSERT INTO t (val) VALUES (B'0000'), (B'1100'), (B'1111'), (NULL); +CREATE INDEX ON t USING hnsw (val bit_jaccard_ops); +INSERT INTO t (val) VALUES (B'1110'); +SELECT * FROM t ORDER BY val <%> B'1111'; + val +------ + 1111 + 1110 + 1100 + 0000 +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <%> (SELECT NULL::bit)) t2; + count +------- + 4 +(1 row) + +DROP TABLE t; +-- varbit CREATE TABLE t (val varbit(3)); CREATE INDEX ON t USING hnsw (val bit_hamming_ops); ERROR: type not supported for hnsw index diff --git a/test/expected/hnsw_bit_jaccard.out b/test/expected/hnsw_bit_jaccard.out deleted file mode 100644 index 6524f00..0000000 --- a/test/expected/hnsw_bit_jaccard.out +++ /dev/null @@ -1,21 +0,0 @@ -SET enable_seqscan = off; -CREATE TABLE t (val bit(4)); -INSERT INTO t (val) VALUES (B'0000'), (B'1100'), (B'1111'), (NULL); -CREATE INDEX ON t USING hnsw (val bit_jaccard_ops); -INSERT INTO t (val) VALUES (B'1110'); -SELECT * FROM t ORDER BY val <%> B'1111'; - val ------- - 1111 - 1110 - 1100 - 0000 -(4 rows) - -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <%> (SELECT NULL::bit)) t2; - count -------- - 4 -(1 row) - -DROP TABLE t; diff --git a/test/expected/hnsw_halfvec.out b/test/expected/hnsw_halfvec.out new file mode 100644 index 0000000..98bbd43 --- /dev/null +++ b/test/expected/hnsw_halfvec.out @@ -0,0 +1,102 @@ +SET enable_seqscan = off; +-- L2 +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val halfvec_l2_ops); +INSERT INTO t (val) VALUES ('[1,2,4]'); +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + val +--------- + [1,2,3] + [1,2,4] + [1,1,1] + [0,0,0] +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::halfvec)) t2; + count +------- + 4 +(1 row) + +SELECT COUNT(*) FROM t; + count +------- + 5 +(1 row) + +TRUNCATE t; +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + val +----- +(0 rows) + +DROP TABLE t; +-- inner product +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val halfvec_ip_ops); +INSERT INTO t (val) VALUES ('[1,2,4]'); +SELECT * FROM t ORDER BY val <#> '[3,3,3]'; + val +--------- + [1,2,4] + [1,2,3] + [1,1,1] + [0,0,0] +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::halfvec)) t2; + count +------- + 4 +(1 row) + +DROP TABLE t; +-- cosine +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val halfvec_cosine_ops); +INSERT INTO t (val) VALUES ('[1,2,4]'); +SELECT * FROM t ORDER BY val <=> '[3,3,3]'; + val +--------- + [1,1,1] + [1,2,3] + [1,2,4] +(3 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '[0,0,0]') t2; + count +------- + 3 +(1 row) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::halfvec)) t2; + count +------- + 3 +(1 row) + +DROP TABLE t; +-- L1 +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val halfvec_l1_ops); +INSERT INTO t (val) VALUES ('[1,2,4]'); +SELECT * FROM t ORDER BY val <+> '[3,3,3]'; + val +--------- + [1,2,3] + [1,2,4] + [1,1,1] + [0,0,0] +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <+> (SELECT NULL::halfvec)) t2; + count +------- + 4 +(1 row) + +DROP TABLE t; diff --git a/test/expected/hnsw_sparsevec.out b/test/expected/hnsw_sparsevec.out new file mode 100644 index 0000000..2a6fe7c --- /dev/null +++ b/test/expected/hnsw_sparsevec.out @@ -0,0 +1,112 @@ +SET enable_seqscan = off; +-- L2 +CREATE TABLE t (val sparsevec(3)); +INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); +CREATE INDEX ON t USING hnsw (val sparsevec_l2_ops); +INSERT INTO t (val) VALUES ('{1:1,2:2,3:4}/3'); +SELECT * FROM t ORDER BY val <-> '{1:3,2:3,3:3}/3'; + val +----------------- + {1:1,2:2,3:3}/3 + {1:1,2:2,3:4}/3 + {1:1,2:1,3:1}/3 + {}/3 +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::sparsevec)) t2; + count +------- + 4 +(1 row) + +SELECT COUNT(*) FROM t; + count +------- + 5 +(1 row) + +TRUNCATE t; +SELECT * FROM t ORDER BY val <-> '{1:3,2:3,3:3}/3'; + val +----- +(0 rows) + +DROP TABLE t; +-- inner product +CREATE TABLE t (val sparsevec(3)); +INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); +CREATE INDEX ON t USING hnsw (val sparsevec_ip_ops); +INSERT INTO t (val) VALUES ('{1:1,2:2,3:4}/3'); +SELECT * FROM t ORDER BY val <#> '{1:3,2:3,3:3}/3'; + val +----------------- + {1:1,2:2,3:4}/3 + {1:1,2:2,3:3}/3 + {1:1,2:1,3:1}/3 + {}/3 +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::sparsevec)) t2; + count +------- + 4 +(1 row) + +DROP TABLE t; +-- cosine +CREATE TABLE t (val sparsevec(3)); +INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); +CREATE INDEX ON t USING hnsw (val sparsevec_cosine_ops); +INSERT INTO t (val) VALUES ('{1:1,2:2,3:4}/3'); +SELECT * FROM t ORDER BY val <=> '{1:3,2:3,3:3}/3'; + val +----------------- + {1:1,2:1,3:1}/3 + {1:1,2:2,3:3}/3 + {1:1,2:2,3:4}/3 +(3 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '{}/3') t2; + count +------- + 3 +(1 row) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::sparsevec)) t2; + count +------- + 3 +(1 row) + +DROP TABLE t; +-- L1 +CREATE TABLE t (val sparsevec(3)); +INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); +CREATE INDEX ON t USING hnsw (val sparsevec_l1_ops); +INSERT INTO t (val) VALUES ('{1:1,2:2,3:4}/3'); +SELECT * FROM t ORDER BY val <+> '{1:3,2:3,3:3}/3'; + val +----------------- + {1:1,2:2,3:3}/3 + {1:1,2:2,3:4}/3 + {1:1,2:1,3:1}/3 + {}/3 +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <+> (SELECT NULL::sparsevec)) t2; + count +------- + 4 +(1 row) + +DROP TABLE t; +-- non-zero elements +CREATE TABLE t (val sparsevec(1001)); +INSERT INTO t (val) VALUES (array_fill(1, ARRAY[1001])::vector::sparsevec); +CREATE INDEX ON t USING hnsw (val sparsevec_l2_ops); +ERROR: sparsevec cannot have more than 1000 non-zero elements for hnsw index +TRUNCATE t; +CREATE INDEX ON t USING hnsw (val sparsevec_l2_ops); +INSERT INTO t (val) VALUES (array_fill(1, ARRAY[1001])::vector::sparsevec); +ERROR: sparsevec cannot have more than 1000 non-zero elements for hnsw index +DROP TABLE t; diff --git a/test/expected/hnsw_vector.out b/test/expected/hnsw_vector.out new file mode 100644 index 0000000..cbda5fa --- /dev/null +++ b/test/expected/hnsw_vector.out @@ -0,0 +1,142 @@ +SET enable_seqscan = off; +-- L2 +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val vector_l2_ops); +INSERT INTO t (val) VALUES ('[1,2,4]'); +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + val +--------- + [1,2,3] + [1,2,4] + [1,1,1] + [0,0,0] +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::vector)) t2; + count +------- + 4 +(1 row) + +SELECT COUNT(*) FROM t; + count +------- + 5 +(1 row) + +TRUNCATE t; +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + val +----- +(0 rows) + +DROP TABLE t; +-- inner product +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val vector_ip_ops); +INSERT INTO t (val) VALUES ('[1,2,4]'); +SELECT * FROM t ORDER BY val <#> '[3,3,3]'; + val +--------- + [1,2,4] + [1,2,3] + [1,1,1] + [0,0,0] +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::vector)) t2; + count +------- + 4 +(1 row) + +DROP TABLE t; +-- cosine +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val vector_cosine_ops); +INSERT INTO t (val) VALUES ('[1,2,4]'); +SELECT * FROM t ORDER BY val <=> '[3,3,3]'; + val +--------- + [1,1,1] + [1,2,3] + [1,2,4] +(3 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '[0,0,0]') t2; + count +------- + 3 +(1 row) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::vector)) t2; + count +------- + 3 +(1 row) + +DROP TABLE t; +-- L1 +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val vector_l1_ops); +INSERT INTO t (val) VALUES ('[1,2,4]'); +SELECT * FROM t ORDER BY val <+> '[3,3,3]'; + val +--------- + [1,2,3] + [1,2,4] + [1,1,1] + [0,0,0] +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <+> (SELECT NULL::vector)) t2; + count +------- + 4 +(1 row) + +DROP TABLE t; +-- unlogged +CREATE UNLOGGED TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val vector_l2_ops); +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + val +--------- + [1,2,3] + [1,1,1] + [0,0,0] +(3 rows) + +DROP TABLE t; +-- options +CREATE TABLE t (val vector(3)); +CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (m = 1); +ERROR: value 1 out of bounds for option "m" +DETAIL: Valid values are between "2" and "100". +CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (m = 101); +ERROR: value 101 out of bounds for option "m" +DETAIL: Valid values are between "2" and "100". +CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (ef_construction = 3); +ERROR: value 3 out of bounds for option "ef_construction" +DETAIL: Valid values are between "4" and "1000". +CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (ef_construction = 1001); +ERROR: value 1001 out of bounds for option "ef_construction" +DETAIL: Valid values are between "4" and "1000". +CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (m = 16, ef_construction = 31); +ERROR: ef_construction must be greater than or equal to 2 * m +SHOW hnsw.ef_search; + hnsw.ef_search +---------------- + 40 +(1 row) + +SET hnsw.ef_search = 0; +ERROR: 0 is outside the valid range for parameter "hnsw.ef_search" (1 .. 1000) +SET hnsw.ef_search = 1001; +ERROR: 1001 is outside the valid range for parameter "hnsw.ef_search" (1 .. 1000) +DROP TABLE t; diff --git a/test/expected/ivfflat_bit.out b/test/expected/ivfflat_bit.out new file mode 100644 index 0000000..ab8adfd --- /dev/null +++ b/test/expected/ivfflat_bit.out @@ -0,0 +1,37 @@ +SET enable_seqscan = off; +-- hamming +CREATE TABLE t (val bit(3)); +INSERT INTO t (val) VALUES (B'000'), (B'100'), (B'111'), (NULL); +CREATE INDEX ON t USING ivfflat (val bit_hamming_ops) WITH (lists = 1); +INSERT INTO t (val) VALUES (B'110'); +SELECT * FROM t ORDER BY val <~> B'111'; + val +----- + 111 + 110 + 100 + 000 +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <~> (SELECT NULL::bit)) t2; + count +------- + 4 +(1 row) + +DROP TABLE t; +-- varbit +CREATE TABLE t (val varbit(3)); +CREATE INDEX ON t USING ivfflat (val bit_hamming_ops) WITH (lists = 1); +ERROR: type not supported for ivfflat index +CREATE INDEX ON t USING ivfflat ((val::bit(3)) bit_hamming_ops) WITH (lists = 1); +NOTICE: ivfflat index created with little data +DETAIL: This will cause low recall. +HINT: Drop the index until the table has more data. +CREATE INDEX ON t USING ivfflat ((val::bit(64001)) bit_hamming_ops) WITH (lists = 1); +ERROR: column cannot have more than 64000 dimensions for ivfflat index +CREATE INDEX ON t USING ivfflat ((val::bit(2)) bit_hamming_ops) WITH (lists = 5); +NOTICE: ivfflat index created with little data +DETAIL: This will cause low recall. +HINT: Drop the index until the table has more data. +DROP TABLE t; diff --git a/test/expected/ivfflat_halfvec.out b/test/expected/ivfflat_halfvec.out new file mode 100644 index 0000000..9b85331 --- /dev/null +++ b/test/expected/ivfflat_halfvec.out @@ -0,0 +1,84 @@ +SET enable_seqscan = off; +-- L2 +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING ivfflat (val halfvec_l2_ops) WITH (lists = 1); +INSERT INTO t (val) VALUES ('[1,2,4]'); +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + val +--------- + [1,2,3] + [1,2,4] + [1,1,1] + [0,0,0] +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::halfvec)) t2; + count +------- + 4 +(1 row) + +SELECT COUNT(*) FROM t; + count +------- + 5 +(1 row) + +TRUNCATE t; +NOTICE: ivfflat index created with little data +DETAIL: This will cause low recall. +HINT: Drop the index until the table has more data. +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + val +----- +(0 rows) + +DROP TABLE t; +-- inner product +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING ivfflat (val halfvec_ip_ops) WITH (lists = 1); +INSERT INTO t (val) VALUES ('[1,2,4]'); +SELECT * FROM t ORDER BY val <#> '[3,3,3]'; + val +--------- + [1,2,4] + [1,2,3] + [1,1,1] + [0,0,0] +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::halfvec)) t2; + count +------- + 4 +(1 row) + +DROP TABLE t; +-- cosine +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING ivfflat (val halfvec_cosine_ops) WITH (lists = 1); +INSERT INTO t (val) VALUES ('[1,2,4]'); +SELECT * FROM t ORDER BY val <=> '[3,3,3]'; + val +--------- + [1,1,1] + [1,2,3] + [1,2,4] +(3 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '[0,0,0]') t2; + count +------- + 3 +(1 row) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::halfvec)) t2; + count +------- + 3 +(1 row) + +DROP TABLE t; diff --git a/test/expected/ivfflat_vector.out b/test/expected/ivfflat_vector.out new file mode 100644 index 0000000..84871b4 --- /dev/null +++ b/test/expected/ivfflat_vector.out @@ -0,0 +1,112 @@ +SET enable_seqscan = off; +-- L2 +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING ivfflat (val vector_l2_ops) WITH (lists = 1); +INSERT INTO t (val) VALUES ('[1,2,4]'); +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + val +--------- + [1,2,3] + [1,2,4] + [1,1,1] + [0,0,0] +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::vector)) t2; + count +------- + 4 +(1 row) + +SELECT COUNT(*) FROM t; + count +------- + 5 +(1 row) + +TRUNCATE t; +NOTICE: ivfflat index created with little data +DETAIL: This will cause low recall. +HINT: Drop the index until the table has more data. +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + val +----- +(0 rows) + +DROP TABLE t; +-- inner product +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING ivfflat (val vector_ip_ops) WITH (lists = 1); +INSERT INTO t (val) VALUES ('[1,2,4]'); +SELECT * FROM t ORDER BY val <#> '[3,3,3]'; + val +--------- + [1,2,4] + [1,2,3] + [1,1,1] + [0,0,0] +(4 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::vector)) t2; + count +------- + 4 +(1 row) + +DROP TABLE t; +-- cosine +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING ivfflat (val vector_cosine_ops) WITH (lists = 1); +INSERT INTO t (val) VALUES ('[1,2,4]'); +SELECT * FROM t ORDER BY val <=> '[3,3,3]'; + val +--------- + [1,1,1] + [1,2,3] + [1,2,4] +(3 rows) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '[0,0,0]') t2; + count +------- + 3 +(1 row) + +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::vector)) t2; + count +------- + 3 +(1 row) + +DROP TABLE t; +-- unlogged +CREATE UNLOGGED TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING ivfflat (val vector_l2_ops) WITH (lists = 1); +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + val +--------- + [1,2,3] + [1,1,1] + [0,0,0] +(3 rows) + +DROP TABLE t; +-- options +CREATE TABLE t (val vector(3)); +CREATE INDEX ON t USING ivfflat (val vector_l2_ops) WITH (lists = 0); +ERROR: value 0 out of bounds for option "lists" +DETAIL: Valid values are between "1" and "32768". +CREATE INDEX ON t USING ivfflat (val vector_l2_ops) WITH (lists = 32769); +ERROR: value 32769 out of bounds for option "lists" +DETAIL: Valid values are between "1" and "32768". +SHOW ivfflat.probes; + ivfflat.probes +---------------- + 1 +(1 row) + +DROP TABLE t; diff --git a/test/sql/btree.sql b/test/sql/btree.sql new file mode 100644 index 0000000..de583c3 --- /dev/null +++ b/test/sql/btree.sql @@ -0,0 +1,34 @@ +SET enable_seqscan = off; + +-- vector + +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t (val); + +SELECT * FROM t WHERE val = '[1,2,3]'; +SELECT * FROM t ORDER BY val; + +DROP TABLE t; + +-- halfvec + +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t (val); + +SELECT * FROM t WHERE val = '[1,2,3]'; +SELECT * FROM t ORDER BY val; + +DROP TABLE t; + +-- sparsevec + +CREATE TABLE t (val sparsevec(3)); +INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); +CREATE INDEX ON t (val); + +SELECT * FROM t WHERE val = '{1:1,2:2,3:3}/3'; +SELECT * FROM t ORDER BY val; + +DROP TABLE t; diff --git a/test/sql/btree_halfvec.sql b/test/sql/btree_halfvec.sql deleted file mode 100644 index 795232d..0000000 --- a/test/sql/btree_halfvec.sql +++ /dev/null @@ -1,10 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val halfvec(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t (val); - -SELECT * FROM t WHERE val = '[1,2,3]'; -SELECT * FROM t ORDER BY val; - -DROP TABLE t; diff --git a/test/sql/btree_sparsevec.sql b/test/sql/btree_sparsevec.sql deleted file mode 100644 index a569364..0000000 --- a/test/sql/btree_sparsevec.sql +++ /dev/null @@ -1,10 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val sparsevec(3)); -INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); -CREATE INDEX ON t (val); - -SELECT * FROM t WHERE val = '{1:1,2:2,3:3}/3'; -SELECT * FROM t ORDER BY val; - -DROP TABLE t; diff --git a/test/sql/btree_vector.sql b/test/sql/btree_vector.sql deleted file mode 100644 index 9c560cd..0000000 --- a/test/sql/btree_vector.sql +++ /dev/null @@ -1,10 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val vector(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t (val); - -SELECT * FROM t WHERE val = '[1,2,3]'; -SELECT * FROM t ORDER BY val; - -DROP TABLE t; diff --git a/test/sql/hnsw_bit_hamming.sql b/test/sql/hnsw_bit.sql similarity index 61% rename from test/sql/hnsw_bit_hamming.sql rename to test/sql/hnsw_bit.sql index c517df0..5a7def7 100644 --- a/test/sql/hnsw_bit_hamming.sql +++ b/test/sql/hnsw_bit.sql @@ -1,5 +1,7 @@ SET enable_seqscan = off; +-- hamming + CREATE TABLE t (val bit(3)); INSERT INTO t (val) VALUES (B'000'), (B'100'), (B'111'), (NULL); CREATE INDEX ON t USING hnsw (val bit_hamming_ops); @@ -11,7 +13,21 @@ SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <~> (SELECT NULL::bit)) t2; DROP TABLE t; --- TODO move +-- jaccard + +CREATE TABLE t (val bit(4)); +INSERT INTO t (val) VALUES (B'0000'), (B'1100'), (B'1111'), (NULL); +CREATE INDEX ON t USING hnsw (val bit_jaccard_ops); + +INSERT INTO t (val) VALUES (B'1110'); + +SELECT * FROM t ORDER BY val <%> B'1111'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <%> (SELECT NULL::bit)) t2; + +DROP TABLE t; + +-- varbit + CREATE TABLE t (val varbit(3)); CREATE INDEX ON t USING hnsw (val bit_hamming_ops); CREATE INDEX ON t USING hnsw ((val::bit(3)) bit_hamming_ops); diff --git a/test/sql/hnsw_bit_jaccard.sql b/test/sql/hnsw_bit_jaccard.sql deleted file mode 100644 index ca61c53..0000000 --- a/test/sql/hnsw_bit_jaccard.sql +++ /dev/null @@ -1,12 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val bit(4)); -INSERT INTO t (val) VALUES (B'0000'), (B'1100'), (B'1111'), (NULL); -CREATE INDEX ON t USING hnsw (val bit_jaccard_ops); - -INSERT INTO t (val) VALUES (B'1110'); - -SELECT * FROM t ORDER BY val <%> B'1111'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <%> (SELECT NULL::bit)) t2; - -DROP TABLE t; diff --git a/test/sql/hnsw_halfvec.sql b/test/sql/hnsw_halfvec.sql new file mode 100644 index 0000000..89460ad --- /dev/null +++ b/test/sql/hnsw_halfvec.sql @@ -0,0 +1,58 @@ +SET enable_seqscan = off; + +-- L2 + +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val halfvec_l2_ops); + +INSERT INTO t (val) VALUES ('[1,2,4]'); + +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::halfvec)) t2; +SELECT COUNT(*) FROM t; + +TRUNCATE t; +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + +DROP TABLE t; + +-- inner product + +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val halfvec_ip_ops); + +INSERT INTO t (val) VALUES ('[1,2,4]'); + +SELECT * FROM t ORDER BY val <#> '[3,3,3]'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::halfvec)) t2; + +DROP TABLE t; + +-- cosine + +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val halfvec_cosine_ops); + +INSERT INTO t (val) VALUES ('[1,2,4]'); + +SELECT * FROM t ORDER BY val <=> '[3,3,3]'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '[0,0,0]') t2; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::halfvec)) t2; + +DROP TABLE t; + +-- L1 + +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val halfvec_l1_ops); + +INSERT INTO t (val) VALUES ('[1,2,4]'); + +SELECT * FROM t ORDER BY val <+> '[3,3,3]'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <+> (SELECT NULL::halfvec)) t2; + +DROP TABLE t; diff --git a/test/sql/hnsw_halfvec_cosine.sql b/test/sql/hnsw_halfvec_cosine.sql deleted file mode 100644 index e5473b4..0000000 --- a/test/sql/hnsw_halfvec_cosine.sql +++ /dev/null @@ -1,13 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val halfvec(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING hnsw (val halfvec_cosine_ops); - -INSERT INTO t (val) VALUES ('[1,2,4]'); - -SELECT * FROM t ORDER BY val <=> '[3,3,3]'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '[0,0,0]') t2; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::halfvec)) t2; - -DROP TABLE t; diff --git a/test/sql/hnsw_halfvec_ip.sql b/test/sql/hnsw_halfvec_ip.sql deleted file mode 100644 index bdf32f7..0000000 --- a/test/sql/hnsw_halfvec_ip.sql +++ /dev/null @@ -1,12 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val halfvec(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING hnsw (val halfvec_ip_ops); - -INSERT INTO t (val) VALUES ('[1,2,4]'); - -SELECT * FROM t ORDER BY val <#> '[3,3,3]'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::halfvec)) t2; - -DROP TABLE t; diff --git a/test/sql/hnsw_halfvec_l1.sql b/test/sql/hnsw_halfvec_l1.sql deleted file mode 100644 index afdc113..0000000 --- a/test/sql/hnsw_halfvec_l1.sql +++ /dev/null @@ -1,12 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val halfvec(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING hnsw (val halfvec_l1_ops); - -INSERT INTO t (val) VALUES ('[1,2,4]'); - -SELECT * FROM t ORDER BY val <+> '[3,3,3]'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <+> (SELECT NULL::halfvec)) t2; - -DROP TABLE t; diff --git a/test/sql/hnsw_halfvec_l2.sql b/test/sql/hnsw_halfvec_l2.sql deleted file mode 100644 index bc20066..0000000 --- a/test/sql/hnsw_halfvec_l2.sql +++ /dev/null @@ -1,16 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val halfvec(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING hnsw (val halfvec_l2_ops); - -INSERT INTO t (val) VALUES ('[1,2,4]'); - -SELECT * FROM t ORDER BY val <-> '[3,3,3]'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::halfvec)) t2; -SELECT COUNT(*) FROM t; - -TRUNCATE t; -SELECT * FROM t ORDER BY val <-> '[3,3,3]'; - -DROP TABLE t; diff --git a/test/sql/hnsw_options.sql b/test/sql/hnsw_options.sql deleted file mode 100644 index 7b9662f..0000000 --- a/test/sql/hnsw_options.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE t (val vector(3)); -CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (m = 1); -CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (m = 101); -CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (ef_construction = 3); -CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (ef_construction = 1001); -CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (m = 16, ef_construction = 31); - -SHOW hnsw.ef_search; - -SET hnsw.ef_search = 0; -SET hnsw.ef_search = 1001; - -DROP TABLE t; diff --git a/test/sql/hnsw_sparsevec.sql b/test/sql/hnsw_sparsevec.sql new file mode 100644 index 0000000..4ec0702 --- /dev/null +++ b/test/sql/hnsw_sparsevec.sql @@ -0,0 +1,68 @@ +SET enable_seqscan = off; + +-- L2 + +CREATE TABLE t (val sparsevec(3)); +INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); +CREATE INDEX ON t USING hnsw (val sparsevec_l2_ops); + +INSERT INTO t (val) VALUES ('{1:1,2:2,3:4}/3'); + +SELECT * FROM t ORDER BY val <-> '{1:3,2:3,3:3}/3'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::sparsevec)) t2; +SELECT COUNT(*) FROM t; + +TRUNCATE t; +SELECT * FROM t ORDER BY val <-> '{1:3,2:3,3:3}/3'; + +DROP TABLE t; + +-- inner product + +CREATE TABLE t (val sparsevec(3)); +INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); +CREATE INDEX ON t USING hnsw (val sparsevec_ip_ops); + +INSERT INTO t (val) VALUES ('{1:1,2:2,3:4}/3'); + +SELECT * FROM t ORDER BY val <#> '{1:3,2:3,3:3}/3'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::sparsevec)) t2; + +DROP TABLE t; + +-- cosine + +CREATE TABLE t (val sparsevec(3)); +INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); +CREATE INDEX ON t USING hnsw (val sparsevec_cosine_ops); + +INSERT INTO t (val) VALUES ('{1:1,2:2,3:4}/3'); + +SELECT * FROM t ORDER BY val <=> '{1:3,2:3,3:3}/3'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '{}/3') t2; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::sparsevec)) t2; + +DROP TABLE t; + +-- L1 + +CREATE TABLE t (val sparsevec(3)); +INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); +CREATE INDEX ON t USING hnsw (val sparsevec_l1_ops); + +INSERT INTO t (val) VALUES ('{1:1,2:2,3:4}/3'); + +SELECT * FROM t ORDER BY val <+> '{1:3,2:3,3:3}/3'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <+> (SELECT NULL::sparsevec)) t2; + +DROP TABLE t; + +-- non-zero elements + +CREATE TABLE t (val sparsevec(1001)); +INSERT INTO t (val) VALUES (array_fill(1, ARRAY[1001])::vector::sparsevec); +CREATE INDEX ON t USING hnsw (val sparsevec_l2_ops); +TRUNCATE t; +CREATE INDEX ON t USING hnsw (val sparsevec_l2_ops); +INSERT INTO t (val) VALUES (array_fill(1, ARRAY[1001])::vector::sparsevec); +DROP TABLE t; diff --git a/test/sql/hnsw_sparsevec_cosine.sql b/test/sql/hnsw_sparsevec_cosine.sql deleted file mode 100644 index 2ba1c1e..0000000 --- a/test/sql/hnsw_sparsevec_cosine.sql +++ /dev/null @@ -1,13 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val sparsevec(3)); -INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); -CREATE INDEX ON t USING hnsw (val sparsevec_cosine_ops); - -INSERT INTO t (val) VALUES ('{1:1,2:2,3:4}/3'); - -SELECT * FROM t ORDER BY val <=> '{1:3,2:3,3:3}/3'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '{}/3') t2; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::sparsevec)) t2; - -DROP TABLE t; diff --git a/test/sql/hnsw_sparsevec_ip.sql b/test/sql/hnsw_sparsevec_ip.sql deleted file mode 100644 index 1fc8449..0000000 --- a/test/sql/hnsw_sparsevec_ip.sql +++ /dev/null @@ -1,12 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val sparsevec(3)); -INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); -CREATE INDEX ON t USING hnsw (val sparsevec_ip_ops); - -INSERT INTO t (val) VALUES ('{1:1,2:2,3:4}/3'); - -SELECT * FROM t ORDER BY val <#> '{1:3,2:3,3:3}/3'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::sparsevec)) t2; - -DROP TABLE t; diff --git a/test/sql/hnsw_sparsevec_l1.sql b/test/sql/hnsw_sparsevec_l1.sql deleted file mode 100644 index a47961a..0000000 --- a/test/sql/hnsw_sparsevec_l1.sql +++ /dev/null @@ -1,12 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val sparsevec(3)); -INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); -CREATE INDEX ON t USING hnsw (val sparsevec_l1_ops); - -INSERT INTO t (val) VALUES ('{1:1,2:2,3:4}/3'); - -SELECT * FROM t ORDER BY val <+> '{1:3,2:3,3:3}/3'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <+> (SELECT NULL::sparsevec)) t2; - -DROP TABLE t; diff --git a/test/sql/hnsw_sparsevec_l2.sql b/test/sql/hnsw_sparsevec_l2.sql deleted file mode 100644 index 9163c47..0000000 --- a/test/sql/hnsw_sparsevec_l2.sql +++ /dev/null @@ -1,25 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val sparsevec(3)); -INSERT INTO t (val) VALUES ('{}/3'), ('{1:1,2:2,3:3}/3'), ('{1:1,2:1,3:1}/3'), (NULL); -CREATE INDEX ON t USING hnsw (val sparsevec_l2_ops); - -INSERT INTO t (val) VALUES ('{1:1,2:2,3:4}/3'); - -SELECT * FROM t ORDER BY val <-> '{1:3,2:3,3:3}/3'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::sparsevec)) t2; -SELECT COUNT(*) FROM t; - -TRUNCATE t; -SELECT * FROM t ORDER BY val <-> '{1:3,2:3,3:3}/3'; - -DROP TABLE t; - --- TODO move -CREATE TABLE t (val sparsevec(1001)); -INSERT INTO t (val) VALUES (array_fill(1, ARRAY[1001])::vector::sparsevec); -CREATE INDEX ON t USING hnsw (val sparsevec_l2_ops); -TRUNCATE t; -CREATE INDEX ON t USING hnsw (val sparsevec_l2_ops); -INSERT INTO t (val) VALUES (array_fill(1, ARRAY[1001])::vector::sparsevec); -DROP TABLE t; diff --git a/test/sql/hnsw_unlogged.sql b/test/sql/hnsw_unlogged.sql deleted file mode 100644 index 2efcc95..0000000 --- a/test/sql/hnsw_unlogged.sql +++ /dev/null @@ -1,9 +0,0 @@ -SET enable_seqscan = off; - -CREATE UNLOGGED TABLE t (val vector(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING hnsw (val vector_l2_ops); - -SELECT * FROM t ORDER BY val <-> '[3,3,3]'; - -DROP TABLE t; diff --git a/test/sql/hnsw_vector.sql b/test/sql/hnsw_vector.sql new file mode 100644 index 0000000..b7896cf --- /dev/null +++ b/test/sql/hnsw_vector.sql @@ -0,0 +1,84 @@ +SET enable_seqscan = off; + +-- L2 + +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val vector_l2_ops); + +INSERT INTO t (val) VALUES ('[1,2,4]'); + +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::vector)) t2; +SELECT COUNT(*) FROM t; + +TRUNCATE t; +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + +DROP TABLE t; + +-- inner product + +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val vector_ip_ops); + +INSERT INTO t (val) VALUES ('[1,2,4]'); + +SELECT * FROM t ORDER BY val <#> '[3,3,3]'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::vector)) t2; + +DROP TABLE t; + +-- cosine + +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val vector_cosine_ops); + +INSERT INTO t (val) VALUES ('[1,2,4]'); + +SELECT * FROM t ORDER BY val <=> '[3,3,3]'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '[0,0,0]') t2; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::vector)) t2; + +DROP TABLE t; + +-- L1 + +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val vector_l1_ops); + +INSERT INTO t (val) VALUES ('[1,2,4]'); + +SELECT * FROM t ORDER BY val <+> '[3,3,3]'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <+> (SELECT NULL::vector)) t2; + +DROP TABLE t; + +-- unlogged + +CREATE UNLOGGED TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING hnsw (val vector_l2_ops); + +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + +DROP TABLE t; + +-- options + +CREATE TABLE t (val vector(3)); +CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (m = 1); +CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (m = 101); +CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (ef_construction = 3); +CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (ef_construction = 1001); +CREATE INDEX ON t USING hnsw (val vector_l2_ops) WITH (m = 16, ef_construction = 31); + +SHOW hnsw.ef_search; + +SET hnsw.ef_search = 0; +SET hnsw.ef_search = 1001; + +DROP TABLE t; diff --git a/test/sql/hnsw_vector_cosine.sql b/test/sql/hnsw_vector_cosine.sql deleted file mode 100644 index d23f4f3..0000000 --- a/test/sql/hnsw_vector_cosine.sql +++ /dev/null @@ -1,13 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val vector(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING hnsw (val vector_cosine_ops); - -INSERT INTO t (val) VALUES ('[1,2,4]'); - -SELECT * FROM t ORDER BY val <=> '[3,3,3]'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '[0,0,0]') t2; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::vector)) t2; - -DROP TABLE t; diff --git a/test/sql/hnsw_vector_ip.sql b/test/sql/hnsw_vector_ip.sql deleted file mode 100644 index 5a616a1..0000000 --- a/test/sql/hnsw_vector_ip.sql +++ /dev/null @@ -1,12 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val vector(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING hnsw (val vector_ip_ops); - -INSERT INTO t (val) VALUES ('[1,2,4]'); - -SELECT * FROM t ORDER BY val <#> '[3,3,3]'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::vector)) t2; - -DROP TABLE t; diff --git a/test/sql/hnsw_vector_l1.sql b/test/sql/hnsw_vector_l1.sql deleted file mode 100644 index 0d52d0a..0000000 --- a/test/sql/hnsw_vector_l1.sql +++ /dev/null @@ -1,12 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val vector(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING hnsw (val vector_l1_ops); - -INSERT INTO t (val) VALUES ('[1,2,4]'); - -SELECT * FROM t ORDER BY val <+> '[3,3,3]'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <+> (SELECT NULL::vector)) t2; - -DROP TABLE t; diff --git a/test/sql/hnsw_vector_l2.sql b/test/sql/hnsw_vector_l2.sql deleted file mode 100644 index 32d9cac..0000000 --- a/test/sql/hnsw_vector_l2.sql +++ /dev/null @@ -1,16 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val vector(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING hnsw (val vector_l2_ops); - -INSERT INTO t (val) VALUES ('[1,2,4]'); - -SELECT * FROM t ORDER BY val <-> '[3,3,3]'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::vector)) t2; -SELECT COUNT(*) FROM t; - -TRUNCATE t; -SELECT * FROM t ORDER BY val <-> '[3,3,3]'; - -DROP TABLE t; diff --git a/test/sql/ivfflat_bit_hamming.sql b/test/sql/ivfflat_bit.sql similarity index 96% rename from test/sql/ivfflat_bit_hamming.sql rename to test/sql/ivfflat_bit.sql index 3f22767..e0f9e25 100644 --- a/test/sql/ivfflat_bit_hamming.sql +++ b/test/sql/ivfflat_bit.sql @@ -1,5 +1,7 @@ SET enable_seqscan = off; +-- hamming + CREATE TABLE t (val bit(3)); INSERT INTO t (val) VALUES (B'000'), (B'100'), (B'111'), (NULL); CREATE INDEX ON t USING ivfflat (val bit_hamming_ops) WITH (lists = 1); @@ -11,7 +13,8 @@ SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <~> (SELECT NULL::bit)) t2; DROP TABLE t; --- TODO move +-- varbit + CREATE TABLE t (val varbit(3)); CREATE INDEX ON t USING ivfflat (val bit_hamming_ops) WITH (lists = 1); CREATE INDEX ON t USING ivfflat ((val::bit(3)) bit_hamming_ops) WITH (lists = 1); diff --git a/test/sql/ivfflat_halfvec.sql b/test/sql/ivfflat_halfvec.sql new file mode 100644 index 0000000..1782452 --- /dev/null +++ b/test/sql/ivfflat_halfvec.sql @@ -0,0 +1,45 @@ +SET enable_seqscan = off; + +-- L2 + +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING ivfflat (val halfvec_l2_ops) WITH (lists = 1); + +INSERT INTO t (val) VALUES ('[1,2,4]'); + +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::halfvec)) t2; +SELECT COUNT(*) FROM t; + +TRUNCATE t; +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + +DROP TABLE t; + +-- inner product + +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING ivfflat (val halfvec_ip_ops) WITH (lists = 1); + +INSERT INTO t (val) VALUES ('[1,2,4]'); + +SELECT * FROM t ORDER BY val <#> '[3,3,3]'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::halfvec)) t2; + +DROP TABLE t; + +-- cosine + +CREATE TABLE t (val halfvec(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING ivfflat (val halfvec_cosine_ops) WITH (lists = 1); + +INSERT INTO t (val) VALUES ('[1,2,4]'); + +SELECT * FROM t ORDER BY val <=> '[3,3,3]'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '[0,0,0]') t2; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::halfvec)) t2; + +DROP TABLE t; diff --git a/test/sql/ivfflat_halfvec_cosine.sql b/test/sql/ivfflat_halfvec_cosine.sql deleted file mode 100644 index 9d9d87f..0000000 --- a/test/sql/ivfflat_halfvec_cosine.sql +++ /dev/null @@ -1,13 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val halfvec(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING ivfflat (val halfvec_cosine_ops) WITH (lists = 1); - -INSERT INTO t (val) VALUES ('[1,2,4]'); - -SELECT * FROM t ORDER BY val <=> '[3,3,3]'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '[0,0,0]') t2; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::halfvec)) t2; - -DROP TABLE t; diff --git a/test/sql/ivfflat_halfvec_ip.sql b/test/sql/ivfflat_halfvec_ip.sql deleted file mode 100644 index 535e9bf..0000000 --- a/test/sql/ivfflat_halfvec_ip.sql +++ /dev/null @@ -1,12 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val halfvec(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING ivfflat (val halfvec_ip_ops) WITH (lists = 1); - -INSERT INTO t (val) VALUES ('[1,2,4]'); - -SELECT * FROM t ORDER BY val <#> '[3,3,3]'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::halfvec)) t2; - -DROP TABLE t; diff --git a/test/sql/ivfflat_halfvec_l2.sql b/test/sql/ivfflat_halfvec_l2.sql deleted file mode 100644 index b2a600e..0000000 --- a/test/sql/ivfflat_halfvec_l2.sql +++ /dev/null @@ -1,16 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val halfvec(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING ivfflat (val halfvec_l2_ops) WITH (lists = 1); - -INSERT INTO t (val) VALUES ('[1,2,4]'); - -SELECT * FROM t ORDER BY val <-> '[3,3,3]'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::halfvec)) t2; -SELECT COUNT(*) FROM t; - -TRUNCATE t; -SELECT * FROM t ORDER BY val <-> '[3,3,3]'; - -DROP TABLE t; diff --git a/test/sql/ivfflat_options.sql b/test/sql/ivfflat_options.sql deleted file mode 100644 index aa909a5..0000000 --- a/test/sql/ivfflat_options.sql +++ /dev/null @@ -1,7 +0,0 @@ -CREATE TABLE t (val vector(3)); -CREATE INDEX ON t USING ivfflat (val vector_l2_ops) WITH (lists = 0); -CREATE INDEX ON t USING ivfflat (val vector_l2_ops) WITH (lists = 32769); - -SHOW ivfflat.probes; - -DROP TABLE t; diff --git a/test/sql/ivfflat_unlogged.sql b/test/sql/ivfflat_unlogged.sql deleted file mode 100644 index fb89006..0000000 --- a/test/sql/ivfflat_unlogged.sql +++ /dev/null @@ -1,9 +0,0 @@ -SET enable_seqscan = off; - -CREATE UNLOGGED TABLE t (val vector(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING ivfflat (val vector_l2_ops) WITH (lists = 1); - -SELECT * FROM t ORDER BY val <-> '[3,3,3]'; - -DROP TABLE t; diff --git a/test/sql/ivfflat_vector.sql b/test/sql/ivfflat_vector.sql new file mode 100644 index 0000000..32759e3 --- /dev/null +++ b/test/sql/ivfflat_vector.sql @@ -0,0 +1,65 @@ +SET enable_seqscan = off; + +-- L2 + +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING ivfflat (val vector_l2_ops) WITH (lists = 1); + +INSERT INTO t (val) VALUES ('[1,2,4]'); + +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::vector)) t2; +SELECT COUNT(*) FROM t; + +TRUNCATE t; +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + +DROP TABLE t; + +-- inner product + +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING ivfflat (val vector_ip_ops) WITH (lists = 1); + +INSERT INTO t (val) VALUES ('[1,2,4]'); + +SELECT * FROM t ORDER BY val <#> '[3,3,3]'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::vector)) t2; + +DROP TABLE t; + +-- cosine + +CREATE TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING ivfflat (val vector_cosine_ops) WITH (lists = 1); + +INSERT INTO t (val) VALUES ('[1,2,4]'); + +SELECT * FROM t ORDER BY val <=> '[3,3,3]'; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '[0,0,0]') t2; +SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::vector)) t2; + +DROP TABLE t; + +-- unlogged + +CREATE UNLOGGED TABLE t (val vector(3)); +INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); +CREATE INDEX ON t USING ivfflat (val vector_l2_ops) WITH (lists = 1); + +SELECT * FROM t ORDER BY val <-> '[3,3,3]'; + +DROP TABLE t; + +-- options + +CREATE TABLE t (val vector(3)); +CREATE INDEX ON t USING ivfflat (val vector_l2_ops) WITH (lists = 0); +CREATE INDEX ON t USING ivfflat (val vector_l2_ops) WITH (lists = 32769); + +SHOW ivfflat.probes; + +DROP TABLE t; diff --git a/test/sql/ivfflat_vector_cosine.sql b/test/sql/ivfflat_vector_cosine.sql deleted file mode 100644 index a891a04..0000000 --- a/test/sql/ivfflat_vector_cosine.sql +++ /dev/null @@ -1,13 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val vector(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING ivfflat (val vector_cosine_ops) WITH (lists = 1); - -INSERT INTO t (val) VALUES ('[1,2,4]'); - -SELECT * FROM t ORDER BY val <=> '[3,3,3]'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '[0,0,0]') t2; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> (SELECT NULL::vector)) t2; - -DROP TABLE t; diff --git a/test/sql/ivfflat_vector_ip.sql b/test/sql/ivfflat_vector_ip.sql deleted file mode 100644 index 1560c55..0000000 --- a/test/sql/ivfflat_vector_ip.sql +++ /dev/null @@ -1,12 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val vector(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING ivfflat (val vector_ip_ops) WITH (lists = 1); - -INSERT INTO t (val) VALUES ('[1,2,4]'); - -SELECT * FROM t ORDER BY val <#> '[3,3,3]'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::vector)) t2; - -DROP TABLE t; diff --git a/test/sql/ivfflat_vector_l2.sql b/test/sql/ivfflat_vector_l2.sql deleted file mode 100644 index 9c7b5d5..0000000 --- a/test/sql/ivfflat_vector_l2.sql +++ /dev/null @@ -1,16 +0,0 @@ -SET enable_seqscan = off; - -CREATE TABLE t (val vector(3)); -INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); -CREATE INDEX ON t USING ivfflat (val vector_l2_ops) WITH (lists = 1); - -INSERT INTO t (val) VALUES ('[1,2,4]'); - -SELECT * FROM t ORDER BY val <-> '[3,3,3]'; -SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::vector)) t2; -SELECT COUNT(*) FROM t; - -TRUNCATE t; -SELECT * FROM t ORDER BY val <-> '[3,3,3]'; - -DROP TABLE t;