]> granicus.if.org Git - postgresql/blob - src/interfaces/ecpg/test/test1.pgc
Fixed parser to accept initializing expressions starting with "(".
[postgresql] / src / interfaces / ecpg / test / test1.pgc
1 #include <string.h>
2
3 exec sql include sqlca;
4
5 /* just a test comment */ exec sql whenever sqlerror do PrintAndStop(msg);
6 exec sql whenever sqlwarning do warn();
7
8 static void PrintAndStop(char *msg)
9 {
10         fprintf(stderr, "Error in statement '%s':\n", msg);
11         sqlprint();
12         exit(-1);
13 }
14
15 static void warn(void)
16 {
17         fprintf(stderr, "Warning: At least one column was truncated\n");
18 }
19
20 /* comment */
21 exec sql define AMOUNT 6;
22
23 exec sql type intarray is int[AMOUNT];
24 exec sql type string is char(8); 
25
26 typedef int intarray[AMOUNT];
27
28 int
29 main ()
30 {
31 exec sql begin declare section;
32         intarray amount;
33         int increment=100;
34         char name[AMOUNT][8];
35         char letter[AMOUNT][1];
36         struct name_letter_struct
37         {
38                 char name[8];
39                 int amount;
40                 char letter;
41         } name_letter[AMOUNT];
42         struct ind_struct
43         {
44                 short a;
45                 short b;
46                 short c;
47         } ind[AMOUNT];
48         char command[128];
49         char *connection="pm";
50 exec sql end declare section;
51         exec sql var name is string(AMOUNT);
52         char msg[128];
53         FILE *dbgs;
54         int i,j;
55
56         if ((dbgs = fopen("log", "w")) != NULL)
57                 ECPGdebug(1, dbgs);
58
59         strcpy(msg, "connect");
60         exec sql connect to mm as main;
61
62         strcpy(msg, "connect");
63         exec sql connect to pm;
64
65         strcpy(msg, "create");
66         exec sql at main create table "Test" (name char(8), amount int, letter char(1));
67         exec sql create table "Test" (name char(8), amount int, letter char(1));
68
69         strcpy(msg, "commit");
70         exec sql at main commit;
71         exec sql commit;
72
73         strcpy(msg, "set connection");
74         exec sql set connection to main;
75
76         strcpy(msg, "execute insert 1");
77         sprintf(command, "insert into \"Test\" (name, amount, letter) values ('db: ''mm''', 1, 'f')");
78         exec sql execute immediate :command;
79         printf("New tuple got OID = %ld\n", sqlca.sqlerrd[1]);
80  
81         sprintf(command, "insert into \"Test\" (name, amount, letter) values ('db: \\\'mm\\\'', 2, 't')");
82         exec sql execute immediate :command;
83
84         strcpy(msg, "execute insert 2");
85         sprintf(command, "insert into \"Test\" (name, amount, letter) values ('db: ''pm''', 1, 'f')");
86         exec sql at pm execute immediate :command;
87
88         strcpy(msg, "execute insert 3");
89         sprintf(command, "insert into \"Test\" (name, amount, letter) select name, amount+10, letter from \"Test\"");
90         exec sql execute immediate :command;
91         
92         printf("Inserted %ld tuples via execute immediate\n", sqlca.sqlerrd[2]);
93
94         strcpy(msg, "execute insert 4");
95         sprintf(command, "insert into \"Test\" (name, amount, letter) select name, amount+?, letter from \"Test\"");
96         exec sql prepare I from :command;
97         exec sql at pm execute I using :increment;
98         
99         printf("Inserted %ld tuples via prepared execute\n", sqlca.sqlerrd[2]);
100
101         strcpy(msg, "commit");
102         exec sql commit;
103
104         /* Start automatic transactioning for connection pm. */
105         exec sql at pm set autocommit to on;
106         exec sql at pm begin transaction;
107
108         strcpy(msg, "select");
109         exec sql select * into :name, :amount, :letter from "Test";
110
111         printf("Database: mm\n");
112         for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
113         {
114             exec sql begin declare section;
115             char n[8], l = letter[i][0];
116             int a = amount[i];
117             exec sql end declare section;
118
119             strncpy(n, name[i], 8);
120             printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
121             amount[i]+=1000;
122
123             strcpy(msg, "insert");
124             exec sql at pm insert into "Test" (name, amount, letter) values (:n, :a, :l);            
125         }
126
127         strcpy(msg, "commit");
128         exec sql at pm commit;
129
130         strcpy(msg, "select");
131         exec sql at :connection select name, amount, letter into :name, :amount, :letter from "Test";
132
133         printf("Database: %s\n", connection);
134         for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
135             printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, name[i], i, amount[i],i, letter[i][0]);
136
137         strcpy(msg, "select");
138         exec sql at pm select name, amount, letter into :name_letter from "Test";
139
140         strcpy(msg, "commit");
141         exec sql commit;
142
143         strcpy(msg, "select");
144         exec sql at pm select name, amount, letter into :name_letter:ind from "Test";
145
146         printf("Database: pm\n");
147         for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
148             printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, name_letter[i].name, i, name_letter[i].amount,i, name_letter[i].letter);
149
150         /* Start automatic transactioning for connection main. */
151         exec sql set autocommit to on;
152
153         strcpy(msg, "drop");
154         exec sql drop table "Test";
155         exec sql at pm drop table "Test";
156
157         strcpy(msg, "disconnect"); 
158         exec sql disconnect main;
159         exec sql disconnect pm;
160         
161         if (dbgs != NULL)
162                 fclose(dbgs);
163
164         return (0);
165 }