@@ -2426,6 +2426,7 @@ dumpDatabase(Archive *fout)
2426
2426
PQExpBuffer dbQry = createPQExpBuffer();
2427
2427
PQExpBuffer delQry = createPQExpBuffer();
2428
2428
PQExpBuffer creaQry = createPQExpBuffer();
2429
+ PQExpBuffer labelq = createPQExpBuffer();
2429
2430
PGconn *conn = GetConnection(fout);
2430
2431
PGresult *res;
2431
2432
int i_tableoid,
@@ -2712,16 +2713,20 @@ dumpDatabase(Archive *fout)
2712
2713
destroyPQExpBuffer(loOutQry);
2713
2714
}
2714
2715
2716
+ /* Compute correct tag for comments etc */
2717
+ appendPQExpBuffer(labelq, "DATABASE %s", fmtId(datname));
2718
+
2715
2719
/* Dump DB comment if any */
2716
2720
if (fout->remoteVersion >= 80200)
2717
2721
{
2718
2722
/*
2719
- * 8.2 keeps comments on shared objects in a shared table, so we
2720
- * cannot use the dumpComment used for other database objects.
2723
+ * 8.2 and up keep comments on shared objects in a shared table, so we
2724
+ * cannot use the dumpComment() code used for other database objects.
2725
+ * Be careful that the ArchiveEntry parameters match that function.
2721
2726
*/
2722
2727
char *comment = PQgetvalue(res, 0, PQfnumber(res, "description"));
2723
2728
2724
- if (comment && strlen( comment) )
2729
+ if (comment && * comment)
2725
2730
{
2726
2731
resetPQExpBuffer(dbQry);
2727
2732
@@ -2733,17 +2738,17 @@ dumpDatabase(Archive *fout)
2733
2738
appendStringLiteralAH(dbQry, comment, fout);
2734
2739
appendPQExpBufferStr(dbQry, ";\n");
2735
2740
2736
- ArchiveEntry(fout, dbCatId, createDumpId(), datname, NULL, NULL,
2737
- dba, false, "COMMENT", SECTION_NONE,
2741
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
2742
+ labelq->data, NULL, NULL, dba,
2743
+ false, "COMMENT", SECTION_NONE,
2738
2744
dbQry->data, "", NULL,
2739
- &dbDumpId, 1, NULL, NULL);
2745
+ &(dbDumpId), 1,
2746
+ NULL, NULL);
2740
2747
}
2741
2748
}
2742
2749
else
2743
2750
{
2744
- resetPQExpBuffer(dbQry);
2745
- appendPQExpBuffer(dbQry, "DATABASE %s", fmtId(datname));
2746
- dumpComment(fout, dbQry->data, NULL, "",
2751
+ dumpComment(fout, labelq->data, NULL, dba,
2747
2752
dbCatId, 0, dbDumpId);
2748
2753
}
2749
2754
@@ -2759,11 +2764,13 @@ dumpDatabase(Archive *fout)
2759
2764
shres = ExecuteSqlQuery(fout, seclabelQry->data, PGRES_TUPLES_OK);
2760
2765
resetPQExpBuffer(seclabelQry);
2761
2766
emitShSecLabels(conn, shres, seclabelQry, "DATABASE", datname);
2762
- if (strlen(seclabelQry->data))
2763
- ArchiveEntry(fout, dbCatId, createDumpId(), datname, NULL, NULL,
2764
- dba, false, "SECURITY LABEL", SECTION_NONE,
2767
+ if (seclabelQry->len > 0)
2768
+ ArchiveEntry(fout, nilCatalogId, createDumpId(),
2769
+ labelq->data, NULL, NULL, dba,
2770
+ false, "SECURITY LABEL", SECTION_NONE,
2765
2771
seclabelQry->data, "", NULL,
2766
- &dbDumpId, 1, NULL, NULL);
2772
+ &(dbDumpId), 1,
2773
+ NULL, NULL);
2767
2774
destroyPQExpBuffer(seclabelQry);
2768
2775
PQclear(shres);
2769
2776
}
@@ -2773,6 +2780,7 @@ dumpDatabase(Archive *fout)
2773
2780
destroyPQExpBuffer(dbQry);
2774
2781
destroyPQExpBuffer(delQry);
2775
2782
destroyPQExpBuffer(creaQry);
2783
+ destroyPQExpBuffer(labelq);
2776
2784
}
2777
2785
2778
2786
/*
@@ -9643,7 +9651,7 @@ dumpNamespace(Archive *fout, NamespaceInfo *nspinfo)
9643
9651
9644
9652
if (nspinfo->dobj.dump & DUMP_COMPONENT_ACL)
9645
9653
dumpACL(fout, nspinfo->dobj.catId, nspinfo->dobj.dumpId, "SCHEMA",
9646
- qnspname, NULL, nspinfo->dobj.name , NULL,
9654
+ qnspname, NULL, labelq->data , NULL,
9647
9655
nspinfo->rolname, nspinfo->nspacl, nspinfo->rnspacl,
9648
9656
nspinfo->initnspacl, nspinfo->initrnspacl);
9649
9657
@@ -9938,7 +9946,7 @@ dumpEnumType(Archive *fout, TypeInfo *tyinfo)
9938
9946
9939
9947
if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
9940
9948
dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
9941
- qtypname, NULL, tyinfo->dobj.name ,
9949
+ qtypname, NULL, labelq->data ,
9942
9950
tyinfo->dobj.namespace->dobj.name,
9943
9951
tyinfo->rolname, tyinfo->typacl, tyinfo->rtypacl,
9944
9952
tyinfo->inittypacl, tyinfo->initrtypacl);
@@ -10077,7 +10085,7 @@ dumpRangeType(Archive *fout, TypeInfo *tyinfo)
10077
10085
10078
10086
if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
10079
10087
dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
10080
- qtypname, NULL, tyinfo->dobj.name ,
10088
+ qtypname, NULL, labelq->data ,
10081
10089
tyinfo->dobj.namespace->dobj.name,
10082
10090
tyinfo->rolname, tyinfo->typacl, tyinfo->rtypacl,
10083
10091
tyinfo->inittypacl, tyinfo->initrtypacl);
@@ -10153,7 +10161,7 @@ dumpUndefinedType(Archive *fout, TypeInfo *tyinfo)
10153
10161
10154
10162
if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
10155
10163
dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
10156
- qtypname, NULL, tyinfo->dobj.name ,
10164
+ qtypname, NULL, labelq->data ,
10157
10165
tyinfo->dobj.namespace->dobj.name,
10158
10166
tyinfo->rolname, tyinfo->typacl, tyinfo->rtypacl,
10159
10167
tyinfo->inittypacl, tyinfo->initrtypacl);
@@ -10548,7 +10556,7 @@ dumpBaseType(Archive *fout, TypeInfo *tyinfo)
10548
10556
10549
10557
if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
10550
10558
dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
10551
- qtypname, NULL, tyinfo->dobj.name ,
10559
+ qtypname, NULL, labelq->data ,
10552
10560
tyinfo->dobj.namespace->dobj.name,
10553
10561
tyinfo->rolname, tyinfo->typacl, tyinfo->rtypacl,
10554
10562
tyinfo->inittypacl, tyinfo->initrtypacl);
@@ -10717,7 +10725,7 @@ dumpDomain(Archive *fout, TypeInfo *tyinfo)
10717
10725
10718
10726
if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
10719
10727
dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
10720
- qtypname, NULL, tyinfo->dobj.name ,
10728
+ qtypname, NULL, labelq->data ,
10721
10729
tyinfo->dobj.namespace->dobj.name,
10722
10730
tyinfo->rolname, tyinfo->typacl, tyinfo->rtypacl,
10723
10731
tyinfo->inittypacl, tyinfo->initrtypacl);
@@ -10953,7 +10961,7 @@ dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
10953
10961
10954
10962
if (tyinfo->dobj.dump & DUMP_COMPONENT_ACL)
10955
10963
dumpACL(fout, tyinfo->dobj.catId, tyinfo->dobj.dumpId, "TYPE",
10956
- qtypname, NULL, tyinfo->dobj.name ,
10964
+ qtypname, NULL, labelq->data ,
10957
10965
tyinfo->dobj.namespace->dobj.name,
10958
10966
tyinfo->rolname, tyinfo->typacl, tyinfo->rtypacl,
10959
10967
tyinfo->inittypacl, tyinfo->initrtypacl);
@@ -11272,7 +11280,7 @@ dumpProcLang(Archive *fout, ProcLangInfo *plang)
11272
11280
11273
11281
if (plang->lanpltrusted && plang->dobj.dump & DUMP_COMPONENT_ACL)
11274
11282
dumpACL(fout, plang->dobj.catId, plang->dobj.dumpId, "LANGUAGE",
11275
- qlanname, NULL, plang->dobj.name ,
11283
+ qlanname, NULL, labelq->data ,
11276
11284
lanschema,
11277
11285
plang->lanowner, plang->lanacl, plang->rlanacl,
11278
11286
plang->initlanacl, plang->initrlanacl);
@@ -11944,7 +11952,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
11944
11952
11945
11953
if (finfo->dobj.dump & DUMP_COMPONENT_ACL)
11946
11954
dumpACL(fout, finfo->dobj.catId, finfo->dobj.dumpId, "FUNCTION",
11947
- funcsig, NULL, funcsig_tag ,
11955
+ funcsig, NULL, labelq->data ,
11948
11956
finfo->dobj.namespace->dobj.name,
11949
11957
finfo->rolname, finfo->proacl, finfo->rproacl,
11950
11958
finfo->initproacl, finfo->initrproacl);
@@ -13997,15 +14005,13 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
13997
14005
* syntax for zero-argument aggregates and ordered-set aggregates.
13998
14006
*/
13999
14007
free(aggsig);
14000
- free(aggsig_tag);
14001
14008
14002
14009
aggsig = format_function_signature(fout, &agginfo->aggfn, true);
14003
- aggsig_tag = format_function_signature(fout, &agginfo->aggfn, false);
14004
14010
14005
14011
if (agginfo->aggfn.dobj.dump & DUMP_COMPONENT_ACL)
14006
14012
dumpACL(fout, agginfo->aggfn.dobj.catId, agginfo->aggfn.dobj.dumpId,
14007
14013
"FUNCTION",
14008
- aggsig, NULL, aggsig_tag ,
14014
+ aggsig, NULL, labelq->data ,
14009
14015
agginfo->aggfn.dobj.namespace->dobj.name,
14010
14016
agginfo->aggfn.rolname, agginfo->aggfn.proacl,
14011
14017
agginfo->aggfn.rproacl,
@@ -14451,7 +14457,7 @@ dumpForeignDataWrapper(Archive *fout, FdwInfo *fdwinfo)
14451
14457
if (fdwinfo->dobj.dump & DUMP_COMPONENT_ACL)
14452
14458
dumpACL(fout, fdwinfo->dobj.catId, fdwinfo->dobj.dumpId,
14453
14459
"FOREIGN DATA WRAPPER",
14454
- qfdwname, NULL, fdwinfo->dobj.name ,
14460
+ qfdwname, NULL, labelq->data ,
14455
14461
NULL, fdwinfo->rolname,
14456
14462
fdwinfo->fdwacl, fdwinfo->rfdwacl,
14457
14463
fdwinfo->initfdwacl, fdwinfo->initrfdwacl);
@@ -14548,7 +14554,7 @@ dumpForeignServer(Archive *fout, ForeignServerInfo *srvinfo)
14548
14554
if (srvinfo->dobj.dump & DUMP_COMPONENT_ACL)
14549
14555
dumpACL(fout, srvinfo->dobj.catId, srvinfo->dobj.dumpId,
14550
14556
"FOREIGN SERVER",
14551
- qsrvname, NULL, srvinfo->dobj.name ,
14557
+ qsrvname, NULL, labelq->data ,
14552
14558
NULL, srvinfo->rolname,
14553
14559
srvinfo->srvacl, srvinfo->rsrvacl,
14554
14560
srvinfo->initsrvacl, srvinfo->initrsrvacl);
@@ -14756,7 +14762,8 @@ dumpDefaultACL(Archive *fout, DefaultACLInfo *daclinfo)
14756
14762
* FOREIGN DATA WRAPPER, SERVER, or LARGE OBJECT.
14757
14763
* 'name' is the formatted name of the object. Must be quoted etc. already.
14758
14764
* 'subname' is the formatted name of the sub-object, if any. Must be quoted.
14759
- * 'tag' is the tag for the archive entry (typ. unquoted name of object).
14765
+ * 'tag' is the tag for the archive entry (should be the same tag as would be
14766
+ * used for comments etc; for example "TABLE foo").
14760
14767
* 'nspname' is the namespace the object is in (NULL if none).
14761
14768
* 'owner' is the owner, NULL if there is no owner (for languages).
14762
14769
* 'acls' contains the ACL string of the object from the appropriate system
@@ -14866,7 +14873,7 @@ dumpSecLabel(Archive *fout, const char *target,
14866
14873
if (dopt->no_security_labels)
14867
14874
return;
14868
14875
14869
- /* Comments are schema not data ... except blob comments are data */
14876
+ /* Security labels are schema not data ... except blob labels are data */
14870
14877
if (strncmp(target, "LARGE OBJECT ", 13) != 0)
14871
14878
{
14872
14879
if (dopt->dataOnly)
@@ -15160,13 +15167,18 @@ dumpTable(Archive *fout, TableInfo *tbinfo)
15160
15167
/* Handle the ACL here */
15161
15168
namecopy = pg_strdup(fmtId(tbinfo->dobj.name));
15162
15169
if (tbinfo->dobj.dump & DUMP_COMPONENT_ACL)
15170
+ {
15171
+ const char *objtype =
15172
+ (tbinfo->relkind == RELKIND_SEQUENCE) ? "SEQUENCE" : "TABLE";
15173
+ char *acltag = psprintf("%s %s", objtype, namecopy);
15174
+
15163
15175
dumpACL(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId,
15164
- (tbinfo->relkind == RELKIND_SEQUENCE) ? "SEQUENCE" :
15165
- "TABLE",
15166
- namecopy, NULL, tbinfo->dobj.name,
15176
+ objtype, namecopy, NULL, acltag,
15167
15177
tbinfo->dobj.namespace->dobj.name, tbinfo->rolname,
15168
15178
tbinfo->relacl, tbinfo->rrelacl,
15169
15179
tbinfo->initrelacl, tbinfo->initrrelacl);
15180
+ free(acltag);
15181
+ }
15170
15182
15171
15183
/*
15172
15184
* Handle column ACLs, if any. Note: we pull these with a separate query
@@ -15250,7 +15262,7 @@ dumpTable(Archive *fout, TableInfo *tbinfo)
15250
15262
char *acltag;
15251
15263
15252
15264
attnamecopy = pg_strdup(fmtId(attname));
15253
- acltag = psprintf("%s.%s", tbinfo->dobj.name, attname );
15265
+ acltag = psprintf("COLUMN %s.%s", namecopy, attnamecopy );
15254
15266
/* Column's GRANT type is always TABLE */
15255
15267
dumpACL(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId, "TABLE",
15256
15268
namecopy, attnamecopy, acltag,
0 commit comments