supabase-postgres.git / summary / log / commit / refs
commit 118a67ca4e2f41db5159ff72e1c48067f807fc15
Author: Sam Rose <samuel@supabase.io>
Commit: Div Arora <darora@users.noreply.github.com>
Date: Wed Jul 31 15:24:17 2024 +0000
feat: plv8 and flake check for aarch64 darwin
flake.nix | 366 ++++++++++++++++++++++++++++---------------------------
nix/ext/plv8.nix | 11 +-
2 files changed, 198 insertions(+), 179 deletions(-)
diff --git a/flake.nix b/flake.nix
index cac341f1..4c32875b 100644
--- a/flake.nix
+++ b/flake.nix
@@ -65,16 +65,16 @@
# FIXME (aseipp): pg_prove is yet another perl program that needs
# LOCALE_ARCHIVE set in non-NixOS environments. upstream this. once that's done, we
# can remove this wrapper.
- pg_prove = pkgs.runCommand "pg_prove"
- {
- nativeBuildInputs = [ pkgs.makeWrapper ];
- } ''
- mkdir -p $out/bin
- for x in pg_prove pg_tapgen; do
- makeWrapper "${pkgs.perlPackages.TAPParserSourceHandlerpgTAP}/bin/$x" "$out/bin/$x" \
- --set LOCALE_ARCHIVE "${pkgs.glibcLocales}/lib/locale/locale-archive"
- done
- '';
+ # pg_prove = pkgs.runCommand "pg_prove"
+ # {
+ # nativeBuildInputs = [ pkgs.makeWrapper ];
+ # } ''
+ # mkdir -p $out/bin
+ # for x in pg_prove pg_tapgen; do
+ # makeWrapper "${pkgs.perlPackages.TAPParserSourceHandlerpgTAP}/bin/$x" "$out/bin/$x" \
+ # --set LOCALE_ARCHIVE "${pkgs.glibcLocales}/lib/locale/locale-archive"
+ # done
+ # '';
# Our list of PostgreSQL extensions which come from upstream Nixpkgs.
@@ -131,7 +131,7 @@
./nix/ext/pg_tle.nix
./nix/ext/wrappers/default.nix
./nix/ext/supautils.nix
- #./nix/ext/plv8.nix
+ ./nix/ext/plv8.nix
];
#Where we import and build the orioledb extension, we add on our custom extensions
@@ -255,151 +255,151 @@
# Make a Docker Image from a given PostgreSQL version and binary package.
# updated to use https://github.com/nlewo/nix2container (samrose)
- makePostgresDocker = version: binPackage:
- let
- #system = builtins.currentSystem;
- archString = if system == "aarch64-linux" then "arm64"
- else if system == "x86_64-linux" then "amd64"
- else throw "Unsupported system: ${system}";
-
- initScript = pkgs.runCommand "docker-init.sh" { } ''
- mkdir -p $out/bin
- substitute ${./nix/docker/init.sh.in} $out/bin/init.sh \
- --subst-var-by 'PGSQL_DEFAULT_PORT' '${pgsqlDefaultPort}'
-
- chmod +x $out/bin/init.sh
- '';
-
- postgresqlConfig = pkgs.runCommand "postgresql.conf" { } ''
- mkdir -p $out/etc/
- substitute ${./nix/tests/postgresql.conf.in} $out/etc/postgresql.conf \
- --subst-var-by 'PGSQL_DEFAULT_PORT' '${pgsqlDefaultPort}' \
- --subst-var-by PGSODIUM_GETKEY_SCRIPT "${./nix/tests/util/pgsodium_getkey.sh}"
- '';
-
- l = pkgs.lib // builtins;
-
- user = "postgres";
- group = "postgres";
- uid = "1001";
- gid = "1001";
- wguid = "1002";
- wggid = "1002";
+ # makePostgresDocker = version: binPackage:
+ # let
+ # #system = builtins.currentSystem;
+ # archString = if system == "aarch64-linux" then "arm64"
+ # else if system == "x86_64-linux" then "amd64"
+ # else throw "Unsupported system: ${system}";
+
+ # initScript = pkgs.runCommand "docker-init.sh" { } ''
+ # mkdir -p $out/bin
+ # substitute ${./nix/docker/init.sh.in} $out/bin/init.sh \
+ # --subst-var-by 'PGSQL_DEFAULT_PORT' '${pgsqlDefaultPort}'
+
+ # chmod +x $out/bin/init.sh
+ # '';
+
+ # postgresqlConfig = pkgs.runCommand "postgresql.conf" { } ''
+ # mkdir -p $out/etc/
+ # substitute ${./nix/tests/postgresql.conf.in} $out/etc/postgresql.conf \
+ # --subst-var-by 'PGSQL_DEFAULT_PORT' '${pgsqlDefaultPort}' \
+ # --subst-var-by PGSODIUM_GETKEY_SCRIPT "${./nix/tests/util/pgsodium_getkey.sh}"
+ # '';
+
+ # l = pkgs.lib // builtins;
+
+ # user = "postgres";
+ # group = "postgres";
+ # uid = "1001";
+ # gid = "1001";
+ # wguid = "1002";
+ # wggid = "1002";
- mkUser = pkgs.runCommand "mkUser" { } ''
- mkdir -p $out/etc/pam.d
-
- echo "${user}:x:${uid}:${gid}::" > $out/etc/passwd
- echo "${user}:!x:::::::" > $out/etc/shadow
-
- echo "${group}:x:${gid}:" > $out/etc/group
- echo "${group}:x::" > $out/etc/gshadow
-
- echo "root:x:0:0::/root:/bin/bash" >> $out/etc/passwd
- echo "root:x:0:" >> $out/etc/group
-
- echo "wal-g:x:${wguid}:${wggid}::" >> $out/etc/passwd
- echo "wal-g:x:${wggid}:" >> $out/etc/group
-
- cat > $out/etc/pam.d/other <<EOF
- account sufficient pam_unix.so
- auth sufficient pam_rootok.so
- password requisite pam_unix.so nullok sha512
- session required pam_unix.so
- EOF
-
- touch $out/etc/login.defs
- '';
- run = pkgs.runCommand "run" { } ''
- mkdir -p $out/run/postgresql
- '';
- data = pkgs.runCommand "data" { } ''
- mkdir -p $out/data/postgresql
- '';
- pgconf = pkgs.runCommand "pgconf" { } ''
- mkdir -p $out/data/pgconf
- '';
-
- ubuntuFocalAmd64 = nix2img.pullImage {
- imageName = "ubuntu";
- imageDigest = "sha256:b6b83d3c331794420340093eb706a6f152d9c1fa51b262d9bf34594887c2c7ac";
- arch = "amd64";
- sha256 = "sha256-ugDTb83zbUxVO9IWIv/ukP0z52KiqEM/qSre7ijtBZc=";
- };
-
- ubuntuFocalArm64 = nix2img.pullImage {
- imageName = "ubuntu";
- imageDigest = "sha256:874aca52f79ae5f8258faff03e10ce99ae836f6e7d2df6ecd3da5c1cad3a912b";
- arch = "arm64";
- sha256 = "sha256-uFypzzRrSw9Yveyp6wVpiiQhrvlqgjI9h+uw0ES6yy0=";
- };
-
- ubuntuFocal = if archString == "amd64" then ubuntuFocalAmd64 else ubuntuFocalArm64;
- commonVars = builtins.readFile ./common-nix.vars.pkr.hcl;
-
- # Extract the version using string manipulation
- amiVersion = builtins.head (builtins.match ".*postgres-version = \"([^\"]*)\".*" commonVars);
- in
- nix2img.buildImage {
- name = "supabase/postgres";
- tag = "${amiVersion}-${archString}-base";
-
- nixUid = l.toInt uid;
- nixGid = l.toInt gid;
- fromImage = ubuntuFocal;
- copyToRoot = [
- (pkgs.buildEnv {
- name = "image-root";
- paths = [ data run pkgs.coreutils pkgs.which pkgs.bash pkgs.nix pkgs.less initScript binPackage pkgs.dockerTools.binSh pkgs.sudo ];
- pathsToLink = [ "/bin" "/share" "/lib"];
- })
- mkUser
- ];
-
- perms = [
- {
- path = data;
- regex = "";
- mode = "0744";
- uid = l.toInt uid;
- gid = l.toInt gid;
- uname = user;
- gname = group;
- }
- {
- path = pgconf;
- regex = "";
- mode = "0744";
- uid = l.toInt uid;
- gid = l.toInt gid;
- uname = user;
- gname = group;
- }
- {
- path = run;
- regex = "";
- mode = "0744";
- uid = l.toInt uid;
- gid = l.toInt gid;
- uname = user;
- gname = group;
- }
- ];
-
- config = {
- Entrypoint = [ "/bin/init.sh" ];
- User = "root";
- WorkingDir = "/var/lib/postgresql/data";
- Env = [
- "NIX_PAGER=cat"
- "USER=root"
- "PGDATA=/data/postgresql"
- "PGHOST=/run/postgresql"
- ];
- ExposedPorts = { "${pgsqlDefaultPort}/tcp" = { }; };
- Volumes = { "/data" = { }; };
- };
- };
+ # mkUser = pkgs.runCommand "mkUser" { } ''
+ # mkdir -p $out/etc/pam.d
+
+ # echo "${user}:x:${uid}:${gid}::" > $out/etc/passwd
+ # echo "${user}:!x:::::::" > $out/etc/shadow
+
+ # echo "${group}:x:${gid}:" > $out/etc/group
+ # echo "${group}:x::" > $out/etc/gshadow
+
+ # echo "root:x:0:0::/root:/bin/bash" >> $out/etc/passwd
+ # echo "root:x:0:" >> $out/etc/group
+
+ # echo "wal-g:x:${wguid}:${wggid}::" >> $out/etc/passwd
+ # echo "wal-g:x:${wggid}:" >> $out/etc/group
+
+ # cat > $out/etc/pam.d/other <<EOF
+ # account sufficient pam_unix.so
+ # auth sufficient pam_rootok.so
+ # password requisite pam_unix.so nullok sha512
+ # session required pam_unix.so
+ # EOF
+
+ # touch $out/etc/login.defs
+ # '';
+ # run = pkgs.runCommand "run" { } ''
+ # mkdir -p $out/run/postgresql
+ # '';
+ # data = pkgs.runCommand "data" { } ''
+ # mkdir -p $out/data/postgresql
+ # '';
+ # pgconf = pkgs.runCommand "pgconf" { } ''
+ # mkdir -p $out/data/pgconf
+ # '';
+
+ # ubuntuFocalAmd64 = nix2img.pullImage {
+ # imageName = "ubuntu";
+ # imageDigest = "sha256:b6b83d3c331794420340093eb706a6f152d9c1fa51b262d9bf34594887c2c7ac";
+ # arch = "amd64";
+ # sha256 = "sha256-ugDTb83zbUxVO9IWIv/ukP0z52KiqEM/qSre7ijtBZc=";
+ # };
+
+ # ubuntuFocalArm64 = nix2img.pullImage {
+ # imageName = "ubuntu";
+ # imageDigest = "sha256:874aca52f79ae5f8258faff03e10ce99ae836f6e7d2df6ecd3da5c1cad3a912b";
+ # arch = "arm64";
+ # sha256 = "sha256-uFypzzRrSw9Yveyp6wVpiiQhrvlqgjI9h+uw0ES6yy0=";
+ # };
+
+ # ubuntuFocal = if archString == "amd64" then ubuntuFocalAmd64 else ubuntuFocalArm64;
+ # commonVars = builtins.readFile ./common-nix.vars.pkr.hcl;
+
+ # # Extract the version using string manipulation
+ # amiVersion = builtins.head (builtins.match ".*postgres-version = \"([^\"]*)\".*" commonVars);
+ # in
+ # nix2img.buildImage {
+ # name = "supabase/postgres";
+ # tag = "${amiVersion}-${archString}-base";
+
+ # nixUid = l.toInt uid;
+ # nixGid = l.toInt gid;
+ # fromImage = ubuntuFocal;
+ # copyToRoot = [
+ # (pkgs.buildEnv {
+ # name = "image-root";
+ # paths = [ data run pkgs.coreutils pkgs.which pkgs.bash pkgs.nix pkgs.less initScript binPackage pkgs.dockerTools.binSh pkgs.sudo ];
+ # pathsToLink = [ "/bin" "/share" "/lib"];
+ # })
+ # mkUser
+ # ];
+
+ # perms = [
+ # {
+ # path = data;
+ # regex = "";
+ # mode = "0744";
+ # uid = l.toInt uid;
+ # gid = l.toInt gid;
+ # uname = user;
+ # gname = group;
+ # }
+ # {
+ # path = pgconf;
+ # regex = "";
+ # mode = "0744";
+ # uid = l.toInt uid;
+ # gid = l.toInt gid;
+ # uname = user;
+ # gname = group;
+ # }
+ # {
+ # path = run;
+ # regex = "";
+ # mode = "0744";
+ # uid = l.toInt uid;
+ # gid = l.toInt gid;
+ # uname = user;
+ # gname = group;
+ # }
+ # ];
+
+ # config = {
+ # Entrypoint = [ "/bin/init.sh" ];
+ # User = "root";
+ # WorkingDir = "/var/lib/postgresql/data";
+ # Env = [
+ # "NIX_PAGER=cat"
+ # "USER=root"
+ # "PGDATA=/data/postgresql"
+ # "PGHOST=/run/postgresql"
+ # ];
+ # ExposedPorts = { "${pgsqlDefaultPort}/tcp" = { }; };
+ # Volumes = { "/data" = { }; };
+ # };
+ # };
# Create an attribute set, containing all the relevant packages for a
# PostgreSQL install, wrapped up with a bow on top. There are three
@@ -416,13 +416,13 @@
makePostgres = version: rec {
bin = makePostgresBin version;
exts = makeOurPostgresPkgsSet version;
- docker = makePostgresDocker version bin;
+ #docker = makePostgresDocker version bin;
recurseForDerivations = true;
};
makeOrioleDbPostgres = version: patchedPostgres: rec {
bin = makeOrioleDbPostgresBin version patchedPostgres;
exts = makeOurOrioleDbPostgresPkgsSet version patchedPostgres;
- docker = makePostgresDocker version bin;
+ #docker = makePostgresDocker version bin;
recurseForDerivations = true;
};
@@ -435,8 +435,8 @@
psql_15 = makePostgres "15";
#psql_16 = makePostgres "16";
#psql_orioledb_16 = makeOrioleDbPostgres "16_23" postgresql_orioledb_16;
- pg_prove = pg_prove;
sfcgal = sfcgal;
+ pg_prove = pkgs.perlPackages.TAPParserSourceHandlerpgTAP;
# Start a version of the server.
start-server =
let
@@ -530,36 +530,46 @@
makeCheckHarness = pgpkg:
let
sqlTests = ./nix/tests/smoke;
+ pg_prove = pkgs.perlPackages.TAPParserSourceHandlerpgTAP;
in
pkgs.runCommand "postgres-${pgpkg.version}-check-harness"
{
nativeBuildInputs = with pkgs; [ coreutils bash pgpkg pg_prove procps ];
} ''
- export PGDATA=/tmp/pgdata
+ TMPDIR=$(mktemp -d)
+ if [ $? -ne 0 ]; then
+ echo "Failed to create temp directory" >&2
+ exit 1
+ fi
+
+ # Ensure the temporary directory is removed on exit
+ trap 'rm -rf "$TMPDIR"' EXIT
+
+ export PGDATA="$TMPDIR/pgdata"
+ export PGSODIUM_DIR="$TMPDIR/pgsodium"
+
mkdir -p $PGDATA
+ mkdir -p $TMPDIR/logfile
+ # Generate a random key and store it in an environment variable
+ export PGSODIUM_KEY=$(head -c 32 /dev/urandom | od -A n -t x1 | tr -d ' \n')
+
+ # Create a simple script to echo the key
+ echo '#!/bin/sh' > $TMPDIR/getkey.sh
+ echo 'echo $PGSODIUM_KEY' >> $TMPDIR/getkey.sh
+ chmod +x $TMPDIR/getkey.sh
initdb --locale=C
substitute ${./nix/tests/postgresql.conf.in} $PGDATA/postgresql.conf \
- --subst-var-by PGSODIUM_GETKEY_SCRIPT "${./nix/tests/util/pgsodium_getkey_arb.sh}"
+ --subst-var-by PGSODIUM_GETKEY_SCRIPT "$TMPDIR/getkey.sh"
echo "listen_addresses = '*'" >> $PGDATA/postgresql.conf
echo "port = 5432" >> $PGDATA/postgresql.conf
echo "host all all 127.0.0.1/32 trust" >> $PGDATA/pg_hba.conf
- postgres -k /tmp -h localhost >logfile 2>&1 &
- for i in {1..30}; do
- if pg_isready -h localhost; then
- break
- fi
- sleep 1
- if [ $i -eq 30 ]; then
- echo "PostgreSQL is not ready after 30 seconds"
- cat logfile
- exit 1
- fi
- done
- createdb -h localhost testing
- psql -h localhost -d testing -Xaf ${./nix/tests/prime.sql}
- pg_prove -h localhost -d testing ${sqlTests}/*.sql
- pkill postgres
- mv logfile $out
+ #postgres -D "$PGDATA" -k "$TMPDIR" -h localhost -p 5432 >$TMPDIR/logfile/postgresql.log 2>&1 &
+ pg_ctl -D "$PGDATA" -l $TMPDIR/logfile/postgresql.log -o "-k $TMPDIR -p 5432" start
+ createdb -p 5432 -h localhost testing
+ psql -p 5432 -h localhost -d testing -Xaf ${./nix/tests/prime.sql}
+ pg_prove -p 5432 -h localhost -d testing ${sqlTests}/*.sql
+ pg_ctl -D "$PGDATA" stop
+ mv $TMPDIR/logfile/postgresql.log $out
echo ${pgpkg}
'';
in
@@ -611,7 +621,7 @@
coreutils
just
nix-update
- pg_prove
+ #pg_prove
shellcheck
ansible
ansible-lint
diff --git a/nix/ext/plv8.nix b/nix/ext/plv8.nix
index 65050972..29b611b0 100644
--- a/nix/ext/plv8.nix
+++ b/nix/ext/plv8.nix
@@ -8,6 +8,7 @@
, runCommand
, coreutils
, gnugrep
+, gcc
}:
stdenv.mkDerivation (finalAttrs: {
@@ -32,6 +33,8 @@ stdenv.mkDerivation (finalAttrs: {
nativeBuildInputs = [
perl
+ ] ++ lib.optionals stdenv.isDarwin [
+ gcc
];
buildInputs = [
@@ -47,7 +50,13 @@ stdenv.mkDerivation (finalAttrs: {
"SHLIB_LINK=-lv8"
"V8_OUTDIR=${v8}/lib"
];
+ NIX_LDFLAGS = lib.optionalString (stdenv.isDarwin && stdenv.isAarch64)
+ "-undefined dynamic_lookup";
+ NIX_CFLAGS_COMPILE = lib.optionals (stdenv.isDarwin && stdenv.isAarch64) [
+ "-I${v8}/include"
+ "-I${postgresql}/include"
+ ];
installFlags = [
# PGXS only supports installing to postgresql prefix so we need to redirect this
"DESTDIR=${placeholder "out"}"
@@ -140,7 +149,7 @@ stdenv.mkDerivation (finalAttrs: {
description = "V8 Engine Javascript Procedural Language add-on for PostgreSQL";
homepage = "https://plv8.github.io/";
maintainers = with maintainers; [ samrose ];
- platforms = [ "x86_64-linux" "aarch64-linux" ];
+ platforms = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" ];
license = licenses.postgresql;
#broken = postgresql.jitSupport;
};
[parent: c0eb58264e05]