diff --git a/src/bin/pg_upgrade/.gitignore b/src/bin/pg_upgrade/.gitignore index d24ec60184f..6fb644de7a9 100644 --- a/src/bin/pg_upgrade/.gitignore +++ b/src/bin/pg_upgrade/.gitignore @@ -4,5 +4,7 @@ /delete_old_cluster.sh /analyze_new_cluster.bat /delete_old_cluster.bat +/reindex_hash.sql +/loadable_libraries.txt /log/ /tmp_check/ diff --git a/src/bin/pg_upgrade/Makefile b/src/bin/pg_upgrade/Makefile index 88232887081..d252e08d37a 100644 --- a/src/bin/pg_upgrade/Makefile +++ b/src/bin/pg_upgrade/Makefile @@ -32,12 +32,12 @@ uninstall: clean distclean maintainer-clean: rm -f pg_upgrade$(X) $(OBJS) rm -rf analyze_new_cluster.sh delete_old_cluster.sh log/ tmp_check/ \ + loadable_libraries.txt reindex_hash.sql \ pg_upgrade_dump_globals.sql \ pg_upgrade_dump_*.custom pg_upgrade_*.log check: test.sh all MAKE=$(MAKE) bindir=$(bindir) libdir=$(libdir) EXTRA_REGRESS_OPTS="$(EXTRA_REGRESS_OPTS)" $(SHELL) $< --install -# disabled because it upsets the build farm -#installcheck: test.sh -# MAKE=$(MAKE) bindir=$(bindir) libdir=$(libdir) $(SHELL) $< +# installcheck is not supported because there's no meaningful way to test +# pg_upgrade against a single already-running server diff --git a/src/bin/pg_upgrade/TESTING b/src/bin/pg_upgrade/TESTING index 4ecfc5798e0..6831f679f66 100644 --- a/src/bin/pg_upgrade/TESTING +++ b/src/bin/pg_upgrade/TESTING @@ -1,3 +1,30 @@ +THE SHORT VERSION +----------------- + +On non-Windows machines, you can execute the testing process +described below by running + make check +in this directory. This will run the shell script test.sh, performing +an upgrade from the version in this source tree to a new instance of +the same version. + +To test an upgrade from a different version, you must have a built +source tree for the old version as well as this version, and you +must have done "make install" for both versions. Then do: + +export oldsrc=...somewhere/postgresql (old version's source tree) +export oldbindir=...otherversion/bin (old version's installed bin dir) +export bindir=...thisversion/bin (this version's installed bin dir) +export libdir=...thisversion/lib (this version's installed lib dir) +sh test.sh + +In this case, you will have to manually eyeball the resulting dump +diff for version-specific differences, as explained below. + + +DETAILS +------- + The most effective way to test pg_upgrade, aside from testing on user data, is by upgrading the PostgreSQL regression database. @@ -7,7 +34,7 @@ specific to each major version of Postgres. Here are the steps needed to create a regression database dump file: -1) Create and populate the regression database in the old cluster +1) Create and populate the regression database in the old cluster. This database can be created by running 'make installcheck' from src/test/regression. @@ -60,22 +87,3 @@ steps: 7) Diff the regression database dump file with the regression dump file loaded into the old server. - -The shell script test.sh in this directory performs more or less this -procedure. You can invoke it by running - - make check - -or by running - - make installcheck - -if "make install" (or "make install-world") were done beforehand. -When invoked without arguments, it will run an upgrade from the -version in this source tree to a new instance of the same version. To -test an upgrade from a different version, invoke it like this: - - make installcheck oldbindir=...otherversion/bin oldsrc=...somewhere/postgresql - -In this case, you will have to manually eyeball the resulting dump -diff for version-specific differences, as explained above. diff --git a/src/bin/pg_upgrade/test.sh b/src/bin/pg_upgrade/test.sh index 841da034b09..f4556341f32 100644 --- a/src/bin/pg_upgrade/test.sh +++ b/src/bin/pg_upgrade/test.sh @@ -170,18 +170,32 @@ createdb "$dbname2" || createdb_status=$? createdb "$dbname3" || createdb_status=$? if "$MAKE" -C "$oldsrc" installcheck; then - pg_dumpall --no-sync -f "$temp_root"/dump1.sql || pg_dumpall1_status=$? + oldpgversion=`psql -X -A -t -d regression -c "SHOW server_version_num"` + + # before dumping, get rid of objects not existing in later versions if [ "$newsrc" != "$oldsrc" ]; then - oldpgversion=`psql -X -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);" + fix_sql="DROP FUNCTION public.myfunc(integer); DROP FUNCTION public.oldstyle_length(integer, text);" ;; - 900??) - fix_sql="SET bytea_output TO escape; UPDATE pg_proc SET probin = replace(probin::text, '$oldsrc', '$newsrc')::bytea WHERE probin LIKE '$oldsrc%';" + *) + fix_sql="DROP FUNCTION public.oldstyle_length(integer, text);" ;; - 901??) + esac + psql -X -d regression -c "$fix_sql;" || psql_fix_sql_status=$? + fi + + pg_dumpall --no-sync -f "$temp_root"/dump1.sql || pg_dumpall1_status=$? + + if [ "$newsrc" != "$oldsrc" ]; then + # update references to old source tree's regress.so etc + fix_sql="" + case $oldpgversion in + 804??) + fix_sql="UPDATE pg_proc SET probin = replace(probin::text, '$oldsrc', '$newsrc')::bytea WHERE probin LIKE '$oldsrc%';" + ;; + *) fix_sql="UPDATE pg_proc SET probin = replace(probin, '$oldsrc', '$newsrc') WHERE probin LIKE '$oldsrc%';" ;; esac