List:Commits« Previous MessageNext Message »
From:jwinstead Date:November 14 2007 7:01pm
Subject:Connector/ODBC 3.51 commit: r861 - in branches/guffert: . driver setup test
View as plain text  
Modified:
   branches/guffert/
   branches/guffert/ChangeLog
   branches/guffert/driver/connect.c
   branches/guffert/driver/driver.h
   branches/guffert/driver/execute.c
   branches/guffert/driver/results.c
   branches/guffert/driver/utility.c
   branches/guffert/setup/MYODBCSetupDataSourceDialog.cpp
   branches/guffert/setup/MYODBCSetupDataSourceTab3.cpp
   branches/guffert/setup/MYODBCSetupDataSourceTab3c.cpp
   branches/guffert/setup/MYODBCSetupDataSourceTab3c.h
   branches/guffert/test/my_blob.c
   branches/guffert/test/my_catalog.c
   branches/guffert/test/my_keys.c
   branches/guffert/test/my_prepare.c
   branches/guffert/test/my_result.c
   branches/guffert/test/my_scroll.c
   branches/guffert/test/my_types.c
Log:
Merged revisions 810-857 via svnmerge from 
svn+ssh://bk-internal/connectors-svnroot/connector-odbc3/trunk

.......
  r810 | jwinstead | 2007-10-05 16:52:42 -0700 (Fri, 05 Oct 2007) | 2 lines
  
  Bump version to 3.51.22
.......
  r815 | jwinstead | 2007-10-11 11:00:01 -0700 (Thu, 11 Oct 2007) | 4 lines
  
  Added FLAG_COLUMN_SIZE_S32 to limit the reported column size to a
  signed 32-bit integer. This option is automatically enabled for ADO
  applications, in order to work around a bug in ADO. (Bug #13776)
.......
  r816 | jwinstead | 2007-10-11 11:02:47 -0700 (Thu, 11 Oct 2007) | 2 lines
  
  Fix all warnings in my_result.c, and fix one test case incorrectly set as TODO.
.......
  r817 | jwinstead | 2007-10-11 12:15:57 -0700 (Thu, 11 Oct 2007) | 3 lines
  
  Clean up warnings in my_prepare, backport using_dm from 5.1 tree so we can
  skip test in my_info that fails (correctly) with unixODBC.
.......
  r818 | jwinstead | 2007-10-11 16:24:38 -0700 (Thu, 11 Oct 2007) | 2 lines
  
  Clean up warnings in my_blob.c
.......
  r838 | jwinstead | 2007-11-08 10:48:41 -0800 (Thu, 08 Nov 2007) | 3 lines
  
  Remove workaround for bug #10491 in the server, which has now been
  fixed in MySQL Server 5.0.48 and 5.1.21.
.......
  r839 | jwinstead | 2007-11-08 16:08:57 -0800 (Thu, 08 Nov 2007) | 2 lines
  
  Fix warnings, skip stored proc test on pre-5.0 servers
.......
  r840 | jwinstead | 2007-11-08 16:10:25 -0800 (Thu, 08 Nov 2007) | 2 lines
  
  Remove dead code from test
.......
  r841 | jwinstead | 2007-11-08 16:11:13 -0800 (Thu, 08 Nov 2007) | 2 lines
  
  Remove unused variable
.......
  r842 | jwinstead | 2007-11-08 16:14:20 -0800 (Thu, 08 Nov 2007) | 2 lines
  
  Fix warnings about unused variables and sign mismatches
.......
  r843 | jwinstead | 2007-11-08 16:15:41 -0800 (Thu, 08 Nov 2007) | 2 lines
  
  Add cast for converting unsigned long to SQLSMALLINT
.......
  r844 | jwinstead | 2007-11-08 16:16:31 -0800 (Thu, 08 Nov 2007) | 2 lines
  
  Add cast of SQLINTEGER to SQLSMALLINT
.......
  r848 | jwinstead | 2007-11-09 14:31:38 -0800 (Fri, 09 Nov 2007) | 2 lines
  
  Fix type of variable used in both SQLGetConnectAttr() and SQLColumns()
.......
  r852 | jwinstead | 2007-11-12 11:00:26 -0800 (Mon, 12 Nov 2007) | 3 lines
  
  The wrong result was returned by SQLGetData() when the data was an
  empty string and a zero-sized buffer was specified. (Bug #30958)
.......
  r854 | jwinstead | 2007-11-13 08:59:40 -0800 (Tue, 13 Nov 2007) | 3 lines
  
  Unsigned integer values greater than the maximum value of a signed
  integer were handled incorrectly. (Bug #32171)
.......
  r855 | jwinstead | 2007-11-13 09:01:55 -0800 (Tue, 13 Nov 2007) | 3 lines
  
  The non-portable "English" locale was used for handling of decimal
  and floating-point values instead of "C". (Bug #32294)
.......
  r856 | jwinstead | 2007-11-13 09:02:25 -0800 (Tue, 13 Nov 2007) | 2 lines
  
  SQLGetInfo() reported that UNION was not supported. (Bug #32253)
.......
  r857 | jwinstead | 2007-11-13 17:31:23 -0800 (Tue, 13 Nov 2007) | 2 lines
  
  Get ready for release
.......



Property changes on: branches/guffert
___________________________________________________________________
Name: svnmerge-integrated
   - /trunk:1-808
   + /trunk:1-808,810-857

Modified: branches/guffert/ChangeLog
===================================================================
--- branches/guffert/ChangeLog	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/ChangeLog	2007-11-14 19:01:01 UTC (rev 861)
@@ -40,7 +40,7 @@
   * Fixed handling of NULL pointers passed to SQLGetInfo.
   * Parse Password - Unable to Connect. (Bug #16178)
   
-  Includes changes from Connector/ODBC 3.51.21.
+  Includes changes from Connector/ODBC 3.51.21 and 3.51.22.
 
 ----
 
@@ -53,6 +53,26 @@
 
 ----
 
+3.51.22 (13-Nov-2007)
+
+  Functionality added or changed:
+  * Removed workaround for bug #10491 in the server, which has now been
+    fixed in MySQL Server 5.0.48 and 5.1.21.
+  * Added FLAG_COLUMN_SIZE_S32 to limit the reported column size to a
+    signed 32-bit integer. This option is automatically enabled for ADO
+    applications, in order to work around a bug in ADO. (Bug #13776)
+
+  Bugs fixed:
+  * SQLGetInfo() reported that UNION was not supported. (Bug #32253)
+  * The non-portable "English" locale was used for handling of decimal
+    and floating-point values instead of "C". (Bug #32294)
+  * Unsigned integer values greater than the maximum value of a signed
+    integer were handled incorrectly. (Bug #32171)
+  * The wrong result was returned by SQLGetData() when the data was an
+    empty string and a zero-sized buffer was specified. (Bug #30958)
+
+----
+
 3.51.21 (5-Oct-2007)
 
   Bugs fixed:

Modified: branches/guffert/driver/connect.c
===================================================================
--- branches/guffert/driver/connect.c	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/driver/connect.c	2007-11-14 19:01:01 UTC (rev 861)
@@ -155,6 +155,15 @@
 
   options= sqlwchartoul(ds->option);
 
+#ifdef WIN32
+  /*
+   Detect if we are running with ADO present, and force on the
+   FLAG_COLUMN_SIZE_S32 option if we are.
+  */
+  if (GetModuleHandle("msado15.dll") != NULL)
+    options|= FLAG_COLUMN_SIZE_S32;
+#endif
+
   mysql_init(mysql);
 
   flags= get_client_flags(options);

Modified: branches/guffert/driver/driver.h
===================================================================
--- branches/guffert/driver/driver.h	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/driver/driver.h	2007-11-14 19:01:01 UTC (rev 861)
@@ -144,6 +144,7 @@
 #define FLAG_ZERO_DATE_TO_MIN (1 << 24) /* Convert XXXX-00-00 date to ODBC min date
on results */
 #define FLAG_MIN_DATE_TO_ZERO (1 << 25) /* Convert ODBC min date to 0000-00-00 on
query */
 #define FLAG_MULTI_STATEMENTS (1 << 26) /* Allow multiple statements in a query */
+#define FLAG_COLUMN_SIZE_S32 (1 << 27) /* Limit column size to a signed 32-bit
value (automatically set for ADO) */
 
 /* We don't make any assumption about what the default may be. */
 #ifndef DEFAULT_TXN_ISOLATION

Modified: branches/guffert/driver/execute.c
===================================================================
--- branches/guffert/driver/execute.c	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/driver/execute.c	2007-11-14 19:01:01 UTC (rev 861)
@@ -188,7 +188,7 @@
     net= &stmt->dbc->mysql.net;
     to= (char*) net->buff;
     if ( !(stmt->dbc->flag & FLAG_NO_LOCALE) )
-        setlocale(LC_NUMERIC,"English");  /* force use of '.' as decimal point */
+      setlocale(LC_NUMERIC, "C");  /* force use of '.' as decimal point */
     for ( i= 0; i < stmt->param_count; i++ )
     {
         DESCREC *aprec= desc_get_rec(stmt->apd, i, FALSE);
@@ -292,7 +292,7 @@
     */
     else if (*(aprec->octet_length_ptr) == SQL_COLUMN_IGNORE ||
              (*(aprec->octet_length_ptr) == 0 &&
-              aprec->concise_type == SQL_C_DEFAULT &&
+              aprec->concise_type == 0 &&
               aprec->par.value == NULL))
     {
       if (is_minimum_version(dbc->mysql.server_version, "4.0.3", 5))

Modified: branches/guffert/driver/results.c
===================================================================
--- branches/guffert/driver/results.c	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/driver/results.c	2007-11-14 19:01:01 UTC (rev 861)
@@ -207,7 +207,7 @@
 
     case SQL_C_ULONG:
       if (rgbValue)
-        *((SQLUINTEGER *)rgbValue)= (SQLUINTEGER)atol(value);
+        *((SQLUINTEGER *)rgbValue)= (SQLUINTEGER)strtoul(value, NULL, 10);
       *pcbValue= sizeof(SQLUINTEGER);
       break;
 
@@ -527,7 +527,12 @@
   if (type)
     *type= get_sql_data_type(stmt, field, NULL);
   if (size)
-    *size= get_column_size(stmt, field, FALSE);
+  {
+    SQLULEN csize= get_column_size(stmt, field, FALSE);
+    if ((stmt->dbc->flag & FLAG_COLUMN_SIZE_S32) && csize >
INT_MAX32)
+      csize= INT_MAX32;
+    *size= csize;
+  }
   if (scale)
     *scale= (SQLSMALLINT)max(0, get_decimal_digits(stmt, field));
   if (nullable)
@@ -973,7 +978,7 @@
     }
 
     if ( !(stmt->dbc->flag & FLAG_NO_LOCALE) )
-        setlocale(LC_NUMERIC,"English");
+      setlocale(LC_NUMERIC, "C");
     result= sql_get_data( stmt,
                           (SQLSMALLINT) (fCType == SQL_C_DEFAULT ?
stmt->odbc_types[icol] : fCType),
                           stmt->result->fields+icol,
@@ -1245,7 +1250,7 @@
     }
 
     if ( !(stmt->dbc->flag & FLAG_NO_LOCALE) )
-        setlocale(LC_NUMERIC,"English");
+      setlocale(LC_NUMERIC, "C");
     res= SQL_SUCCESS;
     for ( i= 0 ; i < rows_to_fetch ; i++ )
     {

Modified: branches/guffert/driver/utility.c
===================================================================
--- branches/guffert/driver/utility.c	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/driver/utility.c	2007-11-14 19:01:01 UTC (rev 861)
@@ -312,6 +312,13 @@
     if (!avail_bytes)
       avail_bytes= &bytes;
 
+    if (!result_bytes && !stmt->getdata.source)
+    {
+      *avail_bytes= src_bytes;
+      set_stmt_error(stmt, "01004", NULL, 0);
+      return SQL_SUCCESS_WITH_INFO;
+    }
+
     if (result_bytes)
       result_bytes--;
 
@@ -477,20 +484,25 @@
   if (result)
     *result= 0;
 
-  if (stmt->getdata.dst_bytes == (ulong)~0L)
+  if (result_bytes && stmt->getdata.dst_bytes == (ulong)~0L)
   {
     stmt->getdata.dst_bytes= used_bytes;
     stmt->getdata.dst_offset= 0;
   }
 
   if (avail_bytes)
-    *avail_bytes= stmt->getdata.dst_bytes - stmt->getdata.dst_offset;
+  {
+    if (stmt->getdata.dst_bytes != (ulong)~0L)
+      *avail_bytes= stmt->getdata.dst_bytes - stmt->getdata.dst_offset;
+    else
+      *avail_bytes= used_bytes;
+  }
 
   stmt->getdata.dst_offset+= min((ulong)(result_bytes ? result_bytes - 1 : 0),
                                  used_bytes);
 
   /* Did we truncate the data? */
-  if (stmt->getdata.dst_bytes > stmt->getdata.dst_offset)
+  if (!result_bytes || stmt->getdata.dst_bytes > stmt->getdata.dst_offset)
   {
     set_stmt_error(stmt, "01004", NULL, 0);
     rc= SQL_SUCCESS_WITH_INFO;
@@ -689,20 +701,25 @@
   if (result)
     *result= 0;
 
-  if (stmt->getdata.dst_bytes == (ulong)~0L)
+  if (result_len && stmt->getdata.dst_bytes == (ulong)~0L)
   {
     stmt->getdata.dst_bytes= used_chars * sizeof(SQLWCHAR);
     stmt->getdata.dst_offset= 0;
   }
 
   if (avail_bytes)
-    *avail_bytes= stmt->getdata.dst_bytes - stmt->getdata.dst_offset;
+  {
+    if (result_len)
+      *avail_bytes= stmt->getdata.dst_bytes - stmt->getdata.dst_offset;
+    else
+      *avail_bytes= used_chars * sizeof(SQLWCHAR);
+  }
 
   stmt->getdata.dst_offset+= min((ulong)(result_len ? result_len - 1 : 0),
                                  used_chars) * sizeof(SQLWCHAR);
 
   /* Did we truncate the data? */
-  if (stmt->getdata.dst_bytes > stmt->getdata.dst_offset)
+  if (!result_len || stmt->getdata.dst_bytes > stmt->getdata.dst_offset)
   {
     set_stmt_error(stmt, "01004", NULL, 0);
     rc= SQL_SUCCESS_WITH_INFO;
@@ -924,19 +941,10 @@
   */
   case MYSQL_TYPE_VARCHAR:
   case MYSQL_TYPE_VAR_STRING:
-#ifdef SERVER_BUG_10491_FIXED
-    /**
-      @todo Re-enable this when Bug #10491 is fixed in the server.
-    */
     if (buff)
       (void)strmov(buff, field_is_binary ? "varbinary" : "varchar");
 
     return field_is_binary ? SQL_VARBINARY : SQL_VARCHAR;
-#else
-    if (buff)
-      (void)strmov(buff, "varchar");
-    return SQL_VARCHAR;
-#endif
 
   case MYSQL_TYPE_TINY_BLOB:
     if (buff)

Modified: branches/guffert/setup/MYODBCSetupDataSourceDialog.cpp
===================================================================
--- branches/guffert/setup/MYODBCSetupDataSourceDialog.cpp	2007-11-14 09:48:01 UTC (rev
860)
+++ branches/guffert/setup/MYODBCSetupDataSourceDialog.cpp	2007-11-14 19:01:01 UTC (rev
861)
@@ -425,6 +425,7 @@
         ptab3->ptab3a->pcheckboxEnableReconnect->setChecked( nOptions & (1
<< 22) ? TRUE : FALSE );
         ptab3->ptab3a->pcheckboxAutoIncrementIsNull->setChecked( nOptions &
(1 << 23) ? TRUE : FALSE );
         ptab3->ptab3c->pcheckboxMultiStatements->setChecked( nOptions & (1
<< 26) ? TRUE : FALSE );
+        ptab3->ptab3c->pcheckboxCapColumnSize->setChecked( nOptions & (1
<< 27) ? TRUE : FALSE );
     }
 
     connect( ppushbuttonTest, SIGNAL(clicked()), SLOT(slotTest()) );
@@ -475,6 +476,7 @@
     connect( ptab3->ptab3c->pcheckboxDisableTransactions,
SIGNAL(signalAssistText(const QString&)), ptextbrowserAssist, SLOT(setHtml(const
QString&)) );
     connect( ptab3->ptab3c->pcheckboxForceUseOfForwardOnlyCursors,
SIGNAL(signalAssistText(const QString&)), ptextbrowserAssist, SLOT(setHtml(const
QString&)) );
     connect( ptab3->ptab3c->pcheckboxMultiStatements, SIGNAL(signalAssistText(const
QString&)), ptextbrowserAssist, SLOT(setHtml(const QString&)) );
+    connect( ptab3->ptab3c->pcheckboxCapColumnSize, SIGNAL(signalAssistText(const
QString&)), ptextbrowserAssist, SLOT(setHtml(const QString&)) );
     connect( ptab3->ptab3d->pcheckboxSaveQueries, SIGNAL(signalAssistText(const
QString&)), ptextbrowserAssist, SLOT(setHtml(const QString&)) );
 
     doApplyMode();

Modified: branches/guffert/setup/MYODBCSetupDataSourceTab3.cpp
===================================================================
--- branches/guffert/setup/MYODBCSetupDataSourceTab3.cpp	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/setup/MYODBCSetupDataSourceTab3.cpp	2007-11-14 19:01:01 UTC (rev 861)
@@ -96,6 +96,8 @@
         nFlags |= 1 << 23;
     if ( ptab3c->pcheckboxMultiStatements->isChecked() )
         nFlags |= 1 << 26;
+    if ( ptab3c->pcheckboxCapColumnSize->isChecked() )
+        nFlags |= 1 << 27;
 
     return nFlags;
 }

Modified: branches/guffert/setup/MYODBCSetupDataSourceTab3c.cpp
===================================================================
--- branches/guffert/setup/MYODBCSetupDataSourceTab3c.cpp	2007-11-14 09:48:01 UTC (rev
860)
+++ branches/guffert/setup/MYODBCSetupDataSourceTab3c.cpp	2007-11-14 19:01:01 UTC (rev
861)
@@ -31,6 +31,7 @@
     QString         stringDisableTransactions( tr("Disable transactions.") );
     QString         stringForceUseOfForwardOnlyCursors( tr("Force the use of Forward-only
cursor type. In case of applications setting the default static/dynamic cursor type, and
one wants driver to use non-cache result sets, then this option will ensure the
forward-only cursor behavior.") );
     QString         stringMultiStatements( tr("Allow multiple statements in a single
query.") );
+    QString         stringCapColumnSize( tr("Limit reported column size to signed 32-bit
integer (possible workaround for some applications, automatically enabled for
applications using ADO)") );
 
 #if QT_VERSION >= 0x040000
     QVBoxLayout *playoutFields = new QVBoxLayout;
@@ -115,6 +116,15 @@
     QToolTip::add( pcheckboxMultiStatements, stringMultiStatements );
 #endif
 
+    pcheckboxCapColumnSize = new MYODBCSetupCheckBox( tr("Limit column size to signed
32-bit range"), this );
+    pcheckboxCapColumnSize->setAssistText( stringCapColumnSize );
+    playoutFields->addWidget( pcheckboxCapColumnSize );
+#if QT_VERSION >= 0x040000
+    pcheckboxCapColumnSize->setToolTip( stringCapColumnSize );
+#else
+    QToolTip::add( pcheckboxCapColumnSize, stringCapColumnSize );
+#endif
+
     playoutFields->addStretch( 10 );
 }
 

Modified: branches/guffert/setup/MYODBCSetupDataSourceTab3c.h
===================================================================
--- branches/guffert/setup/MYODBCSetupDataSourceTab3c.h	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/setup/MYODBCSetupDataSourceTab3c.h	2007-11-14 19:01:01 UTC (rev 861)
@@ -49,6 +49,7 @@
     MYODBCSetupCheckBox *pcheckboxDisableTransactions;          
     MYODBCSetupCheckBox *pcheckboxForceUseOfForwardOnlyCursors;
     MYODBCSetupCheckBox *pcheckboxMultiStatements;
+    MYODBCSetupCheckBox *pcheckboxCapColumnSize;
 };
 
 #endif

Modified: branches/guffert/test/my_blob.c
===================================================================
--- branches/guffert/test/my_blob.c	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/test/my_blob.c	2007-11-14 19:01:01 UTC (rev 861)
@@ -28,7 +28,7 @@
     SQLUINTEGER j= 0;
     SQLINTEGER l;
     SQLLEN cbValue;
-    char *blobbuf;
+    SQLCHAR *blobbuf;
     SQLUINTEGER blobbuf_size = 1024 * 1 * 6L;
     SQLUINTEGER blob_read;
     SQLPOINTER token;
@@ -39,25 +39,18 @@
     rc = SQLSetConnectOption(hdbc, SQL_AUTOCOMMIT, 0L);
     mycon(hdbc,rc);
 
-    rc = SQLExecDirect(hstmt,
-                       "DROP TABLE TBLOB",
-                       SQL_NTS);
-    rc = SQLTransact(NULL, hdbc, SQL_COMMIT);
+    ok_sql(hstmt, "DROP TABLE IF EXISTS TBLOB");
+    ok_sql(hstmt, "CREATE TABLE TBLOB (I INTEGER NOT NULL PRIMARY KEY,"
+           "B LONGBLOB)");
 
-    rc = SQLExecDirect(hstmt,
-                       "CREATE TABLE TBLOB (I INTEGER NOT NULL PRIMARY KEY, B LONGBLOB)",
-                       SQL_NTS);
-    mystmt(hstmt,rc);
-    rc = SQLTransact(NULL, hdbc, SQL_COMMIT);
-    mycon(hdbc,rc);
-
     cbValue = 0;
-    rc = SQLPrepare(hstmt, "INSERT INTO TBLOB VALUES (1, ?)", SQL_NTS);
-    mystmt(hstmt,rc);
-    rc = SQLBindParameter(hstmt,SQL_PARAM_INPUT, 1, SQL_C_BINARY, SQL_LONGVARBINARY, 
-                          blob_size, 0, NULL, 0, &cbValue);
-    mystmt(hstmt,rc);
-    cbValue = SQL_DATA_AT_EXEC;        
+    ok_stmt(hstmt, SQLPrepare(hstmt,
+                              (SQLCHAR *)"INSERT INTO TBLOB VALUES (1, ?)",
+                              SQL_NTS));
+    ok_stmt(hstmt, SQLBindParameter(hstmt, SQL_PARAM_INPUT, 1, SQL_C_BINARY,
+                                    SQL_LONGVARBINARY, blob_size, 0, NULL,
+                                    0, &cbValue));
+    cbValue = SQL_DATA_AT_EXEC;
     blobbuf = (SQLCHAR *)malloc(blobbuf_size);
     memset(blobbuf, 'A', blobbuf_size);
 
@@ -87,9 +80,9 @@
     finish = clock();
 
     duration = (finish-start)/CLOCKS_PER_SEC;
-    printMessage("\n j: %d\n", j);
+    printMessage("j: %d", j);
     myassert(j == blob_size);
-    printMessage("Wrote %ld bytes in %3.3lf seconds (%lg bytes/s)\n",
+    printMessage("Wrote %ld bytes in %3.3lf seconds (%lg bytes/s)",
                  j, duration, duration == 0.0 ? 9.99e99 : j / duration);
 
     rc = SQLTransact(NULL, hdbc, SQL_COMMIT);
@@ -100,8 +93,9 @@
 
 
     memset(blobbuf, ~0, 100);
-    rc = SQLPrepare(hstmt, "SELECT I, B FROM TBLOB WHERE I = 1", SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_stmt(hstmt, SQLPrepare(hstmt,
+                              (SQLCHAR *)"SELECT I, B FROM TBLOB WHERE I = 1",
+                              SQL_NTS));
 
     start = clock();
 
@@ -123,8 +117,9 @@
     myassert(blob_read == blob_size);
     finish = clock();
     duration = (finish-start)/CLOCKS_PER_SEC;
-    printMessage("Read  %ld bytes in %3.3lf seconds (%lg bytes/s)\n",
-                 blob_read, duration, duration == 0.0 ? 9.99e99 : blob_read / duration);
+    printMessage("Read  %ld bytes in %3.3lf seconds (%lg bytes/s)",
+                 blob_read, duration, duration == 0.0 ? 9.99e99 :
+                 blob_read / duration);
 
     rc = SQLFreeStmt(hstmt, SQL_CLOSE);
     mystmt(hstmt,rc);
@@ -143,18 +138,10 @@
     SQLCHAR* blobbuf;
     size_t i;
 
-    rc = SQLExecDirect(hstmt,
-                       "DROP TABLE TBLOB",
-                       SQL_NTS);
-    rc = SQLTransact(NULL, hdbc, SQL_COMMIT);
+    ok_sql(hstmt, "DROP TABLE IF EXISTS TBLOB");
+    ok_sql(hstmt, "CREATE TABLE TBLOB (I INTEGER NOT NULL PRIMARY KEY,"
+          "B LONG VARCHAR NOT NULL)");
 
-    rc = SQLExecDirect(hstmt,
-                       "CREATE TABLE TBLOB (I INTEGER NOT NULL PRIMARY KEY, B LONG
VARCHAR NOT NULL)",
-                       SQL_NTS);
-    mystmt(hstmt,rc);
-    rc = SQLTransact(NULL, hdbc, SQL_COMMIT);
-    mycon(hdbc,rc);
-
     cbValue = 3510L;
 
     blobbuf = (SQLCHAR *)malloc((size_t)cbValue + 1);
@@ -168,14 +155,14 @@
     mystmt(hstmt,rc);
     rc = SQLBindParameter(hstmt,SQL_PARAM_INPUT, 2, SQL_C_CHAR, SQL_LONGVARCHAR, 0, 0,
blobbuf,cbValue, NULL);
     mystmt(hstmt,rc);
-    rc = SQLExecDirect(hstmt, "INSERT INTO TBLOB VALUES (1,?)", SQL_NTS);
+    ok_sql(hstmt, "INSERT INTO TBLOB VALUES (1,?)");
     mystmt(hstmt,rc);
     rc = SQLTransact(NULL, hdbc, SQL_COMMIT);
     mycon(hdbc,rc);
     memset(blobbuf, 1, (size_t)cbValue);
     rc = SQLFreeStmt(hstmt, SQL_RESET_PARAMS);
     mystmt(hstmt,rc);
-    rc = SQLExecDirect(hstmt, "SELECT B FROM TBLOB WHERE I = 1", SQL_NTS);
+    ok_sql(hstmt, "SELECT B FROM TBLOB WHERE I = 1");
     mystmt(hstmt,rc);
     rc = SQLFetch(hstmt);
     mystmt(hstmt,rc);
@@ -207,12 +194,12 @@
   SQLCHAR    data[255];
   SQLPOINTER token;
 
-    SQLExecDirect(hstmt,"drop table t_putdata",SQL_NTS);
-    rc = SQLExecDirect(hstmt,"create table t_putdata(c1 int, c2 long varchar)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "DROP TABLE IF EXISTS t_putdata");
+  ok_sql(hstmt, "CREATE TABLE t_putdata (c1 INT, c2 LONG VARCHAR)");
 
-    rc = SQLPrepare(hstmt,"insert into t_putdata values(?,?)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_stmt(hstmt, SQLPrepare(hstmt,
+                            (SQLCHAR *)"insert into t_putdata values(?,?)",
+                            SQL_NTS));
 
     rc = SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_LONG,
                           SQL_INTEGER,0,0,&c1,0,NULL);
@@ -230,12 +217,12 @@
     rc = SQLParamData(hstmt, &token);
     myassert(rc == SQL_NEED_DATA);
 
-    strcpy(data,"mysql ab");
+    strcpy((char *)data,"mysql ab");
     rc = SQLPutData(hstmt,data,6);
     mystmt(hstmt,rc);
 
-    strcpy(data,"- the open source database company");
-    rc = SQLPutData(hstmt,data,strlen(data));
+    strcpy((char *)data,"- the open source database company");
+    rc = SQLPutData(hstmt,data,strlen((char *)data));
     mystmt(hstmt,rc);
 
     rc = SQLParamData(hstmt, &token);
@@ -244,7 +231,7 @@
     SQLFreeStmt(hstmt, SQL_RESET_PARAMS);
     SQLFreeStmt(hstmt, SQL_CLOSE);
 
-    rc = SQLExecDirect(hstmt,"select c2 from t_putdata where c1= 10",SQL_NTS);
+    ok_sql(hstmt, "select c2 from t_putdata where c1= 10");
     mystmt(hstmt,rc);
 
     rc = SQLFetch(hstmt);
@@ -253,8 +240,8 @@
     pcbLength= 0;
     rc = SQLGetData(hstmt, 1, SQL_C_CHAR, data, sizeof(data), &pcbLength);
     mystmt(hstmt,rc);
-    fprintf(stdout,"data: %s(%d)\n", data, pcbLength);
-    myassert(strcmp(data,"mysql - the open source database company")==0);
+    printMessage("data: %s(%ld)", data, pcbLength);
+    is_str(data, "mysql - the open source database company", 40);
     myassert(pcbLength == 40);
 
     SQLFreeStmt(hstmt, SQL_UNBIND);
@@ -275,16 +262,15 @@
   SQLCHAR    data[255];
   SQLPOINTER token;
 
-    SQLExecDirect(hstmt,"drop table t_putdata",SQL_NTS);
-    rc = SQLExecDirect(hstmt,"create table t_putdata(c1 int, c2 long varchar)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "DROP TABLE IF EXISTS t_putdata");
+  ok_sql(hstmt, "CREATE TABLE t_putdata (c1 INT, c2 LONG VARCHAR)");
+  ok_sql(hstmt, "INSERT INTO t_putdata VALUES (10,'venu')");
 
-    rc = SQLExecDirect(hstmt,"insert into t_putdata values(10,'venu')",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_stmt(hstmt,
+          SQLPrepare(hstmt,
+                     (SQLCHAR *)"UPDATE t_putdata SET c2= ? WHERE c1 = ?",
+                     SQL_NTS));
 
-    rc = SQLPrepare(hstmt,"update t_putdata set c2= ? where c1 = ?",SQL_NTS);
-    mystmt(hstmt,rc);
-
     rc = SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_CHAR,
                           SQL_LONGVARCHAR,0,0,
                           (SQLPOINTER)1,0,&pcbLength);
@@ -301,12 +287,12 @@
     rc = SQLParamData(hstmt, &token);
     myassert(rc == SQL_NEED_DATA);
 
-    strcpy(data,"mysql ab");
+    strcpy((char *)data,"mysql ab");
     rc = SQLPutData(hstmt,data,6);
     mystmt(hstmt,rc);
 
-    strcpy(data,"- the open source database company");
-    rc = SQLPutData(hstmt,data,strlen(data));
+    strcpy((char *)data,"- the open source database company");
+    rc = SQLPutData(hstmt,data,strlen((char *)data));
     mystmt(hstmt,rc);
 
     rc = SQLParamData(hstmt, &token);
@@ -315,7 +301,7 @@
     SQLFreeStmt(hstmt, SQL_RESET_PARAMS);
     SQLFreeStmt(hstmt, SQL_CLOSE);
 
-    rc = SQLExecDirect(hstmt,"select c2 from t_putdata where c1= 10",SQL_NTS);
+    ok_sql(hstmt, "select c2 from t_putdata where c1= 10");
     mystmt(hstmt,rc);
 
     rc = SQLFetch(hstmt);
@@ -324,8 +310,8 @@
     pcbLength= 0;
     rc = SQLGetData(hstmt, 1, SQL_C_CHAR, data, sizeof(data), &pcbLength);
     mystmt(hstmt,rc);
-    fprintf(stdout,"data: %s(%d)\n", data, pcbLength);
-    myassert(strcmp(data,"mysql - the open source database company")==0);
+    printMessage("data: %s(%ld)", data, pcbLength);
+    is_str(data,"mysql - the open source database company", 40);
     myassert(pcbLength == 40);
 
     SQLFreeStmt(hstmt, SQL_UNBIND);
@@ -346,12 +332,13 @@
   SQLCHAR    data[255];
   SQLPOINTER token;
 
-    SQLExecDirect(hstmt,"drop table t_putdata",SQL_NTS);
-    rc = SQLExecDirect(hstmt,"create table t_putdata(c1 int, c2 long varchar, c3 long
varchar)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "DROP TABLE IF EXISTS t_putdata");
+  ok_sql(hstmt, "CREATE TABLE t_putdata (c1 INT, c2 LONG VARCHAR,"
+        "c3 LONG VARCHAR)");
 
-    rc = SQLPrepare(hstmt,"insert into t_putdata values(?,?,?)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_stmt(hstmt, SQLPrepare(hstmt,
+                            (SQLCHAR *)"insert into t_putdata values(?,?,?)",
+                            SQL_NTS));
 
     rc = SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_LONG,
                           SQL_INTEGER,0,0,&c1,0,NULL);
@@ -373,18 +360,18 @@
     rc = SQLParamData(hstmt, &token);
     myassert(rc == SQL_NEED_DATA);
 
-    strcpy(data,"mysql ab");
+    strcpy((char *)data,"mysql ab");
     rc = SQLPutData(hstmt,data,6);
     mystmt(hstmt,rc);
 
-    strcpy(data,"- the open source database company");
-    rc = SQLPutData(hstmt,data,strlen(data));
+    strcpy((char *)data,"- the open source database company");
+    rc = SQLPutData(hstmt,data,strlen((char *)data));
     mystmt(hstmt,rc);
 
     rc = SQLParamData(hstmt, &token);
     myassert(rc == SQL_NEED_DATA);
 
-    strcpy(data,"MySQL AB");
+    strcpy((char *)data,"MySQL AB");
     rc = SQLPutData(hstmt,data, 8);
     mystmt(hstmt,rc);
 
@@ -394,7 +381,7 @@
     SQLFreeStmt(hstmt, SQL_RESET_PARAMS);
     SQLFreeStmt(hstmt, SQL_CLOSE);
 
-    rc = SQLExecDirect(hstmt,"select c2,c3 from t_putdata where c1= 10",SQL_NTS);
+    ok_sql(hstmt, "select c2,c3 from t_putdata where c1= 10");
     mystmt(hstmt,rc);
 
     rc = SQLFetch(hstmt);
@@ -403,15 +390,15 @@
     pcbLength= 0;
     rc = SQLGetData(hstmt, 1, SQL_C_CHAR, data, sizeof(data), &pcbLength);
     mystmt(hstmt,rc);
-    fprintf(stdout,"data: %s(%d)\n", data, pcbLength);
-    myassert(strcmp(data,"mysql - the open source database company")==0);
+    printMessage("data: %s(%ld)", data, pcbLength);
+    is_str(data, "mysql - the open source database company", 40);
     myassert(pcbLength == 40);
 
     pcbLength= 0;
     rc = SQLGetData(hstmt, 2, SQL_C_CHAR, data, sizeof(data), &pcbLength);
     mystmt(hstmt,rc);
-    fprintf(stdout,"data: %s(%d)\n", data, pcbLength);
-    myassert(strcmp(data,"MySQL AB")==0);
+    printMessage("data: %s(%ld)", data, pcbLength);
+    is_str(data, "MySQL AB", 8);
     myassert(pcbLength == 8);
 
     SQLFreeStmt(hstmt, SQL_RESET_PARAMS);
@@ -431,10 +418,10 @@
   SQLINTEGER  id, id1, id2, id3;
   SQLLEN      resId, resUTimeSec, resUTimeMSec, resDataLen, resData;
 
-  char buffer[]= "MySQL - The worlds's most popular open source database";
+  SQLCHAR buffer[]= "MySQL - The worlds's most popular open source database";
   const int MAX_PART_SIZE = 5;
 
-  char *pdata= 0, data[50];
+  SQLCHAR data[50];
   int commonLen= 20;
 
   ok_sql(hstmt, "DROP TABLE IF EXISTS t_putdata3");
@@ -542,12 +529,12 @@
   SQLLEN     length;
   const SQLINTEGER max_blob_size=1024*100;
 
-    SQLExecDirect(hstmt,"drop table t_blob",SQL_NTS);
-    rc = SQLExecDirect(hstmt,"create table t_blob(blb long varbinary)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "DROP TABLE IF EXISTS t_blob");
+  ok_sql(hstmt, "CREATE TABLE t_blob (blb LONG VARBINARY)");
 
-    rc = SQLPrepare(hstmt,"insert into t_blob values(?)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_stmt(hstmt,
+          SQLPrepare(hstmt,
+                     (SQLCHAR *)"INSERT INTO t_blob  VALUES (?)",SQL_NTS));
 
     if (!(data = (SQLCHAR *)calloc(max_blob_size,sizeof(SQLCHAR))))
     {
@@ -562,10 +549,8 @@
 
     memset(data,'X',max_blob_size);
 
-    fprintf(stdout,"inserting %d rows\n\n", max_blob_size / 1024);
     for (length=1024; length <= max_blob_size; length+= 1024)
     {
-      fprintf(stdout,"\r %d", length/1024);
       rc = SQLExecute(hstmt);
       mystmt(hstmt,rc);
     }
@@ -573,8 +558,7 @@
     SQLFreeStmt(hstmt,SQL_RESET_PARAMS);
     SQLFreeStmt(hstmt,SQL_CLOSE);
 
-    rc = SQLExecDirect(hstmt,"SELECT length(blb) FROM t_blob",SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_sql(hstmt, "SELECT length(blb) FROM t_blob");
 
     rc = SQLBindCol(hstmt,1,SQL_C_LONG,&val,0,NULL);
     mystmt(hstmt,rc);
@@ -584,7 +568,7 @@
       rc = SQLFetch(hstmt);
       mystmt(hstmt,rc);
 
-      fprintf(stdout,"row %d length: %d\n", i, val);
+      printMessage("row %d length: %d", i, val);
       myassert(val == i * 1024);
     }
     rc = SQLFetch(hstmt);
@@ -609,15 +593,14 @@
   SQLLEN     row_count, length;
   SQLCHAR    data[TEST_ODBC_TEXT_LEN+1];
 
-    SQLExecDirect(hstmt,"drop table t_text_fetch",SQL_NTS);
-    rc = SQLExecDirect(hstmt,"create table t_text_fetch(t1 tinytext, \
-                                                      t2 text, \
-                                                      t3 mediumtext, \
-                                                      t4 longtext)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "DROP TABLE IF EXISTS t_text_fetch");
+  ok_sql(hstmt, "CREATE TABLE t_text_fetch(t1 tinytext,"
+         "t2 text, t3 mediumtext, t4 longtext)");
 
-    rc = SQLPrepare(hstmt,"insert into t_text_fetch values(?,?,?,?)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_stmt(hstmt,
+          SQLPrepare(hstmt,
+                     (SQLCHAR *)"insert into t_text_fetch values(?,?,?,?)",
+                     SQL_NTS));
 
     rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,
                           0,0,(char *)data, TEST_ODBC_TEXT_LEN/3, NULL);
@@ -648,45 +631,43 @@
     SQLFreeStmt(hstmt, SQL_RESET_PARAMS);
     SQLFreeStmt(hstmt, SQL_CLOSE);
 
-    rc = SQLExecDirect(hstmt,"SELECT * FROM t_text_fetch",SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_sql(hstmt, "SELECT * FROM t_text_fetch");
 
     row_count= 0;
     rc = SQLFetch(hstmt);
     while (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
     {
-       fprintf(stdout,"row '%d' (lengths: \n", row_count);
+       printf("# row '%ld' (lengths:", row_count);
        rc = SQLGetData(hstmt,1,SQL_C_CHAR,(char *)data,TEST_ODBC_TEXT_LEN,&length);
        mystmt(hstmt,rc);
-       fprintf(stdout,"%d", length);
+       printf("%ld", length);
        myassert(length == 255);
 
        rc = SQLGetData(hstmt,2,SQL_C_CHAR,(char *)data,TEST_ODBC_TEXT_LEN,&length);
        mystmt(hstmt,rc);
-       fprintf(stdout,",%d", length);
+       printf(",%ld", length);
        myassert(length == TEST_ODBC_TEXT_LEN/2);
 
        rc = SQLGetData(hstmt,3,SQL_C_CHAR,(char *)data,TEST_ODBC_TEXT_LEN,&length);
        mystmt(hstmt,rc);
-       fprintf(stdout,",%d", length);
+       printf(",%ld", length);
        myassert(length == (SQLINTEGER)(TEST_ODBC_TEXT_LEN/1.5));
 
        rc = SQLGetData(hstmt,4,SQL_C_CHAR,(char *)data,TEST_ODBC_TEXT_LEN,&length);
        mystmt(hstmt,rc);
-       fprintf(stdout,",%d)", length);
+       printf(",%ld)\n", length);
        myassert(length == TEST_ODBC_TEXT_LEN-1);
        row_count++;
 
        rc = SQLFetch(hstmt);
     }
-    fprintf(stdout,"total rows: %d\n", row_count);
+    printMessage("total rows: %ld", row_count);
     myassert(row_count == i);
 
     SQLFreeStmt(hstmt, SQL_UNBIND);
     SQLFreeStmt(hstmt, SQL_CLOSE);
 
-    rc = SQLExecDirect(hstmt,"DROP TABLE t_text_fetch",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "DROP TABLE t_text_fetch");
 
   return OK;
 }
@@ -761,7 +742,7 @@
   ok_sql(hstmt, "create table t_bug10562 ( id int not null primary key, mb longblob )");
   ok_sql(hstmt, "insert into t_bug10562 (mb) values ('zzzzzzzzzz')");
 
-  ok_stmt(hstmt, SQLExecDirect(hstmt, "select id, mb from t_bug10562", SQL_NTS));
+  ok_sql(hstmt, "select id, mb from t_bug10562");
   ok_stmt(hstmt, SQLFetch(hstmt));
   ok_stmt(hstmt, SQLBindCol(hstmt, 2, SQL_C_BINARY, blob, bsize, &bsize));
   ok_stmt(hstmt, SQLSetPos(hstmt, 1, SQL_UPDATE, SQL_LOCK_NO_CHANGE));

Modified: branches/guffert/test/my_catalog.c
===================================================================
--- branches/guffert/test/my_catalog.c	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/test/my_catalog.c	2007-11-14 19:01:01 UTC (rev 861)
@@ -301,10 +301,11 @@
   return OK;
 }
 
+
 DECLARE_TEST(t_sqlprocedures)
 {
-  SQLRETURN rc;
-  /** @todo check server version */
+  if (!mysql_min_version(hdbc, "5.0", 3))
+    skip("server does not support stored procedures");
 
   /* avoid errors in case binary log is activated */
   ok_sql(hstmt, "SET GLOBAL log_bin_trust_function_creators = 1");
@@ -493,7 +494,7 @@
     printMessage("checking column `%s`", (char *)ColumnName);
 
     ok_stmt(hstmt, SQLColumns(hstmt,
-                              DatabaseName, cbDatabaseName,
+                              DatabaseName, (SQLSMALLINT)cbDatabaseName,
                               (SQLCHAR *)"", SQL_NTS,
                               (SQLCHAR *)"t_columns", SQL_NTS,
                               ColumnName, SQL_NTS));

Modified: branches/guffert/test/my_keys.c
===================================================================
--- branches/guffert/test/my_keys.c	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/test/my_keys.c	2007-11-14 19:01:01 UTC (rev 861)
@@ -27,7 +27,6 @@
 DECLARE_TEST(my_no_keys)
 {
     SQLRETURN rc;
-    SQLROWCOUNT rowcount;
     SQLINTEGER nData;
 
   ok_sql(hstmt, "DROP TABLE IF EXISTS my_no_keys");
@@ -73,17 +72,6 @@
 
     nData = 999;
 
-    /* TO BE FIXED LATER
-	
-	rc = SQLSetPos(hstmt,2,SQL_UPDATE,SQL_LOCK_NO_CHANGE);
-    mystmt(hstmt,rc);
-
-    rc = SQLRowCount(hstmt,&rowcount);
-    mystmt(hstmt,rc);
-
-    printMessage(" rows affected:%d\n",rowcount); 
-    myassert(rowcount == 1); */
-
     rc = SQLFreeStmt(hstmt,SQL_UNBIND);
     mystmt(hstmt,rc);
 
@@ -99,18 +87,12 @@
     mystmt(hstmt,rc);
 
     rc = SQLExecDirect(hstmt,"select * from my_no_keys",SQL_NTS);
-    mystmt(hstmt,rc);    
+    mystmt(hstmt,rc);
 
     rc = SQLFetch(hstmt);
     mystmt(hstmt,rc);
     myassert(3000 == my_fetch_int(hstmt,4));
 
-    /*  TO BE FIXED LATER (SEE ABOVE)
-	
-	rc = SQLFetch(hstmt);
-    mystmt(hstmt,rc);
-    myassert(999 == my_fetch_int(hstmt,4)); */
-
     rc = SQLFetch(hstmt);
     mystmt(hstmt,rc);
     myassert(3000 == my_fetch_int(hstmt,4));
@@ -119,11 +101,6 @@
     mystmt(hstmt,rc);
     myassert(3000 == my_fetch_int(hstmt,4));
 
-    /* TO BE FIXED LATER (SEE ABOVE)
-	
-	rc = SQLFetch(hstmt);
-    mystmt_err(hstmt,rc==SQL_NO_DATA_FOUND,rc); */
-
     SQLFreeStmt(hstmt,SQL_UNBIND);
     SQLFreeStmt(hstmt,SQL_CLOSE);
 

Modified: branches/guffert/test/my_prepare.c
===================================================================
--- branches/guffert/test/my_prepare.c	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/test/my_prepare.c	2007-11-14 19:01:01 UTC (rev 861)
@@ -33,11 +33,12 @@
 
   ok_sql(hstmt, "DROP TABLE IF EXISTS t_prep_basic");
 
-    rc = SQLExecDirect(hstmt,"create table t_prep_basic(a int, b char(4))",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "create table t_prep_basic(a int, b char(4))");
 
-    rc = SQLPrepare(hstmt, "insert into t_prep_basic values(?,'venu')",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_stmt(hstmt,
+          SQLPrepare(hstmt,
+                     (SQLCHAR *)"insert into t_prep_basic values(?,'venu')",
+                     SQL_NTS));
 
     rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0,
&id, 0, NULL);
     mystmt(hstmt,rc);
@@ -55,11 +56,10 @@
     SQLFreeStmt(hstmt,SQL_RESET_PARAMS);
     SQLFreeStmt(hstmt,SQL_CLOSE);
 
-    rc = SQLExecDirect(hstmt,"select * from t_prep_basic",SQL_NTS);
-    mystmt(hstmt,rc);  
+    ok_sql(hstmt, "select * from t_prep_basic");
 
     rc = SQLBindCol(hstmt, 1, SQL_C_LONG, &id, 0, &length1);
-    mystmt(hstmt,rc);  
+    mystmt(hstmt,rc);
 
     rc = SQLBindCol(hstmt, 2, SQL_C_CHAR, name, 5, &length2);
     mystmt(hstmt,rc);
@@ -90,19 +90,20 @@
 /* to test buffer length */
 DECLARE_TEST(t_prep_buffer_length)
 {
-    SQLLEN length;
-    char       buffer[20];
+  SQLLEN length;
+  SQLCHAR buffer[20];
 
   ok_sql(hstmt, "DROP TABLE IF EXISTS t_prep_buffer_length");
 
-    rc = SQLExecDirect(hstmt,"create table t_prep_buffer_length(a varchar(20))",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "create table t_prep_buffer_length(a varchar(20))");
 
-    rc = SQLPrepare(hstmt, "insert into t_prep_buffer_length values(?)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_stmt(hstmt,
+          SQLPrepare(hstmt,
+                     (SQLCHAR *)"insert into t_prep_buffer_length values(?)",
+                     SQL_NTS));
 
-    length= 0;
-    strcpy(buffer,"abcdefghij");
+  length= 0;
+  strcpy((char *)buffer, "abcdefghij");
 
     rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 15, 10,
buffer, 4, &length);
     mystmt(hstmt,rc);
@@ -125,7 +126,7 @@
     rc = SQLExecute(hstmt);
     mystmt(hstmt,rc);
 
-    length= SQL_NTS;    
+    length= SQL_NTS;
 
     rc = SQLExecute(hstmt);
     mystmt(hstmt,rc);
@@ -133,8 +134,7 @@
     SQLFreeStmt(hstmt,SQL_RESET_PARAMS);
     SQLFreeStmt(hstmt,SQL_CLOSE);
 
-    rc = SQLExecDirect(hstmt,"select * from t_prep_buffer_length",SQL_NTS);
-    mystmt(hstmt,rc);  
+    ok_sql(hstmt, "select * from t_prep_buffer_length");
 
     rc = SQLBindCol(hstmt, 1, SQL_C_CHAR, buffer, 15, &length);
     mystmt(hstmt,rc);
@@ -143,31 +143,36 @@
     mystmt(hstmt,rc);
 
     printMessage( "outdata: %s (%ld)\n", buffer, length);
-    myassert(buffer[0] == '\0' && length == 0);
+    is_num(length, 0);
+    is_num(buffer[0], '\0');
 
     rc = SQLFetch(hstmt);
     mystmt(hstmt,rc);
 
     printMessage("outdata: %s (%ld)\n", buffer, length);
-    myassert(strcmp(buffer,"abc") == 0 && length == 3);
+    is_num(length, 3);
+    is_str(buffer, "abc", 10);
 
     rc = SQLFetch(hstmt);
     mystmt(hstmt,rc);
 
     printMessage("outdata: %s (%ld)\n", buffer, length);
-    myassert(strcmp(buffer,"abcdefghij") == 0 && length == 10);
+    is_num(length, 10);
+    is_str(buffer, "abcdefghij", 10);
 
     rc = SQLFetch(hstmt);
     mystmt(hstmt,rc);
 
     printMessage("outdata: %s (%ld)\n", buffer, length);
-    myassert(strcmp(buffer,"abcdefghi") == 0 && length == 9);
+    is_num(length, 9);
+    is_str(buffer, "abcdefghi", 9);
 
     rc = SQLFetch(hstmt);
     mystmt(hstmt,rc);
 
     printMessage("outdata: %s (%ld)\n", buffer, length);
-    myassert(strcmp(buffer,"abcdefghij") == 0 && length == 10);
+    is_num(length, 10);
+    is_str(buffer, "abcdefghij", 10);
 
     rc = SQLFetch(hstmt);
     myassert(rc == SQL_NO_DATA_FOUND);
@@ -192,13 +197,14 @@
 
   ok_sql(hstmt, "DROP TABLE IF EXISTS t_prep_truncate");
 
-    rc = SQLExecDirect(hstmt,"create table t_prep_truncate(a int, b char(4), c
binary(4))",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "create table t_prep_truncate(a int, b char(4), c binary(4))");
 
-    rc = SQLPrepare(hstmt, "insert into t_prep_truncate
values(500,'venu','venu')",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_stmt(hstmt,
+          SQLPrepare(hstmt,
+                     (SQLCHAR *)"insert into t_prep_truncate "
+                     "values(500,'venu','venu')", SQL_NTS));
 
-    strcpy(name,"venu");
+    strcpy((char *)name,"venu");
     rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 10, 10, name,
5, NULL);
     mystmt(hstmt,rc);
 
@@ -217,8 +223,7 @@
     SQLFreeStmt(hstmt,SQL_RESET_PARAMS);
     SQLFreeStmt(hstmt,SQL_CLOSE);
 
-    rc = SQLExecDirect(hstmt,"select b,c from t_prep_truncate",SQL_NTS);
-    mystmt(hstmt,rc);  
+    ok_sql(hstmt, "select b,c from t_prep_truncate");
 
     rc = SQLBindCol(hstmt, 1, SQL_C_CHAR, name, 2, &length);
     mystmt(hstmt,rc);
@@ -230,13 +235,13 @@
     mystmt(hstmt,rc);
 
     printMessage("str outdata: %s(%d)\n",name,length);
-    myassert(strcmp(name,"v")==0);
-    myassert(length == 4);
+    is_num(length, 4);
+    is_str(bin, "v", 1);
 
     bin[4]='M';
     printMessage("bin outdata: %s(%d)\n",bin,length1);
-    myassert(strncmp(bin,"venuM",5)==0);
-    myassert(length == 4);
+    is_num(length, 4);
+    is_str(bin, "venuM", 5);
 
     rc = SQLFetch(hstmt);
     myassert(rc == SQL_NO_DATA_FOUND);
@@ -332,11 +337,12 @@
 
   ok_sql(hstmt, "DROP TABLE IF EXISTS t_prep_getdata");
 
-    rc = SQLExecDirect(hstmt,"create table t_prep_getdata(a tinyint, b int, c
char(4))",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "create table t_prep_getdata(a tinyint, b int, c char(4))");
 
-    rc = SQLPrepare(hstmt,"insert into t_prep_getdata values(?,?,?)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_stmt(hstmt,
+          SQLPrepare(hstmt,
+                     (SQLCHAR *)"insert into t_prep_getdata values(?,?,?)",
+                     SQL_NTS));
 
     rc = SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_LONG,SQL_TINYINT,
                           0,0,&data,0,NULL);
@@ -348,7 +354,7 @@
                           10,10,name,6,NULL);
     mystmt(hstmt,rc);
 
-    sprintf(name,"venu"); data = 10;
+    sprintf((char *)name,"venu"); data = 10;
 
     rc = SQLExecute(hstmt);
     mystmt(hstmt,rc);
@@ -360,7 +366,7 @@
     SQLFreeStmt(hstmt,SQL_CLOSE);
 
     data= 0;
-    rc = SQLExecDirect(hstmt,"select * from t_prep_getdata",SQL_NTS);
+    ok_sql(hstmt, "select * from t_prep_getdata");
     mystmt(hstmt,rc);
 
     rc = SQLBindCol(hstmt, 1,SQL_C_TINYINT, &tiny, 0, NULL);
@@ -387,13 +393,14 @@
 
     printMessage("record 3 : %s(%ld)\n", name, (long)length);
 
-    myassert(strcmp(name,"venu")== 0 && length == 4);
+    is_num(length, 4);
+    is_str(name, "venu", 4);
 
     data = 0;
     rc = SQLGetData(hstmt,1,SQL_C_LONG,&data,0,NULL);
     mystmt(hstmt,rc);
 
-    printMessage("record 1 : %ld\n", data);
+    printMessage("record 1 : %ld", data);
     myassert( data == 10);
 
     rc = SQLFreeStmt(hstmt,SQL_UNBIND);
@@ -416,16 +423,13 @@
 
   ok_sql(hstmt, "DROP TABLE IF EXISTS t_prep_getdata");
 
-    rc = SQLExecDirect(hstmt,"create table t_prep_getdata(a char(10), b int)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "create table t_prep_getdata(a char(10), b int)");
 
-    rc = SQLExecDirect(hstmt,"insert into t_prep_getdata
values('abcdefghij',12345)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "insert into t_prep_getdata values('abcdefghij',12345)");
 
-    SQLFreeStmt(hstmt,SQL_CLOSE);
+  ok_stmt(hstmt, SQLFreeStmt(hstmt, SQL_CLOSE));
 
-    rc = SQLExecDirect(hstmt,"select * from t_prep_getdata",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "select * from t_prep_getdata");
 
     rc = SQLFetch(hstmt);
     mystmt(hstmt, rc);
@@ -435,44 +439,51 @@
     mystmt(hstmt,rc);
 
     printMessage("data: %s (%ld)\n", data, length);
-    myassert(strcmp(data,"M") == 0 && length == 10);
+    is_num(length, 10);
+    is_str(data, "M", 1);
 
     rc = SQLGetData(hstmt,1,SQL_C_CHAR,data,4,&length);
     mystmt(hstmt,rc);
 
     printMessage("data: %s (%ld)\n", data, length);
-    myassert(strcmp(data,"abc") == 0 && length == 10);
+    is_num(length, 10);
+    is_str(data, "abc", 3);
 
     rc = SQLGetData(hstmt,1,SQL_C_CHAR,data,4,&length);
     mystmt(hstmt,rc);
 
     printMessage("data: %s (%ld)\n", data, length);
-    myassert(strcmp(data,"def") == 0 && length == 7);
+    is_num(length, 7);
+    is_str(data, "def", 3);
 
     rc = SQLGetData(hstmt,1,SQL_C_CHAR,data,4,&length);
     mystmt(hstmt,rc);
 
     printMessage("data: %s (%ld)\n", data, length);
-    myassert(strcmp(data,"ghi") == 0 && length == 4);
+    is_num(length, 4);
+    is_str(data, "ghi", 3);
 
     data[0]= 'M';
     rc = SQLGetData(hstmt,1,SQL_C_CHAR,data,0,&length);
     mystmt(hstmt,rc);
 
     printMessage("data: %s (%ld)\n", data, length);
-    myassert(data[0] == 'M' && length == 1);
+    is_num(length, 1);
+    is_str(data, "M", 1);
 
     rc = SQLGetData(hstmt,1,SQL_C_CHAR,data,1,&length);
     mystmt(hstmt,rc);
 
     printMessage("data: %s (%ld)\n", data, length);
-    myassert(data[0] == '\0' && length == 1);
+    is_num(length, 1);
+    is_num(data[0], '\0');
 
     rc = SQLGetData(hstmt,1,SQL_C_CHAR,data,2,&length);
     mystmt(hstmt,rc);
 
     printMessage("data: %s (%ld)\n", data, length);
-    myassert(strcmp(data,"j") == 0 && length == 1);
+    is_num(length, 1);
+    is_str(data, "j", 1);
 
     rc = SQLGetData(hstmt,1,SQL_C_CHAR,data,2,&length);
     myassert(rc == SQL_NO_DATA);
@@ -482,44 +493,52 @@
     mystmt(hstmt,rc);
 
     printMessage("data: %s (%ld)\n", data, length);
-    myassert(strcmp(data,"M") == 0 && length == 5);
+    is_num(length, 5);
+    is_str(data, "M", 2);
 
     rc = SQLGetData(hstmt,2,SQL_C_CHAR,data,3,&length);
     mystmt(hstmt,rc);
 
     printMessage("data: %s (%ld)\n", data, length);
-    myassert(strcmp(data,"12") == 0 && length == 5);
+    is_num(length, 5);
+    is_str(data, "12", 2);
 
     rc = SQLGetData(hstmt,2,SQL_C_CHAR,data,2,&length);
     mystmt(hstmt,rc);
 
     printMessage("data: %s (%ld)\n", data, length);
-    myassert(strcmp(data,"3") == 0 && length == 3);
+    is_num(length, 3);
+    is_str(data, "3", 1);
 
     rc = SQLGetData(hstmt,2,SQL_C_CHAR,data,2,&length);
     mystmt(hstmt,rc);
 
     printMessage("data: %s (%ld)\n", data, length);
-    myassert(strcmp(data,"4") == 0 && length == 2);
+    is_num(length, 2);
+    is_str(data, "4", 1);
 
     data[0]= 'M';
     rc = SQLGetData(hstmt,2,SQL_C_CHAR,data,0,&length);
     mystmt(hstmt,rc);
 
     printMessage("data: %s (%ld)\n", data, length);
-    myassert(data[0] == 'M' && length == 1);
+    is_num(length, 1);
+    is_str(data, "M", 1);
 
     rc = SQLGetData(hstmt,2,SQL_C_CHAR,data,1,&length);
     mystmt(hstmt,rc);
 
     printMessage("data: %s (%ld)\n", data, length);
     myassert(data[0] == '\0' && length == 1);
+    is_num(length, 1);
+    is_num(data[0], '\0');
 
     rc = SQLGetData(hstmt,2,SQL_C_CHAR,data,2,&length);
     mystmt(hstmt,rc);
 
     printMessage("data: %s (%ld)\n", data, length);
-    myassert(strcmp(data,"5") == 0 && length == 1);
+    is_num(length, 1);
+    is_str(data, "5", 1);
 
     rc = SQLGetData(hstmt,2,SQL_C_CHAR,data,2,&length);
     myassert(rc == SQL_NO_DATA);
@@ -543,10 +562,10 @@
 
   ok_sql(hstmt, "DROP TABLE IF EXISTS t_prep_catalog");
 
-    rc = SQLExecDirect(hstmt,"create table t_prep_catalog(a int default 100)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "create table t_prep_catalog(a int default 100)");
 
-    rc = SQLTables(hstmt,NULL,0,NULL,0,"t_prep_catalog",14,"TABLE",5);
+    rc = SQLTables(hstmt,NULL,0,NULL,0,(SQLCHAR *)"t_prep_catalog",14,
+                   (SQLCHAR *)"TABLE",5);
     mystmt(hstmt,rc);
 
     rc = SQLFetch(hstmt);
@@ -558,7 +577,8 @@
 
     rc = SQLGetData(hstmt,3,SQL_C_CHAR,table,15,&length);
     mystmt(hstmt,rc);
-    myassert(strcmp(table,"t_prep_catalog") == 0 && length == 14);
+    is_num(length, 14);
+    is_str(table, "t_prep_catalog", 14);
 
     rc = SQLFetch(hstmt);
     myassert(rc == SQL_NO_DATA);
@@ -569,7 +589,7 @@
     rc = SQLFreeStmt(hstmt,SQL_CLOSE);
     mystmt(hstmt,rc);
 
-    rc = SQLColumns(hstmt,NULL,0,NULL,0,"t_prep_catalog",14,NULL,0);
+    rc = SQLColumns(hstmt,NULL,0,NULL,0,(SQLCHAR *)"t_prep_catalog",14,NULL,0);
     mystmt(hstmt,rc);
 
     rc = SQLFetch(hstmt);
@@ -586,12 +606,14 @@
 
     rc = SQLGetData(hstmt,4,SQL_C_CHAR,table,2,&length);
     mystmt(hstmt,rc);
-    myassert(strcmp(table,"a") == 0 && length == 1);
+    is_num(length, 1);
+    is_str(table, "a", 1);
 
     rc = SQLGetData(hstmt,13,SQL_C_CHAR,table,10,&length);
     mystmt(hstmt,rc);
     printMessage("table: %s(%d)\n", table, length);
-    myassert(strcmp(table,"100") == 0 && length == 3);
+    is_num(length, 3);
+    is_str(table, "100", 3);
 
     rc = SQLFetch(hstmt);
     myassert(rc == SQL_NO_DATA);
@@ -614,28 +636,18 @@
     SQLLEN length, length1;
     char b[]= "abcdefghij", b1[10];
 
-/*
-    if (!mysql_min_version(hdbc, "5.0",3))
-    {
-        printMessage("server doesn't support stored procedures..skipped\n");
-        return;
-    }
-*/
+  if (!mysql_min_version(hdbc, "5.0", 3))
+    skip("server does not support stored procedures");
 
   ok_sql(hstmt, "DROP TABLE IF EXISTS t_tabsp");
   ok_sql(hstmt, "DROP PROCEDURE IF EXISTS t_sp");
 
-    rc = SQLExecDirect(hstmt,"create table t_tabsp(a int, b varchar(10))",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "create table t_tabsp(a int, b varchar(10))");
 
-    rc = SQLExecDirect(hstmt,"create procedure t_sp(x int, y char(10)) \
-                              begin \
-                                insert into t_tabsp values(x, y); \
-                              end;",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt,"create procedure t_sp(x int, y char(10)) "
+         "begin insert into t_tabsp values(x, y); end;");
 
-    rc = SQLPrepare(hstmt,"call t_sp(?,?)",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_stmt(hstmt, SQLPrepare(hstmt, (SQLCHAR *)"call t_sp(?,?)", SQL_NTS));
 
     rc = SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_LONG,SQL_INTEGER,
                           0,0,&a,0,NULL);
@@ -653,8 +665,7 @@
     SQLFreeStmt(hstmt, SQL_RESET_PARAMS);
     SQLFreeStmt(hstmt, SQL_CLOSE);
 
-    rc = SQLExecDirect(hstmt,"select * from t_tabsp",SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_sql(hstmt, "select * from t_tabsp");
 
     rc = SQLBindCol(hstmt,1,SQL_C_LONG,&a,0,NULL);
     mystmt(hstmt,rc);
@@ -701,8 +712,8 @@
     rc = tmysql_exec(hstmt,"insert into t_prepare values(200,'MySQL','two')");
     mystmt(hstmt,rc);
 
-    rc = SQLPrepare(hstmt,"select * from t_prepare where col2 = ? AND col1 = ?",SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_stmt(hstmt, SQLPrepare(hstmt, (SQLCHAR *)"select * from t_prepare "
+                              "where col2 = ? AND col1 = ?",SQL_NTS));
 
     rc = SQLNumResultCols(hstmt,&pccol);
     mystmt(hstmt,rc);
@@ -729,7 +740,7 @@
     rc = SQLFetch(hstmt);
     mystmt(hstmt,rc);
 
-    fprintf(stdout," outdata: %d, %s(%d)\n", nodata,szodata,nlen);
+    fprintf(stdout," outdata: %d, %s(%ld)\n", nodata,szodata,nlen);
     my_assert(nodata == 200);
 
     rc = SQLFetch(hstmt);
@@ -791,8 +802,7 @@
     rc = SQLFreeStmt(hstmt,SQL_RESET_PARAMS);
     mystmt(hstmt,rc);
 
-    rc = SQLExecDirect(hstmt,"SELECT * FROM t_prepare1",SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_sql(hstmt, "SELECT * FROM t_prepare1");
 
     myassert(3 == myresult(hstmt));/* unless prepare is supported..*/
 
@@ -975,8 +985,10 @@
 
     mystmt(hstmt,rc);
 
-    rc = SQLPrepare(hstmt,"select id from t_acc_update where id = ?",SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_stmt(hstmt,
+            SQLPrepare(hstmt,
+                       (SQLCHAR *)"select id from t_acc_update where id = ?",
+                       SQL_NTS));
 
     rc =
SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_DEFAULT,SQL_INTEGER,11,0,&id,0,NULL);
     mystmt(hstmt,rc);
@@ -1012,8 +1024,7 @@
     rc =
SQLBindParameter(hstmt1,2,SQL_PARAM_INPUT,SQL_C_DEFAULT,SQL_INTEGER,11,0,&id1,0,NULL);
     mystmt(hstmt1,rc);
 
-    rc = SQLExecDirect(hstmt1,"UPDATE t_acc_update SET id = ?  WHERE id = ?",SQL_NTS);
-    mystmt(hstmt1,rc);
+    ok_sql(hstmt1, "UPDATE t_acc_update SET id = ?  WHERE id = ?");
 
     rc = SQLRowCount(hstmt1,&pcrow);
     mystmt(hstmt1,rc);
@@ -1035,24 +1046,23 @@
 }
 
 
+/**
+  Bug #29871: MyODBC problem with MS Query ('Memory allocation error')
+*/
 DECLARE_TEST(t_bug29871)
 {
-  SQLCHAR *param= "1";
+  SQLCHAR *param= (SQLCHAR *)"1";
 
-  skip("skipping this test for a while due to DM-related issues");
-
   ok_sql(hstmt, "DROP TABLE IF EXISTS t_bug29871");
   ok_sql(hstmt, "CREATE TABLE t_bug29871 (a INT)");
-  
+
   /* The bug is related to calling deprecated SQLSetParam */
-  ok_stmt(hstmt, SQLSetParam(hstmt, 1, SQL_C_CHAR, SQL_INTEGER, 10, 0, 
+  ok_stmt(hstmt, SQLSetParam(hstmt, 1, SQL_C_CHAR, SQL_INTEGER, 10, 0,
                              param, 0));
-  ok_stmt(hstmt, SQLExecDirect(hstmt,"INSERT INTO t_bug29871 VALUES (?)",
-	                       SQL_NTS));
-  ok_stmt(hstmt, SQLSetParam(hstmt, 1, SQL_C_CHAR, SQL_INTEGER, 10, 0, 
+  ok_sql(hstmt, "INSERT INTO t_bug29871 VALUES (?)");
+  ok_stmt(hstmt, SQLSetParam(hstmt, 1, SQL_C_CHAR, SQL_INTEGER, 10, 0,
                              param, 0));
-  ok_stmt(hstmt, SQLExecDirect(hstmt,"SELECT * FROM t_bug29871 WHERE a=?",
-	                       SQL_NTS));
+  ok_sql(hstmt, "SELECT * FROM t_bug29871 WHERE a=?");
   ok_sql(hstmt, "DROP TABLE t_bug29871");
   return OK;
 }

Modified: branches/guffert/test/my_result.c
===================================================================
--- branches/guffert/test/my_result.c	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/test/my_result.c	2007-11-14 19:01:01 UTC (rev 861)
@@ -33,53 +33,43 @@
     SQLSMALLINT nIndex,ncol,pfSqlType, pcbScale, pfNullable;
 
     /* drop table 'myodbc3_demo_result' if it already exists */
-    rc = SQLExecDirect(hstmt,"DROP TABLE if exists myodbc3_demo_result",SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_sql(hstmt, "DROP TABLE if exists myodbc3_demo_result");
 
     /* commit the transaction */
-    rc = SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT); 
+    rc = SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
     mycon(hdbc,rc);
 
     /* create the table 'myodbc3_demo_result' */
-    rc = SQLExecDirect(hstmt,"CREATE TABLE myodbc3_demo_result(\
-                              id int primary key auto_increment,\
-                              name varchar(20))",SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_sql(hstmt,"CREATE TABLE myodbc3_demo_result("
+           "id int primary key auto_increment,name varchar(20))");
 
     rc = SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
-    mycon(hdbc,rc);    
+    mycon(hdbc,rc);
 
-    /* insert 2 rows of data */    
-    rc = SQLExecDirect(hstmt,"INSERT INTO myodbc3_demo_result values(\
-                              1,'MySQL')",SQL_NTS);
-    mystmt(hstmt,rc);
+    /* insert 2 rows of data */
+    ok_sql(hstmt, "INSERT INTO myodbc3_demo_result values(1,'MySQL')");
+    ok_sql(hstmt, "INSERT INTO myodbc3_demo_result values(2,'MyODBC')");
 
-    rc = SQLExecDirect(hstmt,"INSERT INTO myodbc3_demo_result values(\
-                              2,'MyODBC')",SQL_NTS);
-    mystmt(hstmt,rc);
-
     /* commit the transaction */
-    rc = SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT); 
+    rc = SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
     mycon(hdbc,rc);
 
-    /* update second row */    
-    rc = SQLExecDirect(hstmt,"UPDATE myodbc3_demo_result set name=\
-                              'MyODBC 3.51' where id=2",SQL_NTS);
-    mystmt(hstmt,rc);
+    /* update second row */
+    ok_sql(hstmt, "UPDATE myodbc3_demo_result set name="
+           "'MyODBC 3.51' where id=2");
 
     /* commit the transaction */
-    rc = SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT); 
+    rc = SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
     mycon(hdbc,rc);
 
-    /* now fetch back..*/   
-    rc = SQLExecDirect(hstmt,"SELECT * from myodbc3_demo_result",SQL_NTS);
-    mystmt(hstmt,rc);
+    /* now fetch back..*/
+    ok_sql(hstmt, "SELECT * from myodbc3_demo_result");
 
     /* get total number of columns from the resultset */
     rc = SQLNumResultCols(hstmt,&ncol);
     mystmt(hstmt,rc);
 
-    printMessage(" total columns in resultset:%d\n\n",ncol);
+    printMessage("total columns in resultset:%d",ncol);
 
     /* print the column names  and do the row bind */
     for (nIndex = 1; nIndex <= ncol; nIndex++)
@@ -88,12 +78,11 @@
                             &pfSqlType,&pcColDef,&pcbScale,&pfNullable);
         mystmt(hstmt,rc);
 
-        printMessage(" %s\t",szColName);
+        printf("%s\t",szColName);
 
     }
+    printf("\n");
 
-    printMessage("\n--------------------\n");
-
     /* now fetch row by row */
     rc = SQLFetch(hstmt);
     while (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
@@ -104,15 +93,15 @@
             rc = SQLGetData(hstmt,nIndex, SQL_C_CHAR, szData,
                             MAX_ROW_DATA_LEN,NULL);
             mystmt(hstmt,rc);
-            printMessage(" %s\t",szData);
+            printf("%s\t",szData);
         }
 
-        printMessage("\n");
+        printf("\n");
         rc = SQLFetch(hstmt);
     }
     SQLFreeStmt(hstmt,SQL_UNBIND);
 
-    printMessage("\n total rows fetched:%d\n",nRowCount);
+    printMessage("total rows fetched:%d",nRowCount);
 
     /* free the statement row bind resources */
     rc = SQLFreeStmt(hstmt, SQL_UNBIND);
@@ -122,8 +111,7 @@
     rc = SQLFreeStmt(hstmt, SQL_CLOSE);
     mystmt(hstmt,rc);
 
-    rc = SQLExecDirect(hstmt, "DROP TABLE myodbc3_demo_result", SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "DROP TABLE myodbc3_demo_result");
 
   return OK;
 }
@@ -141,103 +129,89 @@
     rc = SQLGetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,&OdbcVersion,0,NULL);
     myenv(henv,rc);
 
-    fprintf(stdout,"odbc version:\n");
+    fprintf(stdout,"# odbc version:");
     if (OdbcVersion == SQL_OV_ODBC2)
     {
-      fprintf(stdout," SQL_OV_ODBC2");
+      fprintf(stdout," SQL_OV_ODBC2\n");
       DateType= SQL_DATE;
     }
     else
     {
-      fprintf(stdout," SQL_OV_ODBC3");
+      fprintf(stdout," SQL_OV_ODBC3\n");
       DateType= SQL_TYPE_DATE;
     }
 
-    rc = SQLGetInfo(hdbc,SQL_DBMS_VER,(SQLCHAR *)&DbVersion,MAX_NAME_LEN,NULL);
+    rc = SQLGetInfo(hdbc,SQL_DBMS_VER,DbVersion,MAX_NAME_LEN,NULL);
     mycon(hdbc,rc);
 
   ok_sql(hstmt, "DROP TABLE IF EXISTS t_convert");
 
-    rc = SQLExecDirect(hstmt,"CREATE TABLE t_convert(col0 integer, \
-                                                     col1 date,\
-                                                     col2 char(10))",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "CREATE TABLE t_convert(col0 int, col1 date, col2 char(10))");
 
-    rc = SQLExecDirect(hstmt,"INSERT INTO t_convert
VALUES(10,'2002-10-24','venu')",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_sql(hstmt, "INSERT INTO t_convert VALUES(10,'2002-10-24','venu')");
+  ok_sql(hstmt, "INSERT INTO t_convert VALUES(20,'2002-10-23','venu1')");
+  ok_sql(hstmt, "INSERT INTO t_convert VALUES(30,'2002-10-25','venu2')");
+  ok_sql(hstmt, "INSERT INTO t_convert VALUES(40,'2002-10-24','venu3')");
 
-    rc = SQLExecDirect(hstmt,"INSERT INTO t_convert
VALUES(20,'2002-10-23','venu1')",SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_sql(hstmt, "SELECT MAX(col0) FROM t_convert");
 
-    rc = SQLExecDirect(hstmt,"INSERT INTO t_convert
VALUES(30,'2002-10-25','venu2')",SQL_NTS);
+    rc = SQLDescribeCol(hstmt,1,ColName,MAX_NAME_LEN,NULL,&SqlType,NULL,NULL,NULL);
     mystmt(hstmt,rc);
 
-    rc = SQLExecDirect(hstmt,"INSERT INTO t_convert
VALUES(40,'2002-10-24','venu3')",SQL_NTS);
-    mystmt(hstmt,rc);
-
-    rc = SQLExecDirect(hstmt,"SELECT MAX(col0) FROM t_convert",SQL_NTS);
-    mystmt(hstmt,rc);
-
-    rc = SQLDescribeCol(hstmt,1,(SQLCHAR
*)&ColName,MAX_NAME_LEN,NULL,&SqlType,NULL,NULL,NULL);
-    mystmt(hstmt,rc);
-
-    fprintf(stdout,"MAX(col0): %d\n", SqlType);
+    printMessage("MAX(col0): %d", SqlType);
     myassert(SqlType == SQL_INTEGER);
 
     SQLFreeStmt(hstmt,SQL_CLOSE);
 
-    rc = SQLExecDirect(hstmt,"SELECT MAX(col1) FROM t_convert",SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_sql(hstmt, "SELECT MAX(col1) FROM t_convert");
 
-    rc = SQLDescribeCol(hstmt,1,(SQLCHAR
*)&ColName,MAX_NAME_LEN,NULL,&SqlType,NULL,NULL,NULL);
+    rc = SQLDescribeCol(hstmt,1,ColName,MAX_NAME_LEN,NULL,&SqlType,NULL,NULL,NULL);
     mystmt(hstmt,rc);
 
-    fprintf(stdout,"MAX(col1): %d\n", SqlType);
+    printMessage("MAX(col1): %d", SqlType);
     myassert(SqlType == DateType);
 
     SQLFreeStmt(hstmt,SQL_CLOSE);
 
-    rc = SQLExecDirect(hstmt,"SELECT MAX(col2) FROM t_convert",SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_sql(hstmt, "SELECT MAX(col2) FROM t_convert");
 
-    rc = SQLDescribeCol(hstmt,1,(SQLCHAR
*)&ColName,MAX_NAME_LEN,NULL,&SqlType,NULL,NULL,NULL);
+    rc = SQLDescribeCol(hstmt,1,ColName,MAX_NAME_LEN,NULL,&SqlType,NULL,NULL,NULL);
     mystmt(hstmt,rc);
 
-    fprintf(stdout,"MAX(col0): %d\n", SqlType);
+    printMessage("MAX(col0): %d", SqlType);
 
     SQLFreeStmt(hstmt,SQL_CLOSE);
 
-    if (strncmp(DbVersion,"4.",2) >= 0)
+    if (strncmp((char *)DbVersion,"4.",2) >= 0)
     {
-      rc = SQLExecDirect(hstmt,"SELECT CAST(MAX(col1) AS DATE) AS col1 FROM
t_convert",SQL_NTS);
+      ok_sql(hstmt, "SELECT CAST(MAX(col1) AS DATE) AS col1 FROM t_convert");
       mystmt(hstmt,rc);
 
-      rc = SQLDescribeCol(hstmt,1,(SQLCHAR
*)&ColName,MAX_NAME_LEN,NULL,&SqlType,NULL,NULL,NULL);
+      rc = SQLDescribeCol(hstmt,1,ColName,MAX_NAME_LEN,NULL,&SqlType,NULL,NULL,NULL);
       mystmt(hstmt,rc);
 
-      fprintf(stdout,"CAST(MAX(col1) AS DATE): %d\n", SqlType);
+      printMessage("CAST(MAX(col1) AS DATE): %d", SqlType);
       myassert(SqlType == DateType);
 
       SQLFreeStmt(hstmt,SQL_CLOSE);
 
-      rc = SQLExecDirect(hstmt,"SELECT CONVERT(MAX(col1),DATE) AS col1 FROM
t_convert",SQL_NTS);
+      ok_sql(hstmt, "SELECT CONVERT(MAX(col1),DATE) AS col1 FROM t_convert");
       mystmt(hstmt,rc);
 
-      rc = SQLDescribeCol(hstmt,1,(SQLCHAR
*)&ColName,MAX_NAME_LEN,NULL,&SqlType,NULL,NULL,NULL);
+      rc = SQLDescribeCol(hstmt,1,ColName,MAX_NAME_LEN,NULL,&SqlType,NULL,NULL,NULL);
       mystmt(hstmt,rc);
 
-      fprintf(stdout,"CONVERT(MAX(col1),DATE): %d\n", SqlType);
+      printMessage("CONVERT(MAX(col1),DATE): %d", SqlType);
       myassert(SqlType == DateType);
 
       SQLFreeStmt(hstmt,SQL_CLOSE);
 
-      rc = SQLExecDirect(hstmt,"SELECT CAST(MAX(col1) AS CHAR) AS col1 FROM
t_convert",SQL_NTS);
-      mystmt(hstmt,rc);
+      ok_sql(hstmt,"SELECT CAST(MAX(col1) AS CHAR) AS col1 FROM t_convert");
 
       rc = SQLDescribeCol(hstmt,1,(SQLCHAR
*)&ColName,MAX_NAME_LEN,NULL,&SqlType,NULL,NULL,NULL);
       mystmt(hstmt,rc);
 
-      fprintf(stdout,"CAST(MAX(col1) AS CHAR): %d\n", SqlType);
+      printMessage("CAST(MAX(col1) AS CHAR): %d", SqlType);
       myassert(SqlType == SQL_VARCHAR || SqlType == SQL_LONGVARCHAR);
 
       SQLFreeStmt(hstmt,SQL_CLOSE);
@@ -268,14 +242,14 @@
                       &pfSqlType,&pcbColDef,&pibScale,&pfNullable);
   mystmt(hstmt,rc);
 
-  fprintf(stdout, "\n\n Column Number'%d':", icol);
+  printMessage("Column Number'%d':", icol);
 
-  fprintf(stdout, "\t Column Name    : %s\n", szColName);
-  fprintf(stdout, "\t NameLengh      : %d\n", pcbColName);
-  fprintf(stdout, "\t DataType       : %d\n", pfSqlType);
-  fprintf(stdout, "\t ColumnSize     : %d\n", pcbColDef);
-  fprintf(stdout, "\t DecimalDigits  : %d\n", pibScale);
-  fprintf(stdout, "\t Nullable       : %d\n", pfNullable);
+  printMessage(" Column Name    : %s", szColName);
+  printMessage(" NameLengh      : %d", pcbColName);
+  printMessage(" DataType       : %d", pfSqlType);
+  printMessage(" ColumnSize     : %d", pcbColDef);
+  printMessage(" DecimalDigits  : %d", pibScale);
+  printMessage(" Nullable       : %d", pfNullable);
 
   is_str(szColName, name, pcbColName);
   is_num(pfSqlType, sql_type);
@@ -337,7 +311,7 @@
   is(desc_col_check(hstmt, 10, "c10", SQL_REAL,      7,  7,  0, SQL_NULLABLE) == OK);
   is(desc_col_check(hstmt, 11, "c11", SQL_BIGINT,    19, 19, 0,  SQL_NO_NULLS) == OK);
 
-  is(desc_col_check(hstmt, 12, "c12", SQL_VARCHAR,   12, 12, 0,  SQL_NULLABLE) == OK);
+  is(desc_col_check(hstmt, 12, "c12", SQL_VARBINARY, 12, 12, 0,  SQL_NULLABLE) == OK);
 
   is(desc_col_check(hstmt, 13, "c13", SQL_CHAR,      20, 20, 0,  SQL_NO_NULLS) == OK);
   is(desc_col_check(hstmt, 14, "c14", SQL_REAL,      7,  7,  0,  SQL_NULLABLE) == OK);
@@ -391,13 +365,13 @@
 
     rc = SQLFetch(hstmt);
     mystmt(hstmt,rc);
-    myassert(strcmp(data,"record1-must be string") == 0 ||
-             strcmp(data,"record2-must be string") == 0);
+    myassert(strcmp((char *)data,"record1-must be string") == 0 ||
+             strcmp((char *)data,"record2-must be string") == 0);
 
     rc = SQLFetch(hstmt);
     mystmt(hstmt,rc);
-    myassert(strcmp(data,"record1-must be string") == 0 ||
-             strcmp(data,"record2-must be string") == 0);
+    myassert(strcmp((char *)data,"record1-must be string") == 0 ||
+             strcmp((char *)data,"record2-must be string") == 0);
 
     rc = SQLFetch(hstmt);
     myassert( rc == SQL_NO_DATA);
@@ -430,8 +404,9 @@
     rc = SQLTransact(NULL,hdbc,SQL_COMMIT);
     mycon(hdbc,rc);
 
-    rc = SQLPrepare(hstmt,"insert into t_max_rows values(?)",SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_stmt(hstmt, SQLPrepare(hstmt,
+                              (SQLCHAR *)"insert into t_max_rows values(?)",
+                              SQL_NTS));
 
     rc =
SQLBindParameter(hstmt,1,SQL_PARAM_INPUT,SQL_C_ULONG,SQL_INTEGER,0,0,&i,0,NULL);
     mystmt(hstmt,rc);
@@ -536,66 +511,66 @@
 
     rc = SQLFetch(hstmt);
     mystmt(hstmt,rc);
-    fprintf(stdout,"id: %ld\n",id);
+    printMessage("id: %ld",id);
     myassert(id == 10);
 
     rc = SQLGetData(hstmt,2,SQL_C_CHAR,szData,0,&pcbValue);
     myassert(rc == SQL_SUCCESS_WITH_INFO);
-    fprintf(stdout,"length: %ld\n", pcbValue);
+    printMessage("length: %ld", pcbValue);
     myassert(pcbValue == 28);
 
     rc = SQLGetData(hstmt,2,SQL_C_CHAR,szData,0,&pcbValue);
     myassert(rc == SQL_SUCCESS_WITH_INFO);
-    fprintf(stdout,"length: %ld\n", pcbValue);
+    printMessage("length: %ld", pcbValue);
     myassert(pcbValue == 28);
 
     rc = SQLGetData(hstmt,2,SQL_C_BINARY,szData,0,&pcbValue);
     myassert(rc == SQL_SUCCESS_WITH_INFO);
-    fprintf(stdout,"length: %ld\n", pcbValue);
+    printMessage("length: %ld", pcbValue);
     myassert(pcbValue == 28);
 
     rc = SQLGetData(hstmt,2,SQL_C_BINARY,szData,0,&pcbValue);
     myassert(rc == SQL_SUCCESS_WITH_INFO);
-    fprintf(stdout,"length: %ld\n", pcbValue);
+    printMessage("length: %ld", pcbValue);
     myassert(pcbValue == 28);
 
     rc = SQLGetData(hstmt,2,SQL_C_CHAR,szData,0,&pcbValue);
     myassert(rc == SQL_SUCCESS_WITH_INFO);
-    fprintf(stdout,"length: %ld\n", pcbValue);
-    myassert(pcbValue == 28);
+    printMessage("length: %ld", pcbValue);
+    is_num(pcbValue, 28);
 
     rc = SQLGetData(hstmt,2,SQL_C_CHAR,szData,10,&pcbValue);
     myassert(rc == SQL_SUCCESS_WITH_INFO);
-    fprintf(stdout,"data  : %s (%ld)\n",szData,pcbValue);
-    myassert(pcbValue == 28);
-    myassert(strcmp(szData,"MySQL - O") == 0);
+    printMessage("data  : %s (%ld)",szData,pcbValue);
+    is_num(pcbValue, 28);
+    is_str(szData, "MySQL - O", 10);
 
     pcbValue= 0;
     rc = SQLGetData(hstmt,2,SQL_C_CHAR,szData,5,&pcbValue);
     myassert(rc == SQL_SUCCESS_WITH_INFO);
-    fprintf(stdout,"data  : %s (%ld)\n",szData,pcbValue);
-    myassert(pcbValue == 19);
-    myassert(strcmp(szData,"pen ") == 0);
+    printMessage("data  : %s (%ld)",szData,pcbValue);
+    is_num(pcbValue, 19);
+    is_str(szData, "pen ", 5);
 
     pcbValue= 0;
     szData[0]='A';
     rc = SQLGetData(hstmt,2,SQL_C_CHAR,szData,0,&pcbValue);
     myassert(rc == SQL_SUCCESS_WITH_INFO);
-    fprintf(stdout,"data  : %s (%ld)\n",szData,pcbValue);
+    printMessage("data  : %s (%ld)",szData,pcbValue);
     myassert(pcbValue == 15);
     myassert(szData[0] == 'A');
 
     rc = SQLGetData(hstmt,2,SQL_C_CHAR,szData,pcbValue+1,&pcbValue);
     mystmt(hstmt,rc);
-    fprintf(stdout,"data  : %s (%ld)\n",szData,pcbValue);
-    myassert(pcbValue == 15);
-    myassert(strcmp(szData,"Source Database") == 0);
+    printMessage("data  : %s (%ld)",szData,pcbValue);
+    is_num(pcbValue, 15);
+    is_str(szData,"Source Database", 16);
 
     pcbValue= 99;
     szData[0]='A';
     expect_stmt(hstmt, SQLGetData(hstmt, 2, SQL_C_CHAR, szData, 0, &pcbValue),
                 SQL_NO_DATA_FOUND);
-    fprintf(stdout,"data  : %s (%ld)\n",szData,pcbValue);
+    printMessage("data  : %s (%ld)",szData,pcbValue);
     myassert(pcbValue == 99);
     myassert(szData[0] == 'A');
 
@@ -643,19 +618,19 @@
 
     pcbValue= pcbValue1= 99;
     ok_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_CHAR, szData, 0, &pcbValue));
-    fprintf(stdout,"length: %d\n", pcbValue);
+    printMessage("length: %d", pcbValue);
     myassert(pcbValue == 0);
 
     bData[0]=bData[1]='z';
     ok_stmt(hstmt, SQLGetData(hstmt, 2, SQL_C_BINARY, bData, 0, &pcbValue1));
-    fprintf(stdout,"length: %d\n", pcbValue1);
+    printMessage("length: %d", pcbValue1);
     myassert(pcbValue1 == 0);
     myassert(bData[0] == 'z');
     myassert(bData[1] == 'z');
 
     bData1[0]=bData1[1]='z';
     ok_stmt(hstmt, SQLGetData(hstmt, 3, SQL_C_BINARY, bData1, 0, &pcbValue2));
-    fprintf(stdout,"length: %d\n", pcbValue2);
+    printMessage("length: %d", pcbValue2);
     myassert(pcbValue2 == 0);
     myassert(bData1[0] == 'z');
     myassert(bData1[1] == 'z');
@@ -663,20 +638,20 @@
     pcbValue= pcbValue1= 99;
     rc = SQLGetData(hstmt,1,SQL_C_CHAR,szData,1,&pcbValue);
     mystmt(hstmt,rc);
-    fprintf(stdout,"data: %s, length: %d\n", szData, pcbValue);
+    printMessage("data: %s, length: %d", szData, pcbValue);
     myassert(pcbValue == 0);
     myassert(szData[0] == '\0');
 
     bData[0]=bData[1]='z';
     rc = SQLGetData(hstmt,2,SQL_C_BINARY,bData,1,&pcbValue1);
     mystmt(hstmt,rc);
-    fprintf(stdout,"data: %s, length: %d\n", bData, pcbValue1);
+    printMessage("data: %s, length: %d", bData, pcbValue1);
     myassert(pcbValue1 == 0);
 
     bData1[0]=bData1[1]='z';
     rc = SQLGetData(hstmt,3,SQL_C_CHAR,bData1,1,&pcbValue2);
     mystmt(hstmt,rc);
-    fprintf(stdout,"data: %s, length: %d\n", bData1, pcbValue2);
+    printMessage("data: %s, length: %d", bData1, pcbValue2);
     myassert(pcbValue2 == 0);
     myassert(bData1[0] == '\0');
     myassert(bData1[1] == 'z');
@@ -688,40 +663,40 @@
     szData[0]= bData[0]= 'z';
     rc = SQLGetData(hstmt,1,SQL_C_CHAR,szData,0,&pcbValue);
     mystmt_err(hstmt,rc == SQL_SUCCESS_WITH_INFO,rc);
-    fprintf(stdout,"length: %d\n", pcbValue);
+    printMessage("length: %d", pcbValue);
     myassert(pcbValue == 4);
     myassert(szData[0] == 'z');
 
     rc = SQLGetData(hstmt,2,SQL_C_BINARY,bData,0,&pcbValue1);
     mystmt_err(hstmt,rc == SQL_SUCCESS_WITH_INFO,rc);
-    fprintf(stdout,"length: %d\n", pcbValue1);
+    printMessage("length: %d", pcbValue1);
     myassert(pcbValue1 == 5);
     myassert(bData[0] == 'z');
 
     bData[0]=bData1[1]='z';
     rc = SQLGetData(hstmt,3,SQL_C_BINARY,bData1,0,&pcbValue2);
     mystmt_err(hstmt,rc == SQL_SUCCESS_WITH_INFO,rc);
-    fprintf(stdout,"length: %d\n", pcbValue2);
+    printMessage("length: %d", pcbValue2);
     myassert(pcbValue2 == 5);
 
     pcbValue= pcbValue1= 99;
     szData[0]= szData[1]= bData[0]= bData[1]= 'z';
     rc = SQLGetData(hstmt,1,SQL_C_CHAR,szData,1,&pcbValue);
     mystmt_err(hstmt,rc == SQL_SUCCESS_WITH_INFO,rc);
-    fprintf(stdout,"data: %s, length: %d\n", szData,pcbValue);
+    printMessage("data: %s, length: %d", szData,pcbValue);
     myassert(pcbValue == 4);
     myassert(szData[0] == '\0');
 
     rc = SQLGetData(hstmt,2,SQL_C_BINARY,bData,1,&pcbValue1);
     mystmt_err(hstmt,rc == SQL_SUCCESS_WITH_INFO,rc);
-    fprintf(stdout,"data; %s, length: %d\n", bData, pcbValue1);
+    printMessage("data; %s, length: %d", bData, pcbValue1);
     myassert(pcbValue1 == 5);
     myassert(bData[0] == 'm');
 
     bData[0]=bData1[1]='z';
     rc = SQLGetData(hstmt,3,SQL_C_BINARY,bData1,1,&pcbValue2);
     mystmt_err(hstmt,rc == SQL_SUCCESS_WITH_INFO,rc);
-    fprintf(stdout,"length: %d\n", pcbValue2);
+    printMessage("length: %d", pcbValue2);
     myassert(pcbValue2 == 5);
     myassert(bData1[0] == 'm');
     myassert(bData1[1] == 'z');
@@ -729,33 +704,33 @@
     pcbValue= pcbValue1= 99;
     rc = SQLGetData(hstmt,1,SQL_C_CHAR,szData,4,&pcbValue);
     mystmt_err(hstmt,rc == SQL_SUCCESS_WITH_INFO,rc);
-    fprintf(stdout,"data: %s, length: %d\n", szData, pcbValue);
-    myassert(pcbValue == 4);
-    myassert(strcmp(szData,"ven")==0);
+    printMessage("data: %s, length: %d", szData, pcbValue);
+    is_num(pcbValue, 4);
+    is_str(szData,"ven", 3);
 
     rc = SQLGetData(hstmt,2,SQL_C_BINARY,bData,4,&pcbValue1);
     mystmt_err(hstmt,rc == SQL_SUCCESS_WITH_INFO,rc);
-    fprintf(stdout,"data: %s, length: %d\n", bData, pcbValue1);
-    myassert(pcbValue1 == 5);
-    myassert(strncmp(bData,"mysq",4)==0);
+    printMessage("data: %s, length: %d", bData, pcbValue1);
+    is_num(pcbValue1, 5);
+    is_str(bData, "mysq", 4);
 
     pcbValue= pcbValue1= 99;
     rc = SQLGetData(hstmt,1,SQL_C_CHAR,szData,5,&pcbValue);
     mystmt(hstmt,rc);
-    fprintf(stdout,"data: %s, length: %d\n", szData, pcbValue);
-    myassert(pcbValue == 4);
-    myassert(strcmp(szData,"venu")==0);
+    printMessage("data: %s, length: %d", szData, pcbValue);
+    is_num(pcbValue, 4);
+    is_str(szData, "venu", 4);
 
     rc = SQLGetData(hstmt,2,SQL_C_BINARY,bData,5,&pcbValue1);
     mystmt(hstmt,rc);
-    fprintf(stdout,"data: %s, length: %d\n", bData, pcbValue1);
-    myassert(pcbValue1 == 5);
-    myassert(strncmp(bData,"mysql",5)==0);
+    printMessage("data: %s, length: %d", bData, pcbValue1);
+    is_num(pcbValue1, 5);
+    is_str(bData, "mysql", 5);
 
     szData[0]= 'z';
     rc = SQLGetData(hstmt,3,SQL_C_CHAR,szData,0,&pcbValue);
     mystmt_err(hstmt,rc == SQL_SUCCESS_WITH_INFO,rc);
-    fprintf(stdout,"data: %s, length: %d\n", szData, pcbValue);
+    printMessage("data: %s, length: %d", szData, pcbValue);
     myassert(pcbValue == 5 || pcbValue == 10);
     myassert(szData[0] == 'z');
 
@@ -763,20 +738,20 @@
     szData[0]=szData[1]='z';
     rc = SQLGetData(hstmt,3,SQL_C_CHAR,szData,1,&pcbValue);
     mystmt_err(hstmt,rc == SQL_SUCCESS_WITH_INFO,rc);
-    fprintf(stdout,"data: %s, length: %d\n", szData, pcbValue);
+    printMessage("data: %s, length: %d", szData, pcbValue);
     myassert(pcbValue == 10);
     myassert(szData[0] == 'm');
     myassert(szData[1] == 'z');
 
     rc = SQLGetData(hstmt,3,SQL_C_CHAR,szData,4,&pcbValue);
     mystmt_err(hstmt,rc == SQL_SUCCESS_WITH_INFO,rc);
-    fprintf(stdout,"data: %s, length: %d\n", szData, pcbValue);
+    printMessage("data: %s, length: %d", szData, pcbValue);
     myassert(pcbValue == 10);
     myassert(strncmp(szData,"mont",4) == 0);
 
     rc = SQLGetData(hstmt,3,SQL_C_CHAR,szData,5,&pcbValue);
     mystmt(hstmt,rc);
-    fprintf(stdout,"data: %s, length: %d\n", szData, pcbValue);
+    printMessage("data: %s, length: %d", szData, pcbValue);
     myassert(pcbValue == 10);
     myassert(strncmp(szData,"monty",5) == 0);
 #endif
@@ -939,8 +914,7 @@
     rc = SQLFreeStmt(hstmt,SQL_CLOSE);
     mystmt(hstmt,rc);
 
-    rc = SQLSetCursorName(hstmt,"venu",SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_stmt(hstmt, SQLSetCursorName(hstmt, (SQLCHAR *)"venu", SQL_NTS));
 
     rc = tmysql_exec(hstmt,"select * from t_empty_str_bug");
     mystmt(hstmt,rc);
@@ -958,8 +932,10 @@
     myassert(rc == SQL_NO_DATA_FOUND);
 
     id= 10;
-    strcpy(name,"MySQL AB");name_len= SQL_NTS;
-    strcpy(desc,"");desc_len= SQL_COLUMN_IGNORE;
+    strcpy((char *)name,"MySQL AB");
+    name_len= SQL_NTS;
+    strcpy((char *)desc,"");
+    desc_len= SQL_COLUMN_IGNORE;
 
     rc = SQLSetPos(hstmt,1,SQL_ADD,SQL_LOCK_NO_CHANGE);
     mystmt(hstmt,rc);
@@ -967,7 +943,7 @@
     rc = SQLRowCount(hstmt,&name_len);
     mystmt(hstmt,rc);
 
-    fprintf(stdout," rows affected:%d\n",name_len);
+    printMessage("rows affected: %d",name_len);
     myassert(name_len == 1);
 
     rc = SQLFreeStmt(hstmt,SQL_UNBIND);
@@ -1027,8 +1003,7 @@
     rc = SQLFreeStmt(hstmt,SQL_CLOSE);
     mystmt(hstmt,rc);
 
-    rc = SQLExecDirect(hstmt,"insert into t_desccol values(10,'venu','mysql')",SQL_NTS);
-    mystmt(hstmt,rc);
+    ok_sql(hstmt,"insert into t_desccol values(10,'venu','mysql')");
 
     rc = SQLFreeStmt(hstmt,SQL_CLOSE);
     mystmt(hstmt,rc);
@@ -1039,17 +1014,17 @@
     rc = tmysql_exec(hstmt,"select * from t_desccol");
     mystmt(hstmt,rc);
 
-    rc = SQLDescribeCol(hstmt,1,(char
*)colname,20,&collen,&datatype,&colsize,&decptr,&nullable);
+    rc =
SQLDescribeCol(hstmt,1,colname,20,&collen,&datatype,&colsize,&decptr,&nullable);
     mystmt(hstmt,rc);
-    printMessage("1:
%s,%d,%d,%d,%d,%d\n",colname,collen,datatype,colsize,decptr,nullable);;
+    printMessage("1:
%s,%d,%d,%d,%d,%d",colname,collen,datatype,colsize,decptr,nullable);;
 
-    rc = SQLDescribeCol(hstmt,2,(char
*)colname,20,&collen,&datatype,&colsize,&decptr,&nullable);
+    rc =
SQLDescribeCol(hstmt,2,colname,20,&collen,&datatype,&colsize,&decptr,&nullable);
     mystmt(hstmt,rc);
-    printMessage("2:
%s,%d,%d,%d,%d,%d\n",colname,collen,datatype,colsize,decptr,nullable);;
+    printMessage("2:
%s,%d,%d,%d,%d,%d",colname,collen,datatype,colsize,decptr,nullable);;
 
-    rc = SQLDescribeCol(hstmt,3,(char
*)colname,20,&collen,&datatype,&colsize,&decptr,&nullable);
+    rc =
SQLDescribeCol(hstmt,3,colname,20,&collen,&datatype,&colsize,&decptr,&nullable);
     mystmt(hstmt,rc);
-    printMessage("3:
%s,%d,%d,%d,%d,%d\n",colname,collen,datatype,colsize,decptr,nullable);;
+    printMessage("3:
%s,%d,%d,%d,%d,%d",colname,collen,datatype,colsize,decptr,nullable);;
 
     rc = SQLFreeStmt(hstmt,SQL_UNBIND);
     mystmt(hstmt,rc);
@@ -1063,7 +1038,7 @@
 }
 
 
-int desccol(SQLHSTMT hstmt, SQLCHAR *cname, SQLSMALLINT clen,
+int desccol(SQLHSTMT hstmt, char *cname, SQLSMALLINT clen,
             SQLSMALLINT sqltype, SQLULEN size,
             SQLSMALLINT scale, SQLSMALLINT isNull)
 {
@@ -1078,8 +1053,8 @@
 
     SQLFreeStmt(hstmt,SQL_CLOSE);
 
-    sprintf(select,"select %s from t_desccolext",cname);
-    printMessage("\n%s",select);
+    sprintf((char *)select,"select %s from t_desccolext",cname);
+    printMessage("%s",select);
 
     rc = SQLExecDirect(hstmt,select,SQL_NTS);
     mystmt(hstmt,rc);
@@ -1088,10 +1063,10 @@
                          &lsqltype,&lsize,&lscale,&lisNull);
     mystmt(hstmt,rc);
 
-    printMessage("\n name: %s (%d)",lcname,lclen);
-    printMessage("\n sqltype: %d, size: %d, scale: %d, null:
%d\n",lsqltype,lsize,lscale,lisNull);
+    printMessage("name: %s (%d)",lcname,lclen);
+    printMessage(" sqltype: %d, size: %d, scale: %d, null:
%d\n",lsqltype,lsize,lscale,lisNull);
 
-    myassert(strcmp(lcname,cname)==0);
+    is_str(lcname, cname, clen);
     myassert(lclen == clen);
     myassert(lsqltype == sqltype);
     myassert(lsize == size);
@@ -1107,14 +1082,10 @@
 DECLARE_TEST(t_desccolext)
 {
     SQLRETURN rc;
-    SQLCHAR     *sql;
 
   ok_sql(hstmt, "DROP TABLE IF EXISTS t_desccolext");
 
-    rc = SQLTransact(NULL,hdbc,SQL_COMMIT);
-    mycon(hdbc,rc);
-
-    sql= "create table t_desccolext\
+  ok_sql(hstmt, "create table t_desccolext\
       ( t1 tinyint,\
         t2 tinyint(10),\
         t3 tinyint unsigned,\
@@ -1169,14 +1140,8 @@
         txt3 mediumtext,\
         txt4 longtext,\
         en enum('v1','v2'),\
-        st set('1','2','3'))";
+        st set('1','2','3'))");
 
-    rc = tmysql_exec(hstmt,sql);
-    mystmt(hstmt,rc);
-
-    rc = SQLTransact(NULL,hdbc,SQL_COMMIT);
-    mycon(hdbc,rc);
-
     rc = SQLFreeStmt(hstmt,SQL_CLOSE);
     mystmt(hstmt,rc);
 
@@ -1225,7 +1190,7 @@
     SQLRETURN rc;
 
   ok_sql(hstmt, "DROP TABLE IF EXISTS t_desccol1");
-    rc = SQLExecDirect(hstmt,"create table t_desccol1\
+    rc = SQLExecDirect(hstmt,(SQLCHAR *)"create table t_desccol1\
                  ( record decimal(8,0),\
                    title varchar(250),\
                    num1 float,\
@@ -1258,9 +1223,9 @@
 
         rc = SQLNumResultCols(hstmt,(SQLSMALLINT *)&pccol);
         mystmt(hstmt,rc);
-        printMessage("total columns:%d\n",pccol);
+        printMessage("total columns:%d",pccol);
 
-        printMessage("Name   nlen type    size decs null\n");
+        printMessage("Name   nlen type    size decs null");
         for ( index = 1; index <= pccol; index++)
         {
             rc = SQLDescribeCol(hstmt, index, ColumnName,
@@ -1270,7 +1235,7 @@
                                 &ColumnDecimals, &ColumnNullable);
             mystmt(hstmt,rc);
 
-            printMessage("%-6s %4d %4d %7ld %4d %4d\n", ColumnName,
+            printMessage("%-6s %4d %4d %7ld %4d %4d", ColumnName,
                          ColumnNameSize, ColumnSQLDataType, ColumnSize,
                          ColumnDecimals, ColumnNullable);
         }
@@ -1380,7 +1345,8 @@
     rc = tmysql_exec(hstmt,"create table t_exfetch(col1 int)");
     mystmt(hstmt,rc);
 
-    rc = SQLPrepare(hstmt,"insert into t_exfetch values(?)",SQL_NTS);
+    rc = SQLPrepare(hstmt, (SQLCHAR *)"insert into t_exfetch values (?)",
+                    SQL_NTS);
     mystmt(hstmt,rc);
 
     rc = SQLBindParameter(hstmt,1,SQL_PARAM_INPUT, SQL_C_ULONG,
@@ -1399,7 +1365,7 @@
     rc = SQLTransact(NULL,hdbc,SQL_COMMIT);
     mycon(hdbc,rc);
 
-    rc = SQLExecDirect(hstmt,"select * from t_exfetch",SQL_NTS);
+    rc = SQLExecDirect(hstmt, (SQLCHAR *)"select * from t_exfetch",SQL_NTS);
     mystmt(hstmt,rc);
 
     rc = SQLBindCol(hstmt,1,SQL_C_LONG,&i,0,NULL);
@@ -1505,11 +1471,9 @@
     SQLINTEGER nData= 555;
     SQLCHAR szData[255] = "setpos-update";
 
-    rc = SQLAllocStmt(hdbc,&hstmt1);
-    mycon(hdbc,rc);
+  ok_con(hdbc, SQLAllocStmt(hdbc, &hstmt1));
 
-    rc = SQLSetCursorName(hstmt,"venu_cur",SQL_NTS);
-    mystmt(hstmt,rc);
+  ok_stmt(hstmt, SQLSetCursorName(hstmt, (SQLCHAR *)"venu_cur", SQL_NTS));
 
   ok_sql(hstmt, "DROP TABLE IF EXISTS tmysql_rowstatus");
     rc = tmysql_exec(hstmt,"create table tmysql_rowstatus(col1 int , col2 varchar(30))");
@@ -1561,8 +1525,9 @@
     rc = SQLSetPos(hstmt,1,SQL_POSITION,SQL_LOCK_NO_CHANGE);
     mystmt(hstmt,rc);
 
-    rc = SQLExecDirect(hstmt1,"UPDATE tmysql_rowstatus SET col1= 999, col2 = 'pos-update'
WHERE CURRENT OF venu_cur",SQL_NTS);
-    mystmt(hstmt1,rc);
+    ok_sql(hstmt1,
+           "UPDATE tmysql_rowstatus SET col1 = 999,"
+           "col2 = 'pos-update' WHERE CURRENT OF venu_cur");
 
     rc = SQLExtendedFetch(hstmt,SQL_FETCH_LAST,1,NULL,NULL);
     mystmt(hstmt,rc);
@@ -1570,7 +1535,7 @@
     rc = SQLSetPos(hstmt,1,SQL_DELETE,SQL_LOCK_NO_CHANGE);
     mystmt(hstmt,rc);
 
-    printMessage("\nrgfRowStatus[0]:%d",rgfRowStatus[0]);
+    printMessage("rgfRowStatus[0]:%d",rgfRowStatus[0]);
 
     SQLFreeStmt(hstmt,SQL_CLOSE);
 
@@ -1802,7 +1767,7 @@
 DECLARE_TEST(t_bug30958)
 {
   SQLCHAR outbuf[20]= "bug";
-  SQLINTEGER outlen;
+  SQLLEN outlen;
   SQLINTEGER outmax= 0;
 
   ok_sql(hstmt, "drop table if exists bug30958");
@@ -1813,8 +1778,8 @@
   ok_stmt(hstmt, SQLFetch(hstmt));
 
   /*
-     check first that we get truncation, with zero bytes
-     available in out buffer, outbuffer should be untouched
+   check first that we get truncation, with zero bytes
+   available in out buffer, outbuffer should be untouched
   */
   outlen= 99;
   expect_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_CHAR, outbuf, outmax,
@@ -1823,7 +1788,7 @@
   is_num(outlen, 0);
   is(check_sqlstate(hstmt, "01004") == OK);
 
-  /* exact the same result, and not SQL_NO_DATA */
+  /* expect the same result, and not SQL_NO_DATA */
   outlen= 99;
   expect_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_CHAR, outbuf, outmax,
                                 &outlen), SQL_SUCCESS_WITH_INFO);
@@ -1845,19 +1810,140 @@
   expect_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_CHAR, outbuf, outmax,
                                 &outlen), SQL_NO_DATA);
 
+  ok_stmt(hstmt, SQLFreeStmt(hstmt, SQL_CLOSE));
+
   ok_sql(hstmt, "drop table if exists bug30958");
+
+  return OK;
 }
 
 
+/**
+ A variant of the above test, with charset != ansi charset
+*/
+DECLARE_TEST(t_bug30958_ansi)
+{
+  SQLCHAR outbuf[20]= "bug";
+  SQLLEN outlen;
+  SQLINTEGER outmax= 0;
+
+  ok_sql(hstmt, "drop table if exists bug30958");
+  ok_sql(hstmt, "CREATE TABLE bug30958 (tt_textfield TEXT CHARACTER SET cp1251 NOT
NULL)");
+  ok_sql(hstmt, "INSERT INTO bug30958 (tt_textfield) VALUES ('')");
+
+  ok_sql(hstmt, "select tt_textfield from bug30958");
+  ok_stmt(hstmt, SQLFetch(hstmt));
+
+  /*
+   check first that we get truncation, with zero bytes
+   available in out buffer, outbuffer should be untouched
+  */
+  outlen= 99;
+  expect_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_CHAR, outbuf, outmax,
+                                &outlen), SQL_SUCCESS_WITH_INFO);
+  is_str(outbuf, "bug", 3);
+  is_num(outlen, 0);
+  is(check_sqlstate(hstmt, "01004") == OK);
+
+  /* expect the same result, and not SQL_NO_DATA */
+  outlen= 99;
+  expect_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_CHAR, outbuf, outmax,
+                                &outlen), SQL_SUCCESS_WITH_INFO);
+  is_str(outbuf, "bug", 3);
+  is_num(outlen, 0);
+  is(check_sqlstate(hstmt, "01004") == OK);
+
+  /* now provide a space to read the data */
+  outmax= 1;
+  ok_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_CHAR, outbuf, outmax, &outlen));
+  is_num(outbuf[0], 0);
+  is_num(outlen, 0);
+
+  /* only now is it unavailable (test with empty and non-empty out buffer) */
+  outmax= 0;
+  expect_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_CHAR, outbuf, outmax,
+                                &outlen), SQL_NO_DATA);
+  outmax= 1;
+  expect_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_CHAR, outbuf, outmax,
+                                &outlen), SQL_NO_DATA);
+
+  ok_stmt(hstmt, SQLFreeStmt(hstmt, SQL_CLOSE));
+
+  ok_sql(hstmt, "drop table if exists bug30958");
+
+  return OK;
+}
+
+
+/**
+ A variant of the above tests using SQLWVARCHAR
+*/
+DECLARE_TEST(t_bug30958_wchar)
+{
+  SQLCHAR outbuf[20]= "bug";
+  SQLLEN outlen;
+  SQLINTEGER outmax= 0;
+
+  ok_sql(hstmt, "drop table if exists bug30958");
+  ok_sql(hstmt, "CREATE TABLE bug30958 (tt_textfield TEXT NOT NULL)");
+  ok_sql(hstmt, "INSERT INTO bug30958 (tt_textfield) VALUES ('')");
+
+  ok_sql(hstmt, "select tt_textfield from bug30958");
+  ok_stmt(hstmt, SQLFetch(hstmt));
+
+  /*
+   check first that we get truncation, with zero bytes
+   available in out buffer, outbuffer should be untouched
+  */
+  outlen= 99;
+  expect_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_WCHAR, outbuf, outmax,
+                                &outlen), SQL_SUCCESS_WITH_INFO);
+  is_str(outbuf, "bug", 3);
+  is_num(outlen, 0);
+  is(check_sqlstate(hstmt, "01004") == OK);
+
+  /* expect the same result, and not SQL_NO_DATA */
+  outlen= 99;
+  expect_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_WCHAR, outbuf, outmax,
+                                &outlen), SQL_SUCCESS_WITH_INFO);
+  is_str(outbuf, "bug", 3);
+  is_num(outlen, 0);
+  is(check_sqlstate(hstmt, "01004") == OK);
+
+  /* now provide a space to read the data */
+  outmax= 2;
+  ok_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_WCHAR, outbuf, outmax, &outlen));
+  is_num(outbuf[0], 0);
+  is_num(outlen, 0);
+
+  /* only now is it unavailable (test with empty and non-empty out buffer) */
+  outmax= 0;
+  expect_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_WCHAR, outbuf, outmax,
+                                &outlen), SQL_NO_DATA);
+  outmax= 1;
+  expect_stmt(hstmt, SQLGetData(hstmt, 1, SQL_C_WCHAR, outbuf, outmax,
+                                &outlen), SQL_NO_DATA);
+
+  ok_stmt(hstmt, SQLFreeStmt(hstmt, SQL_CLOSE));
+
+  ok_sql(hstmt, "drop table if exists bug30958");
+
+  return OK;
+}
+
+
+/**
+ Bug #31246: Opening rowset with extra fields leads to incorrect SQL INSERT
+*/
 DECLARE_TEST(t_bug31246)
 {
   SQLSMALLINT ncol;
-  SQLCHAR     *buf = "Key1";
+  SQLCHAR     *buf= (SQLCHAR *)"Key1";
   SQLCHAR     field1[20];
   SQLINTEGER  field2;
   SQLCHAR     field3[20];
   SQLRETURN   rc;
-  
+
   ok_sql(hstmt, "DROP TABLE IF EXISTS t_bug31246");
   ok_sql(hstmt, "CREATE TABLE t_bug31246 ("
                 "field1 VARCHAR(50) NOT NULL PRIMARY KEY, "
@@ -1870,7 +1956,8 @@
   is_num(ncol, 3);
 
   /* Bind only one column instead of three ones */
-  ok_stmt(hstmt, SQLBindCol(hstmt, 1, SQL_C_CHAR, buf, strlen(buf), NULL));
+  ok_stmt(hstmt, SQLBindCol(hstmt, 1, SQL_C_CHAR,
+                            buf, strlen((char *)buf), NULL));
 
   /* Expect SQL_NO_DATA_FOUND result from the empty table */
   rc= SQLExtendedFetch(hstmt, SQL_FETCH_NEXT, 1, NULL, NULL);
@@ -1884,14 +1971,14 @@
 
   /* Check whether the row was inserted with the default values*/
   ok_sql(hstmt, "SELECT * FROM t_bug31246 WHERE field1=\"Key1\"");
-  ok_stmt(hstmt, SQLBindCol(hstmt, 1, SQL_C_CHAR, field1, 
+  ok_stmt(hstmt, SQLBindCol(hstmt, 1, SQL_C_CHAR, field1,
           sizeof(field1), NULL));
-  ok_stmt(hstmt, SQLBindCol(hstmt, 2, SQL_C_LONG, &field2, 
+  ok_stmt(hstmt, SQLBindCol(hstmt, 2, SQL_C_LONG, &field2,
           sizeof(SQLINTEGER), NULL));
-  ok_stmt(hstmt, SQLBindCol(hstmt, 3, SQL_C_CHAR, field3, 
+  ok_stmt(hstmt, SQLBindCol(hstmt, 3, SQL_C_CHAR, field3,
           sizeof(field3), NULL));
   ok_stmt(hstmt, SQLFetch(hstmt));
-  
+
   /* Clean-up */
   ok_stmt(hstmt, SQLFreeStmt(hstmt, SQL_CLOSE));
   ok_sql(hstmt, "DROP TABLE t_bug31246");
@@ -1899,6 +1986,115 @@
 }
 
 
+/**
+  Bug #13776: Invalid string or buffer length error
+*/
+DECLARE_TEST(t_bug13776)
+{
+  SQLHENV  henv1;
+  SQLHDBC  hdbc1;
+  SQLHSTMT hstmt1;
+
+  SQLULEN     pcColSz;
+  SQLCHAR     szColName[MAX_NAME_LEN];
+  SQLSMALLINT pfSqlType, pcbScale, pfNullable;
+
+  SET_DSN_OPTION(1 << 27);
+
+  /* Establish the new connection */
+  alloc_basic_handles(&henv1, &hdbc1, &hstmt1);
+
+  ok_sql(hstmt1, "DROP TABLE IF EXISTS t_bug13776");
+  ok_sql(hstmt1, "CREATE TABLE t_bug13776(ltext LONGTEXT)");
+  ok_sql(hstmt1, "INSERT INTO t_bug13776 VALUES ('long text test')");
+  ok_sql(hstmt1, "SELECT * FROM t_bug13776");
+  ok_stmt(hstmt1, SQLDescribeCol(hstmt1, 1, szColName, MAX_NAME_LEN+1, NULL,
+                                 &pfSqlType, &pcColSz, &pcbScale,
&pfNullable));
+
+  /* Size of LONGTEXT should have been capped to 1 << 31. */
+  is_num(pcColSz, 2147483647L);
+
+  ok_stmt(hstmt1, SQLFreeStmt(hstmt1, SQL_CLOSE));
+
+  ok_sql(hstmt1, "DROP TABLE IF EXISTS t_bug13776");
+
+  free_basic_handles(&henv1, &hdbc1, &hstmt1);
+
+  SET_DSN_OPTION(0);
+
+  return OK;
+}
+
+
+/**
+  Test that FLAG_COLUMN_SIZE_S32 is automatically enabled when ADO library
+  is loaded.
+*/
+DECLARE_TEST(t_bug13776_auto)
+{
+#ifdef WIN32
+  SQLHENV  henv1;
+  SQLHDBC  hdbc1;
+  SQLHSTMT hstmt1;
+  HMODULE  ado_dll;
+
+  SQLULEN     pcColSz;
+  SQLCHAR     szColName[MAX_NAME_LEN];
+  SQLSMALLINT pfSqlType, pcbScale, pfNullable;
+  SQLCHAR     *env_path= NULL;
+  SQLCHAR     szFileToLoad[255];
+
+  /** @todo get the full path to the library using getenv */
+  env_path= getenv("CommonProgramFiles(x86)");
+  if (!env_path)
+    env_path= getenv("CommonProgramFiles");
+
+  if (!env_path)
+  {
+    printf("# No path for CommonProgramFiles in %s on line %d\n",
+           __FILE__, __LINE__);
+    return FAIL;
+  }
+
+  sprintf(szFileToLoad, "%s\\System\\ado\\msado15.dll", env_path);
+
+  ado_dll= LoadLibrary(szFileToLoad);
+  if (!ado_dll)
+  {
+    printf("# Could not load %s in %s on line %d\n",
+           szFileToLoad, __FILE__, __LINE__);
+    return FAIL;
+  }
+
+  /* Establish the new connection */
+  alloc_basic_handles(&henv1, &hdbc1, &hstmt1);
+
+  ok_sql(hstmt1, "DROP TABLE IF EXISTS t_bug13776");
+  ok_sql(hstmt1, "CREATE TABLE t_bug13776(ltext LONGTEXT)");
+  ok_sql(hstmt1, "INSERT INTO t_bug13776 VALUES ('long text test')");
+  ok_sql(hstmt1, "SELECT * FROM t_bug13776");
+  ok_stmt(hstmt1, SQLDescribeCol(hstmt1, 1, szColName, MAX_NAME_LEN+1, NULL,
+                                 &pfSqlType, &pcColSz, &pcbScale,
&pfNullable));
+
+  /*
+    IF adodb15.dll is loaded SQLDescribeCol should return the length of
+    LONGTEXT columns as 2G instead of 4G
+  */
+  is_num(pcColSz, 2147483647L);
+
+  ok_stmt(hstmt1, SQLFreeStmt(hstmt1, SQL_CLOSE));
+
+  ok_sql(hstmt1, "DROP TABLE IF EXISTS t_bug13776");
+
+  free_basic_handles(&henv1, &hdbc1, &hstmt1);
+
+  FreeLibrary(ado_dll);
+#endif
+
+  return OK;
+}
+
+
 BEGIN_TESTS
   ADD_TEST(my_resultset)
   ADD_TEST(t_convert_type)
@@ -1922,8 +2118,12 @@
   ADD_TEST(bug6157)
   ADD_TEST(t_binary_collation)
   ADD_TODO(t_bug29239)
-  ADD_TODO(t_bug30958)
-  ADD_TODO(t_bug31246)
+  ADD_TEST(t_bug30958)
+  ADD_TEST(t_bug30958_ansi)
+  ADD_TEST(t_bug30958_wchar)
+  ADD_TEST(t_bug31246)
+  ADD_TEST(t_bug13776)
+  ADD_TEST(t_bug13776_auto)
 END_TESTS
 
 

Modified: branches/guffert/test/my_scroll.c
===================================================================
--- branches/guffert/test/my_scroll.c	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/test/my_scroll.c	2007-11-14 19:01:01 UTC (rev 861)
@@ -25,8 +25,7 @@
 /* Testing basic scrolling feature */
 DECLARE_TEST(t_scroll)
 {
-    SQLRETURN rc;
-    SQLUINTEGER i;
+  SQLUINTEGER i;
 
   ok_sql(hstmt, "DROP TABLE IF EXISTS t_scroll");
   ok_sql(hstmt, "CREATE TABLE t_scroll (col1 INT)");
@@ -122,8 +121,8 @@
 {
     SQLRETURN rc;
     SQLINTEGER iarray[15];
-    SQLLEN   nrows;
-    SQLUINTEGER i,index;
+    SQLLEN   nrows, index;
+    SQLUINTEGER i;
     char name[21];
 
     ok_stmt(hstmt, SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE,
@@ -270,7 +269,7 @@
     SQLRETURN rc;
     SQLLEN nrows;
     SQLUINTEGER i;
-    const int max_rows=10;
+    const SQLUINTEGER max_rows=10;
 
     ok_stmt(hstmt, SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE,
                                   (SQLPOINTER)SQL_CURSOR_STATIC, 0));
@@ -482,7 +481,7 @@
     SQLUINTEGER i;
     SQLLEN nrows;
     SQLINTEGER iarray[15];
-    const int max_rows=10;
+    const SQLUINTEGER max_rows=10;
 
     ok_stmt(hstmt, SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE,
                                   (SQLPOINTER)SQL_CURSOR_STATIC, 0));
@@ -795,7 +794,7 @@
     SQLRETURN rc;
     SQLLEN nrows;
     SQLUINTEGER i;
-    const int max_rows=10;
+    const SQLUINTEGER max_rows=10;
 
     ok_stmt(hstmt, SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE,
                                   (SQLPOINTER)SQL_CURSOR_STATIC, 0));
@@ -981,7 +980,7 @@
     SQLRETURN rc;
     SQLLEN nrows;
     SQLINTEGER iarray[15];
-    const int max_rows=10;
+    const SQLUINTEGER max_rows=10;
     SQLUINTEGER i;
 
     ok_stmt(hstmt, SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE,

Modified: branches/guffert/test/my_types.c
===================================================================
--- branches/guffert/test/my_types.c	2007-11-14 09:48:01 UTC (rev 860)
+++ branches/guffert/test/my_types.c	2007-11-14 19:01:01 UTC (rev 861)
@@ -690,6 +690,37 @@
 }
 
 
+/**
+ Bug #32171: ODBC Driver incorrectly parses large Unsigned Integers
+*/
+DECLARE_TEST(t_bug32171)
+{
+  SQLUINTEGER in= 4255080020, out;
+  SQLCHAR buff[128];
+
+  ok_sql(hstmt, "DROP TABLE IF EXISTS t_bug32171");
+  ok_sql(hstmt, "CREATE TABLE t_bug32171 (a INT UNSIGNED)");
+
+  sprintf((char *)buff, "INSERT INTO t_bug32171 VALUES ('%lu')", in);
+  ok_stmt(hstmt, SQLExecDirect(hstmt, buff, SQL_NTS));
+
+  ok_sql(hstmt, "SELECT * FROM t_bug32171");
+
+  ok_stmt(hstmt, SQLBindCol(hstmt, 1, SQL_C_ULONG, &out, 0, NULL));
+  ok_stmt(hstmt, SQLFetch(hstmt));
+
+  is_num(out, in);
+
+  expect_stmt(hstmt, SQLFetch(hstmt), SQL_NO_DATA);
+
+  ok_stmt(hstmt, SQLFreeStmt(hstmt, SQL_CLOSE));
+
+  ok_sql(hstmt, "DROP TABLE IF EXISTS t_bug32171");
+
+  return OK;
+}
+
+
 /** Test passing an SQL_C_CHAR to a SQL_WCHAR field. */
 DECLARE_TEST(sqlwchar)
 {
@@ -771,6 +802,7 @@
   ADD_TEST(binary_suffix)
   ADD_TEST(float_scale)
   ADD_TEST(bit)
+  ADD_TEST(t_bug32171)
   ADD_TEST(sqlwchar)
 END_TESTS
 

Thread
Connector/ODBC 3.51 commit: r861 - in branches/guffert: . driver setup testjwinstead14 Nov