#!/usr/bin/env bats load $BATS_TEST_DIRNAME/helper/common.bash setup() { setup_common dolt sql <"$[1]", v1->"$[0]") WHERE pk1 >= 3; SQL run dolt index cat onepk idx_v1 -r=csv [ "$status" -eq "0" ] [[ "$output" =~ "v1,pk1" ]] || false [[ "$output" =~ '"[11,55]",2' ]] || false [[ "$output" =~ '"[54,22]",4' ]] || false [[ "$output" =~ '"[53,77]",5' ]] || false [[ "$output" =~ '"[52,88]",3' ]] || false [[ "$output" =~ '"[99,51]",1' ]] || false [[ "${#lines[@]}" = "6" ]] || false run dolt sql -q "SELECT pk1 FROM onepk ORDER BY VEC_DISTANCE(v1, '[53,77]') LIMIT 1" -r=csv [ "$status" -eq "0" ] [[ "$output" =~ "pk1" ]] || false [[ "$output" =~ "5" ]] || false [[ "${#lines[@]}" = "2" ]] || false } @test "vector-index: INSERT then DELETE some" { dolt sql <<'SQL' CREATE VECTOR INDEX idx_v1 ON onepk(v1); INSERT INTO onepk VALUES (1, '[99, 51]'), (2, '[11, 55]'), (3, '[88, 52]'), (4, '[22, 54]'), (5, '[77, 53]'); DELETE FROM onepk WHERE v1->>"$[0]" % 2 = 0; SQL run dolt index cat onepk idx_v1 -r=csv [ "$status" -eq "0" ] [[ "$output" =~ "v1,pk1" ]] || false [[ "$output" =~ '"[99,51]",1' ]] || false [[ "$output" =~ '"[11,55]",2' ]] || false [[ "$output" =~ '"[77,53]",5' ]] || false [[ "${#lines[@]}" = "4" ]] || false run dolt sql -q "SELECT pk1 FROM onepk ORDER BY VEC_DISTANCE(v1, '[77,53]') LIMIT 1;" -r=csv [ "$status" -eq "0" ] [[ "$output" =~ "pk1" ]] || false [[ "$output" =~ "5" ]] || false [[ "${#lines[@]}" = "2" ]] || false run dolt sql -q "SELECT pk1 FROM onepk ORDER BY VEC_DISTANCE(v1, '[22,54]') LIMIT 1;" -r=csv [ "$status" -eq "0" ] [[ "$output" =~ "pk1" ]] || false ! [[ "$output" =~ "4" ]] || false [[ "$output" =~ "2" ]] || false [[ "${#lines[@]}" = "2" ]] || false } @test "vector-index: INSERT then DELETE all" { dolt sql <<'SQL' CREATE VECTOR INDEX idx_v1 ON onepk(v1); INSERT INTO onepk VALUES (1, '[99, 51]'), (2, '[11, 55]'), (3, '[88, 52]'), (4, '[22, 54]'), (5, '[77, 53]'); DELETE FROM onepk WHERE v1->>"$[0]" = 99; SQL run dolt index cat onepk idx_v1 -r=csv [ "$status" -eq "0" ] [[ "$output" =~ "v1,pk1" ]] || false [[ "$output" =~ '"[11,55]",2' ]] || false [[ "$output" =~ '"[88,52]",3' ]] || false [[ "$output" =~ '"[22,54]",4' ]] || false [[ "$output" =~ '"[77,53]",5' ]] || false [[ "${#lines[@]}" = "5" ]] || false run dolt sql -q "SELECT pk1 FROM onepk ORDER BY VEC_DISTANCE(v1, '[22,54]') LIMIT 1;" -r=csv [ "$status" -eq "0" ] [[ "$output" =~ "pk1" ]] || false [[ "$output" =~ "4" ]] || false [[ "${#lines[@]}" = "2" ]] || false run dolt sql -q "SELECT pk1 FROM onepk ORDER BY VEC_DISTANCE(v1, '[99,51]') LIMIT 1;" -r=csv [ "$status" -eq "0" ] [[ "$output" =~ "pk1" ]] || false [[ "$output" =~ "3" ]] || false [[ "${#lines[@]}" = "2" ]] || false dolt sql <<'SQL' DELETE FROM onepk; SQL run dolt index cat onepk idx_v1 -r=csv [ "$status" -eq "0" ] [[ "$output" =~ "v1,pk1" ]] || false [[ "${#lines[@]}" = "1" ]] || false run dolt sql -q "SELECT pk1 FROM onepk ORDER BY VEC_DISTANCE(v1, '[99,51]') LIMIT 1;" -r=csv [ "$status" -eq "0" ] [[ "$output" =~ "pk1" ]] || false [[ "${#lines[@]}" = "1" ]] || false } @test "vector-index: CREATE INDEX with same name" { dolt sql <<'SQL' INSERT INTO onepk VALUES (1, '[99, 51]'), (2, '[11, 55]'), (3, '[88, 52]'), (4, '[22, 54]'), (5, '[77, 53]'); CREATE VECTOR INDEX idx_v1 ON onepk(v1); SQL run dolt sql -q "CREATE VECTOR INDEX idx_v1 ON onepk(v2)" [ "$status" -eq "1" ] run dolt index ls onepk [ "$status" -eq "0" ] [[ "$output" =~ "idx_v1(v1)" ]] || false # Found bug where the above would error, yet somehow wipe the index table run dolt index cat onepk idx_v1 -r=csv [ "$status" -eq "0" ] [[ "$output" =~ "v1,pk1" ]] || false [[ "$output" =~ '"[88,52]",3' ]] || false [[ "$output" =~ '"[99,51]",1' ]] || false [[ "${#lines[@]}" = "6" ]] || false run dolt schema show onepk [ "$status" -eq "0" ] [[ "$output" =~ 'VECTOR KEY `idx_v1` (`v1`)' ]] || false } @test "vector-index: CREATE INDEX with same columns" { dolt sql <<'SQL' INSERT INTO onepk VALUES (1, '[99, 51]'), (2, '[11, 55]'), (3, '[88, 52]'), (4, '[22, 54]'), (5, '[77, 53]'); CREATE VECTOR INDEX idx_v1 ON onepk(v1); SQL run dolt sql -q "CREATE VECTOR INDEX idx_v1_dup ON onepk(v1)" [ "$status" -eq "0" ] run dolt index ls onepk [ "$status" -eq "0" ] [[ "$output" =~ "idx_v1_dup(v1)" ]] || false run dolt schema show onepk [ "$status" -eq "0" ] [[ "$output" =~ 'VECTOR KEY `idx_v1_dup` (`v1`)' ]] || false } @test "vector-index: Disallow 'dolt_' name prefix" { run dolt sql -q "CREATE VECTOR INDEX dolt_idx_v1 ON onepk(v1)" [ "$status" -eq "1" ] run dolt sql -q "ALTER TABLE onepk ADD INDEX dolt_idx_v1 (v1)" [ "$status" -eq "1" ] } @test "vector-index: DROP INDEX" { dolt sql <