From d17a87be1e4b4d34642b340cc1f16efa7ac30712 Mon Sep 17 00:00:00 2001 From: cutecutecat Date: Fri, 15 Nov 2024 15:29:43 +0800 Subject: [PATCH] test: fix push down tests Signed-off-by: cutecutecat --- scripts/README.md | 3 - tests/logic/index.slt | 1 - tests/logic/pushdown_plan.fail | 139 ----------------- tests/logic/pushdown_plan.slt | 141 ++++++++++++++++++ ...pushdown_range.fail => pushdown_range.slt} | 35 ++--- tests/logic/vector.slt | 1 - 6 files changed, 159 insertions(+), 161 deletions(-) delete mode 100644 tests/logic/pushdown_plan.fail create mode 100644 tests/logic/pushdown_plan.slt rename tests/logic/{pushdown_range.fail => pushdown_range.slt} (52%) diff --git a/scripts/README.md b/scripts/README.md index 1e92b15..1c282ea 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -21,9 +21,6 @@ docker build -t vchord:pg16-latest --build-arg PG_VERSION=16 -f ./docker/Dockerf ```shell docker run --name vchord -e POSTGRES_PASSWORD=123 -p 5432:5432 -d vchord:pg16-latest - -PGPASSWORD=123 psql -h 127.0.0.1 -U postgres -c "CREATE USER bench WITH PASSWORD '123';" -PGPASSWORD=123 psql -h 127.0.0.1 -U postgres -c "ALTER ROLE bench SUPERUSER;" ``` ## Run External Index Precomputation Toolkit diff --git a/tests/logic/index.slt b/tests/logic/index.slt index e2c2f3a..c3f8795 100644 --- a/tests/logic/index.slt +++ b/tests/logic/index.slt @@ -54,5 +54,4 @@ SELECT COUNT(1) FROM (SELECT 1 FROM t ORDER BY val <#> '[0.5,0.5,0.5]' limit 10) 10 statement ok ----- DROP TABLE t; diff --git a/tests/logic/pushdown_plan.fail b/tests/logic/pushdown_plan.fail deleted file mode 100644 index 92b698b..0000000 --- a/tests/logic/pushdown_plan.fail +++ /dev/null @@ -1,139 +0,0 @@ -statement ok -CREATE TABLE t (val0 vector(3)); - -statement ok -INSERT INTO t (val0, val1, val2) -SELECT - ARRAY[random(), random(), random()]::real[]::vector, -FROM generate_series(1, 10000); - -statement ok -CREATE INDEX ind0 ON t USING vchordrq (val0 vector_l2_ops); - -# statement ok -# CREATE INDEX ind1 ON t USING vchordrq (val1 halfvec_dot_ops); - -# 1 vector key + 1 corresponding order_by key + sphere style -query I -EXPLAIN (COSTS FALSE, TIMING FALSE) -SELECT val0 FROM t WHERE val0 <<->> sphere('[0, 0, 0]'::vector, 1) ORDER BY val0 <-> '[0, 0, 0]'; ----- - Index Scan using ind0 on t - Index Cond: (val0 <<->> '("[0,0,0]",1)'::sphere_vector) - Order By: (val0 <-> '[0,0,0]'::vector) - -# 1 vector key + 0 order_by key + original style -query I -EXPLAIN (COSTS FALSE, TIMING FALSE) -SELECT val0 FROM t WHERE val0 <-> '[0, 0, 0]' < 1; ----- - Seq Scan on t - Filter: ((val0 <-> '[0,0,0]'::vector) < '1'::double precision) - -# 1 vector key + 0 order_by key + sphere style -query I -EXPLAIN (COSTS FALSE, TIMING FALSE) -SELECT val0 FROM t WHERE val0 <<->> sphere('[0, 0, 0]'::vector, 1); ----- - Index Scan using ind0 on t - Index Cond: (val0 <<->> '("[0,0,0]",1)'::sphere_vector) - -# 0 vector key + 1 order_by key -query I -EXPLAIN (COSTS FALSE, TIMING FALSE) -SELECT val0 FROM t ORDER BY val0 <-> '[0, 0, 0]'; ----- - Index Scan using ind0 on t - Order By: (val0 <-> '[0,0,0]'::vector) - -# 2 vector key(1 of them is corresponding) + 1 order_by key + original style -query I -EXPLAIN (COSTS FALSE, TIMING FALSE) -SELECT val0 FROM t WHERE val0 <-> '[0, 0, 0]' < 1 -AND val1 <#> '[0, 0, 0]' < 1 -ORDER BY val0 <-> '[0, 0, 0]'; ----- - Index Scan using ind0 on t - Order By: (val0 <-> '[0,0,0]'::vector) - Filter: (((val0 <-> '[0,0,0]'::vector) < '1'::double precision) AND ((val1 <#> '[0,0,0]'::halfvec) < '1'::double precision)) - -# 2 vector key(1 of them is corresponding) + 1 order_by key + sphere style -query I -EXPLAIN (COSTS FALSE, TIMING FALSE) -SELECT val0 FROM t WHERE val0 <<->> sphere('[0, 0, 0]'::vector, 1) -AND val1 <<#>> sphere('[0, 0, 0]'::halfvec, 1) -ORDER BY val0 <-> '[0, 0, 0]'; ----- - Index Scan using ind0 on t - Index Cond: (val0 <<->> '("[0, 0, 0]",1)'::sphere_vector) - Order By: (val0 <-> '[0, 0, 0]'::vector) - Filter: (val1 <<#>> '("[0, 0, 0]",1)'::sphere_vecf16) - -# 2 vector key(none of them is corresponding) + 1 order_by key + sphere style -query I -EXPLAIN (COSTS FALSE, TIMING FALSE) -SELECT val0 FROM t WHERE val2 <<->> sphere('{}/3'::svector, 1) -AND val1 <<#>> sphere('[0, 0, 0]'::halfvec, 1) -ORDER BY val0 <-> '[0, 0, 0]'; ----- - Index Scan using ind0 on t - Order By: (val0 <-> '[0, 0, 0]'::vector) - Filter: ((val2 <<->> '({}/3,1)'::sphere_svector) AND (val1 <<#>> '("[0, 0, 0]",1)'::sphere_vecf16)) - -# 2 vector keys(both indexed) + 0 order_by key + sphere style -query I -EXPLAIN (COSTS FALSE, TIMING FALSE) -SELECT val0 FROM t WHERE val0 <<->> sphere('[0, 0, 0]'::vector, 1) -AND val1 <<#>> sphere('[0, 0, 0]'::halfvec, 1); ----- - Index Scan using ind1 on t - Index Cond: (val1 <<#>> '("[0, 0, 0]",1)'::sphere_vecf16) - Filter: (val0 <<->> '("[0, 0, 0]",1)'::sphere_vector) - -# 2 vector keys(both not indexed) + 0 order_by key + sphere style -query I -EXPLAIN (COSTS FALSE, TIMING FALSE) -SELECT val0 FROM t WHERE val0 <<#>> sphere('[0, 0, 0]'::vector, 1) -AND val1 <<->> sphere('[0, 0, 0]'::halfvec, 1); ----- - Seq Scan on t - Filter: ((val0 <<#>> '("[0, 0, 0]",1)'::sphere_vector) AND (val1 <<->> '("[0, 0, 0]",1)'::sphere_vecf16)) - -# 2 vector key(1 indexed) + 0 order_by key + sphere style -query I -EXPLAIN (COSTS FALSE, TIMING FALSE) -SELECT val0 FROM t WHERE val0 <<->> sphere('[0, 0, 0]'::vector, 1) -AND val1 <<->> sphere('[0, 0, 0]'::halfvec, 1); ----- - Index Scan using ind0 on t - Index Cond: (val0 <<->> '("[0, 0, 0]",1)'::sphere_vector) - Filter: (val1 <<->> '("[0, 0, 0]",1)'::sphere_vecf16) - -# 1 vector key + 1 not corresponding order_by key(operator) + sphere style -query I -EXPLAIN (COSTS FALSE, TIMING FALSE) -SELECT val0 FROM t WHERE val0 <<#>> sphere('[0, 0, 0]'::vector, 1) -ORDER BY val0 <-> '[0, 0, 0]'; ----- - Index Scan using ind0 on t - Order By: (val0 <-> '[0, 0, 0]'::vector) - Filter: (val0 <<#>> '("[0, 0, 0]",1)'::sphere_vector) - -# 1 vector key + 1 not corresponding order_by key(variable) + sphere style -query I -EXPLAIN (COSTS FALSE, TIMING FALSE) -SELECT val0 FROM t WHERE val0 <<->> sphere('[0, 0, 0]'::vector, 1) -ORDER BY val1 <#> '[1, 1, 1]'; ----- - Index Scan using ind1 on t - Order By: (val1 <#> '[1, 1, 1]'::halfvec) - Filter: (val0 <<->> '("[0, 0, 0]",1)'::sphere_vector) - -# 0 vector key + 0 order_by key(variable) -query I -EXPLAIN (COSTS FALSE, TIMING FALSE) SELECT val0 FROM t; ----- - Seq Scan on t - -statement ok -DROP TABLE t; diff --git a/tests/logic/pushdown_plan.slt b/tests/logic/pushdown_plan.slt new file mode 100644 index 0000000..78bfe44 --- /dev/null +++ b/tests/logic/pushdown_plan.slt @@ -0,0 +1,141 @@ +# TODO: Some tests are disabled due to unimplemented types: sparse vector and f16 vector + +statement ok +CREATE TABLE t (val0 vector(3)); + +statement ok +INSERT INTO t (val0) +SELECT + ARRAY[random(), random(), random()]::real[]::vector +FROM generate_series(1, 10000); + +statement ok +CREATE INDEX ind0 ON t USING vchordrq (val0 vector_l2_ops); + +# statement ok +# CREATE INDEX ind1 ON t USING vchordrq (val1 halfvec_dot_ops); + +# 1 vector key + 1 corresponding order_by key + sphere style +query I +EXPLAIN (COSTS FALSE, TIMING FALSE) +SELECT val0 FROM t WHERE val0 <<->> sphere('[0, 0, 0]'::vector, 1) ORDER BY val0 <-> '[0, 0, 0]'; +---- + Index Scan using ind0 on t + Index Cond: (val0 <<->> '("[0,0,0]",1)'::sphere_vector) + Order By: (val0 <-> '[0,0,0]'::vector) + +# 1 vector key + 0 order_by key + original style +query I +EXPLAIN (COSTS FALSE, TIMING FALSE) +SELECT val0 FROM t WHERE val0 <-> '[0, 0, 0]' < 1; +---- + Seq Scan on t + Filter: ((val0 <-> '[0,0,0]'::vector) < '1'::double precision) + +# 1 vector key + 0 order_by key + sphere style +query I +EXPLAIN (COSTS FALSE, TIMING FALSE) +SELECT val0 FROM t WHERE val0 <<->> sphere('[0, 0, 0]'::vector, 1); +---- + Index Scan using ind0 on t + Index Cond: (val0 <<->> '("[0,0,0]",1)'::sphere_vector) + +# 0 vector key + 1 order_by key +query I +EXPLAIN (COSTS FALSE, TIMING FALSE) +SELECT val0 FROM t ORDER BY val0 <-> '[0, 0, 0]'; +---- + Index Scan using ind0 on t + Order By: (val0 <-> '[0,0,0]'::vector) + +# 2 vector key(1 of them is corresponding) + 1 order_by key + original style +# query I +# EXPLAIN (COSTS FALSE, TIMING FALSE) +# SELECT val0 FROM t WHERE val0 <-> '[0, 0, 0]' < 1 +# AND val1 <#> '[0, 0, 0]' < 1 +# ORDER BY val0 <-> '[0, 0, 0]'; +# ---- +# Index Scan using ind0 on t +# Order By: (val0 <-> '[0,0,0]'::vector) +# Filter: (((val0 <-> '[0,0,0]'::vector) < '1'::double precision) AND ((val1 <#> '[0,0,0]'::halfvec) < '1'::double precision)) + +# 2 vector key(1 of them is corresponding) + 1 order_by key + sphere style +# query I +# EXPLAIN (COSTS FALSE, TIMING FALSE) +# SELECT val0 FROM t WHERE val0 <<->> sphere('[0, 0, 0]'::vector, 1) +# AND val1 <<#>> sphere('[0, 0, 0]'::halfvec, 1) +# ORDER BY val0 <-> '[0, 0, 0]'; +# ---- +# Index Scan using ind0 on t +# Index Cond: (val0 <<->> '("[0,0,0]",1)'::sphere_vector) +# Order By: (val0 <-> '[0,0,0]'::vector) +# Filter: (val1 <<#>> '("[0,0,0]",1)'::sphere_vecf16) + +# 2 vector key(none of them is corresponding) + 1 order_by key + sphere style +# query I +# EXPLAIN (COSTS FALSE, TIMING FALSE) +# SELECT val0 FROM t WHERE val2 <<->> sphere('{}/3'::svector, 1) +# AND val1 <<#>> sphere('[0, 0, 0]'::halfvec, 1) +# ORDER BY val0 <-> '[0, 0, 0]'; +# ---- +# Index Scan using ind0 on t +# Order By: (val0 <-> '[0,0,0]'::vector) +# Filter: ((val2 <<->> '({}/3,1)'::sphere_svector) AND (val1 <<#>> '("[0,0,0]",1)'::sphere_vecf16)) + +# 2 vector keys(both indexed) + 0 order_by key + sphere style +# query I +# EXPLAIN (COSTS FALSE, TIMING FALSE) +# SELECT val0 FROM t WHERE val0 <<->> sphere('[0, 0, 0]'::vector, 1) +# AND val1 <<#>> sphere('[0, 0, 0]'::halfvec, 1); +# ---- +# Index Scan using ind1 on t +# Index Cond: (val1 <<#>> '("[0,0,0]",1)'::sphere_vecf16) +# Filter: (val0 <<->> '("[0,0,0]",1)'::sphere_vector) + +# 2 vector keys(both not indexed) + 0 order_by key + sphere style +# query I +# EXPLAIN (COSTS FALSE, TIMING FALSE) +# SELECT val0 FROM t WHERE val0 <<#>> sphere('[0, 0, 0]'::vector, 1) +# AND val1 <<->> sphere('[0, 0, 0]'::halfvec, 1); +# ---- +# Seq Scan on t +# Filter: ((val0 <<#>> '("[0,0,0]",1)'::sphere_vector) AND (val1 <<->> '("[0,0,0]",1)'::sphere_vecf16)) + +# 2 vector key(1 indexed) + 0 order_by key + sphere style +# query I +# EXPLAIN (COSTS FALSE, TIMING FALSE) +# SELECT val0 FROM t WHERE val0 <<->> sphere('[0, 0, 0]'::vector, 1) +# AND val1 <<->> sphere('[0, 0, 0]'::halfvec, 1); +# ---- +# Index Scan using ind0 on t +# Index Cond: (val0 <<->> '("[0,0,0]",1)'::sphere_vector) +# Filter: (val1 <<->> '("[0,0,0]",1)'::sphere_vecf16) + +# 1 vector key + 1 not corresponding order_by key(operator) + sphere style +query I +EXPLAIN (COSTS FALSE, TIMING FALSE) +SELECT val0 FROM t WHERE val0 <<#>> sphere('[0, 0, 0]'::vector, 1) +ORDER BY val0 <-> '[0, 0, 0]'; +---- + Index Scan using ind0 on t + Order By: (val0 <-> '[0,0,0]'::vector) + Filter: (val0 <<#>> '("[0,0,0]",1)'::sphere_vector) + +# 1 vector key + 1 not corresponding order_by key(variable) + sphere style +# query I +# EXPLAIN (COSTS FALSE, TIMING FALSE) +# SELECT val0 FROM t WHERE val0 <<->> sphere('[0, 0, 0]'::vector, 1) +# ORDER BY val1 <#> '[1, 1, 1]'; +# ---- +# Index Scan using ind1 on t +# Order By: (val1 <#> '[1,1,1]'::halfvec) +# Filter: (val0 <<->> '("[0,0,0]",1)'::sphere_vector) + +# 0 vector key + 0 order_by key(variable) +query I +EXPLAIN (COSTS FALSE, TIMING FALSE) SELECT val0 FROM t; +---- + Seq Scan on t + +statement ok +DROP TABLE t; diff --git a/tests/logic/pushdown_range.fail b/tests/logic/pushdown_range.slt similarity index 52% rename from tests/logic/pushdown_range.fail rename to tests/logic/pushdown_range.slt index 5cd5099..85c017f 100644 --- a/tests/logic/pushdown_range.fail +++ b/tests/logic/pushdown_range.slt @@ -1,3 +1,5 @@ +# TODO: Some tests are disabled due to unimplemented types: sparse vector and f16 vector + statement ok CREATE TABLE t (val0 vector(3)); @@ -15,32 +17,31 @@ CREATE INDEX ON t USING vchordrq (val0 vector_l2_ops); query I SELECT val0 FROM t WHERE val0 <-> '[0.24, 0.24, 0.24]' < 0.12 ORDER BY val0 <-> '[0.24, 0.24, 0.24]'; ---- -[0.2, 0.2, 0.2] -[0.3, 0.3, 0.3] +[0.2,0.2,0.2] +[0.3,0.3,0.3] # sphere style query I -SELECT val0 FROM t WHERE val0 <<->> sphere('[0.24, 0.24, 0.24]'::vector, 0.012) ORDER BY val0 <-> '[0.24, 0.24, 0.24]'; +SELECT val0 FROM t WHERE val0 <<->> sphere('[0.24, 0.24, 0.24]'::vector, 0.12) ORDER BY val0 <-> '[0.24, 0.24, 0.24]'; ---- -[0.2, 0.2, 0.2] -[0.3, 0.3, 0.3] +[0.2,0.2,0.2] +[0.3,0.3,0.3] -statement ok # sphere style: multiple vector keys and no order-by key -query I -SELECT val0 FROM t WHERE val0 <<->> sphere('[0.24, 0.24, 0.24]'::vector, 0.012) -AND val1 <<#>> sphere('[0.24, -0.24, 0.24]'::halfvec, 0.05) -ORDER BY val0 <-> '[0.24, 0.24, 0.24]'; ----- -[0.2, 0.2, 0.2] +# query I +# SELECT val0 FROM t WHERE val0 <<->> sphere('[0.24, 0.24, 0.24]'::vector, 0.012) +# AND val1 <<#>> sphere('[0.24, -0.24, 0.24]'::halfvec, 0.05) +# ORDER BY val0 <-> '[0.24, 0.24, 0.24]'; +# ---- +# [0.2,0.2,0.2] # sphere style: vectors in key and order-by key are different query I -SELECT val0 FROM t WHERE val0 <<->> sphere('[0.24, 0.24, 0.24]'::vector, 0.012) -ORDER BY val1 <#> '[1, 1, -1]'; ----- -[0.3, 0.3, 0.3] -[0.2, 0.2, 0.2] +# SELECT val0 FROM t WHERE val0 <<->> sphere('[0.24, 0.24, 0.24]'::vector, 0.012) +# ORDER BY val1 <#> '[1, 1, -1]'; +# ---- +# [0.3,0.3,0.3] +# [0.2,0.2,0.2] statement ok DROP TABLE t; diff --git a/tests/logic/vector.slt b/tests/logic/vector.slt index 335266a..ce7edf9 100644 --- a/tests/logic/vector.slt +++ b/tests/logic/vector.slt @@ -20,5 +20,4 @@ SELECT COUNT(1) FROM (SELECT 1 FROM t ORDER BY val <#> '[0.5,0.5,0.5]' limit 10) 10 statement ok ----- DROP TABLE t;