@@ -2295,6 +2295,7 @@ dumpDatabase(Archive *fout)
2295
2295
PQExpBuffer dbQry = createPQExpBuffer ();
2296
2296
PQExpBuffer delQry = createPQExpBuffer ();
2297
2297
PQExpBuffer creaQry = createPQExpBuffer ();
2298
+ PQExpBuffer labelq = createPQExpBuffer ();
2298
2299
PGconn * conn = GetConnection (fout );
2299
2300
PGresult * res ;
2300
2301
int i_tableoid ,
@@ -2578,16 +2579,20 @@ dumpDatabase(Archive *fout)
2578
2579
destroyPQExpBuffer (loOutQry );
2579
2580
}
2580
2581
2582
+ /* Compute correct tag for comments etc */
2583
+ appendPQExpBuffer (labelq , "DATABASE %s" , fmtId (datname ));
2584
+
2581
2585
/* Dump DB comment if any */
2582
2586
if (fout -> remoteVersion >= 80200 )
2583
2587
{
2584
2588
/*
2585
- * 8.2 keeps comments on shared objects in a shared table, so we
2586
- * cannot use the dumpComment used for other database objects.
2589
+ * 8.2 and up keep comments on shared objects in a shared table, so we
2590
+ * cannot use the dumpComment() code used for other database objects.
2591
+ * Be careful that the ArchiveEntry parameters match that function.
2587
2592
*/
2588
2593
char * comment = PQgetvalue (res , 0 , PQfnumber (res , "description" ));
2589
2594
2590
- if (comment && strlen ( comment ) )
2595
+ if (comment && * comment )
2591
2596
{
2592
2597
resetPQExpBuffer (dbQry );
2593
2598
@@ -2599,17 +2604,17 @@ dumpDatabase(Archive *fout)
2599
2604
appendStringLiteralAH (dbQry , comment , fout );
2600
2605
appendPQExpBufferStr (dbQry , ";\n" );
2601
2606
2602
- ArchiveEntry (fout , dbCatId , createDumpId (), datname , NULL , NULL ,
2603
- dba , false, "COMMENT" , SECTION_NONE ,
2607
+ ArchiveEntry (fout , nilCatalogId , createDumpId (),
2608
+ labelq -> data , NULL , NULL , dba ,
2609
+ false, "COMMENT" , SECTION_NONE ,
2604
2610
dbQry -> data , "" , NULL ,
2605
- & dbDumpId , 1 , NULL , NULL );
2611
+ & (dbDumpId ), 1 ,
2612
+ NULL , NULL );
2606
2613
}
2607
2614
}
2608
2615
else
2609
2616
{
2610
- resetPQExpBuffer (dbQry );
2611
- appendPQExpBuffer (dbQry , "DATABASE %s" , fmtId (datname ));
2612
- dumpComment (fout , dbQry -> data , NULL , "" ,
2617
+ dumpComment (fout , labelq -> data , NULL , dba ,
2613
2618
dbCatId , 0 , dbDumpId );
2614
2619
}
2615
2620
@@ -2625,11 +2630,13 @@ dumpDatabase(Archive *fout)
2625
2630
shres = ExecuteSqlQuery (fout , seclabelQry -> data , PGRES_TUPLES_OK );
2626
2631
resetPQExpBuffer (seclabelQry );
2627
2632
emitShSecLabels (conn , shres , seclabelQry , "DATABASE" , datname );
2628
- if (strlen (seclabelQry -> data ))
2629
- ArchiveEntry (fout , dbCatId , createDumpId (), datname , NULL , NULL ,
2630
- dba , false, "SECURITY LABEL" , SECTION_NONE ,
2633
+ if (seclabelQry -> len > 0 )
2634
+ ArchiveEntry (fout , nilCatalogId , createDumpId (),
2635
+ labelq -> data , NULL , NULL , dba ,
2636
+ false, "SECURITY LABEL" , SECTION_NONE ,
2631
2637
seclabelQry -> data , "" , NULL ,
2632
- & dbDumpId , 1 , NULL , NULL );
2638
+ & (dbDumpId ), 1 ,
2639
+ NULL , NULL );
2633
2640
destroyPQExpBuffer (seclabelQry );
2634
2641
PQclear (shres );
2635
2642
}
@@ -2639,6 +2646,7 @@ dumpDatabase(Archive *fout)
2639
2646
destroyPQExpBuffer (dbQry );
2640
2647
destroyPQExpBuffer (delQry );
2641
2648
destroyPQExpBuffer (creaQry );
2649
+ destroyPQExpBuffer (labelq );
2642
2650
}
2643
2651
2644
2652
@@ -8139,7 +8147,7 @@ dumpNamespace(Archive *fout, NamespaceInfo *nspinfo)
8139
8147
nspinfo -> dobj .catId , 0 , nspinfo -> dobj .dumpId );
8140
8148
8141
8149
dumpACL (fout , nspinfo -> dobj .catId , nspinfo -> dobj .dumpId , "SCHEMA" ,
8142
- qnspname , NULL , nspinfo -> dobj . name , NULL ,
8150
+ qnspname , NULL , labelq -> data , NULL ,
8143
8151
nspinfo -> rolname , nspinfo -> nspacl );
8144
8152
8145
8153
free (qnspname );
@@ -8420,7 +8428,7 @@ dumpEnumType(Archive *fout, TypeInfo *tyinfo)
8420
8428
tyinfo -> dobj .catId , 0 , tyinfo -> dobj .dumpId );
8421
8429
8422
8430
dumpACL (fout , tyinfo -> dobj .catId , tyinfo -> dobj .dumpId , "TYPE" ,
8423
- qtypname , NULL , tyinfo -> dobj . name ,
8431
+ qtypname , NULL , labelq -> data ,
8424
8432
tyinfo -> dobj .namespace -> dobj .name ,
8425
8433
tyinfo -> rolname , tyinfo -> typacl );
8426
8434
@@ -8552,7 +8560,7 @@ dumpRangeType(Archive *fout, TypeInfo *tyinfo)
8552
8560
tyinfo -> dobj .catId , 0 , tyinfo -> dobj .dumpId );
8553
8561
8554
8562
dumpACL (fout , tyinfo -> dobj .catId , tyinfo -> dobj .dumpId , "TYPE" ,
8555
- qtypname , NULL , tyinfo -> dobj . name ,
8563
+ qtypname , NULL , labelq -> data ,
8556
8564
tyinfo -> dobj .namespace -> dobj .name ,
8557
8565
tyinfo -> rolname , tyinfo -> typacl );
8558
8566
@@ -8621,7 +8629,7 @@ dumpUndefinedType(Archive *fout, TypeInfo *tyinfo)
8621
8629
tyinfo -> dobj .catId , 0 , tyinfo -> dobj .dumpId );
8622
8630
8623
8631
dumpACL (fout , tyinfo -> dobj .catId , tyinfo -> dobj .dumpId , "TYPE" ,
8624
- qtypname , NULL , tyinfo -> dobj . name ,
8632
+ qtypname , NULL , labelq -> data ,
8625
8633
tyinfo -> dobj .namespace -> dobj .name ,
8626
8634
tyinfo -> rolname , tyinfo -> typacl );
8627
8635
@@ -9009,7 +9017,7 @@ dumpBaseType(Archive *fout, TypeInfo *tyinfo)
9009
9017
tyinfo -> dobj .catId , 0 , tyinfo -> dobj .dumpId );
9010
9018
9011
9019
dumpACL (fout , tyinfo -> dobj .catId , tyinfo -> dobj .dumpId , "TYPE" ,
9012
- qtypname , NULL , tyinfo -> dobj . name ,
9020
+ qtypname , NULL , labelq -> data ,
9013
9021
tyinfo -> dobj .namespace -> dobj .name ,
9014
9022
tyinfo -> rolname , tyinfo -> typacl );
9015
9023
@@ -9171,7 +9179,7 @@ dumpDomain(Archive *fout, TypeInfo *tyinfo)
9171
9179
tyinfo -> dobj .catId , 0 , tyinfo -> dobj .dumpId );
9172
9180
9173
9181
dumpACL (fout , tyinfo -> dobj .catId , tyinfo -> dobj .dumpId , "TYPE" ,
9174
- qtypname , NULL , tyinfo -> dobj . name ,
9182
+ qtypname , NULL , labelq -> data ,
9175
9183
tyinfo -> dobj .namespace -> dobj .name ,
9176
9184
tyinfo -> rolname , tyinfo -> typacl );
9177
9185
@@ -9380,7 +9388,7 @@ dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
9380
9388
tyinfo -> dobj .catId , 0 , tyinfo -> dobj .dumpId );
9381
9389
9382
9390
dumpACL (fout , tyinfo -> dobj .catId , tyinfo -> dobj .dumpId , "TYPE" ,
9383
- qtypname , NULL , tyinfo -> dobj . name ,
9391
+ qtypname , NULL , labelq -> data ,
9384
9392
tyinfo -> dobj .namespace -> dobj .name ,
9385
9393
tyinfo -> rolname , tyinfo -> typacl );
9386
9394
@@ -9690,7 +9698,7 @@ dumpProcLang(Archive *fout, ProcLangInfo *plang)
9690
9698
9691
9699
if (plang -> lanpltrusted )
9692
9700
dumpACL (fout , plang -> dobj .catId , plang -> dobj .dumpId , "LANGUAGE" ,
9693
- qlanname , NULL , plang -> dobj . name ,
9701
+ qlanname , NULL , labelq -> data ,
9694
9702
lanschema ,
9695
9703
plang -> lanowner , plang -> lanacl );
9696
9704
@@ -10279,7 +10287,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
10279
10287
finfo -> dobj .catId , 0 , finfo -> dobj .dumpId );
10280
10288
10281
10289
dumpACL (fout , finfo -> dobj .catId , finfo -> dobj .dumpId , "FUNCTION" ,
10282
- funcsig , NULL , funcsig_tag ,
10290
+ funcsig , NULL , labelq -> data ,
10283
10291
finfo -> dobj .namespace -> dobj .name ,
10284
10292
finfo -> rolname , finfo -> proacl );
10285
10293
@@ -12035,14 +12043,12 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
12035
12043
* syntax for zero-argument aggregates and ordered-set aggregates.
12036
12044
*/
12037
12045
free (aggsig );
12038
- free (aggsig_tag );
12039
12046
12040
12047
aggsig = format_function_signature (fout , & agginfo -> aggfn , true);
12041
- aggsig_tag = format_function_signature (fout , & agginfo -> aggfn , false);
12042
12048
12043
12049
dumpACL (fout , agginfo -> aggfn .dobj .catId , agginfo -> aggfn .dobj .dumpId ,
12044
12050
"FUNCTION" ,
12045
- aggsig , NULL , aggsig_tag ,
12051
+ aggsig , NULL , labelq -> data ,
12046
12052
agginfo -> aggfn .dobj .namespace -> dobj .name ,
12047
12053
agginfo -> aggfn .rolname , agginfo -> aggfn .proacl );
12048
12054
@@ -12471,7 +12477,7 @@ dumpForeignDataWrapper(Archive *fout, FdwInfo *fdwinfo)
12471
12477
/* Handle the ACL */
12472
12478
dumpACL (fout , fdwinfo -> dobj .catId , fdwinfo -> dobj .dumpId ,
12473
12479
"FOREIGN DATA WRAPPER" ,
12474
- qfdwname , NULL , fdwinfo -> dobj . name ,
12480
+ qfdwname , NULL , labelq -> data ,
12475
12481
NULL , fdwinfo -> rolname ,
12476
12482
fdwinfo -> fdwacl );
12477
12483
@@ -12563,7 +12569,7 @@ dumpForeignServer(Archive *fout, ForeignServerInfo *srvinfo)
12563
12569
/* Handle the ACL */
12564
12570
dumpACL (fout , srvinfo -> dobj .catId , srvinfo -> dobj .dumpId ,
12565
12571
"FOREIGN SERVER" ,
12566
- qsrvname , NULL , srvinfo -> dobj . name ,
12572
+ qsrvname , NULL , labelq -> data ,
12567
12573
NULL , srvinfo -> rolname ,
12568
12574
srvinfo -> srvacl );
12569
12575
@@ -12762,7 +12768,8 @@ dumpDefaultACL(Archive *fout, DefaultACLInfo *daclinfo)
12762
12768
* FOREIGN DATA WRAPPER, SERVER, or LARGE OBJECT.
12763
12769
* 'name' is the formatted name of the object. Must be quoted etc. already.
12764
12770
* 'subname' is the formatted name of the sub-object, if any. Must be quoted.
12765
- * 'tag' is the tag for the archive entry (typ. unquoted name of object).
12771
+ * 'tag' is the tag for the archive entry (should be the same tag as would be
12772
+ * used for comments etc; for example "TABLE foo").
12766
12773
* 'nspname' is the namespace the object is in (NULL if none).
12767
12774
* 'owner' is the owner, NULL if there is no owner (for languages).
12768
12775
* 'acls' is the string read out of the fooacl system catalog field;
@@ -12838,7 +12845,7 @@ dumpSecLabel(Archive *fout, const char *target,
12838
12845
if (no_security_labels )
12839
12846
return ;
12840
12847
12841
- /* Comments are schema not data ... except blob comments are data */
12848
+ /* Security labels are schema not data ... except blob labels are data */
12842
12849
if (strncmp (target , "LARGE OBJECT " , 13 ) != 0 )
12843
12850
{
12844
12851
if (dataOnly )
@@ -13116,6 +13123,8 @@ dumpTable(Archive *fout, TableInfo *tbinfo)
13116
13123
if (tbinfo -> dobj .dump && !dataOnly )
13117
13124
{
13118
13125
char * namecopy ;
13126
+ const char * objtype ;
13127
+ char * acltag ;
13119
13128
13120
13129
if (tbinfo -> relkind == RELKIND_SEQUENCE )
13121
13130
dumpSequence (fout , tbinfo );
@@ -13124,12 +13133,13 @@ dumpTable(Archive *fout, TableInfo *tbinfo)
13124
13133
13125
13134
/* Handle the ACL here */
13126
13135
namecopy = pg_strdup (fmtId (tbinfo -> dobj .name ));
13136
+ objtype = (tbinfo -> relkind == RELKIND_SEQUENCE ) ? "SEQUENCE" : "TABLE" ;
13137
+ acltag = psprintf ("%s %s" , objtype , namecopy );
13127
13138
dumpACL (fout , tbinfo -> dobj .catId , tbinfo -> dobj .dumpId ,
13128
- (tbinfo -> relkind == RELKIND_SEQUENCE ) ? "SEQUENCE" :
13129
- "TABLE" ,
13130
- namecopy , NULL , tbinfo -> dobj .name ,
13139
+ objtype , namecopy , NULL , acltag ,
13131
13140
tbinfo -> dobj .namespace -> dobj .name , tbinfo -> rolname ,
13132
13141
tbinfo -> relacl );
13142
+ free (acltag );
13133
13143
13134
13144
/*
13135
13145
* Handle column ACLs, if any. Note: we pull these with a separate
@@ -13154,10 +13164,9 @@ dumpTable(Archive *fout, TableInfo *tbinfo)
13154
13164
char * attname = PQgetvalue (res , i , 0 );
13155
13165
char * attacl = PQgetvalue (res , i , 1 );
13156
13166
char * attnamecopy ;
13157
- char * acltag ;
13158
13167
13159
13168
attnamecopy = pg_strdup (fmtId (attname ));
13160
- acltag = psprintf ("%s.%s" , tbinfo -> dobj . name , attname );
13169
+ acltag = psprintf ("COLUMN %s.%s" , namecopy , attnamecopy );
13161
13170
/* Column's GRANT type is always TABLE */
13162
13171
dumpACL (fout , tbinfo -> dobj .catId , tbinfo -> dobj .dumpId , "TABLE" ,
13163
13172
namecopy , attnamecopy , acltag ,
0 commit comments