postgres.git / summary / log / commit / refs

commit    a8b3262ab9790bea1eec8119fb7b00087f0a5a6b
Author:   Michael Meskes <meskes@postgresql.org>
Date:     Mon Mar 13 19:44:13 2017 +0000
First released in: 10.0, 9.2.21, 9.3.17, 9.4.12, 9.5.7, 9.6.3

    Ecpg should support COMMIT PREPARED and ROLLBACK PREPARED.
    
    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 | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/interfaces/ecpg/ecpglib/misc.c b/src/interfaces/ecpg/ecpglib/misc.c index a13aa0a9da8..019ebe10f99 100644 --- a/src/interfaces/ecpg/ecpglib/misc.c +++ b/src/interfaces/ecpg/ecpglib/misc.c @@ -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)) [parent: d0e5ac736df0]