Peter Eisentraut wrote:
Tom Lane wrote:
But I think Alvaro is worried about something
at a higher level: the regression test process as a whole has some
directory layout assumptions built into it, particularly in regards
to where to find .so's.

The only information about the location of the .so's is in the test files themselves, which seems reasonable, because they are created and installed at the same time as the .so's that they are presumably supposed to test. So I see no problem here.

Here is a more involved patch that fixes all these issues. The major simplication is that the input files are looked for in both the build tree and the source tree (like a vpath search), which allowed me to remove a lot of redundant makefile code. I could also remove the --srcdir option but added --dlpath to address the above mentioned issue and changed some option defaults. Now you can run pg_regress inside and outside of the build tree. It isn't quite ready for the general public, but a packager that wants to adopt this can use it. Currently, you need to create the directories sql, expected, and testtablespace yourself, when running outside the build tree. We can attempt to sort that out later, but SELinux might make it difficult.
diff -cr -x TAGS ../cvs-pgsql/src/makefiles/pgxs.mk ./src/makefiles/pgxs.mk
*** ../cvs-pgsql/src/makefiles/pgxs.mk  2008-04-07 17:15:58.000000000 +0300
--- ./src/makefiles/pgxs.mk     2008-09-22 20:40:39.000000000 +0300
***************
*** 232,254 ****
  # where to find psql for running the tests
  PSQLDIR = $(bindir)
  
- # When doing a VPATH build, must copy over the test .sql and .out
- # files so that the driver script can find them.  We have to use an
- # absolute path for the targets, because otherwise make will try to
- # locate the missing files using VPATH, and will find them in
- # $(srcdir), but the point here is that we want to copy them from
- # $(srcdir) to the build directory.
- 
- ifdef VPATH
- abs_builddir := $(shell pwd)
- test_files_src := $(wildcard $(srcdir)/sql/*.sql) $(wildcard 
$(srcdir)/expected/*.out) $(wildcard $(srcdir)/data/*.data)
- test_files_build := $(patsubst $(srcdir)/%, $(abs_builddir)/%, 
$(test_files_src))
- 
- all: $(test_files_build)
- $(test_files_build): $(abs_builddir)/%: $(srcdir)/%
-       ln -s $< $@
- endif # VPATH
- 
  .PHONY: submake
  submake:
  ifndef PGXS
--- 232,237 ----
diff -cr -x TAGS ../cvs-pgsql/src/pl/plperl/GNUmakefile 
./src/pl/plperl/GNUmakefile
*** ../cvs-pgsql/src/pl/plperl/GNUmakefile      2008-04-07 17:15:58.000000000 
+0300
--- ./src/pl/plperl/GNUmakefile 2008-09-22 20:29:07.000000000 +0300
***************
*** 50,76 ****
  SPI.c: SPI.xs
        $(PERL) $(perl_privlibexp)/ExtUtils/xsubpp -typemap 
$(perl_privlibexp)/ExtUtils/typemap $< >$@
  
- # When doing a VPATH build, copy over the .sql and .out files so that the
- # test script can find them.  See comments in src/test/regress/GNUmakefile.
- ifdef VPATH
- 
- ifneq ($(PORTNAME),win32)
- abs_srcdir := $(shell cd $(srcdir) && pwd)
- abs_builddir := $(shell pwd)
- else
- abs_srcdir := $(shell cd $(srcdir) && pwd -W)
- abs_builddir := $(shell pwd -W)
- endif
- 
- test_files_src := $(wildcard $(srcdir)/sql/*.sql) $(wildcard 
$(srcdir)/expected/*.out)
- test_files_build := $(patsubst $(srcdir)/%, $(abs_builddir)/%, 
$(test_files_src))
- 
- all: $(test_files_build)
- $(test_files_build): $(abs_builddir)/%: $(srcdir)/%
-       ln -s $< $@
- 
- endif
- 
  install: all installdirs install-lib
  
  installdirs: installdirs-lib
--- 50,55 ----
diff -cr -x TAGS ../cvs-pgsql/src/pl/plpython/Makefile 
./src/pl/plpython/Makefile
*** ../cvs-pgsql/src/pl/plpython/Makefile       2008-04-07 17:15:58.000000000 
+0300
--- ./src/pl/plpython/Makefile  2008-09-22 20:30:40.000000000 +0300
***************
*** 66,92 ****
  
  all: all-lib
  
- # When doing a VPATH build, copy over the .sql and .out files so that the
- # test script can find them.  See comments in src/test/regress/GNUmakefile.
- ifdef VPATH
- 
- ifneq ($(PORTNAME),win32)
- abs_srcdir := $(shell cd $(srcdir) && pwd)
- abs_builddir := $(shell pwd)
- else
- abs_srcdir := $(shell cd $(srcdir) && pwd -W)
- abs_builddir := $(shell pwd -W)
- endif
- 
- test_files_src := $(wildcard $(srcdir)/sql/*.sql) $(wildcard 
$(srcdir)/expected/*.out)
- test_files_build := $(patsubst $(srcdir)/%, $(abs_builddir)/%, 
$(test_files_src))
- 
- all: $(test_files_build)
- $(test_files_build): $(abs_builddir)/%: $(srcdir)/%
-       ln -s $< $@
- 
- endif
- 
  install: all installdirs install-lib
  
  installdirs: installdirs-lib
--- 66,71 ----
diff -cr -x TAGS ../cvs-pgsql/src/pl/tcl/Makefile ./src/pl/tcl/Makefile
*** ../cvs-pgsql/src/pl/tcl/Makefile    2008-04-07 17:15:58.000000000 +0300
--- ./src/pl/tcl/Makefile       2008-09-22 20:31:13.000000000 +0300
***************
*** 49,75 ****
  all: all-lib
        $(MAKE) -C modules $@
  
- # When doing a VPATH build, copy over the .sql and .out files so that the
- # test script can find them.  See comments in src/test/regress/GNUmakefile.
- ifdef VPATH
- 
- ifneq ($(PORTNAME),win32)
- abs_srcdir := $(shell cd $(srcdir) && pwd)
- abs_builddir := $(shell pwd)
- else
- abs_srcdir := $(shell cd $(srcdir) && pwd -W)
- abs_builddir := $(shell pwd -W)
- endif
- 
- test_files_src := $(wildcard $(srcdir)/sql/*.sql) $(wildcard 
$(srcdir)/expected/*.out)
- test_files_build := $(patsubst $(srcdir)/%, $(abs_builddir)/%, 
$(test_files_src))
- 
- all: $(test_files_build)
- $(test_files_build): $(abs_builddir)/%: $(srcdir)/%
-       ln -s $< $@
- 
- endif
- 
  install: all installdirs install-lib
        $(MAKE) -C modules $@
  
--- 49,54 ----
diff -cr -x TAGS ../cvs-pgsql/src/test/regress/GNUmakefile 
./src/test/regress/GNUmakefile
*** ../cvs-pgsql/src/test/regress/GNUmakefile   2008-05-30 03:04:32.000000000 
+0300
--- ./src/test/regress/GNUmakefile      2008-09-22 19:57:57.000000000 +0300
***************
*** 65,73 ****
  $(top_builddir)/src/port/pg_config_paths.h: 
$(top_builddir)/src/Makefile.global
        $(MAKE) -C $(top_builddir)/src/port pg_config_paths.h
  
! install: pg_regress$(X)
        $(INSTALL_PROGRAM) pg_regress$(X) 
'$(DESTDIR)$(pgxsdir)/$(subdir)/pg_regress$(X)'
  
  uninstall:
        rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/pg_regress$(X)'
  
--- 65,76 ----
  $(top_builddir)/src/port/pg_config_paths.h: 
$(top_builddir)/src/Makefile.global
        $(MAKE) -C $(top_builddir)/src/port pg_config_paths.h
  
! install: all installdirs
        $(INSTALL_PROGRAM) pg_regress$(X) 
'$(DESTDIR)$(pgxsdir)/$(subdir)/pg_regress$(X)'
  
+ installdirs:
+       $(mkinstalldirs) '$(DESTDIR)$(pgxsdir)/$(subdir)'
+ 
  uninstall:
        rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/pg_regress$(X)'
  
***************
*** 83,116 ****
  
  # Test input and expected files.  These are created by pg_regress itself, so 
we
  # don't have a rule to create them.  We do need rules to clean them however.
! ifile_list := $(subst .source,, $(notdir $(wildcard 
$(top_srcdir)/$(subdir)/input/*.source)))
! input_files  := $(foreach file, $(ifile_list), sql/$(file).sql)
! ofile_list := $(subst .source,, $(notdir $(wildcard 
$(top_srcdir)/$(subdir)/output/*.source)))
! output_files := $(foreach file, $(ofile_list), expected/$(file).out)
! 
! ifneq ($(PORTNAME),win32)
! abs_srcdir := $(shell cd $(srcdir) && pwd)
! abs_builddir := $(shell pwd)
! else
! abs_srcdir := $(shell cd $(srcdir) && pwd -W)
! abs_builddir := $(shell pwd -W)
! endif
! 
! # When doing a VPATH build, copy over the remaining .sql and .out
! # files so that the driver script can find them.  We have to use an
! # absolute path for the targets, because otherwise make will try to
! # locate the missing files using VPATH, and will find them in
! # $(srcdir), but the point here is that we want to copy them from
! # $(srcdir) to the build directory.
! 
! ifdef VPATH
! remaining_files_src := $(wildcard $(srcdir)/sql/*.sql) $(wildcard 
$(srcdir)/expected/*.out) $(srcdir)/resultmap
! remaining_files_build := $(patsubst $(srcdir)/%, $(abs_builddir)/%, 
$(remaining_files_src))
! 
! all: $(remaining_files_build)
! $(remaining_files_build): $(abs_builddir)/%: $(srcdir)/%
!       ln -s $< $@
! endif
  
  
  # Get some extra C modules from contrib/spi...
--- 86,113 ----
  
  # Test input and expected files.  These are created by pg_regress itself, so 
we
  # don't have a rule to create them.  We do need rules to clean them however.
! input_files = $(patsubst $(srcdir)/input/%.source,sql/%.sql, $(wildcard 
$(srcdir)/input/*.source))
! output_files := $(patsubst $(srcdir)/output/%.source,expected/%.out, 
$(wildcard $(srcdir)/output/*.source))
! 
! 
! # not installed by default
! 
! regress_data_files = \
!       $(filter-out $(addprefix $(srcdir)/,$(output_files)),$(wildcard 
$(srcdir)/expected/*.out)) \
!       $(wildcard $(srcdir)/input/*.source) \
!       $(wildcard $(srcdir)/output/*.source) \
!       $(filter-out $(addprefix $(srcdir)/,$(input_files)),$(wildcard 
$(srcdir)/sql/*.sql)) \
!       $(wildcard $(srcdir)/data/*.data) \
!       $(srcdir)/parallel_schedule $(srcdir)/serial_schedule 
$(srcdir)/resultmap
! 
! install-tests: all install install-lib installdirs-tests
!       $(MAKE) -C $(top_builddir)/contrib/spi install
!       for file in $(regress_data_files); do \
!         $(INSTALL_DATA) $$file '$(DESTDIR)$(pkglibdir)/regress/'$$file; \
!       done
! 
! installdirs-tests: installdirs
!       $(mkinstalldirs)  $(patsubst 
$(srcdir)/%/,'$(DESTDIR)$(pkglibdir)/regress/%',$(sort $(dir 
$(regress_data_files))))
  
  
  # Get some extra C modules from contrib/spi...
***************
*** 144,157 ****
  ## Run tests
  ##
  
  check: all
!       ./pg_regress --temp-install=./tmp_check --top-builddir=$(top_builddir) 
--srcdir=$(abs_srcdir) --temp-port=$(TEMP_PORT) 
--schedule=$(srcdir)/parallel_schedule --multibyte=$(MULTIBYTE) 
--load-language=plpgsql $(MAXCONNOPT) $(NOLOCALE) $(TEMP_CONF)
  
  installcheck: all
!       ./pg_regress --psqldir=$(PSQLDIR) --schedule=$(srcdir)/serial_schedule 
--srcdir=$(abs_srcdir) --multibyte=$(MULTIBYTE) --load-language=plpgsql 
$(NOLOCALE)
  
  installcheck-parallel: all
!       ./pg_regress --psqldir=$(PSQLDIR) 
--schedule=$(srcdir)/parallel_schedule --srcdir=$(abs_srcdir) 
--multibyte=$(MULTIBYTE) --load-language=plpgsql $(MAXCONNOPT) $(NOLOCALE)
  
  
  # old interfaces follow...
--- 141,156 ----
  ## Run tests
  ##
  
+ pg_regress_call = ./pg_regress --inputdir=$(srcdir) --dlpath=. 
--multibyte=$(MULTIBYTE) --load-language=plpgsql $(NOLOCALE)
+ 
  check: all
!       $(pg_regress_call) --temp-install=./tmp_check 
--top-builddir=$(top_builddir) --temp-port=$(TEMP_PORT) 
--schedule=$(srcdir)/parallel_schedule $(MAXCONNOPT) $(TEMP_CONF)
  
  installcheck: all
!       $(pg_regress_call) --psqldir=$(PSQLDIR) 
--schedule=$(srcdir)/serial_schedule
  
  installcheck-parallel: all
!       $(pg_regress_call) --psqldir=$(PSQLDIR) 
--schedule=$(srcdir)/parallel_schedule $(MAXCONNOPT)
  
  
  # old interfaces follow...
***************
*** 161,170 ****
  runtest-parallel: installcheck-parallel
  
  bigtest: all
!       ./pg_regress --psqldir=$(PSQLDIR) --schedule=$(srcdir)/serial_schedule 
--srcdir=$(abs_srcdir) --multibyte=$(MULTIBYTE) --load-language=plpgsql 
$(NOLOCALE) numeric_big 
  
  bigcheck: all
!       ./pg_regress --temp-install=./tmp_check --top-builddir=$(top_builddir) 
--srcdir=$(abs_srcdir) --temp-port=$(TEMP_PORT) 
--schedule=$(srcdir)/parallel_schedule --multibyte=$(MULTIBYTE) 
--load-language=plpgsql $(MAXCONNOPT) $(NOLOCALE) numeric_big
  
  
  ##
--- 160,169 ----
  runtest-parallel: installcheck-parallel
  
  bigtest: all
!       $(pg_regress_call) --psqldir=$(PSQLDIR) 
--schedule=$(srcdir)/serial_schedule numeric_big 
  
  bigcheck: all
!       $(pg_regress_call) --temp-install=./tmp_check 
--top-builddir=$(top_builddir) --temp-port=$(TEMP_PORT) 
--schedule=$(srcdir)/parallel_schedule $(MAXCONNOPT) numeric_big
  
  
  ##
***************
*** 173,187 ****
  
  clean distclean maintainer-clean: clean-lib
  # things built by `all' target
!       rm -f $(OBJS) refint$(DLSUFFIX) autoinc$(DLSUFFIX)
!       rm -f $(output_files) $(input_files) pg_regress_main.o pg_regress.o 
pg_regress$(X)
  # things created by various check targets
        rm -rf testtablespace
        rm -rf results tmp_check log
        rm -f regression.diffs regression.out regress.out run_check.out
- ifeq ($(PORTNAME), cygwin)
-       rm -f regress.def
- endif
- ifdef VPATH
-       rm -f $(remaining_files_build)
- endif
--- 172,180 ----
  
  clean distclean maintainer-clean: clean-lib
  # things built by `all' target
!       rm -f $(OBJS) refint$(DLSUFFIX) autoinc$(DLSUFFIX) pg_regress_main.o 
pg_regress.o pg_regress$(X)
  # things created by various check targets
+       rm -f $(output_files) $(input_files)
        rm -rf testtablespace
        rm -rf results tmp_check log
        rm -f regression.diffs regression.out regress.out run_check.out
diff -cr -x TAGS ../cvs-pgsql/src/test/regress/input/create_function_1.source 
./src/test/regress/input/create_function_1.source
*** ../cvs-pgsql/src/test/regress/input/create_function_1.source        
2008-05-30 03:04:32.000000000 +0300
--- ./src/test/regress/input/create_function_1.source   2008-09-22 
12:08:46.000000000 +0300
***************
*** 4,55 ****
  
  CREATE FUNCTION widget_in(cstring)
     RETURNS widget
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  
  CREATE FUNCTION widget_out(widget)
     RETURNS cstring
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  
  CREATE FUNCTION int44in(cstring)
     RETURNS city_budget
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  
  CREATE FUNCTION int44out(city_budget)
     RETURNS cstring
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  
  CREATE FUNCTION check_primary_key ()
        RETURNS trigger
!       AS '@abs_builddir@/[EMAIL PROTECTED]@'
        LANGUAGE C;
  
  CREATE FUNCTION check_foreign_key ()
        RETURNS trigger
!       AS '@abs_builddir@/[EMAIL PROTECTED]@'
        LANGUAGE C;
  
  CREATE FUNCTION autoinc ()
        RETURNS trigger
!       AS '@abs_builddir@/[EMAIL PROTECTED]@'
        LANGUAGE C;
  
  CREATE FUNCTION funny_dup17 ()
          RETURNS trigger
!         AS '@abs_builddir@/[EMAIL PROTECTED]@'
          LANGUAGE C;
  
  CREATE FUNCTION ttdummy ()
          RETURNS trigger
!         AS '@abs_builddir@/[EMAIL PROTECTED]@'
          LANGUAGE C;
  
  CREATE FUNCTION set_ttdummy (int4)
          RETURNS int4
!         AS '@abs_builddir@/[EMAIL PROTECTED]@'
          LANGUAGE C STRICT;
  
  -- Things that shouldn't work:
--- 4,55 ----
  
  CREATE FUNCTION widget_in(cstring)
     RETURNS widget
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  
  CREATE FUNCTION widget_out(widget)
     RETURNS cstring
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  
  CREATE FUNCTION int44in(cstring)
     RETURNS city_budget
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  
  CREATE FUNCTION int44out(city_budget)
     RETURNS cstring
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  
  CREATE FUNCTION check_primary_key ()
        RETURNS trigger
!       AS '@libdir@/[EMAIL PROTECTED]@'
        LANGUAGE C;
  
  CREATE FUNCTION check_foreign_key ()
        RETURNS trigger
!       AS '@libdir@/[EMAIL PROTECTED]@'
        LANGUAGE C;
  
  CREATE FUNCTION autoinc ()
        RETURNS trigger
!       AS '@libdir@/[EMAIL PROTECTED]@'
        LANGUAGE C;
  
  CREATE FUNCTION funny_dup17 ()
          RETURNS trigger
!         AS '@libdir@/[EMAIL PROTECTED]@'
          LANGUAGE C;
  
  CREATE FUNCTION ttdummy ()
          RETURNS trigger
!         AS '@libdir@/[EMAIL PROTECTED]@'
          LANGUAGE C;
  
  CREATE FUNCTION set_ttdummy (int4)
          RETURNS int4
!         AS '@libdir@/[EMAIL PROTECTED]@'
          LANGUAGE C STRICT;
  
  -- Things that shouldn't work:
***************
*** 73,79 ****
      AS 'nosuchfile';
  
  CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C
!     AS '@abs_builddir@/[EMAIL PROTECTED]@', 'nosuchsymbol';
  
  CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal
      AS 'nosuch';
--- 73,79 ----
      AS 'nosuchfile';
  
  CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C
!     AS '@libdir@/[EMAIL PROTECTED]@', 'nosuchsymbol';
  
  CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal
      AS 'nosuch';
diff -cr -x TAGS ../cvs-pgsql/src/test/regress/input/create_function_2.source 
./src/test/regress/input/create_function_2.source
*** ../cvs-pgsql/src/test/regress/input/create_function_2.source        
2006-02-27 18:09:50.000000000 +0200
--- ./src/test/regress/input/create_function_2.source   2008-09-22 
12:09:34.000000000 +0300
***************
*** 36,71 ****
  
  CREATE FUNCTION pt_in_widget(point, widget)
     RETURNS bool
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  
  CREATE FUNCTION overpaid(emp)
     RETURNS bool
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  
  CREATE FUNCTION boxarea(box)
     RETURNS float8
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  
  CREATE FUNCTION interpt_pp(path, path)
     RETURNS point
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  
  CREATE FUNCTION reverse_name(name)
     RETURNS name
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  
  CREATE FUNCTION oldstyle_length(int4, text)
     RETURNS int4
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  
  --
  -- Function dynamic loading
  --
! LOAD '@abs_builddir@/[EMAIL PROTECTED]@';
  
--- 36,71 ----
  
  CREATE FUNCTION pt_in_widget(point, widget)
     RETURNS bool
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  
  CREATE FUNCTION overpaid(emp)
     RETURNS bool
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  
  CREATE FUNCTION boxarea(box)
     RETURNS float8
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  
  CREATE FUNCTION interpt_pp(path, path)
     RETURNS point
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  
  CREATE FUNCTION reverse_name(name)
     RETURNS name
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  
  CREATE FUNCTION oldstyle_length(int4, text)
     RETURNS int4
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  
  --
  -- Function dynamic loading
  --
! LOAD '@libdir@/[EMAIL PROTECTED]@';
  
diff -cr -x TAGS ../cvs-pgsql/src/test/regress/output/create_function_1.source 
./src/test/regress/output/create_function_1.source
*** ../cvs-pgsql/src/test/regress/output/create_function_1.source       
2008-09-02 15:11:11.000000000 +0300
--- ./src/test/regress/output/create_function_1.source  2008-09-22 
12:13:59.000000000 +0300
***************
*** 3,51 ****
  --
  CREATE FUNCTION widget_in(cstring)
     RETURNS widget
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  NOTICE:  type "widget" is not yet defined
  DETAIL:  Creating a shell type definition.
  CREATE FUNCTION widget_out(widget)
     RETURNS cstring
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  NOTICE:  argument type widget is only a shell
  CREATE FUNCTION int44in(cstring)
     RETURNS city_budget
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  NOTICE:  type "city_budget" is not yet defined
  DETAIL:  Creating a shell type definition.
  CREATE FUNCTION int44out(city_budget)
     RETURNS cstring
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  NOTICE:  argument type city_budget is only a shell
  CREATE FUNCTION check_primary_key ()
        RETURNS trigger
!       AS '@abs_builddir@/[EMAIL PROTECTED]@'
        LANGUAGE C;
  CREATE FUNCTION check_foreign_key ()
        RETURNS trigger
!       AS '@abs_builddir@/[EMAIL PROTECTED]@'
        LANGUAGE C;
  CREATE FUNCTION autoinc ()
        RETURNS trigger
!       AS '@abs_builddir@/[EMAIL PROTECTED]@'
        LANGUAGE C;
  CREATE FUNCTION funny_dup17 ()
          RETURNS trigger
!         AS '@abs_builddir@/[EMAIL PROTECTED]@'
          LANGUAGE C;
  CREATE FUNCTION ttdummy ()
          RETURNS trigger
!         AS '@abs_builddir@/[EMAIL PROTECTED]@'
          LANGUAGE C;
  CREATE FUNCTION set_ttdummy (int4)
          RETURNS int4
!         AS '@abs_builddir@/[EMAIL PROTECTED]@'
          LANGUAGE C STRICT;
  -- Things that shouldn't work:
  CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
--- 3,51 ----
  --
  CREATE FUNCTION widget_in(cstring)
     RETURNS widget
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  NOTICE:  type "widget" is not yet defined
  DETAIL:  Creating a shell type definition.
  CREATE FUNCTION widget_out(widget)
     RETURNS cstring
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  NOTICE:  argument type widget is only a shell
  CREATE FUNCTION int44in(cstring)
     RETURNS city_budget
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  NOTICE:  type "city_budget" is not yet defined
  DETAIL:  Creating a shell type definition.
  CREATE FUNCTION int44out(city_budget)
     RETURNS cstring
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C STRICT;
  NOTICE:  argument type city_budget is only a shell
  CREATE FUNCTION check_primary_key ()
        RETURNS trigger
!       AS '@libdir@/[EMAIL PROTECTED]@'
        LANGUAGE C;
  CREATE FUNCTION check_foreign_key ()
        RETURNS trigger
!       AS '@libdir@/[EMAIL PROTECTED]@'
        LANGUAGE C;
  CREATE FUNCTION autoinc ()
        RETURNS trigger
!       AS '@libdir@/[EMAIL PROTECTED]@'
        LANGUAGE C;
  CREATE FUNCTION funny_dup17 ()
          RETURNS trigger
!         AS '@libdir@/[EMAIL PROTECTED]@'
          LANGUAGE C;
  CREATE FUNCTION ttdummy ()
          RETURNS trigger
!         AS '@libdir@/[EMAIL PROTECTED]@'
          LANGUAGE C;
  CREATE FUNCTION set_ttdummy (int4)
          RETURNS int4
!         AS '@libdir@/[EMAIL PROTECTED]@'
          LANGUAGE C STRICT;
  -- Things that shouldn't work:
  CREATE FUNCTION test1 (int) RETURNS int LANGUAGE SQL
***************
*** 75,82 ****
      AS 'nosuchfile';
  ERROR:  could not access file "nosuchfile": No such file or directory
  CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C
!     AS '@abs_builddir@/[EMAIL PROTECTED]@', 'nosuchsymbol';
! ERROR:  could not find function "nosuchsymbol" in file "@abs_builddir@/[EMAIL 
PROTECTED]@"
  CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal
      AS 'nosuch';
  ERROR:  there is no built-in function named "nosuch"
--- 75,82 ----
      AS 'nosuchfile';
  ERROR:  could not access file "nosuchfile": No such file or directory
  CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C
!     AS '@libdir@/[EMAIL PROTECTED]@', 'nosuchsymbol';
! ERROR:  could not find function "nosuchsymbol" in file "@libdir@/[EMAIL 
PROTECTED]@"
  CREATE FUNCTION test1 (int) RETURNS int LANGUAGE internal
      AS 'nosuch';
  ERROR:  there is no built-in function named "nosuch"
diff -cr -x TAGS ../cvs-pgsql/src/test/regress/output/create_function_2.source 
./src/test/regress/output/create_function_2.source
*** ../cvs-pgsql/src/test/regress/output/create_function_2.source       
2006-02-27 18:09:50.000000000 +0200
--- ./src/test/regress/output/create_function_2.source  2008-09-22 
12:13:30.000000000 +0300
***************
*** 29,57 ****
     LANGUAGE SQL;
  CREATE FUNCTION pt_in_widget(point, widget)
     RETURNS bool
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  CREATE FUNCTION overpaid(emp)
     RETURNS bool
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  CREATE FUNCTION boxarea(box)
     RETURNS float8
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  CREATE FUNCTION interpt_pp(path, path)
     RETURNS point
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  CREATE FUNCTION reverse_name(name)
     RETURNS name
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  CREATE FUNCTION oldstyle_length(int4, text)
     RETURNS int4
!    AS '@abs_builddir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  --
  -- Function dynamic loading
  --
! LOAD '@abs_builddir@/[EMAIL PROTECTED]@';
--- 29,57 ----
     LANGUAGE SQL;
  CREATE FUNCTION pt_in_widget(point, widget)
     RETURNS bool
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  CREATE FUNCTION overpaid(emp)
     RETURNS bool
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  CREATE FUNCTION boxarea(box)
     RETURNS float8
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  CREATE FUNCTION interpt_pp(path, path)
     RETURNS point
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  CREATE FUNCTION reverse_name(name)
     RETURNS name
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  CREATE FUNCTION oldstyle_length(int4, text)
     RETURNS int4
!    AS '@libdir@/[EMAIL PROTECTED]@'
     LANGUAGE C;
  --
  -- Function dynamic loading
  --
! LOAD '@libdir@/[EMAIL PROTECTED]@';
diff -cr -x TAGS ../cvs-pgsql/src/test/regress/pg_regress.c 
./src/test/regress/pg_regress.c
*** ../cvs-pgsql/src/test/regress/pg_regress.c  2008-08-05 08:16:08.000000000 
+0300
--- ./src/test/regress/pg_regress.c     2008-09-22 21:01:20.000000000 +0300
***************
*** 47,52 ****
--- 47,56 ----
   * out where "make install" will put stuff under the temp_install directory.
   * In non-temp_install mode, the only thing we need is the location of psql,
   * which we expect to find in psqldir, or in the PATH if psqldir isn't given.
+  *
+  * XXX Because pg_regress is not installed in bindir, we can't support
+  * this for relocatable trees as it is.  --psqldir would need to be
+  * specified in those cases.
   */
  char     *bindir = PGBINDIR;
  char     *libdir = LIBDIR;
***************
*** 70,76 ****
  bool          debug = false;
  char     *inputdir = ".";
  char     *outputdir = ".";
! char     *psqldir = NULL;
  static _stringlist *loadlanguage = NULL;
  static int    max_connections = 0;
  static char *encoding = NULL;
--- 74,80 ----
  bool          debug = false;
  char     *inputdir = ".";
  char     *outputdir = ".";
! char     *psqldir = PGBINDIR;
  static _stringlist *loadlanguage = NULL;
  static int    max_connections = 0;
  static char *encoding = NULL;
***************
*** 83,90 ****
  static bool nolocale = false;
  static char *hostname = NULL;
  static int    port = -1;
  static char *user = NULL;
- static char *srcdir = NULL;
  static _stringlist *extraroles = NULL;
  
  /* internal variables */
--- 87,94 ----
  static bool nolocale = false;
  static char *hostname = NULL;
  static int    port = -1;
+ static char *dlpath = PKGLIBDIR;
  static char *user = NULL;
  static _stringlist *extraroles = NULL;
  
  /* internal variables */
***************
*** 391,400 ****
   * the given suffix.
   */
  static void
! convert_sourcefiles_in(char *source, char *dest, char *suffix)
  {
-       char            abs_srcdir[MAXPGPATH];
-       char            abs_builddir[MAXPGPATH];
        char            testtablespace[MAXPGPATH];
        char            indir[MAXPGPATH];
        struct stat     st;
--- 395,402 ----
   * the given suffix.
   */
  static void
! convert_sourcefiles_in(char *source_subdir, char *dest_subdir, char *suffix)
  {
        char            testtablespace[MAXPGPATH];
        char            indir[MAXPGPATH];
        struct stat     st;
***************
*** 403,429 ****
        char      **names;
        int                     count = 0;
  
! #ifdef WIN32
!       char       *c;
! #endif
! 
!       if (!getcwd(abs_builddir, sizeof(abs_builddir)))
!       {
!               fprintf(stderr, _("%s: could not get current directory: %s\n"),
!                               progname, strerror(errno));
!               exit_nicely(2);
!       }
! 
!       /*
!        * in a VPATH build, use the provided source directory; otherwise, use 
the
!        * current directory.
!        */
!       if (srcdir)
!               strlcpy(abs_srcdir, srcdir, MAXPGPATH);
!       else
!               strlcpy(abs_srcdir, abs_builddir, MAXPGPATH);
! 
!       snprintf(indir, MAXPGPATH, "%s/%s", abs_srcdir, source);
  
        /* Check that indir actually exists and is a directory */
        ret = stat(indir, &st);
--- 405,411 ----
        char      **names;
        int                     count = 0;
  
!       snprintf(indir, MAXPGPATH, "%s/%s", inputdir, source_subdir);
  
        /* Check that indir actually exists and is a directory */
        ret = stat(indir, &st);
***************
*** 441,457 ****
                /* Error logged in pgfnames */
                exit_nicely(2);
  
! #ifdef WIN32
!       /* in Win32, replace backslashes with forward slashes */
!       for (c = abs_builddir; *c; c++)
!               if (*c == '\\')
!                       *c = '/';
!       for (c = abs_srcdir; *c; c++)
!               if (*c == '\\')
!                       *c = '/';
! #endif
! 
!       snprintf(testtablespace, MAXPGPATH, "%s/testtablespace", abs_builddir);
  
  #ifdef WIN32
        /*
--- 423,429 ----
                /* Error logged in pgfnames */
                exit_nicely(2);
  
!       snprintf(testtablespace, MAXPGPATH, "%s/testtablespace", outputdir);
  
  #ifdef WIN32
        /*
***************
*** 490,496 ****
                /* build the full actual paths to open */
                snprintf(prefix, strlen(*name) - 6, "%s", *name);
                snprintf(srcfile, MAXPGPATH, "%s/%s", indir, *name);
!               snprintf(destfile, MAXPGPATH, "%s/%s.%s", dest, prefix, suffix);
  
                infile = fopen(srcfile, "r");
                if (!infile)
--- 462,468 ----
                /* build the full actual paths to open */
                snprintf(prefix, strlen(*name) - 6, "%s", *name);
                snprintf(srcfile, MAXPGPATH, "%s/%s", indir, *name);
!               snprintf(destfile, MAXPGPATH, "%s/%s.%s", dest_subdir, prefix, 
suffix);
  
                infile = fopen(srcfile, "r");
                if (!infile)
***************
*** 508,516 ****
                }
                while (fgets(line, sizeof(line), infile))
                {
!                       replace_string(line, "@abs_srcdir@", abs_srcdir);
!                       replace_string(line, "@abs_builddir@", abs_builddir);
                        replace_string(line, "@testtablespace@", 
testtablespace);
                        replace_string(line, "@DLSUFFIX@", DLSUFFIX);
                        fputs(line, outfile);
                }
--- 480,489 ----
                }
                while (fgets(line, sizeof(line), infile))
                {
!                       replace_string(line, "@abs_srcdir@", inputdir);
!                       replace_string(line, "@abs_builddir@", outputdir);
                        replace_string(line, "@testtablespace@", 
testtablespace);
+                       replace_string(line, "@libdir@", dlpath);
                        replace_string(line, "@DLSUFFIX@", DLSUFFIX);
                        fputs(line, outfile);
                }
***************
*** 520,526 ****
  
        /*
         * If we didn't process any files, complain because it probably means
!        * somebody neglected to pass the needed --srcdir argument.
         */
        if (count <= 0)
        {
--- 493,499 ----
  
        /*
         * If we didn't process any files, complain because it probably means
!        * somebody neglected to pass the needed --inputdir argument.
         */
        if (count <= 0)
        {
***************
*** 1087,1093 ****
        return l;
  }
  
! static bool
  file_exists(const char *file)
  {
        FILE       *f = fopen(file, "r");
--- 1060,1066 ----
        return l;
  }
  
! bool
  file_exists(const char *file)
  {
        FILE       *f = fopen(file, "r");
***************
*** 1792,1797 ****
--- 1765,1798 ----
        }
  }
  
+ static char *
+ make_absolute_path(const char *in)
+ {
+       char *result;
+ 
+       if (is_absolute_path(in))
+               result = strdup(in);
+       else
+       {
+               static char             cwdbuf[MAXPGPATH];
+ 
+               if (!cwdbuf[0])
+               {
+                       if (!getcwd(cwdbuf, sizeof(cwdbuf)))
+                       {
+                               fprintf(stderr, _("could not get current 
working directory: %s\n"), strerror(errno));
+                               exit_nicely(2);
+                       }
+               }
+ 
+               result = malloc(strlen(cwdbuf) + strlen(in) + 2);
+               sprintf(result, "%s/%s", cwdbuf, in);
+       }
+ 
+       canonicalize_path(result);
+       return result;
+ }
+ 
  static void
  help(void)
  {
***************
*** 1812,1818 ****
        printf(_("  --outputdir=DIR           place output files in DIR 
(default \".\")\n"));
        printf(_("  --schedule=FILE           use test ordering schedule from 
FILE\n"));
        printf(_("                            (can be used multiple times to 
concatenate)\n"));
!       printf(_("  --srcdir=DIR              absolute path to source directory 
(for VPATH builds)\n"));
        printf(_("  --temp-install=DIR        create a temporary installation 
in DIR\n"));
        printf(_("\n"));
        printf(_("Options for \"temp-install\" mode:\n"));
--- 1813,1819 ----
        printf(_("  --outputdir=DIR           place output files in DIR 
(default \".\")\n"));
        printf(_("  --schedule=FILE           use test ordering schedule from 
FILE\n"));
        printf(_("                            (can be used multiple times to 
concatenate)\n"));
!       printf(_("  --dlpath=DIR              look for dynamic libraries in 
DIR\n"));
        printf(_("  --temp-install=DIR        create a temporary installation 
in DIR\n"));
        printf(_("\n"));
        printf(_("Options for \"temp-install\" mode:\n"));
***************
*** 1861,1867 ****
                {"port", required_argument, NULL, 14},
                {"user", required_argument, NULL, 15},
                {"psqldir", required_argument, NULL, 16},
!               {"srcdir", required_argument, NULL, 17},
                {"create-role", required_argument, NULL, 18},
                {"temp-config", required_argument, NULL, 19},
                {NULL, 0, NULL, 0}
--- 1862,1868 ----
                {"port", required_argument, NULL, 14},
                {"user", required_argument, NULL, 15},
                {"psqldir", required_argument, NULL, 16},
!               {"dlpath", required_argument, NULL, 17},
                {"create-role", required_argument, NULL, 18},
                {"temp-config", required_argument, NULL, 19},
                {NULL, 0, NULL, 0}
***************
*** 1922,1943 ****
                                add_stringlist_item(&schedulelist, optarg);
                                break;
                        case 9:
!                               /* temp_install must be absolute path */
!                               if (is_absolute_path(optarg))
!                                       temp_install = strdup(optarg);
!                               else
!                               {
!                                       char            cwdbuf[MAXPGPATH];
! 
!                                       if (!getcwd(cwdbuf, sizeof(cwdbuf)))
!                                       {
!                                               fprintf(stderr, _("could not 
get current working directory: %s\n"), strerror(errno));
!                                               exit_nicely(2);
!                                       }
!                                       temp_install = malloc(strlen(cwdbuf) + 
strlen(optarg) + 2);
!                                       sprintf(temp_install, "%s/%s", cwdbuf, 
optarg);
!                               }
!                               canonicalize_path(temp_install);
                                break;
                        case 10:
                                nolocale = true;
--- 1923,1929 ----
                                add_stringlist_item(&schedulelist, optarg);
                                break;
                        case 9:
!                               temp_install = make_absolute_path(optarg);
                                break;
                        case 10:
                                nolocale = true;
***************
*** 1969,1975 ****
                                        psqldir = strdup(optarg);
                                break;
                        case 17:
!                               srcdir = strdup(optarg);
                                break;
                        case 18:
                                split_to_stringlist(strdup(optarg), ", ", 
&extraroles);
--- 1955,1961 ----
                                        psqldir = strdup(optarg);
                                break;
                        case 17:
!                               dlpath = strdup(optarg);
                                break;
                        case 18:
                                split_to_stringlist(strdup(optarg), ", ", 
&extraroles);
***************
*** 1997,2002 ****
--- 1983,1992 ----
        if (temp_install)
                port = temp_port;
  
+       inputdir = make_absolute_path(inputdir);
+       outputdir = make_absolute_path(outputdir);
+       dlpath = make_absolute_path(dlpath);
+ 
        /*
         * Initialization
         */
diff -cr -x TAGS ../cvs-pgsql/src/test/regress/pg_regress.h 
./src/test/regress/pg_regress.h
*** ../cvs-pgsql/src/test/regress/pg_regress.h  2008-01-01 21:46:00.000000000 
+0200
--- ./src/test/regress/pg_regress.h     2008-09-20 19:24:29.000000000 +0300
***************
*** 57,59 ****
--- 57,60 ----
  PID_TYPE      spawn_process(const char *cmdline);
  void          exit_nicely(int code);
  void          replace_string(char *string, char *replace, char *replacement);
+ bool          file_exists(const char *file);
diff -cr -x TAGS ../cvs-pgsql/src/test/regress/pg_regress_main.c 
./src/test/regress/pg_regress_main.c
*** ../cvs-pgsql/src/test/regress/pg_regress_main.c     2008-01-01 
21:46:00.000000000 +0200
--- ./src/test/regress/pg_regress_main.c        2008-09-21 19:23:08.000000000 
+0300
***************
*** 34,45 ****
        char            expectfile[MAXPGPATH];
        char            psql_cmd[MAXPGPATH * 3];
  
        snprintf(infile, sizeof(infile), "%s/sql/%s.sql",
!                        inputdir, testname);
        snprintf(outfile, sizeof(outfile), "%s/results/%s.out",
                         outputdir, testname);
        snprintf(expectfile, sizeof(expectfile), "%s/expected/%s.out",
!                        inputdir, testname);
  
        add_stringlist_item(resultfiles, outfile);
        add_stringlist_item(expectfiles, expectfile);
--- 34,59 ----
        char            expectfile[MAXPGPATH];
        char            psql_cmd[MAXPGPATH * 3];
  
+       /*
+        * Look for files in the output dir first, consistent with a vpath
+        * search.  This is mainly to create more reasonable error
+        * messages if the file is not found.  It also allows local test
+        * overrides when running pg_regress outside of the source tree.
+        */
        snprintf(infile, sizeof(infile), "%s/sql/%s.sql",
!                        outputdir, testname);
!       if (!file_exists(infile))
!               snprintf(infile, sizeof(infile), "%s/sql/%s.sql",
!                                inputdir, testname);
! 
        snprintf(outfile, sizeof(outfile), "%s/results/%s.out",
                         outputdir, testname);
+ 
        snprintf(expectfile, sizeof(expectfile), "%s/expected/%s.out",
!                        outputdir, testname);
!       if (!file_exists(expectfile))
!               snprintf(expectfile, sizeof(expectfile), "%s/expected/%s.out",
!                                inputdir, testname);
  
        add_stringlist_item(resultfiles, outfile);
        add_stringlist_item(expectfiles, expectfile);
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to