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