@@ -110,7 +110,7 @@ sqlda_common_total_size(const PGresult *res, int row, enum COMPAT_MODE compat, l
110110 * int Unfortunately we need to do double work here to compute
111111 * the size of the space needed for the numeric structure.
112112 */
113- ecpg_sqlda_align_add_size (offset ,sizeof (int ),sizeof (numeric ),& offset ,& next_offset );
113+ ecpg_sqlda_align_add_size (offset ,sizeof (NumericDigit * ),sizeof (numeric ),& offset ,& next_offset );
114114if (!PQgetisnull (res ,row ,i ))
115115{
116116char * val = PQgetvalue (res ,row ,i );
@@ -119,7 +119,8 @@ sqlda_common_total_size(const PGresult *res, int row, enum COMPAT_MODE compat, l
119119num = PGTYPESnumeric_from_asc (val ,NULL );
120120if (!num )
121121break ;
122- ecpg_sqlda_align_add_size (next_offset ,sizeof (int ),num -> ndigits + 1 ,& offset ,& next_offset );
122+ if (num -> ndigits )
123+ ecpg_sqlda_align_add_size (next_offset ,sizeof (int ),num -> ndigits + 1 ,& offset ,& next_offset );
123124PGTYPESnumeric_free (num );
124125}
125126break ;
@@ -323,7 +324,7 @@ ecpg_set_compat_sqlda(int lineno, struct sqlda_compat ** _sqlda, const PGresult
323324
324325set_data = false;
325326
326- ecpg_sqlda_align_add_size (offset ,sizeof (int ),sizeof (numeric ),& offset ,& next_offset );
327+ ecpg_sqlda_align_add_size (offset ,sizeof (NumericDigit * ),sizeof (numeric ),& offset ,& next_offset );
327328sqlda -> sqlvar [i ].sqldata = (char * )sqlda + offset ;
328329sqlda -> sqlvar [i ].sqllen = sizeof (numeric );
329330
@@ -343,11 +344,14 @@ ecpg_set_compat_sqlda(int lineno, struct sqlda_compat ** _sqlda, const PGresult
343344
344345memcpy (sqlda -> sqlvar [i ].sqldata ,num ,sizeof (numeric ));
345346
346- ecpg_sqlda_align_add_size (next_offset ,sizeof (int ),num -> ndigits + 1 ,& offset ,& next_offset );
347- memcpy ((char * )sqlda + offset ,num -> buf ,num -> ndigits + 1 );
347+ if (num -> ndigits )
348+ {
349+ ecpg_sqlda_align_add_size (next_offset ,sizeof (int ),num -> ndigits + 1 ,& offset ,& next_offset );
350+ memcpy ((char * )sqlda + offset ,num -> buf ,num -> ndigits + 1 );
348351
349- ((numeric * )sqlda -> sqlvar [i ].sqldata )-> buf = (NumericDigit * )sqlda + offset ;
350- ((numeric * )sqlda -> sqlvar [i ].sqldata )-> digits = (NumericDigit * )sqlda + offset + (num -> digits - num -> buf );
352+ ((numeric * )sqlda -> sqlvar [i ].sqldata )-> buf = (NumericDigit * )sqlda + offset ;
353+ ((numeric * )sqlda -> sqlvar [i ].sqldata )-> digits = (NumericDigit * )sqlda + offset + (num -> digits - num -> buf );
354+ }
351355
352356PGTYPESnumeric_free (num );
353357
@@ -509,7 +513,7 @@ ecpg_set_native_sqlda(int lineno, struct sqlda_struct ** _sqlda, const PGresult
509513
510514set_data = false;
511515
512- ecpg_sqlda_align_add_size (offset ,sizeof (int ),sizeof (numeric ),& offset ,& next_offset );
516+ ecpg_sqlda_align_add_size (offset ,sizeof (NumericDigit * ),sizeof (numeric ),& offset ,& next_offset );
513517sqlda -> sqlvar [i ].sqldata = (char * )sqlda + offset ;
514518sqlda -> sqlvar [i ].sqllen = sizeof (numeric );
515519
@@ -529,11 +533,14 @@ ecpg_set_native_sqlda(int lineno, struct sqlda_struct ** _sqlda, const PGresult
529533
530534memcpy (sqlda -> sqlvar [i ].sqldata ,num ,sizeof (numeric ));
531535
532- ecpg_sqlda_align_add_size (next_offset ,sizeof (int ),num -> ndigits + 1 ,& offset ,& next_offset );
533- memcpy ((char * )sqlda + offset ,num -> buf ,num -> ndigits + 1 );
536+ if (num -> ndigits )
537+ {
538+ ecpg_sqlda_align_add_size (next_offset ,sizeof (int ),num -> ndigits + 1 ,& offset ,& next_offset );
539+ memcpy ((char * )sqlda + offset ,num -> buf ,num -> ndigits + 1 );
534540
535- ((numeric * )sqlda -> sqlvar [i ].sqldata )-> buf = (NumericDigit * )sqlda + offset ;
536- ((numeric * )sqlda -> sqlvar [i ].sqldata )-> digits = (NumericDigit * )sqlda + offset + (num -> digits - num -> buf );
541+ ((numeric * )sqlda -> sqlvar [i ].sqldata )-> buf = (NumericDigit * )sqlda + offset ;
542+ ((numeric * )sqlda -> sqlvar [i ].sqldata )-> digits = (NumericDigit * )sqlda + offset + (num -> digits - num -> buf );
543+ }
537544
538545PGTYPESnumeric_free (num );
539546