Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions mssql_python/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ class ConstantsDDBC(Enum):
SQL_FETCH_ABSOLUTE = 5
SQL_FETCH_RELATIVE = 6
SQL_FETCH_BOOKMARK = 8
SQL_SS_UDT = -151
SQL_DATETIMEOFFSET = -155
SQL_SS_TIME2 = -154
SQL_SS_XML = -152
Expand Down Expand Up @@ -374,6 +375,7 @@ def get_valid_types(cls) -> set:
ConstantsDDBC.SQL_DATETIMEOFFSET.value,
ConstantsDDBC.SQL_SS_XML.value,
ConstantsDDBC.SQL_GUID.value,
ConstantsDDBC.SQL_SS_UDT.value,
}

# Could also add category methods for convenience
Expand Down
3 changes: 3 additions & 0 deletions mssql_python/cursor.py
Original file line number Diff line number Diff line change
Expand Up @@ -865,6 +865,7 @@ def _get_c_type_for_sql_type(self, sql_type: int) -> int:
ddbc_sql_const.SQL_BINARY.value: ddbc_sql_const.SQL_C_BINARY.value,
ddbc_sql_const.SQL_VARBINARY.value: ddbc_sql_const.SQL_C_BINARY.value,
ddbc_sql_const.SQL_LONGVARBINARY.value: ddbc_sql_const.SQL_C_BINARY.value,
ddbc_sql_const.SQL_SS_UDT.value: ddbc_sql_const.SQL_C_BINARY.value,
# ODBC 3.x date/time types (reported by ODBC 18 driver)
ddbc_sql_const.SQL_TYPE_DATE.value: ddbc_sql_const.SQL_C_TYPE_DATE.value,
ddbc_sql_const.SQL_TYPE_TIME.value: ddbc_sql_const.SQL_C_TYPE_TIME.value,
Expand Down Expand Up @@ -1052,6 +1053,7 @@ def _map_data_type(self, sql_type):
SQL_SS_TIME2(-154) for time columns
SQL_DATETIMEOFFSET(-155) for datetimeoffset columns
SQL_SS_XML(-152) for xml columns
SQL_SS_UDT(-151) for geography/geometry/hierarchyid columns

ODBC 2.x aliases (9, 10, 11) are also accepted defensively.

Expand Down Expand Up @@ -1097,6 +1099,7 @@ def _map_data_type(self, sql_type):
ddbc_sql_const.SQL_BINARY.value: bytes,
ddbc_sql_const.SQL_VARBINARY.value: bytes,
ddbc_sql_const.SQL_LONGVARBINARY.value: bytes,
ddbc_sql_const.SQL_SS_UDT.value: bytes,
# UUID
ddbc_sql_const.SQL_GUID.value: uuid.UUID,
# XML — driver reports SQL_SS_XML (-152), fetched as str
Expand Down
16 changes: 13 additions & 3 deletions mssql_python/pybind/ddbc_bindings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,14 @@
// Macro definitions
//-------------------------------------------------------------------------------------------------

// This constant is not exposed via sql.h, hence define it here
// These constants are not exposed via sql.h, hence define them here
#define SQL_SS_TIME2 (-154)
#define SQL_SS_TIMESTAMPOFFSET (-155)
#define SQL_C_SS_TIMESTAMPOFFSET (0x4001)
#define MAX_DIGITS_IN_NUMERIC 64
#define SQL_MAX_NUMERIC_LEN 16
#define SQL_SS_XML (-152)
#define SQL_SS_UDT (-151)

#define STRINGIFY_FOR_CASE(x) \
case x: \
Expand Down Expand Up @@ -3285,6 +3286,7 @@ SQLRETURN SQLGetData_wrap(SqlHandlePtr StatementHandle, SQLUSMALLINT colCount, p
}
break;
}
case SQL_SS_UDT:
case SQL_BINARY:
case SQL_VARBINARY:
case SQL_LONGVARBINARY: {
Expand Down Expand Up @@ -3555,6 +3557,7 @@ SQLRETURN SQLBindColums(SQLHSTMT hStmt, ColumnBuffers& buffers, py::list& column
ret = SQLBindCol_ptr(hStmt, col, SQL_C_GUID, buffers.guidBuffers[col - 1].data(),
sizeof(SQLGUID), buffers.indicators[col - 1].data());
break;
case SQL_SS_UDT:
case SQL_BINARY:
case SQL_VARBINARY:
case SQL_LONGVARBINARY:
Expand Down Expand Up @@ -3683,6 +3686,7 @@ SQLRETURN FetchBatchData(SQLHSTMT hStmt, ColumnBuffers& buffers, py::list& colum
case SQL_WLONGVARCHAR:
columnProcessors[col] = ColumnProcessors::ProcessWChar;
break;
case SQL_SS_UDT:
case SQL_BINARY:
case SQL_VARBINARY:
case SQL_LONGVARBINARY:
Expand Down Expand Up @@ -3981,6 +3985,10 @@ size_t calculateRowSize(py::list& columnNames, SQLUSMALLINT numCols) {
case SQL_BIT:
rowSize += sizeof(SQLCHAR);
break;
case SQL_SS_UDT:
rowSize += (static_cast<SQLLEN>(columnSize) == SQL_NO_TOTAL || columnSize == 0)
? SQL_MAX_LOB_SIZE : columnSize;
break;
case SQL_BINARY:
case SQL_VARBINARY:
case SQL_LONGVARBINARY:
Expand Down Expand Up @@ -4043,7 +4051,8 @@ SQLRETURN FetchMany_wrap(SqlHandlePtr StatementHandle, py::list& rows, int fetch

if ((dataType == SQL_WVARCHAR || dataType == SQL_WLONGVARCHAR || dataType == SQL_VARCHAR ||
dataType == SQL_LONGVARCHAR || dataType == SQL_VARBINARY ||
dataType == SQL_LONGVARBINARY || dataType == SQL_SS_XML) &&
dataType == SQL_LONGVARBINARY || dataType == SQL_SS_XML ||
dataType == SQL_SS_UDT) &&
(columnSize == 0 || columnSize == SQL_NO_TOTAL || columnSize > SQL_MAX_LOB_SIZE)) {
lobColumns.push_back(i + 1); // 1-based
}
Expand Down Expand Up @@ -4177,7 +4186,8 @@ SQLRETURN FetchAll_wrap(SqlHandlePtr StatementHandle, py::list& rows,

if ((dataType == SQL_WVARCHAR || dataType == SQL_WLONGVARCHAR || dataType == SQL_VARCHAR ||
dataType == SQL_LONGVARCHAR || dataType == SQL_VARBINARY ||
dataType == SQL_LONGVARBINARY || dataType == SQL_SS_XML) &&
dataType == SQL_LONGVARBINARY || dataType == SQL_SS_XML ||
dataType == SQL_SS_UDT) &&
(columnSize == 0 || columnSize == SQL_NO_TOTAL || columnSize > SQL_MAX_LOB_SIZE)) {
lobColumns.push_back(i + 1); // 1-based
}
Expand Down
Loading
Loading