@@ -234,9 +234,9 @@ static char *format_function_arguments_old(Archive *fout,
234234 char * * argnames );
235235static char * format_function_signature (Archive * fout ,
236236 FuncInfo * finfo , bool honor_quotes );
237- static const char * convertRegProcReference (Archive * fout ,
237+ static char * convertRegProcReference (Archive * fout ,
238238 const char * proc );
239- static const char * convertOperatorReference (Archive * fout , const char * opr );
239+ static char * convertOperatorReference (Archive * fout , const char * opr );
240240static const char * convertTSFunction (Archive * fout , Oid funcOid );
241241static Oid findLastBuiltinOid_V71 (Archive * fout , const char * );
242242static Oid findLastBuiltinOid_V70 (Archive * fout );
@@ -10246,6 +10246,8 @@ dumpOpr(Archive *fout, OprInfo *oprinfo)
1024610246 char * oprjoin ;
1024710247 char * oprcanmerge ;
1024810248 char * oprcanhash ;
10249+ char * oprregproc ;
10250+ char * oprref ;
1024910251
1025010252 /* Skip if not to be dumped */
1025110253 if (!oprinfo -> dobj .dump || dataOnly )
@@ -10352,8 +10354,12 @@ dumpOpr(Archive *fout, OprInfo *oprinfo)
1035210354 oprcanmerge = PQgetvalue (res , 0 , i_oprcanmerge );
1035310355 oprcanhash = PQgetvalue (res , 0 , i_oprcanhash );
1035410356
10355- appendPQExpBuffer (details , " PROCEDURE = %s" ,
10356- convertRegProcReference (fout , oprcode ));
10357+ oprregproc = convertRegProcReference (fout , oprcode );
10358+ if (oprregproc )
10359+ {
10360+ appendPQExpBuffer (details , " PROCEDURE = %s" , oprregproc );
10361+ free (oprregproc );
10362+ }
1035710363
1035810364 appendPQExpBuffer (oprid , "%s (" ,
1035910365 oprinfo -> dobj .name );
@@ -10388,27 +10394,39 @@ dumpOpr(Archive *fout, OprInfo *oprinfo)
1038810394 else
1038910395 appendPQExpBufferStr (oprid , ", NONE)" );
1039010396
10391- name = convertOperatorReference (fout , oprcom );
10392- if (name )
10393- appendPQExpBuffer (details , ",\n COMMUTATOR = %s" , name );
10397+ oprref = convertOperatorReference (fout , oprcom );
10398+ if (oprref )
10399+ {
10400+ appendPQExpBuffer (details , ",\n COMMUTATOR = %s" , oprref );
10401+ free (oprref );
10402+ }
1039410403
10395- name = convertOperatorReference (fout , oprnegate );
10396- if (name )
10397- appendPQExpBuffer (details , ",\n NEGATOR = %s" , name );
10404+ oprref = convertOperatorReference (fout , oprnegate );
10405+ if (oprref )
10406+ {
10407+ appendPQExpBuffer (details , ",\n NEGATOR = %s" , oprref );
10408+ free (oprref );
10409+ }
1039810410
1039910411 if (strcmp (oprcanmerge , "t" ) == 0 )
1040010412 appendPQExpBufferStr (details , ",\n MERGES" );
1040110413
1040210414 if (strcmp (oprcanhash , "t" ) == 0 )
1040310415 appendPQExpBufferStr (details , ",\n HASHES" );
1040410416
10405- name = convertRegProcReference (fout , oprrest );
10406- if (name )
10407- appendPQExpBuffer (details , ",\n RESTRICT = %s" , name );
10417+ oprregproc = convertRegProcReference (fout , oprrest );
10418+ if (oprregproc )
10419+ {
10420+ appendPQExpBuffer (details , ",\n RESTRICT = %s" , oprregproc );
10421+ free (oprregproc );
10422+ }
1040810423
10409- name = convertRegProcReference (fout , oprjoin );
10410- if (name )
10411- appendPQExpBuffer (details , ",\n JOIN = %s" , name );
10424+ oprregproc = convertRegProcReference (fout , oprjoin );
10425+ if (oprregproc )
10426+ {
10427+ appendPQExpBuffer (details , ",\n JOIN = %s" , oprregproc );
10428+ free (oprregproc );
10429+ }
1041210430
1041310431 /*
1041410432 * DROP must be fully qualified in case same name appears in pg_catalog
@@ -10453,12 +10471,13 @@ dumpOpr(Archive *fout, OprInfo *oprinfo)
1045310471/*
1045410472 * Convert a function reference obtained from pg_operator
1045510473 *
10456- * Returns what to print, or NULL if function references is InvalidOid
10474+ * Returns allocated string of what to print, or NULL if function references
10475+ * is InvalidOid. Returned string is expected to be free'd by the caller.
1045710476 *
1045810477 * In 7.3 the input is a REGPROCEDURE display; we have to strip the
1045910478 * argument-types part. In prior versions, the input is a REGPROC display.
1046010479 */
10461- static const char *
10480+ static char *
1046210481convertRegProcReference (Archive * fout , const char * proc )
1046310482{
1046410483 /* In all cases "-" means a null reference */
@@ -10488,20 +10507,21 @@ convertRegProcReference(Archive *fout, const char *proc)
1048810507 }
1048910508
1049010509 /* REGPROC before 7.3 does not quote its result */
10491- return fmtId (proc );
10510+ return pg_strdup ( fmtId (proc ) );
1049210511}
1049310512
1049410513/*
1049510514 * Convert an operator cross-reference obtained from pg_operator
1049610515 *
10497- * Returns what to print, or NULL to print nothing
10516+ * Returns an allocated string of what to print, or NULL to print nothing.
10517+ * Caller is responsible for free'ing result string.
1049810518 *
1049910519 * In 7.3 and up the input is a REGOPERATOR display; we have to strip the
1050010520 * argument-types part, and add OPERATOR() decoration if the name is
1050110521 * schema-qualified. In older versions, the input is just a numeric OID,
1050210522 * which we search our operator list for.
1050310523 */
10504- static const char *
10524+ static char *
1050510525convertOperatorReference (Archive * fout , const char * opr )
1050610526{
1050710527 OprInfo * oprInfo ;
@@ -10549,7 +10569,7 @@ convertOperatorReference(Archive *fout, const char *opr)
1054910569 opr );
1055010570 return NULL ;
1055110571 }
10552- return oprInfo -> dobj .name ;
10572+ return pg_strdup ( oprInfo -> dobj .name ) ;
1055310573}
1055410574
1055510575/*
@@ -11522,6 +11542,7 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
1152211542 const char * aggtransfn ;
1152311543 const char * aggfinalfn ;
1152411544 const char * aggsortop ;
11545+ char * aggsortconvop ;
1152511546 bool hypothetical ;
1152611547 const char * aggtranstype ;
1152711548 const char * aggtransspace ;
@@ -11665,6 +11686,12 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
1166511686 {
1166611687 write_msg (NULL , "WARNING: aggregate function %s could not be dumped correctly for this database version; ignored\n" ,
1166711688 aggsig );
11689+
11690+ if (aggfullsig )
11691+ free (aggfullsig );
11692+
11693+ free (aggsig );
11694+
1166811695 return ;
1166911696 }
1167011697
@@ -11709,11 +11736,12 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
1170911736 aggfinalfn );
1171011737 }
1171111738
11712- aggsortop = convertOperatorReference (fout , aggsortop );
11713- if (aggsortop )
11739+ aggsortconvop = convertOperatorReference (fout , aggsortop );
11740+ if (aggsortconvop )
1171411741 {
1171511742 appendPQExpBuffer (details , ",\n SORTOP = %s" ,
11716- aggsortop );
11743+ aggsortconvop );
11744+ free (aggsortconvop );
1171711745 }
1171811746
1171911747 if (hypothetical )
@@ -12413,6 +12441,7 @@ dumpUserMappings(Archive *fout,
1241312441
1241412442 destroyPQExpBuffer (query );
1241512443 destroyPQExpBuffer (delq );
12444+ destroyPQExpBuffer (tag );
1241612445 destroyPQExpBuffer (q );
1241712446}
1241812447
0 commit comments