Skip to content

Commit e1ac880

Browse files
jfrochesoedirgo
authored andcommitted
fix(ext/wrappers): restore backward compatibility files for postgres upgrade
Postgres upgrade is failing due to missing files in the wrappers. Refactor extension build to move file creation from individual builds to the final buildEnv stage, ensuring all version-specific library symlinks and migration SQL files are properly included for postgres upgrades. <details> <summary>Files present in the extension before upgrading the extension</summary> ```bash $ nix build -L github:supabase/postgres/4db4d5b94269398dc167fe96ea43fc4336bff8b5\#packages.x86_64-linux.psql_15/exts/supabase-wrappers $ tree result result/ ├── lib │   ├── wrappers-0.1.0.so -> wrappers.so │   ├── wrappers-0.1.10.so -> wrappers.so │   ├── wrappers-0.1.11.so -> wrappers.so │   ├── wrappers-0.1.12.so -> wrappers.so │   ├── wrappers-0.1.14.so -> wrappers.so │   ├── wrappers-0.1.15.so -> wrappers.so │   ├── wrappers-0.1.16.so -> wrappers.so │   ├── wrappers-0.1.17.so -> wrappers.so │   ├── wrappers-0.1.18.so -> wrappers.so │   ├── wrappers-0.1.19.so -> wrappers.so │   ├── wrappers-0.1.1.so -> wrappers.so │   ├── wrappers-0.1.4.so -> wrappers.so │   ├── wrappers-0.1.5.so -> wrappers.so │   ├── wrappers-0.1.6.so -> wrappers.so │   ├── wrappers-0.1.7.so -> wrappers.so │   ├── wrappers-0.1.8.so -> wrappers.so │   ├── wrappers-0.1.9.so -> wrappers.so │   ├── wrappers-0.2.0.so -> wrappers.so │   ├── wrappers-0.3.0.so -> wrappers.so │   ├── wrappers-0.3.1.so -> wrappers.so │   ├── wrappers-0.4.0.so -> wrappers.so │   ├── wrappers-0.4.1.so -> wrappers.so │   ├── wrappers-0.4.2.so -> wrappers.so │   ├── wrappers-0.4.3.so -> wrappers.so │   ├── wrappers-0.4.4.so -> wrappers.so │   ├── wrappers-0.4.5.so -> wrappers.so │   ├── wrappers-0.4.6.so -> wrappers.so │   ├── wrappers-0.5.0.so -> wrappers.so │   └── wrappers.so └── share └── postgresql └── extension ├── wrappers--0.1.0--0.5.0.sql ├── wrappers--0.1.10--0.5.0.sql ├── wrappers--0.1.1--0.5.0.sql ├── wrappers--0.1.11--0.5.0.sql ├── wrappers--0.1.12--0.5.0.sql ├── wrappers--0.1.14--0.5.0.sql ├── wrappers--0.1.15--0.5.0.sql ├── wrappers--0.1.16--0.5.0.sql ├── wrappers--0.1.17--0.5.0.sql ├── wrappers--0.1.18--0.5.0.sql ├── wrappers--0.1.19--0.5.0.sql ├── wrappers--0.1.4--0.5.0.sql ├── wrappers--0.1.5--0.5.0.sql ├── wrappers--0.1.6--0.5.0.sql ├── wrappers--0.1.7--0.5.0.sql ├── wrappers--0.1.8--0.5.0.sql ├── wrappers--0.1.9--0.5.0.sql ├── wrappers--0.2.0--0.5.0.sql ├── wrappers--0.3.0--0.5.0.sql ├── wrappers--0.3.1--0.5.0.sql ├── wrappers--0.4.0--0.5.0.sql ├── wrappers--0.4.1--0.5.0.sql ├── wrappers--0.4.2--0.5.0.sql ├── wrappers--0.4.3--0.5.0.sql ├── wrappers--0.4.4--0.5.0.sql ├── wrappers--0.4.5--0.5.0.sql ├── wrappers--0.4.6--0.5.0.sql ├── wrappers--0.5.0.sql └── wrappers.control 5 directories, 58 files ``` </details> <details> <summary>Files present in the extension after upgrading the extension (after #1663 was merged)</summary> ```bash $ nix build -L github:supabase/postgres/develop\#packages.x86_64-linux.psql_15/exts/wrappers-all $ tree result result/ ├── lib │   ├── wrappers-0.5.3.so -> /nix/store/g84xfq2m4wrxwsrh63yrs4df44bwj52b-wrappers-0.5.3/lib/wrappers-0.5.3.so │   └── wrappers.so -> /nix/store/g84xfq2m4wrxwsrh63yrs4df44bwj52b-wrappers-0.5.3/lib/wrappers.so └── share └── postgresql └── extension ├── wrappers--0.5.3.control -> /nix/store/g84xfq2m4wrxwsrh63yrs4df44bwj52b-wrappers-0.5.3/share/postgresql/extension/wrappers--0.5.3.control ├── wrappers--0.5.3.sql -> /nix/store/g84xfq2m4wrxwsrh63yrs4df44bwj52b-wrappers-0.5.3/share/postgresql/extension/wrappers--0.5.3.sql └── wrappers.control -> /nix/store/g84xfq2m4wrxwsrh63yrs4df44bwj52b-wrappers-0.5.3/share/postgresql/extension/wrappers.control 5 directories, 5 files ``` </details> <details> <summary>Files present in the extension with this commit</summary> ```bash $ nix build -L .\#packages.x86_64-linux.psql_15/exts/wrappers-all $ tree result result/ ├── lib │   ├── wrappers-0.1.0.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.10.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.11.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.12.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.14.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.15.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.16.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.17.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.18.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.19.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.1.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.4.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.5.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.6.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.7.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.8.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.1.9.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.2.0.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.3.0.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.3.1.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.4.0.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.4.1.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.4.2.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.4.3.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.4.4.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.4.5.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.4.6.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.5.0.so -> /nix/store/w6yr0d0v8hxm32z1lh3p4m09gayli1sh-wrappers/lib/wrappers.so │   ├── wrappers-0.5.3.so -> /nix/store/m15jazn3jznd17naihs4w413r2wdwzpz-wrappers-0.5.3/lib/wrappers-0.5.3.so │   └── wrappers.so -> wrappers-0.5.3.so └── share └── postgresql └── extension ├── wrappers--0.1.0--0.5.3.sql ├── wrappers--0.1.10--0.5.3.sql ├── wrappers--0.1.1--0.5.3.sql ├── wrappers--0.1.11--0.5.3.sql ├── wrappers--0.1.12--0.5.3.sql ├── wrappers--0.1.14--0.5.3.sql ├── wrappers--0.1.15--0.5.3.sql ├── wrappers--0.1.16--0.5.3.sql ├── wrappers--0.1.17--0.5.3.sql ├── wrappers--0.1.18--0.5.3.sql ├── wrappers--0.1.19--0.5.3.sql ├── wrappers--0.1.4--0.5.3.sql ├── wrappers--0.1.5--0.5.3.sql ├── wrappers--0.1.6--0.5.3.sql ├── wrappers--0.1.7--0.5.3.sql ├── wrappers--0.1.8--0.5.3.sql ├── wrappers--0.1.9--0.5.3.sql ├── wrappers--0.2.0--0.5.3.sql ├── wrappers--0.3.0--0.5.3.sql ├── wrappers--0.3.1--0.5.3.sql ├── wrappers--0.4.0--0.5.3.sql ├── wrappers--0.4.1--0.5.3.sql ├── wrappers--0.4.2--0.5.3.sql ├── wrappers--0.4.3--0.5.3.sql ├── wrappers--0.4.4--0.5.3.sql ├── wrappers--0.4.5--0.5.3.sql ├── wrappers--0.4.6--0.5.3.sql ├── wrappers--0.5.0--0.5.3.sql ├── wrappers--0.5.3.control -> /nix/store/m15jazn3jznd17naihs4w413r2wdwzpz-wrappers-0.5.3/share/postgresql/extension/wrappers--0.5.3.control ├── wrappers--0.5.3.sql -> /nix/store/m15jazn3jznd17naihs4w413r2wdwzpz-wrappers-0.5.3/share/postgresql/extension/wrappers--0.5.3.sql └── wrappers.control 5 directories, 61 files ``` </details>
1 parent d0fbf41 commit e1ac880

File tree

1 file changed

+77
-36
lines changed

1 file changed

+77
-36
lines changed

nix/ext/wrappers/default.nix

Lines changed: 77 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ let
1717
version: hash: rustVersion: pgrxVersion:
1818
let
1919
cargo = rust-bin.stable.${rustVersion}.default;
20-
#previousVersions = lib.filter (v: v != version) versions; # FIXME
2120
mkPgrxExtension = callPackages ../../cargo-pgrx/mkPgrxExtension.nix {
2221
inherit rustVersion pgrxVersion;
2322
};
@@ -129,20 +128,12 @@ let
129128
doCheck = false;
130129

131130
postInstall = ''
132-
create_control_files() {
133-
sed -e "/^default_version =/d" \
134-
-e "s|^module_pathname = .*|module_pathname = '\$libdir/${pname}'|" \
135-
$out/share/postgresql/extension/${pname}.control > $out/share/postgresql/extension/${pname}--${version}.control
136-
rm $out/share/postgresql/extension/${pname}.control
137-
138-
if [[ "${version}" == "${latestVersion}" ]]; then
139-
{
140-
echo "default_version = '${latestVersion}'"
141-
cat $out/share/postgresql/extension/${pname}--${latestVersion}.control
142-
} > $out/share/postgresql/extension/${pname}.control
143-
ln -sfn ${pname}-${latestVersion}${postgresql.dlSuffix} $out/lib/${pname}${postgresql.dlSuffix}
144-
fi
145-
}
131+
create_control_files() {
132+
sed -e "/^default_version =/d" \
133+
-e "s|^module_pathname = .*|module_pathname = '\$libdir/${pname}-${version}'|" \
134+
$out/share/postgresql/extension/${pname}.control > $out/share/postgresql/extension/${pname}--${version}.control
135+
rm $out/share/postgresql/extension/${pname}.control
136+
}
146137
147138
create_control_files
148139
'';
@@ -165,6 +156,37 @@ let
165156
};
166157
}
167158
);
159+
previouslyPackagedVersions = [
160+
"0.5.0"
161+
"0.4.6"
162+
"0.4.5"
163+
"0.4.4"
164+
"0.4.3"
165+
"0.4.2"
166+
"0.4.1"
167+
"0.4.0"
168+
"0.3.1"
169+
"0.3.0"
170+
"0.2.0"
171+
"0.1.19"
172+
"0.1.18"
173+
"0.1.17"
174+
"0.1.16"
175+
"0.1.15"
176+
"0.1.14"
177+
"0.1.12"
178+
"0.1.11"
179+
"0.1.10"
180+
"0.1.9"
181+
"0.1.8"
182+
"0.1.7"
183+
"0.1.6"
184+
"0.1.5"
185+
"0.1.4"
186+
"0.1.1"
187+
"0.1.0"
188+
];
189+
numberOfPreviouslyPackagedVersions = builtins.length previouslyPackagedVersions;
168190
allVersions = (builtins.fromJSON (builtins.readFile ../versions.json)).wrappers;
169191
supportedVersions = lib.filterAttrs (
170192
_: value: builtins.elem (lib.versions.major postgresql.version) value.postgresql
@@ -184,29 +206,48 @@ buildEnv {
184206
"/share/postgresql/extension"
185207
];
186208
postBuild = ''
187-
# checks
188-
(set -x
189-
test "$(ls -A $out/lib/${pname}*${postgresql.dlSuffix} | wc -l)" = "${
190-
toString (numberOfVersions + 1)
191-
}"
192-
)
193-
194-
create_sql_files() {
195-
PREVIOUS_VERSION=""
196-
while IFS= read -r i; do
197-
FILENAME=$(basename "$i")
198-
DIRNAME=$(dirname "$i")
199-
VERSION="$(grep -oE '[0-9]+\.[0-9]+\.[0-9]+' <<< $FILENAME)"
200-
if [[ "$PREVIOUS_VERSION" != "" ]]; then
201-
echo "Processing $i"
202-
MIGRATION_FILENAME="$DIRNAME/''${FILENAME/$VERSION/$PREVIOUS_VERSION--$VERSION}"
203-
cp "$i" "$MIGRATION_FILENAME"
204-
fi
205-
PREVIOUS_VERSION="$VERSION"
206-
done < <(find $out -name '*.sql' | sort -V)
209+
create_control_files() {
210+
# Create main control file pointing to latest version
211+
{
212+
echo "default_version = '${latestVersion}'"
213+
cat $out/share/postgresql/extension/${pname}--${latestVersion}.control
214+
} > $out/share/postgresql/extension/${pname}.control
215+
}
216+
217+
create_lib_files() {
218+
# Create main library symlink to latest version
219+
ln -sfn ${pname}-${latestVersion}${postgresql.dlSuffix} $out/lib/${pname}${postgresql.dlSuffix}
220+
221+
# Create symlinks for all previously packaged versions to main library
222+
for v in ${lib.concatStringsSep " " previouslyPackagedVersions}; do
223+
ln -sfn $out/lib/${pname}${postgresql.dlSuffix} $out/lib/${pname}-$v${postgresql.dlSuffix}
224+
done
207225
}
208226
209-
create_sql_files
227+
create_migration_sql_files() {
228+
# Create migration SQL files from previous versions to newer versions
229+
for prev_version in ${lib.concatStringsSep " " previouslyPackagedVersions}; do
230+
for curr_version in ${lib.concatStringsSep " " versions}; do
231+
if [[ "$(printf '%s\n%s' "$prev_version" "$curr_version" | sort -V | head -n1)" == "$prev_version" ]] && [[ "$prev_version" != "$curr_version" ]]; then
232+
main_sql_file="$out/share/postgresql/extension/wrappers--$curr_version.sql"
233+
if [ -f "$main_sql_file" ]; then
234+
new_file="$out/share/postgresql/extension/wrappers--$prev_version--$curr_version.sql"
235+
cp "$main_sql_file" "$new_file"
236+
sed -i 's|$libdir/wrappers-[0-9.]*|$libdir/wrappers|g' "$new_file"
237+
fi
238+
fi
239+
done
240+
done
241+
}
242+
243+
create_control_files
244+
create_lib_files
245+
create_migration_sql_files
246+
247+
# checks
248+
(test "$(ls -A $out/lib/${pname}*${postgresql.dlSuffix} | wc -l)" = "${
249+
toString (numberOfVersions + numberOfPreviouslyPackagedVersions + 1)
250+
}")
210251
'';
211252
passthru = {
212253
inherit versions numberOfVersions;

0 commit comments

Comments
 (0)