Index: contrib/pg_upgrade/pg_upgrade.c
===================================================================
RCS file: /cvsroot/pgsql/contrib/pg_upgrade/pg_upgrade.c,v
retrieving revision 1.3
diff -c -c -r1.3 pg_upgrade.c
*** contrib/pg_upgrade/pg_upgrade.c 18 May 2010 18:40:51 -0000 1.3
--- contrib/pg_upgrade/pg_upgrade.c 19 May 2010 18:20:03 -0000
***************
*** 164,170 ****
check_ok(ctx);
/*
! * We do freeze after analyze so pg_statistic is also frozen
*/
prep_status(ctx, "Freezing all rows on the new cluster");
exec_prog(ctx, true,
--- 164,173 ----
check_ok(ctx);
/*
! * We do freeze after analyze so pg_statistic is also frozen.
! * template0 is not frozen here, but data rows were frozen by initdb,
! * and we set its datfrozenxid and relfrozenxids later to match the
! * new xid counter later.
*/
prep_status(ctx, "Freezing all rows on the new cluster");
exec_prog(ctx, true,
***************
*** 292,339 ****
set_frozenxids(migratorContext *ctx)
{
int dbnum;
! PGconn *conn;
PGresult *dbres;
int ntups;
prep_status(ctx, "Setting frozenxid counters in new cluster");
! conn = connectToServer(ctx, "template1", CLUSTER_NEW);
/* set pg_database.datfrozenxid */
! PQclear(executeQueryOrDie(ctx, conn,
"UPDATE pg_catalog.pg_database "
! "SET datfrozenxid = '%u' "
! "WHERE datallowconn = true",
ctx->old.controldata.chkpnt_nxtxid));
/* get database names */
! dbres = executeQueryOrDie(ctx, conn,
! "SELECT datname "
! "FROM pg_catalog.pg_database "
! "WHERE datallowconn = true");
! /* free dbres below */
! PQfinish(conn);
ntups = PQntuples(dbres);
for (dbnum = 0; dbnum < ntups; dbnum++)
{
! conn = connectToServer(ctx, PQgetvalue(dbres, dbnum, 0), CLUSTER_NEW);
/* set pg_class.relfrozenxid */
PQclear(executeQueryOrDie(ctx, conn,
"UPDATE pg_catalog.pg_class "
"SET relfrozenxid = '%u' "
/* only heap and TOAST are vacuumed */
! "WHERE relkind = 'r' OR "
! " relkind = 't'",
ctx->old.controldata.chkpnt_nxtxid));
PQfinish(conn);
}
PQclear(dbres);
check_ok(ctx);
}
--- 295,366 ----
set_frozenxids(migratorContext *ctx)
{
int dbnum;
! PGconn *conn, *conn_template1;
PGresult *dbres;
int ntups;
+ int i_datname;
+ int i_datallowconn;
prep_status(ctx, "Setting frozenxid counters in new cluster");
! conn_template1 = connectToServer(ctx, "template1", CLUSTER_NEW);
/* set pg_database.datfrozenxid */
! PQclear(executeQueryOrDie(ctx, conn_template1,
"UPDATE pg_catalog.pg_database "
! "SET datfrozenxid = '%u'",
ctx->old.controldata.chkpnt_nxtxid));
/* get database names */
! dbres = executeQueryOrDie(ctx, conn_template1,
! "SELECT datname, datallowconn "
! "FROM pg_catalog.pg_database");
! i_datname = PQfnumber(dbres, "datname");
! i_datallowconn = PQfnumber(dbres, "datallowconn");
ntups = PQntuples(dbres);
for (dbnum = 0; dbnum < ntups; dbnum++)
{
! char *datname = PQgetvalue(dbres, dbnum, i_datname);
! char *datallowconn= PQgetvalue(dbres, dbnum, i_datallowconn);
!
! /*
! * We must update databases where datallowconn = false, e.g.
! * template0, because autovacuum increments their datfrozenxids and
! * relfrozenxids even if autovacuum is turned off, and even though
! * all the data rows are already frozen To enable this, we
! * temporarily change datallowconn.
! */
! if (strcmp(datallowconn, "f") == 0)
! PQclear(executeQueryOrDie(ctx, conn_template1,
! "UPDATE pg_catalog.pg_database "
! "SET datallowconn = true "
! "WHERE datname = '%s'", datname));
!
! conn = connectToServer(ctx, datname, CLUSTER_NEW);
/* set pg_class.relfrozenxid */
PQclear(executeQueryOrDie(ctx, conn,
"UPDATE pg_catalog.pg_class "
"SET relfrozenxid = '%u' "
/* only heap and TOAST are vacuumed */
! "WHERE relkind IN ('r', 't')",
ctx->old.controldata.chkpnt_nxtxid));
PQfinish(conn);
+
+ /* Reset datallowconn flag */
+ if (strcmp(datallowconn, "f") == 0)
+ PQclear(executeQueryOrDie(ctx, conn_template1,
+ "UPDATE pg_catalog.pg_database "
+ "SET datallowconn = false "
+ "WHERE datname = '%s'", datname));
}
PQclear(dbres);
+ PQfinish(conn_template1);
+
check_ok(ctx);
}