diff options
Diffstat (limited to 'src/interfaces/ecpg/test/complex')
| -rw-r--r-- | src/interfaces/ecpg/test/complex/Makefile | 17 | ||||
| -rw-r--r-- | src/interfaces/ecpg/test/complex/header_test.h | 34 | ||||
| -rw-r--r-- | src/interfaces/ecpg/test/complex/test1.pgc | 203 | ||||
| -rw-r--r-- | src/interfaces/ecpg/test/complex/test2.pgc | 128 | ||||
| -rw-r--r-- | src/interfaces/ecpg/test/complex/test3.pgc | 122 | ||||
| -rw-r--r-- | src/interfaces/ecpg/test/complex/test4.pgc | 95 | ||||
| -rw-r--r-- | src/interfaces/ecpg/test/complex/test5.pgc | 108 |
7 files changed, 707 insertions, 0 deletions
diff --git a/src/interfaces/ecpg/test/complex/Makefile b/src/interfaces/ecpg/test/complex/Makefile new file mode 100644 index 0000000000..4a5d709c31 --- /dev/null +++ b/src/interfaces/ecpg/test/complex/Makefile @@ -0,0 +1,17 @@ +subdir = src/interfaces/ecpg/test/complex +top_builddir = ../../../../.. +include $(top_builddir)/src/Makefile.global +include ../Makefile.regress + + +TESTS = test1 test1.c \ + test2 test2.c \ + test3 test3.c \ + test4 test4.c \ + test5 test5.c + +all: $(TESTS) + +# test4 needs the -c option for the "EXEC SQL TYPE" construct +test4.c: test4.pgc ../regression.h + $(ECPG) -c -o $@ -I$(srcdir) $< diff --git a/src/interfaces/ecpg/test/complex/header_test.h b/src/interfaces/ecpg/test/complex/header_test.h new file mode 100644 index 0000000000..85e0ff6459 --- /dev/null +++ b/src/interfaces/ecpg/test/complex/header_test.h @@ -0,0 +1,34 @@ +/* $PostgreSQL: pgsql/src/interfaces/ecpg/test/complex/header_test.h,v 1.1 2006/08/02 14:14:02 meskes Exp $ */ + +#include "stdlib.h" + +static void +Finish(char *msg) +{ + fprintf(stderr, "Error in statement '%s':\n", msg); + sqlprint(); + + /* finish transaction */ + exec sql rollback; + + /* and remove test table */ + exec sql drop table meskes; + exec sql commit; + + exec sql disconnect; + + exit(-1); +} + +static void +warn(void) +{ + fprintf(stderr, "Warning: At least one column was truncated\n"); +} + +exec sql whenever sqlerror +do + Finish(msg); +exec sql whenever sqlwarning +do + warn(); 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); +} diff --git a/src/interfaces/ecpg/test/complex/test2.pgc b/src/interfaces/ecpg/test/complex/test2.pgc new file mode 100644 index 0000000000..b36471f10a --- /dev/null +++ b/src/interfaces/ecpg/test/complex/test2.pgc @@ -0,0 +1,128 @@ +#include <stdlib.h> +#include <string.h> + +exec sql include header_test; +exec sql include ../regression; + +exec sql type c is char reference; +typedef char* c; + +exec sql type ind is union { int integer; short smallint; }; +typedef union { int integer; short smallint; } ind; + +#define BUFFERSIZ 8 +exec sql type str is varchar[BUFFERSIZ]; + +exec sql declare cur cursor for + select name, born, age, married, children from meskes; + +int +main (void) +{ + exec sql struct birthinfo { long born; short age; }; +exec sql begin declare section; + struct personal_struct { str name; + struct birthinfo birth; + } personal, *p; + struct personal_indicator { int ind_name; + struct birthinfo ind_birth; + } ind_personal, *i; + ind ind_children; + char *query="select name, born, age, married, children from meskes where name = :var1"; +exec sql end declare section; + + exec sql char *married = NULL; + exec sql float ind_married; + exec sql ind children; + + exec sql var ind_married is long; + + char msg[128]; + + ECPGdebug(1, stderr); + + strcpy(msg, "connect"); + exec sql connect to REGRESSDB1; + + strcpy(msg, "create"); + exec sql create table meskes(name char(8), born integer, age smallint, married date, children integer); + + strcpy(msg, "insert"); + exec sql insert into meskes(name, married, children) values ('Petra', '19900404', 3); + exec sql insert into meskes(name, born, age, married, children) values ('Michael', 19660117, 35, '19900404', 3); + exec sql insert into meskes(name, born, age) values ('Carsten', 19910103,10); + exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 8); + exec sql insert into meskes(name, born, age) values ('Chris', 19970923, 4); + + strcpy(msg, "commit"); + exec sql commit; + + strcpy(msg, "open"); + exec sql open cur; + + exec sql whenever not found do break; + + p=&personal; + i=&ind_personal; + memset(i, 0, sizeof(ind_personal)); + while (1) { + strcpy(msg, "fetch"); + exec sql fetch cur into :p:i, :married:ind_married, :children.integer:ind_children.smallint; + printf("%8.8s", personal.name.arr); + if (i->ind_birth.born >= 0) + printf(", born %ld", personal.birth.born); + if (i->ind_birth.age >= 0) + printf(", age = %d", personal.birth.age); + if ((long)ind_married >= 0) + printf(", married %s", married); + if (ind_children.smallint >= 0) + printf(", children = %d", children.integer); + putchar('\n'); + + free(married); + married = NULL; + } + + strcpy(msg, "close"); + exec sql close cur; + + /* and now a same query with prepare */ + exec sql prepare MM from :query; + exec sql declare prep cursor for MM; + + strcpy(msg, "open"); + exec sql open prep using 'Petra'; + + exec sql whenever not found do break; + + while (1) { + strcpy(msg, "fetch"); + exec sql fetch in prep into :personal:ind_personal, :married:ind_married, :children.integer:ind_children.smallint; + printf("%8.8s", personal.name.arr); + if (ind_personal.ind_birth.born >= 0) + printf(", born %ld", personal.birth.born); + if (ind_personal.ind_birth.age >= 0) + printf(", age = %d", personal.birth.age); + if ((long)ind_married >= 0) + printf(", married %s", married); + if (ind_children.smallint >= 0) + printf(", children = %d", children.integer); + putchar('\n'); + } + + free(married); + + strcpy(msg, "close"); + exec sql close prep; + + strcpy(msg, "drop"); + exec sql drop table meskes; + + strcpy(msg, "commit"); + exec sql commit; + + strcpy(msg, "disconnect"); + exec sql disconnect; + + return (0); +} diff --git a/src/interfaces/ecpg/test/complex/test3.pgc b/src/interfaces/ecpg/test/complex/test3.pgc new file mode 100644 index 0000000000..5525fd137c --- /dev/null +++ b/src/interfaces/ecpg/test/complex/test3.pgc @@ -0,0 +1,122 @@ +/****************************************************************************/ +/* Test comment */ +/*--------------------------------------------------------------------------*/ +exec sql include header_test; +exec sql include ../regression; + +exec sql type str is varchar[10]; + +#include <stdlib.h> +#include <string.h> + +int +main (void) +{ +exec sql begin declare section; + typedef struct { long born; short age; } birthinfo; + struct personal_struct { str name; + birthinfo birth; + } personal; + struct personal_indicator { int ind_name; + birthinfo ind_birth; + } ind_personal; + int *ind_married = NULL; + int children, movevalue = 2; + int ind_children; + str *married = NULL; + char *wifesname="Petra"; + char *query="select * from meskes where name = ?"; +exec sql end declare section; + + exec sql declare cur cursor for + select name, born, age, married, children from meskes; + + char msg[128]; + + ECPGdebug(1, stderr); + + strcpy(msg, "connect"); + exec sql connect to REGRESSDB1; + + strcpy(msg, "create"); + exec sql create table meskes(name char(8), born integer, age smallint, married date, children integer); + + strcpy(msg, "insert"); + exec sql insert into meskes(name, married, children) values (:wifesname, '19900404', 3); + exec sql insert into meskes(name, born, age, married, children) values ('Michael', 19660117, 35, '19900404', 3); + exec sql insert into meskes(name, born, age) values ('Carsten', 19910103, 10); + exec sql insert into meskes(name, born, age) values ('Marc', 19930907, 8); + exec sql insert into meskes(name, born, age) values ('Chris', 19970923, 4); + + strcpy(msg, "commit"); + exec sql commit; + + strcpy(msg, "open"); + exec sql open cur; + + strcpy(msg, "move"); + exec sql move :movevalue in cur; + + exec sql whenever not found do break; + + while (1) { + strcpy(msg, "fetch"); + exec sql fetch from cur into :personal:ind_personal, :married:ind_married, :children:ind_children; + printf("%8.8s", personal.name.arr); + if (ind_personal.ind_birth.born >= 0) + printf(", born %ld", personal.birth.born); + if (ind_personal.ind_birth.age >= 0) + printf(", age = %d", personal.birth.age); + if (*ind_married >= 0) + printf(", married %10.10s", married->arr); + if (ind_children >= 0) + printf(", children = %d", children); + putchar('\n'); + + free(married); + married = NULL; + } + + strcpy(msg, "close"); + exec sql close cur; + + /* and now a query with prepare */ + exec sql prepare MM from :query; + exec sql declare prep cursor for MM; + + strcpy(msg, "open"); + exec sql open prep using :wifesname; + + exec sql whenever not found do break; + + while (1) { + strcpy(msg, "fetch"); + exec sql fetch in prep into :personal:ind_personal, :married:ind_married, :children:ind_children; + printf("%8.8s", personal.name.arr); + if (ind_personal.ind_birth.born >= 0) + printf(", born %ld", personal.birth.born); + if (ind_personal.ind_birth.age >= 0) + printf(", age = %d", personal.birth.age); + if (*ind_married >= 0) + printf(", married %10.10s", married->arr); + if (ind_children >= 0) + printf(", children = %d", children); + putchar('\n'); + } + + free(married); + + strcpy(msg, "close"); + exec sql close prep; + + strcpy(msg, "drop"); + exec sql drop table meskes; + + strcpy(msg, "commit"); + exec sql commit; + + strcpy(msg, "disconnect"); + exec sql disconnect; + + return (0); +} diff --git a/src/interfaces/ecpg/test/complex/test4.pgc b/src/interfaces/ecpg/test/complex/test4.pgc new file mode 100644 index 0000000000..b4fdbccb93 --- /dev/null +++ b/src/interfaces/ecpg/test/complex/test4.pgc @@ -0,0 +1,95 @@ +#include <locale.h> +#include <string.h> +#include <stdlib.h> + +exec sql whenever sqlerror sqlprint; + +exec sql include sqlca; +exec sql include ../regression; + +EXEC SQL type errtype is enum +{ + OK = 0, + ERR = 1, + WARN = 2 +}; + +int +main (void) +{ +EXEC SQL BEGIN DECLARE SECTION; + struct + { + errtype e :2; + int code :14; + } error = {1, 147}; + int i = 1; + int *did = &i; + int a[10] = {9,8,7,6,5,4,3,2,1,0}; + char text[25] = "klmnopqrst"; + char *t = (char *)malloc(10); + double f; + bool b = true; +EXEC SQL END DECLARE SECTION; + + strcpy(t, "0123456789"); + setlocale(LC_ALL, "de_DE"); + + ECPGdebug(1, stderr); + + EXEC SQL CONNECT TO REGRESSDB1; + + EXEC SQL SET AUTOCOMMIT = ON; + + EXEC SQL BEGIN WORK; + + EXEC SQL CREATE TABLE test (f float, i int, a int[10], text char(10), b bool, t int, err int); + + EXEC SQL INSERT INTO test(f,i,a,text,b,t,err) VALUES(404.90,3,'{0,1,2,3,4,5,6,7,8,9}','abcdefghij','f',0,0); + + EXEC SQL INSERT INTO test(f,i,a,text,b,t,err) VALUES(140787.0,2,:a,:text,'t',2,14); + +EXEC SQL IFDEF BIT_FIELD_IS_NOT_ACCESSIBLE; + EXEC SQL INSERT INTO test(f,i,a,text,b,t,err) VALUES(14.07,:did,:a,:t,:b,:error); +EXEC SQL ELSE; + EXEC SQL INSERT INTO test(f,i,a,text,b,t,err) VALUES(14.07,:did,:a,:t,:b,1,147); + error.code=0; +EXEC SQL ENDIF; + + EXEC SQL COMMIT; + + EXEC SQL BEGIN WORK; + + EXEC SQL SELECT f,text,b + INTO :f,:text,:b + FROM test + WHERE i = 1; + + printf("Found f=%f text=%10.10s b=%d\n", f, text, b); + + f=140787; + EXEC SQL SELECT a,text + INTO :a,:t + FROM test + WHERE f = :f; + + for (i = 0; i < 10; i++) + printf("Found a[%d] = %d\n", i, a[i]); + + printf("Found text=%10.10s\n", t); + + EXEC SQL SELECT a + INTO :text + FROM test + WHERE f = :f; + + printf("Found text=%s\n", text); + + EXEC SQL DROP TABLE test; + + EXEC SQL COMMIT; + + EXEC SQL DISCONNECT; + + return (0); +} diff --git a/src/interfaces/ecpg/test/complex/test5.pgc b/src/interfaces/ecpg/test/complex/test5.pgc new file mode 100644 index 0000000000..dd0f5b8d33 --- /dev/null +++ b/src/interfaces/ecpg/test/complex/test5.pgc @@ -0,0 +1,108 @@ +#include <stdio.h> +#include <stdlib.h> + +EXEC SQL include ../regression; + +EXEC SQL typedef long mmInteger; +EXEC SQL typedef char mmChar; +EXEC SQL typedef short mmSmallInt; + +EXEC SQL BEGIN DECLARE SECTION; +struct TBempl +{ + mmInteger idnum; + mmChar name[21]; + mmSmallInt accs; + mmChar byte[20]; +}; +EXEC SQL END DECLARE SECTION; + +int +main (void) +{ + EXEC SQL BEGIN DECLARE SECTION; + struct TBempl empl; + char *data = "\\001\\155\\000\\212"; + union + { + mmSmallInt accs; + char t[2]; + } a; + EXEC SQL END DECLARE SECTION; + int i; + + ECPGdebug (1, stderr); + + empl.idnum = 1; + EXEC SQL connect to REGRESSDB1; + if (sqlca.sqlcode) + { + printf ("connect error = %ld\n", sqlca.sqlcode); + exit (sqlca.sqlcode); + } + + EXEC SQL create table empl + (idnum integer, name char (20), accs smallint, byte bytea); + if (sqlca.sqlcode) + { + printf ("create error = %ld\n", sqlca.sqlcode); + exit (sqlca.sqlcode); + } + + EXEC SQL insert into empl values (1, 'first user', 320,:data); + if (sqlca.sqlcode) + { + printf ("insert error = %ld\n", sqlca.sqlcode); + exit (sqlca.sqlcode); + } + + EXEC SQL select name, accs, byte + into :empl.name, :empl.accs, :empl.byte + from empl + where idnum =:empl.idnum; + if (sqlca.sqlcode) + { + printf ("select error = %ld\n", sqlca.sqlcode); + exit (sqlca.sqlcode); + } + printf ("name=%s, accs=%d byte=%s\n", empl.name, empl.accs, empl.byte); + + EXEC SQL DECLARE C CURSOR FOR select name, accs, byte from empl where idnum =:empl.idnum; + EXEC SQL OPEN C; + EXEC SQL FETCH C INTO:empl.name,:empl.accs,:empl.byte; + if (sqlca.sqlcode) + { + printf ("fetch error = %ld\n", sqlca.sqlcode); + exit (sqlca.sqlcode); + } + + printf ("name=%s, accs=%d byte=%s\n", empl.name, empl.accs, empl.byte); + + memset(empl.name, 0, 21L); + memset(empl.byte, '#', 20L); + EXEC SQL DECLARE B BINARY CURSOR FOR select name, accs, byte from empl where idnum =:empl.idnum; + EXEC SQL OPEN B; + EXEC SQL FETCH B INTO :empl.name,:a.accs,:empl.byte; + if (sqlca.sqlcode) + { + printf ("fetch error = %ld\n", sqlca.sqlcode); + exit (sqlca.sqlcode); + } + + EXEC SQL CLOSE B; + + i=a.t[0]; + a.t[0]=a.t[1]; + a.t[1]=i; + + printf ("name=%s, accs=%d byte=", empl.name, a.accs); + for (i=0; i<20; i++) + { + if (empl.byte[i] == '#') + break; + printf("(%o)", (unsigned char)empl.byte[i]); + } + printf("\n"); + EXEC SQL disconnect; + exit (0); +} |
