pgupgrade-check.patch
text/x-patch
Filename: pgupgrade-check.patch
Type: text/x-patch
Part: 0
Message:
Re: pg_upgrade automatic testing
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| contrib/pg_upgrade/.gitignore | 4 | 0 |
| contrib/pg_upgrade/Makefile | 8 | 0 |
| contrib/pg_upgrade/test.sh | 123 | 0 |
| src/makefiles/pgxs.mk | 1 | 1 |
| src/test/regress/GNUmakefile | 1 | 1 |
diff --git a/contrib/pg_upgrade/.gitignore b/contrib/pg_upgrade/.gitignore
index 03ec737..79c8cdb 100644
--- a/contrib/pg_upgrade/.gitignore
+++ b/contrib/pg_upgrade/.gitignore
@@ -1 +1,5 @@
/pg_upgrade
+# Generated by test suite
+delete_old_cluster.sh
+/log/
+/tmp_check/
diff --git a/contrib/pg_upgrade/Makefile b/contrib/pg_upgrade/Makefile
index 8f3fd7c..7f97b3d 100644
--- a/contrib/pg_upgrade/Makefile
+++ b/contrib/pg_upgrade/Makefile
@@ -21,3 +21,11 @@ top_builddir = ../..
include $(top_builddir)/src/Makefile.global
include $(top_srcdir)/contrib/contrib-global.mk
endif
+
+check: test.sh
+ MAKE=$(MAKE) bindir=$(bindir) libdir=$(libdir) $(SHELL) $< --install
+
+installcheck: test.sh
+ MAKE=$(MAKE) bindir=$(bindir) libdir=$(libdir) $(SHELL) $<
+
+EXTRA_CLEAN = delete_old_cluster.sh log/ tmp_check/
diff --git a/contrib/pg_upgrade/test.sh b/contrib/pg_upgrade/test.sh
new file mode 100644
index 0000000..9aebee9
--- /dev/null
+++ b/contrib/pg_upgrade/test.sh
@@ -0,0 +1,123 @@
+#!/bin/sh
+
+# contrib/pg_upgrade/test.sh
+#
+# Test driver for pg_upgrade. Initializes a new database cluster,
+# runs the regression tests (to put in some data), runs pg_dumpall,
+# runs pg_upgrade, runs pg_dumpall again, compares the dumps.
+#
+# Portions Copyright (c) 1996-2011, PostgreSQL Global Development Group
+# Portions Copyright (c) 1994, Regents of the University of California
+
+set -e
+
+: ${MAKE=make}
+: ${PGPORT=50432}
+export PGPORT
+
+temp_root=$PWD/tmp_check
+
+if [ "$1" = '--install' ]; then
+ temp_install=$temp_root/install
+ bindir=$temp_install/$bindir
+ libdir=$temp_install/$libdir
+
+ "$MAKE" -s -C ../.. install DESTDIR="$temp_install"
+ "$MAKE" -s -C ../pg_upgrade_support install DESTDIR="$temp_install"
+ "$MAKE" -s -C . install DESTDIR="$temp_install"
+
+ # platform-specific magic to find the shared libraries; see pg_regress.c
+ LD_LIBRARY_PATH=$libdir:$LD_LIBRARY_PATH
+ export LD_LIBRARY_PATH
+ DYLD_LIBRARY_PATH=$libdir:$DYLD_LIBRARY_PATH
+ export DYLD_LIBRARY_PATH
+ LIBPATH=$libdir:$LIBPATH
+ export LIBPATH
+ PATH=$libdir:$PATH
+
+ # We need to make it use psql from our temporary installation,
+ # because otherwise the installcheck run below would try to
+ # use psql from the proper installation directory, which might
+ # be outdated or missing.
+ EXTRA_REGRESS_OPTS=--psqldir=$bindir
+ export EXTRA_REGRESS_OPTS
+fi
+
+: ${oldbindir=$bindir}
+
+: ${oldsrc=../..}
+oldsrc=`cd "$oldsrc" && pwd`
+newsrc=`cd ../.. && pwd`
+
+PATH=$bindir:$PATH
+export PATH
+
+PGDATA=$temp_root/data
+export PGDATA
+rm -rf "$PGDATA" "$PGDATA".old
+
+logdir=$PWD/log
+rm -rf "$logdir"
+mkdir "$logdir"
+
+set -x
+
+$oldbindir/initdb
+$oldbindir/pg_ctl start -l "$logdir/postmaster1.log" -w
+if "$MAKE" -C "$oldsrc" installcheck; then
+ pg_dumpall >"$temp_root"/dump1.sql || pg_dumpall1_status=$?
+ if [ "$newsrc" != "$oldsrc" ]; then
+ oldpgversion=`psql -A -t -d regression -c "SHOW server_version_num"`
+ fix_sql=""
+ case $oldpgversion in
+ 804??)
+ fix_sql="UPDATE pg_proc SET probin = replace(probin::text, '$oldsrc', '$newsrc')::bytea WHERE probin LIKE '$oldsrc%'; DROP FUNCTION public.myfunc(integer);"
+ ;;
+ 900??)
+ fix_sql="SET bytea_output TO escape; UPDATE pg_proc SET probin = replace(probin::text, '$oldsrc', '$newsrc')::bytea WHERE probin LIKE '$oldsrc%';"
+ ;;
+ 901??)
+ fix_sql="UPDATE pg_proc SET probin = replace(probin, '$oldsrc', '$newsrc') WHERE probin LIKE '$oldsrc%';"
+ ;;
+ esac
+ psql -d regression -c "$fix_sql;" || psql_fix_sql_status=$?
+
+ mv "$temp_root"/dump1.sql "$temp_root"/dump1.sql.orig
+ sed "s;$oldsrc;$newsrc;g" "$temp_root"/dump1.sql.orig >"$temp_root"/dump1.sql
+ fi
+else
+ make_installcheck_status=$?
+fi
+$oldbindir/pg_ctl -m fast stop
+if [ -n "$make_installcheck_status" ]; then
+ exit 1
+fi
+if [ -n "$psql_fix_sql_status" ]; then
+ exit 1
+fi
+if [ -n "$pg_dumpall1_status" ]; then
+ echo "pg_dumpall of pre-upgrade database cluster failed"
+ exit 1
+fi
+
+mv "${PGDATA}" "${PGDATA}.old"
+
+initdb
+
+pg_upgrade -d "${PGDATA}.old" -D "${PGDATA}" -b "$oldbindir" -B "$bindir"
+
+pg_ctl start -l "$logdir/postmaster2.log" -w
+pg_dumpall >"$temp_root"/dump2.sql || pg_dumpall2_status=$?
+pg_ctl -m fast stop
+if [ -n "$pg_dumpall2_status" ]; then
+ echo "pg_dumpall of post-upgrade database cluster failed"
+ exit 1
+fi
+
+if diff -q "$temp_root"/dump1.sql "$temp_root"/dump2.sql; then
+ echo PASSED
+ exit 0
+else
+ echo "dumps were not identical"
+ exit 1
+fi
diff --git a/src/makefiles/pgxs.mk b/src/makefiles/pgxs.mk
index 84a296a..7dc8742 100644
--- a/src/makefiles/pgxs.mk
+++ b/src/makefiles/pgxs.mk
@@ -207,7 +207,7 @@ ifdef OBJS
rm -f $(OBJS)
endif
ifdef EXTRA_CLEAN
- rm -f $(EXTRA_CLEAN)
+ rm -rf $(EXTRA_CLEAN)
endif
ifdef REGRESS
# things created by various check targets
diff --git a/src/test/regress/GNUmakefile b/src/test/regress/GNUmakefile
index 90aea6c..ec29391 100644
--- a/src/test/regress/GNUmakefile
+++ b/src/test/regress/GNUmakefile
@@ -132,7 +132,7 @@ tablespace-setup:
## Run tests
##
-REGRESS_OPTS = --dlpath=.
+REGRESS_OPTS = --dlpath=. $(EXTRA_REGRESS_OPTS)
check: all tablespace-setup
$(pg_regress_check) $(REGRESS_OPTS) --schedule=$(srcdir)/parallel_schedule $(MAXCONNOPT) $(TEMP_CONF) $(EXTRA_TESTS)