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

Commit2d3c691

Browse files
author
Michael Meskes
committed
Fixed auto allocation for binary data types.
1 parent77ca045 commit2d3c691

File tree

6 files changed

+157
-85
lines changed

6 files changed

+157
-85
lines changed

‎src/interfaces/ecpg/ChangeLog

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2409,6 +2409,7 @@ Wed, 17 Dec 2008 17:49:11 +0100
24092409
Mon, 02 Feb 2009 16:34:53 +0100
24102410

24112411
- Fixed bug in handling of "%s" pattern in PGTYPEStimestamp_defmt_asc().
2412+
- Fixed auto allocation for binary data types.
24122413
- Set pgtypes library version to 3.1.
24132414
- Set compat library version to 3.1.
24142415
- Set ecpg library version to 6.2.

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

Lines changed: 34 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.79 2009/01/15 11:52:55 petere Exp $ */
1+
/* $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/execute.c,v 1.80 2009/02/02 16:14:06 meskes Exp $ */
22

33
/*
44
* The aim is to get a simpler inteface to the database routines.
@@ -353,40 +353,45 @@ ecpg_store_result(const PGresult *results, int act_field,
353353
{
354354
intlen=0;
355355

356-
switch (var->type)
356+
if (!PQfformat(results,act_field))
357357
{
358-
caseECPGt_char:
359-
caseECPGt_unsigned_char:
360-
if (!var->varcharsize&& !var->arrsize)
361-
{
362-
/* special mode for handling char**foo=0 */
363-
for (act_tuple=0;act_tuple<ntuples;act_tuple++)
364-
len+=strlen(PQgetvalue(results,act_tuple,act_field))+1;
365-
len *=var->offset;/* should be 1, but YMNK */
366-
len+= (ntuples+1)*sizeof(char*);
367-
}
368-
else
369-
{
370-
var->varcharsize=0;
371-
/* check strlen for each tuple */
372-
for (act_tuple=0;act_tuple<ntuples;act_tuple++)
358+
switch (var->type)
359+
{
360+
caseECPGt_char:
361+
caseECPGt_unsigned_char:
362+
if (!var->varcharsize&& !var->arrsize)
363+
{
364+
/* special mode for handling char**foo=0 */
365+
for (act_tuple=0;act_tuple<ntuples;act_tuple++)
366+
len+=strlen(PQgetvalue(results,act_tuple,act_field))+1;
367+
len *=var->offset;/* should be 1, but YMNK */
368+
len+= (ntuples+1)*sizeof(char*);
369+
}
370+
else
373371
{
374-
intlen=strlen(PQgetvalue(results,act_tuple,act_field))+1;
372+
var->varcharsize=0;
373+
/* check strlen for each tuple */
374+
for (act_tuple=0;act_tuple<ntuples;act_tuple++)
375+
{
376+
intlen=strlen(PQgetvalue(results,act_tuple,act_field))+1;
375377

376-
if (len>var->varcharsize)
377-
var->varcharsize=len;
378+
if (len>var->varcharsize)
379+
var->varcharsize=len;
380+
}
381+
var->offset *=var->varcharsize;
382+
len=var->offset*ntuples;
378383
}
379-
var->offset *=var->varcharsize;
384+
break;
385+
caseECPGt_varchar:
386+
len=ntuples* (var->varcharsize+sizeof(int));
387+
break;
388+
default:
380389
len=var->offset*ntuples;
381-
}
382-
break;
383-
caseECPGt_varchar:
384-
len=ntuples* (var->varcharsize+sizeof(int));
385-
break;
386-
default:
387-
len=var->offset*ntuples;
388-
break;
390+
break;
391+
}
389392
}
393+
else
394+
len=PQgetlength(results,act_tuple,act_field);
390395
ecpg_log("ecpg_store_result on line %d: allocating memory for %d tuples\n",stmt->lineno,ntuples);
391396
var->value= (char*)ecpg_alloc(len,stmt->lineno);
392397
if (!var->value)

‎src/interfaces/ecpg/test/expected/sql-binary.c

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,26 @@ main (void)
5151
/* exec sql begin declare section */
5252

5353

54+
5455

5556
#line 20 "binary.pgc"
5657
structTBemplempl ;
5758

5859
#line 21 "binary.pgc"
60+
char*pointer=NULL ;
61+
62+
#line 22 "binary.pgc"
5963
char*data="\\001\\155\\000\\212" ;
6064
/* exec sql end declare section */
61-
#line22 "binary.pgc"
65+
#line23 "binary.pgc"
6266

6367
inti;
6468

6569
ECPGdebug (1,stderr);
6670

6771
empl.idnum=1;
6872
{ECPGconnect(__LINE__,0,"regress1" ,NULL,NULL ,NULL,0); }
69-
#line28 "binary.pgc"
73+
#line29 "binary.pgc"
7074

7175
if (sqlca.sqlcode)
7276
{
@@ -75,7 +79,7 @@ main (void)
7579
}
7680

7781
{ECPGdo(__LINE__,0,1,NULL,0,ECPGst_normal,"create table empl ( idnum integer , name char ( 20 ) , accs smallint , byte bytea )",ECPGt_EOIT,ECPGt_EORT);}
78-
#line36 "binary.pgc"
82+
#line37 "binary.pgc"
7983

8084
if (sqlca.sqlcode)
8185
{
@@ -86,7 +90,7 @@ main (void)
8690
{ECPGdo(__LINE__,0,1,NULL,0,ECPGst_normal,"insert into empl values ( 1 , 'first user' , 320 , $1 )",
8791
ECPGt_char,&(data),(long)0,(long)1,(1)*sizeof(char),
8892
ECPGt_NO_INDICATOR,NULL ,0L,0L,0L,ECPGt_EOIT,ECPGt_EORT);}
89-
#line43 "binary.pgc"
93+
#line44 "binary.pgc"
9094

9195
if (sqlca.sqlcode)
9296
{
@@ -95,12 +99,12 @@ main (void)
9599
}
96100

97101
/* declare C cursor for select name , accs , byte from empl where idnum = $1 */
98-
#line50 "binary.pgc"
102+
#line51 "binary.pgc"
99103

100104
{ECPGdo(__LINE__,0,1,NULL,0,ECPGst_normal,"declare C cursor for select name , accs , byte from empl where idnum = $1 ",
101105
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
102106
ECPGt_NO_INDICATOR,NULL ,0L,0L,0L,ECPGt_EOIT,ECPGt_EORT);}
103-
#line51 "binary.pgc"
107+
#line52 "binary.pgc"
104108

105109
{ECPGdo(__LINE__,0,1,NULL,0,ECPGst_normal,"fetch C",ECPGt_EOIT,
106110
ECPGt_char,(empl.name),(long)21,(long)1,(21)*sizeof(char),
@@ -109,7 +113,7 @@ main (void)
109113
ECPGt_NO_INDICATOR,NULL ,0L,0L,0L,
110114
ECPGt_char,(empl.byte),(long)20,(long)1,(20)*sizeof(char),
111115
ECPGt_NO_INDICATOR,NULL ,0L,0L,0L,ECPGt_EORT);}
112-
#line52 "binary.pgc"
116+
#line53 "binary.pgc"
113117

114118
if (sqlca.sqlcode)
115119
{
@@ -119,15 +123,13 @@ main (void)
119123

120124
printf ("name=%s, accs=%d byte=%s\n",empl.name,empl.accs,empl.byte);
121125

122-
memset(empl.name,0,21L);
123-
memset(empl.byte,'#',20L);
124126
/* declare B binary cursor for select name , accs , byte from empl where idnum = $1 */
125-
#line63 "binary.pgc"
127+
#line62 "binary.pgc"
126128

127129
{ECPGdo(__LINE__,0,1,NULL,0,ECPGst_normal,"declare B binary cursor for select name , accs , byte from empl where idnum = $1 ",
128130
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
129131
ECPGt_NO_INDICATOR,NULL ,0L,0L,0L,ECPGt_EOIT,ECPGt_EORT);}
130-
#line64 "binary.pgc"
132+
#line63 "binary.pgc"
131133

132134
{ECPGdo(__LINE__,0,1,NULL,0,ECPGst_normal,"fetch B",ECPGt_EOIT,
133135
ECPGt_char,(empl.name),(long)21,(long)1,(21)*sizeof(char),
@@ -136,7 +138,7 @@ main (void)
136138
ECPGt_NO_INDICATOR,NULL ,0L,0L,0L,
137139
ECPGt_char,(empl.byte),(long)20,(long)1,(20)*sizeof(char),
138140
ECPGt_NO_INDICATOR,NULL ,0L,0L,0L,ECPGt_EORT);}
139-
#line65 "binary.pgc"
141+
#line64 "binary.pgc"
140142

141143
if (sqlca.sqlcode)
142144
{
@@ -145,20 +147,46 @@ main (void)
145147
}
146148

147149
{ECPGdo(__LINE__,0,1,NULL,0,ECPGst_normal,"close B",ECPGt_EOIT,ECPGt_EORT);}
148-
#line72 "binary.pgc"
150+
#line71 "binary.pgc"
149151

150152

151153
/* do not print a.accs because big/little endian will have different outputs here */
152154
printf ("name=%s, byte=",empl.name);
153-
for (i=0;i<20;i++)
154-
{
155-
if (empl.byte[i]=='#')
156-
break;
155+
for (i=0;i<4;i++)
157156
printf("(%o)", (unsignedchar)empl.byte[i]);
158-
}
159157
printf("\n");
158+
159+
/* declare A binary cursor for select byte from empl where idnum = $1 */
160+
#line 79 "binary.pgc"
161+
162+
{ECPGdo(__LINE__,0,1,NULL,0,ECPGst_normal,"declare A binary cursor for select byte from empl where idnum = $1 ",
163+
ECPGt_long,&(empl.idnum),(long)1,(long)1,sizeof(long),
164+
ECPGt_NO_INDICATOR,NULL ,0L,0L,0L,ECPGt_EOIT,ECPGt_EORT);}
165+
#line 80 "binary.pgc"
166+
167+
{ECPGdo(__LINE__,0,1,NULL,0,ECPGst_normal,"fetch A",ECPGt_EOIT,
168+
ECPGt_char,&(pointer),(long)0,(long)1,(1)*sizeof(char),
169+
ECPGt_NO_INDICATOR,NULL ,0L,0L,0L,ECPGt_EORT);}
170+
#line 81 "binary.pgc"
171+
172+
if (sqlca.sqlcode)
173+
{
174+
printf ("fetch error = %ld\n",sqlca.sqlcode);
175+
exit (sqlca.sqlcode);
176+
}
177+
178+
{ECPGdo(__LINE__,0,1,NULL,0,ECPGst_normal,"close A",ECPGt_EOIT,ECPGt_EORT);}
179+
#line 88 "binary.pgc"
180+
181+
182+
printf ("pointer=");
183+
for (i=0;i<4;i++)
184+
printf("(%o)", (unsignedchar)pointer[i]);
185+
printf("\n");
186+
free(pointer);
187+
160188
{ECPGdisconnect(__LINE__,"CURRENT");}
161-
#line83 "binary.pgc"
189+
#line96 "binary.pgc"
162190

163191
exit (0);
164192
}

‎src/interfaces/ecpg/test/expected/sql-binary.stderr

Lines changed: 54 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,65 +2,89 @@
22
[NO_PID]: sqlca: code: 0, state: 00000
33
[NO_PID]: ECPGconnect: opening database regress1 on <DEFAULT> port <DEFAULT>
44
[NO_PID]: sqlca: code: 0, state: 00000
5-
[NO_PID]: ecpg_execute on line35: query: create table empl ( idnum integer , name char ( 20 ) , accs smallint , byte bytea ); with 0 parameter(s) on connection regress1
5+
[NO_PID]: ecpg_execute on line36: query: create table empl ( idnum integer , name char ( 20 ) , accs smallint , byte bytea ); with 0 parameter(s) on connection regress1
66
[NO_PID]: sqlca: code: 0, state: 00000
7-
[NO_PID]: ecpg_execute on line35: using PQexec
7+
[NO_PID]: ecpg_execute on line36: using PQexec
88
[NO_PID]: sqlca: code: 0, state: 00000
9-
[NO_PID]: ecpg_execute on line35: OK: CREATE TABLE
9+
[NO_PID]: ecpg_execute on line36: OK: CREATE TABLE
1010
[NO_PID]: sqlca: code: 0, state: 00000
11-
[NO_PID]: ecpg_execute on line43: query: insert into empl values ( 1 , 'first user' , 320 , $1 ); with 1 parameter(s) on connection regress1
11+
[NO_PID]: ecpg_execute on line44: query: insert into empl values ( 1 , 'first user' , 320 , $1 ); with 1 parameter(s) on connection regress1
1212
[NO_PID]: sqlca: code: 0, state: 00000
13-
[NO_PID]: ecpg_execute on line43: using PQexecParams
13+
[NO_PID]: ecpg_execute on line44: using PQexecParams
1414
[NO_PID]: sqlca: code: 0, state: 00000
15-
[NO_PID]: free_params on line43: parameter 1 = \001\155\000\212
15+
[NO_PID]: free_params on line44: parameter 1 = \001\155\000\212
1616
[NO_PID]: sqlca: code: 0, state: 00000
17-
[NO_PID]: ecpg_execute on line43: OK: INSERT 0 1
17+
[NO_PID]: ecpg_execute on line44: OK: INSERT 0 1
1818
[NO_PID]: sqlca: code: 0, state: 00000
19-
[NO_PID]: ecpg_execute on line51: query: declare C cursor for select name , accs , byte from empl where idnum = $1 ; with 1 parameter(s) on connection regress1
19+
[NO_PID]: ecpg_execute on line52: query: declare C cursor for select name , accs , byte from empl where idnum = $1 ; with 1 parameter(s) on connection regress1
2020
[NO_PID]: sqlca: code: 0, state: 00000
21-
[NO_PID]: ecpg_execute on line51: using PQexecParams
21+
[NO_PID]: ecpg_execute on line52: using PQexecParams
2222
[NO_PID]: sqlca: code: 0, state: 00000
23-
[NO_PID]: free_params on line51: parameter 1 = 1
23+
[NO_PID]: free_params on line52: parameter 1 = 1
2424
[NO_PID]: sqlca: code: 0, state: 00000
25-
[NO_PID]: ecpg_execute on line51: OK: DECLARE CURSOR
25+
[NO_PID]: ecpg_execute on line52: OK: DECLARE CURSOR
2626
[NO_PID]: sqlca: code: 0, state: 00000
27-
[NO_PID]: ecpg_execute on line52: query: fetch C; with 0 parameter(s) on connection regress1
27+
[NO_PID]: ecpg_execute on line53: query: fetch C; with 0 parameter(s) on connection regress1
2828
[NO_PID]: sqlca: code: 0, state: 00000
29-
[NO_PID]: ecpg_execute on line52: using PQexec
29+
[NO_PID]: ecpg_execute on line53: using PQexec
3030
[NO_PID]: sqlca: code: 0, state: 00000
31-
[NO_PID]: ecpg_execute on line52: correctly got 1 tuples with 3 fields
31+
[NO_PID]: ecpg_execute on line53: correctly got 1 tuples with 3 fields
3232
[NO_PID]: sqlca: code: 0, state: 00000
33-
[NO_PID]: ecpg_get_data on line52: RESULT: first user offset: -1; array: yes
33+
[NO_PID]: ecpg_get_data on line53: RESULT: first user offset: -1; array: yes
3434
[NO_PID]: sqlca: code: 0, state: 00000
35-
[NO_PID]: ecpg_get_data on line52: RESULT: 320 offset: -1; array: yes
35+
[NO_PID]: ecpg_get_data on line53: RESULT: 320 offset: -1; array: yes
3636
[NO_PID]: sqlca: code: 0, state: 00000
37-
[NO_PID]: ecpg_get_data on line52: RESULT: \001m\000\212 offset: -1; array: yes
37+
[NO_PID]: ecpg_get_data on line53: RESULT: \001m\000\212 offset: -1; array: yes
3838
[NO_PID]: sqlca: code: 0, state: 00000
39-
[NO_PID]: ecpg_execute on line64: query: declare B binary cursor for select name , accs , byte from empl where idnum = $1 ; with 1 parameter(s) on connection regress1
39+
[NO_PID]: ecpg_execute on line63: query: declare B binary cursor for select name , accs , byte from empl where idnum = $1 ; with 1 parameter(s) on connection regress1
4040
[NO_PID]: sqlca: code: 0, state: 00000
41-
[NO_PID]: ecpg_execute on line64: using PQexecParams
41+
[NO_PID]: ecpg_execute on line63: using PQexecParams
4242
[NO_PID]: sqlca: code: 0, state: 00000
43-
[NO_PID]: free_params on line64: parameter 1 = 1
43+
[NO_PID]: free_params on line63: parameter 1 = 1
4444
[NO_PID]: sqlca: code: 0, state: 00000
45-
[NO_PID]: ecpg_execute on line64: OK: DECLARE CURSOR
45+
[NO_PID]: ecpg_execute on line63: OK: DECLARE CURSOR
4646
[NO_PID]: sqlca: code: 0, state: 00000
47-
[NO_PID]: ecpg_execute on line65: query: fetch B; with 0 parameter(s) on connection regress1
47+
[NO_PID]: ecpg_execute on line64: query: fetch B; with 0 parameter(s) on connection regress1
4848
[NO_PID]: sqlca: code: 0, state: 00000
49-
[NO_PID]: ecpg_execute on line65: using PQexec
49+
[NO_PID]: ecpg_execute on line64: using PQexec
5050
[NO_PID]: sqlca: code: 0, state: 00000
51-
[NO_PID]: ecpg_execute on line65: correctly got 1 tuples with 3 fields
51+
[NO_PID]: ecpg_execute on line64: correctly got 1 tuples with 3 fields
5252
[NO_PID]: sqlca: code: 0, state: 00000
53-
[NO_PID]: ecpg_get_data on line65: RESULT: BINARY offset: -1; array: yes
53+
[NO_PID]: ecpg_get_data on line64: RESULT: BINARY offset: -1; array: yes
5454
[NO_PID]: sqlca: code: 0, state: 00000
55-
[NO_PID]: ecpg_get_data on line65: RESULT: BINARY offset: -1; array: yes
55+
[NO_PID]: ecpg_get_data on line64: RESULT: BINARY offset: -1; array: yes
5656
[NO_PID]: sqlca: code: 0, state: 00000
57-
[NO_PID]: ecpg_get_data on line65: RESULT: BINARY offset: -1; array: yes
57+
[NO_PID]: ecpg_get_data on line64: RESULT: BINARY offset: -1; array: yes
5858
[NO_PID]: sqlca: code: 0, state: 00000
59-
[NO_PID]: ecpg_execute on line72: query: close B; with 0 parameter(s) on connection regress1
59+
[NO_PID]: ecpg_execute on line71: query: close B; with 0 parameter(s) on connection regress1
6060
[NO_PID]: sqlca: code: 0, state: 00000
61-
[NO_PID]: ecpg_execute on line72: using PQexec
61+
[NO_PID]: ecpg_execute on line71: using PQexec
6262
[NO_PID]: sqlca: code: 0, state: 00000
63-
[NO_PID]: ecpg_execute on line 72: OK: CLOSE CURSOR
63+
[NO_PID]: ecpg_execute on line 71: OK: CLOSE CURSOR
64+
[NO_PID]: sqlca: code: 0, state: 00000
65+
[NO_PID]: ecpg_execute on line 80: query: declare A binary cursor for select byte from empl where idnum = $1 ; with 1 parameter(s) on connection regress1
66+
[NO_PID]: sqlca: code: 0, state: 00000
67+
[NO_PID]: ecpg_execute on line 80: using PQexecParams
68+
[NO_PID]: sqlca: code: 0, state: 00000
69+
[NO_PID]: free_params on line 80: parameter 1 = 1
70+
[NO_PID]: sqlca: code: 0, state: 00000
71+
[NO_PID]: ecpg_execute on line 80: OK: DECLARE CURSOR
72+
[NO_PID]: sqlca: code: 0, state: 00000
73+
[NO_PID]: ecpg_execute on line 81: query: fetch A; with 0 parameter(s) on connection regress1
74+
[NO_PID]: sqlca: code: 0, state: 00000
75+
[NO_PID]: ecpg_execute on line 81: using PQexec
76+
[NO_PID]: sqlca: code: 0, state: 00000
77+
[NO_PID]: ecpg_execute on line 81: correctly got 1 tuples with 1 fields
78+
[NO_PID]: sqlca: code: 0, state: 00000
79+
[NO_PID]: ecpg_store_result on line 81: allocating memory for 1 tuples
80+
[NO_PID]: sqlca: code: 0, state: 00000
81+
[NO_PID]: ecpg_get_data on line 81: RESULT: BINARY offset: -1; array: yes
82+
[NO_PID]: sqlca: code: 0, state: 00000
83+
[NO_PID]: ecpg_execute on line 88: query: close A; with 0 parameter(s) on connection regress1
84+
[NO_PID]: sqlca: code: 0, state: 00000
85+
[NO_PID]: ecpg_execute on line 88: using PQexec
86+
[NO_PID]: sqlca: code: 0, state: 00000
87+
[NO_PID]: ecpg_execute on line 88: OK: CLOSE CURSOR
6488
[NO_PID]: sqlca: code: 0, state: 00000
6589
[NO_PID]: ecpg_finish: connection regress1 closed
6690
[NO_PID]: sqlca: code: 0, state: 00000
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
name=first user , accs=320 byte=\001m\000\212
22
name=first user , byte=(1)(155)(0)(212)
3+
pointer=(1)(155)(0)(212)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp