diff options
author | Jan Wieck <JanWieck@Yahoo.com> | 2003-09-28 17:46:19 +0000 |
---|---|---|
committer | Jan Wieck <JanWieck@Yahoo.com> | 2003-09-28 17:46:19 +0000 |
commit | 6518b4cdf7181104d2eb3d38bb68503d1059ca55 (patch) | |
tree | 66a5f96c61929d289de85b42339457f5f39c6267 | |
parent | 57040f50694a6cbfe276b6f6a3799518db7f549e (diff) | |
download | postgresql-6518b4cdf7181104d2eb3d38bb68503d1059ca55.tar.gz postgresql-6518b4cdf7181104d2eb3d38bb68503d1059ca55.zip |
Backpatched changes for rules when casts are dumped according to
discussion on hackers.
Jan
-rw-r--r-- | src/bin/pg_dump/pg_dump.c | 56 |
1 files changed, 49 insertions, 7 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 858faecc181..f3bd4bee791 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -22,7 +22,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.305.2.7 2003/06/25 04:09:15 momjian Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.305.2.8 2003/09/28 17:46:19 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -3816,6 +3816,7 @@ dumpCasts(Archive *fout, PQExpBuffer query = createPQExpBuffer(); PQExpBuffer defqry = createPQExpBuffer(); PQExpBuffer delqry = createPQExpBuffer(); + PQExpBuffer castsig = createPQExpBuffer(); int ntups; int i; @@ -3845,16 +3846,51 @@ dumpCasts(Archive *fout, 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); /* - * We treat the cast as being in the namespace of the underlying - * function. This doesn't handle binary compatible casts. Where - * should those go? + * 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_". */ - if (fidx < 0 || !finfo[fidx].pronamespace->dump) + 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 */ @@ -3870,6 +3906,7 @@ dumpCasts(Archive *fout, resetPQExpBuffer(defqry); resetPQExpBuffer(delqry); + resetPQExpBuffer(castsig); appendPQExpBuffer(delqry, "DROP CAST (%s AS %s);\n", getFormattedTypeName(castsource, zeroAsNone), @@ -3891,9 +3928,13 @@ dumpCasts(Archive *fout, appendPQExpBuffer(defqry, " AS IMPLICIT"); appendPQExpBuffer(defqry, ";\n"); + appendPQExpBuffer(castsig, "CAST (%s AS %s)", + getFormattedTypeName(castsource, zeroAsNone), + getFormattedTypeName(casttarget, zeroAsNone)); + ArchiveEntry(fout, castoid, - format_function_signature(&finfo[fidx], false), - finfo[fidx].pronamespace->nspname, "", + castsig->data, + tinfo[source_idx].typnamespace->nspname, "", "CAST", deps, defqry->data, delqry->data, NULL, NULL, NULL); @@ -3904,6 +3945,7 @@ dumpCasts(Archive *fout, destroyPQExpBuffer(query); destroyPQExpBuffer(defqry); destroyPQExpBuffer(delqry); + destroyPQExpBuffer(castsig); } |