More pg_upgrade clarifications - Mailing list pgsql-hackers

From Bruce Momjian
Subject More pg_upgrade clarifications
Date
Msg-id 201101080227.p082RwX01842@momjian.us
Whole thread Raw
List pgsql-hackers
The attached two patches clarify pg_upgrades behavior.  Specifically,
the first patch updates the C comments regarding pg_upgrade_support.

The second patch clarifies that pg_class.oid really needs preserving,
not pg_class.relfilenode.  We used to use create relfilenode files to
preserve pg_class.oids, but no longer in PG >= 9.0.  Also add comments
about what is being preserved, and why.  This should help future
improvements.

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +
commit 46d28820b6d213bf26b24ecd289a1c466ecf1956
Author: Bruce Momjian <bruce@momjian.us>
Date:   Thu Jan 6 22:44:57 2011 -0500

    Improve C comments about backend variables set by pg_upgrade_support
    functions.

diff --git a/contrib/pg_upgrade/pg_upgrade.c b/contrib/pg_upgrade/pg_upgrade.c
index 64fb8f8..820445c 100644
*** /tmp/7SYOed_pg_upgrade.c    Fri Jan  7 19:33:04 2011
--- /tmp/Zof2xb_pg_upgrade.c    Fri Jan  7 19:33:04 2011
***************
*** 7,12 ****
--- 7,34 ----
   *    contrib/pg_upgrade/pg_upgrade.c
   */

+ /*
+  *    To simplify the upgrade process, we force certain system items to be
+  *    consistent between old and new clusters:
+  *
+  *    We control all assignments of pg_class.relfilenode so we can keep the
+  *    same relfilenodes for old and new files.  The only exception is
+  *    pg_largeobject, pg_largeobject_metadata, and its indexes, which can
+  *    change due to a cluster, reindex, or vacuum full.  (We don't create
+  *    those so have no control over their oid/relfilenode values.)
+  *
+  *    While pg_class.oid and pg_class.relfilenode are intially the same, they
+  *    can diverge due to cluster, reindex, or vacuum full.  The new cluster
+  *    will again have matching pg_class.relfilenode and pg_class.oid values,
+  *    but based on the new relfilenode value, so the old/new oids might
+  *    differ.
+  *
+  *    We control all assignments of pg_type.oid because these are stored
+  *    in composite types.
+  */
+
+
+
  #include "pg_upgrade.h"

  #ifdef HAVE_LANGINFO_H
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 4c55db7..b36efcd 100644
*** /tmp/3oYz9b_heap.c    Fri Jan  7 19:33:04 2011
--- /tmp/5f34Wc_heap.c    Fri Jan  7 19:33:04 2011
***************
*** 73,79 ****
  #include "utils/tqual.h"


! /* Kluge for upgrade-in-place support */
  Oid            binary_upgrade_next_heap_relfilenode = InvalidOid;
  Oid            binary_upgrade_next_toast_relfilenode = InvalidOid;

--- 73,79 ----
  #include "utils/tqual.h"


! /* Potentially set by contrib/pg_upgrade_support functions */
  Oid            binary_upgrade_next_heap_relfilenode = InvalidOid;
  Oid            binary_upgrade_next_toast_relfilenode = InvalidOid;

*************** heap_create_with_catalog(const char *rel
*** 986,992 ****
       */
      if (!OidIsValid(relid))
      {
!         /* Use binary-upgrade overrides if applicable */
          if (OidIsValid(binary_upgrade_next_heap_relfilenode) &&
              (relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE ||
               relkind == RELKIND_VIEW || relkind == RELKIND_COMPOSITE_TYPE ||
--- 986,995 ----
       */
      if (!OidIsValid(relid))
      {
!         /*
!          *    Use binary-upgrade override for pg_class.relfilenode/oid,
!          *    if supplied.
!          */
          if (OidIsValid(binary_upgrade_next_heap_relfilenode) &&
              (relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE ||
               relkind == RELKIND_VIEW || relkind == RELKIND_COMPOSITE_TYPE ||
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 4dd89e1..b45db4c 100644
*** /tmp/TFFoHe_index.c    Fri Jan  7 19:33:04 2011
--- /tmp/LBJijc_index.c    Fri Jan  7 19:33:04 2011
***************
*** 68,74 ****
  #include "utils/tqual.h"


! /* Kluge for upgrade-in-place support */
  Oid            binary_upgrade_next_index_relfilenode = InvalidOid;

  /* state info for validate_index bulkdelete callback */
--- 68,74 ----
  #include "utils/tqual.h"


! /* Potentially set by contrib/pg_upgrade_support functions */
  Oid            binary_upgrade_next_index_relfilenode = InvalidOid;

  /* state info for validate_index bulkdelete callback */
*************** index_create(Oid heapRelationId,
*** 640,646 ****
       */
      if (!OidIsValid(indexRelationId))
      {
!         /* Use binary-upgrade override if applicable */
          if (OidIsValid(binary_upgrade_next_index_relfilenode))
          {
              indexRelationId = binary_upgrade_next_index_relfilenode;
--- 640,649 ----
       */
      if (!OidIsValid(indexRelationId))
      {
!         /*
!          *    Use binary-upgrade override for pg_class.relfilenode/oid,
!          *    if supplied.
!          */
          if (OidIsValid(binary_upgrade_next_index_relfilenode))
          {
              indexRelationId = binary_upgrade_next_index_relfilenode;
diff --git a/src/backend/catalog/pg_enum.c b/src/backend/catalog/pg_enum.c
index 0cc0a0c..e87a931 100644
*** /tmp/4xILMc_pg_enum.c    Fri Jan  7 19:33:05 2011
--- /tmp/CRb4od_pg_enum.c    Fri Jan  7 19:33:05 2011
***************
*** 28,33 ****
--- 28,34 ----
  #include "utils/tqual.h"


+ /* Potentially set by contrib/pg_upgrade_support functions */
  Oid      binary_upgrade_next_pg_enum_oid = InvalidOid;

  static void RenumberEnumType(Relation pg_enum, HeapTuple *existing, int nelems);
*************** restart:
*** 313,321 ****
      if (OidIsValid(binary_upgrade_next_pg_enum_oid))
      {
          /*
!          * In binary upgrades, just add the new label with the predetermined
!          * Oid.  It's pg_upgrade's responsibility that the Oid meets
!          * requirements.
           */
          if (neighbor != NULL)
              ereport(ERROR,
--- 314,322 ----
      if (OidIsValid(binary_upgrade_next_pg_enum_oid))
      {
          /*
!          *    Use binary-upgrade override for pg_enum.oid, if supplied.
!          *    During binary upgrade, all pg_enum.oid's are set this way
!          *    so they are guaranteed to be consistent.
           */
          if (neighbor != NULL)
              ereport(ERROR,
diff --git a/src/backend/catalog/pg_type.c b/src/backend/catalog/pg_type.c
index 69ff191..9c249a7 100644
*** /tmp/6INpDb_pg_type.c    Fri Jan  7 19:33:05 2011
--- /tmp/AUZEJa_pg_type.c    Fri Jan  7 19:33:05 2011
***************
*** 33,38 ****
--- 33,39 ----
  #include "utils/rel.h"
  #include "utils/syscache.h"

+ /* Potentially set by contrib/pg_upgrade_support functions */
  Oid            binary_upgrade_next_pg_type_oid = InvalidOid;

  /* ----------------------------------------------------------------
*************** TypeShellMake(const char *typeName, Oid
*** 121,126 ****
--- 122,128 ----
       */
      tup = heap_form_tuple(tupDesc, values, nulls);

+     /* Use binary-upgrade override for pg_type.oid, if supplied. */
      if (OidIsValid(binary_upgrade_next_pg_type_oid))
      {
          HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
*************** TypeCreate(Oid newTypeOid,
*** 422,427 ****
--- 424,430 ----
          /* Force the OID if requested by caller */
          if (OidIsValid(newTypeOid))
              HeapTupleSetOid(tup, newTypeOid);
+         /* Use binary-upgrade override for pg_type.oid, if supplied. */
          else if (OidIsValid(binary_upgrade_next_pg_type_oid))
          {
              HeapTupleSetOid(tup, binary_upgrade_next_pg_type_oid);
diff --git a/src/backend/catalog/toasting.c b/src/backend/catalog/toasting.c
index 59838e3..e495122 100644
*** /tmp/I4Kdwc_toasting.c    Fri Jan  7 19:33:05 2011
--- /tmp/CdvKwb_toasting.c    Fri Jan  7 19:33:05 2011
***************
*** 31,37 ****
  #include "utils/builtins.h"
  #include "utils/syscache.h"

! /* Kluges for upgrade-in-place support */
  extern Oid    binary_upgrade_next_toast_relfilenode;

  Oid            binary_upgrade_next_pg_type_toast_oid = InvalidOid;
--- 31,37 ----
  #include "utils/builtins.h"
  #include "utils/syscache.h"

! /* Potentially set by contrib/pg_upgrade_support functions */
  extern Oid    binary_upgrade_next_toast_relfilenode;

  Oid            binary_upgrade_next_pg_type_toast_oid = InvalidOid;
*************** create_toast_table(Relation rel, Oid toa
*** 200,205 ****
--- 200,206 ----
      else
          namespaceid = PG_TOAST_NAMESPACE;

+     /* Use binary-upgrade override for pg_type.oid, if supplied. */
      if (OidIsValid(binary_upgrade_next_pg_type_toast_oid))
      {
          toast_typid = binary_upgrade_next_pg_type_toast_oid;
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 113bede..bc66c3e 100644
*** /tmp/mZ7Pme_typecmds.c    Fri Jan  7 19:33:05 2011
--- /tmp/KrUiBb_typecmds.c    Fri Jan  7 19:33:05 2011
*************** typedef struct
*** 74,79 ****
--- 74,80 ----
      /* atts[] is of allocated length RelationGetNumberOfAttributes(rel) */
  } RelToCheck;

+ /* Potentially set by contrib/pg_upgrade_support functions */
  Oid            binary_upgrade_next_pg_type_array_oid = InvalidOid;

  static Oid    findTypeInputFunction(List *procname, Oid typeOid);
*************** AssignTypeArrayOid(void)
*** 1517,1523 ****
  {
      Oid            type_array_oid;

!     /* Pre-assign the type's array OID for use in pg_type.typarray */
      if (OidIsValid(binary_upgrade_next_pg_type_array_oid))
      {
          type_array_oid = binary_upgrade_next_pg_type_array_oid;
--- 1518,1524 ----
  {
      Oid            type_array_oid;

!     /* Use binary-upgrade override for pg_type.typarray, if supplied. */
      if (OidIsValid(binary_upgrade_next_pg_type_array_oid))
      {
          type_array_oid = binary_upgrade_next_pg_type_array_oid;
diff --git a/contrib/pg_upgrade/function.c b/contrib/pg_upgrade/function.c
index 2ab8e4f..9c8c586 100644
*** /tmp/pgdiff.29009/TQ9Hcc_function.c    Fri Jan  7 21:18:32 2011
--- contrib/pg_upgrade/function.c    Fri Jan  7 19:42:58 2011
*************** install_support_functions(void)
*** 49,79 ****
                                    "LANGUAGE C STRICT;"));
          PQclear(executeQueryOrDie(conn,
                                    "CREATE OR REPLACE FUNCTION "
!                "        binary_upgrade.set_next_pg_type_array_oid(OID) "
                                    "RETURNS VOID "
                                    "AS '$libdir/pg_upgrade_support' "
                                    "LANGUAGE C STRICT;"));
          PQclear(executeQueryOrDie(conn,
                                    "CREATE OR REPLACE FUNCTION "
!                "        binary_upgrade.set_next_pg_type_toast_oid(OID) "
                                    "RETURNS VOID "
                                    "AS '$libdir/pg_upgrade_support' "
                                    "LANGUAGE C STRICT;"));
          PQclear(executeQueryOrDie(conn,
                                    "CREATE OR REPLACE FUNCTION "
!                 "        binary_upgrade.set_next_heap_relfilenode(OID) "
                                    "RETURNS VOID "
                                    "AS '$libdir/pg_upgrade_support' "
                                    "LANGUAGE C STRICT;"));
          PQclear(executeQueryOrDie(conn,
                                    "CREATE OR REPLACE FUNCTION "
!                "        binary_upgrade.set_next_toast_relfilenode(OID) "
                                    "RETURNS VOID "
                                    "AS '$libdir/pg_upgrade_support' "
                                    "LANGUAGE C STRICT;"));
          PQclear(executeQueryOrDie(conn,
                                    "CREATE OR REPLACE FUNCTION "
!                "        binary_upgrade.set_next_index_relfilenode(OID) "
                                    "RETURNS VOID "
                                    "AS '$libdir/pg_upgrade_support' "
                                    "LANGUAGE C STRICT;"));
--- 49,79 ----
                                    "LANGUAGE C STRICT;"));
          PQclear(executeQueryOrDie(conn,
                                    "CREATE OR REPLACE FUNCTION "
!                "        binary_upgrade.set_next_array_pg_type_oid(OID) "
                                    "RETURNS VOID "
                                    "AS '$libdir/pg_upgrade_support' "
                                    "LANGUAGE C STRICT;"));
          PQclear(executeQueryOrDie(conn,
                                    "CREATE OR REPLACE FUNCTION "
!                "        binary_upgrade.set_next_toast_pg_type_oid(OID) "
                                    "RETURNS VOID "
                                    "AS '$libdir/pg_upgrade_support' "
                                    "LANGUAGE C STRICT;"));
          PQclear(executeQueryOrDie(conn,
                                    "CREATE OR REPLACE FUNCTION "
!                 "        binary_upgrade.set_next_heap_pg_class_oid(OID) "
                                    "RETURNS VOID "
                                    "AS '$libdir/pg_upgrade_support' "
                                    "LANGUAGE C STRICT;"));
          PQclear(executeQueryOrDie(conn,
                                    "CREATE OR REPLACE FUNCTION "
!                "        binary_upgrade.set_next_index_pg_class_oid(OID) "
                                    "RETURNS VOID "
                                    "AS '$libdir/pg_upgrade_support' "
                                    "LANGUAGE C STRICT;"));
          PQclear(executeQueryOrDie(conn,
                                    "CREATE OR REPLACE FUNCTION "
!                "        binary_upgrade.set_next_toast_pg_class_oid(OID) "
                                    "RETURNS VOID "
                                    "AS '$libdir/pg_upgrade_support' "
                                    "LANGUAGE C STRICT;"));
diff --git a/contrib/pg_upgrade/info.c b/contrib/pg_upgrade/info.c
index 578bdb9..dc66e38 100644
*** /tmp/pgdiff.29009/nw16Wc_info.c    Fri Jan  7 21:18:32 2011
--- contrib/pg_upgrade/info.c    Fri Jan  7 21:06:24 2011
*************** get_rel_infos(ClusterInfo *cluster, DbIn
*** 266,272 ****

      /*
       * pg_largeobject contains user data that does not appear the pg_dumpall
!      * --schema-only output, so we have to upgrade that system table heap and
       * index.  Ideally we could just get the relfilenode from template1 but
       * pg_largeobject_loid_pn_index's relfilenode can change if the table was
       * reindexed so we get the relfilenode for each database and upgrade it as
--- 266,272 ----

      /*
       * pg_largeobject contains user data that does not appear the pg_dumpall
!      * --schema-only output, so we have to copy that system table heap and
       * index.  Ideally we could just get the relfilenode from template1 but
       * pg_largeobject_loid_pn_index's relfilenode can change if the table was
       * reindexed so we get the relfilenode for each database and upgrade it as
diff --git a/contrib/pg_upgrade/pg_upgrade.c b/contrib/pg_upgrade/pg_upgrade.c
index 820445c..3de47fc 100644
*** /tmp/pgdiff.29009/dTf5xe_pg_upgrade.c    Fri Jan  7 21:18:32 2011
--- contrib/pg_upgrade/pg_upgrade.c    Fri Jan  7 19:35:51 2011
***************
*** 8,30 ****
   */

  /*
!  *    To simplify the upgrade process, we force certain system items to be
!  *    consistent between old and new clusters:
   *
!  *    We control all assignments of pg_class.relfilenode so we can keep the
!  *    same relfilenodes for old and new files.  The only exception is
!  *    pg_largeobject, pg_largeobject_metadata, and its indexes, which can
!  *    change due to a cluster, reindex, or vacuum full.  (We don't create
!  *    those so have no control over their oid/relfilenode values.)
   *
!  *    While pg_class.oid and pg_class.relfilenode are intially the same, they
!  *    can diverge due to cluster, reindex, or vacuum full.  The new cluster
!  *    will again have matching pg_class.relfilenode and pg_class.oid values,
!  *    but based on the new relfilenode value, so the old/new oids might
!  *    differ.
   *
!  *    We control all assignments of pg_type.oid because these are stored
!  *    in composite types.
   */


--- 8,37 ----
   */

  /*
!  *    To simplify the upgrade process, we force certain system values to be
!  *    identical between old and new clusters:
   *
!  *    We control all assignments of pg_class.oid (and relfilenode) so toast
!  *    oids are the same between old and new clusters.  This is important
!  *    because toast oids are stored as toast pointers in user tables.
   *
!  *    The only place where old/new relfilenode might not match is
!  *    pg_largeobject, pg_largeobject_metadata, and its indexes,
!  *    which can change their relfilenode values due to a cluster, reindex,
!  *    or vacuum full.  (We don't create those so have no control over their
!  *    new relfilenode values.)
   *
!  *    FYI, while pg_class.oid and pg_class.relfilenode are intially the same
!  *    in a cluster, but they can diverge due to cluster, reindex, or vacuum
!  *    full.  The new cluster will again have matching pg_class.relfilenode
!  *    and pg_class.oid values, but based on the old relfilenode value, so the
!  *    old/new oids might differ.
!  *
!  *    We control all assignments of pg_type.oid because these oid are stored
!  *    in user composite type values.
!  *
!  *    We control all assignments of pg_enum.oid because these oid are stored
!  *    in user tables as enum values.
   */


diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h
index d863155..7f44a9d 100644
*** /tmp/pgdiff.29009/1Epide_pg_upgrade.h    Fri Jan  7 21:18:32 2011
--- contrib/pg_upgrade/pg_upgrade.h    Fri Jan  7 19:13:07 2011
*************** typedef struct
*** 67,74 ****
  {
      char        nspname[NAMEDATALEN];    /* namespace name */
      char        relname[NAMEDATALEN];    /* relation name */
!     Oid            reloid;            /* relation oid                 */
!     Oid            relfilenode;    /* relation relfile node     */
      Oid            toastrelid;        /* oid of the toast relation */
      char        tablespace[MAXPGPATH];    /* relations tablespace path */
  } RelInfo;
--- 67,74 ----
  {
      char        nspname[NAMEDATALEN];    /* namespace name */
      char        relname[NAMEDATALEN];    /* relation name */
!     Oid            reloid;            /* relation oid */
!     Oid            relfilenode;    /* relation relfile node */
      Oid            toastrelid;        /* oid of the toast relation */
      char        tablespace[MAXPGPATH];    /* relations tablespace path */
  } RelInfo;
diff --git a/contrib/pg_upgrade_support/pg_upgrade_support.c b/contrib/pg_upgrade_support/pg_upgrade_support.c
index e55e139..da8bd58 100644
*** /tmp/pgdiff.29009/d19J5b_pg_upgrade_support.c    Fri Jan  7 21:18:32 2011
--- contrib/pg_upgrade_support/pg_upgrade_support.c    Fri Jan  7 19:39:49 2011
*************** PG_MODULE_MAGIC;
*** 21,49 ****
  #endif

  extern PGDLLIMPORT Oid binary_upgrade_next_pg_type_oid;
! extern PGDLLIMPORT Oid binary_upgrade_next_pg_type_array_oid;
! extern PGDLLIMPORT Oid binary_upgrade_next_pg_type_toast_oid;
! extern PGDLLIMPORT Oid binary_upgrade_next_heap_relfilenode;
! extern PGDLLIMPORT Oid binary_upgrade_next_toast_relfilenode;
! extern PGDLLIMPORT Oid binary_upgrade_next_index_relfilenode;
  extern PGDLLIMPORT Oid binary_upgrade_next_pg_enum_oid;

  Datum        set_next_pg_type_oid(PG_FUNCTION_ARGS);
! Datum        set_next_pg_type_array_oid(PG_FUNCTION_ARGS);
! Datum        set_next_pg_type_toast_oid(PG_FUNCTION_ARGS);
! Datum        set_next_heap_relfilenode(PG_FUNCTION_ARGS);
! Datum        set_next_toast_relfilenode(PG_FUNCTION_ARGS);
! Datum        set_next_index_relfilenode(PG_FUNCTION_ARGS);
  Datum        set_next_pg_enum_oid(PG_FUNCTION_ARGS);

  PG_FUNCTION_INFO_V1(set_next_pg_type_oid);
! PG_FUNCTION_INFO_V1(set_next_pg_type_array_oid);
! PG_FUNCTION_INFO_V1(set_next_pg_type_toast_oid);
! PG_FUNCTION_INFO_V1(set_next_heap_relfilenode);
! PG_FUNCTION_INFO_V1(set_next_toast_relfilenode);
! PG_FUNCTION_INFO_V1(set_next_index_relfilenode);
  PG_FUNCTION_INFO_V1(set_next_pg_enum_oid);

  Datum
  set_next_pg_type_oid(PG_FUNCTION_ARGS)
  {
--- 21,56 ----
  #endif

  extern PGDLLIMPORT Oid binary_upgrade_next_pg_type_oid;
! extern PGDLLIMPORT Oid binary_upgrade_next_array_pg_type_oid;
! extern PGDLLIMPORT Oid binary_upgrade_next_toast_pg_type_oid;
!
! extern PGDLLIMPORT Oid binary_upgrade_next_heap_pg_class_oid;
! extern PGDLLIMPORT Oid binary_upgrade_next_index_pg_class_oid;
! extern PGDLLIMPORT Oid binary_upgrade_next_toast_pg_class_oid;
!
  extern PGDLLIMPORT Oid binary_upgrade_next_pg_enum_oid;

  Datum        set_next_pg_type_oid(PG_FUNCTION_ARGS);
! Datum        set_next_array_pg_type_oid(PG_FUNCTION_ARGS);
! Datum        set_next_toast_pg_type_oid(PG_FUNCTION_ARGS);
!
! Datum        set_next_heap_pg_class_oid(PG_FUNCTION_ARGS);
! Datum        set_next_index_pg_class_oid(PG_FUNCTION_ARGS);
! Datum        set_next_toast_pg_class_oid(PG_FUNCTION_ARGS);
!
  Datum        set_next_pg_enum_oid(PG_FUNCTION_ARGS);

  PG_FUNCTION_INFO_V1(set_next_pg_type_oid);
! PG_FUNCTION_INFO_V1(set_next_array_pg_type_oid);
! PG_FUNCTION_INFO_V1(set_next_toast_pg_type_oid);
!
! PG_FUNCTION_INFO_V1(set_next_heap_pg_class_oid);
! PG_FUNCTION_INFO_V1(set_next_index_pg_class_oid);
! PG_FUNCTION_INFO_V1(set_next_toast_pg_class_oid);
!
  PG_FUNCTION_INFO_V1(set_next_pg_enum_oid);

+
  Datum
  set_next_pg_type_oid(PG_FUNCTION_ARGS)
  {
*************** set_next_pg_type_oid(PG_FUNCTION_ARGS)
*** 55,105 ****
  }

  Datum
! set_next_pg_type_array_oid(PG_FUNCTION_ARGS)
  {
      Oid            typoid = PG_GETARG_OID(0);

!     binary_upgrade_next_pg_type_array_oid = typoid;

      PG_RETURN_VOID();
  }

  Datum
! set_next_pg_type_toast_oid(PG_FUNCTION_ARGS)
  {
      Oid            typoid = PG_GETARG_OID(0);

!     binary_upgrade_next_pg_type_toast_oid = typoid;

      PG_RETURN_VOID();
  }

  Datum
! set_next_heap_relfilenode(PG_FUNCTION_ARGS)
  {
!     Oid            relfilenode = PG_GETARG_OID(0);

!     binary_upgrade_next_heap_relfilenode = relfilenode;

      PG_RETURN_VOID();
  }

  Datum
! set_next_toast_relfilenode(PG_FUNCTION_ARGS)
  {
!     Oid            relfilenode = PG_GETARG_OID(0);

!     binary_upgrade_next_toast_relfilenode = relfilenode;

      PG_RETURN_VOID();
  }

  Datum
! set_next_index_relfilenode(PG_FUNCTION_ARGS)
  {
!     Oid            relfilenode = PG_GETARG_OID(0);

!     binary_upgrade_next_index_relfilenode = relfilenode;

      PG_RETURN_VOID();
  }
--- 62,112 ----
  }

  Datum
! set_next_array_pg_type_oid(PG_FUNCTION_ARGS)
  {
      Oid            typoid = PG_GETARG_OID(0);

!     binary_upgrade_next_array_pg_type_oid = typoid;

      PG_RETURN_VOID();
  }

  Datum
! set_next_toast_pg_type_oid(PG_FUNCTION_ARGS)
  {
      Oid            typoid = PG_GETARG_OID(0);

!     binary_upgrade_next_toast_pg_type_oid = typoid;

      PG_RETURN_VOID();
  }

  Datum
! set_next_heap_pg_class_oid(PG_FUNCTION_ARGS)
  {
!     Oid            reloid = PG_GETARG_OID(0);

!     binary_upgrade_next_heap_pg_class_oid = reloid;

      PG_RETURN_VOID();
  }

  Datum
! set_next_index_pg_class_oid(PG_FUNCTION_ARGS)
  {
!     Oid            reloid = PG_GETARG_OID(0);

!     binary_upgrade_next_index_pg_class_oid = reloid;

      PG_RETURN_VOID();
  }

  Datum
! set_next_toast_pg_class_oid(PG_FUNCTION_ARGS)
  {
!     Oid            reloid = PG_GETARG_OID(0);

!     binary_upgrade_next_toast_pg_class_oid = reloid;

      PG_RETURN_VOID();
  }
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index b36efcd..5dfd814 100644
*** /tmp/pgdiff.29009/PWzZBb_heap.c    Fri Jan  7 21:18:32 2011
--- src/backend/catalog/heap.c    Fri Jan  7 20:54:55 2011
***************
*** 74,81 ****


  /* Potentially set by contrib/pg_upgrade_support functions */
! Oid            binary_upgrade_next_heap_relfilenode = InvalidOid;
! Oid            binary_upgrade_next_toast_relfilenode = InvalidOid;

  static void AddNewRelationTuple(Relation pg_class_desc,
                      Relation new_rel_desc,
--- 74,81 ----


  /* Potentially set by contrib/pg_upgrade_support functions */
! Oid            binary_upgrade_next_heap_pg_class_oid = InvalidOid;
! Oid            binary_upgrade_next_toast_pg_class_oid = InvalidOid;

  static void AddNewRelationTuple(Relation pg_class_desc,
                      Relation new_rel_desc,
*************** heap_create_with_catalog(const char *rel
*** 987,1008 ****
      if (!OidIsValid(relid))
      {
          /*
!          *    Use binary-upgrade override for pg_class.relfilenode/oid,
           *    if supplied.
           */
!         if (OidIsValid(binary_upgrade_next_heap_relfilenode) &&
              (relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE ||
               relkind == RELKIND_VIEW || relkind == RELKIND_COMPOSITE_TYPE ||
               relkind == RELKIND_FOREIGN_TABLE))
          {
!             relid = binary_upgrade_next_heap_relfilenode;
!             binary_upgrade_next_heap_relfilenode = InvalidOid;
          }
!         else if (OidIsValid(binary_upgrade_next_toast_relfilenode) &&
                   relkind == RELKIND_TOASTVALUE)
          {
!             relid = binary_upgrade_next_toast_relfilenode;
!             binary_upgrade_next_toast_relfilenode = InvalidOid;
          }
          else
              relid = GetNewRelFileNode(reltablespace, pg_class_desc,
--- 987,1008 ----
      if (!OidIsValid(relid))
      {
          /*
!          *    Use binary-upgrade override for pg_class.oid/relfilenode,
           *    if supplied.
           */
!         if (OidIsValid(binary_upgrade_next_heap_pg_class_oid) &&
              (relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE ||
               relkind == RELKIND_VIEW || relkind == RELKIND_COMPOSITE_TYPE ||
               relkind == RELKIND_FOREIGN_TABLE))
          {
!             relid = binary_upgrade_next_heap_pg_class_oid;
!             binary_upgrade_next_heap_pg_class_oid = InvalidOid;
          }
!         else if (OidIsValid(binary_upgrade_next_toast_pg_class_oid) &&
                   relkind == RELKIND_TOASTVALUE)
          {
!             relid = binary_upgrade_next_toast_pg_class_oid;
!             binary_upgrade_next_toast_pg_class_oid = InvalidOid;
          }
          else
              relid = GetNewRelFileNode(reltablespace, pg_class_desc,
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index b45db4c..5790f87 100644
*** /tmp/pgdiff.29009/TSqk8d_index.c    Fri Jan  7 21:18:32 2011
--- src/backend/catalog/index.c    Fri Jan  7 20:55:33 2011
***************
*** 69,75 ****


  /* Potentially set by contrib/pg_upgrade_support functions */
! Oid            binary_upgrade_next_index_relfilenode = InvalidOid;

  /* state info for validate_index bulkdelete callback */
  typedef struct
--- 69,75 ----


  /* Potentially set by contrib/pg_upgrade_support functions */
! Oid            binary_upgrade_next_index_pg_class_oid = InvalidOid;

  /* state info for validate_index bulkdelete callback */
  typedef struct
*************** index_create(Oid heapRelationId,
*** 641,653 ****
      if (!OidIsValid(indexRelationId))
      {
          /*
!          *    Use binary-upgrade override for pg_class.relfilenode/oid,
           *    if supplied.
           */
!         if (OidIsValid(binary_upgrade_next_index_relfilenode))
          {
!             indexRelationId = binary_upgrade_next_index_relfilenode;
!             binary_upgrade_next_index_relfilenode = InvalidOid;
          }
          else
          {
--- 641,653 ----
      if (!OidIsValid(indexRelationId))
      {
          /*
!          *    Use binary-upgrade override for pg_class.oid/relfilenode,
           *    if supplied.
           */
!         if (OidIsValid(binary_upgrade_next_index_pg_class_oid))
          {
!             indexRelationId = binary_upgrade_next_index_pg_class_oid;
!             binary_upgrade_next_index_pg_class_oid = InvalidOid;
          }
          else
          {
diff --git a/src/backend/catalog/toasting.c b/src/backend/catalog/toasting.c
index e495122..142beae 100644
*** /tmp/pgdiff.29009/TUtB8d_toasting.c    Fri Jan  7 21:18:32 2011
--- src/backend/catalog/toasting.c    Fri Jan  7 20:30:33 2011
***************
*** 32,40 ****
  #include "utils/syscache.h"

  /* Potentially set by contrib/pg_upgrade_support functions */
! extern Oid    binary_upgrade_next_toast_relfilenode;

! Oid            binary_upgrade_next_pg_type_toast_oid = InvalidOid;

  static bool create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid,
                     Datum reloptions);
--- 32,40 ----
  #include "utils/syscache.h"

  /* Potentially set by contrib/pg_upgrade_support functions */
! extern Oid    binary_upgrade_next_toast_pg_class_oid;

! Oid            binary_upgrade_next_toast_pg_type_oid = InvalidOid;

  static bool create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid,
                     Datum reloptions);
*************** create_toast_table(Relation rel, Oid toa
*** 156,162 ****
       * creation even if it seems not to need one.
       */
      if (!needs_toast_table(rel) &&
!         !OidIsValid(binary_upgrade_next_toast_relfilenode))
          return false;

      /*
--- 156,162 ----
       * creation even if it seems not to need one.
       */
      if (!needs_toast_table(rel) &&
!         !OidIsValid(binary_upgrade_next_toast_pg_class_oid))
          return false;

      /*
*************** create_toast_table(Relation rel, Oid toa
*** 201,210 ****
          namespaceid = PG_TOAST_NAMESPACE;

      /* Use binary-upgrade override for pg_type.oid, if supplied. */
!     if (OidIsValid(binary_upgrade_next_pg_type_toast_oid))
      {
!         toast_typid = binary_upgrade_next_pg_type_toast_oid;
!         binary_upgrade_next_pg_type_toast_oid = InvalidOid;
      }

      toast_relid = heap_create_with_catalog(toast_relname,
--- 201,210 ----
          namespaceid = PG_TOAST_NAMESPACE;

      /* Use binary-upgrade override for pg_type.oid, if supplied. */
!     if (OidIsValid(binary_upgrade_next_toast_pg_type_oid))
      {
!         toast_typid = binary_upgrade_next_toast_pg_type_oid;
!         binary_upgrade_next_toast_pg_type_oid = InvalidOid;
      }

      toast_relid = heap_create_with_catalog(toast_relname,
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index bc66c3e..2ecb238 100644
*** /tmp/pgdiff.29009/LeePua_typecmds.c    Fri Jan  7 21:18:32 2011
--- src/backend/commands/typecmds.c    Fri Jan  7 18:21:38 2011
*************** typedef struct
*** 75,81 ****
  } RelToCheck;

  /* Potentially set by contrib/pg_upgrade_support functions */
! Oid            binary_upgrade_next_pg_type_array_oid = InvalidOid;

  static Oid    findTypeInputFunction(List *procname, Oid typeOid);
  static Oid    findTypeOutputFunction(List *procname, Oid typeOid);
--- 75,81 ----
  } RelToCheck;

  /* Potentially set by contrib/pg_upgrade_support functions */
! Oid            binary_upgrade_next_array_pg_type_oid = InvalidOid;

  static Oid    findTypeInputFunction(List *procname, Oid typeOid);
  static Oid    findTypeOutputFunction(List *procname, Oid typeOid);
*************** AssignTypeArrayOid(void)
*** 1519,1528 ****
      Oid            type_array_oid;

      /* Use binary-upgrade override for pg_type.typarray, if supplied. */
!     if (OidIsValid(binary_upgrade_next_pg_type_array_oid))
      {
!         type_array_oid = binary_upgrade_next_pg_type_array_oid;
!         binary_upgrade_next_pg_type_array_oid = InvalidOid;
      }
      else
      {
--- 1519,1528 ----
      Oid            type_array_oid;

      /* Use binary-upgrade override for pg_type.typarray, if supplied. */
!     if (OidIsValid(binary_upgrade_next_array_pg_type_oid))
      {
!         type_array_oid = binary_upgrade_next_array_pg_type_oid;
!         binary_upgrade_next_array_pg_type_oid = InvalidOid;
      }
      else
      {
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index 95218ee..40b414b 100644
*** /tmp/pgdiff.29009/LqKWze_pg_dump.c    Fri Jan  7 21:18:32 2011
--- src/bin/pg_dump/pg_dump.c    Fri Jan  7 20:43:49 2011
*************** static void binary_upgrade_set_type_oids
*** 228,234 ****
                                  PQExpBuffer upgrade_buffer, Oid pg_type_oid);
  static bool binary_upgrade_set_type_oids_by_rel_oid(
                                   PQExpBuffer upgrade_buffer, Oid pg_rel_oid);
! static void binary_upgrade_set_relfilenodes(PQExpBuffer upgrade_buffer,
                                  Oid pg_class_oid, bool is_index);
  static const char *getAttrName(int attrnum, TableInfo *tblInfo);
  static const char *fmtCopyColumnList(const TableInfo *ti);
--- 228,234 ----
                                  PQExpBuffer upgrade_buffer, Oid pg_type_oid);
  static bool binary_upgrade_set_type_oids_by_rel_oid(
                                   PQExpBuffer upgrade_buffer, Oid pg_rel_oid);
! static void binary_upgrade_set_pg_class_oids(PQExpBuffer upgrade_buffer,
                                  Oid pg_class_oid, bool is_index);
  static const char *getAttrName(int attrnum, TableInfo *tblInfo);
  static const char *fmtCopyColumnList(const TableInfo *ti);
*************** binary_upgrade_set_type_oids_by_type_oid
*** 2243,2249 ****
          appendPQExpBuffer(upgrade_buffer,
                 "\n-- For binary upgrade, must preserve pg_type array oid\n");
          appendPQExpBuffer(upgrade_buffer,
!                           "SELECT binary_upgrade.set_next_pg_type_array_oid('%u'::pg_catalog.oid);\n\n",
                            pg_type_array_oid);
      }

--- 2243,2249 ----
          appendPQExpBuffer(upgrade_buffer,
                 "\n-- For binary upgrade, must preserve pg_type array oid\n");
          appendPQExpBuffer(upgrade_buffer,
!                           "SELECT binary_upgrade.set_next_array_pg_type_oid('%u'::pg_catalog.oid);\n\n",
                            pg_type_array_oid);
      }

*************** binary_upgrade_set_type_oids_by_rel_oid(
*** 2296,2302 ****

          appendPQExpBuffer(upgrade_buffer, "\n-- For binary upgrade, must preserve pg_type toast oid\n");
          appendPQExpBuffer(upgrade_buffer,
!                           "SELECT binary_upgrade.set_next_pg_type_toast_oid('%u'::pg_catalog.oid);\n\n",
                            pg_type_toast_oid);

          toast_set = true;
--- 2296,2302 ----

          appendPQExpBuffer(upgrade_buffer, "\n-- For binary upgrade, must preserve pg_type toast oid\n");
          appendPQExpBuffer(upgrade_buffer,
!                           "SELECT binary_upgrade.set_next_toast_pg_type_oid('%u'::pg_catalog.oid);\n\n",
                            pg_type_toast_oid);

          toast_set = true;
*************** binary_upgrade_set_type_oids_by_rel_oid(
*** 2309,2332 ****
  }

  static void
! binary_upgrade_set_relfilenodes(PQExpBuffer upgrade_buffer, Oid pg_class_oid,
                                  bool is_index)
  {
      PQExpBuffer upgrade_query = createPQExpBuffer();
      int            ntups;
      PGresult   *upgrade_res;
-     Oid            pg_class_relfilenode;
      Oid            pg_class_reltoastrelid;
      Oid            pg_class_reltoastidxid;

-     /*
-      * Note: we don't need to use pg_relation_filenode() here because this
-      * function is not intended to be used against system catalogs. Otherwise
-      * we'd have to worry about which versions pg_relation_filenode is
-      * available in.
-      */
      appendPQExpBuffer(upgrade_query,
!                     "SELECT c.relfilenode, c.reltoastrelid, t.reltoastidxid "
                        "FROM pg_catalog.pg_class c LEFT JOIN "
                        "pg_catalog.pg_class t ON (c.reltoastrelid = t.oid) "
                        "WHERE c.oid = '%u'::pg_catalog.oid;",
--- 2309,2325 ----
  }

  static void
! binary_upgrade_set_pg_class_oids(PQExpBuffer upgrade_buffer, Oid pg_class_oid,
                                  bool is_index)
  {
      PQExpBuffer upgrade_query = createPQExpBuffer();
      int            ntups;
      PGresult   *upgrade_res;
      Oid            pg_class_reltoastrelid;
      Oid            pg_class_reltoastidxid;

      appendPQExpBuffer(upgrade_query,
!                     "SELECT c.reltoastrelid, t.reltoastidxid "
                        "FROM pg_catalog.pg_class c LEFT JOIN "
                        "pg_catalog.pg_class t ON (c.reltoastrelid = t.oid) "
                        "WHERE c.oid = '%u'::pg_catalog.oid;",
*************** binary_upgrade_set_relfilenodes(PQExpBuf
*** 2346,2389 ****
          exit_nicely();
      }

-     pg_class_relfilenode = atooid(PQgetvalue(upgrade_res, 0, PQfnumber(upgrade_res, "relfilenode")));
      pg_class_reltoastrelid = atooid(PQgetvalue(upgrade_res, 0, PQfnumber(upgrade_res, "reltoastrelid")));
      pg_class_reltoastidxid = atooid(PQgetvalue(upgrade_res, 0, PQfnumber(upgrade_res, "reltoastidxid")));

      appendPQExpBuffer(upgrade_buffer,
!                     "\n-- For binary upgrade, must preserve relfilenodes\n");

      if (!is_index)
      {
          appendPQExpBuffer(upgrade_buffer,
!                           "SELECT binary_upgrade.set_next_heap_relfilenode('%u'::pg_catalog.oid);\n",
!                           pg_class_relfilenode);
          /* only tables have toast tables, not indexes */
          if (OidIsValid(pg_class_reltoastrelid))
          {
              /*
!              * One complexity is that the table definition might not require the
!              * creation of a TOAST table, and the TOAST table might have been
!              * created long after table creation, when the table was loaded with
!              * wide data.  By setting the TOAST relfilenode we force creation of
!              * the TOAST heap and TOAST index by the backend so we can cleanly
!              * migrate the files during binary migration.
               */

              appendPQExpBuffer(upgrade_buffer,
!                               "SELECT binary_upgrade.set_next_toast_relfilenode('%u'::pg_catalog.oid);\n",
                                pg_class_reltoastrelid);

              /* every toast table has an index */
              appendPQExpBuffer(upgrade_buffer,
!                               "SELECT binary_upgrade.set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
                                pg_class_reltoastidxid);
          }
      }
      else
          appendPQExpBuffer(upgrade_buffer,
!                           "SELECT binary_upgrade.set_next_index_relfilenode('%u'::pg_catalog.oid);\n",
!                           pg_class_relfilenode);

      appendPQExpBuffer(upgrade_buffer, "\n");

--- 2339,2381 ----
          exit_nicely();
      }

      pg_class_reltoastrelid = atooid(PQgetvalue(upgrade_res, 0, PQfnumber(upgrade_res, "reltoastrelid")));
      pg_class_reltoastidxid = atooid(PQgetvalue(upgrade_res, 0, PQfnumber(upgrade_res, "reltoastidxid")));

      appendPQExpBuffer(upgrade_buffer,
!                     "\n-- For binary upgrade, must preserve pg_class oids\n");

      if (!is_index)
      {
          appendPQExpBuffer(upgrade_buffer,
!                           "SELECT binary_upgrade.set_next_heap_pg_class_oid('%u'::pg_catalog.oid);\n",
!                           pg_class_oid);
          /* only tables have toast tables, not indexes */
          if (OidIsValid(pg_class_reltoastrelid))
          {
              /*
!              * One complexity is that the table definition might not require
!              * the creation of a TOAST table, and the TOAST table might have
!              * been created long after table creation, when the table was
!              * loaded with wide data.  By setting the TOAST oid we force
!              * creation of the TOAST heap and TOAST index by the backend
!              * so we can cleanly copy the files during binary upgrade.
               */

              appendPQExpBuffer(upgrade_buffer,
!                               "SELECT binary_upgrade.set_next_toast_pg_class_oid('%u'::pg_catalog.oid);\n",
                                pg_class_reltoastrelid);

              /* every toast table has an index */
              appendPQExpBuffer(upgrade_buffer,
!                               "SELECT binary_upgrade.set_next_index_pg_class_oid('%u'::pg_catalog.oid);\n",
                                pg_class_reltoastidxid);
          }
      }
      else
          appendPQExpBuffer(upgrade_buffer,
!                           "SELECT binary_upgrade.set_next_index_pg_class_oid('%u'::pg_catalog.oid);\n",
!                           pg_class_oid);

      appendPQExpBuffer(upgrade_buffer, "\n");

*************** dumpCompositeType(Archive *fout, TypeInf
*** 7364,7370 ****
          Oid            typrelid = atooid(PQgetvalue(res, 0, i_typrelid));

          binary_upgrade_set_type_oids_by_type_oid(q, tyinfo->dobj.catId.oid);
!         binary_upgrade_set_relfilenodes(q, typrelid, false);
      }

      appendPQExpBuffer(q, "CREATE TYPE %s AS (",
--- 7356,7362 ----
          Oid            typrelid = atooid(PQgetvalue(res, 0, i_typrelid));

          binary_upgrade_set_type_oids_by_type_oid(q, tyinfo->dobj.catId.oid);
!         binary_upgrade_set_pg_class_oids(q, typrelid, false);
      }

      appendPQExpBuffer(q, "CREATE TYPE %s AS (",
*************** dumpTableSchema(Archive *fout, TableInfo
*** 11083,11089 ****
                            fmtId(tbinfo->dobj.name));

          if (binary_upgrade)
!             binary_upgrade_set_relfilenodes(q, tbinfo->dobj.catId.oid, false);

          appendPQExpBuffer(q, "CREATE VIEW %s AS\n    %s\n",
                            fmtId(tbinfo->dobj.name), viewdef);
--- 11075,11081 ----
                            fmtId(tbinfo->dobj.name));

          if (binary_upgrade)
!             binary_upgrade_set_pg_class_oids(q, tbinfo->dobj.catId.oid, false);

          appendPQExpBuffer(q, "CREATE VIEW %s AS\n    %s\n",
                            fmtId(tbinfo->dobj.name), viewdef);
*************** dumpTableSchema(Archive *fout, TableInfo
*** 11134,11140 ****
                            fmtId(tbinfo->dobj.name));

          if (binary_upgrade)
!             binary_upgrade_set_relfilenodes(q, tbinfo->dobj.catId.oid, false);

          appendPQExpBuffer(q, "CREATE %s%s %s",
                            tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED ?
--- 11126,11132 ----
                            fmtId(tbinfo->dobj.name));

          if (binary_upgrade)
!             binary_upgrade_set_pg_class_oids(q, tbinfo->dobj.catId.oid, false);

          appendPQExpBuffer(q, "CREATE %s%s %s",
                            tbinfo->relpersistence == RELPERSISTENCE_UNLOGGED ?
*************** dumpIndex(Archive *fout, IndxInfo *indxi
*** 11616,11622 ****
      if (indxinfo->indexconstraint == 0)
      {
          if (binary_upgrade)
!             binary_upgrade_set_relfilenodes(q, indxinfo->dobj.catId.oid, true);

          /* Plain secondary index */
          appendPQExpBuffer(q, "%s;\n", indxinfo->indexdef);
--- 11608,11614 ----
      if (indxinfo->indexconstraint == 0)
      {
          if (binary_upgrade)
!             binary_upgrade_set_pg_class_oids(q, indxinfo->dobj.catId.oid, true);

          /* Plain secondary index */
          appendPQExpBuffer(q, "%s;\n", indxinfo->indexdef);
*************** dumpConstraint(Archive *fout, Constraint
*** 11699,11705 ****
          }

          if (binary_upgrade && !coninfo->condef)
!             binary_upgrade_set_relfilenodes(q, indxinfo->dobj.catId.oid, true);

          appendPQExpBuffer(q, "ALTER TABLE ONLY %s\n",
                            fmtId(tbinfo->dobj.name));
--- 11691,11697 ----
          }

          if (binary_upgrade && !coninfo->condef)
!             binary_upgrade_set_pg_class_oids(q, indxinfo->dobj.catId.oid, true);

          appendPQExpBuffer(q, "ALTER TABLE ONLY %s\n",
                            fmtId(tbinfo->dobj.name));
*************** dumpSequence(Archive *fout, TableInfo *t
*** 12112,12118 ****

          if (binary_upgrade)
          {
!             binary_upgrade_set_relfilenodes(query, tbinfo->dobj.catId.oid, false);
              binary_upgrade_set_type_oids_by_rel_oid(query, tbinfo->dobj.catId.oid);
          }

--- 12104,12110 ----

          if (binary_upgrade)
          {
!             binary_upgrade_set_pg_class_oids(query, tbinfo->dobj.catId.oid, false);
              binary_upgrade_set_type_oids_by_rel_oid(query, tbinfo->dobj.catId.oid);
          }


pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Fixing GIN for empty/null/full-scan cases
Next
From: Robert Haas
Date:
Subject: Re: LOCK for non-tables