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.
|
|
|
|
*
|
2020-01-01 18:21:45 +01:00
|
|
|
* Portions Copyright (c) 1996-2020, 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"
|
|
|
|
|
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,
|
2014-05-06 18:12:18 +02:00
|
|
|
_stringlist **resultfiles,
|
|
|
|
_stringlist **expectfiles,
|
|
|
|
_stringlist **tags)
|
2007-06-12 13:07:34 +02:00
|
|
|
{
|
|
|
|
PID_TYPE pid;
|
|
|
|
char infile[MAXPGPATH];
|
|
|
|
char outfile[MAXPGPATH];
|
|
|
|
char expectfile[MAXPGPATH];
|
|
|
|
char psql_cmd[MAXPGPATH * 3];
|
2011-01-24 02:44:48 +01:00
|
|
|
size_t offset = 0;
|
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
|
|
|
/*
|
2009-06-11 16:49:15 +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.
|
2008-10-02 00:38:57 +02:00
|
|
|
*/
|
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",
|
2008-10-02 00:38:57 +02:00
|
|
|
outputdir, testname);
|
|
|
|
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);
|
|
|
|
|
2011-01-24 02:44:48 +01:00
|
|
|
if (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
|
|
|
{
|
2011-01-24 02:44:48 +01:00
|
|
|
offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset,
|
|
|
|
"%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
|
|
|
if (offset >= sizeof(psql_cmd))
|
|
|
|
{
|
|
|
|
fprintf(stderr, _("command too long\n"));
|
|
|
|
exit(2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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.
|
|
|
|
*/
|
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
|
|
|
offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset,
|
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
|
|
|
"\"%s%spsql\" -X -a -q -d \"%s\" -v %s < \"%s\" > \"%s\" 2>&1",
|
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
|
|
|
bindir ? bindir : "",
|
|
|
|
bindir ? "/" : "",
|
|
|
|
dblist->str,
|
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
|
|
|
"HIDE_TABLEAM=\"on\"",
|
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
|
|
|
infile,
|
|
|
|
outfile);
|
|
|
|
if (offset >= sizeof(psql_cmd))
|
|
|
|
{
|
|
|
|
fprintf(stderr, _("command too long\n"));
|
|
|
|
exit(2);
|
|
|
|
}
|
2011-01-24 02:44:48 +01:00
|
|
|
|
2016-09-30 18:00:00 +02:00
|
|
|
appnameenv = psprintf("PGAPPNAME=pg_regress/%s", testname);
|
|
|
|
putenv(appnameenv);
|
|
|
|
|
2007-06-12 13:07:34 +02:00
|
|
|
pid = spawn_process(psql_cmd);
|
|
|
|
|
|
|
|
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");
|
|
|
|
free(appnameenv);
|
|
|
|
|
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[])
|
|
|
|
{
|
|
|
|
return regression_main(argc, argv, psql_init, psql_start_test);
|
|
|
|
}
|