Re: pg_dump doesn't dump binary compatible casts - Mailing list pgsql-hackers

From Jan Wieck
Subject Re: pg_dump doesn't dump binary compatible casts
Date
Msg-id 3F75B0BE.40700@Yahoo.com
Whole thread Raw
In response to Re: pg_dump doesn't dump binary compatible casts  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: pg_dump doesn't dump binary compatible casts
List pgsql-hackers

Tom Lane wrote:
> Jan Wieck <JanWieck@Yahoo.com> writes:
>> That eliminated, a cast should be dumped if one or more of the three
>> objects (source, target and function) are not builtin AND all the
>> non-builtin objects belong to namespaces included in the dump.
>
> Where "builtin" is defined as "belongs to pg_catalog schema", you mean?
> I think that works for me ...

Okay,

I have more precisely defined "builtin" as "belongs to a schema who's
name starts with pg_", as that is how we distinguish what namespaces get
dumped in the first place.

The patch is applied to 7.4 according to being a bug. The same patch
would cleanly apply to 7.3.4 as well, so my question is do we want to
backpatch?


Jan

--
#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me.                                  #
#================================================== JanWieck@Yahoo.com #
diff -crN ../src.orig/bin/pg_dump/pg_dump.c ./bin/pg_dump/pg_dump.c
*** ../src.orig/bin/pg_dump/pg_dump.c    Tue Sep 23 10:10:31 2003
--- ./bin/pg_dump/pg_dump.c    Sat Sep 27 10:18:55 2003
***************
*** 3912,3917 ****
--- 3912,3918 ----
      PQExpBuffer query = createPQExpBuffer();
      PQExpBuffer defqry = createPQExpBuffer();
      PQExpBuffer delqry = createPQExpBuffer();
+     PQExpBuffer castsig = createPQExpBuffer();
      int            ntups;
      int            i;

***************
*** 3941,3956 ****
          char       *castcontext = PQgetvalue(res, i, 4);
          int            fidx = -1;
          const char *((*deps)[]);

          if (strcmp(castfunc, "0") != 0)
              fidx = findFuncByOid(finfo, numFuncs, castfunc);

          /*
!          * We treat the cast as being in the namespace of the underlying
!          * function.  This doesn't handle binary compatible casts.  Where
!          * should those go?
           */
!         if (fidx < 0 || !finfo[fidx].pronamespace->dump)
              continue;

          /* Make a dependency to ensure function is dumped first */
--- 3942,3992 ----
          char       *castcontext = PQgetvalue(res, i, 4);
          int            fidx = -1;
          const char *((*deps)[]);
+         int            source_idx;
+         int            target_idx;

          if (strcmp(castfunc, "0") != 0)
              fidx = findFuncByOid(finfo, numFuncs, castfunc);

          /*
!          * As per discussion we dump casts if one or more of the underlying
!          * objects (the conversion function and the two data types) are not
!          * builtin AND if all of the non-builtin objects namespaces are
!          * included in the dump. Builtin meaning, the namespace name does
!          * not start with "pg_".
           */
!         source_idx = findTypeByOid(tinfo, numTypes, castsource);
!         target_idx = findTypeByOid(tinfo, numTypes, casttarget);
!
!         /*
!          * Skip this cast if all objects are from pg_
!          */
!         if ((fidx < 0 || strncmp(finfo[fidx].pronamespace->nspname, "pg_", 3) == 0) &&
!                 strncmp(tinfo[source_idx].typnamespace->nspname, "pg_", 3) == 0 &&
!                 strncmp(tinfo[target_idx].typnamespace->nspname, "pg_", 3) == 0)
!             continue;
!
!         /*
!          * Skip cast if function isn't from pg_ and that namespace is
!          * not dumped.
!          */
!         if (fidx >= 0 &&
!                 strncmp(finfo[fidx].pronamespace->nspname, "pg_", 3) != 0 &&
!                 !finfo[fidx].pronamespace->dump)
!             continue;
!
!         /*
!          * Same for the Source type
!          */
!         if (strncmp(tinfo[source_idx].typnamespace->nspname, "pg_", 3) != 0 &&
!                 !tinfo[source_idx].typnamespace->dump)
!             continue;
!
!         /*
!          * and the target type.
!          */
!         if (strncmp(tinfo[target_idx].typnamespace->nspname, "pg_", 3) != 0 &&
!                 !tinfo[target_idx].typnamespace->dump)
              continue;

          /* Make a dependency to ensure function is dumped first */
***************
*** 3966,3971 ****
--- 4002,4008 ----

          resetPQExpBuffer(defqry);
          resetPQExpBuffer(delqry);
+         resetPQExpBuffer(castsig);

          appendPQExpBuffer(delqry, "DROP CAST (%s AS %s);\n",
                            getFormattedTypeName(castsource, zeroAsNone),
***************
*** 3987,3995 ****
              appendPQExpBuffer(defqry, " AS IMPLICIT");
          appendPQExpBuffer(defqry, ";\n");

          ArchiveEntry(fout, castoid,
!                      format_function_signature(&finfo[fidx], false),
!                      finfo[fidx].pronamespace->nspname, "",
                       "CAST", deps,
                       defqry->data, delqry->data,
                       NULL, NULL, NULL);
--- 4024,4036 ----
              appendPQExpBuffer(defqry, " AS IMPLICIT");
          appendPQExpBuffer(defqry, ";\n");

+         appendPQExpBuffer(castsig, "CAST (%s AS %s)",
+                           getFormattedTypeName(castsource, zeroAsNone),
+                           getFormattedTypeName(casttarget, zeroAsNone));
+
          ArchiveEntry(fout, castoid,
!                      castsig->data,
!                      tinfo[source_idx].typnamespace->nspname, "",
                       "CAST", deps,
                       defqry->data, delqry->data,
                       NULL, NULL, NULL);
***************
*** 4000,4005 ****
--- 4041,4047 ----
      destroyPQExpBuffer(query);
      destroyPQExpBuffer(defqry);
      destroyPQExpBuffer(delqry);
+     destroyPQExpBuffer(castsig);
  }



pgsql-hackers by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: FreeBSD Thread-safe functions ...
Next
From: Bruce Momjian
Date:
Subject: Re: getaddrinfo() for threading instead of gethostbyname()