@@ -2453,6 +2453,7 @@ dumpDatabase(Archive *fout)
2453
2453
PQExpBuffer dbQry = createPQExpBuffer();
2454
2454
PQExpBuffer delQry = createPQExpBuffer();
2455
2455
PQExpBuffer creaQry = createPQExpBuffer();
2456
+ PQExpBuffer labelq = createPQExpBuffer();
2456
2457
PGconn *conn = GetConnection(fout);
2457
2458
PGresult *res;
2458
2459
int i_tableoid,
@@ -2711,16 +2712,20 @@ dumpDatabase(Archive *fout)
2711
2712
destroyPQExpBuffer(loOutQry);
2712
2713
}
2713
2714
2715
+ /* Compute correct tag for comments etc */
2716
+ appendPQExpBuffer(labelq, "DATABASE %s", fmtId(datname));
2717
+
2714
2718
/* Dump DB comment if any */
2715
2719
if (fout->remoteVersion >= 80200)
2716
2720
{
2717
2721
/*
2718
- * 8.2 keeps comments on shared objects in a shared table, so we
2719
- * cannot use the dumpComment used for other database objects.
2722
+ * 8.2 and up keep comments on shared objects in a shared table, so we
2723
+ * cannot use the dumpComment() code used for other database objects.
2724
+ * Be careful that the ArchiveEntry parameters match that function.
2720
2725
*/
2721
2726
char *comment = PQgetvalue(res, 0, PQfnumber(res, "description"));
2722
2727
2723
- if (comment && strlen( comment) )
2728
+ if (comment && * comment)
2724
2729
{
2725
2730
resetPQExpBuffer(dbQry);
2726
2731
@@ -2732,17 +2737,17 @@ dumpDatabase(Archive *fout)
2732
2737
appendStringLiteralAH(dbQry, comment, fout);
2733
2738
appendPQExpBufferStr(dbQry, ";\n");
2734
2739
2735
- ArchiveEntry(fout, dbCatId, createDumpId(), datname, NULL, NULL,
2736
- dba, false, "COMMENT", SECTION_NONE,
2740
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
2741
+ labelq->data, NULL, NULL, dba,
2742
+ false, "COMMENT", SECTION_NONE,
2737
2743
dbQry->data, "", NULL,
2738
- &dbDumpId, 1, NULL, NULL);
2744
+ &(dbDumpId), 1,
2745
+ NULL, NULL);
2739
2746
}
2740
2747
}
2741
2748
else
2742
2749
{
2743
- resetPQExpBuffer(dbQry);
2744
- appendPQExpBuffer(dbQry, "DATABASE %s", fmtId(datname));
2745
- dumpComment(fout, dbQry->data, NULL, "",
2750
+ dumpComment(fout, labelq->data, NULL, dba,
2746
2751
dbCatId, 0, dbDumpId);
2747
2752
}
2748
2753
@@ -2758,11 +2763,13 @@ dumpDatabase(Archive *fout)
2758
2763
shres = ExecuteSqlQuery(fout, seclabelQry->data, PGRES_TUPLES_OK);
2759
2764
resetPQExpBuffer(seclabelQry);
2760
2765
emitShSecLabels(conn, shres, seclabelQry, "DATABASE", datname);
2761
- if (strlen(seclabelQry->data))
2762
- ArchiveEntry(fout, dbCatId, createDumpId(), datname, NULL, NULL,
2763
- dba, false, "SECURITY LABEL", SECTION_NONE,
2766
+ if (seclabelQry->len > 0)
2767
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
2768
+ labelq->data, NULL, NULL, dba,
2769
+ false, "SECURITY LABEL", SECTION_NONE,
2764
2770
seclabelQry->data, "", NULL,
2765
- &dbDumpId, 1, NULL, NULL);
2771
+ &(dbDumpId), 1,
2772
+ NULL, NULL);
2766
2773
destroyPQExpBuffer(seclabelQry);
2767
2774
PQclear(shres);
2768
2775
}
@@ -2772,6 +2779,7 @@ dumpDatabase(Archive *fout)
2772
2779
destroyPQExpBuffer(dbQry);
2773
2780
destroyPQExpBuffer(delQry);
2774
2781
destroyPQExpBuffer(creaQry);
2782
+ destroyPQExpBuffer(labelq);
2775
2783
}
2776
2784
2777
2785
/*
@@ -9552,7 +9560,7 @@ dumpNamespace(Archive *fout, NamespaceInfo *nspinfo)
9552
9560
9553
9561
if (nspinfo->dobj.dump & DUMP_COMPONENT_ACL)
9554
9562
dumpACL(fout, nspinfo->dobj.catId, nspinfo->dobj.dumpId, "SCHEMA",
9555
- qnspname, NULL, nspinfo->dobj.name , NULL,
9563
+ qnspname, NULL, labelq->data , NULL,
9556
9564
nspinfo->rolname, nspinfo->nspacl, nspinfo->rnspacl,
9557
9565
nspinfo->initnspacl, nspinfo->initrnspacl);
9558
9566
@@ -9847,7 +9855,7 @@ dumpEnumType(Archive *fout, TypeInfo *tyinfo)
9847
9855
9848
9856
if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
9849
9857
dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
9850
- qtypname, NULL, tyinfo->dobj.name ,
9858
+ qtypname, NULL, labelq->data ,
9851
9859
tyinfo->dobj.namespace->dobj.name,
9852
9860
tyinfo->rolname, tyinfo->typacl, tyinfo->rtypacl,
9853
9861
tyinfo->inittypacl, tyinfo->initrtypacl);
@@ -9986,7 +9994,7 @@ dumpRangeType(Archive *fout, TypeInfo *tyinfo)
9986
9994
9987
9995
if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
9988
9996
dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
9989
- qtypname, NULL, tyinfo->dobj.name ,
9997
+ qtypname, NULL, labelq->data ,
9990
9998
tyinfo->dobj.namespace->dobj.name,
9991
9999
tyinfo->rolname, tyinfo->typacl, tyinfo->rtypacl,
9992
10000
tyinfo->inittypacl, tyinfo->initrtypacl);
@@ -10062,7 +10070,7 @@ dumpUndefinedType(Archive *fout, TypeInfo *tyinfo)
10062
10070
10063
10071
if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
10064
10072
dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
10065
- qtypname, NULL, tyinfo->dobj.name ,
10073
+ qtypname, NULL, labelq->data ,
10066
10074
tyinfo->dobj.namespace->dobj.name,
10067
10075
tyinfo->rolname, tyinfo->typacl, tyinfo->rtypacl,
10068
10076
tyinfo->inittypacl, tyinfo->initrtypacl);
@@ -10347,7 +10355,7 @@ dumpBaseType(Archive *fout, TypeInfo *tyinfo)
10347
10355
10348
10356
if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
10349
10357
dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
10350
- qtypname, NULL, tyinfo->dobj.name ,
10358
+ qtypname, NULL, labelq->data ,
10351
10359
tyinfo->dobj.namespace->dobj.name,
10352
10360
tyinfo->rolname, tyinfo->typacl, tyinfo->rtypacl,
10353
10361
tyinfo->inittypacl, tyinfo->initrtypacl);
@@ -10515,7 +10523,7 @@ dumpDomain(Archive *fout, TypeInfo *tyinfo)
10515
10523
10516
10524
if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
10517
10525
dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
10518
- qtypname, NULL, tyinfo->dobj.name ,
10526
+ qtypname, NULL, labelq->data ,
10519
10527
tyinfo->dobj.namespace->dobj.name,
10520
10528
tyinfo->rolname, tyinfo->typacl, tyinfo->rtypacl,
10521
10529
tyinfo->inittypacl, tyinfo->initrtypacl);
@@ -10750,7 +10758,7 @@ dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
10750
10758
10751
10759
if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
10752
10760
dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
10753
- qtypname, NULL, tyinfo->dobj.name ,
10761
+ qtypname, NULL, labelq->data ,
10754
10762
tyinfo->dobj.namespace->dobj.name,
10755
10763
tyinfo->rolname, tyinfo->typacl, tyinfo->rtypacl,
10756
10764
tyinfo->inittypacl, tyinfo->initrtypacl);
@@ -11068,7 +11076,7 @@ dumpProcLang(Archive *fout, ProcLangInfo *plang)
11068
11076
11069
11077
if (plang->lanpltrusted && plang->dobj.dump & DUMP_COMPONENT_ACL)
11070
11078
dumpACL(fout, plang->dobj.catId, plang->dobj.dumpId, "LANGUAGE",
11071
- qlanname, NULL, plang->dobj.name ,
11079
+ qlanname, NULL, labelq->data ,
11072
11080
lanschema,
11073
11081
plang->lanowner, plang->lanacl, plang->rlanacl,
11074
11082
plang->initlanacl, plang->initrlanacl);
@@ -11688,7 +11696,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
11688
11696
11689
11697
if (finfo->dobj.dump & DUMP_COMPONENT_ACL)
11690
11698
dumpACL(fout, finfo->dobj.catId, finfo->dobj.dumpId, "FUNCTION",
11691
- funcsig, NULL, funcsig_tag ,
11699
+ funcsig, NULL, labelq->data ,
11692
11700
finfo->dobj.namespace->dobj.name,
11693
11701
finfo->rolname, finfo->proacl, finfo->rproacl,
11694
11702
finfo->initproacl, finfo->initrproacl);
@@ -13678,15 +13686,13 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
13678
13686
* syntax for zero-argument aggregates and ordered-set aggregates.
13679
13687
*/
13680
13688
free(aggsig);
13681
- free(aggsig_tag);
13682
13689
13683
13690
aggsig = format_function_signature(fout, &agginfo->aggfn, true);
13684
- aggsig_tag = format_function_signature(fout, &agginfo->aggfn, false);
13685
13691
13686
13692
if (agginfo->aggfn.dobj.dump & DUMP_COMPONENT_ACL)
13687
13693
dumpACL(fout, agginfo->aggfn.dobj.catId, agginfo->aggfn.dobj.dumpId,
13688
13694
"FUNCTION",
13689
- aggsig, NULL, aggsig_tag ,
13695
+ aggsig, NULL, labelq->data ,
13690
13696
agginfo->aggfn.dobj.namespace->dobj.name,
13691
13697
agginfo->aggfn.rolname, agginfo->aggfn.proacl,
13692
13698
agginfo->aggfn.rproacl,
@@ -14132,7 +14138,7 @@ dumpForeignDataWrapper(Archive *fout, FdwInfo *fdwinfo)
14132
14138
if (fdwinfo->dobj.dump & DUMP_COMPONENT_ACL)
14133
14139
dumpACL(fout, fdwinfo->dobj.catId, fdwinfo->dobj.dumpId,
14134
14140
"FOREIGN DATA WRAPPER",
14135
- qfdwname, NULL, fdwinfo->dobj.name ,
14141
+ qfdwname, NULL, labelq->data ,
14136
14142
NULL, fdwinfo->rolname,
14137
14143
fdwinfo->fdwacl, fdwinfo->rfdwacl,
14138
14144
fdwinfo->initfdwacl, fdwinfo->initrfdwacl);
@@ -14229,7 +14235,7 @@ dumpForeignServer(Archive *fout, ForeignServerInfo *srvinfo)
14229
14235
if (srvinfo->dobj.dump & DUMP_COMPONENT_ACL)
14230
14236
dumpACL(fout, srvinfo->dobj.catId, srvinfo->dobj.dumpId,
14231
14237
"FOREIGN SERVER",
14232
- qsrvname, NULL, srvinfo->dobj.name ,
14238
+ qsrvname, NULL, labelq->data ,
14233
14239
NULL, srvinfo->rolname,
14234
14240
srvinfo->srvacl, srvinfo->rsrvacl,
14235
14241
srvinfo->initsrvacl, srvinfo->initrsrvacl);
@@ -14440,7 +14446,8 @@ dumpDefaultACL(Archive *fout, DefaultACLInfo *daclinfo)
14440
14446
* FOREIGN DATA WRAPPER, SERVER, or LARGE OBJECT.
14441
14447
* 'name' is the formatted name of the object. Must be quoted etc. already.
14442
14448
* 'subname' is the formatted name of the sub-object, if any. Must be quoted.
14443
- * 'tag' is the tag for the archive entry (typ. unquoted name of object).
14449
+ * 'tag' is the tag for the archive entry (should be the same tag as would be
14450
+ * used for comments etc; for example "TABLE foo").
14444
14451
* 'nspname' is the namespace the object is in (NULL if none).
14445
14452
* 'owner' is the owner, NULL if there is no owner (for languages).
14446
14453
* 'acls' contains the ACL string of the object from the appropriate system
@@ -14550,7 +14557,7 @@ dumpSecLabel(Archive *fout, const char *target,
14550
14557
if (dopt->no_security_labels)
14551
14558
return;
14552
14559
14553
- /* Comments are schema not data ... except blob comments are data */
14560
+ /* Security labels are schema not data ... except blob labels are data */
14554
14561
if (strncmp(target, "LARGE OBJECT ", 13) != 0)
14555
14562
{
14556
14563
if (dopt->dataOnly)
@@ -14844,13 +14851,18 @@ dumpTable(Archive *fout, TableInfo *tbinfo)
14844
14851
/* Handle the ACL here */
14845
14852
namecopy = pg_strdup(fmtId(tbinfo->dobj.name));
14846
14853
if (tbinfo->dobj.dump & DUMP_COMPONENT_ACL)
14854
+ {
14855
+ const char *objtype =
14856
+ (tbinfo->relkind == RELKIND_SEQUENCE) ? "SEQUENCE" : "TABLE";
14857
+ char *acltag = psprintf("%s %s", objtype, namecopy);
14858
+
14847
14859
dumpACL(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId,
14848
- (tbinfo->relkind == RELKIND_SEQUENCE) ? "SEQUENCE" :
14849
- "TABLE",
14850
- namecopy, NULL, tbinfo->dobj.name,
14860
+ objtype, namecopy, NULL, acltag,
14851
14861
tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
14852
14862
tbinfo->relacl, tbinfo->rrelacl,
14853
14863
tbinfo->initrelacl, tbinfo->initrrelacl);
14864
+ free(acltag);
14865
+ }
14854
14866
14855
14867
/*
14856
14868
* Handle column ACLs, if any. Note: we pull these with a separate query
@@ -14934,7 +14946,7 @@ dumpTable(Archive *fout, TableInfo *tbinfo)
14934
14946
char *acltag;
14935
14947
14936
14948
attnamecopy = pg_strdup(fmtId(attname));
14937
- acltag = psprintf("%s.%s", tbinfo->dobj.name, attname );
14949
+ acltag = psprintf("COLUMN %s.%s", namecopy, attnamecopy );
14938
14950
/* Column's GRANT type is always TABLE */
14939
14951
dumpACL(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId, "TABLE",
14940
14952
namecopy, attnamecopy, acltag,
0 commit comments