@@ -44,21 +44,27 @@ array_boundary(enum ARRAY_TYPE isarray, char c)
4444
4545/* returns true if some garbage is found at the end of the scanned string */
4646static bool
47- garbage_left (enum ARRAY_TYPE isarray ,char * scan_length ,enum COMPAT_MODE compat )
47+ garbage_left (enum ARRAY_TYPE isarray ,char * * scan_length ,enum COMPAT_MODE compat )
4848{
4949/*
5050 * INFORMIX allows for selecting a numeric into an int, the result is
5151 * truncated
5252 */
5353if (isarray == ECPG_ARRAY_NONE )
5454{
55- if (INFORMIX_MODE (compat )&& * scan_length == '.' )
55+ if (INFORMIX_MODE (compat )&& * * scan_length == '.' )
56+ {
57+ /* skip invalid characters */
58+ do {
59+ (* scan_length )++ ;
60+ }while (* * scan_length != ' ' && * * scan_length != '\0' && isdigit (* * scan_length ));
5661return false;
62+ }
5763
58- if (* scan_length != ' ' && * scan_length != '\0' )
64+ if (* * scan_length != ' ' && * * scan_length != '\0' )
5965return true;
6066}
61- else if (ECPG_IS_ARRAY (isarray )&& !array_delimiter (isarray ,* scan_length )&& !array_boundary (isarray ,* scan_length ))
67+ else if (ECPG_IS_ARRAY (isarray )&& !array_delimiter (isarray ,* * scan_length )&& !array_boundary (isarray ,* * scan_length ))
6268return true;
6369
6470return false;
@@ -303,7 +309,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
303309case ECPGt_int :
304310case ECPGt_long :
305311res = strtol (pval ,& scan_length ,10 );
306- if (garbage_left (isarray ,scan_length ,compat ))
312+ if (garbage_left (isarray ,& scan_length ,compat ))
307313{
308314ecpg_raise (lineno ,ECPG_INT_FORMAT ,
309315ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
@@ -332,7 +338,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
332338case ECPGt_unsigned_int :
333339case ECPGt_unsigned_long :
334340ures = strtoul (pval ,& scan_length ,10 );
335- if (garbage_left (isarray ,scan_length ,compat ))
341+ if (garbage_left (isarray ,& scan_length ,compat ))
336342{
337343ecpg_raise (lineno ,ECPG_UINT_FORMAT ,
338344ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
@@ -361,7 +367,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
361367#ifdef HAVE_STRTOLL
362368case ECPGt_long_long :
363369* ((long longint * ) (var + offset * act_tuple ))= strtoll (pval ,& scan_length ,10 );
364- if (garbage_left (isarray ,scan_length ,compat ))
370+ if (garbage_left (isarray ,& scan_length ,compat ))
365371{
366372ecpg_raise (lineno ,ECPG_INT_FORMAT ,ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
367373return false;
@@ -373,7 +379,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
373379#ifdef HAVE_STRTOULL
374380case ECPGt_unsigned_long_long :
375381* ((unsigned long longint * ) (var + offset * act_tuple ))= strtoull (pval ,& scan_length ,10 );
376- if (garbage_left (isarray ,scan_length ,compat ))
382+ if (garbage_left (isarray ,& scan_length ,compat ))
377383{
378384ecpg_raise (lineno ,ECPG_UINT_FORMAT ,ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
379385return false;
@@ -395,7 +401,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
395401if (isarray && * scan_length == '"' )
396402scan_length ++ ;
397403
398- if (garbage_left (isarray ,scan_length ,compat ))
404+ if (garbage_left (isarray ,& scan_length ,compat ))
399405{
400406ecpg_raise (lineno ,ECPG_FLOAT_FORMAT ,
401407ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
@@ -593,7 +599,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
593599}
594600else
595601{
596- if (!isarray && garbage_left (isarray ,scan_length ,compat ))
602+ if (!isarray && garbage_left (isarray ,& scan_length ,compat ))
597603{
598604free (nres );
599605ecpg_raise (lineno ,ECPG_NUMERIC_FORMAT ,
@@ -651,7 +657,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
651657if (* scan_length == '"' )
652658scan_length ++ ;
653659
654- if (!isarray && garbage_left (isarray ,scan_length ,compat ))
660+ if (!isarray && garbage_left (isarray ,& scan_length ,compat ))
655661{
656662free (ires );
657663ecpg_raise (lineno ,ECPG_INTERVAL_FORMAT ,
@@ -701,7 +707,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
701707if (* scan_length == '"' )
702708scan_length ++ ;
703709
704- if (!isarray && garbage_left (isarray ,scan_length ,compat ))
710+ if (!isarray && garbage_left (isarray ,& scan_length ,compat ))
705711{
706712ecpg_raise (lineno ,ECPG_DATE_FORMAT ,
707713ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
@@ -749,7 +755,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
749755if (* scan_length == '"' )
750756scan_length ++ ;
751757
752- if (!isarray && garbage_left (isarray ,scan_length ,compat ))
758+ if (!isarray && garbage_left (isarray ,& scan_length ,compat ))
753759{
754760ecpg_raise (lineno ,ECPG_TIMESTAMP_FORMAT ,
755761ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );