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

Commit8775831

Browse files
author
Michael Meskes
committed
Made sure an internal array is not treated as a user defined one.
1 parent449593a commit8775831

File tree

4 files changed

+172
-118
lines changed

4 files changed

+172
-118
lines changed

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

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.20 2003/09/20 09:10:09 meskes Exp $ */
1+
/* $Header: /cvsroot/pgsql/src/interfaces/ecpg/ecpglib/data.c,v 1.21 2003/11/08 19:46:27 meskes Exp $ */
22

33
#definePOSTGRES_ECPG_INTERNAL
44
#include"postgres_fe.h"
@@ -16,21 +16,39 @@
1616
#include"pgtypes_timestamp.h"
1717
#include"pgtypes_interval.h"
1818

19+
staticboolgarbage_left(enumARRAY_TYPEisarray,char*scan_length,enumCOMPAT_MODEcompat)
20+
{
21+
/* INFORMIX allows for selecting a numeric into an int, the result is truncated */
22+
if (isarray==ECPG_ARRAY_NONE&&INFORMIX_MODE(compat)&&*scan_length=='.')
23+
return false;
24+
25+
if (isarray==ECPG_ARRAY_ARRAY&&*scan_length!=','&&*scan_length!='}')
26+
return true;
27+
28+
if (isarray==ECPG_ARRAY_VECTOR&&*scan_length!=' '&&*scan_length!='\0')
29+
return true;
30+
31+
if (isarray==ECPG_ARRAY_NONE&&*scan_length!=' '&&*scan_length!='\0')
32+
return true;
33+
34+
return false;
35+
}
36+
1937
bool
2038
ECPGget_data(constPGresult*results,intact_tuple,intact_field,intlineno,
2139
enumECPGttypetype,enumECPGttypeind_type,
2240
char*var,char*ind,longvarcharsize,longoffset,
23-
longind_offset,boolisarray,enumCOMPAT_MODEcompat,boolforce_indicator)
41+
longind_offset,enumARRAY_TYPEisarray,enumCOMPAT_MODEcompat,boolforce_indicator)
2442
{
2543
structsqlca_t*sqlca=ECPGget_sqlca();
2644
char*pval= (char*)PQgetvalue(results,act_tuple,act_field);
2745
intvalue_for_indicator=0;
2846

29-
ECPGlog("ECPGget_data line %d: RESULT: %s offset: %ld\n",lineno,pval ?pval :"",offset);
47+
ECPGlog("ECPGget_data line %d: RESULT: %s offset: %ld array: %d\n",lineno,pval ?pval :"",offset,isarray);
3048

3149
/* pval is a pointer to the value */
32-
/* let's checkis it really is an array if it should be one */
33-
if (isarray)
50+
/* let's checkif it really is an array if it should be one */
51+
if (isarray==ECPG_ARRAY_ARRAY)
3452
{
3553
if (*pval!='{')
3654
{
@@ -126,9 +144,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
126144
if (pval)
127145
{
128146
res=strtol(pval,&scan_length,10);
129-
/* INFORMIX allows for selecting a numeric into an int, the result is truncated */
130-
if ((isarray&&*scan_length!=','&&*scan_length!='}')
131-
|| (!isarray&& !(INFORMIX_MODE(compat)&&*scan_length=='.')&&*scan_length!='\0'&&*scan_length!=' '))/* Garbage left */
147+
if (garbage_left(isarray,scan_length,compat))
132148
{
133149
ECPGraise(lineno,ECPG_INT_FORMAT,ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);
134150
return (false);
@@ -160,8 +176,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
160176
if (pval)
161177
{
162178
ures=strtoul(pval,&scan_length,10);
163-
if ((isarray&&*scan_length!=','&&*scan_length!='}')
164-
|| (!isarray&& !(INFORMIX_MODE(compat)&&*scan_length=='.')&&*scan_length!='\0'&&*scan_length!=' '))/* Garbage left */
179+
if (garbage_left(isarray,scan_length,compat))
165180
{
166181
ECPGraise(lineno,ECPG_UINT_FORMAT,ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);
167182
return (false);
@@ -193,8 +208,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
193208
if (pval)
194209
{
195210
*((long longint*) (var+offset*act_tuple))=strtoll(pval,&scan_length,10);
196-
if ((isarray&&*scan_length!=','&&*scan_length!='}')
197-
|| (!isarray&& !(INFORMIX_MODE(compat)&&*scan_length=='.')&&*scan_length!='\0'&&*scan_length!=' '))/* Garbage left */
211+
if (garbage_left(isarray,scan_length,compat))
198212
{
199213
ECPGraise(lineno,ECPG_INT_FORMAT,ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);
200214
return (false);
@@ -236,8 +250,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
236250
if (isarray&&*scan_length=='"')
237251
scan_length++;
238252

239-
if ((isarray&&*scan_length!=','&&*scan_length!='}')
240-
|| (!isarray&&*scan_length!='\0'&&*scan_length!=' '))/* Garbage left */
253+
if (garbage_left(isarray,scan_length,compat))
241254
{
242255
ECPGraise(lineno,ECPG_FLOAT_FORMAT,ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);
243256
return (false);
@@ -411,8 +424,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
411424
if (isarray&&*scan_length=='"')
412425
scan_length++;
413426

414-
if ((isarray&&*scan_length!=','&&*scan_length!='}')
415-
|| (!isarray&&*scan_length!='\0'&&*scan_length!=' '))/* Garbage left */
427+
if (garbage_left(isarray,scan_length,compat))
416428
{
417429
ECPGraise(lineno,ECPG_NUMERIC_FORMAT,ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);
418430
return (false);
@@ -455,8 +467,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
455467
if (isarray&&*scan_length=='"')
456468
scan_length++;
457469

458-
if ((isarray&&*scan_length!=','&&*scan_length!='}')
459-
|| (!isarray&&*scan_length!='\0'&&*scan_length!=' '))/* Garbage left */
470+
if (garbage_left(isarray,scan_length,compat))
460471
{
461472
ECPGraise(lineno,ECPG_INTERVAL_FORMAT,ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);
462473
return (false);
@@ -495,8 +506,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
495506
if (isarray&&*scan_length=='"')
496507
scan_length++;
497508

498-
if ((isarray&&*scan_length!=','&&*scan_length!='}')
499-
|| (!isarray&&*scan_length!='\0'&&*scan_length!=' '))/* Garbage left */
509+
if (garbage_left(isarray,scan_length,compat))
500510
{
501511
ECPGraise(lineno,ECPG_DATE_FORMAT,ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);
502512
return (false);
@@ -534,8 +544,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
534544
if (isarray&&*scan_length=='"')
535545
scan_length++;
536546

537-
if ((isarray&&*scan_length!=','&&*scan_length!='}')
538-
|| (!isarray&&*scan_length!='\0'&&*scan_length!=' '))/* Garbage left */
547+
if (garbage_left(isarray,scan_length,compat))
539548
{
540549
ECPGraise(lineno,ECPG_TIMESTAMP_FORMAT,ECPG_SQLSTATE_DATATYPE_MISMATCH,pval);
541550
return (false);
@@ -551,7 +560,7 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
551560
return (false);
552561
break;
553562
}
554-
if (isarray)
563+
if (isarray==ECPG_ARRAY_ARRAY)
555564
{
556565
boolstring= false;
557566

@@ -566,7 +575,22 @@ ECPGget_data(const PGresult *results, int act_tuple, int act_field, int lineno,
566575
if (*pval==',')
567576
++pval;
568577
}
569-
}while (isarray&&*pval!='}');
578+
elseif (isarray==ECPG_ARRAY_VECTOR)
579+
{
580+
boolstring= false;
581+
582+
/* set array to next entry */
583+
++act_tuple;
584+
585+
/* set pval to the next entry */
586+
for (;string|| (*pval!=' '&&*pval!='\0');++pval)
587+
if (*pval=='"')
588+
string=string ? false : true;
589+
590+
if (*pval==' ')
591+
++pval;
592+
}
593+
}while ((isarray==ECPG_ARRAY_ARRAY&&*pval!='}')|| (isarray==ECPG_ARRAY_VECTOR&&*pval!='\0'));
570594

571595
return (true);
572596
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp