Ecpg should support COMMIT PREPARED and ROLLBACK PREPARED.
authorMichael Meskes <meskes@postgresql.org>
Mon, 13 Mar 2017 19:44:13 +0000 (20:44 +0100)
committerMichael Meskes <meskes@postgresql.org>
Mon, 13 Mar 2017 20:03:55 +0000 (21:03 +0100)
The problem was that "begin transaction" was issued automatically
before executing COMMIT/ROLLBACK PREPARED if not in auto commit. This fix by
Masahiko Sawada fixes this.

src/interfaces/ecpg/ecpglib/misc.c

index a13aa0a9da820838e43a3909d047153f97975bcb..019ebe10f9945d2777392f7a99190d10dac318b2 100644 (file)
@@ -213,9 +213,15 @@ ECPGtrans(int lineno, const char *connection_name, const char *transaction)
                 * If we got a transaction command but have no open transaction, we
                 * have to start one, unless we are in autocommit, where the
                 * developers have to take care themselves. However, if the command is
-                * a begin statement, we just execute it once.
+                * a begin statement, we just execute it once. And if the command is
+                * commit or rollback prepared, we don't execute it.
                 */
-               if (PQtransactionStatus(con->connection) == PQTRANS_IDLE && !con->autocommit && strncmp(transaction, "begin", 5) != 0 && strncmp(transaction, "start", 5) != 0)
+               if (PQtransactionStatus(con->connection) == PQTRANS_IDLE &&
+                       !con->autocommit &&
+                       strncmp(transaction, "begin", 5) != 0 &&
+                       strncmp(transaction, "start", 5) != 0 &&
+                       strncmp(transaction, "commit prepared", 15) != 0 &&
+                       strncmp(transaction, "rollback prepared", 17) != 0)
                {
                        res = PQexec(con->connection, "begin transaction");
                        if (!ecpg_check_PQresult(res, lineno, con->connection, ECPG_COMPAT_PGSQL))