Initialize tableoid field correctly when dumping foreign data wrappers and
authorHeikki Linnakangas
Thu, 23 Sep 2010 11:49:00 +0000 (14:49 +0300)
committerHeikki Linnakangas
Thu, 23 Sep 2010 12:00:04 +0000 (15:00 +0300)
servers. AFAICT it's harmless at the moment because nothing can depend on
either, but as soon as we introduce an object type with such dependencies,
tableoid needs to be set or pg_dump will fail to interpret the dependencies
correctly. In theory, I guess the uninitialized garbage in tableoid could
cause the object to be mistaken for some other object with same OID as well.

src/bin/pg_dump/pg_dump.c

index 7a06f9b20a808011e2d2e1892845b41e80611ef7..f93affd089fcd590a2ac241dbc888b4ca7f5cb8f 100644 (file)
@@ -5843,6 +5843,7 @@ getForeignDataWrappers(int *numForeignDataWrappers)
    int         i;
    PQExpBuffer query = createPQExpBuffer();
    FdwInfo    *fdwinfo;
+   int         i_tableoid;
    int         i_oid;
    int         i_fdwname;
    int         i_rolname;
@@ -5860,7 +5861,7 @@ getForeignDataWrappers(int *numForeignDataWrappers)
    /* Make sure we are in proper schema */
    selectSourceSchema("pg_catalog");
 
-   appendPQExpBuffer(query, "SELECT oid, fdwname, "
+   appendPQExpBuffer(query, "SELECT tableoid, oid, fdwname, "
        "(%s fdwowner) AS rolname, fdwvalidator::pg_catalog.regproc, fdwacl,"
                      "array_to_string(ARRAY("
         "      SELECT option_name || ' ' || quote_literal(option_value) "
@@ -5876,6 +5877,7 @@ getForeignDataWrappers(int *numForeignDataWrappers)
 
    fdwinfo = (FdwInfo *) malloc(ntups * sizeof(FdwInfo));
 
+   i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
    i_fdwname = PQfnumber(res, "fdwname");
    i_rolname = PQfnumber(res, "rolname");
@@ -5886,6 +5888,7 @@ getForeignDataWrappers(int *numForeignDataWrappers)
    for (i = 0; i < ntups; i++)
    {
        fdwinfo[i].dobj.objType = DO_FDW;
+       fdwinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        fdwinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&fdwinfo[i].dobj);
        fdwinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_fdwname));
@@ -5922,6 +5925,7 @@ getForeignServers(int *numForeignServers)
    int         i;
    PQExpBuffer query = createPQExpBuffer();
    ForeignServerInfo *srvinfo;
+   int         i_tableoid;
    int         i_oid;
    int         i_srvname;
    int         i_rolname;
@@ -5941,7 +5945,7 @@ getForeignServers(int *numForeignServers)
    /* Make sure we are in proper schema */
    selectSourceSchema("pg_catalog");
 
-   appendPQExpBuffer(query, "SELECT oid, srvname, "
+   appendPQExpBuffer(query, "SELECT tableoid, oid, srvname, "
                      "(%s srvowner) AS rolname, "
                      "srvfdw, srvtype, srvversion, srvacl,"
                      "array_to_string(ARRAY("
@@ -5958,6 +5962,7 @@ getForeignServers(int *numForeignServers)
 
    srvinfo = (ForeignServerInfo *) malloc(ntups * sizeof(ForeignServerInfo));
 
+   i_tableoid = PQfnumber(res, "tableoid");
    i_oid = PQfnumber(res, "oid");
    i_srvname = PQfnumber(res, "srvname");
    i_rolname = PQfnumber(res, "rolname");
@@ -5970,6 +5975,7 @@ getForeignServers(int *numForeignServers)
    for (i = 0; i < ntups; i++)
    {
        srvinfo[i].dobj.objType = DO_FOREIGN_SERVER;
+       srvinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid));
        srvinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid));
        AssignDumpId(&srvinfo[i].dobj);
        srvinfo[i].dobj.name = strdup(PQgetvalue(res, i, i_srvname));