You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafodion.apache.org by db...@apache.org on 2018/01/03 21:45:09 UTC
[1/2] trafodion git commit: [TRAFODION-2818] For Server 2008,
function pow() throws STATUS_ILLEGAL_INSTRUCTION
Repository: trafodion
Updated Branches:
refs/heads/master db319b188 -> 42c1d2070
[TRAFODION-2818] For Server 2008, function pow() throws
STATUS_ILLEGAL_INSTRUCTION
Project: http://git-wip-us.apache.org/repos/asf/trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafodion/commit/d098c30e
Tree: http://git-wip-us.apache.org/repos/asf/trafodion/tree/d098c30e
Diff: http://git-wip-us.apache.org/repos/asf/trafodion/diff/d098c30e
Branch: refs/heads/master
Commit: d098c30e3afe4688c5e5f07a645e4b6dbf17698f
Parents: d93d17e
Author: Weixin-Xu <we...@esgyn.cn>
Authored: Mon Nov 27 19:37:06 2017 +0800
Committer: Weixin-Xu <we...@esgyn.cn>
Committed: Fri Dec 29 14:40:05 2017 +0800
----------------------------------------------------------------------
win-odbc64/odbcclient/drvr35/sqltocconv.cpp | 109 ++++++++++++++++++-----
1 file changed, 86 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafodion/blob/d098c30e/win-odbc64/odbcclient/drvr35/sqltocconv.cpp
----------------------------------------------------------------------
diff --git a/win-odbc64/odbcclient/drvr35/sqltocconv.cpp b/win-odbc64/odbcclient/drvr35/sqltocconv.cpp
index 918445a..89c0329 100755
--- a/win-odbc64/odbcclient/drvr35/sqltocconv.cpp
+++ b/win-odbc64/odbcclient/drvr35/sqltocconv.cpp
@@ -36,6 +36,36 @@
#define MAXCHARLEN 32768 //32K
+// for server2008 when using function pow() then throws STATUS_ILLEGAL_INSTRUCTION
+double pow(int base, short power, unsigned long *error)
+{
+ DWORD dwVersion = 0;
+ DWORD dwBuild = 0;
+
+ dwVersion = GetVersion();
+
+ // Get the build number.
+
+ if (dwVersion < 0x80000000)
+ dwBuild = (DWORD)(HIWORD(dwVersion));
+
+ double retValue = 1;
+ if (dwBuild == 7600)
+ {
+ for (int i = 0; i < power; i++)
+ retValue = retValue * 10;
+ }
+ else
+ {
+ errno = 0;
+ retValue = pow((double)base, power);
+ if (errno == ERANGE || retValue == 0)
+ *error = IDS_22_003;
+ }
+
+ return retValue;
+}
+
extern short convDoItMxcs(char * source,
long sourceLen,
short sourceType,
@@ -1277,22 +1307,30 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion,
case SQLTYPECODE_SMALLINT:
dTmp = *((SHORT *)srcDataPtr);
if (srcScale > 0)
- dTmp = dTmp / (long)pow(10,srcScale);
+ dTmp = dTmp / (long)pow(10,srcScale,&retCode);
+ if (retCode == IDS_22_003)
+ return retCode;
break;
case SQLTYPECODE_SMALLINT_UNSIGNED:
dTmp = *((USHORT *)srcDataPtr);
if (srcScale > 0)
- dTmp = dTmp / (long)pow(10,srcScale);
+ dTmp = dTmp / (long)pow(10,srcScale,&retCode);
+ if (retCode == IDS_22_003)
+ return retCode;
break;
case SQLTYPECODE_INTEGER:
dTmp = *((LONG *)srcDataPtr);
if (srcScale > 0)
- dTmp = dTmp / (long)pow(10,srcScale);
+ dTmp = dTmp / (long)pow(10,srcScale,&retCode);
+ if (retCode == IDS_22_003)
+ return retCode;
break;
case SQLTYPECODE_INTEGER_UNSIGNED:
dTmp = *((ULONG *)srcDataPtr);
if (srcScale > 0)
- dTmp = dTmp / (long)pow(10,srcScale);
+ dTmp = dTmp / (long)pow(10,srcScale,&retCode);
+ if (retCode == IDS_22_003)
+ return retCode;
break;
case SQLTYPECODE_LARGEINT:
tempVal64 = *((__int64 *)srcDataPtr);
@@ -2278,7 +2316,9 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion,
if (srcPrecision > 0)
{
// SQL returns fraction of a second which has to be converted to nano seconds
- dTmp = (*(UDWORD*)SQLTimestamp->fraction * 1000000000.0) / pow(10,srcPrecision);
+ dTmp = (*(UDWORD*)SQLTimestamp->fraction * 1000000000.0) / pow(10,srcPrecision,&retCode);
+ if (retCode == IDS_22_003)
+ return retCode;
ulFraction = dTmp;
}
else
@@ -2804,7 +2844,9 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion,
if (srcPrecision > 0)
{
// SQL returns fraction of a second which has to be converted to nano seconds
- dTmp = (*(UDWORD*)SQLTimestamp->fraction * 1000000000.0) / pow(10,srcPrecision);
+ dTmp = (*(UDWORD*)SQLTimestamp->fraction * 1000000000.0) / pow(10,srcPrecision,&retCode);
+ if (retCode == IDS_22_003)
+ return retCode;
ulFraction = dTmp;
}
@@ -3298,22 +3340,30 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion,
case SQLTYPECODE_SMALLINT:
dTmp = *((SHORT *)srcDataPtr);
if (srcScale > 0)
- dTmp = dTmp / (long)pow(10,srcScale);
+ dTmp = dTmp / (long)pow(10,srcScale,&retCode);
+ if (retCode == IDS_22_003)
+ return retCode;
break;
case SQLTYPECODE_SMALLINT_UNSIGNED:
dTmp = *((USHORT *)srcDataPtr);
if (srcScale > 0)
- dTmp = dTmp / (long)pow(10,srcScale);
+ dTmp = dTmp / (long)pow(10,srcScale,&retCode);
+ if (retCode == IDS_22_003)
+ return retCode;
break;
case SQLTYPECODE_INTEGER:
dTmp = *((LONG *)srcDataPtr);
if (srcScale > 0)
- dTmp = dTmp / (long)pow(10,srcScale);
+ dTmp = dTmp / (long)pow(10,srcScale,&retCode);
+ if (retCode == IDS_22_003)
+ return retCode;
break;
case SQLTYPECODE_INTEGER_UNSIGNED:
dTmp = *((ULONG *)srcDataPtr);
if (srcScale > 0)
- dTmp = dTmp / (long)pow(10,srcScale);
+ dTmp = dTmp / (long)pow(10,srcScale,&retCode);
+ if (retCode == IDS_22_003)
+ return retCode;
break;
case SQLTYPECODE_LARGEINT:
tempVal64 = *((__int64 *)srcDataPtr);
@@ -3661,7 +3711,7 @@ unsigned long ODBC::ConvertSQLToC(SQLINTEGER ODBCAppVersion,
SQLRETURN ODBC::ConvertNumericToChar(SQLSMALLINT SQLDataType, SQLPOINTER srcDataPtr, SQLSMALLINT srcScale,
char *cTmpBuf, SQLINTEGER &DecimalPoint)
{
-
+ unsigned long retCode = SQL_SUCCESS;
long lTmp;
ldiv_t lDiv;
__int64 i64Tmp;
@@ -3672,7 +3722,9 @@ SQLRETURN ODBC::ConvertNumericToChar(SQLSMALLINT SQLDataType, SQLPOINTER srcData
lTmp = *((short *)srcDataPtr);
if (srcScale > 0)
{
- lDiv = ldiv(lTmp, (long)pow(10,srcScale));
+ lDiv = ldiv(lTmp, (long)pow(10,srcScale,&retCode));
+ if (retCode == IDS_22_003)
+ return retCode;
if (gDrvrGlobal.gSpecial_1 && lDiv.quot == 0)
{
if (lDiv.rem < 0)
@@ -3695,8 +3747,9 @@ SQLRETURN ODBC::ConvertNumericToChar(SQLSMALLINT SQLDataType, SQLPOINTER srcData
lTmp = *((unsigned short *)srcDataPtr);
if (srcScale > 0)
{
- lDiv = ldiv(lTmp, (long)pow(10,srcScale));
- lDiv = ldiv(lTmp, (long)pow(10,srcScale));
+ lDiv = ldiv(lTmp, (long)pow(10,srcScale,&retCode));
+ if (retCode == IDS_22_003)
+ return retCode;
if (gDrvrGlobal.gSpecial_1 && lDiv.quot == 0)
sprintf(cTmpBuf, ".%0*ld", srcScale, abs(lDiv.rem));
else
@@ -3709,7 +3762,9 @@ SQLRETURN ODBC::ConvertNumericToChar(SQLSMALLINT SQLDataType, SQLPOINTER srcData
lTmp = *((long *)srcDataPtr);
if (srcScale > 0)
{
- lDiv = ldiv(lTmp, (long)pow(10,srcScale));
+ lDiv = ldiv(lTmp, (long)pow(10,srcScale,&retCode));
+ if (retCode == IDS_22_003)
+ return retCode;
if (gDrvrGlobal.gSpecial_1 && lDiv.quot == 0)
{
if (lDiv.rem < 0)
@@ -3779,13 +3834,13 @@ SQLRETURN ODBC::ConvertNumericToChar(SQLSMALLINT SQLDataType, SQLPOINTER srcData
sprintf(cTmpBuf, "%I64d", i64Tmp);
break;
default:
- return SQL_ERROR;
+ retCode = IDS_07_006;
}
if ((tmpPtr = strchr(cTmpBuf, '.')) != NULL)
DecimalPoint = tmpPtr - cTmpBuf;
else
DecimalPoint = 0;
- return SQL_SUCCESS;
+ return retCode;
}
SQLRETURN ODBC::ConvertDecimalToChar(SQLSMALLINT SQLDataType, SQLPOINTER srcDataPtr, SQLINTEGER srcLength,
@@ -3898,6 +3953,7 @@ SQLRETURN ODBC::ConvertDecimalToChar(SQLSMALLINT SQLDataType, SQLPOINTER srcData
SQLRETURN ODBC::ConvertSoftDecimalToDouble(SQLSMALLINT SQLDataType, SQLPOINTER srcDataPtr, SQLINTEGER srcLength,
SQLSMALLINT srcScale, double &dTmp)
{
+ unsigned long retCode = SQL_SUCCESS;
char *stopStr;
char cTmpBuf[256];
double dTmp1;
@@ -3911,7 +3967,9 @@ SQLRETURN ODBC::ConvertSoftDecimalToDouble(SQLSMALLINT SQLDataType, SQLPOINTER s
for (i = 1; i < srcLength ; cTmpBuf[i++] += '0');
cTmpBuf[srcLength] = '\0';
dTmp = strtod(cTmpBuf,&stopStr);
- dTmp1 = pow(10, srcScale);
+ dTmp1 = pow(10, srcScale, &retCode);
+ if (retCode == IDS_22_003)
+ return retCode;
dTmp = dTmp / dTmp1;
break;
case SQLTYPECODE_DECIMAL_LARGE_UNSIGNED:
@@ -3920,13 +3978,15 @@ SQLRETURN ODBC::ConvertSoftDecimalToDouble(SQLSMALLINT SQLDataType, SQLPOINTER s
for (i = 0; i < srcLength ; cTmpBuf[i++] += '0');
cTmpBuf[srcLength] = '\0';
dTmp = strtod(cTmpBuf,&stopStr);
- dTmp1 = pow(10, srcScale);
+ dTmp1 = pow(10, srcScale, &retCode);
+ if (retCode == IDS_22_003)
+ return retCode;
dTmp = dTmp / dTmp1;
break;
default:
- return SQL_ERROR;
+ retCode = IDS_07_006;
}
- return SQL_SUCCESS;
+ return retCode;
}
unsigned long ODBC::ConvertSQLCharToNumeric(SQLPOINTER srcDataPtr, SQLINTEGER srcLength,
@@ -3987,7 +4047,8 @@ unsigned long ODBC::ConvertSQLCharToDate(SQLSMALLINT ODBCDataType,
SQLINTEGER srcLength,
SQLSMALLINT CDataType,
SQLPOINTER outValue)
-{
+{
+ unsigned long retCode = SQL_SUCCESS;
char in_value[50];
short datetime_parts[8];
char *token;
@@ -4058,7 +4119,9 @@ unsigned long ODBC::ConvertSQLCharToDate(SQLSMALLINT ODBCDataType,
if (token != NULL)
{
int exponent = 9 - strlen(token);
- fraction_part = (exponent >= 0)? atol(token) * pow((double)10,exponent):atol(token) / pow((double)10,-exponent) ;
+ fraction_part = (exponent >= 0)? atol(token) * pow((double)10,exponent,&retCode):atol(token) / pow((double)10,-exponent,&retCode);
+ if (retCode == IDS_22_003)
+ return retCode;
datetime_parts[6] = (short)(fraction_part / 1000);
datetime_parts[7] = (short)(fraction_part % 1000);
}
[2/2] trafodion git commit: Merge [TRAFODION-2818] PR 1311 Fix
exception in pow() in ODBC driver
Posted by db...@apache.org.
Merge [TRAFODION-2818] PR 1311 Fix exception in pow() in ODBC driver
Project: http://git-wip-us.apache.org/repos/asf/trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafodion/commit/42c1d207
Tree: http://git-wip-us.apache.org/repos/asf/trafodion/tree/42c1d207
Diff: http://git-wip-us.apache.org/repos/asf/trafodion/diff/42c1d207
Branch: refs/heads/master
Commit: 42c1d20702aa5c190aa1ae4e2fc512b74fb33cb6
Parents: db319b1 d098c30
Author: Dave Birdsall <db...@apache.org>
Authored: Wed Jan 3 21:43:58 2018 +0000
Committer: Dave Birdsall <db...@apache.org>
Committed: Wed Jan 3 21:43:58 2018 +0000
----------------------------------------------------------------------
win-odbc64/odbcclient/drvr35/sqltocconv.cpp | 109 ++++++++++++++++++-----
1 file changed, 86 insertions(+), 23 deletions(-)
----------------------------------------------------------------------