supabase-postgres.git / summary / log / commit / refs
commit 5325c4e21b6755c0bea7f9abcbca10751f2d687c
Author: Jean-François Roche <jfroche@pyxel.be>
Commit: GitHub <noreply@github.com>
Date: Thu Nov 13 20:41:19 2025 +0000
feat: support multiple versions of the pg_plan_filter extension (#1873)
* feat: support multiple versions of the pg_plan_filter extension
Build multiple versions of the pg_plan_filter extension on different PostgreSQL versions.
Add test for the extension and their upgrade on PostgreSQL 15 and 17.
* chore: update release suffix for testing
* chore: bump to release
---------
Co-authored-by: Sam Rose <samuel@supabase.io>
ansible/vars.yml | 6 +-
nix/ext/pg_plan_filter.nix | 91 +++++++++++++++++++++------
nix/ext/tests/pg_plan_filter.nix | 133 +++++++++++++++++++++++++++++++++++++++
nix/ext/versions.json | 10 +++
4 files changed, 218 insertions(+), 22 deletions(-)
diff --git a/ansible/vars.yml b/ansible/vars.yml
index fd40cbdd..1a442d3e 100644
--- a/ansible/vars.yml
+++ b/ansible/vars.yml
@@ -10,9 +10,9 @@ postgres_major:
# Full version strings for each major version
postgres_release:
- postgresorioledb-17: "17.5.1.069-orioledb"
- postgres17: "17.6.1.048"
- postgres15: "15.14.1.048"
+ postgresorioledb-17: "17.5.1.070-orioledb"
+ postgres17: "17.6.1.049"
+ postgres15: "15.14.1.049"
# Non Postgres Extensions
pgbouncer_release: 1.19.0
diff --git a/nix/ext/pg_plan_filter.nix b/nix/ext/pg_plan_filter.nix
index 1e11c1d3..4e52bf22 100644
--- a/nix/ext/pg_plan_filter.nix
+++ b/nix/ext/pg_plan_filter.nix
@@ -1,34 +1,87 @@
{
+ pkgs,
lib,
stdenv,
fetchFromGitHub,
postgresql,
+ makeWrapper,
}:
-stdenv.mkDerivation rec {
- pname = "pg_plan_filter";
- version = "5081a7b5cb890876e67d8e7486b6a64c38c9a492";
+let
+ pname = "plan_filter";
+ build =
+ version: rev: hash:
+ stdenv.mkDerivation rec {
+ inherit pname version;
- buildInputs = [ postgresql ];
+ buildInputs = [ postgresql ];
- src = fetchFromGitHub {
- owner = "pgexperts";
- repo = pname;
- rev = "${version}";
- hash = "sha256-YNeIfmccT/DtOrwDmpYFCuV2/P6k3Zj23VWBDkOh6sw=";
- };
+ src = fetchFromGitHub {
+ owner = "pgexperts";
+ repo = pname;
+ inherit rev hash;
+ };
+
+ installPhase = ''
+ runHook preInstall
+
+ mkdir -p $out/share/postgresql/extension
+
+ # Install versioned library
+ install -Dm755 ${pname}${postgresql.dlSuffix} $out/lib/${pname}-${version}${postgresql.dlSuffix}
+
+ if [[ "${version}" == "${latestVersion}" ]]; then
+ cp *.sql $out/share/postgresql/extension/
+ fi
+
+ runHook postInstall
+ '';
- installPhase = ''
- mkdir -p $out/{lib,share/postgresql/extension}
+ meta = with lib; {
+ description = "Filter PostgreSQL statements by execution plans";
+ homepage = "https://github.com/pgexperts/${pname}";
+ platforms = postgresql.meta.platforms;
+ license = licenses.postgresql;
+ };
+ };
+ allVersions = (builtins.fromJSON (builtins.readFile ./versions.json)).pg_plan_filter;
+ supportedVersions = lib.filterAttrs (
+ _: value: builtins.elem (lib.versions.major postgresql.version) value.postgresql
+ ) allVersions;
+ versions = lib.naturalSort (lib.attrNames supportedVersions);
+ latestVersion = lib.last versions;
+ numberOfVersions = builtins.length versions;
+ packages = builtins.attrValues (
+ lib.mapAttrs (name: value: build name value.rev value.hash) supportedVersions
+ );
+in
+pkgs.buildEnv {
+ name = pname;
+ paths = packages;
+ nativeBuildInputs = [ makeWrapper ];
+ pathsToLink = [
+ "/lib"
+ "/share/postgresql/extension"
+ ];
+ postBuild = ''
+ ln -sfn ${pname}-${latestVersion}${postgresql.dlSuffix} $out/lib/${pname}${postgresql.dlSuffix}
- cp *${postgresql.dlSuffix} $out/lib
- cp *.sql $out/share/postgresql/extension
+ # checks
+ (set -x
+ test "$(ls -A $out/lib/${pname}*${postgresql.dlSuffix} | wc -l)" = "${
+ toString (numberOfVersions + 1)
+ }"
+ )
'';
- meta = with lib; {
- description = "Filter PostgreSQL statements by execution plans";
- homepage = "https://github.com/pgexperts/${pname}";
- platforms = postgresql.meta.platforms;
- license = licenses.postgresql;
+ passthru = {
+ inherit versions numberOfVersions;
+ pname = "${pname}-all";
+ defaultSettings = {
+ shared_preload_libraries = [ "plan_filter" ];
+ };
+ pgRegressTestName = "pg_plan_filter";
+ version =
+ "multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions);
};
}
diff --git a/nix/ext/tests/pg_plan_filter.nix b/nix/ext/tests/pg_plan_filter.nix
new file mode 100644
index 00000000..fe007377
--- /dev/null
+++ b/nix/ext/tests/pg_plan_filter.nix
@@ -0,0 +1,133 @@
+{ self, pkgs }:
+let
+ pname = "plan_filter";
+ inherit (pkgs) lib;
+ installedExtension =
+ postgresMajorVersion: self.packages.${pkgs.system}."psql_${postgresMajorVersion}/exts/${pname}-all";
+ versions = postgresqlMajorVersion: (installedExtension postgresqlMajorVersion).versions;
+ postgresqlWithExtension =
+ postgresql:
+ let
+ majorVersion = lib.versions.major postgresql.version;
+ pkg = pkgs.buildEnv {
+ name = "postgresql-${majorVersion}-${pname}";
+ paths = [
+ postgresql
+ postgresql.lib
+ (installedExtension majorVersion)
+ ];
+ passthru = {
+ inherit (postgresql) version psqlSchema;
+ lib = pkg;
+ withPackages = _: pkg;
+ };
+ nativeBuildInputs = [ pkgs.makeWrapper ];
+ pathsToLink = [
+ "/"
+ "/bin"
+ "/lib"
+ ];
+ postBuild = ''
+ wrapProgram $out/bin/postgres --set NIX_PGLIBDIR $out/lib
+ wrapProgram $out/bin/pg_ctl --set NIX_PGLIBDIR $out/lib
+ wrapProgram $out/bin/pg_upgrade --set NIX_PGLIBDIR $out/lib
+ '';
+ };
+ in
+ pkg;
+ psql_15 = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_15;
+ psql_17 = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_17;
+in
+self.inputs.nixpkgs.lib.nixos.runTest {
+ name = pname;
+ hostPkgs = pkgs;
+ nodes.server =
+ { config, ... }:
+ {
+ services.postgresql = {
+ enable = true;
+ package = (postgresqlWithExtension psql_15);
+ settings = (installedExtension "15").defaultSettings or { };
+ };
+
+ specialisation.postgresql17.configuration = {
+ services.postgresql = {
+ package = lib.mkForce psql_17;
+ settings = (installedExtension "15").defaultSettings or { };
+ };
+
+ systemd.services.postgresql-migrate = {
+ serviceConfig = {
+ Type = "oneshot";
+ RemainAfterExit = true;
+ User = "postgres";
+ Group = "postgres";
+ StateDirectory = "postgresql";
+ WorkingDirectory = "${builtins.dirOf config.services.postgresql.dataDir}";
+ };
+ script =
+ let
+ oldPostgresql = psql_15;
+ newPostgresql = psql_17;
+ oldDataDir = "${builtins.dirOf config.services.postgresql.dataDir}/${oldPostgresql.psqlSchema}";
+ newDataDir = "${builtins.dirOf config.services.postgresql.dataDir}/${newPostgresql.psqlSchema}";
+ in
+ ''
+ if [[ ! -d ${newDataDir} ]]; then
+ install -d -m 0700 -o postgres -g postgres "${newDataDir}"
+ ${newPostgresql}/bin/initdb -D "${newDataDir}"
+ ${newPostgresql}/bin/pg_upgrade --old-datadir "${oldDataDir}" --new-datadir "${newDataDir}" \
+ --old-bindir "${oldPostgresql}/bin" --new-bindir "${newPostgresql}/bin"
+ else
+ echo "${newDataDir} already exists"
+ fi
+ '';
+ };
+
+ systemd.services.postgresql = {
+ after = [ "postgresql-migrate.service" ];
+ requires = [ "postgresql-migrate.service" ];
+ };
+ };
+ };
+ testScript =
+ { nodes, ... }:
+ let
+ pg17-configuration = "${nodes.server.system.build.toplevel}/specialisation/postgresql17";
+ in
+ ''
+ from pathlib import Path
+ versions = {
+ "15": [${lib.concatStringsSep ", " (map (s: ''"${s}"'') (versions "15"))}],
+ "17": [${lib.concatStringsSep ", " (map (s: ''"${s}"'') (versions "17"))}],
+ }
+ extension_name = "${pname}"
+ support_upgrade = False
+ pg17_configuration = "${pg17-configuration}"
+ ext_has_background_worker = ${
+ if (installedExtension "15") ? hasBackgroundWorker then "True" else "False"
+ }
+ sql_test_directory = Path("${../../tests}")
+ pg_regress_test_name = "${(installedExtension "15").pgRegressTestName or pname}"
+
+ ${builtins.readFile ./lib.py}
+
+ start_all()
+
+ server.wait_for_unit("multi-user.target")
+ server.wait_for_unit("postgresql.service")
+
+ test = PostgresExtensionTest(server, extension_name, versions, sql_test_directory, support_upgrade)
+
+ with subtest("Check pg_regress with postgresql 15 after extension upgrade"):
+ test.check_pg_regress(Path("${psql_15}/lib/pgxs/src/test/regress/pg_regress"), "15", pg_regress_test_name)
+
+ with subtest("switch to postgresql 17"):
+ server.succeed(
+ f"{pg17_configuration}/bin/switch-to-configuration test >&2"
+ )
+
+ with subtest("Check pg_regress with postgresql 17 after extension upgrade"):
+ test.check_pg_regress(Path("${psql_17}/lib/pgxs/src/test/regress/pg_regress"), "17", pg_regress_test_name)
+ '';
+}
diff --git a/nix/ext/versions.json b/nix/ext/versions.json
index a6b9a47d..dc7ef8fd 100644
--- a/nix/ext/versions.json
+++ b/nix/ext/versions.json
@@ -699,6 +699,16 @@
"hash": "sha256-Nmb7XLqQflYZfqj0yrewfb1Hl5YgEB5wfjBunPwIuOU="
}
},
+ "pg_plan_filter": {
+ "0.1": {
+ "postgresql": [
+ "15",
+ "17"
+ ],
+ "rev": "5081a7b5cb890876e67d8e7486b6a64c38c9a492",
+ "hash": "sha256-YNeIfmccT/DtOrwDmpYFCuV2/P6k3Zj23VWBDkOh6sw="
+ }
+ },
"pg_repack": {
"1.4.8": {
"postgresql": [
[parent: 8b8c4e455b45]