summaryrefslogtreecommitdiff
path: root/src/interfaces/ecpg/test/complex/test1.pgc
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/ecpg/test/complex/test1.pgc')
-rw-r--r--src/interfaces/ecpg/test/complex/test1.pgc203
1 files changed, 203 insertions, 0 deletions
diff --git a/src/interfaces/ecpg/test/complex/test1.pgc b/src/interfaces/ecpg/test/complex/test1.pgc
new file mode 100644
index 0000000000..18cf12eb37
--- /dev/null
+++ b/src/interfaces/ecpg/test/complex/test1.pgc
@@ -0,0 +1,203 @@
+#include <stdlib.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+exec sql include ../regression;
+
+/* just a test comment */ exec sql whenever sqlerror do PrintAndStop(msg);
+exec sql whenever sqlwarning do warn();
+
+static void PrintAndStop(char *msg)
+{
+ fprintf(stderr, "Error in statement '%s':\n", msg);
+ sqlprint();
+ exit(-1);
+}
+
+static void warn(void)
+{
+ fprintf(stderr, "Warning: At least one column was truncated\n");
+}
+
+/* comment */
+exec sql define AMOUNT 6;
+exec sql define NAMELEN 8;
+
+exec sql type intarray is int[AMOUNT];
+
+typedef int intarray[AMOUNT];
+
+int
+main(void)
+{
+exec sql begin declare section;
+exec sql ifdef NAMELEN;
+ typedef char string[NAMELEN];
+ intarray amount;
+ int increment=100;
+ char name[AMOUNT][NAMELEN];
+ char letter[AMOUNT][1];
+ struct name_letter_struct
+ {
+ char name[NAMELEN];
+ int amount;
+ char letter;
+ } name_letter[AMOUNT];
+#if 0
+ int not_used;
+#endif
+exec sql endif;
+ struct ind_struct
+ {
+ short a;
+ short b;
+ short c;
+ } ind[AMOUNT];
+ char command[128];
+ char *connection="pm";
+ int how_many;
+ char *user="regressuser1";
+exec sql end declare section;
+ exec sql var name is string[AMOUNT];
+ char msg[128];
+ int i,j;
+
+ ECPGdebug(1, stderr);
+
+ strcpy(msg, "connect");
+ exec sql connect to REGRESSDB1 as main;
+
+ strcpy(msg, "connect");
+ exec sql connect to REGRESSDB2 as pm user :user;
+
+ strcpy(msg, "create");
+ exec sql at main create table "Test" (name char(NAMELEN), amount int, letter char(1));
+ exec sql create table "Test" (name char(NAMELEN), amount int, letter char(1));
+
+ strcpy(msg, "commit");
+ exec sql at main commit;
+ exec sql commit;
+
+ strcpy(msg, "set connection");
+ exec sql set connection to main;
+
+ strcpy(msg, "execute insert 1");
+ sprintf(command, "insert into \"Test\" (name, amount, letter) values ('db: ''r1''', 1, 'f')");
+ exec sql execute immediate :command;
+ printf("New tuple got OID = %ld\n", sqlca.sqlerrd[1]);
+
+ sprintf(command, "insert into \"Test\" (name, amount, letter) values ('db: ''r1''', 2, 't')");
+ exec sql execute immediate :command;
+
+ strcpy(msg, "execute insert 2");
+ sprintf(command, "insert into \"Test\" (name, amount, letter) values ('db: ''pm''', 1, 'f')");
+ exec sql at pm execute immediate :command;
+
+ strcpy(msg, "execute insert 3");
+ sprintf(command, "insert into \"Test\" (name, amount, letter) select name, amount+10, letter from \"Test\"");
+ exec sql execute immediate :command;
+
+ printf("Inserted %ld tuples via execute immediate\n", sqlca.sqlerrd[2]);
+
+ strcpy(msg, "execute insert 4");
+ sprintf(command, "insert into \"Test\" (name, amount, letter) select name, amount+?, letter from \"Test\"");
+ exec sql prepare I from :command;
+ exec sql at pm execute I using :increment;
+
+ printf("Inserted %ld tuples via prepared execute\n", sqlca.sqlerrd[2]);
+
+ strcpy(msg, "commit");
+ exec sql commit;
+
+ /* Start automatic transactioning for connection pm. */
+ exec sql at pm set autocommit to on;
+ exec sql at pm begin transaction;
+
+ strcpy(msg, "select");
+ exec sql select * into :name, :amount, :letter from "Test";
+
+ printf("Database: main\n");
+ for (i=0, how_many=j=sqlca.sqlerrd[2]; i<j; i++)
+ {
+ exec sql begin declare section;
+ char n[8], l = letter[i][0];
+ int a = amount[i];
+ exec sql end declare section;
+
+ strncpy(n, name[i], NAMELEN);
+ printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
+ amount[i]+=1000;
+
+ strcpy(msg, "insert");
+ exec sql at pm insert into "Test" (name, amount, letter) values (:n, :amount[i], :l);
+ }
+
+ strcpy(msg, "commit");
+ exec sql at pm commit;
+
+ sprintf (command, "select * from \"Test\"");
+
+ exec sql prepare F from :command;
+ exec sql declare CUR cursor for F;
+
+ strcpy(msg, "open");
+ exec sql open CUR;
+
+ strcpy(msg, "fetch");
+ exec sql fetch :how_many in CUR into :name, :amount, :letter;
+
+ printf("Database: main\n");
+ for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
+ {
+ exec sql begin declare section;
+ char n[8], l = letter[i][0];
+ int a = amount[i];
+ exec sql end declare section;
+
+ strncpy(n, name[i], 8);
+ printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, n, i, a, i, l);
+ }
+
+ exec sql close CUR;
+
+ strcpy(msg, "select");
+ exec sql at :connection select name, amount, letter into :name, :amount, :letter from "Test";
+
+ printf("Database: %s\n", connection);
+ for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
+ printf("name[%d]=%8.8s\tamount[%d]=%d\tletter[%d]=%c\n", i, name[i], i, amount[i],i, letter[i][0]);
+
+ strcpy(msg, "commit");
+ exec sql commit;
+
+ strcpy(msg, "select");
+ exec sql at pm select name, amount, letter into :name_letter:ind from "Test";
+
+ printf("Database: pm\n");
+ for (i=0, j=sqlca.sqlerrd[2]; i<j; i++)
+ 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);
+
+ name_letter[4].amount=1407;
+ strcpy(msg, "insert");
+ exec sql insert into "Test" (name, amount, letter) values (:name_letter[4]);
+
+ strcpy(msg, "select");
+ exec sql select name, amount, letter into :name_letter[2] from "Test" where amount = 1407;
+
+ printf("Database: main\n");
+ printf("name[2]=%8.8s\tamount[2]=%d\tletter[2]=%c\n", name_letter[2].name, name_letter[2].amount, name_letter[2].letter);
+
+ /* Start automatic transactioning for connection main. */
+ exec sql set autocommit to on;
+
+ strcpy(msg, "drop");
+ exec sql drop table "Test";
+ exec sql at pm drop table "Test";
+
+ strcpy(msg, "disconnect");
+ exec sql disconnect main;
+ exec sql disconnect pm;
+
+ return (0);
+}