]> granicus.if.org Git - postgresql/blob - src/interfaces/ecpg/test/sql/binary.pgc
ECPG: Add EXEC SQL CLOSE C to the tests.
[postgresql] / src / interfaces / ecpg / test / sql / binary.pgc
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 EXEC SQL include ../regression;
5
6 EXEC SQL BEGIN DECLARE SECTION;
7 struct TBempl
8 {
9   long idnum;
10   char name[21];
11   short accs;
12   char byte[20];
13 };
14 EXEC SQL END DECLARE SECTION;
15
16 int
17 main (void)
18 {
19   EXEC SQL BEGIN DECLARE SECTION;
20   struct TBempl empl;
21   char *pointer = NULL;
22   char *data = "\\001\\155\\000\\212";
23   EXEC SQL END DECLARE SECTION;
24   int i;
25
26   ECPGdebug (1, stderr);
27
28   empl.idnum = 1;
29   EXEC SQL connect to REGRESSDB1;
30   if (sqlca.sqlcode)
31     {
32       printf ("connect error = %ld\n", sqlca.sqlcode);
33       exit (sqlca.sqlcode);
34     }
35
36   EXEC SQL set bytea_output = escape;
37   if (sqlca.sqlcode)
38     {
39       printf ("set bytea_output error = %ld\n", sqlca.sqlcode);
40       exit (sqlca.sqlcode);
41     }
42
43   EXEC SQL create table empl
44     (idnum integer, name char (20), accs smallint, byte bytea);
45   if (sqlca.sqlcode)
46     {
47       printf ("create error = %ld\n", sqlca.sqlcode);
48       exit (sqlca.sqlcode);
49     }
50
51   EXEC SQL insert into empl values (1, 'first user', 320, :data);
52   if (sqlca.sqlcode)
53     {
54       printf ("insert error = %ld\n", sqlca.sqlcode);
55       exit (sqlca.sqlcode);
56     }
57
58   EXEC SQL DECLARE C CURSOR FOR select name, accs, byte from empl where idnum =:empl.idnum;
59   EXEC SQL OPEN C;
60   EXEC SQL FETCH C INTO:empl.name,:empl.accs,:empl.byte;
61   if (sqlca.sqlcode)
62     {
63       printf ("fetch error = %ld\n", sqlca.sqlcode);
64       exit (sqlca.sqlcode);
65     }
66
67   printf ("name=%s, accs=%d byte=%s\n", empl.name, empl.accs, empl.byte);
68
69   EXEC SQL CLOSE C;
70
71   memset(empl.name, 0, 21L);
72   EXEC SQL DECLARE B BINARY CURSOR FOR select name, accs, byte from empl where idnum =:empl.idnum;
73   EXEC SQL OPEN B;
74   EXEC SQL FETCH B INTO :empl.name,:empl.accs,:empl.byte;
75   if (sqlca.sqlcode)
76     {
77       printf ("fetch error = %ld\n", sqlca.sqlcode);
78       exit (sqlca.sqlcode);
79     }
80
81   EXEC SQL CLOSE B;
82
83   /* do not print a.accs because big/little endian will have different outputs here */
84   printf ("name=%s, byte=", empl.name);
85   for (i=0; i<4; i++)
86         printf("(%o)", (unsigned char)empl.byte[i]);
87   printf("\n");
88
89   EXEC SQL DECLARE A BINARY CURSOR FOR select byte from empl where idnum =:empl.idnum;
90   EXEC SQL OPEN A;
91   EXEC SQL FETCH A INTO :pointer;
92   if (sqlca.sqlcode)
93     {
94       printf ("fetch error = %ld\n", sqlca.sqlcode);
95       exit (sqlca.sqlcode);
96     }
97
98   EXEC SQL CLOSE A;
99
100   printf ("pointer=");
101   for (i=0; i<4; i++)
102         printf("(%o)", (unsigned char)pointer[i]);
103   printf("\n");
104   free(pointer);
105
106   EXEC SQL disconnect;
107   exit (0);
108 }