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); }