mirror of
https://github.com/postgres/postgres.git
synced 2025-04-29 13:56:47 +03:00
Fix some libpq_pipeline test problems
Test pipeline_abort was not checking that it got the rows it expected in one mode; make it do so. This doesn't fix the actual problem (no idea what that is, yet) but at least it should make it more obvious rather than being visible only as a difference in the trace output. While at it, fix other infelicities in the test: * I reversed the order of result vs. expected in like(). * The output traces from -t are being put in the log dir, which means the buildfarm script uselessly captures them. Put them in a separate dir tmp_check/traces instead, to avoid cluttering the buildfarm results. * Test pipelined_insert was using too large a row count. Reduce that a tad and add a filler column to make each insert a little bulkier, while still keeping enough that a buffer is filled and we have to switch mode.
This commit is contained in:
parent
b12bd4869b
commit
db973ffb3c
@ -45,12 +45,16 @@ char *tracefile = NULL; /* path to PQtrace() file */
|
|||||||
static const char *const drop_table_sql =
|
static const char *const drop_table_sql =
|
||||||
"DROP TABLE IF EXISTS pq_pipeline_demo";
|
"DROP TABLE IF EXISTS pq_pipeline_demo";
|
||||||
static const char *const create_table_sql =
|
static const char *const create_table_sql =
|
||||||
"CREATE UNLOGGED TABLE pq_pipeline_demo(id serial primary key, itemno integer);";
|
"CREATE UNLOGGED TABLE pq_pipeline_demo(id serial primary key, itemno integer,"
|
||||||
|
"int8filler int8);";
|
||||||
static const char *const insert_sql =
|
static const char *const insert_sql =
|
||||||
"INSERT INTO pq_pipeline_demo(itemno) VALUES ($1);";
|
"INSERT INTO pq_pipeline_demo(itemno) VALUES ($1)";
|
||||||
|
static const char *const insert_sql2 =
|
||||||
|
"INSERT INTO pq_pipeline_demo(itemno,int8filler) VALUES ($1, $2)";
|
||||||
|
|
||||||
/* max char length of an int32, plus sign and null terminator */
|
/* max char length of an int32/64, plus sign and null terminator */
|
||||||
#define MAXINTLEN 12
|
#define MAXINTLEN 12
|
||||||
|
#define MAXINT8LEN 20
|
||||||
|
|
||||||
static void
|
static void
|
||||||
exit_nicely(PGconn *conn)
|
exit_nicely(PGconn *conn)
|
||||||
@ -243,6 +247,7 @@ test_pipeline_abort(PGconn *conn)
|
|||||||
const char *dummy_params[1] = {"1"};
|
const char *dummy_params[1] = {"1"};
|
||||||
Oid dummy_param_oids[1] = {INT4OID};
|
Oid dummy_param_oids[1] = {INT4OID};
|
||||||
int i;
|
int i;
|
||||||
|
int gotrows;
|
||||||
bool goterror;
|
bool goterror;
|
||||||
|
|
||||||
fprintf(stderr, "aborted pipeline... ");
|
fprintf(stderr, "aborted pipeline... ");
|
||||||
@ -441,12 +446,14 @@ test_pipeline_abort(PGconn *conn)
|
|||||||
pg_fatal("pipeline sync failed: %s", PQerrorMessage(conn));
|
pg_fatal("pipeline sync failed: %s", PQerrorMessage(conn));
|
||||||
PQsetSingleRowMode(conn);
|
PQsetSingleRowMode(conn);
|
||||||
goterror = false;
|
goterror = false;
|
||||||
|
gotrows = 0;
|
||||||
while ((res = PQgetResult(conn)) != NULL)
|
while ((res = PQgetResult(conn)) != NULL)
|
||||||
{
|
{
|
||||||
switch (PQresultStatus(res))
|
switch (PQresultStatus(res))
|
||||||
{
|
{
|
||||||
case PGRES_SINGLE_TUPLE:
|
case PGRES_SINGLE_TUPLE:
|
||||||
printf("got row: %s\n", PQgetvalue(res, 0, 0));
|
printf("got row: %s\n", PQgetvalue(res, 0, 0));
|
||||||
|
gotrows++;
|
||||||
break;
|
break;
|
||||||
case PGRES_FATAL_ERROR:
|
case PGRES_FATAL_ERROR:
|
||||||
if (strcmp(PQresultErrorField(res, PG_DIAG_SQLSTATE), "22012") != 0)
|
if (strcmp(PQresultErrorField(res, PG_DIAG_SQLSTATE), "22012") != 0)
|
||||||
@ -463,6 +470,8 @@ test_pipeline_abort(PGconn *conn)
|
|||||||
}
|
}
|
||||||
if (!goterror)
|
if (!goterror)
|
||||||
pg_fatal("did not get division-by-zero error");
|
pg_fatal("did not get division-by-zero error");
|
||||||
|
if (gotrows != 3)
|
||||||
|
pg_fatal("did not get three rows");
|
||||||
/* the third pipeline sync */
|
/* the third pipeline sync */
|
||||||
if ((res = PQgetResult(conn)) == NULL)
|
if ((res = PQgetResult(conn)) == NULL)
|
||||||
pg_fatal("Unexpected NULL result: %s", PQerrorMessage(conn));
|
pg_fatal("Unexpected NULL result: %s", PQerrorMessage(conn));
|
||||||
@ -534,15 +543,17 @@ enum PipelineInsertStep
|
|||||||
static void
|
static void
|
||||||
test_pipelined_insert(PGconn *conn, int n_rows)
|
test_pipelined_insert(PGconn *conn, int n_rows)
|
||||||
{
|
{
|
||||||
const char *insert_params[1];
|
Oid insert_param_oids[2] = {INT4OID, INT8OID};
|
||||||
Oid insert_param_oids[1] = {INT4OID};
|
const char *insert_params[2];
|
||||||
char insert_param_0[MAXINTLEN];
|
char insert_param_0[MAXINTLEN];
|
||||||
|
char insert_param_1[MAXINT8LEN];
|
||||||
enum PipelineInsertStep send_step = BI_BEGIN_TX,
|
enum PipelineInsertStep send_step = BI_BEGIN_TX,
|
||||||
recv_step = BI_BEGIN_TX;
|
recv_step = BI_BEGIN_TX;
|
||||||
int rows_to_send,
|
int rows_to_send,
|
||||||
rows_to_receive;
|
rows_to_receive;
|
||||||
|
|
||||||
insert_params[0] = &insert_param_0[0];
|
insert_params[0] = insert_param_0;
|
||||||
|
insert_params[1] = insert_param_1;
|
||||||
|
|
||||||
rows_to_send = rows_to_receive = n_rows;
|
rows_to_send = rows_to_receive = n_rows;
|
||||||
|
|
||||||
@ -585,8 +596,8 @@ test_pipelined_insert(PGconn *conn, int n_rows)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Assert(send_step == BI_PREPARE);
|
Assert(send_step == BI_PREPARE);
|
||||||
pg_debug("sending: %s\n", insert_sql);
|
pg_debug("sending: %s\n", insert_sql2);
|
||||||
if (PQsendPrepare(conn, "my_insert", insert_sql, 1, insert_param_oids) != 1)
|
if (PQsendPrepare(conn, "my_insert", insert_sql2, 2, insert_param_oids) != 1)
|
||||||
pg_fatal("dispatching PREPARE failed: %s", PQerrorMessage(conn));
|
pg_fatal("dispatching PREPARE failed: %s", PQerrorMessage(conn));
|
||||||
send_step = BI_INSERT_ROWS;
|
send_step = BI_INSERT_ROWS;
|
||||||
|
|
||||||
@ -712,10 +723,12 @@ test_pipelined_insert(PGconn *conn, int n_rows)
|
|||||||
|
|
||||||
if (send_step == BI_INSERT_ROWS)
|
if (send_step == BI_INSERT_ROWS)
|
||||||
{
|
{
|
||||||
snprintf(&insert_param_0[0], MAXINTLEN, "%d", rows_to_send);
|
snprintf(insert_param_0, MAXINTLEN, "%d", rows_to_send);
|
||||||
|
snprintf(insert_param_1, MAXINT8LEN, "%lld",
|
||||||
|
(long long) rows_to_send);
|
||||||
|
|
||||||
if (PQsendQueryPrepared(conn, "my_insert",
|
if (PQsendQueryPrepared(conn, "my_insert",
|
||||||
1, insert_params, NULL, NULL, 0) == 1)
|
2, insert_params, NULL, NULL, 0) == 1)
|
||||||
{
|
{
|
||||||
pg_debug("sent row %d\n", rows_to_send);
|
pg_debug("sent row %d\n", rows_to_send);
|
||||||
|
|
||||||
|
@ -11,13 +11,15 @@ my $node = get_new_node('main');
|
|||||||
$node->init;
|
$node->init;
|
||||||
$node->start;
|
$node->start;
|
||||||
|
|
||||||
my $numrows = 10000;
|
my $numrows = 700;
|
||||||
$ENV{PATH} = "$ENV{PATH}:" . getcwd();
|
$ENV{PATH} = "$ENV{PATH}:" . getcwd();
|
||||||
|
|
||||||
my ($out, $err) = run_command([ 'libpq_pipeline', 'tests' ]);
|
my ($out, $err) = run_command([ 'libpq_pipeline', 'tests' ]);
|
||||||
die "oops: $err" unless $err eq '';
|
die "oops: $err" unless $err eq '';
|
||||||
my @tests = split(/\s+/, $out);
|
my @tests = split(/\s+/, $out);
|
||||||
|
|
||||||
|
mkdir "$TestLib::tmp_check/traces";
|
||||||
|
|
||||||
for my $testname (@tests)
|
for my $testname (@tests)
|
||||||
{
|
{
|
||||||
my @extraargs = ();
|
my @extraargs = ();
|
||||||
@ -26,7 +28,7 @@ for my $testname (@tests)
|
|||||||
pipeline_abort transaction disallowed_in_pipeline)) > 0;
|
pipeline_abort transaction disallowed_in_pipeline)) > 0;
|
||||||
|
|
||||||
# For a bunch of tests, generate a libpq trace file too.
|
# For a bunch of tests, generate a libpq trace file too.
|
||||||
my $traceout = "$TestLib::log_path/$testname.trace";
|
my $traceout = "$TestLib::tmp_check/traces/$testname.trace";
|
||||||
if ($cmptrace)
|
if ($cmptrace)
|
||||||
{
|
{
|
||||||
push @extraargs, "-t", $traceout;
|
push @extraargs, "-t", $traceout;
|
||||||
@ -52,7 +54,7 @@ for my $testname (@tests)
|
|||||||
$result = slurp_file_eval($traceout);
|
$result = slurp_file_eval($traceout);
|
||||||
next unless $result ne "";
|
next unless $result ne "";
|
||||||
|
|
||||||
is($expected, $result, "$testname trace match");
|
is($result, $expected, "$testname trace match");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,10 +5,10 @@ F 42 Query "DROP TABLE IF EXISTS pq_pipeline_demo"
|
|||||||
B 123 NoticeResponse S "NOTICE" V "NOTICE" C "00000" M "table "pq_pipeline_demo" does not exist, skipping" F "SSSS" L "SSSS" R "SSSS" \x00
|
B 123 NoticeResponse S "NOTICE" V "NOTICE" C "00000" M "table "pq_pipeline_demo" does not exist, skipping" F "SSSS" L "SSSS" R "SSSS" \x00
|
||||||
B 15 CommandComplete "DROP TABLE"
|
B 15 CommandComplete "DROP TABLE"
|
||||||
B 5 ReadyForQuery I
|
B 5 ReadyForQuery I
|
||||||
F 83 Query "CREATE UNLOGGED TABLE pq_pipeline_demo(id serial primary key, itemno integer);"
|
F 99 Query "CREATE UNLOGGED TABLE pq_pipeline_demo(id serial primary key, itemno integer,int8filler int8);"
|
||||||
B 17 CommandComplete "CREATE TABLE"
|
B 17 CommandComplete "CREATE TABLE"
|
||||||
B 5 ReadyForQuery I
|
B 5 ReadyForQuery I
|
||||||
F 61 Parse "" "INSERT INTO pq_pipeline_demo(itemno) VALUES ($1);" 1 NNNN
|
F 60 Parse "" "INSERT INTO pq_pipeline_demo(itemno) VALUES ($1)" 1 NNNN
|
||||||
F 19 Bind "" "" 0 1 1 '1' 1 0
|
F 19 Bind "" "" 0 1 1 '1' 1 0
|
||||||
F 6 Describe P ""
|
F 6 Describe P ""
|
||||||
F 9 Execute "" 0
|
F 9 Execute "" 0
|
||||||
@ -16,12 +16,12 @@ F 39 Parse "" "SELECT no_such_function($1)" 1 NNNN
|
|||||||
F 19 Bind "" "" 0 1 1 '1' 1 0
|
F 19 Bind "" "" 0 1 1 '1' 1 0
|
||||||
F 6 Describe P ""
|
F 6 Describe P ""
|
||||||
F 9 Execute "" 0
|
F 9 Execute "" 0
|
||||||
F 61 Parse "" "INSERT INTO pq_pipeline_demo(itemno) VALUES ($1);" 1 NNNN
|
F 60 Parse "" "INSERT INTO pq_pipeline_demo(itemno) VALUES ($1)" 1 NNNN
|
||||||
F 19 Bind "" "" 0 1 1 '2' 1 0
|
F 19 Bind "" "" 0 1 1 '2' 1 0
|
||||||
F 6 Describe P ""
|
F 6 Describe P ""
|
||||||
F 9 Execute "" 0
|
F 9 Execute "" 0
|
||||||
F 4 Sync
|
F 4 Sync
|
||||||
F 61 Parse "" "INSERT INTO pq_pipeline_demo(itemno) VALUES ($1);" 1 NNNN
|
F 60 Parse "" "INSERT INTO pq_pipeline_demo(itemno) VALUES ($1)" 1 NNNN
|
||||||
F 19 Bind "" "" 0 1 1 '3' 1 0
|
F 19 Bind "" "" 0 1 1 '3' 1 0
|
||||||
F 6 Describe P ""
|
F 6 Describe P ""
|
||||||
F 9 Execute "" 0
|
F 9 Execute "" 0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user