@@ -291,6 +291,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
291
291
date ddres ;
292
292
timestamp tres ;
293
293
interval * ires ;
294
+ char * endptr , endchar ;
294
295
295
296
case ECPGt_short :
296
297
case ECPGt_int :
@@ -564,10 +565,11 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
564
565
565
566
case ECPGt_decimal :
566
567
case 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 ;
571
573
572
574
/* did we get an error? */
573
575
if (nres == NULL )
@@ -600,10 +602,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
600
602
}
601
603
else
602
604
{
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 ))
607
606
{
608
607
free (nres );
609
608
ecpg_raise (lineno , ECPG_NUMERIC_FORMAT ,
@@ -622,10 +621,14 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
622
621
break ;
623
622
624
623
case 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 ;
629
632
630
633
/* did we get an error? */
631
634
if (ires == NULL )
@@ -654,10 +657,10 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
654
657
}
655
658
else
656
659
{
657
- if (isarray && * scan_length == '"' )
660
+ if (* scan_length == '"' )
658
661
scan_length ++ ;
659
662
660
- if (garbage_left (isarray , scan_length , compat ))
663
+ if (! isarray && garbage_left (isarray , scan_length , compat ))
661
664
{
662
665
free (ires );
663
666
ecpg_raise (lineno , ECPG_INTERVAL_FORMAT ,
@@ -672,10 +675,14 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
672
675
break ;
673
676
674
677
case 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 ;
679
686
680
687
/* did we get an error? */
681
688
if (errno != 0 )
@@ -700,10 +707,10 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
700
707
}
701
708
else
702
709
{
703
- if (isarray && * scan_length == '"' )
710
+ if (* scan_length == '"' )
704
711
scan_length ++ ;
705
712
706
- if (garbage_left (isarray , scan_length , compat ))
713
+ if (! isarray && garbage_left (isarray , scan_length , compat ))
707
714
{
708
715
ecpg_raise (lineno , ECPG_DATE_FORMAT ,
709
716
ECPG_SQLSTATE_DATATYPE_MISMATCH , pval );
@@ -716,10 +723,14 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
716
723
break ;
717
724
718
725
case 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 ;
723
734
724
735
/* did we get an error? */
725
736
if (errno != 0 )
@@ -744,10 +755,10 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
744
755
}
745
756
else
746
757
{
747
- if (isarray && * scan_length == '"' )
758
+ if (* scan_length == '"' )
748
759
scan_length ++ ;
749
760
750
- if (garbage_left (isarray , scan_length , compat ))
761
+ if (! isarray && garbage_left (isarray , scan_length , compat ))
751
762
{
752
763
ecpg_raise (lineno , ECPG_TIMESTAMP_FORMAT ,
753
764
ECPG_SQLSTATE_DATATYPE_MISMATCH , pval );
0 commit comments