Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend')
-rw-r--r--src/backend/access/transam/xact.c13
-rw-r--r--src/backend/tcop/postgres.c18
2 files changed, 18 insertions, 13 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index b7ebcc2a557..1eccb78ddc4 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -3660,16 +3660,6 @@ PreventInTransactionBlock(bool isTopLevel, const char *stmtType)
stmtType)));
/*
- * inside a pipeline that has started an implicit transaction?
- */
- if (MyXactFlags & XACT_FLAGS_PIPELINING)
- ereport(ERROR,
- (errcode(ERRCODE_ACTIVE_SQL_TRANSACTION),
- /* translator: %s represents an SQL statement name */
- errmsg("%s cannot be executed within a pipeline",
- stmtType)));
-
- /*
* inside a function call?
*/
if (!isTopLevel)
@@ -3780,9 +3770,6 @@ IsInTransactionBlock(bool isTopLevel)
if (IsSubTransaction())
return true;
- if (MyXactFlags & XACT_FLAGS_PIPELINING)
- return true;
-
if (!isTopLevel)
return true;
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 184b8301687..bd424767176 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -2780,6 +2780,17 @@ start_xact_command(void)
xact_started = true;
}
+ else if (MyXactFlags & XACT_FLAGS_PIPELINING)
+ {
+ /*
+ * When the first Execute message is completed, following commands
+ * will be done in an implicit transaction block created via
+ * pipelining. The transaction state needs to be updated to an
+ * implicit block if we're not already in a transaction block (like
+ * one started by an explicit BEGIN).
+ */
+ BeginImplicitTransactionBlock();
+ }
/*
* Start statement timeout if necessary. Note that this'll intentionally
@@ -4991,6 +5002,13 @@ PostgresMain(const char *dbname, const char *username)
case PqMsg_Sync:
pq_getmsgend(&input_message);
+
+ /*
+ * If pipelining was used, we may be in an implicit
+ * transaction block. Close it before calling
+ * finish_xact_command.
+ */
+ EndImplicitTransactionBlock();
finish_xact_command();
valgrind_report_error_query("SYNC message");
send_ready_for_query = true;