Simon Riggs wrote:
> On Wed, 2006-11-01 at 10:06 -0500, Tom Lane wrote:
> > "Simon Riggs" <simon@2ndquadrant.com> writes:
> > > On Tue, 2006-10-31 at 23:51 -0500, Tom Lane wrote:
> > >> With what logging settings? log_duration has rather different behavior
> > >> from what it used to do.
> >
> > > I think it would be useful to have the log results from a test program
> > > in the protocol section,
> >
> > The contents of the postmaster log are surely not part of the FE protocol.
> > Clients can't even see the log without resorting to nonstandard hacks.
>
> OK, can we please put the example from -hackers into the docs,
> somewhere, with particular note of which protocol messages result in
> which logging output?
If people want to know the output, run a program and look at the
postmaster logs. If we document it, we have to keep it current, even if
we improve it later. I will say I had trouble testing this logging
because it requires a C program to use that protocol. Here is the test
program I used.
--
Bruce Momjian bruce@momjian.us
EnterpriseDB http://www.enterprisedb.com
+ If your life is a hard drive, Christ can be your backup. +
/*
* prepare test program
*
* Test the C version of libpq, the PostgreSQL frontend library.
*/
#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"
static void
exit_nicely(PGconn *conn)
{
PQfinish(conn);
exit(1);
}
int
main(int argc, char **argv)
{
const char *conninfo;
PGconn *conn;
PGresult *res;
int nFields;
int i,
j;
const char *val[2];
int types[2];
/*
* If the user supplies a parameter on the command line, use it as the
* conninfo string; otherwise default to setting dbname=postgres and using
* environment variables or defaults for all other connection parameters.
*/
if (argc > 1)
conninfo = argv[1];
else
conninfo = "dbname = postgres";
/* Make a connection to the database */
conn = PQconnectdb(conninfo);
/* Check to see that the backend connection was successfully made */
if (PQstatus(conn) != CONNECTION_OK)
{
fprintf(stderr, "Connection to database failed: %s",
PQerrorMessage(conn));
exit_nicely(conn);
}
res = PQexec(conn, "SET log_min_duration_statement = 0;");
// res = PQexec(conn, "SET log_statement = 'all';");
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
/*
* Should PQclear PGresult whenever it is no longer needed to avoid memory
* leaks
*/
PQclear(res);
/*
* Our test case here involves using a cursor, for which we must be inside
* a transaction block. We could do the whole thing with a single
* PQexec() of "select * from pg_database", but that's too trivial to make
* a good example.
*/
/*
* Fetch rows from pg_database, the system catalog of databases
*/
types[0] = 25;
// types[1] = 23;
res = PQprepare(conn, "sel1", "SELECT $1;", 1, types);
if (PQresultStatus(res) != PGRES_COMMAND_OK)
{
fprintf(stderr, "prepared failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
PQclear(res);
val[0] = "a'b";
val[1] = "9";
res = PQexecPrepared(conn, "sel1", 1, val, NULL, NULL, 0);
if (PQresultStatus(res) != PGRES_TUPLES_OK)
{
fprintf(stderr, "exec failed: %s", PQerrorMessage(conn));
PQclear(res);
exit_nicely(conn);
}
/* first, print out the attribute names */
nFields = PQnfields(res);
for (i = 0; i < nFields; i++)
printf("%-15s", PQfname(res, i));
printf("\n\n");
/* next, print out the rows */
for (i = 0; i < PQntuples(res); i++)
{
for (j = 0; j < nFields; j++)
printf("%-15s", PQgetvalue(res, i, j));
printf("\n");
}
PQclear(res);
/* close the connection to the database and cleanup */
PQfinish(conn);
return 0;
}