Removed dimensions from sparsevec

This commit is contained in:
Andrew Kane
2024-04-03 20:55:03 -07:00
parent 35d0fe88b9
commit dde3a2aacd
17 changed files with 166 additions and 289 deletions

View File

@@ -1,17 +1,17 @@
SET enable_seqscan = off;
CREATE TABLE t (val sparsevec(3));
INSERT INTO t (val) VALUES ('{}/3'), ('{0:1,1:2,2:3}/3'), ('{0:1,1:1,2:1}/3'), (NULL);
CREATE TABLE t (val sparsevec);
INSERT INTO t (val) VALUES ('{}'), ('{0:1,1:2,2:3}'), ('{0:1,1:1,2:1}'), (NULL);
CREATE INDEX ON t USING hnsw (val sparsevec_cosine_ops);
INSERT INTO t (val) VALUES ('{0:1,1:2,2:4}/3');
SELECT * FROM t ORDER BY val <=> '{0:3,1:3,2:3}/3';
val
-----------------
{0:1,1:1,2:1}/3
{0:1,1:2,2:3}/3
{0:1,1:2,2:4}/3
INSERT INTO t (val) VALUES ('{0:1,1:2,2:4}');
SELECT * FROM t ORDER BY val <=> '{0:3,1:3,2:3}';
val
---------------
{0:1,1:1,2:1}
{0:1,1:2,2:3}
{0:1,1:2,2:4}
(3 rows)
SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '{}/3') t2;
SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <=> '{}') t2;
count
-------
3

View File

@@ -1,15 +1,15 @@
SET enable_seqscan = off;
CREATE TABLE t (val sparsevec(3));
INSERT INTO t (val) VALUES ('{}/3'), ('{0:1,1:2,2:3}/3'), ('{0:1,1:1,2:1}/3'), (NULL);
CREATE TABLE t (val sparsevec);
INSERT INTO t (val) VALUES ('{}'), ('{0:1,1:2,2:3}'), ('{0:1,1:1,2:1}'), (NULL);
CREATE INDEX ON t USING hnsw (val sparsevec_ip_ops);
INSERT INTO t (val) VALUES ('{0:1,1:2,2:4}/3');
SELECT * FROM t ORDER BY val <#> '{0:3,1:3,2:3}/3';
val
-----------------
{0:1,1:2,2:4}/3
{0:1,1:2,2:3}/3
{0:1,1:1,2:1}/3
{}/3
INSERT INTO t (val) VALUES ('{0:1,1:2,2:4}');
SELECT * FROM t ORDER BY val <#> '{0:3,1:3,2:3}';
val
---------------
{0:1,1:2,2:4}
{0:1,1:2,2:3}
{0:1,1:1,2:1}
{}
(4 rows)
SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <#> (SELECT NULL::sparsevec)) t2;

View File

@@ -1,15 +1,15 @@
SET enable_seqscan = off;
CREATE TABLE t (val sparsevec(3));
INSERT INTO t (val) VALUES ('{}/3'), ('{0:1,1:2,2:3}/3'), ('{0:1,1:1,2:1}/3'), (NULL);
CREATE TABLE t (val sparsevec);
INSERT INTO t (val) VALUES ('{}'), ('{0:1,1:2,2:3}'), ('{0:1,1:1,2:1}'), (NULL);
CREATE INDEX ON t USING hnsw (val sparsevec_l2_ops);
INSERT INTO t (val) VALUES ('{0:1,1:2,2:4}/3');
SELECT * FROM t ORDER BY val <-> '{0:3,1:3,2:3}/3';
val
-----------------
{0:1,1:2,2:3}/3
{0:1,1:2,2:4}/3
{0:1,1:1,2:1}/3
{}/3
INSERT INTO t (val) VALUES ('{0:1,1:2,2:4}');
SELECT * FROM t ORDER BY val <-> '{0:3,1:3,2:3}';
val
---------------
{0:1,1:2,2:3}
{0:1,1:2,2:4}
{0:1,1:1,2:1}
{}
(4 rows)
SELECT COUNT(*) FROM (SELECT * FROM t ORDER BY val <-> (SELECT NULL::sparsevec)) t2;
@@ -25,14 +25,14 @@ SELECT COUNT(*) FROM t;
(1 row)
TRUNCATE t;
SELECT * FROM t ORDER BY val <-> '{0:3,1:3,2:3}/3';
SELECT * FROM t ORDER BY val <-> '{0:3,1:3,2:3}';
val
-----
(0 rows)
DROP TABLE t;
-- TODO move
CREATE TABLE t (val sparsevec(1001));
CREATE TABLE t (val sparsevec);
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

View File

@@ -1,62 +1,60 @@
SELECT l2_distance('{}/2'::sparsevec, '{0:3,1:4}/2');
SELECT l2_distance('{}'::sparsevec, '{0:3,1:4}');
l2_distance
-------------
5
(1 row)
SELECT l2_distance('{}/2'::sparsevec, '{1:1}/2');
SELECT l2_distance('{}'::sparsevec, '{1:1}');
l2_distance
-------------
1
(1 row)
SELECT '{}/2'::sparsevec <-> '{0:3,1:4}/2';
SELECT '{}'::sparsevec <-> '{0:3,1:4}';
?column?
----------
5
(1 row)
SELECT inner_product('{0:1,1:2}/2'::sparsevec, '{0:2,1:4}/2');
SELECT inner_product('{0:1,1:2}'::sparsevec, '{0:2,1:4}');
inner_product
---------------
10
(1 row)
SELECT sparsevec_negative_inner_product('{0:1,1:2}/2', '{0:2,1:4}/2');
SELECT sparsevec_negative_inner_product('{0:1,1:2}', '{0:2,1:4}');
sparsevec_negative_inner_product
----------------------------------
-10
(1 row)
SELECT cosine_distance('{0:1,1:2}/2'::sparsevec, '{0:2,1:4}/2');
SELECT cosine_distance('{0:1,1:2}'::sparsevec, '{0:2,1:4}');
cosine_distance
-----------------
0
(1 row)
SELECT cosine_distance('{0:1,1:2}/2'::sparsevec, '{}/2');
SELECT cosine_distance('{0:1,1:2}'::sparsevec, '{}');
cosine_distance
-----------------
NaN
(1 row)
SELECT cosine_distance('{0:1,1:1}/2'::sparsevec, '{0:-1,1:-1}/2');
SELECT cosine_distance('{0:1,1:1}'::sparsevec, '{0:-1,1:-1}');
cosine_distance
-----------------
2
(1 row)
SELECT cosine_distance('{0:1}/2'::sparsevec, '{1:2}/2');
SELECT cosine_distance('{0:1}'::sparsevec, '{1:2}');
cosine_distance
-----------------
1
(1 row)
SELECT cosine_distance('{}/1'::sparsevec, '{}/1');
SELECT cosine_distance('{}'::sparsevec, '{}');
cosine_distance
-----------------
NaN
(1 row)
SELECT cosine_distance('{0:1}/2'::sparsevec, '{0:1}/3');
ERROR: different sparsevec dimensions 2 and 3

View File

@@ -1,62 +1,64 @@
SELECT '{0:1.5,2:3.5}/5'::sparsevec;
sparsevec
-----------------
{0:1.5,2:3.5}/5
SELECT '{0:1.5,2:3.5}'::sparsevec;
sparsevec
---------------
{0:1.5,2:3.5}
(1 row)
SELECT '{0:1.5,2:3.5}/5'::sparsevec::vector;
SELECT '{0:1.5,2:3.5}'::sparsevec::vector;
vector
-------------
[1.5,0,3.5]
(1 row)
SELECT '{0:1.5,2:3.5}'::sparsevec::vector(5);
vector
-----------------
[1.5,0,3.5,0,0]
(1 row)
SELECT '{0:1.5,2:3.5}/5'::sparsevec::vector(5);
vector
-----------------
[1.5,0,3.5,0,0]
SELECT '{0:1.5,2:3.5}'::sparsevec::vector(4);
vector
---------------
[1.5,0,3.5,0]
(1 row)
SELECT '{0:1.5,2:3.5}/5'::sparsevec::vector(4);
ERROR: expected 4 dimensions, not 5
SELECT '{0:1.5,2:3.5}'::sparsevec::vector(2);
ERROR: Vector must have at least 3 dimensions
SELECT '[0,1.5,0,3.5,0]'::vector::sparsevec;
sparsevec
-----------------
{1:1.5,3:3.5}/5
sparsevec
---------------
{1:1.5,3:3.5}
(1 row)
SELECT '{0:0,1:1,2:0}/3'::sparsevec;
SELECT '{0:0,1:1,2:0}'::sparsevec;
sparsevec
-----------
{1:1}/3
{1:1}
(1 row)
SELECT '{1:1,0:1}/2'::sparsevec;
SELECT '{1:1,0:1}'::sparsevec;
ERROR: indexes must be in ascending order
LINE 1: SELECT '{1:1,0:1}/2'::sparsevec;
LINE 1: SELECT '{1:1,0:1}'::sparsevec;
^
SELECT '{}/5'::sparsevec;
SELECT '{}'::sparsevec;
sparsevec
-----------
{}/5
{}
(1 row)
SELECT '{}/-1'::sparsevec;
ERROR: sparsevec must have at least 1 dimension
LINE 1: SELECT '{}/-1'::sparsevec;
^
SELECT '{}/100001'::sparsevec;
ERROR: sparsevec cannot have more than 100000 dimensions
LINE 1: SELECT '{}/100001'::sparsevec;
^
SELECT '{}/16001'::sparsevec::vector;
ERROR: vector cannot have more than 16000 dimensions
SELECT '{-1:1}/1'::sparsevec;
SELECT '{}'::sparsevec::vector;
ERROR: vector must have at least 1 dimension
SELECT '{-1:1}'::sparsevec;
ERROR: index "-1" is out of range for type sparsevec
LINE 1: SELECT '{-1:1}/1'::sparsevec;
LINE 1: SELECT '{-1:1}'::sparsevec;
^
SELECT '{1:1}/1'::sparsevec;
ERROR: index must be less than dimensions
LINE 1: SELECT '{1:1}/1'::sparsevec;
^
SELECT '{}/1'::sparsevec(2);
ERROR: expected 2 dimensions, not 1
SELECT '{1:1}'::sparsevec;
sparsevec
-----------
{1:1}
(1 row)
SELECT '{}'::sparsevec(2);
ERROR: type modifier is not allowed for type "sparsevec"
LINE 1: SELECT '{}'::sparsevec(2);
^