@@ -2310,6 +2310,7 @@ dumpDatabase(Archive *fout)
2310
2310
PQExpBuffer dbQry = createPQExpBuffer ();
2311
2311
PQExpBuffer delQry = createPQExpBuffer ();
2312
2312
PQExpBuffer creaQry = createPQExpBuffer ();
2313
+ PQExpBuffer labelq = createPQExpBuffer ();
2313
2314
PGconn * conn = GetConnection (fout );
2314
2315
PGresult * res ;
2315
2316
int i_tableoid ,
@@ -2596,16 +2597,20 @@ dumpDatabase(Archive *fout)
2596
2597
destroyPQExpBuffer (loOutQry );
2597
2598
}
2598
2599
2600
+ /* Compute correct tag for comments etc */
2601
+ appendPQExpBuffer (labelq , "DATABASE %s" , fmtId (datname ));
2602
+
2599
2603
/* Dump DB comment if any */
2600
2604
if (fout -> remoteVersion >= 80200 )
2601
2605
{
2602
2606
/*
2603
- * 8.2 keeps comments on shared objects in a shared table, so we
2604
- * cannot use the dumpComment used for other database objects.
2607
+ * 8.2 and up keep comments on shared objects in a shared table, so we
2608
+ * cannot use the dumpComment() code used for other database objects.
2609
+ * Be careful that the ArchiveEntry parameters match that function.
2605
2610
*/
2606
2611
char * comment = PQgetvalue (res , 0 , PQfnumber (res , "description" ));
2607
2612
2608
- if (comment && strlen ( comment ) )
2613
+ if (comment && * comment )
2609
2614
{
2610
2615
resetPQExpBuffer (dbQry );
2611
2616
@@ -2617,17 +2622,17 @@ dumpDatabase(Archive *fout)
2617
2622
appendStringLiteralAH (dbQry , comment , fout );
2618
2623
appendPQExpBufferStr (dbQry , ";\n" );
2619
2624
2620
- ArchiveEntry (fout , dbCatId , createDumpId (), datname , NULL , NULL ,
2621
- dba , false, "COMMENT" , SECTION_NONE ,
2625
+ ArchiveEntry (fout , nilCatalogId , createDumpId (),
2626
+ labelq -> data , NULL , NULL , dba ,
2627
+ false, "COMMENT" , SECTION_NONE ,
2622
2628
dbQry -> data , "" , NULL ,
2623
- & dbDumpId , 1 , NULL , NULL );
2629
+ & (dbDumpId ), 1 ,
2630
+ NULL , NULL );
2624
2631
}
2625
2632
}
2626
2633
else
2627
2634
{
2628
- resetPQExpBuffer (dbQry );
2629
- appendPQExpBuffer (dbQry , "DATABASE %s" , fmtId (datname ));
2630
- dumpComment (fout , dbQry -> data , NULL , "" ,
2635
+ dumpComment (fout , labelq -> data , NULL , dba ,
2631
2636
dbCatId , 0 , dbDumpId );
2632
2637
}
2633
2638
@@ -2643,11 +2648,13 @@ dumpDatabase(Archive *fout)
2643
2648
shres = ExecuteSqlQuery (fout , seclabelQry -> data , PGRES_TUPLES_OK );
2644
2649
resetPQExpBuffer (seclabelQry );
2645
2650
emitShSecLabels (conn , shres , seclabelQry , "DATABASE" , datname );
2646
- if (strlen (seclabelQry -> data ))
2647
- ArchiveEntry (fout , dbCatId , createDumpId (), datname , NULL , NULL ,
2648
- dba , false, "SECURITY LABEL" , SECTION_NONE ,
2651
+ if (seclabelQry -> len > 0 )
2652
+ ArchiveEntry (fout , nilCatalogId , createDumpId (),
2653
+ labelq -> data , NULL , NULL , dba ,
2654
+ false, "SECURITY LABEL" , SECTION_NONE ,
2649
2655
seclabelQry -> data , "" , NULL ,
2650
- & dbDumpId , 1 , NULL , NULL );
2656
+ & (dbDumpId ), 1 ,
2657
+ NULL , NULL );
2651
2658
destroyPQExpBuffer (seclabelQry );
2652
2659
PQclear (shres );
2653
2660
}
@@ -2657,6 +2664,7 @@ dumpDatabase(Archive *fout)
2657
2664
destroyPQExpBuffer (dbQry );
2658
2665
destroyPQExpBuffer (delQry );
2659
2666
destroyPQExpBuffer (creaQry );
2667
+ destroyPQExpBuffer (labelq );
2660
2668
}
2661
2669
2662
2670
/*
@@ -8618,7 +8626,7 @@ dumpNamespace(Archive *fout, NamespaceInfo *nspinfo)
8618
8626
nspinfo -> dobj .catId , 0 , nspinfo -> dobj .dumpId );
8619
8627
8620
8628
dumpACL (fout , nspinfo -> dobj .catId , nspinfo -> dobj .dumpId , "SCHEMA" ,
8621
- qnspname , NULL , nspinfo -> dobj . name , NULL ,
8629
+ qnspname , NULL , labelq -> data , NULL ,
8622
8630
nspinfo -> rolname , nspinfo -> nspacl );
8623
8631
8624
8632
free (qnspname );
@@ -8903,7 +8911,7 @@ dumpEnumType(Archive *fout, TypeInfo *tyinfo)
8903
8911
tyinfo -> dobj .catId , 0 , tyinfo -> dobj .dumpId );
8904
8912
8905
8913
dumpACL (fout , tyinfo -> dobj .catId , tyinfo -> dobj .dumpId , "TYPE" ,
8906
- qtypname , NULL , tyinfo -> dobj . name ,
8914
+ qtypname , NULL , labelq -> data ,
8907
8915
tyinfo -> dobj .namespace -> dobj .name ,
8908
8916
tyinfo -> rolname , tyinfo -> typacl );
8909
8917
@@ -9036,7 +9044,7 @@ dumpRangeType(Archive *fout, TypeInfo *tyinfo)
9036
9044
tyinfo -> dobj .catId , 0 , tyinfo -> dobj .dumpId );
9037
9045
9038
9046
dumpACL (fout , tyinfo -> dobj .catId , tyinfo -> dobj .dumpId , "TYPE" ,
9039
- qtypname , NULL , tyinfo -> dobj . name ,
9047
+ qtypname , NULL , labelq -> data ,
9040
9048
tyinfo -> dobj .namespace -> dobj .name ,
9041
9049
tyinfo -> rolname , tyinfo -> typacl );
9042
9050
@@ -9106,7 +9114,7 @@ dumpUndefinedType(Archive *fout, TypeInfo *tyinfo)
9106
9114
tyinfo -> dobj .catId , 0 , tyinfo -> dobj .dumpId );
9107
9115
9108
9116
dumpACL (fout , tyinfo -> dobj .catId , tyinfo -> dobj .dumpId , "TYPE" ,
9109
- qtypname , NULL , tyinfo -> dobj . name ,
9117
+ qtypname , NULL , labelq -> data ,
9110
9118
tyinfo -> dobj .namespace -> dobj .name ,
9111
9119
tyinfo -> rolname , tyinfo -> typacl );
9112
9120
@@ -9495,7 +9503,7 @@ dumpBaseType(Archive *fout, TypeInfo *tyinfo)
9495
9503
tyinfo -> dobj .catId , 0 , tyinfo -> dobj .dumpId );
9496
9504
9497
9505
dumpACL (fout , tyinfo -> dobj .catId , tyinfo -> dobj .dumpId , "TYPE" ,
9498
- qtypname , NULL , tyinfo -> dobj . name ,
9506
+ qtypname , NULL , labelq -> data ,
9499
9507
tyinfo -> dobj .namespace -> dobj .name ,
9500
9508
tyinfo -> rolname , tyinfo -> typacl );
9501
9509
@@ -9658,7 +9666,7 @@ dumpDomain(Archive *fout, TypeInfo *tyinfo)
9658
9666
tyinfo -> dobj .catId , 0 , tyinfo -> dobj .dumpId );
9659
9667
9660
9668
dumpACL (fout , tyinfo -> dobj .catId , tyinfo -> dobj .dumpId , "TYPE" ,
9661
- qtypname , NULL , tyinfo -> dobj . name ,
9669
+ qtypname , NULL , labelq -> data ,
9662
9670
tyinfo -> dobj .namespace -> dobj .name ,
9663
9671
tyinfo -> rolname , tyinfo -> typacl );
9664
9672
@@ -9885,7 +9893,7 @@ dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
9885
9893
tyinfo -> dobj .catId , 0 , tyinfo -> dobj .dumpId );
9886
9894
9887
9895
dumpACL (fout , tyinfo -> dobj .catId , tyinfo -> dobj .dumpId , "TYPE" ,
9888
- qtypname , NULL , tyinfo -> dobj . name ,
9896
+ qtypname , NULL , labelq -> data ,
9889
9897
tyinfo -> dobj .namespace -> dobj .name ,
9890
9898
tyinfo -> rolname , tyinfo -> typacl );
9891
9899
@@ -10197,7 +10205,7 @@ dumpProcLang(Archive *fout, ProcLangInfo *plang)
10197
10205
10198
10206
if (plang -> lanpltrusted )
10199
10207
dumpACL (fout , plang -> dobj .catId , plang -> dobj .dumpId , "LANGUAGE" ,
10200
- qlanname , NULL , plang -> dobj . name ,
10208
+ qlanname , NULL , labelq -> data ,
10201
10209
lanschema ,
10202
10210
plang -> lanowner , plang -> lanacl );
10203
10211
@@ -10826,7 +10834,7 @@ dumpFunc(Archive *fout, FuncInfo *finfo)
10826
10834
finfo -> dobj .catId , 0 , finfo -> dobj .dumpId );
10827
10835
10828
10836
dumpACL (fout , finfo -> dobj .catId , finfo -> dobj .dumpId , "FUNCTION" ,
10829
- funcsig , NULL , funcsig_tag ,
10837
+ funcsig , NULL , labelq -> data ,
10830
10838
finfo -> dobj .namespace -> dobj .name ,
10831
10839
finfo -> rolname , finfo -> proacl );
10832
10840
@@ -12711,14 +12719,12 @@ dumpAgg(Archive *fout, AggInfo *agginfo)
12711
12719
* syntax for zero-argument aggregates and ordered-set aggregates.
12712
12720
*/
12713
12721
free (aggsig );
12714
- free (aggsig_tag );
12715
12722
12716
12723
aggsig = format_function_signature (fout , & agginfo -> aggfn , true);
12717
- aggsig_tag = format_function_signature (fout , & agginfo -> aggfn , false);
12718
12724
12719
12725
dumpACL (fout , agginfo -> aggfn .dobj .catId , agginfo -> aggfn .dobj .dumpId ,
12720
12726
"FUNCTION" ,
12721
- aggsig , NULL , aggsig_tag ,
12727
+ aggsig , NULL , labelq -> data ,
12722
12728
agginfo -> aggfn .dobj .namespace -> dobj .name ,
12723
12729
agginfo -> aggfn .rolname , agginfo -> aggfn .proacl );
12724
12730
@@ -13152,7 +13158,7 @@ dumpForeignDataWrapper(Archive *fout, FdwInfo *fdwinfo)
13152
13158
/* Handle the ACL */
13153
13159
dumpACL (fout , fdwinfo -> dobj .catId , fdwinfo -> dobj .dumpId ,
13154
13160
"FOREIGN DATA WRAPPER" ,
13155
- qfdwname , NULL , fdwinfo -> dobj . name ,
13161
+ qfdwname , NULL , labelq -> data ,
13156
13162
NULL , fdwinfo -> rolname ,
13157
13163
fdwinfo -> fdwacl );
13158
13164
@@ -13245,7 +13251,7 @@ dumpForeignServer(Archive *fout, ForeignServerInfo *srvinfo)
13245
13251
/* Handle the ACL */
13246
13252
dumpACL (fout , srvinfo -> dobj .catId , srvinfo -> dobj .dumpId ,
13247
13253
"FOREIGN SERVER" ,
13248
- qsrvname , NULL , srvinfo -> dobj . name ,
13254
+ qsrvname , NULL , labelq -> data ,
13249
13255
NULL , srvinfo -> rolname ,
13250
13256
srvinfo -> srvacl );
13251
13257
@@ -13445,7 +13451,8 @@ dumpDefaultACL(Archive *fout, DefaultACLInfo *daclinfo)
13445
13451
* FOREIGN DATA WRAPPER, SERVER, or LARGE OBJECT.
13446
13452
* 'name' is the formatted name of the object. Must be quoted etc. already.
13447
13453
* 'subname' is the formatted name of the sub-object, if any. Must be quoted.
13448
- * 'tag' is the tag for the archive entry (typ. unquoted name of object).
13454
+ * 'tag' is the tag for the archive entry (should be the same tag as would be
13455
+ * used for comments etc; for example "TABLE foo").
13449
13456
* 'nspname' is the namespace the object is in (NULL if none).
13450
13457
* 'owner' is the owner, NULL if there is no owner (for languages).
13451
13458
* 'acls' is the string read out of the fooacl system catalog field;
@@ -13523,7 +13530,7 @@ dumpSecLabel(Archive *fout, const char *target,
13523
13530
if (dopt -> no_security_labels )
13524
13531
return ;
13525
13532
13526
- /* Comments are schema not data ... except blob comments are data */
13533
+ /* Security labels are schema not data ... except blob labels are data */
13527
13534
if (strncmp (target , "LARGE OBJECT " , 13 ) != 0 )
13528
13535
{
13529
13536
if (dopt -> dataOnly )
@@ -13804,6 +13811,8 @@ dumpTable(Archive *fout, TableInfo *tbinfo)
13804
13811
if (tbinfo -> dobj .dump && !dopt -> dataOnly )
13805
13812
{
13806
13813
char * namecopy ;
13814
+ const char * objtype ;
13815
+ char * acltag ;
13807
13816
13808
13817
if (tbinfo -> relkind == RELKIND_SEQUENCE )
13809
13818
dumpSequence (fout , tbinfo );
@@ -13812,12 +13821,13 @@ dumpTable(Archive *fout, TableInfo *tbinfo)
13812
13821
13813
13822
/* Handle the ACL here */
13814
13823
namecopy = pg_strdup (fmtId (tbinfo -> dobj .name ));
13824
+ objtype = (tbinfo -> relkind == RELKIND_SEQUENCE ) ? "SEQUENCE" : "TABLE" ;
13825
+ acltag = psprintf ("%s %s" , objtype , namecopy );
13815
13826
dumpACL (fout , tbinfo -> dobj .catId , tbinfo -> dobj .dumpId ,
13816
- (tbinfo -> relkind == RELKIND_SEQUENCE ) ? "SEQUENCE" :
13817
- "TABLE" ,
13818
- namecopy , NULL , tbinfo -> dobj .name ,
13827
+ objtype , namecopy , NULL , acltag ,
13819
13828
tbinfo -> dobj .namespace -> dobj .name , tbinfo -> rolname ,
13820
13829
tbinfo -> relacl );
13830
+ free (acltag );
13821
13831
13822
13832
/*
13823
13833
* Handle column ACLs, if any. Note: we pull these with a separate
@@ -13842,10 +13852,9 @@ dumpTable(Archive *fout, TableInfo *tbinfo)
13842
13852
char * attname = PQgetvalue (res , i , 0 );
13843
13853
char * attacl = PQgetvalue (res , i , 1 );
13844
13854
char * attnamecopy ;
13845
- char * acltag ;
13846
13855
13847
13856
attnamecopy = pg_strdup (fmtId (attname ));
13848
- acltag = psprintf ("%s.%s" , tbinfo -> dobj . name , attname );
13857
+ acltag = psprintf ("COLUMN %s.%s" , namecopy , attnamecopy );
13849
13858
/* Column's GRANT type is always TABLE */
13850
13859
dumpACL (fout , tbinfo -> dobj .catId , tbinfo -> dobj .dumpId , "TABLE" ,
13851
13860
namecopy , attnamecopy , acltag ,
0 commit comments