From 244d33866490737bea56dd9e5cdcb7bcbcbeebe2 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Mon, 23 Sep 2024 17:45:05 -0700 Subject: [PATCH] Added more tests [skip ci] --- test/expected/btree.out | 20 ++ test/expected/copy.out | 10 +- test/expected/minivec.out | 402 ++++++++++++++++++++++++++++++++++++++ test/sql/minivec.sql | 90 +++++++++ 4 files changed, 521 insertions(+), 1 deletion(-) diff --git a/test/expected/btree.out b/test/expected/btree.out index 999a160..e90008d 100644 --- a/test/expected/btree.out +++ b/test/expected/btree.out @@ -38,6 +38,26 @@ SELECT * FROM t ORDER BY val; (4 rows) +DROP TABLE t; +-- minivec +CREATE TABLE t (val minivec(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)); diff --git a/test/expected/copy.out b/test/expected/copy.out index 44b0a51..59393a8 100644 --- a/test/expected/copy.out +++ b/test/expected/copy.out @@ -38,7 +38,15 @@ INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL); CREATE TABLE t2 (val minivec(3)); \copy t TO 'results/minivec.bin' WITH (FORMAT binary) \copy t2 FROM 'results/minivec.bin' WITH (FORMAT binary) ---SELECT * FROM t2 ORDER BY val; +SELECT * FROM t2 ORDER BY val; + val +--------- + [0,0,0] + [1,1,1] + [1,2,3] + +(4 rows) + DROP TABLE t; DROP TABLE t2; -- sparsevec diff --git a/test/expected/minivec.out b/test/expected/minivec.out index b4560be..426a14e 100644 --- a/test/expected/minivec.out +++ b/test/expected/minivec.out @@ -168,6 +168,202 @@ SELECT '{"[1,2,3]"}'::minivec(2)[]; {"[1,2,3]"} (1 row) +SELECT '[1,2,3]'::minivec + '[4,5,6]'; + ?column? +---------- + [5,7,9] +(1 row) + +SELECT '[448]'::minivec + '[448]'; +ERROR: value out of range: overflow +SELECT '[1,2]'::minivec + '[3]'; +ERROR: different minivec dimensions 2 and 1 +SELECT '[1,2,3]'::minivec - '[4,5,6]'; + ?column? +------------ + [-3,-3,-3] +(1 row) + +SELECT '[-448]'::minivec - '[448]'; +ERROR: value out of range: overflow +SELECT '[1,2]'::minivec - '[3]'; +ERROR: different minivec dimensions 2 and 1 +SELECT '[1,2,3]'::minivec * '[4,5,6]'; + ?column? +----------- + [4,10,18] +(1 row) + +SELECT '[448]'::minivec * '[448]'; +ERROR: value out of range: overflow +SELECT '[1e-7]'::minivec * '[1e-7]'; + ?column? +---------- + [0] +(1 row) + +SELECT '[1,2]'::minivec * '[3]'; +ERROR: different minivec dimensions 2 and 1 +SELECT '[1,2,3]'::minivec || '[4,5]'; + ?column? +------------- + [1,2,3,4,5] +(1 row) + +SELECT array_fill(0, ARRAY[16000])::minivec || '[1]'; +ERROR: cannot cast type integer[] to minivec +LINE 1: SELECT array_fill(0, ARRAY[16000])::minivec || '[1]'; + ^ +SELECT '[1,2,3]'::minivec < '[1,2,3]'; + ?column? +---------- + f +(1 row) + +SELECT '[1,2,3]'::minivec < '[1,2]'; + ?column? +---------- + f +(1 row) + +SELECT '[1,2,3]'::minivec <= '[1,2,3]'; + ?column? +---------- + t +(1 row) + +SELECT '[1,2,3]'::minivec <= '[1,2]'; + ?column? +---------- + f +(1 row) + +SELECT '[1,2,3]'::minivec = '[1,2,3]'; + ?column? +---------- + t +(1 row) + +SELECT '[1,2,3]'::minivec = '[1,2]'; + ?column? +---------- + f +(1 row) + +SELECT '[1,2,3]'::minivec != '[1,2,3]'; + ?column? +---------- + f +(1 row) + +SELECT '[1,2,3]'::minivec != '[1,2]'; + ?column? +---------- + t +(1 row) + +SELECT '[1,2,3]'::minivec >= '[1,2,3]'; + ?column? +---------- + t +(1 row) + +SELECT '[1,2,3]'::minivec >= '[1,2]'; + ?column? +---------- + t +(1 row) + +SELECT '[1,2,3]'::minivec > '[1,2,3]'; + ?column? +---------- + f +(1 row) + +SELECT '[1,2,3]'::minivec > '[1,2]'; + ?column? +---------- + t +(1 row) + +SELECT minivec_cmp('[1,2,3]', '[1,2,3]'); + minivec_cmp +------------- + 0 +(1 row) + +SELECT minivec_cmp('[1,2,3]', '[0,0,0]'); + minivec_cmp +------------- + 1 +(1 row) + +SELECT minivec_cmp('[0,0,0]', '[1,2,3]'); + minivec_cmp +------------- + -1 +(1 row) + +SELECT minivec_cmp('[1,2]', '[1,2,3]'); + minivec_cmp +------------- + -1 +(1 row) + +SELECT minivec_cmp('[1,2,3]', '[1,2]'); + minivec_cmp +------------- + 1 +(1 row) + +SELECT minivec_cmp('[1,2]', '[2,3,4]'); + minivec_cmp +------------- + -1 +(1 row) + +SELECT minivec_cmp('[2,3]', '[1,2,3]'); + minivec_cmp +------------- + 1 +(1 row) + +SELECT vector_dims('[1,2,3]'::minivec); + vector_dims +------------- + 3 +(1 row) + +SELECT round(l2_norm('[1,1]'::minivec)::numeric, 5); + round +--------- + 1.41421 +(1 row) + +SELECT l2_norm('[3,4]'::minivec); + l2_norm +--------- + 5 +(1 row) + +SELECT l2_norm('[0,1]'::minivec); + l2_norm +--------- + 1 +(1 row) + +SELECT l2_norm('[0,0]'::minivec); + l2_norm +--------- + 0 +(1 row) + +SELECT l2_norm('[2]'::minivec); + l2_norm +--------- + 2 +(1 row) + SELECT l2_distance('[0,0]'::minivec, '[3,4]'); l2_distance ------------- @@ -194,3 +390,209 @@ SELECT '[0,0]'::minivec <-> '[3,4]'; 5 (1 row) +SELECT inner_product('[1,2]'::minivec, '[3,4]'); + inner_product +--------------- + 11 +(1 row) + +SELECT inner_product('[1,2]'::minivec, '[3]'); +ERROR: different minivec dimensions 2 and 1 +SELECT inner_product('[448]'::minivec, '[448]'); + inner_product +--------------- + 200704 +(1 row) + +SELECT inner_product('[1,1,1,1,1,1,1,1,1]'::minivec, '[1,2,3,4,5,6,7,8,9]'); + inner_product +--------------- + 45 +(1 row) + +SELECT '[1,2]'::minivec <#> '[3,4]'; + ?column? +---------- + -11 +(1 row) + +SELECT cosine_distance('[1,2]'::minivec, '[2,4]'); + cosine_distance +----------------- + 0 +(1 row) + +SELECT cosine_distance('[1,2]'::minivec, '[0,0]'); + cosine_distance +----------------- + NaN +(1 row) + +SELECT cosine_distance('[1,1]'::minivec, '[1,1]'); + cosine_distance +----------------- + 0 +(1 row) + +SELECT cosine_distance('[1,0]'::minivec, '[0,2]'); + cosine_distance +----------------- + 1 +(1 row) + +SELECT cosine_distance('[1,1]'::minivec, '[-1,-1]'); + cosine_distance +----------------- + 2 +(1 row) + +SELECT cosine_distance('[1,2]'::minivec, '[3]'); +ERROR: different minivec dimensions 2 and 1 +SELECT cosine_distance('[1,1]'::minivec, '[1.1,1.1]'); + cosine_distance +----------------- + 0 +(1 row) + +SELECT cosine_distance('[1,1]'::minivec, '[-1.1,-1.1]'); + cosine_distance +----------------- + 2 +(1 row) + +SELECT cosine_distance('[1,2,3,4,5,6,7,8,9]'::minivec, '[1,2,3,4,5,6,7,8,9]'); + cosine_distance +----------------- + 0 +(1 row) + +SELECT cosine_distance('[1,2,3,4,5,6,7,8,9]'::minivec, '[-1,-2,-3,-4,-5,-6,-7,-8,-9]'); + cosine_distance +----------------- + 2 +(1 row) + +SELECT '[1,2]'::minivec <=> '[2,4]'; + ?column? +---------- + 0 +(1 row) + +SELECT l1_distance('[0,0]'::minivec, '[3,4]'); + l1_distance +------------- + 7 +(1 row) + +SELECT l1_distance('[0,0]'::minivec, '[0,1]'); + l1_distance +------------- + 1 +(1 row) + +SELECT l1_distance('[1,2]'::minivec, '[3]'); +ERROR: different minivec dimensions 2 and 1 +SELECT l1_distance('[1,2,3,4,5,6,7,8,9]'::minivec, '[1,2,3,4,5,6,7,8,9]'); + l1_distance +------------- + 0 +(1 row) + +SELECT l1_distance('[1,2,3,4,5,6,7,8,9]'::minivec, '[0,3,2,5,4,7,6,9,8]'); + l1_distance +------------- + 9 +(1 row) + +SELECT '[0,0]'::minivec <+> '[3,4]'; + ?column? +---------- + 7 +(1 row) + +SELECT l2_normalize('[3,4]'::minivec); + l2_normalize +---------------- + [0.625,0.8125] +(1 row) + +SELECT l2_normalize('[3,0]'::minivec); + l2_normalize +-------------- + [1,0] +(1 row) + +SELECT l2_normalize('[0,0.1]'::minivec); + l2_normalize +-------------- + [0,1] +(1 row) + +SELECT l2_normalize('[0,0]'::minivec); + l2_normalize +-------------- + [0,0] +(1 row) + +SELECT l2_normalize('[448]'::minivec); + l2_normalize +-------------- + [1] +(1 row) + +SELECT binary_quantize('[1,0,-1]'::minivec); + binary_quantize +----------------- + 100 +(1 row) + +SELECT binary_quantize('[0,0.1,-0.2,-0.3,0.4,0.5,0.6,-0.7,0.8,-0.9,1]'::minivec); + binary_quantize +----------------- + 01001110101 +(1 row) + +SELECT subvector('[1,2,3,4,5]'::minivec, 1, 3); + subvector +----------- + [1,2,3] +(1 row) + +SELECT subvector('[1,2,3,4,5]'::minivec, 3, 2); + subvector +----------- + [3,4] +(1 row) + +SELECT subvector('[1,2,3,4,5]'::minivec, -1, 3); + subvector +----------- + [1] +(1 row) + +SELECT subvector('[1,2,3,4,5]'::minivec, 3, 9); + subvector +----------- + [3,4,5] +(1 row) + +SELECT subvector('[1,2,3,4,5]'::minivec, 1, 0); +ERROR: minivec must have at least 1 dimension +SELECT subvector('[1,2,3,4,5]'::minivec, 3, -1); +ERROR: minivec must have at least 1 dimension +SELECT subvector('[1,2,3,4,5]'::minivec, -1, 2); +ERROR: minivec must have at least 1 dimension +SELECT subvector('[1,2,3,4,5]'::minivec, 2147483647, 10); +ERROR: minivec must have at least 1 dimension +SELECT subvector('[1,2,3,4,5]'::minivec, 3, 2147483647); + subvector +----------- + [3,4,5] +(1 row) + +SELECT subvector('[1,2,3,4,5]'::minivec, -2147483644, 2147483647); + subvector +----------- + [1,2] +(1 row) + diff --git a/test/sql/minivec.sql b/test/sql/minivec.sql index b6a7f3e..22f67d4 100644 --- a/test/sql/minivec.sql +++ b/test/sql/minivec.sql @@ -37,8 +37,98 @@ SELECT '[1,2,3]'::minivec(16001); SELECT unnest('{"[1,2,3]", "[4,5,6]"}'::minivec[]); SELECT '{"[1,2,3]"}'::minivec(2)[]; +SELECT '[1,2,3]'::minivec + '[4,5,6]'; +SELECT '[448]'::minivec + '[448]'; +SELECT '[1,2]'::minivec + '[3]'; + +SELECT '[1,2,3]'::minivec - '[4,5,6]'; +SELECT '[-448]'::minivec - '[448]'; +SELECT '[1,2]'::minivec - '[3]'; + +SELECT '[1,2,3]'::minivec * '[4,5,6]'; +SELECT '[448]'::minivec * '[448]'; +SELECT '[1e-7]'::minivec * '[1e-7]'; +SELECT '[1,2]'::minivec * '[3]'; + +SELECT '[1,2,3]'::minivec || '[4,5]'; +SELECT array_fill(0, ARRAY[16000])::minivec || '[1]'; + +SELECT '[1,2,3]'::minivec < '[1,2,3]'; +SELECT '[1,2,3]'::minivec < '[1,2]'; +SELECT '[1,2,3]'::minivec <= '[1,2,3]'; +SELECT '[1,2,3]'::minivec <= '[1,2]'; +SELECT '[1,2,3]'::minivec = '[1,2,3]'; +SELECT '[1,2,3]'::minivec = '[1,2]'; +SELECT '[1,2,3]'::minivec != '[1,2,3]'; +SELECT '[1,2,3]'::minivec != '[1,2]'; +SELECT '[1,2,3]'::minivec >= '[1,2,3]'; +SELECT '[1,2,3]'::minivec >= '[1,2]'; +SELECT '[1,2,3]'::minivec > '[1,2,3]'; +SELECT '[1,2,3]'::minivec > '[1,2]'; + +SELECT minivec_cmp('[1,2,3]', '[1,2,3]'); +SELECT minivec_cmp('[1,2,3]', '[0,0,0]'); +SELECT minivec_cmp('[0,0,0]', '[1,2,3]'); +SELECT minivec_cmp('[1,2]', '[1,2,3]'); +SELECT minivec_cmp('[1,2,3]', '[1,2]'); +SELECT minivec_cmp('[1,2]', '[2,3,4]'); +SELECT minivec_cmp('[2,3]', '[1,2,3]'); + +SELECT vector_dims('[1,2,3]'::minivec); + +SELECT round(l2_norm('[1,1]'::minivec)::numeric, 5); +SELECT l2_norm('[3,4]'::minivec); +SELECT l2_norm('[0,1]'::minivec); +SELECT l2_norm('[0,0]'::minivec); +SELECT l2_norm('[2]'::minivec); + SELECT l2_distance('[0,0]'::minivec, '[3,4]'); SELECT l2_distance('[0,0]'::minivec, '[0,1]'); SELECT l2_distance('[1,2]'::minivec, '[3]'); SELECT l2_distance('[1,1,1,1,1,1,1,1,1]'::minivec, '[1,1,1,1,1,1,1,4,5]'); SELECT '[0,0]'::minivec <-> '[3,4]'; + +SELECT inner_product('[1,2]'::minivec, '[3,4]'); +SELECT inner_product('[1,2]'::minivec, '[3]'); +SELECT inner_product('[448]'::minivec, '[448]'); +SELECT inner_product('[1,1,1,1,1,1,1,1,1]'::minivec, '[1,2,3,4,5,6,7,8,9]'); +SELECT '[1,2]'::minivec <#> '[3,4]'; + +SELECT cosine_distance('[1,2]'::minivec, '[2,4]'); +SELECT cosine_distance('[1,2]'::minivec, '[0,0]'); +SELECT cosine_distance('[1,1]'::minivec, '[1,1]'); +SELECT cosine_distance('[1,0]'::minivec, '[0,2]'); +SELECT cosine_distance('[1,1]'::minivec, '[-1,-1]'); +SELECT cosine_distance('[1,2]'::minivec, '[3]'); +SELECT cosine_distance('[1,1]'::minivec, '[1.1,1.1]'); +SELECT cosine_distance('[1,1]'::minivec, '[-1.1,-1.1]'); +SELECT cosine_distance('[1,2,3,4,5,6,7,8,9]'::minivec, '[1,2,3,4,5,6,7,8,9]'); +SELECT cosine_distance('[1,2,3,4,5,6,7,8,9]'::minivec, '[-1,-2,-3,-4,-5,-6,-7,-8,-9]'); +SELECT '[1,2]'::minivec <=> '[2,4]'; + +SELECT l1_distance('[0,0]'::minivec, '[3,4]'); +SELECT l1_distance('[0,0]'::minivec, '[0,1]'); +SELECT l1_distance('[1,2]'::minivec, '[3]'); +SELECT l1_distance('[1,2,3,4,5,6,7,8,9]'::minivec, '[1,2,3,4,5,6,7,8,9]'); +SELECT l1_distance('[1,2,3,4,5,6,7,8,9]'::minivec, '[0,3,2,5,4,7,6,9,8]'); +SELECT '[0,0]'::minivec <+> '[3,4]'; + +SELECT l2_normalize('[3,4]'::minivec); +SELECT l2_normalize('[3,0]'::minivec); +SELECT l2_normalize('[0,0.1]'::minivec); +SELECT l2_normalize('[0,0]'::minivec); +SELECT l2_normalize('[448]'::minivec); + +SELECT binary_quantize('[1,0,-1]'::minivec); +SELECT binary_quantize('[0,0.1,-0.2,-0.3,0.4,0.5,0.6,-0.7,0.8,-0.9,1]'::minivec); + +SELECT subvector('[1,2,3,4,5]'::minivec, 1, 3); +SELECT subvector('[1,2,3,4,5]'::minivec, 3, 2); +SELECT subvector('[1,2,3,4,5]'::minivec, -1, 3); +SELECT subvector('[1,2,3,4,5]'::minivec, 3, 9); +SELECT subvector('[1,2,3,4,5]'::minivec, 1, 0); +SELECT subvector('[1,2,3,4,5]'::minivec, 3, -1); +SELECT subvector('[1,2,3,4,5]'::minivec, -1, 2); +SELECT subvector('[1,2,3,4,5]'::minivec, 2147483647, 10); +SELECT subvector('[1,2,3,4,5]'::minivec, 3, 2147483647); +SELECT subvector('[1,2,3,4,5]'::minivec, -2147483644, 2147483647);