1- /* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.24 2004/06/27 12:28:39 meskes Exp $ */
1+ /* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.25 2004/06/28 11:47:41 meskes Exp $ */
22
33#define POSTGRES_ECPG_INTERNAL
44#include "postgres_fe.h"
@@ -152,6 +152,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
152152ECPGraise (lineno ,ECPG_INT_FORMAT ,ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
153153return (false);
154154}
155+ pval = scan_length ;
155156}
156157else
157158res = 0L ;
@@ -184,6 +185,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
184185ECPGraise (lineno ,ECPG_UINT_FORMAT ,ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
185186return (false);
186187}
188+ pval = scan_length ;
187189}
188190else
189191ures = 0L ;
@@ -216,6 +218,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
216218ECPGraise (lineno ,ECPG_INT_FORMAT ,ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
217219return (false);
218220}
221+ pval = scan_length ;
219222}
220223else
221224* ((long longint * ) (var + offset * act_tuple ))= (long long )0 ;
@@ -233,6 +236,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
233236ECPGraise (lineno ,ECPG_UINT_FORMAT ,ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
234237return (false);
235238}
239+ pval = scan_length ;
236240}
237241else
238242* ((unsigned long longint * ) (var + offset * act_tuple ))= (long long )0 ;
@@ -258,6 +262,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
258262ECPGraise (lineno ,ECPG_FLOAT_FORMAT ,ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
259263return (false);
260264}
265+ pval = scan_length ;
261266}
262267else
263268dres = 0.0 ;
@@ -312,8 +317,9 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
312317
313318case ECPGt_char :
314319case ECPGt_unsigned_char :
320+ if (pval )
315321{
316- if (varcharsize == 0 )
322+ if (varcharsize == 0 || varcharsize > strlen ( pval ) )
317323strncpy ((char * ) ((long )var + offset * act_tuple ),pval ,strlen (pval )+ 1 );
318324else
319325{
@@ -348,10 +354,12 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
348354sqlca -> sqlwarn [0 ]= sqlca -> sqlwarn [1 ]= 'W' ;
349355}
350356}
357+ pval += strlen (pval );
351358}
352359break ;
353360
354361case ECPGt_varchar :
362+ if (pval )
355363{
356364struct ECPGgeneric_varchar * variable =
357365(struct ECPGgeneric_varchar * ) ((long )var + offset * act_tuple );
@@ -394,6 +402,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
394402variable -> len = varcharsize ;
395403}
396404}
405+ pval += strlen (pval );
397406}
398407break ;
399408
@@ -433,6 +442,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
433442return (false);
434443}
435444}
445+ pval = scan_length ;
436446}
437447else
438448nres = PGTYPESnumeric_from_asc ("0.0" ,& scan_length );
@@ -476,6 +486,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
476486return (false);
477487}
478488}
489+ pval = scan_length ;
479490}
480491else
481492ires = PGTYPESinterval_from_asc ("0 seconds" ,NULL );
@@ -517,6 +528,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
517528}
518529
519530* ((date * ) (var + offset * act_tuple ))= ddres ;
531+ pval = scan_length ;
520532}
521533break ;
522534
@@ -555,6 +567,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
555567}
556568
557569* ((timestamp * ) (var + offset * act_tuple ))= tres ;
570+ pval = scan_length ;
558571}
559572break ;
560573
@@ -571,7 +584,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
571584++ act_tuple ;
572585
573586/* set pval to the next entry */
574- for (;string || (* pval != ',' && * pval != '}' );++ pval )
587+ for (;string || (* pval != ',' && * pval != '}' && * pval != '\0' );++ pval )
575588if (* pval == '"' )
576589string = string ? false : true;
577590
@@ -593,7 +606,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
593606if (* pval == ' ' )
594607++ pval ;
595608}
596- }while (( isarray == ECPG_ARRAY_ARRAY && * pval != '}' )|| ( isarray == ECPG_ARRAY_VECTOR && * pval != '\0' ));
609+ }while (* pval != '\0' && (( isarray == ECPG_ARRAY_ARRAY && * pval != '}' )|| isarray == ECPG_ARRAY_VECTOR ));
597610
598611return (true);
599612}