Skip to content
This repository has been archived by the owner on Jun 7, 2021. It is now read-only.

[TRAFODION-2385] odbc support boolean, tinyint, largeint #1107

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 2 additions & 1 deletion core/conn/unixodbc/odbc/odbcclient/unixcli/cli/cdesc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2381,7 +2381,8 @@ SQLRETURN CDesc::BuildValueList(CStmt *pHandle, //AMR - changed this pointer ty

if(IPDDescRecPtr->m_ODBCDataType == SQL_VARCHAR ||
IPDDescRecPtr->m_ODBCDataType == SQL_LONGVARCHAR ||
IPDDescRecPtr->m_ODBCDataType == SQL_CHAR)
IPDDescRecPtr->m_ODBCDataType == SQL_CHAR &&
IPDDescRecPtr->m_SQLDataType != SQLTYPECODE_BOOLEAN)
{
if(m_ICUConv->getUCS2Translation())
SQLValue->dataValue._length = IPDDescRecPtr->m_SQLOctetLength -1;
Expand Down
1 change: 1 addition & 0 deletions core/conn/unixodbc/odbc/odbcclient/unixcli/cli/cstmt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3630,6 +3630,7 @@ BOOL CStmt::setFetchOutputPerf(SQL_DataValue_def*& outputDataValue, long rowsFet
memOffSet += SQLMaxLength ;
break;
case SQLTYPECODE_LARGEINT:
case SQLTYPECODE_LARGEINT_UNSIGNED:
memOffSet = ((memOffSet + 8 - 1) >> 3) << 3;
VarOffSet = memOffSet;
memOffSet += SQLMaxLength ;
Expand Down
105 changes: 105 additions & 0 deletions core/conn/unixodbc/odbc/odbcclient/unixcli/cli/ctosqlconv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,8 @@ unsigned long ODBC::ConvertCToSQL(SQLINTEGER ODBCAppVersion,
double dTmp;
double dTmp1;
double scaleOffset;
SCHAR tTmp;
UCHAR utTmp;
SSHORT sTmp;
USHORT usTmp;
SLONG_P lTmp;
Expand Down Expand Up @@ -324,6 +326,11 @@ unsigned long ODBC::ConvertCToSQL(SQLINTEGER ODBCAppVersion,
targetUnsigned = true;
}

if (SQLDataType == SQLTYPECODE_BOOLEAN)
{
ODBCDataType = SQL_BOOLEAN;
}

if (CDataType == SQL_C_DEFAULT)
{
getCDefault(tODBCDataType, ODBCAppVersion, targetCharSet, CDataType);
Expand Down Expand Up @@ -689,6 +696,8 @@ unsigned long ODBC::ConvertCToSQL(SQLINTEGER ODBCAppVersion,
DataLen = sizeof(fltTmp);
break;
}
case SQL_BOOLEAN:
case SQL_TINYINT:
case SQL_SMALLINT:
case SQL_INTEGER:
case SQL_FLOAT:
Expand Down Expand Up @@ -913,6 +922,50 @@ unsigned long ODBC::ConvertCToSQL(SQLINTEGER ODBCAppVersion,
{
switch (ODBCDataType)
{
case SQL_BOOLEAN:
if (dTmp < 0)
return IDS_22_003_02;
if (dTmp > 1)
return IDS_22_003;
tTmp = (SCHAR)dTmp;
if (dTmp != tTmp)
retCode = IDS_01_S07;
DataPtr = &tTmp;
DataLen = sizeof(SCHAR);
break;
case SQL_TINYINT:
if(targetUnsigned)
{
if (dTmp < 0)
return IDS_22_003_02; //negValue in unsigned column
if(dTmp > UCHAR_MAX)
return IDS_22_003;
utTmp = (UCHAR)dTmp;
if(dTmp != utTmp)
retCode = IDS_01_S07;
DataPtr = &utTmp;
DataLen = sizeof(UCHAR);
}
else
{
if(unsignedInteger)
{
if(dTmp < 0 || dTmp > UCHAR_MAX)
return IDS_22_003;
tTmp = (SCHAR)dTmp;
}
else
{
if(dTmp < SCHAR_MIN || dTmp > SCHAR_MAX)
return IDS_22_003;
tTmp = (SCHAR)dTmp;
if (dTmp != tTmp)
retCode = IDS_01_S07;
}
DataPtr = &tTmp;
DataLen = sizeof(SCHAR);
}
break;
case SQL_SMALLINT:
if (targetUnsigned)
{
Expand Down Expand Up @@ -1074,6 +1127,37 @@ unsigned long ODBC::ConvertCToSQL(SQLINTEGER ODBCAppVersion,

switch( SQLDataType )
{
case SQLTYPECODE_BOOLEAN:
if (tempVal64 < 0)
return IDS_22_003_02;
if (tempVal64 > 1)
return IDS_22_003;
tTmp = (SCHAR)tempVal64;
if (tempVal64 != tTmp)
retCode = IDS_01_S07;
DataPtr = &tTmp;
DataLen = sizeof(SCHAR);
break;
case SQLTYPECODE_TINYINT_UNSIGNED:
if (tempVal64 < 0)
return IDS_22_003_02;
if (tempVal64 > UCHAR_MAX)
return IDS_22_003;
utTmp = (UCHAR)tempVal64;
if (tempVal64 != utTmp)
retCode = IDS_01_S07;
DataPtr = &utTmp;
DataLen = sizeof(UCHAR);
break;
case SQLTYPECODE_TINYINT:
if (tempVal64 < SCHAR_MIN || tempVal64 > SCHAR_MAX)
return IDS_22_003;
tTmp = (SCHAR)tempVal64;
if (tempVal64 != tTmp)
retCode = IDS_01_S07;
DataPtr = &tTmp;
DataLen = sizeof(SCHAR);
break;
case SQLTYPECODE_SMALLINT_UNSIGNED:
if (tempVal64 < 0)
return IDS_22_003_02;
Expand Down Expand Up @@ -1164,6 +1248,12 @@ unsigned long ODBC::ConvertCToSQL(SQLINTEGER ODBCAppVersion,
{
switch (ODBCDataType)
{
case SQL_BOOLEAN:
DataLen = sizeof(SCHAR);
break;
case SQL_TINYINT:
DataLen = sizeof(SCHAR);
break;
case SQL_SMALLINT:
DataLen = sizeof(SHORT);
break;
Expand Down Expand Up @@ -1624,6 +1714,21 @@ unsigned long ODBC::ConvertCToSQL(SQLINTEGER ODBCAppVersion,
dTmp *= scaleOffset;
switch (SQLDataType)
{
case SQLTYPECODE_BOOLEAN:
tTmp = (SCHAR)dTmp;
DataPtr = &tTmp;
DataLen = sizeof(SCHAR);
break;
case SQLTYPECODE_TINYINT_UNSIGNED:
utTmp = (UCHAR)dTmp;
DataPtr = &utTmp;
DataLen = sizeof(UCHAR);
break;
case SQLTYPECODE_TINYINT:
tTmp = (SCHAR)dTmp;
DataPtr = &tTmp;
DataLen = sizeof(SCHAR);
break;
case SQLTYPECODE_SMALLINT_UNSIGNED:
usTmp = (USHORT)dTmp;
DataPtr = &usTmp;
Expand Down
114 changes: 111 additions & 3 deletions core/conn/unixodbc/odbc/odbcclient/unixcli/cli/sqltocconv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,17 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion,
srcUnsigned = true;
}

if (ODBCDataType == SQL_BIGINT && SQLDataType == SQLTYPECODE_LARGEINT_UNSIGNED &&
srcPrecision == 19 && srcScale==0)
{
srcUnsigned = true;
}

if (SQLDataType == SQLTYPECODE_BOOLEAN)
{
ODBCDataType = SQL_BOOLEAN;
}

if (CDataType == SQL_C_DEFAULT)
{
getCDefault(tODBCDataType, ODBCAppVersion, srcCharSet, CDataType);
Expand Down Expand Up @@ -523,6 +534,31 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion,
// if (totalReturnedLength != NULL)
// *totalReturnedLength = DataLen + Offset;
break;
case SQL_BOOLEAN:
tTmp = *((SCHAR *) srcDataPtr);
_ltoa(tTmp, cTmpBuf, 10);
DataLen = strlen(cTmpBuf);
if(DataLen > targetLength)
return IDS_22_003;
DataPtr = cTmpBuf;
break;
case SQL_TINYINT:
if(srcUnsigned)
{
utTmp = *((UCHAR *) srcDataPtr);
_ltoa(utTmp, cTmpBuf, 10);
}
else
{
tTmp = *((SCHAR *) srcDataPtr);
_ltoa(tTmp, cTmpBuf, 10);
}
DataLen = strlen(cTmpBuf);
if(DataLen > targetLength)
return IDS_22_003;
DataPtr = cTmpBuf;
LocalizeNumericString = TRUE;
break;
case SQL_SMALLINT:
if (srcUnsigned)
lTmp = *((USHORT *) srcDataPtr);
Expand Down Expand Up @@ -553,11 +589,15 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion,
LocalizeNumericString = TRUE;
break;
case SQL_BIGINT:
#if !defined MXHPUX && !defined MXOSS && !defined MXAIX && !defined MXSUNSPARC
/*#if !defined MXHPUX && !defined MXOSS && !defined MXAIX && !defined MXSUNSPARC
sprintf( cTmpBuf, "%Ld", *((__int64 *)srcDataPtr));
#else
sprintf( cTmpBuf, "%lld", *((__int64 *)srcDataPtr));
#endif
#endif*/
if (srcUnsigned)
snprintf( cTmpBuf, sizeof(__int64), "%lu", *((__int64 *)srcDataPtr));
else
snprintf( cTmpBuf, sizeof(__int64), "%ld", *((__int64 *)srcDataPtr));
DataLen = strlen(cTmpBuf);
if (DataLen > targetLength)
return IDS_22_003;
Expand Down Expand Up @@ -860,6 +900,31 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion,
// if (totalReturnedLength != NULL)
// *totalReturnedLength = DataLen + Offset;
break;
case SQL_BOOLEAN:
tTmp = *((SCHAR *) srcDataPtr);
_ltoa(tTmp, cTmpBuf, 10);
DataLen = strlen(cTmpBuf);
if(DataLen > targetLength)
return IDS_22_003;
DataPtr = cTmpBuf;
break;
case SQL_TINYINT:
if(srcUnsigned)
{
utTmp = *((UCHAR *) srcDataPtr);
_ultoa(utTmp, cTmpBuf, 10);
}
else
{
tTmp = *((SCHAR *) srcDataPtr);
_ltoa(tTmp, cTmpBuf, 10);
}
DataLen = strlen(cTmpBuf);
if(DataLen > targetLength)
return IDS_22_003;
DataPtr = cTmpBuf;
LocalizeNumericString = TRUE;
break;
case SQL_SMALLINT:
if (srcUnsigned)
lTmp = *((USHORT *) srcDataPtr);
Expand Down Expand Up @@ -1204,6 +1269,21 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion,
if ((retCode = ConvertSQLCharToNumeric(srcDataPtr, srcLength, ODBCDataType, dTmp)) != SQL_SUCCESS)
return retCode;
break;
case SQL_BOOLEAN:
dTmp = *((SCHAR *) srcDataPtr);
break;
case SQL_TINYINT:
if (srcUnsigned)
{
dTmp = *((UCHAR *) srcDataPtr);
unsignedInteger = TRUE;
}
else
{
dTmp = *((SCHAR *) srcDataPtr);
signedInteger = TRUE;
}
break;
case SQL_SMALLINT:
if (srcUnsigned)
{
Expand Down Expand Up @@ -1257,7 +1337,10 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion,
if (tempVal64 < -DBL_MAX || tempVal64 > DBL_MAX)
return IDS_22_003;
dTmp = tempVal64;
signedInteger = TRUE;
if (srcUnsigned)
unsignedInteger = TRUE;
else
signedInteger = TRUE;
break;
case SQL_NUMERIC:
switch (SQLDataType)
Expand Down Expand Up @@ -2394,6 +2477,8 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion,
// if (totalReturnedLength != NULL)
// *totalReturnedLength = DataLen + Offset;
break;
case SQL_BOOLEAN:
case SQL_TINYINT:
case SQL_SMALLINT:
case SQL_INTEGER:
case SQL_BIGINT:
Expand Down Expand Up @@ -2511,6 +2596,16 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion,
DataPtr = &intervalTmp;
DataLen = sizeof(SQL_INTERVAL_STRUCT);
break;
case SQL_BOOLEAN:
tTmp = *((SCHAR *) srcDataPtr);
DataPtr = &tTmp;
DataLen = sizeof(SCHAR);
break;
case SQL_TINYINT:
tTmp = *((SCHAR *) srcDataPtr);
DataPtr = &tTmp;
DataLen = sizeof(SCHAR);
break;
case SQL_SMALLINT:
if (srcUnsigned)
{
Expand Down Expand Up @@ -2921,6 +3016,19 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion,
strncpy( cTmpBuf, tempPtr, DataLen );
useDouble = FALSE;
break;
case SQL_TINYINT:
if(srcUnsigned)
{
utTmp = *((UCHAR *) srcDataPtr);
_ultoa(utTmp,cTmpBuf,10);
}
else
{
tTmp = *((SCHAR *) srcDataPtr);
_ltoa(tTmp,cTmpBuf,10);
}
useDouble = FALSE;
break;
case SQL_SMALLINT:
if (srcUnsigned)
{
Expand Down
3 changes: 2 additions & 1 deletion win-odbc64/odbcclient/drvr35/cdesc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2277,7 +2277,8 @@ SQLRETURN CDesc::BuildValueList(CStmt *pHandle, //AMR - changed this pointer ty

if(IPDDescRecPtr->m_ODBCDataType == SQL_VARCHAR ||
IPDDescRecPtr->m_ODBCDataType == SQL_LONGVARCHAR ||
IPDDescRecPtr->m_ODBCDataType == SQL_CHAR)
IPDDescRecPtr->m_ODBCDataType == SQL_CHAR &&
IPDDescRecPtr->m_SQLDataType != SQLTYPECODE_BOOLEAN)
SQLValue->dataValue._length = IPDDescRecPtr->m_SQLOctetLength-1;
else if (IPDDescRecPtr->m_ODBCDataType == SQL_WVARCHAR ||
IPDDescRecPtr->m_ODBCDataType == SQL_WCHAR)
Expand Down
1 change: 1 addition & 0 deletions win-odbc64/odbcclient/drvr35/cstmt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3535,6 +3535,7 @@ BOOL CStmt::setFetchOutputPerf(SQL_DataValue_def*& outputDataValue, long rowsFet
memOffSet += SQLMaxLength ;
break;
case SQLTYPECODE_LARGEINT:
case SQLTYPECODE_LARGEINT_UNSIGNED:
memOffSet = ((memOffSet + 8 - 1) >> 3) << 3;
VarOffSet = memOffSet;
memOffSet += SQLMaxLength ;
Expand Down