diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index ec932e4063f02c48c99f2ff80f536bddb810a449..916939cf936484ae1a3911b1b0cf96370044a19a 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -5667,11 +5667,11 @@ getTableAttrs(TableInfo *tblinfo, int numTables) "array_to_string(a.attoptions, ', ') AS attoptions, " "CASE WHEN a.attcollation <> t.typcollation " "THEN a.attcollation ELSE 0 END AS attcollation, " - "array_to_string(ARRAY(" - " SELECT quote_ident(option_name) || ' ' || " - " quote_literal(option_value) " - " FROM pg_options_to_table(attfdwoptions)), ', ') " - " AS attfdwoptions " + "pg_catalog.array_to_string(ARRAY(" + "SELECT pg_catalog.quote_ident(option_name) || " + "' ' || pg_catalog.quote_literal(option_value) " + "FROM pg_catalog.pg_options_to_table(attfdwoptions)" + "), ', ') AS attfdwoptions " "FROM pg_catalog.pg_attribute a LEFT JOIN pg_catalog.pg_type t " "ON a.atttypid = t.oid " "WHERE a.attrelid = '%u'::pg_catalog.oid " @@ -6485,9 +6485,10 @@ getForeignDataWrappers(int *numForeignDataWrappers) "fdwhandler::pg_catalog.regproc, " "fdwvalidator::pg_catalog.regproc, fdwacl, " "array_to_string(ARRAY(" - " SELECT quote_ident(option_name) || ' ' || " - " quote_literal(option_value) " - " FROM pg_options_to_table(fdwoptions)), ', ') AS fdwoptions " + "SELECT quote_ident(option_name) || ' ' || " + "quote_literal(option_value) " + "FROM pg_options_to_table(fdwoptions)" + "), ', ') AS fdwoptions " "FROM pg_foreign_data_wrapper", username_subquery); } @@ -6498,9 +6499,10 @@ getForeignDataWrappers(int *numForeignDataWrappers) "'-' AS fdwhandler, " "fdwvalidator::pg_catalog.regproc, fdwacl, " "array_to_string(ARRAY(" - " SELECT quote_ident(option_name) || ' ' || " - " quote_literal(option_value) " - " FROM pg_options_to_table(fdwoptions)), ', ') AS fdwoptions " + "SELECT quote_ident(option_name) || ' ' || " + "quote_literal(option_value) " + "FROM pg_options_to_table(fdwoptions)" + "), ', ') AS fdwoptions " "FROM pg_foreign_data_wrapper", username_subquery); } @@ -6586,9 +6588,10 @@ getForeignServers(int *numForeignServers) "(%s srvowner) AS rolname, " "srvfdw, srvtype, srvversion, srvacl," "array_to_string(ARRAY(" - " SELECT quote_ident(option_name) || ' ' || " - " quote_literal(option_value) " - " FROM pg_options_to_table(srvoptions)), ', ') AS srvoptions " + "SELECT quote_ident(option_name) || ' ' || " + "quote_literal(option_value) " + "FROM pg_options_to_table(srvoptions)" + "), ', ') AS srvoptions " "FROM pg_foreign_server", username_subquery); @@ -11650,9 +11653,13 @@ dumpUserMappings(Archive *fout, appendPQExpBuffer(query, "SELECT usename, " - "array_to_string(ARRAY(SELECT quote_ident(option_name) || ' ' || quote_literal(option_value) FROM pg_options_to_table(umoptions)), ', ') AS umoptions\n" + "array_to_string(ARRAY(" + "SELECT quote_ident(option_name) || ' ' || " + "quote_literal(option_value) " + "FROM pg_options_to_table(umoptions)" + "), ', ') AS umoptions " "FROM pg_user_mappings " - "WHERE srvid = %u", + "WHERE srvid = '%u'", catalogId.oid); res = PQexec(g_conn, query->data); @@ -12212,12 +12219,12 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo) int numParents; TableInfo **parents; int actual_atts; /* number of attrs in this CREATE statment */ - char *reltypename; + const char *reltypename; char *storage; + char *srvname; + char *ftoptions; int j, k; - char *srvname; - char *ftoptions = NULL; /* Make sure we are in proper schema */ selectSourceSchema(tbinfo->dobj.namespace->dobj.name); @@ -12303,15 +12310,25 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo) /* retrieve name of foreign server and generic options */ appendPQExpBuffer(query, - "SELECT fs.srvname, array_to_string(ARRAY(" - " SELECT quote_ident(option_name) || ' ' || " - " quote_literal(option_value)" - " FROM pg_options_to_table(ftoptions)), ', ') AS ftoptions " - "FROM pg_foreign_table ft JOIN pg_foreign_server fs " - " ON (fs.oid = ft.ftserver) " - "WHERE ft.ftrelid = %u", tbinfo->dobj.catId.oid); + "SELECT fs.srvname, " + "pg_catalog.array_to_string(ARRAY(" + "SELECT pg_catalog.quote_ident(option_name) || " + "' ' || pg_catalog.quote_literal(option_value) " + "FROM pg_catalog.pg_options_to_table(ftoptions)" + "), ', ') AS ftoptions " + "FROM pg_catalog.pg_foreign_table ft " + "JOIN pg_catalog.pg_foreign_server fs " + "ON (fs.oid = ft.ftserver) " + "WHERE ft.ftrelid = '%u'", + tbinfo->dobj.catId.oid); res = PQexec(g_conn, query->data); check_sql_result(res, g_conn, query->data, PGRES_TUPLES_OK); + if (PQntuples(res) != 1) + { + write_msg(NULL, "query returned %d foreign server entries for foreign table \"%s\"\n", + PQntuples(res), tbinfo->dobj.name); + exit_nicely(); + } i_srvname = PQfnumber(res, "srvname"); i_ftoptions = PQfnumber(res, "ftoptions"); srvname = pg_strdup(PQgetvalue(res, 0, i_srvname)); @@ -12502,7 +12519,7 @@ dumpTableSchema(Archive *fout, TableInfo *tbinfo) } if (tbinfo->relkind == RELKIND_FOREIGN_TABLE) - appendPQExpBuffer(q, "\nSERVER %s", srvname); + appendPQExpBuffer(q, "\nSERVER %s", fmtId(srvname)); if ((tbinfo->reloptions && strlen(tbinfo->reloptions) > 0) || (tbinfo->toast_reloptions && strlen(tbinfo->toast_reloptions) > 0))