diff --git a/src/interfaces/ecpg/compatlib/informix.c b/src/interfaces/ecpg/compatlib/informix.c
index fe12da7b0d58a5062f4df5b4dfbf2752835ab228..cacc1609c1773c3bd29435cd3094745acc4f5d04 100644
--- a/src/interfaces/ecpg/compatlib/informix.c
+++ b/src/interfaces/ecpg/compatlib/informix.c
@@ -11,12 +11,30 @@
 int
 decadd(Numeric *arg1, Numeric *arg2, Numeric *sum)
 {
-	int i = PGTYPESnumeric_add(arg1, arg2, sum);
+	Numeric *temp_sum = malloc(sizeof(Numeric)) ;
+	int i;
+	
+	if (temp_sum == NULL)
+		return -1211;
+	
+	i = PGTYPESnumeric_add(arg1, arg2, temp_sum);
 
 	if (i == 0) /* No error */
+	{
+
+		if (PGTYPESnumeric_copy(temp_sum, sum) !=0)
+			return -1211;
+
+		free(temp_sum);
 		return 0;
-	if (errno == PGTYPES_NUM_OVERFLOW)
-		return -1200;
+	}
+	else
+	{
+		free(temp_sum);
+		
+		if (errno == PGTYPES_NUM_OVERFLOW)
+			return -1200;
+	}
 
 	return -1201;	
 }
@@ -26,7 +44,6 @@ deccmp(Numeric *arg1, Numeric *arg2)
 {
 	int i = PGTYPESnumeric_cmp(arg1, arg2);
 	
-	/* TODO: Need to return DECUNKNOWN instead of PGTYPES_NUM_BAD_NUMERIC */
 	return (i);
 }
 
@@ -46,7 +63,7 @@ strndup(char *str, int len)
 
 	if (new)
 	{
-		memcpy(str, new, use_len);
+		memcpy(new, str, use_len);
 		new[use_len] = '\0';
 	}
 	else
@@ -60,13 +77,14 @@ deccvasc(char *cp, int len, Numeric *np)
 {
 	char *str = strndup(cp, len); /* Numeric_in always converts the complete string */
 	int ret = 0;
+	Numeric *result;
 	
 	if (!str)
 		ret = -1201;
 	else
 	{
-		np = PGTYPESnumeric_from_asc(str, NULL);
-		if (!np)
+		result = PGTYPESnumeric_from_asc(str, NULL);
+		if (!result)
 		{
 			switch (errno)
 			{
@@ -78,6 +96,13 @@ deccvasc(char *cp, int len, Numeric *np)
 							  break;
 			}
 		}
+		else
+		{
+			if (PGTYPESnumeric_copy(result, np) !=0)
+				ret = -1211;
+
+			free(result);
+		}
 	}
 	
 	return ret;
@@ -104,7 +129,13 @@ deccvlong(long lng, Numeric *np)
 int
 decdiv(Numeric *n1, Numeric *n2, Numeric *n3)
 {
-	int i = PGTYPESnumeric_div(n1, n2, n3), ret = 0;
+	Numeric *temp = malloc(sizeof(Numeric));
+	int i, ret = 0;
+
+	if (temp == NULL)
+		return -1211;
+	
+	i = PGTYPESnumeric_div(n1, n2, temp);
 
 	if (i != 0)
 		switch (errno)
@@ -116,14 +147,24 @@ decdiv(Numeric *n1, Numeric *n2, Numeric *n3)
 			default:		  ret = -1201;
 						  break;
 		}
-
+	else
+		if (PGTYPESnumeric_copy(temp, n3) !=0)
+			ret = -1211;
+		
+	free(temp);
 	return ret;
 }
 
 int 
 decmul(Numeric *n1, Numeric *n2, Numeric *n3)
 {
-	int i = PGTYPESnumeric_mul(n1, n2, n3), ret = 0;
+	Numeric *temp = malloc(sizeof(Numeric));
+	int i, ret = 0;
+	
+	if (temp == NULL)
+		return -1211;
+	
+	i = PGTYPESnumeric_mul(n1, n2, temp);
 
 	if (i != 0)
 		switch (errno)
@@ -133,6 +174,11 @@ decmul(Numeric *n1, Numeric *n2, Numeric *n3)
 			default:		  ret = -1201;
 						  break;
 		}
+	else
+		if (PGTYPESnumeric_copy(temp, n3) !=0)
+			ret = -1211;
+		
+	free(temp);
 
 	return ret;
 }
@@ -140,7 +186,13 @@ decmul(Numeric *n1, Numeric *n2, Numeric *n3)
 int
 decsub(Numeric *n1, Numeric *n2, Numeric *n3)
 {
-	int i = PGTYPESnumeric_sub(n1, n2, n3), ret = 0;
+	Numeric *temp = malloc(sizeof(Numeric));
+	int i, ret = 0;
+	
+	if (temp == NULL)
+		return -1211;
+	
+	i = PGTYPESnumeric_sub(n1, n2, temp);
 
 	if (i != 0)
 		switch (errno)
@@ -150,6 +202,11 @@ decsub(Numeric *n1, Numeric *n2, Numeric *n3)
 			default:		  ret = -1201;
 						  break;
 		}
+	else
+		if (PGTYPESnumeric_copy(temp, n3) !=0)
+			ret = -1211;
+		
+	free(temp);
 
 	return ret;
 }