@@ -471,14 +471,21 @@ SQLRETURN BindParameters(SQLHANDLE hStmt, const py::list& params,
471471 hStmt, static_cast <SQLUSMALLINT>(paramIndex + 1 ), &describedType,
472472 &describedSize, &describedDigits, &nullable);
473473 if (!SQL_SUCCEEDED (rc)) {
474- LOG (" BindParameters: SQLDescribeParam failed for "
475- " param[%d] (NULL parameter) - SQLRETURN=%d" ,
476- paramIndex, rc);
477- return rc;
474+ // SQLDescribeParam can fail for generic SELECT statements where
475+ // no table column is referenced. Fall back to SQL_VARCHAR as a safe
476+ // default.
477+ LOG_WARNING (" BindParameters: SQLDescribeParam failed for "
478+ " param[%d] (NULL parameter) - SQLRETURN=%d, falling back to "
479+ " SQL_VARCHAR" ,
480+ paramIndex, rc);
481+ sqlType = SQL_VARCHAR;
482+ columnSize = 1 ;
483+ decimalDigits = 0 ;
484+ } else {
485+ sqlType = describedType;
486+ columnSize = describedSize;
487+ decimalDigits = describedDigits;
478488 }
479- sqlType = describedType;
480- columnSize = describedSize;
481- decimalDigits = describedDigits;
482489 }
483490 dataPtr = nullptr ;
484491 strLenOrIndPtr = AllocateParamBuffer<SQLLEN>(paramBuffers);
@@ -4048,7 +4055,8 @@ size_t calculateRowSize(py::list& columnNames, SQLUSMALLINT numCols) {
40484055 break ;
40494056 case SQL_SS_UDT:
40504057 rowSize += (static_cast <SQLLEN>(columnSize) == SQL_NO_TOTAL || columnSize == 0 )
4051- ? SQL_MAX_LOB_SIZE : columnSize;
4058+ ? SQL_MAX_LOB_SIZE
4059+ : columnSize;
40524060 break ;
40534061 case SQL_BINARY:
40544062 case SQL_VARBINARY:
@@ -4112,8 +4120,7 @@ SQLRETURN FetchMany_wrap(SqlHandlePtr StatementHandle, py::list& rows, int fetch
41124120
41134121 if ((dataType == SQL_WVARCHAR || dataType == SQL_WLONGVARCHAR || dataType == SQL_VARCHAR ||
41144122 dataType == SQL_LONGVARCHAR || dataType == SQL_VARBINARY ||
4115- dataType == SQL_LONGVARBINARY || dataType == SQL_SS_XML ||
4116- dataType == SQL_SS_UDT) &&
4123+ dataType == SQL_LONGVARBINARY || dataType == SQL_SS_XML || dataType == SQL_SS_UDT) &&
41174124 (columnSize == 0 || columnSize == SQL_NO_TOTAL || columnSize > SQL_MAX_LOB_SIZE)) {
41184125 lobColumns.push_back (i + 1 ); // 1-based
41194126 }
@@ -4252,8 +4259,7 @@ SQLRETURN FetchAll_wrap(SqlHandlePtr StatementHandle, py::list& rows,
42524259
42534260 if ((dataType == SQL_WVARCHAR || dataType == SQL_WLONGVARCHAR || dataType == SQL_VARCHAR ||
42544261 dataType == SQL_LONGVARCHAR || dataType == SQL_VARBINARY ||
4255- dataType == SQL_LONGVARBINARY || dataType == SQL_SS_XML ||
4256- dataType == SQL_SS_UDT) &&
4262+ dataType == SQL_LONGVARBINARY || dataType == SQL_SS_XML || dataType == SQL_SS_UDT) &&
42574263 (columnSize == 0 || columnSize == SQL_NO_TOTAL || columnSize > SQL_MAX_LOB_SIZE)) {
42584264 lobColumns.push_back (i + 1 ); // 1-based
42594265 }
0 commit comments