@@ -234,9 +234,9 @@ static char *format_function_arguments_old(Archive *fout,
234
234
char * * argnames );
235
235
static char * format_function_signature (Archive * fout ,
236
236
FuncInfo * finfo , bool honor_quotes );
237
- static const char * convertRegProcReference (Archive * fout ,
237
+ static char * convertRegProcReference (Archive * fout ,
238
238
const char * proc );
239
- static const char * convertOperatorReference (Archive * fout , const char * opr );
239
+ static char * convertOperatorReference (Archive * fout , const char * opr );
240
240
static const char * convertTSFunction (Archive * fout , Oid funcOid );
241
241
static Oid findLastBuiltinOid_V71 (Archive * fout , const char * );
242
242
static Oid findLastBuiltinOid_V70 (Archive * fout );
@@ -10246,6 +10246,8 @@ dumpOpr(Archive *fout, OprInfo *oprinfo)
10246
10246
char * oprjoin ;
10247
10247
char * oprcanmerge ;
10248
10248
char * oprcanhash ;
10249
+ char * oprregproc ;
10250
+ char * oprref ;
10249
10251
10250
10252
/* Skip if not to be dumped */
10251
10253
if (!oprinfo -> dobj .dump || dataOnly )
@@ -10352,8 +10354,12 @@ dumpOpr(Archive *fout, OprInfo *oprinfo)
10352
10354
oprcanmerge = PQgetvalue (res , 0 , i_oprcanmerge );
10353
10355
oprcanhash = PQgetvalue (res , 0 , i_oprcanhash );
10354
10356
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
+ }
10357
10363
10358
10364
appendPQExpBuffer (oprid , "%s (" ,
10359
10365
oprinfo -> dobj .name );
@@ -10388,27 +10394,39 @@ dumpOpr(Archive *fout, OprInfo *oprinfo)
10388
10394
else
10389
10395
appendPQExpBufferStr (oprid , ", NONE)" );
10390
10396
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
+ }
10394
10403
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
+ }
10398
10410
10399
10411
if (strcmp (oprcanmerge , "t" ) == 0 )
10400
10412
appendPQExpBufferStr (details , ",\n MERGES" );
10401
10413
10402
10414
if (strcmp (oprcanhash , "t" ) == 0 )
10403
10415
appendPQExpBufferStr (details , ",\n HASHES" );
10404
10416
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
+ }
10408
10423
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
+ }
10412
10430
10413
10431
/*
10414
10432
* DROP must be fully qualified in case same name appears in pg_catalog
@@ -10453,12 +10471,13 @@ dumpOpr(Archive *fout, OprInfo *oprinfo)
10453
10471
/*
10454
10472
* Convert a function reference obtained from pg_operator
10455
10473
*
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.
10457
10476
*
10458
10477
* In 7.3 the input is a REGPROCEDURE display; we have to strip the
10459
10478
* argument-types part. In prior versions, the input is a REGPROC display.
10460
10479
*/
10461
- static const char *
10480
+ static char *
10462
10481
convertRegProcReference (Archive * fout , const char * proc )
10463
10482
{
10464
10483
/* In all cases "-" means a null reference */
@@ -10488,20 +10507,21 @@ convertRegProcReference(Archive *fout, const char *proc)
10488
10507
}
10489
10508
10490
10509
/* REGPROC before 7.3 does not quote its result */
10491
- return fmtId (proc );
10510
+ return pg_strdup ( fmtId (proc ) );
10492
10511
}
10493
10512
10494
10513
/*
10495
10514
* Convert an operator cross-reference obtained from pg_operator
10496
10515
*
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.
10498
10518
*
10499
10519
* In 7.3 and up the input is a REGOPERATOR display; we have to strip the
10500
10520
* argument-types part, and add OPERATOR() decoration if the name is
10501
10521
* schema-qualified. In older versions, the input is just a numeric OID,
10502
10522
* which we search our operator list for.
10503
10523
*/
10504
- static const char *
10524
+ static char *
10505
10525
convertOperatorReference (Archive * fout , const char * opr )
10506
10526
{
10507
10527
OprInfo * oprInfo ;
@@ -10549,7 +10569,7 @@ convertOperatorReference(Archive *fout, const char *opr)
10549
10569
opr );
10550
10570
return NULL ;
10551
10571
}
10552
- return oprInfo -> dobj .name ;
10572
+ return pg_strdup ( oprInfo -> dobj .name ) ;
10553
10573
}
10554
10574
10555
10575
/*
@@ -11522,6 +11542,7 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
11522
11542
const char * aggtransfn ;
11523
11543
const char * aggfinalfn ;
11524
11544
const char * aggsortop ;
11545
+ char * aggsortconvop ;
11525
11546
bool hypothetical ;
11526
11547
const char * aggtranstype ;
11527
11548
const char * aggtransspace ;
@@ -11665,6 +11686,12 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
11665
11686
{
11666
11687
write_msg (NULL , "WARNING: aggregate function %s could not be dumped correctly for this database version; ignored\n" ,
11667
11688
aggsig );
11689
+
11690
+ if (aggfullsig )
11691
+ free (aggfullsig );
11692
+
11693
+ free (aggsig );
11694
+
11668
11695
return ;
11669
11696
}
11670
11697
@@ -11709,11 +11736,12 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
11709
11736
aggfinalfn );
11710
11737
}
11711
11738
11712
- aggsortop = convertOperatorReference (fout , aggsortop );
11713
- if (aggsortop )
11739
+ aggsortconvop = convertOperatorReference (fout , aggsortop );
11740
+ if (aggsortconvop )
11714
11741
{
11715
11742
appendPQExpBuffer (details , ",\n SORTOP = %s" ,
11716
- aggsortop );
11743
+ aggsortconvop );
11744
+ free (aggsortconvop );
11717
11745
}
11718
11746
11719
11747
if (hypothetical )
@@ -12413,6 +12441,7 @@ dumpUserMappings(Archive *fout,
12413
12441
12414
12442
destroyPQExpBuffer (query );
12415
12443
destroyPQExpBuffer (delq );
12444
+ destroyPQExpBuffer (tag );
12416
12445
destroyPQExpBuffer (q );
12417
12446
}
12418
12447
0 commit comments