1111int
1212decadd (Numeric * arg1 ,Numeric * arg2 ,Numeric * sum )
1313{
14- int i = PGTYPESnumeric_add (arg1 ,arg2 ,sum );
14+ Numeric * temp_sum = malloc (sizeof (Numeric )) ;
15+ int i ;
16+
17+ if (temp_sum == NULL )
18+ return -1211 ;
19+
20+ i = PGTYPESnumeric_add (arg1 ,arg2 ,temp_sum );
1521
1622if (i == 0 )/* No error */
23+ {
24+
25+ if (PGTYPESnumeric_copy (temp_sum ,sum )!= 0 )
26+ return -1211 ;
27+
28+ free (temp_sum );
1729return 0 ;
18- if (errno == PGTYPES_NUM_OVERFLOW )
19- return -1200 ;
30+ }
31+ else
32+ {
33+ free (temp_sum );
34+
35+ if (errno == PGTYPES_NUM_OVERFLOW )
36+ return -1200 ;
37+ }
2038
2139return -1201 ;
2240}
@@ -26,7 +44,6 @@ deccmp(Numeric *arg1, Numeric *arg2)
2644{
2745int i = PGTYPESnumeric_cmp (arg1 ,arg2 );
2846
29- /* TODO: Need to return DECUNKNOWN instead of PGTYPES_NUM_BAD_NUMERIC */
3047return (i );
3148}
3249
@@ -46,7 +63,7 @@ strndup(char *str, int len)
4663
4764if (new )
4865{
49- memcpy (str , new ,use_len );
66+ memcpy (new , str ,use_len );
5067new [use_len ]= '\0' ;
5168}
5269else
@@ -60,13 +77,14 @@ deccvasc(char *cp, int len, Numeric *np)
6077{
6178char * str = strndup (cp ,len );/* Numeric_in always converts the complete string */
6279int ret = 0 ;
80+ Numeric * result ;
6381
6482if (!str )
6583ret = -1201 ;
6684else
6785{
68- np = PGTYPESnumeric_from_asc (str ,NULL );
69- if (!np )
86+ result = PGTYPESnumeric_from_asc (str ,NULL );
87+ if (!result )
7088{
7189switch (errno )
7290{
@@ -78,6 +96,13 @@ deccvasc(char *cp, int len, Numeric *np)
7896break ;
7997}
8098}
99+ else
100+ {
101+ if (PGTYPESnumeric_copy (result ,np )!= 0 )
102+ ret = -1211 ;
103+
104+ free (result );
105+ }
81106}
82107
83108return ret ;
@@ -104,7 +129,13 @@ deccvlong(long lng, Numeric *np)
104129int
105130decdiv (Numeric * n1 ,Numeric * n2 ,Numeric * n3 )
106131{
107- int i = PGTYPESnumeric_div (n1 ,n2 ,n3 ),ret = 0 ;
132+ Numeric * temp = malloc (sizeof (Numeric ));
133+ int i ,ret = 0 ;
134+
135+ if (temp == NULL )
136+ return -1211 ;
137+
138+ i = PGTYPESnumeric_div (n1 ,n2 ,temp );
108139
109140if (i != 0 )
110141switch (errno )
@@ -116,14 +147,24 @@ decdiv(Numeric *n1, Numeric *n2, Numeric *n3)
116147default :ret = -1201 ;
117148break ;
118149}
119-
150+ else
151+ if (PGTYPESnumeric_copy (temp ,n3 )!= 0 )
152+ ret = -1211 ;
153+
154+ free (temp );
120155return ret ;
121156}
122157
123158int
124159decmul (Numeric * n1 ,Numeric * n2 ,Numeric * n3 )
125160{
126- int i = PGTYPESnumeric_mul (n1 ,n2 ,n3 ),ret = 0 ;
161+ Numeric * temp = malloc (sizeof (Numeric ));
162+ int i ,ret = 0 ;
163+
164+ if (temp == NULL )
165+ return -1211 ;
166+
167+ i = PGTYPESnumeric_mul (n1 ,n2 ,temp );
127168
128169if (i != 0 )
129170switch (errno )
@@ -133,14 +174,25 @@ decmul(Numeric *n1, Numeric *n2, Numeric *n3)
133174default :ret = -1201 ;
134175break ;
135176}
177+ else
178+ if (PGTYPESnumeric_copy (temp ,n3 )!= 0 )
179+ ret = -1211 ;
180+
181+ free (temp );
136182
137183return ret ;
138184}
139185
140186int
141187decsub (Numeric * n1 ,Numeric * n2 ,Numeric * n3 )
142188{
143- int i = PGTYPESnumeric_sub (n1 ,n2 ,n3 ),ret = 0 ;
189+ Numeric * temp = malloc (sizeof (Numeric ));
190+ int i ,ret = 0 ;
191+
192+ if (temp == NULL )
193+ return -1211 ;
194+
195+ i = PGTYPESnumeric_sub (n1 ,n2 ,temp );
144196
145197if (i != 0 )
146198switch (errno )
@@ -150,6 +202,11 @@ decsub(Numeric *n1, Numeric *n2, Numeric *n3)
150202default :ret = -1201 ;
151203break ;
152204}
205+ else
206+ if (PGTYPESnumeric_copy (temp ,n3 )!= 0 )
207+ ret = -1211 ;
208+
209+ free (temp );
153210
154211return ret ;
155212}