From b37115373935732b1ab5e59b56837ac49942718a Mon Sep 17 00:00:00 2001 From: Craig Ringer Date: Fri, 6 Dec 2019 21:21:33 +0800 Subject: [PATCH] Prevent use of extended query protocol for BEGIN before COPY (#1639) 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;