1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-26 12:21:12 +03:00

there is one problem with Zoltan patches commited into the tree:

if we set autocommit off and issued COMMIT (or ROLLBACK) on a connection
new transaction is not started

Max Khon
This commit is contained in:
Bruce Momjian
2000-12-15 19:11:28 +00:00
parent 326fbd8837
commit 0cf37659c4
2 changed files with 5 additions and 26 deletions

View File

@ -314,32 +314,18 @@ int i;
case SQL_AUTOCOMMIT: case SQL_AUTOCOMMIT:
/* Since we are almost always in a transaction, this is now ok.
Even if we were, the logic will handle it by sending a commit
after the statement.
if (CC_is_in_trans(conn)) { if (CC_is_in_trans(conn)) {
conn->errormsg = "Cannot switch commit mode while a transaction is in progres"; conn->errormsg = "Cannot switch commit mode while a transaction is in progress";
conn->errornumber = CONN_TRANSACT_IN_PROGRES; conn->errornumber = CONN_TRANSACT_IN_PROGRES;
CC_log_error(func, "", conn); CC_log_error(func, "", conn);
return SQL_ERROR; return SQL_ERROR;
} }
*/
mylog("SQLSetConnectOption: AUTOCOMMIT: transact_status=%d, vparam=%d\n", conn->transact_status, vParam); mylog("SQLSetConnectOption: AUTOCOMMIT: transact_status=%d, vparam=%d\n", conn->transact_status, vParam);
switch(vParam) { switch(vParam) {
case SQL_AUTOCOMMIT_OFF: case SQL_AUTOCOMMIT_OFF:
CC_set_autocommit_off(conn); CC_set_autocommit_off(conn);
/* The following two lines are new.
With this modification the SELECT statements
are also included in the transactions.
Error handling should be written,
this is missing yet, see
SC_execute in statement.c for details. Zoltan
*/
CC_send_query(conn,"BEGIN",NULL);
CC_set_in_trans(conn);
break; break;
case SQL_AUTOCOMMIT_ON: case SQL_AUTOCOMMIT_ON:

View File

@ -750,12 +750,12 @@ QueryInfo qi;
starting a transaction first. starting a transaction first.
A transaction should be begun if and only if A transaction should be begun if and only if
we use declare/fetch and the statement is SELECT. we use declare/fetch and the statement is SELECT
or we are not in autocommit state
We assume that the Postgres backend has an autocommit We assume that the Postgres backend has an autocommit
feature as default. (Zoltan Kovacs, 04/26/2000) feature as default. (Zoltan Kovacs, 04/26/2000)
*/ */
// if ( ! self->internal && ! CC_is_in_trans(conn) && (globals.use_declarefetch || STMT_UPDATE(self))) { if ( ! self->internal && ! CC_is_in_trans(conn) && ((globals.use_declarefetch && self->statement_type == STMT_TYPE_SELECT) || ! CC_is_in_autocommit(conn))) {
if ( ! self->internal && ! CC_is_in_trans(conn) && globals.use_declarefetch && self->statement_type == STMT_TYPE_SELECT) {
mylog(" about to begin a transaction on statement = %u\n", self); mylog(" about to begin a transaction on statement = %u\n", self);
res = CC_send_query(conn, "BEGIN", NULL); res = CC_send_query(conn, "BEGIN", NULL);
@ -831,16 +831,9 @@ QueryInfo qi;
mylog(" it's NOT a select statement: stmt=%u\n", self); mylog(" it's NOT a select statement: stmt=%u\n", self);
self->result = CC_send_query(conn, self->stmt_with_params, NULL); self->result = CC_send_query(conn, self->stmt_with_params, NULL);
/* If we are in autocommit, we must send the commit. */ /* We shouldn't send COMMIT. Postgres backend does the
/* No, we shouldn't. Postgres backend does the
autocommit if neccessary. (Zoltan, 04/26/2000) autocommit if neccessary. (Zoltan, 04/26/2000)
*/ */
/* if ( ! self->internal && CC_is_in_autocommit(conn) && STMT_UPDATE(self)) {
res = CC_send_query(conn, "COMMIT", NULL);
QR_Destructor(res);
CC_set_no_trans(conn);
}*/
} }
conn->status = oldstatus; conn->status = oldstatus;