Index: org/postgresql/core/Query.java =================================================================== RCS file: /cvsroot/jdbc/pgjdbc/org/postgresql/core/Query.java,v retrieving revision 1.6 diff -u -r1.6 Query.java --- org/postgresql/core/Query.java 2 Aug 2011 13:40:12 -0000 1.6 +++ org/postgresql/core/Query.java 25 Sep 2011 12:01:10 -0000 @@ -54,4 +54,6 @@ * A closed Query should not be executed. */ void close(); + + boolean isStatementDescribed(); } Index: org/postgresql/core/v2/V2Query.java =================================================================== RCS file: /cvsroot/jdbc/pgjdbc/org/postgresql/core/v2/V2Query.java,v retrieving revision 1.9 diff -u -r1.9 V2Query.java --- org/postgresql/core/v2/V2Query.java 2 Aug 2011 13:40:12 -0000 1.9 +++ org/postgresql/core/v2/V2Query.java 25 Sep 2011 12:01:10 -0000 @@ -104,6 +104,10 @@ return fragments; } + public boolean isStatementDescribed() { + return false; + } + private static final ParameterList NO_PARAMETERS = new SimpleParameterList(0, false); private final String[] fragments; // Query fragments, length == # of parameters + 1 Index: org/postgresql/core/v3/CompositeQuery.java =================================================================== RCS file: /cvsroot/jdbc/pgjdbc/org/postgresql/core/v3/CompositeQuery.java,v retrieving revision 1.6 diff -u -r1.6 CompositeQuery.java --- org/postgresql/core/v3/CompositeQuery.java 2 Aug 2011 13:40:12 -0000 1.6 +++ org/postgresql/core/v3/CompositeQuery.java 25 Sep 2011 12:01:10 -0000 @@ -56,6 +56,14 @@ return subqueries; } + public boolean isStatementDescribed() { + for (int i = 0; i < subqueries.length; ++i) + if (!subqueries[i].isStatementDescribed()) { + return false; + } + return true; + } + private final SimpleQuery[] subqueries; private final int[] offsets; } Index: org/postgresql/core/v3/SimpleQuery.java =================================================================== RCS file: /cvsroot/jdbc/pgjdbc/org/postgresql/core/v3/SimpleQuery.java,v retrieving revision 1.16 diff -u -r1.16 SimpleQuery.java --- org/postgresql/core/v3/SimpleQuery.java 22 Sep 2011 12:53:24 -0000 1.16 +++ org/postgresql/core/v3/SimpleQuery.java 25 Sep 2011 12:01:10 -0000 @@ -149,7 +149,7 @@ // Have we sent a Describe Statement message for this query yet? // Note that we might not have need to, so this may always be false. - boolean isStatementDescribed() { + public boolean isStatementDescribed() { return statementDescribed; } void setStatementDescribed(boolean statementDescribed) { Index: org/postgresql/jdbc2/AbstractJdbc2Statement.java =================================================================== RCS file: /cvsroot/jdbc/pgjdbc/org/postgresql/jdbc2/AbstractJdbc2Statement.java,v retrieving revision 1.125 diff -u -r1.125 AbstractJdbc2Statement.java --- org/postgresql/jdbc2/AbstractJdbc2Statement.java 23 Sep 2011 17:36:19 -0000 1.125 +++ org/postgresql/jdbc2/AbstractJdbc2Statement.java 25 Sep 2011 12:09:18 -0000 @@ -2817,6 +2825,7 @@ batchParameters.clear(); int flags; + boolean preDescribe = false; if (wantsGeneratedKeysAlways) { flags = QueryExecutor.QUERY_BOTH_ROWS_AND_STATUS | QueryExecutor.QUERY_DISALLOW_BATCHING; @@ -2829,12 +2838,25 @@ { m_useCount += queries.length; } - if (m_prepareThreshold == 0 || m_useCount < m_prepareThreshold) + if (m_prepareThreshold == 0 || m_useCount < m_prepareThreshold) { flags |= QueryExecutor.QUERY_ONESHOT; + } else { + preDescribe = wantsGeneratedKeysAlways && !queries[0].isStatementDescribed(); + } if (connection.getAutoCommit()) flags |= QueryExecutor.QUERY_SUPPRESS_BEGIN; + if (preDescribe || ForceBinaryTransfers) { + int flags2 = flags | QueryExecutor.QUERY_DESCRIBE_ONLY; + StatementResultHandler handler2 = new StatementResultHandler(); + connection.getQueryExecutor().execute(queries[0], parameterLists[0], handler2, 0, 0, flags2); + ResultWrapper result2 = handler2.getResults(); + if (result2 != null) { + result2.getResultSet().close(); + } + } + result = null; ResultHandler handler;