diff -c psqlodbc.orig\statement.c psqlodbc\statement.c *** psqlodbc.orig\statement.c Fri Jan 20 14:09:35 2006 --- psqlodbc\statement.c Fri Jan 20 15:15:06 2006 *************** *** 71,76 **** --- 71,79 ---- STMT_TYPE_LOCK, "LOCK" }, { + STMT_TYPE_BEGIN, "BEGIN" + }, + { 0, NULL } }; *************** *** 423,428 **** --- 426,441 ---- if (!strnicmp(statement, Statement_Type[i].s, strlen(Statement_Type[i].s))) return Statement_Type[i].type; + /* determine START TRANSACTION */ + if (!strnicmp(statement, "START", 5)) + { + statement += 5; + /* ignore whitespace in query string */ + while (*statement && isspace((UCHAR) *statement)) + statement++; + if (!strnicmp(statement, "TRANSACTION", 11)) + return STMT_TYPE_BEGIN; + } return STMT_TYPE_OTHER; } *************** *** 1148,1154 **** QueryInfo qi; ConnInfo *ci; UDWORD qflag = 0; ! BOOL auto_begin = FALSE, is_in_trans; int func_cs_count = 0; --- 1161,1167 ---- QueryInfo qi; ConnInfo *ci; UDWORD qflag = 0; ! BOOL is_in_trans; int func_cs_count = 0; *************** *** 1175,1184 **** is_in_trans = CC_is_in_trans(conn); if (!self->internal && !is_in_trans && (SC_is_fetchcursor(self) || ! (!CC_is_in_autocommit(conn) && self->statement_type != STMT_TYPE_OTHER))) { mylog(" about to begin a transaction on statement = %u\n", self); - auto_begin = TRUE; if (PG_VERSION_GE(conn, 7.1)) qflag |= GO_INTO_TRANSACTION; else if (!CC_begin(conn)) --- 1188,1196 ---- is_in_trans = CC_is_in_trans(conn); if (!self->internal && !is_in_trans && (SC_is_fetchcursor(self) || ! (!CC_is_in_autocommit(conn) && self->statement_type != STMT_TYPE_BEGIN))) { mylog(" about to begin a transaction on statement = %u\n", self); if (PG_VERSION_GE(conn, 7.1)) qflag |= GO_INTO_TRANSACTION; else if (!CC_begin(conn)) *************** *** 1252,1258 **** */ if (CC_is_in_trans(conn)) { ! if (!is_in_trans && !auto_begin) CC_set_in_manual_trans(conn); if (!self->internal && CC_is_in_autocommit(conn) && !CC_is_in_manual_trans(conn)) CC_commit(conn); --- 1264,1270 ---- */ if (CC_is_in_trans(conn)) { ! if (!is_in_trans) CC_set_in_manual_trans(conn); if (!self->internal && CC_is_in_autocommit(conn) && !CC_is_in_manual_trans(conn)) CC_commit(conn); diff -c psqlodbc.orig\statement.h psqlodbc\statement.h *** psqlodbc.orig\statement.h Wed Nov 30 13:44:37 2005 --- psqlodbc\statement.h Fri Jan 20 15:07:21 2006 *************** *** 96,102 **** STMT_TYPE_GRANT, STMT_TYPE_REVOKE, STMT_TYPE_PROCCALL, ! STMT_TYPE_LOCK }; #define STMT_UPDATE(stmt) (stmt->statement_type > STMT_TYPE_SELECT) --- 96,103 ---- STMT_TYPE_GRANT, STMT_TYPE_REVOKE, STMT_TYPE_PROCCALL, ! STMT_TYPE_LOCK, ! STMT_TYPE_BEGIN }; #define STMT_UPDATE(stmt) (stmt->statement_type > STMT_TYPE_SELECT)