@@ -46,21 +46,27 @@ array_boundary(enum ARRAY_TYPE isarray, char c)
4646
4747/* returns true if some garbage is found at the end of the scanned string */
4848static bool
49- garbage_left (enum ARRAY_TYPE isarray ,char * scan_length ,enum COMPAT_MODE compat )
49+ garbage_left (enum ARRAY_TYPE isarray ,char * * scan_length ,enum COMPAT_MODE compat )
5050{
5151/*
5252 * INFORMIX allows for selecting a numeric into an int, the result is
5353 * truncated
5454 */
5555if (isarray == ECPG_ARRAY_NONE )
5656{
57- if (INFORMIX_MODE (compat )&& * scan_length == '.' )
57+ if (INFORMIX_MODE (compat )&& * * scan_length == '.' )
58+ {
59+ /* skip invalid characters */
60+ do {
61+ (* scan_length )++ ;
62+ }while (* * scan_length != ' ' && * * scan_length != '\0' && isdigit (* * scan_length ));
5863return false;
64+ }
5965
60- if (* scan_length != ' ' && * scan_length != '\0' )
66+ if (* * scan_length != ' ' && * * scan_length != '\0' )
6167return true;
6268}
63- else if (ECPG_IS_ARRAY (isarray )&& !array_delimiter (isarray ,* scan_length )&& !array_boundary (isarray ,* scan_length ))
69+ else if (ECPG_IS_ARRAY (isarray )&& !array_delimiter (isarray ,* * scan_length )&& !array_boundary (isarray ,* * scan_length ))
6470return true;
6571
6672return false;
@@ -304,7 +310,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
304310case ECPGt_int :
305311case ECPGt_long :
306312res = strtol (pval ,& scan_length ,10 );
307- if (garbage_left (isarray ,scan_length ,compat ))
313+ if (garbage_left (isarray ,& scan_length ,compat ))
308314{
309315ecpg_raise (lineno ,ECPG_INT_FORMAT ,
310316ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
@@ -333,7 +339,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
333339case ECPGt_unsigned_int :
334340case ECPGt_unsigned_long :
335341ures = strtoul (pval ,& scan_length ,10 );
336- if (garbage_left (isarray ,scan_length ,compat ))
342+ if (garbage_left (isarray ,& scan_length ,compat ))
337343{
338344ecpg_raise (lineno ,ECPG_UINT_FORMAT ,
339345ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
@@ -362,7 +368,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
362368#ifdef HAVE_STRTOLL
363369case ECPGt_long_long :
364370* ((long longint * ) (var + offset * act_tuple ))= strtoll (pval ,& scan_length ,10 );
365- if (garbage_left (isarray ,scan_length ,compat ))
371+ if (garbage_left (isarray ,& scan_length ,compat ))
366372{
367373ecpg_raise (lineno ,ECPG_INT_FORMAT ,ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
368374return (false);
@@ -374,7 +380,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
374380#ifdef HAVE_STRTOULL
375381case ECPGt_unsigned_long_long :
376382* ((unsigned long longint * ) (var + offset * act_tuple ))= strtoull (pval ,& scan_length ,10 );
377- if (garbage_left (isarray ,scan_length ,compat ))
383+ if (garbage_left (isarray ,& scan_length ,compat ))
378384{
379385ecpg_raise (lineno ,ECPG_UINT_FORMAT ,ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
380386return (false);
@@ -396,7 +402,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
396402if (isarray && * scan_length == '"' )
397403scan_length ++ ;
398404
399- if (garbage_left (isarray ,scan_length ,compat ))
405+ if (garbage_left (isarray ,& scan_length ,compat ))
400406{
401407ecpg_raise (lineno ,ECPG_FLOAT_FORMAT ,
402408ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
@@ -594,7 +600,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
594600}
595601else
596602{
597- if (!isarray && garbage_left (isarray ,scan_length ,compat ))
603+ if (!isarray && garbage_left (isarray ,& scan_length ,compat ))
598604{
599605free (nres );
600606ecpg_raise (lineno ,ECPG_NUMERIC_FORMAT ,
@@ -652,7 +658,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
652658if (* scan_length == '"' )
653659scan_length ++ ;
654660
655- if (!isarray && garbage_left (isarray ,scan_length ,compat ))
661+ if (!isarray && garbage_left (isarray ,& scan_length ,compat ))
656662{
657663free (ires );
658664ecpg_raise (lineno ,ECPG_INTERVAL_FORMAT ,
@@ -702,7 +708,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
702708if (* scan_length == '"' )
703709scan_length ++ ;
704710
705- if (!isarray && garbage_left (isarray ,scan_length ,compat ))
711+ if (!isarray && garbage_left (isarray ,& scan_length ,compat ))
706712{
707713ecpg_raise (lineno ,ECPG_DATE_FORMAT ,
708714ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
@@ -750,7 +756,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
750756if (* scan_length == '"' )
751757scan_length ++ ;
752758
753- if (!isarray && garbage_left (isarray ,scan_length ,compat ))
759+ if (!isarray && garbage_left (isarray ,& scan_length ,compat ))
754760{
755761ecpg_raise (lineno ,ECPG_TIMESTAMP_FORMAT ,
756762ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );