Properly restore pg_largeobject.relfozenxid in binary upgrade mode.
authorBruce Momjian <bruce@momjian.us>
Mon, 20 Jul 2009 20:53:40 +0000 (20:53 +0000)
committerBruce Momjian <bruce@momjian.us>
Mon, 20 Jul 2009 20:53:40 +0000 (20:53 +0000)
Backpatch to 8.4.X.

src/bin/pg_dump/pg_dump.c

index 304967b91cb122a97d8ec8c4a89c99b6fff96f83..62b6ea17c4f25a417cd8fa3a3635b01cbca9a18c 100644 (file)
@@ -34,6 +34,7 @@
 #include "access/sysattr.h"
 #include "catalog/pg_cast.h"
 #include "catalog/pg_class.h"
+#include "catalog/pg_largeobject.h"
 #include "catalog/pg_proc.h"
 #include "catalog/pg_trigger.h"
 #include "catalog/pg_type.h"
@@ -1739,6 +1740,7 @@ dumpDatabase(Archive *AH)
                                                  frozenxid);
                appendStringLiteralAH(creaQry, datname, AH);
                appendPQExpBuffer(creaQry, ";\n");
+
        }
 
        appendPQExpBuffer(delQry, "DROP DATABASE %s;\n",
@@ -1764,6 +1766,51 @@ dumpDatabase(Archive *AH)
                                 NULL,                  /* Dumper */
                                 NULL);                 /* Dumper Arg */
 
+       /*
+        *      pg_largeobject comes from the old system intact, so set
+        *      its relfrozenxid.
+        */
+       if (binary_upgrade)
+       {
+               PGresult   *lo_res;
+               PQExpBuffer loFrozenQry = createPQExpBuffer();
+               PQExpBuffer loOutQry = createPQExpBuffer();
+               int                     i_relfrozenxid;
+               
+               appendPQExpBuffer(loFrozenQry, "SELECT relfrozenxid\n"
+                                                       "FROM pg_catalog.pg_class\n"
+                                                       "WHERE oid = %d;\n",
+                                                       LargeObjectRelationId);
+
+               lo_res = PQexec(g_conn, loFrozenQry->data);
+               check_sql_result(lo_res, g_conn, loFrozenQry->data, PGRES_TUPLES_OK);
+
+               if (PQntuples(lo_res) != 1)
+               {
+                       write_msg(NULL, "dumpDatabase(): could not find pg_largeobject.relfrozenxid\n");
+                       exit_nicely();
+               }
+
+               i_relfrozenxid = PQfnumber(lo_res, "relfrozenxid");
+
+               appendPQExpBuffer(loOutQry, "\n-- For binary upgrade, set pg_largeobject relfrozenxid.\n");
+               appendPQExpBuffer(loOutQry, "UPDATE pg_catalog.pg_class\n"
+                                                 "SET relfrozenxid = '%u'\n"
+                                                 "WHERE oid = %d;\n",
+                                                 atoi(PQgetvalue(lo_res, 0, i_relfrozenxid)),
+                                                 LargeObjectRelationId);
+               ArchiveEntry(AH, nilCatalogId, createDumpId(),
+                                        "pg_largeobject", NULL, NULL, "",
+                                        false, "pg_largeobject", SECTION_PRE_DATA,
+                                        loOutQry->data, "", NULL,
+                                        NULL, 0,
+                                        NULL, NULL);
+                                                 
+               PQclear(lo_res);
+               destroyPQExpBuffer(loFrozenQry);
+               destroyPQExpBuffer(loOutQry);
+       }
+
        /* Dump DB comment if any */
        if (g_fout->remoteVersion >= 80200)
        {