Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd64a4d3

Browse files
author
Michael Meskes
committed
Make sure ecpglib does accepts digits behind decimal point even for integers in
Informix mode.Spotted and fixed by 高增琦 <pgf00a@gmail.com>
1 parente06b9e9 commitd64a4d3

File tree

1 file changed

+19
-13
lines changed
  • src/interfaces/ecpg/ecpglib

1 file changed

+19
-13
lines changed

‎src/interfaces/ecpg/ecpglib/data.c

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */
4848
staticbool
49-
garbage_left(enumARRAY_TYPEisarray,char*scan_length,enumCOMPAT_MODEcompat)
49+
garbage_left(enumARRAY_TYPEisarray,char**scan_length,enumCOMPAT_MODEcompat)
5050
{
5151
/*
5252
* INFORMIX allows for selecting a numeric into an int, the result is
5353
* truncated
5454
*/
5555
if (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));
5863
return false;
64+
}
5965

60-
if (*scan_length!=' '&&*scan_length!='\0')
66+
if (**scan_length!=' '&&**scan_length!='\0')
6167
return true;
6268
}
63-
elseif (ECPG_IS_ARRAY(isarray)&& !array_delimiter(isarray,*scan_length)&& !array_boundary(isarray,*scan_length))
69+
elseif (ECPG_IS_ARRAY(isarray)&& !array_delimiter(isarray,**scan_length)&& !array_boundary(isarray,**scan_length))
6470
return true;
6571

6672
return false;
@@ -304,7 +310,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
304310
caseECPGt_int:
305311
caseECPGt_long:
306312
res=strtol(pval,&scan_length,10);
307-
if (garbage_left(isarray,scan_length,compat))
313+
if (garbage_left(isarray,&scan_length,compat))
308314
{
309315
ecpg_raise(lineno,ECPG_INT_FORMAT,
310316
ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);
@@ -333,7 +339,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
333339
caseECPGt_unsigned_int:
334340
caseECPGt_unsigned_long:
335341
ures=strtoul(pval,&scan_length,10);
336-
if (garbage_left(isarray,scan_length,compat))
342+
if (garbage_left(isarray,&scan_length,compat))
337343
{
338344
ecpg_raise(lineno,ECPG_UINT_FORMAT,
339345
ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);
@@ -362,7 +368,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
362368
#ifdefHAVE_STRTOLL
363369
caseECPGt_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
{
367373
ecpg_raise(lineno,ECPG_INT_FORMAT,ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);
368374
return (false);
@@ -374,7 +380,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
374380
#ifdefHAVE_STRTOULL
375381
caseECPGt_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
{
379385
ecpg_raise(lineno,ECPG_UINT_FORMAT,ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);
380386
return (false);
@@ -396,7 +402,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
396402
if (isarray&&*scan_length=='"')
397403
scan_length++;
398404

399-
if (garbage_left(isarray,scan_length,compat))
405+
if (garbage_left(isarray,&scan_length,compat))
400406
{
401407
ecpg_raise(lineno,ECPG_FLOAT_FORMAT,
402408
ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);
@@ -594,7 +600,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
594600
}
595601
else
596602
{
597-
if (!isarray&&garbage_left(isarray,scan_length,compat))
603+
if (!isarray&&garbage_left(isarray,&scan_length,compat))
598604
{
599605
free(nres);
600606
ecpg_raise(lineno,ECPG_NUMERIC_FORMAT,
@@ -652,7 +658,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
652658
if (*scan_length=='"')
653659
scan_length++;
654660

655-
if (!isarray&&garbage_left(isarray,scan_length,compat))
661+
if (!isarray&&garbage_left(isarray,&scan_length,compat))
656662
{
657663
free(ires);
658664
ecpg_raise(lineno,ECPG_INTERVAL_FORMAT,
@@ -702,7 +708,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
702708
if (*scan_length=='"')
703709
scan_length++;
704710

705-
if (!isarray&&garbage_left(isarray,scan_length,compat))
711+
if (!isarray&&garbage_left(isarray,&scan_length,compat))
706712
{
707713
ecpg_raise(lineno,ECPG_DATE_FORMAT,
708714
ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);
@@ -750,7 +756,7 @@ ecpg_get_data(const PGresult *results, int act_tuple, int act_field, int lineno,
750756
if (*scan_length=='"')
751757
scan_length++;
752758

753-
if (!isarray&&garbage_left(isarray,scan_length,compat))
759+
if (!isarray&&garbage_left(isarray,&scan_length,compat))
754760
{
755761
ecpg_raise(lineno,ECPG_TIMESTAMP_FORMAT,
756762
ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp