*     by PostgreSQL
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.523 2009/02/17 22:32:54 momjian Exp $
+ *       $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.524 2009/02/18 12:07:07 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
                                i_encoding,
                                i_collate,
                                i_ctype,
+                               i_frozenxid,
                                i_tablespace;
        CatalogId       dbCatId;
        DumpId          dbDumpId;
                           *collate,
                           *ctype,
                           *tablespace;
+       uint32          frozenxid;
 
        datname = PQdb(g_conn);
 
                appendPQExpBuffer(dbQry, "SELECT tableoid, oid, "
                                                  "(%s datdba) AS dba, "
                                                  "pg_encoding_to_char(encoding) AS encoding, "
-                                                 "datcollate, datctype, "
+                                                 "datcollate, datctype, datfrozenxid, "
                                                  "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace, "
                                          "shobj_description(oid, 'pg_database') AS description "
 
                appendPQExpBuffer(dbQry, "SELECT tableoid, oid, "
                                                  "(%s datdba) AS dba, "
                                                  "pg_encoding_to_char(encoding) AS encoding, "
-                                                 "NULL AS datcollate, NULL AS datctype, "
+                                                 "NULL AS datcollate, NULL AS datctype, datfrozenxid, "
                                                  "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace, "
                                          "shobj_description(oid, 'pg_database') AS description "
 
                appendPQExpBuffer(dbQry, "SELECT tableoid, oid, "
                                                  "(%s datdba) AS dba, "
                                                  "pg_encoding_to_char(encoding) AS encoding, "
-                                                 "NULL AS datcollate, NULL AS datctype, "
+                                                 "NULL AS datcollate, NULL AS datctype, datfrozenxid, "
                                                  "(SELECT spcname FROM pg_tablespace t WHERE t.oid = dattablespace) AS tablespace "
                                                  "FROM pg_database "
                                                  "WHERE datname = ",
                                                  "(%s datdba) AS dba, "
                                                  "pg_encoding_to_char(encoding) AS encoding, "
                                                  "NULL AS datcollate, NULL AS datctype, "
+                                                 "0 AS datfrozenxid, "
                                                  "NULL AS tablespace "
                                                  "FROM pg_database "
                                                  "WHERE datname = ",
                                                  "(%s datdba) AS dba, "
                                                  "pg_encoding_to_char(encoding) AS encoding, "
                                                  "NULL AS datcollate, NULL AS datctype, "
+                                                 "0 AS datfrozenxid, "
                                                  "NULL AS tablespace "
                                                  "FROM pg_database "
                                                  "WHERE datname = ",
        i_encoding = PQfnumber(res, "encoding");
        i_collate = PQfnumber(res, "datcollate");
        i_ctype = PQfnumber(res, "datctype");
+       i_frozenxid = PQfnumber(res, "datfrozenxid");
        i_tablespace = PQfnumber(res, "tablespace");
 
        dbCatId.tableoid = atooid(PQgetvalue(res, 0, i_tableoid));
        encoding = PQgetvalue(res, 0, i_encoding);
        collate = PQgetvalue(res, 0, i_collate);
        ctype = PQgetvalue(res, 0, i_ctype);
+       frozenxid = atooid(PQgetvalue(res, 0, i_frozenxid));
        tablespace = PQgetvalue(res, 0, i_tablespace);
 
        appendPQExpBuffer(creaQry, "CREATE DATABASE %s WITH TEMPLATE = template0",
                                                  fmtId(tablespace));
        appendPQExpBuffer(creaQry, ";\n");
 
+       if (binary_upgrade)
+       {
+               appendPQExpBuffer(creaQry, "\n-- For binary upgrade, set datfrozenxid.\n");
+               appendPQExpBuffer(creaQry, "UPDATE pg_database\n"
+                                                        "SET datfrozenxid = '%u'\n"
+                                                        "WHERE datname = '%s';\n",
+                                                        frozenxid, datname);
+       }
+       
        appendPQExpBuffer(delQry, "DROP DATABASE %s;\n",
                                          fmtId(datname));
 
        int                     i_relhasindex;
        int                     i_relhasrules;
        int                     i_relhasoids;
+       int                     i_relfrozenxid;
        int                     i_owning_tab;
        int                     i_owning_col;
        int                     i_reltablespace;
                                                  "(%s c.relowner) AS rolname, "
                                                  "c.relchecks, c.relhastriggers, "
                                                  "c.relhasindex, c.relhasrules, c.relhasoids, "
+                                                 "c.relfrozenxid, "
                                                  "d.refobjid AS owning_tab, "
                                                  "d.refobjsubid AS owning_col, "
                                                  "(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, "
                                                  "(%s relowner) AS rolname, "
                                                  "relchecks, (reltriggers <> 0) AS relhastriggers, "
                                                  "relhasindex, relhasrules, relhasoids, "
+                                                 "relfrozenxid, "
                                                  "d.refobjid AS owning_tab, "
                                                  "d.refobjsubid AS owning_col, "
                                                  "(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, "
                                                  "(%s relowner) AS rolname, "
                                                  "relchecks, (reltriggers <> 0) AS relhastriggers, "
                                                  "relhasindex, relhasrules, relhasoids, "
+                                                 "0 AS relfrozenxid, "
                                                  "d.refobjid AS owning_tab, "
                                                  "d.refobjsubid AS owning_col, "
                                                  "(SELECT spcname FROM pg_tablespace t WHERE t.oid = c.reltablespace) AS reltablespace, "
                                                  "(%s relowner) AS rolname, "
                                                  "relchecks, (reltriggers <> 0) AS relhastriggers, "
                                                  "relhasindex, relhasrules, relhasoids, "
+                                                 "0 AS relfrozenxid, "
                                                  "d.refobjid AS owning_tab, "
                                                  "d.refobjsubid AS owning_col, "
                                                  "NULL AS reltablespace, "
                                                  "(%s relowner) AS rolname, "
                                                  "relchecks, (reltriggers <> 0) AS relhastriggers, "
                                                  "relhasindex, relhasrules, relhasoids, "
+                                                 "0 AS relfrozenxid, "
                                                  "NULL::oid AS owning_tab, "
                                                  "NULL::int4 AS owning_col, "
                                                  "NULL AS reltablespace, "
                                                  "relchecks, (reltriggers <> 0) AS relhastriggers, "
                                                  "relhasindex, relhasrules, "
                                                  "'t'::bool AS relhasoids, "
+                                                 "0 AS relfrozenxid, "
                                                  "NULL::oid AS owning_tab, "
                                                  "NULL::int4 AS owning_col, "
                                                  "NULL AS reltablespace, "
                                                  "relchecks, (reltriggers <> 0) AS relhastriggers, "
                                                  "relhasindex, relhasrules, "
                                                  "'t'::bool AS relhasoids, "
+                                                 "0 as relfrozenxid, "
                                                  "NULL::oid AS owning_tab, "
                                                  "NULL::int4 AS owning_col, "
                                                  "NULL AS reltablespace, "
        i_relhasindex = PQfnumber(res, "relhasindex");
        i_relhasrules = PQfnumber(res, "relhasrules");
        i_relhasoids = PQfnumber(res, "relhasoids");
+       i_relfrozenxid = PQfnumber(res, "relfrozenxid");
        i_owning_tab = PQfnumber(res, "owning_tab");
        i_owning_col = PQfnumber(res, "owning_col");
        i_reltablespace = PQfnumber(res, "reltablespace");
                tblinfo[i].hasrules = (strcmp(PQgetvalue(res, i, i_relhasrules), "t") == 0);
                tblinfo[i].hastriggers = (strcmp(PQgetvalue(res, i, i_relhastriggers), "t") == 0);
                tblinfo[i].hasoids = (strcmp(PQgetvalue(res, i, i_relhasoids), "t") == 0);
+               tblinfo[i].frozenxid = atooid(PQgetvalue(res, i, i_relfrozenxid));
                tblinfo[i].ncheck = atoi(PQgetvalue(res, i, i_relchecks));
                if (PQgetisnull(res, i, i_owning_tab))
                {
                                                                                 tbinfo->dobj.name);
                                }
                        }
+                       appendPQExpBuffer(q, "\n-- For binary upgrade, set relfrozenxid.\n");
+                       appendPQExpBuffer(q, "UPDATE pg_class\n"
+                                                                "SET relfrozenxid = '%u'\n"
+                                                                "WHERE relname = '%s'\n"
+                                                                "      AND relnamespace = "
+                                                                "(SELECT oid FROM pg_namespace "
+                                                                "WHERE nspname = CURRENT_SCHEMA);\n",
+                                                                tbinfo->frozenxid,
+                                                                tbinfo->dobj.name);
                }
        
                /* Loop dumping statistics and storage statements */
 
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  *
- * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.114 2009/02/17 15:41:50 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dumpall.c,v 1.115 2009/02/18 12:07:08 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 #endif
 
 #include "dumputils.h"
-
+#include "pg_backup.h"
 
 /* version string we expect back from pg_dump */
 #define PGDUMP_VERSIONSTR "pg_dump (PostgreSQL) " PG_VERSION "\n"
 static FILE *OPF;
 static char *filename = NULL;
 
+static int     binary_upgrade = 0;
+
 int
 main(int argc, char *argv[])
 {
        const char *std_strings;
        int                     c,
                                ret;
-       int                     binary_upgrade = 0;
 
        struct option long_options[] = {
                {"binary-upgrade", no_argument, &binary_upgrade, 1},    /* not documented */
                                                   "SELECT datname, "
                                                   "coalesce(rolname, (select rolname from pg_authid where oid=(select datdba from pg_database where datname='template0'))), "
                                                   "pg_encoding_to_char(d.encoding), "
-                                                  "datcollate, datctype, "
+                                                  "datcollate, datctype, datfrozenxid, "
                                                   "datistemplate, datacl, datconnlimit, "
                                                   "(SELECT spcname FROM pg_tablespace t WHERE t.oid = d.dattablespace) AS dattablespace "
                          "FROM pg_database d LEFT JOIN pg_authid u ON (datdba = u.oid) "
                                                   "SELECT datname, "
                                                   "coalesce(rolname, (select rolname from pg_authid where oid=(select datdba from pg_database where datname='template0'))), "
                                                   "pg_encoding_to_char(d.encoding), "
-                                                  "null::text AS datcollate, null::text AS datctype, "
+                                                  "null::text AS datcollate, null::text AS datctype, datfrozenxid, "
                                                   "datistemplate, datacl, datconnlimit, "
                                                   "(SELECT spcname FROM pg_tablespace t WHERE t.oid = d.dattablespace) AS dattablespace "
                          "FROM pg_database d LEFT JOIN pg_authid u ON (datdba = u.oid) "
                                                   "SELECT datname, "
                                                   "coalesce(usename, (select usename from pg_shadow where usesysid=(select datdba from pg_database where datname='template0'))), "
                                                   "pg_encoding_to_char(d.encoding), "
-                                                  "null::text AS datcollate, null::text AS datctype, "
+                                                  "null::text AS datcollate, null::text AS datctype, datfrozenxid, "
                                                   "datistemplate, datacl, -1 as datconnlimit, "
                                                   "(SELECT spcname FROM pg_tablespace t WHERE t.oid = d.dattablespace) AS dattablespace "
                   "FROM pg_database d LEFT JOIN pg_shadow u ON (datdba = usesysid) "
                                                   "SELECT datname, "
                                                   "coalesce(usename, (select usename from pg_shadow where usesysid=(select datdba from pg_database where datname='template0'))), "
                                                   "pg_encoding_to_char(d.encoding), "
-                                                  "null::text AS datcollate, null::text AS datctype, "
+                                                  "null::text AS datcollate, null::text AS datctype, datfrozenxid, "
                                                   "datistemplate, datacl, -1 as datconnlimit, "
                                                   "'pg_default' AS dattablespace "
                   "FROM pg_database d LEFT JOIN pg_shadow u ON (datdba = usesysid) "
                                        "(select usename from pg_shadow where usesysid=datdba), "
                                                   "(select usename from pg_shadow where usesysid=(select datdba from pg_database where datname='template0'))), "
                                                   "pg_encoding_to_char(d.encoding), "
-                                                  "null::text AS datcollate, null::text AS datctype, "
+                                                  "null::text AS datcollate, null::text AS datctype, 0 AS datfrozenxid"
                                                   "datistemplate, '' as datacl, -1 as datconnlimit, "
                                                   "'pg_default' AS dattablespace "
                                                   "FROM pg_database d "
                                                   "SELECT datname, "
                                        "(select usename from pg_shadow where usesysid=datdba), "
                                                   "pg_encoding_to_char(d.encoding), "
-                                                  "null::text AS datcollate, null::text AS datctype, "
+                                                  "null::text AS datcollate, null::text AS datctype, 0 AS datfrozenxid"
                                                   "'f' as datistemplate, "
                                                   "'' as datacl, -1 as datconnlimit, "
                                                   "'pg_default' AS dattablespace "
                char       *dbencoding = PQgetvalue(res, i, 2);
                char       *dbcollate = PQgetvalue(res, i, 3);
                char       *dbctype = PQgetvalue(res, i, 4);
-               char       *dbistemplate = PQgetvalue(res, i, 5);
-               char       *dbacl = PQgetvalue(res, i, 6);
-               char       *dbconnlimit = PQgetvalue(res, i, 7);
-               char       *dbtablespace = PQgetvalue(res, i, 8);
+               uint32     dbfrozenxid = atooid(PQgetvalue(res, i, 5));
+               char       *dbistemplate = PQgetvalue(res, i, 6);
+               char       *dbacl = PQgetvalue(res, i, 7);
+               char       *dbconnlimit = PQgetvalue(res, i, 8);
+               char       *dbtablespace = PQgetvalue(res, i, 9);
                char       *fdbname;
 
                fdbname = strdup(fmtId(dbname));
                                appendStringLiteralConn(buf, dbname, conn);
                                appendPQExpBuffer(buf, ";\n");
                        }
+
+                       if (binary_upgrade)
+                       {
+                               appendPQExpBuffer(buf, "\n-- For binary upgrade, set datfrozenxid.\n");
+                               appendPQExpBuffer(buf, "UPDATE pg_database\n"
+                                                                        "SET datfrozenxid = '%u'\n"
+                                                                        "WHERE datname = '%s';\n",
+                                                                        dbfrozenxid, fdbname);
+                       }
                }
 
                if (!skip_acls &&