From: Hiroshi Inoue Date: Thu, 15 Feb 2001 05:32:00 +0000 (+0000) Subject: 1) Change transaction boundary in autocommit off mode X-Git-Tag: REL7_1~403 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=462c13215a40a8f789946c058376c637abd58650;p=postgresql 1) Change transaction boundary in autocommit off mode per recent discussion in pgsql-odbc. Now SELECT is a boundary but VACUUM isn't. 2) Put back the error handling behavior. When elog(ERROR) was detected the driver automatically issue "ABORT" if a transaction is in progress. 3) Driver version is 7.01.0003(Dave already set it but it was put back). --- diff --git a/src/interfaces/odbc/connection.c b/src/interfaces/odbc/connection.c index b528a69ea0..69e111e4c2 100644 --- a/src/interfaces/odbc/connection.c +++ b/src/interfaces/odbc/connection.c @@ -964,9 +964,10 @@ char cmdbuffer[MAX_MESSAGE_LEN+1]; /* QR_set_command() dups this string so dont self->errornumber = CONNECTION_SERVER_REPORTED_ERROR; CC_set_no_trans(self); } - else + else self->errornumber = CONNECTION_SERVER_REPORTED_WARNING; QR_set_status(res, PGRES_NONFATAL_ERROR); + QR_set_aborted(res, TRUE); break; } } @@ -1033,6 +1034,7 @@ char cmdbuffer[MAX_MESSAGE_LEN+1]; /* QR_set_command() dups this string so dont self->errornumber = CONNECTION_SERVER_REPORTED_WARNING; QR_set_status(res, PGRES_NONFATAL_ERROR); } + QR_set_aborted(res, TRUE); return res; /* instead of NULL. Zoltan */ diff --git a/src/interfaces/odbc/psqlodbc.h b/src/interfaces/odbc/psqlodbc.h index 5226bb3fda..ccefb1a05f 100644 --- a/src/interfaces/odbc/psqlodbc.h +++ b/src/interfaces/odbc/psqlodbc.h @@ -6,7 +6,7 @@ * * Comments: See "notice.txt" for copyright and license information. * - * $Id: psqlodbc.h,v 1.37 2001/02/14 05:45:46 momjian Exp $ + * $Id: psqlodbc.h,v 1.38 2001/02/15 05:32:00 inoue Exp $ */ #ifndef __PSQLODBC_H__ @@ -41,7 +41,7 @@ typedef UInt4 Oid; #define DRIVERNAME "PostgreSQL ODBC" #define DBMS_NAME "PostgreSQL" -#define POSTGRESDRIVERVERSION "07.01.0002" +#define POSTGRESDRIVERVERSION "07.01.0003" #ifdef WIN32 #define DRIVER_FILE_NAME "PSQLODBC.DLL" diff --git a/src/interfaces/odbc/psqlodbc.rc b/src/interfaces/odbc/psqlodbc.rc index d9538230fb..dbbfa34ef9 100644 --- a/src/interfaces/odbc/psqlodbc.rc +++ b/src/interfaces/odbc/psqlodbc.rc @@ -204,8 +204,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 7,1,0,2 - PRODUCTVERSION 7,1,0,2 + FILEVERSION 7,1,0,3 + PRODUCTVERSION 7,1,0,3 FILEFLAGSMASK 0x3L #ifdef _DEBUG FILEFLAGS 0x1L @@ -223,14 +223,14 @@ BEGIN VALUE "Comments", "PostgreSQL ODBC driver\0" VALUE "CompanyName", "Insight Distribution Systems\0" VALUE "FileDescription", "PostgreSQL Driver\0" - VALUE "FileVersion", " 07.01.0002\0" + VALUE "FileVersion", " 07.01.0003\0" VALUE "InternalName", "psqlodbc\0" VALUE "LegalCopyright", "\0" VALUE "LegalTrademarks", "ODBC(TM) is a trademark of Microsoft Corporation. Microsoft® is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation.\0" VALUE "OriginalFilename", "psqlodbc.dll\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "Microsoft Open Database Connectivity\0" - VALUE "ProductVersion", " 07.01.0002\0" + VALUE "ProductVersion", " 07.01.0003\0" VALUE "SpecialBuild", "\0" END END diff --git a/src/interfaces/odbc/qresult.c b/src/interfaces/odbc/qresult.c index de52884ff3..56641d36b5 100644 --- a/src/interfaces/odbc/qresult.c +++ b/src/interfaces/odbc/qresult.c @@ -106,6 +106,7 @@ QResultClass *rv; rv->num_fields = 0; rv->tupleField = NULL; rv->cursor = NULL; + rv->aborted = FALSE; rv->cache_size = globals.fetch_max; rv->rowset_size = 1; diff --git a/src/interfaces/odbc/qresult.h b/src/interfaces/odbc/qresult.h index 93f11cee1f..d9362eb953 100644 --- a/src/interfaces/odbc/qresult.h +++ b/src/interfaces/odbc/qresult.h @@ -62,6 +62,7 @@ struct QResultClass_ { TupleField *tupleField; /* current backend tuple being retrieved */ char inTuples; /* is a fetch of rows from the backend in progress? */ + char aborted; /* was aborted?*/ }; #define QR_get_fields(self) (self->fields) @@ -91,11 +92,15 @@ struct QResultClass_ { #define QR_end_tuples(self) ( self->status == PGRES_END_TUPLES) #define QR_set_status(self, condition) ( self->status = condition ) #define QR_set_message(self, message_) ( self->message = message_) +#define QR_set_aborted(self, aborted_) ( self->aborted = aborted_) #define QR_get_message(self) (self->message) #define QR_get_command(self) (self->command) #define QR_get_notice(self) (self->notice) #define QR_get_status(self) (self->status) +#define QR_get_aborted(self) (self->aborted) + +#define QR_aborted(self) (!self || self->aborted) /* Core Functions */ QResultClass *QR_Constructor(void); diff --git a/src/interfaces/odbc/statement.c b/src/interfaces/odbc/statement.c index 06d97f7457..8a8d5523ad 100644 --- a/src/interfaces/odbc/statement.c +++ b/src/interfaces/odbc/statement.c @@ -753,21 +753,19 @@ QueryInfo qi; /* Begin a transaction if one is not already in progress */ /* - Basically we don't have to begin a transaction in - autocommit mode because Postgres backend runs in - autocomit mode. - We issue "BEGIN" in the following cases. - 1) we use declare/fetch and the statement is SELECT - (because declare/fetch must be called in a transaction). - 2) we are not in autocommit state and the statement - is of type UPDATE. - */ - if ( ! self->internal && ! CC_is_in_trans(conn) && - ((globals.use_declarefetch && self->statement_type == STMT_TYPE_SELECT) || (! CC_is_in_autocommit(conn) && STMT_UPDATE(self)))) { - + * Basically we don't have to begin a transaction in autocommit mode + * because Postgres backend runs in autocomit mode. We issue "BEGIN" + * in the following cases. 1) we use declare/fetch and the statement + * is SELECT (because declare/fetch must be called in a transaction). + * 2) we are in autocommit off state and the statement isn't of type + * OTHER. + */ + if (!self->internal && !CC_is_in_trans(conn) && + ((globals.use_declarefetch && self->statement_type == STMT_TYPE_SELECT) || (!CC_is_in_autocommit(conn) && self->statement_type != STMT_TYPE_OTHER))) + { mylog(" about to begin a transaction on statement = %u\n", self); res = CC_send_query(conn, "BEGIN", NULL); - if ( ! res) { + if (QR_aborted(res)) { self->errormsg = "Could not begin a transaction"; self->errornumber = STMT_EXEC_ERROR; SC_log_error(func, "", self); @@ -843,10 +841,12 @@ QueryInfo qi; /* We shouldn't send COMMIT. Postgres backend does the autocommit if neccessary. (Zoltan, 04/26/2000) */ - /* Even in case of autocommit, started transactions - must be committed. (Hiroshi, 09/02/2001) + /* Above seems wrong. + Even in case of autocommit, started transactions + must be committed. (Hiroshi, 02/11/2001) */ - if ( ! self->internal && CC_is_in_autocommit(conn) && CC_is_in_trans(conn) && STMT_UPDATE(self)) { + if ( ! self->internal && CC_is_in_autocommit(conn) && CC_is_in_trans(conn)) + { res = CC_send_query(conn, "COMMIT", NULL); QR_Destructor(res); CC_set_no_trans(conn); @@ -885,8 +885,8 @@ QueryInfo qi; return SQL_ERROR; } } - /* in autocommit mode declare/fetch error must be aborted */ - if ( ! was_ok && ! self->internal && CC_is_in_autocommit(conn) && CC_is_in_trans(conn)) + /* issue "ABORT" when query aborted */ + if (QR_get_aborted(self->result) && ! self->internal ) CC_abort(conn); } else { /* Bad Error -- The error message will be in the Connection */