diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c index 0a723f0dfa1..7b9e8c1b6fa 100644 --- a/contrib/postgres_fdw/connection.c +++ b/contrib/postgres_fdw/connection.c @@ -326,9 +326,10 @@ configure_remote_session(PGconn *conn) * anyway. However it makes the regression test outputs more predictable. * * We don't risk setting remote zone equal to ours, since the remote - * server might use a different timezone database. + * server might use a different timezone database. Instead, use UTC + * (quoted, because very old servers are picky about case). */ - do_sql_command(conn, "SET timezone = UTC"); + do_sql_command(conn, "SET timezone = 'UTC'"); /* * Set values needed to ensure unambiguous data output from remote. (This @@ -542,8 +543,14 @@ pgfdw_xact_callback(XactEvent event, void *arg) * prepared statements, do a DEALLOCATE ALL to make sure we * get rid of all prepared statements. This is annoying and * not terribly bulletproof, but it's probably not worth - * trying harder. We intentionally ignore any errors in the - * DEALLOCATE. + * trying harder. + * + * DEALLOCATE ALL only exists in 8.3 and later, so this + * constrains how old a server postgres_fdw can communicate + * with. We intentionally ignore errors in the DEALLOCATE, so + * that we can hobble along to some extent with older servers + * (leaking prepared statements as we go; but we don't really + * support update operations pre-8.3 anyway). */ if (entry->have_prep_stmt && entry->have_error) { diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c index 687b87b8604..49dfe2c5edb 100644 --- a/contrib/postgres_fdw/postgres_fdw.c +++ b/contrib/postgres_fdw/postgres_fdw.c @@ -801,6 +801,9 @@ postgresGetForeignPlan(PlannerInfo *root, * The extra roundtrips involved in trying to duplicate the local * semantics exactly don't seem worthwhile (see also comments for * RowMarkType). + * + * Note: because we actually run the query as a cursor, this assumes that + * DECLARE CURSOR ... FOR UPDATE is supported, which it isn't before 8.3. */ if (baserel->relid == root->parse->resultRelation && (root->parse->commandType == CMD_UPDATE || diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml index 61cc2aafc24..4aa798ac2ee 100644 --- a/doc/src/sgml/postgres-fdw.sgml +++ b/doc/src/sgml/postgres-fdw.sgml @@ -318,6 +318,26 @@ + + Cross-Version Compatibility + + + postgres_fdw can be used with remote servers dating back + to PostgreSQL 8.3. Read-only capability is available + back to 8.1. A limitation however is that postgres_fdw + generally assumes that immutable built-in functions and operators are + safe to send to the remote server for execution, if they appear in a + WHERE clause for a foreign table. Thus, a built-in + function that was added since the remote server's release might be sent + to it for execution, resulting in function does not exist or + a similar error. This type of failure can be worked around by + rewriting the query, for example by embedding the foreign table + reference in a sub-SELECT with OFFSET 0 as an + optimization fence, and placing the problematic function or operator + outside the sub-SELECT. + + + Author