mirror of
https://github.com/NixOS/nixpkgs.git
synced 2026-09-01 13:14:42 +00:00
126 lines
4.2 KiB
Nix
126 lines
4.2 KiB
Nix
{
|
|
buildPgrxExtension,
|
|
cargo-pgrx_0_17_0,
|
|
fetchFromGitHub,
|
|
lib,
|
|
nix-update-script,
|
|
postgresql,
|
|
postgresqlTestExtension,
|
|
rustc,
|
|
stdenv,
|
|
}:
|
|
buildPgrxExtension (finalAttrs: {
|
|
inherit postgresql;
|
|
cargo-pgrx = cargo-pgrx_0_17_0;
|
|
|
|
pname = "vectorchord";
|
|
version = "1.1.1";
|
|
|
|
src = fetchFromGitHub {
|
|
owner = "supervc-stack";
|
|
repo = "VectorChord";
|
|
tag = finalAttrs.version;
|
|
hash = "sha256-QL9XGSQFOcrpww03Y5F0JuDbpo0v8oidUqucLxggkqE=";
|
|
};
|
|
|
|
cargoHash = "sha256-IXOCzKJArNOcb/2TcJbLz1XdCquUpyF/cLHYU5vmlko=";
|
|
|
|
patches =
|
|
lib.optional (lib.versionOlder rustc.llvm.version "22.0.0" && stdenv.hostPlatform.isx86_64)
|
|
[
|
|
# Due to a bug in LLVM 21, build fails on x86_64 with:
|
|
# `rustc-LLVM ERROR: Cannot select: intrinsic %llvm.x86.avx512.vpdpbusd.512`.
|
|
# This has been fixed in Rust's build of LLVM and LLVM 22 with https://github.com/rust-lang/llvm-project/commit/94e2c19f86a699d7a19ff0f4130b696699189c8d,
|
|
# but this is not reflected in nixpkgs' packaging of rustc.
|
|
# For this reason, we temporarily disable avx512vnni support until this is fixed in nixpkgs.
|
|
# This might cause a performance penalty, but should not affect correctness.
|
|
# See https://github.com/NixOS/nixpkgs/pull/537113#issuecomment-4846239887
|
|
./0001-disable-avx512vnni.patch
|
|
];
|
|
|
|
# Include upgrade scripts in the final package
|
|
# https://github.com/supervc-stack/VectorChord/blob/0.5.0/crates/make/src/main.rs#L366
|
|
postInstall = ''
|
|
cp sql/upgrade/* $out/share/postgresql/extension/
|
|
'';
|
|
|
|
# This crate does not have the "pg_test" feature
|
|
usePgTestCheckFeature = false;
|
|
|
|
passthru = {
|
|
updateScript = nix-update-script { };
|
|
|
|
tests.extension = postgresqlTestExtension {
|
|
inherit (finalAttrs) finalPackage;
|
|
withPackages = [ "pgvector" ]; # vectorchord depends on pgvector at runtime
|
|
postgresqlExtraSettings = ''
|
|
shared_preload_libraries = 'vchord'
|
|
'';
|
|
|
|
sql = ''
|
|
CREATE EXTENSION vchord CASCADE;
|
|
|
|
CREATE TABLE items (id bigint PRIMARY KEY, embedding vector(3));
|
|
INSERT INTO items (id, embedding) VALUES
|
|
(1, '[1,2,4]'),
|
|
(2, '[1,2,5]'),
|
|
(3, '[0,0,3]'),
|
|
(4, '[0,0,2]'),
|
|
(5, '[0,0,1]');
|
|
|
|
CREATE INDEX ON items USING vchordrq (embedding vector_l2_ops) WITH (options = $$
|
|
residual_quantization = true
|
|
[build.internal]
|
|
lists = [4096]
|
|
spherical_centroids = false
|
|
$$);
|
|
|
|
SET vchordrq.probes = 1;
|
|
'';
|
|
|
|
asserts = [
|
|
{
|
|
query = "SELECT extversion FROM pg_extension WHERE extname = 'vchord'";
|
|
expected = "'${finalAttrs.version}'";
|
|
description = "Expected installed version to match the derivation's version";
|
|
}
|
|
{
|
|
query = "SELECT id FROM items WHERE embedding <-> '[1,2,3]' = 1";
|
|
expected = "1";
|
|
description = "Expected vector of row with ID=1 to have an euclidean distance from [1,2,3] of 1.";
|
|
}
|
|
{
|
|
query = "SELECT id FROM items WHERE embedding <-> '[1,2,3]' = 2";
|
|
expected = "2";
|
|
description = "Expected vector of row with ID=2 to have an euclidean distance from [1,2,3] of 2.";
|
|
}
|
|
{
|
|
query = "SELECT id FROM items ORDER BY embedding <-> '[2,3,7]' LIMIT 1";
|
|
expected = "2";
|
|
description = "Expected vector of row with ID=2 to be the closest to [2,3,7].";
|
|
}
|
|
];
|
|
};
|
|
};
|
|
|
|
meta = {
|
|
# PostgreSQL 19 is not yet supported
|
|
# See https://github.com/supervc-stack/VectorChord/issues/464
|
|
# Check after next package update.
|
|
broken = lib.warnIf (
|
|
finalAttrs.version != "1.1.1"
|
|
) "Is postgresql19Packages.vectorchord still broken?" (lib.versionAtLeast postgresql.version "19");
|
|
changelog = "https://github.com/supervc-stack/VectorChord/releases/tag/${finalAttrs.version}";
|
|
description = "Scalable, fast, and disk-friendly vector search in Postgres, the successor of pgvecto.rs";
|
|
homepage = "https://github.com/supervc-stack/VectorChord";
|
|
license = lib.licenses.OR [
|
|
lib.licenses.agpl3Only
|
|
lib.licenses.elastic20
|
|
];
|
|
maintainers = with lib.maintainers; [
|
|
diogotcorreia
|
|
];
|
|
platforms = postgresql.meta.platforms;
|
|
};
|
|
})
|