Re: BUG #15170: PQtransactionStatus returns ACTIVE after Empty Commit

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: BUG #15170: PQtransactionStatus returns ACTIVE after Empty Commit
Дата
Msg-id 16961.1524611422@sss.pgh.pa.us
обсуждение исходный текст
Ответ на BUG #15170: PQtransactionStatus returns ACTIVE after Empty Commit  (PG Bug reporting form <noreply@postgresql.org>)
Ответы Re: BUG #15170: PQtransactionStatus returns ACTIVE after Empty Commit  (Rick Gabriel <klaxian@gmail.com>)
Список pgsql-bugs
=?utf-8?q?PG_Bug_reporting_form?= <noreply@postgresql.org> writes:
> PQtransactionStatus() incorrectly returns PQTRANS_ACTIVE after committing an
> empty transaction block (ie. BEGIN and COMMIT without any other queries).

I do not see that here; for instance, the attached test program prints

Initial PQtransactionStatus: 0
PQtransactionStatus after BEGIN: 2
PQtransactionStatus after COMMIT: 0
PQtransactionStatus after BEGIN; COMMIT: 0

which is what I'd expect (0 is PQTRANS_IDLE, 2 is PQTRANS_INTRANS).
I'd only expect PQTRANS_ACTIVE if libpq thinks a query is still "in
flight", ie the server hasn't returned a command-complete message.

I speculate that either you or PHP have not waited for the commit
response to come back ... but without a concrete example to look at,
it's hard to say more.

            regards, tom lane

#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"

static void
exit_nicely(PGconn *conn)
{
    PQfinish(conn);
    exit(1);
}

int
main(int argc, char **argv)
{
    const char *conninfo;
    PGconn       *conn;
    PGresult   *res;

    if (argc > 1)
        conninfo = argv[1];
    else
        conninfo = "dbname = postgres user = postgres";

    /* Make a connection to the database */
    conn = PQconnectdb(conninfo);

    /* Check to see that the backend connection was successfully made */
    if (PQstatus(conn) != CONNECTION_OK)
    {
        fprintf(stderr, "Connection to database failed: %s",
                PQerrorMessage(conn));
        exit_nicely(conn);
    }

    printf("Initial PQtransactionStatus: %d\n",
           PQtransactionStatus(conn));

    res = PQexec(conn, "BEGIN");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "BEGIN failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }
    PQclear(res);

    printf("PQtransactionStatus after BEGIN: %d\n",
           PQtransactionStatus(conn));

    res = PQexec(conn, "COMMIT");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "COMMIT failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }
    PQclear(res);

    printf("PQtransactionStatus after COMMIT: %d\n",
           PQtransactionStatus(conn));

    res = PQexec(conn, "BEGIN; COMMIT");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "BEGIN; COMMIT failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }
    PQclear(res);

    printf("PQtransactionStatus after BEGIN; COMMIT: %d\n",
           PQtransactionStatus(conn));

    /* close the connection to the database and cleanup */
    PQfinish(conn);

    return 0;
}

В списке pgsql-bugs по дате отправления:

Предыдущее
От: jake
Дата:
Сообщение: Re: BUG #15168: "pg_isready -d" effectively ignores given databasename
Следующее
От: Tom Lane
Дата:
Сообщение: Re: BUG #15171: JDBC TIMESTAMP WITH TIME ZONE PSQLException When Using Substitution Parameter