diff --git a/.gitignore b/.gitignore index 5372bfdeb..1e8b1d680 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,7 @@ result* .history .envrc .direnv - +.nixos-test-history #IDE .idea/ @@ -30,3 +30,4 @@ common-nix.vars.pkr.hcl # pre-commit config is managed in nix .pre-commit-config.yaml +nixos.qcow2 \ No newline at end of file diff --git a/ansible/files/admin_api_scripts/mount-volume.sh b/ansible/files/admin_api_scripts/mount-volume.sh index 5f4277f2d..c611cc070 100644 --- a/ansible/files/admin_api_scripts/mount-volume.sh +++ b/ansible/files/admin_api_scripts/mount-volume.sh @@ -1,62 +1,87 @@ #!/usr/bin/env bash - set -euo pipefail DEVICE=${1:-} MOUNT_POINT=${2:-} - -if [[ -z "$DEVICE" || -z "$MOUNT_POINT" ]]; then - echo "Usage: $0 " - echo "Example: sudo ./mount-volume.sh /dev/nvme1n1 /data/150008" - exit 1 -fi - -# Mount a block device to a specified mount point -# If the device is not formatted, format it as ext4 -# Set ownership to postgres:postgres and permissions to 750 -# Add the mount entry to /etc/fstab for persistence across reboots +TIMEOUT=60 # max seconds to wait for device +INTERVAL=2 # polling interval OWNER="postgres:postgres" PERMISSIONS="750" FSTYPE="ext4" MOUNT_OPTS="defaults" FSTAB_FILE="/etc/fstab" +LOG_TAG="mount-volume" -if [ ! -b "$DEVICE" ]; then - echo "Error: Block device '$DEVICE' does not exist." - exit 2 +if [[ -z "$DEVICE" || -z "$MOUNT_POINT" ]]; then + logger -t "$LOG_TAG" "Usage: $0 " + logger -t "$LOG_TAG" "Example: sudo $0 /dev/nvme1n1 /data/150008" + exit 1 fi +if [ "$EUID" -ne 0 ]; then + logger -t "$LOG_TAG" "Please run as root" + exit 1 +fi + +logger -t "$LOG_TAG" "Waiting for block device $DEVICE to become available..." + +ELAPSED=0 +while true; do + if [ -b "$DEVICE" ] && [ -s "/sys/block/$(basename $DEVICE)/size" ]; then + logger -t "$LOG_TAG" "$DEVICE is ready" + break + fi + + ELAPSED=$((ELAPSED + INTERVAL)) + if [ $ELAPSED -ge $TIMEOUT ]; then + logger -t "$LOG_TAG" "Error: $DEVICE did not become ready after $TIMEOUT seconds" + exit 2 + fi + sleep $INTERVAL +done + +# Check if device has a filesystem if ! blkid "$DEVICE" >/dev/null 2>&1; then - echo "Device $DEVICE appears unformatted. Formatting as $FSTYPE..." + logger -t "$LOG_TAG" "$DEVICE appears unformatted. Formatting as $FSTYPE..." mkfs."$FSTYPE" -F "$DEVICE" else - echo "$DEVICE already has a filesystem — skipping format." + logger -t "$LOG_TAG" "$DEVICE already has a filesystem — skipping format" + # Run e2fsck safely + e2fsck -pf "$DEVICE" || true fi +# Prepare mount point mkdir -p "$MOUNT_POINT" -e2fsck -pf "$DEVICE" - -if ! mountpoint -q "$MOUNT_POINT"; then - echo "Mounting $DEVICE to $MOUNT_POINT" - mount -t "$FSTYPE" -o "$MOUNT_OPTS" "$DEVICE" "$MOUNT_POINT" +# Check if mount point is already used +if mountpoint -q "$MOUNT_POINT"; then + CURRENT_DEVICE=$(findmnt -n -o SOURCE --target "$MOUNT_POINT") + if [ "$CURRENT_DEVICE" != "$DEVICE" ]; then + logger -t "$LOG_TAG" "Error: $MOUNT_POINT is already mounted on $CURRENT_DEVICE" + exit 3 + else + logger -t "$LOG_TAG" "$MOUNT_POINT is already mounted on $DEVICE" + fi else - echo "$MOUNT_POINT is already mounted" + logger -t "$LOG_TAG" "Mounting $DEVICE to $MOUNT_POINT" + mount -t "$FSTYPE" -o "$MOUNT_OPTS" "$DEVICE" "$MOUNT_POINT" fi -echo "Setting ownership and permissions on $MOUNT_POINT" +# Set ownership and permissions +logger -t "$LOG_TAG" "Setting ownership to $OWNER and permissions to $PERMISSIONS" chown "$OWNER" "$MOUNT_POINT" chmod "$PERMISSIONS" "$MOUNT_POINT" +# Add to /etc/fstab if not present UUID=$(blkid -s UUID -o value "$DEVICE") FSTAB_LINE="UUID=$UUID $MOUNT_POINT $FSTYPE $MOUNT_OPTS 0 2" -if ! grep -q "$UUID" "$FSTAB_FILE"; then - echo "Adding $FSTAB_LINE to $FSTAB_FILE" +if ! grep -q -F "UUID=$UUID" "$FSTAB_FILE"; then + logger -t "$LOG_TAG" "Adding $FSTAB_LINE to $FSTAB_FILE" echo "$FSTAB_LINE" >> "$FSTAB_FILE" else - echo "UUID $UUID already in $FSTAB_FILE — skipping" + logger -t "$LOG_TAG" "UUID $UUID already exists in $FSTAB_FILE — skipping" fi -echo "Mounted $DEVICE at $MOUNT_POINT with postgres:postgres and mode $PERMISSIONS" +logger -t "$LOG_TAG" "Mounted $DEVICE at $MOUNT_POINT with ownership $OWNER and permissions $PERMISSIONS" diff --git a/ansible/files/postgres_prestart.sh.j2 b/ansible/files/postgres_prestart.sh.j2 index 3ffe54c85..cc8ff53c6 100644 --- a/ansible/files/postgres_prestart.sh.j2 +++ b/ansible/files/postgres_prestart.sh.j2 @@ -1,5 +1,11 @@ #!/bin/bash +set -x # Print commands + +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" +} + check_orioledb_enabled() { local pg_conf="/etc/postgresql/postgresql.conf" if [ ! -f "$pg_conf" ]; then @@ -26,7 +32,87 @@ update_orioledb_buffers() { fi } +check_extensions_file() { + local extensions_file="/etc/adminapi/pg-extensions.json" + if [ ! -f "$extensions_file" ]; then + log "extensions: No extensions file found, skipping extensions versions check" + return 0 #if file not found, skip + fi + if [ ! -r "$extensions_file" ]; then + log "extensions: Cannot read extensions file" + return 1 #a true error, we should be able to read file + fi + return 0 +} + +switch_extension_version() { + local extension_name="$1" + local version="$2" + + # Use BIN_PATH environment variable or default to /var/lib/postgresql/.nix-profile + : ${BIN_PATH:="/var/lib/postgresql/.nix-profile"} + + local switch_script="$BIN_PATH/bin/switch_${extension_name}_version" + + if [ ! -x "$switch_script" ]; then + log "$extension_name: No version switch script available at $switch_script, skipping" + return 0 + fi + + log "$extension_name: Switching to version $version" + # Run directly as root since we're already running as root + "$switch_script" "$version" + local exit_code=$? + if [ $exit_code -eq 0 ]; then + log "$extension_name: Version switch completed successfully" + else + log "$extension_name: Version switch failed with exit code $exit_code" + fi + return $exit_code +} + +handle_extension_versions() { + if ! check_extensions_file; then + return + fi + + local extensions_file="/etc/adminapi/pg-extensions.json" + + # Get all extension names from the JSON file + local extensions + extensions=$(jq -r 'keys[]' "$extensions_file" 2>/dev/null) + + if [ -z "$extensions" ]; then + log "extensions: No extensions found in configuration" + return + fi + + # Iterate through each extension + while IFS= read -r extension_name; do + # Get the version for this extension + local version + version=$(jq -r --arg ext "$extension_name" '.[$ext] // empty' "$extensions_file") + + if [ -z "$version" ]; then + log "$extension_name: No version specified, skipping" + continue + fi + + log "$extension_name: Found version $version in extensions file" + + # Don't fail if version switch fails - just log and continue + switch_extension_version "$extension_name" "$version" || log "$extension_name: Version switch failed but continuing" + + done <<< "$extensions" +} + main() { + log "Starting prestart script" + + # 1. Handle all extension versions from config file + handle_extension_versions + + # 2. orioledb handling local has_orioledb=$(check_orioledb_enabled) if [ "$has_orioledb" -lt 1 ]; then return 0 @@ -35,6 +121,8 @@ main() { if [ ! -z "$shared_buffers_value" ]; then update_orioledb_buffers "$shared_buffers_value" fi + + log "Prestart script completed" } # Initial locale setup @@ -46,4 +134,4 @@ if [ $(locale -a | grep -c en_US.utf8) -eq 0 ]; then locale-gen fi -main +main \ No newline at end of file diff --git a/ansible/vars.yml b/ansible/vars.yml index cd7ea6a28..f4c4d4be9 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.017-orioledb" - postgres17: "17.4.1.074" - postgres15: "15.8.1.131" + postgresorioledb-17: "17.5.1.018-orioledb-rc-3" + postgres17: "17.4.1.075-rc-3" + postgres15: "15.8.1.132-rc-3" # Non Postgres Extensions pgbouncer_release: "1.19.0" diff --git a/nix/checks.nix b/nix/checks.nix index 2dc51797a..43a0dd4ab 100644 --- a/nix/checks.nix +++ b/nix/checks.nix @@ -309,6 +309,10 @@ ; } // pkgs.lib.optionalAttrs (system == "x86_64-linux") { + pg_net = import ./ext/tests/pg_net.nix { + inherit self; + inherit pkgs; + }; wrappers = import ./ext/tests/wrappers.nix { inherit self; inherit pkgs; diff --git a/nix/ext/pg_net.nix b/nix/ext/pg_net.nix index 02d673297..5c2707740 100644 --- a/nix/ext/pg_net.nix +++ b/nix/ext/pg_net.nix @@ -1,41 +1,224 @@ { + pkgs, lib, stdenv, fetchFromGitHub, curl, postgresql, + libuv, + writeShellApplication, + makeWrapper, }: -stdenv.mkDerivation rec { - pname = "pg_net"; - version = "0.14.0"; - - buildInputs = [ - curl - postgresql - ]; - - src = fetchFromGitHub { - owner = "supabase"; - repo = pname; - rev = "refs/tags/v${version}"; - hash = "sha256-c1pxhTyrE5j6dY+M5eKAboQNofIORS+Dccz+7HKEKQI="; +let + enableOverlayOnPackage = writeShellApplication { + name = "enable_overlay_on_package"; + runtimeInputs = [ pkgs.coreutils ]; + text = '' + # This script enable overlayfs on a specific nix store path + set -euo pipefail + + if [ $# -ne 1 ]; then + echo "Usage: $0 " + exit 1 + fi + + PACKAGE_PATH="$1" + PACKAGE_NAME=$(basename "$1"|cut -c 34-) + + # Nixos compatibility: use systemd mount unit + #shellcheck disable=SC1091 + source /etc/os-release || true + if [[ "$ID" == "nixos" ]]; then + # This script is used in NixOS test only for the moment + SYSTEMD_DIR="/run/systemd/system" + else + SYSTEMD_DIR="/etc/systemd/system" + fi + + # Create required directories for overlay + echo "$PACKAGE_NAME" + mkdir -p "/var/lib/overlay/$PACKAGE_NAME/"{upper,work} + + PACKAGE_MOUNT_PATH=$(systemd-escape -p --suffix=mount "$PACKAGE_PATH") + + cat > "$SYSTEMD_DIR/$PACKAGE_MOUNT_PATH" <" + echo "Example: $0 0.10.0" + echo "" + echo "Optional environment variables:" + echo " NIX_PROFILE - Path to nix profile (default: /var/lib/postgresql/.nix-profile)" + echo " LIB_DIR - Override library directory" + echo " EXTENSION_DIR - Override extension directory" + exit 1 + fi + + VERSION="$1" + echo "$VERSION" + + # Enable overlay on the wrapper package to be able to switch version + ${lib.getExe enableOverlayOnPackage} "$EXT_WRAPPER" + + # Check if version exists + EXT_WRAPPER_LIB="$EXT_WRAPPER/lib" + PG_NET_LIB_TO_USE="$EXT_WRAPPER_LIB/pg_net-$VERSION${postgresql.dlSuffix}" + if [ ! -f "$PG_NET_LIB_TO_USE" ]; then + echo "Error: Version $VERSION not found in $EXT_WRAPPER_LIB" + echo "Available versions:" + #shellcheck disable=SC2012 + ls "$EXT_WRAPPER_LIB"/pg_net-*${postgresql.dlSuffix} 2>/dev/null | sed 's/.*pg_net-/ /' | sed 's/${postgresql.dlSuffix}$//' || echo " No versions found" + exit 1 + fi + + # Update library symlink + ln -sfnv "$PG_NET_LIB_TO_USE" "$EXT_WRAPPER_LIB/pg_net${postgresql.dlSuffix}" + + # Update control file + EXT_WRAPPER_SHARE="$EXT_WRAPPER/share/postgresql/extension" + echo "default_version = '$VERSION'" > "$EXT_WRAPPER_SHARE/pg_net.control" + cat "$EXT_WRAPPER_SHARE/pg_net--$VERSION.control" >> "$EXT_WRAPPER_SHARE/pg_net.control" + + echo "Successfully switched pg_net to version $VERSION" + ''; + }; + pname = "pg_net"; + build = + version: hash: + stdenv.mkDerivation rec { + inherit pname version; + + buildInputs = [ + curl + postgresql + ] ++ lib.optional (version == "0.6") libuv; + + src = fetchFromGitHub { + owner = "supabase"; + repo = pname; + rev = "refs/tags/v${version}"; + inherit hash; + }; + + buildPhase = '' + make PG_CONFIG=${postgresql}/bin/pg_config + ''; + + postPatch = + lib.optionalString (version == "0.6") '' + # handle collision with pg_net 0.10.0 + rm sql/pg_net--0.2--0.3.sql + rm sql/pg_net--0.4--0.5.sql + rm sql/pg_net--0.5.1--0.6.sql + '' + + lib.optionalString (version == "0.7.1") '' + # handle collision with pg_net 0.10.0 + rm sql/pg_net--0.5.1--0.6.sql + ''; + + env.NIX_CFLAGS_COMPILE = "-Wno-error"; + + installPhase = '' + mkdir -p $out/{lib,share/postgresql/extension} + + # Install versioned library + install -Dm755 ${pname}${postgresql.dlSuffix} $out/lib/${pname}-${version}${postgresql.dlSuffix} + + if [ -f sql/${pname}.sql ]; then + cp sql/${pname}.sql $out/share/postgresql/extension/${pname}--${version}.sql + else + cp sql/${pname}--${version}.sql $out/share/postgresql/extension/${pname}--${version}.sql + fi + + # Install upgrade scripts + find . -name '${pname}--*--*.sql' -exec install -Dm644 {} $out/share/postgresql/extension/ \; + + # Create versioned control file with modified module path + sed -e "/^default_version =/d" \ + -e "s|^module_pathname = .*|module_pathname = '\$libdir/${pname}'|" \ + ${pname}.control > $out/share/postgresql/extension/${pname}--${version}.control + ''; + + meta = with lib; { + description = "Async networking for Postgres"; + homepage = "https://github.com/supabase/pg_net"; + platforms = postgresql.meta.platforms; + license = licenses.postgresql; + }; + }; + allVersions = (builtins.fromJSON (builtins.readFile ./versions.json)).pg_net; + # Filter out versions that don't work on current platform + platformFilteredVersions = lib.filterAttrs ( + name: _: + # Exclude 0.11.0 on macOS due to epoll.h dependency + !(stdenv.isDarwin && name == "0.11.0") + ) allVersions; + supportedVersions = lib.filterAttrs ( + _: value: builtins.elem (lib.versions.major postgresql.version) value.postgresql + ) platformFilteredVersions; + 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 + ); +in +pkgs.buildEnv { + name = pname; + paths = packages; + nativeBuildInputs = [ makeWrapper ]; + postBuild = '' + { + 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} - env.NIX_CFLAGS_COMPILE = "-Wno-error"; - installPhase = '' - mkdir -p $out/{lib,share/postgresql/extension} + # checks + (set -x + test "$(ls -A $out/lib/${pname}*${postgresql.dlSuffix} | wc -l)" = "${ + toString (numberOfVersions + 1) + }" + ) - cp *${postgresql.dlSuffix} $out/lib - cp sql/*.sql $out/share/postgresql/extension - cp *.control $out/share/postgresql/extension + makeWrapper ${lib.getExe switchPgNetVersion} $out/bin/switch_pg_net_version \ + --prefix EXT_WRAPPER : "$out" ''; - meta = with lib; { - description = "Async networking for Postgres"; - homepage = "https://github.com/supabase/pg_net"; - platforms = postgresql.meta.platforms; - license = licenses.postgresql; + passthru = { + inherit versions numberOfVersions switchPgNetVersion; + pname = "${pname}-all"; + version = + "multi-" + lib.concatStringsSep "-" (map (v: lib.replaceStrings [ "." ] [ "-" ] v) versions); }; } diff --git a/nix/ext/tests/pg_net.nix b/nix/ext/tests/pg_net.nix new file mode 100644 index 000000000..6ec9b92cf --- /dev/null +++ b/nix/ext/tests/pg_net.nix @@ -0,0 +1,175 @@ +{ self, pkgs }: +let + inherit (pkgs) lib; + installedExtension = + postgresMajorVersion: self.packages.${pkgs.system}."psql_${postgresMajorVersion}/exts/pg_net-all"; + versions = (installedExtension "17").versions; + firstVersion = lib.head versions; + latestVersion = lib.last versions; + postgresqlWithExtension = + postgresql: + let + majorVersion = lib.versions.major postgresql.version; + pkg = pkgs.buildEnv { + name = "postgresql-${majorVersion}-pg_net"; + 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 = "pg_net"; + hostPkgs = pkgs; + nodes.server = + { config, ... }: + { + virtualisation = { + forwardPorts = [ + { + from = "host"; + host.port = 13022; + guest.port = 22; + } + ]; + }; + services.openssh = { + enable = true; + }; + users.users.root.openssh.authorizedKeys.keys = [ + "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIo+ulCUfJjnCVgfM4946Ih5Nm8DeZZiayYeABHGPEl7 jfroche" + ]; + + services.postgresql = { + enable = true; + package = psql_15; + settings = { + shared_preload_libraries = "pg_net"; + }; + }; + + specialisation.postgresql17.configuration = { + services.postgresql = { + package = lib.mkForce psql_17; + }; + + environment.systemPackages = [ psql_17 ]; + + 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 = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_15; + newPostgresql = postgresqlWithExtension self.packages.${pkgs.system}.postgresql_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 + '' + def run_sql(query): + return server.succeed(f"""sudo -u postgres psql -t -A -F\",\" -c \"{query}\" """).strip() + + def check_upgrade_path(): + with subtest("Check pg_net upgrade path"): + server.succeed("sudo -u postgres psql -c 'DROP EXTENSION IF EXISTS pg_net;'") + run_sql(r"""CREATE EXTENSION pg_net WITH VERSION \"${firstVersion}\";""") + installed_version = run_sql(r"""SELECT extversion FROM pg_extension WHERE extname = 'pg_net';""") + assert installed_version == "${firstVersion}", f"Expected pg_net version ${firstVersion}, but found {installed_version}" + for version in [${lib.concatStringsSep ", " (map (s: ''"${s}"'') versions)}][1:]: + run_sql(f"""ALTER EXTENSION pg_net UPDATE TO '{version}';""") + installed_version = run_sql(r"""SELECT extversion FROM pg_extension WHERE extname = 'pg_net';""") + assert installed_version == version, f"Expected pg_net version {version}, but found {installed_version}" + + start_all() + + server.wait_for_unit("multi-user.target") + server.wait_for_unit("postgresql.service") + + check_upgrade_path() + + with subtest("Test switch_pg_net_version"): + # Check that we are using the last version first + pg_net_version = server.succeed("readlink -f ${psql_15}/lib/pg_net.so").strip() + print(f"Current pg_net version: {pg_net_version}") + assert pg_net_version.endswith("pg_net-${latestVersion}.so"), f"Expected pg_net version ${latestVersion}, but found {pg_net_version}" + + server.succeed( + "switch_pg_net_version ${firstVersion}" + ) + + pg_net_version = server.succeed("readlink -f ${psql_15}/lib/pg_net.so").strip() + assert pg_net_version.endswith("pg_net-${firstVersion}.so"), f"Expected pg_net version ${firstVersion}, but found {pg_net_version}" + + server.succeed( + "switch_pg_net_version ${latestVersion}" + ) + + with subtest("Check pg_net latest extension version"): + server.succeed("sudo -u postgres psql -c 'DROP EXTENSION pg_net;'") + server.succeed("sudo -u postgres psql -c 'CREATE EXTENSION pg_net;'") + installed_extensions=run_sql(r"""SELECT extname, extversion FROM pg_extension;""") + assert "pg_net,${latestVersion}" in installed_extensions + + with subtest("switch to multiple node configuration"): + server.succeed( + "${pg17-configuration}/bin/switch-to-configuration test >&2" + ) + + with subtest("Check pg_net latest extension version"): + installed_extensions=run_sql(r"""SELECT extname, extversion FROM pg_extension;""") + assert "pg_net,${latestVersion}" in installed_extensions + + check_upgrade_path() + + ''; +} diff --git a/nix/ext/versions.json b/nix/ext/versions.json index c77b23be6..6f64b674f 100644 --- a/nix/ext/versions.json +++ b/nix/ext/versions.json @@ -20,5 +20,77 @@ ], "hash": "sha256-G0eQk2bY5CNPMeokN/nb05g03CuiplRf902YXFVQFbs=" } + }, + "pg_net": { + "0.1": { + "postgresql": [ + "15" + ], + "hash": "sha256-geXGMb9MxU2vVB3ZBkGEwNqHixPbqjywyUumk7kbdbQ=" + }, + "0.2": { + "postgresql": [ + "15" + ], + "hash": "sha256-ArJmZTh7rc6OgvA6RIndMqcDRJl91QPt6pgEeCuHA6M=" + }, + "0.6": { + "postgresql": [ + "15" + ], + "hash": "sha256-SpQbF/ZeAVa8zf0+N6uluHrjpmGy0NLd2/hvyiOyNsY=" + }, + "0.7": { + "postgresql": [ + "15" + ], + "hash": "sha256-FRaTZPCJQPYAFmsJg22hYJJ0+gH1tMdDQoCQgiqEnaA=" + }, + "0.7.1": { + "postgresql": [ + "15" + ], + "hash": "sha256-VScRKzY/skQu9SWGx9iZvifH7pv7SRXcvLfybB+XX4Q=" + }, + "0.8.0": { + "postgresql": [ + "15" + ], + "hash": "sha256-ZPsRPWV1G3lMM2mT+H139Wvgoy8QnmeUbzEnGeDJmZA=" + }, + "0.10.0": { + "postgresql": [ + "15" + ], + "hash": "sha256-R9Mzw5gvV7b2R59LTOzuOc0AI99+3ncFNzijI4mySUg=" + }, + "0.11.0": { + "postgresql": [ + "15", + "17" + ], + "hash": "sha256-XN441jXK1q+I/LZRNwvzbSsebXHgZ8iYsslZvcPFlAs=" + }, + "0.13.0": { + "postgresql": [ + "15", + "17" + ], + "hash": "sha256-FRaTZPCJQPYAFmsJg22hYJJ0+gH1tMdDQoCQgiqEnaA=" + }, + "0.14.0": { + "postgresql": [ + "15", + "17" + ], + "hash": "sha256-c1pxhTyrE5j6dY+M5eKAboQNofIORS+Dccz+7HKEKQI=" + }, + "0.19.5": { + "postgresql": [ + "15", + "17" + ], + "hash": "sha256-Cpi2iASi1QJoED0Qs1dANqg/BNZTsz5S+pw8iYyW03Y=" + } } } diff --git a/nix/tests/expected/z_15_ext_interface.out b/nix/tests/expected/z_15_ext_interface.out index c652a95eb..d3d9f7c4f 100644 --- a/nix/tests/expected/z_15_ext_interface.out +++ b/nix/tests/expected/z_15_ext_interface.out @@ -1161,9 +1161,11 @@ order by pg_net | net | _urlencode_string | string character varying | text pg_net | net | check_worker_is_up | | void pg_net | net | http_collect_response | request_id bigint, async boolean | net.http_response_result - pg_net | net | http_delete | url text, params jsonb, headers jsonb, timeout_milliseconds integer | bigint + pg_net | net | http_delete | url text, params jsonb, headers jsonb, timeout_milliseconds integer, body jsonb | bigint pg_net | net | http_get | url text, params jsonb, headers jsonb, timeout_milliseconds integer | bigint pg_net | net | http_post | url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer | bigint + pg_net | net | wait_until_running | | void + pg_net | net | wake | | void pg_net | net | worker_restart | | boolean pg_prewarm | public | autoprewarm_dump_now | | bigint pg_prewarm | public | autoprewarm_start_worker | | void @@ -5227,7 +5229,7 @@ order by xml2 | public | xpath_table | text, text, text, text, text | SETOF record xml2 | public | xslt_process | text, text | text xml2 | public | xslt_process | text, text, text | text -(5057 rows) +(5059 rows) /* diff --git a/nix/tests/expected/z_17_ext_interface.out b/nix/tests/expected/z_17_ext_interface.out index d31894bc3..46792e48f 100644 --- a/nix/tests/expected/z_17_ext_interface.out +++ b/nix/tests/expected/z_17_ext_interface.out @@ -1146,9 +1146,11 @@ order by pg_net | net | _urlencode_string | string character varying | text pg_net | net | check_worker_is_up | | void pg_net | net | http_collect_response | request_id bigint, async boolean | net.http_response_result - pg_net | net | http_delete | url text, params jsonb, headers jsonb, timeout_milliseconds integer | bigint + pg_net | net | http_delete | url text, params jsonb, headers jsonb, timeout_milliseconds integer, body jsonb | bigint pg_net | net | http_get | url text, params jsonb, headers jsonb, timeout_milliseconds integer | bigint pg_net | net | http_post | url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer | bigint + pg_net | net | wait_until_running | | void + pg_net | net | wake | | void pg_net | net | worker_restart | | boolean pg_prewarm | public | autoprewarm_dump_now | | bigint pg_prewarm | public | autoprewarm_start_worker | | void @@ -4871,7 +4873,7 @@ order by xml2 | public | xpath_table | text, text, text, text, text | SETOF record xml2 | public | xslt_process | text, text | text xml2 | public | xslt_process | text, text, text | text -(4714 rows) +(4716 rows) /* diff --git a/nix/tests/expected/z_orioledb-17_ext_interface.out b/nix/tests/expected/z_orioledb-17_ext_interface.out index d31894bc3..46792e48f 100644 --- a/nix/tests/expected/z_orioledb-17_ext_interface.out +++ b/nix/tests/expected/z_orioledb-17_ext_interface.out @@ -1146,9 +1146,11 @@ order by pg_net | net | _urlencode_string | string character varying | text pg_net | net | check_worker_is_up | | void pg_net | net | http_collect_response | request_id bigint, async boolean | net.http_response_result - pg_net | net | http_delete | url text, params jsonb, headers jsonb, timeout_milliseconds integer | bigint + pg_net | net | http_delete | url text, params jsonb, headers jsonb, timeout_milliseconds integer, body jsonb | bigint pg_net | net | http_get | url text, params jsonb, headers jsonb, timeout_milliseconds integer | bigint pg_net | net | http_post | url text, body jsonb, params jsonb, headers jsonb, timeout_milliseconds integer | bigint + pg_net | net | wait_until_running | | void + pg_net | net | wake | | void pg_net | net | worker_restart | | boolean pg_prewarm | public | autoprewarm_dump_now | | bigint pg_prewarm | public | autoprewarm_start_worker | | void @@ -4871,7 +4873,7 @@ order by xml2 | public | xpath_table | text, text, text, text, text | SETOF record xml2 | public | xslt_process | text, text | text xml2 | public | xslt_process | text, text, text | text -(4714 rows) +(4716 rows) /*