Re: pg_regress inputdir - Mailing list pgsql-hackers

From Peter Eisentraut
Subject Re: pg_regress inputdir
Date
Msg-id 48D7E475.4090002@gmx.net
Whole thread Raw
In response to Re: pg_regress inputdir  (Peter Eisentraut <peter_e@gmx.net>)
List pgsql-hackers
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@/regress@DLSUFFIX@'
     LANGUAGE C STRICT;

  CREATE FUNCTION widget_out(widget)
     RETURNS cstring
!    AS '@abs_builddir@/regress@DLSUFFIX@'
     LANGUAGE C STRICT;

  CREATE FUNCTION int44in(cstring)
     RETURNS city_budget
!    AS '@abs_builddir@/regress@DLSUFFIX@'
     LANGUAGE C STRICT;

  CREATE FUNCTION int44out(city_budget)
     RETURNS cstring
!    AS '@abs_builddir@/regress@DLSUFFIX@'
     LANGUAGE C STRICT;

  CREATE FUNCTION check_primary_key ()
      RETURNS trigger
!     AS '@abs_builddir@/refint@DLSUFFIX@'
      LANGUAGE C;

  CREATE FUNCTION check_foreign_key ()
      RETURNS trigger
!     AS '@abs_builddir@/refint@DLSUFFIX@'
      LANGUAGE C;

  CREATE FUNCTION autoinc ()
      RETURNS trigger
!     AS '@abs_builddir@/autoinc@DLSUFFIX@'
      LANGUAGE C;

  CREATE FUNCTION funny_dup17 ()
          RETURNS trigger
!         AS '@abs_builddir@/regress@DLSUFFIX@'
          LANGUAGE C;

  CREATE FUNCTION ttdummy ()
          RETURNS trigger
!         AS '@abs_builddir@/regress@DLSUFFIX@'
          LANGUAGE C;

  CREATE FUNCTION set_ttdummy (int4)
          RETURNS int4
!         AS '@abs_builddir@/regress@DLSUFFIX@'
          LANGUAGE C STRICT;

  -- Things that shouldn't work:
--- 4,55 ----

  CREATE FUNCTION widget_in(cstring)
     RETURNS widget
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C STRICT;

  CREATE FUNCTION widget_out(widget)
     RETURNS cstring
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C STRICT;

  CREATE FUNCTION int44in(cstring)
     RETURNS city_budget
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C STRICT;

  CREATE FUNCTION int44out(city_budget)
     RETURNS cstring
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C STRICT;

  CREATE FUNCTION check_primary_key ()
      RETURNS trigger
!     AS '@libdir@/refint@DLSUFFIX@'
      LANGUAGE C;

  CREATE FUNCTION check_foreign_key ()
      RETURNS trigger
!     AS '@libdir@/refint@DLSUFFIX@'
      LANGUAGE C;

  CREATE FUNCTION autoinc ()
      RETURNS trigger
!     AS '@libdir@/autoinc@DLSUFFIX@'
      LANGUAGE C;

  CREATE FUNCTION funny_dup17 ()
          RETURNS trigger
!         AS '@libdir@/regress@DLSUFFIX@'
          LANGUAGE C;

  CREATE FUNCTION ttdummy ()
          RETURNS trigger
!         AS '@libdir@/regress@DLSUFFIX@'
          LANGUAGE C;

  CREATE FUNCTION set_ttdummy (int4)
          RETURNS int4
!         AS '@libdir@/regress@DLSUFFIX@'
          LANGUAGE C STRICT;

  -- Things that shouldn't work:
***************
*** 73,79 ****
      AS 'nosuchfile';

  CREATE FUNCTION test1 (int) RETURNS int LANGUAGE C
!     AS '@abs_builddir@/regress@DLSUFFIX@', '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@/regress@DLSUFFIX@', '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@/regress@DLSUFFIX@'
     LANGUAGE C;

  CREATE FUNCTION overpaid(emp)
     RETURNS bool
!    AS '@abs_builddir@/regress@DLSUFFIX@'
     LANGUAGE C;

  CREATE FUNCTION boxarea(box)
     RETURNS float8
!    AS '@abs_builddir@/regress@DLSUFFIX@'
     LANGUAGE C;

  CREATE FUNCTION interpt_pp(path, path)
     RETURNS point
!    AS '@abs_builddir@/regress@DLSUFFIX@'
     LANGUAGE C;

  CREATE FUNCTION reverse_name(name)
     RETURNS name
!    AS '@abs_builddir@/regress@DLSUFFIX@'
     LANGUAGE C;

  CREATE FUNCTION oldstyle_length(int4, text)
     RETURNS int4
!    AS '@abs_builddir@/regress@DLSUFFIX@'
     LANGUAGE C;

  --
  -- Function dynamic loading
  --
! LOAD '@abs_builddir@/regress@DLSUFFIX@';

--- 36,71 ----

  CREATE FUNCTION pt_in_widget(point, widget)
     RETURNS bool
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C;

  CREATE FUNCTION overpaid(emp)
     RETURNS bool
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C;

  CREATE FUNCTION boxarea(box)
     RETURNS float8
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C;

  CREATE FUNCTION interpt_pp(path, path)
     RETURNS point
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C;

  CREATE FUNCTION reverse_name(name)
     RETURNS name
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C;

  CREATE FUNCTION oldstyle_length(int4, text)
     RETURNS int4
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C;

  --
  -- Function dynamic loading
  --
! LOAD '@libdir@/regress@DLSUFFIX@';

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@/regress@DLSUFFIX@'
     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@/regress@DLSUFFIX@'
     LANGUAGE C STRICT;
  NOTICE:  argument type widget is only a shell
  CREATE FUNCTION int44in(cstring)
     RETURNS city_budget
!    AS '@abs_builddir@/regress@DLSUFFIX@'
     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@/regress@DLSUFFIX@'
     LANGUAGE C STRICT;
  NOTICE:  argument type city_budget is only a shell
  CREATE FUNCTION check_primary_key ()
      RETURNS trigger
!     AS '@abs_builddir@/refint@DLSUFFIX@'
      LANGUAGE C;
  CREATE FUNCTION check_foreign_key ()
      RETURNS trigger
!     AS '@abs_builddir@/refint@DLSUFFIX@'
      LANGUAGE C;
  CREATE FUNCTION autoinc ()
      RETURNS trigger
!     AS '@abs_builddir@/autoinc@DLSUFFIX@'
      LANGUAGE C;
  CREATE FUNCTION funny_dup17 ()
          RETURNS trigger
!         AS '@abs_builddir@/regress@DLSUFFIX@'
          LANGUAGE C;
  CREATE FUNCTION ttdummy ()
          RETURNS trigger
!         AS '@abs_builddir@/regress@DLSUFFIX@'
          LANGUAGE C;
  CREATE FUNCTION set_ttdummy (int4)
          RETURNS int4
!         AS '@abs_builddir@/regress@DLSUFFIX@'
          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@/regress@DLSUFFIX@'
     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@/regress@DLSUFFIX@'
     LANGUAGE C STRICT;
  NOTICE:  argument type widget is only a shell
  CREATE FUNCTION int44in(cstring)
     RETURNS city_budget
!    AS '@libdir@/regress@DLSUFFIX@'
     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@/regress@DLSUFFIX@'
     LANGUAGE C STRICT;
  NOTICE:  argument type city_budget is only a shell
  CREATE FUNCTION check_primary_key ()
      RETURNS trigger
!     AS '@libdir@/refint@DLSUFFIX@'
      LANGUAGE C;
  CREATE FUNCTION check_foreign_key ()
      RETURNS trigger
!     AS '@libdir@/refint@DLSUFFIX@'
      LANGUAGE C;
  CREATE FUNCTION autoinc ()
      RETURNS trigger
!     AS '@libdir@/autoinc@DLSUFFIX@'
      LANGUAGE C;
  CREATE FUNCTION funny_dup17 ()
          RETURNS trigger
!         AS '@libdir@/regress@DLSUFFIX@'
          LANGUAGE C;
  CREATE FUNCTION ttdummy ()
          RETURNS trigger
!         AS '@libdir@/regress@DLSUFFIX@'
          LANGUAGE C;
  CREATE FUNCTION set_ttdummy (int4)
          RETURNS int4
!         AS '@libdir@/regress@DLSUFFIX@'
          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@/regress@DLSUFFIX@', 'nosuchsymbol';
! ERROR:  could not find function "nosuchsymbol" in file "@abs_builddir@/regress@DLSUFFIX@"
  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@/regress@DLSUFFIX@', 'nosuchsymbol';
! ERROR:  could not find function "nosuchsymbol" in file "@libdir@/regress@DLSUFFIX@"
  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@/regress@DLSUFFIX@'
     LANGUAGE C;
  CREATE FUNCTION overpaid(emp)
     RETURNS bool
!    AS '@abs_builddir@/regress@DLSUFFIX@'
     LANGUAGE C;
  CREATE FUNCTION boxarea(box)
     RETURNS float8
!    AS '@abs_builddir@/regress@DLSUFFIX@'
     LANGUAGE C;
  CREATE FUNCTION interpt_pp(path, path)
     RETURNS point
!    AS '@abs_builddir@/regress@DLSUFFIX@'
     LANGUAGE C;
  CREATE FUNCTION reverse_name(name)
     RETURNS name
!    AS '@abs_builddir@/regress@DLSUFFIX@'
     LANGUAGE C;
  CREATE FUNCTION oldstyle_length(int4, text)
     RETURNS int4
!    AS '@abs_builddir@/regress@DLSUFFIX@'
     LANGUAGE C;
  --
  -- Function dynamic loading
  --
! LOAD '@abs_builddir@/regress@DLSUFFIX@';
--- 29,57 ----
     LANGUAGE SQL;
  CREATE FUNCTION pt_in_widget(point, widget)
     RETURNS bool
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C;
  CREATE FUNCTION overpaid(emp)
     RETURNS bool
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C;
  CREATE FUNCTION boxarea(box)
     RETURNS float8
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C;
  CREATE FUNCTION interpt_pp(path, path)
     RETURNS point
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C;
  CREATE FUNCTION reverse_name(name)
     RETURNS name
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C;
  CREATE FUNCTION oldstyle_length(int4, text)
     RETURNS int4
!    AS '@libdir@/regress@DLSUFFIX@'
     LANGUAGE C;
  --
  -- Function dynamic loading
  --
! LOAD '@libdir@/regress@DLSUFFIX@';
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);

pgsql-hackers by date:

Previous
From: Simon Riggs
Date:
Subject: Re: get_relation_stats_hook()
Next
From: Heikki Linnakangas
Date:
Subject: Re: FSM patch - performance test