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 2017/12/13 22:03:15 UTC

[1/2] incubator-trafodion git commit: fix TRAFODIION-2828

Repository: incubator-trafodion
Updated Branches:
  refs/heads/master 0f838633f -> 4dfe27eba


fix TRAFODIION-2828


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/e89217ec
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/e89217ec
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/e89217ec

Branch: refs/heads/master
Commit: e89217ece4e3969b3c7da30adcdd4958d3fd2f98
Parents: ad9f4ef
Author: SuJinpei <87...@qq.com>
Authored: Tue Dec 5 16:04:29 2017 +0800
Committer: SuJinpei <87...@qq.com>
Committed: Tue Dec 5 16:04:29 2017 +0800

----------------------------------------------------------------------
 .../odbc/odbcclient/unixcli/cli/drvrglobal.cpp  | 112 +++++++------------
 .../odbc/odbcclient/unixcli/cli/drvrglobal.h    |   3 +
 2 files changed, 42 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/e89217ec/core/conn/unixodbc/odbc/odbcclient/unixcli/cli/drvrglobal.cpp
----------------------------------------------------------------------
diff --git a/core/conn/unixodbc/odbc/odbcclient/unixcli/cli/drvrglobal.cpp b/core/conn/unixodbc/odbc/odbcclient/unixcli/cli/drvrglobal.cpp
index 975d66b..90fd4f3 100644
--- a/core/conn/unixodbc/odbc/odbcclient/unixcli/cli/drvrglobal.cpp
+++ b/core/conn/unixodbc/odbc/odbcclient/unixcli/cli/drvrglobal.cpp
@@ -917,79 +917,45 @@ bool use_gcvt(double number, char* string, short size)
 
 bool double_to_char (double number, int precision, char* string, short size)
 {
-	char *buffer,*temp ;
-	bool rc = true;
-
-	int	decimal_spot,
-		sign,
-		count,
-		current_location = 0,
-		length;
-
-	*string = 0;
-
-	temp = fcvt (number, precision, &decimal_spot, &sign) ;
-	length = strlen(temp);
-	if (length == 0)
-	{
-		return use_gcvt(number,string,size);
-	}
-	if (length > precision)
-		buffer = (char *) malloc (length + 3) ;
-	else
-		buffer = (char *) malloc (precision + 3) ;
-
-	if (buffer == NULL)
-		return false;
-
-/* Add negative sign if required. */ 
-
-	if (sign)
-		buffer [current_location++] = '-' ;
-
-/* Place decimal point in the correct location. */ 
-
-	if (decimal_spot > 0)
-	{
-		strncpy (&buffer [current_location], temp, decimal_spot) ;
-		buffer [decimal_spot + current_location] = '.' ;
-		strcpy (&buffer [decimal_spot + current_location + 1],
-					&temp [decimal_spot]) ;
-	}
-	else
-	{
-		buffer [current_location] = '.' ;
-		for(count = current_location;
-			count< abs(decimal_spot)+current_location; count++)
-			buffer [count + 1] = '0' ;
-		strcpy (&buffer [count + 1], temp) ;
-	}
-
-	rSup(buffer);
-	length = strlen(buffer);
-	if (buffer[0] == '.' || (buffer[0] == '-' && buffer[1] == '.')) length++;
-
-	if (length>size)
-		rc = use_gcvt(number,string,size);
-	else
-	{
-		if (buffer[0] == '.')
-		{
-			strcpy( string, "0");
-			strcat( string, buffer);
-		}
-		else if (buffer[0] == '-' && buffer[1] == '.')
-		{
-			strcpy( string, "-0");
-			strcat( string, &buffer[1]);
-		}
-
-		else
-			strcpy( string, buffer);
-	}
-
-	free (buffer);
-	return rc;
+    bool rc = false;
+    char format[16] = { '\0' };
+    size_t actualLen = 0;
+
+    // make sure any precision of possible double value can be format to the buf. 
+        char buf[MAX_DOUBLE_TO_CHAR_LEN] = { '\0' };
+
+    // precision should less than size
+    precision = precision < size ? precision : size - 1;
+
+    // precission should be limit to a reasonable range.
+    if ((precision < 0) || (precision >(DBL_MANT_DIG - DBL_MIN_EXP))) {
+        goto fun_exit;
+    }
+
+    // we want to return reasonable value even when caller didn't provide sufficiently buffer. 
+    // here using loop because actualLen may increase even precision decrease when fix-point
+    // notation to exponential notation. for example:
+    // for double d = 12345678.9, the caller only provide size=8.
+    // d will first convert to "1.234568e+07", actualLen == 12. then convert to "1.2e+07".
+    do {
+        if (sprintf(format, "%%.%dlg", precision) < 0) {
+            goto fun_exit;
+        }
+        if ((actualLen = sprintf(buf, format, number)) < 0) {
+            goto fun_exit;
+        }
+        if (size > actualLen) {
+            strcpy(string, buf);
+            rc = true;
+            break;
+        }
+        else {
+            precision -= (actualLen - size + 1);
+        }
+    } while ((precision >= 0));
+
+fun_exit:
+    return rc;
 } 
 
 bool ctoi64(char* string, __int64& out, bool* truncation)

http://git-wip-us.apache.org/repos/asf/incubator-trafodion/blob/e89217ec/core/conn/unixodbc/odbc/odbcclient/unixcli/cli/drvrglobal.h
----------------------------------------------------------------------
diff --git a/core/conn/unixodbc/odbc/odbcclient/unixcli/cli/drvrglobal.h b/core/conn/unixodbc/odbc/odbcclient/unixcli/cli/drvrglobal.h
index c082a46..395dfd6 100644
--- a/core/conn/unixodbc/odbc/odbcclient/unixcli/cli/drvrglobal.h
+++ b/core/conn/unixodbc/odbc/odbcclient/unixcli/cli/drvrglobal.h
@@ -36,6 +36,7 @@
 #include "transportbase.h"
 #include "hpsqlext.h"
 #include <charsetconv.h>
+#include "float.h"
 
 typedef int (*FPSQLGetPrivateProfileString) (
 	LPCSTR section,
@@ -107,6 +108,8 @@ typedef int (*FPSQLGetPrivateProfileString) (
 #define	SQLERRWARN 1
 #define	ESTIMATEDCOSTRGERRWARN	2
 
+#define MAX_DOUBLE_TO_CHAR_LEN (DBL_MANT_DIG - DBL_MIN_EXP + 12)
+
 typedef enum TRANSPORT_TYPE
 {
 	TR_UNKNOWN = 0,


[2/2] incubator-trafodion git commit: Merge [TRAFODION-2828] PR 1323 Fix multi-threaded batch loading crash

Posted by db...@apache.org.
Merge [TRAFODION-2828] PR 1323 Fix multi-threaded batch loading crash


Project: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/commit/4dfe27eb
Tree: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/tree/4dfe27eb
Diff: http://git-wip-us.apache.org/repos/asf/incubator-trafodion/diff/4dfe27eb

Branch: refs/heads/master
Commit: 4dfe27eba05e2ac57e97dbd32c78ce1ce35041bc
Parents: 0f83863 e89217e
Author: Dave Birdsall <db...@apache.org>
Authored: Wed Dec 13 22:02:39 2017 +0000
Committer: Dave Birdsall <db...@apache.org>
Committed: Wed Dec 13 22:02:39 2017 +0000

----------------------------------------------------------------------
 .../odbc/odbcclient/unixcli/cli/drvrglobal.cpp  | 112 +++++++------------
 .../odbc/odbcclient/unixcli/cli/drvrglobal.h    |   3 +
 2 files changed, 42 insertions(+), 73 deletions(-)
----------------------------------------------------------------------