25
25
* http://archives.postgresql.org/pgsql-bugs/2010-02/msg00187.php
26
26
*
27
27
* IDENTIFICATION
28
- * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.581 2010/07/06 19:18:59 momjian Exp $
28
+ * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.582 2010/07/14 21:21:08 tgl Exp $
29
29
*
30
30
*-------------------------------------------------------------------------
31
31
*/
@@ -173,7 +173,7 @@ static void dumpTSTemplate(Archive *fout, TSTemplateInfo *tmplinfo);
173
173
static void dumpTSConfig (Archive * fout , TSConfigInfo * cfginfo );
174
174
static void dumpForeignDataWrapper (Archive * fout , FdwInfo * fdwinfo );
175
175
static void dumpForeignServer (Archive * fout , ForeignServerInfo * srvinfo );
176
- static void dumpUserMappings (Archive * fout , const char * target ,
176
+ static void dumpUserMappings (Archive * fout ,
177
177
const char * servername , const char * namespace ,
178
178
const char * owner , CatalogId catalogId , DumpId dumpId );
179
179
static void dumpDefaultACL (Archive * fout , DefaultACLInfo * daclinfo );
@@ -10138,6 +10138,7 @@ dumpForeignServer(Archive *fout, ForeignServerInfo *srvinfo)
10138
10138
query = createPQExpBuffer ();
10139
10139
10140
10140
/* look up the foreign-data wrapper */
10141
+ selectSourceSchema ("pg_catalog" );
10141
10142
appendPQExpBuffer (query , "SELECT fdwname "
10142
10143
"FROM pg_foreign_data_wrapper w "
10143
10144
"WHERE w.oid = '%u'" ,
@@ -10198,9 +10199,7 @@ dumpForeignServer(Archive *fout, ForeignServerInfo *srvinfo)
10198
10199
free (namecopy );
10199
10200
10200
10201
/* Dump user mappings */
10201
- resetPQExpBuffer (q );
10202
- appendPQExpBuffer (q , "SERVER %s" , fmtId (srvinfo -> dobj .name ));
10203
- dumpUserMappings (fout , q -> data ,
10202
+ dumpUserMappings (fout ,
10204
10203
srvinfo -> dobj .name , NULL ,
10205
10204
srvinfo -> rolname ,
10206
10205
srvinfo -> dobj .catId , srvinfo -> dobj .dumpId );
@@ -10217,7 +10216,7 @@ dumpForeignServer(Archive *fout, ForeignServerInfo *srvinfo)
10217
10216
* for the server.
10218
10217
*/
10219
10218
static void
10220
- dumpUserMappings (Archive * fout , const char * target ,
10219
+ dumpUserMappings (Archive * fout ,
10221
10220
const char * servername , const char * namespace ,
10222
10221
const char * owner ,
10223
10222
CatalogId catalogId , DumpId dumpId )
@@ -10228,7 +10227,7 @@ dumpUserMappings(Archive *fout, const char *target,
10228
10227
PQExpBuffer tag ;
10229
10228
PGresult * res ;
10230
10229
int ntups ;
10231
- int i_umuser ;
10230
+ int i_usename ;
10232
10231
int i_umoptions ;
10233
10232
int i ;
10234
10233
@@ -10237,31 +10236,40 @@ dumpUserMappings(Archive *fout, const char *target,
10237
10236
delq = createPQExpBuffer ();
10238
10237
query = createPQExpBuffer ();
10239
10238
10239
+ /*
10240
+ * We read from the publicly accessible view pg_user_mappings, so as not
10241
+ * to fail if run by a non-superuser. Note that the view will show
10242
+ * umoptions as null if the user hasn't got privileges for the associated
10243
+ * server; this means that pg_dump will dump such a mapping, but with no
10244
+ * OPTIONS clause. A possible alternative is to skip such mappings
10245
+ * altogether, but it's not clear that that's an improvement.
10246
+ */
10247
+ selectSourceSchema ("pg_catalog" );
10248
+
10240
10249
appendPQExpBuffer (query ,
10241
- "SELECT (%s umuser) AS umuser , "
10250
+ "SELECT usename , "
10242
10251
"array_to_string(ARRAY(SELECT option_name || ' ' || quote_literal(option_value) FROM pg_options_to_table(umoptions)), ', ') AS umoptions\n"
10243
- "FROM pg_user_mapping "
10244
- "WHERE umserver=%u" ,
10245
- username_subquery ,
10252
+ "FROM pg_user_mappings "
10253
+ "WHERE srvid = %u" ,
10246
10254
catalogId .oid );
10247
10255
10248
10256
res = PQexec (g_conn , query -> data );
10249
10257
check_sql_result (res , g_conn , query -> data , PGRES_TUPLES_OK );
10250
10258
10251
10259
ntups = PQntuples (res );
10252
- i_umuser = PQfnumber (res , "umuser " );
10260
+ i_usename = PQfnumber (res , "usename " );
10253
10261
i_umoptions = PQfnumber (res , "umoptions" );
10254
10262
10255
10263
for (i = 0 ; i < ntups ; i ++ )
10256
10264
{
10257
- char * umuser ;
10265
+ char * usename ;
10258
10266
char * umoptions ;
10259
10267
10260
- umuser = PQgetvalue (res , i , i_umuser );
10268
+ usename = PQgetvalue (res , i , i_usename );
10261
10269
umoptions = PQgetvalue (res , i , i_umoptions );
10262
10270
10263
10271
resetPQExpBuffer (q );
10264
- appendPQExpBuffer (q , "CREATE USER MAPPING FOR %s" , fmtId (umuser ));
10272
+ appendPQExpBuffer (q , "CREATE USER MAPPING FOR %s" , fmtId (usename ));
10265
10273
appendPQExpBuffer (q , " SERVER %s" , fmtId (servername ));
10266
10274
10267
10275
if (umoptions && strlen (umoptions ) > 0 )
@@ -10270,10 +10278,12 @@ dumpUserMappings(Archive *fout, const char *target,
10270
10278
appendPQExpBuffer (q , ";\n" );
10271
10279
10272
10280
resetPQExpBuffer (delq );
10273
- appendPQExpBuffer (delq , "DROP USER MAPPING FOR %s SERVER %s;\n" , fmtId (umuser ), fmtId (servername ));
10281
+ appendPQExpBuffer (delq , "DROP USER MAPPING FOR %s" , fmtId (usename ));
10282
+ appendPQExpBuffer (delq , " SERVER %s;\n" , fmtId (servername ));
10274
10283
10275
10284
resetPQExpBuffer (tag );
10276
- appendPQExpBuffer (tag , "USER MAPPING %s %s" , fmtId (umuser ), target );
10285
+ appendPQExpBuffer (tag , "USER MAPPING %s SERVER %s" ,
10286
+ usename , servername );
10277
10287
10278
10288
ArchiveEntry (fout , nilCatalogId , createDumpId (),
10279
10289
tag -> data ,
0 commit comments