aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bin/pg_dump/pg_dump.c78
1 files changed, 31 insertions, 47 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index b860e80c18b..02a6adf0fca 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -250,7 +250,7 @@ static char *convertRegProcReference(Archive *fout,
static char *getFormattedOperatorName(Archive *fout, const char *oproid);
static char *convertTSFunction(Archive *fout, Oid funcOid);
static Oid findLastBuiltinOid_V71(Archive *fout);
-static char *getFormattedTypeName(Archive *fout, Oid oid, OidOptions opts);
+static const char *getFormattedTypeName(Archive *fout, Oid oid, OidOptions opts);
static void getBlobs(Archive *fout);
static void dumpBlob(Archive *fout, BlobInfo *binfo);
static int dumpBlobs(Archive *fout, void *arg);
@@ -10784,13 +10784,9 @@ dumpBaseType(Archive *fout, TypeInfo *tyinfo)
}
if (OidIsValid(tyinfo->typelem))
- {
- char *elemType;
-
- elemType = getFormattedTypeName(fout, tyinfo->typelem, zeroAsOpaque);
- appendPQExpBuffer(q, ",\n ELEMENT = %s", elemType);
- free(elemType);
- }
+ appendPQExpBuffer(q, ",\n ELEMENT = %s",
+ getFormattedTypeName(fout, tyinfo->typelem,
+ zeroAsOpaque));
if (strcmp(typcategory, "U") != 0)
{
@@ -11596,7 +11592,7 @@ format_function_arguments_old(Archive *fout,
for (j = 0; j < nallargs; j++)
{
Oid typid;
- char *typname;
+ const char *typname;
const char *argmode;
const char *argname;
@@ -11635,7 +11631,6 @@ format_function_arguments_old(Archive *fout,
argname ? fmtId(argname) : "",
argname ? " " : "",
typname);
- free(typname);
}
appendPQExpBufferChar(&fn, ')');
return fn.data;
@@ -11664,15 +11659,12 @@ format_function_signature(Archive *fout, FuncInfo *finfo, bool honor_quotes)
appendPQExpBuffer(&fn, "%s(", finfo->dobj.name);
for (j = 0; j < finfo->nargs; j++)
{
- char *typname;
-
if (j > 0)
appendPQExpBufferStr(&fn, ", ");
- typname = getFormattedTypeName(fout, finfo->argtypes[j],
- zeroAsOpaque);
- appendPQExpBufferStr(&fn, typname);
- free(typname);
+ appendPQExpBufferStr(&fn,
+ getFormattedTypeName(fout, finfo->argtypes[j],
+ zeroAsOpaque));
}
appendPQExpBufferChar(&fn, ')');
return fn.data;
@@ -11715,7 +11707,6 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
char *prorows;
char *proparallel;
char *lanname;
- char *rettypename;
int nallargs;
char **allargtypes = NULL;
char **argmodes = NULL;
@@ -12046,14 +12037,10 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
else if (funcresult)
appendPQExpBuffer(q, " RETURNS %s", funcresult);
else
- {
- rettypename = getFormattedTypeName(fout, finfo->prorettype,
- zeroAsOpaque);
appendPQExpBuffer(q, " RETURNS %s%s",
(proretset[0] == 't') ? "SETOF " : "",
- rettypename);
- free(rettypename);
- }
+ getFormattedTypeName(fout, finfo->prorettype,
+ zeroAsOpaque));
appendPQExpBuffer(q, "\n LANGUAGE %s", fmtId(lanname));
@@ -12255,8 +12242,8 @@ dumpCast(Archive *fout, CastInfo *cast)
PQExpBuffer labelq;
PQExpBuffer castargs;
FuncInfo *funcInfo = NULL;
- char *sourceType;
- char *targetType;
+ const char *sourceType;
+ const char *targetType;
/* Skip if not to be dumped */
if (!cast->dobj.dump || dopt->dataOnly)
@@ -12343,9 +12330,6 @@ dumpCast(Archive *fout, CastInfo *cast)
NULL, "",
cast->dobj.catId, 0, cast->dobj.dumpId);
- free(sourceType);
- free(targetType);
-
destroyPQExpBuffer(defqry);
destroyPQExpBuffer(delqry);
destroyPQExpBuffer(labelq);
@@ -12366,7 +12350,7 @@ dumpTransform(Archive *fout, TransformInfo *transform)
FuncInfo *fromsqlFuncInfo = NULL;
FuncInfo *tosqlFuncInfo = NULL;
char *lanname;
- char *transformType;
+ const char *transformType;
/* Skip if not to be dumped */
if (!transform->dobj.dump || dopt->dataOnly)
@@ -12472,7 +12456,6 @@ dumpTransform(Archive *fout, TransformInfo *transform)
transform->dobj.catId, 0, transform->dobj.dumpId);
free(lanname);
- free(transformType);
destroyPQExpBuffer(defqry);
destroyPQExpBuffer(delqry);
destroyPQExpBuffer(labelq);
@@ -13759,17 +13742,11 @@ format_aggregate_signature(AggInfo *agginfo, Archive *fout, bool honor_quotes)
{
appendPQExpBufferChar(&buf, '(');
for (j = 0; j < agginfo->aggfn.nargs; j++)
- {
- char *typname;
-
- typname = getFormattedTypeName(fout, agginfo->aggfn.argtypes[j],
- zeroAsOpaque);
-
appendPQExpBuffer(&buf, "%s%s",
(j > 0) ? ", " : "",
- typname);
- free(typname);
- }
+ getFormattedTypeName(fout,
+ agginfo->aggfn.argtypes[j],
+ zeroAsOpaque));
appendPQExpBufferChar(&buf, ')');
}
return buf.data;
@@ -18472,8 +18449,10 @@ findDumpableDependencies(ArchiveHandle *AH, DumpableObject *dobj,
*
* This does not guarantee to schema-qualify the output, so it should not
* be used to create the target object name for CREATE or ALTER commands.
+ *
+ * Note that the result is cached and must not be freed by the caller.
*/
-static char *
+static const char *
getFormattedTypeName(Archive *fout, Oid oid, OidOptions opts)
{
TypeInfo *typeInfo;
@@ -18484,19 +18463,19 @@ getFormattedTypeName(Archive *fout, Oid oid, OidOptions opts)
if (oid == 0)
{
if ((opts & zeroAsOpaque) != 0)
- return pg_strdup(g_opaque_type);
+ return g_opaque_type;
else if ((opts & zeroAsAny) != 0)
- return pg_strdup("'any'");
+ return "'any'";
else if ((opts & zeroAsStar) != 0)
- return pg_strdup("*");
+ return "*";
else if ((opts & zeroAsNone) != 0)
- return pg_strdup("NONE");
+ return "NONE";
}
/* see if we have the result cached in the type's TypeInfo record */
typeInfo = findTypeByOid(oid);
if (typeInfo && typeInfo->ftypname)
- return pg_strdup(typeInfo->ftypname);
+ return typeInfo->ftypname;
query = createPQExpBuffer();
appendPQExpBuffer(query, "SELECT pg_catalog.format_type('%u'::pg_catalog.oid, NULL)",
@@ -18510,9 +18489,14 @@ getFormattedTypeName(Archive *fout, Oid oid, OidOptions opts)
PQclear(res);
destroyPQExpBuffer(query);
- /* cache a copy for later requests */
+ /*
+ * Cache the result for re-use in later requests, if possible. If we
+ * don't have a TypeInfo for the type, the string will be leaked once the
+ * caller is done with it ... but that case really should not happen, so
+ * leaking if it does seems acceptable.
+ */
if (typeInfo)
- typeInfo->ftypname = pg_strdup(result);
+ typeInfo->ftypname = result;
return result;
}