Use extensible buffers to assemble command lines
This makes use of StringInfo to assemble command lines, instead of using fixed-size buffers and the (remote) possibility of "command too long" errors. Also makes the code a bit simpler. This covers the test driver programs pg_regress and pg_isolation_regress. Similar to the changes done for pg_rewind in a33e17f210. Discussion: https://www.postgresql.org/message-id/2be4fee5-738f-4749-b9f8-b452032c7ade%40eisentraut.org
This commit is contained in:
parent
4697454686
commit
e70abd67c3
@ -12,6 +12,7 @@
|
||||
|
||||
#include "postgres_fe.h"
|
||||
|
||||
#include "lib/stringinfo.h"
|
||||
#include "pg_regress.h"
|
||||
|
||||
char saved_argv0[MAXPGPATH];
|
||||
@ -34,8 +35,7 @@ isolation_start_test(const char *testname,
|
||||
char infile[MAXPGPATH];
|
||||
char outfile[MAXPGPATH];
|
||||
char expectfile[MAXPGPATH];
|
||||
char psql_cmd[MAXPGPATH * 3];
|
||||
size_t offset = 0;
|
||||
StringInfoData psql_cmd;
|
||||
char *appnameenv;
|
||||
|
||||
/* need to do the path lookup here, check isolation_init() for details */
|
||||
@ -75,34 +75,23 @@ isolation_start_test(const char *testname,
|
||||
add_stringlist_item(resultfiles, outfile);
|
||||
add_stringlist_item(expectfiles, expectfile);
|
||||
|
||||
if (launcher)
|
||||
{
|
||||
offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset,
|
||||
"%s ", launcher);
|
||||
if (offset >= sizeof(psql_cmd))
|
||||
{
|
||||
fprintf(stderr, _("command too long\n"));
|
||||
exit(2);
|
||||
}
|
||||
}
|
||||
initStringInfo(&psql_cmd);
|
||||
|
||||
offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset,
|
||||
"\"%s\" \"dbname=%s\" < \"%s\" > \"%s\" 2>&1",
|
||||
isolation_exec,
|
||||
dblist->str,
|
||||
infile,
|
||||
outfile);
|
||||
if (offset >= sizeof(psql_cmd))
|
||||
{
|
||||
fprintf(stderr, _("command too long\n"));
|
||||
exit(2);
|
||||
}
|
||||
if (launcher)
|
||||
appendStringInfo(&psql_cmd, "%s ", launcher);
|
||||
|
||||
appendStringInfo(&psql_cmd,
|
||||
"\"%s\" \"dbname=%s\" < \"%s\" > \"%s\" 2>&1",
|
||||
isolation_exec,
|
||||
dblist->str,
|
||||
infile,
|
||||
outfile);
|
||||
|
||||
appnameenv = psprintf("isolation/%s", testname);
|
||||
setenv("PGAPPNAME", appnameenv, 1);
|
||||
free(appnameenv);
|
||||
|
||||
pid = spawn_process(psql_cmd);
|
||||
pid = spawn_process(psql_cmd.data);
|
||||
|
||||
if (pid == INVALID_PID)
|
||||
{
|
||||
@ -113,6 +102,8 @@ isolation_start_test(const char *testname,
|
||||
|
||||
unsetenv("PGAPPNAME");
|
||||
|
||||
pfree(psql_cmd.data);
|
||||
|
||||
return pid;
|
||||
}
|
||||
|
||||
|
@ -18,6 +18,7 @@
|
||||
|
||||
#include "postgres_fe.h"
|
||||
|
||||
#include "lib/stringinfo.h"
|
||||
#include "pg_regress.h"
|
||||
|
||||
/*
|
||||
@ -34,8 +35,7 @@ psql_start_test(const char *testname,
|
||||
char infile[MAXPGPATH];
|
||||
char outfile[MAXPGPATH];
|
||||
char expectfile[MAXPGPATH];
|
||||
char psql_cmd[MAXPGPATH * 3];
|
||||
size_t offset = 0;
|
||||
StringInfoData psql_cmd;
|
||||
char *appnameenv;
|
||||
|
||||
/*
|
||||
@ -62,40 +62,29 @@ psql_start_test(const char *testname,
|
||||
add_stringlist_item(resultfiles, outfile);
|
||||
add_stringlist_item(expectfiles, expectfile);
|
||||
|
||||
initStringInfo(&psql_cmd);
|
||||
|
||||
if (launcher)
|
||||
{
|
||||
offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset,
|
||||
"%s ", launcher);
|
||||
if (offset >= sizeof(psql_cmd))
|
||||
{
|
||||
fprintf(stderr, _("command too long\n"));
|
||||
exit(2);
|
||||
}
|
||||
}
|
||||
appendStringInfo(&psql_cmd, "%s ", launcher);
|
||||
|
||||
/*
|
||||
* Use HIDE_TABLEAM to hide different AMs to allow to use regression tests
|
||||
* against different AMs without unnecessary differences.
|
||||
*/
|
||||
offset += snprintf(psql_cmd + offset, sizeof(psql_cmd) - offset,
|
||||
"\"%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);
|
||||
if (offset >= sizeof(psql_cmd))
|
||||
{
|
||||
fprintf(stderr, _("command too long\n"));
|
||||
exit(2);
|
||||
}
|
||||
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);
|
||||
|
||||
appnameenv = psprintf("pg_regress/%s", testname);
|
||||
setenv("PGAPPNAME", appnameenv, 1);
|
||||
free(appnameenv);
|
||||
|
||||
pid = spawn_process(psql_cmd);
|
||||
pid = spawn_process(psql_cmd.data);
|
||||
|
||||
if (pid == INVALID_PID)
|
||||
{
|
||||
@ -106,6 +95,8 @@ psql_start_test(const char *testname,
|
||||
|
||||
unsetenv("PGAPPNAME");
|
||||
|
||||
pfree(psql_cmd.data);
|
||||
|
||||
return pid;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user