@@ -291,6 +291,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
291291date ddres ;
292292timestamp tres ;
293293interval * ires ;
294+ char * endptr ,endchar ;
294295
295296case ECPGt_short :
296297case ECPGt_int :
@@ -564,10 +565,11 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
564565
565566case ECPGt_decimal :
566567case ECPGt_numeric :
567- if (isarray && * pval == '"' )
568- nres = PGTYPESnumeric_from_asc (pval + 1 ,& scan_length );
569- else
570- nres = PGTYPESnumeric_from_asc (pval ,& scan_length );
568+ for (endptr = pval ;* endptr && * endptr != ',' && * endptr != '}' ;endptr ++ );
569+ endchar = * endptr ;
570+ * endptr = '\0' ;
571+ nres = PGTYPESnumeric_from_asc (pval ,& scan_length );
572+ * endptr = endchar ;
571573
572574/* did we get an error? */
573575if (nres == NULL )
@@ -600,10 +602,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
600602}
601603else
602604{
603- if (isarray && * scan_length == '"' )
604- scan_length ++ ;
605-
606- if (garbage_left (isarray ,scan_length ,compat ))
605+ if (!isarray && garbage_left (isarray ,scan_length ,compat ))
607606{
608607free (nres );
609608ecpg_raise (lineno ,ECPG_NUMERIC_FORMAT ,
@@ -622,10 +621,14 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
622621break ;
623622
624623case ECPGt_interval :
625- if (isarray && * pval == '"' )
626- ires = PGTYPESinterval_from_asc (pval + 1 ,& scan_length );
627- else
628- ires = PGTYPESinterval_from_asc (pval ,& scan_length );
624+ if (* pval == '"' )
625+ pval ++ ;
626+
627+ for (endptr = pval ;* endptr && * endptr != ',' && * endptr != '"' && * endptr != '}' ;endptr ++ );
628+ endchar = * endptr ;
629+ * endptr = '\0' ;
630+ ires = PGTYPESinterval_from_asc (pval ,& scan_length );
631+ * endptr = endchar ;
629632
630633/* did we get an error? */
631634if (ires == NULL )
@@ -654,10 +657,10 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
654657}
655658else
656659{
657- if (isarray && * scan_length == '"' )
660+ if (* scan_length == '"' )
658661scan_length ++ ;
659662
660- if (garbage_left (isarray ,scan_length ,compat ))
663+ if (! isarray && garbage_left (isarray ,scan_length ,compat ))
661664{
662665free (ires );
663666ecpg_raise (lineno ,ECPG_INTERVAL_FORMAT ,
@@ -672,10 +675,14 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
672675break ;
673676
674677case ECPGt_date :
675- if (isarray && * pval == '"' )
676- ddres = PGTYPESdate_from_asc (pval + 1 ,& scan_length );
677- else
678- ddres = PGTYPESdate_from_asc (pval ,& scan_length );
678+ if (* pval == '"' )
679+ pval ++ ;
680+
681+ for (endptr = pval ;* endptr && * endptr != ',' && * endptr != '"' && * endptr != '}' ;endptr ++ );
682+ endchar = * endptr ;
683+ * endptr = '\0' ;
684+ ddres = PGTYPESdate_from_asc (pval ,& scan_length );
685+ * endptr = endchar ;
679686
680687/* did we get an error? */
681688if (errno != 0 )
@@ -700,10 +707,10 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
700707}
701708else
702709{
703- if (isarray && * scan_length == '"' )
710+ if (* scan_length == '"' )
704711scan_length ++ ;
705712
706- if (garbage_left (isarray ,scan_length ,compat ))
713+ if (! isarray && garbage_left (isarray ,scan_length ,compat ))
707714{
708715ecpg_raise (lineno ,ECPG_DATE_FORMAT ,
709716ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );
@@ -716,10 +723,14 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
716723break ;
717724
718725case ECPGt_timestamp :
719- if (isarray && * pval == '"' )
720- tres = PGTYPEStimestamp_from_asc (pval + 1 ,& scan_length );
721- else
722- tres = PGTYPEStimestamp_from_asc (pval ,& scan_length );
726+ if (* pval == '"' )
727+ pval ++ ;
728+
729+ for (endptr = pval ;* endptr && * endptr != ',' && * endptr != '"' && * endptr != '}' ;endptr ++ );
730+ endchar = * endptr ;
731+ * endptr = '\0' ;
732+ tres = PGTYPEStimestamp_from_asc (pval ,& scan_length );
733+ * endptr = endchar ;
723734
724735/* did we get an error? */
725736if (errno != 0 )
@@ -744,10 +755,10 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
744755}
745756else
746757{
747- if (isarray && * scan_length == '"' )
758+ if (* scan_length == '"' )
748759scan_length ++ ;
749760
750- if (garbage_left (isarray ,scan_length ,compat ))
761+ if (! isarray && garbage_left (isarray ,scan_length ,compat ))
751762{
752763ecpg_raise (lineno ,ECPG_TIMESTAMP_FORMAT ,
753764ECPG_SQLSTATE_DATATYPE_MISMATCH ,pval );