supabase-postgres.git / summary / log / commit / refs
commit 07758cd5fd36cf12fba6f3a5845bb404f117a2d9
Author: Jean-François Roche <jfroche@pyxel.be>
Commit: GitHub <noreply@github.com>
Date: Fri Sep 12 19:32:54 2025 +0000
feat: support multiple versions of the vector extension (#1750)
* feat: multiple versions for the vector extension
Build multiple versions of the vector extension on different PostgreSQL versions.
Add test for the extensions and their upgrade on PostgreSQL 15 and 17.
* chore: add release suffix for testing
* fix: rebase to develop
* chore: bump version for release
* chore: refactor to run default nixos test
---------
Co-authored-by: Sam Rose <samuel@supabase.io>
ansible/vars.yml | 6 +--
nix/ext/pgvector.nix | 100 ++++++++++++++++++++++++++++++++++++----------
nix/ext/tests/default.nix | 1 +
nix/ext/versions.json | 50 +++++++++++++++++++++++
4 files changed, 132 insertions(+), 25 deletions(-)
diff --git a/ansible/vars.yml b/ansible/vars.yml
index 011045f8..23d447c1 100644
--- a/ansible/vars.yml
+++ b/ansible/vars.yml
@@ -9,9 +9,9 @@ postgres_major:
# Full version strings for each major version
postgres_release:
- postgresorioledb-17: "17.5.1.024-orioledb"
- postgres17: "17.6.1.003"
- postgres15: "15.14.1.003"
+ postgresorioledb-17: "17.5.1.025-orioledb"
+ postgres17: "17.6.1.004"
+ postgres15: "15.14.1.004"
# Non Postgres Extensions
pgbouncer_release: "1.19.0"
diff --git a/nix/ext/pgvector.nix b/nix/ext/pgvector.nix
index 60a8efea..c49a02e7 100644
--- a/nix/ext/pgvector.nix
+++ b/nix/ext/pgvector.nix
@@ -1,36 +1,92 @@
{
+ pkgs,
lib,
stdenv,
fetchFromGitHub,
postgresql,
}:
+let
+ pname = "vector";
-stdenv.mkDerivation rec {
- pname = "pgvector";
- version = "0.8.0";
+ # Load version configuration from external file
+ allVersions = (builtins.fromJSON (builtins.readFile ./versions.json)).${pname};
- buildInputs = [ postgresql ];
+ # Filter versions compatible with current PostgreSQL version
+ supportedVersions = lib.filterAttrs (
+ _: value: builtins.elem (lib.versions.major postgresql.version) value.postgresql
+ ) allVersions;
- src = fetchFromGitHub {
- owner = "pgvector";
- repo = pname;
- rev = "refs/tags/v${version}";
- hash = "sha256-JsZV+I4eRMypXTjGmjCtMBXDVpqTIPHQa28ogXncE/Q=";
- };
+ # Derived version information
+ versions = lib.naturalSort (lib.attrNames supportedVersions);
+ latestVersion = lib.last versions;
+ numberOfVersions = builtins.length versions;
+ packages = builtins.attrValues (
+ lib.mapAttrs (name: value: build name value.hash) supportedVersions
+ );
+
+ # Build function for individual versions
+ build =
+ version: hash:
+ stdenv.mkDerivation rec {
+ inherit pname version;
+
+ buildInputs = [ postgresql ];
+
+ src = fetchFromGitHub {
+ owner = "pgvector";
+ repo = "pgvector";
+ rev = "refs/tags/v${version}";
+ inherit hash;
+ };
+
+ installPhase = ''
+ mkdir -p $out/{lib,share/postgresql/extension}
+
+ # Install shared library with version suffix
+ mv ${pname}${postgresql.dlSuffix} $out/lib/${pname}-${version}${postgresql.dlSuffix}
+
+ # Create version-specific control file
+ sed -e "/^default_version =/d" \
+ -e "s|^module_pathname = .*|module_pathname = '\$libdir/${pname}'|" \
+ ${pname}.control > $out/share/postgresql/extension/${pname}--${version}.control
+
+ # Copy SQL file to install the specific version
+ cp sql/${pname}.sql $out/share/postgresql/extension/${pname}--${version}.sql
+
+ # For the latest version, copy sql upgrade script, default control file and symlink
+ if [[ "${version}" == "${latestVersion}" ]]; then
+ cp sql/*.sql $out/share/postgresql/extension
+ {
+ echo "default_version = '${latestVersion}'"
+ cat $out/share/postgresql/extension/${pname}--${latestVersion}.control
+ } > $out/share/postgresql/extension/${pname}.control
+ ln -sfn ${pname}-${latestVersion}${postgresql.dlSuffix} $out/lib/${pname}${postgresql.dlSuffix}
+ fi
- installPhase = ''
- mkdir -p $out/{lib,share/postgresql/extension}
+ runHook postInstall
+ '';
- cp *${postgresql.dlSuffix} $out/lib
- cp sql/*.sql $out/share/postgresql/extension
- cp *.control $out/share/postgresql/extension
- '';
+ meta = with lib; {
+ description = "Open-source vector similarity search for Postgres";
+ homepage = "https://github.com/${src.owner}/${src.repo}";
+ maintainers = with maintainers; [ olirice ];
+ platforms = postgresql.meta.platforms;
+ license = licenses.postgresql;
+ };
+ };
+in
+pkgs.buildEnv {
+ name = pname;
+ paths = packages;
+ pathsToLink = [
+ "/lib"
+ "/share/postgresql/extension"
+ ];
- meta = with lib; {
- description = "Open-source vector similarity search for Postgres";
- homepage = "https://github.com/${src.owner}/${src.repo}";
- maintainers = with maintainers; [ olirice ];
- platforms = postgresql.meta.platforms;
- license = licenses.postgresql;
+ passthru = {
+ inherit versions numberOfVersions;
+ pname = "${pname}-all";
+ version =
+ "multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions);
};
}
diff --git a/nix/ext/tests/default.nix b/nix/ext/tests/default.nix
index a346fac6..8032851f 100644
--- a/nix/ext/tests/default.nix
+++ b/nix/ext/tests/default.nix
@@ -185,6 +185,7 @@ builtins.listToAttrs (
"index_advisor"
"pg_cron"
"pg_net"
+ "vector"
"wrappers"
]
)
diff --git a/nix/ext/versions.json b/nix/ext/versions.json
index 6d9c5a2d..4b81c60c 100644
--- a/nix/ext/versions.json
+++ b/nix/ext/versions.json
@@ -127,5 +127,55 @@
],
"hash": "sha256-Cpi2iASi1QJoED0Qs1dANqg/BNZTsz5S+pw8iYyW03Y="
}
+ },
+ "vector": {
+ "0.4.0": {
+ "postgresql": [
+ "15"
+ ],
+ "hash": "sha256-bOckX7zvHhgJDDhoAm+VZVIeVIf2hG/3oWZWuTtnZPo="
+ },
+ "0.5.1": {
+ "postgresql": [
+ "15",
+ "17"
+ ],
+ "hash": "sha256-ZNzq+dATZn9LUgeOczsaadr5hwdbt9y/+sAOPIdr77U="
+ },
+ "0.6.0": {
+ "postgresql": [
+ "15",
+ "17"
+ ],
+ "hash": "sha256-hXm+k0BZ9xZP1Tnek14jPoKCPQkA5ovscu9IX2mW7Kc="
+ },
+ "0.6.2": {
+ "postgresql": [
+ "15",
+ "17"
+ ],
+ "hash": "sha256-r+TpFJg6WrMn0L2B7RpmSRvw3XxpHzMRtpFWDCzLvgs="
+ },
+ "0.7.0": {
+ "postgresql": [
+ "15",
+ "17"
+ ],
+ "hash": "sha256-vFn7sNphOYyig6Jl1HILMaC2t9strFQBQ8ywL8Ibx1M="
+ },
+ "0.7.4": {
+ "postgresql": [
+ "15",
+ "17"
+ ],
+ "hash": "sha256-qwPaguQUdDHV8q6GDneLq5MuhVroPizpbqt7f08gKJI="
+ },
+ "0.8.0": {
+ "postgresql": [
+ "15",
+ "17"
+ ],
+ "hash": "sha256-JsZV+I4eRMypXTjGmjCtMBXDVpqTIPHQa28ogXncE/Q="
+ }
}
}
[parent: 86fe049cda88]