@@ -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 );
114114 if (!PQgetisnull (res , row , i ))
115115 {
116116 char * val = PQgetvalue (res , row , i );
@@ -119,7 +119,8 @@ sqlda_common_total_size(const PGresult *res, int row, enum COMPAT_MODE compat, l
119119 num = PGTYPESnumeric_from_asc (val , NULL );
120120 if (!num )
121121 break ;
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 );
123124 PGTYPESnumeric_free (num );
124125 }
125126 break ;
@@ -323,7 +324,7 @@ ecpg_set_compat_sqlda(int lineno, struct sqlda_compat ** _sqlda, const PGresult
323324
324325 set_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 );
327328 sqlda -> sqlvar [i ].sqldata = (char * ) sqlda + offset ;
328329 sqlda -> sqlvar [i ].sqllen = sizeof (numeric );
329330
@@ -343,11 +344,14 @@ ecpg_set_compat_sqlda(int lineno, struct sqlda_compat ** _sqlda, const PGresult
343344
344345 memcpy (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
352356 PGTYPESnumeric_free (num );
353357
@@ -509,7 +513,7 @@ ecpg_set_native_sqlda(int lineno, struct sqlda_struct ** _sqlda, const PGresult
509513
510514 set_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 );
513517 sqlda -> sqlvar [i ].sqldata = (char * ) sqlda + offset ;
514518 sqlda -> sqlvar [i ].sqllen = sizeof (numeric );
515519
@@ -529,11 +533,14 @@ ecpg_set_native_sqlda(int lineno, struct sqlda_struct ** _sqlda, const PGresult
529533
530534 memcpy (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
538545 PGTYPESnumeric_free (num );
539546
0 commit comments