supabase-postgres.git / summary / log / commit / refs

commit    8a8fac455df4e1321e50911958bb5d0858987539
Author:   Jean-François Roche <jfroche@pyxel.be>
Commit:   GitHub <noreply@github.com>
Date:     Tue Sep 16 22:02:00 2025 +0000

    feat: support multiple versions of the hypopg extension  (#1760)
    
    * feat(hypopg): build multiple versions of the hypopg extension
    
    Build multiple versions of the hypopg extension on different PostgreSQL versions.
    Add test for the extensions and their upgrade on PostgreSQL 15 and 17.
    
    * chore: add release suffix for testing
    
    * chore: refactor hypopg test
    
    Reuse the common nixos test for testing PostgreSQL extensions.
    
    * chore: bump version for release
    
    ---------
    
    Co-authored-by: Sam Rose <samuel@supabase.io>


ansible/vars.yml | 6 +-- nix/ext/hypopg.nix | 98 ++++++++++++++++++++++++++++++++++++++--------- nix/ext/tests/default.nix | 1 + nix/ext/versions.json | 35 ++++++++++++----- 4 files changed, 108 insertions(+), 32 deletions(-) diff --git a/ansible/vars.yml b/ansible/vars.yml index 23d447c1..a32c56d7 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.025-orioledb" - postgres17: "17.6.1.004" - postgres15: "15.14.1.004" + postgresorioledb-17: "17.5.1.026-orioledb" + postgres17: "17.6.1.005" + postgres15: "15.14.1.005" # Non Postgres Extensions pgbouncer_release: "1.19.0" diff --git a/nix/ext/hypopg.nix b/nix/ext/hypopg.nix index 1e38b11c..28e847d4 100644 --- a/nix/ext/hypopg.nix +++ b/nix/ext/hypopg.nix @@ -1,35 +1,95 @@ { lib, stdenv, + buildEnv, fetchFromGitHub, postgresql, }: -stdenv.mkDerivation rec { +let pname = "hypopg"; - version = "1.4.1"; + allVersions = (builtins.fromJSON (builtins.readFile ./versions.json)).${pname}; + 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; + build = + version: hash: + stdenv.mkDerivation rec { + inherit pname version; - buildInputs = [ postgresql ]; + buildInputs = [ postgresql ]; - src = fetchFromGitHub { - owner = "HypoPG"; - repo = pname; - rev = "refs/tags/${version}"; - hash = "sha256-88uKPSnITRZ2VkelI56jZ9GWazG/Rn39QlyHKJKSKMM="; - }; + src = fetchFromGitHub { + owner = "HypoPG"; + repo = pname; + rev = "refs/tags/${version}"; + inherit hash; + }; + + installPhase = '' + mkdir -p $out/{lib,share/postgresql/extension} + + mv ${pname}${postgresql.dlSuffix} $out/lib/${pname}-${version}${postgresql.dlSuffix} + + create_sql_files() { + echo "Creating SQL files for previous versions..." + if [[ "${version}" == "${latestVersion}" ]]; then + cp *.sql $out/share/postgresql/extension + fi + } + + create_control_files() { + sed -e "/^default_version =/d" \ + -e "s|^module_pathname = .*|module_pathname = '\$libdir/${pname}'|" \ + ${pname}.control > $out/share/postgresql/extension/${pname}--${version}.control + + if [[ "${version}" == "${latestVersion}" ]]; then + { + 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} + create_sql_files + create_control_files + ''; - cp *${postgresql.dlSuffix} $out/lib - cp *.sql $out/share/postgresql/extension - cp *.control $out/share/postgresql/extension + meta = with lib; { + description = "Hypothetical Indexes for PostgreSQL"; + homepage = "https://github.com/HypoPG/${pname}"; + license = licenses.postgresql; + inherit (postgresql.meta) platforms; + }; + }; + packages = builtins.attrValues ( + lib.mapAttrs (name: value: build name value.hash) supportedVersions + ); +in +buildEnv { + name = pname; + paths = packages; + pathsToLink = [ + "/lib" + "/share/postgresql/extension" + ]; + postBuild = '' + # checks + (set -x + test "$(ls -A $out/lib/${pname}*${postgresql.dlSuffix} | wc -l)" = "${ + toString (numberOfVersions + 1) + }" + ) ''; - meta = with lib; { - description = "Hypothetical Indexes for PostgreSQL"; - homepage = "https://github.com/HypoPG/${pname}"; - 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 8032851f..afea82fc 100644 --- a/nix/ext/tests/default.nix +++ b/nix/ext/tests/default.nix @@ -182,6 +182,7 @@ builtins.listToAttrs ( value = extTest extName; }) [ + "hypopg" "index_advisor" "pg_cron" "pg_net" diff --git a/nix/ext/versions.json b/nix/ext/versions.json index 4b81c60c..a5a289d4 100644 --- a/nix/ext/versions.json +++ b/nix/ext/versions.json @@ -1,24 +1,27 @@ { - "wrappers": { - "0.5.4": { + "index_advisor": { + "0.2.0": { "postgresql": [ "15", "17", "orioledb-17" ], - "hash": "sha256-W1RokXH4Vfj2FIuEzGEP5SzzWsv2Pbzfa816nXKnSoc=", - "pgrx": "0.14.3", - "rust": "1.87.0" + "hash": "sha256-G0eQk2bY5CNPMeokN/nb05g03CuiplRf902YXFVQFbs=" } }, - "index_advisor": { - "0.2.0": { + "hypopg": { + "1.3.1": { + "postgresql": [ + "15" + ], + "hash": "sha256-AIBXy+LxyHUo+1hd8gQTwaBdFiTEzKaCVc4cx5tZgME=" + }, + "1.4.1": { "postgresql": [ "15", - "17", - "orioledb-17" + "17" ], - "hash": "sha256-G0eQk2bY5CNPMeokN/nb05g03CuiplRf902YXFVQFbs=" + "hash": "sha256-88uKPSnITRZ2VkelI56jZ9GWazG/Rn39QlyHKJKSKMM=" } }, "pg_cron": { @@ -177,5 +180,17 @@ ], "hash": "sha256-JsZV+I4eRMypXTjGmjCtMBXDVpqTIPHQa28ogXncE/Q=" } + }, + "wrappers": { + "0.5.4": { + "postgresql": [ + "15", + "17", + "orioledb-17" + ], + "hash": "sha256-W1RokXH4Vfj2FIuEzGEP5SzzWsv2Pbzfa816nXKnSoc=", + "pgrx": "0.14.3", + "rust": "1.87.0" + } } } [parent: 9898ced5c7e8]