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: