Modified:
branches/guffert/ChangeLog
branches/guffert/driver/ansi.c
branches/guffert/driver/error.h
branches/guffert/driver/unicode.c
branches/guffert/test/my_error.c
Log:
SQLError() incorrectly cleared the error information, making it
unavailable from subsequent calls to SQLGetDiagRec().
Modified: branches/guffert/ChangeLog
===================================================================
--- branches/guffert/ChangeLog 2007-11-30 21:10:52 UTC (rev 903)
+++ branches/guffert/ChangeLog 2007-12-01 06:30:47 UTC (rev 904)
@@ -48,6 +48,8 @@
* Binding of columns between calling prepare and execute causes
statement execution. (Bug #29239)
* ADO can't open a recordset that has a Decimal field (Bug #31720)
+ * SQLError() incorrectly cleared the error information, making it
+ unavailable from subsequent calls to SQLGetDiagRec().
Includes changes from Connector/ODBC 3.51.21 and 3.51.22.
Modified: branches/guffert/driver/ansi.c
===================================================================
--- branches/guffert/driver/ansi.c 2007-11-30 21:10:52 UTC (rev 903)
+++ branches/guffert/driver/ansi.c 2007-12-01 06:30:47 UTC (rev 904)
@@ -412,24 +412,21 @@
if (hstmt)
{
- rc= SQLGetDiagRecImpl(SQL_HANDLE_STMT, hstmt, 1, sqlstate, native_error,
- message, message_max, message_len);
- if (rc == SQL_SUCCESS)
- CLEAR_STMT_ERROR(hstmt);
+ rc= SQLGetDiagRecImpl(SQL_HANDLE_STMT, hstmt, NEXT_STMT_ERROR(hstmt),
+ sqlstate, native_error, message, message_max,
+ message_len);
}
else if (hdbc)
{
- rc= SQLGetDiagRecImpl(SQL_HANDLE_DBC, hdbc, 1, sqlstate, native_error,
- message, message_max, message_len);
- if (rc == SQL_SUCCESS)
- CLEAR_DBC_ERROR(hdbc);
+ rc= SQLGetDiagRecImpl(SQL_HANDLE_DBC, hdbc, NEXT_DBC_ERROR(hdbc),
+ sqlstate, native_error, message, message_max,
+ message_len);
}
else if (henv)
{
- rc= SQLGetDiagRecImpl(SQL_HANDLE_ENV, henv, 1, sqlstate, native_error,
- message, message_max, message_len);
- if (rc == SQL_SUCCESS)
- CLEAR_ENV_ERROR(henv);
+ rc= SQLGetDiagRecImpl(SQL_HANDLE_ENV, henv, NEXT_ENV_ERROR(henv),
+ sqlstate, native_error, message, message_max,
+ message_len);
}
return rc;
Modified: branches/guffert/driver/error.h
===================================================================
--- branches/guffert/driver/error.h 2007-11-30 21:10:52 UTC (rev 903)
+++ branches/guffert/driver/error.h 2007-12-01 06:30:47 UTC (rev 904)
@@ -50,20 +50,33 @@
error handler structure
*/
typedef struct tagERROR {
+ SQLRETURN retcode;
+ char current;
char sqlstate[6];
char message[SQL_MAX_MESSAGE_LENGTH+1];
SQLINTEGER native_error;
- SQLRETURN retcode;
} MYERROR;
+#define CLEAR_ERROR(error) do {\
+ error.message[0]= '\0'; \
+ error.current= 0; \
+} while (0)
-#define CLEAR_ENV_ERROR(env) (((ENV *)env)->error.message[0]='\0')
-#define CLEAR_DBC_ERROR(dbc) (((DBC *)dbc)->error.message[0]='\0')
-#define CLEAR_STMT_ERROR(stmt) (((STMT *)stmt)->error.message[0]='\0')
-#define CLEAR_DESC_ERROR(desc) (((DESC *)desc)->error.message[0]='\0')
+#define CLEAR_ENV_ERROR(env) CLEAR_ERROR(((ENV *)env)->error)
+#define CLEAR_DBC_ERROR(dbc) CLEAR_ERROR(((DBC *)dbc)->error)
+#define CLEAR_STMT_ERROR(stmt) CLEAR_ERROR(((STMT *)stmt)->error)
+#define CLEAR_DESC_ERROR(desc) CLEAR_ERROR(((DESC *)desc)->error)
+#define NEXT_ERROR(error) \
+ (error.current ? 2 : (error.current= 1))
+
+#define NEXT_ENV_ERROR(env) NEXT_ERROR(((ENV *)env)->error)
+#define NEXT_DBC_ERROR(dbc) NEXT_ERROR(((DBC *)dbc)->error)
+#define NEXT_STMT_ERROR(stmt) NEXT_ERROR(((STMT *)stmt)->error)
+#define NEXT_DESC_ERROR(desc) NEXT_ERROR(((DESC *)desc)->error)
+
/*
list of MyODBC3 error codes
*/
Modified: branches/guffert/driver/unicode.c
===================================================================
--- branches/guffert/driver/unicode.c 2007-11-30 21:10:52 UTC (rev 903)
+++ branches/guffert/driver/unicode.c 2007-12-01 06:30:47 UTC (rev 904)
@@ -299,24 +299,21 @@
if (hstmt)
{
- rc= SQLGetDiagRecWImpl(SQL_HANDLE_STMT, hstmt, 1, sqlstate, native_error,
- message, message_max, message_len);
- if (rc == SQL_SUCCESS)
- CLEAR_STMT_ERROR(hstmt);
+ rc= SQLGetDiagRecWImpl(SQL_HANDLE_STMT, hstmt, NEXT_STMT_ERROR(hstmt),
+ sqlstate, native_error, message, message_max,
+ message_len);
}
else if (hdbc)
{
- rc= SQLGetDiagRecWImpl(SQL_HANDLE_DBC, hdbc, 1, sqlstate, native_error,
- message, message_max, message_len);
- if (rc == SQL_SUCCESS)
- CLEAR_DBC_ERROR(hdbc);
+ rc= SQLGetDiagRecWImpl(SQL_HANDLE_DBC, hdbc, NEXT_DBC_ERROR(hstmt),
+ sqlstate, native_error, message, message_max,
+ message_len);
}
else if (henv)
{
- rc= SQLGetDiagRecWImpl(SQL_HANDLE_ENV, henv, 1, sqlstate, native_error,
- message, message_max, message_len);
- if (rc == SQL_SUCCESS)
- CLEAR_ENV_ERROR(henv);
+ rc= SQLGetDiagRecWImpl(SQL_HANDLE_ENV, henv, NEXT_ENV_ERROR(henv),
+ sqlstate, native_error, message, message_max,
+ message_len);
}
return rc;
Modified: branches/guffert/test/my_error.c
===================================================================
--- branches/guffert/test/my_error.c 2007-11-30 21:10:52 UTC (rev 903)
+++ branches/guffert/test/my_error.c 2007-12-01 06:30:47 UTC (rev 904)
@@ -278,6 +278,7 @@
*/
DECLARE_TEST(bind_invalidcol)
{
+ SQLCHAR dummy[10];
ok_sql(hstmt, "select 1,2,3,4");
/* test out of range column number */
@@ -290,8 +291,8 @@
is(check_sqlstate(hstmt, "07009") == OK);
/* SQLDescribeCol() */
- expect_stmt(hstmt, SQLDescribeCol(hstmt, 0, NULL, 0, NULL, NULL, NULL,
- NULL, NULL), SQL_ERROR);
+ expect_stmt(hstmt, SQLDescribeCol(hstmt, 0, dummy, sizeof(dummy), NULL, NULL,
+ NULL, NULL, NULL), SQL_ERROR);
is(check_sqlstate(hstmt, "07009") == OK);
expect_stmt(hstmt, SQLDescribeCol(hstmt, 5, NULL, 0, NULL, NULL, NULL,
@@ -318,7 +319,7 @@
DECLARE_TEST(bind_notenoughparam1)
{
SQLINTEGER i= 0;
- ok_stmt(hstmt, SQLPrepare(hstmt, "select ?, ?", SQL_NTS));
+ ok_stmt(hstmt, SQLPrepare(hstmt, (SQLCHAR *)"select ?, ?", SQL_NTS));
ok_stmt(hstmt, SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_LONG,
SQL_INTEGER, 0, 0, &i, 0, NULL));
@@ -336,7 +337,7 @@
{
SQLINTEGER i= 0;
SQLSMALLINT cols= 0;
- ok_stmt(hstmt, SQLPrepare(hstmt, "select ?, ?", SQL_NTS));
+ ok_stmt(hstmt, SQLPrepare(hstmt, (SQLCHAR *)"select ?, ?", SQL_NTS));
/* trigger pre-execute */
ok_stmt(hstmt, SQLNumResultCols(hstmt, &cols));
@@ -401,6 +402,31 @@
}
+DECLARE_TEST(sqlerror)
+{
+ SQLCHAR message[SQL_MAX_MESSAGE_LENGTH + 1];
+ SQLCHAR sqlstate[SQL_SQLSTATE_SIZE + 1];
+ SQLINTEGER error;
+ SQLSMALLINT len;
+
+ expect_sql(hstmt, "SELECT * FROM tabledoesnotexist", SQL_ERROR);
+
+ ok_stmt(hstmt, SQLError(henv, hdbc, hstmt, sqlstate, &error,
+ message, sizeof(message), &len));
+
+ /* Message has been consumed. */
+ expect_stmt(hstmt, SQLError(henv, hdbc, hstmt, sqlstate, &error,
+ message, sizeof(message), &len),
+ SQL_NO_DATA_FOUND);
+
+ /* But should still be available using SQLGetDiagRec. */
+ ok_stmt(hstmt, SQLGetDiagRec(SQL_HANDLE_STMT, hstmt, 1, sqlstate, &error,
+ message, sizeof(message), &len));
+
+ return OK;
+}
+
+
BEGIN_TESTS
#ifndef NO_DRIVERMANAGER
ADD_TEST(t_odbc2_error)
@@ -417,6 +443,7 @@
ADD_TEST(bind_notenoughparam2)
ADD_TEST(getdata_need_nullind)
ADD_TEST(t_handle_err)
+ ADD_TEST(sqlerror)
END_TESTS
RUN_TESTS
| Thread |
|---|
| • Connector/ODBC 3.51 commit: r904 - in branches/guffert: . driver test | jwinstead | 1 Dec |