       // A dictionary that maps from column name (PyString) to index into the result columns (PyInteger).  This is
       // constructued during an execute and shared with each row (reference counted) to implement accessing results by
       // column name.
-Only in pyodbc-2.1.12v/src: frag.h
-diff -c -r pyodbc-2.1.12/src/getdata.cpp pyodbc-2.1.12v/src/getdata.cpp
+diff -c -N -r pyodbc-2.1.12/src/frag.h pyodbc-2.1.12v/src/frag.h
+*** pyodbc-2.1.12/src/frag.h	1969-12-31 19:00:00.000000000 -0500
+--- pyodbc-2.1.12v/src/frag.h	2012-05-12 10:47:07.000000000 -0400
+***************
+*** 0 ****
+--- 1,107 ----
++ # define VIRTUOSO_DV_ANY  242
++ # define VIRTUOSO_DV_ARRAY_OF_DOUBLE  195
++ # define VIRTUOSO_DV_ARRAY_OF_FLOAT  202
++ # define VIRTUOSO_DV_ARRAY_OF_LONG  209
++ # define VIRTUOSO_DV_ARRAY_OF_LONG_PACKED  194
++ # define VIRTUOSO_DV_ARRAY_OF_POINTER  193
++ # define VIRTUOSO_DV_ARRAY_OF_XQVAL  212
++ # define VIRTUOSO_DV_ASYNC_QUEUE  245
++ # define VIRTUOSO_DV_BIN  222
++ # define VIRTUOSO_DV_BLOB  125
++ # define VIRTUOSO_DV_BLOB_BIN  131
++ # define VIRTUOSO_DV_BLOB_HANDLE  126
++ # define VIRTUOSO_DV_BLOB_WIDE  132
++ # define VIRTUOSO_DV_BLOB_WIDE_HANDLE  133
++ # define VIRTUOSO_DV_BLOB_XPER  134
++ # define VIRTUOSO_DV_BLOB_XPER_HANDLE  135
++ # define VIRTUOSO_DV_BOX_FLAGS  207
++ # define VIRTUOSO_DV_C_INT  201
++ # define VIRTUOSO_DV_C_SHORT  184
++ # define VIRTUOSO_DV_C_STRING  183
++ # define VIRTUOSO_DV_CHARACTER  192
++ # define VIRTUOSO_DV_CLOP  140
++ # define VIRTUOSO_DV_CLRG  139
++ # define VIRTUOSO_DV_COMP_OFFSET  136
++ # define VIRTUOSO_DV_COMPOSITE  255
++ # define VIRTUOSO_DV_CONNECTION  241
++ # define VIRTUOSO_DV_CUSTOM  203
++ # define VIRTUOSO_DV_DAE  221
++ # define VIRTUOSO_DV_DATE  129
++ # define VIRTUOSO_DV_DATETIME  211
++ # define VIRTUOSO_DV_DB_NULL  204
++ # define VIRTUOSO_DV_DELETED  199
++ # define VIRTUOSO_DV_DICT_HASHTABLE  213
++ # define VIRTUOSO_DV_DICT_ITERATOR  214
++ # define VIRTUOSO_DV_DOUBLE_FLOAT  191
++ # define VIRTUOSO_DV_DOUBLE_PREC  16
++ # define VIRTUOSO_DV_EXEC_CURSOR  224
++ # define VIRTUOSO_DV_FD  250
++ # define VIRTUOSO_DV_FIXED_STRING  240
++ # define VIRTUOSO_DV_FLOAT_PREC  14
++ # define VIRTUOSO_DV_GEO  238
++ # define VIRTUOSO_DV_IGNORE  220
++ # define VIRTUOSO_DV_INDEX_TREE  137
++ # define VIRTUOSO_DV_INT64  247
++ # define VIRTUOSO_DV_IRI_ID  243
++ # define VIRTUOSO_DV_IRI_ID  243
++ # define VIRTUOSO_DV_IRI_ID_8  244
++ # define VIRTUOSO_DV_ITC  138
++ # define VIRTUOSO_DV_LIST_OF_POINTER  196
++ # define VIRTUOSO_DV_LONG_BIN  223
++ # define VIRTUOSO_DV_LONG_CONT_STRING  187
++ # define VIRTUOSO_DV_LONG_INT  189
++ # define VIRTUOSO_DV_LONG_INT_PREC  10
++ # define VIRTUOSO_DV_LONG_PACKED  DV_LONG_INT
++ # define VIRTUOSO_DV_LONG_STRING  182
++ # define VIRTUOSO_DV_LONG_WIDE  226
++ # define VIRTUOSO_DV_MEM_WRAPPER  218
++ # define VIRTUOSO_DV_MEMBER_POINTER  200
++ # define VIRTUOSO_DV_MULTIPLE_VALUES  2
++ # define VIRTUOSO_DV_NON_BOX  101
++ # define VIRTUOSO_DV_NULL  180
++ # define VIRTUOSO_DV_NUMERIC  219
++ # define VIRTUOSO_DV_OBJECT  254
++ # define VIRTUOSO_DV_OBJECT_AND_CLASS  197
++ # define VIRTUOSO_DV_OBJECT_REFERENCE  198
++ # define VIRTUOSO_DV_OWNER  130
++ # define VIRTUOSO_DV_PL_CURSOR  234
++ # define VIRTUOSO_DV_PLACEHOLDER  248
++ # define VIRTUOSO_DV_RDF  246
++ # define VIRTUOSO_DV_RDF_ID  248
++ # define VIRTUOSO_DV_RDF_ID_8  249
++ # define VIRTUOSO_DV_REFERENCE  206
++ # define VIRTUOSO_DV_REFERENCE  206
++ # define VIRTUOSO_DV_REXEC_CURSOR  240
++ # define VIRTUOSO_DV_RI_ITERATOR  229
++ # define VIRTUOSO_DV_ROW_EXTENSION  239
++ # define VIRTUOSO_DV_SEND_NO_ANSWER  1
++ # define VIRTUOSO_DV_SHORT_CONT_STRING  186
++ # define VIRTUOSO_DV_SHORT_INT  188
++ # define VIRTUOSO_DV_SHORT_REF  205
++ # define VIRTUOSO_DV_SHORT_STRING  182
++ # define VIRTUOSO_DV_SHORT_STRING_SERIAL  181
++ # define VIRTUOSO_DV_SINGLE_FLOAT  190
++ # define VIRTUOSO_DV_STRING  182
++ # define VIRTUOSO_DV_STRING_PREC  24
++ # define VIRTUOSO_DV_STRING_SESSION  185
++ # define VIRTUOSO_DV_SYMBOL  127
++ # define VIRTUOSO_DV_SYMBOL  127
++ # define VIRTUOSO_DV_SYMBOL  127
++ # define VIRTUOSO_DV_TEXT_BATCH  228
++ # define VIRTUOSO_DV_TEXT_SEARCH  227
++ # define VIRTUOSO_DV_TIME  210
++ # define VIRTUOSO_DV_TIMESTAMP  128
++ # define VIRTUOSO_DV_TIMESTAMP_PREC  26
++ # define VIRTUOSO_DV_TINY_INT  241
++ # define VIRTUOSO_DV_UNAME  217
++ # define VIRTUOSO_DV_WIDE  225
++ # define VIRTUOSO_DV_XML_DTD  236
++ # define VIRTUOSO_DV_XML_ENTITY  230
++ # define VIRTUOSO_DV_XML_MARKUP  233
++ # define VIRTUOSO_DV_XML_PARSER  235
++ # define VIRTUOSO_DV_XML_SCHEMA  237
++ # define VIRTUOSO_DV_XPATH_QUERY  232
++ # define VIRTUOSO_DV_XPATH_QUERY  232
++ # define VIRTUOSO_DV_XQI  231
++ # define VIRTUOSO_DV_XTREE_HEAD  215
++ # define VIRTUOSO_DV_XTREE_NODE  216
+\ No newline at end of file
+diff -c -N -r pyodbc-2.1.12/src/getdata.cpp pyodbc-2.1.12v/src/getdata.cpp
 *** pyodbc-2.1.12/src/getdata.cpp	2011-10-17 08:45:30.000000000 -0400
 --- pyodbc-2.1.12v/src/getdata.cpp	2012-05-14 23:29:31.000000000 -0400
 ***************
 *** 9,14 ****
 --- 9,15 ----
-  #include "errors.h"
-  #include "dbspecific.h"
-  #include "sqlwchar.h"
-+ #include "virtuoso.h"
-  
-  void GetData_init()
-  {
+  #include "errors.h"
+  #include "dbspecific.h"
+  #include "sqlwchar.h"
++ #include "virtuoso.h"
+  
+  void GetData_init()
+  {
 ***************
 *** 214,220 ****
-          // We have allocated our own SQLWCHAR buffer and must now copy it to a Unicode object.
-          PyObject* result = PyUnicode_FromSQLWCHAR((const SQLWCHAR*)buffer, bytesUsed / element_size);
-          if (result == 0)
-!             return false;
-          pyodbc_free(buffer);
-          buffer = 0;
-          return result;
+          // We have allocated our own SQLWCHAR buffer and must now copy it to a Unicode object.
+          PyObject* result = PyUnicode_FromSQLWCHAR((const SQLWCHAR*)buffer, bytesUsed / element_size);
+          if (result == 0)
+!             return false;
+          pyodbc_free(buffer);
+          buffer = 0;
+          return result;
 --- 215,221 ----
-          // We have allocated our own SQLWCHAR buffer and must now copy it to a Unicode object.
-          PyObject* result = PyUnicode_FromSQLWCHAR((const SQLWCHAR*)buffer, bytesUsed / element_size);
-          if (result == 0)
-!             return NULL;
-          pyodbc_free(buffer);
-          buffer = 0;
-          return result;
+          // We have allocated our own SQLWCHAR buffer and must now copy it to a Unicode object.
+          PyObject* result = PyUnicode_FromSQLWCHAR((const SQLWCHAR*)buffer, bytesUsed / element_size);
+          if (result == 0)
+!             return NULL;
+          pyodbc_free(buffer);
+          buffer = 0;
+          return result;
 ***************
 *** 594,599 ****
 --- 595,681 ----
-      return -1;
-  }
-  
-+ static
-+ PyObject *GetDataSPASQL(Cursor *cur, Py_ssize_t column)
-+ {
-+     // Return a tuple of information sufficient to glean the
-+     // real underlying type in case of a Virtuoso SPASQL query
-+     int dvtype, flag;
-+     SQLHANDLE hdesc = SQL_NULL_HANDLE;
-+     SQLRETURN ret;
-+     SQLCHAR lang[0x100], dtype[0x100];
-+     SQLINTEGER len, dv_dt_type = 0;
-+     PyObject *value, *colinfo;
-+ 
-+     memset(lang, 0, sizeof(lang));
-+     memset(dtype, 0, sizeof(dtype));
-+ 
-+     value = GetDataString(cur, column);
-+     if (!value)
-+    return Py_None;
-+ 
-+     // why do the virtuoso extensions number the columns from 1???
-+     column += 1;
-+ 
-+     Py_BEGIN_ALLOW_THREADS
-+    ret = SQLGetStmtAttr(cur->hstmt, SQL_ATTR_IMP_ROW_DESC, &hdesc, SQL_IS_POINTER, NULL);
-+     Py_END_ALLOW_THREADS;
-+     if (!SQL_SUCCEEDED(ret)) {
-+    return Py_None;
-+     }
-+     Py_BEGIN_ALLOW_THREADS
-+    ret = SQLGetDescField(hdesc, column, SQL_DESC_COL_DV_TYPE, &dvtype, SQL_IS_INTEGER, NULL);
-+     Py_END_ALLOW_THREADS;
-+     if (!SQL_SUCCEEDED(ret)) {
-+    return Py_None;
-+     }    
-+     Py_BEGIN_ALLOW_THREADS
-+    ret = SQLGetDescField(hdesc, column, SQL_DESC_COL_BOX_FLAGS, &flag, SQL_IS_INTEGER, NULL);
-+     Py_END_ALLOW_THREADS;
-+     if (!SQL_SUCCEEDED(ret)) {
-+    return Py_None;
-+     }
-+ 
-+     switch (dvtype) {
-+         case VIRTUOSO_DV_RDF:
-+        Py_BEGIN_ALLOW_THREADS
-+        ret = SQLGetDescField(hdesc, column, SQL_DESC_COL_LITERAL_LANG, lang, sizeof(lang), &len);
-+        Py_END_ALLOW_THREADS;
-+        if (!SQL_SUCCEEDED(ret))
-+        return Py_None;
-+        Py_BEGIN_ALLOW_THREADS
-+        ret = SQLGetDescField(hdesc, column, SQL_DESC_COL_LITERAL_TYPE, dtype, sizeof(dtype), &len);
-+        Py_END_ALLOW_THREADS;
-+        if (!SQL_SUCCEEDED(ret))
-+        return Py_None;
-+        break;
-+         case VIRTUOSO_DV_TIMESTAMP:
-+         case VIRTUOSO_DV_DATE:
-+         case VIRTUOSO_DV_TIME:
-+         case VIRTUOSO_DV_DATETIME:
-+        Py_BEGIN_ALLOW_THREADS
-+        ret = SQLGetDescField (hdesc, column, SQL_DESC_COL_DT_DT_TYPE, &dv_dt_type, SQL_IS_INTEGER, NULL);
-+        Py_END_ALLOW_THREADS;
-+        if (!SQL_SUCCEEDED(ret))
-+        return Py_None;
-+        break;
-+         default:
-+        break;
-+     }
-+ 
-+     colinfo = Py_BuildValue("(Oiiiss)",
-+                value,
-+                dvtype,
-+                dv_dt_type,
-+                flag,
-+                (char *)lang,
-+                (char *)dtype);
-+     if (!colinfo)
-+    return Py_None;
-+ 
-+     return colinfo;
-+ }
-+ 
-  
-  PyObject*
-  GetData(Cursor* cur, Py_ssize_t iCol)
+      return -1;
+  }
+  
++ static
++ PyObject *GetDataSPASQL(Cursor *cur, Py_ssize_t column)
++ {
++     // Return a tuple of information sufficient to glean the
++     // real underlying type in case of a Virtuoso SPASQL query
++     int dvtype, flag;
++     SQLHANDLE hdesc = SQL_NULL_HANDLE;
++     SQLRETURN ret;
++     SQLCHAR lang[0x100], dtype[0x100];
++     SQLINTEGER len, dv_dt_type = 0;
++     PyObject *value, *colinfo;
++ 
++     memset(lang, 0, sizeof(lang));
++     memset(dtype, 0, sizeof(dtype));
++ 
++     value = GetDataString(cur, column);
++     if (!value)
++    return Py_None;
++ 
++     // why do the virtuoso extensions number the columns from 1???
++     column += 1;
++ 
++     Py_BEGIN_ALLOW_THREADS
++    ret = SQLGetStmtAttr(cur->hstmt, SQL_ATTR_IMP_ROW_DESC, &hdesc, SQL_IS_POINTER, NULL);
++     Py_END_ALLOW_THREADS;
++     if (!SQL_SUCCEEDED(ret)) {
++    return Py_None;
++     }
++     Py_BEGIN_ALLOW_THREADS
++    ret = SQLGetDescField(hdesc, column, SQL_DESC_COL_DV_TYPE, &dvtype, SQL_IS_INTEGER, NULL);
++     Py_END_ALLOW_THREADS;
++     if (!SQL_SUCCEEDED(ret)) {
++    return Py_None;
++     }    
++     Py_BEGIN_ALLOW_THREADS
++    ret = SQLGetDescField(hdesc, column, SQL_DESC_COL_BOX_FLAGS, &flag, SQL_IS_INTEGER, NULL);
++     Py_END_ALLOW_THREADS;
++     if (!SQL_SUCCEEDED(ret)) {
++    return Py_None;
++     }
++ 
++     switch (dvtype) {
++         case VIRTUOSO_DV_RDF:
++        Py_BEGIN_ALLOW_THREADS
++        ret = SQLGetDescField(hdesc, column, SQL_DESC_COL_LITERAL_LANG, lang, sizeof(lang), &len);
++        Py_END_ALLOW_THREADS;
++        if (!SQL_SUCCEEDED(ret))
++        return Py_None;
++        Py_BEGIN_ALLOW_THREADS
++        ret = SQLGetDescField(hdesc, column, SQL_DESC_COL_LITERAL_TYPE, dtype, sizeof(dtype), &len);
++        Py_END_ALLOW_THREADS;
++        if (!SQL_SUCCEEDED(ret))
++        return Py_None;
++        break;
++         case VIRTUOSO_DV_TIMESTAMP:
++         case VIRTUOSO_DV_DATE:
++         case VIRTUOSO_DV_TIME:
++         case VIRTUOSO_DV_DATETIME:
++        Py_BEGIN_ALLOW_THREADS
++        ret = SQLGetDescField (hdesc, column, SQL_DESC_COL_DT_DT_TYPE, &dv_dt_type, SQL_IS_INTEGER, NULL);
++        Py_END_ALLOW_THREADS;
++        if (!SQL_SUCCEEDED(ret))
++        return Py_None;
++        break;
++         default:
++        break;
++     }
++ 
++     colinfo = Py_BuildValue("(Oiiiss)",
++                value,
++                dvtype,
++                dv_dt_type,
++                flag,
++                (char *)lang,
++                (char *)dtype);
++     if (!colinfo)
++    return Py_None;
++ 
++     return colinfo;
++ }
++ 
+  
+  PyObject*
+  GetData(Cursor* cur, Py_ssize_t iCol)
 ***************
 *** 610,615 ****
 --- 692,701 ----
-      if (conv_index != -1)
-          return GetDataUser(cur, iCol, conv_index);
-  
-+     // Check if we have to apply SPASQL processing
-+     if (cur->spasql)
-+         return GetDataSPASQL(cur, iCol);
-+ 
-      switch (pinfo->sql_type)
-      {
-      case SQL_WCHAR:
-diff -c -r pyodbc-2.1.12/src/params.cpp pyodbc-2.1.12v/src/params.cpp
+      if (conv_index != -1)
+          return GetDataUser(cur, iCol, conv_index);
+  
++     // Check if we have to apply SPASQL processing
++     if (cur->spasql)
++         return GetDataSPASQL(cur, iCol);
++ 
+      switch (pinfo->sql_type)
+      {
+      case SQL_WCHAR:
+diff -c -N -r pyodbc-2.1.12/src/params.cpp pyodbc-2.1.12v/src/params.cpp
 *** pyodbc-2.1.12/src/params.cpp	2011-10-17 08:45:30.000000000 -0400
 --- pyodbc-2.1.12v/src/params.cpp	2011-12-19 12:56:03.000000000 -0500
 ***************
 *** 295,301 ****
-      long count = (long)PyTuple_GET_SIZE(digits);
-  
-      char* pch;
-!     int len;
-  
-      if (exp >= 0)
-      {
+      long count = (long)PyTuple_GET_SIZE(digits);
+  
+      char* pch;
+!     int len;
+  
+      if (exp >= 0)
+      {
 --- 295,301 ----
-      long count = (long)PyTuple_GET_SIZE(digits);
-  
-      char* pch;
-!     long len;
-  
-      if (exp >= 0)
-      {
-diff -c -r pyodbc-2.1.12/src/pyodbcmodule.cpp pyodbc-2.1.12v/src/pyodbcmodule.cpp
+      long count = (long)PyTuple_GET_SIZE(digits);
+  
+      char* pch;
+!     long len;
+  
+      if (exp >= 0)
+      {
+diff -c -N -r pyodbc-2.1.12/src/pyodbcmodule.cpp pyodbc-2.1.12v/src/pyodbcmodule.cpp
 *** pyodbc-2.1.12/src/pyodbcmodule.cpp	2011-10-17 08:45:30.000000000 -0400
 --- pyodbc-2.1.12v/src/pyodbcmodule.cpp	2012-05-16 10:23:18.000000000 -0400
 ***************

      SQLRETURN ret;
      Py_BEGIN_ALLOW_THREADS
      ret = SQLSetStmtAttr(cursor->hstmt, SQL_ATTR_NOSCAN, (SQLPOINTER)noscan, 0);
diff -c -r pyodbc-2.1.12/src/cursor.h pyodbc-2.1.12v/src/cursor.h
*** pyodbc-2.1.12/src/cursor.h	2011-10-17 08:45:30.000000000 -0400
--- pyodbc-2.1.12v/src/cursor.h	2011-12-19 11:52:50.000000000 -0500
***************

diff -c -N -r pyodbc-2.1.12/src/cnxninfo.cpp pyodbc-2.1.12v/src/cnxninfo.cpp
*** pyodbc-2.1.12/src/cnxninfo.cpp	2011-10-17 08:45:30.000000000 -0400
--- pyodbc-2.1.12v/src/cnxninfo.cpp	2011-12-19 15:52:04.000000000 -0500
***************
*** 112,118 ****
      HSTMT hstmt = 0;
      if (SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_STMT, cnxn->hdbc, &hstmt)))
      {
!         SQLINTEGER columnsize;
          if (SQL_SUCCEEDED(SQLGetTypeInfo(hstmt, SQL_TYPE_TIMESTAMP)) && SQL_SUCCEEDED(SQLFetch(hstmt)))
          {
              if (SQL_SUCCEEDED(SQLGetData(hstmt, 3, SQL_INTEGER, &columnsize, sizeof(columnsize), 0)))
--- 112,118 ----
      HSTMT hstmt = 0;
      if (SQL_SUCCEEDED(SQLAllocHandle(SQL_HANDLE_STMT, cnxn->hdbc, &hstmt)))
      {
!         ULONG columnsize;
          if (SQL_SUCCEEDED(SQLGetTypeInfo(hstmt, SQL_TYPE_TIMESTAMP)) && SQL_SUCCEEDED(SQLFetch(hstmt)))
          {
              if (SQL_SUCCEEDED(SQLGetData(hstmt, 3, SQL_INTEGER, &columnsize, sizeof(columnsize), 0)))
diff -c -N -r pyodbc-2.1.12/src/connection.cpp pyodbc-2.1.12v/src/connection.cpp
*** pyodbc-2.1.12/src/connection.cpp	2011-10-17 08:45:30.000000000 -0400
--- pyodbc-2.1.12v/src/connection.cpp	2011-12-19 13:45:06.000000000 -0500
***************
