Skip to content

Commit 2a8dee6

Browse files
committed
Fix tests of pg_upgrade across different major versions
This fixes a set of issues that cause different breakages or annoyances when using pg_upgrade's test.sh to do upgrades across different major versions: - test.sh is completely broken when using v14 as new version because of the removal of testtablespace/ as Makefile rule. Older versions of pg_regress don't support --make-tablespacedir, blocking the creation of the tablespace. In order to fix that, it is simple enough to create those directories in the script itself, but only do that when an old version is involved. This fix is needed on HEAD and REL_14_STABLE. - The script would fail when using PG <= v11 as old version because of WITH OIDS relations not supported in v12. In order to fix this, this steals a method from the buildfarm that uses a DO block to change all the relations marked as WITH OIDS, allowing pg_upgrade to pass. This is more portable than using ALTER TABLE queries on the relations causing issues. This is fixed down to v12, and authored originally by Andrew Dunstan. - Not using --extra-float-digits=0 with v11 as old version causes a lot of diffs in the dumps, making the whole unreadable. This gets only done when using v11 as old version. This is fixed down to v12. The buildfarm code uses that already. Note that the addition of --wal-segsize and --allow-group-access breaks the script when using v10 or older at initdb time as these got added in 11. 10 would be EOL'd next year and nobody has complained about those problems yet, so nothing is done about that. This means that this commit fixes upgrade tests using test.sh with v11 as minimum older version, up to HEAD, and that it is enough to apply this change down to 12. The old and new dumps still generate diffs, still require manual checks, and more could be done to reduce the noise, but this allows the tests to run with a rather minimal amount of them. I have tested this commit and test.sh with v11 as minimum across all the branches where this is applied. Note that this commit has no impact on the normal pg_upgrade test run with a simple "make check". Author: Justin Pryzby, Andrew Dunstan, Michael Paquier Discussion: https://postgr.es/m/20201206180248.GI24052@telsasoft.com Backpatch-through: 12
1 parent bab0ff2 commit 2a8dee6

File tree

1 file changed

+47
-7
lines changed

1 file changed

+47
-7
lines changed

src/bin/pg_upgrade/test.sh

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ standard_initdb() {
2323
# To increase coverage of non-standard segment size and group access
2424
# without increasing test runtime, run these tests with a custom setting.
2525
# Also, specify "-A trust" explicitly to suppress initdb's warning.
26-
"$1" -N --wal-segsize 1 -g -A trust
26+
# --allow-group-access and --wal-segsize have been added in v11.
27+
"$1" -N --wal-segsize 1 --allow-group-access -A trust
2728
if [ -n "$TEMP_CONFIG" -a -r "$TEMP_CONFIG" ]
2829
then
2930
cat "$TEMP_CONFIG" >> "$PGDATA/postgresql.conf"
@@ -166,24 +167,62 @@ createdb "regression$dbname1" || createdb_status=$?
166167
createdb "regression$dbname2" || createdb_status=$?
167168
createdb "regression$dbname3" || createdb_status=$?
168169

170+
# Extra options to apply to the dump. This may be changed later.
171+
extra_dump_options=""
172+
169173
if "$MAKE" -C "$oldsrc" installcheck-parallel; then
170174
oldpgversion=`psql -X -A -t -d regression -c "SHOW server_version_num"`
171175

172-
# before dumping, get rid of objects not feasible in later versions
176+
# Before dumping, tweak the database of the old instance depending
177+
# on its version.
173178
if [ "$newsrc" != "$oldsrc" ]; then
174179
fix_sql=""
180+
# Get rid of objects not feasible in later versions
175181
case $oldpgversion in
176182
804??)
177183
fix_sql="DROP FUNCTION public.myfunc(integer);"
178184
;;
179185
esac
180-
fix_sql="$fix_sql
181-
DROP FUNCTION IF EXISTS
182-
public.oldstyle_length(integer, text); -- last in 9.6";
186+
187+
# Last appeared in v9.6
188+
if [ $oldpgversion -lt 100000 ]; then
189+
fix_sql="$fix_sql
190+
DROP FUNCTION IF EXISTS
191+
public.oldstyle_length(integer, text);"
192+
fi
183193
psql -X -d regression -c "$fix_sql;" || psql_fix_sql_status=$?
194+
195+
# WITH OIDS is not supported anymore in v12, so remove support
196+
# for any relations marked as such.
197+
if [ $oldpgversion -lt 120000 ]; then
198+
fix_sql="DO \$stmt\$
199+
DECLARE
200+
rec text;
201+
BEGIN
202+
FOR rec in
203+
SELECT oid::regclass::text
204+
FROM pg_class
205+
WHERE relname !~ '^pg_'
206+
AND relhasoids
207+
AND relkind in ('r','m')
208+
ORDER BY 1
209+
LOOP
210+
execute 'ALTER TABLE ' || rec || ' SET WITHOUT OIDS';
211+
END LOOP;
212+
END; \$stmt\$;"
213+
psql -X -d regression -c "$fix_sql;" || psql_fix_sql_status=$?
214+
fi
215+
216+
# Handling of --extra-float-digits gets messy after v12.
217+
# Note that this changes the dumps from the old and new
218+
# instances if involving an old cluster of v11 or older.
219+
if [ $oldpgversion -lt 120000 ]; then
220+
extra_dump_options="--extra-float-digits=0"
221+
fi
184222
fi
185223

186-
pg_dumpall --no-sync -f "$temp_root"/dump1.sql || pg_dumpall1_status=$?
224+
pg_dumpall $extra_dump_options --no-sync \
225+
-f "$temp_root"/dump1.sql || pg_dumpall1_status=$?
187226

188227
if [ "$newsrc" != "$oldsrc" ]; then
189228
# update references to old source tree's regress.so etc
@@ -253,7 +292,8 @@ case $testhost in
253292
*) sh ./analyze_new_cluster.sh ;;
254293
esac
255294

256-
pg_dumpall --no-sync -f "$temp_root"/dump2.sql || pg_dumpall2_status=$?
295+
pg_dumpall $extra_dump_options --no-sync \
296+
-f "$temp_root"/dump2.sql || pg_dumpall2_status=$?
257297
pg_ctl -m fast stop
258298

259299
if [ -n "$pg_dumpall2_status" ]; then

0 commit comments

Comments
 (0)