[TRAFODION-2385] windows odbc support tinyint,boolean,largeint unsigned
Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/fe53516b Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/fe53516b Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/fe53516b Branch: refs/heads/master Commit: fe53516b5c50c848589fb12dc5fa80cb01e7f009 Parents: 8bb7d25 Author: Weixin-Xu <weixin...@esgyn.cn> Authored: Mon Jun 5 13:40:38 2017 +0800 Committer: Weixin-Xu <weixin...@esgyn.cn> Committed: Mon Jun 5 13:40:38 2017 +0800 ---------------------------------------------------------------------- win-odbc64/odbcclient/drvr35/cdesc.cpp | 3 +- win-odbc64/odbcclient/drvr35/cstmt.cpp | 1 + win-odbc64/odbcclient/drvr35/ctosqlconv.cpp | 106 ++++++++++++++++++- win-odbc64/odbcclient/drvr35/sqltocconv.cpp | 127 ++++++++++++++++++++++- win-odbc64/sql/cli/sqlcli.h | 10 ++ 5 files changed, 243 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/fe53516b/win-odbc64/odbcclient/drvr35/cdesc.cpp ---------------------------------------------------------------------- diff --git a/win-odbc64/odbcclient/drvr35/cdesc.cpp b/win-odbc64/odbcclient/drvr35/cdesc.cpp index f1e01ea..a8b2d94 100644 --- a/win-odbc64/odbcclient/drvr35/cdesc.cpp +++ b/win-odbc64/odbcclient/drvr35/cdesc.cpp @@ -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) http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/fe53516b/win-odbc64/odbcclient/drvr35/cstmt.cpp ---------------------------------------------------------------------- diff --git a/win-odbc64/odbcclient/drvr35/cstmt.cpp b/win-odbc64/odbcclient/drvr35/cstmt.cpp index d1ab20d..3dce053 100644 --- a/win-odbc64/odbcclient/drvr35/cstmt.cpp +++ b/win-odbc64/odbcclient/drvr35/cstmt.cpp @@ -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 ; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/fe53516b/win-odbc64/odbcclient/drvr35/ctosqlconv.cpp ---------------------------------------------------------------------- diff --git a/win-odbc64/odbcclient/drvr35/ctosqlconv.cpp b/win-odbc64/odbcclient/drvr35/ctosqlconv.cpp index fb2a312..5b0037a 100644 --- a/win-odbc64/odbcclient/drvr35/ctosqlconv.cpp +++ b/win-odbc64/odbcclient/drvr35/ctosqlconv.cpp @@ -130,6 +130,8 @@ unsigned long ODBC::ConvertCToSQL(SQLINTEGER ODBCAppVersion, USHORT usTmp; SLONG lTmp; ULONG ulTmp; + SCHAR tTmp; + UCHAR utTmp; CHAR cTmpBuf[256]; CHAR cTmpBuf2[256]; CHAR cTmpFraction[10]; @@ -246,6 +248,12 @@ unsigned long ODBC::ConvertCToSQL(SQLINTEGER ODBCAppVersion, targetUnsigned = true; } + if (SQLDataType == SQLTYPECODE_BOOLEAN) + { + ODBCDataType = SQL_BOOLEAN; + } + + if (CDataType == SQL_C_DEFAULT) { getCDefault(tODBCDataType, ODBCAppVersion, CDataType); @@ -589,6 +597,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: @@ -814,6 +824,50 @@ unsigned long ODBC::ConvertCToSQL(SQLINTEGER ODBCAppVersion, switch (ODBCDataType) { + case SQL_BOOLEAN: + if (dTmp < 0) + return IDS_22_003_02; //negValue in unsigned column + 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) { @@ -972,9 +1026,38 @@ unsigned long ODBC::ConvertCToSQL(SQLINTEGER ODBCAppVersion, switch( SQLDataType ) { + case SQLTYPECODE_BOOLEAN: + if (tempVal64 < 0 || tempVal64 > 1) + return IDS_22_003_02; + 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_02; + 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; + return IDS_22_003_02; if ((USHORT)tempVal64 > USHRT_MAX) return IDS_22_003; usTmp = (USHORT)tempVal64; @@ -1059,6 +1142,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; @@ -1507,6 +1596,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; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/fe53516b/win-odbc64/odbcclient/drvr35/sqltocconv.cpp ---------------------------------------------------------------------- diff --git a/win-odbc64/odbcclient/drvr35/sqltocconv.cpp b/win-odbc64/odbcclient/drvr35/sqltocconv.cpp index c1c1484..486cc63 100644 --- a/win-odbc64/odbcclient/drvr35/sqltocconv.cpp +++ b/win-odbc64/odbcclient/drvr35/sqltocconv.cpp @@ -304,6 +304,18 @@ 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, CDataType); @@ -475,6 +487,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); @@ -505,7 +542,10 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion, LocalizeNumericString = TRUE; break; case SQL_BIGINT: - sprintf( cTmpBuf, "%I64d", *((__int64 *)srcDataPtr)); + if (srcUnsigned) + _snprintf(cTmpBuf, sizeof(__int64), "%I64u", *((__int64 *)srcDataPtr)); + else + _snprintf(cTmpBuf, sizeof(__int64), "%I64d", *((__int64 *)srcDataPtr)); DataLen = strlen(cTmpBuf); if (DataLen > targetLength) return IDS_22_003; @@ -800,6 +840,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); @@ -1143,6 +1208,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) { @@ -1186,7 +1266,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) @@ -2318,6 +2401,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: @@ -2435,6 +2520,25 @@ 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: + if (srcUnsigned) + { + utTmp = *((UCHAR *) srcDataPtr); + DataPtr = &utTmp; + DataLen = sizeof(UCHAR); + } + else + { + tTmp = *(SCHAR *) srcDataPtr; + DataPtr = &tTmp; + DataLen = sizeof(SCHAR); + } + break; case SQL_SMALLINT: if (srcUnsigned) { @@ -2836,6 +2940,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 + { + lTmp = *(SCHAR *)srcDataPtr; + _ltoa(tTmp, cTmpBuf, 10); + } + useDouble = FALSE; + break; case SQL_SMALLINT: if (srcUnsigned) { @@ -3149,6 +3266,12 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion, if (retCode != IDS_01_S07) return retCode; break; + case SQL_TINYINT: + if (srcUnsigned) + dTmp = *(UCHAR *)srcDataPtr; + else + dTmp = *(SCHAR *)srcDataPtr; + break; case SQL_SMALLINT: if (srcUnsigned) dTmp = *(USHORT *)srcDataPtr; http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/fe53516b/win-odbc64/sql/cli/sqlcli.h ---------------------------------------------------------------------- diff --git a/win-odbc64/sql/cli/sqlcli.h b/win-odbc64/sql/cli/sqlcli.h index e076735..982f609 100644 --- a/win-odbc64/sql/cli/sqlcli.h +++ b/win-odbc64/sql/cli/sqlcli.h @@ -354,6 +354,11 @@ enum SQLTYPE_CODE { /* INTEGER/INT Tandem extensions */ SQLTYPECODE_INTEGER_UNSIGNED = -401, SQLTYPECODE_LARGEINT = -402, + SQLTYPECODE_LARGEINT_UNSIGNED = -405, + + /* TINYINT */ + SQLTYPECODE_TINYINT = -403, + SQLTYPECODE_TINYINT_UNSIGNED = -404, /* SMALLINT */ SQLTYPECODE_SMALLINT = 5, @@ -416,6 +421,9 @@ enum SQLTYPE_CODE { /* LONG VARCHAR/ODBC CHARACTER VARYING */ SQLTYPECODE_VARCHAR_LONG = -1, /* ## NEGATIVE??? */ + /* BOOLEAN */ + SQLTYPECODE_BOOLEAN = -701, + /* no ANSI value 13 */ /* BIT */ @@ -425,6 +433,8 @@ enum SQLTYPE_CODE { SQLTYPECODE_BITVAR = 15 /* not supported */ }; +#define SQL_BOOLEAN 13 + /* #ifndef SQLDTCODE_DATE */ /* specifies the type of datetime data type */ enum SQLDATETIME_CODE {