From 3876ae3e0130fd8aff4eac05b566285e7809e0c8 Mon Sep 17 00:00:00 2001 From: Craig Ringer Date: Fri, 6 Dec 2019 18:18:21 +0800 Subject: [PATCH] Prevent use of extended query protocol for BEGIN before COPY When autocommit is off and the first query in a transaction is a COPY, we were sending a BEGIN using the extended query protocol. It was being permitted to use named portals as well, ignoring prepareThreshold. Fix by forcing simple query mode and marking the BEGIN as oneshot. Fixes #1638 --- .../java/org/postgresql/core/v3/QueryExecutorImpl.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/QueryExecutorImpl.java b/pgjdbc/src/main/java/org/postgresql/core/v3/QueryExecutorImpl.java index c944ca0387..20ce1762ea 100644 --- a/pgjdbc/src/main/java/org/postgresql/core/v3/QueryExecutorImpl.java +++ b/pgjdbc/src/main/java/org/postgresql/core/v3/QueryExecutorImpl.java @@ -630,8 +630,12 @@ public void handleWarning(SQLWarning warning) { }; try { - sendOneQuery(beginTransactionQuery, SimpleQuery.NO_PARAMETERS, 0, 0, - QueryExecutor.QUERY_NO_METADATA); + /* Send BEGIN with simple protocol preferred */ + int beginFlags = QueryExecutor.QUERY_NO_METADATA + | QueryExecutor.QUERY_ONESHOT + | QueryExecutor.QUERY_EXECUTE_AS_SIMPLE; + beginFlags = updateQueryMode(beginFlags); + sendOneQuery(beginTransactionQuery, SimpleQuery.NO_PARAMETERS, 0, 0, beginFlags); sendSync(); processResults(handler, 0); estimatedReceiveBufferBytes = 0;