2007-06-12 13:07:34 +02:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
|
|
|
* pg_regress_main --- regression test for the main backend
|
|
|
|
*
|
|
|
|
* This is a C implementation of the previous shell script for running
|
|
|
|
* the regression tests, and should be mostly compatible with it.
|
|
|
|
* Initial author of C translation: Magnus Hagander
|
|
|
|
*
|
|
|
|
* This code is released under the terms of the PostgreSQL License.
|
|
|
|
*
|
2024-01-04 02:49:05 +01:00
|
|
|
* Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
|
2007-06-12 13:07:34 +02:00
|
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
|
|
*
|
2010-09-20 22:08:53 +02:00
|
|
|
* src/test/regress/pg_regress_main.c
|
2007-06-12 13:07:34 +02:00
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
|
2017-03-09 02:41:06 +01:00
|
|
|
#include "postgres_fe.h"
|
|
|
|
|
2024-02-11 09:08:35 +01:00
|
|
|
#include "lib/stringinfo.h"
|
2007-06-12 13:07:34 +02:00
|
|
|
#include "pg_regress.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* start a psql test process for specified file (including redirection),
|
|
|
|
* and return process ID
|
|
|
|
*/
|
|
|
|
static PID_TYPE
|
|
|
|
psql_start_test(const char *testname,
|
|
|
|
_stringlist **resultfiles,
|
|
|
|
_stringlist **expectfiles,
|
|
|
|
_stringlist **tags)
|
|
|
|
{
|
|
|
|
PID_TYPE pid;
|
|
|
|
char infile[MAXPGPATH];
|
|
|
|
char outfile[MAXPGPATH];
|
|
|
|
char expectfile[MAXPGPATH];
|
2024-02-11 09:08:35 +01:00
|
|
|
StringInfoData psql_cmd;
|
2016-09-30 18:00:00 +02:00
|
|
|
char *appnameenv;
|
2007-06-12 13:07:34 +02:00
|
|
|
|
2008-10-02 00:38:57 +02:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
2007-06-12 13:07:34 +02:00
|
|
|
snprintf(infile, sizeof(infile), "%s/sql/%s.sql",
|
2008-10-02 00:38:57 +02:00
|
|
|
outputdir, testname);
|
|
|
|
if (!file_exists(infile))
|
|
|
|
snprintf(infile, sizeof(infile), "%s/sql/%s.sql",
|
|
|
|
inputdir, testname);
|
|
|
|
|
2007-06-12 13:07:34 +02:00
|
|
|
snprintf(outfile, sizeof(outfile), "%s/results/%s.out",
|
|
|
|
outputdir, testname);
|
2008-10-02 00:38:57 +02:00
|
|
|
|
2007-06-12 13:07:34 +02:00
|
|
|
snprintf(expectfile, sizeof(expectfile), "%s/expected/%s.out",
|
2024-03-15 17:02:07 +01:00
|
|
|
expecteddir, testname);
|
2008-10-02 00:38:57 +02:00
|
|
|
if (!file_exists(expectfile))
|
|
|
|
snprintf(expectfile, sizeof(expectfile), "%s/expected/%s.out",
|
|
|
|
inputdir, testname);
|
2007-06-12 13:07:34 +02:00
|
|
|
|
|
|
|
add_stringlist_item(resultfiles, outfile);
|
|
|
|
add_stringlist_item(expectfiles, expectfile);
|
|
|
|
|
2024-02-11 09:08:35 +01:00
|
|
|
initStringInfo(&psql_cmd);
|
|
|
|
|
2011-01-24 02:44:48 +01:00
|
|
|
if (launcher)
|
2024-02-11 09:08:35 +01:00
|
|
|
appendStringInfo(&psql_cmd, "%s ", launcher);
|
Clean up assorted misuses of snprintf()'s result value.
Fix a small number of places that were testing the result of snprintf()
but doing so incorrectly. The right test for buffer overrun, per C99,
is "result >= bufsize" not "result > bufsize". Some places were also
checking for failure with "result == -1", but the standard only says
that a negative value is delivered on failure.
(Note that this only makes these places correct if snprintf() delivers
C99-compliant results. But at least now these places are consistent
with all the other places where we assume that.)
Also, make psql_start_test() and isolation_start_test() check for
buffer overrun while constructing their shell commands. There seems
like a higher risk of overrun, with more severe consequences, here
than there is for the individual file paths that are made elsewhere
in the same functions, so this seemed like a worthwhile change.
Also fix guc.c's do_serialize() to initialize errno = 0 before
calling vsnprintf. In principle, this should be unnecessary because
vsnprintf should have set errno if it returns a failure indication ...
but the other two places this coding pattern is cribbed from don't
assume that, so let's be consistent.
These errors are all very old, so back-patch as appropriate. I think
that only the shell command overrun cases are even theoretically
reachable in practice, but there's not much point in erroneous error
checks.
Discussion: https://postgr.es/m/17245.1534289329@sss.pgh.pa.us
2018-08-15 22:29:31 +02:00
|
|
|
|
tableam: introduce table AM infrastructure.
This introduces the concept of table access methods, i.e. CREATE
ACCESS METHOD ... TYPE TABLE and
CREATE TABLE ... USING (storage-engine).
No table access functionality is delegated to table AMs as of this
commit, that'll be done in following commits.
Subsequent commits will incrementally abstract table access
functionality to be routed through table access methods. That change
is too large to be reviewed & committed at once, so it'll be done
incrementally.
Docs will be updated at the end, as adding them incrementally would
likely make them less coherent, and definitely is a lot more work,
without a lot of benefit.
Table access methods are specified similar to index access methods,
i.e. pg_am.amhandler returns, as INTERNAL, a pointer to a struct with
callbacks. In contrast to index AMs that struct needs to live as long
as a backend, typically that's achieved by just returning a pointer to
a constant struct.
Psql's \d+ now displays a table's access method. That can be disabled
with HIDE_TABLEAM=true, which is mainly useful so regression tests can
be run against different AMs. It's quite possible that this behaviour
still needs to be fine tuned.
For now it's not allowed to set a table AM for a partitioned table, as
we've not resolved how partitions would inherit that. Disallowing
allows us to introduce, if we decide that's the way forward, such a
behaviour without a compatibility break.
Catversion bumped, to add the heap table AM and references to it.
Author: Haribabu Kommi, Andres Freund, Alvaro Herrera, Dimitri Golgov and others
Discussion:
https://postgr.es/m/20180703070645.wchpu5muyto5n647@alap3.anarazel.de
https://postgr.es/m/20160812231527.GA690404@alvherre.pgsql
https://postgr.es/m/20190107235616.6lur25ph22u5u5av@alap3.anarazel.de
https://postgr.es/m/20190304234700.w5tmhducs5wxgzls@alap3.anarazel.de
2019-03-06 18:54:38 +01:00
|
|
|
/*
|
|
|
|
* Use HIDE_TABLEAM to hide different AMs to allow to use regression tests
|
|
|
|
* against different AMs without unnecessary differences.
|
|
|
|
*/
|
2024-02-11 09:08:35 +01:00
|
|
|
appendStringInfo(&psql_cmd,
|
|
|
|
"\"%s%spsql\" -X -a -q -d \"%s\" %s < \"%s\" > \"%s\" 2>&1",
|
|
|
|
bindir ? bindir : "",
|
|
|
|
bindir ? "/" : "",
|
|
|
|
dblist->str,
|
|
|
|
"-v HIDE_TABLEAM=on -v HIDE_TOAST_COMPRESSION=on",
|
|
|
|
infile,
|
|
|
|
outfile);
|
2011-01-24 02:44:48 +01:00
|
|
|
|
Use setenv() in preference to putenv().
Since at least 2001 we've used putenv() and avoided setenv(), on the
grounds that the latter was unportable and not in POSIX. However,
POSIX added it that same year, and by now the situation has reversed:
setenv() is probably more portable than putenv(), since POSIX now
treats the latter as not being a core function. And setenv() has
cleaner semantics too. So, let's reverse that old policy.
This commit adds a simple src/port/ implementation of setenv() for
any stragglers (we have one in the buildfarm, but I'd not be surprised
if that code is never used in the field). More importantly, extend
win32env.c to also support setenv(). Then, replace usages of putenv()
with setenv(), and get rid of some ad-hoc implementations of setenv()
wannabees.
Also, adjust our src/port/ implementation of unsetenv() to follow the
POSIX spec that it returns an error indicator, rather than returning
void as per the ancient BSD convention. I don't feel a need to make
all the call sites check for errors, but the portability stub ought
to match real-world practice.
Discussion: https://postgr.es/m/2065122.1609212051@sss.pgh.pa.us
2020-12-30 18:55:59 +01:00
|
|
|
appnameenv = psprintf("pg_regress/%s", testname);
|
|
|
|
setenv("PGAPPNAME", appnameenv, 1);
|
|
|
|
free(appnameenv);
|
2016-09-30 18:00:00 +02:00
|
|
|
|
2024-02-11 09:08:35 +01:00
|
|
|
pid = spawn_process(psql_cmd.data);
|
2007-06-12 13:07:34 +02:00
|
|
|
|
|
|
|
if (pid == INVALID_PID)
|
|
|
|
{
|
|
|
|
fprintf(stderr, _("could not start process for test %s\n"),
|
|
|
|
testname);
|
2012-01-02 21:08:04 +01:00
|
|
|
exit(2);
|
2007-06-12 13:07:34 +02:00
|
|
|
}
|
|
|
|
|
2016-09-30 18:00:00 +02:00
|
|
|
unsetenv("PGAPPNAME");
|
|
|
|
|
2024-02-11 09:08:35 +01:00
|
|
|
pfree(psql_cmd.data);
|
|
|
|
|
2007-06-12 13:07:34 +02:00
|
|
|
return pid;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2013-11-08 20:40:41 +01:00
|
|
|
psql_init(int argc, char **argv)
|
2007-06-12 13:07:34 +02:00
|
|
|
{
|
|
|
|
/* set default regression database name */
|
|
|
|
add_stringlist_item(&dblist, "regression");
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
main(int argc, char *argv[])
|
|
|
|
{
|
2021-01-11 19:43:19 +01:00
|
|
|
return regression_main(argc, argv,
|
|
|
|
psql_init,
|
|
|
|
psql_start_test,
|
|
|
|
NULL /* no postfunc needed */ );
|
2007-06-12 13:07:34 +02:00
|
|
|
}
|