* 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
* 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)
{
* 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 ||
</para>
</sect2>
+ <sect2>
+ <title>Cross-Version Compatibility</title>
+
+ <para>
+ <filename>postgres_fdw</> can be used with remote servers dating back
+ to <productname>PostgreSQL</> 8.3. Read-only capability is available
+ back to 8.1. A limitation however is that <filename>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
+ <literal>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 <quote>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-<literal>SELECT</> with <literal>OFFSET 0</> as an
+ optimization fence, and placing the problematic function or operator
+ outside the sub-<literal>SELECT</>.
+ </para>
+ </sect2>
+
<sect2>
<title>Author</title>
<para>