> On Sun, Dec 14, 2014 at 11:43 AM, Tatsuo Ishii <is...@postgresql.org> wrote: >>> If we care enough about that case to attempt the vacuum anyway then we >>> need to do something about the error message; either squelch it or >>> check for the existence of the tables before attempting to >>> vacuum. Since there's no way to squelch in the server logfile, I think >>> checking for the table is the right answer. >> >> Fair enough. I will come up with "checking for table before vacuum" >> approach. > > +1 for this approach.
Here is the patch I promised. Best regards, -- Tatsuo Ishii SRA OSS, Inc. Japan English: http://www.sraoss.co.jp/index_en.php Japanese:http://www.sraoss.co.jp
diff --git a/contrib/pgbench/pgbench.c b/contrib/pgbench/pgbench.c index d69036a..6b07932 100644 --- a/contrib/pgbench/pgbench.c +++ b/contrib/pgbench/pgbench.c @@ -88,6 +88,8 @@ static int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start static int pthread_join(pthread_t th, void **thread_return); #endif +static void executeStatement2(PGconn *con, const char *sql, const char *table); +static bool is_table_exists(PGconn *con, const char *table); /******************************************************************** * some configurable parameters */ @@ -605,6 +607,54 @@ executeStatement(PGconn *con, const char *sql) PQclear(res); } +/* call executeStatement() if table exists */ +static void +executeStatement2(PGconn *con, const char *sql, const char *table) +{ + char buf[1024]; + + snprintf(buf, sizeof(buf)-1, "%s %s", sql, table); + + if (is_table_exists(con, table)) + executeStatement(con, buf); +} + +/* + * Return true if the table exists + */ +static bool +is_table_exists(PGconn *con, const char *table) +{ + PGresult *res; + char buf[1024]; + char *result; + + snprintf(buf, sizeof(buf)-1, "SELECT to_regclass('%s') IS NULL", table); + + res = PQexec(con, buf); + if (PQresultStatus(res) != PGRES_TUPLES_OK) + { + return false; + } + + result = PQgetvalue(res, 0, 0); + + if (result == NULL) + { + PQclear(res); + return false; + } + + if (*result == 't') + { + PQclear(res); + return false; /* table does not exist */ + } + + PQclear(res); + return true; +} + /* set up a connection to the backend */ static PGconn * doConnect(void) @@ -3197,17 +3247,34 @@ main(int argc, char **argv) if (!is_no_vacuum) { - fprintf(stderr, "starting vacuum..."); - executeStatement(con, "vacuum pgbench_branches"); - executeStatement(con, "vacuum pgbench_tellers"); - executeStatement(con, "truncate pgbench_history"); - fprintf(stderr, "end.\n"); + bool msg1 = false; + bool msg2 = false; + + if (is_table_exists(con, "pgbench_branches")) + msg1 = true; + + if (is_table_exists(con, "pgbench_accounts")) + msg2 = true; + + if (msg1) + fprintf(stderr, "starting vacuum..."); + + executeStatement2(con, "vacuum", "pgbench_branches"); + executeStatement2(con, "vacuum", "pgbench_tellers"); + executeStatement2(con, "truncate", "pgbench_history"); + + if (msg1) + fprintf(stderr, "end.\n"); if (do_vacuum_accounts) { - fprintf(stderr, "starting vacuum pgbench_accounts..."); - executeStatement(con, "vacuum analyze pgbench_accounts"); - fprintf(stderr, "end.\n"); + if (msg2) + fprintf(stderr, "starting vacuum pgbench_accounts..."); + + executeStatement2(con, "vacuum analyze", "pgbench_accounts"); + + if (msg2) + fprintf(stderr, "end.\n"); } } PQfinish(con);
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers